diff --git a/.editorconfig b/.editorconfig index e36b54a487..843916258f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,7 +9,7 @@ root = true # Use tabs as indentation # Trim trailing whitespace [*] -insert_final_newline = true +insert_final_newline = false indent_style = space indent_size = 4 trim_trailing_whitespace = true @@ -26,9 +26,9 @@ csharp_style_inlined_variable_declaration = 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_var_elsewhere = true:none -csharp_style_var_for_built_in_types = true:suggestion -csharp_style_var_when_type_is_apparent = true:warning +csharp_style_var_elsewhere = false:none +csharp_style_var_for_built_in_types = false:none +csharp_style_var_when_type_is_apparent = false:warning csharp_indent_block_contents = true:warning csharp_indent_braces = false:warning @@ -49,6 +49,15 @@ csharp_space_before_comma = false:warning csharp_space_before_dot = false:error csharp_space_before_open_square_brackets = true:warning csharp_space_before_semicolon_in_for_statement = false:error +csharp_using_directive_placement = outside_namespace:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_style_namespace_declarations = block_scoped:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_indent_labels = one_less_than_current +csharp_style_prefer_null_check_over_type_check = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion [*.{cs,vb}] dotnet_sort_system_directives_first = true @@ -59,18 +68,16 @@ dotnet_style_explicit_tuple_names = true:warning dotnet_style_null_propagation = true:suggestion dotnet_style_object_initializer = true:suggestion dotnet_style_predefined_type_for_locals_parameters_members = true:warning -dotnet_style_predefined_type_for_member_access = false:warning +dotnet_style_predefined_type_for_member_access = true:warning dotnet_style_qualification_for_event = false:warning dotnet_style_qualification_for_field = false:warning dotnet_style_qualification_for_method = false:warning dotnet_naming_style.pascal_case.capitalization = pascal_case -dotnet_naming_style.parameters.capitalization = pascal_case -dotnet_naming_style.parameters.required_prefix = a +dotnet_naming_style.parameters.capitalization = camel_case -dotnet_naming_style.private_fields.capitalization = pascal_case -dotnet_naming_style.private_fields.required_prefix = _ +dotnet_naming_style.private_fields.capitalization = camel_case dotnet_naming_style.interfaces.capitalization = pascal_case dotnet_naming_style.interfaces.required_prefix = I @@ -94,8 +101,13 @@ dotnet_naming_rule.pascal_case_definitions.style = pascal_case dotnet_naming_rule.parameters.severity = suggestion dotnet_naming_rule.parameters.symbols = parameters -dotnet_naming_rule.parameters.style = parameters +dotnet_naming_rule.parameters.style = private_fields dotnet_naming_rule.private_fields.severity = suggestion dotnet_naming_rule.private_fields.symbols = private_fields dotnet_naming_rule.private_fields.style = private_fields +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +end_of_line = crlf +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..aa359040c2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,22 @@ +--- +name: Bug report +about: For bugs in Cosmos +title: '' +labels: Bug +assignees: '' + +--- + +#### Area of Cosmos - What area of Cosmos are we dealing with? + + +#### Expected Behaviour - What do you think that should happen? + + +#### Actual Behaviour - What unexpectedly happens? + + +#### Reproduction - How did you get this error to appear? + + +#### Version - Were you using the User Kit or Dev Kit? And what User Kit version or Dev Kit commit (Cosmos, IL2CPU, X#)? diff --git a/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md b/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md new file mode 100644 index 0000000000..92af22fc60 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/build-error-and-visual-studio-problems.md @@ -0,0 +1,31 @@ +--- +name: Build Error and Visual Studio Problems +about: For errors when trying to build or modify a Cosmos Kernel +title: '' +labels: 'Area: Build, Area: Visual Studio Integration' +assignees: '' + +--- + +Have you checked Github Issues for similar errors? + +**Exception** +Post the exception returned by Visual Studio + +**Visual Studio Output Logs** +Post the entire output log given by Visual Studio for the build + +**How To Reproduce** +Describe any changes done to a clean kernel for this error to occur. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Context** +Before posting please confirm that the following are in order +[ ] Both Cosmos VS Extensions are installed +[ ] In the NuGet Package Manager "Include prerelease" is selected +[ ] The Cosmos NuGet package store is selected (NOT nuget.org) in 'Manage NuGet Packages' +[ ] The Cosmos NuGet packages are installed + +Add any other context about the problem which might be helpful. diff --git a/.github/ISSUE_TEMPLATE/docs_or_website.md b/.github/ISSUE_TEMPLATE/docs_or_website.md new file mode 100644 index 0000000000..f94084d3af --- /dev/null +++ b/.github/ISSUE_TEMPLATE/docs_or_website.md @@ -0,0 +1,16 @@ +--- +name: Documentation/Website Bug Report +about: For bugs involving the Cosmos documentation & website +title: '' +labels: 'Area: Documentation' +assignees: '' + +--- + +#### URL of Documentation - What page of documentation are we dealing with? + + +#### Expected Behaviour - What do you think should happen? + + +#### Actual Behaviour - What is the issue? diff --git a/.github/ISSUE_TEMPLATE/installation-error.md b/.github/ISSUE_TEMPLATE/installation-error.md new file mode 100644 index 0000000000..98ab73dabf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-error.md @@ -0,0 +1,28 @@ +--- +name: Installation Error +about: For errors while trying to install Cosmos +title: '' +labels: 'Area: Installer' +assignees: '' + +--- + +**Describe the problem** +A clear and concise description of where the installation is going wrong. + +**Steps of installation up to now** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Logs** +Please post the entire log given by Cosmos. For long logs please use pastebin. + +**Setup (please complete the following information):** + - Cosmos Version (Userkit/Devkit) + - Are you running installer as administrator? + - Visual Studio Version if applicable + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/plug-request.md b/.github/ISSUE_TEMPLATE/plug-request.md new file mode 100644 index 0000000000..6acec1669b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/plug-request.md @@ -0,0 +1,20 @@ +--- +name: Plug request +about: Suggest that a certain method should be plugged +title: '' +labels: '' +assignees: '' + +--- + +**What is the usecase for this plug** +A clear and concise description of where the plug is needed + +** Complexity of plug ** +Can this plug be added without requiring new drivers or a lot of work? (Methods requiring Linq, Reflection or Networking etc. are too complex for this request) + +**Describe alternatives you've considered** +Are there workarounds for this plug? + +**Additional context** +Add any other context about the plug request here. diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml new file mode 100644 index 0000000000..6bfe464a09 --- /dev/null +++ b/.github/workflows/build-docs.yml @@ -0,0 +1,48 @@ +name: Build Docs + +on: + push: + branches: [ master ] + +jobs: + build: + runs-on: windows-latest + steps: + - name: Checkout Cosmos + uses: actions/checkout@v2.4.2 + with: + repository: CosmosOS/Cosmos + path: Cosmos + - name: Checkout IL2CPU + uses: actions/checkout@v2.4.2 + with: + repository: CosmosOS/IL2CPU + path: IL2CPU + - name: Checkout XSharp + uses: actions/checkout@v2.4.2 + with: + repository: CosmosOS/XSharp + path: XSharp + - name: Checkout Common + uses: actions/checkout@v2.4.2 + with: + repository: CosmosOS/Common + path: Common + - name: Setup dotnet + uses: actions/setup-dotnet@v2.0.0 + with: + dotnet-version: 6.0.x + - name: Install DocFX + shell: pwsh + run: choco install docfx + - name: Build Docs + shell: pwsh + run: docfx ./Cosmos/Docs/docfx.json + continue-on-error: false + - name: Publish to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + personal_token: ${{ secrets.GH_PAGES }} + external_repository: CosmosOS/cosmosos.github.io + publish_branch: master + publish_dir: ./Cosmos/Docs/_site diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000000..d50a098ab0 --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,165 @@ +name: Build and Test + +on: + workflow_dispatch: + pull_request: + branches: [ "master" ] + +jobs: + + build: + + runs-on: self-hosted + + outputs: + testkernels: ${{ steps.testkernels_output.outputs.testkernels }} + + env: + USER_KIT_PATH: 'C:\CosmosRun\' + BochsPath: 'C:\Program Files (x86)\Bochs-2.6.8\Bochs.exe' + + steps: + - name: Checkout Cosmos + uses: actions/checkout@v3 + with: + repository: CosmosOS/Cosmos + path: Cosmos + + - name: Checkout Common + uses: actions/checkout@v3 + with: + repository: CosmosOS/Common + path: Common + + - name: Checkout IL2CPU + uses: actions/checkout@v3 + with: + repository: CosmosOS/IL2CPU + path: IL2CPU + + - name: Checkout XSharp + uses: actions/checkout@v3 + with: + repository: CosmosOS/XSharp + path: XSharp + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v1.1.3 + + - name: Nuget - Cache + uses: actions/cache@v3 + with: + path: ~/.nuget/packages + key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} + restore-keys: | + ${{ runner.os }}-nuget + + - name: Nuget - Restore + run: | + msbuild Cosmos\Build.sln /t:Restore /maxcpucount /verbosity:normal /p:Net48=True + + - name: Build - Cosmos + run: | + msbuild Cosmos\Build.sln /t:Build /maxcpucount /verbosity:normal /p:Net48=True + + - name: Build - IL2CPU + run: | + dotnet publish IL2CPU\source\IL2CPU -o "$($env:USER_KIT_PATH)Build\IL2CPU\" + + - name: Copy Output - Cosmos + run: | + xcopy /Y "Cosmos\source\Cosmos.Build.Tasks\tools\grub2\boot\grub\i386-pc\*.*" "$($env:USER_KIT_PATH)Build\ISO\boot\grub\i386-pc\" + xcopy /Y "Cosmos\Build\grub2\boot\grub\grub.cfg" "$($env:USER_KIT_PATH)Build\ISO\boot\grub" + xcopy /Y /S "Cosmos\Build\VMware\*" "$($env:USER_KIT_PATH)Build\VMware\" + xcopy /Y /S "Cosmos\Build\Tools" "$($env:USER_KIT_PATH)Build\Tools\" + + - name: Copy Output - IL2CPU + run: | + xcopy /Y "IL2CPU\source\Cosmos.Core.DebugStub\*.xs" "$($env:USER_KIT_PATH)XSharp\DebugStub\" + + # - name: Send test kernels to GITHUB_OUTPUT + # id: testkernels_output + # run: | + # $testList = dotnet test Cosmos\Tests\Cosmos.TestRunner.UnitTest\Cosmos.TestRunner.UnitTest.csproj --list-tests + # Write-Host $testList + # $testList >> tests.txt + # $match = Select-String -Pattern "^.*TestKernel\((.*)\)$" -Path tests.txt + # Write-Host $match + # $testKernels = $match.matches.groups | where { $_.index % 2 -ne 0 } | Select-Object value | foreach { $_.value } + # Write-Host $testKernels + # $testKernelsEnv = "" + # $testKernels | foreach { $testKernelsEnv += "$($_)," } + # $testKernelsEnv = $testKernelsEnv.Trim(",") + # Write-Host $testKernelsEnv + # "testkernels=[$($testKernelsEnv)]" >> $env:GITHUB_OUTPUT + + test: + if: ${{ success() }} + needs: [build] + runs-on: self-hosted + + strategy: + matrix: + kernel: [ + "BoxingTests.Kernel", + "Cosmos.Compiler.Tests.TypeSystem.Kernel", + "Cosmos.Compiler.Tests.Bcl.Kernel", + "Cosmos.Compiler.Tests.Bcl.System.Kernel", + "Cosmos.Compiler.Tests.Exceptions.Kernel", + "Cosmos.Compiler.Tests.MethodTests.Kernel", + "Cosmos.Compiler.Tests.SingleEchoTest.Kernel", + "Cosmos.Kernel.Tests.Fat.Kernel", + "Cosmos.Kernel.Tests.IO.Kernel", + "SimpleStructsAndArraysTest.Kernel", + "Cosmos.Kernel.Tests.DiskManager.Kernel", + "GraphicTest.Kernel", + "NetworkTest.Kernel", + "AudioTests.Kernel", + "MemoryOperationsTest.Kernel", + "ProcessorTests.Kernel" + ] + + env: + USER_KIT_PATH: 'C:\CosmosRun\' + BochsPath: 'C:\Program Files (x86)\Bochs-2.6.8\Bochs.exe' + + steps: + - name: Checkout Cosmos + uses: actions/checkout@v3 + with: + repository: CosmosOS/Cosmos + path: Cosmos + + - name: Checkout Common + uses: actions/checkout@v3 + with: + repository: CosmosOS/Common + path: Common + + - name: Checkout IL2CPU + uses: actions/checkout@v3 + with: + repository: CosmosOS/IL2CPU + path: IL2CPU + + - name: Checkout XSharp + uses: actions/checkout@v3 + with: + repository: CosmosOS/XSharp + path: XSharp + + - name: Copy Bochs + run: | + xcopy /Y /S "Cosmos\Resources\Bochs\*.*" "${env:ProgramFiles(x86)}\Bochs-2.6.8\" + + - name: Test - Cosmos + env: + CI: "True" + run: | + dotnet test "Cosmos\Tests\Cosmos.TestRunner.UnitTest\Cosmos.TestRunner.UnitTest.csproj" --logger "trx;LogFileName=$($env:USER_KIT_PATH)TestResults\${{ matrix.kernel }}-TestResult.trx" --filter "FullyQualifiedName~${{ matrix.kernel }}" + + - name: Upload Test Logs + uses: actions/upload-artifact@v3 + with: + name: test-logs + path: ${{ env.USER_KIT_PATH }}TestResults diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..e823b432b5 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,23 @@ +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "30 1 * * *" + +jobs: + stale: + + runs-on: ubuntu-latest + + steps: + - uses: actions/stale@v3 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'As this issue has received no new activity, it has been marked as stale' + stale-pr-message: 'As this pull request has received no new activity, it has been marked as stale' + stale-issue-label: 'no-issue-activity' + stale-pr-label: 'no-pr-activity' + exempt-issue-labels: 'Up for Grabs,Blocked,PR submitted' + exempt-pr-labels: 'Work in progress' + exempt-all-milestones: true + exempt-all-assignees: true diff --git a/.gitignore b/.gitignore index 8742bf01be..5ce42c8e8e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,11 +14,11 @@ [Pp]ackages/ [Oo]bj/ +Docs/log.txt + *.[Oo]bj -*.suo *.ncb *.aps -*.user *.ccscc *.cache *.bak @@ -34,9 +34,6 @@ *.docstates *.vsp *.pdb -*.lock.json -*.nuget.props -*.nuget.targets Thumbs.db build.force @@ -55,3 +52,8 @@ Docs/~$RingsGen2.xlsx source/Kernel-X86/90-Application/GuessKernelGen3.csproj Docs/~$RingsGen3.xlsx *.map +/Resources/Dependencies/Dapper/DapperExtensions.StrongName.deps.json +/Resources/Dependencies/Dapper/ref/DapperExtensions.StrongName.dll + + +.idea/ \ No newline at end of file diff --git a/Artwork/liminewp.bmp b/Artwork/liminewp.bmp new file mode 100644 index 0000000000..e3aeb7c372 Binary files /dev/null and b/Artwork/liminewp.bmp differ diff --git a/Build.sln b/Build.sln index 682f55932d..a2826a5433 100644 --- a/Build.sln +++ b/Build.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30711.63 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{D95021E1-A2C9-4829-819E-ED433AF13162}" EndProject @@ -61,7 +61,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core", "source\Cosmo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.HAL2", "source\Cosmos.HAL2\Cosmos.HAL2.csproj", "{DE4F000A-B65C-4395-B066-891B7423E9EC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp.csproj", "{12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp\XSharp.csproj", "{12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Plugs", "source\Cosmos.Core_Plugs\Cosmos.Core_Plugs.csproj", "{89DB6325-2C81-467D-BE8A-C4AEBB6540A5}" EndProject @@ -71,8 +71,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System2_Plugs", "sou EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Kernel.Plugs.Asm", "source\Cosmos.Debug.Kernel.Plugs.Asm\Cosmos.Debug.Kernel.Plugs.Asm.csproj", "{7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.Assembler", "..\XSharp\source\XSharp.Assembler\XSharp.Assembler.csproj", "{E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Common", "..\Common\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.API", "..\IL2CPU\source\IL2CPU.API\IL2CPU.API.csproj", "{A9469897-4FD8-49E7-97F1-FE420A2B75B9}" @@ -85,28 +83,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test Runner", "Test Runner" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.TestRunner.TestController", "Tests\Cosmos.TestRunner.TestController\Cosmos.TestRunner.TestController.csproj", "{2EEC1BF8-758F-4D9D-B063-8CF005468B24}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheRingMaster", "source\TheRingMaster\TheRingMaster.csproj", "{0EE3DF1C-44E6-4669-88AA-D8D2612DA817}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{3C4B0261-3B1D-4503-97F1-AC0252D500E6}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NASM", "Tools\NASM\NASM.csproj", "{A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spruce", "..\XSharp\source\Spruce\Spruce.csproj", "{C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.x86", "..\XSharp\source\XSharp.x86\XSharp.x86.csproj", "{91442476-F818-4A7D-A3BC-2159BCDE3352}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Tasks", "source\Cosmos.Build.Tasks\Cosmos.Build.Tasks.csproj", "{0BA0EC69-F124-44C1-823D-C97FE3AEC59E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VSPropertyPages", "..\Common\source\VSPropertyPages\VSPropertyPages.csproj", "{3487890D-43F4-4810-9587-1F02F646915D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.HyperVServer", "source\Cosmos.Debug.HyperVServer\Cosmos.Debug.HyperVServer.csproj", "{9413B5A0-1120-43AD-8784-8A3726C1898C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DapperExtensions.StrongName", "Resources\Dependencies\DapperExtensions.StrongName\DapperExtensions.StrongName.csproj", "{28F18214-DFF8-4A30-BA24-4F32C20CA910}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.Debug.Symbols.Net48", "..\IL2CPU\source\IL2CPU.Debug.Symbols.Net48\IL2CPU.Debug.Symbols.Net48.csproj", "{440CE2D4-024F-45D3-A95C-9077CC0A51E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Plugs", "source\Cosmos.Plugs\Cosmos.Plugs.csproj", "{509FB0F8-6D0F-424F-9C6B-9E5818B06B21}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug-CI|Any CPU = Debug-CI|Any CPU Release|Any CPU = Release|Any CPU Release-CI|Any CPU = Release-CI|Any CPU + TEST|Any CPU = TEST|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -117,6 +116,8 @@ Global {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Release|Any CPU.Build.0 = Release|Any CPU {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.TEST|Any CPU.Build.0 = TEST|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug|Any CPU.Build.0 = Debug|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -125,6 +126,8 @@ Global {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release|Any CPU.Build.0 = Release|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|Any CPU.Build.0 = Release|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -133,6 +136,8 @@ Global {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release|Any CPU.Build.0 = Release|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|Any CPU.Build.0 = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug|Any CPU.Build.0 = Debug|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -141,6 +146,8 @@ Global {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release|Any CPU.Build.0 = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|Any CPU.Build.0 = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -149,6 +156,8 @@ Global {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release|Any CPU.Build.0 = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|Any CPU.Build.0 = Release|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug|Any CPU.Build.0 = Debug|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -157,6 +166,8 @@ Global {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release|Any CPU.Build.0 = Release|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|Any CPU.Build.0 = Release|Any CPU {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Debug|Any CPU.Build.0 = Debug|Any CPU {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -165,6 +176,8 @@ Global {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Release|Any CPU.Build.0 = Release|Any CPU {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {F3025446-D2C7-4FEA-AB03-C707F7B48B43}.TEST|Any CPU.Build.0 = TEST|Any CPU {3C45A898-4AA9-476F-8302-63391D6ED044}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C45A898-4AA9-476F-8302-63391D6ED044}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C45A898-4AA9-476F-8302-63391D6ED044}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -173,6 +186,8 @@ Global {3C45A898-4AA9-476F-8302-63391D6ED044}.Release|Any CPU.Build.0 = Release|Any CPU {3C45A898-4AA9-476F-8302-63391D6ED044}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {3C45A898-4AA9-476F-8302-63391D6ED044}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {3C45A898-4AA9-476F-8302-63391D6ED044}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3C45A898-4AA9-476F-8302-63391D6ED044}.TEST|Any CPU.Build.0 = TEST|Any CPU {2E740096-911F-47D0-A46D-998DBB76FC5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E740096-911F-47D0-A46D-998DBB76FC5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E740096-911F-47D0-A46D-998DBB76FC5D}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -181,6 +196,8 @@ Global {2E740096-911F-47D0-A46D-998DBB76FC5D}.Release|Any CPU.Build.0 = Release|Any CPU {2E740096-911F-47D0-A46D-998DBB76FC5D}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {2E740096-911F-47D0-A46D-998DBB76FC5D}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {2E740096-911F-47D0-A46D-998DBB76FC5D}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {2E740096-911F-47D0-A46D-998DBB76FC5D}.TEST|Any CPU.Build.0 = TEST|Any CPU {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Debug|Any CPU.Build.0 = Debug|Any CPU {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -189,6 +206,8 @@ Global {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Release|Any CPU.Build.0 = Release|Any CPU {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {BC91BCEF-D146-4EB0-BE63-C637880C5800}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {BC91BCEF-D146-4EB0-BE63-C637880C5800}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {BC91BCEF-D146-4EB0-BE63-C637880C5800}.TEST|Any CPU.Build.0 = TEST|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -197,6 +216,8 @@ Global {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|Any CPU.Build.0 = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.Build.0 = TEST|Any CPU {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -205,6 +226,8 @@ Global {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Release|Any CPU.Build.0 = Release|Any CPU {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {0AF0A39D-7184-4EBE-B8CB-4A61034607FE}.TEST|Any CPU.Build.0 = TEST|Any CPU {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Debug|Any CPU.Build.0 = Debug|Any CPU {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -213,6 +236,8 @@ Global {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Release|Any CPU.Build.0 = Release|Any CPU {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {72EEFBFE-AF88-4E16-AD6C-7D9857CDC32C}.TEST|Any CPU.Build.0 = TEST|Any CPU {3C515676-8565-4A19-98E7-266F83D579A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C515676-8565-4A19-98E7-266F83D579A8}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C515676-8565-4A19-98E7-266F83D579A8}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -221,6 +246,8 @@ Global {3C515676-8565-4A19-98E7-266F83D579A8}.Release|Any CPU.Build.0 = Release|Any CPU {3C515676-8565-4A19-98E7-266F83D579A8}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {3C515676-8565-4A19-98E7-266F83D579A8}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {3C515676-8565-4A19-98E7-266F83D579A8}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3C515676-8565-4A19-98E7-266F83D579A8}.TEST|Any CPU.Build.0 = TEST|Any CPU {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Debug|Any CPU.Build.0 = Debug|Any CPU {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -229,6 +256,8 @@ Global {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Release|Any CPU.Build.0 = Release|Any CPU {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {B45F760C-6D3D-48E1-9E2C-97CECC6A7061}.TEST|Any CPU.Build.0 = TEST|Any CPU {DE4F000A-B65C-4395-B066-891B7423E9EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE4F000A-B65C-4395-B066-891B7423E9EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE4F000A-B65C-4395-B066-891B7423E9EC}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -237,12 +266,16 @@ Global {DE4F000A-B65C-4395-B066-891B7423E9EC}.Release|Any CPU.Build.0 = Release|Any CPU {DE4F000A-B65C-4395-B066-891B7423E9EC}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {DE4F000A-B65C-4395-B066-891B7423E9EC}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {DE4F000A-B65C-4395-B066-891B7423E9EC}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {DE4F000A-B65C-4395-B066-891B7423E9EC}.TEST|Any CPU.Build.0 = TEST|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Debug|Any CPU.Build.0 = Debug|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Release|Any CPU.ActiveCfg = Release|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Release|Any CPU.Build.0 = Release|Any CPU {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {12B1AAA1-14DE-4B85-8C33-B32EA3A95B82}.TEST|Any CPU.Build.0 = Release|Any CPU {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Debug|Any CPU.Build.0 = Debug|Any CPU {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -251,6 +284,8 @@ Global {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Release|Any CPU.Build.0 = Release|Any CPU {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {89DB6325-2C81-467D-BE8A-C4AEBB6540A5}.TEST|Any CPU.Build.0 = TEST|Any CPU {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -259,6 +294,8 @@ Global {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Release|Any CPU.Build.0 = Release|Any CPU {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94}.TEST|Any CPU.Build.0 = TEST|Any CPU {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Debug|Any CPU.Build.0 = Debug|Any CPU {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -267,6 +304,8 @@ Global {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Release|Any CPU.Build.0 = Release|Any CPU {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {9A327DB7-42E2-4C82-9537-0D995B9171FF}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {9A327DB7-42E2-4C82-9537-0D995B9171FF}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {9A327DB7-42E2-4C82-9537-0D995B9171FF}.TEST|Any CPU.Build.0 = TEST|Any CPU {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Debug|Any CPU.Build.0 = Debug|Any CPU {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -275,18 +314,16 @@ Global {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Release|Any CPU.Build.0 = Release|Any CPU {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.Release-CI|Any CPU.Build.0 = Release|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Release|Any CPU.Build.0 = Release|Any CPU - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B}.TEST|Any CPU.Build.0 = TEST|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Release|Any CPU.Build.0 = Release|Any CPU {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99}.TEST|Any CPU.Build.0 = Release|Any CPU {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Debug|Any CPU.Build.0 = Debug|Any CPU {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -295,6 +332,8 @@ Global {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Release|Any CPU.Build.0 = Release|Any CPU {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {A9469897-4FD8-49E7-97F1-FE420A2B75B9}.TEST|Any CPU.Build.0 = TEST|Any CPU {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Debug|Any CPU.Build.0 = Debug|Any CPU {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -303,6 +342,8 @@ Global {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Release|Any CPU.Build.0 = Release|Any CPU {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {366C2EC6-B9D8-4676-9C88-98F041B8FC93}.TEST|Any CPU.Build.0 = TEST|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -311,6 +352,8 @@ Global {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release|Any CPU.Build.0 = Release|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|Any CPU.Build.0 = Release|Any CPU {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Debug|Any CPU.Build.0 = Debug|Any CPU {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -319,14 +362,8 @@ Global {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Release|Any CPU.Build.0 = Release|Any CPU {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.Release-CI|Any CPU.Build.0 = Release|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Debug-CI|Any CPU.Build.0 = Debug|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Release|Any CPU.Build.0 = Release|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {2EEC1BF8-758F-4D9D-B063-8CF005468B24}.TEST|Any CPU.Build.0 = TEST|Any CPU {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Debug|Any CPU.Build.0 = Debug|Any CPU {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -335,18 +372,16 @@ Global {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Release|Any CPU.Build.0 = Release|Any CPU {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65}.TEST|Any CPU.Build.0 = TEST|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Debug|Any CPU.Build.0 = Debug|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Release|Any CPU.Build.0 = Release|Any CPU {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Release|Any CPU.Build.0 = Release|Any CPU - {91442476-F818-4A7D-A3BC-2159BCDE3352}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F}.TEST|Any CPU.Build.0 = Release|Any CPU {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Debug|Any CPU.Build.0 = Debug|Any CPU {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -355,12 +390,16 @@ Global {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Release|Any CPU.Build.0 = Release|Any CPU {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {0BA0EC69-F124-44C1-823D-C97FE3AEC59E}.TEST|Any CPU.Build.0 = Release|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Debug|Any CPU.Build.0 = Debug|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Release|Any CPU.ActiveCfg = Release|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Release|Any CPU.Build.0 = Release|Any CPU {3487890D-43F4-4810-9587-1F02F646915D}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {3487890D-43F4-4810-9587-1F02F646915D}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {3487890D-43F4-4810-9587-1F02F646915D}.TEST|Any CPU.Build.0 = Release|Any CPU {9413B5A0-1120-43AD-8784-8A3726C1898C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9413B5A0-1120-43AD-8784-8A3726C1898C}.Debug|Any CPU.Build.0 = Debug|Any CPU {9413B5A0-1120-43AD-8784-8A3726C1898C}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU @@ -369,6 +408,38 @@ Global {9413B5A0-1120-43AD-8784-8A3726C1898C}.Release|Any CPU.Build.0 = Release|Any CPU {9413B5A0-1120-43AD-8784-8A3726C1898C}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU {9413B5A0-1120-43AD-8784-8A3726C1898C}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {9413B5A0-1120-43AD-8784-8A3726C1898C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {9413B5A0-1120-43AD-8784-8A3726C1898C}.TEST|Any CPU.Build.0 = TEST|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Debug-CI|Any CPU.Build.0 = Debug|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Release|Any CPU.Build.0 = Release|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {28F18214-DFF8-4A30-BA24-4F32C20CA910}.TEST|Any CPU.Build.0 = Release|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Debug-CI|Any CPU.Build.0 = Debug|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Release|Any CPU.Build.0 = Release|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Release-CI|Any CPU.ActiveCfg = Release|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.Release-CI|Any CPU.Build.0 = Release|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {440CE2D4-024F-45D3-A95C-9077CC0A51E3}.TEST|Any CPU.Build.0 = TEST|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Debug-CI|Any CPU.ActiveCfg = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Debug-CI|Any CPU.Build.0 = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Release|Any CPU.Build.0 = Release|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Release-CI|Any CPU.ActiveCfg = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.Release-CI|Any CPU.Build.0 = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.TEST|Any CPU.ActiveCfg = Debug|Any CPU + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21}.TEST|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -400,19 +471,18 @@ Global {2A24DA41-0D3A-48A6-83D5-8584A1D4CA94} = {360A9DE9-F8CF-4A38-9593-3699648DA616} {9A327DB7-42E2-4C82-9537-0D995B9171FF} = {056A94C1-6C75-4730-B62A-675779CD07FB} {7549D7F8-58A3-4F4F-8544-DEF2ABF79A0B} = {E3779B95-E47B-4CAD-B8C1-0549E30AA4F2} - {E1AC1E9B-27EA-4AE0-8C83-328BD96F978A} = {9C8A3E55-9045-44CA-BFD4-16D5B4343A90} {CB20F8F9-8C1D-43A6-96EA-89FEC2512C99} = {D95021E1-A2C9-4829-819E-ED433AF13162} {A9469897-4FD8-49E7-97F1-FE420A2B75B9} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {366C2EC6-B9D8-4676-9C88-98F041B8FC93} = {CAF5EB57-6CAD-446D-8FC7-4C03D4B996A6} {535A7E34-AC73-4781-B791-2C81A9066A2C} = {CD3F5E45-8B24-424F-ADF1-0211712F4CB7} {2EEC1BF8-758F-4D9D-B063-8CF005468B24} = {D4833110-032D-40E3-ACB3-F11583727B08} - {0EE3DF1C-44E6-4669-88AA-D8D2612DA817} = {6A15C540-8278-4B9C-B890-FA57FB6AE6A6} {A7C295D2-8DEA-4CAE-A8CB-44CD0529EC65} = {3C4B0261-3B1D-4503-97F1-AC0252D500E6} {C984AF76-66C2-4A5F-A3DC-9F8FE0CD4D2F} = {9C8A3E55-9045-44CA-BFD4-16D5B4343A90} - {91442476-F818-4A7D-A3BC-2159BCDE3352} = {9C8A3E55-9045-44CA-BFD4-16D5B4343A90} {0BA0EC69-F124-44C1-823D-C97FE3AEC59E} = {D95021E1-A2C9-4829-819E-ED433AF13162} - {3487890D-43F4-4810-9587-1F02F646915D} = {CD3F5E45-8B24-424F-ADF1-0211712F4CB7} {9413B5A0-1120-43AD-8784-8A3726C1898C} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} + {28F18214-DFF8-4A30-BA24-4F32C20CA910} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} + {440CE2D4-024F-45D3-A95C-9077CC0A51E3} = {FF5BAFDE-AE9D-438D-935A-86B33EE0A758} + {509FB0F8-6D0F-424F-9C6B-9E5818B06B21} = {4D3F3613-E112-4013-AB81-B8CCED78A555} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E5429BF0-2CEE-45B0-BC73-2188A409E1D3} diff --git a/Build/Cosmos.ruleset b/Build/Cosmos.ruleset deleted file mode 100644 index f13b029be1..0000000000 --- a/Build/Cosmos.ruleset +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Build/README.md b/Build/README.md new file mode 100644 index 0000000000..6be36775c5 --- /dev/null +++ b/Build/README.md @@ -0,0 +1,10 @@ +### Bin + +- Often may appear to be a copy of VSIP but is used to provide bin refs to projs in SLN files. +- Separate from VSIP to allow updating without worry about locks caused by VS in VSIP. Allows +files to be updated independently for running and without need to update VS just because a +common file is locked. + +### VSIP + +- Bin output of Builder for VS to use for VSIP etc diff --git a/Build/ReadMe.txt b/Build/ReadMe.txt deleted file mode 100644 index c645eb2ec6..0000000000 --- a/Build/ReadMe.txt +++ /dev/null @@ -1,8 +0,0 @@ -Bin --Often may appear to be a copy of VSIP but is used to provide bin refs to projs in SLN files. --Separate from VSIP to allow updating without worry about locks caused by VS in VSIP. Allows -files to be updated independently for running and without need to update VS just because a -common file is locked. - -VSIP --Bin outpout of Builder for VS to use for VSIP etc diff --git a/Build/Targets/Import.props b/Build/Targets/Import.props index 67e239182a..bd767b56a6 100644 --- a/Build/Targets/Import.props +++ b/Build/Targets/Import.props @@ -11,4 +11,6 @@ + + diff --git a/Build/Targets/Import.targets b/Build/Targets/Import.targets index 3dc1e1b143..73cc879f2d 100644 --- a/Build/Targets/Import.targets +++ b/Build/Targets/Import.targets @@ -1,23 +1,28 @@ - + + True + - - - - - + - + + + - - - + - + + + + + + + + - + diff --git a/Build/Targets/InternalPackages.targets b/Build/Targets/InternalPackages.targets index 8804045b7d..5be96af5f4 100644 --- a/Build/Targets/InternalPackages.targets +++ b/Build/Targets/InternalPackages.targets @@ -2,7 +2,6 @@ - @@ -12,6 +11,7 @@ + @@ -19,12 +19,12 @@ - + - + diff --git a/Build/Targets/MSBuildExtension.targets b/Build/Targets/MSBuildExtension.targets new file mode 100644 index 0000000000..4e3f7da98a --- /dev/null +++ b/Build/Targets/MSBuildExtension.targets @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Build/Targets/NETFramework.targets b/Build/Targets/NETFramework.targets deleted file mode 100644 index 914b42e54d..0000000000 --- a/Build/Targets/NETFramework.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Build/Targets/PackageProperties.props b/Build/Targets/PackageProperties.props index 2cdad86b76..83c93005e0 100644 --- a/Build/Targets/PackageProperties.props +++ b/Build/Targets/PackageProperties.props @@ -22,7 +22,7 @@ - + diff --git a/Build/Targets/PackageVersions.targets b/Build/Targets/PackageVersions.targets index c7e85ee69b..bbd5c7ecc9 100644 --- a/Build/Targets/PackageVersions.targets +++ b/Build/Targets/PackageVersions.targets @@ -1,26 +1,19 @@ - 1.0.0-alpha-004 - 15.8.0 - 15.0.27 - 1.16.30 - 15.9.3032 - 1.3.2 - 4.8.0 - 3.10.1 - 3.10.0 - 2.6.2 + 3.0.18 + 0.7.0 + 6.8.0 + 3.11.0 + 3.12.0 + 2.6.2 - - - - - - - + + + + diff --git a/Build/Targets/RestoreSources.props b/Build/Targets/RestoreSources.props index 8e64ada25d..ef7afc63a2 100644 --- a/Build/Targets/RestoreSources.props +++ b/Build/Targets/RestoreSources.props @@ -9,7 +9,6 @@ https://ci.appveyor.com/nuget/cosmos-common; https://ci.appveyor.com/nuget/il2cpu; https://ci.appveyor.com/nuget/xsharp; - https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json $(RestoreSources);$(DefaultPackageOutputPath) diff --git a/Build/Targets/Tool.targets b/Build/Targets/Tool.targets new file mode 100644 index 0000000000..69a5a83e4b --- /dev/null +++ b/Build/Targets/Tool.targets @@ -0,0 +1,74 @@ + + + + True + + + + True + + + + False + True + $(TargetsForTfmSpecificContentInPackage);PackToolProject + + + + + + $([MSBuild]::EnsureTrailingSlash($(ToolPackagePath))) + $(ToolPackagePath)$(TargetFramework)\ + + + + + + + + + + tools\$(ToolPackagePath)%(GeneratedToolFiles.RecursiveDir) + + + tools\$(ToolPackagePath)%(ResolvedFileToPublish.RelativePath) + + + + + + + $(GenerateNuspecDependsOn);_GetProjectReferencesContentToPack + + + + + + + + + + + False + + + + + + + <_NupkgContent Include="@(_PackageFiles->'%(FullPath)')" + PackagePath="$([MSBuild]::EnsureTrailingSlash($(_NupkgContentPath)))%(_PackageFiles.PackagePath)" /> + + + + + diff --git a/Build/Targets/VSIX.targets b/Build/Targets/VSIX.targets index 35b021b604..13f89c9e50 100644 --- a/Build/Targets/VSIX.targets +++ b/Build/Targets/VSIX.targets @@ -10,11 +10,6 @@ $(_TargetVsixContainerDir)$(TargetVsixContainerName) - - - - - + + + 3.0.22 + 0.7.0 + 16.7.0 + 1.0.0 + 16.0.1 + 16.0.1 + 16.0.374-pre + 15.0.27 + 1.16.30 + 16.1.28917.181 + 11.0.61031 + 16.6.2051 + 1.4.0 + 5.1.0 + 3.11.0 + 3.13.0 + 9.12.1 + + + diff --git a/Build/Test Kernel/README.md b/Build/Test Kernel/README.md new file mode 100644 index 0000000000..2bf8e87faf --- /dev/null +++ b/Build/Test Kernel/README.md @@ -0,0 +1,16 @@ +# Build test kernel +Remove the .iso file, and run the commands in the iso root dir: + +Compiling output.bin : + +```cmd +nasm -f bin -o output.bin kernel.asm +``` + +Build iso: + +```cmd +mkisofs -R -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso +``` + +then use boot.iso as boot image. diff --git a/Build/Test Kernel/readme.txt b/Build/Test Kernel/readme.txt deleted file mode 100644 index 720aab54b4..0000000000 --- a/Build/Test Kernel/readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -remove the .iso file, and run the commands in the iso root dir: - -compiling output.bin : - -nasm -f bin -o output.bin kernel.asm - -build iso: -mkisofs -R -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o boot.iso - -then use boot.iso as boot image. \ No newline at end of file diff --git a/Build/Tools/NAsm/LICENSE b/Build/Tools/NAsm/LICENSE deleted file mode 100644 index 331e2600ad..0000000000 --- a/Build/Tools/NAsm/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -NASM is now licensed under the 2-clause BSD license, also known as the -simplified BSD license. - - Copyright 1996-2010 the NASM Authors - All rights reserved. - - 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. diff --git a/Build/Tools/NAsm/nasm.exe b/Build/Tools/NAsm/nasm.exe deleted file mode 100644 index d6d39f5216..0000000000 Binary files a/Build/Tools/NAsm/nasm.exe and /dev/null differ diff --git a/Build/Tools/NAsm/ndisasm.exe b/Build/Tools/NAsm/ndisasm.exe deleted file mode 100644 index 6907fe4fd8..0000000000 Binary files a/Build/Tools/NAsm/ndisasm.exe and /dev/null differ diff --git a/Build/Tools/NAsm/version.txt b/Build/Tools/NAsm/version.txt deleted file mode 100644 index bc60569040..0000000000 --- a/Build/Tools/NAsm/version.txt +++ /dev/null @@ -1,3 +0,0 @@ -2.12.01 - -before updating, test.. \ No newline at end of file diff --git a/Build/Tools/Yasm/LICENSE.txt b/Build/Tools/Yasm/LICENSE.txt new file mode 100644 index 0000000000..60b9b71d1b --- /dev/null +++ b/Build/Tools/Yasm/LICENSE.txt @@ -0,0 +1,74 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. 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 AUTHOR AND OTHER 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 AUTHOR OR OTHER 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. +------------------------------------------------------------------------------- +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. 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. +3. Neither the name of the author nor the names of other contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER 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 AUTHOR OR OTHER 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. +------------------------------------------------------------------------------- +NASM is now licensed under the 2-clause BSD license, also known as the +simplified BSD license. + + Copyright 1996-2009 the NASM Authors - All rights reserved. + + 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. \ No newline at end of file diff --git a/Build/Tools/Yasm/yasm.exe b/Build/Tools/Yasm/yasm.exe new file mode 100644 index 0000000000..b2cc6af610 Binary files /dev/null and b/Build/Tools/Yasm/yasm.exe differ diff --git a/Build/Tools/cygwin/cygiconv-2.dll b/Build/Tools/cygwin/cygiconv-2.dll deleted file mode 100644 index 926464c7e2..0000000000 Binary files a/Build/Tools/cygwin/cygiconv-2.dll and /dev/null differ diff --git a/Build/Tools/cygwin/cygintl-3.dll b/Build/Tools/cygwin/cygintl-3.dll deleted file mode 100644 index bd6e3829ab..0000000000 Binary files a/Build/Tools/cygwin/cygintl-3.dll and /dev/null differ diff --git a/Build/Tools/cygwin/cygwin1.dll b/Build/Tools/cygwin/cygwin1.dll index 73c27fc1fb..00d8a72aad 100644 Binary files a/Build/Tools/cygwin/cygwin1.dll and b/Build/Tools/cygwin/cygwin1.dll differ diff --git a/Build/Tools/cygwin/ld.exe b/Build/Tools/cygwin/ld.exe index 963eeabd3c..52fc663fea 100644 Binary files a/Build/Tools/cygwin/ld.exe and b/Build/Tools/cygwin/ld.exe differ diff --git a/Build/Tools/cygwin/objdump.bat b/Build/Tools/cygwin/objdump.bat new file mode 100644 index 0000000000..63a2817c5b --- /dev/null +++ b/Build/Tools/cygwin/objdump.bat @@ -0,0 +1,7 @@ +@ECHO OFF + +REM %1 == ToolPath +REM %2 == ElfFile +REM %3 == MapFile + +"%~1\objdump.exe" --wide --syms "%~2" > "%~3" diff --git a/Build/Tools/cygwin/objdump.exe b/Build/Tools/cygwin/objdump.exe index e709c327a5..fbd59f7f51 100644 Binary files a/Build/Tools/cygwin/objdump.exe and b/Build/Tools/cygwin/objdump.exe differ diff --git a/Build/Tools/cygwin/objdump.sh b/Build/Tools/cygwin/objdump.sh new file mode 100644 index 0000000000..4b16c3ae66 --- /dev/null +++ b/Build/Tools/cygwin/objdump.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# %1 == ToolPath +# %2 == ElfFile +# %3 == MapFile +objdump --wide --syms "$2" > "$3" diff --git a/Build/VMWare/Workstation/Cosmos.vmx b/Build/VMWare/Workstation/Cosmos.vmx index 7a71985182..da62d2a6ce 100644 --- a/Build/VMWare/Workstation/Cosmos.vmx +++ b/Build/VMWare/Workstation/Cosmos.vmx @@ -51,8 +51,11 @@ serial0.pipe.endPoint = "client" serial0.tryNoRxLoss = "TRUE" sound.present = "TRUE" ethernet0.present = "TRUE" -ethernet0.wakeOnPcktRcv = "FALSE" +ethernet0.connectionType = "nat" ethernet0.addressType = "generated" +ethernet0.generatedAddress = "00:0c:29:0c:c9:44" +ethernet0.generatedAddressOffset = "0" +ethernet0.pciSlotNumber = "34" usb.present = "TRUE" usb.generic.allowHID = "TRUE" ehci.present = "TRUE" diff --git a/Build/VMWare/Workstation/Filesystem(OLD).vmdk b/Build/VMWare/Workstation/Filesystem(OLD).vmdk deleted file mode 100644 index da5998300f..0000000000 Binary files a/Build/VMWare/Workstation/Filesystem(OLD).vmdk and /dev/null differ diff --git a/Build/VMWare/Workstation/Filesystem.vmdk b/Build/VMWare/Workstation/Filesystem.vmdk index 0d95353311..586f772354 100644 Binary files a/Build/VMWare/Workstation/Filesystem.vmdk and b/Build/VMWare/Workstation/Filesystem.vmdk differ diff --git a/Build/VMWare/Workstation/FilesystemTest.vmdk b/Build/VMWare/Workstation/FilesystemTest.vmdk new file mode 100644 index 0000000000..a9743a6443 Binary files /dev/null and b/Build/VMWare/Workstation/FilesystemTest.vmdk differ diff --git a/Build/grub2/boot/grub/grub.cfg b/Build/grub2/boot/grub/grub.cfg new file mode 100644 index 0000000000..8d97b0c09c --- /dev/null +++ b/Build/grub2/boot/grub/grub.cfg @@ -0,0 +1,6 @@ +set timeout=0 + +menuentry 'Cosmos' { + multiboot2 /boot/Cosmos.bin + boot +} diff --git a/Build/limine/boot/limine.cfg b/Build/limine/boot/limine.cfg new file mode 100644 index 0000000000..979897d803 --- /dev/null +++ b/Build/limine/boot/limine.cfg @@ -0,0 +1,12 @@ +DEFAULT_ENTRY=1 +TIMEOUT=3 +VERBOSE=yes + +# TERM_WALLPAPER=boot:///boot/bg.bmp +TERM_BACKDROP=008080 + +:Multiboot2 CosmosKernel + COMMENT=Boot Cosmos Kernel using Multiboot2 protocol + + PROTOCOL=multiboot2 + KERNEL_PATH=boot:///boot/Cosmos.bin \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f074fdf5c9..de74adecce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,13 @@ CosmosOS is a volunteer effort. We encourage you to pitch in. Join the team! -- Before you begin work, make sure to clear it with the project owners. It will save a lot of time down the road. +- Before you begin work, make sure to discuss it with the maintainers here on github or on discord. It will save a lot of time down the road. - Fork the project over to your account, do not request repository access. - Please be sure to check out the FAQ to see if any questions you have are already answered. [FAQ on GoCosmos.org](https://www.gocosmos.org/faq/) - Please don't "bump" your issue(s). If you've filed it, we have seen it. -- Please be sure to install the [EditorConfig](https://visualstudiogallery.msdn.microsoft.com/c8bccfe2-650c-4b42-bc5c-845e21f96328). This ensures your pull requests meet the required formatting and conventions. [See here](https://github.com/CosmosOS/Cosmos/wiki/FAQ#what-is-this-editorconfig-file-and-how-do-i-use-it) for more info. - -Want to get started contributing to Cosmos? Check out the open issues page: -- [High priority](https://github.com/CosmosOS/Cosmos/labels/Priority%3A%20High) -- [Medium priority](https://github.com/CosmosOS/Cosmos/labels/Priority%3A%20Medium) +- If you have any questions or need a bit of help feel free to open a discussion post or ask on the discord. +Want to get started contributing to Cosmos? +Check out the open issues page for open [issues](https://github.com/CosmosOS/Cosmos/labels/Up%20for%20Grabs). Thanks! diff --git a/Demos.sln b/Demos.sln deleted file mode 100644 index c49ed4883e..0000000000 --- a/Demos.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2041 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Beep", "Beep", "{85AD61C5-4105-4E94-9AC3-345C3744770A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Graphics", "Graphics", "{7A1220A6-511A-4552-B5F6-D6675FC21508}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Guess", "Guess", "{2A48C638-F2BB-491A-A36A-B58A9697D1B0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ZMachine", "ZMachine", "{39B58CD8-7147-4FF0-961C-2CA140651C34}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeepDemo", "Demos\BeepDemo\BeepDemo.csproj", "{96D8F1A6-EA27-4899-8E08-EDD86CB0370A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuessKernel", "Demos\Guess\GuessKernel.csproj", "{8E76CDF2-CBE3-4C50-B991-F9B7E3033132}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CosmosGraphicSubsystem", "Demos\CosmosGraphicSubsystem\CosmosGraphicSubsystem.csproj", "{6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZKernel", "Demos\ZMachine\ZKernel\ZKernel.csproj", "{04B52A1C-C57A-40C3-BED3-A97B7BA840E9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZLibrary", "Demos\ZMachine\ZLibrary\ZLibrary.csproj", "{3B661E21-F46C-4048-92BA-4BF67F7ED7D0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {96D8F1A6-EA27-4899-8E08-EDD86CB0370A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96D8F1A6-EA27-4899-8E08-EDD86CB0370A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96D8F1A6-EA27-4899-8E08-EDD86CB0370A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96D8F1A6-EA27-4899-8E08-EDD86CB0370A}.Release|Any CPU.Build.0 = Release|Any CPU - {8E76CDF2-CBE3-4C50-B991-F9B7E3033132}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E76CDF2-CBE3-4C50-B991-F9B7E3033132}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E76CDF2-CBE3-4C50-B991-F9B7E3033132}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E76CDF2-CBE3-4C50-B991-F9B7E3033132}.Release|Any CPU.Build.0 = Release|Any CPU - {6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E}.Release|Any CPU.Build.0 = Release|Any CPU - {04B52A1C-C57A-40C3-BED3-A97B7BA840E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04B52A1C-C57A-40C3-BED3-A97B7BA840E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04B52A1C-C57A-40C3-BED3-A97B7BA840E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04B52A1C-C57A-40C3-BED3-A97B7BA840E9}.Release|Any CPU.Build.0 = Release|Any CPU - {3B661E21-F46C-4048-92BA-4BF67F7ED7D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B661E21-F46C-4048-92BA-4BF67F7ED7D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B661E21-F46C-4048-92BA-4BF67F7ED7D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B661E21-F46C-4048-92BA-4BF67F7ED7D0}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {96D8F1A6-EA27-4899-8E08-EDD86CB0370A} = {85AD61C5-4105-4E94-9AC3-345C3744770A} - {8E76CDF2-CBE3-4C50-B991-F9B7E3033132} = {2A48C638-F2BB-491A-A36A-B58A9697D1B0} - {6F750E6B-8C93-4DE7-9FF9-3C31C5121F1E} = {7A1220A6-511A-4552-B5F6-D6675FC21508} - {04B52A1C-C57A-40C3-BED3-A97B7BA840E9} = {39B58CD8-7147-4FF0-961C-2CA140651C34} - {3B661E21-F46C-4048-92BA-4BF67F7ED7D0} = {39B58CD8-7147-4FF0-961C-2CA140651C34} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {737503A6-354A-4725-8D7F-27A996161138} - EndGlobalSection -EndGlobal diff --git a/Demos/BeepDemo/BeepDemo.sln b/Demos/BeepDemo/BeepDemo.sln deleted file mode 100644 index 4954140098..0000000000 --- a/Demos/BeepDemo/BeepDemo.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27428.2037 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeepDemo", "BeepDemo.csproj", "{0AD02943-D563-43E4-A41F-D4FC1870C42A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0AD02943-D563-43E4-A41F-D4FC1870C42A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0AD02943-D563-43E4-A41F-D4FC1870C42A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0AD02943-D563-43E4-A41F-D4FC1870C42A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0AD02943-D563-43E4-A41F-D4FC1870C42A}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {2315A3B8-08D1-4EED-8629-E83991A77E46} - EndGlobalSection -EndGlobal diff --git a/Demos/BeepDemo/Kernel.cs b/Demos/BeepDemo/Kernel.cs deleted file mode 100644 index b154bcbdbc..0000000000 --- a/Demos/BeepDemo/Kernel.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using System.Threading; - -namespace BeepDemo -{ - public class Kernel: Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - protected override void Run() - { - Console.WriteLine("Run 'Mary Had a Little Lamb'? "); - string ans = Console.ReadLine(); - if (ans.ToLower() == "y" || ans.ToLower() == "yes") - { - BeepTest.Main(); - } - else - { - Console.WriteLine("Default beep:"); - Console.Beep(); - // Does the follwing: Console.Beep((int)Sys.Notes.Default (800 hertz), (int)Sys.Durations.Default (200 milliseconds) ); - } - } - } - class BeepTest - { - public static void Main() - { - // Declare the first few notes of the song, "Mary Had A Little Lamb". - Note[] Mary = - { - new Note(Tone.B, Duration.QUARTER), - new Note(Tone.A, Duration.QUARTER), - new Note(Tone.GbelowC, Duration.QUARTER), - new Note(Tone.A, Duration.QUARTER), - new Note(Tone.B, Duration.QUARTER), - new Note(Tone.B, Duration.QUARTER), - new Note(Tone.B, Duration.HALF), - new Note(Tone.A, Duration.QUARTER), - new Note(Tone.A, Duration.QUARTER), - new Note(Tone.A, Duration.HALF), - new Note(Tone.B, Duration.QUARTER), - new Note(Tone.D, Duration.QUARTER), - new Note(Tone.D, Duration.HALF) - }; - // Play the song - Play(Mary); - } - - // Play the notes in a song. - protected static void Play(Note[] tune) - { - foreach (Note n in tune) - { - if (n.NoteTone == Tone.REST) - { - Thread.Sleep((int)n.NoteDuration); - } - else - { - Console.Beep((int)n.NoteTone, (int)n.NoteDuration); - } - } - } - - // Define the frequencies of notes in an octave, as well as - // silence (rest). - protected enum Tone - { - REST = 0, - GbelowC = 196, - A = 220, - Asharp = 233, - B = 247, - C = 262, - Csharp = 277, - D = 294, - Dsharp = 311, - E = 330, - F = 349, - Fsharp = 370, - G = 392, - Gsharp = 415, - } - - // Define the duration of a note in units of milliseconds. - protected enum Duration - { - WHOLE = 1600, - HALF = WHOLE / 2, - QUARTER = HALF / 2, - EIGHTH = QUARTER / 2, - SIXTEENTH = EIGHTH / 2, - } - - // Define a note as a frequency (tone) and the amount of - // time (duration) the note plays. - protected struct Note - { - Tone toneVal; - Duration durVal; - - // Define a constructor to create a specific note. - public Note(Tone frequency, Duration time) - { - toneVal = frequency; - durVal = time; - } - - // Define properties to return the note's tone and duration. - public Tone NoteTone { get { return toneVal; } } - public Duration NoteDuration { get { return durVal; } } - } - } - /* - This example produces the following results: - - This example plays the first few notes of "Mary Had A Little Lamb" - through the computer PC Speaker. - */ -} diff --git a/Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.sln b/Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.sln deleted file mode 100644 index 072135d89f..0000000000 --- a/Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CosmosGraphicSubsystem", "CosmosGraphicSubsystem.csproj", "{AD808AC8-9CF4-4CCF-AD4E-EE10F1AFD286}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AD808AC8-9CF4-4CCF-AD4E-EE10F1AFD286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD808AC8-9CF4-4CCF-AD4E-EE10F1AFD286}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD808AC8-9CF4-4CCF-AD4E-EE10F1AFD286}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD808AC8-9CF4-4CCF-AD4E-EE10F1AFD286}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D3B68C24-03DF-45BC-947B-7A088082DD0B} - EndGlobalSection -EndGlobal diff --git a/Demos/CosmosGraphicSubsystem/Kernel.cs b/Demos/CosmosGraphicSubsystem/Kernel.cs deleted file mode 100644 index 455f029310..0000000000 --- a/Demos/CosmosGraphicSubsystem/Kernel.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Drawing; -using Cosmos.System.Graphics; -using Sys = Cosmos.System; -using Point = Cosmos.System.Graphics.Point; - - -/* - * Beware Demo Kernels are not recompiled when its dependencies changes! - * To force recompilation right click on on the Cosmos icon of the demo solution and do "Build". - */ - -namespace Cosmos_Graphic_Subsytem -{ - public class Kernel : Sys.Kernel - { - private Canvas canvas; - private Bitmap bitmap; - - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Let's go in Graphic Mode"); - Console.WriteLine("Using default graphics mode"); - //Mode start = new Mode(800, 600, ColorDepth.ColorDepth32); - - bitmap = new Bitmap(10, 10, - new byte[] { 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, - 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, - 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, - 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, - 23, 59, 88, 255, 0, 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, 23, 59, 88, 255, 0, 255, 243, 255, 0, - 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, 153, 57, 12, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, - 243, 255, 0, 255, 243, 255, 153, 57, 12, 255, 23, 59, 88, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, - 255, 0, 255, 243, 255, 0, 255, 243, 255, 72, 72, 72, 255, 72, 72, 72, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, - 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 72, 72, - 72, 255, 72, 72, 72, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, - 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, - 243, 255, 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 10, 66, 148, 255, 10, 66, 148, 255, - 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, - 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, - 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, - 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, }, ColorDepth.ColorDepth32); - - Console.WriteLine("Press any key to continue!"); - Console.ReadKey(true); - // Create new instance of FullScreenCanvas, using default graphics mode - canvas = FullScreenCanvas.GetFullScreenCanvas(); // canvas = GetFullScreenCanvas(start); - - /* Clear the Screen with the color 'Blue' */ - canvas.Clear(Color.Blue); - } - - protected override void Run() - { - try - { - mDebugger.Send("Run"); - - /* A red Point */ - Pen pen = new Pen(Color.Red); - canvas.DrawPoint(pen, 69, 69); - - /* A GreenYellow horizontal line */ - pen.Color = Color.GreenYellow; - canvas.DrawLine(pen, 250, 100, 400, 100); - - /* An IndianRed vertical line */ - pen.Color = Color.IndianRed; - canvas.DrawLine(pen, 350, 150, 350, 250); - - /* A MintCream diagonal line */ - pen.Color = Color.MintCream; - canvas.DrawLine(pen, 250, 150, 400, 250); - - /* A PaleVioletRed rectangle */ - pen.Color = Color.PaleVioletRed; - canvas.DrawRectangle(pen, 350, 350, 80, 60); - - pen.Color = Color.Chartreuse; - canvas.DrawCircle(pen, 69, 69, 10); - - pen.Color = Color.LightSalmon; - canvas.DrawEllipse(pen, 400, 300, 100, 150); - - pen.Color = Color.MediumPurple; - canvas.DrawPolygon(pen, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275)); - - canvas.DrawImage(bitmap, new Point(20, 20)); - - /* - * It will be really beautiful to do here: - * canvas.DrawString(pen, "Please press any key to continue the Demo..."); - */ - Console.ReadKey(); - - /* Let's try to change mode...*/ - canvas.Mode = new Mode(800, 600, ColorDepth.ColorDepth32); - - //If the background is not redrawn, it gets corrupted - canvas.Clear(Color.Blue); - - /* A LimeGreen rectangle */ - pen.Color = Color.LimeGreen; - canvas.DrawRectangle(pen, 450, 450, 80, 60); - - /* A filled rectange */ - pen.Color = Color.Chocolate; - canvas.DrawFilledRectangle(pen, 200, 150, 400, 300); - - /* - * It will be really beautiful to do here: - * canvas.DrawString(pen, "Please press any key to end the Demo..."); - */ - Console.ReadKey(); - - Sys.Power.Shutdown(); - } - catch (Exception e) - { - Console.WriteLine($"Got fatal exception {e.Message}"); - } - } - } -} diff --git a/Demos/Guess/Kernel.cs b/Demos/Guess/Kernel.cs deleted file mode 100644 index ad4a87ce8c..0000000000 --- a/Demos/Guess/Kernel.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; - -using Cosmos.Debug.Kernel; -using Sys = Cosmos.System; - -/* - * Beware Demo Kernels are not recompiled when its dependencies changes! - * To force recompilation right click on on the Cosmos icon of the demo solution and do "Build". - */ -namespace Guess -{ - public class GuessOS : Sys.Kernel - { - private Random mRandom; - private int mCount; - private int mNumber; - - protected override void BeforeRun() - { - mRandom = new Random(); - - mCount = 0; - mNumber = mRandom.Next(1, 100); - - Console.Clear(); - - Console.WriteLine("Guess Demo"); - Console.WriteLine("----------"); - Console.WriteLine(); - Console.WriteLine("Please guess a number from 1 to 100."); - Console.WriteLine(); - } - - protected override void Run() - { - mCount++; - - Console.Write($"Guess #{mCount}: "); - - var xGuess = Int32.Parse(Console.ReadLine()); - mDebugger.Send($"Guess#{mCount}: {xGuess}"); - - if (xGuess < mNumber) - { - Console.WriteLine("Too low."); - } - else if (xGuess > mNumber) - { - Console.WriteLine("Too high."); - } - else - { - Console.WriteLine("You guessed it!"); - Console.WriteLine("Press s to stop or any other key to play again. Thanks for playing!"); - - if (Console.ReadKey(true).Key == ConsoleKey.S) - { - Stop(); - } - - mNumber = mRandom.Next(1, 100); - mCount = 0; - } - } - - protected override void AfterRun() - { - Sys.Power.Shutdown(); - } - } -} diff --git a/Demos/ZMachine/ZLibrary/ZLibrary.csproj b/Demos/ZMachine/ZLibrary/ZLibrary.csproj deleted file mode 100644 index ee0230b21a..0000000000 --- a/Demos/ZMachine/ZLibrary/ZLibrary.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - netstandard2.0 - - - - - - - diff --git a/Demos/ZMachine/ZMachine.sln b/Demos/ZMachine/ZMachine.sln deleted file mode 100644 index 76c60ea3f6..0000000000 --- a/Demos/ZMachine/ZMachine.sln +++ /dev/null @@ -1,51 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27703.2000 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZKernel", "ZKernel\ZKernel.csproj", "{FB1DD9D8-940E-4112-AB03-A487F4CCF270}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZLibrary", "ZLibrary\ZLibrary.csproj", "{8ECC1100-B49F-42B5-9679-737E181B3DED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZTestConsoleApp", "ZTestConsoleApp\ZTestConsoleApp.csproj", "{A69AEB62-6CDA-4BEC-9AEE-7702452C3965}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Debug|x86.ActiveCfg = Debug|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Debug|x86.Build.0 = Debug|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Release|Any CPU.Build.0 = Release|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Release|x86.ActiveCfg = Release|Any CPU - {FB1DD9D8-940E-4112-AB03-A487F4CCF270}.Release|x86.Build.0 = Release|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Debug|x86.ActiveCfg = Debug|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Debug|x86.Build.0 = Debug|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Release|Any CPU.Build.0 = Release|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Release|x86.ActiveCfg = Release|Any CPU - {8ECC1100-B49F-42B5-9679-737E181B3DED}.Release|x86.Build.0 = Release|Any CPU - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Debug|x86.ActiveCfg = Debug|x86 - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Debug|x86.Build.0 = Debug|x86 - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Release|Any CPU.Build.0 = Release|Any CPU - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Release|x86.ActiveCfg = Release|x86 - {A69AEB62-6CDA-4BEC-9AEE-7702452C3965}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A2762066-8A9B-4B54-954B-2CECDAECFD2A} - EndGlobalSection -EndGlobal diff --git a/Demos/ZMachine/ZTestConsoleApp/ZTestConsoleApp.csproj b/Demos/ZMachine/ZTestConsoleApp/ZTestConsoleApp.csproj deleted file mode 100644 index ce1d9f7dbc..0000000000 --- a/Demos/ZMachine/ZTestConsoleApp/ZTestConsoleApp.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - Exe - netcoreapp2.0 - AnyCPU;x86 - - - - true - - - - true - - - - - - - diff --git a/Directory.Build.props b/Directory.Build.props index 1bbe9c4b23..e261217c81 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,10 +1,5 @@ - - Latest - CA1051;CA1707;CA1711;CA1801;$(NoWarn) - - $(MSBuildThisFileDirectory) $(RepoRoot)..\Common\ @@ -12,6 +7,14 @@ $(RepoRoot)..\XSharp\ + + Latest + CA1051;CA1501;CA1707;CA1711;CA1801;CS1572;CS1573;CS1574;CS1591;NU1603;$(NoWarn) + True + true + true + + - - - - - \ No newline at end of file diff --git a/Docs/api/.gitignore b/Docs/api/.gitignore new file mode 100644 index 0000000000..e8079a3bef --- /dev/null +++ b/Docs/api/.gitignore @@ -0,0 +1,5 @@ +############### +# temp file # +############### +*.yml +.manifest diff --git a/Users/Kudzu/Breakpoints/Cosmos.bxrc b/Docs/api/cosmos/index.md similarity index 100% rename from Users/Kudzu/Breakpoints/Cosmos.bxrc rename to Docs/api/cosmos/index.md diff --git a/Docs/api/il2cpu/index copy.md b/Docs/api/il2cpu/index copy.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Docs/api/il2cpu/index.md b/Docs/api/il2cpu/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Docs/api/index.md b/Docs/api/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Docs/api/plugs/index.md b/Docs/api/plugs/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Docs/api/xsharp/index.md b/Docs/api/xsharp/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Docs/articles/Changelog.md b/Docs/articles/Changelog.md new file mode 100644 index 0000000000..952f1f1e4f --- /dev/null +++ b/Docs/articles/Changelog.md @@ -0,0 +1,14 @@ +# DevKit changelog + +## c5c087c697d106348adbcff86d5d43331500e648 (update then merged in) + +### Features + +* X# is now packaged as a nuget package +* Plugs are now packaged as a nuget package rather then been hard coded in build scripts + +### Breaking changes + +Plugs are now included via a nuget package, to update cosmos past this commit you need to add the `Cosmos.Plugs` package to your kernel project. Don't forget to tick the `Include prerelease` checkbox and to set the package origin to `All`! + +*Last updated on 4 September 2023.* \ No newline at end of file diff --git a/Docs/articles/Compiler/il2cpu.md b/Docs/articles/Compiler/il2cpu.md new file mode 100644 index 0000000000..fdd3969db2 --- /dev/null +++ b/Docs/articles/Compiler/il2cpu.md @@ -0,0 +1,15 @@ +# IL2CPU + +IL2CPU is one of the most important pieces of code in Cosmos. It's an AOT (Ahead-Of-Time) compiler. + +When you compile your C# (or any other .NET language) program, it is compiled into CIL (common intermediate language). The CIL is then interpreted and executed by a virtual machine when you open your .exe. + +Cosmos is written in C# and Visual Studio compiles it into CIL like usual. But a PC does not come with an interpreter for the CIL code, and writing a virtual machine for running an operating system is not ideal. + +This is where IL2CPU comes in. IL2CPU takes the CIL code and translates it to processor op-codes. Currently, only x86 opcodes are available at the moment. However, more architectures are planned for the future (ARM, PowerPC, x86-64). + +At this point, IL2CPU performs some more magic before finally converting the entire file into a bootable binary file, which can be loaded by a bootloader on any system (Cosmos uses the [Limine bootloader](https://github.com/limine-bootloader/limine). + +As you might think, IL2CPU is a fundamental part of the development of Cosmos. IL2CPU is responsible for the final output, which is why most optimizations added are for IL2CPU. + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Debugger/DebugCommands.md b/Docs/articles/Debugger/DebugCommands.md new file mode 100644 index 0000000000..15c4a91b6f --- /dev/null +++ b/Docs/articles/Debugger/DebugCommands.md @@ -0,0 +1,64 @@ +# Debug Commands + +## DS to VS + +```cs +Noop = 0; +TracePoint = 1; +Message = 2; +BreakPoint = 3; +Error = 4; +Pointer = 5; +// This is sent once on start up. The first call to debug stub sends this. +// Host can then respond with a series of set breakpoints etc, ie ones that were set before running. +Started = 6; +MethodContext = 7; +MemoryData = 8; +// Sent after commands to acknowledge receipt during batch mode +CmdCompleted = 9; +Registers = 10; +Frame = 11; +Stack = 12; +Pong = 13; +BreakPointAsm = 14; +``` + +## VS to DS + +```cs +Noop = 0; + +TraceOff = 1; // Dont think currently used +TraceOn = 2; // Dont think currently used + +Break = 3; +Continue = 4; // After a Break +BreakOnAddress = 6; + +BatchBegin = 7; +BatchEnd = 8; + +StepInto = 5; +StepOver = 11; +StepOut = 12; + +SendMethodContext = 9; // Sends data from stack, relative to EBP (in x86) +SendMemory = 10; +SendRegisters = 13; // Send the register values to DC +SendFrame = 14; +SendStack = 15; + + // Set an assembly level break point + // Only one can be active at a time. BreakOnAddress can have multiple. + // User must call continue after. +SetAsmBreak = 16; + +Ping = 17; + // Make sure this is always the last entry. Used by DebugStub to verify commands. +Max = 18; +``` + +## Debug channel +We support channels, which are prefixed with anything prefixed with 192 and up. 192 is used for a debug view. + +*Last updated on 12 February 2020.* \ No newline at end of file diff --git a/Docs/Directories.md b/Docs/articles/Directories.md similarity index 99% rename from Docs/Directories.md rename to Docs/articles/Directories.md index 1bdad8122c..0e9b3e6f34 100644 --- a/Docs/Directories.md +++ b/Docs/articles/Directories.md @@ -65,7 +65,7 @@ This directory contains the low-level plugs for Cosmos.Core. #### \Source\Cosmos.Debug This directory contains the Debug Engine and Connector code and also, it's gives the possibility to -work with GDB. For more informations about debugging see the [Debugger](debugger.htm) page +work with GDB. For more informations about debugging see the [Debugger](Debugger/DebugCommands.md) page #### \Source\Cosmos.Deploy diff --git a/Docs/articles/GettingStarted.md b/Docs/articles/GettingStarted.md new file mode 100644 index 0000000000..475335c389 --- /dev/null +++ b/Docs/articles/GettingStarted.md @@ -0,0 +1,130 @@ +# Getting Started + +## Introducing Cosmos + +Cosmos (C# Open Source Managed Operating System) is an operating system +development kit which uses Visual Studio as its development environment. +Despite C# in the name, any .NET based language can be used, including VB.NET, +Fortran, Delphi Prism, IronPython, F# and more. Cosmos itself and the kernel +routines are primarily written in C#, and thus the Cosmos name. Besides that, +NOSMOS (.NET Open Source Managed Operating System) sounds silly. + +Cosmos diverts from traditional operating systems because it is not an operating system in the conventional sense; rather, it is an "Operating System Kit," similar to "Operating System Legos". With Cosmos, you have the flexibility to construct operating systems just as how Visual Studio and C# help you develop applications. Using Visual Studio, most users can swiftly write and boot their own operating system within minutes. Additionally, debugging your operating system directly from Visual Studio is a feature, allowing for efficient troubleshooting through breakpoints. + +Cosmos is available in two distributions, the developer kit (abbr. *DevKit*), and the user kit. +The DevKit was originally designed for those who want to work on Cosmos's core features, but now has superceded the inferior user kit due to having much more technical ability. +The User Kit was designed for those who are interested in building their own operating system and doing some Cosmos work. Since the User Kit is so heavily outdated, it is often recommended to download the DevKit when installing. The documentation will cover both. + +## Writing your first Operating System + +Once you have installed Cosmos (see other docs), you can create a new project as you would any C# project, but select Cosmos as the project type. + +![](images/SNAG-0000.png) + +A starter project will be created. It looks very much like a standard C# +console application. + +![](images/SNAG-0001.png) + +Kernel.cs contains the boot and execution code. Instead of seeing a Windows +console window, you will see the following: + +![](images/SNAG-0003.png) + +This is your operating system running in VMware Player! Cosmos can of course +also be booted in VMware Workstation, VirtualBox, Bochs, or on real +hardware. But by default, Cosmos uses VMware Player because it is both free, +and reliable. Cosmos can even debug in Visual Studio, even when running on +another machine. + +## Integrated Debugging + +Debugging is a major issue with operating system development. The Cosmos team +was not content enough to simply conquer building and deployment, we want to +make developing operating systems as easy as developing Windows applications. +Debugging a Cosmos based operating system should feel very familiar to you. +Lets modify our project a little bit to show the effect, and set a breakpoint. +*Note that the debugger only works in Visual Studio, and not Linux!* + +![](images/SNAG-0005.png) + +Now run the project again. + +![](images/SNAG-0007.png) + +Notice how the execution stopped at "One"? That is becuase in Visual Studio our +project has stopped on a breakpoint. Simply press F5 to continue just as you +would in a normal application! + +In addition to breakpoints, Cosmos also supports step into (F11) as well. Trace +over (F10) is not supported yet. + +## Debugger Communication + +The debugger uses the serial port to communicate. Because of this, debugging +only works within virtualization environments that support serial ports, such as +VMware. QEMU supports serial ports as well, but its serial port implementation +is seriously broken on Windows and makes debugging impossible using QEMU. To +debug on real hardware, you must use a physical serial cable. In the future, +Cosmos will also support debugging over Ethernet. + +## Extra Debugging + +Cosmos supports some explicit methods that can be used to communicate with the +debugger and use additional functionality. It is accessed using the Debugger +class in the Cosmos.Debug namespace in the Cosmos.Kernel assembly. This +assembly is used by all Cosmos projects. + +## Code Based Breakpoints + + + mDebugger.Break(); + +Break can be used to issue a code based break. Visual Studio will break on the +line after this statement. + +![](images/SNAG-0006.png) + +Since Cosmos does not support conditional breakpoints in the IDE yet, code +base breaks are very useful for implementing such. For example: + + + if (x == 5) { + mDebugger.Break(); + } + +Or you can use the .NET BCL debugger break: + + + System.Diagnostics.Debugger.Break(); + +Both functions will produce the same result. + +## Debug Output + +Debug strings can be outputted to the debug window of the host. Because Cosmos +does not support watches yet, this functionality can be very useful for +watching variable values and for performing tracing without breakpoints. + + + mDebugger.Send("Hello from Cosmos!"); + +When this line is executed, it will send a message over the debugging channel +and it will appear in the Visual Studio output window. + +![](images/SNAG-0008.png) + +## What's the catch? + +There really is no catch. Everything we've shown here is functioning as seen. +No mockups were used. However, we still have a lot of work to do. Items of +interest that are on our current task list include multithreading and x64 systems. +We have prototypes and experiments for each, but none have been rolled into +the mainline Cosmos development as of yet. + +## Obtaining Cosmos + + * Cosmos website - [http://www.GoCosmos.org](http://www.GoCosmos.org) + * Source code - Both DevKit and User Kit - [http://github.com/CosmosOS/Cosmos/](http://github.com/CosmosOS/Cosmos/) + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Installation/DevKit.md b/Docs/articles/Installation/DevKit.md new file mode 100644 index 0000000000..08f95b01c1 --- /dev/null +++ b/Docs/articles/Installation/DevKit.md @@ -0,0 +1,83 @@ +# DevKit Installation + +## Windows + +### Prerequisites + +* Source code of Development Kit from [Cosmos on GitHub](https://github.com/CosmosOS/Cosmos) + * You must clone the repository using Git. For a detailed walkthrough, [see here](https://help.github.com/articles/fork-a-repo/). + +* [Visual Studio 2022 Community](https://visualstudio.microsoft.com/vs/) +* [InnoSetup](http://www.jrsoftware.org/isdl.php#qsp) + + * This is required to build the setup kit which is used to build and install the Visual Studio integration libaries for Cosmos. + * During install it will ask you about optional components to install. Be sure you check "Install Inno Setup Preprocessor". + +### Installation + +* Git clone the current source code of Cosmos or download the source code directly from GitHub. If you downlaod the source code, you will need to rename the folder to simply 'Cosmos'. +* Look in the downloaded sources and run **install-VS2022.bat** with admin privileges (UAC will ask for permission), needed for install in system directories. +* When the installation is complete, Visual Studio will automatically open and you may begin programming with your new, modified copy of Cosmos. + + +## Linux + +### Prerequisites + +* .NET SDK (6+): [Download .NET SDK](https://learn.microsoft.com/en-us/dotnet/core/install/linux) +* Make (`apt install make`) +* Yasm (`apt install yasm`) +* Xorriso (`apt install xorriso`) +* QEMU or any other virtual machine. See [Running](https://cosmosos.github.io/articles/Installation/Running.html) for more information. + +### Installation +Git clone the current source code of Cosmos. +Run `make` to build Cosmos. Cosmos will clone all the required repos, build itself, and install it and its nuget packages to the system automatically. + +## MacOS (Apple Silicon/Intel) +It is currently difficult to build Cosmos on Apple Silicon Devices. So, we are going to build DevKit on Docker (Virtual Environment Service). + +### Prerequisites + +* Docker (`brew install --cask docker`) +* QEMU or any other virtual machine. See [Running](https://cosmosos.github.io/articles/Installation/Running.html) for more information. + + +### Installation +First, we need to set directory to the path of Cosmos source directory and build the Dockerfile: +``` +cd /path/to/Cosmos/ +docker build -t cosmos . +``` +This will take a while. If there is no error, you successfully installed Cosmos on a Virtual Environment! + +## Notes / FAQ + +### Custom Cosmos Repos + +If you are using custom Cosmos repos, you will need to clone them all manually, as the installer script will only pull from https://github.com/CosmosOS/ + +A tree diagram of the source should look like the following: + + + + +### I get stuck pulling the git repos! + +Check if [Git](https://git-scm.com/) is installed on your machine and within your path. We use Git to pull the repos from GitHub. + +### I just updated my DevKit and my project is still using the older version! + +Although Cosmos typically uninstalls previous kits before installing a new one; it is possible that your project can reference an older-version. In the rare case this does occur, you may need to clear the NuGet cache. Try running `dotnet clean` to clear the project-level cache. + +### The project templates are not showing in Visual Studio! + +If you have more than 1 version of Visual Studio *(such as both 2022 and 2019)*, this bug can occur. Try running `dotnet Project Templates` to get them back. + +### dotnet Project Templates + +If you are using Linux, or prefer not using Visual Studio for your projects, you can install the dotnet project template using `dotnet new --install ./source/templates/csharp/` assuming you are currently in the Cosmos base directory. After installing the template, use `dotnet new cosmosCSKernel -n {name}` to create a new Cosmos Kernel project. +The dotnet template can be removed at a later time using `dotnet new --uninstall ./source/templates/csharp/`. + +*Last updated on 20 April 2024.* + diff --git a/Docs/articles/Installation/Running.md b/Docs/articles/Installation/Running.md new file mode 100644 index 0000000000..139722738d --- /dev/null +++ b/Docs/articles/Installation/Running.md @@ -0,0 +1,120 @@ +# Running +Cosmos supports running on any Intel x86 environment. However, for debugging +and ease of use, many virtual and physical setups have integrated support. If +you do not see your environment, this does not mean Cosmos will not work. You +can simply fall back to ISO, which should work with any environment. + +## ISO + +The ISO option creates an ISO image of the Cosmos output. This ISO file can be +mounted and booted by most virtualization technologies. In addition, a physical +optical disk can be burned and used to boot physical hardware. + +# Linux/Posix +**DISCLAIMER: This article assumes that you are using a Debian-based operating system!** + +## QEMU +Here you can use a generic run file, you can run it by using `sh run.sh -i -m -h `. It has to be at the root directory of the project. + +QEMU is required and can be installed with `apt-get install qemu-system`. + +To create an HDD image, you have to convert this [.vmdk](https://github.com/CosmosOS/Cosmos/blob/master/Build/VMWare/Workstation/Filesystem.vmdk?raw=true) file to a .img, which can then be used by QEMU using the following command +`qemu-img convert -f vmdk -O raw Filesystem.vmdk cosmos.img` + +Here is the run.sh: +`run.sh:` +```sh +#!/bin/bash + +helpFunction() +{ + echo "" + echo "Usage: $0 -i -m -h " + echo "\t-i ISO path to be used" + echo "\t-m Memory size to allocate to the Virtual Machine" + echo "\t-h Hard disk image location, can be created with qemu-img" + exit 1 # Exit script after printing help +} + +while getopts "i:m:h:" opt +do + case "$opt" in + i ) ISO="$OPTARG" ;; + m ) MEMORY_SIZE="$OPTARG" ;; + h ) HDD_IMAGE="$OPTARG" ;; + ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent + esac +done + +# Print helpFunction in case parameters are empty +if [ -z "$ISO" ] || [ -z "$MEMORY_SIZE" ] || [ -z "$HDD_IMAGE" ] +then + echo "Some or all of the parameters are empty"; + helpFunction +fi + +# Build the project +dotnet build + +# Emulate the ISO +qemu-system-x86_64 -boot d -cdrom $ISO -m $MEMORY_SIZE -hda $HDD_IMAGE +``` + +## VirtualBox +Create a virtual machine and use this [.vmdk](https://github.com/CosmosOS/Cosmos/blob/master/Build/VMWare/Workstation/Filesystem.vmdk?raw=true) as your HDD image. +If you are utilizing audio, we recommend VirtualBox for the ability to use their AC97 driver. + +# Windows + +## VMWare + +WMWare Workstation and VMWare Player are the preferred testing environments +for Cosmos. This is because they are stable, reliable, and easily controlled +by the Cosmos Visual Studio integration package. This allows for easy debugging and code execution control. + +VMWare Workstation is not free, however VMWare Player is. VMWare Player for +the typical Cosmos developer provides more than enough functionality. + +### VMWare Player + +VMWare Player can be downloaded [here](https://www.vmware.com/go/getplayer-win). + +### VMWare Workstation + +VMWare Workstation (paid version) can be downloaded for a free trial [here](https://www.vmware.com/go/getworkstation-win). + +## QEMU + +QEMU is not officially supported for Cosmos at this time, but can be used. Just use the ISO option above with debugging turned off. +If you want to use graphical mode in QEMU (Canvas or SVGA-II), ensure that VBE multiboot is enabled in your project settings of Cosmos. + +QEMU can be downloaded [here](https://www.qemu.org/download/) + +## Bochs + +Bochs is officially supported for Cosmos. As Bochs is a full emulation software, results vary and are often times slower than other virtualization platforms. + +Bochs can be downloaded [here](https://bochs.sourceforge.io/getcurrent.html) + +## PXE + +For PXE, no special software is required. Only an ethernet connection to your router. However, if you have a computer that does not support network booting, or if you must perform the action over WiFi, you may need to look at a PXE chainloader such as [gPXE](http://etherboot.org/wiki/). +To run your Cosmos kernel in PXE you need to follow these steps: + +Step #1: Disable Cosmos Remote Debugger, activate PXE and compile in bin format. +Go to Properties and copy these settings: + +![image](https://user-images.githubusercontent.com/98218366/178479237-a22a7b5f-250e-432d-ba74-0da502e82f7b.png) + +Boot the machine and connect it via Ethernet and will show this screen: + +![image](https://user-images.githubusercontent.com/98218366/178479800-c70faa5d-1fab-4da4-8f27-05eefee89b75.png) + +Wait and your OS will boot up. + +## Hyper-V, VirtualPC + +Not supported at this time. + + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Installation/UserKit.md b/Docs/articles/Installation/UserKit.md new file mode 100644 index 0000000000..df986f41ff --- /dev/null +++ b/Docs/articles/Installation/UserKit.md @@ -0,0 +1,27 @@ +# User Kit Installation + +for DevKit / running on Linux see [DevKit](DevKit.md) + +### Prerequisites + +* **Visual Studio 2022** - [Download](https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx) +* **Visual Studio 2022 Workload: .NET Desktop** - .NET Desktop development +* **.NET 6.0** - [Download](https://www.microsoft.com/en-us/download/details.aspx?id=53321) +* **VMware Player or Workstation** VMware Player is free, so that is recommended instead - [Download](https://www.vmware.com/uk/products/workstation-player/workstation-player-evaluation.html) +* **Microsoft Visual C++ 2010 Redistributable** - [Download](https://www.microsoft.com/en-us/download/details.aspx?id=26999) + +### Installing Cosmos + +First, you need to choose between the User Kit and the Dev Kit. It is recommended that any user start with the Dev Kit now due to the technical advancement of it - the User Kit is almost 2 years old in comparison! The DevKit is the live source code which the Cosmos Team develops directly, and as such, it has the latest and greatest features, but at various times has known issues, and sometimes may not even build. Thus, to use the DevKit, be sure to join our support channels and inquire about the current status before using the DevKit or updating it. + +The User Kit is a snapshot stable version of Cosmos including a premade installer. The UserKit however is often very out of date compared to the DevKit and is only occasionally updated. The User Kit is a great easy way to get familiar with Cosmos, but active developers should transition to the DevKit after becoming very familiar with the UserKit, and expect some bugs here and there. + +### User Kit + +1. Download [the latest release of Cosmos](http://github.com/CosmosOS/Cosmos/releases/latest) (download the **exe** file) +2. Wait for the download to complete then run the installer. Allow it to run as admin. Make sure **VS2022 is NOT running** when you do this. +3. Click "Next" then "Install" +4. Wait for the install to progress. **Tip:** At the end the installer may look like it has stalled, but it is still doing something in the background. WAIT for the "Finish" button to become available. +5. Cosmos should now be installed. Follow other tutorials to find out how to create your first OS. + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Internals/object.md b/Docs/articles/Internals/object.md new file mode 100644 index 0000000000..c7dec15dd3 --- /dev/null +++ b/Docs/articles/Internals/object.md @@ -0,0 +1,12 @@ +# Object + +## Memory Layout + +Each object is allocated with a header of three uints. The first uint is the type of the object, the second uint is the instance type of object (normal, boxed, array etc) and the third is the size in memory. + +## Garbage Collector Information + +The garbage collector itself also alloctes its own header of 1 uint (2 ushort). The first ushort is the allocated size of the object (this includes the size of both headers) while the second tracks the GC information. +The GC information is made up of a 1bit flag (the lowest bit) used to track if the GC has hit the object during the sweep phase already and the upper 7 bits count how many static references there are to the object. + +Combined in memory we have the format | ushort: memory size | ushort: gc info | uint: object type | uint: instance type | uint: object size | variable: object data | diff --git a/Docs/articles/Kernel/Audio.md b/Docs/articles/Kernel/Audio.md new file mode 100644 index 0000000000..271b1a7afe --- /dev/null +++ b/Docs/articles/Kernel/Audio.md @@ -0,0 +1,85 @@ +# The Cosmos Audio Infrastructure (CAI) +The Cosmos Audio Infrastructure allows for audio manipulation/conversion, audio I/O, and communication between audio devices. The CAI was designed with simplicity and versatility in mind. + +A basic example of playing audio through an AC97-compatible audio card: +```cs +var mixer = new AudioMixer(); +var audioStream = MemoryAudioStream.FromWave(sampleAudioBytes); +var driver = AC97.Initialize(bufferSize: 4096); +mixer.Streams.Add(audioStream); + +var audioManager = new AudioManager() +{ + Stream = mixer, + Output = driver +}; +audioManager.Enable(); +``` + +The sampleAudioBytes are the bytes of a .WAV audio file. You can read it from [VFS](https://cosmosos.github.io/articles/Kernel/VFS.html) or using [ManifestResourceStream](https://cosmosos.github.io/articles/Kernel/ManifestResouceStream.html). + +## Audio Streams +An `AudioStream` is an object that can provide sample data to audio buffers. By design, the base `AudioStream` class does not have any length or position properties, as audio streams may be infinite - for example, an output stream from a microphone, or an audio mixer. All seekable streams inherit from the class `SeekableAudioStream`, which provides functionality for accessing the position/length properties and allows methods to determine whether they accept infinite and finite streams, or only finite streams. + +### Reading audio streams from memory +You can create seekable audio streams from byte arrays using the `MemoryAudioStream` class: +```cs +byte[] bytes = GetArrayOfAudioSamplesFromSomewhere(); +var memAudioStream = new MemoryAudioStream(new SampleFormat(AudioBitDepth.Bits16, 2, true), 48000, bytes); +``` + +However, usually, you will have an audio file which contains a header containing information about the format of the audio samples it contains. The MemoryAudioStream class features support for the [Waveform Audio File Format (WAVE)](https://en.wikipedia.org/wiki/WAV), commonly used with the .WAV extension. To create an memory audio stream from a .WAV file, simply do: +```cs +byte[] bytes = GetWavFileFromSomewhere(); +var wavAudioStream = MemoryAudioStream.FromWave(bytes); +``` +The method will parse the file and return a `MemoryAudioStream`. The sample format will be determined by using the .WAV header. Please keep in mind that this method only accepts uncompressed LPCM samples, which is the most common encoding used in .WAV files. + +## Audio Mixing +The CAI includes an `AudioMixer` class out of the box. This class is an infinite `AudioStream` that mixes given streams together. Please keep in mind that mixing several audio streams together can result in [signal clipping](https://en.wikipedia.org/wiki/Clipping_(signal_processing)). In order to prevent clipping, it's recommended to either decrease the volume of the processed streams by using the `GainPostProcessor`, or implementing your own [audio limiter](https://en.wikipedia.org/wiki/Limiter). + +## Audio Buffers +Audio buffers are commonly used in both hardware and software handling - for this reason, the `AudioBuffer` class exists to operate over an array of raw audio sample data. + +### Audio Buffer R/W +Audio buffers can be easily written to or read from with the help of the `AudioBufferWriter` or `AudioBufferReader` classes, respectively. These classes automatically perform all bit-depth, channel, and sign conversions. Please keep in mind that conversion operations may be taxing on the CPU. It is recommended to use standard signed 16-bit PCM samples, but, if a conversion operation is necessary, it's recommended to perform them offline (as in, before feeding the unconverted streams into an audio mixer). The reason behind this is because processing the samples within a continously running audio driver will introduce audio crackle if the CPU cannot keep up with the conversion task. + +## Audio Post-Processing +Audio streams can be processed before they write to an audio buffer by using the `PostProcessors` property on an `AudioStream` instance. Post-processing effects are simple to implement: + +```cs +public class SilencePostProcessor : AudioPostProcessor { + public override void Process(AudioBuffer buffer){ + Array.Clear(buffer.RawData); + } +} +``` + +The above example implements an audio post-processor that turns any audio stream into silence. A more complex example can be seen in the `GainPostProcessor` class, included with the CAI. + +## Interfacing with hardware +All hardware interfacing is abstracted behind the `AudioDriver` class. It's recommended to operate an audio driver using the `AudioManager` class. Implementations of the `AudioDriver` class usually do not have a public constructor, as they can handle only one instance of an audio card - if that is the case, they should feature a static `Initialize` method and a static `Instance` property. + +For example, to initialize the AC97 driver: +```cs +var driver = AC97.Initialize(4096); +``` + +As you can see in the example above, the AC97 initialization method accepts an integer parameter - this is the buffer size the AC97 will use. A higher buffer size will result in a decreased amount of clicks and will usually decrease mixing overhead, however, it will increase latency. Some drivers, like the AC97 driver, include support for changing the buffer size while it is running - however, support for this is not guaranteed. + +After initializing a driver, it's recommended to handle it using `AudioManager`: +```cs +var audioManager = new AudioManager() +{ + Stream = mixer, + Output = driver +}; + +audioManager.Enable(); +``` +The audio manager accepts a `Stream` and an `Output` property - the `Stream` is the audio stream that the audio manager will read samples from, which will in turn be provided to the underlying `Output` audio driver. The audio manager abstracts all hardware handling - however, if you need more control over the devices, you can use the driver classes directly. + +> **Note**
+- > When interfacing with audio devices, remember not to overload the system when supplying the audio samples. When mixing several streams of audio of different formats, for example, the system can get too overloaded, and this will result in audio crackle, or the system won't be able to respond to the audio device in time, resulting in the audio device stopping all output unexpectedly. + +*Last updated on 28 July 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/CGS.md b/Docs/articles/Kernel/CGS.md new file mode 100644 index 0000000000..451f669573 --- /dev/null +++ b/Docs/articles/Kernel/CGS.md @@ -0,0 +1,151 @@ +# Introduction + +The Cosmos Graphic Subsystem *(abbr. CGS)* is based on the abstraction of Canvas that is an empty space in which the user of CGS can draw its content. CGS is not a widget toolkit like Winforms or Gnome / GTK, but is thought to be more lower level and is the basic foundation in which widget toolkits will be implemented. CGS hides the graphics driver (so far VGA, VBE and SVGAII) used and it is thought to be the universal way to draw on the screen in Cosmos. + +# FullScreenCanvas +The `FullScreenCanvas` provides two methods to get a canvas instance for the screen. It automatically chooses the best available driver to use. + +`public static Canvas GetFullScreenCanvas(Mode mode)`: gets the instance of Canvas representing the complete screen in the specified mode. Some modes that are currently available are as follows: *(depends on the backend used)* + +```CSharp +320x240, 32 +640x480, 32 +800x600, 32 +1024x768, 32 +1280x720, 32 +1280x768, 32 +1280x1024, 32 +1366x768, 32 +1680x1050, 32 +1920x1080, 32 +1920x1200, 32 +``` + +`public static Canvas GetFullScreenCanvas()`: gets the instance of Canvas representing the complete screen in the best driver available on your platform. + +# Canvas + +## List of Properties of the Canvas class + +`Mode`: get / set the mode of the video card to mode. It throws if the selected mode is not supported by the video card.\ +`DefaultGraphicMode`: default graphic mode this will change based on the underlying hardware\ +`AvailableModes`: list of the available modes supported this will change based on the underlying hardware + +## List of Methods of the Canvas class + +`Clear(Color color)` clear the entire Canvas using the specified color as background + +`void DrawPoint(Color color, int x, int y)` draws a point at the coordinates specified by x and y with the specified pen + +`void DrawLine(Color color, int x_start, int y_start, int x_end, int y_end)` draws a line at the coordinates specified by x_start, y_start and x_end, y_end with the specified pen + +`void DrawRectangle(Color color, int x_start, int y_start,int width, int height)` draws a rectangle specified by a coordinate pair, a width, and a height with the specified pen + +`void DrawImage(Image image, int x, int y)` draws an image at the x and y specified + +`void DrawString(String string, Font font, Brush brush, int x, int y)` draws a string with the specified font and brush at the specified x and y coordinates + +`void Display()` is only required when using a double buffered driver, swaps the 2 buffers which causes all changes to be displayed + + +Really simple right? +# A working example (DevKit only!) +```CSharp +using System; +using Sys = Cosmos.System; +using Cosmos.System.Graphics; + +namespace GraphicTest +{ + public class Kernel : Sys.Kernel + { + Canvas canvas; + + private readonly Bitmap bitmap = new Bitmap(10, 10, + new byte[] { 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, + 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, + 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, + 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, + 23, 59, 88, 255, 0, 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, 23, 59, 88, 255, 0, 255, 243, 255, 0, + 255, 243, 255, 0, 255, 243, 255, 23, 59, 88, 255, 153, 57, 12, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, + 243, 255, 0, 255, 243, 255, 153, 57, 12, 255, 23, 59, 88, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, + 255, 0, 255, 243, 255, 0, 255, 243, 255, 72, 72, 72, 255, 72, 72, 72, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, + 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 72, 72, + 72, 255, 72, 72, 72, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, + 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, + 243, 255, 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 10, 66, 148, 255, 10, 66, 148, 255, + 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, + 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, + 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, + 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, }, ColorDepth.ColorDepth32); + + protected override void BeforeRun() + { + // If all works correctly you should not really see this :-) + Console.WriteLine("Cosmos booted successfully. Let's go in Graphical Mode"); + + /* + You don't have to specify the Mode, but here we do to show that you can. + To not specify the Mode and pick the best one, use: + canvas = FullScreenCanvas.GetFullScreenCanvas(); + */ + canvas = FullScreenCanvas.GetFullScreenCanvas(new Mode(640, 480, ColorDepth.ColorDepth32)); + + // This will clear the canvas with the specified color. + canvas.Clear(Color.Blue); + } + + protected override void Run() + { + try + { + // A red Point + canvas.DrawPoint(Color.Red, 69, 69); + + // A GreenYellow horizontal line + canvas.DrawLine(Color.GreenYellow, 250, 100, 400, 100); + + // An IndianRed vertical line + canvas.DrawLine(Color.IndianRed, 350, 150, 350, 250); + + // A MintCream diagonal line + canvas.DrawLine(Color.MintCream, 250, 150, 400, 250); + + // A PaleVioletRed rectangle + canvas.DrawRectangle(Color.PaleVioletRed, 350, 350, 80, 60); + + // A LimeGreen rectangle + canvas.DrawRectangle(Color.LimeGreen, 450, 450, 80, 60); + + // A bitmap + canvas.DrawImage(bitmap, 100, 150); + + canvas.Display(); // Required for something to be displayed when using a double buffered driver + + Console.ReadKey(); + Sys.Power.Shutdown(); + } + catch (Exception e) + { + Debugger.Send("Exception occurred: " + e.Message); + Sys.Power.Shutdown(); + } + } + } +} +``` +# Limitations of the current implementation + +1. Only 32-bit color depth is actually supported. The API provides methods to set a resolution with 24, 16, 8 and 4 bit but the low level Bochs driver has not yet implemented them. +If you use SVGAIICanvas, you can use 24 bit Color depth, and if you use VGACanvas there are 3 modes: 320x200x8, 640x480x4 and 720x480x4. + +2. In addition, some other nice things could be implemented: + - Plugging System.Drawing functions for easier manipulation of colors. + - Plugging of System.Drawing functions for easier implementation of image conversion. + +3. CGS interacts badly with uncaught exceptions and the Kernel.Stop method: the screen will freeze without displaying any error message whatsoever. You must use the Sys.Power.Shutdown() function to properly shut down your computer. + +# Old examples +On the internet, there have been a lot of tutorials explaining how to use graphics in Cosmos, but most of them are outdated. Just remember that the new Mouse class is Sys.MouseManager and Pen has been replaced with Color. + +*Last updated on 28 July 2023.* \ No newline at end of file diff --git a/Docs/Kernel/Levels.md b/Docs/articles/Kernel/Levels.md similarity index 96% rename from Docs/Kernel/Levels.md rename to Docs/articles/Kernel/Levels.md index e6db6cac0e..edf88870e1 100644 --- a/Docs/Kernel/Levels.md +++ b/Docs/articles/Kernel/Levels.md @@ -1,4 +1,8 @@ -The security model of Cosmos will evolve and mature as +# Levels + +**Warning:** This article is for a older version of Cosmos, and as such, does not represent the current version included in the DevKit. + +The security model of Cosmos will evolve and mature as Cosmos does, however the base model is presented here. ### Goals @@ -204,3 +208,5 @@ references. 1 Ethernet 2 TCP/IP 3 Application + +*Last updated on 28 July 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/ManifestResouceStream.md b/Docs/articles/Kernel/ManifestResouceStream.md new file mode 100644 index 0000000000..e7457b8e61 --- /dev/null +++ b/Docs/articles/Kernel/ManifestResouceStream.md @@ -0,0 +1,23 @@ +# Manifest Resource Streams +Manifest Resource Streams allow you to include data from files as byte arrays in your code. An example of its use is in the [ZMachine Demo](https://github.com/CosmosOS/Cosmos/blob/5973a3fae95c989dc13505184aff9a15aae9f65f/Demos/ZMachine/ZKernel/Kernel.cs#L19). + +## How to use +1. Set for the file you want to use `Build As: Embedded Resource` using the File Properties window in VS. +![image](https://user-images.githubusercontent.com/8559822/132468001-256b92d1-0b29-4db3-9ef5-3383bfdef023.png) +2. In the code, reference the file using the following format (a static byte array with the attribute): +``` +[ManifestResourceStream(ResourceName = "{project_name}.{path}.{to}.{filename_with_extension}")] +static byte[] file; +``` +The field _must_ be static but the name of the field (file) can be changed. You will also need to add `using IL2CPU.API.Attribs;` to the code. + +For example, if the project is called Kernel and the file is `Data\Text.txt`, then `ResourceName = "Kernel.Data.Text.txt"`. + +3. To access the data simply read from the byte array defined. + +```csharp +string fileContent = System.Text.Encoding.UTF8.GetString(file); //convert the byte array to string (assuming text data) +Console.WriteLine(fileContent); //write it out +``` + +*Last updated on 28 July 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/MemoryManagement.md b/Docs/articles/Kernel/MemoryManagement.md new file mode 100644 index 0000000000..76df1c6a22 --- /dev/null +++ b/Docs/articles/Kernel/MemoryManagement.md @@ -0,0 +1,69 @@ +# Memory Management in Cosmos + +Cosmos provides dynamic memory allocation on a heap and a garbage collector to free unused objects. + +The heap is initialised automatically when the kernel starts and the memory managed is split into pages of 4096 bytes each. + +This article provides an overview of how both Memory Allocation and the Garbage Collector can be used (Usage Section) and how they work internally (Internals Section). + +## Memory Allocation + +### Usage + +#### Allocation + +Usually, users should be allocating memory indirectly by using `new` or other standard methods provided by .Net to allocate new objects. In the cases, where you want to allocate a managed block of memory, which is not part of a certain .NET type, a `ManagedMemoryBlock` or `byte[]` should suffice. If this is not sufficient, one can use `uint GCImplementation.AllocNewObject(uint aSize)` to allocate a region of `aSize` bytes. The returned uint contains the memory address and can be converted to pointer if required. + +One can manually free an object using `Heap.Free(void* aPtr)` or `GCImplementation.Free(object aObj)`. It is recommended to not manually free .NET objects unless you know what you are doing, since Cosmos does not always recognise when it is accessing already freed memory. This can lead to very weird bugs. + +#### Information + +Cosmos provides a few methods to get information about the heap status: + + - `GCImplementation.GetAvailableRAM()` returns the size of the memory in MB available to the heap + - `GCImplementation.GetUsedRAM()` provides a rough estimate of how many bytes are currently in use + - `HeapSmall.GetAllocatedObjectCount()` returns the number of .NET objects are currently allocated + - `RAT.GetPageCount(byte aType)` returns how many pages of a certain type are allocated. The different type definitions are stored in `RAT.PageType` + +### Internals + +The Heap is managed using the RAT (RAM Allocation Table). The RAT consists of a byte array which for every page in the heap stores its status. The table is stored at the end of the heap starting at `mRAT` and does not grow during runtime. Pages can be of the following types, `Empty`, `HeapSmall`, `HeapMedium`, `HeapLarge`, `RAT`, `SMT` and `Extension`. If the value for a type is odd, it means that the page is managed by the GC and objects stored there will be scanned and if possible freed. + +The RAT initialisation is triggered using `GCImplementation.Init()` which is called in the boot sequence defined in CosmosAssembler.cs. If the MemoryMap is available, the largest continuous region of memory is used for the heap. + +The RAT is managed through the `RAT` class. Pages are allocated via `void* RAT.AllocPages(byte aType, uint aPageCount = 1)`. If more than 1 page is allocated at once, the first page will be marked as type `aType`, while all later pages are marked as `Extension`. Pages can be freed (set to type `Empty`) using `void RAT.Free(uint aPageIdx)` which also frees any extension pages which follow the first page. To convert between a pointer and the page index, the method `uint RAT.GetFirstRATIndex(void* aPtr)` can be used. + +The Heap itself is managed by the `Heap` class. It contains the mechanism to allocate (`byte* Heap.Alloc(uint aSize)`), re-allocate ('byte* Heap.Realloc(byte* aPtr, uint newSize)') and free (`void Heap.Free(void* aPtr)`) objects of various sizes. Objects are seperated by size in bytes into Small (Smaller than 1/4 Page), Medium (Smaller than 1 Page) and Large (Larger than 1 Page). Currently Medium and Large objects are managed the same way using the methods in `HeapLarge` which do little more than allocating/freeing the necessary number of pages. Small objects are managed differently in `HeapSmall`. + +Small Objects are managed using the SMT (Size Map Table), which is initalised using `void HeapSmall.InitSMT(uint aMaxItemSize)`. +The basic idea of the SMT is to allocate objects of similar sizes on the same page. The SMT grows dynamically as required. +The SMT is made up of a series of pages, each of which contains a series of `RootSMTBlock` each of which link to a chain of `SMTBlock`. +The `RootSMTBlock` can be thought of as column headers and the `SMTBlock` as the elements stored in the column. +The `RootSMTBlock` are a linked list, each containing the maximum object size stored in its pages, the location of the first `SMTBlock` for this size, and the location of the next `RootSMTBlock`. +The list is in ascending order of size, so that the smallest large enough `RootSMTBlock` is found first. +A `SMTBlock` contains a pointer to the actual page where objects are stored, how much space is left on that page, and a pointer to the next `SMTBlock`. +If every `SMTBlock` for a certain size is full, a new `SMTBlock` is allocated. +The page linked to by the `SMTBlock` is split into an array of spaces, each large enough to allocate an object of maximum size with header, which can be iterated through via index and fixed size when allocating. +Each object allocated on the `HeapSmall` has a header of 2 `ushort`, the first one storing the actual size of the object and the second, the GC status of the object. + +## Garbage Collection + +### Interface + +The garbage collector has to be manually triggerd using the call `int Heap.Collect()` which returns the number of objects freed. + +Note that the GC does not track objects only pointed to by pointers. To ensure that the GC nevertheless does not incorrectly free objects, you can use `void GCImplementation.IncRootCount(ushort* aPtr)` to manually increase the references of your object by 1. Once you no longer need the object you can use `void GCImplementation.DecRootCount(ushort* aPtr)` to remove the manual reference, which allows the next `Heap.Collect` call to free the object. + +`Heap.Collect` only cleans up the objects which are no longer used but will leave behind empty pages in the SMT. +These pages can be cleaned up using `HeapSmall.PruneSMT` which will return the number of pages it freed. +Note that if in future elements are reallocated, this will cause new pages in the SMT to be allocated again, so using this too often may not be useful. + +## Automatically Trigger Garbage Collection + +When `RAT.MinFreePages` is set to a positive value and the number of free pages (as tracked by `RAT.FreePageCount`) drops below this value, on page allocation `Heap.Collect` will automatically be called. Each time this happens the value in `RAT.GCTriggered` is incremented by one. + +### Internals + +The garbage collector uses the tracing approach, which means that during collection a graph of all reachable objects is created and all non-discovered objects are freed. The garbage collector will only check objects on pages which have a type where the `GCManaged` bit is set. The graph is created by starting from "root" objects which are either stored in static variables or part of the current stack. Each of these objects is "marked" and all objects referenced by this object are recursivly also "marked" and "swept". This is done using the methods `void Heap.MarkAndSweepObject(void* aPtr)` for objects and `void Heap.SweepTypedObject(uint* obj, uint type)` for structures. For this to work each allocated object holds a 1bit flag if the object was discovered during the marking phase and a 7bit value counter for the number of static references it has. The number of static references an object has is updated using `void GCImplementation.IncRootCount(ushort* aPtr)` and similar methods, which are called from the Stsfld opcode. + +*Last updated on 22 October 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/Network.md b/Docs/articles/Kernel/Network.md new file mode 100644 index 0000000000..16ab25aefe --- /dev/null +++ b/Docs/articles/Kernel/Network.md @@ -0,0 +1,204 @@ +# Network + +In this article, we will discuss Networking on Cosmos, how to use the Network Stack, and send and receive packets. For now, available protocols are **ARP**, **IPv4**, **TCP**, **UDP**, **ICMP**, **DHCP** and **DNS**. Note that Cosmos DevKit must be installed for this article. + +All protocols here don't necessarily support every feature described by their RFC and may have some bugs or architecture issues, if you find bugs or something abnormal please [submit an issue](https://github.com/CosmosOS/Cosmos/issues/new/choose) on our repository. + +Each protocol has a Client class which can be used to receive and send data. If a Receive() method is blocking, the method will timeout after 5 seconds or use the value optionally set by parameter. Please note that all finished connections should be closed using Close(). + +The Cosmos Network Stack does not uses classes and functions that are under .NET Core (except TCP). Everything described here will be under: +```csharp +using Cosmos.System.Network; +``` + +Before anything, a Network Configuration must be set (local machine IPv4 address, subnet mask and gateway). It can be manually set with IPConfig.Enable or dynamically set through a DHCP server. For DHCP, Cosmos will ask to the DHCP server (usually default gateway) for an address in your local network. +### Manually set IPv4 Config +```csharp +NetworkDevice nic = NetworkDevice.GetDeviceByName("eth0"); //get network device by name +IPConfig.Enable(nic, new Address(192, 168, 1, 69), new Address(255, 255, 255, 0), new Address(192, 168, 1, 254)); //enable IPv4 configuration +``` +### Dynamically set IPv4 Config through DHCP +```csharp +using(var xClient = new DHCPClient()) +{ + /** Send a DHCP Discover packet **/ + //This will automatically set the IP config after DHCP response + xClient.SendDiscoverPacket(); +} +``` + +### Get local IP address +```csharp +Console.WriteLine(NetworkConfiguration.CurrentAddress.ToString()); +``` +## UDP +Before playing with packets, we have to create a client and call Connect() to specify the remote machine address. After that the client will be able to send or listen for data. +```csharp +using(var xClient = new UdpClient(4242)) +{ + xClient.Connect(new Address(192, 168, 1, 70), 4242); + + /** Send data **/ + xClient.Send(Encoding.ASCII.GetBytes(message)); + + /** Receive data **/ + var endpoint = new EndPoint(Address.Zero, 0); + var data = xClient.Receive(ref endpoint); //set endpoint to remote machine IP:port + var data2 = xClient.NonBlockingReceive(ref endpoint); //retrieve receive buffer without waiting +} +``` + +## TCP +Unlike UDP, TCP is plugged with the dotnet framework. You won't have to use Cosmos.System.Network but System.Net.Sockets and System.Net. You can setup TCP network streams using TcpListener, TcpClient and NetworkStream, don't use the Stream class unless you know what you do. + +Server: +```csharp +using System.Text; +using System.Net.Sockets; +using System.Net; + +class TcpServer +{ + private TcpListener tcpListener; + private int port; + + public TcpServer(int port) + { + this.port = port; + var address = IPAddress.Any; + this.tcpListener = new TcpListener(address, port); + } + + public void Start() + { + this.tcpListener.Start(); + + while (true) + { + /** Wait for new connections **/ + TcpClient client = this.tcpListener.AcceptTcpClient(); + HandleClientComm(client); + client.Close(); + } + } + + private void HandleClientComm(TcpClient client) + { + NetworkStream stream = client.GetStream(); + + byte[] buffer = new byte[client.ReceiveBufferSize]; + int bytesRead; + + while (true) + { + bytesRead = 0; + + /** Receive data **/ + bytesRead = stream.Read(buffer, 0, buffer.Length); // Blocks until a client sends a message + + if (bytesRead == 0) // The client has disconnected from the server + { + break; + } + + string received = Encoding.ASCII.GetString(buffer, 0, bytesRead); + + /** Send data **/ + byte[] response = Encoding.ASCII.GetBytes("ok"); + stream.Write(response, 0, response.Length); + + // stream.Flush(); useless for now + } + stream.Close(); + } +} +``` + +Client : +```csharp +string serverIp = "192.168.1.63"; +int serverPort = 1312; + +using(TcpClient client = new TcpClient()) +{ + /**Connect to server **/ + client.Connect(serverIp, serverPort); + NetworkStream stream = client.GetStream(); + + /** Send data **/ + string messageToSend = "Hello from CosmosOS!"; + byte[] dataToSend = Encoding.ASCII.GetBytes(messageToSend); + stream.Write(dataToSend, 0, dataToSend.Length); + + /** Receive data **/ + byte[] receivedData = new byte[client.ReceiveBufferSize]; + int bytesRead = stream.Read(receivedData, 0, receivedData.Length); + string receivedMessage = Encoding.ASCII.GetString(receivedData, 0, bytesRead); + + /** Close data stream **/ + stream.Close(); +} +``` + +## FTP +Only server-side FTP is implemented within Cosmos. We recommend to use FileZilla as your FTP client. + +**Your FTP client must enable active mode**. Since in Active Mode the server has to open TCP connections, **your computer firewall must be disabled** to accept incoming connection. An FTP connection is made of two TCP sockets. One for control connection (as a textual protocol) and one for data transmission. Data transmission sockets can be opened by the client (if it is in Passive Mode) or by the server (if in Active Mode). The Passive Mode is not supported yet due to current Cosmos TCP and multithreading limitation. + +### Installation: + +Install CosmosFtpServer package into your Cosmos kernel. For more information see [CosmosFTP readme](https://github.com/CosmosOS/CosmosFtp). + +### FTP client configuration: + +Use Plain FTP with an anonymous connection: + +![FTP client configuration](https://user-images.githubusercontent.com/18724279/121685499-4c71f380-cac0-11eb-8d08-6db1c0096e68.png) + +### Usage: + +Please note that for now only one FTP connection can be accepted, the server will shut down itself after the client disconnection. + +```csharp +/** Initialize filesystem **/ +var fs = new CosmosVFS(); +VFSManager.RegisterVFS(fs); + +using(var xServer = new FtpServer(fs, "0:\\")) +{ + /** Listen for new FTP client connections **/ + FtpServer.Listen(); +} +``` + +## ICMP +For ICMP, we will only be able to send an ICMP echo to a distant machine and wait for its response. If another machine sends us an ICMP echo, Cosmos will automatically handle the request and reply. +```csharp +using(var xClient = new ICMPClient()) +{ + xClient.Connect(new Address(192, 168, 1, 254)); + + /** Send ICMP Echo **/ + xClient.SendEcho(); + + /** Receive ICMP Response **/ + int time = xClient.Receive(ref endpoint); //return elapsed time / timeout if no response +} + +``` +## DNS +DNS can be used to get an IP address from a Domain Name string. For now DNS can only ask for one domain name at the same time. +```csharp +using(var xClient = new DnsClient()) +{ + xClient.Connect(new Address(192, 168, 1, 254)); //DNS Server address. We recommend a Google or Cloudflare DNS, but you can use any you like! + + /** Send DNS ask for a single domain name **/ + xClient.SendAsk("github.com"); + + /** Receive DNS Response **/ + Address destination = xClient.Receive(); //can set a timeout value +} +``` + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Kernel/OnBoot.md b/Docs/articles/Kernel/OnBoot.md new file mode 100644 index 0000000000..45673f5b3f --- /dev/null +++ b/Docs/articles/Kernel/OnBoot.md @@ -0,0 +1,18 @@ +# OnBoot +If you need to disable drivers because you are developing your own, or in some cases just don't need them, you may do so by adding the OnBoot method to your kernel. For now, you can disable 3 drivers and disable a part of a driver, an example would be: + +```csharp +protected override void OnBoot() +{ + Sys.Global.Init(GetTextScreen(),true,true,true,false); +} +``` + +In that example, we specify that the Mousewheel is enabled, the PS2controller is loaded, network drivers are being loaded and the IDE controller is disabled. +this is helpful if you intend on developing your own IDE controller, the order of the booleans is as stated above: +`Mousewheel` +`PS2Controller` +`Network Drivers` +`IDE Controller` + +*Last updated on 24 March 2024.* \ No newline at end of file diff --git a/Docs/articles/Kernel/Plugs.md b/Docs/articles/Kernel/Plugs.md new file mode 100644 index 0000000000..8c6ad1e5b0 --- /dev/null +++ b/Docs/articles/Kernel/Plugs.md @@ -0,0 +1,53 @@ +# Plugs + +Plugs are used to fill "holes" in .NET libraries and replace them with different + code. Holes exist for example when a method in .NET library uses a Windows API + call. That API call will not be available on Cosmos. Emulating the Win32 API would be highly inefficient. Instead, + Cosmos replaces specific methods and property implementations that rely on + Win32 API calls. Plugs can also be used to provide an alternate implementation + for a method, even if it does not rely on the Windows API. + + > **Important: All plugs must go in a seperate project, which is included in your original project using the `PlugsReference` attribute in your Kernel's csproj.** + +## Types of plugs + +There are two types of plugs used and supported by Cosmos: + +* Code Plug - A standard C# (or any .NET language) method is used to provide the alternate implementation. +* X#/Assembly Languge - In a few cases, it is difficult or impossible to write the code using C#/.Net since one needs exact control over the emitted assembly code. An assembly plug are designed for that case. Cosmos itself only uses this type of plug within the Cosmos.Core projects. + +## How do plugs work? + +To explain how plugs work, we first need to give an overview of how IL2CPU works. Roughly, IL2CPU compiles a kernel using the following steps: +1. IL2CPU determines a list of all methods and types which are used by the kernel. +2. It then compiles each of these methods into assembly code. +This is usually done by getting the list of IL instructions which make up the method and translating each of them into some corresponding assembly. +3. Together with a bit of boilerplate code, the emitted assembly for all the methods is compiled using yasm. + +Plugs effect what occurs in Step 2; A normal code plug means that rather from taking the IL instructions from the original method, the IL instructions from the plug are used and then converted into assembly. An assembly plug directly states what asm should be emitted. + +# Implementing a Plug + +While one always plugs individual methods, plugs are defined class-wise. Therefore, the first step to plugging any method is to define a new static class to contain all the pluggged methods for some certain type. This class must be decorated with the `Plug` attribute. The plug attribute either takes the type it is plugging (`Plug(Type target)`), or a string with the target name(`Plug(string targetName)`). Using the string target name is required when plugging internal or private classes. An example for a plugged class is for the [Math class](https://github.com/CosmosOS/Cosmos/blob/8a8393353f1957890c5154650e29847fd22bf893/source/Cosmos.System2_Plugs/System/MathImpl.cs#L8-L9). + +## Code Plug + +Once you have created such a class, you can add methods to the class. If these methods share the signature with a method in the original class they will be used to plug the original methods. For example in the above mentioned Math plug class, the following method plugs the original `double Math.Abs(double)` implementation. [See here](https://github.com/CosmosOS/Cosmos/blob/8a8393353f1957890c5154650e29847fd22bf893/source/Cosmos.System2_Plugs/System/MathImpl.cs#L52-L63). + +Note, when plugging a non-static method, the first argument will be correspond to "this" (the instance for which the method is being called). + +Sometimes it is impossible to define a method with exactly the same signature due to some of the arguments being from private or internal classes. In that case you can use the `PlugMethod` attribute. An example, is the following plug for `GC.AllocateNewArray` since `ALLOC_FLAGS` is a private enum. [See here](https://github.com/CosmosOS/Cosmos/blob/8a8393353f1957890c5154650e29847fd22bf893/source/Cosmos.Core_Plugs/System/GCImpl.cs#L17-L29). + +## Assembly Plug + +Defining an assembly plug is slightly more complicated. The first step is the same, and one needs to define a method with the same signature as the method one needs to plug. This acts as a plug placeholder. The actual plug implemenation is a new class inheriting from `AssemblerMethod`. This class needs to override the `void AssembleNew(Assembler aAssembler, object aMethodInfo)` method. The `AssembleNew` method will be called when IL2CPU is executing and should emit the required asm. Examples of such classes can be found [here](https://github.com/CosmosOS/Cosmos/blob/master/source/Cosmos.Core_Plugs/MathImpl.cs) including the plug implementation for `double Math.Round(double)` [here](https://github.com/CosmosOS/Cosmos/blob/8a8393353f1957890c5154650e29847fd22bf893/source/Cosmos.Core_Plugs/MathImpl.cs#L40-L49 +). + +The final step is to link the plug implementation to the plug placeholder by adding a `PlugMethod(Type Assembler)` to the plug placeholder, where the `Assembler` value is the class you created with the implementation. An example is the plug placeholder for the above mentioned `double Math.Round(double)`, [here](https://github.com/CosmosOS/Cosmos/blob/8a8393353f1957890c5154650e29847fd22bf893/source/Cosmos.Core_Plugs/MathImpl.cs#L15-L19). + +## Using plugs to write Assembly in your Kernel + +While plugs are usually used to overwrite existing methods in the .NET runtime, they can also be used to include assembly methods in your kernel. +This is for example, done to implement the `void CPU.UpdateIDT(bool)` method in Cosmos. To do this for your own classes and methods is not more difficult than plugging any other method. Simply set target of the plug class to your own class and write the assembly plug as usual. As a reference you can look at [Cosmos.Core/CPU.cs](https://github.com/CosmosOS/Cosmos/blob/master/source/Cosmos.Core/CPU.cs), [Cosmos.Core_Asm/CPUImpl.cs](https://github.com/CosmosOS/Cosmos/blob/master/source/Cosmos.Core_Asm/CPUImpl.cs) and [CPUUpdateIDTAsm.cs]( https://github.com/CosmosOS/Cosmos/blob/master/source/Cosmos.Core_Asm/CPU/CPUUpdateIDTAsm.cs). + +*Last updated on 28 April 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/Startup.md b/Docs/articles/Kernel/Startup.md new file mode 100644 index 0000000000..5308b2f176 --- /dev/null +++ b/Docs/articles/Kernel/Startup.md @@ -0,0 +1,21 @@ +# Startup + +On startup, the first thing that happens is that the BIOS of your computer loads Limine, the bootloader that Cosmos uses. From there, there is some hand-coded assembly that runs before the "Cosmos layer" kicks in. From there, the IL2CPU-ed C# entry point `Cosmos.System.Kernel.Start()` or `Sys.Kernel.Start()` is called. + +> By the way, `Cosmos.System.Kernel` is an abstract class that forms the Cosmos framework. It provides a base that your OS is built on top of. + +## Sys.Kernel.Start() + +### What does it do? +`Kernel.Start()` does quite a bit of stuff. First, it checks if `System.String.Empty` is null. If it is null, then it will just throw an exception. If it isn't, it just continues. After that check, `Kernel.Start()` initializes the hardware bootstrap, then calls `OnBoot()`. +> The next article explains what `OnBoot()` is. + +Then, `Kernel.Start()` calls your `BeforeRun()` method, after it finishes, `Kernel.Start()` enables the hardware interrupts. Then it simply does a `while (!mStopped)` loop with your `Run()` method. After that, it calls an optional method called `AfterRun()`. By default, `AfterRun()` is just empty, so don't worry about nulls or something like that. Then it finishes. All of that is also try/catched too with the `A kernel exception has occurred` message. + +### Overriding it +You can override the `Kernel.Start()` method in your Kernel to suppress the standard Cosmos boot routines and get deeper control of Cosmos. +> You override it the same way you do with other methods. An extremely simple base override in your Kernel would be: `protected override void Start() {}` + +The default `Kernel.Start()` method is located in `Cosmos\source\Cosmos.System2\Kernel.cs`. You can copy it and make modifications with your Kernel override. + +*Last updated on 20 May 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/VFS.md b/Docs/articles/Kernel/VFS.md new file mode 100644 index 0000000000..ef1e3c0149 --- /dev/null +++ b/Docs/articles/Kernel/VFS.md @@ -0,0 +1,248 @@ +# File System + +In this article, we will discuss about using Cosmos VFS (virtual file system). +Cosmos VFS and the VFSManager classes, let you manage your file system. + +**Attention**: **Always** format your drive with Cosmos and **only** Cosmos if you plan to use it with Cosmos. Using any other tool such as Parted, FDisk, or any other tool might lead to weird things when using that drive with Cosmos' VFS. Those tools are much more advanced and might format and read/write to the disk differently than Cosmos. + +**WARNING!**: Please do **not** try this on actual hardware! It may cause **IRREPARBLE DAMAGE** to your data. It is recommended to use a virtual machine like VMware or VirtualBox, just to name a few. + +First, we should create and initialize an instance of the VFS, this will initialize the partition and files-system lists, as well as register the new VFS. +This is essential for using the VFS. + +We start with creating a global CosmosVFS, this line should appear outside of any function, and before the BeforeRun() function. + +```C# +Sys.FileSystem.CosmosVFS fs = new Cosmos.System.FileSystem.CosmosVFS(); +``` + +Next, we register our VFS at the VFS manager, this will initiate the VFS and make it usable, add this to your kernel's BeforeRun() function: + +```C# +Sys.FileSystem.VFS.VFSManager.RegisterVFS(fs); +``` + +**Note**: From now on, we'll be using some plugged functions from ``System.IO``, so be sure to use that reference to your code. Now, let's get started over some useful functions: + +## Format disks + +**Note**: You don't have to format your drive if you're debugging your Cosmos project with VMWare. The build will automatically add an already formatted FAT32 VMDK file for your convenience. + +You can get all available disks using `VFSManager.GetDisks()`. The methods to get information about the disk or format it can be found under the [Disk](https://cosmosos.github.io/api/Cosmos.System.FileSystem.Disk.html) class. +To format a disk use the [`FormatDisk(int index, string format, bool quick = true)`](https://cosmosos.github.io/api/Cosmos.System.FileSystem.Disk.html#Cosmos_System_FileSystem_Disk_FormatPartition_System_Int32_System_String_System_Boolean_) +method. + + +## Get available free space + +We use this function to get the size of the available free space in our file system, in bytes. + +```C# +var available_space = fs.GetAvailableFreeSpace(@"0:\"); +Console.WriteLine("Available Free Space: " + available_space); +``` + +![Free Space](https://raw.githubusercontent.com/CosmosOS/Cosmos/master/Docs/articles/Kernel/images/File%20System%20Free%20Space.PNG) + +You have probably noticed the "0:\" argument passed to this function, this is the ID of the drive that we want to get available free space of. +Cosmos uses the DOS drive naming system, this is why we use "0". + +**Attention**: Typing "0:/" instead of "0:\\" might lead to errors, you've been warned. + +## Get file system type + +This will let us know what is the file system type that we are using. +You **should** be seeing "FAT32", if you see other types of FAT like "FAT16" or "FAT12", then the virtual disk has probably been formatted with one of those FAT types, but remember, the best supported one is FAT32. + +![System Type](https://raw.githubusercontent.com/CosmosOS/Cosmos/master/Docs/articles/Kernel/images/File%20System%20Type.PNG) + +```C# +var fs_type = fs.GetFileSystemType(@"0:\"); +Console.WriteLine("File System Type: " + fs_type); +``` + +## Get list of file + +We start by getting a list of files, using: + +```C# +var files_list = Directory.GetFiles(@"0:\"); +``` + +Once we have it, we can get the names of our files: + +```C# +foreach (var file in files_list) +{ + Console.WriteLine(file); +} +``` + +![Files List](https://raw.githubusercontent.com/CosmosOS/Cosmos/master/Docs/articles/Kernel/images/File%20System%20Files%20List.PNG) + +## Get directory listing (files and other directories) + +You can get files and directory listing by using this code: + +```C# +var files_list = Directory.GetFiles(@"0:\"); +var directory_list = Directory.GetDirectories(@"0:\"); + +foreach (var file in files_list); +{ + Console.WriteLine(file) +} +foreach (var directory in directory_list) +{ + Console.WriteLine(directory); +} +``` + + +## Read all the files in a directory + +This one is more tricky, +We need to get a list of files and print all of their content to the screen. + +Of course, we'll start with geting that files list: + +```C# +var directory_list = Directory.GetFiles(@"0:\"); +``` + +Now we can go through our list, and print the raw content of each file. + +```C# +try +{ + foreach (var file in directory_list) + { + var content = File.ReadAllText(file); + + Console.WriteLine("File name: " + file); + Console.WriteLine("File size: " + content.Length); + Console.WriteLine("Content: " + content); + } +} +catch(Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +## Create new file +Reading and writing is working on existing files, but it's much more useful to write to our own files. +Let's jump right into it: + +```C# +try +{ + var file_stream = File.Create(@"0:\testing.txt"); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +## Create a new directory +Here is a example of code of creating a new directory: + +```C# +try +{ + Directory.Create(@"0:\testdirectory\"); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +## Deleting a file or a directory + +You can also delete files or directories using this code: + +```C# +try +{ + File.Delete(@"0:\testing.txt"); + Directory.Delete(@"0:\testdirectory\"); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +## Write to file + +Now we will write to an existing file. +Writing to a file is almost the same as reading from a file. +Always remember that we should put our code in a try catch block. + +```C# +try +{ + File.WriteAllText(@"0:\testing.txt", "Learning how to use VFS!"); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +## Move a file + +File.Move() is not currently plugged in Cosmos, so you need to copy the file and then delete the old file. +Here is an example Method: +```C# +public static void MoveFile(string file, string newpath) +{ + try + { + File.Copy(file, newpath); + File.Delete(file); + } + catch(Exception e) + { + Console.WriteLine(ex); + } +} +``` + + +## Read all text from a specific file + +Now, we will read a specific file from a given path. +As usual, we'll do it in a try catch block. + +```C# +try +{ + Console.WriteLine(File.ReadAllText(@"0:\testing.txt")); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +![Read Specific File](https://raw.githubusercontent.com/CosmosOS/Cosmos/master/Docs/articles/Kernel/images/File%20System%20Read%20Specified%20File.PNG) + +# Read All bytes from a specific file + +As like the ReadAllText Method, ReadAllBytes should return all bytes the bytes from a file. You can use this to load files that include data and not just text. + +```C# +try +{ + Console.WriteLine(File.ReadAllBytes(@"0:\testing.txt")); +} +catch (Exception e) +{ + Console.WriteLine(e.ToString()); +} +``` + +*Last updated on 2 November 2023.* \ No newline at end of file diff --git a/Docs/articles/Kernel/images/File System Files List.PNG b/Docs/articles/Kernel/images/File System Files List.PNG new file mode 100644 index 0000000000..0e594aea42 Binary files /dev/null and b/Docs/articles/Kernel/images/File System Files List.PNG differ diff --git a/Docs/articles/Kernel/images/File System Free Space.PNG b/Docs/articles/Kernel/images/File System Free Space.PNG new file mode 100644 index 0000000000..e827d90c92 Binary files /dev/null and b/Docs/articles/Kernel/images/File System Free Space.PNG differ diff --git a/Docs/articles/Kernel/images/File System Read Specified File.PNG b/Docs/articles/Kernel/images/File System Read Specified File.PNG new file mode 100644 index 0000000000..6b2d415069 Binary files /dev/null and b/Docs/articles/Kernel/images/File System Read Specified File.PNG differ diff --git a/Docs/articles/Kernel/images/File System Type.PNG b/Docs/articles/Kernel/images/File System Type.PNG new file mode 100644 index 0000000000..8d4ebba6d0 Binary files /dev/null and b/Docs/articles/Kernel/images/File System Type.PNG differ diff --git a/Docs/articles/Reference/x86.md b/Docs/articles/Reference/x86.md new file mode 100644 index 0000000000..ae46388245 --- /dev/null +++ b/Docs/articles/Reference/x86.md @@ -0,0 +1,5 @@ +# x86 Reference + +The reference can be found [here](http://ref.x86asm.net/). + +*Last updated on 20 June 2022.* \ No newline at end of file diff --git a/Docs/articles/Tests/TestRunner.md b/Docs/articles/Tests/TestRunner.md new file mode 100644 index 0000000000..1b01153d75 --- /dev/null +++ b/Docs/articles/Tests/TestRunner.md @@ -0,0 +1,31 @@ +# TestRunner + +## Description +TestRunner is used to run Kernel Tests using the tests at a specified location and can run each kernel in multiple targets to ensure full compatibility and stability accross these targets. + +TestRunner generates a result file upon completion to detail the results of the tests. + +## Get Started +To use the TestRunnner open the `Test.sln`, set the Target Project to `Cosmos.TestRunner` and run the solution. + +## Configuration +Edit the configuration for TestRunner via [DefaultEngineConfiguration.cs](https://github.com/CosmosOS/Cosmos/blob/9d0ccc2be22938424d8992611b11409aaabf74ea/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs#L9). in ..\Tests\TestRunner\TestRunner.Core +This allows one to choose which emulator to use and at what level the kernel is debugged. + +To select which Test Kernels to run, edit `GetStableKernelTypes()` in `TestKernelSets.cs`. + +### Adding a Kernel +To add a kernel to the TestRunner, open the TestKernelSets file and add a line to GetStableKernelTypes() like this line: + +`yield return typeof(Cosmos.Kernel.Tests.Fat.Kernel);` + +Note: This can be used to test your own kernel for debug purposes. Add your kernel to the Test solution, add a project reference to your kernel to Cosmos.TestRunner.Full and add the kernel to the TestKernelSets list. +You will also need to modify the .csproj file by removing the platform line. You also need to replace the nuget references with references to the actual projects (System2, Core etc) and import the `/Tests/Kernels/Directory.Build.targets` file. If you are still faced with the .refs file not generating, comment out the Cosmos related parts of the csproj. + +### Time Out +To set the period before the TestRunner registers an error, change the line: `engine.AllowedSecondsInKernel = 1800;` This means that, in this case, if the Kernel runs for more that 30 minutes then it will register a failure. + +## Project Location +The TestRunner Projects are located in ..\Tests\TestRunner + +*Last updated on 9 December 2022.* \ No newline at end of file diff --git a/Docs/articles/images/SNAG-0000.png b/Docs/articles/images/SNAG-0000.png new file mode 100644 index 0000000000..8154c78f96 Binary files /dev/null and b/Docs/articles/images/SNAG-0000.png differ diff --git a/Docs/articles/images/SNAG-0001.png b/Docs/articles/images/SNAG-0001.png new file mode 100644 index 0000000000..f41c7dba47 Binary files /dev/null and b/Docs/articles/images/SNAG-0001.png differ diff --git a/Docs/articles/images/SNAG-0002.png b/Docs/articles/images/SNAG-0002.png new file mode 100644 index 0000000000..82d23c00db Binary files /dev/null and b/Docs/articles/images/SNAG-0002.png differ diff --git a/Docs/articles/images/SNAG-0003.png b/Docs/articles/images/SNAG-0003.png new file mode 100644 index 0000000000..6e0a39289d Binary files /dev/null and b/Docs/articles/images/SNAG-0003.png differ diff --git a/Docs/articles/images/SNAG-0004.png b/Docs/articles/images/SNAG-0004.png new file mode 100644 index 0000000000..ee74691600 Binary files /dev/null and b/Docs/articles/images/SNAG-0004.png differ diff --git a/Docs/articles/images/SNAG-0005.png b/Docs/articles/images/SNAG-0005.png new file mode 100644 index 0000000000..69be453d6b Binary files /dev/null and b/Docs/articles/images/SNAG-0005.png differ diff --git a/Docs/articles/images/SNAG-0007.png b/Docs/articles/images/SNAG-0007.png new file mode 100644 index 0000000000..efb1279679 Binary files /dev/null and b/Docs/articles/images/SNAG-0007.png differ diff --git a/Docs/articles/images/SNAG-0008.png b/Docs/articles/images/SNAG-0008.png new file mode 100644 index 0000000000..e6e8a8d81f Binary files /dev/null and b/Docs/articles/images/SNAG-0008.png differ diff --git a/Docs/articles/toc.md b/Docs/articles/toc.md new file mode 100644 index 0000000000..30cc3ead58 --- /dev/null +++ b/Docs/articles/toc.md @@ -0,0 +1,31 @@ +# [Getting Started](GettingStarted.md) + +# [Compiler](Compiler/il2cpu.md) + +# [Change Log](Changelog.md) + +# Debugger +## [Debug Commands](Debugger/DebugCommands.md) + +# Installation +## [User Kit](Installation/UserKit.md) +## [Dev Kit](Installation/DevKit.md) +## [Running](Installation/Running.md) + +# Kernel +## [Levels](Kernel/Levels.md) +## [Plugs](Kernel/Plugs.md) +## [Startup](Kernel/Startup.md) +## [OnBoot](Kernel/OnBoot.md) +## [Graphics](Kernel/CGS.md) +## [Virtual File System](Kernel/VFS.md) +## [Network](Kernel/Network.md) +## [Resource Files](Kernel/ManifestResouceStream.md) +## [Memory Management and Garbage Collection](Kernel/MemoryManagement.md) +## [Audio](Kernel/Audio.md) + +# Reference +## [x86](Reference/x86.md) + +# Tests +## [Test Runner](Tests/TestRunner.md) diff --git a/Docs/docfx.json b/Docs/docfx.json new file mode 100644 index 0000000000..e0b21cc9e3 --- /dev/null +++ b/Docs/docfx.json @@ -0,0 +1,142 @@ +{ + "metadata": [ + { + "src": [ + { + "files": [ + "IL2CPU/source/IL2CPU/IL2CPU.csproj", + "IL2CPU/source/IL2CPU.API/IL2CPU.API.csproj", + "IL2CPU/source/Cosmos.IL2CPU/Cosmos.IL2CPU.csproj" + ], + "exclude": [ + "**/bin/**", + "**/obj/**" + ], + "src": "../../" + } + ], + "dest": "api/il2cpu" + }, + { + "src": [ + { + "files": [ + "XSharp/source/XSharp/XSharp/XSharp.csproj" + ], + "exclude": [ + "**/bin/**", + "**/obj/**" + ], + "src": "../../" + } + ], + "dest": "api/xsharp" + }, + { + "src": [ + { + "files": [ + "source/Cosmos.Core/Cosmos.Core.csproj", + "source/Cosmos.Core_Asm/Cosmos.Core_Asm.csproj", + "source/Cosmos.HAL2/Cosmos.HAL2.csproj", + "source/Cosmos.System2/Cosmos.System2.csproj", + "source/Cosmos.Debug.Kernel/Cosmos.Debug.Kernel.csproj", + ], + "exclude": [ + "**/bin/**", + "**/obj/**" + ], + "src": "../" + } + ], + "dest": "api/cosmos" + }, + { + "src": [ + { + "files": [ + "source/Cosmos.Core_Plugs/Cosmos.Core_Plugs.csproj", + "source/Cosmos.HAL2/Cosmos.HAL2.csproj", + "source/Cosmos.System2_Plugs/Cosmos.System2_Plugs.csproj" + ], + "exclude": [ + "**/bin/**", + "**/obj/**" + ], + "src": "../" + } + ], + "dest": "api/plugs" + } + ], + "build": { + "content": [ + { + "files": [ + "**/*.yml" + ], + "src": "api", + "dest": "api" + }, + { + "files": [ + "**/*.yml" + ], + "src": "api/cosmos", + "dest": "api/cosmos" + }, + { + "files": [ + "**/*.yml" + ], + "src": "api/plugs", + "dest": "api/plugs" + }, + { + "files": [ + "**/*.md", + "*.md", + "toc.yml" + ] + } + ], + "resource": [ + { + "files": [ + "favicon.ico", + "images/**", + "articles/images/**" + ] + } + ], + "overwrite": [ + { + "files": [ + "apidoc/**.md" + ], + "exclude": [ + "obj/**", + "_site/**" + ] + } + ], + "dest": "_site", + "globalMetadata": { + "_appFooter": "", + "_appLogoPath": "images/logo.png", + "_enableNewTab": true + }, + "globalMetadataFiles": [], + "fileMetadataFiles": [], + "template": [ + "statictoc", + "templates/darkfx" + ], + "postProcessors": [], + "markdownEngineName": "markdig", + "noLangKeyword": false, + "keepFileLink": false, + "cleanupCacheHistory": false, + "disableGitFeatures": false + } +} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/Kernel.ico b/Docs/favicon.ico similarity index 100% rename from source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/Kernel.ico rename to Docs/favicon.ico diff --git a/Docs/images/Dir.png b/Docs/images/Dir.png new file mode 100644 index 0000000000..80cd9d089c Binary files /dev/null and b/Docs/images/Dir.png differ diff --git a/Docs/images/logo.png b/Docs/images/logo.png new file mode 100644 index 0000000000..70445c7ff5 Binary files /dev/null and b/Docs/images/logo.png differ diff --git a/Docs/index.md b/Docs/index.md index 9e7352f921..553f56b571 100644 --- a/Docs/index.md +++ b/Docs/index.md @@ -1,147 +1,20 @@ - - -### Introducing Cosmos - -Cosmos (C# Open Source Managed Operating System) is an operating system -development kit which uses Visual Studio as its development environment. -Despite C# in the name any .NET based language can be used including VB.NET, -Fortran, Delphi Prism, IronPython, F# and more. Cosmos itself and the kernel -routines are primarily written in C#, and thus the Cosmos name. Besides that, -NOSMOS (.NET Open Source Managed Operating System) sounds stupid. - -Cosmos is not an operating system in the traditional sense, but instead it is -an "Operating System Kit", or as I like to say "Operating System Legos". -Cosmos lets you create operating systems just as Visual Studio and C# normally -let you create applications. Most users can write and boot their own operating -system in just a few minutes, all using Visual Studio. Since milestone 5, -Cosmos includes an integrated project type in Visual Studio, and an -integrated debugger. You can debug your operating system directly from Visual -Studio using breakpoints. - -Cosmos is available in two distributions, the developer kit (dev kit), and the -user kit. The dev kit is designed for users who want to work on Cosmos itself. -The user kit is designed for those who are interested in building their own -operating system and doing some Cosmos work. The dev kit might be thought of -as the Cosmos SDK. Most users should start off with the user kit as it is not -so overwhelming like the dev kit. This article focuses on the user kit. - -### Writing your first Operating System - -Create a new project as you would any C# project, but select Cosmos as the -project type. - -![](http://i.imgur.com/mb5ZOEk.png) - -A starter project will be created. It looks very much like a standard C# -console application. - -![](http://i.imgur.com/zUJoj5Y.png) - -Program.cs contains the boot and execution code. Instead of seeing a Windows -console window, you will see the following: - -![](http://i.imgur.com/D3F9c4t.png) - -This is your operating system running in VMWare Player! Cosmos can of course -also be booted in VMWare Workstation, Hyper-V, Virtual PC, or on real -hardware. But by default Cosmos uses VMWare Player because it is both free, -and reliable. Cosmos can even debug in Visual Studio, even when running on -another machine. - -### Integrated Debugging - -Debugging is a major issue with operating system development. The Cosmos team -was not content enough to simply conquer building and deployment, we want to -make developing operating system as easy as developing Windows applications. -Debugging a Cosmos based operating system should feel very familiar to you. -Lets modify our project a little bit to show the effect, and set a breakpoint. - -![](http://i.imgur.com/Hf4LZ3c.png) - -Now run the project again. - -![](http://i.imgur.com/YLPmEUf.png) - -Note that the execution stopped at "Two"? That is becuase in Visual Studio our -project has stopped on a breakpoint. Simply press F5 to continue just as you -would in a normal application! - -In addition to breakpoints Cosmos also supports step into (F11) as well. Trace -over (F10) is not supported yet. - -### Debugger Communication - -The debugger uses the serial port to communicate. Because of this, debugging -only works wtih virtualization environments that support serial ports such as -VMWare. QEMU supports serial ports as well, but its serial port implementation -is seriously broken on Windows and makes debugging impossible using QEMU. To -debug on real hardware, you must use a physical serial cable. In the future -Cosmos will also support debugging over Ethernet. - -### Extra Debugging - -Cosmos supports some explicit methods that can be used to communicate with the -debugger and use additional functionality. It is accessed using the Debugger -class in the Cosmos.Debug namespace in the Cosmos.Kernel assembly. This -assembly is used by all Cosmos projects. - -### Code Based Breakpoints +# Welcome to the Official Cosmos Documentation + +If you're new to Cosmos, welcome! Before you get surf through the API documentation, we highly recommend you visit the website linked below. + +While majority of the content in this documentation is up-to-date, this website also includes some articles which have been written over years ago for websites such as www.codeproject.com. They are mostly kept for archival purposes. We prefer newcomers who want to develop their own operating systems to read the API documentation while we update these articles to comply with the current Cosmos project. +We **strongly** encourage newcomers to Cosmos to have a basic to intermediate proficiency in the [C# language](https://dotnet.microsoft.com/en-us/languages/csharp). Having this level of proficiency will significantly enable independent debugging and problem-solving, reducing the need for continuous assistance. There are many tutorials online for understanding classes, methods, and functions. - Global.Dbg.Break(); - -Break can be used to issue a code based break. Visual Studio will break on the -line after this statement. - -![](http://i.imgur.com/Dupjm8y.png) - -Since Cosmos does not support conditional breakpoints in the IDE yet, code -base breaks are very useful for implementing such. For example: - -```csharp -if (x == 5) { - Global.Dbg.Break(); -} -``` - -Alternatively you can call the .NET class libary break: - - - System.Diagnostics.Debugger.Break(); - -Both functions will produce the same result. - -### Debug Output - -Debug strings can be output to the debug window of the host. Because Cosmos -does not support watches yet, this functionality can be very useful for -watching variable values and for performing tracing without breakpoints. - -```csharp -Global.Dbg.Send("Hello from Cosmos!"); -``` - -When this line is executed, it will send a message over the debugging channel -and it will appear in the Visual Studio output window. - -![](http://i.imgur.com/DHqwjiF.png) - -### What's the catch? - -There really is no catch. Everything I've shown here is functioning as seen. -No mockups were used. However we still have a lot of work to go. Items of -interest that are on our current task list include interfaces (necessary for -foreach), file systems (partial support exists), threads, networking, and -graphics. We have prototypes and experimentation for each, but none have been -rolled into the mainline Cosmos development as of yet. +For projects using the Cosmos Virtual File System *(abbr. VFS)* directly, we recommend you use System.IO methods where possible. This is because these were written before much progress was made making .NET assemblies usable. + +For a comprehensive set of information about Cosmos, including our ambitions and other links to chat with us or to seek assistance with something not covered in the documentation, please visit the official [Cosmos website](https://www.gocosmos.org/). -### What was that Syslinux thing I saw on boot? +If you need a translation for this documentation, click [here](https://cosmosos-github-io.translate.goog/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp). -Cosmos does not run on Linux. A boot loader called Syslinux is used to boot -Cosmos. After booting, Syslinux is not used. Syslinux is a bootloader and is -not a Linux distro. +You can find the latest and previous build statuses on AppVeyor, [here](https://ci.appveyor.com/project/CosmosOS/cosmos). -### Obtaining Cosmos +[![Build status](https://ci.appveyor.com/api/projects/status/kust7g5dlnykhkaf/branch/master?svg=true)](https://ci.appveyor.com/project/CosmosOS/cosmos/branch/master) +[![Join the chat at (https://discord.com/invite/kwtBwv6jhD](https://img.shields.io/discord/833970409337913344)](https://discord.com/invite/kwtBwv6jhD) - * [Source Code - Both dev kit and user kit](http://github.com/CosmosOS/Cosmos/) - * [Releases](https://github.com/CosmosOS/Cosmos/releases) +xref link [https://cosmosos.github.io/xrefmap.yml](https://cosmosos.github.io/xrefmap.yml) diff --git a/Docs/install.md b/Docs/install.md new file mode 100644 index 0000000000..6befc38f3e --- /dev/null +++ b/Docs/install.md @@ -0,0 +1,63 @@ + + +### Dev Kit + +##### **Additional Prerequisites** + +* **Visual Studio 2022 Workload: Visual Studio Extension Development** +* **Inno Setup (Free)** – Install with defaults - [Download](http://www.jrsoftware.org/isdl.php#qsp) +* **.NET 6 SDK** - [Download](https://dotnet.microsoft.com/en-us/download) + +##### Get the Source + +Cosmos source is hosted at GitHub. The simplest method to obtain the source is download a .zip file, however this makes updating and getting the latest updates a bit tricky. +To update the Cosmos source more efficiently, use the Git command line, or any of the many Git User Interfaces. Any frontend may work fine but for users new to Git, we suggest [GitHub Desktop](https://desktop.github.com/). For more experienced Git users, we really like [Git Kraken](https://www.gitkraken.com/). Git Kraken is free for non-commercial use such as Cosmos. SourceTree, Git GUI, and others are also available. + +To aid in better encapsulation and to invite more developers to assist in various areas, Cosmos is split into four Git repositories. Each of these is designed to be an independent project although Cosmos relies on the other three. +You will need to pull the source for all four repositories and they must exist in sibling directories as shown in the diagram below. The Cosmos base directory can be named anything and exist anywhere. But the directories inside it must match exactly.   + +Windows is not case sensitive for files, but many of the ._**NET Core tools used to build are case sensitive even on Windows for file paths**_. Make sure to create the subdirectories exactly as shown. For demonstration purposes let us assume that you will use c:\\source\\Cosmos to install to. +This base directory is referred to as the Cosmos directory. Each of the four repositories then must be cloned or extracted to the corresponding sub folder of the Cosmos directory. Using this example, the set up should look like this: + +``` +C:\\source\\CosmosOS\\ +C:\\source\\CosmosOS\\Cosmos\\ - [Git Repository for Cosmos](https://github.com/CosmosOS/Cosmos) +C:\\source\\CosmosOS\\IL2CPU\\ - [Git Repository for IL2CPU](https://github.com/CosmosOS/IL2CPU) +C:\\source\\CosmosOS\\XSharp\\ - [Git Repository for XSharp](https://github.com/CosmosOS/XSharp) +C:\\source\\CosmosOS\\Common\\ - [Git Repository for Common](https://github.com/CosmosOS/Common) +``` + +A tree diagram of the source should look like the following: + + + +We are working to make syncing code easier. We have already experimented with Git Submodules, however the simple use of submodules presents a few issues, but the biggest of them is that they trigger a fireworks show of problems and errors in every Git UI we tried and would have limited developers options and forced them to the command line in most cases. We are currently investigating subtrees. + +For now, it's much easier to handle the 4 repositories as most of the time, new Cosmos developers may only have to work in the Cosmos repository. Only when you are comfortable with the concept of Operating System development and C# should you venture into IL2CPU and XSharp. + +If you want to keep your source up to date in a one-click method, paste this code into a .bat file in the CosmosOS folder ( as shown in the above example). This .bat file will only work after the repositories have been cloned with git at least once. + +```cmd +cd C:\\XSharp +git pull +cd ..\\IL2CPU +git pull +cd ..\\Cosmos +git pull +cd ..\\Common +git pull +cd .. +``` + +##### Building and Installing + +(if you have already installed) If you edited the Cosmos DevKit source using _Cosmos.sln_ or _Test.sln_, be sure to set solution config to **Debug x86**. + +1. Make sure Visual Studio is **NOT running**. +2. In the root directory of the DevKit files, you downloaded earlier, run `install-VS2022.bat`. +3. Wait for the install to progress. (**Tip:** At the end the installer may look like it is stalling, it is still doing something, just in the background) +4. VS will open with Cosmos loaded. You can now make changes to core assemblies of Cosmos. If you don't want to, you can close this VS window and create a new Cosmos project as with the user kit. + +For more information about Dev Kit, see [here](articles/Installation/DevKit.html) + +Happy Cosmos-ing! diff --git a/Docs/templates/darkfx/partials/affix.tmpl.partial b/Docs/templates/darkfx/partials/affix.tmpl.partial new file mode 100644 index 0000000000..11caeb3d05 --- /dev/null +++ b/Docs/templates/darkfx/partials/affix.tmpl.partial @@ -0,0 +1,40 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + + diff --git a/Docs/templates/darkfx/partials/footer.tmpl.partial b/Docs/templates/darkfx/partials/footer.tmpl.partial new file mode 100644 index 0000000000..a9da7c3bb4 --- /dev/null +++ b/Docs/templates/darkfx/partials/footer.tmpl.partial @@ -0,0 +1,29 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
+
+ + +
\ No newline at end of file diff --git a/Docs/templates/darkfx/partials/head.tmpl.partial b/Docs/templates/darkfx/partials/head.tmpl.partial new file mode 100644 index 0000000000..83fc5f91a8 --- /dev/null +++ b/Docs/templates/darkfx/partials/head.tmpl.partial @@ -0,0 +1,20 @@ +{{!Copyright (c) Oscar Vasquez. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + + + + + {{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}} + + + + {{#_description}}{{/_description}} + + + + + + + {{#_noindex}}{{/_noindex}} + {{#_enableSearch}}{{/_enableSearch}} + {{#_enableNewTab}}{{/_enableNewTab}} + \ No newline at end of file diff --git a/Docs/templates/darkfx/styles/main.css b/Docs/templates/darkfx/styles/main.css new file mode 100644 index 0000000000..c332862695 --- /dev/null +++ b/Docs/templates/darkfx/styles/main.css @@ -0,0 +1,474 @@ +:root, body.dark-theme { + --color-foreground: #ccd5dc; + --color-navbar: #66666d; + --color-breadcrumb: #999; + --color-underline: #ddd; + --color-toc-hover: #fff; + --color-background: #2d2d30; + --color-background-subnav: #333337; + --color-background-dark: #1e1e1e; + --color-background-table-alt: #212123; + --color-background-quote: #69696e; +} + +body.light-theme { + --color-foreground: #171717; + --color-breadcrumb: #4a4a4a; + --color-toc-hover: #4c4c4c; + --color-background: #ffffff; + --color-background-subnav: #f5f5f5; + --color-background-dark: #ddd; + --color-background-table-alt: #f9f9f9; +} + +body { + color: var(--color-foreground); + line-height: 1.5; + font-size: 14px; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + word-wrap: break-word; + background-color: var(--color-background); +} + +.btn.focus, .btn:focus, .btn:hover { + color: var(--color-foreground); +} + +h1 { + font-weight: 600; + font-size: 32px; +} + +h2 { + font-weight: 600; + font-size: 24px; + line-height: 1.8; +} + +h3 { + font-weight: 600; + font-size: 20px; + line-height: 1.8; +} + +h5 { + font-size: 14px; + padding: 10px 0px; +} + +article h1, article h2, article h3, article h4 { + margin-top: 35px; + margin-bottom: 15px; +} + +article h4 { + padding-bottom: 8px; + border-bottom: 2px solid var(--color-underline); +} + +.navbar-brand>img { + color: var(--color-background); +} + +.navbar { + border: none; +} + +.navbar #logo { + width: 50px; +} + +.subnav { + border-top: 1px solid var(--color-underline); + background-color: var(--color-background-subnav); +} + +.sidenav, .fixed_header, .toc { + background-color: var(--color-background); +} + +.navbar-inverse { + background-color: var(--color-background-dark); + z-index: 100; +} + +.navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-text { + color: var(--color-navbar); + background-color: var(--color-background-dark); + border-bottom: 3px solid transparent; + padding-bottom: 12px; +} + +.navbar-inverse .navbar-nav>li>a:focus, .navbar-inverse .navbar-nav>li>a:hover { + color: var(--color-foreground); + background-color: var(--color-background-dark); + border-bottom: 3px solid var(--color-background-subnav); + transition: all ease 0.25s; +} + +.navbar-inverse .navbar-nav>.active>a, .navbar-inverse .navbar-nav>.active>a:focus, .navbar-inverse .navbar-nav>.active>a:hover { + color: var(--color-foreground); + background-color: var(--color-background-dark); + border-bottom: 3px solid var(--color-foreground); + transition: all ease 0.25s; +} + +.navbar-form .form-control { + border: none; + border-radius: 0; +} + +.light-theme .navbar-brand svg { + filter: brightness(20%); +} + +.toc .level1>li { + font-weight: 400; +} + +.toc .nav>li>a { + color: var(--color-foreground); +} + +.sidefilter { + background-color: var(--color-background); + border-left: none; + border-right: none; +} + +.sidefilter { + background-color: var(--color-background); + border-left: none; + border-right: none; +} + +.toc-filter { + padding: 10px; + margin: 0; + background-color: var(--color-background); +} + +.toc-filter>input { + border: none; + border-radius: unset; + background-color: var(--color-background-subnav); + padding: 5px 0 5px 20px; + font-size: 90% +} + +.toc-filter>.clear-icon { + position: absolute; + top: 17px; + right: 15px; +} + +.toc-filter>input:focus { + color: var(--color-foreground); + transition: all ease 0.25s; +} + +.toc-filter>.filter-icon { + display: none; +} + +.sidetoc>.toc { + background-color: var(--color-background); + overflow-x: hidden; +} + +.sidetoc { + background-color: var(--color-background); + border: none; +} + +.alert { + background-color: inherit; + border: none; + padding: 10px 0; + border-radius: 0; +} + +.alert>p { + margin-bottom: 0; + padding: 5px 10px; + border-bottom: 1px solid; + background-color: var(--color-background-dark); +} + +.alert>h5 { + padding: 10px 15px; + margin-top: 0; + margin-bottom: 0; + text-transform: uppercase; + font-weight: bold; + border-top: 2px solid; + background-color: var(--color-background-dark); + border-radius: none; +} + +.alert>ul { + margin-bottom: 0; + padding: 5px 40px; +} + +.alert-info { + color: #1976d2; +} + +.alert-warning { + color: #f57f17; +} + +.alert-danger { + color: #d32f2f; +} + +pre { + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + word-break: break-all; + word-wrap: break-word; + background-color: var(--color-background-dark); + border-radius: 0; + border: none; +} + +code { + background: var(--color-background-dark) !important; + border-radius: 2px; +} + +.hljs { + color: var(--color-foreground); +} + +.toc .nav>li.active>.expand-stub::before, .toc .nav>li.in>.expand-stub::before, .toc .nav>li.in.active>.expand-stub::before, .toc .nav>li.filtered>.expand-stub::before { + content: "▾"; +} + +.toc .nav>li>.expand-stub::before, .toc .nav>li.active>.expand-stub::before { + content: "▸"; +} + +.affix ul ul>li>a:before { + content: "|"; +} + +.breadcrumb { + background-color: var(--color-background-subnav); +} + +.breadcrumb .label.label-primary { + background: #444; + border-radius: 0; + font-weight: normal; + font-size: 100%; +} + +#breadcrumb .breadcrumb>li a { + border-radius: 0; + font-weight: normal; + font-size: 85%; + display: inline; + padding: 0 .6em 0; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + color: var(--color-breadcrumb); +} + +#breadcrumb .breadcrumb>li a:hover { + color: var(--color-foreground); + transition: all ease 0.25s; +} + +.breadcrumb>li+li:before { + content: "⯈"; + font-size: 75%; + color: var(--color-background-dark); + padding: 0; +} + +.light-theme .breadcrumb>li+li:before { + color: var(--color-foreground) + } + +.toc .level1>li { + font-weight: 600; + font-size: 130%; + padding-left: 5px; +} + +.footer { + border-top: none; + background-color: var(--color-background-dark); + padding: 15px 0; + font-size: 90%; +} + +.toc .nav>li>a:hover, .toc .nav>li>a:focus { + color: var(--color-toc-hover); + transition: all ease 0.1s; +} + +.form-control { + background-color: var(--color-background-subnav); + border: none; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +input#search-query:focus { + color: var(--color-foreground); +} + +.table-bordered, .table-bordered>tbody>tr>td, .table-bordered>tbody>tr>th, .table-bordered>tfoot>tr>td, .table-bordered>tfoot>tr>th, .table-bordered>thead>tr>td, .table-bordered>thead>tr>th { + border: 1px solid var(--color-background-dark); +} + +.table-striped>tbody>tr:nth-of-type(odd) { + background-color: var(--color-background-table-alt); +} + +blockquote { + padding: 10px 20px; + margin: 0 0 10px; + font-size: 110%; + border-left: 5px solid var(--color-background-quote); + color: var(--color-background-quote); +} + +.pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, .pagination>.disabled>span, .pagination>.disabled>span:focus, .pagination>.disabled>span:hover { + background-color: var(--color-background-subnav); + border-color: var(--color-background-subnav); +} + +.breadcrumb>li, .pagination { + display: inline; +} + +.tabGroup a[role="tab"] { + border-bottom: 2px solid var(--color-background-dark); +} + +.tabGroup a[role="tab"][aria-selected="true"] { + color: var(--color-foreground); +} + +.tabGroup section[role="tabpanel"] { + border: 1px solid var(--color-background-dark); +} + +.sideaffix > div.contribution > ul > li > a.contribution-link:hover { + background-color: var(--color-background); +} + +.switch { + position: relative; + display: inline-block; + width: 40px; + height: 20px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 14px; + width: 14px; + left: 4px; + bottom: 3px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked + .slider { + background-color: #337ab7; +} + +input:focus + .slider { + box-shadow: 0 0 1px #337ab7; +} + +input:checked + .slider:before { + -webkit-transform: translateX(19px); + -ms-transform: translateX(19px); + transform: translateX(19px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 20px; +} + +.slider.round:before { + border-radius: 50%; +} +.toggle-mode .icon { + display: inline-block; +} + +.toggle-mode .icon i { + font-style: normal; + font-size: 17px; + display: inline-block; + padding-right: 7px; + padding-left: 7px; + vertical-align: middle; +} + +@media (min-width: 1600px) { + .container { + width: 100%; + } + .sidefilter { + width: 18%; + } + .sidetoc { + width: 18%; + } + .article.grid-right { + margin-left: 19%; + } + .sideaffix { + width: 11.5%; + } + .affix ul>li.active>a { + white-space: initial; + } + .affix ul>li>a { + width: 99%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} diff --git a/Docs/templates/darkfx/styles/toggle-theme.js b/Docs/templates/darkfx/styles/toggle-theme.js new file mode 100644 index 0000000000..f2ea5f5fd7 --- /dev/null +++ b/Docs/templates/darkfx/styles/toggle-theme.js @@ -0,0 +1,35 @@ +const sw = document.getElementById("switch-style"), sw_mobile = document.getElementById("switch-style-m"), b = document.body; +if (b) { + function toggleTheme(target, dark) { + target.classList.toggle("dark-theme", dark) + target.classList.toggle("light-theme", !dark) + } + + function switchEventListener() { + toggleTheme(b, this.checked); + if (window.localStorage) { + this.checked ? localStorage.setItem("theme", "dark-theme") : localStorage.setItem("theme", "light-theme") + } + } + + var isDarkTheme = !window.localStorage || !window.localStorage.getItem("theme") || window.localStorage && localStorage.getItem("theme") === "dark-theme"; + + if(sw && sw_mobile){ + sw.checked = isDarkTheme; + sw_mobile.checked = isDarkTheme; + + sw.addEventListener("change", switchEventListener); + sw_mobile.addEventListener("change", switchEventListener); + + // sync state between switches + sw.addEventListener("change", function() { + sw_mobile.checked = this.checked; + }); + + sw_mobile.addEventListener("change", function() { + sw.checked = this.checked; + }); + } + + toggleTheme(b, isDarkTheme); +} \ No newline at end of file diff --git a/Docs/toc.yml b/Docs/toc.yml new file mode 100644 index 0000000000..9dcf7f0094 --- /dev/null +++ b/Docs/toc.yml @@ -0,0 +1,15 @@ +- name: Home + href: index.md +- name: Install + href: articles/Installation/UserKit.md +- name: Cosmos Website + href: https://gocosmos.org +- name: Articles + href: articles/ + homepage: articles/GettingStarted.md +- name: Cosmos + href: api/cosmos/ +- name: X# + href: api/xsharp/ +- name: IL2CPU + href: api/il2cpu/ \ No newline at end of file diff --git a/Examples.sln b/Examples.sln new file mode 100644 index 0000000000..ed42ee7eb4 --- /dev/null +++ b/Examples.sln @@ -0,0 +1,98 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33110.190 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZKernel", "Examples\ZMachine Emulator\ZKernel\ZKernel.csproj", "{54876871-D090-45CB-81A7-DE92788065F7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZLibrary", "Examples\ZMachine Emulator\ZLibrary\ZLibrary.csproj", "{9D75A72C-9721-4B9B-AC7E-C920E6B0047D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ZTestConsoleApp", "Examples\ZMachine Emulator\ZTestConsoleApp\ZTestConsoleApp.csproj", "{E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ZMachine", "ZMachine", "{9832638C-A006-4E2B-B5B5-1B883EA1130E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuessKernel", "Examples\Guess Number Game\GuessKernel.csproj", "{A462D9B3-F72A-4EC9-95CE-1172A0E11114}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CosmosGraphicSubsystem", "Examples\Cosmos Graphic Subsystem\CosmosGraphicSubsystem.csproj", "{4A3CCFAF-687E-4E75-8A4F-4005593259E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeepDemo", "Examples\Console Beep Demo\BeepDemo.csproj", "{E36B1862-E376-4A6C-AE5A-729081C4DCB5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicTerminalShell", "Examples\Basic Terminal Shell\BasicTerminalShell.csproj", "{C1844DF5-3A07-4473-A137-D763B89E8C9F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {54876871-D090-45CB-81A7-DE92788065F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Debug|x86.ActiveCfg = Debug|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Debug|x86.Build.0 = Debug|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Release|Any CPU.Build.0 = Release|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Release|x86.ActiveCfg = Release|Any CPU + {54876871-D090-45CB-81A7-DE92788065F7}.Release|x86.Build.0 = Release|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Debug|x86.ActiveCfg = Debug|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Debug|x86.Build.0 = Debug|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Release|Any CPU.Build.0 = Release|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Release|x86.ActiveCfg = Release|Any CPU + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D}.Release|x86.Build.0 = Release|Any CPU + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Debug|x86.ActiveCfg = Debug|x86 + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Debug|x86.Build.0 = Debug|x86 + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Release|Any CPU.Build.0 = Release|Any CPU + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Release|x86.ActiveCfg = Release|x86 + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7}.Release|x86.Build.0 = Release|x86 + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Debug|x86.ActiveCfg = Debug|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Debug|x86.Build.0 = Debug|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Release|Any CPU.Build.0 = Release|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Release|x86.ActiveCfg = Release|Any CPU + {A462D9B3-F72A-4EC9-95CE-1172A0E11114}.Release|x86.Build.0 = Release|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Debug|x86.Build.0 = Debug|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Release|Any CPU.Build.0 = Release|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Release|x86.ActiveCfg = Release|Any CPU + {4A3CCFAF-687E-4E75-8A4F-4005593259E7}.Release|x86.Build.0 = Release|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Debug|x86.ActiveCfg = Debug|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Debug|x86.Build.0 = Debug|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Release|Any CPU.Build.0 = Release|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Release|x86.ActiveCfg = Release|Any CPU + {E36B1862-E376-4A6C-AE5A-729081C4DCB5}.Release|x86.Build.0 = Release|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Debug|x86.Build.0 = Debug|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Release|Any CPU.Build.0 = Release|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Release|x86.ActiveCfg = Release|Any CPU + {C1844DF5-3A07-4473-A137-D763B89E8C9F}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {54876871-D090-45CB-81A7-DE92788065F7} = {9832638C-A006-4E2B-B5B5-1B883EA1130E} + {9D75A72C-9721-4B9B-AC7E-C920E6B0047D} = {9832638C-A006-4E2B-B5B5-1B883EA1130E} + {E4BB51D4-6F98-4001-BDC5-A24B6F68AEB7} = {9832638C-A006-4E2B-B5B5-1B883EA1130E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CDCC44E7-6647-4887-B1D0-7761436578FD} + EndGlobalSection +EndGlobal diff --git a/Examples/Basic Terminal Shell/BasicTerminalShell.csproj b/Examples/Basic Terminal Shell/BasicTerminalShell.csproj new file mode 100644 index 0000000000..5548636e91 --- /dev/null +++ b/Examples/Basic Terminal Shell/BasicTerminalShell.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + + cosmos + false + True + + + + False + False + Pipe: Cosmos\Serial + Serial: COM1 + VMware + VMware + Use VMware Player or Workstation to deploy and debug. + 192.168.0.8 + + + + + + + + + + diff --git a/Examples/Basic Terminal Shell/Kernel.cs b/Examples/Basic Terminal Shell/Kernel.cs new file mode 100644 index 0000000000..ccdb626321 --- /dev/null +++ b/Examples/Basic Terminal Shell/Kernel.cs @@ -0,0 +1,50 @@ +using System; +using Cosmos.Core; +using Sys = Cosmos.System; + +namespace BasicTerminalShell +{ + public class Kernel : Sys.Kernel + { + // prompt variable + private string _Prompt; + + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Type a command to get it executed!"); + _Prompt = ""; + } + + protected override void Run() + { + Console.Write($"{_Prompt}> "); + var input = Console.ReadLine(); + string[] words = input.Split(' '); + switch (words[0]) + { + case "cpu": + Console.WriteLine($"Vendor: {CPU.GetCPUVendorName()}, Name: {CPU.GetCPUBrandString()}, Frequency: {CPU.GetCPUCycleSpeed()}"); + break; + case "shutdown": + Sys.Power.Shutdown(); // shutdown is supported + break; + case "restart": + Sys.Power.Reboot(); // restart too + break; + case "help": + // console methods are plugged + Console.WriteLine("cpu - prints info about current cpu"); + Console.WriteLine("shutdown - shuts down current computer"); + Console.WriteLine("restart - restarts current computer"); + Console.WriteLine("help - shows this help menu"); + break; + default: + // switch operator works great + Console.WriteLine($"\"{words[0]}\" is not a command"); + break; + } + // overloading works too + Console.WriteLine(); + } + } +} diff --git a/Demos/BeepDemo/BeepDemo.csproj b/Examples/Console Beep Demo/BeepDemo.csproj similarity index 87% rename from Demos/BeepDemo/BeepDemo.csproj rename to Examples/Console Beep Demo/BeepDemo.csproj index ae438f29c1..13975abed6 100644 --- a/Demos/BeepDemo/BeepDemo.csproj +++ b/Examples/Console Beep Demo/BeepDemo.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + net6.0 cosmos @@ -20,6 +20,7 @@ +
diff --git a/Examples/Console Beep Demo/Kernel.cs b/Examples/Console Beep Demo/Kernel.cs new file mode 100644 index 0000000000..a93a2c06c6 --- /dev/null +++ b/Examples/Console Beep Demo/Kernel.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Sys = Cosmos.System; +using System.Threading; + +namespace BeepDemo +{ + public class Kernel: Sys.Kernel + { + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); + } + protected override void Run() + { + Console.WriteLine("Run 'Mary Had a Little Lamb'? "); + string ans = Console.ReadLine(); + if (ans.ToLower() == "y" || ans.ToLower() == "yes") + { + BeepTest.Main(); + } + else + { + Console.WriteLine("Default beep:"); + Console.Beep(); + // Does the follwing: Console.Beep((int)Sys.Notes.Default (800 hertz), (int)Sys.Durations.Default (200 milliseconds) ); + } + } + } + class BeepTest + { + public static void Main() + { + // Declare the first few notes of the song, "Mary Had A Little Lamb". + Note[] Mary = + { + new Note(Tone.B, Duration.QUARTER), + new Note(Tone.A, Duration.QUARTER), + new Note(Tone.GbelowC, Duration.QUARTER), + new Note(Tone.A, Duration.QUARTER), + new Note(Tone.B, Duration.QUARTER), + new Note(Tone.B, Duration.QUARTER), + new Note(Tone.B, Duration.HALF), + new Note(Tone.A, Duration.QUARTER), + new Note(Tone.A, Duration.QUARTER), + new Note(Tone.A, Duration.HALF), + new Note(Tone.B, Duration.QUARTER), + new Note(Tone.D, Duration.QUARTER), + new Note(Tone.D, Duration.HALF) + }; + // Play the song + Play(Mary); + } + + // Play the notes in a song. + protected static void Play(Note[] aTune) + { + foreach (Note n in aTune) + { + if (n.NoteTone == Tone.REST) + { + Thread.Sleep((int)n.NoteDuration); + } + else + { + Console.Beep((int)n.NoteTone, (int)n.NoteDuration); + } + } + } + + // Define the frequencies of notes in an octave, as well as + // silence (rest). + protected enum Tone + { + REST = 0, + GbelowC = 196, + A = 220, + Asharp = 233, + B = 247, + C = 262, + Csharp = 277, + D = 294, + Dsharp = 311, + E = 330, + F = 349, + Fsharp = 370, + G = 392, + Gsharp = 415, + } + + // Define the duration of a note in units of milliseconds. + protected enum Duration + { + WHOLE = 1600, + HALF = WHOLE / 2, + QUARTER = HALF / 2, + EIGHTH = QUARTER / 2, + SIXTEENTH = EIGHTH / 2, + } + + // Define a note as a aFrequency (tone) and the amount of + // aTime (duration) the note plays. + protected readonly struct Note + { + readonly Tone _ToneVal; + readonly Duration _DurVal; + + // Define a constructor to create a specific note. + public Note(Tone aFrequency, Duration aTime) + { + _ToneVal = aFrequency; + _DurVal = aTime; + } + + // Define properties to return the note's tone and duration. + public Tone NoteTone => _ToneVal; + public Duration NoteDuration => _DurVal; + } + } + /* + This example produces the following results: + + This example plays the first few notes of "Mary Had A Little Lamb" + through the computer PC Speaker. + */ +} diff --git a/Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.csproj b/Examples/Cosmos Graphic Subsystem/CosmosGraphicSubsystem.csproj similarity index 94% rename from Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.csproj rename to Examples/Cosmos Graphic Subsystem/CosmosGraphicSubsystem.csproj index ca814e71c0..354dee0708 100644 --- a/Demos/CosmosGraphicSubsystem/CosmosGraphicSubsystem.csproj +++ b/Examples/Cosmos Graphic Subsystem/CosmosGraphicSubsystem.csproj @@ -1,11 +1,8 @@  - netcoreapp2.0 + net6.0 cosmos - CosmosGraphicSubsystemBoot - CosmosGraphicSubsystemBoot - CosmosGraphicSubsystemBoot @@ -74,6 +71,7 @@ +
diff --git a/Examples/Cosmos Graphic Subsystem/Kernel.cs b/Examples/Cosmos Graphic Subsystem/Kernel.cs new file mode 100644 index 0000000000..c0128c0255 --- /dev/null +++ b/Examples/Cosmos Graphic Subsystem/Kernel.cs @@ -0,0 +1,171 @@ +using System; +using System.Drawing; +using Cosmos.System.Graphics; +using Sys = Cosmos.System; +using Cosmos.Debug.Kernel; + +/* + * Beware Demo Kernels are not recompiled when its dependencies changes! + * To force recompilation right click on on the Cosmos icon of the demo solution and do "Build". + */ + +namespace Cosmos_Graphic_Subsytem +{ + public class Kernel : Sys.Kernel + { + + public Debugger debugger = new ("System", "CGS"); + + private Canvas canvas; + private Bitmap bitmap; + + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Let's go in Graphic Mode"); + Console.WriteLine("Using default graphics mode"); + //Mode start = new Mode(800, 600, ColorDepth.ColorDepth32); + + bitmap = new Bitmap(114, 50, + new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xee, 0xee, 0xee, 0xff, 0xd6, 0xd6, 0xd6, 0xff, 0xb5, 0xb5, 0xb5, 0xff, 0xa0, 0x9f, 0x9f, 0xff, 0x92, 0x92, 0x92, 0xff, 0x89, 0x89, 0x88, 0xff, 0x84, 0x84, 0x84, 0xff, 0x83, 0x83, 0x83, 0xff, 0x87, 0x87, 0x87, 0xff, 0x8d, 0x8d, 0x8c, 0xff, 0x96, 0x96, 0x96, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xbc, 0xbc, 0xbc, 0xff, 0xdb, 0xdb, 0xdb, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xe1, 0xe1, 0xe1, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0x8d, 0x8d, 0x8d, 0xff, 0x78, 0x78, 0x77, 0xff, 0x7c, 0x7b, 0x7a, 0xff, 0x8b, 0x8b, 0x89, 0xff, 0x9a, 0x98, 0x96, 0xff, 0xa4, 0xa2, 0xa1, 0xff, 0xae, 0xad, 0xab, 0xff, 0xb4, 0xb3, 0xb0, 0xff, 0xb5, 0xb4, 0xb1, 0xff, 0xb2, 0xb0, 0xae, 0xff, 0xaa, 0xa9, 0xa6, 0xff, 0xa0, 0x9f, 0x9d, 0xff, 0x96, 0x95, 0x93, 0xff, 0x88, 0x88, 0x87, 0xff, 0x7a, 0x79, 0x78, 0xff, 0x79, 0x79, 0x78, 0xff, 0x91, 0x91, 0x91, 0xff, 0xb6, 0xb6, 0xb6, 0xff, 0xe6, 0xe6, 0xe6, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0xc4, 0xc4, 0xc4, 0xff, 0x8a, 0x8a, 0x8a, 0xff, 0x76, 0x75, 0x74, 0xff, 0x8f, 0x8e, 0x8c, 0xff, 0xb3, 0xb1, 0xaf, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xef, 0xed, 0xea, 0xff, 0xef, 0xed, 0xea, 0xff, 0xef, 0xed, 0xea, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xef, 0xed, 0xea, 0xff, 0xef, 0xed, 0xea, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xe0, 0xdf, 0xdc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xaf, 0xae, 0xac, 0xff, 0x8c, 0x8b, 0x89, 0xff, 0x75, 0x75, 0x73, 0xff, 0x96, 0x95, 0x95, 0xff, 0xdf, 0xdf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xc3, 0xc3, 0xc3, 0xff, 0x7f, 0x7f, 0x7e, 0xff, 0x7e, 0x7d, 0x7c, 0xff, 0xb0, 0xae, 0xac, 0xff, 0xda, 0xd8, 0xd6, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xed, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xee, 0xec, 0xe9, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0x74, 0x74, 0x74, 0xff, 0xd3, 0xd3, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xdf, 0xff, 0x8c, 0x8c, 0x8b, 0xff, 0x7a, 0x79, 0x78, 0xff, 0xb7, 0xb5, 0xb3, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xe7, 0xe5, 0xe2, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd7, 0xd5, 0xd3, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xe1, 0xdf, 0xdd, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xed, 0xeb, 0xe8, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xae, 0xac, 0xaa, 0xff, 0x7d, 0x7c, 0x7c, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xbe, 0xbe, 0xbe, 0xff, 0x73, 0x73, 0x72, 0xff, 0xa0, 0x9e, 0x9c, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xec, 0xea, 0xe7, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0x9c, 0x9b, 0x98, 0xff, 0x85, 0x83, 0x81, 0xff, 0x73, 0x71, 0x6f, 0xff, 0x68, 0x66, 0x64, 0xff, 0x63, 0x61, 0x5f, 0xff, 0x63, 0x61, 0x5e, 0xff, 0x63, 0x61, 0x5e, 0xff, 0x62, 0x61, 0x5e, 0xff, 0x64, 0x63, 0x60, 0xff, 0x6b, 0x69, 0x67, 0xff, 0x77, 0x75, 0x73, 0xff, 0x89, 0x87, 0x85, 0xff, 0xa0, 0x9f, 0x9c, 0xff, 0xc0, 0xbe, 0xbc, 0xff, 0xdc, 0xda, 0xd8, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0x7e, 0x7d, 0x7c, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0x75, 0x74, 0x73, 0xff, 0xc2, 0xc0, 0xbd, 0xff, 0xea, 0xe7, 0xe4, 0xff, 0xea, 0xe7, 0xe4, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xeb, 0xe8, 0xe5, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xc0, 0xbe, 0xbb, 0xff, 0x8e, 0x8d, 0x8a, 0xff, 0x6a, 0x69, 0x66, 0xff, 0x62, 0x60, 0x5d, 0xff, 0x65, 0x63, 0x60, 0xff, 0x6d, 0x6b, 0x68, 0xff, 0x75, 0x74, 0x70, 0xff, 0x79, 0x77, 0x73, 0xff, 0x7a, 0x79, 0x75, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x78, 0x76, 0x73, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x6a, 0x69, 0x66, 0xff, 0x64, 0x62, 0x5f, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x6c, 0x6b, 0x69, 0xff, 0xa9, 0xa8, 0xa5, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xeb, 0xe9, 0xe6, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0x9d, 0x9d, 0x9c, 0xff, 0x7c, 0x7c, 0x7a, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xea, 0xe8, 0xe5, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xbf, 0xbd, 0xba, 0xff, 0x7f, 0x7e, 0x7b, 0xff, 0x60, 0x5e, 0x5c, 0xff, 0x66, 0x65, 0x62, 0xff, 0x75, 0x74, 0x70, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x80, 0x7e, 0x7a, 0xff, 0x80, 0x7e, 0x7a, 0xff, 0x7f, 0x7e, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7f, 0x7e, 0x7a, 0xff, 0x80, 0x7e, 0x7a, 0xff, 0x80, 0x7e, 0x7a, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x87, 0x86, 0x83, 0xff, 0xe7, 0xe4, 0xe1, 0xff, 0xe9, 0xe6, 0xe3, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0x88, 0x87, 0x85, 0xff, 0xbe, 0xbe, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xa1, 0xa1, 0xa1, 0xff, 0x7d, 0x7c, 0x7b, 0xff, 0xd7, 0xd5, 0xd3, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xe7, 0xe5, 0xe2, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x91, 0x90, 0x8d, 0xff, 0x5f, 0x5e, 0x5c, 0xff, 0x68, 0x67, 0x64, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x7f, 0x7d, 0x79, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x62, 0x60, 0x5d, 0xff, 0xa7, 0xa6, 0xa3, 0xff, 0xe9, 0xe7, 0xe4, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0x75, 0x74, 0x74, 0xff, 0xe1, 0xe1, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0x77, 0x76, 0x75, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xe7, 0xe5, 0xe2, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0x73, 0x71, 0x6f, 0xff, 0x5f, 0x5e, 0x5b, 0xff, 0x76, 0x75, 0x71, 0xff, 0x7e, 0x7c, 0x78, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x79, 0x77, 0x73, 0xff, 0x60, 0x5e, 0x5c, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xc3, 0xc1, 0xbf, 0xff, 0x7d, 0x7c, 0x7c, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xd4, 0xd4, 0xff, 0x71, 0x70, 0x70, 0xff, 0xc6, 0xc4, 0xc2, 0xff, 0xe7, 0xe5, 0xe2, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe7, 0xe4, 0xe1, 0xff, 0xbd, 0xbb, 0xb9, 0xff, 0x66, 0x65, 0x63, 0xff, 0x66, 0x64, 0x61, 0xff, 0x7b, 0x79, 0x76, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7c, 0x7a, 0x76, 0xff, 0x7c, 0x7a, 0x76, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x7c, 0x7b, 0x77, 0xff, 0x7d, 0x7b, 0x77, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x6d, 0x6c, 0x6a, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xe8, 0xe6, 0xe3, 0xff, 0xa0, 0x9f, 0x9d, 0xff, 0x9c, 0x9b, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0xed, 0xed, 0xed, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xec, 0xec, 0xec, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xe9, 0xe9, 0xe9, 0xff, 0xe7, 0xe7, 0xe7, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xe9, 0xe9, 0xe9, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xec, 0xec, 0xec, 0xff, 0xe7, 0xe7, 0xe7, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xed, 0xed, 0xed, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0x7f, 0x7f, 0x7e, 0xff, 0xa8, 0xa6, 0xa4, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xc1, 0xbf, 0xbc, 0xff, 0x64, 0x63, 0x61, 0xff, 0x68, 0x67, 0x64, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7b, 0x7a, 0x76, 0xff, 0x7c, 0x7a, 0x76, 0xff, 0x77, 0x76, 0x72, 0xff, 0x6f, 0x6d, 0x6a, 0xff, 0x64, 0x63, 0x60, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x60, 0x5f, 0x5c, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x67, 0x66, 0x62, 0xff, 0x71, 0x6f, 0x6c, 0xff, 0x78, 0x77, 0x73, 0xff, 0x65, 0x63, 0x60, 0xff, 0x89, 0x88, 0x85, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0x82, 0x81, 0x80, 0xff, 0x81, 0x81, 0x81, 0xff, 0x97, 0x97, 0x97, 0xff, 0x7b, 0x7b, 0x7b, 0xff, 0x73, 0x72, 0x72, 0xff, 0x74, 0x73, 0x72, 0xff, 0x74, 0x74, 0x73, 0xff, 0x73, 0x73, 0x73, 0xff, 0x78, 0x78, 0x77, 0xff, 0x8a, 0x8a, 0x8a, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xd8, 0xd8, 0xd8, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0x99, 0x99, 0x99, 0xff, 0x85, 0x85, 0x85, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x86, 0x86, 0x86, 0xff, 0x9d, 0x9c, 0x9c, 0xff, 0xda, 0xda, 0xda, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0x89, 0x88, 0x88, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x83, 0x83, 0x83, 0xff, 0x84, 0x84, 0x84, 0xff, 0x94, 0x94, 0x94, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xd2, 0xd2, 0xd2, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0x84, 0x83, 0x83, 0xff, 0x75, 0x74, 0x74, 0xff, 0x73, 0x72, 0x72, 0xff, 0x74, 0x73, 0x72, 0xff, 0x73, 0x73, 0x72, 0xff, 0x78, 0x78, 0x78, 0xff, 0x8c, 0x8b, 0x8b, 0xff, 0x8b, 0x8b, 0x8b, 0xff, 0x77, 0x76, 0x75, 0xff, 0x73, 0x73, 0x72, 0xff, 0x73, 0x73, 0x72, 0xff, 0x76, 0x75, 0x75, 0xff, 0x90, 0x90, 0x90, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xe9, 0xe9, 0xe9, 0xff, 0xb5, 0xb5, 0xb5, 0xff, 0x8f, 0x8e, 0x8e, 0xff, 0x79, 0x79, 0x79, 0xff, 0x73, 0x73, 0x72, 0xff, 0x74, 0x74, 0x73, 0xff, 0x74, 0x74, 0x73, 0xff, 0x74, 0x73, 0x72, 0xff, 0x7a, 0x7a, 0x79, 0xff, 0x8d, 0x8d, 0x8c, 0xff, 0xaf, 0xae, 0xae, 0xff, 0xdf, 0xdf, 0xdf, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xb1, 0xb1, 0xff, 0x81, 0x7f, 0x7e, 0xff, 0xdf, 0xdc, 0xda, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x6c, 0x6b, 0x68, 0xff, 0x65, 0x64, 0x61, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x7b, 0x79, 0x75, 0xff, 0x74, 0x72, 0x6e, 0xff, 0x62, 0x61, 0x5d, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x6f, 0x6e, 0x6c, 0xff, 0x8b, 0x89, 0x87, 0xff, 0x9e, 0x9c, 0x9a, 0xff, 0xaa, 0xa8, 0xa6, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0xad, 0xab, 0xa8, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0x97, 0x95, 0x92, 0xff, 0x83, 0x81, 0x7f, 0xff, 0x6a, 0x69, 0x66, 0xff, 0x5d, 0x5b, 0x59, 0xff, 0x51, 0x50, 0x4e, 0xff, 0xa7, 0xa5, 0xa2, 0xff, 0xe6, 0xe4, 0xe1, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0x70, 0x6e, 0x6d, 0xff, 0x79, 0x77, 0x76, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xc4, 0xc2, 0xc0, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0xb2, 0xb0, 0xad, 0xff, 0x91, 0x90, 0x8e, 0xff, 0x73, 0x72, 0x71, 0xff, 0x70, 0x6e, 0x6d, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0xba, 0xb8, 0xb6, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xb9, 0xb7, 0xb5, 0xff, 0x98, 0x96, 0x94, 0xff, 0x72, 0x72, 0x71, 0xff, 0x9d, 0x9d, 0x9d, 0xff, 0x78, 0x78, 0x78, 0xff, 0x8b, 0x89, 0x87, 0xff, 0xb4, 0xb1, 0xaf, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0xa3, 0xa1, 0x9f, 0xff, 0x73, 0x72, 0x71, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xf8, 0xf8, 0xf8, 0xff, 0xce, 0xce, 0xce, 0xff, 0x84, 0x84, 0x83, 0xff, 0x76, 0x75, 0x75, 0xff, 0x97, 0x95, 0x93, 0xff, 0xba, 0xb8, 0xb6, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd5, 0xd2, 0xd0, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xae, 0xac, 0xaa, 0xff, 0xae, 0xac, 0xa9, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0xa3, 0xa2, 0xa0, 0xff, 0x74, 0x73, 0x72, 0xff, 0x81, 0x81, 0x81, 0xff, 0x75, 0x74, 0x74, 0xff, 0x86, 0x84, 0x83, 0xff, 0xaa, 0xa8, 0xa6, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd4, 0xd2, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xad, 0xaa, 0xa8, 0xff, 0x8c, 0x8b, 0x89, 0xff, 0x73, 0x73, 0x72, 0xff, 0x91, 0x90, 0x90, 0xff, 0xe3, 0xe3, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xec, 0xec, 0xff, 0x75, 0x75, 0x74, 0xff, 0xc0, 0xbe, 0xbc, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0x84, 0x83, 0x81, 0xff, 0x5e, 0x5c, 0x59, 0xff, 0x79, 0x77, 0x73, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x79, 0x78, 0x74, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x79, 0x78, 0x74, 0xff, 0x7a, 0x78, 0x74, 0xff, 0x78, 0x77, 0x73, 0xff, 0x66, 0x65, 0x62, 0xff, 0x5d, 0x5c, 0x5a, 0xff, 0x88, 0x87, 0x84, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0x9a, 0x98, 0x95, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd5, 0xd2, 0xd0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xbe, 0xbb, 0xb9, 0xff, 0x62, 0x62, 0x61, 0xff, 0xa7, 0xa5, 0xa3, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x75, 0x75, 0x73, 0xff, 0x79, 0x79, 0x79, 0xff, 0x74, 0x74, 0x72, 0xff, 0xa8, 0xa7, 0xa4, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0x9d, 0x9c, 0x9a, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0x95, 0x94, 0x92, 0xff, 0x79, 0x79, 0x78, 0xff, 0xe6, 0xe6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0x86, 0x85, 0x83, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xaf, 0xad, 0xab, 0xff, 0x59, 0x58, 0x55, 0xff, 0x74, 0x72, 0x6f, 0xff, 0x79, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x79, 0x77, 0x73, 0xff, 0x76, 0x75, 0x71, 0xff, 0x5f, 0x5d, 0x5a, 0xff, 0x6f, 0x6d, 0x6b, 0xff, 0xbb, 0xb9, 0xb7, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe6, 0xe3, 0xe0, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe4, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xb8, 0xb7, 0xb4, 0xff, 0x85, 0x84, 0x82, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe3, 0xe0, 0xff, 0xe5, 0xe2, 0xdf, 0xff, 0xe4, 0xe2, 0xdf, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0x91, 0x90, 0x8d, 0xff, 0x9b, 0x9a, 0x9a, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0x7b, 0x7b, 0x7a, 0xff, 0xb9, 0xb7, 0xb5, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0x6f, 0x6e, 0x6c, 0xff, 0x66, 0x65, 0x62, 0xff, 0x79, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x78, 0x77, 0x73, 0xff, 0x77, 0x76, 0x72, 0xff, 0x5e, 0x5d, 0x5a, 0xff, 0x78, 0x77, 0x75, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xad, 0xab, 0xa9, 0xff, 0x9b, 0x9a, 0x97, 0xff, 0x97, 0x95, 0x93, 0xff, 0x9e, 0x9d, 0x9a, 0xff, 0xb4, 0xb2, 0xb0, 0xff, 0xd0, 0xce, 0xcc, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xc2, 0xc1, 0xbe, 0xff, 0xa9, 0xa7, 0xa5, 0xff, 0xac, 0xab, 0xa8, 0xff, 0xd1, 0xd0, 0xcd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xbe, 0xbc, 0xba, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0x98, 0x97, 0x94, 0xff, 0x98, 0x96, 0x94, 0xff, 0xa0, 0x9f, 0x9c, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xd5, 0xd4, 0xd1, 0xff, 0xbc, 0xbb, 0xb8, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xc0, 0xbf, 0xbc, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xba, 0xb9, 0xb6, 0xff, 0xbb, 0xb9, 0xb7, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xca, 0xc8, 0xc6, 0xff, 0xad, 0xac, 0xa9, 0xff, 0x9b, 0x9a, 0x97, 0xff, 0x97, 0x95, 0x93, 0xff, 0x9e, 0x9c, 0x9a, 0xff, 0xb3, 0xb2, 0xaf, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xb4, 0xb3, 0xb0, 0xff, 0x98, 0x97, 0x94, 0xff, 0x99, 0x98, 0x96, 0xff, 0xc3, 0xc2, 0xbf, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xb9, 0xb8, 0xb5, 0xff, 0xa1, 0xa0, 0x9d, 0xff, 0x97, 0x96, 0x93, 0xff, 0x98, 0x97, 0x94, 0xff, 0xa2, 0xa1, 0x9e, 0xff, 0xb8, 0xb6, 0xb4, 0xff, 0xd1, 0xd0, 0xcd, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xc7, 0xc5, 0xc3, 0xff, 0x76, 0x75, 0x75, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0x77, 0x77, 0x75, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xac, 0xaa, 0xa7, 0xff, 0x59, 0x58, 0x55, 0xff, 0x75, 0x74, 0x70, 0xff, 0x78, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x75, 0x71, 0xff, 0x78, 0x76, 0x72, 0xff, 0x65, 0x64, 0x60, 0xff, 0x6d, 0x6c, 0x69, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xc2, 0xc0, 0xbd, 0xff, 0x83, 0x81, 0x7f, 0xff, 0x5d, 0x5d, 0x5a, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5d, 0x5c, 0x58, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x64, 0x63, 0x61, 0xff, 0x6e, 0x6d, 0x6b, 0xff, 0x5c, 0x5b, 0x59, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x59, 0x58, 0x55, 0xff, 0x72, 0x71, 0x6e, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0x70, 0x6f, 0x6c, 0xff, 0x5a, 0x59, 0x57, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5e, 0x5d, 0x5a, 0xff, 0xa9, 0xa7, 0xa4, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xad, 0xab, 0xa8, 0xff, 0x56, 0x55, 0x52, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x55, 0x55, 0x52, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xc0, 0xbe, 0xbb, 0xff, 0x5b, 0x5b, 0x58, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x5b, 0x5b, 0x57, 0xff, 0x5b, 0x5b, 0x58, 0xff, 0x52, 0x52, 0x4f, 0xff, 0x9b, 0x9a, 0x97, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xc2, 0xc0, 0xbd, 0xff, 0x83, 0x82, 0x7f, 0xff, 0x5e, 0x5d, 0x5b, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5d, 0x5b, 0x58, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x63, 0x62, 0x5f, 0xff, 0x67, 0x66, 0x63, 0xff, 0x5a, 0x5a, 0x57, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x64, 0x63, 0x61, 0xff, 0xc4, 0xc2, 0xbf, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xa3, 0xa1, 0x9f, 0xff, 0x69, 0x68, 0x66, 0xff, 0x5a, 0x59, 0x57, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x64, 0x63, 0x61, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0x72, 0x71, 0x70, 0xff, 0xec, 0xec, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0x95, 0x94, 0x92, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0x71, 0x70, 0x6d, 0xff, 0x52, 0x50, 0x4d, 0xff, 0x6a, 0x68, 0x64, 0xff, 0x6f, 0x6d, 0x69, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x76, 0x75, 0x71, 0xff, 0x77, 0x76, 0x72, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xa9, 0xa7, 0xa4, 0xff, 0x5e, 0x5d, 0x5b, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x75, 0x74, 0x70, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x71, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x6c, 0x6b, 0x67, 0xff, 0x67, 0x66, 0x62, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x76, 0x75, 0x71, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x58, 0x57, 0x54, 0xff, 0xa9, 0xa7, 0xa4, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0x9c, 0x9a, 0x98, 0xff, 0x57, 0x56, 0x54, 0xff, 0x65, 0x64, 0x60, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x73, 0x71, 0x6e, 0xff, 0x57, 0x56, 0x54, 0xff, 0xa5, 0xa4, 0xa1, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xa0, 0x9e, 0x9b, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x75, 0x74, 0x6f, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x7d, 0x7c, 0x79, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0x97, 0x95, 0x93, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x8f, 0x8e, 0x8b, 0xff, 0xe2, 0xe0, 0xdd, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xaa, 0xa8, 0xa5, 0xff, 0x5f, 0x5e, 0x5b, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x75, 0x74, 0x70, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x71, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x6c, 0x6b, 0x68, 0xff, 0x6a, 0x69, 0x65, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x77, 0x76, 0x72, 0xff, 0x77, 0x76, 0x72, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x9c, 0x9a, 0x98, 0xff, 0xe3, 0xe0, 0xdd, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0x8b, 0x8a, 0x87, 0xff, 0x57, 0x55, 0x53, 0xff, 0x68, 0x67, 0x64, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x71, 0x6f, 0x6c, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x57, 0x56, 0x54, 0xff, 0xbb, 0xb9, 0xb6, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0x77, 0x77, 0x76, 0xff, 0xf2, 0xf2, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xf6, 0xf6, 0xff, 0x80, 0x7f, 0x7f, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xc4, 0xc2, 0xbf, 0xff, 0x47, 0x46, 0x43, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x51, 0x4f, 0x4b, 0xff, 0x52, 0x50, 0x4c, 0xff, 0x55, 0x54, 0x50, 0xff, 0x5b, 0x59, 0x55, 0xff, 0x5f, 0x5e, 0x5a, 0xff, 0x65, 0x63, 0x5f, 0xff, 0x56, 0x55, 0x51, 0xff, 0x82, 0x80, 0x7e, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xad, 0xac, 0xa9, 0xff, 0x59, 0x58, 0x56, 0xff, 0x68, 0x67, 0x64, 0xff, 0x76, 0x75, 0x71, 0xff, 0x76, 0x75, 0x71, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x76, 0x74, 0x70, 0xff, 0x76, 0x75, 0x71, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0xa4, 0xa3, 0xa0, 0xff, 0xbb, 0xb9, 0xb6, 0xff, 0x59, 0x58, 0x56, 0xff, 0x6c, 0x6b, 0x67, 0xff, 0x75, 0x74, 0x70, 0xff, 0x62, 0x61, 0x5e, 0xff, 0x59, 0x58, 0x56, 0xff, 0x60, 0x60, 0x5d, 0xff, 0x61, 0x60, 0x5e, 0xff, 0x5b, 0x5b, 0x58, 0xff, 0x57, 0x56, 0x54, 0xff, 0x57, 0x57, 0x54, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0x98, 0x96, 0x94, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x75, 0x74, 0x70, 0xff, 0x66, 0x65, 0x62, 0xff, 0x67, 0x66, 0x62, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x61, 0x60, 0x5d, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x71, 0x70, 0x6e, 0xff, 0x65, 0x64, 0x60, 0xff, 0x67, 0x66, 0x62, 0xff, 0x66, 0x65, 0x61, 0xff, 0x75, 0x74, 0x70, 0xff, 0x5f, 0x5e, 0x5a, 0xff, 0x89, 0x88, 0x85, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xae, 0xac, 0xaa, 0xff, 0x59, 0x58, 0x56, 0xff, 0x68, 0x67, 0x63, 0xff, 0x76, 0x74, 0x70, 0xff, 0x76, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x76, 0x74, 0x70, 0xff, 0x76, 0x75, 0x71, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x76, 0x75, 0x71, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x9c, 0x9a, 0x98, 0xff, 0xe3, 0xe1, 0xde, 0xff, 0xa7, 0xa5, 0xa2, 0xff, 0x56, 0x55, 0x53, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x5f, 0x5f, 0x5b, 0xff, 0x5a, 0x59, 0x57, 0xff, 0x61, 0x61, 0x5e, 0xff, 0x60, 0x5f, 0x5d, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x55, 0x54, 0x52, 0xff, 0x64, 0x63, 0x61, 0xff, 0xd3, 0xd0, 0xce, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xa1, 0x9f, 0x9d, 0xff, 0x93, 0x93, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0xe4, 0xe4, 0xff, 0x72, 0x72, 0x70, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0x9e, 0x9c, 0x9a, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4c, 0x4a, 0x46, 0xff, 0x43, 0x41, 0x3f, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x59, 0x58, 0x55, 0xff, 0x6d, 0x6b, 0x67, 0xff, 0x70, 0x6e, 0x6a, 0xff, 0x72, 0x70, 0x6c, 0xff, 0x73, 0x71, 0x6d, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x74, 0x70, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x5a, 0x59, 0x56, 0xff, 0xba, 0xb8, 0xb5, 0xff, 0x88, 0x87, 0x84, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x76, 0x75, 0x71, 0xff, 0x64, 0x63, 0x5f, 0xff, 0x69, 0x67, 0x65, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0xa5, 0xa3, 0xa0, 0xff, 0x9a, 0x98, 0x95, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xe1, 0xde, 0xdb, 0xff, 0x90, 0x8e, 0x8b, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x72, 0x70, 0x6d, 0xff, 0x4c, 0x4b, 0x48, 0xff, 0x4c, 0x4b, 0x48, 0xff, 0x6e, 0x6d, 0x69, 0xff, 0x59, 0x58, 0x55, 0xff, 0xae, 0xac, 0xa9, 0xff, 0xe0, 0xde, 0xdb, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0xc0, 0xbe, 0xbb, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x6a, 0x68, 0x65, 0xff, 0x4e, 0x4d, 0x4a, 0xff, 0x4c, 0x4b, 0x48, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x61, 0x60, 0x5c, 0xff, 0x82, 0x81, 0x7e, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xca, 0xc7, 0xc5, 0xff, 0x64, 0x63, 0x60, 0xff, 0x65, 0x64, 0x61, 0xff, 0x75, 0x74, 0x70, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x75, 0x73, 0x6f, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x59, 0x58, 0x55, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0x74, 0x72, 0x70, 0xff, 0x64, 0x63, 0x5f, 0xff, 0x76, 0x74, 0x70, 0xff, 0x5f, 0x5e, 0x5b, 0xff, 0x74, 0x72, 0x70, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xc1, 0xbf, 0xbd, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0xa3, 0xa1, 0x9f, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0x83, 0x82, 0x81, 0xff, 0xb8, 0xb8, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc5, 0xc5, 0xc5, 0xff, 0x7d, 0x7c, 0x7b, 0xff, 0xd8, 0xd5, 0xd3, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0x7c, 0x7b, 0x78, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x4d, 0x4b, 0x47, 0xff, 0x4d, 0x4b, 0x46, 0xff, 0x4d, 0x4b, 0x46, 0xff, 0x4d, 0x4b, 0x46, 0xff, 0x4d, 0x4b, 0x46, 0xff, 0x4d, 0x4b, 0x47, 0xff, 0x44, 0x43, 0x3f, 0xff, 0x59, 0x58, 0x55, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0x89, 0x88, 0x85, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0x4e, 0x4c, 0x48, 0xff, 0x4f, 0x4d, 0x49, 0xff, 0x51, 0x4f, 0x4b, 0xff, 0x54, 0x53, 0x4e, 0xff, 0x58, 0x56, 0x52, 0xff, 0x5c, 0x5a, 0x56, 0xff, 0x5f, 0x5e, 0x5a, 0xff, 0x63, 0x62, 0x5e, 0xff, 0x66, 0x65, 0x61, 0xff, 0x6a, 0x69, 0x65, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x70, 0x6e, 0x6a, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x63, 0x62, 0x5f, 0xff, 0x6f, 0x6e, 0x6c, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0x71, 0x70, 0x6e, 0xff, 0x67, 0x66, 0x62, 0xff, 0x75, 0x74, 0x70, 0xff, 0x5a, 0x5a, 0x56, 0xff, 0x99, 0x98, 0x95, 0xff, 0xe2, 0xdf, 0xdc, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdf, 0xdd, 0xda, 0xff, 0xdd, 0xdb, 0xd7, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0x88, 0x86, 0x84, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x6f, 0x6e, 0x6b, 0xff, 0x53, 0x52, 0x50, 0xff, 0x5b, 0x5a, 0x58, 0xff, 0x6a, 0x69, 0x65, 0xff, 0x5d, 0x5c, 0x59, 0xff, 0x89, 0x88, 0x85, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0x99, 0x98, 0x95, 0xff, 0x59, 0x59, 0x56, 0xff, 0x63, 0x62, 0x5f, 0xff, 0x65, 0x63, 0x61, 0xff, 0x54, 0x54, 0x51, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x63, 0x62, 0x5e, 0xff, 0x7b, 0x7a, 0x78, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0x93, 0x91, 0x8f, 0xff, 0x58, 0x57, 0x54, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x74, 0x73, 0x6f, 0xff, 0x64, 0x63, 0x5f, 0xff, 0x6f, 0x6e, 0x6b, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x60, 0x5f, 0x5d, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x58, 0x58, 0x55, 0xff, 0xae, 0xac, 0xaa, 0xff, 0xe1, 0xdf, 0xdc, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xcf, 0xcc, 0xca, 0xff, 0x72, 0x72, 0x71, 0xff, 0xe3, 0xe3, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa9, 0xa9, 0xa9, 0xff, 0x8a, 0x89, 0x87, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0x62, 0x61, 0x5e, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x7a, 0x78, 0x76, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x55, 0x54, 0x51, 0xff, 0x42, 0x40, 0x3d, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4a, 0x48, 0x45, 0xff, 0x4a, 0x48, 0x45, 0xff, 0x4a, 0x48, 0x45, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4c, 0x4a, 0x46, 0xff, 0x4d, 0x4b, 0x48, 0xff, 0x4e, 0x4c, 0x49, 0xff, 0x50, 0x4f, 0x4b, 0xff, 0x54, 0x52, 0x4f, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x86, 0x85, 0x82, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x6b, 0x6a, 0x68, 0xff, 0x57, 0x56, 0x52, 0xff, 0x67, 0x65, 0x61, 0xff, 0x55, 0x54, 0x51, 0xff, 0x71, 0x70, 0x6e, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0x80, 0x7f, 0x7c, 0xff, 0x60, 0x5f, 0x5b, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x5e, 0x5e, 0x5b, 0xff, 0x74, 0x73, 0x70, 0xff, 0x60, 0x5f, 0x5b, 0xff, 0x68, 0x67, 0x64, 0xff, 0x69, 0x68, 0x65, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0x73, 0x72, 0x70, 0xff, 0x62, 0x62, 0x5e, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x84, 0x82, 0x80, 0xff, 0x5b, 0x5a, 0x58, 0xff, 0x6e, 0x6d, 0x69, 0xff, 0x65, 0x64, 0x60, 0xff, 0x74, 0x73, 0x71, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0x67, 0x66, 0x63, 0xff, 0x67, 0x66, 0x63, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x59, 0x58, 0x55, 0xff, 0x8b, 0x8a, 0x87, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0x60, 0x5f, 0x5d, 0xff, 0x6b, 0x6a, 0x67, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x5a, 0x5a, 0x57, 0xff, 0x86, 0x84, 0x82, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xa3, 0xa1, 0x9f, 0xff, 0x85, 0x85, 0x84, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x97, 0x97, 0x97, 0xff, 0x95, 0x93, 0x91, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0x4f, 0x4e, 0x4b, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0xdf, 0xdc, 0xd9, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xb7, 0xb5, 0xb3, 0xff, 0x3f, 0x3e, 0x3b, 0xff, 0x47, 0x45, 0x41, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x44, 0xff, 0x49, 0x47, 0x43, 0xff, 0x49, 0x47, 0x43, 0xff, 0x49, 0x47, 0x43, 0xff, 0x49, 0x47, 0x43, 0xff, 0x49, 0x47, 0x43, 0xff, 0x49, 0x47, 0x43, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x6d, 0x6c, 0x69, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0x82, 0x80, 0x7d, 0xff, 0x39, 0x37, 0x34, 0xff, 0x4b, 0x49, 0x45, 0xff, 0x4a, 0x48, 0x44, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x58, 0x57, 0x55, 0xff, 0x98, 0x97, 0x94, 0xff, 0xc8, 0xc5, 0xc3, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xdd, 0xdb, 0xd8, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x74, 0x73, 0x70, 0xff, 0x59, 0x57, 0x54, 0xff, 0x63, 0x62, 0x5e, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x8e, 0x8c, 0x8a, 0xff, 0x57, 0x56, 0x53, 0xff, 0x6b, 0x6a, 0x66, 0xff, 0x56, 0x55, 0x53, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0xde, 0xdc, 0xd9, 0xff, 0xc4, 0xc2, 0xbf, 0xff, 0x5a, 0x59, 0x56, 0xff, 0x69, 0x68, 0x64, 0xff, 0x59, 0x58, 0x55, 0xff, 0xa5, 0xa3, 0xa1, 0xff, 0x5b, 0x5a, 0x57, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x67, 0x66, 0x62, 0xff, 0x6e, 0x6d, 0x6a, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0x58, 0x58, 0x55, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x72, 0x71, 0x6d, 0xff, 0x61, 0x60, 0x5c, 0xff, 0x79, 0x77, 0x75, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x78, 0x76, 0x74, 0xff, 0x5e, 0x5e, 0x5a, 0xff, 0x73, 0x72, 0x6e, 0xff, 0x6c, 0x6b, 0x67, 0xff, 0x56, 0x55, 0x53, 0xff, 0x71, 0x70, 0x6d, 0xff, 0xa7, 0xa6, 0xa3, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xdc, 0xda, 0xd7, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0x90, 0x8e, 0x8c, 0xff, 0x85, 0x84, 0x84, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8c, 0x8c, 0x8b, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0x43, 0x41, 0x3f, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x47, 0x45, 0x41, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0xa0, 0x9e, 0x9c, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0x9f, 0x9d, 0x9a, 0xff, 0x3b, 0x39, 0x37, 0xff, 0x47, 0x45, 0x41, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x48, 0x46, 0x42, 0xff, 0x40, 0x3e, 0x3b, 0xff, 0x58, 0x57, 0x54, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xbe, 0xbb, 0xb9, 0xff, 0x4b, 0x49, 0x47, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x48, 0x46, 0x42, 0xff, 0x47, 0x45, 0x41, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x38, 0x37, 0x34, 0xff, 0x4b, 0x49, 0x47, 0xff, 0x7e, 0x7c, 0x79, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xdb, 0xd9, 0xd6, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0x62, 0x60, 0x5e, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x45, 0x43, 0x3f, 0xff, 0x56, 0x55, 0x53, 0xff, 0xa8, 0xa6, 0xa4, 0xff, 0x43, 0x42, 0x40, 0xff, 0x4d, 0x4c, 0x48, 0xff, 0x40, 0x3e, 0x3c, 0xff, 0x96, 0x94, 0x91, 0xff, 0xe0, 0xdd, 0xda, 0xff, 0x9f, 0x9d, 0x9b, 0xff, 0x45, 0x44, 0x41, 0xff, 0x51, 0x50, 0x4c, 0xff, 0x5d, 0x5c, 0x5a, 0xff, 0xbd, 0xba, 0xb8, 0xff, 0x52, 0x51, 0x4f, 0xff, 0x5c, 0x5a, 0x57, 0xff, 0x5a, 0x58, 0x55, 0xff, 0x61, 0x60, 0x5d, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0x52, 0x51, 0x4e, 0xff, 0x69, 0x68, 0x64, 0xff, 0x6b, 0x6a, 0x66, 0xff, 0x6c, 0x6a, 0x67, 0xff, 0x6c, 0x6b, 0x67, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x6d, 0x6c, 0x68, 0xff, 0x6e, 0x6d, 0x69, 0xff, 0x6e, 0x6d, 0x69, 0xff, 0x6e, 0x6d, 0x69, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x70, 0x6f, 0x6b, 0xff, 0x66, 0x65, 0x61, 0xff, 0x67, 0x67, 0x64, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0xb1, 0xaf, 0xac, 0xff, 0x56, 0x56, 0x53, 0xff, 0x65, 0x64, 0x61, 0xff, 0x71, 0x70, 0x6c, 0xff, 0x6f, 0x6e, 0x6a, 0xff, 0x5f, 0x5f, 0x5b, 0xff, 0x55, 0x55, 0x52, 0xff, 0x63, 0x63, 0x60, 0xff, 0x91, 0x90, 0x8d, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xdb, 0xd9, 0xd6, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x76, 0x75, 0x74, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0x84, 0x84, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xdb, 0xd9, 0xd6, 0xff, 0xbf, 0xbc, 0xba, 0xff, 0x3e, 0x3d, 0x3a, 0xff, 0x42, 0x41, 0x3d, 0xff, 0x46, 0x44, 0x41, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x46, 0x44, 0x40, 0xff, 0x44, 0x43, 0x3f, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0x93, 0x91, 0x8f, 0xff, 0x38, 0x37, 0x34, 0xff, 0x46, 0x44, 0x41, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x45, 0x44, 0x40, 0xff, 0x46, 0x44, 0x41, 0xff, 0x40, 0x3e, 0x3b, 0xff, 0x50, 0x4f, 0x4d, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xab, 0xa8, 0xa6, 0xff, 0x4c, 0x4b, 0x49, 0xff, 0x36, 0x35, 0x32, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x46, 0x44, 0x40, 0xff, 0x45, 0x43, 0x40, 0xff, 0x3f, 0x3e, 0x3b, 0xff, 0x36, 0x35, 0x32, 0xff, 0x46, 0x45, 0x43, 0xff, 0x97, 0x95, 0x93, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x57, 0x56, 0x53, 0xff, 0x3e, 0x3d, 0x3a, 0xff, 0x3f, 0x3d, 0x3a, 0xff, 0x58, 0x56, 0x54, 0xff, 0xc0, 0xbe, 0xbb, 0xff, 0x4e, 0x4d, 0x4a, 0xff, 0x40, 0x3e, 0x3b, 0xff, 0x38, 0x37, 0x34, 0xff, 0x71, 0x70, 0x6d, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0x77, 0x76, 0x73, 0xff, 0x37, 0x35, 0x33, 0xff, 0x37, 0x36, 0x33, 0xff, 0x79, 0x77, 0x75, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0x47, 0x46, 0x43, 0xff, 0x42, 0x40, 0x3d, 0xff, 0x41, 0x40, 0x3d, 0xff, 0x4f, 0x4e, 0x4b, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xde, 0xdb, 0xd8, 0xff, 0x95, 0x93, 0x90, 0xff, 0x3b, 0x39, 0x37, 0xff, 0x49, 0x48, 0x44, 0xff, 0x4a, 0x48, 0x45, 0xff, 0x4a, 0x48, 0x45, 0xff, 0x4b, 0x49, 0x46, 0xff, 0x4c, 0x4a, 0x47, 0xff, 0x4d, 0x4b, 0x48, 0xff, 0x4d, 0x4c, 0x48, 0xff, 0x4f, 0x4d, 0x49, 0xff, 0x4f, 0x4e, 0x4a, 0xff, 0x50, 0x4e, 0x4b, 0xff, 0x51, 0x50, 0x4c, 0xff, 0x52, 0x50, 0x4d, 0xff, 0x52, 0x51, 0x4e, 0xff, 0x54, 0x52, 0x4f, 0xff, 0x4e, 0x4c, 0x49, 0xff, 0x56, 0x55, 0x52, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0x9f, 0x9e, 0x9b, 0xff, 0x50, 0x4f, 0x4d, 0xff, 0x49, 0x48, 0x45, 0xff, 0x54, 0x53, 0x4f, 0xff, 0x59, 0x57, 0x53, 0xff, 0x57, 0x55, 0x52, 0xff, 0x4d, 0x4c, 0x49, 0xff, 0x40, 0x3f, 0x3c, 0xff, 0x53, 0x52, 0x50, 0xff, 0xa6, 0xa4, 0xa2, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0x77, 0x76, 0x75, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x81, 0x80, 0xff, 0xa5, 0xa3, 0xa1, 0xff, 0xdb, 0xd9, 0xd6, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xbb, 0xb8, 0xb6, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x41, 0x40, 0x3c, 0xff, 0x44, 0x43, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x43, 0x41, 0x3d, 0xff, 0x3a, 0x39, 0x36, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0xdb, 0xd9, 0xd6, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0x93, 0x91, 0x8f, 0xff, 0x37, 0x36, 0x33, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x42, 0x3f, 0xff, 0x44, 0x43, 0x3f, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x52, 0x51, 0x4f, 0xff, 0xcd, 0xca, 0xc8, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0x78, 0x77, 0x74, 0xff, 0x44, 0x42, 0x40, 0xff, 0x36, 0x34, 0x32, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x44, 0x43, 0x3f, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x38, 0x37, 0x35, 0xff, 0x99, 0x97, 0x95, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0x4e, 0x4d, 0x4a, 0xff, 0x3f, 0x3d, 0x3a, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x5c, 0x5a, 0x58, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0x6e, 0x6c, 0x6a, 0xff, 0x38, 0x37, 0x33, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x52, 0x50, 0x4e, 0xff, 0xc1, 0xbe, 0xbc, 0xff, 0x54, 0x53, 0x51, 0xff, 0x3b, 0x3a, 0x36, 0xff, 0x38, 0x37, 0x34, 0xff, 0xa3, 0xa2, 0x9f, 0xff, 0xcc, 0xc9, 0xc7, 0xff, 0x49, 0x48, 0x46, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x40, 0x3e, 0x3a, 0xff, 0x47, 0x45, 0x43, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xdd, 0xda, 0xd7, 0xff, 0x94, 0x92, 0x90, 0xff, 0x37, 0x36, 0x33, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x51, 0x50, 0x4e, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0x6c, 0x6a, 0x68, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x35, 0x34, 0x31, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x43, 0x42, 0x3e, 0xff, 0x44, 0x42, 0x3e, 0xff, 0x39, 0x38, 0x35, 0xff, 0x40, 0x3f, 0x3d, 0xff, 0xac, 0xa9, 0xa7, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0x79, 0x77, 0x76, 0xff, 0xc5, 0xc5, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0x83, 0x82, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xbb, 0xb9, 0xb6, 0xff, 0x3c, 0x3a, 0x38, 0xff, 0x40, 0x3e, 0x3b, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x41, 0x3d, 0xff, 0x42, 0x40, 0x3d, 0xff, 0x38, 0x37, 0x34, 0xff, 0xa0, 0x9e, 0x9c, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0x9f, 0x9d, 0x9a, 0xff, 0x37, 0x36, 0x34, 0xff, 0x42, 0x40, 0x3d, 0xff, 0x43, 0x41, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x39, 0x38, 0x35, 0xff, 0x60, 0x5e, 0x5c, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xbe, 0xbb, 0xb9, 0xff, 0x8e, 0x8c, 0x89, 0xff, 0x55, 0x53, 0x51, 0xff, 0x35, 0x34, 0x31, 0xff, 0x3f, 0x3d, 0x3a, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x3a, 0x38, 0x35, 0xff, 0x4c, 0x4b, 0x48, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0x46, 0x44, 0x42, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x39, 0x37, 0x35, 0xff, 0x62, 0x60, 0x5e, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0x91, 0x90, 0x8d, 0xff, 0x35, 0x34, 0x31, 0xff, 0x40, 0x3e, 0x3b, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x98, 0x96, 0x94, 0xff, 0x3e, 0x3d, 0x3a, 0xff, 0x3a, 0x38, 0x36, 0xff, 0x48, 0x46, 0x44, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0x4d, 0x4b, 0x49, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x3f, 0x3d, 0x3a, 0xff, 0x40, 0x3e, 0x3c, 0xff, 0xc5, 0xc2, 0xbf, 0xff, 0xdc, 0xd9, 0xd6, 0xff, 0xa0, 0x9e, 0x9c, 0xff, 0x38, 0x36, 0x34, 0xff, 0x42, 0x40, 0x3d, 0xff, 0x43, 0x41, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x40, 0x3d, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x39, 0x38, 0x35, 0xff, 0x5e, 0x5d, 0x5b, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0x85, 0x83, 0x81, 0xff, 0x4c, 0x4b, 0x49, 0xff, 0x35, 0x34, 0x31, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x43, 0x41, 0x3e, 0xff, 0x36, 0x34, 0x32, 0xff, 0x5e, 0x5d, 0x5b, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0x91, 0x90, 0x8e, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0x89, 0x89, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xc1, 0xbf, 0xbc, 0xff, 0x3d, 0x3c, 0x3a, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x35, 0x33, 0x31, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0x3b, 0x39, 0x37, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x79, 0x77, 0x75, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0x7d, 0x7c, 0x7a, 0xff, 0x35, 0x33, 0x31, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x37, 0x36, 0x33, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xc3, 0xc0, 0xbe, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x36, 0x35, 0x31, 0xff, 0x67, 0x66, 0x63, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0x3b, 0x3a, 0x38, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x38, 0x37, 0x34, 0xff, 0x57, 0x56, 0x54, 0xff, 0x37, 0x36, 0x33, 0xff, 0x34, 0x32, 0x30, 0xff, 0x6d, 0x6c, 0x69, 0xff, 0xd6, 0xd4, 0xd0, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0x50, 0x4e, 0x4c, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x3b, 0x3a, 0x38, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0xda, 0xd8, 0xd5, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0x3b, 0x3a, 0x38, 0xff, 0x3e, 0x3c, 0x39, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3b, 0xff, 0x41, 0x3f, 0x3c, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x77, 0x76, 0x73, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xc4, 0xc1, 0xbf, 0xff, 0x6b, 0x69, 0x67, 0xff, 0x35, 0x33, 0x31, 0xff, 0x40, 0x3f, 0x3b, 0xff, 0x3d, 0x3c, 0x38, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xa3, 0xa1, 0x9f, 0xff, 0x90, 0x90, 0x90, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x93, 0x93, 0xff, 0x93, 0x91, 0x90, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0x45, 0x44, 0x42, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x31, 0x30, 0x2e, 0xff, 0x79, 0x78, 0x75, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0x39, 0x39, 0x36, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x34, 0x33, 0x31, 0xff, 0xa1, 0x9f, 0x9c, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0x43, 0x42, 0x40, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3e, 0x3d, 0x3a, 0xff, 0x35, 0x34, 0x31, 0xff, 0x9a, 0x99, 0x96, 0xff, 0xdb, 0xd8, 0xd5, 0xff, 0xba, 0xb8, 0xb5, 0xff, 0x39, 0x39, 0x36, 0xff, 0x3c, 0x3b, 0x38, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x6c, 0x6b, 0x69, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0x53, 0x52, 0x50, 0xff, 0x37, 0x36, 0x33, 0xff, 0x35, 0x34, 0x31, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x35, 0x34, 0x31, 0xff, 0x33, 0x32, 0x30, 0xff, 0x98, 0x96, 0x94, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0x54, 0x53, 0x50, 0xff, 0x38, 0x37, 0x34, 0xff, 0x3c, 0x3b, 0x38, 0xff, 0x39, 0x38, 0x35, 0xff, 0xb5, 0xb3, 0xb1, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0x3a, 0x39, 0x37, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3e, 0x3e, 0x3a, 0xff, 0x3f, 0x3e, 0x3a, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x34, 0x33, 0x30, 0xff, 0x9f, 0x9d, 0x9b, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xda, 0xd7, 0xd4, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0x38, 0x37, 0x35, 0xff, 0x3c, 0x3b, 0x38, 0xff, 0x3c, 0x3b, 0x38, 0xff, 0x38, 0x37, 0x34, 0xff, 0xb3, 0xb0, 0xae, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xa9, 0xa7, 0xa5, 0xff, 0x8a, 0x89, 0x89, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0xa3, 0xa3, 0xff, 0x89, 0x87, 0x86, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0x55, 0x53, 0x51, 0xff, 0x36, 0x34, 0x32, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x35, 0x34, 0x31, 0xff, 0x58, 0x56, 0x54, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0x81, 0x7f, 0x7d, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x3d, 0x3b, 0x38, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x34, 0x32, 0x30, 0xff, 0x52, 0x51, 0x4f, 0xff, 0xc9, 0xc6, 0xc4, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xc0, 0xbe, 0xbb, 0xff, 0xb3, 0xb1, 0xae, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0x3a, 0x39, 0x37, 0xff, 0x3a, 0x38, 0x36, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x35, 0x34, 0x32, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0xd9, 0xd7, 0xd4, 0xff, 0xb0, 0xae, 0xab, 0xff, 0x37, 0x36, 0x34, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x72, 0x71, 0x6e, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0x77, 0x76, 0x73, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x39, 0x37, 0x34, 0xff, 0x38, 0x36, 0x34, 0xff, 0x3f, 0x3e, 0x3c, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xcd, 0xca, 0xc8, 0xff, 0x58, 0x57, 0x55, 0xff, 0x35, 0x34, 0x31, 0xff, 0x3b, 0x3a, 0x37, 0xff, 0x36, 0x35, 0x33, 0xff, 0xad, 0xab, 0xa8, 0xff, 0xd9, 0xd6, 0xd3, 0xff, 0x83, 0x81, 0x7f, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x3d, 0x3b, 0x38, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x3d, 0x3c, 0x39, 0xff, 0x34, 0x32, 0x30, 0xff, 0x51, 0x4f, 0x4d, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xba, 0xb7, 0xb5, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd8, 0xd6, 0xd3, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0x9c, 0x9a, 0x98, 0xff, 0x33, 0x32, 0x30, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3a, 0x38, 0x35, 0xff, 0x3b, 0x3a, 0x38, 0xff, 0xbd, 0xba, 0xb8, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xa0, 0x9e, 0x9c, 0xff, 0x90, 0x90, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xbe, 0xbe, 0xff, 0x7d, 0x7b, 0x7a, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0x6d, 0x6b, 0x69, 0xff, 0x30, 0x2e, 0x2c, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x39, 0x37, 0x34, 0xff, 0x39, 0x37, 0x35, 0xff, 0xb2, 0xb0, 0xad, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0x57, 0x56, 0x54, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x37, 0x35, 0x32, 0xff, 0x33, 0x32, 0x30, 0xff, 0x9d, 0x9b, 0x98, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd5, 0xd1, 0xff, 0x86, 0x84, 0x82, 0xff, 0x34, 0x33, 0x31, 0xff, 0x58, 0x57, 0x55, 0xff, 0x7b, 0x79, 0x77, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x94, 0x92, 0x8f, 0xff, 0x80, 0x7e, 0x7c, 0xff, 0x47, 0x46, 0x44, 0xff, 0x32, 0x31, 0x2e, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x34, 0x32, 0x2f, 0xff, 0x49, 0x48, 0x46, 0xff, 0xc5, 0xc2, 0xbf, 0xff, 0xd8, 0xd5, 0xd2, 0xff, 0xa6, 0xa4, 0xa1, 0xff, 0x34, 0x33, 0x31, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x2e, 0x2d, 0x2a, 0xff, 0x78, 0x76, 0x74, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0x9e, 0x9c, 0x99, 0xff, 0x32, 0x31, 0x2e, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x62, 0x61, 0x5e, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd6, 0xd3, 0xd0, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0x5d, 0x5b, 0x59, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x3b, 0x39, 0x36, 0xff, 0x34, 0x33, 0x31, 0xff, 0xa5, 0xa3, 0xa0, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0x32, 0x31, 0x2e, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x3c, 0x3a, 0x37, 0xff, 0x37, 0x35, 0x32, 0xff, 0x33, 0x32, 0x30, 0xff, 0x9c, 0x9a, 0x97, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0x71, 0x6f, 0x6d, 0xff, 0x36, 0x35, 0x33, 0xff, 0x5f, 0x5e, 0x5b, 0xff, 0x7f, 0x7d, 0x7b, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0x93, 0x91, 0x8e, 0xff, 0x79, 0x77, 0x75, 0xff, 0x3f, 0x3d, 0x3b, 0xff, 0x34, 0x33, 0x30, 0xff, 0x3c, 0x3b, 0x37, 0xff, 0x31, 0x2f, 0x2c, 0xff, 0x5c, 0x5b, 0x58, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xd6, 0xd3, 0xd0, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0x8d, 0x8b, 0x89, 0xff, 0xa3, 0xa3, 0xa3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xdf, 0xdf, 0xff, 0x71, 0x70, 0x6f, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0x8b, 0x8a, 0x87, 0xff, 0x2e, 0x2d, 0x2b, 0xff, 0x39, 0x38, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x39, 0x39, 0x35, 0xff, 0x2e, 0x2d, 0x2a, 0xff, 0x79, 0x77, 0x75, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0x47, 0x46, 0x44, 0xff, 0x35, 0x34, 0x31, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x35, 0xff, 0x39, 0x38, 0x35, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x39, 0x38, 0x35, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x81, 0x80, 0x7d, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x2d, 0x2c, 0x29, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x2d, 0x2c, 0x29, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x2d, 0x2c, 0x2a, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x39, 0x38, 0x35, 0xff, 0x34, 0x33, 0x30, 0xff, 0x30, 0x30, 0x2d, 0xff, 0x92, 0x90, 0x8d, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0x9c, 0x9a, 0x97, 0xff, 0x32, 0x31, 0x2f, 0xff, 0x39, 0x38, 0x35, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x7d, 0x7b, 0x79, 0xff, 0xd7, 0xd5, 0xd2, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x36, 0x35, 0x32, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x2e, 0x2d, 0x2b, 0xff, 0x8d, 0x8b, 0x88, 0xff, 0xd7, 0xd4, 0xd1, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xcf, 0xcd, 0xca, 0xff, 0x61, 0x60, 0x5d, 0xff, 0x30, 0x30, 0x2d, 0xff, 0x39, 0x38, 0x35, 0xff, 0x31, 0x31, 0x2e, 0xff, 0x9c, 0x9a, 0x98, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0x50, 0x4f, 0x4d, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x39, 0x38, 0x35, 0xff, 0x39, 0x38, 0x35, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x3a, 0x39, 0x36, 0xff, 0x39, 0x38, 0x35, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0x81, 0x7f, 0x7c, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xc8, 0xc5, 0xc3, 0xff, 0x4c, 0x4b, 0x49, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x2d, 0x2c, 0x29, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0x2d, 0x2c, 0x2a, 0xff, 0x34, 0x33, 0x30, 0xff, 0x3a, 0x38, 0x35, 0xff, 0x32, 0x31, 0x2e, 0xff, 0x37, 0x36, 0x34, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xd6, 0xd3, 0xd0, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0x74, 0x74, 0x73, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf3, 0xf3, 0xff, 0x79, 0x79, 0x78, 0xff, 0xb5, 0xb3, 0xb0, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xb1, 0xaf, 0xac, 0xff, 0x36, 0x34, 0x32, 0xff, 0x35, 0x34, 0x31, 0xff, 0x38, 0x37, 0x34, 0xff, 0x38, 0x36, 0x33, 0xff, 0x38, 0x36, 0x33, 0xff, 0x38, 0x36, 0x33, 0xff, 0x38, 0x36, 0x33, 0xff, 0x38, 0x37, 0x34, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x3c, 0x3b, 0x39, 0xff, 0xb2, 0xb0, 0xae, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0x5e, 0x5c, 0x5a, 0xff, 0x2b, 0x2a, 0x27, 0xff, 0x34, 0x33, 0x30, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x2c, 0x2b, 0x28, 0xff, 0x2c, 0x2a, 0x28, 0xff, 0x2e, 0x2d, 0x2b, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x35, 0x34, 0x31, 0xff, 0x35, 0x34, 0x31, 0xff, 0x34, 0x33, 0x30, 0xff, 0x30, 0x2e, 0x2c, 0xff, 0x2b, 0x2a, 0x28, 0xff, 0x3f, 0x3e, 0x3c, 0xff, 0x8d, 0x8b, 0x89, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0x48, 0x47, 0x45, 0xff, 0x28, 0x28, 0x25, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x34, 0x33, 0x30, 0xff, 0x35, 0x34, 0x31, 0xff, 0x35, 0x33, 0x31, 0xff, 0x35, 0x33, 0x30, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x2b, 0x2a, 0x28, 0xff, 0x39, 0x38, 0x36, 0xff, 0x88, 0x86, 0x83, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd6, 0xd3, 0xd0, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x31, 0x2f, 0x2d, 0xff, 0x27, 0x26, 0x24, 0xff, 0x81, 0x80, 0x7d, 0xff, 0xd6, 0xd4, 0xd1, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0x5e, 0x5c, 0x5a, 0xff, 0x25, 0x24, 0x22, 0xff, 0x29, 0x28, 0x25, 0xff, 0x35, 0x34, 0x32, 0xff, 0xb5, 0xb3, 0xb0, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0x64, 0x62, 0x60, 0xff, 0x28, 0x27, 0x24, 0xff, 0x31, 0x2f, 0x2d, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x92, 0x91, 0x8e, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0x71, 0x6f, 0x6d, 0xff, 0x29, 0x28, 0x25, 0xff, 0x32, 0x31, 0x2e, 0xff, 0x2f, 0x2e, 0x2b, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2e, 0x2d, 0x2b, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x35, 0x34, 0x31, 0xff, 0x35, 0x34, 0x31, 0xff, 0x34, 0x33, 0x30, 0xff, 0x30, 0x2e, 0x2c, 0xff, 0x2b, 0x2a, 0x28, 0xff, 0x3e, 0x3d, 0x3b, 0xff, 0x8c, 0x8a, 0x88, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xba, 0xb7, 0xb5, 0xff, 0x39, 0x38, 0x36, 0xff, 0x2a, 0x29, 0x26, 0xff, 0x32, 0x30, 0x2e, 0xff, 0x35, 0x33, 0x30, 0xff, 0x35, 0x34, 0x31, 0xff, 0x35, 0x34, 0x31, 0xff, 0x34, 0x33, 0x30, 0xff, 0x30, 0x2f, 0x2d, 0xff, 0x2b, 0x2b, 0x28, 0xff, 0x40, 0x3f, 0x3d, 0xff, 0x97, 0x95, 0x92, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd5, 0xd3, 0xd0, 0xff, 0xaa, 0xa8, 0xa6, 0xff, 0x78, 0x78, 0x78, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x99, 0x99, 0x99, 0xff, 0x92, 0x90, 0x8e, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0x56, 0x54, 0x53, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x37, 0x35, 0x32, 0xff, 0x2c, 0x2b, 0x28, 0xff, 0x5c, 0x5b, 0x59, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0x58, 0x56, 0x54, 0xff, 0x3e, 0x3c, 0x3b, 0xff, 0x4c, 0x4a, 0x48, 0xff, 0x74, 0x73, 0x70, 0xff, 0x86, 0x84, 0x82, 0xff, 0x5d, 0x5c, 0x5a, 0xff, 0x40, 0x3e, 0x3d, 0xff, 0x35, 0x34, 0x32, 0xff, 0x35, 0x33, 0x32, 0xff, 0x3c, 0x3b, 0x39, 0xff, 0x54, 0x52, 0x51, 0xff, 0x7f, 0x7e, 0x7b, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xa6, 0xa4, 0xa1, 0xff, 0x74, 0x72, 0x70, 0xff, 0x52, 0x50, 0x4e, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x35, 0x34, 0x32, 0xff, 0x35, 0x33, 0x31, 0xff, 0x3a, 0x39, 0x37, 0xff, 0x4f, 0x4d, 0x4c, 0xff, 0x76, 0x74, 0x72, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0xd1, 0xce, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd4, 0xd2, 0xce, 0xff, 0xa0, 0x9e, 0x9b, 0xff, 0x55, 0x53, 0x52, 0xff, 0x54, 0x52, 0x50, 0xff, 0x54, 0x53, 0x51, 0xff, 0x9d, 0x9b, 0x99, 0xff, 0xd4, 0xd2, 0xcf, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd3, 0xd1, 0xcd, 0xff, 0xa7, 0xa4, 0xa2, 0xff, 0x7b, 0x79, 0x77, 0xff, 0x7b, 0x79, 0x77, 0xff, 0x90, 0x8e, 0x8b, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0x87, 0x85, 0x83, 0xff, 0x52, 0x50, 0x4e, 0xff, 0x54, 0x52, 0x51, 0xff, 0x57, 0x55, 0x53, 0xff, 0xa4, 0xa2, 0x9f, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0x6e, 0x6d, 0x6a, 0xff, 0x4d, 0x4c, 0x4a, 0xff, 0x5b, 0x59, 0x57, 0xff, 0x83, 0x80, 0x7e, 0xff, 0x8a, 0x88, 0x86, 0xff, 0x5d, 0x5b, 0x5a, 0xff, 0x40, 0x3e, 0x3d, 0xff, 0x35, 0x34, 0x32, 0xff, 0x35, 0x33, 0x31, 0xff, 0x3c, 0x3a, 0x39, 0xff, 0x54, 0x52, 0x50, 0xff, 0x7f, 0x7d, 0x7a, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0x9e, 0x9c, 0x99, 0xff, 0x6d, 0x6c, 0x6a, 0xff, 0x4e, 0x4c, 0x4a, 0xff, 0x3b, 0x39, 0x37, 0xff, 0x35, 0x33, 0x31, 0xff, 0x35, 0x34, 0x32, 0xff, 0x3d, 0x3b, 0x39, 0xff, 0x54, 0x52, 0x50, 0xff, 0x7e, 0x7c, 0x7a, 0xff, 0xb7, 0xb5, 0xb2, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0x70, 0x6f, 0x6e, 0xff, 0xbd, 0xbd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x75, 0x74, 0x73, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0x8d, 0x8b, 0x89, 0xff, 0x2b, 0x2a, 0x28, 0xff, 0x34, 0x33, 0x30, 0xff, 0x35, 0x33, 0x31, 0xff, 0x34, 0x33, 0x31, 0xff, 0x34, 0x33, 0x31, 0xff, 0x34, 0x33, 0x31, 0xff, 0x34, 0x33, 0x31, 0xff, 0x35, 0x33, 0x31, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x6b, 0x6a, 0x67, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0xc1, 0xbe, 0xbc, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xc1, 0xbf, 0xbc, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xbf, 0xbd, 0xba, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xc0, 0xbd, 0xba, 0xff, 0xb9, 0xb6, 0xb4, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xbe, 0xbc, 0xb9, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xc9, 0xc6, 0xc4, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc4, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd5, 0xd2, 0xcf, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xc7, 0xc4, 0xc1, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0xd3, 0xd1, 0xce, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xc1, 0xbf, 0xbc, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xbf, 0xbd, 0xba, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd4, 0xd1, 0xce, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xc7, 0xc4, 0xc1, 0xff, 0xbf, 0xbc, 0xb9, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xb8, 0xb6, 0xb4, 0xff, 0xc0, 0xbd, 0xba, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0x7e, 0x7d, 0x7b, 0xff, 0x92, 0x92, 0x92, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0x74, 0x74, 0x74, 0xff, 0xb1, 0xaf, 0xad, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xc0, 0xbd, 0xbb, 0xff, 0x47, 0x46, 0x44, 0xff, 0x2c, 0x2b, 0x28, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x33, 0x31, 0x2f, 0xff, 0x33, 0x32, 0x2f, 0xff, 0x31, 0x30, 0x2d, 0xff, 0x29, 0x28, 0x26, 0xff, 0x5d, 0x5c, 0x5a, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd1, 0xcd, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xbe, 0xbb, 0xb9, 0xff, 0x83, 0x82, 0x81, 0xff, 0x9f, 0x9d, 0x9b, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd1, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xd0, 0xcd, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0x79, 0x77, 0x76, 0xff, 0x8a, 0x8a, 0x89, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0xa7, 0xa7, 0xff, 0x81, 0x7f, 0x7d, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x30, 0x2e, 0x2c, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2d, 0xff, 0x32, 0x30, 0x2e, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x28, 0x26, 0x24, 0xff, 0x3c, 0x3b, 0x39, 0xff, 0x7c, 0x7b, 0x78, 0xff, 0xb4, 0xb1, 0xaf, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xbd, 0xba, 0xb7, 0xff, 0xa2, 0xa0, 0x9d, 0xff, 0xc4, 0xc1, 0xbe, 0xff, 0xd0, 0xce, 0xcb, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xbe, 0xbb, 0xb8, 0xff, 0x95, 0x93, 0x91, 0xff, 0x6e, 0x6d, 0x6b, 0xff, 0x9b, 0x99, 0x97, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xaa, 0xa7, 0xa5, 0xff, 0xb6, 0xb4, 0xb1, 0xff, 0xc5, 0xc3, 0xc0, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xbf, 0xbc, 0xba, 0xff, 0x9b, 0x99, 0x96, 0xff, 0xaa, 0xa8, 0xa5, 0xff, 0xcc, 0xc9, 0xc7, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc7, 0xc4, 0xc1, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xd3, 0xd0, 0xcd, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd2, 0xd0, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0x8e, 0x8c, 0x8a, 0xff, 0x6d, 0x6c, 0x6b, 0xff, 0x8d, 0x8d, 0x8d, 0xff, 0x77, 0x76, 0x76, 0xff, 0x79, 0x78, 0x76, 0xff, 0xa4, 0xa2, 0xa0, 0xff, 0xc2, 0xc0, 0xbd, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xd2, 0xcf, 0xcc, 0xff, 0xcb, 0xc8, 0xc6, 0xff, 0xba, 0xb7, 0xb5, 0xff, 0x8e, 0x8c, 0x8a, 0xff, 0x6d, 0x6c, 0x6b, 0xff, 0xa2, 0xa2, 0xa2, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xe6, 0xe6, 0xff, 0x6e, 0x6e, 0x6d, 0xff, 0xb4, 0xb1, 0xaf, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xc7, 0xc5, 0xc2, 0xff, 0x5f, 0x5e, 0x5c, 0xff, 0x25, 0x24, 0x22, 0xff, 0x2f, 0x2e, 0x2b, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x2f, 0x2f, 0x2c, 0xff, 0x2f, 0x2f, 0x2c, 0xff, 0x2f, 0x2f, 0x2c, 0xff, 0x2f, 0x2f, 0x2c, 0xff, 0x2f, 0x2f, 0x2c, 0xff, 0x30, 0x2f, 0x2c, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x26, 0x25, 0x23, 0xff, 0x35, 0x34, 0x32, 0xff, 0x59, 0x58, 0x56, 0xff, 0x7a, 0x79, 0x76, 0xff, 0x91, 0x8f, 0x8c, 0xff, 0x9f, 0x9d, 0x9a, 0xff, 0xa5, 0xa2, 0xa0, 0xff, 0xa2, 0xa0, 0x9d, 0xff, 0x99, 0x97, 0x94, 0xff, 0x89, 0x87, 0x85, 0xff, 0x74, 0x73, 0x71, 0xff, 0x5a, 0x59, 0x57, 0xff, 0x3b, 0x3a, 0x38, 0xff, 0x2f, 0x2e, 0x2c, 0xff, 0xa1, 0x9e, 0x9c, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xc1, 0xbe, 0xbc, 0xff, 0x7a, 0x79, 0x77, 0xff, 0x84, 0x83, 0x81, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x97, 0x95, 0x93, 0xff, 0x98, 0x96, 0x93, 0xff, 0x91, 0x8f, 0x8d, 0xff, 0x87, 0x85, 0x83, 0xff, 0x77, 0x76, 0x74, 0xff, 0x6f, 0x6e, 0x6d, 0xff, 0x8f, 0x8f, 0x8e, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0x7c, 0x7c, 0x7b, 0xff, 0x72, 0x72, 0x71, 0xff, 0x81, 0x80, 0x7f, 0xff, 0x83, 0x82, 0x80, 0xff, 0x83, 0x81, 0x80, 0xff, 0x83, 0x82, 0x80, 0xff, 0x81, 0x80, 0x7f, 0xff, 0x72, 0x71, 0x70, 0xff, 0x74, 0x73, 0x73, 0xff, 0x71, 0x71, 0x70, 0xff, 0x6e, 0x6d, 0x6c, 0xff, 0x6f, 0x6e, 0x6d, 0xff, 0x6f, 0x6e, 0x6d, 0xff, 0x6e, 0x6e, 0x6c, 0xff, 0x6e, 0x6e, 0x6c, 0xff, 0x80, 0x80, 0x80, 0xff, 0x72, 0x72, 0x71, 0xff, 0x76, 0x75, 0x74, 0xff, 0x82, 0x81, 0x7f, 0xff, 0x83, 0x82, 0x80, 0xff, 0x83, 0x81, 0x80, 0xff, 0x83, 0x82, 0x80, 0xff, 0x81, 0x80, 0x7f, 0xff, 0x74, 0x73, 0x72, 0xff, 0x6f, 0x6e, 0x6d, 0xff, 0x80, 0x7e, 0x7c, 0xff, 0x85, 0x85, 0x83, 0xff, 0x80, 0x80, 0x7e, 0xff, 0x73, 0x72, 0x71, 0xff, 0x72, 0x71, 0x70, 0xff, 0x82, 0x81, 0x7f, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x97, 0x95, 0x93, 0xff, 0x98, 0x96, 0x94, 0xff, 0x90, 0x8e, 0x8c, 0xff, 0x84, 0x84, 0x82, 0xff, 0x76, 0x74, 0x73, 0xff, 0x6f, 0x6f, 0x6e, 0xff, 0x96, 0x95, 0x95, 0xff, 0xd8, 0xd8, 0xd8, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xef, 0xef, 0xef, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0x80, 0x80, 0x80, 0xff, 0x6d, 0x6d, 0x6c, 0xff, 0x79, 0x78, 0x77, 0xff, 0x87, 0x85, 0x83, 0xff, 0x90, 0x8e, 0x8c, 0xff, 0x98, 0x96, 0x93, 0xff, 0x98, 0x95, 0x93, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x85, 0x83, 0x81, 0xff, 0x75, 0x74, 0x73, 0xff, 0x6f, 0x6e, 0x6e, 0xff, 0x95, 0x95, 0x95, 0xff, 0xd8, 0xd8, 0xd8, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0x79, 0x78, 0x77, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xd0, 0xcd, 0xca, 0xff, 0xb5, 0xb3, 0xb0, 0xff, 0x45, 0x44, 0x42, 0xff, 0x25, 0x24, 0x22, 0xff, 0x2e, 0x2d, 0x2a, 0xff, 0x2e, 0x2d, 0x2a, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x2e, 0x2c, 0x2a, 0xff, 0x2e, 0x2d, 0x2a, 0xff, 0x2e, 0x2d, 0x2b, 0xff, 0x2d, 0x2c, 0x2a, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x26, 0x25, 0x23, 0xff, 0x24, 0x23, 0x21, 0xff, 0x28, 0x27, 0x25, 0xff, 0x2b, 0x2a, 0x28, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2b, 0x2a, 0x29, 0xff, 0x29, 0x28, 0x27, 0xff, 0x26, 0x25, 0x23, 0xff, 0x23, 0x22, 0x20, 0xff, 0x26, 0x25, 0x23, 0xff, 0x2a, 0x29, 0x27, 0xff, 0x24, 0x23, 0x21, 0xff, 0x83, 0x82, 0x7f, 0xff, 0xd1, 0xce, 0xcb, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xc2, 0xbf, 0xbc, 0xff, 0x5d, 0x5c, 0x5b, 0xff, 0x94, 0x94, 0x94, 0xff, 0x9d, 0x9c, 0x9c, 0xff, 0x94, 0x94, 0x93, 0xff, 0x93, 0x93, 0x93, 0xff, 0x9a, 0x9a, 0x9a, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0xb1, 0xb1, 0xb1, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0xce, 0xce, 0xce, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xe5, 0xe5, 0xe5, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xe3, 0xe3, 0xe3, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xfa, 0xfa, 0xfa, 0xff, 0xef, 0xef, 0xef, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0xb1, 0xb1, 0xb1, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xd7, 0xd7, 0xd7, 0xff, 0xb8, 0xb8, 0xb8, 0xff, 0xab, 0xab, 0xab, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0x94, 0x94, 0x93, 0xff, 0x94, 0x94, 0x94, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0xab, 0xab, 0xaa, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xef, 0xef, 0xef, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xe4, 0xe4, 0xe4, 0xff, 0xc2, 0xc2, 0xc2, 0xff, 0xa8, 0xa9, 0xa8, 0xff, 0x9a, 0x9a, 0x9a, 0xff, 0x93, 0x93, 0x93, 0xff, 0x94, 0x94, 0x93, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xca, 0xca, 0xca, 0xff, 0xed, 0xed, 0xed, 0xff, 0xfd, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0x79, 0x79, 0x78, 0xff, 0x9a, 0x98, 0x96, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0xa8, 0xa5, 0xa3, 0xff, 0x3e, 0x3c, 0x3b, 0xff, 0x23, 0x22, 0x20, 0xff, 0x2c, 0x2a, 0x28, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2c, 0x2b, 0x29, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2c, 0x2a, 0x28, 0xff, 0x2b, 0x2a, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2c, 0x2a, 0x28, 0xff, 0x2c, 0x2b, 0x28, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x2d, 0x2b, 0x29, 0xff, 0x22, 0x21, 0x1f, 0xff, 0x68, 0x66, 0x64, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0x77, 0x76, 0x75, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xeb, 0xeb, 0xeb, 0xff, 0xe5, 0xe5, 0xe5, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0x6a, 0x69, 0x69, 0xff, 0xb1, 0xaf, 0xad, 0xff, 0xce, 0xcc, 0xc9, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0xa7, 0xa5, 0xa3, 0xff, 0x44, 0x43, 0x41, 0xff, 0x21, 0x20, 0x1e, 0xff, 0x29, 0x28, 0x25, 0xff, 0x2b, 0x2a, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x29, 0x27, 0xff, 0x2b, 0x2a, 0x27, 0xff, 0x24, 0x23, 0x21, 0xff, 0x4c, 0x4b, 0x49, 0xff, 0xc4, 0xc1, 0xbe, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xcf, 0xcc, 0xc9, 0xff, 0x84, 0x83, 0x81, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0x6d, 0x6b, 0x6a, 0xff, 0xba, 0xb8, 0xb5, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xcd, 0xcb, 0xc8, 0xff, 0xb4, 0xb2, 0xaf, 0xff, 0x5f, 0x5d, 0x5b, 0xff, 0x24, 0x24, 0x22, 0xff, 0x22, 0x21, 0x1f, 0xff, 0x28, 0x27, 0x25, 0xff, 0x29, 0x28, 0x26, 0xff, 0x29, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x28, 0x28, 0x25, 0xff, 0x29, 0x28, 0x25, 0xff, 0x25, 0x24, 0x22, 0xff, 0x34, 0x33, 0x31, 0xff, 0xb8, 0xb6, 0xb3, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xce, 0xcb, 0xc8, 0xff, 0x97, 0x95, 0x93, 0xff, 0x90, 0x90, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xa4, 0xa4, 0xa4, 0xff, 0x6f, 0x6e, 0x6c, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xcc, 0xca, 0xc7, 0xff, 0xc4, 0xc1, 0xbe, 0xff, 0x8d, 0x8b, 0x89, 0xff, 0x43, 0x42, 0x40, 0xff, 0x21, 0x20, 0x1f, 0xff, 0x20, 0x1f, 0x1d, 0xff, 0x25, 0x23, 0x21, 0xff, 0x27, 0x25, 0x23, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x27, 0x26, 0x24, 0xff, 0x24, 0x23, 0x21, 0xff, 0x24, 0x23, 0x22, 0xff, 0x9f, 0x9d, 0x9b, 0xff, 0xcd, 0xca, 0xc7, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xaf, 0xad, 0xaa, 0xff, 0x78, 0x77, 0x77, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xf9, 0xff, 0xa4, 0xa4, 0xa4, 0xff, 0x6c, 0x6a, 0x69, 0xff, 0xaf, 0xac, 0xaa, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xbb, 0xb9, 0xb6, 0xff, 0x89, 0x87, 0x85, 0xff, 0x4f, 0x4e, 0x4c, 0xff, 0x2a, 0x2a, 0x28, 0xff, 0x1f, 0x1e, 0x1c, 0xff, 0x1d, 0x1c, 0x1a, 0xff, 0x21, 0x1f, 0x1e, 0xff, 0x23, 0x21, 0x20, 0xff, 0x24, 0x22, 0x20, 0xff, 0x24, 0x23, 0x21, 0xff, 0x24, 0x23, 0x21, 0xff, 0x25, 0x23, 0x21, 0xff, 0x24, 0x23, 0x21, 0xff, 0x24, 0x23, 0x21, 0xff, 0x23, 0x22, 0x20, 0xff, 0x23, 0x22, 0x20, 0xff, 0x21, 0x20, 0x1e, 0xff, 0x1e, 0x1d, 0x1b, 0xff, 0x1d, 0x1d, 0x1b, 0xff, 0x25, 0x24, 0x23, 0xff, 0x45, 0x44, 0x42, 0xff, 0xa6, 0xa4, 0xa1, 0xff, 0xcc, 0xc9, 0xc6, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xb9, 0xb7, 0xb4, 0xff, 0x70, 0x6f, 0x6f, 0xff, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xfb, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0x69, 0x69, 0x68, 0xff, 0x97, 0x96, 0x93, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xcb, 0xc9, 0xc6, 0xff, 0xc2, 0xc0, 0xbd, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0x81, 0x7f, 0x7d, 0xff, 0x5f, 0x5d, 0x5b, 0xff, 0x43, 0x42, 0x41, 0xff, 0x30, 0x2f, 0x2d, 0xff, 0x28, 0x27, 0x25, 0xff, 0x25, 0x24, 0x23, 0xff, 0x24, 0x23, 0x21, 0xff, 0x24, 0x22, 0x21, 0xff, 0x24, 0x23, 0x21, 0xff, 0x25, 0x24, 0x23, 0xff, 0x28, 0x27, 0x25, 0xff, 0x30, 0x2f, 0x2d, 0xff, 0x41, 0x40, 0x3e, 0xff, 0x59, 0x58, 0x56, 0xff, 0x77, 0x75, 0x73, 0xff, 0x9d, 0x9a, 0x98, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xc9, 0xc7, 0xc4, 0xff, 0xcb, 0xc9, 0xc5, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0x7a, 0x7a, 0x79, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xd2, 0xd2, 0xff, 0x79, 0x79, 0x78, 0xff, 0x76, 0x74, 0x72, 0xff, 0xad, 0xab, 0xa8, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xc6, 0xc4, 0xc1, 0xff, 0xbd, 0xbb, 0xb8, 0xff, 0xb5, 0xb3, 0xb0, 0xff, 0xa9, 0xa7, 0xa4, 0xff, 0x9e, 0x9b, 0x99, 0xff, 0x97, 0x95, 0x93, 0xff, 0x96, 0x94, 0x91, 0xff, 0x98, 0x96, 0x94, 0xff, 0x9f, 0x9d, 0x9a, 0xff, 0xaa, 0xa8, 0xa5, 0xff, 0xb5, 0xb3, 0xb0, 0xff, 0xbc, 0xba, 0xb7, 0xff, 0xc5, 0xc2, 0xbf, 0xff, 0xcb, 0xc8, 0xc5, 0xff, 0xca, 0xc8, 0xc5, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc8, 0xc6, 0xc3, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc3, 0xc1, 0xbe, 0xff, 0x75, 0x74, 0x73, 0xff, 0xab, 0xab, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xab, 0xab, 0xab, 0xff, 0x6f, 0x6d, 0x6c, 0xff, 0x7b, 0x7a, 0x78, 0xff, 0xa9, 0xa6, 0xa4, 0xff, 0xc3, 0xc0, 0xbd, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xca, 0xc6, 0xc3, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xca, 0xc7, 0xc4, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xb1, 0xaf, 0xac, 0xff, 0x78, 0x76, 0x74, 0xff, 0x83, 0x83, 0x83, 0xff, 0xf1, 0xf1, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0x73, 0x73, 0x73, 0xff, 0x70, 0x6e, 0x6d, 0xff, 0x8b, 0x89, 0x87, 0xff, 0xab, 0xa9, 0xa6, 0xff, 0xbd, 0xba, 0xb7, 0xff, 0xc5, 0xc2, 0xbf, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc8, 0xc5, 0xc2, 0xff, 0xc9, 0xc5, 0xc2, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc9, 0xc6, 0xc3, 0xff, 0xc6, 0xc3, 0xc0, 0xff, 0xbf, 0xbc, 0xb9, 0xff, 0xb2, 0xb0, 0xad, 0xff, 0x95, 0x93, 0x90, 0xff, 0x77, 0x76, 0x75, 0xff, 0x6c, 0x6c, 0x6b, 0xff, 0x9f, 0x9f, 0x9f, 0xff, 0xef, 0xef, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf2, 0xf2, 0xff, 0xc7, 0xc7, 0xc7, 0xff, 0x98, 0x98, 0x97, 0xff, 0x76, 0x76, 0x75, 0xff, 0x6d, 0x6c, 0x6b, 0xff, 0x78, 0x76, 0x75, 0xff, 0x83, 0x81, 0x7f, 0xff, 0x8f, 0x8d, 0x8a, 0xff, 0x9a, 0x98, 0x96, 0xff, 0xa3, 0xa1, 0x9e, 0xff, 0xa8, 0xa6, 0xa3, 0xff, 0xa9, 0xa7, 0xa4, 0xff, 0xa8, 0xa5, 0xa3, 0xff, 0xa3, 0xa0, 0x9e, 0xff, 0x9a, 0x98, 0x95, 0xff, 0x8f, 0x8d, 0x8b, 0xff, 0x84, 0x82, 0x80, 0xff, 0x7b, 0x79, 0x78, 0xff, 0x6f, 0x6e, 0x6c, 0xff, 0x71, 0x70, 0x70, 0xff, 0x8c, 0x8b, 0x8b, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0xe8, 0xe8, 0xe8, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0xdb, 0xdb, 0xdb, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0x89, 0x89, 0x88, 0xff, 0x7b, 0x7b, 0x7a, 0xff, 0x72, 0x71, 0x70, 0xff, 0x6c, 0x6b, 0x6b, 0xff, 0x6a, 0x6a, 0x69, 0xff, 0x6c, 0x6c, 0x6b, 0xff, 0x72, 0x72, 0x71, 0xff, 0x7b, 0x7b, 0x7b, 0xff, 0x89, 0x89, 0x89, 0xff, 0x9a, 0x9a, 0x99, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0xd4, 0xd4, 0xd4, 0xff, 0xee, 0xee, 0xee, 0xff, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, ColorDepth.ColorDepth32); + + Console.WriteLine("Press any key to continue!"); + Console.ReadKey(true); + // Create new instance of FullScreenCanvas, using default graphics mode + canvas = FullScreenCanvas.GetFullScreenCanvas(); // canvas = GetFullScreenCanvas(start); + + /* Clear the Screen with the color 'Blue' */ + canvas.Clear(Color.Blue); + } + + protected override void Run() + { + try + { + mDebugger.Send("Run"); + + /* A red Point */ + canvas.DrawPoint(Color.Red, 69, 69); + + /* A GreenYellow horizontal line */ + canvas.DrawLine(Color.GreenYellow, 250, 100, 400, 100); + + /* An IndianRed vertical line */ + canvas.DrawLine(Color.IndianRed, 350, 150, 350, 250); + + /* A MintCream diagonal line */ + canvas.DrawLine(Color.MintCream, 250, 150, 400, 250); + + /* A PaleVioletRed rectangle */ + canvas.DrawRectangle(Color.PaleVioletRed, 350, 350, 80, 60); + + canvas.DrawCircle(Color.Chartreuse, 69, 69, 10); + + canvas.DrawEllipse(Color.LightSalmon, 400, 300, 100, 150); + + canvas.DrawPolygon(Color.MediumPurple, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275)); + + canvas.DrawFilledEllipse(Color.LightSalmon, 400, 300, 100, 150); + canvas.DrawImage(bitmap, 20, 20); + + /* Cosmos graphics is double-buffered so you need to swap buffers every time user needs to see a picture */ + canvas.Display(); + + /* + * It will be really beautiful to do here: + * canvas.DrawString(pen, "Please press any key to continue the Demo..."); + */ + Console.ReadKey(); + + // Throws a NotImplementedException in VMWare, + // due to being unable to escape from the clutches of the SVGA II driver... + // + // Probably best to leave this commented out until it can work in VMWare as well + canvas.Clear(); + canvas.Disable(); + Console.Clear(); + Console.WriteLine("If it worked, you've successfully returned back to standard VGA Text Mode!"); + Console.WriteLine("Let's try returning back to CGS mode... Press any key!"); + Console.ReadKey(true); + + + /* Let's try to change mode...*/ + + canvas.Mode = new Mode(1024, 768, ColorDepth.ColorDepth32); + + //If the background is not redrawn, it gets corrupted + canvas.Clear(Color.Blue); + + /* A LimeGreen rectangle */ + canvas.DrawRectangle(Color.LimeGreen, 450, 450, 80, 60); + + /* A filled rectange */ + canvas.DrawFilledRectangle(Color.Chocolate, 200, 150, 400, 300); + + canvas.DrawFilledRectangle(Color.Aquamarine, 0, 0, 1024, 150); + + canvas.DrawFilledCircle(Color.Blue, 69, 69, 10); + /* + * It will be really beautiful to do here: + * canvas.DrawString(pen, "Please press any key to end the Demo..."); + */ + Console.ReadKey(); + + Sys.Power.Shutdown(); + } + catch (Exception e) + { + debugger.Send($"Got fatal exception {e.Message}"); + Console.WriteLine($"Got fatal exception {e.Message}"); + } + } + } +} diff --git a/Demos/Guess/GuessKernel.csproj b/Examples/Guess Number Game/GuessKernel.csproj similarity index 96% rename from Demos/Guess/GuessKernel.csproj rename to Examples/Guess Number Game/GuessKernel.csproj index bbaa250fc1..829d94e22f 100644 --- a/Demos/Guess/GuessKernel.csproj +++ b/Examples/Guess Number Game/GuessKernel.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + net6.0 cosmos @@ -56,6 +56,7 @@ + diff --git a/Examples/Guess Number Game/Kernel.cs b/Examples/Guess Number Game/Kernel.cs new file mode 100644 index 0000000000..589ed7f448 --- /dev/null +++ b/Examples/Guess Number Game/Kernel.cs @@ -0,0 +1,66 @@ +using System; + +using Sys = Cosmos.System; + +namespace Guess +{ + public class GuessOS : Sys.Kernel + { + private Random _Random; + private int _Count; + private int _Number; + + protected override void BeforeRun() + { + _Random = new Random(); // random works + + _Count = 0; + _Number = _Random.Next(1, 101); + + Console.Clear(); + + Console.WriteLine("Guess Demo"); + Console.WriteLine("----------"); + Console.WriteLine(); + Console.WriteLine("Please guess a number from 1 to 100."); + Console.WriteLine(); + } + + protected override void Run() + { + _Count++; + + Console.Write($"Guess #{_Count}: "); + + var xGuess = Int32.Parse(Console.ReadLine()); + mDebugger.Send($"Guess#{_Count}: {xGuess}"); + + if (xGuess < _Number) + { + Console.WriteLine("Too low."); + } + else if (xGuess > _Number) + { + Console.WriteLine("Too high."); + } + else + { + Console.WriteLine("You guessed it!"); + Console.WriteLine("Press s to stop or any other key to play again. Thanks for playing!"); + + if (Console.ReadKey(true).Key == ConsoleKey.S) + { + Stop(); + } + + _Number = _Random.Next(1, 100); + _Count = 0; + } + } + + protected override void AfterRun() + { + Sys.Power.Shutdown(); + } + } +} diff --git a/Demos/ZMachine/ZKernel/Kernel.cs b/Examples/ZMachine Emulator/ZKernel/Kernel.cs similarity index 100% rename from Demos/ZMachine/ZKernel/Kernel.cs rename to Examples/ZMachine Emulator/ZKernel/Kernel.cs diff --git a/Demos/ZMachine/ZKernel/ZKernel.csproj b/Examples/ZMachine Emulator/ZKernel/ZKernel.csproj similarity index 86% rename from Demos/ZMachine/ZKernel/ZKernel.csproj rename to Examples/ZMachine Emulator/ZKernel/ZKernel.csproj index dd30b94b37..429c59d0fc 100644 --- a/Demos/ZMachine/ZKernel/ZKernel.csproj +++ b/Examples/ZMachine Emulator/ZKernel/ZKernel.csproj @@ -1,9 +1,12 @@  - netcoreapp2.0 + net6.0 cosmos - VMware + + + + Bochs ELF True MethodFooters @@ -19,11 +22,11 @@ <_DebugMode>Source <_IgnoreDebugStubAttribute>False <_PxeInterface>192.168.211.1 - Use VMware Player or Workstation to deploy and debug. - VMware + Use Bochs emulator to deploy and debug. + Bochs Pipe: Cosmos\Serial - False - False + True + True True MethodFooters Use VMware Player or Workstation to deploy and debug. @@ -34,8 +37,8 @@ False Pipe: Cosmos\Serial 192.168.211.1 - True - True + False + False True MethodFooters Use Bochs emulator to deploy and debug. @@ -70,6 +73,7 @@ + diff --git a/Demos/ZMachine/ZKernel/ZORK1.DAT b/Examples/ZMachine Emulator/ZKernel/ZORK1.DAT similarity index 100% rename from Demos/ZMachine/ZKernel/ZORK1.DAT rename to Examples/ZMachine Emulator/ZKernel/ZORK1.DAT diff --git a/Demos/ZMachine/ZKernel/ZORK2.DAT b/Examples/ZMachine Emulator/ZKernel/ZORK2.DAT similarity index 100% rename from Demos/ZMachine/ZKernel/ZORK2.DAT rename to Examples/ZMachine Emulator/ZKernel/ZORK2.DAT diff --git a/Demos/ZMachine/ZKernel/ZORK3.DAT b/Examples/ZMachine Emulator/ZKernel/ZORK3.DAT similarity index 100% rename from Demos/ZMachine/ZKernel/ZORK3.DAT rename to Examples/ZMachine Emulator/ZKernel/ZORK3.DAT diff --git a/Demos/ZMachine/ZLibrary/Constants/CallType.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/CallType.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/CallType.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/CallType.cs diff --git a/Demos/ZMachine/ZLibrary/Constants/Config.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/Config.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/Config.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/Config.cs diff --git a/Demos/ZMachine/ZLibrary/Constants/FileVersion.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/FileVersion.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/FileVersion.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/FileVersion.cs diff --git a/Demos/ZMachine/ZLibrary/Constants/FontStyle.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/FontStyle.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/FontStyle.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/FontStyle.cs diff --git a/Demos/ZMachine/ZLibrary/Constants/HeaderOffset.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/HeaderOffset.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/HeaderOffset.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/HeaderOffset.cs diff --git a/Demos/ZMachine/ZLibrary/Constants/InterpreterType.cs b/Examples/ZMachine Emulator/ZLibrary/Constants/InterpreterType.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Constants/InterpreterType.cs rename to Examples/ZMachine Emulator/ZLibrary/Constants/InterpreterType.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/IZInput.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/IZInput.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/IZInput.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/IZInput.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/IZOutput.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/IZOutput.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/IZOutput.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/IZOutput.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/IZScreen.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/IZScreen.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/IZScreen.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/IZScreen.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/CATCH.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/CATCH.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/CATCH.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/CATCH.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/EXTENDED.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/EXTENDED.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/EXTENDED.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/EXTENDED.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/NEW_LINE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/NEW_LINE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/NEW_LINE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/NEW_LINE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/NOP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/NOP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/NOP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/NOP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PIRACY.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PIRACY.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PIRACY.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PIRACY.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/POP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/POP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/POP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/POP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PRINT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PRINT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PRINT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PRINT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PRINT_RET.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PRINT_RET.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/PRINT_RET.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/PRINT_RET.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/QUIT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/QUIT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/QUIT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/QUIT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RESTART.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RESTART.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RESTART.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RESTART.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RESTORE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RESTORE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RESTORE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RESTORE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RET_POPPED.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RET_POPPED.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RET_POPPED.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RET_POPPED.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RFALSE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RFALSE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RFALSE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RFALSE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RTRUE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RTRUE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/RTRUE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/RTRUE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/SAVE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/SAVE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/SAVE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/SAVE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/SHOW_STATUS.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/SHOW_STATUS.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/SHOW_STATUS.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/SHOW_STATUS.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/VERIFY.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/VERIFY.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/0OP/VERIFY.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/0OP/VERIFY.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/CALL_1N.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/CALL_1N.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/CALL_1N.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/CALL_1N.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/CALL_1S.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/CALL_1S.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/CALL_1S.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/CALL_1S.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/DEC.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/DEC.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/DEC.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/DEC.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_CHILD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_CHILD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_CHILD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_CHILD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_PARENT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_PARENT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_PARENT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_PARENT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_PROP_LEN.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_PROP_LEN.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_PROP_LEN.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_PROP_LEN.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_SIBLING.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_SIBLING.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/GET_SIBLING.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/GET_SIBLING.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/INC.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/INC.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/INC.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/INC.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/JUMP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/JUMP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/JUMP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/JUMP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/JZ.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/JZ.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/JZ.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/JZ.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/LOAD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/LOAD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/LOAD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/LOAD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/NOT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/NOT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/NOT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/NOT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_ADDR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_ADDR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_ADDR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_ADDR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_OBJ.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_OBJ.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_OBJ.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_OBJ.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_PADDR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_PADDR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/PRINT_PADDR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/PRINT_PADDR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/REMOVE_OBJ.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/REMOVE_OBJ.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/REMOVE_OBJ.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/REMOVE_OBJ.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/RET.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/RET.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/1OP/RET.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/1OP/RET.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/ADD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/ADD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/ADD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/ADD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/AND.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/AND.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/AND.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/AND.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CALL_2N.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CALL_2N.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CALL_2N.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CALL_2N.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CALL_2S.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CALL_2S.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CALL_2S.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CALL_2S.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CLEAR_ATTR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CLEAR_ATTR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/CLEAR_ATTR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/CLEAR_ATTR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/DEC_CHK.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/DEC_CHK.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/DEC_CHK.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/DEC_CHK.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/DIV.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/DIV.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/DIV.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/DIV.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_NEXT_PROP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_NEXT_PROP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_NEXT_PROP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_NEXT_PROP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_PROP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_PROP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_PROP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_PROP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_PROP_ADDR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_PROP_ADDR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/GET_PROP_ADDR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/GET_PROP_ADDR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/ILLEGAL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/ILLEGAL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/ILLEGAL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/ILLEGAL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/INC_CHK.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/INC_CHK.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/INC_CHK.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/INC_CHK.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/INSERT_OBJ.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/INSERT_OBJ.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/INSERT_OBJ.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/INSERT_OBJ.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/JIN.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/JIN.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/JIN.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/JIN.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/LOADB.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/LOADB.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/LOADB.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/LOADB.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/LOADW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/LOADW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/LOADW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/LOADW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/MOD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/MOD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/MOD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/MOD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/MUL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/MUL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/MUL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/MUL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/OR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/OR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/OR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/OR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SET_ATTR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SET_ATTR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SET_ATTR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SET_ATTR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SET_COLOR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SET_COLOR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SET_COLOR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SET_COLOR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/STORE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/STORE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/STORE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/STORE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SUB.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SUB.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/SUB.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/SUB.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/TEST.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/TEST.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/TEST.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/TEST.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/TEST_ATTR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/TEST_ATTR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/TEST_ATTR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/TEST_ATTR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/THROW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/THROW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/2OP/THROW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/2OP/THROW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/Opcode.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/Opcode.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/Opcode.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/Opcode.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/AREAD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/AREAD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/AREAD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/AREAD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/BUFFER_MODE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/BUFFER_MODE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/BUFFER_MODE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/BUFFER_MODE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VN.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VN.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VN.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VN.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VN2.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VN2.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VN2.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VN2.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VS.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VS.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VS.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VS.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VS2.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VS2.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CALL_VS2.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CALL_VS2.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CHECK_ARG_COUNT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CHECK_ARG_COUNT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/CHECK_ARG_COUNT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/CHECK_ARG_COUNT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/COPY_TABLE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/COPY_TABLE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/COPY_TABLE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/COPY_TABLE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ENCODE_TEXT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ENCODE_TEXT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ENCODE_TEXT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ENCODE_TEXT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ERASE_LINE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ERASE_LINE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ERASE_LINE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ERASE_LINE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ERASE_WINDOW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ERASE_WINDOW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ERASE_WINDOW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ERASE_WINDOW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/GET_CURSOR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/GET_CURSOR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/GET_CURSOR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/GET_CURSOR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ILLEGAL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ILLEGAL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/ILLEGAL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/ILLEGAL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/INPUT_STREAM.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/INPUT_STREAM.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/INPUT_STREAM.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/INPUT_STREAM.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JG.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JG.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JG.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JG.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/JL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/JL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/NOT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/NOT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/NOT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/NOT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/OUTPUT_STREAM.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/OUTPUT_STREAM.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/OUTPUT_STREAM.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/OUTPUT_STREAM.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_CHAR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_CHAR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_CHAR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_CHAR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_NUM.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_NUM.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_NUM.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_NUM.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_TABLE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_TABLE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PRINT_TABLE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PRINT_TABLE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PULL.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PULL.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PULL.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PULL.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PUSH.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PUSH.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PUSH.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PUSH.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PUT_PROP.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PUT_PROP.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/PUT_PROP.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/PUT_PROP.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/RANDOM.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/RANDOM.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/RANDOM.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/RANDOM.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/READ_CHAR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/READ_CHAR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/READ_CHAR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/READ_CHAR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SCAN_TABLE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SCAN_TABLE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SCAN_TABLE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SCAN_TABLE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_CURSOR.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_CURSOR.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_CURSOR.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_CURSOR.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_TEXT_STYLE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_TEXT_STYLE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_TEXT_STYLE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_TEXT_STYLE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_WINDOW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_WINDOW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SET_WINDOW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SET_WINDOW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SOUND_EFFECT.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SOUND_EFFECT.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SOUND_EFFECT.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SOUND_EFFECT.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SPLIT_WINDOW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SPLIT_WINDOW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SPLIT_WINDOW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SPLIT_WINDOW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SREAD.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SREAD.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/SREAD.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/SREAD.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/STOREB.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/STOREB.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/STOREB.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/STOREB.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/STOREW.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/STOREW.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/STOREW.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/STOREW.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/TOKENISE.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/TOKENISE.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/Opcodes/VAR/TOKENISE.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/Opcodes/VAR/TOKENISE.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZConsoleScreen.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZConsoleScreen.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZConsoleScreen.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZConsoleScreen.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZInput.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZInput.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZInput.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZInput.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZInterpreter.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZInterpreter.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZInterpreter.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZInterpreter.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZMemory.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZMemory.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZMemory.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZMemory.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZObject.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZObject.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZObject.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZObject.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZOutput.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZOutput.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZOutput.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZOutput.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZRandom.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZRandom.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZRandom.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZRandom.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZStack.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZStack.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZStack.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZStack.cs diff --git a/Demos/ZMachine/ZLibrary/Machine/ZText.cs b/Examples/ZMachine Emulator/ZLibrary/Machine/ZText.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Machine/ZText.cs rename to Examples/ZMachine Emulator/ZLibrary/Machine/ZText.cs diff --git a/Demos/ZMachine/ZLibrary/Story/ZHeader.cs b/Examples/ZMachine Emulator/ZLibrary/Story/ZHeader.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Story/ZHeader.cs rename to Examples/ZMachine Emulator/ZLibrary/Story/ZHeader.cs diff --git a/Demos/ZMachine/ZLibrary/Story/ZStory.cs b/Examples/ZMachine Emulator/ZLibrary/Story/ZStory.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/Story/ZStory.cs rename to Examples/ZMachine Emulator/ZLibrary/Story/ZStory.cs diff --git a/Demos/ZMachine/ZLibrary/ZDebug.cs b/Examples/ZMachine Emulator/ZLibrary/ZDebug.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/ZDebug.cs rename to Examples/ZMachine Emulator/ZLibrary/ZDebug.cs diff --git a/Examples/ZMachine Emulator/ZLibrary/ZLibrary.csproj b/Examples/ZMachine Emulator/ZLibrary/ZLibrary.csproj new file mode 100644 index 0000000000..1a6e62a7df --- /dev/null +++ b/Examples/ZMachine Emulator/ZLibrary/ZLibrary.csproj @@ -0,0 +1,11 @@ + + + + net6.0 + + + + + + + diff --git a/Demos/ZMachine/ZLibrary/ZMachine.cs b/Examples/ZMachine Emulator/ZLibrary/ZMachine.cs similarity index 100% rename from Demos/ZMachine/ZLibrary/ZMachine.cs rename to Examples/ZMachine Emulator/ZLibrary/ZMachine.cs diff --git a/Demos/ZMachine/ZTestConsoleApp/Program.cs b/Examples/ZMachine Emulator/ZTestConsoleApp/Program.cs similarity index 100% rename from Demos/ZMachine/ZTestConsoleApp/Program.cs rename to Examples/ZMachine Emulator/ZTestConsoleApp/Program.cs diff --git a/Examples/ZMachine Emulator/ZTestConsoleApp/ZTestConsoleApp.csproj b/Examples/ZMachine Emulator/ZTestConsoleApp/ZTestConsoleApp.csproj new file mode 100644 index 0000000000..bcb8b6033b --- /dev/null +++ b/Examples/ZMachine Emulator/ZTestConsoleApp/ZTestConsoleApp.csproj @@ -0,0 +1,13 @@ + + + + Exe + net6.0 + AnyCPU;x86 + + + + + + + diff --git a/Demos/ZMachine/z-spec10.pdf b/Examples/ZMachine Emulator/z-spec10.pdf similarity index 100% rename from Demos/ZMachine/z-spec10.pdf rename to Examples/ZMachine Emulator/z-spec10.pdf diff --git a/IDE.sln b/IDE.sln index 3b2a457cb2..57dd53be1b 100644 --- a/IDE.sln +++ b/IDE.sln @@ -1,20 +1,18 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32210.238 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deploy", "Deploy", "{BDFC9BA8-F528-43B5-92D0-497579E55065}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debug", "Debug", "{F7C6CA93-1D02-443C-9C8B-A1988DE0306B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.Assembler", "..\XSharp\source\XSharp.Assembler\XSharp.Assembler.csproj", "{0CDB3F6E-7971-426B-81F8-38B966A54C2B}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Common", "..\Common\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{F74A4B2B-02DA-455A-89FB-803A442B5B2C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Common", "source\Cosmos.Debug.Common\Cosmos.Debug.Common.csproj", "{A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.DebugConnectors", "source\Cosmos.Debug.DebugConnectors\Cosmos.Debug.DebugConnectors.csproj", "{BA661F30-9F3B-4356-B47B-D9C9375A473B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core.DebugStub", "source\Cosmos.Core.DebugStub\Cosmos.Core.DebugStub.csproj", "{5049175E-F1EE-4D8F-8354-F547444B8F10}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core.DebugStub", "..\IL2CPU\source\Cosmos.Core.DebugStub\Cosmos.Core.DebugStub.csproj", "{5049175E-F1EE-4D8F-8354-F547444B8F10}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.GDB", "source\Cosmos.Debug.GDB\Cosmos.Debug.GDB.csproj", "{3370FC04-B669-46A4-A4AA-A89540318F8D}" EndProject @@ -30,42 +28,34 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Visual Studio", "Visual Stu EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XSharp", "XSharp", "{E9CD521E-C386-466D-B5F7-A5EB19A61625}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp.csproj", "{72EB557A-8A2D-4B0F-823E-C70A791831B5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp\XSharp.csproj", "{72EB557A-8A2D-4B0F-823E-C70A791831B5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.VS.DebugEngine", "source\Cosmos.VS.DebugEngine\Cosmos.VS.DebugEngine.csproj", "{535A7E34-AC73-4781-B791-2C81A9066A2C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.VS.Windows", "source\Cosmos.VS.Windows\Cosmos.VS.Windows.csproj", "{47E8F3DC-FF3F-4CC7-8643-1807260B0B18}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.VS", "..\XSharp\source\XSharp.VS\XSharp.VS.csproj", "{FB71E8EF-E229-4D81-984A-B9170D752BF9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.VS", "..\XSharp\source\ToSort\XSharp.VS\XSharp.VS.csproj", "{FB71E8EF-E229-4D81-984A-B9170D752BF9}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.VS.ProjectSystem", "source\Cosmos.VS.ProjectSystem\Cosmos.VS.ProjectSystem.csproj", "{12C1623C-1B28-46DF-A4B5-6B767A01ECF6}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{AA3CAD10-7821-4B3A-85D3-13CB4F308CBF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.x86", "..\XSharp\source\XSharp.x86\XSharp.x86.csproj", "{7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spruce", "..\XSharp\source\Spruce\Spruce.csproj", "{449E143F-3E7F-46DC-8E65-F1555FB55FAD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VSPropertyPages", "..\XSharp\source\VSPropertyPages\VSPropertyPages.csproj", "{45028B2F-66EA-4BA6-841E-F339CF54B8A3}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Tasks", "source\Cosmos.Build.Tasks\Cosmos.Build.Tasks.csproj", "{D761BA74-7CB9-4C7F-BD5F-5893A69743C9}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.Debug.Symbols.Net48", "..\IL2CPU\source\IL2CPU.Debug.Symbols.Net48\IL2CPU.Debug.Symbols.Net48.csproj", "{AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 + TEST|Any CPU = TEST|Any CPU + TEST|x86 = TEST|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|x86.ActiveCfg = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|x86.Build.0 = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|Any CPU.Build.0 = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|x86.ActiveCfg = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|x86.Build.0 = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -74,6 +64,10 @@ Global {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|Any CPU.Build.0 = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|x86.ActiveCfg = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|x86.Build.0 = Release|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|Any CPU.Build.0 = Release|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|x86.ActiveCfg = Debug|x86 + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|x86.Build.0 = Debug|x86 {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|Any CPU.Build.0 = Debug|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -82,6 +76,10 @@ Global {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|Any CPU.Build.0 = Release|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|x86.ActiveCfg = Release|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|x86.Build.0 = Release|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|Any CPU.Build.0 = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|x86.ActiveCfg = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|x86.Build.0 = TEST|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|Any CPU.Build.0 = Debug|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -90,6 +88,10 @@ Global {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|Any CPU.Build.0 = Release|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|x86.ActiveCfg = Release|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|x86.Build.0 = Release|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|Any CPU.Build.0 = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|x86.ActiveCfg = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|x86.Build.0 = TEST|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|Any CPU.Build.0 = Debug|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -98,6 +100,10 @@ Global {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|Any CPU.Build.0 = Release|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|x86.ActiveCfg = Release|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|x86.Build.0 = Release|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|Any CPU.Build.0 = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|x86.ActiveCfg = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|x86.Build.0 = TEST|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -106,6 +112,10 @@ Global {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release|Any CPU.Build.0 = Release|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release|x86.ActiveCfg = Release|Any CPU {3370FC04-B669-46A4-A4AA-A89540318F8D}.Release|x86.Build.0 = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|Any CPU.Build.0 = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|x86.ActiveCfg = Release|Any CPU + {3370FC04-B669-46A4-A4AA-A89540318F8D}.TEST|x86.Build.0 = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -114,6 +124,10 @@ Global {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|Any CPU.Build.0 = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|x86.ActiveCfg = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|x86.Build.0 = Release|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.Build.0 = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|x86.ActiveCfg = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|x86.Build.0 = TEST|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|Any CPU.Build.0 = Debug|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -122,6 +136,10 @@ Global {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|Any CPU.Build.0 = Release|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|x86.ActiveCfg = Release|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|x86.Build.0 = Release|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|Any CPU.Build.0 = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|x86.ActiveCfg = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|x86.Build.0 = TEST|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug|Any CPU.Build.0 = Debug|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -130,6 +148,10 @@ Global {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release|Any CPU.Build.0 = Release|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release|x86.ActiveCfg = Release|Any CPU {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.Release|x86.Build.0 = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|Any CPU.Build.0 = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|x86.ActiveCfg = Release|Any CPU + {D4BA64B3-D7F6-4A3A-AF1D-74E41B49D865}.TEST|x86.Build.0 = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -138,6 +160,10 @@ Global {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release|Any CPU.Build.0 = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release|x86.ActiveCfg = Release|Any CPU {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.Release|x86.Build.0 = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|Any CPU.Build.0 = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|x86.ActiveCfg = Release|Any CPU + {3D84CF8B-C6DF-4D78-8DE1-708582B43711}.TEST|x86.Build.0 = Release|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -146,6 +172,10 @@ Global {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|Any CPU.Build.0 = Release|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|x86.ActiveCfg = Release|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|x86.Build.0 = Release|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|Any CPU.Build.0 = Release|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|x86.ActiveCfg = Debug|x86 + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|x86.Build.0 = Debug|x86 {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -154,6 +184,10 @@ Global {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release|Any CPU.Build.0 = Release|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release|x86.ActiveCfg = Release|Any CPU {535A7E34-AC73-4781-B791-2C81A9066A2C}.Release|x86.Build.0 = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|Any CPU.Build.0 = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|x86.ActiveCfg = Release|Any CPU + {535A7E34-AC73-4781-B791-2C81A9066A2C}.TEST|x86.Build.0 = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug|Any CPU.Build.0 = Debug|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -162,6 +196,10 @@ Global {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release|Any CPU.Build.0 = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release|x86.ActiveCfg = Release|Any CPU {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.Release|x86.Build.0 = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|Any CPU.Build.0 = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|x86.ActiveCfg = Release|Any CPU + {47E8F3DC-FF3F-4CC7-8643-1807260B0B18}.TEST|x86.Build.0 = Release|Any CPU {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -170,6 +208,10 @@ Global {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Release|Any CPU.Build.0 = Release|Any CPU {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Release|x86.ActiveCfg = Release|Any CPU {FB71E8EF-E229-4D81-984A-B9170D752BF9}.Release|x86.Build.0 = Release|Any CPU + {FB71E8EF-E229-4D81-984A-B9170D752BF9}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {FB71E8EF-E229-4D81-984A-B9170D752BF9}.TEST|Any CPU.Build.0 = Release|Any CPU + {FB71E8EF-E229-4D81-984A-B9170D752BF9}.TEST|x86.ActiveCfg = Release|Any CPU + {FB71E8EF-E229-4D81-984A-B9170D752BF9}.TEST|x86.Build.0 = Release|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug|Any CPU.Build.0 = Debug|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -178,14 +220,10 @@ Global {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release|Any CPU.Build.0 = Release|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release|x86.ActiveCfg = Release|Any CPU {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.Release|x86.Build.0 = Release|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Debug|x86.ActiveCfg = Debug|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Debug|x86.Build.0 = Debug|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Release|Any CPU.Build.0 = Release|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Release|x86.ActiveCfg = Release|Any CPU - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6}.Release|x86.Build.0 = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|Any CPU.Build.0 = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|x86.ActiveCfg = Release|Any CPU + {12C1623C-1B28-46DF-A4B5-6B767A01ECF6}.TEST|x86.Build.0 = Release|Any CPU {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Debug|Any CPU.Build.0 = Debug|Any CPU {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -194,14 +232,10 @@ Global {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Release|Any CPU.Build.0 = Release|Any CPU {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Release|x86.ActiveCfg = Release|Any CPU {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.Release|x86.Build.0 = Release|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Debug|x86.Build.0 = Debug|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Release|Any CPU.Build.0 = Release|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Release|x86.ActiveCfg = Release|Any CPU - {45028B2F-66EA-4BA6-841E-F339CF54B8A3}.Release|x86.Build.0 = Release|Any CPU + {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.TEST|Any CPU.Build.0 = Release|Any CPU + {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.TEST|x86.ActiveCfg = Debug|x86 + {449E143F-3E7F-46DC-8E65-F1555FB55FAD}.TEST|x86.Build.0 = Debug|x86 {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Debug|Any CPU.Build.0 = Debug|Any CPU {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -210,12 +244,27 @@ Global {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Release|Any CPU.Build.0 = Release|Any CPU {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Release|x86.ActiveCfg = Release|Any CPU {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.Release|x86.Build.0 = Release|Any CPU + {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.TEST|Any CPU.ActiveCfg = Release|Any CPU + {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.TEST|Any CPU.Build.0 = Release|Any CPU + {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.TEST|x86.ActiveCfg = Release|Any CPU + {D761BA74-7CB9-4C7F-BD5F-5893A69743C9}.TEST|x86.Build.0 = Release|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Debug|x86.ActiveCfg = Debug|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Debug|x86.Build.0 = Debug|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Release|Any CPU.Build.0 = Release|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Release|x86.ActiveCfg = Release|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.Release|x86.Build.0 = Release|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.TEST|Any CPU.Build.0 = TEST|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.TEST|x86.ActiveCfg = TEST|Any CPU + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818}.TEST|x86.Build.0 = TEST|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {0CDB3F6E-7971-426B-81F8-38B966A54C2B} = {AA3CAD10-7821-4B3A-85D3-13CB4F308CBF} {F74A4B2B-02DA-455A-89FB-803A442B5B2C} = {AA3CAD10-7821-4B3A-85D3-13CB4F308CBF} {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85} = {F7C6CA93-1D02-443C-9C8B-A1988DE0306B} {BA661F30-9F3B-4356-B47B-D9C9375A473B} = {F7C6CA93-1D02-443C-9C8B-A1988DE0306B} @@ -230,10 +279,9 @@ Global {47E8F3DC-FF3F-4CC7-8643-1807260B0B18} = {F0B09CE5-6AF5-453F-BEBE-E257108C65DC} {FB71E8EF-E229-4D81-984A-B9170D752BF9} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} {12C1623C-1B28-46DF-A4B5-6B767A01ECF6} = {F0B09CE5-6AF5-453F-BEBE-E257108C65DC} - {7E338FAE-2E91-46FF-A88B-95C40A9AD1E6} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} {449E143F-3E7F-46DC-8E65-F1555FB55FAD} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} - {45028B2F-66EA-4BA6-841E-F339CF54B8A3} = {F0B09CE5-6AF5-453F-BEBE-E257108C65DC} {D761BA74-7CB9-4C7F-BD5F-5893A69743C9} = {AA3CAD10-7821-4B3A-85D3-13CB4F308CBF} + {AC3FEEDE-DA07-40BF-A1EA-56716EBC2818} = {F7C6CA93-1D02-443C-9C8B-A1988DE0306B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {35645DF6-909B-4368-B6CC-188E096C7908} diff --git a/Kernel.sln b/Kernel.sln index f1dd63f788..7d8ac65db3 100644 --- a/Kernel.sln +++ b/Kernel.sln @@ -1,357 +1,223 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G2", "Kernel G2", "{9A923E6F-FF63-4F02-A4EA-C2D44F9323FD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "0 Core", "0 Core", "{04B18FFC-8EA0-4E9F-9E1B-478527B19AFA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1 HAL", "1 HAL", "{D651C346-95CF-4AE9-B309-DB2A1A512811}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2 System", "2 System", "{0259702E-9575-4852-A641-5F9714A9C740}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G3", "Kernel G3", "{00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "10 CPU", "10 CPU", "{C5D22A6E-96F8-4F85-9EE4-C1EB8C5E0530}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "20 Platform", "20 Platform", "{2C27BF1B-0AB0-4B68-83C4-991D43897B66}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "30 HAL", "30 HAL", "{B369DAF1-94BC-4BD7-887C-80F76F8B5910}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "40 System", "40 System", "{2E1A72C6-5DD4-4AB9-92A1-6BB44D9B1009}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "50 Application", "50 Application", "{2A22DC4C-E237-4D4B-A592-47D477F9ED5B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TapRoot", "TapRoot", "{DB771C12-E60D-41C9-9A39-74CC95A661CD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "91 Plug", "91 Plug", "{1B2F7229-B8F1-4F40-966A-AA8C2DC30A54}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "92 CpuPlug", "92 CpuPlug", "{AD495579-C209-48FA-8F0F-633D22438DDD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.HAL2", "source\Cosmos.HAL2\Cosmos.HAL2.csproj", "{1425715D-1C93-44C7-8BB5-F124F195A41A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Common", "source\Cosmos.Common\Cosmos.Common.csproj", "{09099C80-8262-486A-94A5-492F51B08823}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core", "source\Cosmos.Core\Cosmos.Core.csproj", "{9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System2", "source\Cosmos.System2\Cosmos.System2.csproj", "{4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Plugs", "source\Cosmos.Core_Plugs\Cosmos.Core_Plugs.csproj", "{1132E689-18B0-4D87-94E8-934D4802C540}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Asm", "source\Cosmos.Core_Asm\Cosmos.Core_Asm.csproj", "{3C186D37-21C3-417C-95F1-19BE538AF88A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System2_Plugs", "source\Cosmos.System2_Plugs\Cosmos.System2_Plugs.csproj", "{9431FF1F-AD75-4A1E-B38A-46E0F109411D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Kernel", "source\Cosmos.Debug.Kernel\Cosmos.Debug.Kernel.csproj", "{94DBCFC7-B5D2-4148-BE18-D76654C379E2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.API", "..\IL2CPU\source\IL2CPU.API\IL2CPU.API.csproj", "{31D48401-77B2-44AF-B6D3-27AB67C10759}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Kernel.Plugs.Asm", "source\Cosmos.Debug.Kernel.Plugs.Asm\Cosmos.Debug.Kernel.Plugs.Asm.csproj", "{6C770E55-8EED-444C-AD4E-017E823E5BA3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core.DebugStub", "..\IL2CPU\source\Cosmos.Core.DebugStub\Cosmos.Core.DebugStub.csproj", "{9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU.x86", "source\Kernel-X86\10-CPU\Cosmos.CPU.x86\Cosmos.CPU.x86.csproj", "{FC65D765-990D-4F00-B240-8DD17FA91EA9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Platform.PC", "source\Kernel-X86\20-Platform\Cosmos.Platform.PC\Cosmos.Platform.PC.csproj", "{63843265-D889-47D2-883E-595289C99F42}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System", "source\Kernel-X86\40-System\Cosmos.System\Cosmos.System.csproj", "{F8BF6943-B69D-4549-9C16-75146616E19C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.Assembler", "..\XSharp\source\XSharp.Assembler\XSharp.Assembler.csproj", "{F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp.csproj", "{F785B091-7E4D-4D2E-A310-B18690623F74}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.HAL", "source\Kernel-X86\30-HAL\Cosmos.HAL\Cosmos.HAL.csproj", "{3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.IL2CPU", "..\IL2CPU\source\Cosmos.IL2CPU\Cosmos.IL2CPU.csproj", "{47F9D446-ACD4-489A-AD6D-A46A19247E2F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Common", "..\Common\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.Debug.Symbols", "..\IL2CPU\source\IL2CPU.Debug.Symbols\IL2CPU.Debug.Symbols.csproj", "{4E9B8F31-AEA0-402D-9B3A-223100F2156D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Plugs.TapRoot", "source\Kernel-X86\91-Plugs\Cosmos.Plugs.TapRoot\Cosmos.Plugs.TapRoot.csproj", "{BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU_Plugs", "source\Kernel-X86\10-CPU\Cosmos.CPU_Plugs\Cosmos.CPU_Plugs.csproj", "{365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU_Asm", "source\Kernel-X86\10-CPU\Cosmos.CPU_Asm\Cosmos.CPU_Asm.csproj", "{08B5D5EF-45F5-45BC-B842-A413E8113A55}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GuessKernelGen3", "source\Kernel-X86\50-Application\GuessKernelGen3.csproj", "{9E58E949-7B71-45ED-9610-11DA287EE933}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TRKernel", "source\Kernel-TapRoot\Demo\TRKernel.csproj", "{F614D199-03E6-4CBD-836C-EDB769B025A3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spruce", "..\XSharp\source\Spruce\Spruce.csproj", "{0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.x86", "..\XSharp\source\XSharp.x86\XSharp.x86.csproj", "{7370A62F-12DA-4181-BE3B-009D0926CA7E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|x86.ActiveCfg = Debug|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|x86.Build.0 = Debug|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|Any CPU.Build.0 = Release|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.ActiveCfg = Release|Any CPU - {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.Build.0 = Release|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Deploy.0 = Debug|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Debug|x86.ActiveCfg = Debug|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Debug|x86.Build.0 = Debug|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Release|Any CPU.ActiveCfg = Release|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Release|Any CPU.Build.0 = Release|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.ActiveCfg = Release|Any CPU - {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.Build.0 = Release|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|x86.ActiveCfg = Debug|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|x86.Build.0 = Debug|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|Any CPU.Build.0 = Release|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.ActiveCfg = Release|Any CPU - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.Build.0 = Release|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|x86.ActiveCfg = Debug|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|x86.Build.0 = Debug|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|Any CPU.Build.0 = Release|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.ActiveCfg = Release|Any CPU - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.Build.0 = Release|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|x86.ActiveCfg = Debug|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|x86.Build.0 = Debug|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Release|Any CPU.Build.0 = Release|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.ActiveCfg = Release|Any CPU - {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.Build.0 = Release|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|x86.ActiveCfg = Debug|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|x86.Build.0 = Debug|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|Any CPU.Build.0 = Release|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|x86.ActiveCfg = Release|Any CPU - {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|x86.Build.0 = Release|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|x86.ActiveCfg = Debug|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|x86.Build.0 = Debug|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|Any CPU.Build.0 = Release|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.ActiveCfg = Release|Any CPU - {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.Build.0 = Release|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|x86.Build.0 = Debug|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|Any CPU.Build.0 = Release|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|x86.ActiveCfg = Release|Any CPU - {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|x86.Build.0 = Release|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|x86.ActiveCfg = Debug|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|x86.Build.0 = Debug|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|Any CPU.Build.0 = Release|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|x86.ActiveCfg = Release|Any CPU - {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|x86.Build.0 = Release|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|x86.ActiveCfg = Debug|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|x86.Build.0 = Debug|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|Any CPU.Build.0 = Release|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|x86.ActiveCfg = Release|Any CPU - {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|x86.Build.0 = Release|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|x86.ActiveCfg = Debug|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|x86.Build.0 = Debug|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|Any CPU.Build.0 = Release|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|x86.ActiveCfg = Release|Any CPU - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|x86.Build.0 = Release|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Debug|x86.Build.0 = Debug|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Release|Any CPU.Build.0 = Release|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Release|x86.ActiveCfg = Release|Any CPU - {FC65D765-990D-4F00-B240-8DD17FA91EA9}.Release|x86.Build.0 = Release|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Debug|Any CPU.Build.0 = Debug|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Debug|x86.ActiveCfg = Debug|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Debug|x86.Build.0 = Debug|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Release|Any CPU.ActiveCfg = Release|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Release|Any CPU.Build.0 = Release|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Release|x86.ActiveCfg = Release|Any CPU - {63843265-D889-47D2-883E-595289C99F42}.Release|x86.Build.0 = Release|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Debug|x86.ActiveCfg = Debug|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Debug|x86.Build.0 = Debug|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Release|Any CPU.Build.0 = Release|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Release|x86.ActiveCfg = Release|Any CPU - {F8BF6943-B69D-4549-9C16-75146616E19C}.Release|x86.Build.0 = Release|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Debug|x86.Build.0 = Debug|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Release|Any CPU.Build.0 = Release|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Release|x86.ActiveCfg = Release|Any CPU - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3}.Release|x86.Build.0 = Release|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|x86.ActiveCfg = Debug|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|x86.Build.0 = Debug|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|Any CPU.Build.0 = Release|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|x86.ActiveCfg = Release|Any CPU - {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|x86.Build.0 = Release|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Debug|x86.ActiveCfg = Debug|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Debug|x86.Build.0 = Debug|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Release|Any CPU.Build.0 = Release|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Release|x86.ActiveCfg = Release|Any CPU - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E}.Release|x86.Build.0 = Release|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|x86.ActiveCfg = Debug|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|x86.Build.0 = Debug|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|Any CPU.Build.0 = Release|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|x86.ActiveCfg = Release|Any CPU - {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|x86.Build.0 = Release|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|x86.ActiveCfg = Debug|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|x86.Build.0 = Debug|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|Any CPU.Build.0 = Release|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|x86.ActiveCfg = Release|Any CPU - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|x86.Build.0 = Release|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|x86.ActiveCfg = Debug|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|x86.Build.0 = Debug|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|Any CPU.Build.0 = Release|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|x86.ActiveCfg = Release|Any CPU - {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|x86.Build.0 = Release|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Debug|x86.ActiveCfg = Debug|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Debug|x86.Build.0 = Debug|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Release|Any CPU.Build.0 = Release|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Release|x86.ActiveCfg = Release|Any CPU - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C}.Release|x86.Build.0 = Release|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Debug|x86.ActiveCfg = Debug|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Debug|x86.Build.0 = Debug|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Release|Any CPU.Build.0 = Release|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Release|x86.ActiveCfg = Release|Any CPU - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6}.Release|x86.Build.0 = Release|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Debug|Any CPU.Build.0 = Debug|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Debug|x86.ActiveCfg = Debug|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Debug|x86.Build.0 = Debug|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Release|Any CPU.ActiveCfg = Release|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Release|Any CPU.Build.0 = Release|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Release|x86.ActiveCfg = Release|Any CPU - {08B5D5EF-45F5-45BC-B842-A413E8113A55}.Release|x86.Build.0 = Release|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Debug|x86.ActiveCfg = Debug|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Debug|x86.Build.0 = Debug|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Release|Any CPU.Build.0 = Release|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Release|x86.ActiveCfg = Release|Any CPU - {9E58E949-7B71-45ED-9610-11DA287EE933}.Release|x86.Build.0 = Release|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Debug|x86.Build.0 = Debug|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Release|Any CPU.Build.0 = Release|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Release|x86.ActiveCfg = Release|Any CPU - {F614D199-03E6-4CBD-836C-EDB769B025A3}.Release|x86.Build.0 = Release|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|x86.ActiveCfg = Debug|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|x86.Build.0 = Debug|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|Any CPU.Build.0 = Release|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|x86.ActiveCfg = Release|Any CPU - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|x86.Build.0 = Release|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Debug|x86.ActiveCfg = Debug|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Debug|x86.Build.0 = Debug|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Release|Any CPU.Build.0 = Release|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Release|x86.ActiveCfg = Release|Any CPU - {7370A62F-12DA-4181-BE3B-009D0926CA7E}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} - {D651C346-95CF-4AE9-B309-DB2A1A512811} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} - {0259702E-9575-4852-A641-5F9714A9C740} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} - {C5D22A6E-96F8-4F85-9EE4-C1EB8C5E0530} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {2C27BF1B-0AB0-4B68-83C4-991D43897B66} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {B369DAF1-94BC-4BD7-887C-80F76F8B5910} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {2E1A72C6-5DD4-4AB9-92A1-6BB44D9B1009} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {2A22DC4C-E237-4D4B-A592-47D477F9ED5B} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {DB771C12-E60D-41C9-9A39-74CC95A661CD} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {1B2F7229-B8F1-4F40-966A-AA8C2DC30A54} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {AD495579-C209-48FA-8F0F-633D22438DDD} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {1425715D-1C93-44C7-8BB5-F124F195A41A} = {D651C346-95CF-4AE9-B309-DB2A1A512811} - {09099C80-8262-486A-94A5-492F51B08823} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} - {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} - {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF} = {0259702E-9575-4852-A641-5F9714A9C740} - {1132E689-18B0-4D87-94E8-934D4802C540} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} - {3C186D37-21C3-417C-95F1-19BE538AF88A} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} - {9431FF1F-AD75-4A1E-B38A-46E0F109411D} = {0259702E-9575-4852-A641-5F9714A9C740} - {31D48401-77B2-44AF-B6D3-27AB67C10759} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} - {FC65D765-990D-4F00-B240-8DD17FA91EA9} = {C5D22A6E-96F8-4F85-9EE4-C1EB8C5E0530} - {63843265-D889-47D2-883E-595289C99F42} = {2C27BF1B-0AB0-4B68-83C4-991D43897B66} - {F8BF6943-B69D-4549-9C16-75146616E19C} = {2E1A72C6-5DD4-4AB9-92A1-6BB44D9B1009} - {F0860B7D-3FF7-4E2A-AC10-18E87ADD62A3} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {F785B091-7E4D-4D2E-A310-B18690623F74} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {3F8EDE0E-61BD-4D01-95F5-4A5A17F6221E} = {B369DAF1-94BC-4BD7-887C-80F76F8B5910} - {47F9D446-ACD4-489A-AD6D-A46A19247E2F} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {4E9B8F31-AEA0-402D-9B3A-223100F2156D} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {BEEDA0BE-0105-40BF-BD8D-7F6A2BC3B05C} = {1B2F7229-B8F1-4F40-966A-AA8C2DC30A54} - {365810FC-AFC2-4130-8A70-EF1F2C3FA5D6} = {AD495579-C209-48FA-8F0F-633D22438DDD} - {08B5D5EF-45F5-45BC-B842-A413E8113A55} = {C5D22A6E-96F8-4F85-9EE4-C1EB8C5E0530} - {9E58E949-7B71-45ED-9610-11DA287EE933} = {2A22DC4C-E237-4D4B-A592-47D477F9ED5B} - {F614D199-03E6-4CBD-836C-EDB769B025A3} = {DB771C12-E60D-41C9-9A39-74CC95A661CD} - {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - {7370A62F-12DA-4181-BE3B-009D0926CA7E} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1A1E8F1D-82B3-471F-9B59-0350DEA9203D} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33205.214 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G2", "Kernel G2", "{9A923E6F-FF63-4F02-A4EA-C2D44F9323FD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "0 Core", "0 Core", "{04B18FFC-8EA0-4E9F-9E1B-478527B19AFA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "1 HAL", "1 HAL", "{D651C346-95CF-4AE9-B309-DB2A1A512811}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2 System", "2 System", "{0259702E-9575-4852-A641-5F9714A9C740}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "External", "External", "{3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G3", "Kernel G3", "{00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.HAL2", "source\Cosmos.HAL2\Cosmos.HAL2.csproj", "{1425715D-1C93-44C7-8BB5-F124F195A41A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Common", "source\Cosmos.Common\Cosmos.Common.csproj", "{09099C80-8262-486A-94A5-492F51B08823}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core", "source\Cosmos.Core\Cosmos.Core.csproj", "{9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System2", "source\Cosmos.System2\Cosmos.System2.csproj", "{4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Plugs", "source\Cosmos.Core_Plugs\Cosmos.Core_Plugs.csproj", "{1132E689-18B0-4D87-94E8-934D4802C540}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Asm", "source\Cosmos.Core_Asm\Cosmos.Core_Asm.csproj", "{3C186D37-21C3-417C-95F1-19BE538AF88A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System2_Plugs", "source\Cosmos.System2_Plugs\Cosmos.System2_Plugs.csproj", "{9431FF1F-AD75-4A1E-B38A-46E0F109411D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Kernel", "source\Cosmos.Debug.Kernel\Cosmos.Debug.Kernel.csproj", "{94DBCFC7-B5D2-4148-BE18-D76654C379E2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.API", "..\IL2CPU\source\IL2CPU.API\IL2CPU.API.csproj", "{31D48401-77B2-44AF-B6D3-27AB67C10759}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Debug.Kernel.Plugs.Asm", "source\Cosmos.Debug.Kernel.Plugs.Asm\Cosmos.Debug.Kernel.Plugs.Asm.csproj", "{6C770E55-8EED-444C-AD4E-017E823E5BA3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core.DebugStub", "..\IL2CPU\source\Cosmos.Core.DebugStub\Cosmos.Core.DebugStub.csproj", "{9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp\XSharp.csproj", "{F785B091-7E4D-4D2E-A310-B18690623F74}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.IL2CPU", "..\IL2CPU\source\Cosmos.IL2CPU\Cosmos.IL2CPU.csproj", "{47F9D446-ACD4-489A-AD6D-A46A19247E2F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Common", "..\Common\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IL2CPU.Debug.Symbols", "..\IL2CPU\source\IL2CPU.Debug.Symbols\IL2CPU.Debug.Symbols.csproj", "{4E9B8F31-AEA0-402D-9B3A-223100F2156D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spruce", "..\XSharp\source\Spruce\Spruce.csproj", "{0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Plugs", "source\Cosmos.Plugs\Cosmos.Plugs.csproj", "{F2948368-61B6-4653-BAEC-C7152CE4980E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|x86.ActiveCfg = Debug|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|x86.Build.0 = Debug|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|Any CPU.Build.0 = Release|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.ActiveCfg = Release|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.Build.0 = Release|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Debug|x86.ActiveCfg = Debug|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Debug|x86.Build.0 = Debug|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Release|Any CPU.Build.0 = Release|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.ActiveCfg = Release|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.Build.0 = Release|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|x86.ActiveCfg = Debug|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|x86.Build.0 = Debug|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|Any CPU.Build.0 = Release|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.ActiveCfg = Release|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.Build.0 = Release|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|x86.ActiveCfg = Debug|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|x86.Build.0 = Debug|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|Any CPU.Build.0 = Release|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.ActiveCfg = Release|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.Build.0 = Release|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|x86.ActiveCfg = Debug|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|x86.Build.0 = Debug|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Release|Any CPU.Build.0 = Release|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.ActiveCfg = Release|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.Build.0 = Release|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|x86.ActiveCfg = Debug|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Debug|x86.Build.0 = Debug|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|Any CPU.Build.0 = Release|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|x86.ActiveCfg = Release|Any CPU + {3C186D37-21C3-417C-95F1-19BE538AF88A}.Release|x86.Build.0 = Release|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|x86.ActiveCfg = Debug|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|x86.Build.0 = Debug|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|Any CPU.Build.0 = Release|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.ActiveCfg = Release|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.Build.0 = Release|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Debug|x86.Build.0 = Debug|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|Any CPU.Build.0 = Release|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|x86.ActiveCfg = Release|Any CPU + {94DBCFC7-B5D2-4148-BE18-D76654C379E2}.Release|x86.Build.0 = Release|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|x86.ActiveCfg = Debug|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Debug|x86.Build.0 = Debug|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|Any CPU.Build.0 = Release|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|x86.ActiveCfg = Release|Any CPU + {31D48401-77B2-44AF-B6D3-27AB67C10759}.Release|x86.Build.0 = Release|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Debug|x86.Build.0 = Debug|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|Any CPU.Build.0 = Release|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|x86.ActiveCfg = Release|Any CPU + {6C770E55-8EED-444C-AD4E-017E823E5BA3}.Release|x86.Build.0 = Release|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|x86.ActiveCfg = Debug|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Debug|x86.Build.0 = Debug|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|Any CPU.Build.0 = Release|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|x86.ActiveCfg = Release|Any CPU + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82}.Release|x86.Build.0 = Release|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|x86.ActiveCfg = Debug|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Debug|x86.Build.0 = Debug|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|Any CPU.Build.0 = Release|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|x86.ActiveCfg = Release|Any CPU + {F785B091-7E4D-4D2E-A310-B18690623F74}.Release|x86.Build.0 = Release|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|x86.ActiveCfg = Debug|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Debug|x86.Build.0 = Debug|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|Any CPU.Build.0 = Release|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|x86.ActiveCfg = Release|Any CPU + {47F9D446-ACD4-489A-AD6D-A46A19247E2F}.Release|x86.Build.0 = Release|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|x86.ActiveCfg = Debug|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Debug|x86.Build.0 = Debug|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|Any CPU.Build.0 = Release|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|x86.ActiveCfg = Release|Any CPU + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA}.Release|x86.Build.0 = Release|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Debug|x86.Build.0 = Debug|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|Any CPU.Build.0 = Release|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|x86.ActiveCfg = Release|Any CPU + {4E9B8F31-AEA0-402D-9B3A-223100F2156D}.Release|x86.Build.0 = Release|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Debug|x86.Build.0 = Debug|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|Any CPU.Build.0 = Release|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|x86.ActiveCfg = Release|Any CPU + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2}.Release|x86.Build.0 = Release|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Debug|x86.Build.0 = Debug|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Release|Any CPU.Build.0 = Release|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Release|x86.ActiveCfg = Release|Any CPU + {F2948368-61B6-4653-BAEC-C7152CE4980E}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} + {D651C346-95CF-4AE9-B309-DB2A1A512811} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} + {0259702E-9575-4852-A641-5F9714A9C740} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} + {1425715D-1C93-44C7-8BB5-F124F195A41A} = {D651C346-95CF-4AE9-B309-DB2A1A512811} + {09099C80-8262-486A-94A5-492F51B08823} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF} = {0259702E-9575-4852-A641-5F9714A9C740} + {1132E689-18B0-4D87-94E8-934D4802C540} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} + {3C186D37-21C3-417C-95F1-19BE538AF88A} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} + {9431FF1F-AD75-4A1E-B38A-46E0F109411D} = {0259702E-9575-4852-A641-5F9714A9C740} + {31D48401-77B2-44AF-B6D3-27AB67C10759} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {9BDA0399-0CFD-42E8-8CF4-3DDE16122A82} = {00F0CA9C-51B2-4E99-B4D9-DD24D488D3FC} + {F785B091-7E4D-4D2E-A310-B18690623F74} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {47F9D446-ACD4-489A-AD6D-A46A19247E2F} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {67FD9912-CE63-4EB2-880C-F4F0D9AED7CA} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {4E9B8F31-AEA0-402D-9B3A-223100F2156D} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {0812DD0A-4CEE-4376-B78A-02EBCBAA14C2} = {3CD3D9A5-9BC5-4FEB-8D63-4D535C0ABB78} + {F2948368-61B6-4653-BAEC-C7152CE4980E} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1A1E8F1D-82B3-471F-9B59-0350DEA9203D} + EndGlobalSection +EndGlobal diff --git a/LICENSE.txt b/LICENSE.txt index 2a2ee990b8..590d32bee5 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,21 +1,21 @@ BSD 3-Clause License -Copyright (c) 2018, COSMOS Project +Copyright (c) 2007-2025, CosmosOS, COSMOS Project All rights reserved. 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. +1. 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. +2. 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. -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..1db0ffe870 --- /dev/null +++ b/Makefile @@ -0,0 +1,160 @@ +THISDIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) +DESTDIR ?= /opt/cosmos + +IL2CPU_URL = https://github.com/CosmosOS/IL2CPU +XSHARP_URL = https://github.com/CosmosOS/XSharp +COMMON_URL = https://github.com/CosmosOS/Common + +IL2CPU_BRANCH = master +XSHARP_BRANCH = master +COMMON_BRANCH = master + +IL2CPU_DIR = $(THISDIR)/../IL2CPU +XSHARP_DIR = $(THISDIR)/../XSharp +COMMON_DIR = $(THISDIR)/../Common + +GIT = git +DOTNET = dotnet + +BUILDMODE=Release +GITFLAGS = clone --depth=1 +DOTNETFLAGS = -nologo -v:q -c:$(BUILDMODE) +GREEN = \033[0;32m +YELLOW = \033[1;33m +DEFAULT = \033[0m + +.PHONY: all +all: $(IL2CPU_DIR) $(XSHARP_DIR) $(COMMON_DIR) + @printf "${YELLOW}Cosmos${DEFAULT} DevKit Installer\n" + @# Elapsed time is stored in a temporary file, deleted post-install. + @date +%s > _time_$@.txt + @$(MAKE) build + @$(MAKE) publish + @sudo $(MAKE) install + @$(MAKE) nuget-install + @$(MAKE) template-install + @printf "To create a Cosmos kernel, run \'dotnet new cosmosCSKernel -n \{name\}\'" + @printf "Build log file saved to ${GREEN}$(THISDIR)/build${date}.log${DEFAULT}\n" + @printf "============================================\n" + @printf "| ${YELLOW}Cosmos${DEFAULT} has been installed successfully! |\n" + @printf "============================================\n" + @printf "Took ${YELLOW}$$(($$(date +%s)-$$(cat _time_$@.txt)))s${DEFAULT} to build\n" + @rm _time_$@.txt + +$(IL2CPU_DIR): + @printf "Cloning ${GREEN}Cosmos/IL2CPU${DEFAULT}\n" + @$(GIT) $(GITFLAGS) --branch=$(IL2CPU_BRANCH) $(IL2CPU_URL) $(IL2CPU_DIR) + +$(XSHARP_DIR): + @printf "Cloning ${GREEN}Cosmos/XSharp${DEFAULT}\n" + @$(GIT) $(GITFLAGS) --branch=$(XSHARP_BRANCH) $(XSHARP_URL) $(XSHARP_DIR) + +$(COMMON_DIR): + @printf "Cloning ${GREEN}Cosmos/Common${DEFAULT}\n" + @$(GIT) $(GITFLAGS) --branch=$(COMMON_BRANCH) $(COMMON_URL) $(COMMON_DIR) + + +.PHONY: build +build: + @printf "Building ${GREEN}IL2CPU${DEFAULT}\n" + @$(DOTNET) clean $(IL2CPU_DIR) + @$(DOTNET) build $(IL2CPU_DIR) $(DOTNETFLAGS) + @$(DOTNET) pack $(IL2CPU_DIR) $(DOTNETFLAGS) + + @printf "Building ${GREEN}Cosmos${DEFAULT}\n" + + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Common + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Debug.Kernel + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Debug.Kernel.Plugs.Asm + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Core + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Core_Asm + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Core_Plugs + @$(DOTNET) clean $(THISDIR)/source/Cosmos.HAL2 + @$(DOTNET) clean $(THISDIR)/source/Cosmos.System2 + @$(DOTNET) clean $(THISDIR)/source/Cosmos.System2_Plugs + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Build.Tasks + @$(DOTNET) clean $(THISDIR)/source/Cosmos.Plugs + + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Common $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Debug.Kernel $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Debug.Kernel.Plugs.Asm $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Core $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Core_Asm $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Core_Plugs $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.HAL2 $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.System2 $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.System2_Plugs $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Build.Tasks $(DOTNETFLAGS) + @$(DOTNET) pack $(THISDIR)/source/Cosmos.Plugs $(DOTNETFLAGS) + + @printf "Building ${GREEN}X#${DEFAULT}\n" + @$(DOTNET) clean $(XSHARP_DIR)/source/XSharp/XSharp + @$(DOTNET) clean $(XSHARP_DIR)/source/Spruce + + $(DOTNET) pack $(XSHARP_DIR)/source/XSharp/XSharp $(DOTNETFLAGS) + $(DOTNET) pack $(XSHARP_DIR)/source/Spruce $(DOTNETFLAGS) + + +.PHONY: publish +publish: + @printf "Publishing ${GREEN}IL2CPU${DEFAULT}\n" + $(DOTNET) publish $(IL2CPU_DIR)/source/IL2CPU -r linux-x64 --self-contained $(DOTNETFLAGS) + + @printf "Publishing ${GREEN}Cosmos${DEFAULT}\n" + @$(DOTNET) publish $(THISDIR)/source/Cosmos.Core_Plugs $(DOTNETFLAGS) + @$(DOTNET) publish $(THISDIR)/source/Cosmos.Debug.Kernel.Plugs.Asm $(DOTNETFLAGS) + @$(DOTNET) publish $(THISDIR)/source/Cosmos.HAL2 $(DOTNETFLAGS) + @$(DOTNET) publish $(THISDIR)/source/Cosmos.System2_Plugs $(DOTNETFLAGS) + @$(DOTNET) publish $(THISDIR)/source/Cosmos.Plugs $(DOTNETFLAGS) + + @printf "Publishing ${GREEN}X#${DEFAULT}\n" + @$(DOTNET) publish $(XSHARP_DIR)/source/XSharp/XSharp $(DOTNETFLAGS) + @$(DOTNET) publish $(XSHARP_DIR)/source/Spruce $(DOTNETFLAGS) + +.PHONY: install +install: + @printf "Installing to ${YELLOW}$(DESTDIR)${DEFAULT}\n" + @mkdir -p $(DESTDIR)/Cosmos + @mkdir -p $(DESTDIR)/XSharp/DebugStub + @mkdir -p $(DESTDIR)/Build/ISO + @mkdir -p $(DESTDIR)/Build/IL2CPU + @mkdir -p $(DESTDIR)/Build/HyperV + @mkdir -p $(DESTDIR)/Build/VMware/Workstation + @mkdir -p $(DESTDIR)/Packages + @mkdir -p $(DESTDIR)/Kernel + @cp -r $(IL2CPU_DIR)/artifacts/$(BUILDMODE)/nupkg/*.nupkg $(DESTDIR)/Packages/ + @cp -r $(THISDIR)/artifacts/$(BUILDMODE)/nupkg/*.nupkg $(DESTDIR)/Packages/ + @cp -r $(XSHARP_DIR)/artifacts/$(BUILDMODE)/nupkg/*.nupkg $(DESTDIR)/Packages/ + @cp -r $(IL2CPU_DIR)/source/Cosmos.Core.DebugStub/*.xs $(DESTDIR)/XSharp/DebugStub/ + + @cp -r $(THISDIR)/Artwork/XSharp/XSharp.ico $(DESTDIR)/XSharp/ + @cp -r $(THISDIR)/Artwork/Cosmos.ico $(DESTDIR)/ + + @cp -r $(IL2CPU_DIR)/source/IL2CPU/bin/$(BUILDMODE)/*/linux-x64/publish/* $(DESTDIR)/Build/IL2CPU/ + @cp -r $(THISDIR)/source/Cosmos.Core_Plugs/bin/$(BUILDMODE)/*/publish/*.dll $(DESTDIR)/Kernel/ + @cp -r $(THISDIR)/source/Cosmos.System2_Plugs/bin/$(BUILDMODE)/*/publish/*.dll $(DESTDIR)/Kernel/ + @cp -r $(THISDIR)/source/Cosmos.HAL2/bin/$(BUILDMODE)/*/publish/*.dll $(DESTDIR)/Kernel/ + @cp -r $(THISDIR)/source/Cosmos.Debug.Kernel.Plugs.Asm/bin/$(BUILDMODE)/netstandard2.0/publish/*.dll $(DESTDIR)/Kernel/ + + @cp -r $(THISDIR)/Build/HyperV/*.vhdx $(DESTDIR)/Build/HyperV/ + @cp -r $(THISDIR)/Build/VMWare/Workstation/* $(DESTDIR)/Build/VMware/Workstation/ + @cp -r $(THISDIR)/Build/syslinux/* $(DESTDIR)/Build/ISO/ + @printf $(DESTDIR) > /etc/CosmosUserKit.cfg + +.PHONY: nuget-install +nuget-install: + @printf "Installing ${GREEN}Nuget packages${DEFAULT}\n" + + @rm -r -f ~/.nuget/packages/cosmos.*/ + @rm -r -f ~/.nuget/packages/il2cpu.*/ + + @$(DOTNET) nuget remove source "Cosmos Local Package Feed" || true + @$(DOTNET) nuget add source $(DESTDIR)/Packages/ -n "Cosmos Local Package Feed" + +.PHONY: template-install +template-install: + @printf "Installing ${GREEN}C# Template packages${DEFAULT}\n" + @-dotnet new uninstall $(THISDIR)/source/templates/csharp/ + @printf "If the template was not installed, you can ignore this\n" + @dotnet new -i $(THISDIR)/source/templates/csharp/ +#TODO: Uninstall diff --git a/README.md b/README.md index bb9acbd7a5..c87f35182e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,65 @@ -# Cosmos +

-[![Build status](https://ci.appveyor.com/api/projects/status/kust7g5dlnykhkaf/branch/master?svg=true)](https://ci.appveyor.com/project/CosmosOS/cosmos/branch/master) + -Cosmos is an operating system "construction kit". Build your own OS using managed languages such as C#, VB.NET, and more! +

-For instructions on how to install and use Cosmos, please visit the [Cosmos website](http://www.gocosmos.org). +

+ + + + + + + + + + + + + + + + + + + + +

+ +
+ +Cosmos (C# Open Source Managed Operating System) is an operating system development kit which uses .NET, alongside the custom IL2CPU compiler to convert (most) C# code into a working bare-metal OS. +Despite C# in the name, any .NET-based language can be used, which includes: VB.NET, IronPython, F# and more. Cosmos itself and its kernel routines are primarily written in C#, and thus the Cosmos name. + +In a project, Cosmos can be thought of as a compiler and a sort-of standard library for a project. It gives the user access to often hard to find or otherwise difficult to understand tools. + +
+ +## Features + +The following is a non-exhaustive list of features that Cosmos offers: + +- Low level assembly access and pointer memory control +- A basic filesystem +- Most features found in the .NET core library +- A CPU/FPU accelerated math library +- A basic graphics interface +- A basic network interface +- A basic audio interface + +## Setting it up + +Cosmos has an article [here](https://cosmosos.github.io/install.html) on how to do that. + +## Documentation + +The Cosmos documentation can be found [here](https://cosmosos.github.io/index.html). + +If you still have any questions on how to use Cosmos, you can open a [discussion](https://github.com/CosmosOS/Cosmos/discussions) or you can join the [Discord server](https://discord.com/invite/kwtBwv6jhD)! + +The devkit changelog can be found [here](https://cosmosos.github.io/articles/Changelog.html). + +## Reporting an issue + +If you think you found a bug in Cosmos, please check existing [issues](https://github.com/CosmosOS/Cosmos/issues) first before opening a new one. Do **not** open an issue if you need help with something in Cosmos that is not a bug, if you don't know how to code it's not a Cosmos issue for example. diff --git a/ReadMe - Solutions.txt b/ReadMe - Solutions.txt deleted file mode 100644 index ada4c8606f..0000000000 --- a/ReadMe - Solutions.txt +++ /dev/null @@ -1,64 +0,0 @@ -================ Solution File ReadMe ================ - --------------------------------------------- -Cosmos --Old monolithic solution. --Will be removed after all smaller parts split out. --Use of this solution is necessary for some users until all parts are split out. - --------------------------------------------- -Build --Used by the build process (Builder). --Not meant for direct end user use. --Do not change unless you know what you are doing. - --------------------------------------------- -Builder - -Projects used to build Cosmos itself. Essentially this is what makes User Kit go. - --C.B.Builder - Essentially the user kit. A C# program which automates the building and installation of Cosmos wtih a GUI. - --C.B.Insaller - This is the UAC workaround task? - -******* Add C.B.Common & C.B.MSBuild or to compiler?? - --------------------------------------------- -Compiler - -Parts: --Assembler --Compiler --XSharp (Compiler Parts) --Tools (Compiler Parts) - -Notes: --In future XSharp may be separated or a SLN with only XSharp parts in it. But it is needed often when using compiler. - -Bin Cache Dependencies: - - --------------------------------------------- -IDE - -TODO Exists, but needs cleaned up still a lot. - -Debug, Deploy, Visual Studio, XSharp (IDE Parts), Tools (IDE Parts) - --------------------------------------------- -Kernel - --Kernel, Demos (not �User), Tests - --------------------------------------------- -Test - --All unit tests - --------------------------------------------- -Tools - --Misc Tools - --------------------------------------------- - diff --git a/Resources/Dependencies/ApprovalTests.3.0.10/ApprovalTests.dll b/Resources/Dependencies/ApprovalTests.3.0.10/ApprovalTests.dll deleted file mode 100644 index 438879265e..0000000000 Binary files a/Resources/Dependencies/ApprovalTests.3.0.10/ApprovalTests.dll and /dev/null differ diff --git a/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.Net45.dll b/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.Net45.dll deleted file mode 100644 index 884938e049..0000000000 Binary files a/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.Net45.dll and /dev/null differ diff --git a/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.dll b/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.dll deleted file mode 100644 index 1da0a8b178..0000000000 Binary files a/Resources/Dependencies/ApprovalUtilities.3.0.10/ApprovalUtilities.dll and /dev/null differ diff --git a/Resources/Dependencies/Dapper/Dapper.dll b/Resources/Dependencies/Dapper/Dapper.dll deleted file mode 100644 index f38612ac16..0000000000 Binary files a/Resources/Dependencies/Dapper/Dapper.dll and /dev/null differ diff --git a/Resources/Dependencies/Dapper/Dapper.xml b/Resources/Dependencies/Dapper/Dapper.xml deleted file mode 100644 index cc0c42ab54..0000000000 --- a/Resources/Dependencies/Dapper/Dapper.xml +++ /dev/null @@ -1,703 +0,0 @@ - - - - Dapper - - - - - Dapper, a light weight object mapper for ADO.NET - - - - - Purge the query cache - - - - - Return a count of all the cached queries by dapper - - - - - - Return a list of all the queries cached by dapper - - - - - - - Deep diagnostics only: find any hash collisions in the cache - - - - - - Configire the specified type to be mapped to a given db-type - - - - - Execute parameterized SQL - - Number of rows affected - - - - Return a list of dynamic objects, reader is closed after the call - - - - - Executes a query, returning the data typed as per T - - the dynamic param may seem a bit odd, but this works around a major usability issue in vs, if it is Object vs completion gets annoying. Eg type new [space] get new object - A sequence of data of the supplied type; if a basic type (int, string, etc) is queried then the data from the first column in assumed, otherwise an instance is - created per row, and a direct column-name===member-name mapping is assumed (case insensitive). - - - - - Execute a command that returns multiple result sets, and access each in turn - - - - - Return a typed list of objects, reader is closed after the call - - - - - Maps a query to objects - - The first type in the recordset - The second type in the recordset - The return type - - - - - - - The Field we should split and read the second object from (default: id) - Number of seconds before command execution timeout - Is it a stored proc or a batch? - - - - - Maps a query to objects - - - - - - - - - - - - The Field we should split and read the second object from (default: id) - Number of seconds before command execution timeout - - - - - - Perform a multi mapping query with 4 input parameters - - - - - - - - - - - - - - - - - - - - Perform a multi mapping query with 5 input parameters - - - - - - - - - - - - - - - - - - - - - Perform a multi mapping query with 6 input parameters - - - - - - - - - - - - - - - - - - - - - - Perform a multi mapping query with 7 input parameters - - - - - - - - - - - - - - - - - - - - - - - Internal use only - - - - - - - Internal use only - - - - - Internal use only - - - - - Internal use only - - - - - Internal use only - - - - - Gets type-map for the given type - - Type map implementation, DefaultTypeMap instance if no override present - - - - Set custom mapping for type deserializers - - Entity type to override - Mapping rules impementation, null to remove custom map - - - - Internal use only - - - - - - - - - - - Throws a data exception, only used internally - - - - - - - - Called if the query cache is purged via PurgeQueryCache - - - - - How should connection strings be compared for equivalence? Defaults to StringComparer.Ordinal. - Providing a custom implementation can be useful for allowing multi-tenancy databases with identical - schema to share startegies. Note that usual equivalence rules apply: any equivalent connection strings - MUST yield the same hash-code. - - - - - Implement this interface to pass an arbitrary db specific set of parameters to Dapper - - - - - Add all the parameters needed to the command just before it executes - - The raw command prior to execution - Information about the query - - - - Implement this interface to pass an arbitrary db specific parameter to Dapper - - - - - Add the parameter needed to the command before it executes - - The raw command prior to execution - Parameter name - - - - Implement this interface to change default mapping of reader columns to type memebers - - - - - Finds best constructor - - DataReader column names - DataReader column types - Matching constructor or default one - - - - Gets mapping for constructor parameter - - Constructor to resolve - DataReader column name - Mapping implementation - - - - Gets member mapping for column - - DataReader column name - Mapping implementation - - - - Implements this interface to provide custom member mapping - - - - - Source DataReader column name - - - - - Target member type - - - - - Target property - - - - - Target field - - - - - Target constructor parameter - - - - - This is a micro-cache; suitable when the number of terms is controllable (a few hundred, for example), - and strictly append-only; you cannot change existing values. All key matches are on **REFERENCE** - equality. The type is fully thread-safe. - - - - - Identity of a cached query in Dapper, used for extensability - - - - - Create an identity for use with DynamicParameters, internal use only - - - - - - - - - - - - - - The sql - - - - - The command type - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Compare 2 Identity objects - - - - - - - The grid reader provides interfaces for reading multiple result sets from a Dapper query - - - - - Read the next grid of results, returned as a dynamic object - - - - - Read the next grid of results - - - - - Read multiple objects from a single recordset on the grid - - - - - Read multiple objects from a single recordset on the grid - - - - - Read multiple objects from a single record set on the grid - - - - - Read multiple objects from a single record set on the grid - - - - - Read multiple objects from a single record set on the grid - - - - - Read multiple objects from a single record set on the grid - - - - - Dispose the grid, closing and disposing both the underlying reader and command. - - - - - A bag of parameters that can be passed to the Dapper Query and Execute methods - - - - - construct a dynamic parameter bag - - - - - construct a dynamic parameter bag - - can be an anonymous type or a DynamicParameters bag - - - - Append a whole object full of params to the dynamic - EG: AddDynamicParams(new {A = 1, B = 2}) // will add property A and B to the dynamic - - - - - - Add a parameter to this dynamic parameter list - - - - - - - - - - Add all the parameters needed to the command just before it executes - - The raw command prior to execution - Information about the query - - - - Get the value of a parameter - - - - The value, note DBNull.Value is not returned, instead the value is returned as null - - - - All the names of the param in the bag, use Get to yank them out - - - - - This class represents a SQL string, it can be used if you need to denote your parameter is a Char vs VarChar vs nVarChar vs nChar - - - - - Create a new DbString - - - - - Add the parameter to the command... internal use only - - - - - - - Ansi vs Unicode - - - - - Fixed length - - - - - Length of the string -1 for max - - - - - The value of the string - - - - - Handles variances in features per DBMS - - - - - Dictionary of supported features index by connection type name - - - - - Gets the featureset based on the passed connection - - - - - True if the db supports array columns e.g. Postgresql - - - - - Represents simple memeber map for one of target parameter or property or field to source DataReader column - - - - - Creates instance for simple property mapping - - DataReader column name - Target property - - - - Creates instance for simple field mapping - - DataReader column name - Target property - - - - Creates instance for simple constructor parameter mapping - - DataReader column name - Target constructor parameter - - - - DataReader column name - - - - - Target member type - - - - - Target property - - - - - Target field - - - - - Target constructor parameter - - - - - Represents default type mapping strategy used by Dapper - - - - - Creates default type map - - Entity type - - - - Finds best constructor - - DataReader column names - DataReader column types - Matching constructor or default one - - - - Gets mapping for constructor parameter - - Constructor to resolve - DataReader column name - Mapping implementation - - - - Gets member mapping for column - - DataReader column name - Mapping implementation - - - - Implements custom property mapping by user provided criteria (usually presence of some custom attribute with column to member mapping) - - - - - Creates custom property mapping - - Target entity type - Property selector based on target type and DataReader column name - - - - Always returns default constructor - - DataReader column names - DataReader column types - Default constructor - - - - Not impelmeneted as far as default constructor used for all cases - - - - - - - - Returns property based on selector strategy - - DataReader column name - Poperty member map - - - diff --git a/Resources/Dependencies/Dapper/DapperExtensions.dll b/Resources/Dependencies/Dapper/DapperExtensions.dll deleted file mode 100644 index 7ed89ca493..0000000000 Binary files a/Resources/Dependencies/Dapper/DapperExtensions.dll and /dev/null differ diff --git a/Resources/Dependencies/Dapper/SQLinq.Dapper.dll b/Resources/Dependencies/Dapper/SQLinq.Dapper.dll deleted file mode 100644 index f7cf32e159..0000000000 Binary files a/Resources/Dependencies/Dapper/SQLinq.Dapper.dll and /dev/null differ diff --git a/Resources/Dependencies/Dapper/SQLinq.dll b/Resources/Dependencies/Dapper/SQLinq.dll deleted file mode 100644 index e895b5c1d1..0000000000 Binary files a/Resources/Dependencies/Dapper/SQLinq.dll and /dev/null differ diff --git a/Resources/Dependencies/DapperExtensions.StrongName/DapperExtensions.StrongName.csproj b/Resources/Dependencies/DapperExtensions.StrongName/DapperExtensions.StrongName.csproj index f92b908aac..25c28ab60f 100644 --- a/Resources/Dependencies/DapperExtensions.StrongName/DapperExtensions.StrongName.csproj +++ b/Resources/Dependencies/DapperExtensions.StrongName/DapperExtensions.StrongName.csproj @@ -3,7 +3,7 @@ DapperExtensions.StrongName Rafael.Carvalho - netstandard1.3 + net48 DapperExtensions.StrongName True 1.50.2 @@ -12,8 +12,8 @@ - - + + diff --git a/Resources/Dependencies/DapperExtensions.StrongName/DapperImplementor.cs b/Resources/Dependencies/DapperExtensions.StrongName/DapperImplementor.cs index 3b99a1008a..14e3b5528c 100644 --- a/Resources/Dependencies/DapperExtensions.StrongName/DapperImplementor.cs +++ b/Resources/Dependencies/DapperExtensions.StrongName/DapperImplementor.cs @@ -160,7 +160,7 @@ public IEnumerable GetList(DbConnection connection, object predicate, ILis { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate wherePredicate = GetPredicate(classMap, predicate); - return GetList(connection, classMap, wherePredicate, sort, transaction, commandTimeout, true); + return GetList(connection, classMap, wherePredicate, sort, transaction, commandTimeout, buffered); } public IEnumerable GetPage(DbConnection connection, object predicate, IList sort, int page, int resultsPerPage, DbTransaction transaction, int? commandTimeout, bool buffered) where T : class diff --git a/Resources/Dependencies/DapperExtensions.StrongName/Database.cs b/Resources/Dependencies/DapperExtensions.StrongName/Database.cs index 0bb9c7a642..71a4c5b070 100644 --- a/Resources/Dependencies/DapperExtensions.StrongName/Database.cs +++ b/Resources/Dependencies/DapperExtensions.StrongName/Database.cs @@ -110,14 +110,14 @@ public void RunInTransaction(Action action) action(); Commit(); } - catch (Exception ex) + catch { if (HasActiveTransaction) { Rollback(); } - throw ex; + throw; } } @@ -130,14 +130,14 @@ public T RunInTransaction(Func func) Commit(); return result; } - catch (Exception ex) + catch { if (HasActiveTransaction) { Rollback(); } - throw ex; + throw; } } @@ -266,4 +266,4 @@ public IClassMapper GetMap() where T : class return _dapper.SqlGenerator.Configuration.GetMap(); } } -} \ No newline at end of file +} diff --git a/Resources/Dependencies/DapperExtensions.StrongName/packages.lock.json b/Resources/Dependencies/DapperExtensions.StrongName/packages.lock.json new file mode 100644 index 0000000000..b243223560 --- /dev/null +++ b/Resources/Dependencies/DapperExtensions.StrongName/packages.lock.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "dependencies": { + ".NETFramework,Version=v4.8": { + "Dapper.StrongName": { + "type": "Direct", + "requested": "[2.0.90, )", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "Microsoft.CSharp": { + "type": "Direct", + "requested": "[4.7.0, )", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.NETFramework.ReferenceAssemblies": { + "type": "Direct", + "requested": "[1.0.3, )", + "resolved": "1.0.3", + "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", + "dependencies": { + "Microsoft.NETFramework.ReferenceAssemblies.net48": "1.0.3" + } + }, + "Microsoft.NETFramework.ReferenceAssemblies.net48": { + "type": "Transitive", + "resolved": "1.0.3", + "contentHash": "zMk4D+9zyiEWByyQ7oPImPN/Jhpj166Ky0Nlla4eXlNL8hI/BtSJsgR8Inldd4NNpIAH3oh8yym0W2DrhXdSLQ==" + } + } + } +} \ No newline at end of file diff --git a/Resources/Dependencies/ILSpy/ICSharpCode.AvalonEdit.dll b/Resources/Dependencies/ILSpy/ICSharpCode.AvalonEdit.dll index b0788cd60c..6fc337bd8e 100644 Binary files a/Resources/Dependencies/ILSpy/ICSharpCode.AvalonEdit.dll and b/Resources/Dependencies/ILSpy/ICSharpCode.AvalonEdit.dll differ diff --git a/Resources/Dependencies/ILSpy/ICSharpCode.Decompiler.dll b/Resources/Dependencies/ILSpy/ICSharpCode.Decompiler.dll index a2c848d7c2..f7f858c111 100644 Binary files a/Resources/Dependencies/ILSpy/ICSharpCode.Decompiler.dll and b/Resources/Dependencies/ILSpy/ICSharpCode.Decompiler.dll differ diff --git a/Resources/Dependencies/ILSpy/ICSharpCode.TreeView.dll b/Resources/Dependencies/ILSpy/ICSharpCode.TreeView.dll index 7767c5abba..37602a5b76 100644 Binary files a/Resources/Dependencies/ILSpy/ICSharpCode.TreeView.dll and b/Resources/Dependencies/ILSpy/ICSharpCode.TreeView.dll differ diff --git a/Resources/Dependencies/ILSpy/ILSpy.BamlDecompiler.Plugin.dll b/Resources/Dependencies/ILSpy/ILSpy.BamlDecompiler.Plugin.dll index 6ee1b165b2..b539eb2274 100644 Binary files a/Resources/Dependencies/ILSpy/ILSpy.BamlDecompiler.Plugin.dll and b/Resources/Dependencies/ILSpy/ILSpy.BamlDecompiler.Plugin.dll differ diff --git a/Resources/Dependencies/ILSpy/ILSpy.exe b/Resources/Dependencies/ILSpy/ILSpy.exe index 9435de4825..cdcf4559c6 100644 Binary files a/Resources/Dependencies/ILSpy/ILSpy.exe and b/Resources/Dependencies/ILSpy/ILSpy.exe differ diff --git a/Resources/Dependencies/ILSpy/ILSpy.exe.config b/Resources/Dependencies/ILSpy/ILSpy.exe.config index 344a3375d9..9e9603cee4 100644 --- a/Resources/Dependencies/ILSpy/ILSpy.exe.config +++ b/Resources/Dependencies/ILSpy/ILSpy.exe.config @@ -1,10 +1,10 @@ - + - + @@ -14,41 +14,340 @@ - + - - + + - - + + + + + - - + + + + - - + + + + - - + + + + + + + + + + - - + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/Dependencies/ILSpy/Microsoft.Win32.Primitives.dll b/Resources/Dependencies/ILSpy/Microsoft.Win32.Primitives.dll new file mode 100644 index 0000000000..8b69a69bc7 Binary files /dev/null and b/Resources/Dependencies/ILSpy/Microsoft.Win32.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/Mono.Cecil.Mdb.dll b/Resources/Dependencies/ILSpy/Mono.Cecil.Mdb.dll index b446953863..bd1924b56e 100644 Binary files a/Resources/Dependencies/ILSpy/Mono.Cecil.Mdb.dll and b/Resources/Dependencies/ILSpy/Mono.Cecil.Mdb.dll differ diff --git a/Resources/Dependencies/ILSpy/Mono.Cecil.Pdb.dll b/Resources/Dependencies/ILSpy/Mono.Cecil.Pdb.dll index bff1a30e1f..48b7f40629 100644 Binary files a/Resources/Dependencies/ILSpy/Mono.Cecil.Pdb.dll and b/Resources/Dependencies/ILSpy/Mono.Cecil.Pdb.dll differ diff --git a/Resources/Dependencies/ILSpy/Mono.Cecil.Rocks.dll b/Resources/Dependencies/ILSpy/Mono.Cecil.Rocks.dll index 8e3e779b32..3e4643cb4b 100644 Binary files a/Resources/Dependencies/ILSpy/Mono.Cecil.Rocks.dll and b/Resources/Dependencies/ILSpy/Mono.Cecil.Rocks.dll differ diff --git a/Resources/Dependencies/ILSpy/Mono.Cecil.dll b/Resources/Dependencies/ILSpy/Mono.Cecil.dll index 8275c7bb22..4484f7829f 100644 Binary files a/Resources/Dependencies/ILSpy/Mono.Cecil.dll and b/Resources/Dependencies/ILSpy/Mono.Cecil.dll differ diff --git a/Resources/Dependencies/ILSpy/OSVersionHelper.dll b/Resources/Dependencies/ILSpy/OSVersionHelper.dll new file mode 100644 index 0000000000..940eacbfe7 Binary files /dev/null and b/Resources/Dependencies/ILSpy/OSVersionHelper.dll differ diff --git a/Resources/Dependencies/ILSpy/System.AppContext.dll b/Resources/Dependencies/ILSpy/System.AppContext.dll new file mode 100644 index 0000000000..4ccc058f39 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.AppContext.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Collections.Concurrent.dll b/Resources/Dependencies/ILSpy/System.Collections.Concurrent.dll new file mode 100644 index 0000000000..26f10d1747 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Collections.Concurrent.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Collections.Immutable.dll b/Resources/Dependencies/ILSpy/System.Collections.Immutable.dll index ce6fc0e8d0..049149f179 100644 Binary files a/Resources/Dependencies/ILSpy/System.Collections.Immutable.dll and b/Resources/Dependencies/ILSpy/System.Collections.Immutable.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Collections.NonGeneric.dll b/Resources/Dependencies/ILSpy/System.Collections.NonGeneric.dll new file mode 100644 index 0000000000..9da235aef1 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Collections.NonGeneric.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Collections.Specialized.dll b/Resources/Dependencies/ILSpy/System.Collections.Specialized.dll new file mode 100644 index 0000000000..fbd4fc7a25 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Collections.Specialized.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Collections.dll b/Resources/Dependencies/ILSpy/System.Collections.dll new file mode 100644 index 0000000000..72ac2059f7 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Collections.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ComponentModel.EventBasedAsync.dll b/Resources/Dependencies/ILSpy/System.ComponentModel.EventBasedAsync.dll new file mode 100644 index 0000000000..37742d4752 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.ComponentModel.EventBasedAsync.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ComponentModel.Primitives.dll b/Resources/Dependencies/ILSpy/System.ComponentModel.Primitives.dll new file mode 100644 index 0000000000..b0c4b683ac Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.ComponentModel.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ComponentModel.TypeConverter.dll b/Resources/Dependencies/ILSpy/System.ComponentModel.TypeConverter.dll new file mode 100644 index 0000000000..fb42b4494e Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.ComponentModel.TypeConverter.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ComponentModel.dll b/Resources/Dependencies/ILSpy/System.ComponentModel.dll new file mode 100644 index 0000000000..8e2d829752 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.ComponentModel.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Console.dll b/Resources/Dependencies/ILSpy/System.Console.dll new file mode 100644 index 0000000000..fe61bccd8d Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Console.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Data.Common.dll b/Resources/Dependencies/ILSpy/System.Data.Common.dll new file mode 100644 index 0000000000..05e3481bb7 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Data.Common.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.Contracts.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.Contracts.dll new file mode 100644 index 0000000000..98f40ebc67 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.Contracts.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.Debug.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.Debug.dll new file mode 100644 index 0000000000..a51c0cfa46 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.Debug.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.FileVersionInfo.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.FileVersionInfo.dll new file mode 100644 index 0000000000..3c203b00ca Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.FileVersionInfo.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.Process.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.Process.dll new file mode 100644 index 0000000000..b537e62c1c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.Process.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.StackTrace.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.StackTrace.dll new file mode 100644 index 0000000000..5dfaad67e4 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.StackTrace.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.TextWriterTraceListener.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.TextWriterTraceListener.dll new file mode 100644 index 0000000000..a5720da26b Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.TextWriterTraceListener.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.Tools.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.Tools.dll new file mode 100644 index 0000000000..bd9deaed07 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.Tools.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.TraceSource.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.TraceSource.dll new file mode 100644 index 0000000000..5474eb2a63 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.TraceSource.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Diagnostics.Tracing.dll b/Resources/Dependencies/ILSpy/System.Diagnostics.Tracing.dll new file mode 100644 index 0000000000..5b8b2b42db Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Diagnostics.Tracing.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Drawing.Primitives.dll b/Resources/Dependencies/ILSpy/System.Drawing.Primitives.dll new file mode 100644 index 0000000000..1eeacc4c69 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Drawing.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Dynamic.Runtime.dll b/Resources/Dependencies/ILSpy/System.Dynamic.Runtime.dll new file mode 100644 index 0000000000..d34b388c03 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Dynamic.Runtime.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Globalization.Calendars.dll b/Resources/Dependencies/ILSpy/System.Globalization.Calendars.dll new file mode 100644 index 0000000000..4a198bc14d Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Globalization.Calendars.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Globalization.Extensions.dll b/Resources/Dependencies/ILSpy/System.Globalization.Extensions.dll new file mode 100644 index 0000000000..99f9e4afe7 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Globalization.Extensions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Globalization.dll b/Resources/Dependencies/ILSpy/System.Globalization.dll new file mode 100644 index 0000000000..dd3d2e303a Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Globalization.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.Compression.ZipFile.dll b/Resources/Dependencies/ILSpy/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000000..345acbddb5 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.Compression.ZipFile.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.Compression.dll b/Resources/Dependencies/ILSpy/System.IO.Compression.dll new file mode 100644 index 0000000000..ebbb503e8f Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.Compression.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.FileSystem.DriveInfo.dll b/Resources/Dependencies/ILSpy/System.IO.FileSystem.DriveInfo.dll new file mode 100644 index 0000000000..5c59398920 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.FileSystem.DriveInfo.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.FileSystem.Primitives.dll b/Resources/Dependencies/ILSpy/System.IO.FileSystem.Primitives.dll new file mode 100644 index 0000000000..de4c49fc9f Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.FileSystem.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.FileSystem.Watcher.dll b/Resources/Dependencies/ILSpy/System.IO.FileSystem.Watcher.dll new file mode 100644 index 0000000000..228d60be71 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.FileSystem.Watcher.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.FileSystem.dll b/Resources/Dependencies/ILSpy/System.IO.FileSystem.dll new file mode 100644 index 0000000000..6934080d37 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.FileSystem.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.IsolatedStorage.dll b/Resources/Dependencies/ILSpy/System.IO.IsolatedStorage.dll new file mode 100644 index 0000000000..356e123c91 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.IsolatedStorage.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.MemoryMappedFiles.dll b/Resources/Dependencies/ILSpy/System.IO.MemoryMappedFiles.dll new file mode 100644 index 0000000000..add3b2965a Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.MemoryMappedFiles.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.Pipes.dll b/Resources/Dependencies/ILSpy/System.IO.Pipes.dll new file mode 100644 index 0000000000..e5690c468b Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.Pipes.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.UnmanagedMemoryStream.dll b/Resources/Dependencies/ILSpy/System.IO.UnmanagedMemoryStream.dll new file mode 100644 index 0000000000..cdd7427dc9 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.UnmanagedMemoryStream.dll differ diff --git a/Resources/Dependencies/ILSpy/System.IO.dll b/Resources/Dependencies/ILSpy/System.IO.dll new file mode 100644 index 0000000000..e9eb534a33 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.IO.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Linq.Expressions.dll b/Resources/Dependencies/ILSpy/System.Linq.Expressions.dll new file mode 100644 index 0000000000..63b570c890 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Linq.Expressions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Linq.Parallel.dll b/Resources/Dependencies/ILSpy/System.Linq.Parallel.dll new file mode 100644 index 0000000000..d8d097ee02 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Linq.Parallel.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Linq.Queryable.dll b/Resources/Dependencies/ILSpy/System.Linq.Queryable.dll new file mode 100644 index 0000000000..404bbe2162 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Linq.Queryable.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Linq.dll b/Resources/Dependencies/ILSpy/System.Linq.dll new file mode 100644 index 0000000000..42cd93b460 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Linq.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Http.dll b/Resources/Dependencies/ILSpy/System.Net.Http.dll new file mode 100644 index 0000000000..1c5c6fd374 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Http.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.NameResolution.dll b/Resources/Dependencies/ILSpy/System.Net.NameResolution.dll new file mode 100644 index 0000000000..e8a65c06b3 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.NameResolution.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.NetworkInformation.dll b/Resources/Dependencies/ILSpy/System.Net.NetworkInformation.dll new file mode 100644 index 0000000000..543a6cfebd Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.NetworkInformation.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Ping.dll b/Resources/Dependencies/ILSpy/System.Net.Ping.dll new file mode 100644 index 0000000000..eeb4666c20 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Ping.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Primitives.dll b/Resources/Dependencies/ILSpy/System.Net.Primitives.dll new file mode 100644 index 0000000000..8a929ae801 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Requests.dll b/Resources/Dependencies/ILSpy/System.Net.Requests.dll new file mode 100644 index 0000000000..5cf38f84d4 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Requests.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Security.dll b/Resources/Dependencies/ILSpy/System.Net.Security.dll new file mode 100644 index 0000000000..eacb8a18fc Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Security.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.Sockets.dll b/Resources/Dependencies/ILSpy/System.Net.Sockets.dll new file mode 100644 index 0000000000..9716795eeb Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.Sockets.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.WebHeaderCollection.dll b/Resources/Dependencies/ILSpy/System.Net.WebHeaderCollection.dll new file mode 100644 index 0000000000..0238e69013 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.WebHeaderCollection.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.WebSockets.Client.dll b/Resources/Dependencies/ILSpy/System.Net.WebSockets.Client.dll new file mode 100644 index 0000000000..3275912c8c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.WebSockets.Client.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Net.WebSockets.dll b/Resources/Dependencies/ILSpy/System.Net.WebSockets.dll new file mode 100644 index 0000000000..7a74189753 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Net.WebSockets.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ObjectModel.dll b/Resources/Dependencies/ILSpy/System.ObjectModel.dll new file mode 100644 index 0000000000..37e11894e6 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.ObjectModel.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Reflection.Extensions.dll b/Resources/Dependencies/ILSpy/System.Reflection.Extensions.dll new file mode 100644 index 0000000000..6d12687c90 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Reflection.Extensions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Reflection.Metadata.dll b/Resources/Dependencies/ILSpy/System.Reflection.Metadata.dll new file mode 100644 index 0000000000..52082366b0 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Reflection.Metadata.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Reflection.Primitives.dll b/Resources/Dependencies/ILSpy/System.Reflection.Primitives.dll new file mode 100644 index 0000000000..2c160e9f6e Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Reflection.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Reflection.dll b/Resources/Dependencies/ILSpy/System.Reflection.dll new file mode 100644 index 0000000000..ec0b3d230b Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Reflection.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Resources.Reader.dll b/Resources/Dependencies/ILSpy/System.Resources.Reader.dll new file mode 100644 index 0000000000..a34c6936d2 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Resources.Reader.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Resources.ResourceManager.dll b/Resources/Dependencies/ILSpy/System.Resources.ResourceManager.dll new file mode 100644 index 0000000000..c4a14ceea0 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Resources.ResourceManager.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Resources.Writer.dll b/Resources/Dependencies/ILSpy/System.Resources.Writer.dll new file mode 100644 index 0000000000..0ce294688c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Resources.Writer.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.CompilerServices.VisualC.dll b/Resources/Dependencies/ILSpy/System.Runtime.CompilerServices.VisualC.dll new file mode 100644 index 0000000000..30a2f814f3 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.CompilerServices.VisualC.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Extensions.dll b/Resources/Dependencies/ILSpy/System.Runtime.Extensions.dll new file mode 100644 index 0000000000..eb0e80b14c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Extensions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Handles.dll b/Resources/Dependencies/ILSpy/System.Runtime.Handles.dll new file mode 100644 index 0000000000..37f15ff035 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Handles.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.RuntimeInformation.dll b/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.RuntimeInformation.dll new file mode 100644 index 0000000000..c8d62f4f92 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.RuntimeInformation.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.dll b/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.dll new file mode 100644 index 0000000000..ab5442952c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.InteropServices.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Numerics.dll b/Resources/Dependencies/ILSpy/System.Runtime.Numerics.dll new file mode 100644 index 0000000000..3202cd9b1f Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Numerics.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Formatters.dll b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Formatters.dll new file mode 100644 index 0000000000..06b548054f Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Formatters.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Json.dll b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Json.dll new file mode 100644 index 0000000000..1f30098f05 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Json.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Primitives.dll b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Primitives.dll new file mode 100644 index 0000000000..19a6dd21d0 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Xml.dll b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Xml.dll new file mode 100644 index 0000000000..3a839e2440 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.Serialization.Xml.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Runtime.dll b/Resources/Dependencies/ILSpy/System.Runtime.dll new file mode 100644 index 0000000000..344ee77a8e Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Runtime.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Claims.dll b/Resources/Dependencies/ILSpy/System.Security.Claims.dll new file mode 100644 index 0000000000..9cb6423355 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Claims.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Cryptography.Algorithms.dll b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Algorithms.dll new file mode 100644 index 0000000000..01b7bb5b3c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Algorithms.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Cryptography.Csp.dll b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Csp.dll new file mode 100644 index 0000000000..d7721e716e Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Csp.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Cryptography.Encoding.dll b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Encoding.dll new file mode 100644 index 0000000000..f588614108 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Encoding.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Cryptography.Primitives.dll b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Primitives.dll new file mode 100644 index 0000000000..35a21ef6e9 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Cryptography.Primitives.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Cryptography.X509Certificates.dll b/Resources/Dependencies/ILSpy/System.Security.Cryptography.X509Certificates.dll new file mode 100644 index 0000000000..53d05b2204 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Cryptography.X509Certificates.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.Principal.dll b/Resources/Dependencies/ILSpy/System.Security.Principal.dll new file mode 100644 index 0000000000..6d7c2ba7c1 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.Principal.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Security.SecureString.dll b/Resources/Dependencies/ILSpy/System.Security.SecureString.dll new file mode 100644 index 0000000000..355a050dd1 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Security.SecureString.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Text.Encoding.Extensions.dll b/Resources/Dependencies/ILSpy/System.Text.Encoding.Extensions.dll new file mode 100644 index 0000000000..4f2b83dce8 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Text.Encoding.Extensions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Text.Encoding.dll b/Resources/Dependencies/ILSpy/System.Text.Encoding.dll new file mode 100644 index 0000000000..557551f37c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Text.Encoding.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Text.RegularExpressions.dll b/Resources/Dependencies/ILSpy/System.Text.RegularExpressions.dll new file mode 100644 index 0000000000..1a64a17cc6 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Text.RegularExpressions.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.Overlapped.dll b/Resources/Dependencies/ILSpy/System.Threading.Overlapped.dll new file mode 100644 index 0000000000..5d7e7b7cdb Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.Overlapped.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.Tasks.Parallel.dll b/Resources/Dependencies/ILSpy/System.Threading.Tasks.Parallel.dll new file mode 100644 index 0000000000..c4df330cc9 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.Tasks.Parallel.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.Tasks.dll b/Resources/Dependencies/ILSpy/System.Threading.Tasks.dll new file mode 100644 index 0000000000..25999be8cb Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.Tasks.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.Thread.dll b/Resources/Dependencies/ILSpy/System.Threading.Thread.dll new file mode 100644 index 0000000000..9b7da65e52 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.Thread.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.ThreadPool.dll b/Resources/Dependencies/ILSpy/System.Threading.ThreadPool.dll new file mode 100644 index 0000000000..9405b8fcaf Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.ThreadPool.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.Timer.dll b/Resources/Dependencies/ILSpy/System.Threading.Timer.dll new file mode 100644 index 0000000000..c9eae71c8e Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.Timer.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Threading.dll b/Resources/Dependencies/ILSpy/System.Threading.dll new file mode 100644 index 0000000000..deae2be716 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Threading.dll differ diff --git a/Resources/Dependencies/ILSpy/System.ValueTuple.dll b/Resources/Dependencies/ILSpy/System.ValueTuple.dll index 78a185143e..502f8cd477 100644 Binary files a/Resources/Dependencies/ILSpy/System.ValueTuple.dll and b/Resources/Dependencies/ILSpy/System.ValueTuple.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.ReaderWriter.dll b/Resources/Dependencies/ILSpy/System.Xml.ReaderWriter.dll new file mode 100644 index 0000000000..24df9a0fba Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.ReaderWriter.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.XDocument.dll b/Resources/Dependencies/ILSpy/System.Xml.XDocument.dll new file mode 100644 index 0000000000..cbbc4f0b64 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.XDocument.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.XPath.XDocument.dll b/Resources/Dependencies/ILSpy/System.Xml.XPath.XDocument.dll new file mode 100644 index 0000000000..0830ed180c Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.XPath.XDocument.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.XPath.dll b/Resources/Dependencies/ILSpy/System.Xml.XPath.dll new file mode 100644 index 0000000000..8327f2e834 Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.XPath.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.XmlDocument.dll b/Resources/Dependencies/ILSpy/System.Xml.XmlDocument.dll new file mode 100644 index 0000000000..4f044b1d4f Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.XmlDocument.dll differ diff --git a/Resources/Dependencies/ILSpy/System.Xml.XmlSerializer.dll b/Resources/Dependencies/ILSpy/System.Xml.XmlSerializer.dll new file mode 100644 index 0000000000..7b47de889a Binary files /dev/null and b/Resources/Dependencies/ILSpy/System.Xml.XmlSerializer.dll differ diff --git a/Resources/Dependencies/ILSpy/netstandard.dll b/Resources/Dependencies/ILSpy/netstandard.dll new file mode 100644 index 0000000000..1f1ab22caa Binary files /dev/null and b/Resources/Dependencies/ILSpy/netstandard.dll differ diff --git a/Resources/Dependencies/ILSpy/zh-Hans/ILSpy.resources.dll b/Resources/Dependencies/ILSpy/zh-Hans/ILSpy.resources.dll new file mode 100644 index 0000000000..d12efc9d22 Binary files /dev/null and b/Resources/Dependencies/ILSpy/zh-Hans/ILSpy.resources.dll differ diff --git a/Resources/Dependencies/versions.txt b/Resources/Dependencies/versions.txt deleted file mode 100644 index bdce4505e1..0000000000 --- a/Resources/Dependencies/versions.txt +++ /dev/null @@ -1,2 +0,0 @@ -mono.cecil 0.9.4 built from source for .net 4 -SQLite 1.0.84.0 \ No newline at end of file diff --git a/SOLUTIONS.md b/SOLUTIONS.md new file mode 100644 index 0000000000..d92db07f5b --- /dev/null +++ b/SOLUTIONS.md @@ -0,0 +1,39 @@ +# Visual Studio Solutions + +## `Build.sln` +Currently contains every used Cosmos component for +using by Cosmos Builder to compile and pack code. +Do not use it in Visual Studio directly and do not +modify it, unless you know what you're doing. + +## `Builder.sln` +Currently contains only Cosmos Builder app project +that used to compile, pack and install Cosmos. + +## `IDE.sln` +Currently contains Visual Studio extensions for VS +integration. Do not confuse with `Kernel.sln`. + +## `Kernel.sln` +Currently contains the main Cosmos code that runs on +target virtual machines. If you want to modify OS +behavior more percisely, contribute to this solution. +### Cosmos.System2 +Contains the highest library, that controls entire +system abstractly, as another manage mostly hardware. +### Cosmos.HAL2 +Contains Hardware Abstraction Layer and most of +system drivers used by Cosmos. These include PS/2, +PCI, PIT, etc. +### Cosmos.Core +Contains the most basic things that used by NET BCL +and Cosmos, such as Plugs and XSharp snippets. + +## `Demos.sln` +Currently contains user-made Cosmos project examples. +Also, it can be used as test solution + +## `Test.sln` +Currently contains all unit tests that Cosmos uses +to ensure that there are no bugs. You can use it while +development of new features of DevKit to test new changes diff --git a/Setup/Cosmos.iss b/Setup/Cosmos.iss index 15ec8a35bb..51ac78c87f 100644 --- a/Setup/Cosmos.iss +++ b/Setup/Cosmos.iss @@ -12,31 +12,38 @@ #endif #ifndef VSVersion - #define VSVersion "vs2017" + #define VSVersion "vs2022" +#endif + +#ifndef RealPath + #define RealPath "{userappdata}" #endif #if BuildConfiguration == "DevKit" ; devkit releases are not compressed #pragma warning "Building Dev Kit release" + #define VerName "Cosmos Dev Kit" #else ; userkit releases get compressed, and get languages included #pragma message "Building User Kit release" + #define VerName "Cosmos User Kit" #define Compress true #define IncludeUILanguages true #endif [Setup] AppId=CosmosUserKit -AppName=Cosmos User Kit -AppVerName=Cosmos User Kit v{#ChangeSetVersion} -AppCopyright=Copyright (c) 2007-2017 The Cosmos Project +AppName={#VerName} +AppVerName={#VerName} v{#ChangeSetVersion} +AppCopyright=Copyright (c) 2007-2025 The Cosmos Project AppPublisher=Cosmos Project -AppPublisherURL=http://www.goCosmos.org/ -AppSupportURL=http://www.goCosmos.org/ -AppUpdatesURL=http://www.goCosmos.org/ +AppPublisherURL=http://www.gocosmos.org/ +AppSupportURL=http://www.gocosmos.org/ +AppUpdatesURL=http://www.gocosmos.org/ AppVersion={#ChangeSetVersion} SetupMutex=CosmosSetupMutexName,Global\CosmoSetupMutexName -DefaultDirName={userappdata}\Cosmos User Kit +UsePreviousAppDir=false +DefaultDirName={#RealPath}\Cosmos User Kit DefaultGroupName=Cosmos User Kit OutputDir=.\Setup\Output OutputBaseFilename=CosmosUserKit-{#ChangeSetVersion}-{#VSVersion} @@ -64,9 +71,10 @@ AlwaysShowComponentsList=False ShowComponentSizes=False LicenseFile=LICENSE.txt DisableDirPage=no +WizardStyle=modern [Messages] -SelectDirDesc=If the user installing the Cosmos User Kit is not the admin. Please choose the corresponding AppData/Roaming directory. +SelectDirDesc=If the user installing the Cosmos User Kit is not the admin, please choose the users AppData/Roaming directory [Dirs] Name: {app}; Flags: uninsalwaysuninstall @@ -77,10 +85,10 @@ Type: filesandordirs; Name: "{app}" [Files] ; Tools Source: ".\Build\Tools\*.exe"; DestDir: "{app}\Build\Tools"; Flags: ignoreversion uninsremovereadonly -Source: ".\Build\Tools\NAsm\*.exe"; DestDir: "{app}\Build\Tools\NAsm"; Flags: ignoreversion uninsremovereadonly +Source: ".\Build\Tools\Yasm\*.exe"; DestDir: "{app}\Build\Tools\Yasm"; Flags: ignoreversion uninsremovereadonly Source: ".\Build\Tools\Cygwin\*"; DestDir: "{app}\Build\Tools\cygwin"; Flags: ignoreversion uninsremovereadonly overwritereadonly -Source: ".\Build\Tools\mkisofs\*"; DestDir: "{app}\Build\Tools\mkisofs"; Flags: ignoreversion uninsremovereadonly overwritereadonly -Source: ".\Build\VSIP\IL2CPU\*"; DestDir: "{app}\Build\IL2CPU"; Flags: ignoreversion uninsremovereadonly +Source: ".\source\Cosmos.Build.Tasks\tools\xorriso\win\*"; DestDir: "{app}\Build\Tools\xorriso"; Flags: ignoreversion uninsremovereadonly overwritereadonly +Source: ".\Build\VSIP\IL2CPU\*"; DestDir: "{app}\Build\IL2CPU"; Flags: ignoreversion uninsremovereadonly recursesubdirs ;Source: ".\Build\VSIP\XSharp\*"; DestDir: "{app}\Build\XSharp"; Flags: ignoreversion uninsremovereadonly Source: ".\Build\VSIP\Cosmos.Deploy.USB.exe"; DestDir: "{app}\Build\Tools"; Flags: ignoreversion uninsremovereadonly Source: ".\Build\VSIP\Cosmos.Deploy.Pixie.exe"; DestDir: "{app}\Build\Tools"; Flags: ignoreversion uninsremovereadonly @@ -100,27 +108,17 @@ Source: ".\Artwork\Cosmos.ico"; DestDir: "{app}"; Flags: ignoreversion uninsremo ; XSharp Source: ".\Artwork\XSharp\XSharp.ico"; DestDir: "{app}\XSharp\"; Flags: ignoreversion uninsremovereadonly Source: "..\IL2CPU\source\Cosmos.Core.DebugStub\*.xs"; DestDir: "{app}\XSharp\DebugStub\"; Flags: ignoreversion uninsremovereadonly -; VMware +; HyperV Source: ".\Build\HyperV\*"; DestDir: "{app}\Build\HyperV"; Flags: ignoreversion uninsremovereadonly overwritereadonly recursesubdirs ; VMware Source: ".\Build\VMware\*"; DestDir: "{app}\Build\VMware"; Flags: ignoreversion uninsremovereadonly overwritereadonly recursesubdirs ; ISO -Source: ".\Build\syslinux\isolinux.bin"; DestDir: "{app}\Build\ISO\" -Source: ".\Build\syslinux\ldlinux.c32"; DestDir: "{app}\Build\ISO\" -Source: ".\Build\syslinux\libcom32.c32"; DestDir: "{app}\Build\ISO\" -Source: ".\Build\syslinux\mboot.c32"; DestDir: "{app}\Build\ISO\" -Source: ".\Build\syslinux\syslinux.cfg"; DestDir: "{app}\Build\ISO\" +Source: ".\Build\limine\boot\limine.cfg"; DestDir: "{app}\Build\ISO\boot\limine\" +Source: ".\source\Cosmos.Build.Tasks\tools\limine\boot\*"; DestDir: "{app}\Build\ISO\boot\limine\" ; USB -Source: ".\Build\syslinux\ldlinux.c32"; DestDir: "{app}\Build\USB\" -Source: ".\Build\syslinux\libcom32.c32"; DestDir: "{app}\Build\USB\" -Source: ".\Build\syslinux\mboot.c32"; DestDir: "{app}\Build\USB\" -Source: ".\Build\syslinux\syslinux.cfg"; DestDir: "{app}\Build\USB\" +Source: ".\Build\limine\boot\limine.cfg"; DestDir: "{app}\Build\USB\boot\limine\" ; PXE -Source: ".\Build\syslinux\pxelinux.0"; DestDir: "{app}\Build\PXE" -Source: ".\Build\syslinux\mboot.c32"; DestDir: "{app}\Build\PXE\" -Source: ".\Build\syslinux\ldlinux.c32"; DestDir: "{app}\Build\PXE\" -Source: ".\Build\syslinux\libcom32.c32"; DestDir: "{app}\Build\PXE\" -Source: ".\Build\syslinux\syslinux.cfg"; DestDir: "{app}\Build\PXE\pxelinux.cfg"; DestName: "default" +Source: ".\Build\limine\boot\limine.cfg"; DestDir: "{app}\Build\PXE\boot\limine\" ; VSIP Source: ".\Build\Tools\VSIXBootstrapper.exe"; DestDir: "{app}\Build\Tools"; Flags: ignoreversion uninsremovereadonly Source: ".\Build\VSIP\Cosmos.VS.DebugEngine.vsix"; DestDir: "{app}\VSIX\"; Flags: ignoreversion uninsremovereadonly @@ -145,12 +143,14 @@ UseRelativePaths=True [Run] Filename: "{app}\Build\Tools\nuget.exe"; Parameters: "sources Remove -Name ""Cosmos Local Package Feed"""; WorkingDir: "{app}"; Description: "Uninstall Kernel Packages"; StatusMsg: "Uninstalling Kernel Packages" Filename: "{app}\Build\Tools\nuget.exe"; Parameters: "sources Add -Name ""Cosmos Local Package Feed"" -Source ""{app}\packages\\"""; WorkingDir: "{app}"; Description: "Install Kernel Packages"; StatusMsg: "Installing Kernel Packages" - +Filename: "{app}\Build\Tools\nuget.exe"; Parameters: "nuget locals all -Clear"; WorkingDir: "{app}"; Description: "Install Kernel Packages"; StatusMsg: "Clearing nuget cache" +#ifndef DoNotInstallExtensions Filename: "{app}\Build\Tools\VSIXBootstrapper.exe"; Parameters: "/q /u:Cosmos.VS.ProjectSystem"; Description: "Remove Cosmos Project System"; StatusMsg: "Removing Visual Studio Extension: Cosmos Project System" Filename: "{app}\Build\Tools\VSIXBootstrapper.exe"; Parameters: "/q /u:Cosmos.VS.DebugEngine"; Description: "Remove Cosmos Debug Engine"; StatusMsg: "Removing Visual Studio Extension: Cosmos Debug Engine" Filename: "{app}\Build\Tools\VSIXBootstrapper.exe"; Parameters: "/q Cosmos.VS.DebugEngine.vsix"; WorkingDir: "{app}\VSIX\"; Description: "Install Cosmos Debug Engine"; StatusMsg: "Installing Visual Studio Extension: Cosmos Debug Engine" Filename: "{app}\Build\Tools\VSIXBootstrapper.exe"; Parameters: "/q Cosmos.VS.ProjectSystem.vsix"; WorkingDir: "{app}\VSIX\"; Description: "Install Cosmos Project System"; StatusMsg: "Installing Visual Studio Extension: Cosmos Project System" +#endif [UninstallRun] Filename: "{app}\Build\Tools\nuget.exe"; Parameters: "sources Remove -Name ""Cosmos Local Package Feed"""; WorkingDir: "{app}"; StatusMsg: "Uninstalling Kernel Packages" @@ -274,7 +274,7 @@ var ResultText: AnsiString; begin Command := ExpandConstant('{app}\Build\Tools\vswhere.exe'); - Params := '-latest -version "[15.0,16.0)" -requires Microsoft.Component.MSBuild -property installationPath'; + Params := '-latest -version "[17.0,18.0)" -requires Microsoft.Component.MSBuild -property installationPath'; Success := ExecWithResult(Command, Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode, ResultText) or (ResultCode <> 0); @@ -363,38 +363,38 @@ begin end; [Languages] -Name: en; MessagesFile: compiler:Default.isl; InfoBeforeFile: .\setup\Readme.txt +Name: en; MessagesFile: compiler:Default.isl; InfoBeforeFile: .\LICENSE.txt #ifdef IncludeUILanguages -Name: eu; MessagesFile: .\setup\Languages\Basque-1-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: ca; MessagesFile: .\setup\Languages\Catalan-4-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: cs; MessagesFile: .\setup\Languages\Czech-5-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: da; MessagesFile: .\setup\Languages\Danish-4-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: nl; MessagesFile: .\setup\Languages\Dutch-8-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: fi; MessagesFile: .\setup\Languages\Finnish-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: fr; MessagesFile: .\setup\Languages\French-15-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: de; MessagesFile: .\setup\Languages\German-2-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: hu; MessagesFile: .\setup\Languages\Hungarian-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: it; MessagesFile: .\setup\Languages\Italian-14-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: no; MessagesFile: .\setup\Languages\Norwegian-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: pl; MessagesFile: .\setup\Languages\Polish-8-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: pt; MessagesFile: .\setup\Languages\PortugueseStd-1-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: ru; MessagesFile: .\setup\Languages\Russian-19-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: sk; MessagesFile: .\setup\Languages\Slovak-6-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: sl; MessagesFile: .\setup\Languages\Slovenian-3-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt +Name: eu; MessagesFile: .\setup\Languages\Basque-1-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: ca; MessagesFile: .\setup\Languages\Catalan-4-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: cs; MessagesFile: .\setup\Languages\Czech-5-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: da; MessagesFile: .\setup\Languages\Danish-4-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: nl; MessagesFile: .\setup\Languages\Dutch-8-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: fi; MessagesFile: .\setup\Languages\Finnish-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: fr; MessagesFile: .\setup\Languages\French-15-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: de; MessagesFile: .\setup\Languages\German-2-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: hu; MessagesFile: .\setup\Languages\Hungarian-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: it; MessagesFile: .\setup\Languages\Italian-14-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: no; MessagesFile: .\setup\Languages\Norwegian-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: pl; MessagesFile: .\setup\Languages\Polish-8-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: pt; MessagesFile: .\setup\Languages\PortugueseStd-1-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: ru; MessagesFile: .\setup\Languages\Russian-19-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: sk; MessagesFile: .\setup\Languages\Slovak-6-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: sl; MessagesFile: .\setup\Languages\Slovenian-3-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt ;Unofficial: -Name: bg; MessagesFile: .\setup\Languages\InOfficial\Bulgarian-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: el; MessagesFile: .\setup\Languages\InOfficial\Greek-4-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: is; MessagesFile: .\setup\Languages\InOfficial\Icelandic-1-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: id; MessagesFile: .\setup\Languages\InOfficial\Indonesian-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: ja; MessagesFile: .\setup\Languages\InOfficial\Japanese-5-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: ko; MessagesFile: .\setup\Languages\InOfficial\Korean-5-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: ms; MessagesFile: .\setup\Languages\InOfficial\Malaysian-2-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: es; MessagesFile: .\setup\Languages\InOfficial\SpanishStd-2-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: sv; MessagesFile: .\setup\Languages\InOfficial\Swedish-8-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: tr; MessagesFile: .\setup\Languages\InOfficial\Turkish-3-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: uk; MessagesFile: .\setup\Languages\InOfficial\Ukrainian-5-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: cn; MessagesFile: .\setup\Languages\InOfficial\ChineseSimp-11-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt -Name: tw; MessagesFile: .\setup\Languages\InOfficial\ChineseTrad-2-5.1.0.isl; InfoBeforeFile: .\setup\Readme.txt +Name: bg; MessagesFile: .\setup\Languages\InOfficial\Bulgarian-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: el; MessagesFile: .\setup\Languages\InOfficial\Greek-4-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: is; MessagesFile: .\setup\Languages\InOfficial\Icelandic-1-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: id; MessagesFile: .\setup\Languages\InOfficial\Indonesian-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: ja; MessagesFile: .\setup\Languages\InOfficial\Japanese-5-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: ko; MessagesFile: .\setup\Languages\InOfficial\Korean-5-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: ms; MessagesFile: .\setup\Languages\InOfficial\Malaysian-2-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: es; MessagesFile: .\setup\Languages\InOfficial\SpanishStd-2-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: sv; MessagesFile: .\setup\Languages\InOfficial\Swedish-8-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: tr; MessagesFile: .\setup\Languages\InOfficial\Turkish-3-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: uk; MessagesFile: .\setup\Languages\InOfficial\Ukrainian-5-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: cn; MessagesFile: .\setup\Languages\InOfficial\ChineseSimp-11-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt +Name: tw; MessagesFile: .\setup\Languages\InOfficial\ChineseTrad-2-5.1.0.isl; InfoBeforeFile: .\LICENSE.txt #endif [Messages] @@ -430,4 +430,4 @@ tr.BeveledLabel=Turkish uk.BeveledLabel=Ukrainian cn.BeveledLabel=Chinese Simplified tw.BeveledLabel=Chinese Traditional -#endif +#endif diff --git a/Setup/ReadMe.txt b/Setup/ReadMe.txt deleted file mode 100644 index a8fa57ff49..0000000000 --- a/Setup/ReadMe.txt +++ /dev/null @@ -1 +0,0 @@ -Copyright © 2007-2018, The Cosmos Project diff --git a/Setup/images/cosmos.bmp b/Setup/images/cosmos.bmp index d0220e979f..4b3c2ddae9 100644 Binary files a/Setup/images/cosmos.bmp and b/Setup/images/cosmos.bmp differ diff --git a/Setup/images/cosmos_small.bmp b/Setup/images/cosmos_small.bmp index 3097d411c0..0c6a4158ec 100644 Binary files a/Setup/images/cosmos_small.bmp and b/Setup/images/cosmos_small.bmp differ diff --git a/Test.sln b/Test.sln index 3c86c12fab..be21518af8 100644 --- a/Test.sln +++ b/Test.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2010 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32602.215 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{DAEF99B5-22F0-4885-B45B-9B600B857E1C}" EndProject @@ -12,8 +12,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G2", "Kernel G2", "{ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{1A46752C-98F3-4DE3-B1FB-EDCE22E8AF73}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.Assembler", "..\XSharp\source\XSharp.Assembler\XSharp.Assembler.csproj", "{0CDB3F6E-7971-426B-81F8-38B966A54C2B}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Build.Common", "..\Common\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{F74A4B2B-02DA-455A-89FB-803A442B5B2C}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.IL2CPU", "..\IL2CPU\source\Cosmos.IL2CPU\Cosmos.IL2CPU.csproj", "{4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}" @@ -44,7 +42,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{CFE37077 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XSharp", "XSharp", "{E9CD521E-C386-466D-B5F7-A5EB19A61625}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp.csproj", "{72EB557A-8A2D-4B0F-823E-C70A791831B5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp", "..\XSharp\source\XSharp\XSharp\XSharp.csproj", "{72EB557A-8A2D-4B0F-823E-C70A791831B5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Plugs", "source\Cosmos.Core_Plugs\Cosmos.Core_Plugs.csproj", "{1132E689-18B0-4D87-94E8-934D4802C540}" EndProject @@ -108,42 +106,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core.Memory.Test", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Core_Asm", "source\Cosmos.Core_Asm\Cosmos.Core_Asm.csproj", "{B7077A34-D7F0-4422-BE7C-65DF26C65489}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernel G3", "Kernel G3", "{99192440-2DD7-4E71-B730-D44A73F46533}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "10 CPU", "10 CPU", "{29B893F7-6C0F-4710-A60E-7FB3498BCA63}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "20 Platform", "20 Platform", "{B4CB7BF5-CADF-4056-9C09-EAAC50BC76C0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "30 HAL", "30 HAL", "{E4299234-8323-43F6-B684-350A1232746B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "40 System", "40 System", "{DE38917F-969B-486C-AF83-C59E5E52400A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "50 Application", "50 Application", "{02FF94AF-6BA3-49ED-A027-A63F591C310D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "91 Plug", "91 Plug", "{1FC213DE-5033-40E1-9C16-5F1A0CDC9693}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU.x86", "source\Kernel-X86\10-CPU\Cosmos.CPU.x86\Cosmos.CPU.x86.csproj", "{4D219A6D-4528-4622-AF29-96F830C4D076}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Platform.PC", "source\Kernel-X86\20-Platform\Cosmos.Platform.PC\Cosmos.Platform.PC.csproj", "{6CBABA8D-4207-4E1E-8122-63DB51D25F18}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.HAL", "source\Kernel-X86\30-HAL\Cosmos.HAL\Cosmos.HAL.csproj", "{16ECD6DE-6F65-4A5C-8B49-A29782D9D057}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System", "source\Kernel-X86\40-System\Cosmos.System\Cosmos.System.csproj", "{F588033A-6B7D-4ABF-96C4-73D8B2271A6B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Plugs.TapRoot", "source\Kernel-X86\91-Plugs\Cosmos.Plugs.TapRoot\Cosmos.Plugs.TapRoot.csproj", "{756ECECD-B213-42F0-BF58-4A91B4C47FAA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU_Plugs", "source\Kernel-X86\10-CPU\Cosmos.CPU_Plugs\Cosmos.CPU_Plugs.csproj", "{C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.CPU_Asm", "source\Kernel-X86\10-CPU\Cosmos.CPU_Asm\Cosmos.CPU_Asm.csproj", "{0C7C9F9D-6498-45E8-B77B-FF4D381C3297}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TheRingMaster", "source\TheRingMaster\TheRingMaster.csproj", "{3DD192AF-2D72-449F-936C-ED8734225B18}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "92 CpuPlug", "92 CpuPlug", "{929EE8ED-6AD3-4442-A0C1-EC70665F2DCF}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spruce", "..\XSharp\source\Spruce\Spruce.csproj", "{FF46829E-B612-4D36-80BE-ED04521AD91A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XSharp.x86", "..\XSharp\source\XSharp.x86\XSharp.x86.csproj", "{D0EABA08-88C9-4F7C-BCA9-361B58B20D67}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Compiler.Tests.TypeSystem", "Tests\Kernels\Cosmos.Compiler.Tests.TypeSystem\Cosmos.Compiler.Tests.TypeSystem.csproj", "{D21A7C6C-A696-4EC3-84EB-70700C1E3B34}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleTest", "Tests\Kernels\ConsoleTest\ConsoleTest.csproj", "{0DF97CAC-220B-4DAD-B397-42E394255763}" @@ -166,10 +130,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.System.Tests", "Test EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Kernel.Tests.DiskManager", "Tests\Kernels\Cosmos.Kernel.Tests.DiskManager\Cosmos.Kernel.Tests.DiskManager.csproj", "{BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BECB26F1-8FE4-4C62-B74A-F2292B26CA70}" - ProjectSection(SolutionItems) = preProject - Build\Cosmos.ruleset = Build\Cosmos.ruleset - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProcessorTests", "Tests\Kernels\ProcessorTests\ProcessorTests.csproj", "{3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cosmos.Compiler.Tests.BclSystem", "Tests\Kernels\Cosmos.Compiler.Tests.Bcl.System\Cosmos.Compiler.Tests.BclSystem.csproj", "{30D9FA9C-0B4D-40FF-8903-6B9E9C825729}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetworkTest", "Tests\Kernels\NetworkTest\NetworkTest.csproj", "{96855A39-A96B-4BDB-A6AE-29676DFEF637}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DapperExtensions.StrongName", "Resources\Dependencies\DapperExtensions.StrongName\DapperExtensions.StrongName.csproj", "{AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Resources", "Resources", "{A45F0D24-1AF3-42BC-91A6-0262AFB1234D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AudioTests", "Tests\Kernels\AudioTests\AudioTests.csproj", "{8455DCAE-275E-47B3-B89B-2D9F3AB9977C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Plugs", "source\Cosmos.Plugs\Cosmos.Plugs.csproj", "{0C65F6CA-C897-40A3-A36E-0CCCAD01D567}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -177,16 +150,10 @@ Global Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 + TEST|Any CPU = TEST|Any CPU + TEST|x86 = TEST|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|x86.ActiveCfg = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Debug|x86.Build.0 = Debug|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|Any CPU.Build.0 = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|x86.ActiveCfg = Release|Any CPU - {0CDB3F6E-7971-426B-81F8-38B966A54C2B}.Release|x86.Build.0 = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -195,6 +162,10 @@ Global {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|Any CPU.Build.0 = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|x86.ActiveCfg = Release|Any CPU {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.Release|x86.Build.0 = Release|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|Any CPU.Build.0 = TEST|Any CPU + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|x86.ActiveCfg = TEST|x86 + {F74A4B2B-02DA-455A-89FB-803A442B5B2C}.TEST|x86.Build.0 = TEST|x86 {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Debug|Any CPU.Build.0 = Debug|Any CPU {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -203,6 +174,10 @@ Global {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Release|Any CPU.Build.0 = Release|Any CPU {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Release|x86.ActiveCfg = Release|Any CPU {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.Release|x86.Build.0 = Release|Any CPU + {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.TEST|Any CPU.Build.0 = TEST|Any CPU + {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.TEST|x86.ActiveCfg = TEST|Any CPU + {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767}.TEST|x86.Build.0 = TEST|Any CPU {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -211,6 +186,10 @@ Global {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Release|Any CPU.Build.0 = Release|Any CPU {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Release|x86.ActiveCfg = Release|Any CPU {34AEEB7C-FD5D-4B15-A830-B429681844BD}.Release|x86.Build.0 = Release|Any CPU + {34AEEB7C-FD5D-4B15-A830-B429681844BD}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {34AEEB7C-FD5D-4B15-A830-B429681844BD}.TEST|Any CPU.Build.0 = TEST|Any CPU + {34AEEB7C-FD5D-4B15-A830-B429681844BD}.TEST|x86.ActiveCfg = TEST|Any CPU + {34AEEB7C-FD5D-4B15-A830-B429681844BD}.TEST|x86.Build.0 = TEST|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|Any CPU.Build.0 = Debug|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -219,6 +198,10 @@ Global {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|Any CPU.Build.0 = Release|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|x86.ActiveCfg = Release|Any CPU {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.Release|x86.Build.0 = Release|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|Any CPU.Build.0 = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|x86.ActiveCfg = TEST|Any CPU + {A97A1EF7-AEEC-43F3-8CB0-5C7269DC7E85}.TEST|x86.Build.0 = TEST|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|Any CPU.Build.0 = Debug|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -227,6 +210,10 @@ Global {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|Any CPU.Build.0 = Release|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|x86.ActiveCfg = Release|Any CPU {BA661F30-9F3B-4356-B47B-D9C9375A473B}.Release|x86.Build.0 = Release|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|Any CPU.Build.0 = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|x86.ActiveCfg = TEST|Any CPU + {BA661F30-9F3B-4356-B47B-D9C9375A473B}.TEST|x86.Build.0 = TEST|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|Any CPU.Build.0 = Debug|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -235,6 +222,10 @@ Global {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|Any CPU.Build.0 = Release|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|x86.ActiveCfg = Release|Any CPU {5049175E-F1EE-4D8F-8354-F547444B8F10}.Release|x86.Build.0 = Release|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|Any CPU.Build.0 = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|x86.ActiveCfg = TEST|Any CPU + {5049175E-F1EE-4D8F-8354-F547444B8F10}.TEST|x86.Build.0 = TEST|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -243,6 +234,10 @@ Global {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|Any CPU.Build.0 = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|x86.ActiveCfg = Release|Any CPU {C9826909-2E5E-4453-93FA-B6BE4503DF02}.Release|x86.Build.0 = Release|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|Any CPU.Build.0 = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|x86.ActiveCfg = TEST|Any CPU + {C9826909-2E5E-4453-93FA-B6BE4503DF02}.TEST|x86.Build.0 = TEST|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|Any CPU.Build.0 = Debug|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -251,6 +246,10 @@ Global {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|Any CPU.Build.0 = Release|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|x86.ActiveCfg = Release|Any CPU {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.Release|x86.Build.0 = Release|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|Any CPU.Build.0 = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|x86.ActiveCfg = TEST|Any CPU + {ECC4319F-A844-45B8-BF63-2FD04F05E56A}.TEST|x86.Build.0 = TEST|Any CPU {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1425715D-1C93-44C7-8BB5-F124F195A41A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -259,6 +258,10 @@ Global {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|Any CPU.Build.0 = Release|Any CPU {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.ActiveCfg = Release|Any CPU {1425715D-1C93-44C7-8BB5-F124F195A41A}.Release|x86.Build.0 = Release|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.TEST|Any CPU.Build.0 = TEST|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.TEST|x86.ActiveCfg = TEST|Any CPU + {1425715D-1C93-44C7-8BB5-F124F195A41A}.TEST|x86.Build.0 = TEST|Any CPU {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -267,6 +270,10 @@ Global {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Release|Any CPU.Build.0 = Release|Any CPU {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Release|x86.ActiveCfg = Release|Any CPU {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.Release|x86.Build.0 = Release|Any CPU + {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.TEST|Any CPU.Build.0 = TEST|Any CPU + {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.TEST|x86.ActiveCfg = TEST|x86 + {9F5F046A-1BB1-4208-ADBE-C9417F2A8A48}.TEST|x86.Build.0 = TEST|x86 {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Build.0 = Debug|Any CPU {09099C80-8262-486A-94A5-492F51B08823}.Debug|Any CPU.Deploy.0 = Debug|Any CPU @@ -276,6 +283,10 @@ Global {09099C80-8262-486A-94A5-492F51B08823}.Release|Any CPU.Build.0 = Release|Any CPU {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.ActiveCfg = Release|Any CPU {09099C80-8262-486A-94A5-492F51B08823}.Release|x86.Build.0 = Release|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.TEST|Any CPU.Build.0 = TEST|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.TEST|x86.ActiveCfg = TEST|Any CPU + {09099C80-8262-486A-94A5-492F51B08823}.TEST|x86.Build.0 = TEST|Any CPU {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -284,6 +295,10 @@ Global {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|Any CPU.Build.0 = Release|Any CPU {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.ActiveCfg = Release|Any CPU {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.Release|x86.Build.0 = Release|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.TEST|Any CPU.Build.0 = TEST|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.TEST|x86.ActiveCfg = TEST|Any CPU + {9AF5BD03-8A49-49DC-A56E-3AE8DA6B0FF4}.TEST|x86.Build.0 = TEST|Any CPU {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|Any CPU.Build.0 = Debug|Any CPU {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -292,6 +307,10 @@ Global {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|Any CPU.Build.0 = Release|Any CPU {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.ActiveCfg = Release|Any CPU {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.Release|x86.Build.0 = Release|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.TEST|Any CPU.Build.0 = TEST|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.TEST|x86.ActiveCfg = TEST|Any CPU + {4AC1AFCE-C8CE-484D-AE22-F9EE27008FAF}.TEST|x86.Build.0 = TEST|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|Any CPU.Build.0 = Debug|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -300,6 +319,10 @@ Global {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|Any CPU.Build.0 = Release|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|x86.ActiveCfg = Release|Any CPU {72EB557A-8A2D-4B0F-823E-C70A791831B5}.Release|x86.Build.0 = Release|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|Any CPU.Build.0 = TEST|Any CPU + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|x86.ActiveCfg = TEST|x86 + {72EB557A-8A2D-4B0F-823E-C70A791831B5}.TEST|x86.Build.0 = TEST|x86 {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|Any CPU.Build.0 = Debug|Any CPU {1132E689-18B0-4D87-94E8-934D4802C540}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -308,6 +331,10 @@ Global {1132E689-18B0-4D87-94E8-934D4802C540}.Release|Any CPU.Build.0 = Release|Any CPU {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.ActiveCfg = Release|Any CPU {1132E689-18B0-4D87-94E8-934D4802C540}.Release|x86.Build.0 = Release|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.TEST|Any CPU.Build.0 = TEST|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.TEST|x86.ActiveCfg = TEST|Any CPU + {1132E689-18B0-4D87-94E8-934D4802C540}.TEST|x86.Build.0 = TEST|Any CPU {7E450662-B34C-49B0-A826-F45AD3A18891}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E450662-B34C-49B0-A826-F45AD3A18891}.Debug|Any CPU.Build.0 = Debug|Any CPU {7E450662-B34C-49B0-A826-F45AD3A18891}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -316,6 +343,10 @@ Global {7E450662-B34C-49B0-A826-F45AD3A18891}.Release|Any CPU.Build.0 = Release|Any CPU {7E450662-B34C-49B0-A826-F45AD3A18891}.Release|x86.ActiveCfg = Release|Any CPU {7E450662-B34C-49B0-A826-F45AD3A18891}.Release|x86.Build.0 = Release|Any CPU + {7E450662-B34C-49B0-A826-F45AD3A18891}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {7E450662-B34C-49B0-A826-F45AD3A18891}.TEST|Any CPU.Build.0 = TEST|Any CPU + {7E450662-B34C-49B0-A826-F45AD3A18891}.TEST|x86.ActiveCfg = TEST|Any CPU + {7E450662-B34C-49B0-A826-F45AD3A18891}.TEST|x86.Build.0 = TEST|Any CPU {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|Any CPU.Build.0 = Debug|Any CPU {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -324,6 +355,10 @@ Global {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|Any CPU.Build.0 = Release|Any CPU {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.ActiveCfg = Release|Any CPU {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.Release|x86.Build.0 = Release|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.TEST|Any CPU.Build.0 = TEST|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.TEST|x86.ActiveCfg = TEST|Any CPU + {9431FF1F-AD75-4A1E-B38A-46E0F109411D}.TEST|x86.Build.0 = TEST|Any CPU {A2E6978B-FE78-433C-8A17-624579B393DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2E6978B-FE78-433C-8A17-624579B393DF}.Debug|Any CPU.Build.0 = Debug|Any CPU {A2E6978B-FE78-433C-8A17-624579B393DF}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -332,6 +367,10 @@ Global {A2E6978B-FE78-433C-8A17-624579B393DF}.Release|Any CPU.Build.0 = Release|Any CPU {A2E6978B-FE78-433C-8A17-624579B393DF}.Release|x86.ActiveCfg = Release|Any CPU {A2E6978B-FE78-433C-8A17-624579B393DF}.Release|x86.Build.0 = Release|Any CPU + {A2E6978B-FE78-433C-8A17-624579B393DF}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {A2E6978B-FE78-433C-8A17-624579B393DF}.TEST|Any CPU.Build.0 = TEST|Any CPU + {A2E6978B-FE78-433C-8A17-624579B393DF}.TEST|x86.ActiveCfg = TEST|Any CPU + {A2E6978B-FE78-433C-8A17-624579B393DF}.TEST|x86.Build.0 = TEST|Any CPU {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Debug|Any CPU.Build.0 = Debug|Any CPU {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -340,6 +379,10 @@ Global {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Release|Any CPU.Build.0 = Release|Any CPU {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Release|x86.ActiveCfg = Release|Any CPU {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.Release|x86.Build.0 = Release|Any CPU + {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.TEST|Any CPU.Build.0 = TEST|Any CPU + {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.TEST|x86.ActiveCfg = TEST|Any CPU + {295AA95F-BEC6-4F9E-A2E1-8205FD06E951}.TEST|x86.Build.0 = TEST|Any CPU {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -348,6 +391,10 @@ Global {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Release|Any CPU.Build.0 = Release|Any CPU {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Release|x86.ActiveCfg = Release|Any CPU {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.Release|x86.Build.0 = Release|Any CPU + {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.TEST|Any CPU.Build.0 = TEST|Any CPU + {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.TEST|x86.ActiveCfg = TEST|Any CPU + {39D2CC10-CD6B-4BC3-B42C-CA26004D38EB}.TEST|x86.Build.0 = TEST|Any CPU {63C45839-60B2-41BC-973E-C2EF11F33E34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {63C45839-60B2-41BC-973E-C2EF11F33E34}.Debug|Any CPU.Build.0 = Debug|Any CPU {63C45839-60B2-41BC-973E-C2EF11F33E34}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -356,6 +403,10 @@ Global {63C45839-60B2-41BC-973E-C2EF11F33E34}.Release|Any CPU.Build.0 = Release|Any CPU {63C45839-60B2-41BC-973E-C2EF11F33E34}.Release|x86.ActiveCfg = Release|Any CPU {63C45839-60B2-41BC-973E-C2EF11F33E34}.Release|x86.Build.0 = Release|Any CPU + {63C45839-60B2-41BC-973E-C2EF11F33E34}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {63C45839-60B2-41BC-973E-C2EF11F33E34}.TEST|Any CPU.Build.0 = TEST|Any CPU + {63C45839-60B2-41BC-973E-C2EF11F33E34}.TEST|x86.ActiveCfg = TEST|Any CPU + {63C45839-60B2-41BC-973E-C2EF11F33E34}.TEST|x86.Build.0 = TEST|Any CPU {EDDF5700-D198-491B-B94C-D63916F8BA70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EDDF5700-D198-491B-B94C-D63916F8BA70}.Debug|Any CPU.Build.0 = Debug|Any CPU {EDDF5700-D198-491B-B94C-D63916F8BA70}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -364,6 +415,10 @@ Global {EDDF5700-D198-491B-B94C-D63916F8BA70}.Release|Any CPU.Build.0 = Release|Any CPU {EDDF5700-D198-491B-B94C-D63916F8BA70}.Release|x86.ActiveCfg = Release|Any CPU {EDDF5700-D198-491B-B94C-D63916F8BA70}.Release|x86.Build.0 = Release|Any CPU + {EDDF5700-D198-491B-B94C-D63916F8BA70}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {EDDF5700-D198-491B-B94C-D63916F8BA70}.TEST|Any CPU.Build.0 = TEST|Any CPU + {EDDF5700-D198-491B-B94C-D63916F8BA70}.TEST|x86.ActiveCfg = TEST|Any CPU + {EDDF5700-D198-491B-B94C-D63916F8BA70}.TEST|x86.Build.0 = TEST|Any CPU {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -372,6 +427,10 @@ Global {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Release|Any CPU.Build.0 = Release|Any CPU {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Release|x86.ActiveCfg = Release|Any CPU {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.Release|x86.Build.0 = Release|Any CPU + {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.TEST|Any CPU.Build.0 = TEST|Any CPU + {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.TEST|x86.ActiveCfg = TEST|Any CPU + {3402C6D1-4F86-42C4-881E-DA69FD851CD9}.TEST|x86.Build.0 = TEST|Any CPU {8CB21203-0659-473A-8C7E-D5B178F00041}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CB21203-0659-473A-8C7E-D5B178F00041}.Debug|Any CPU.Build.0 = Debug|Any CPU {8CB21203-0659-473A-8C7E-D5B178F00041}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -380,6 +439,10 @@ Global {8CB21203-0659-473A-8C7E-D5B178F00041}.Release|Any CPU.Build.0 = Release|Any CPU {8CB21203-0659-473A-8C7E-D5B178F00041}.Release|x86.ActiveCfg = Release|Any CPU {8CB21203-0659-473A-8C7E-D5B178F00041}.Release|x86.Build.0 = Release|Any CPU + {8CB21203-0659-473A-8C7E-D5B178F00041}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {8CB21203-0659-473A-8C7E-D5B178F00041}.TEST|Any CPU.Build.0 = TEST|Any CPU + {8CB21203-0659-473A-8C7E-D5B178F00041}.TEST|x86.ActiveCfg = TEST|Any CPU + {8CB21203-0659-473A-8C7E-D5B178F00041}.TEST|x86.Build.0 = TEST|Any CPU {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -388,6 +451,10 @@ Global {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Release|Any CPU.Build.0 = Release|Any CPU {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Release|x86.ActiveCfg = Release|Any CPU {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.Release|x86.Build.0 = Release|Any CPU + {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.TEST|Any CPU.Build.0 = TEST|Any CPU + {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.TEST|x86.ActiveCfg = TEST|Any CPU + {8F2B0616-46D1-4BC2-95EE-AB9533E676D0}.TEST|x86.Build.0 = TEST|Any CPU {E78BE459-4E5F-4830-911A-9E23B9981410}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E78BE459-4E5F-4830-911A-9E23B9981410}.Debug|Any CPU.Build.0 = Debug|Any CPU {E78BE459-4E5F-4830-911A-9E23B9981410}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -396,6 +463,10 @@ Global {E78BE459-4E5F-4830-911A-9E23B9981410}.Release|Any CPU.Build.0 = Release|Any CPU {E78BE459-4E5F-4830-911A-9E23B9981410}.Release|x86.ActiveCfg = Release|Any CPU {E78BE459-4E5F-4830-911A-9E23B9981410}.Release|x86.Build.0 = Release|Any CPU + {E78BE459-4E5F-4830-911A-9E23B9981410}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {E78BE459-4E5F-4830-911A-9E23B9981410}.TEST|Any CPU.Build.0 = TEST|Any CPU + {E78BE459-4E5F-4830-911A-9E23B9981410}.TEST|x86.ActiveCfg = TEST|Any CPU + {E78BE459-4E5F-4830-911A-9E23B9981410}.TEST|x86.Build.0 = TEST|Any CPU {73BB6747-106D-44EE-BE78-21238A7510C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73BB6747-106D-44EE-BE78-21238A7510C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {73BB6747-106D-44EE-BE78-21238A7510C1}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -404,6 +475,10 @@ Global {73BB6747-106D-44EE-BE78-21238A7510C1}.Release|Any CPU.Build.0 = Release|Any CPU {73BB6747-106D-44EE-BE78-21238A7510C1}.Release|x86.ActiveCfg = Release|Any CPU {73BB6747-106D-44EE-BE78-21238A7510C1}.Release|x86.Build.0 = Release|Any CPU + {73BB6747-106D-44EE-BE78-21238A7510C1}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {73BB6747-106D-44EE-BE78-21238A7510C1}.TEST|Any CPU.Build.0 = TEST|Any CPU + {73BB6747-106D-44EE-BE78-21238A7510C1}.TEST|x86.ActiveCfg = TEST|Any CPU + {73BB6747-106D-44EE-BE78-21238A7510C1}.TEST|x86.Build.0 = TEST|Any CPU {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -412,6 +487,10 @@ Global {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Release|Any CPU.Build.0 = Release|Any CPU {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Release|x86.ActiveCfg = Release|Any CPU {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.Release|x86.Build.0 = Release|Any CPU + {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.TEST|Any CPU.Build.0 = TEST|Any CPU + {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.TEST|x86.ActiveCfg = TEST|Any CPU + {6575A354-AB4D-4BD1-989C-DAD9E725E5EB}.TEST|x86.Build.0 = TEST|Any CPU {AD34EE2D-9665-402E-A349-554330D1A970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD34EE2D-9665-402E-A349-554330D1A970}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD34EE2D-9665-402E-A349-554330D1A970}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -420,6 +499,10 @@ Global {AD34EE2D-9665-402E-A349-554330D1A970}.Release|Any CPU.Build.0 = Release|Any CPU {AD34EE2D-9665-402E-A349-554330D1A970}.Release|x86.ActiveCfg = Release|Any CPU {AD34EE2D-9665-402E-A349-554330D1A970}.Release|x86.Build.0 = Release|Any CPU + {AD34EE2D-9665-402E-A349-554330D1A970}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {AD34EE2D-9665-402E-A349-554330D1A970}.TEST|Any CPU.Build.0 = TEST|Any CPU + {AD34EE2D-9665-402E-A349-554330D1A970}.TEST|x86.ActiveCfg = TEST|Any CPU + {AD34EE2D-9665-402E-A349-554330D1A970}.TEST|x86.Build.0 = TEST|Any CPU {D42E1F90-D9D5-4882-9103-758840382574}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D42E1F90-D9D5-4882-9103-758840382574}.Debug|Any CPU.Build.0 = Debug|Any CPU {D42E1F90-D9D5-4882-9103-758840382574}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -428,6 +511,10 @@ Global {D42E1F90-D9D5-4882-9103-758840382574}.Release|Any CPU.Build.0 = Release|Any CPU {D42E1F90-D9D5-4882-9103-758840382574}.Release|x86.ActiveCfg = Release|Any CPU {D42E1F90-D9D5-4882-9103-758840382574}.Release|x86.Build.0 = Release|Any CPU + {D42E1F90-D9D5-4882-9103-758840382574}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {D42E1F90-D9D5-4882-9103-758840382574}.TEST|Any CPU.Build.0 = TEST|Any CPU + {D42E1F90-D9D5-4882-9103-758840382574}.TEST|x86.ActiveCfg = TEST|Any CPU + {D42E1F90-D9D5-4882-9103-758840382574}.TEST|x86.Build.0 = TEST|Any CPU {1B72C465-A0F6-4865-836B-2334E3F3376F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B72C465-A0F6-4865-836B-2334E3F3376F}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B72C465-A0F6-4865-836B-2334E3F3376F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -436,6 +523,10 @@ Global {1B72C465-A0F6-4865-836B-2334E3F3376F}.Release|Any CPU.Build.0 = Release|Any CPU {1B72C465-A0F6-4865-836B-2334E3F3376F}.Release|x86.ActiveCfg = Release|Any CPU {1B72C465-A0F6-4865-836B-2334E3F3376F}.Release|x86.Build.0 = Release|Any CPU + {1B72C465-A0F6-4865-836B-2334E3F3376F}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {1B72C465-A0F6-4865-836B-2334E3F3376F}.TEST|Any CPU.Build.0 = TEST|Any CPU + {1B72C465-A0F6-4865-836B-2334E3F3376F}.TEST|x86.ActiveCfg = TEST|Any CPU + {1B72C465-A0F6-4865-836B-2334E3F3376F}.TEST|x86.Build.0 = TEST|Any CPU {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -444,6 +535,10 @@ Global {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Release|Any CPU.Build.0 = Release|Any CPU {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Release|x86.ActiveCfg = Release|Any CPU {361F9108-91F2-4C9F-BE90-12732DF72B8D}.Release|x86.Build.0 = Release|Any CPU + {361F9108-91F2-4C9F-BE90-12732DF72B8D}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {361F9108-91F2-4C9F-BE90-12732DF72B8D}.TEST|Any CPU.Build.0 = TEST|Any CPU + {361F9108-91F2-4C9F-BE90-12732DF72B8D}.TEST|x86.ActiveCfg = TEST|Any CPU + {361F9108-91F2-4C9F-BE90-12732DF72B8D}.TEST|x86.Build.0 = TEST|Any CPU {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Debug|Any CPU.Build.0 = Debug|Any CPU {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -452,6 +547,10 @@ Global {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Release|Any CPU.Build.0 = Release|Any CPU {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Release|x86.ActiveCfg = Release|Any CPU {6D59FC7A-6F27-4140-BA41-F89126490C4C}.Release|x86.Build.0 = Release|Any CPU + {6D59FC7A-6F27-4140-BA41-F89126490C4C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {6D59FC7A-6F27-4140-BA41-F89126490C4C}.TEST|Any CPU.Build.0 = TEST|Any CPU + {6D59FC7A-6F27-4140-BA41-F89126490C4C}.TEST|x86.ActiveCfg = TEST|Any CPU + {6D59FC7A-6F27-4140-BA41-F89126490C4C}.TEST|x86.Build.0 = TEST|Any CPU {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Debug|Any CPU.Build.0 = Debug|Any CPU {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -460,6 +559,10 @@ Global {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Release|Any CPU.Build.0 = Release|Any CPU {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Release|x86.ActiveCfg = Release|Any CPU {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.Release|x86.Build.0 = Release|Any CPU + {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.TEST|Any CPU.Build.0 = TEST|Any CPU + {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.TEST|x86.ActiveCfg = TEST|Any CPU + {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B}.TEST|x86.Build.0 = TEST|Any CPU {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Debug|Any CPU.Build.0 = Debug|Any CPU {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -468,6 +571,10 @@ Global {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Release|Any CPU.Build.0 = Release|Any CPU {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Release|x86.ActiveCfg = Release|Any CPU {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.Release|x86.Build.0 = Release|Any CPU + {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.TEST|Any CPU.Build.0 = TEST|Any CPU + {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.TEST|x86.ActiveCfg = TEST|Any CPU + {408E5ACC-EA9A-41E8-AA95-514C5F47BD34}.TEST|x86.Build.0 = TEST|Any CPU {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Debug|Any CPU.Build.0 = Debug|Any CPU {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -476,62 +583,10 @@ Global {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Release|Any CPU.Build.0 = Release|Any CPU {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Release|x86.ActiveCfg = Release|Any CPU {B7077A34-D7F0-4422-BE7C-65DF26C65489}.Release|x86.Build.0 = Release|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Debug|x86.ActiveCfg = Debug|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Debug|x86.Build.0 = Debug|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Release|Any CPU.Build.0 = Release|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Release|x86.ActiveCfg = Release|Any CPU - {4D219A6D-4528-4622-AF29-96F830C4D076}.Release|x86.Build.0 = Release|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Debug|x86.ActiveCfg = Debug|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Debug|x86.Build.0 = Debug|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Release|Any CPU.Build.0 = Release|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Release|x86.ActiveCfg = Release|Any CPU - {6CBABA8D-4207-4E1E-8122-63DB51D25F18}.Release|x86.Build.0 = Release|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Debug|x86.ActiveCfg = Debug|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Debug|x86.Build.0 = Debug|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Release|Any CPU.Build.0 = Release|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Release|x86.ActiveCfg = Release|Any CPU - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057}.Release|x86.Build.0 = Release|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Debug|x86.ActiveCfg = Debug|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Debug|x86.Build.0 = Debug|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Release|Any CPU.Build.0 = Release|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Release|x86.ActiveCfg = Release|Any CPU - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B}.Release|x86.Build.0 = Release|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Debug|x86.ActiveCfg = Debug|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Debug|x86.Build.0 = Debug|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Release|Any CPU.Build.0 = Release|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Release|x86.ActiveCfg = Release|Any CPU - {756ECECD-B213-42F0-BF58-4A91B4C47FAA}.Release|x86.Build.0 = Release|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Debug|x86.ActiveCfg = Debug|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Debug|x86.Build.0 = Debug|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Release|Any CPU.Build.0 = Release|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Release|x86.ActiveCfg = Release|Any CPU - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A}.Release|x86.Build.0 = Release|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Debug|x86.ActiveCfg = Debug|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Debug|x86.Build.0 = Debug|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Release|Any CPU.Build.0 = Release|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Release|x86.ActiveCfg = Release|Any CPU - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297}.Release|x86.Build.0 = Release|Any CPU + {B7077A34-D7F0-4422-BE7C-65DF26C65489}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {B7077A34-D7F0-4422-BE7C-65DF26C65489}.TEST|Any CPU.Build.0 = TEST|Any CPU + {B7077A34-D7F0-4422-BE7C-65DF26C65489}.TEST|x86.ActiveCfg = TEST|Any CPU + {B7077A34-D7F0-4422-BE7C-65DF26C65489}.TEST|x86.Build.0 = TEST|Any CPU {3DD192AF-2D72-449F-936C-ED8734225B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DD192AF-2D72-449F-936C-ED8734225B18}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DD192AF-2D72-449F-936C-ED8734225B18}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -540,6 +595,10 @@ Global {3DD192AF-2D72-449F-936C-ED8734225B18}.Release|Any CPU.Build.0 = Release|Any CPU {3DD192AF-2D72-449F-936C-ED8734225B18}.Release|x86.ActiveCfg = Release|Any CPU {3DD192AF-2D72-449F-936C-ED8734225B18}.Release|x86.Build.0 = Release|Any CPU + {3DD192AF-2D72-449F-936C-ED8734225B18}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3DD192AF-2D72-449F-936C-ED8734225B18}.TEST|Any CPU.Build.0 = TEST|Any CPU + {3DD192AF-2D72-449F-936C-ED8734225B18}.TEST|x86.ActiveCfg = TEST|Any CPU + {3DD192AF-2D72-449F-936C-ED8734225B18}.TEST|x86.Build.0 = TEST|Any CPU {FF46829E-B612-4D36-80BE-ED04521AD91A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FF46829E-B612-4D36-80BE-ED04521AD91A}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF46829E-B612-4D36-80BE-ED04521AD91A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -548,14 +607,10 @@ Global {FF46829E-B612-4D36-80BE-ED04521AD91A}.Release|Any CPU.Build.0 = Release|Any CPU {FF46829E-B612-4D36-80BE-ED04521AD91A}.Release|x86.ActiveCfg = Release|Any CPU {FF46829E-B612-4D36-80BE-ED04521AD91A}.Release|x86.Build.0 = Release|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Debug|x86.ActiveCfg = Debug|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Debug|x86.Build.0 = Debug|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Release|Any CPU.Build.0 = Release|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Release|x86.ActiveCfg = Release|Any CPU - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67}.Release|x86.Build.0 = Release|Any CPU + {FF46829E-B612-4D36-80BE-ED04521AD91A}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {FF46829E-B612-4D36-80BE-ED04521AD91A}.TEST|Any CPU.Build.0 = TEST|Any CPU + {FF46829E-B612-4D36-80BE-ED04521AD91A}.TEST|x86.ActiveCfg = TEST|x86 + {FF46829E-B612-4D36-80BE-ED04521AD91A}.TEST|x86.Build.0 = TEST|x86 {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Debug|Any CPU.Build.0 = Debug|Any CPU {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -564,6 +619,10 @@ Global {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Release|Any CPU.Build.0 = Release|Any CPU {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Release|x86.ActiveCfg = Release|Any CPU {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.Release|x86.Build.0 = Release|Any CPU + {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.TEST|Any CPU.Build.0 = TEST|Any CPU + {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.TEST|x86.ActiveCfg = TEST|Any CPU + {D21A7C6C-A696-4EC3-84EB-70700C1E3B34}.TEST|x86.Build.0 = TEST|Any CPU {0DF97CAC-220B-4DAD-B397-42E394255763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0DF97CAC-220B-4DAD-B397-42E394255763}.Debug|Any CPU.Build.0 = Debug|Any CPU {0DF97CAC-220B-4DAD-B397-42E394255763}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -572,6 +631,10 @@ Global {0DF97CAC-220B-4DAD-B397-42E394255763}.Release|Any CPU.Build.0 = Release|Any CPU {0DF97CAC-220B-4DAD-B397-42E394255763}.Release|x86.ActiveCfg = Release|Any CPU {0DF97CAC-220B-4DAD-B397-42E394255763}.Release|x86.Build.0 = Release|Any CPU + {0DF97CAC-220B-4DAD-B397-42E394255763}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {0DF97CAC-220B-4DAD-B397-42E394255763}.TEST|Any CPU.Build.0 = TEST|Any CPU + {0DF97CAC-220B-4DAD-B397-42E394255763}.TEST|x86.ActiveCfg = TEST|Any CPU + {0DF97CAC-220B-4DAD-B397-42E394255763}.TEST|x86.Build.0 = TEST|Any CPU {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Debug|Any CPU.Build.0 = Debug|Any CPU {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -580,6 +643,10 @@ Global {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Release|Any CPU.Build.0 = Release|Any CPU {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Release|x86.ActiveCfg = Release|Any CPU {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.Release|x86.Build.0 = Release|Any CPU + {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.TEST|Any CPU.Build.0 = TEST|Any CPU + {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.TEST|x86.ActiveCfg = TEST|Any CPU + {2992AA07-E126-4EE0-B31C-D0B2ADE3393A}.TEST|x86.Build.0 = TEST|Any CPU {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -588,6 +655,10 @@ Global {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Release|Any CPU.Build.0 = Release|Any CPU {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Release|x86.ActiveCfg = Release|Any CPU {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.Release|x86.Build.0 = Release|Any CPU + {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.TEST|Any CPU.Build.0 = TEST|Any CPU + {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.TEST|x86.ActiveCfg = TEST|Any CPU + {3421E19D-16C7-4593-9F6B-291ECB86A3EB}.TEST|x86.Build.0 = TEST|Any CPU {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -596,6 +667,10 @@ Global {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Release|Any CPU.Build.0 = Release|Any CPU {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Release|x86.ActiveCfg = Release|Any CPU {FD509DE0-21DA-4C40-A5CE-767311C6F084}.Release|x86.Build.0 = Release|Any CPU + {FD509DE0-21DA-4C40-A5CE-767311C6F084}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {FD509DE0-21DA-4C40-A5CE-767311C6F084}.TEST|Any CPU.Build.0 = TEST|Any CPU + {FD509DE0-21DA-4C40-A5CE-767311C6F084}.TEST|x86.ActiveCfg = TEST|Any CPU + {FD509DE0-21DA-4C40-A5CE-767311C6F084}.TEST|x86.Build.0 = TEST|Any CPU {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Debug|Any CPU.Build.0 = Debug|Any CPU {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -604,6 +679,10 @@ Global {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Release|Any CPU.Build.0 = Release|Any CPU {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Release|x86.ActiveCfg = Release|Any CPU {65EE0B97-D3F0-400D-B432-85FF5553C44E}.Release|x86.Build.0 = Release|Any CPU + {65EE0B97-D3F0-400D-B432-85FF5553C44E}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {65EE0B97-D3F0-400D-B432-85FF5553C44E}.TEST|Any CPU.Build.0 = TEST|Any CPU + {65EE0B97-D3F0-400D-B432-85FF5553C44E}.TEST|x86.ActiveCfg = TEST|Any CPU + {65EE0B97-D3F0-400D-B432-85FF5553C44E}.TEST|x86.Build.0 = TEST|Any CPU {8574E797-7C48-4F12-B537-4F927BCBA93B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8574E797-7C48-4F12-B537-4F927BCBA93B}.Debug|Any CPU.Build.0 = Debug|Any CPU {8574E797-7C48-4F12-B537-4F927BCBA93B}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -612,6 +691,10 @@ Global {8574E797-7C48-4F12-B537-4F927BCBA93B}.Release|Any CPU.Build.0 = Release|Any CPU {8574E797-7C48-4F12-B537-4F927BCBA93B}.Release|x86.ActiveCfg = Release|Any CPU {8574E797-7C48-4F12-B537-4F927BCBA93B}.Release|x86.Build.0 = Release|Any CPU + {8574E797-7C48-4F12-B537-4F927BCBA93B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {8574E797-7C48-4F12-B537-4F927BCBA93B}.TEST|Any CPU.Build.0 = TEST|Any CPU + {8574E797-7C48-4F12-B537-4F927BCBA93B}.TEST|x86.ActiveCfg = TEST|Any CPU + {8574E797-7C48-4F12-B537-4F927BCBA93B}.TEST|x86.Build.0 = TEST|Any CPU {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Debug|Any CPU.Build.0 = Debug|Any CPU {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -620,6 +703,10 @@ Global {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Release|Any CPU.Build.0 = Release|Any CPU {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Release|x86.ActiveCfg = Release|Any CPU {6FD558D2-532B-45EF-AC5D-9163B33C919F}.Release|x86.Build.0 = Release|Any CPU + {6FD558D2-532B-45EF-AC5D-9163B33C919F}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {6FD558D2-532B-45EF-AC5D-9163B33C919F}.TEST|Any CPU.Build.0 = TEST|Any CPU + {6FD558D2-532B-45EF-AC5D-9163B33C919F}.TEST|x86.ActiveCfg = TEST|Any CPU + {6FD558D2-532B-45EF-AC5D-9163B33C919F}.TEST|x86.Build.0 = TEST|Any CPU {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Debug|Any CPU.Build.0 = Debug|Any CPU {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -628,6 +715,10 @@ Global {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Release|Any CPU.Build.0 = Release|Any CPU {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Release|x86.ActiveCfg = Release|Any CPU {99E24E61-0743-47FF-AB0A-55A36C5E184C}.Release|x86.Build.0 = Release|Any CPU + {99E24E61-0743-47FF-AB0A-55A36C5E184C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {99E24E61-0743-47FF-AB0A-55A36C5E184C}.TEST|Any CPU.Build.0 = TEST|Any CPU + {99E24E61-0743-47FF-AB0A-55A36C5E184C}.TEST|x86.ActiveCfg = TEST|Any CPU + {99E24E61-0743-47FF-AB0A-55A36C5E184C}.TEST|x86.Build.0 = TEST|Any CPU {970C5E07-5D09-4882-949C-A8E876B22732}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {970C5E07-5D09-4882-949C-A8E876B22732}.Debug|Any CPU.Build.0 = Debug|Any CPU {970C5E07-5D09-4882-949C-A8E876B22732}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -636,6 +727,10 @@ Global {970C5E07-5D09-4882-949C-A8E876B22732}.Release|Any CPU.Build.0 = Release|Any CPU {970C5E07-5D09-4882-949C-A8E876B22732}.Release|x86.ActiveCfg = Release|Any CPU {970C5E07-5D09-4882-949C-A8E876B22732}.Release|x86.Build.0 = Release|Any CPU + {970C5E07-5D09-4882-949C-A8E876B22732}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {970C5E07-5D09-4882-949C-A8E876B22732}.TEST|Any CPU.Build.0 = TEST|Any CPU + {970C5E07-5D09-4882-949C-A8E876B22732}.TEST|x86.ActiveCfg = TEST|Any CPU + {970C5E07-5D09-4882-949C-A8E876B22732}.TEST|x86.Build.0 = TEST|Any CPU {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -644,12 +739,87 @@ Global {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Release|Any CPU.Build.0 = Release|Any CPU {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Release|x86.ActiveCfg = Release|Any CPU {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.Release|x86.Build.0 = Release|Any CPU + {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.TEST|Any CPU.Build.0 = TEST|Any CPU + {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.TEST|x86.ActiveCfg = TEST|Any CPU + {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC}.TEST|x86.Build.0 = TEST|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Debug|x86.ActiveCfg = Debug|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Debug|x86.Build.0 = Debug|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Release|Any CPU.Build.0 = Release|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Release|x86.ActiveCfg = Release|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.Release|x86.Build.0 = Release|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.TEST|Any CPU.Build.0 = TEST|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.TEST|x86.ActiveCfg = TEST|Any CPU + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B}.TEST|x86.Build.0 = TEST|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Debug|x86.ActiveCfg = Debug|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Debug|x86.Build.0 = Debug|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Release|Any CPU.Build.0 = Release|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Release|x86.ActiveCfg = Release|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.Release|x86.Build.0 = Release|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.TEST|Any CPU.Build.0 = TEST|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.TEST|x86.ActiveCfg = TEST|Any CPU + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729}.TEST|x86.Build.0 = TEST|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Debug|x86.ActiveCfg = Debug|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Debug|x86.Build.0 = Debug|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Release|Any CPU.Build.0 = Release|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Release|x86.ActiveCfg = Release|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.Release|x86.Build.0 = Release|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.TEST|Any CPU.Build.0 = TEST|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.TEST|x86.ActiveCfg = TEST|Any CPU + {96855A39-A96B-4BDB-A6AE-29676DFEF637}.TEST|x86.Build.0 = TEST|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Debug|x86.ActiveCfg = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Debug|x86.Build.0 = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Release|Any CPU.Build.0 = Release|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Release|x86.ActiveCfg = Release|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.Release|x86.Build.0 = Release|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.TEST|Any CPU.ActiveCfg = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.TEST|Any CPU.Build.0 = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.TEST|x86.ActiveCfg = Debug|Any CPU + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5}.TEST|x86.Build.0 = Debug|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Debug|x86.Build.0 = Debug|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Release|Any CPU.Build.0 = Release|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Release|x86.ActiveCfg = Release|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.Release|x86.Build.0 = Release|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.TEST|Any CPU.ActiveCfg = TEST|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.TEST|Any CPU.Build.0 = TEST|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.TEST|x86.ActiveCfg = TEST|Any CPU + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C}.TEST|x86.Build.0 = TEST|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Debug|x86.ActiveCfg = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Debug|x86.Build.0 = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Release|Any CPU.Build.0 = Release|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Release|x86.ActiveCfg = Release|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.Release|x86.Build.0 = Release|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.TEST|Any CPU.ActiveCfg = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.TEST|Any CPU.Build.0 = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.TEST|x86.ActiveCfg = Debug|Any CPU + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567}.TEST|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {0CDB3F6E-7971-426B-81F8-38B966A54C2B} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} {F74A4B2B-02DA-455A-89FB-803A442B5B2C} = {DAEF99B5-22F0-4885-B45B-9B600B857E1C} {4F903492-CCA6-4FD9-A1B6-5E4CC0CE7767} = {C286932C-3F6D-47F0-BEEF-26843D1BB11B} {34AEEB7C-FD5D-4B15-A830-B429681844BD} = {C286932C-3F6D-47F0-BEEF-26843D1BB11B} @@ -687,42 +857,32 @@ Global {E78BE459-4E5F-4830-911A-9E23B9981410} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {73BB6747-106D-44EE-BE78-21238A7510C1} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {6575A354-AB4D-4BD1-989C-DAD9E725E5EB} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} - {AD34EE2D-9665-402E-A349-554330D1A970} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} + {AD34EE2D-9665-402E-A349-554330D1A970} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} {D42E1F90-D9D5-4882-9103-758840382574} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {1B72C465-A0F6-4865-836B-2334E3F3376F} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} {361F9108-91F2-4C9F-BE90-12732DF72B8D} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {6D59FC7A-6F27-4140-BA41-F89126490C4C} = {0E67EFE8-5944-4F6C-8B47-C5E06D4C79F5} - {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} + {FB23BD72-AEC3-485E-B86C-8E7DB0B3BB9B} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} {408E5ACC-EA9A-41E8-AA95-514C5F47BD34} = {52D81759-C7CC-427F-8C96-89CA10C914B5} {B7077A34-D7F0-4422-BE7C-65DF26C65489} = {04B18FFC-8EA0-4E9F-9E1B-478527B19AFA} - {29B893F7-6C0F-4710-A60E-7FB3498BCA63} = {99192440-2DD7-4E71-B730-D44A73F46533} - {B4CB7BF5-CADF-4056-9C09-EAAC50BC76C0} = {99192440-2DD7-4E71-B730-D44A73F46533} - {E4299234-8323-43F6-B684-350A1232746B} = {99192440-2DD7-4E71-B730-D44A73F46533} - {DE38917F-969B-486C-AF83-C59E5E52400A} = {99192440-2DD7-4E71-B730-D44A73F46533} - {02FF94AF-6BA3-49ED-A027-A63F591C310D} = {99192440-2DD7-4E71-B730-D44A73F46533} - {1FC213DE-5033-40E1-9C16-5F1A0CDC9693} = {99192440-2DD7-4E71-B730-D44A73F46533} - {4D219A6D-4528-4622-AF29-96F830C4D076} = {29B893F7-6C0F-4710-A60E-7FB3498BCA63} - {6CBABA8D-4207-4E1E-8122-63DB51D25F18} = {B4CB7BF5-CADF-4056-9C09-EAAC50BC76C0} - {16ECD6DE-6F65-4A5C-8B49-A29782D9D057} = {E4299234-8323-43F6-B684-350A1232746B} - {F588033A-6B7D-4ABF-96C4-73D8B2271A6B} = {DE38917F-969B-486C-AF83-C59E5E52400A} - {756ECECD-B213-42F0-BF58-4A91B4C47FAA} = {1FC213DE-5033-40E1-9C16-5F1A0CDC9693} - {C000BFB2-DFDE-4B1E-BDA6-988B30370C7A} = {929EE8ED-6AD3-4442-A0C1-EC70665F2DCF} - {0C7C9F9D-6498-45E8-B77B-FF4D381C3297} = {29B893F7-6C0F-4710-A60E-7FB3498BCA63} - {3DD192AF-2D72-449F-936C-ED8734225B18} = {C286932C-3F6D-47F0-BEEF-26843D1BB11B} - {929EE8ED-6AD3-4442-A0C1-EC70665F2DCF} = {99192440-2DD7-4E71-B730-D44A73F46533} {FF46829E-B612-4D36-80BE-ED04521AD91A} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} - {D0EABA08-88C9-4F7C-BCA9-361B58B20D67} = {E9CD521E-C386-466D-B5F7-A5EB19A61625} {D21A7C6C-A696-4EC3-84EB-70700C1E3B34} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {0DF97CAC-220B-4DAD-B397-42E394255763} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} {2992AA07-E126-4EE0-B31C-D0B2ADE3393A} = {0E67EFE8-5944-4F6C-8B47-C5E06D4C79F5} {3421E19D-16C7-4593-9F6B-291ECB86A3EB} = {F7C6CA93-1D02-443C-9C8B-A1988DE0306B} - {FD509DE0-21DA-4C40-A5CE-767311C6F084} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} + {FD509DE0-21DA-4C40-A5CE-767311C6F084} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} {65EE0B97-D3F0-400D-B432-85FF5553C44E} = {0E67EFE8-5944-4F6C-8B47-C5E06D4C79F5} {8574E797-7C48-4F12-B537-4F927BCBA93B} = {0E67EFE8-5944-4F6C-8B47-C5E06D4C79F5} {6FD558D2-532B-45EF-AC5D-9163B33C919F} = {52D81759-C7CC-427F-8C96-89CA10C914B5} {99E24E61-0743-47FF-AB0A-55A36C5E184C} = {52D81759-C7CC-427F-8C96-89CA10C914B5} {970C5E07-5D09-4882-949C-A8E876B22732} = {52D81759-C7CC-427F-8C96-89CA10C914B5} {BB6A5306-4C7A-4973-A48E-9FE3E683EAEC} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} + {3F28939D-5E06-44AC-8FC6-ADBBB89AC97B} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} + {30D9FA9C-0B4D-40FF-8903-6B9E9C825729} = {ECEA7778-E786-4317-90B9-A2D4427CB91C} + {96855A39-A96B-4BDB-A6AE-29676DFEF637} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} + {AC45D5B2-0D02-49B8-A88E-EABF34AE62B5} = {A45F0D24-1AF3-42BC-91A6-0262AFB1234D} + {8455DCAE-275E-47B3-B89B-2D9F3AB9977C} = {29EEC029-6A2B-478A-B6E5-D63A91388ABA} + {0C65F6CA-C897-40A3-A36E-0CCCAD01D567} = {9A923E6F-FF63-4F02-A4EA-C2D44F9323FD} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4418C803-277E-448F-A0A0-52788FA215AD} diff --git a/Tests/.editorconfig b/Tests/.editorconfig deleted file mode 100644 index bc94fcf6ba..0000000000 --- a/Tests/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -# top-most EditorConfig file -root = true - -# Default settings: -# A newline ending every file -# Use tabs as indentation -# Trim trailing whitespace -[*] -insert_final_newline = true -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true diff --git a/Tests/Cosmos.Common.Tests/Cosmos.Common.Tests.csproj b/Tests/Cosmos.Common.Tests/Cosmos.Common.Tests.csproj index 0f92726716..c3c84138f6 100644 --- a/Tests/Cosmos.Common.Tests/Cosmos.Common.Tests.csproj +++ b/Tests/Cosmos.Common.Tests/Cosmos.Common.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST diff --git a/Tests/Cosmos.Common.Tests/packages.lock.json b/Tests/Cosmos.Common.Tests/packages.lock.json new file mode 100644 index 0000000000..cf224c276a --- /dev/null +++ b/Tests/Cosmos.Common.Tests/packages.lock.json @@ -0,0 +1,1314 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "wDO3wmvkMnPyHv7Gf5SqYvO9Zl15s+15pSizT12YAnh6oorjGWmKk1/h0hsOaJC1/u7Dsho0aA/umapYC1BeoQ==" + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "HBtCvEqN1TkaWH6Fvt4kZRqdmtcH1HhGWGBlITDshmjRnRYvo0LfJTyW9RWvcmC8TSrajI51EoZCmoBfF4iKog==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "fQnBHO9DgcmkC9dYSJoBqo6sH1VJwJprUHh8F3hbcRlxiQiBUuTntdk8tUwV490OqC2kQUrinGwZyQHTieuXRA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "q+eLtROUAQ3OxYA5mpQrgyFgzLQxIyrfT2eLpYX5IEPlHmIio2nh4F5bgOaQoGOV865kFKZZso9Oq9RlazvXtg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "ypsCvIdCZ4IoYASJHt6tF2fMo7N30NLgV1EbmC+snO490OMl9FvVxmumw14rhReWU3j3g7BYudG6YCrchwHJlA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Console": "4.0.0", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.Compression": "4.1.0", + "System.IO.Compression.ZipFile": "4.0.1", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Net.Http": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Net.Sockets": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Timer": "4.0.1", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "QfS/nQI7k/BLgmLrw7qm7YBoULEvgWnPI+cYsbfCVFTW8Aj+i8JhccxcFMu1RWms0YZzF+UHguNBK4Qn89e2Sg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "Ob7nvnJBox1aaB222zSVZSkf4WrebPG4qFscfK7vmD7P7NxoSxACQLtO7ytWpqXDn2wcd/+45+EAZ7xjaPip8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Nh0UPZx2Vifh8r+J+H2jxifZUD3sBrmolgiFWJd2yiNrxO0xTa6bAw3YwRn1VOiSen/tUXMS31ttNItCZ6lKuA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.Security.Cryptography": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "msXumHfjjURSkvxUjYuq4N2ghHoRi2VpXcKMA7gK6ujQfU3vGpl+B6ld0ATRg+FZFpRyA6PgEPA+VlIkTeNf2w==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "Cma8cBW6di16ZLibL8LYQ+cLjGzoKxpOTu/faZfDcx94ZjAGq6Nv5RO7+T1YZXqEXTZP9rt1wLVEONVpURtUqw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qSKUSOIiYA/a0g5XXdxFcUFmv1hNICBD7QZ0QhGYVipPIhvpiydY8VZqr1thmCXvmn8aipMg64zuanB4eotK9A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "YKglnq4BMTJxfcr6nuT08g+yJ0UxdePIHxosiLuljuHIUR6t4KhFsyaHOaOc1Ofqp0PUvJ0EmcgiEz6T7vEx3w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "mpVZ5bnlSs3tTeJ6jYyDJEIa6tavhAd88lxq1zbYhkkCu0Pno2+gHXcvZcoygq2d8JxW3gojXqNJMTAshduqZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "Microsoft.Win32.Registry": "4.0.0", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "L1c6IqeQ88vuzC1P81JeHmHA8mxq8a18NUBNXnIY/BVb+TCyAaGIFbhpZt60h9FJNmisymoQkHEFSE9Vslja1Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "KKo23iKeOaIg61SSXwjANN7QYDr/3op3OWGGzDzz7mypx0Za0fZSeG0l6cco8Ntp8YMYkIQcAqlk8yhm5/Uhcg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "TjnBS6eztThSzeSib+WyVbLzEdLKUcEHN69VtS3u8aAsSc18FU6xCZlNWWsEd8SKcXAE+y1sOu7VbU8sUeM0sg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.IO.Compression": "4.1.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hBQYJzfTbQURF10nLhd+az2NHxsU6MU7AB8RUf4IolBP5lOAm4Luho851xl+CqslmhI5ZH/el8BlngEk4lBkaQ==", + "dependencies": { + "System.Buffers": "4.0.0", + "System.IO": "4.1.0", + "System.IO.Compression": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "ULq9g3SOPVuupt+Y3U+A37coXzdNisB1neFCSKzBwo182u0RDddKJF8I5+HfyXqK6OhJPgeoAwWXrbiUXuRDsg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.DiagnosticSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Net.Primitives": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "hVvfl4405DRjA2408luZekbPhplJK03j2Y2lSfMlny7GHXlkByw1iLnc9mgKW0GdQn73vvMcWrWewAhylXA4Nw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "xAz0N3dAV/aR/9g8r0Y5oEqU1JRsz29F5EGb/WVHmX3jVSLqi2/92M5hTad2aNWovruXrJpJtgZ9fccPMG9uSw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "jMSCxA4LSyKBGRDm/WtfkO03FkcgRzHxwvQRib1bm2GZ8ifKM1MX1al6breGCEQK280mdl9uQS7JNPXRYk90jw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Immutable": "1.2.0", + "System.Diagnostics.Debug": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "4UN78GOVU/mbDFcXkEWtetJT/sJ0yic2gGk1HSlSpWI0TDf421xnrZTDZnwNBapk1GQeYN7U1lTj/aQB1by6ow==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "cUJ2h+ZvONDe28Szw3st5dOHdjndhJzQ2WObDEXAWRPEQBtVItVoxbXM/OEsTthl3cNn2dk2k0I3y45igCQcLw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "/i1Usuo4PgAqgbPNC0NjbO3jPW//BoBlTpcWFD1EHVbidH21y4c1ap5bbEMSGAXjAShhMH4abi/K8fILrnu4BQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "HUG/zNUJwEiLkoURDixzkzZdB5yGA5pQhDP93ArOpDPQMteURIGERRNzzoJlmTreLBWr5lkFSjjMSk8ySEpQMw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "4HEfsQIKAhA1+ApNn729Gi09zh+lYWwyIuViihoMDWp1vQnEkL2ct7mAbhBlLYm+x/L4Rr/pyGge1lIY635e0w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Cng": "4.2.0", + "System.Security.Cryptography.Csp": "4.0.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "pH4FZDsZQ/WmgJtN4LWYmRdJAEeVkyriSwrv2Teoe5FOU0Yxlb6II6GL8dBPOfRmutHGATduj3ooMt7dJ2+i+w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "gIdJqDXlOr5W9zeqFErLw3dsOsiShSCYtF9SEHitACycmvNvY8odf9kiKvp6V7aibc8C4HzzNBkWXjyfn7plbQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.0.10", + "contentHash": "IMXgB5Vf/5Qw1kpoVgJMOvUO1l32aC+qC3OaIZjWJOjvcxuxNWOK2ZTWWYXfij22NHxT2j1yWX5vlAeQWld9vA==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "saGfUV8uqVW6LeURiqxcGhZ24PzuRNaUBtbhVeuUAvky1naH395A/1nY0P2bWvrw/BreRtIB/EzTDkGBpqCwEw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Extensions": "4.0.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.Core.Memory.Test/Cosmos.Core.Memory.Test.csproj b/Tests/Cosmos.Core.Memory.Test/Cosmos.Core.Memory.Test.csproj index 155c8dcb99..db2dcdda96 100644 --- a/Tests/Cosmos.Core.Memory.Test/Cosmos.Core.Memory.Test.csproj +++ b/Tests/Cosmos.Core.Memory.Test/Cosmos.Core.Memory.Test.csproj @@ -1,8 +1,9 @@  - netcoreapp2.0 + net6.0 True + Debug;Release;TEST diff --git a/Tests/Cosmos.Core.Memory.Test/Heap.xlsx b/Tests/Cosmos.Core.Memory.Test/Heap.xlsx deleted file mode 100644 index 81857e4c24..0000000000 Binary files a/Tests/Cosmos.Core.Memory.Test/Heap.xlsx and /dev/null differ diff --git a/Tests/Cosmos.Core.Memory.Test/RATTest.cs b/Tests/Cosmos.Core.Memory.Test/RATTest.cs new file mode 100644 index 0000000000..8fae5b4a77 --- /dev/null +++ b/Tests/Cosmos.Core.Memory.Test/RATTest.cs @@ -0,0 +1,287 @@ +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Native = System.UInt32; + +namespace Cosmos.Core.Memory.Test +{ + [TestClass] + public class MemoryTests + { + + + [TestMethod] + public unsafe void InitTest() + { + var xRAM = new byte[128 * 1024 * 1024]; // 128 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + + Assert.IsTrue(HeapSmall.mMaxItemSize > 512); + + uint xRatPages = RAT.GetPageCount((byte)RAT.PageType.RAT); + Assert.IsTrue(xRatPages > 0); + + var xFreePages = RAT.GetPageCount((byte)RAT.PageType.Empty); + Assert.IsTrue(xFreePages > 0); + + Assert.IsTrue(RAT.GetPageCount((byte)RAT.PageType.HeapSmall) > 0); + + Assert.AreEqual(0, HeapSmall.GetAllocatedObjectCount()); + + Assert.AreEqual((uint)8, RAT.GetPageCount((byte)RAT.PageType.RAT)); + } + } + + [TestMethod] + public unsafe void RATMethods() + { + var xRAM = new byte[1024 * 1024]; + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + + RAT.Init(xPtr, (uint)xRAM.Length); + + uint freePageCount = RAT.FreePageCount; + Assert.IsTrue(freePageCount < RAT.TotalPageCount); + Assert.AreEqual(freePageCount, RAT.GetPageCount((byte)RAT.PageType.Empty)); + + var largePage = RAT.AllocPages(RAT.PageType.HeapLarge, 3); + Assert.AreEqual(RAT.PageType.HeapLarge, RAT.GetPageType(largePage)); + Assert.AreEqual(RAT.GetFirstRATIndex(largePage), RAT.GetFirstRATIndex((byte*)largePage + 20)); + Assert.AreEqual(RAT.PageType.HeapLarge, RAT.GetPageType((byte*)largePage + RAT.PageSize)); + + Assert.AreEqual(RAT.FreePageCount, freePageCount - 3); + } + } + + [TestMethod] + public unsafe void SmallAllocTest() + { + var xRAM = new byte[32 * 1024 * 1024]; // 32 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + + RAT.Init(xPtr, (uint)xRAM.Length); + + uint smallPages = RAT.GetPageCount((byte)RAT.PageType.HeapSmall); + uint largePages = RAT.GetPageCount((byte)RAT.PageType.HeapLarge); + + // the following allocations should all go on the same page + var ptr1 = Heap.Alloc(8); + var ptr2 = Heap.Alloc(3); + ptr2[0] = 12; + ptr2[1] = 101; + var ptr3 = Heap.Alloc(8); + var ptr4 = Heap.Alloc(20); + var ptr5 = Heap.Alloc(22); + Assert.AreNotEqual((uint)ptr1, (uint)ptr2); + Assert.AreEqual((uint)ptr2 - (uint)ptr1, (uint)ptr3 - (uint)ptr2); + Assert.AreEqual(24 + HeapSmall.PrefixItemBytes, (uint)ptr5 - (uint)ptr4); + Assert.AreEqual(RAT.PageSize, (uint)ptr4 - (uint)ptr1); + Assert.AreEqual(12, ptr2[0]); + Assert.AreEqual(smallPages, RAT.GetPageCount((byte)RAT.PageType.HeapSmall)); + Assert.AreEqual(largePages, RAT.GetPageCount((byte)RAT.PageType.HeapLarge)); + Assert.AreEqual(5, HeapSmall.GetAllocatedObjectCount()); + + Heap.Free(ptr2); + Assert.AreEqual(4, HeapSmall.GetAllocatedObjectCount()); + Assert.AreEqual(0, ptr2[0]); + var nptr2 = Heap.Alloc(10); + Heap.Alloc(10); + Assert.AreEqual((uint)ptr2, (uint)nptr2); // we use the earliest free position + Assert.AreEqual(6, HeapSmall.GetAllocatedObjectCount()); + } + } + + [TestMethod] + public unsafe void SmallHeapMultiPageAllocationTest() + { + var xRAM = new byte[1024 * 1024]; // 4 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + + RAT.Init(xPtr, (uint)xRAM.Length); + + uint smallPages = RAT.GetPageCount((byte)RAT.PageType.HeapSmall); + + + var ptr1 = Heap.Alloc(HeapSmall.mMaxItemSize); // 4 of them should fit on one page + var ptr2 = Heap.Alloc(HeapSmall.mMaxItemSize); + var ptr3 = Heap.Alloc(HeapSmall.mMaxItemSize); + var ptr4 = Heap.Alloc(HeapSmall.mMaxItemSize); + Assert.AreEqual((uint)ptr2 - (uint)ptr1, (uint)ptr4 - (uint)ptr3); + Assert.AreEqual((uint)RAT.GetPagePtr(ptr1), (uint)RAT.GetPagePtr(ptr2)); + Assert.AreEqual(4, HeapSmall.GetAllocatedObjectCount()); + Heap.Free(ptr4); + var nptr4 = Heap.Alloc(HeapSmall.mMaxItemSize); + Assert.AreEqual((uint)RAT.GetPagePtr(ptr1), (uint)RAT.GetPagePtr(ptr4)); + var ptr5 = Heap.Alloc(HeapSmall.mMaxItemSize); // this should cause a new page to have to be created + + uint largePages = RAT.GetPageCount((byte)RAT.PageType.HeapLarge); + Assert.AreEqual((uint)0, largePages); + Assert.AreEqual(smallPages + 1, RAT.GetPageCount((byte)RAT.PageType.HeapSmall)); + Assert.AreNotEqual((uint)ptr1, (uint)ptr5); + Assert.IsTrue(((uint)ptr5 - (uint)ptr1) % RAT.PageSize == 0); + Assert.AreEqual(5, HeapSmall.GetAllocatedObjectCount()); + + + // now lets force them to allocate 2 more pages + for (int i = 0; i < 8; i++) + { + Heap.Alloc(HeapSmall.mMaxItemSize - 2); + } + Assert.AreEqual(smallPages + 3, RAT.GetPageCount((byte)RAT.PageType.HeapSmall)); + Assert.AreEqual(13, HeapSmall.GetAllocatedObjectCount()); + + } + } + + [TestMethod] + public unsafe void SmallHeapTestExpansion() + { + var xRAM = new byte[1024 * 1024]; // 4 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + + uint smallPages = RAT.GetPageCount((byte)RAT.PageType.HeapSmall); + + for (int i = 0; i < 9; i++) + { + Heap.Alloc(600); + } + + Assert.AreEqual(smallPages + 2, RAT.GetPageCount((byte)RAT.PageType.HeapSmall)); + } + } + + [TestMethod] + public unsafe void SmallHeapStressTest() // this test is important since it tests that the SMT table can grow to multiple pages + { + var xRAM = new byte[1024 * 1024]; // 4 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + + + Random random = new Random(); + + for (int i = 0; i < 1000; i++) + { + if (Heap.Alloc((uint)random.Next(4, (int)HeapSmall.mMaxItemSize)) == null) + { + Assert.Fail(); + } + } + Assert.AreEqual(1000, HeapSmall.GetAllocatedObjectCount()); + } + } + + [TestMethod] + public unsafe void MediumLargeHeapTest() // as long as medium just does the same as the large heap, we can test them together + { + var xRAM = new byte[1024 * 1024]; // 4 MB + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + + var largeCount = RAT.GetPageCount((byte)RAT.PageType.HeapLarge); + var mediumCount = RAT.GetPageCount((byte)RAT.PageType.HeapMedium); + + var ptr1 = Heap.Alloc(HeapMedium.MaxItemSize); // this will allocate two pages, + // since we simplify the math by assuming we never want only one full page + var ptr2 = Heap.Alloc(HeapMedium.MaxItemSize - 10); + var ptr3 = Heap.Alloc(HeapMedium.MaxItemSize + 10); + + Assert.AreEqual(largeCount + 2, RAT.GetPageCount((byte)RAT.PageType.HeapLarge)); + Assert.AreEqual(mediumCount + 3, RAT.GetPageCount((byte)RAT.PageType.HeapMedium)); + + var ptr4 = Heap.Alloc(RAT.PageSize * 5 - HeapLarge.PrefixBytes - 1); + + Assert.AreEqual(largeCount + 7, RAT.GetPageCount((byte)RAT.PageType.HeapLarge)); + Assert.AreEqual(6, (int)RAT.GetPageCount((byte)RAT.PageType.Extension)); + + Heap.Free(ptr4); + Assert.AreEqual(largeCount + 2, RAT.GetPageCount((byte)RAT.PageType.HeapLarge)); + Assert.AreEqual(2, (int)RAT.GetPageCount((byte)RAT.PageType.Extension)); + + Heap.Free(ptr1); + Heap.Free(ptr2); + + Assert.AreEqual(mediumCount, RAT.GetPageCount((byte)RAT.PageType.HeapMedium)); + Assert.AreEqual(largeCount + 2, RAT.GetPageCount((byte)RAT.PageType.HeapLarge)); + } + } + + unsafe void FillRandom(byte* ptr, uint aSize) // fake new obj and fill object with something + { + Random random = new Random(); + for (int i = 0; i < aSize; i++) + { + ptr[i] = (byte)random.Next(16, 32); + } + } + + [TestMethod] + public unsafe void TestAllocPages() // ensure that we fail gracefully when memory gets full + { + var xRAM = new byte[10 * RAT.PageSize]; // 10 Pages - 1 for RAT and 9 for values + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + Assert.AreEqual((uint)1, RAT.GetPageCount((byte)RAT.PageType.RAT)); + + try + { + for (int i = 0; i < 10000; i++) + { + byte* ptr = Heap.Alloc(40); + FillRandom(ptr, 40); + if (ptr == null) + { + Assert.Fail(); + } + Assert.AreEqual((uint)1, RAT.GetPageCount((byte)RAT.PageType.RAT)); + } + + } + catch (Exception e) + { + Assert.AreEqual("289", e.Message); + } + + } + } + + [TestMethod] + public unsafe void TestRATHeapMethods() + { + var xRAM = new byte[10 * RAT.PageSize]; // 10 Pages - 1 for RAT and 9 for values + fixed (byte* xPtr = xRAM) + { + RAT.Debug = true; + RAT.Init(xPtr, (uint)xRAM.Length); + + var ptr1 = Heap.Alloc(10); + var ptr2 = Heap.Alloc(10); + var ptr3 = Heap.Alloc(10); + Assert.AreNotEqual((uint)ptr1, (uint)ptr2); + Assert.AreNotEqual((uint)ptr1, (uint)ptr3); + Assert.AreNotEqual((uint)ptr2, (uint)ptr3); + Assert.AreEqual(RAT.GetFirstRATIndex(ptr1), RAT.GetFirstRATIndex(ptr2)); + Assert.AreEqual(RAT.GetFirstRATIndex(ptr1), RAT.GetFirstRATIndex(ptr3)); + Assert.AreEqual((uint)RAT.GetPagePtr(ptr1), (uint)RAT.GetPagePtr(ptr2)); + Assert.AreEqual((uint)RAT.GetPagePtr(ptr1), (uint)RAT.GetPagePtr(ptr3)); + } + } + } +} diff --git a/Tests/Cosmos.Core.Memory.Test/UnitTest1.cs b/Tests/Cosmos.Core.Memory.Test/UnitTest1.cs deleted file mode 100644 index b3e19b262c..0000000000 --- a/Tests/Cosmos.Core.Memory.Test/UnitTest1.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Native = System.UInt32; - -namespace Cosmos.Core.Memory.Test -{ - [TestClass] - public class MemoryTests - { - [TestMethod] - public unsafe void OldHeapTest() - { - var xRAM = new byte[128 * 1024 * 1024]; // 128 MB - xRAM[0] = 1; - fixed (byte* xPtr = xRAM) - { - } - Assert.IsTrue(true); - } - - [TestMethod] - public unsafe void RATTest() - { - var xRAM = new byte[128 * 1024 * 1024]; // 128 MB - xRAM[0] = 1; - fixed (byte* xPtr = xRAM) - { - RAT.Debug = true; - //RAT.Init(xPtr, (Native)xRAM.LongLength); - RAT.Init(xPtr, (Native) xRAM.Length); - - Native xRatPages = RAT.GetPageCount(RAT.PageType.RAT); - Assert.IsTrue(xRatPages > 0); - - var xFreePages = RAT.GetPageCount(RAT.PageType.Empty); - Assert.IsTrue(xFreePages > 0); - - var x1 = (Int32*) Heap.Alloc(sizeof(Int32)); - var xFreePages2 = RAT.GetPageCount(RAT.PageType.Empty); - Assert.IsTrue(xFreePages - xFreePages2 == 1); - // - Heap.Free(x1); - var xFreePages3 = RAT.GetPageCount(RAT.PageType.Empty); - Assert.IsTrue(xFreePages3 == xFreePages2 + 1); - } - } - } -} diff --git a/Tests/Cosmos.Core.Memory.Test/packages.lock.json b/Tests/Cosmos.Core.Memory.Test/packages.lock.json new file mode 100644 index 0000000000..ab0920bc80 --- /dev/null +++ b/Tests/Cosmos.Core.Memory.Test/packages.lock.json @@ -0,0 +1,1318 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "wDO3wmvkMnPyHv7Gf5SqYvO9Zl15s+15pSizT12YAnh6oorjGWmKk1/h0hsOaJC1/u7Dsho0aA/umapYC1BeoQ==" + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "HBtCvEqN1TkaWH6Fvt4kZRqdmtcH1HhGWGBlITDshmjRnRYvo0LfJTyW9RWvcmC8TSrajI51EoZCmoBfF4iKog==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "2G6OjjJzwBfNOO8myRV/nFrbTw5iA+DEm0N+qUqhrOmaVtn4pC77h38I1jsXGw5VH55+dPfQsqHD0We9sCl9FQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "rkn+fKobF/cbWfnnfBOQHKVKIOpxMZBvlSHkqDWgBpwGDcLRduvs3D9OLGeV6GWGvVwNlVi2CBbTjuPmtHvyNw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "fQnBHO9DgcmkC9dYSJoBqo6sH1VJwJprUHh8F3hbcRlxiQiBUuTntdk8tUwV490OqC2kQUrinGwZyQHTieuXRA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "q+eLtROUAQ3OxYA5mpQrgyFgzLQxIyrfT2eLpYX5IEPlHmIio2nh4F5bgOaQoGOV865kFKZZso9Oq9RlazvXtg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "ypsCvIdCZ4IoYASJHt6tF2fMo7N30NLgV1EbmC+snO490OMl9FvVxmumw14rhReWU3j3g7BYudG6YCrchwHJlA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Console": "4.0.0", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.Compression": "4.1.0", + "System.IO.Compression.ZipFile": "4.0.1", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Net.Http": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Net.Sockets": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Timer": "4.0.1", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "QfS/nQI7k/BLgmLrw7qm7YBoULEvgWnPI+cYsbfCVFTW8Aj+i8JhccxcFMu1RWms0YZzF+UHguNBK4Qn89e2Sg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "Ob7nvnJBox1aaB222zSVZSkf4WrebPG4qFscfK7vmD7P7NxoSxACQLtO7ytWpqXDn2wcd/+45+EAZ7xjaPip8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Nh0UPZx2Vifh8r+J+H2jxifZUD3sBrmolgiFWJd2yiNrxO0xTa6bAw3YwRn1VOiSen/tUXMS31ttNItCZ6lKuA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.Security.Cryptography": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "msXumHfjjURSkvxUjYuq4N2ghHoRi2VpXcKMA7gK6ujQfU3vGpl+B6ld0ATRg+FZFpRyA6PgEPA+VlIkTeNf2w==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "YUJGz6eFKqS0V//mLt25vFGrrCvOnsXjlvFQs+KimpwNxug9x0Pzy4PlFMU3Q2IzqAa9G2L4LsK3+9vCBK7oTg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "Cma8cBW6di16ZLibL8LYQ+cLjGzoKxpOTu/faZfDcx94ZjAGq6Nv5RO7+T1YZXqEXTZP9rt1wLVEONVpURtUqw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qSKUSOIiYA/a0g5XXdxFcUFmv1hNICBD7QZ0QhGYVipPIhvpiydY8VZqr1thmCXvmn8aipMg64zuanB4eotK9A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "w5U95fVKHY4G8ASs/K5iK3J5LY+/dLFd4vKejsnI/ZhBsWS9hQakfx3Zr7lRWKg4tAw9r4iktyvsTagWkqYCiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "YKglnq4BMTJxfcr6nuT08g+yJ0UxdePIHxosiLuljuHIUR6t4KhFsyaHOaOc1Ofqp0PUvJ0EmcgiEz6T7vEx3w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "mpVZ5bnlSs3tTeJ6jYyDJEIa6tavhAd88lxq1zbYhkkCu0Pno2+gHXcvZcoygq2d8JxW3gojXqNJMTAshduqZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "Microsoft.Win32.Registry": "4.0.0", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "B95h0YLEL2oSnwF/XjqSWKnwKOy/01VWkNlsCeMTFJLLabflpGV26nK164eRs5GiaRSBGpOxQ3pKoSnnyZN5pg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "L1c6IqeQ88vuzC1P81JeHmHA8mxq8a18NUBNXnIY/BVb+TCyAaGIFbhpZt60h9FJNmisymoQkHEFSE9Vslja1Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Runtime": "4.1.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "KKo23iKeOaIg61SSXwjANN7QYDr/3op3OWGGzDzz7mypx0Za0fZSeG0l6cco8Ntp8YMYkIQcAqlk8yhm5/Uhcg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3KlTJceQc3gnGIaHZ7UBZO26SHL1SHE4ddrmiwumFnId+CEHP+O8r386tZKaE6zlk5/mF8vifMBzHj9SaXN+mQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "TjnBS6eztThSzeSib+WyVbLzEdLKUcEHN69VtS3u8aAsSc18FU6xCZlNWWsEd8SKcXAE+y1sOu7VbU8sUeM0sg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.IO.Compression": "4.1.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hBQYJzfTbQURF10nLhd+az2NHxsU6MU7AB8RUf4IolBP5lOAm4Luho851xl+CqslmhI5ZH/el8BlngEk4lBkaQ==", + "dependencies": { + "System.Buffers": "4.0.0", + "System.IO": "4.1.0", + "System.IO.Compression": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "IBErlVq5jOggAD69bg1t0pJcHaDbJbWNUZTPI96fkYWzwYbN6D9wRHMULLDd9dHsl7C2YsxXL31LMfPI1SWt8w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "kWkKD203JJKxJeE74p8aF8y4Qc9r9WQx4C0cHzHPrY3fv/L/IhWnyCHaFJ3H1QPOH6A93whlQ2vG5nHlBDvzWQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "bQ0iYFOQI0nuTnt+NQADns6ucV4DUvMdwN6CbkB1yj8i7arTGiTN5eok1kQwdnnNWSDZfIUySQY+J3d5KjWn0g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "ULq9g3SOPVuupt+Y3U+A37coXzdNisB1neFCSKzBwo182u0RDddKJF8I5+HfyXqK6OhJPgeoAwWXrbiUXuRDsg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.DiagnosticSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Net.Primitives": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "hVvfl4405DRjA2408luZekbPhplJK03j2Y2lSfMlny7GHXlkByw1iLnc9mgKW0GdQn73vvMcWrWewAhylXA4Nw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "xAz0N3dAV/aR/9g8r0Y5oEqU1JRsz29F5EGb/WVHmX3jVSLqi2/92M5hTad2aNWovruXrJpJtgZ9fccPMG9uSw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "JCKANJ0TI7kzoQzuwB/OoJANy1Lg338B6+JVacPl4TpUwi3cReg3nMLplMq2uqYfHFQpKIlHAUVAJlImZz/4ng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "GYrtRsZcMuHF3sbmRHfMYpvxZoIN2bQGrYGerUiWLEkqdEUQZhH3TRSaC/oI4wO0II1RKBPlpIa1TOMxIcOOzQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "jMSCxA4LSyKBGRDm/WtfkO03FkcgRzHxwvQRib1bm2GZ8ifKM1MX1al6breGCEQK280mdl9uQS7JNPXRYk90jw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Immutable": "1.2.0", + "System.Diagnostics.Debug": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "4inTox4wTBaDhB7V3mPvp9XlCbeGYWVEM9/fXALd52vNEAVisc1BoVWQPuUuD0Ga//dNbA/WeMy9u9mzLxGTHQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "tsQ/ptQ3H5FYfON8lL4MxRk/8kFyE0A+tGPXmVP967cT/gzLHYxIejIYSxp4JmIeFHVP78g/F2FE1mUUTbDtrg==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "TxwVeUNoTgUOdQ09gfTjvW411MF+w9MBYL7AtNVc+HtBCFlutPLhUCdZjNkjbhj3bNQWMdHboF0KIWEOjJssbA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "v6c/4Yaa9uWsq+JMhnOFewrYkgdNHNG2eMKuNqRn8P733rNXeRCGvV5FkkjBXn2dbVkPXOsO0xjsEeM1q2zC0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "CUOHjTT/vgP0qGW22U4/hDlOqXmcPq5YicBaXdUR2UiUoLwBT+olO6we4DVbq57jeX5uXH2uerVZhf0qGj+sVQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nCJvEKguXEvk2ymk1gqj625vVnlK3/xdGzx0vOKicQkoquaTBJTP13AIYkocSUwHCLNBwUbXTqTWGDxBTWpt7g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "16eu3kjHS633yYdkjwShDHZLRNMKVi/s0bY8ODiqJ2RfMhDMAwxZaUaWVnZ2P71kr/or+X9o/xFWtNqz8ivieQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "hWPhJxc453RCa8Z29O91EmfGeZIHX1ZH2A8L6lYQVSaKzku2DfArSfMEb1/MYYzPQRJZeu0c9dmYeJKxW5Fgng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "4UN78GOVU/mbDFcXkEWtetJT/sJ0yic2gGk1HSlSpWI0TDf421xnrZTDZnwNBapk1GQeYN7U1lTj/aQB1by6ow==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "cUJ2h+ZvONDe28Szw3st5dOHdjndhJzQ2WObDEXAWRPEQBtVItVoxbXM/OEsTthl3cNn2dk2k0I3y45igCQcLw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "/i1Usuo4PgAqgbPNC0NjbO3jPW//BoBlTpcWFD1EHVbidH21y4c1ap5bbEMSGAXjAShhMH4abi/K8fILrnu4BQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "HUG/zNUJwEiLkoURDixzkzZdB5yGA5pQhDP93ArOpDPQMteURIGERRNzzoJlmTreLBWr5lkFSjjMSk8ySEpQMw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "4HEfsQIKAhA1+ApNn729Gi09zh+lYWwyIuViihoMDWp1vQnEkL2ct7mAbhBlLYm+x/L4Rr/pyGge1lIY635e0w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Globalization.Calendars": "4.0.1", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Cng": "4.2.0", + "System.Security.Cryptography.Csp": "4.0.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Http": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "U3gGeMlDZXxCEiY4DwVLSacg+DFWCvoiX+JThA/rvw37Sqrku7sEFeVBBBMBnfB6FeZHsyDx85HlKL19x0HtZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "jtbiTDtvfLYgXn8PTfWI+SiBs51rrmO4AAckx4KR6vFK9Wzf6tI8kcRdsYQNwriUeQ1+CtQbM1W4cMbLXnj/OQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "i88YCXpRTjCnoSQZtdlHkAOx4KNNik4hMy83n0+Ftlb7jvV6ZiZWMpnEZHhjBp6hQVh8gWd/iKNPzlPF7iyA2g==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "N+3xqIcg3VDKyjwwCGaZ9HawG9aC6cSDI+s7ROma310GQo8vilFZa86hqKppwTHleR/G0sfOzhvgnUxWCR/DrQ==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "k1S4Gc6IGwtHGT8188RSeGaX86Qw/wnrgNLshJvsdNUOPP9etMmo8S07c+UlOAx4K/xLuN9ivA1bD0LVurtIxQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "pH4FZDsZQ/WmgJtN4LWYmRdJAEeVkyriSwrv2Teoe5FOU0Yxlb6II6GL8dBPOfRmutHGATduj3ooMt7dJ2+i+w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Runtime": "4.1.0", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "gIdJqDXlOr5W9zeqFErLw3dsOsiShSCYtF9SEHitACycmvNvY8odf9kiKvp6V7aibc8C4HzzNBkWXjyfn7plbQ==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.0.10", + "contentHash": "IMXgB5Vf/5Qw1kpoVgJMOvUO1l32aC+qC3OaIZjWJOjvcxuxNWOK2ZTWWYXfij22NHxT2j1yWX5vlAeQWld9vA==", + "dependencies": { + "System.Runtime": "4.1.0", + "System.Runtime.Handles": "4.0.1" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "saGfUV8uqVW6LeURiqxcGhZ24PzuRNaUBtbhVeuUAvky1naH395A/1nY0P2bWvrw/BreRtIB/EzTDkGBpqCwEw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "ZIiLPsf67YZ9zgr31vzrFaYQqxRPX9cVHjtPSnmx4eN6lbS/yEyYNr2vs1doGDEscF0tjCZFsk9yUg1sC9e8tg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Extensions": "4.0.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "il2cpu.api": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.Core.Tests/CPUTests.cs b/Tests/Cosmos.Core.Tests/CPUTests.cs new file mode 100644 index 0000000000..4f82aaa966 --- /dev/null +++ b/Tests/Cosmos.Core.Tests/CPUTests.cs @@ -0,0 +1,19 @@ +using NUnit.Framework; +using Cosmos.Core; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Cosmos.Core.Tests +{ + [TestFixture()] + public class CPUTests + { + [Test()] + public void EstimateCPUSpeedFromNameTest() + { + Assert.AreEqual((long)2.8e9, CPU.EstimateCPUSpeedFromName(" Intel(R) Celeron(R) CPU 2.80GHz")); + Assert.AreEqual((long)2.8e9, CPU.EstimateCPUSpeedFromName("Intel(R) Celeron(R) CPU 2.80GHz")); + } + } +} diff --git a/Tests/Cosmos.Core.Tests/Cosmos.Core.Tests.csproj b/Tests/Cosmos.Core.Tests/Cosmos.Core.Tests.csproj index 13c2314d5c..d89cc40889 100644 --- a/Tests/Cosmos.Core.Tests/Cosmos.Core.Tests.csproj +++ b/Tests/Cosmos.Core.Tests/Cosmos.Core.Tests.csproj @@ -1,8 +1,9 @@  - netcoreapp2.0 + net6.0 True + Debug;Release;TEST diff --git a/Tests/Cosmos.Core.Tests/packages.lock.json b/Tests/Cosmos.Core.Tests/packages.lock.json new file mode 100644 index 0000000000..d97ac7cb42 --- /dev/null +++ b/Tests/Cosmos.Core.Tests/packages.lock.json @@ -0,0 +1,1284 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[3.11.0, )", + "resolved": "3.11.0", + "contentHash": "BzGk+u02RCrysmLlSzD+okxzMQ8JRF4eFC/qijDJ8Y/FBdTrTkxkQyTFsYkG1o++pr7QpFAE4VDXDqIfZ/gBAg==", + "dependencies": { + "NETStandard.Library": "2.0.0" + } + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[3.12.0, )", + "resolved": "3.12.0", + "contentHash": "uN7IiBCNxLHVXobqyCZvtRwkbnVclA01cNOrHV3noGOhAG5fX8zCjy053U77hILpX/b9eGRgzdZDj4Xm0TnlGw==", + "dependencies": { + "Microsoft.DotNet.InternalAbstractions": "1.0.0", + "System.ComponentModel.EventBasedAsync": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Process": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Xml.XPath.XmlDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.DotNet.InternalAbstractions": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "AAguUq7YyKk3yDWPoWA8DrLZvURxB/LrDdTn1h5lmPeznkFUpfC3p459w5mQYQE0qpquf/CkSQZ0etiV5vRHFA==", + "dependencies": { + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.Security.Cryptography": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fCFl8f0XdwA/BuoNrVBB5D0Y48/hv2J+w4xSDdXQitXZsR6UCSOrDVE7TCUraY802ENwcHUnUCv4En8CupDU1g==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "A/uxsWi/Ifzkmd4ArTLISMbfFs6XpRPsXZonrIqyTY70xi8t+mDtvSM5Os0RqyRDobjMBwIDHDL4NOIbkDwf7A==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XPath": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.bin b/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.bin deleted file mode 100644 index 6c5fddf851..0000000000 Binary files a/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.bin and /dev/null differ diff --git a/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.txt b/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.txt deleted file mode 100644 index 0b84a56e06..0000000000 --- a/Tests/Cosmos.System.Tests/ARPRequestTests.EnsureEncodedCorrectly.approved.txt +++ /dev/null @@ -1,6 +0,0 @@ -FF FF FF FF FF FF 00 50 -56 C0 00 01 08 06 00 01 -08 00 06 04 00 01 00 50 -56 C0 00 01 C0 A8 11 01 -00 00 00 00 00 00 C0 A8 -11 66 \ No newline at end of file diff --git a/Tests/Cosmos.System.Tests/ARPRequestTests.cs b/Tests/Cosmos.System.Tests/ARPRequestTests.cs deleted file mode 100644 index 9eaf7fa201..0000000000 --- a/Tests/Cosmos.System.Tests/ARPRequestTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -using ApprovalTests; -using ApprovalTests.Reporters; - -using Cosmos.HAL.Network; -using Cosmos.System.Network.IPv4; - -namespace Cosmos.System.Tests -{ - [TestClass] - public class ARPRequestTests - { - [TestMethod] - [UseReporter(typeof(DiffReporter))] - public void EnsureEncodedCorrectly() - { - var xMacSender = new MACAddress( - new byte[] - { - 00, - 0x50, - 0x56, - 0xc0, - 0x00, - 0x01 - }); - - var xIPSender = new Address(192, 168, 17, 1); - var xMacTarget = MACAddress.Broadcast; - var xIPTarget = new Address(192, 168, 17, 102); - var xArpTargetMac = new MACAddress(new byte[6]); - - var xPacket = new ARPRequest_Ethernet(xMacSender, xIPSender, xMacTarget, xIPTarget, xArpTargetMac); - - var xExpectedPacket = - "FF FF FF FF FF FF 00 50 " + Environment.NewLine + - "56 C0 00 01 08 06 00 01 " + Environment.NewLine + - "08 00 06 04 00 01 00 50 " + Environment.NewLine + - "56 C0 00 01 C0 A8 11 01 " + Environment.NewLine + - "00 00 00 00 00 00 C0 A8 " + Environment.NewLine + - "11 66"; - - Approvals.Verify(Utilities.PrettyPrint(xPacket.RawData)); - Approvals.VerifyBinaryFile(xPacket.RawData, "bin"); - Assert.AreEqual(xExpectedPacket, Utilities.PrettyPrint(xPacket.RawData)); - } - } -} diff --git a/Tests/Cosmos.System.Tests/Cosmos.System.Tests.csproj b/Tests/Cosmos.System.Tests/Cosmos.System.Tests.csproj index 001809eef9..c00f9f1c66 100644 --- a/Tests/Cosmos.System.Tests/Cosmos.System.Tests.csproj +++ b/Tests/Cosmos.System.Tests/Cosmos.System.Tests.csproj @@ -1,20 +1,30 @@  - netcoreapp2.0 + net6.0 + ..\..\build\Cosmos.snk + UNIT_TEST + Debug;Release;TEST + + + + TRACE; - - + + + + + diff --git a/Tests/Cosmos.System.Tests/DiskManagerTest.cs b/Tests/Cosmos.System.Tests/DiskManagerTest.cs new file mode 100644 index 0000000000..41e5c9de23 --- /dev/null +++ b/Tests/Cosmos.System.Tests/DiskManagerTest.cs @@ -0,0 +1,82 @@ +using Cosmos.Debug.Kernel; +using Cosmos.HAL.BlockDevice; +using Cosmos.System.FileSystem; +using Cosmos.System.FileSystem.FAT; +using Cosmos.System.FileSystem.Listing; +using Cosmos.System.FileSystem.VFS; +using Cosmos.System_Plugs.System.IO; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Cosmos.System.Tests +{ + public class DiskManagerTest + { + static ManagedPartition ourPart; + static Disk ourDisk; + [SetUp] + public void Setup() + { + DebuggerFactory.WriteToConsole = true; + var xDevice = new TestBlockDevice(); + var xPartition = new Partition(xDevice, 0, xDevice.BlockCount); + BlockDevice.Devices.Clear(); + Partition.Partitions.Clear(); + + BlockDevice.Devices.Add(xDevice); + Partition.Partitions.Add(xPartition); + CosmosVFS cosmosVFS = new CosmosVFS(); + VFSManager.RegisterVFS(cosmosVFS, true, true); + + foreach (var disk in VFSManager.GetDisks()) + { + foreach (var part in disk.Partitions) + { + if (part.RootPath == @"0:\") + { + ourDisk = disk; + ourPart = part; + break; + } + } + } + if (ourDisk == null) + { + throw new Exception("Failed to find our disk."); + } + } + + [TearDown] + public void CleanUp() + { + VFSManager.Reset(); + } + + [Test] + public void Execute() + { + string driveName = @"0:\"; + + Assert.IsTrue(ourPart.RootPath == driveName, "ManagedPartition.RootPath failed drive has wrong name"); + + ourDisk.FormatPartition(0, "FAT32", true); + + var xDi = new DriveInfo(driveName); + + //If the drive is empty all Space should be free + Assert.IsTrue(xDi.TotalSize == xDi.TotalFreeSpace, "DiskManager.Format (quick) failed TotalFreeSpace is not the same of TotalSize"); + + //Let's try to create a new file on the Root Directory + File.Create(@"0:\newFile.txt"); + + Assert.IsTrue(File.Exists(@"0:\newFile.txt") == true, "Failed to create new file after disk format"); + + Directory.CreateDirectory(@"0:\SYS\"); + + Assert.IsTrue(Directory.GetDirectories(@"0:\SYS\").Length == 0, "Can create a directory and its content is emtpy"); + } + } +} diff --git a/Tests/Cosmos.System.Tests/FatFileSystem_Should.cs b/Tests/Cosmos.System.Tests/FatFileSystem_Should.cs new file mode 100644 index 0000000000..b2b2c304f4 --- /dev/null +++ b/Tests/Cosmos.System.Tests/FatFileSystem_Should.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using System.Text; +using Cosmos.Debug.Kernel; +using Cosmos.HAL.BlockDevice; +using Cosmos.System.FileSystem; +using Cosmos.System.FileSystem.FAT; +using Cosmos.System.FileSystem.VFS; +using NUnit.Framework; + +namespace Cosmos.System.Tests +{ + public class FatFileSystem_Should + { + private FatFileSystem mFS; + + [SetUp] + public void Setup() + { + DebuggerFactory.WriteToConsole = true; + var xDevice = new TestBlockDevice(); + var xPartition = new Partition(xDevice, 0, xDevice.BlockCount); + var xFactory = new FatFileSystemFactory(); + mFS = (FatFileSystem)xFactory.Create(xPartition, "0:\\", (long)(xPartition.BlockSize * xPartition.BlockCount)); + } + + [Test] + public void Load_Root_Directory_Entry() + { + var xRootDirectory = mFS.GetRootDirectory(); + Assert.NotNull(xRootDirectory); + } + + [Test] + public void Create_A_Directory_Entry() + { + string xNewDirectoryEntryName = "NEW"; + + var xRootDirectory = mFS.GetRootDirectory(); + Assert.NotNull(xRootDirectory); + + var xRootDirectoryListing = mFS.GetDirectoryListing(xRootDirectory); + Assert.AreEqual(xRootDirectoryListing.Count, 0); + + mFS.CreateDirectory(xRootDirectory, xNewDirectoryEntryName); + + xRootDirectoryListing = mFS.GetDirectoryListing(xRootDirectory); + Assert.AreEqual(xRootDirectoryListing.Count, 1); + + var xNewDirectoryEntry = xRootDirectoryListing[0]; + Assert.AreEqual(xNewDirectoryEntry.mName, xNewDirectoryEntryName); + + var dirDirectoryListing = mFS.GetDirectoryListing(xNewDirectoryEntry); + Assert.AreEqual(0, dirDirectoryListing.Count); //the . and .. directories should not be included + } + + [Test] + public void DirectoryOperationTest() + { + //var xEntry = VFSManager.CreateDirectory(@"0:\TestDir1"); + + } + + [Test] + public void Create_A_Subdirectory_Entry() + { + var xRootDirectory = mFS.GetRootDirectory(); + mFS.CreateDirectory(xRootDirectory, "First"); + var root = mFS.GetDirectoryListing(xRootDirectory); + mFS.CreateDirectory(root[0], "Sub"); + Assert.AreEqual(mFS.GetDirectoryListing(root[0]).Count, 1); + } + + [Test] + public void Create_A_Subdirectory_Entry_With_Files() + { + var xRootDirectory = mFS.GetRootDirectory(); + mFS.CreateDirectory(xRootDirectory, "First"); + var root = mFS.GetDirectoryListing(xRootDirectory); + mFS.CreateDirectory(root[0], "Sub"); + Assert.AreEqual(mFS.GetDirectoryListing(root[0]).Count, 1); + var dir = root[0]; + Assert.AreEqual("First", dir.mName); + mFS.CreateFile(dir, "test.txt"); + Assert.AreEqual(mFS.GetDirectoryListing(dir).Count, 2); + mFS.CreateFile(dir, "test2.txt"); + Assert.AreEqual(mFS.GetDirectoryListing(dir).Count, 3); + Assert.AreEqual("test.txt", mFS.GetDirectoryListing(dir)[1].mName); + Assert.AreEqual(@"0:\First\test.txt", mFS.GetDirectoryListing(dir)[1].mFullPath); + } + } +} diff --git a/Tests/Cosmos.System.Tests/Fat_Should.cs b/Tests/Cosmos.System.Tests/Fat_Should.cs new file mode 100644 index 0000000000..a051caab34 --- /dev/null +++ b/Tests/Cosmos.System.Tests/Fat_Should.cs @@ -0,0 +1,51 @@ +using Cosmos.Debug.Kernel; +using Cosmos.HAL.BlockDevice; +using Cosmos.System.FileSystem; +using Cosmos.System.FileSystem.FAT; +using NUnit.Framework; + +namespace Cosmos.System.Tests +{ + public class Fat_Should + { + private FatFileSystem mFS; + private FatFileSystem.Fat mFat; + + [SetUp] + public void Setup() + { + DebuggerFactory.WriteToConsole = true; + var xDevice = new TestBlockDevice(); + var xPartition = new Partition(xDevice, 0, xDevice.BlockCount); + var xFactory = new FatFileSystemFactory(); + mFS = (FatFileSystem)xFactory.Create(xPartition, "0:\\", (long)(xPartition.BlockSize * xPartition.BlockCount)); + mFat = mFS.GetFat(0); + } + + [Test] + public void Add_New_Clusters_To_Chain_When_Needed() + { + uint xStartCluster = mFS.RootCluster; + mFat.SetFatEntry(xStartCluster, mFat.FatEntryEofValue()); + mFat.SetFatEntry(xStartCluster + 2, mFat.FatEntryEofValue()); + mFat.SetFatEntry(xStartCluster + 5, mFat.FatEntryEofValue()); + + uint[] xChain = mFat.GetFatChain(xStartCluster, mFS.BytesPerCluster); + Assert.AreEqual(xChain.Length, 1); + + xChain = mFat.GetFatChain(xStartCluster, mFS.BytesPerCluster * 3); + Assert.AreEqual(3, xChain.Length); + Assert.AreEqual(2, xChain[0]); + Assert.AreEqual(3, xChain[1]); + Assert.AreEqual(5, xChain[2]); + + xChain = mFat.GetFatChain(xStartCluster, mFS.BytesPerCluster * 5); + Assert.AreEqual(5, xChain.Length); + Assert.AreEqual(2, xChain[0]); + Assert.AreEqual(3, xChain[1]); + Assert.AreEqual(5, xChain[2]); + Assert.AreEqual(6, xChain[3]); + Assert.AreEqual(8, xChain[4]); + } + } +} diff --git a/Tests/Cosmos.System.Tests/ManagedMemoryBlockTest.cs b/Tests/Cosmos.System.Tests/ManagedMemoryBlockTest.cs new file mode 100644 index 0000000000..aef9a80507 --- /dev/null +++ b/Tests/Cosmos.System.Tests/ManagedMemoryBlockTest.cs @@ -0,0 +1,46 @@ +using Cosmos.Core; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cosmos.System.Tests +{ + class ManagedMemoryBlockTest + { + [Test] + public void TestBlock() + { + var memoryBlock = new ManagedMemoryBlock(128); + memoryBlock.Write32(0, 1); + Assert.AreEqual(1, memoryBlock[0]); + Assert.AreEqual(1, memoryBlock.Read32(0), "ManagedMemoryBlock read/write at index 0 works"); + memoryBlock.Write32(1, 101); + Assert.AreEqual(101, memoryBlock[1], "ManagedMemoryBlock read/write at index 1 works"); + Assert.AreEqual(25857, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + memoryBlock.Write32(2, 2 ^ 16 + 2); + Assert.AreEqual(16, memoryBlock[2], "ManagedMemoryBlock write int at index 2 works"); + Assert.AreEqual(0, memoryBlock[3], "ManagedMemoryBlock write int at index 2 works"); + Assert.AreEqual(1074433, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + memoryBlock.Write32(3, int.MaxValue); + Assert.AreEqual(255, memoryBlock[3], "ManagedMemoryBlock write int at index 3 works"); + Assert.AreEqual(0xFF106501, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + Assert.AreEqual(0xFFFF1065, memoryBlock.Read32(1), "ManagedMemoryBlock read int at index 1 works"); + Assert.AreEqual(0xFFFFFF10, memoryBlock.Read32(2), "ManagedMemoryBlock read int at index 2 works"); + Assert.AreEqual(int.MaxValue, memoryBlock.Read32(3), "ManagedMemoryBlock read/write at index 3 works"); + + memoryBlock.Fill(101); + Assert.AreEqual(101, memoryBlock.Read32(0), "ManagedMemoryBlock fill works at index 0"); + Assert.AreEqual(0, memoryBlock[1], "ManagedMemoryBlock fill fills entire ints"); + Assert.AreEqual(6619136, memoryBlock.Read32(10), "ManagedMemoryBlock fill works at index 10"); + + memoryBlock.Write8(0, 101); + Assert.AreEqual(101, memoryBlock[0], "ManagedMemoryBlock write byte works at index 0"); + memoryBlock.Fill(1, 1, 987893745); + Assert.AreEqual(101, memoryBlock[0], "ManagedMemoryBlock Fill(1, int, int) skips index 0"); + Assert.AreEqual(987893745, memoryBlock.Read32(1), "ManagedMemoryBlock Fill(int, int, int) works at index 1"); + } + } +} diff --git a/Tests/Cosmos.System.Tests/TestBlockDevice.cs b/Tests/Cosmos.System.Tests/TestBlockDevice.cs new file mode 100644 index 0000000000..3b18cd248d --- /dev/null +++ b/Tests/Cosmos.System.Tests/TestBlockDevice.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Cosmos.HAL.BlockDevice; + +namespace Cosmos.System.Tests +{ + class TestBlockDevice : BlockDevice + { + private byte[] mData; + public override BlockDeviceType Type => BlockDeviceType.HardDrive; + + public TestBlockDevice() + { + LoadTestData(); + + mBlockSize = 512; + mBlockCount = (ulong) (mData.Length / (int) mBlockSize); + } + + private void LoadTestData() + { + var xList = new List(); + + using (var xReader = new StreamReader("../../../../Data/disk.txt")) + { + while (!xReader.EndOfStream) + { + string xLine = xReader.ReadLine(); + if (!string.IsNullOrWhiteSpace(xLine)) + { + xLine = xLine.Replace(" ", ""); + xList.AddRange(StringToByteArray(xLine)); + } + } + xReader.Close(); + } + + for (int i = 0; i < 534610432 - xList.Count; i++) + { + xList.Add(0x00); + } + + mData = xList.ToArray(); + } + + private static byte[] StringToByteArray(string hex) + { + int NumberChars = hex.Length; + byte[] bytes = new byte[NumberChars / 2]; + for (int i = 0; i < NumberChars; i += 2) + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + + return bytes; + } + + public override void ReadBlock(ulong aBlockNo, ulong aBlockCount, ref byte[] aData) + { + aData = NewBlockArray((uint) aBlockCount); + Array.Copy(mData, (long) (aBlockNo * BlockSize), aData, 0, (long) (aBlockCount * BlockSize)); + } + + public override void WriteBlock(ulong aBlockNo, ulong aBlockCount, ref byte[] aData) + { + Array.Copy(aData, 0, mData, (long)(aBlockNo * BlockSize), (long)(aBlockCount * BlockSize)); + } + } +} diff --git a/Tests/Cosmos.System.Tests/VFSManagerTest.cs b/Tests/Cosmos.System.Tests/VFSManagerTest.cs new file mode 100644 index 0000000000..1ef7c34369 --- /dev/null +++ b/Tests/Cosmos.System.Tests/VFSManagerTest.cs @@ -0,0 +1,126 @@ +using Cosmos.Debug.Kernel; +using Cosmos.HAL.BlockDevice; +using Cosmos.System.FileSystem; +using Cosmos.System.FileSystem.FAT; +using Cosmos.System.FileSystem.Listing; +using Cosmos.System.FileSystem.VFS; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Cosmos.System.Tests +{ + class VFSManagerTest + { + private ManagedPartition ourPart; + private Disk ourDisk; + [SetUp] + public void Setup() + { + DebuggerFactory.WriteToConsole = true; + var xDevice = new TestBlockDevice(); + var xPartition = new Partition(xDevice, 0, xDevice.BlockCount); + BlockDevice.Devices.Clear(); + Partition.Partitions.Clear(); + + BlockDevice.Devices.Add(xDevice); + Partition.Partitions.Add(xPartition); + CosmosVFS cosmosVFS = new CosmosVFS(); + VFSManager.RegisterVFS(cosmosVFS, true); + + foreach (var disk in VFSManager.GetDisks()) + { + foreach (var part in disk.Partitions) + { + if (part.RootPath == @"0:\") + { + ourDisk = disk; + ourPart = part; + break; + } + } + } + if (ourDisk == null) + { + throw new Exception("Failed to find our drive."); + } + } + + [TearDown] + public void CleanUp() + { + VFSManager.Reset(); + } + + [Test] + public void Test_Disk_Manager() + { + var disks = VFSManager.GetDisks(); + Assert.IsTrue(disks.Count != 0); + foreach (var item in disks) + { + Assert.IsTrue(item.Size != 0); + Assert.IsTrue(item.Partitions.Count != 0); + } + + const string root = @"0:\"; + long initialSize = VFSManager.GetTotalSize(root); + ourDisk.FormatPartition(0, "FAT32", true); + Assert.AreEqual(initialSize, VFSManager.GetAvailableFreeSpace(root)); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root).Count); + VFSManager.CreateFile(root + "test.txt"); + Assert.IsNotNull(VFSManager.GetFile(root + "test.txt")); + } + + [Test] + public void Test_Disk_Manager_Reformating() + { + const string root = @"0:\"; + long initialSize = VFSManager.GetTotalSize(root); + ourDisk.FormatPartition(0, "FAT32", true); + Assert.AreEqual(initialSize, VFSManager.GetAvailableFreeSpace(root)); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root).Count); + VFSManager.CreateFile(root + "test.txt"); + VFSManager.CreateFile(root + "test1.txt"); + VFSManager.CreateFile(root + "test2.txt"); + VFSManager.CreateFile(root + "test3.txt"); + VFSManager.CreateFile(root + "test4.txt"); + VFSManager.CreateFile(root + "newfile.txt"); + VFSManager.CreateDirectory(root + "SubDir"); + VFSManager.CreateFile(root + "SubDir\\file.txt"); + Assert.IsNotNull(VFSManager.GetFile(root + "SubDir\\file.txt")); + List lists = VFSManager.GetDirectoryListing(root); + Assert.AreEqual(7, lists.Count); + Assert.AreEqual(DirectoryEntryTypeEnum.File, lists[0].mEntryType); + Assert.AreEqual(DirectoryEntryTypeEnum.File, lists[5].mEntryType); + Assert.AreEqual(DirectoryEntryTypeEnum.Directory, lists[6].mEntryType); + ourDisk.FormatPartition(0, "FAT32", true); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root).Count); + VFSManager.CreateDirectory(root + "dir"); + Assert.IsNull(VFSManager.GetFile(root + "newfile.txt")); + VFSManager.CreateFile(root + "newfile.txt"); + Assert.IsNotNull(VFSManager.GetFile(root + "newfile.txt")); + Assert.AreEqual(2, VFSManager.GetDirectoryListing(root).Count); + } + + [Test] + public void Test_Disk_Manager_Reformating_First_Directories() + { + const string root = @"0:\"; + long initialSize = VFSManager.GetTotalSize(root); + ourDisk.FormatPartition(0, "FAT32", true); + Assert.AreEqual(initialSize, VFSManager.GetAvailableFreeSpace(root)); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root).Count); + VFSManager.CreateDirectory(root + "SubDir"); + VFSManager.CreateFile(root + "SubDir\\filet.txt"); + Assert.IsNotNull(VFSManager.GetFile(root + "SubDir\\filet.txt")); + Assert.AreEqual(1, VFSManager.GetDirectoryListing(root).Count); + ourDisk.FormatPartition(0, "FAT32", true); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root).Count); + VFSManager.CreateDirectory(root + "dir"); + Assert.AreEqual(1, VFSManager.GetDirectoryListing(root).Count); + Assert.AreEqual(0, VFSManager.GetDirectoryListing(root + "dir").Count); + } + } +} diff --git a/Tests/Cosmos.System.Tests/packages.lock.json b/Tests/Cosmos.System.Tests/packages.lock.json new file mode 100644 index 0000000000..c30f7d454d --- /dev/null +++ b/Tests/Cosmos.System.Tests/packages.lock.json @@ -0,0 +1,1231 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "ApprovalTests": { + "type": "Direct", + "requested": "[3.0.18, )", + "resolved": "3.0.18", + "contentHash": "8gBzmUNFYHyGrvIbhJ6T9sqebY+tj5r9exPiIQ455dHW5wtJpREHDEyUGuVxzVxvAwpI2m4+chcNuqy7jr/e0A==", + "dependencies": { + "ApprovalUtilities": "3.0.18", + "Microsoft.Win32.Registry": "4.5.0", + "System.Drawing.Common": "4.5.0", + "TextCopy": "1.3.0" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "MSTest.TestAdapter": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "wDO3wmvkMnPyHv7Gf5SqYvO9Zl15s+15pSizT12YAnh6oorjGWmKk1/h0hsOaJC1/u7Dsho0aA/umapYC1BeoQ==" + }, + "MSTest.TestFramework": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.1.11", + "contentHash": "HBtCvEqN1TkaWH6Fvt4kZRqdmtcH1HhGWGBlITDshmjRnRYvo0LfJTyW9RWvcmC8TSrajI51EoZCmoBfF4iKog==" + }, + "NSubstitute": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "CgRn/pPzB341/axAUCf+p7ZptiN1C0KJW1C412Y1OofTzEqBhV/uQBlXCzZ/XqhZF79YFpvwn2vMmZ1P3ls6kA==", + "dependencies": { + "Castle.Core": "4.3.1", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[3.11.0, )", + "resolved": "3.11.0", + "contentHash": "BzGk+u02RCrysmLlSzD+okxzMQ8JRF4eFC/qijDJ8Y/FBdTrTkxkQyTFsYkG1o++pr7QpFAE4VDXDqIfZ/gBAg==", + "dependencies": { + "NETStandard.Library": "2.0.0" + } + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[3.12.0, )", + "resolved": "3.12.0", + "contentHash": "uN7IiBCNxLHVXobqyCZvtRwkbnVclA01cNOrHV3noGOhAG5fX8zCjy053U77hILpX/b9eGRgzdZDj4Xm0TnlGw==", + "dependencies": { + "Microsoft.DotNet.InternalAbstractions": "1.0.0", + "System.ComponentModel.EventBasedAsync": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Process": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Xml.XPath.XmlDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "ApprovalUtilities": { + "type": "Transitive", + "resolved": "3.0.18", + "contentHash": "2Kj055MusEBEhoQDlsoSLXkJ4MhSEqw0MKObMwY8H/Tna7kqz+1rMGX8bXA1GyaWmR08gYjaDPGkoSS7HaHsYA==", + "dependencies": { + "System.Data.SqlClient": "4.5.1", + "System.Management": "4.5.0" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "8Y/eTr6GTElAGV7eAmJuhfLhGdFpNvaNrQ9UQYDScziLmX+/BLGM+9eQr0IcdNDcPN0ADmbtwT6MgecGKy4obw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Microsoft.DotNet.InternalAbstractions": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "AAguUq7YyKk3yDWPoWA8DrLZvURxB/LrDdTn1h5lmPeznkFUpfC3p459w5mQYQE0qpquf/CkSQZ0etiV5vRHFA==", + "dependencies": { + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==", + "dependencies": { + "System.Security.AccessControl": "4.5.0", + "System.Security.Principal.Windows": "4.5.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "A8v6PGmk+UGbfWo5Ixup0lPM4swuSwOiayJExZwKIOjTlFFQIsu3QnDXECosBEyrWSPryxBVrdqtJyhK3BaupQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.Security.Cryptography": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "2CQK0jmO6Eu7ZeMgD+LOFbNJSXHFVQbCJJkEyEwowh1SCgYnrn9W9RykMfpeeVGw7h4IBvYikzpGUlmZTUafJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "gqpR1EeXOuzNQWL7rOzmtdIz3CaXVjSQCiaGOs2ivjPwynKSJYm39X81fdlp7WuojZs/Z5t1k5ni7HtKQurhjw==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "2gBcbb3drMLgxlI0fBfxMA31ec6AEyYCHygGse4vxceJan8mRIWeKJ24BFzN7+bi/NFTgdIgufzb94LWO5EERQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "Cma8cBW6di16ZLibL8LYQ+cLjGzoKxpOTu/faZfDcx94ZjAGq6Nv5RO7+T1YZXqEXTZP9rt1wLVEONVpURtUqw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fCFl8f0XdwA/BuoNrVBB5D0Y48/hv2J+w4xSDdXQitXZsR6UCSOrDVE7TCUraY802ENwcHUnUCv4En8CupDU1g==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "HV8pqcYlH7bNnX1n4i6F5RG7r6+WVErE2jUMNjXRrrkLFVIWLoerXtXDFs80pHvDBjxoG4rG0p2BUH3iXRs7hQ==", + "dependencies": { + "Microsoft.Win32.Registry": "4.5.0", + "System.Security.Principal.Windows": "4.5.0", + "System.Text.Encoding.CodePages": "4.5.0", + "runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "vDN1PoMZCkkdNjvZLql592oYJZgS7URcJzJ7bxeBgGtx5UtR5leNm49VmfHGqIffX4FKacHbI3H6UyNSHQknBg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "Z6ac0qPGr3yJtwZEX1SRkhwWa0Kf5NJxx7smLboYsGrApQFECNFdqhGy252T4lrZ5Nwzhd9VQiaifndR3bfHdg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.Registry": "4.5.0", + "System.CodeDom": "4.5.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "jMSCxA4LSyKBGRDm/WtfkO03FkcgRzHxwvQRib1bm2GZ8ifKM1MX1al6breGCEQK280mdl9uQS7JNPXRYk90jw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Immutable": "1.2.0", + "System.Diagnostics.Debug": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "YrzNWduCDHhUaSRBxHxL11UkM2fD6y8hITHis4/LbQZ6vj3vdRjoH3IoPWWC9uDXK2wHIqn+b5gv1Np/VKyM1g==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "4UN78GOVU/mbDFcXkEWtetJT/sJ0yic2gGk1HSlSpWI0TDf421xnrZTDZnwNBapk1GQeYN7U1lTj/aQB1by6ow==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "+XbKFuzdmLP3d1o9pdHu2nxjNr2OEPqGzKeegPLCUMM71a0t50A/rOcIRmGs9wR7a8KuHX6hYs/7/TymIGLNqg==", + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "System.Security.Principal.Windows": "4.5.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "8JQFxbLVdrtIOKMDN38Fn0GWnqYZw/oMlwOUG/qz1jqChvyZlnUmu+0s7wLx7JYua/nAXoESpHA3iw11QFWhXg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "FbKgE5MbxSQMPcSVRgwM6bXN3GtyAh04NkV8E5zKCBE26X0vYW0UtTa2FIgkH33WVqBVxRgxljlVYumWtU+HcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Text.Encoding": "4.0.11", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "Wkd7QryWYjkQclX0bngpntW5HSlMzeJU24UaLJQ7YTfI8ydAVAaU2J+HXLLABOVJlKTVvAeL0Aj39VeTe7L+oA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "S0wEUiKcLvRlkFUXca8uio1UQ5bYQzYgOmOKtCqaBQC3GR9AJjh43otcM32IGsAyvadFTaAMw9Irm6dS4Evfng==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "A/uxsWi/Ifzkmd4ArTLISMbfFs6XpRPsXZonrIqyTY70xi8t+mDtvSM5Os0RqyRDobjMBwIDHDL4NOIbkDwf7A==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XPath": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "TextCopy": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "8aW9kUVZhpbqPTHOlRoTBcpqf0PE3rGYMi+BU6Wh/hdYJnV8WHalYFDSX0hpasQAl0BJwyomJ4nckGZTV7lKRg==" + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "il2cpu.api": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj index 25c698813f..3ad94459a7 100644 --- a/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj +++ b/Tests/Cosmos.TestRunner.Core/Cosmos.TestRunner.Core.csproj @@ -1,16 +1,17 @@  - netstandard2.0 + net6.0 + Debug;Release;TEST - - - + + + diff --git a/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs b/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs index 4a74a7df1d..df188615fa 100644 --- a/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs +++ b/Tests/Cosmos.TestRunner.Core/Engine.Helpers.cs @@ -107,7 +107,7 @@ private void RunProcess(string aProcess, string aWorkingDirectory, string aArgum } else { - xErrorReceived($"Error invoking '{aProcess}'."); + xErrorReceived($"Error invoking '{aProcess}'."); } } } @@ -216,14 +216,15 @@ private void RunIL2CPU(string kernelFileName, string outputFile) "EnableDebug:True", "EnableStackCorruptionDetection:" + EnableStackCorruptionChecks, "StackCorruptionDetectionLevel:" + StackCorruptionDetectionLevel, - "DebugMode:Source", + "DebugMode:" + DebugMode, "TraceAssemblies:" + TraceAssembliesLevel, "DebugCom:1", "TargetAssembly:" + kernelFileName, "OutputFilename:" + outputFile, "EnableLogging:True", "EmitDebugSymbols:True", - "IgnoreDebugStubAttribute:False" + "IgnoreDebugStubAttribute:False", + "AllowComments:True" }; xArgs.AddRange(xReferences.Select(r => "References:" + r)); @@ -250,6 +251,8 @@ private void RunIL2CPU(string kernelFileName, string outputFile) throw new Exception("Cannot run multiple kernels with in-process compilation!"); } + //xArgs.Add("AllowComments:true"); // enable this line when debugging cosmos + RunIL2CPUInProc(xArgs.ToArray(), OutputHandler.LogMessage, OutputHandler.LogError); } else @@ -265,11 +268,12 @@ private void RunIL2CPU(string kernelFileName, string outputFile) private void RunNasm(string inputFile, string outputFile, bool isElf) { bool xUsingUserkit = false; - string xNasmPath = Path.Combine(FindCosmosRoot(), "Tools", "NASM"); + //Path to nasm starter + string xNasmPath = Path.Combine(FindCosmosRoot(), "Tools", "Nasm"); if (!Directory.Exists(xNasmPath)) { xUsingUserkit = true; - xNasmPath = Path.Combine(GetCosmosUserkitFolder(), "Build", "NASM"); + xNasmPath = Path.Combine(GetCosmosUserkitFolder(), "Build", "Nasm"); } if (!Directory.Exists(xNasmPath)) { @@ -278,7 +282,7 @@ private void RunNasm(string inputFile, string outputFile, bool isElf) var xArgs = new List { - $"ExePath:{Path.Combine(xUsingUserkit ? GetCosmosUserkitFolder() : FindCosmosRoot(), "Build", "Tools", "NAsm", "nasm.exe")}", + $"ExePath:{Path.Combine(xUsingUserkit ? GetCosmosUserkitFolder() : FindCosmosRoot(), "Build", "Tools", "Yasm", "yasm.exe")}", $"InputFile:{inputFile}", $"OutputFile:{outputFile}", $"IsELF:{isElf}" @@ -309,7 +313,7 @@ private void RunLd(string inputFile, string outputFile) var xArgsString = arguments.Aggregate("", (a, b) => a + " \"" + b + "\""); - var xProcess = Process.Start(Path.Combine(GetCosmosUserkitFolder(), "build", "tools", "cygwin", "ld.exe"), xArgsString); + var xProcess = Process.Start(Path.Combine(GetCosmosUserkitFolder(), "Build", "tools", "cygwin", "ld.exe"), xArgsString); xProcess.WaitForExit(10000); @@ -333,10 +337,10 @@ private static string GetCosmosUserkitFolder() private void MakeIso(string objectFile, string isoFile) { - IsoMaker.Generate(objectFile, isoFile); + string response = IsoMaker.Generate(objectFile, isoFile); if (!File.Exists(isoFile)) { - throw new Exception("Error building iso"); + throw new Exception($"Error building iso: {response}"); } } } diff --git a/Tests/Cosmos.TestRunner.Core/Engine.Qemu.cs b/Tests/Cosmos.TestRunner.Core/Engine.Qemu.cs new file mode 100644 index 0000000000..91681cfa28 --- /dev/null +++ b/Tests/Cosmos.TestRunner.Core/Engine.Qemu.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Cosmos.Build.Common; +using Cosmos.Debug.DebugConnectors; +using Cosmos.Debug.Hosts; + +namespace Cosmos.TestRunner.Core +{ + partial class Engine + { + private void RunIsoInQemu(string iso, string harddisk, string workingDir) + { + if (!File.Exists(harddisk)) + { + throw new FileNotFoundException("Harddisk file not found!", harddisk); + } + + var xParams = new Dictionary + { + {BuildPropertyNames.IsoFileString, iso} + }; + + var xDebugConnector = new DebugConnectorPipeClient("Cosmos\\Serial"); + InitializeDebugConnector(xDebugConnector); + + var xQemu = new Qemu(xParams, RunWithGDB, harddisk) + { + OnShutDown = (a, b) => { mKernelRunning = false; }, + RedirectOutput = false, + LogError = s => OutputHandler.LogDebugMessage(s), + LogOutput = s => OutputHandler.LogDebugMessage(s) + }; + + HandleRunning(xDebugConnector, xQemu); + } + } +} diff --git a/Tests/Cosmos.TestRunner.Core/Engine.Run.cs b/Tests/Cosmos.TestRunner.Core/Engine.Run.cs index 1e5b651f0d..42955d92f5 100644 --- a/Tests/Cosmos.TestRunner.Core/Engine.Run.cs +++ b/Tests/Cosmos.TestRunner.Core/Engine.Run.cs @@ -1,6 +1,10 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; namespace Cosmos.TestRunner.Core { @@ -43,25 +47,40 @@ private bool ExecuteKernel( else { xHarddiskPath = Path.Combine(workingDirectory, "Harddisk.vmdk"); - var xOriginalHarddiskPath = Path.Combine(GetCosmosUserkitFolder(), "Build", "VMware", "Workstation", "Filesystem.vmdk"); + var xOriginalHarddiskPath = Path.Combine(GetCosmosUserkitFolder(), "Build", "VMware", "Workstation", "FilesystemTest.vmdk"); File.Copy(xOriginalHarddiskPath, xHarddiskPath); } RunTask("MakeISO", () => MakeIso(xObjectFile, xIsoFile)); - switch (configuration.RunTarget) + Console.WriteLine("assemblyFileName=" + assemblyFileName); + + if (assemblyFileName.EndsWith("NetworkTest.dll")) + { + var serverThread = new Thread(StartTcpServer); + serverThread.Start(); + + RunTask("RunISO", () => RunIsoInVMware(xIsoFile, xHarddiskPath)); + } + else { - case RunTargetEnum.Bochs: - RunTask("RunISO", () => RunIsoInBochs(xIsoFile, xHarddiskPath, workingDirectory)); - break; - case RunTargetEnum.VMware: - RunTask("RunISO", () => RunIsoInVMware(xIsoFile, xHarddiskPath)); - break; - case RunTargetEnum.HyperV: - RunTask("RunISO", () => RunIsoInHyperV(xIsoFile, xHarddiskPath)); - break; - default: - throw new ArgumentOutOfRangeException("RunTarget " + configuration.RunTarget + " not implemented!"); + switch (configuration.RunTarget) + { + case RunTargetEnum.Bochs: + RunTask("RunISO", () => RunIsoInBochs(xIsoFile, xHarddiskPath, workingDirectory)); + break; + case RunTargetEnum.Qemu: + RunTask("RunISO", () => RunIsoInQemu(xIsoFile, xHarddiskPath, workingDirectory)); + break; + case RunTargetEnum.VMware: + RunTask("RunISO", () => RunIsoInVMware(xIsoFile, xHarddiskPath)); + break; + case RunTargetEnum.HyperV: + RunTask("RunISO", () => RunIsoInHyperV(xIsoFile, xHarddiskPath)); + break; + default: + throw new ArgumentOutOfRangeException("RunTarget " + configuration.RunTarget + " not implemented!"); + } } OutputHandler.ExecuteKernelEnd(assemblyFileName); @@ -82,10 +101,111 @@ private void RunTask(string aTaskName, Action aAction) { aAction(); } + catch(Exception e) + { + OutputHandler.LogError(e.ToString()); + } finally { OutputHandler.TaskEnd(aTaskName); } } + + private void StartTcpServer() + { + var listener = new TcpListener(IPAddress.Loopback, 12345); + listener.Start(); + + Console.WriteLine("TCP server started in a new thread, waiting connection from test kernel..."); + + IPEndPoint localEndPoint = listener.LocalEndpoint as IPEndPoint; + Console.WriteLine($"IP: {localEndPoint.Address}, Port: {localEndPoint.Port}"); + + var client = listener.AcceptTcpClient(); + var remoteEndPoint = client.Client.RemoteEndPoint as IPEndPoint; + var clientIPAddress = remoteEndPoint.Address; + Console.WriteLine("Test kernel connected! Beginning tests..."); + + IPAddress remoteIPAddress = null; + + using (NetworkStream stream = client.GetStream()) + { + // Test 1: Send simple message + string testMessage = "Hello from the testrunner!"; + byte[] messageBytes = Encoding.ASCII.GetBytes(testMessage); + stream.Write(messageBytes, 0, messageBytes.Length); + Console.WriteLine($"Sent: {testMessage}"); + + // Test 2: Receive a message from kernel + byte[] bufferIp = new byte[1024]; + int bytesIpRead = stream.Read(bufferIp, 0, bufferIp.Length); + string ip = Encoding.ASCII.GetString(bufferIp, 0, bytesIpRead); + remoteIPAddress = IPAddress.Parse(ip); + Console.WriteLine($"Received: {ip}"); + + // Test 2.2: Receive a message from kernel + byte[] buffer = new byte[1024]; + int bytesRead = stream.Read(buffer, 0, buffer.Length); + string receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead); + Console.WriteLine($"Received: {receivedMessage}"); + + // Test 3: Send back the received message, capitalized + string replyMessage = receivedMessage.ToUpper(); + byte[] replyBytes = Encoding.ASCII.GetBytes(replyMessage); + stream.Write(replyBytes, 0, replyBytes.Length); + Console.WriteLine($"Sent: {replyMessage}"); + + // Test 4: Receive a big packet from kernel to test TCP sequencing + byte[] buffer2 = new byte[6000]; + int totalBytesRead = 0; + + while (totalBytesRead < 6000) + { + totalBytesRead += stream.Read(buffer2, totalBytesRead, 6000 - totalBytesRead); + } + + // Test 5: Send back the received message + stream.Write(buffer2, 0, buffer2.Length); + Console.WriteLine($"Sent: {replyMessage}"); + } + + client.Close(); + listener.Stop(); + + ConnectToTcpServer(remoteIPAddress); + } + + private void ConnectToTcpServer(IPAddress ip) + { + var xClient = new TcpClient(); + + Console.WriteLine("Attempting to connect to the kernel..."); + + try + { + // Test 6: Test TCPListener implementation + xClient.Connect(ip, 4343); + Console.WriteLine("Connected to the kernel!"); + + using (NetworkStream stream = xClient.GetStream()) + { + byte[] buffer = new byte[1024]; + int bytesRead = stream.Read(buffer, 0, buffer.Length); + string receivedMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead); + Console.WriteLine($"Received: {receivedMessage}"); + + string testMessage = "Hello from the testrunner again!"; + byte[] messageBytes = Encoding.ASCII.GetBytes(testMessage); + stream.Write(messageBytes, 0, messageBytes.Length); + Console.WriteLine($"Sent: {testMessage}"); + } + + xClient.Close(); + } + catch (SocketException ex) + { + Console.WriteLine($"Failed to connect to the kernel. Error: {ex.Message}"); + } + } } } diff --git a/Tests/Cosmos.TestRunner.Core/Engine.Running.cs b/Tests/Cosmos.TestRunner.Core/Engine.Running.cs index 635ef0a06a..0da5ce989f 100644 --- a/Tests/Cosmos.TestRunner.Core/Engine.Running.cs +++ b/Tests/Cosmos.TestRunner.Core/Engine.Running.cs @@ -60,9 +60,18 @@ void AbortTestAndLogException(Exception aException, string aMessage) aDebugConnector.CmdSimpleLongNumber += n => LogMessage( "Number from kernel: 0x" + n.ToString("X16").ToUpper()); - aDebugConnector.CmdComplexNumber += f => LogMessage( - "Number from kernel: 0x" + f.ToString("X8").ToUpper()); + aDebugConnector.CmdComplexNumber += f => + { + try + { + LogMessage( + "Number from kernel: 0x" + f.ToString("X8").ToUpper()); + } + catch(Exception e) + { + } + }; aDebugConnector.CmdComplexLongNumber += d => LogMessage( "Number from kernel: 0x" + d.ToString("X16").ToUpper()); @@ -90,6 +99,11 @@ void AbortTestAndLogException(Exception aException, string aMessage) aDebugConnector.CmdCoreDump = dump => { + if(dump == null) + { + OutputHandler.LogMessage("Attempted to dump core but didnt get enough data;"); + return; + } OutputHandler.LogMessage("Core dump:"); string eax = "EAX = 0x" + dump.EAX.ToString("X8"); @@ -191,7 +205,7 @@ private void ChannelPacketReceived(byte arg1, byte arg2, byte[] arg3) } else { - OutputHandler.LogMessage($"ChannelPacketReceived, Channel = {arg1}, Command = {arg2}"); + OutputHandler.LogMessage($"ChannelPacketReceived, Channel = {arg1}, Command = {arg2}, Args = {BitConverter.ToString(arg3)}"); } } diff --git a/Tests/Cosmos.TestRunner.Core/Engine.cs b/Tests/Cosmos.TestRunner.Core/Engine.cs index 815c6ec045..68bb6d035c 100644 --- a/Tests/Cosmos.TestRunner.Core/Engine.cs +++ b/Tests/Cosmos.TestRunner.Core/Engine.cs @@ -19,6 +19,7 @@ public partial class Engine protected TraceAssemblies TraceAssembliesLevel => mConfiguration.TraceAssembliesLevel; protected bool EnableStackCorruptionChecks => mConfiguration.EnableStackCorruptionChecks; protected StackCorruptionDetectionLevel StackCorruptionDetectionLevel => mConfiguration.StackCorruptionDetectionLevel; + protected DebugMode DebugMode => mConfiguration.DebugMode; protected bool RunWithGDB => mConfiguration.RunWithGDB; protected bool StartBochsDebugGui => mConfiguration.StartBochsDebugGUI; @@ -105,7 +106,6 @@ private IEnumerable GetRunConfigurations() foreach (var xTarget in RunTargets) { yield return new RunConfiguration(isElf: true, runTarget: xTarget); - //yield return new RunConfiguration(isElf: false, runTarget: xTarget); } } } diff --git a/Tests/Cosmos.TestRunner.Core/Enums.cs b/Tests/Cosmos.TestRunner.Core/Enums.cs index 30d8a1c05f..9e6d6fdcc2 100644 --- a/Tests/Cosmos.TestRunner.Core/Enums.cs +++ b/Tests/Cosmos.TestRunner.Core/Enums.cs @@ -4,6 +4,7 @@ public enum RunTargetEnum { Bochs, VMware, - HyperV + HyperV, + Qemu } } diff --git a/Tests/Cosmos.TestRunner.Core/IEngineConfiguration.cs b/Tests/Cosmos.TestRunner.Core/IEngineConfiguration.cs index 050283bb44..ca4ad8ddd9 100644 --- a/Tests/Cosmos.TestRunner.Core/IEngineConfiguration.cs +++ b/Tests/Cosmos.TestRunner.Core/IEngineConfiguration.cs @@ -28,6 +28,7 @@ public interface IEngineConfiguration TraceAssemblies TraceAssembliesLevel { get; } bool EnableStackCorruptionChecks { get; } StackCorruptionDetectionLevel StackCorruptionDetectionLevel { get; } + DebugMode DebugMode { get; } /// /// An enumerable of kernel assemblies which will be run. diff --git a/Tests/Cosmos.TestRunner.Core/OutputHandlerFullTextBase.cs b/Tests/Cosmos.TestRunner.Core/OutputHandlerFullTextBase.cs index 8aa9c1ed4c..675d448843 100644 --- a/Tests/Cosmos.TestRunner.Core/OutputHandlerFullTextBase.cs +++ b/Tests/Cosmos.TestRunner.Core/OutputHandlerFullTextBase.cs @@ -26,7 +26,7 @@ protected override void OnTaskEnd(string taskName) protected override void OnUnhandledException(Exception exception) { - Log("Unhandled exception: " + exception.ToString()); + Log("Unhandled exception: " + exception?.ToString() ?? "Unable to get exception: Exception was null!"); } protected override void OnExecutionEnd() diff --git a/Tests/Cosmos.TestRunner.Core/RunConfiguration.cs b/Tests/Cosmos.TestRunner.Core/RunConfiguration.cs index 5331b9baee..e01656b8f4 100644 --- a/Tests/Cosmos.TestRunner.Core/RunConfiguration.cs +++ b/Tests/Cosmos.TestRunner.Core/RunConfiguration.cs @@ -9,6 +9,11 @@ public RunConfiguration(bool isElf, RunTargetEnum runTarget) { IsELF = isElf; RunTarget = runTarget; + + if (runTarget == RunTargetEnum.Qemu) + { + IsELF = false; + } } } } diff --git a/Tests/Cosmos.TestRunner.Core/TestResultExtensions.cs b/Tests/Cosmos.TestRunner.Core/TestResultExtensions.cs index 7cfe9f1f04..b0a055dad0 100644 --- a/Tests/Cosmos.TestRunner.Core/TestResultExtensions.cs +++ b/Tests/Cosmos.TestRunner.Core/TestResultExtensions.cs @@ -55,7 +55,8 @@ public static void SaveXmlToFile(this ITestResult aTestResult, string aFilePath) { Encoding = Encoding.UTF8, Indent = true, - OmitXmlDeclaration = true + OmitXmlDeclaration = true, + CheckCharacters =false }; using (var xWriter = XmlWriter.Create(aFilePath, xWriterSettings)) diff --git a/Tests/Cosmos.TestRunner.Core/packages.lock.json b/Tests/Cosmos.TestRunner.Core/packages.lock.json new file mode 100644 index 0000000000..b3c2ec78e2 --- /dev/null +++ b/Tests/Cosmos.TestRunner.Core/packages.lock.json @@ -0,0 +1,458 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.Full/Cosmos.TestRunner.Full.csproj b/Tests/Cosmos.TestRunner.Full/Cosmos.TestRunner.Full.csproj index 420536e315..6246b420ed 100644 --- a/Tests/Cosmos.TestRunner.Full/Cosmos.TestRunner.Full.csproj +++ b/Tests/Cosmos.TestRunner.Full/Cosmos.TestRunner.Full.csproj @@ -1,8 +1,9 @@  - netcoreapp2.0 + net6.0 True + Debug;Release;TEST @@ -11,13 +12,14 @@ - + + @@ -28,6 +30,8 @@ + + diff --git a/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs b/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs index 34eac84ed5..3f834033ce 100644 --- a/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs +++ b/Tests/Cosmos.TestRunner.Full/DefaultEngineConfiguration.cs @@ -17,6 +17,7 @@ public virtual IEnumerable RunTargets yield return RunTargetEnum.Bochs; //yield return RunTargetEnum.VMware; //yield return RunTargetEnum.HyperV; + //yield return RunTargetEnum.Qemu; } } @@ -27,7 +28,8 @@ public virtual IEnumerable RunTargets public virtual string KernelPkg => String.Empty; public virtual TraceAssemblies TraceAssembliesLevel => TraceAssemblies.User; public virtual bool EnableStackCorruptionChecks => true; - public virtual StackCorruptionDetectionLevel StackCorruptionDetectionLevel => StackCorruptionDetectionLevel.AllInstructions; + public virtual StackCorruptionDetectionLevel StackCorruptionDetectionLevel => StackCorruptionDetectionLevel.MethodFooters; + public virtual DebugMode DebugMode => DebugMode.Source; public virtual IEnumerable KernelAssembliesToRun { diff --git a/Tests/Cosmos.TestRunner.Full/TestKernelSets.cs b/Tests/Cosmos.TestRunner.Full/TestKernelSets.cs index af462a9678..6e2f0e1c35 100644 --- a/Tests/Cosmos.TestRunner.Full/TestKernelSets.cs +++ b/Tests/Cosmos.TestRunner.Full/TestKernelSets.cs @@ -16,25 +16,28 @@ public static IEnumerable GetKernelTypesToRun() public static IEnumerable GetStableKernelTypes() { yield return typeof(BoxingTests.Kernel); - yield return typeof(Cosmos.Compiler.Tests.TypeSystem.Kernel); - yield return typeof(Cosmos.Compiler.Tests.Bcl.Kernel); + yield return typeof(Compiler.Tests.TypeSystem.Kernel); + yield return typeof(Compiler.Tests.Bcl.Kernel); + yield return typeof(Compiler.Tests.Bcl.System.Kernel); //yield return typeof(Cosmos.Compiler.Tests.Encryption.Kernel); - yield return typeof(Cosmos.Compiler.Tests.Exceptions.Kernel); - yield return typeof(Cosmos.Compiler.Tests.MethodTests.Kernel); - yield return typeof(Cosmos.Compiler.Tests.SingleEchoTest.Kernel); - yield return typeof(Cosmos.Kernel.Tests.Fat.Kernel); - yield return typeof(Cosmos.Kernel.Tests.IO.Kernel); + yield return typeof(Compiler.Tests.Exceptions.Kernel); + yield return typeof(Compiler.Tests.MethodTests.Kernel); + yield return typeof(Compiler.Tests.SingleEchoTest.Kernel); + yield return typeof(Kernel.Tests.Fat.Kernel); + yield return typeof(Kernel.Tests.IO.Kernel); yield return typeof(SimpleStructsAndArraysTest.Kernel); - yield return typeof(Cosmos.Kernel.Tests.DiskManager.Kernel); + yield return typeof(Kernel.Tests.DiskManager.Kernel); //yield return typeof(KernelGen3.Boot); + yield return typeof(GraphicTest.Kernel); - /* Please see the notes on the kernel itself before enabling it */ - //yield return typeof(GraphicTest.Kernel); - /* Please see the notes on the kernel itself before enabling it */ + // Disable network tests due to our self hosted CI/CD limitations (VPS currently doesn't support VMWare with its CPU) + //yield return typeof(NetworkTest.Kernel); + yield return typeof(AudioTests.Kernel); + // Please see the notes on the kernel itself before enabling it //yield return typeof(ConsoleTest.Kernel); - /* This is a bit slow and works only because ring check is disabled to decide if leave it enabled */ yield return typeof(MemoryOperationsTest.Kernel); + yield return typeof(ProcessorTests.Kernel); } } } diff --git a/Tests/Cosmos.TestRunner.Full/packages.lock.json b/Tests/Cosmos.TestRunner.Full/packages.lock.json new file mode 100644 index 0000000000..0acb01a769 --- /dev/null +++ b/Tests/Cosmos.TestRunner.Full/packages.lock.json @@ -0,0 +1,1659 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "audiotests": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "boxingtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "consoletest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bclsystem": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.encryption": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.exceptions": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.interfaces": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.methodtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.singleechotest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.typesystem": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.diskmanager": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.fat": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.io": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "graphictest": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "memoryoperationstest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "networktest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "processortests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "simplestructsandarraystest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.TestAdapter/Cosmos.TestRunner.TestAdapter.csproj b/Tests/Cosmos.TestRunner.TestAdapter/Cosmos.TestRunner.TestAdapter.csproj index a0f1d17907..3a272fb07a 100644 --- a/Tests/Cosmos.TestRunner.TestAdapter/Cosmos.TestRunner.TestAdapter.csproj +++ b/Tests/Cosmos.TestRunner.TestAdapter/Cosmos.TestRunner.TestAdapter.csproj @@ -1,42 +1,20 @@  - netcoreapp2.0 + net6.0 Test adapter for Cosmos kernels. - True + True + False NU5111;$(NoWarn) + Debug;Release;TEST - + - - False - - True - $(TargetsForTfmSpecificContentInPackage);PackTestAdapter - - - - - - <_GeneratedFiles Include="$(PublishDepsFilePath)" /> - - - - - tools\%(_GeneratedFiles.RecursiveDir)%(_GeneratedFiles.Filename)%(_GeneratedFiles.Extension) - - - tools\%(ResolvedFileToPublish.RelativePath) - - - - - diff --git a/Tests/Cosmos.TestRunner.TestAdapter/EngineConfiguration.cs b/Tests/Cosmos.TestRunner.TestAdapter/EngineConfiguration.cs index 31cfceff62..4d01c37632 100644 --- a/Tests/Cosmos.TestRunner.TestAdapter/EngineConfiguration.cs +++ b/Tests/Cosmos.TestRunner.TestAdapter/EngineConfiguration.cs @@ -20,6 +20,7 @@ internal sealed class EngineConfiguration : IEngineConfiguration public TraceAssemblies TraceAssembliesLevel { get; } public bool EnableStackCorruptionChecks { get; } public StackCorruptionDetectionLevel StackCorruptionDetectionLevel { get; } + public DebugMode DebugMode { get; } public IEnumerable KernelAssembliesToRun { get; } diff --git a/Tests/Cosmos.TestRunner.TestAdapter/packages.lock.json b/Tests/Cosmos.TestRunner.TestAdapter/packages.lock.json new file mode 100644 index 0000000000..aa3e7be982 --- /dev/null +++ b/Tests/Cosmos.TestRunner.TestAdapter/packages.lock.json @@ -0,0 +1,487 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.TestPlatform.ObjectModel": { + "type": "Direct", + "requested": "[17.0.0, )", + "resolved": "17.0.0", + "contentHash": "WMugCdPkA8U/BsSRc+3RN+DXcaYSDvp/s0MofVld08iF1O5fek4iKecygk6NruNf1rgJsv4LK71mrwbyeqhzHA==", + "dependencies": { + "NuGet.Frameworks": "5.0.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "c5JVjuVAm4f7E9Vj+v09Z9s2ZsqFDjBpcsyS3M9xRo0bEdm/LVZSzLxxNvfvAwRiiE8nwe1h2G4OwiwlzFKXlA==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.TestController/Assert.cs b/Tests/Cosmos.TestRunner.TestController/Assert.cs index 3206295f3d..e27e05f672 100644 --- a/Tests/Cosmos.TestRunner.TestController/Assert.cs +++ b/Tests/Cosmos.TestRunner.TestController/Assert.cs @@ -5,22 +5,31 @@ namespace Cosmos.TestRunner { public static class Assert { + public static void Succeed(string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + TestController.Debugger.Send("Assertion succeeded:"); + TestController.Debugger.Send(message); + TestController.AssertionSucceeded(); + } + public static void Fail(string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + TestController.Debugger.Send("Assertion failed:"); + TestController.Debugger.Send("File: " + file); + TestController.Debugger.Send("Line number: " + line); + TestController.Debugger.Send(message); + TestController.Failed(); + throw new Exception("Assertion failed!"); + } + public static void IsTrue(bool condition, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) { if (condition) { - TestController.Debugger.Send("Assertion succeeded:"); - TestController.Debugger.Send(message); - TestController.AssertionSucceeded(); + Succeed(message, file, line); } else { - TestController.Debugger.Send("Assertion failed:"); - TestController.Debugger.Send("File: " + file); - TestController.Debugger.Send("Line number: " + line); - TestController.Debugger.Send(message); - TestController.Failed(); - throw new Exception("Assertion failed!"); + Fail(message, file, line); } } @@ -35,16 +44,169 @@ public static void AreEqual(int expected, int actual, string message, [CallerFil if (!xResult) { TestController.Debugger.Send("Expected value"); - TestController.Debugger.SendNumber((uint) expected); + TestController.Debugger.SendNumber(expected); + TestController.Debugger.Send("Actual value"); + TestController.Debugger.SendNumber(actual); + + TestController.Debugger.Send("Expected value"); + TestController.Debugger.SendNumber(expected); + TestController.Debugger.Send("Actual value"); + TestController.Debugger.SendNumber(actual); + + TestController.Debugger.Send("Numbers sent!"); + } + IsTrue(xResult, message, file, line); + } + + public static void AreEqual(string expected, string actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + var xResult = expected == actual; + if (!xResult) + { + TestController.Debugger.Send($"Expected value: '{expected}'"); + TestController.Debugger.Send($"Actual value: '{actual}'"); + } + IsTrue(xResult, message, file, line); + } + + public static void AreEqual(long expected, long actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + var xResult = expected == actual; + if (!xResult) + { + TestController.Debugger.Send($"Expected value: '{expected}'"); + TestController.Debugger.Send($"Actual value: '{actual}'"); + } + IsTrue(xResult, message, file, line); + } + + public static void AreEqual(double expected, double actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + var xResult = Math.Abs(expected - actual) < 0.0001; + if (!xResult) + { + TestController.Debugger.Send($"Expected value: '{expected}' " + BitConverter.ToString(BitConverter.GetBytes(expected))); + TestController.Debugger.Send($"Actual value: '{actual}' " + BitConverter.ToString(BitConverter.GetBytes(actual))); + TestController.Debugger.Send($"Diff: {xResult}"); + } + IsTrue(xResult, message, file, line); + } + + public static void AreEqual(string[] expected, string[] actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + if(expected.Length != actual.Length) + { + TestController.Debugger.Send($"Array lengths differ: Expected: {expected.Length} Actual: {actual.Length}"); + if(actual.Length < 32) + { + TestController.Debugger.Send("Actual Content:"); + for (int i = 0; i < actual.Length; i++) + { + TestController.Debugger.Send(actual[i]); + } + } + Fail(message, file, line); + return; + } + for (int i = 0; i < expected.Length; i++) + { + if(expected[i] != actual[i]) + { + TestController.Debugger.Send($"Values differ in row {i}"); + TestController.Debugger.Send($"Expected value: '{expected[i]}'"); + TestController.Debugger.Send($"Actual value: '{actual[i]}'"); + Fail(message, file, line); + return; + } + } + Succeed(message, file, line); + } + + public static void AreNotEqual(uint expected, uint actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + var xResult = expected != actual; + if (!xResult) + { + TestController.Debugger.Send("Expected value"); + TestController.Debugger.SendNumber((uint)expected); TestController.Debugger.Send("Actual value"); TestController.Debugger.SendNumber((uint)actual); - TestController.Debugger.SendNumber("TestAssertion", "Expected", (uint)expected, 32); - TestController.Debugger.SendNumber("TestAssertion", "Actual", (uint)actual, 32); + TestController.Debugger.Send("Expected value"); + TestController.Debugger.SendNumber(expected); + TestController.Debugger.Send("Actual value"); + TestController.Debugger.SendNumber(actual); TestController.Debugger.Send("Numbers sent!"); } IsTrue(xResult, message, file, line); } + + public static void AreEqual(byte[] expected, byte[] actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + if (expected.Length != actual.Length) + { + TestController.Debugger.Send($"Array lengths differ: Expected: {expected.Length} Actual: {actual.Length}"); + Fail(message, file, line); + return; + } + for (int i = 0; i < expected.Length; i++) + { + if (expected[i] != actual[i]) + { + TestController.Debugger.Send($"Values differ in row {i}"); + TestController.Debugger.Send($"Expected value: '{expected[i]}'"); + TestController.Debugger.Send($"Actual value: '{actual[i]}'"); + TestController.Debugger.Send(BitConverter.ToString(actual)); + Fail(message, file, line); + return; + } + } + Succeed(message, file, line); + } + + public static void AreEqual(uint[] expected, uint[] actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + if (expected.Length != actual.Length) + { + TestController.Debugger.Send($"Array lengths differ: Expected: {expected.Length} Actual: {actual.Length}"); + Fail(message, file, line); + return; + } + for (int i = 0; i < expected.Length; i++) + { + if (expected[i] != actual[i]) + { + TestController.Debugger.Send($"Values differ in row {i}"); + TestController.Debugger.Send($"Expected value: '{expected[i]}'"); + TestController.Debugger.Send($"Actual value: '{actual[i]}'"); + Fail(message, file, line); + return; + } + } + Succeed(message, file, line); + } + + public static void AreEqual(int[] expected, int[] actual, string message, [CallerFilePath] string file = null, [CallerLineNumber] int line = 0) + { + if (expected.Length != actual.Length) + { + TestController.Debugger.Send($"Array lengths differ: Expected: {expected.Length} Actual: {actual.Length}"); + Fail(message, file, line); + return; + } + for (int i = 0; i < expected.Length; i++) + { + if (expected[i] != actual[i]) + { + TestController.Debugger.Send($"Values differ in row {i}"); + TestController.Debugger.Send($"Expected value: '{expected[i]}'"); + TestController.Debugger.Send($"Actual value: '{actual[i]}'"); + Fail(message, file, line); + return; + } + } + Succeed(message, file, line); + } } } diff --git a/Tests/Cosmos.TestRunner.TestController/Cosmos.TestRunner.TestController.csproj b/Tests/Cosmos.TestRunner.TestController/Cosmos.TestRunner.TestController.csproj index 5039f4c372..8f5e662b0c 100644 --- a/Tests/Cosmos.TestRunner.TestController/Cosmos.TestRunner.TestController.csproj +++ b/Tests/Cosmos.TestRunner.TestController/Cosmos.TestRunner.TestController.csproj @@ -1,7 +1,8 @@  - netstandard2.0 + net6.0 + Debug;Release;TEST diff --git a/Tests/Cosmos.TestRunner.TestController/TestController.cs b/Tests/Cosmos.TestRunner.TestController/TestController.cs index 5e9cc60e63..b363e42d7c 100644 --- a/Tests/Cosmos.TestRunner.TestController/TestController.cs +++ b/Tests/Cosmos.TestRunner.TestController/TestController.cs @@ -1,19 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; + using Cosmos.Debug.Kernel; +using System; namespace Cosmos.TestRunner { public static class TestController { + static readonly Debugger debugger = new("TestController"); + internal static Debugger Debugger { get { - return new Debugger("Tests", "TestController"); + return debugger; } } @@ -24,16 +23,15 @@ public static void Completed() Debugger.SendChannelCommand(TestChannel, (byte)TestChannelCommandEnum.TestCompleted); Debugger.Send("Test completed"); Console.WriteLine("Test completed"); - while (true) - ; + while (true) ; } public static void Failed() { Debugger.Send("Failed"); Debugger.SendChannelCommand(TestChannel, (byte)TestChannelCommandEnum.TestFailed); - while (true) - ; + Debugger.DoBochsBreak(); + while (true) ; } internal static void AssertionSucceeded() diff --git a/Tests/Cosmos.TestRunner.TestController/packages.lock.json b/Tests/Cosmos.TestRunner.TestController/packages.lock.json new file mode 100644 index 0000000000..dd80f8cbae --- /dev/null +++ b/Tests/Cosmos.TestRunner.TestController/packages.lock.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "cosmos.debug.kernel": { + "type": "Project" + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.UI/App.xaml.cs b/Tests/Cosmos.TestRunner.UI/App.xaml.cs index fa19e5ecad..7706e41fae 100644 --- a/Tests/Cosmos.TestRunner.UI/App.xaml.cs +++ b/Tests/Cosmos.TestRunner.UI/App.xaml.cs @@ -15,16 +15,18 @@ internal class App : Application public override void Initialize() { AvaloniaXamlLoader.Load(this); - base.Initialize(); } - static void Main(string[] args) + private static void Main(string[] args) { InitializeLogging(); + BuildAvaloniaApp().Start(); + } + + private static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure() .UsePlatformDetect() - .Start(); - } + .UseReactiveUI(); [Conditional("DEBUG")] private static void InitializeLogging() diff --git a/Tests/Cosmos.TestRunner.UI/Cosmos.TestRunner.UI.csproj b/Tests/Cosmos.TestRunner.UI/Cosmos.TestRunner.UI.csproj index b4c50744ba..8498e468e5 100644 --- a/Tests/Cosmos.TestRunner.UI/Cosmos.TestRunner.UI.csproj +++ b/Tests/Cosmos.TestRunner.UI/Cosmos.TestRunner.UI.csproj @@ -1,10 +1,11 @@  - netcoreapp2.0 + net6.0 Exe - win7-x86 + win10-x86 False + Debug;Release;TEST @@ -13,8 +14,10 @@ - - + + + + diff --git a/Tests/Cosmos.TestRunner.UI/ViewModels/MainWindowViewModel.cs b/Tests/Cosmos.TestRunner.UI/ViewModels/MainWindowViewModel.cs index ea08020d18..447160c44e 100644 --- a/Tests/Cosmos.TestRunner.UI/ViewModels/MainWindowViewModel.cs +++ b/Tests/Cosmos.TestRunner.UI/ViewModels/MainWindowViewModel.cs @@ -1,15 +1,16 @@ using System; -using System.ComponentModel; using System.Threading; +using ReactiveUI; + using Cosmos.TestRunner.Core; using Cosmos.TestRunner.Full; namespace Cosmos.TestRunner.UI.ViewModels { - internal class MainWindowViewModel : INotifyPropertyChanged + internal class MainWindowViewModel : ReactiveObject { - public event PropertyChangedEventHandler PropertyChanged; + private string _log; public MainWindowViewModel(IEngineConfiguration aEngineConfiguration) { @@ -17,20 +18,17 @@ public MainWindowViewModel(IEngineConfiguration aEngineConfiguration) xEngine.SetOutputHandler( new OutputHandler( - m => - { - TestRunnerLog += m + Environment.NewLine; - OnPropertyChanged(nameof(TestRunnerLog)); - })); + m => TestRunnerLog += m + Environment.NewLine)); new Thread(() => xEngine.Execute()).Start(); } - public string TestRunnerLog { get; set; } - - private void OnPropertyChanged(string aPropertyName) => - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(aPropertyName)); - + public string TestRunnerLog + { + get => _log; + set => this.RaiseAndSetIfChanged(ref _log, value); + } + internal class OutputHandler : OutputHandlerFullTextBase { private Action mLog; diff --git a/Tests/Cosmos.TestRunner.UI/ViewModels/SettingsDialogViewModel.cs b/Tests/Cosmos.TestRunner.UI/ViewModels/SettingsDialogViewModel.cs index a5af0b8c52..6a5d712b00 100644 --- a/Tests/Cosmos.TestRunner.UI/ViewModels/SettingsDialogViewModel.cs +++ b/Tests/Cosmos.TestRunner.UI/ViewModels/SettingsDialogViewModel.cs @@ -2,32 +2,32 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Windows.Input; -using PropertyChangedEventArgs = System.ComponentModel.PropertyChangedEventArgs; using Avalonia.Controls; +using ReactiveUI; + using Cosmos.Build.Common; using Cosmos.TestRunner.Core; using Cosmos.TestRunner.Full; namespace Cosmos.TestRunner.UI.ViewModels { - internal class SettingsDialogViewModel : IEngineConfiguration, INotifyPropertyChanged + internal class SettingsDialogViewModel : ReactiveObject, IEngineConfiguration { private static IEngineConfiguration defaultEngineConfiguration = new DefaultEngineConfiguration(); private static IEnumerable stableKernelTypes = TestKernelSets.GetStableKernelTypes(); - public event PropertyChangedEventHandler PropertyChanged; - public SettingsDialogViewModel(Window aWindow) { KernelTypesToRun = new ObservableCollection(stableKernelTypes); - RunTests = new RunTestsCommand(aWindow, this); + + RunTestsCommand = ReactiveCommand.Create( + () => RunTests(aWindow), + this.WhenAny(v => v.KernelTypesToRun, c => c.Value.Any())); } #region Engine Configuration @@ -97,6 +97,13 @@ public StackCorruptionDetectionLevel StackCorruptionDetectionLevel set => SetProperty(ref mStackCorruptionDetectionLevel, value); } + private DebugMode mDebugMode = defaultEngineConfiguration.DebugMode; + public DebugMode DebugMode + { + get => mDebugMode; + set => SetProperty(ref mDebugMode, value); + } + public IEnumerable KernelAssembliesToRun { get @@ -128,41 +135,17 @@ public RunTargetEnum RunTarget #endregion - public ICommand RunTests { get; set; } + public ICommand RunTestsCommand { get; set; } + + private void RunTests(Window aWindow) => aWindow.Close(this); private void SetProperty(ref T aProperty, T aValue, [CallerMemberName]string aPropertyName = null) { if (!EqualityComparer.Default.Equals(aProperty, aValue)) { aProperty = aValue; - OnPropertyChanged(aPropertyName); + this.RaisePropertyChanged(aPropertyName); } } - - private void OnPropertyChanged(string aPropertyName) => - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(aPropertyName)); - - internal class RunTestsCommand : ICommand - { - private Window mWindow; - private SettingsDialogViewModel mViewModel; - - public RunTestsCommand(Window aWindow, SettingsDialogViewModel aViewModel) - { - mWindow = aWindow; - mViewModel = aViewModel; - - mViewModel.KernelTypesToRun.CollectionChanged += KernelTypesToRun_CollectionChanged; - } - - public event EventHandler CanExecuteChanged; - - public bool CanExecute(object parameter) => mViewModel.KernelTypesToRun.Any(); - - public void Execute(object parameter) => mWindow.Close(mViewModel); - - private void KernelTypesToRun_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) => - CanExecuteChanged?.Invoke(this, EventArgs.Empty); - } } } diff --git a/Tests/Cosmos.TestRunner.UI/Views/SettingsDialog.xaml b/Tests/Cosmos.TestRunner.UI/Views/SettingsDialog.xaml index 001cad0bcc..26371b6a0d 100644 --- a/Tests/Cosmos.TestRunner.UI/Views/SettingsDialog.xaml +++ b/Tests/Cosmos.TestRunner.UI/Views/SettingsDialog.xaml @@ -2,13 +2,13 @@ Title="Cosmos Test Runner Settings" SizeToContent="WidthAndHeight"> - + Spacing="16"> - + Allowed seconds in kernel: @@ -20,7 +20,7 @@ - + Debug IL2CPU Kernel package: @@ -42,7 +42,7 @@ SelectedItems="{Binding KernelTypesToRun}" SelectionMode="Multiple" /> - + diff --git a/Tests/Cosmos.TestRunner.UI/packages.lock.json b/Tests/Cosmos.TestRunner.UI/packages.lock.json new file mode 100644 index 0000000000..6cc7d6286d --- /dev/null +++ b/Tests/Cosmos.TestRunner.UI/packages.lock.json @@ -0,0 +1,3873 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Avalonia": { + "type": "Direct", + "requested": "[0.7.0, )", + "resolved": "0.7.0", + "contentHash": "9DCE4qcFfapGgQvdbJ2cOIGfxvwdBmG1N50P1xcZSne0B1vHbJ4YFU4jhKboQpKou1FOan/EvKucQfBT7N9IVA==", + "dependencies": { + "Avalonia.Remote.Protocol": "0.7.0", + "JetBrains.Annotations": "10.3.0", + "Serilog": "2.5.0", + "Serilog.Sinks.Debug": "1.0.0", + "Serilog.Sinks.Trace": "2.1.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.1", + "System.Reactive": "4.0.0", + "System.ValueTuple": "4.5.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[0.7.0, )", + "resolved": "0.7.0", + "contentHash": "94jinKrx0Srn7Ixn6fhqbz8QKr9meeogex2mvbUdQrXeq+ZKAkxiFDTaxksxomGAx5lES2pEbCu/cXy+a+OrqQ==", + "dependencies": { + "Avalonia": "0.7.0", + "Avalonia.Direct2D1": "0.7.0", + "Avalonia.Gtk3": "0.7.0", + "Avalonia.Native": "0.7.0", + "Avalonia.Skia": "0.7.0", + "Avalonia.Win32": "0.7.0" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "(, )", + "resolved": "0.6.0", + "contentHash": "zgV8PCnF8HoV9/2J+0/Up5qF4Pq830bgeYl/nWwI7yIvfQBVeExCTaFwsPTYbnww0YrHce4l0zyazoULTe7uzQ==", + "dependencies": { + "Avalonia": "0.6.0", + "reactiveui": "8.0.0-alpha0073" + } + }, + "ReactiveUI": { + "type": "Direct", + "requested": "(, )", + "resolved": "1.0.0", + "contentHash": "qbAZmC7xLYVtkw2r5lMC1n/oAWPuyY26aeDpz+x3anMKY/vVwSJHdBR+y+3lTACAKAG0jlRyAad9mJ2/ne98Dw==", + "dependencies": { + "DynamicData": "6.7.1.2534", + "Splat": "5.1.4", + "System.Reactive": "4.0.0", + "System.Reactive.Compatibility": "4.0.0", + "System.Runtime.Serialization.Primitives": "4.3.0" + } + }, + "Avalonia.Direct2D1": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "Xt6eEtM7krJD6GWNLwALs0CHdYr4t8cpbj/seMaNO/hMsQAzxeVeH7t6s63MWas26lx/Dl7U+SUWTem2WbTHOA==", + "dependencies": { + "Avalonia": "0.7.0", + "JetBrains.Annotations": "10.3.0", + "SharpDX": "4.0.1", + "SharpDX.DXGI": "4.0.1", + "SharpDX.Direct2D1": "4.0.1", + "SharpDX.Direct3D11": "4.0.1", + "System.Reactive": "4.0.0" + } + }, + "Avalonia.Gtk3": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "l4RFSWKtU6v2uza+EWdKERX0cMtT55oQK+/PSR7S+otjeDl5CTm8P3300dr4LsKAe+NjqH6MGIbWSUXbjiYl4A==", + "dependencies": { + "Avalonia": "0.7.0" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "jzAL+e4XCHAnl6yOwF5K8tvGHWkPoTtbrulgDsUbDUxz4XUtbkxyov66uZFgOQVdjl4yyq9Xtl6V1cUCQibmxA==", + "dependencies": { + "Avalonia": "0.7.0", + "SharpGen.Runtime.COM": "1.1.0" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "M+r3isxT+Ib8fjpuJ4IVNG20AQDbSNA+BHun40yU5AHTecy9+7ChFKMUqVt69WLgZiQgxop7P6J6pJgOwpy8CA==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "uAjNmIljKKTIswKu5zwxL4vlyaQLRXAAgBu0hu2/JKC45G1D91DDwn6OmN1Hv283EKDhb0T6q8zawHk2pbR9hQ==", + "dependencies": { + "Avalonia": "0.7.0", + "Avalonia.Skia.Linux.Natives": "1.60.0.1", + "SkiaSharp": "1.60.0" + } + }, + "Avalonia.Skia.Linux.Natives": { + "type": "Transitive", + "resolved": "1.60.0.1", + "contentHash": "a6Qa9qCGMImwtD2fmio39OsJ2BqZlQuHvRWlSXP+wovDcuMRB0JjN981j0tfYlvJjvCtCAo8Z7piytjnWtJTuw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "SkiaSharp": "[1.60.0]" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "j/Rknika/XzNFCOey7vc7t4sn5tdzU+zEepvmV3J09/uYiDie1+ZSddgoq9kSzbbAUmRnQ4ixrjFnvnnglwa1Q==", + "dependencies": { + "Avalonia": "0.7.0", + "System.Drawing.Common": "4.5.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "DynamicData": { + "type": "Transitive", + "resolved": "6.7.1.2534", + "contentHash": "0hxwufGlJxLI79B9n94rkl2SXCyhAHHXLXaVJF6MyrdLCqkV3Xg3x+dIp37fXJIhrV3jj0o3bdqYos/BqWAS5g==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "Libuv": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "uqX2Frwf9PW8MaY7PRNY6HM5BpW1D8oj1EdqzrmbEFD5nH63Yat3aEjN/tws6Tw6Fk7LwmLBvtUh32tTeTaHiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1" + } + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "HS3iRWZKcUw/8eZ/08GXKY2Bn7xNzQPzf8gRPHGSowX7u7XXu9i9YEaBeBNKUXWfI7qjvT2zXtLUvbN0hds8vg==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "V09G35cs0CT1C4Dr1IEOh8IGfnWALEVAOO5JXsqagxXwmYR012TlorQ+vx2eXxfZRKs3gAS/r92gN9kRBLba5A==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "1.1.0", + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Collections.Immutable": "1.2.0", + "System.Console": "4.0.0", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.FileVersionInfo": "4.0.0", + "System.Diagnostics.StackTrace": "4.0.1", + "System.Diagnostics.Tools": "4.0.1", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.Numerics": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.CodePages": "4.0.1", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Tasks.Parallel": "4.0.1", + "System.Threading.Thread": "4.0.0", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11", + "System.Xml.XPath.XDocument": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "BgWDIAbSFsHuGeLSn/rljLi51nXqkSo4DZ0qEIrHyPVasrhxEVq7aV8KKZ3HEfSFB+GIhBmOogE+mlOLYg19eg==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[1.3.0]" + } + }, + "Microsoft.CodeAnalysis.VisualBasic": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "Sf3k8PkTkWqBmXnnblJbvb7ewO6mJzX6WO2t7m04BmOY5qBq6yhhyXnn/BMM+QCec3Arw3X35Zd8f9eBql0qgg==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "1.3.0" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.App": { + "type": "Transitive", + "resolved": "1.0.5", + "contentHash": "rqd+4QNUIdrauKaP8KVo2Ut5OeEGoyOsAMZr7u1IEtSRx5LeA1omVCLpY0TJ5Z47jfMm/MRuD/RG5Ahg8WwX2w==", + "dependencies": { + "Libuv": "1.9.1", + "Microsoft.CSharp": "4.0.1", + "Microsoft.CodeAnalysis.CSharp": "1.3.0", + "Microsoft.CodeAnalysis.VisualBasic": "1.3.0", + "Microsoft.NETCore.DotNetHostPolicy": "1.0.5", + "Microsoft.NETCore.Platforms": "1.0.2", + "Microsoft.NETCore.Runtime.CoreCLR": "1.0.7", + "Microsoft.VisualBasic": "10.0.1", + "NETStandard.Library": "1.6.0", + "System.Buffers": "4.0.0", + "System.Collections.Immutable": "1.2.0", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Annotations": "4.1.0", + "System.Diagnostics.DiagnosticSource": "4.0.0", + "System.Diagnostics.Process": "4.1.0", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.IO.FileSystem.Watcher": "4.0.0", + "System.IO.MemoryMappedFiles": "4.0.0", + "System.IO.UnmanagedMemoryStream": "4.0.1", + "System.Linq.Expressions": "4.1.1", + "System.Linq.Parallel": "4.0.1", + "System.Linq.Queryable": "4.0.1", + "System.Net.Http": "4.1.2", + "System.Net.NameResolution": "4.0.0", + "System.Net.Requests": "4.0.11", + "System.Net.Security": "4.0.1", + "System.Net.WebHeaderCollection": "4.0.1", + "System.Numerics.Vectors": "4.1.1", + "System.Reflection.DispatchProxy": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.Reader": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Threading.Tasks.Dataflow": "4.6.0", + "System.Threading.Tasks.Extensions": "4.0.0", + "System.Threading.Tasks.Parallel": "4.0.1", + "System.Threading.Thread": "4.0.0", + "System.Threading.ThreadPool": "4.0.10", + "runtime.native.System.Security.Cryptography": "4.0.1" + } + }, + "Microsoft.NETCore.DotNetHost": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "uaMgykq6AckP3hZW4dsD6zjocxyXPz0tcTl8OX7mlSUWsyFXdtf45sjdwI0JIHxt3gnI6GihAlOAwYK8HE4niQ==" + }, + "Microsoft.NETCore.DotNetHostPolicy": { + "type": "Transitive", + "resolved": "1.0.5", + "contentHash": "KR8e8+lh/YnhD0wDCMBRUjn0/VnryxHbu6I61U6m7PAyz9HbRr+iX3BYL925OHMFuFmk1atc/RRGjGtVOVrvrg==", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "1.0.1" + } + }, + "Microsoft.NETCore.DotNetHostResolver": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "GEXgpAHB9E0OhfcmNJ664Xcd2bJkz2qkGIAFmCgEI5ANlQy4qEEmBVfUqA+Z9HB85ZwWxZc1eIJ6fxdxcjrctg==", + "dependencies": { + "Microsoft.NETCore.DotNetHost": "1.0.1" + } + }, + "Microsoft.NETCore.Jit": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "pNYSZFvX14x4ubToTLxj9O9xNIEg1kHaL6gkMr8urWKIY65cu8272KRlT3cgJCKLbzFO0XZDjvPlRBCFrbJm7Q==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Runtime.CoreCLR": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "t81co+R1xDubSQDDYP+zddd1Eya7xGeN2XlJMSsNFUCKRm35/5u8knnXOQTdfE1nf6bYqPROt18WlhdZui1FLA==", + "dependencies": { + "Microsoft.NETCore.Jit": "1.0.7", + "Microsoft.NETCore.Windows.ApiSets": "1.0.1" + } + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.NETCore.Windows.ApiSets": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "SaToCvvsGMxTgtLv/BrFQ5IFMPRE1zpWbnqbpwykJa8W5XiX82CXI6K2o7yf5xS7EP6t/JzFLV0SIDuWpvBZVw==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "HpNyOf/4Tp2lh4FyywB55VITk0SqVxEjDzsVDDyF1yafDN6Bq18xcHowzCPINyYHUTgGcEtmpYiRsFdSo0KKdQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Security": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Az6Ff6rZFb8nYGAaejFR6jr8ktt9f3e1Q/yKdw0pwHNTLaO/1eCAC9vzBoR9YAb0QeZD6fZXl1A9tRB5stpzXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1" + } + }, + "runtime.native.System.Security.Cryptography": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "6Z4SIheH5ziCRoMnLBE+fmcAPfyewKbteJQGTT86+dsBRSYZNuUmLS3Qg+rzo1nPdiK19VmOBne54j9kI7sI4Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.2", + "Microsoft.NETCore.Targets": "1.0.3" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.5.0", + "contentHash": "JwwkgNYNFKT4kQZ3qBV3VqPgchUg1A6FnlFa9hgyanylwBhJ7eTFl3pgLVxijFEb+oHLImRcMaTsMzBt2AG0aQ==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "WNWAAaEbUm/kMc6bxI0HWGKQpKeeIRqI4mQAf9sg276ICa872aY5AAUe7XDv1I5JZZBq6a28x2PlR5jQT2vUUw==", + "dependencies": { + "Serilog": "2.5.0", + "System.Diagnostics.Debug": "4.3.0" + } + }, + "Serilog.Sinks.Trace": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "VgJNH1F3UOrmI8m32WFS9x5cxmYOrSfc+mLxXFmgN3bG1zg0jRf7jgbBB15NoJjfAn0nJMZgP0Hqx/w0bxKGvQ==", + "dependencies": { + "Serilog": "2.0.0", + "System.Diagnostics.TraceSource": "4.0.0" + } + }, + "SharpDX": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "8YA1VFg1/K8Emb8FEZDobojcv1BLuppVo7CRJQEgA1V748VIMPBru0i0OnsCjLSThzTn7juOvH85qjFL9Grl1w==", + "dependencies": { + "Microsoft.NETCore.App": "1.0.5" + } + }, + "SharpDX.Direct2D1": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "EDBYa9kAG+gaMB4cCH7WNpxS8WijSCejNz/SERs2P1sWEPZZdUiUIruQMjPCdW3lXxT508aYiH2UXHAaZtk00g==", + "dependencies": { + "Microsoft.NETCore.App": "1.0.5", + "SharpDX": "4.0.1", + "SharpDX.DXGI": "4.0.1" + } + }, + "SharpDX.Direct3D11": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "7xIfeAhxPhbPgSiREfFbOOwIWonUt2GHR7XZN5p2DJMWuqjl0+h1oo2/sF+SH/c6D6APjdbt0J+dYSzoV0PA/w==", + "dependencies": { + "Microsoft.NETCore.App": "1.0.5", + "SharpDX": "4.0.1", + "SharpDX.DXGI": "4.0.1" + } + }, + "SharpDX.DXGI": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Av/kToUkVR1tDtIP9zmDGwCuCtyL04+PP7kes6aABzky1Y9vT03kR7mDeE83gl+E8GUmMMbVXbQ4AG2CVb66sg==", + "dependencies": { + "Microsoft.NETCore.App": "1.0.5", + "SharpDX": "4.0.1" + } + }, + "SharpGen.Runtime": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aho/QykKT1o0MLuxQX3pIJbsBKYW7OGsk7APo3Ne+CGtRvJRbXJBlyxUOqUj34Bznmcbxcdlhl4odnHDNot7HA==", + "dependencies": { + "System.Memory": "4.5.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.0" + } + }, + "SharpGen.Runtime.COM": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "XYpT6WX4QWinQ+82Ei+w+d0PDPyJUygyC+g8nRjXi53+Aa2OLh4NzCGYR8pUqta1COYCksOen45g6+VO82PZqQ==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "SharpGen.Runtime": "1.1.0", + "System.Memory": "4.5.0" + } + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "1.60.0", + "contentHash": "HoSNIZH54rinevEhLUWdeclr+H/QdmOp252+Tt07HTXwQyvRl9eW32ga/X7T56wsR855SKprb0RcnBPRCzlqSA==" + }, + "Splat": { + "type": "Transitive", + "resolved": "5.1.4", + "contentHash": "dHFaV5D+EnATR2PB8dgFvgsQz1NEaFmxoBX5fOOWlYx3PuXxVW7O78V41k4PfvwL6EOxfU7wCo1YMZPiuKjlHQ==", + "dependencies": { + "System.Diagnostics.Contracts": "4.3.0", + "System.Drawing.Primitives": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0" + } + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "Cma8cBW6di16ZLibL8LYQ+cLjGzoKxpOTu/faZfDcx94ZjAGq6Nv5RO7+T1YZXqEXTZP9rt1wLVEONVpURtUqw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Contracts": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "eelRRbnm+OloiQvp9CXS0ixjNQldjjkHO4iIkR5XH2VIP8sUB/SIpa1TdUW6/+HDcQ+MlhP3pNa1u5SbzYuWGA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.FileVersionInfo": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qjF74OTAU+mRhLaL4YSfiWy3vj6T3AOz8AW37l5zCwfbBfj0k7E94XnEsRaf2TnhE/7QaV6Hvqakoy2LoV8MVg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.StackTrace": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "6i2EbRq0lgGfiZ+FDf0gVaw9qeEU+7IS2+wbZJmFVpvVzVOgZEt0ScZtyenuBvs6iDYbGiF51bMAa0oDP/tujQ==", + "dependencies": { + "System.Collections.Immutable": "1.2.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection": "4.1.0", + "System.Reflection.Metadata": "1.3.0", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Drawing.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1QU/c35gwdhvj77fkScXQQbjiVAqIL3fEYn/19NE0CV/ic5TN5PyWAft8HsrbRd4SBLEoErNCkWSzMDc0MmbRw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.FileSystem.Watcher": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qM4Wr3La+RYb/03B0mZZjbA7tHsGzDffnuXP8Sl48HW2JwCjn3kfD5qdw0sqyNNowUipcJMi9/q6sMUrOIJ6UQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "System.Collections": "4.0.11", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Overlapped": "4.0.1", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Thread": "4.0.0", + "runtime.native.System": "4.0.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Linq.Parallel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "J7XCa7n2cFn32uLbtceXfBFhgCk5M++50lylHKNbqTiJkw5y4Tglpi6amuJNPCvj9bLzNSI7rs1fi4joLMNRgg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Linq.Queryable": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Yn/WfYe9RoRfmSLvUt2JerP0BTGGykCZkQPgojaxgzF2N0oPo+/AhB8TXOpdCcNlrG3VRtsamtK2uzsp3cqRVw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "JdqRdM1Qym3YehqdKIi5LHrpypP4JMfxKQSNCJ2z4WawkG0il+N3XfNeJOxll2XrTnG7WgYYPoeiu/KOwg0DQw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Net.Primitives": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Principal.Windows": "4.0.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Requests": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "vxGt7C0cZixN+VqoSW4Yakc1Y9WknmxauDqzxgpw/FnBdz4kQNN51l4wxdXX5VY1xjqy//+G+4CvJWp1+f+y6Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Net.Http": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Net.WebHeaderCollection": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Net.Security": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nMs9dUDrJFr18+wgUB3lUpaMcJDqutsuO1C4g3OTuQYZJdnszgmHtjvBAI6eNXK0ZPLIA6sp8axMkd2T2dlzgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.2", + "Microsoft.Win32.Primitives": "4.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.IO": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Claims": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Security.Principal": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.ThreadPool": "4.0.10", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Security": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Net.WebHeaderCollection": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "XX2TIAN+wBSAIV51BU2FvvXMdstUa8b0FBSZmDWjZdwUMmggQSifpTOZ5fNH20z9ZCg2fkV1L5SsZnpO2RQDRQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "Ex1NSKycC2wi5XBMWUGWPc3lumh6OQWFFmmpZFZz0oLht5lQ+wWPHVZumOrMJuckfUiVMd4p67BrkBos8lcF+Q==", + "dependencies": { + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "yaVAxT2Yl28p9+DupGwj2oPbIOYZUQimOQ+n7N7vML2oofIRj9BmcfD7DHc6FLrNah65EigOgG6U9VnwWEyz5g==", + "dependencies": { + "System.Runtime.InteropServices.WindowsRuntime": "4.3.0" + } + }, + "System.Reactive.Compatibility": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "WYPmO+OtaDs+cVt5BVzYnnK+HrS7QtyuWymtfVexvpeNCWFoLoYJWizeatsT6urvLKcAPMtSmnu8ZvOZJWU5YA==", + "dependencies": { + "System.Reactive.Core": "4.0.0", + "System.Reactive.Interfaces": "4.0.0", + "System.Reactive.Linq": "4.0.0", + "System.Reactive.PlatformServices": "4.0.0", + "System.Reactive.Providers": "4.0.0" + } + }, + "System.Reactive.Core": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "J5wpR+wKt5xbkIaklarzdkfRxMwIU8+CUz2D5WvWeB3t4opI0VbbvLklXY8KT4TvSRzaQuNIZs65cV2Mu7H0pw==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "System.Reactive.Interfaces": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "3xsrz5YOxdy5wjlzvoCu6CFOU/36Ah/ZuyiLoOLEZ3Deo0YrMADCEnBuDvfyeJhIMDjwbsieotvjSWedWY4OVA==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "System.Reactive.Linq": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "LaYTtUoOtQJ7SBb1/tfM/kcIHy0dsA7E+31/739HyTyGg9uSGzP/fV4VFI3/Atg7MQiks+JbEAwcoTDJY0pJoA==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "System.Reactive.PlatformServices": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "2GSG7xQ/8su2vii+ZZ/4/CPemfKIRz9xwfjTdDPk6+7aXy403KjoEQRLZG8P9OMuetoxVDs6BU0vIkKMZity6A==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "System.Reactive.Providers": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "eGMVF4LPNAtvd0pftoDcxurhVUBmO3pOYNArE7ZyQmv5UZSJeuNWwXxQjvgHHvOazaBzNTv6EGKpSqt8sV+8Gw==", + "dependencies": { + "System.Reactive": "4.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "GPPgWoSxQEU3aCKSOvsAc1dhTTi4iq92PUVEVfnGPGwqCf6synaAJGYLKMs5E3CuRfel8ufACWUijXqDpOlGrA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.Reader": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "VX1iHAoHxgrLZv+nq/9drCZI6Q4SSCzSVyUm1e0U60sqWdj6XhY7wvKmy3RvsSal9h+/vqSWwxxJsm0J4vn/jA==", + "dependencies": { + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.InteropServices.WindowsRuntime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J4GUi3xZQLUBasNwZnjrffN8i5wpHrBtZoLG+OhRyGo/+YunMRWWtwoMDlUAIdmX0uRfpHIBDSV6zyr3yf00TA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Claims": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "4Jlp0OgJLS/Voj1kyFP6MJlIYp3crgfH8kNQk2p7+4JYfc1aAmh9PZyAMMbDhuoolGNtux9HqSOazsioRiDvCw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Security.Principal": "4.0.1" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "h4z6rrA/hxWf4655D18IIZ0eaLRa3tQC/j+e26W+VinIHY0l07iEXaAvO0YSYq3MvCjMYy8Zs5AdC1sxNQOB7Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "2hRjGu2r2jxRZ55wmcHO/WbdX+YAOz9x6FE8xqkHZgPaoFMKQZRe9dk8xTZIas8fRjxRmzawnTEWIrhlM+Un7w==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Dynamic.Runtime": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks.Parallel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "7Pc9t25bcynT9FpMvkUw4ZjYwUiGup/5cJFW72/5MgCG+np2cfVUMdh29u8d7onxX7d8PS3J+wL73zQRqkdrSA==", + "dependencies": { + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "FLhdYJx4331oGovQypQ8JIw2kEmNzCsjVOVYY/16kZTUoquZG85oVn7yUhBE2OZt1yGPSXAL0HTEfzjlbNpM7Q==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Linq": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11", + "System.Xml.XPath": "4.0.1" + } + }, + "audiotests": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "boxingtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "consoletest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bclsystem": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.encryption": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.exceptions": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.interfaces": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.methodtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.singleechotest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.typesystem": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.diskmanager": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.fat": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.io": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.full": { + "type": "Project", + "dependencies": { + "AudioTests": "[0.1.0-localbuild, )", + "BoxingTests": "[0.1.0-localbuild, )", + "ConsoleTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.BclSystem": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Encryption": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Exceptions": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Interfaces": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.MethodTests": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.SingleEchoTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.TypeSystem": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.DiskManager": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.Fat": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.IO": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )", + "GraphicTest": "[0.1.0-localbuild, )", + "MemoryOperationsTest": "[0.1.0-localbuild, )", + "NetworkTest": "[0.1.0-localbuild, )", + "ProcessorTests": "[0.1.0-localbuild, )", + "SimpleStructsAndArraysTest": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "graphictest": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "memoryoperationstest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "networktest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "processortests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "simplestructsandarraystest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win10-x86": { + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.7.0", + "contentHash": "jzAL+e4XCHAnl6yOwF5K8tvGHWkPoTtbrulgDsUbDUxz4XUtbkxyov66uZFgOQVdjl4yyq9Xtl6V1cUCQibmxA==", + "dependencies": { + "Avalonia": "0.7.0", + "SharpGen.Runtime.COM": "1.1.0" + } + }, + "Avalonia.Skia.Linux.Natives": { + "type": "Transitive", + "resolved": "1.60.0.1", + "contentHash": "a6Qa9qCGMImwtD2fmio39OsJ2BqZlQuHvRWlSXP+wovDcuMRB0JjN981j0tfYlvJjvCtCAo8Z7piytjnWtJTuw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "SkiaSharp": "[1.60.0]" + } + }, + "Libuv": { + "type": "Transitive", + "resolved": "1.9.1", + "contentHash": "uqX2Frwf9PW8MaY7PRNY6HM5BpW1D8oj1EdqzrmbEFD5nH63Yat3aEjN/tws6Tw6Fk7LwmLBvtUh32tTeTaHiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1" + } + }, + "Microsoft.NETCore.DotNetHost": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "uaMgykq6AckP3hZW4dsD6zjocxyXPz0tcTl8OX7mlSUWsyFXdtf45sjdwI0JIHxt3gnI6GihAlOAwYK8HE4niQ==", + "dependencies": { + "runtime.win7-x86.Microsoft.NETCore.DotNetHost": "1.0.1" + } + }, + "Microsoft.NETCore.DotNetHostPolicy": { + "type": "Transitive", + "resolved": "1.0.5", + "contentHash": "KR8e8+lh/YnhD0wDCMBRUjn0/VnryxHbu6I61U6m7PAyz9HbRr+iX3BYL925OHMFuFmk1atc/RRGjGtVOVrvrg==", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "1.0.1", + "runtime.win7-x86.Microsoft.NETCore.DotNetHostPolicy": "1.0.5" + } + }, + "Microsoft.NETCore.DotNetHostResolver": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "GEXgpAHB9E0OhfcmNJ664Xcd2bJkz2qkGIAFmCgEI5ANlQy4qEEmBVfUqA+Z9HB85ZwWxZc1eIJ6fxdxcjrctg==", + "dependencies": { + "Microsoft.NETCore.DotNetHost": "1.0.1", + "runtime.win7-x86.Microsoft.NETCore.DotNetHostResolver": "1.0.1" + } + }, + "Microsoft.NETCore.Jit": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "pNYSZFvX14x4ubToTLxj9O9xNIEg1kHaL6gkMr8urWKIY65cu8272KRlT3cgJCKLbzFO0XZDjvPlRBCFrbJm7Q==", + "dependencies": { + "runtime.win7-x86.Microsoft.NETCore.Jit": "1.0.7" + } + }, + "Microsoft.NETCore.Runtime.CoreCLR": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "t81co+R1xDubSQDDYP+zddd1Eya7xGeN2XlJMSsNFUCKRm35/5u8knnXOQTdfE1nf6bYqPROt18WlhdZui1FLA==", + "dependencies": { + "Microsoft.NETCore.Jit": "1.0.7", + "Microsoft.NETCore.Windows.ApiSets": "1.0.1", + "runtime.win7-x86.Microsoft.NETCore.Runtime.CoreCLR": "1.0.7" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.win7-x86.runtime.native.System.IO.Compression": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.win7-x86.Microsoft.NETCore.DotNetHost": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "3+kwgwIlQaTygjP8MV1AYvxJSRGQH40OtDzt40p9GSWGDnsanS7zOfXtMhJcS5Wp5u7ZwCAd2wjvKRkWGdadjA==" + }, + "runtime.win7-x86.Microsoft.NETCore.DotNetHostPolicy": { + "type": "Transitive", + "resolved": "1.0.5", + "contentHash": "bRK/P9Biahoty2+Wt3yscatZT1S06vcyzm5XivWrbHZqQHFTLWhVrWabzFuBMv4asf72kniYCZ0wMXyPO+1dNg==", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "1.0.1" + } + }, + "runtime.win7-x86.Microsoft.NETCore.DotNetHostResolver": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "hZ+7TYB1UBWXE3XreX9ZR3/mKkmy5rMcwvKObYaZmYgKX82nFEpgLzJnio0yTEJAwGkmc+JFpwwQaHMDsyTsmQ==", + "dependencies": { + "Microsoft.NETCore.DotNetHost": "1.0.1" + } + }, + "runtime.win7-x86.Microsoft.NETCore.Jit": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "ymuXdyB00051kFKWoEzCOro5syHSXIgMJA/T8NfTk8ftw4+OBU+YUxAC8xnYsyEorxaSz67R8vj595rKtChNnQ==" + }, + "runtime.win7-x86.Microsoft.NETCore.Runtime.CoreCLR": { + "type": "Transitive", + "resolved": "1.0.7", + "contentHash": "q4ORbNN3TOgGVgX8b56LmuM+rl0FjplsBx0zksuxAqEc3aYsanVw/u9pyXnFHRT0Il9oYYWZZPXflmSqG4CcbA==" + }, + "runtime.win7-x86.runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "99pM1ZhX7dPNnr/dOxuAxnVl/2XNWRh1WAUfesV3ZKwbR6mnEzpfbz2GX69zrpGvKbEytsjMKCD+auvvH6f7kA==" + }, + "runtime.win7.System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Q+IBgaPYicSQs2tBlmXqbS25c/JLIthWrgrpMwxKSOobW/OqIMVFruUGfuaz4QABVzV8iKdCAbN7APY7Tclbnw==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "1.60.0", + "contentHash": "HoSNIZH54rinevEhLUWdeclr+H/QdmOp252+Tt07HTXwQyvRl9eW32ga/X7T56wsR855SKprb0RcnBPRCzlqSA==" + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.FileVersionInfo": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qjF74OTAU+mRhLaL4YSfiWy3vj6T3AOz8AW37l5zCwfbBfj0k7E94XnEsRaf2TnhE/7QaV6Hvqakoy2LoV8MVg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.FileSystem.Watcher": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "qM4Wr3La+RYb/03B0mZZjbA7tHsGzDffnuXP8Sl48HW2JwCjn3kfD5qdw0sqyNNowUipcJMi9/q6sMUrOIJ6UQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.Win32.Primitives": "4.0.1", + "System.Collections": "4.0.11", + "System.IO.FileSystem": "4.0.1", + "System.IO.FileSystem.Primitives": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Overlapped": "4.0.1", + "System.Threading.Tasks": "4.0.11", + "System.Threading.Thread": "4.0.0", + "runtime.native.System": "4.0.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Requests": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "vxGt7C0cZixN+VqoSW4Yakc1Y9WknmxauDqzxgpw/FnBdz4kQNN51l4wxdXX5VY1xjqy//+G+4CvJWp1+f+y6Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Net.Http": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Net.WebHeaderCollection": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.Net.Security": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "nMs9dUDrJFr18+wgUB3lUpaMcJDqutsuO1C4g3OTuQYZJdnszgmHtjvBAI6eNXK0ZPLIA6sp8axMkd2T2dlzgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.2", + "Microsoft.Win32.Primitives": "4.0.1", + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Tracing": "4.1.0", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.IO": "4.1.0", + "System.Net.Primitives": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Security.Claims": "4.0.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Security.Cryptography.Encoding": "4.0.0", + "System.Security.Cryptography.OpenSsl": "4.0.0", + "System.Security.Cryptography.Primitives": "4.0.0", + "System.Security.Cryptography.X509Certificates": "4.1.0", + "System.Security.Principal": "4.0.1", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Threading.ThreadPool": "4.0.10", + "runtime.native.System": "4.0.0", + "runtime.native.System.Net.Security": "4.0.1", + "runtime.native.System.Security.Cryptography": "4.0.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.win7.System.Private.Uri": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "h4z6rrA/hxWf4655D18IIZ0eaLRa3tQC/j+e26W+VinIHY0l07iEXaAvO0YSYq3MvCjMYy8Zs5AdC1sxNQOB7Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Handles": "4.0.1", + "System.Runtime.InteropServices": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner.UnitTest/Cosmos.TestRunner.UnitTest.csproj b/Tests/Cosmos.TestRunner.UnitTest/Cosmos.TestRunner.UnitTest.csproj index bc0874f217..6df88c694c 100644 --- a/Tests/Cosmos.TestRunner.UnitTest/Cosmos.TestRunner.UnitTest.csproj +++ b/Tests/Cosmos.TestRunner.UnitTest/Cosmos.TestRunner.UnitTest.csproj @@ -1,13 +1,15 @@  - netcoreapp2.0 + net6.0 + x86 + Debug;Release;TEST - - - + + + diff --git a/Tests/Cosmos.TestRunner.UnitTest/packages.lock.json b/Tests/Cosmos.TestRunner.UnitTest/packages.lock.json new file mode 100644 index 0000000000..f308e0bac1 --- /dev/null +++ b/Tests/Cosmos.TestRunner.UnitTest/packages.lock.json @@ -0,0 +1,1523 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.0.0, )", + "resolved": "17.0.0", + "contentHash": "fJcnMY3jX1MzJvhGvUWauRhU5eQsOaHdwlrcnI3NabBhbi8WLAkMFI8d0YnewA/+b9q/U7vbhp8Xmh1vJ05FYQ==", + "dependencies": { + "Microsoft.CodeCoverage": "17.0.0", + "Microsoft.TestPlatform.TestHost": "17.0.0" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[3.11.0, )", + "resolved": "3.11.0", + "contentHash": "BzGk+u02RCrysmLlSzD+okxzMQ8JRF4eFC/qijDJ8Y/FBdTrTkxkQyTFsYkG1o++pr7QpFAE4VDXDqIfZ/gBAg==", + "dependencies": { + "NETStandard.Library": "2.0.0" + } + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[3.12.0, )", + "resolved": "3.12.0", + "contentHash": "uN7IiBCNxLHVXobqyCZvtRwkbnVclA01cNOrHV3noGOhAG5fX8zCjy053U77hILpX/b9eGRgzdZDj4Xm0TnlGw==", + "dependencies": { + "Microsoft.DotNet.InternalAbstractions": "1.0.0", + "System.ComponentModel.EventBasedAsync": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Process": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Xml.XPath.XmlDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.0.0", + "contentHash": "+B+09FPYBtf+cXfZOPIgpnP5mzLq5QdlBo+JEFy9CdqBaWHWE/YMY0Mos9uDsZhcgFegJm9GigAgMyqBZyfq+Q==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.DotNet.InternalAbstractions": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "AAguUq7YyKk3yDWPoWA8DrLZvURxB/LrDdTn1h5lmPeznkFUpfC3p459w5mQYQE0qpquf/CkSQZ0etiV5vRHFA==", + "dependencies": { + "System.AppContext": "4.1.0", + "System.Collections": "4.0.11", + "System.IO": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.0.0", + "contentHash": "WMugCdPkA8U/BsSRc+3RN+DXcaYSDvp/s0MofVld08iF1O5fek4iKecygk6NruNf1rgJsv4LK71mrwbyeqhzHA==", + "dependencies": { + "NuGet.Frameworks": "5.0.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.0.0", + "contentHash": "xkKFzm0hylHF0SlDj78ACYMJC/i8fQ3i16sDDNYoKnjTsstGSQfuSBJ+QT4nqRXk/fOiYTh+iY0KIX5N7HTLuQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "c5JVjuVAm4f7E9Vj+v09Z9s2ZsqFDjBpcsyS3M9xRo0bEdm/LVZSzLxxNvfvAwRiiE8nwe1h2G4OwiwlzFKXlA==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "3QjO4jNV7PdKkmQAVp9atA+usVnKRwI3Kx1nMwJ93T0LcQfx7pKAYk0nKz5wn1oP5iqlhZuy6RXOFdhr7rDwow==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fCFl8f0XdwA/BuoNrVBB5D0Y48/hv2J+w4xSDdXQitXZsR6UCSOrDVE7TCUraY802ENwcHUnUCv4En8CupDU1g==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "xBfJ8pnd4C17dWaC9FM6aShzbJcRNMChUMD42I6772KGGrqaFdumwhn9OdM68erj1ueNo3xdQ1EwiFjK5k8p0g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "Microsoft.NETCore.Targets": "1.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "I+y02iqkgmCAyfbqOmSDOgqdZQ5tTj80Akm5BPSS8EeB0VGWdy6X1KCoYe8Pk6pwDoAKZUOdLVxnTJcExiv5zw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.0.12", + "contentHash": "tAgJM1xt3ytyMoW4qn4wIqgJYm7L7TShRZG4+Q4Qsi2PCcj96pXN7nRywS9KkB3p/xDUjc2HSwP9SROyPYDYKQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "P2wqAj72fFjpP6wb9nSfDqNBMab+2ovzSDzUZK7MVIm54tBJEPr9jWfSjjoTpPwj1LeKcmX3vr0ttyjSSFM47g==", + "dependencies": { + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Ov6dU8Bu15Bc7zuqttgHF12J5lwSWyTf1S+FJouUXVMSqImLZzYaQ+vRr1rQ0OZ0HqsrwWl4dsKHELckQkVpgA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "sSzHHXueZ5Uh0OLpUQprhr+ZYJrLPA2Cmr4gn0wj9+FftNKXx8RIMKvO9qnjk2ebPYUjZ+F2ulGdPOsvj+MEjA==", + "dependencies": { + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Mk2mKmPi0nWaoiYeotq1dgeNK1fqWh61+EK+w4Wu8SWuTYLzpUnschb59bJtGywaPq7SmTuPf44wrXRwbIrukg==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Diagnostics.Tools": "4.0.1", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Reflection": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "A/uxsWi/Ifzkmd4ArTLISMbfFs6XpRPsXZonrIqyTY70xi8t+mDtvSM5Os0RqyRDobjMBwIDHDL4NOIbkDwf7A==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XPath": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "audiotests": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "boxingtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "consoletest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bclsystem": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.encryption": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.exceptions": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.interfaces": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.methodtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.singleechotest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.typesystem": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.diskmanager": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.fat": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.io": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.full": { + "type": "Project", + "dependencies": { + "AudioTests": "[0.1.0-localbuild, )", + "BoxingTests": "[0.1.0-localbuild, )", + "ConsoleTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.BclSystem": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Encryption": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Exceptions": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Interfaces": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.MethodTests": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.SingleEchoTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.TypeSystem": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.DiskManager": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.Fat": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.IO": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )", + "GraphicTest": "[0.1.0-localbuild, )", + "MemoryOperationsTest": "[0.1.0-localbuild, )", + "NetworkTest": "[0.1.0-localbuild, )", + "ProcessorTests": "[0.1.0-localbuild, )", + "SimpleStructsAndArraysTest": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "graphictest": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "memoryoperationstest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "networktest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "processortests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "simplestructsandarraystest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj b/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj index a9b5d122f8..e9436d57b8 100644 --- a/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj +++ b/Tests/Cosmos.TestRunner/Cosmos.TestRunner.csproj @@ -1,10 +1,21 @@  - netcoreapp2.0 + net6.0 Exe - win7-x86 + win-x86 Full + Debug;Release;TEST + + + + AnyCPU + true + + + + AnyCPU + true diff --git a/Tests/Cosmos.TestRunner/Properties/launchSettings.json b/Tests/Cosmos.TestRunner/Properties/launchSettings.json new file mode 100644 index 0000000000..23811ebcac --- /dev/null +++ b/Tests/Cosmos.TestRunner/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Cosmos.TestRunner": { + "commandName": "Project", + "environmentVariables": { + "BochsPath": "C:\\Program Files\\Bochs-2.7\\Bochs.exe" + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.TestRunner/packages.lock.json b/Tests/Cosmos.TestRunner/packages.lock.json new file mode 100644 index 0000000000..154891b327 --- /dev/null +++ b/Tests/Cosmos.TestRunner/packages.lock.json @@ -0,0 +1,2647 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "audiotests": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "boxingtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "consoletest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bclsystem": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.encryption": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.exceptions": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.interfaces": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.methodtests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.singleechotest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.typesystem": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.diskmanager": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.fat": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.kernel.tests.io": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.full": { + "type": "Project", + "dependencies": { + "AudioTests": "[0.1.0-localbuild, )", + "BoxingTests": "[0.1.0-localbuild, )", + "ConsoleTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.BclSystem": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Encryption": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Exceptions": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.Interfaces": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.MethodTests": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.SingleEchoTest": "[0.1.0-localbuild, )", + "Cosmos.Compiler.Tests.TypeSystem": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.DiskManager": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.Fat": "[0.1.0-localbuild, )", + "Cosmos.Kernel.Tests.IO": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )", + "GraphicTest": "[0.1.0-localbuild, )", + "MemoryOperationsTest": "[0.1.0-localbuild, )", + "NetworkTest": "[0.1.0-localbuild, )", + "ProcessorTests": "[0.1.0-localbuild, )", + "SimpleStructsAndArraysTest": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "graphictest": { + "type": "Project", + "dependencies": { + "Cosmos.Compiler.Tests.Bcl": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "memoryoperationstest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "networktest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "processortests": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "simplestructsandarraystest": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Cosmos.VS.Windows.Test/Cosmos.VS.Windows.Test.csproj b/Tests/Cosmos.VS.Windows.Test/Cosmos.VS.Windows.Test.csproj index d7fbfb47cd..047beb8f8e 100644 --- a/Tests/Cosmos.VS.Windows.Test/Cosmos.VS.Windows.Test.csproj +++ b/Tests/Cosmos.VS.Windows.Test/Cosmos.VS.Windows.Test.csproj @@ -21,7 +21,6 @@ full AnyCPU prompt - MinimumRecommendedRules.ruleset bin\Release\ @@ -30,7 +29,6 @@ pdbonly AnyCPU prompt - MinimumRecommendedRules.ruleset diff --git a/Tests/Data/disk.txt b/Tests/Data/disk.txt new file mode 100644 index 0000000000..397fc0698f --- /dev/null +++ b/Tests/Data/disk.txt @@ -0,0 +1,32 @@ +EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 08 18 18 +02 00 00 00 00 F8 00 00 3F 00 10 00 3F 00 00 00 +C2 EE 0F 00 F4 03 00 00 00 00 00 00 02 00 00 00 +01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 +80 00 29 79 5D 0F 04 4E 4F 20 4E 41 4D 45 20 20 +20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 +7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 41 +BB AA 55 CD 13 72 10 81 FB 55 AA 75 0A F6 C1 01 +74 05 FE 46 02 EB 2D 8A 56 40 B4 08 CD 13 73 05 +B9 FF FF 8A F1 66 0F B6 C6 40 66 0F B6 D1 80 E2 +3F F7 E2 86 CD C0 ED 06 41 66 0F B7 C9 66 F7 E1 +66 89 46 F8 83 7E 16 00 75 38 83 7E 2A 00 77 32 +66 8B 46 1C 66 83 C0 0C BB 00 80 B9 01 00 E8 2B +00 E9 2C 03 A0 FA 7D B4 7D 8B F0 AC 84 C0 74 17 +3C FF 74 09 B4 0E BB 07 00 CD 10 EB EE A0 FB 7D +EB E5 A0 F9 7D EB E0 98 CD 16 CD 19 66 60 80 7E +02 00 0F 84 20 00 66 6A 00 66 50 06 53 66 68 10 +00 01 00 B4 42 8A 56 40 8B F4 CD 13 66 58 66 58 +66 58 66 58 EB 33 66 3B 46 F8 72 03 F9 EB 2A 66 +33 D2 66 0F B7 4E 18 66 F7 F1 FE C2 8A CA 66 8B +D0 66 C1 EA 10 F7 76 1A 86 D6 8A 56 40 8A E8 C0 +E4 06 0A CC B8 01 02 CD 13 66 61 0F 82 75 FF 81 +C3 00 02 66 40 49 75 94 C3 42 4F 4F 54 4D 47 52 +20 20 20 20 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 52 65 +6D 6F 76 65 20 64 69 73 6B 73 20 6F 72 20 6F 74 +68 65 72 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73 +6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20 +61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61 +72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 55 AA diff --git a/Tests/Dockerfile b/Tests/Dockerfile new file mode 100644 index 0000000000..b6e423d9eb --- /dev/null +++ b/Tests/Dockerfile @@ -0,0 +1,2 @@ +FROM mcr.microsoft.com/dotnet/sdk:6.0 + diff --git a/Tests/Kernels/AudioTests/AudioTests.csproj b/Tests/Kernels/AudioTests/AudioTests.csproj new file mode 100644 index 0000000000..ce6e5e6d1b --- /dev/null +++ b/Tests/Kernels/AudioTests/AudioTests.csproj @@ -0,0 +1,18 @@ + + + + net6.0 + False + Debug;Release;TEST + true + + + + + + + + + + + diff --git a/Tests/Kernels/AudioTests/Kernel.cs b/Tests/Kernels/AudioTests/Kernel.cs new file mode 100644 index 0000000000..896a89d1c8 --- /dev/null +++ b/Tests/Kernels/AudioTests/Kernel.cs @@ -0,0 +1,221 @@ +using System; +using Sys = Cosmos.System; +using Cosmos.TestRunner; +using Cosmos.Core; +using Cosmos.HAL.Audio; +using Cosmos.System.Audio.IO; + +namespace AudioTests +{ + public class Kernel : Sys.Kernel + { + const int AMT_OF_SAMPLES = 22050; // 0.5secs at 44100hz + + #region Test Sample Data + static readonly byte[] MonoSine8Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine16Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine24Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine32Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] StereoSine8Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] StereoSine32Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] StereoUnsignedSine8Bit + = Convert.FromBase64String(@"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"); + + static readonly byte[] Mono16BitWAVFile + = Convert.FromBase64String(@"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"); + + static readonly byte[] Mono16BitWAVRawSampleData + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine8BitTo16BitResult + = Convert.FromBase64String(@"AAAABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADoAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAiACGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXgBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBRAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC0AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABIADgAKAAYAAgD9APkA9QDxAO0A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCnAKoArQCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALMArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwgC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACEAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AAAABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXgBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN4A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCyALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBRAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHoAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC0AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABWAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABEADgAKAAYAAQD+APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMcAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArQCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALIArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKQAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMUAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AP8ABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXwBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBSAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHIAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC4AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABWAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABIADQAKAAYAAgD9APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABgAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALMArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACEAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDhAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AAAAAwAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAiACGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXwBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALcAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ0AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBRAFUAWABaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOcA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC4AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABEADgAKAAYAAgD9APkA9QDxAO0A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALIArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACEAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMUAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AAAABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADoAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXwBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAoACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALcAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAEwASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBSAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOcA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC4AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABEADgAKAAYAAQD+APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANEA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI0AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArQCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGIAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALMArwCsAKkApgCkAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABQAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgQCAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATQBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKQAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMUAyQDNANAA1ADYANwA4ADkAOgA7ADwAPMA9wD7AP8ABAAIAAwADwATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFsAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAiACGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXgBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN4A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAEwASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ0AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBSAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC0AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABIADgAKAAYAAgD9APkA9QDxAO0A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABgAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALMArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEgATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACEAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AAAABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFsAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXgBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBSAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOcA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC4AMQA1ADgAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABEADgAKAAYAAgD9APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALIArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEgATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABQAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgQCAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowCgAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADwAPMA9wD8AP8ABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAiACGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHQAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXwBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCyALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBRAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC0AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABEADgAKAAYAAgD9APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGIAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB1AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALIArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA1wDUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADwAPMA9wD7AAAABAAIAAwAEAATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHgAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXwBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN8A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCyALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAEwASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBSAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAcwB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOYA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC0AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABIADgAKAAUAAgD9APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMYAygDOANEA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABgAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGIAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB2AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALMArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwgC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIMAgwCCAIEAgQCAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB3AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADvAPMA9wD7AAAABAAIAAwADwATABcAGwAfACMAJwArAC8AMgA2ADkAPQBBAEQARwBLAE4AUQBUAFcAWgBdAF8AYgBkAGcAaQBrAG4AcABxAHMAdQB2AHgAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB9AH0AfAB7AHkAeAB3AHUAdAByAHAAbgBsAGoAZwBlAGMAYABdAFoAWABVAFIATwBLAEgARQBBAD4AOgA3ADMALwAsACgAJAAgABwAGAAUABAADAAIAAQAAAD8APgA9ADwAOwA6ADlAOEA3QDZANUA0QDOAMoAxgDDAL8AvAC4ALUAsgCvAKwAqQCmAKMAoACeAJsAmQCWAJQAkgCQAI4AjACLAIkAiACGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAggCDAIQAhQCHAIgAiQCLAI0AjwCRAJMAlQCXAJkAnACeAKEApACnAKoArQCwALMAtgC6AL0AwADEAMcAywDPANMA1gDaAN4A4gDmAOoA7gDyAPYA+gD+AAIABgAKAA4AEgAWABoAHgAhACUAKQAtADEANAA4ADsAPwBCAEYASQBMAFAAUwBWAFkAWwBeAGEAYwBmAGgAagBtAG8AcQByAHQAdgB3AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAdwB2AHQAcwBxAG8AbQBrAGgAZgBkAGEAXgBcAFkAVgBTAFAATQBKAEYAQwA/ADwAOAA1ADEALQAqACYAIgAeABoAFgASAA4ACgAGAAIA/gD6APYA8gDuAOoA5gDiAN4A2wDXANMAzwDMAMgAxADBAL0AugC3ALMAsACtAKoApwCkAKEAnwCcAJoAlwCVAJMAkQCPAI0AiwCKAIgAhwCFAIQAgwCCAIIAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCHAIkAigCMAI4AkACSAJQAlgCYAJsAnQCgAKMApQCoAKsArgCxALUAuAC7AL8AwgDGAMkAzQDRANUA2ADcAOAA5ADoAOwA8AD0APgA/AAAAAQACAAMABAAFAAYABwAIAAjACcAKwAvADMANgA6AD0AQQBEAEgASwBOAFEAVABXAFoAXQBgAGIAZQBnAGkAbABuAHAAcgBzAHUAdwB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB8AHwAegB5AHgAdwB1AHMAcgBwAG4AbABqAGcAZQBiAGAAXQBaAFcAVABRAE4ASwBIAEQAQQA+ADoANgAzAC8AKwAnACQAIAAcABgAFAAQAAwACAAEAAAA/AD4APQA8ADsAOgA5ADgANwA2QDVANEAzQDKAMYAwgC/ALwAuAC1ALIArgCrAKgApgCjAKAAnQCbAJgAlgCUAJIAkACOAIwAigCJAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCCAIIAgwCEAIUAhwCIAIoAiwCNAI8AkQCTAJUAlwCaAJwAnwChAKQApwCqAK0AsACzALYAugC9AMEAxADIAMsAzwDTANcA2gDeAOIA5gDqAO4A8gD2APoA/gACAAYACgAOABIAFgAaAB4AIgAmACkALQAxADUAOAA8AD8AQwBGAEkATQBQAFMAVgBZAFwAXgBhAGQAZgBoAGsAbQBvAHEAcwB0AHYAdwB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHcAdgB0AHIAcQBvAG0AawBoAGYAYwBhAF4AXABZAFYAUwBQAE0ASQBGAEMAPwA8ADgANAAxAC0AKQAlACIAHgAaABYAEgAOAAoABgACAP4A+gD2APIA7gDqAOYA4gDeANoA1gDTAM8AywDIAMQAwQC9ALoAtgCzALAArQCqAKcApAChAJ8AnACaAJcAlQCTAJEAjwCNAIsAigCIAIcAhQCEAIMAggCCAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCJAIoAjACOAJAAkgCUAJYAmQCbAJ4AoACjAKYAqQCsAK8AsgC1ALgAvAC/AMMAxgDKAM0A0QDVANkA3QDgAOQA6ADsAPAA9AD4APwAAAAEAAgADAAQABQAGAAcACAAJAAoACsALwAzADcAOgA+AEEARQBIAEsATgBRAFUAVwBaAF0AYABiAGUAZwBqAGwAbgBwAHIAdAB1AHcAeAB5AHsAfAB8AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdQBzAHEAcABuAGwAaQBnAGUAYgBfAF0AWgBXAFQAUQBOAEsARwBEAEEAPQA6ADYAMgAvACsAJwAjAB8AHAAYABQAEAAMAAgABAAAAPwA+AD0APAA7ADoAOQA4ADcANgA1ADRAM0AyQDGAMIAvwC7ALgAtQCxAK4AqwCoAKUAogCgAJ0AmwCYAJYAlACSAJAAjgCMAIoAiQCHAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAggCCAIMAhACGAIcAiACKAIsAjQCPAJEAkwCVAJcAmgCcAJ8AogCkAKcAqgCtALAAtAC3ALoAvgDBAMUAyADMAM8A0wDXANsA3wDjAOcA6gDuAPIA9gD6AP4AAgAGAAoADgASABYAGgAeACIAJgAqAC4AMQA1ADkAPABAAEMARgBKAE0AUABTAFYAWQBcAF8AYQBkAGYAaQBrAG0AbwBxAHMAdAB2AHcAeQB6AHsAfAB9AH4AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeAB3AHYAdAByAHAAbwBsAGoAaABmAGMAYQBeAFsAWABVAFIATwBMAEkARgBCAD8AOwA4ADQAMAAtACkAJQAhAB0AGQAVABIADgAKAAYAAgD+APkA9QDxAO4A6gDmAOIA3gDaANYA0gDPAMsAxwDEAMAAvQC5ALYAswCwAK0AqgCnAKQAoQCeAJwAmQCXAJUAkwCQAI8AjQCLAIkAiACHAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIgAiQCLAIwAjgCQAJIAlACWAJkAmwCeAKAAowCmAKkArACvALIAtQC5ALwAvwDDAMcAygDOANIA1QDZAN0A4QDlAOkA7QDxAPUA+QD9AAEABQAJAA0AEQAVABkAHAAgACQAKAAsADAAMwA3ADoAPgBBAEUASABLAE8AUgBVAFgAWwBdAGAAYwBlAGgAagBsAG4AcAByAHQAdQB3AHgAeQB7AHwAfQB9AH4AfwB/AH8AfwB/AH8AfwB/AH4AfgB9AHwAewB6AHkAeAB2AHUAcwBxAG8AbQBrAGkAZwBkAGIAXwBdAFoAVwBUAFEATgBKAEcARABAAD0AOQA2ADIALgArACcAIwAfABsAFwATAA8ACwAHAAMA/wD7APcA8wDvAOsA5wDjAOAA3ADYANQA0ADNAMkAxQDCAL4AuwC4ALQAsQCuAKsAqAClAKIAoACdAJoAmACWAJMAkQCPAI4AjACKAIkAhwCGAIUAhACDAIIAgQCBAIAAgACAAIAAgACAAIAAgACBAIIAgwCDAIQAhgCHAIgAigCMAI0AjwCRAJMAlQCYAJoAnQCfAKIApQCoAKoArgCxALQAtwC6AL4AwQDFAMgAzADQANQA1wDbAN8A4wDnAOsA7wDzAPcA+wD/AAMABwALAA8AEwAXABsAHwAiACYAKgAuADIANQA5ADwAQABDAEcASgBNAFAAUwBWAFkAXABfAGEAZABmAGkAawBtAG8AcQBzAHUAdgB4AHkAegB7AHwAfQB+AH4AfwB/AH8AfwB/AH8AfwB/AH4AfQB9AHwAewB6AHgAdwB2AHQAcgBwAG4AbABqAGgAZQBjAGAAXgBbAFgAVQBSAE8ATABJAEUAQgA+ADsANwA0ADAALAApACUAIQAdABkAFQARAA0ACQAFAAEA/QD5APUA8QDtAOkA5QDhAN0A2gDWANIAzgDLAMcAwwDAALwAuQC2ALIArwCsAKkApgCjAKEAngCcAJkAlwCUAJIAkACOAI0AiwCJAIgAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIAAgQCBAIIAgwCEAIUAhgCIAIkAiwCMAI4AkACSAJQAlwCZAJsAngChAKMApgCpAKwArwCyALYAuQC8AMAAwwDHAMoAzgDSANYA2QDdAOEA5QDpAO0A8QD1APkA/QABAAUACQANABEAFQAZAB0AIQAlACgALAAwADQANwA7AD4AQgBFAEkATABPAFIAVQBYAFsAXgBgAGMAZQBoAGoAbABuAHAAcgB0AHUAdwB4AHoAewB8AH0AfQB+AH8AfwB/AH8AfwB/AH8AfwB+AH4AfQB8AHsAegB5AHgAdgB1AHMAcQBvAG0AawBpAGcAZABiAF8AXABZAFcAVABRAE0ASgBHAEMAQAA9ADkANQAyAC4AKgAmACMAHwAbABcAEwAPAAsABwADAP8A+wD3APMA7wDrAOcA4wDfANsA2ADUANAAzADJAMUAwQC+ALsAtwC0ALEArgCrAKgApQCiAJ8AnQCaAJgAlQCTAJEAjwCNAIwAigCIAIcAhgCFAIQAgwCCAIEAgQCAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAhwCIAIoAjACNAI8AkQCTAJYAmACaAJ0AnwCiAKUAqACrAK4AsQC0ALcAuwC+AMIAxQDJAMwA0ADUANgA3ADfAOMA5wDrAO8A8wD3APsA/wADAAcACwAPABMAFwAbAB8AIwAnACoALgAyADYAOQA9AEAARABHAEoATgBRAFQAVwBaAFwAXwBiAGQAZwBpAGsAbQBvAHEAcwB1AHYAeAB5AHoAewB8AH0AfgB+AH8AfwB/AH8AfwB/AH8AfwB+AH0AfQB8AHsAegB4AHcAdQB0AHIAcABuAGwAagBoAGUAYwBgAF4AWwBYAFUAUgBPAEwASABFAEIAPgA7ADcAMwAwACwAKAAkACAAHQAZABUAEQANAAkABQABAP0A+QD1APEA7QDpAOUA4QDdANkA1QDSAM4AygDHAMMAwAC8ALkAtQCyAK8ArACpAKYAowChAJ4AmwCZAJcAlACSAJAAjgCMAIsAiQCIAIYAhQCEAIMAggCBAIEAgACAAIAAgACAAIAAgACAAIEAgQCCAIMAhACFAIYAiACJAIsAjQCOAJAAkgCVAJcAmQCcAJ4AoQCkAKYAqQCsAK8AswC2ALkAvQDAAMQAxwDLAM4A0gDWANoA3gDiAOUA6QDtAPEA9QD5AP0AAQAFAAkADQARABUAGQAdACEAJQApACwAMAA0ADgAOwA/AEIARQBJAEwATwBSAFUAWABbAF4AYQBjAGYAaABqAGwAbgBwAHIAdAB2AHcAeAB6AHsAfAB9AH0AfgB/AH8AfwB/AH8AfwB/AH8AfgB+AH0AfAB7AHoAeQB4AHYAdABzAHEAbwBtAGsAaQBmAGQAYQBfAFwAWQBWAFMAUABNAEoARwBDAEAAPAA5ADUAMQAuACoAJgAiAB4AGgAXABMADwALAAcAAwD/APsA9wDzAO8A6wDnAOMA3wDbANcA0wDQAMwAyADFAMEAvgC6ALcAtACwAK0AqgCnAKUAogCfAJwAmgCYAJUAkwCRAI8AjQCLAIoAiACHAIYAhACDAIIAggCBAIAAgACAAIAAgACAAIAAgACBAIEAggCDAIQAhQCGAIcAiQCKAIwAjgCPAJEAlACWAJgAmwCdAKAAogClAKgAqwCuALEAtAC4ALsAvgDCAMYAyQDNANAA1ADYANwA4ADkAOgA7ADwAPMA9wD7"); + + static readonly byte[] MonoSine16BitTo8BitResult + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine32BitTo24BitResult + = Convert.FromBase64String(@"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"); + + static readonly byte[] MonoSine24BitTo32BitResult + = Convert.FromBase64String(@"AAAAAADvAgQA3QQIAMQEDACpARAAg/oTAFvuFwAq3BsA/cIfAMyhIwCsdycAmEMrAKoELwDiuTIAW2I2ACj9OQBdiT0AGgZBAHtyRACmzUcAwhZLAPtMTgCEb1EAkH1UAGB2VwAqWVoAQiVdAOrZXwB4dmIAQPpkAKhkZwAEtWkA3OprAH0FbgCCBHAAUudxAH6tcwCUVnUAJeJ2ANZPeAA7n3kAFNB6AADiewDM1HwAMKh9APhbfgD8734AEWR/AB24fwAJ7H8Azf9/AFjzfwDAxn8A+Xl/ACwNfwBqgH4A09N9AJwHfQDtG3wADBF7ADjneQC4nngA6Td3ABKzdQCwEHQAEFFyALp0cAAWfG4AqmdsAPw3agCW7WcADIllAPsKYwD+c2AAxMRdAPD9WgA8IFgAYCxVABAjUgAoBU8AS9NLAHGOSABIN0UAv85BAKZVPgDhzDoAUzU3AN2PMwB43S8ABB8sAHRVKADLgSQA5KQgANW/HACC0xgA9eAUACfpEAAW7QwAye0IADjsBABv6QAAaeb8ACnk+AC24/QAC+bwADDs7AAd9+gA2QflAFsf4QChPt0ApmbZAGCY1QDB1NEAxhzOAEpxygBY08YAtEPDAGjDvwA0U7wAEfS4AMamtQAwbLIAHEWvAFYyrACjNKkAxEymAHd7owBowaAAVR+eANyVmwCgJZkATs+WAF6TlACGcpIALG2QAOyDjgAvt4wAdQeLACN1iQClAIgATqqGAIhyhQCAWYQAqF+DABKFggAdyoEA2i6BAIOzgAArWIAA8ByAAOABgAD+BoAASyyAAMNxgABG14AA0FyBACoCggA2x4IAwquDAJGvhABl0oUA8hOHAOZziADw8YkAp42LAKlGjQCFHI8AwQ6RAO4ckwBwRpUA2IqXAHTpmQDQYZwAKPOeAPicoQB4XqQACjenAPAlqgBqKq0AwkOwABpxswC/sbYAzQS6AHZpvQDi3sAAKGTEAHD4xwDQmssAWErPACoG0wA/zdYAu57aAJh53gDlXOIAqUfmAN446gCWL+4AviryAG4p9gCKKvoAKS3+ADUwAgC3MgYArjMKAAsyDgDjLBIAGCMWAM4TGgDm/R0AfeAhAIi6JQAciykAN1EtAPULMQBRujQAd1s4AGbuOwBLcj8ANOZCAFBJRgC5mkkAo9lMADgFUACsHFMAPR9WAB4MWQCj4lsAAqJeAJ5JYQC62GMAwE5mAAaraAAA7WoACxRtALQfbwBfD3EAouJyAP6YdAAHMnYAVq13AI4KeQBRSXoAWGl7AFBqfAAATH0AMQ5+AKOwfgBJM38A4JV/AG3YfwDO+n8A/vx/AATffwDWoH8AnkJ/AFTEfgA4Jn4AVmh9APGKfAA2jnsAa3J6ANA3eQC+3ncAg2d2AIDSdAAhIHMAxVBxAPNkbwAVXW0AvDlrAGj7aACqomYAKDBkAGGkYQAeAF8A60NcAIZwWQCohlYA/oZTAFlyUAB2SU0AJQ1KADK+RgB2XUMAxus/AAhqPAAT2TgA1Dk1ADSNMQAZ1C0AfQ8qAEpAJgB2ZyIAAYYeANicGgAErRYAd7cSADi9DgBCvwoAm74GAD28AgA0uf4Aebb6ABa19gAHtvIAUbruAPDC6gDs0OYANuXiANoA3wDCJNsA+FHXAGCJ0wAAzM8AthrMAIB2yAA+4MQA3ljBADvhvQA+eroAuiS3AInhswCAsbAAYpWtAAeOqgAinKcAfcCkAMj7oQC2Tp8A/LmcADI+mgAG3JcABZSVAM5mkwDeVJEA0F6PAAiFjQAVyIsAViiKAD2miAAnQocAcPyFAGjVhABazYMAiOSCACwbggB6cYEAnueAALV9gADiM4AALgqAAK4AgABZF4AANE6AACylgAAkHIEAFLOBALdpggD+P4MAnDWEAF5KhQD+fYYAMNCHAJBAiQDgzooAlHqMAGhDjgDMKJAAVCqSAHxHlAC7f5YAgdKYADw/mwBMxZ0AEWSgAOQaowAO6aUA6c2oAKfIqwCd2K4A9/yxAPA0tQC7f7gAfdy7AGRKvwCUyMIAJVbGADryyQDkm80APlLRAFEU1QA14dgA6LfcAIOX4AD8fuQAaG3oALph7AABW/AANFj0AFZY+ABmWvwAX10AAEJgBAAKYggAumEMAEReEAC8VhQADEoYAEc3HABoHSAAcfsjAHTQJwBvmysAc1svAJIPMwDQtjYAWlA6ACnbPQB6VkEATMFEAOEaSABKYksAxpZOAHe3UQCew1QAdbpXADabWgA2ZV0AshdgAAayYgCIM2UAlJtnAJXpaQDwHGwAHTVuAJAxcADLEXIAW9VzAMB7dQCmBHcAkG94ADy8eQA96noAYvl7AEzpfADauX0Avmp+ANr7fgAKbX8AJr5/AC7vfwD8/38AovB/ABTBfwBscX8AsAF/AAtyfgCOwn0Ae/N8APQEfABA93oAnsp5AFl/eADKFXcAQo51ADHpcwDwJnIABkhwAM5MbgDuNWwAvgNqAP+2ZwASUGUAvM9iAIM2YAAahV0ALrxaAGzcVwCS5lQAZttRAJO7TgAIiEsAakFIAK7oRACWfkEABwQ+AOJ5OgAG4TYAXDozAM+GLwBSxysAzfwnAEIoJACSSiAA0mQcAOB3GADRhBQAlIwQAC6QDAChkAgA6Y4EABGMAAAOifwA9Yb4AK+G9ABbifAA3Y/sAEyb6ACZrOQAxMTgAM/k3ACoDdkAUkDVALh90QDTxs0AkBzKANV/xgCc8cIArHK/AAwEvAB2prgA2Vq1AAAisgC8/K4A1+urABrwqABCCqYABDujACaDoAA+450AEFybACrumAAwmpYAvGCUAFRCkgCIP5AA2liOALqOjACr4YoACFKJAEbghwCzjIYAsleFAIJBhAB6SoMAyHKCAK66gQBSIoEA4qmAAHRRgAAnGYAAAgGAAAwJgABMMYAApXmAAB7igACCaoEAyhKCAK3aggAawoMAuMiEAFzuhQCyMocAYpWIACgWigCItIsAMnCNAKZIjwByPZEAHE6TAB96lQDkwJcA7CGaAIScnAApMJ8AHtyhAMafpABkeqcAR2uqALJxrQDejLAABryzAFz+tgAQU7oARrm9ACwwwQDbtsQAcUzIABDwywC/oM8Anl3TALUl1wAQ+NoAv9PeAMO34gAmo+YA6ZTqAA+M7gCZh/IAhYb2ANWH+gCFiv4AkI0CAPyPBgC7kAoA1o4OAEiJEgANfxYAMG8aAKRYHgB/OiIAtxMmAGPjKQB/qC0AJGIxAFsPNQA7rzgA2kA8AFHDPwC+NUMARpdGAArnSQA6JE0AA05QAJljUwA5ZFYAGk9ZAIwjXADJ4F4AMoZhAAsTZADEhmYAqOBoADggawDMRG0A6U1vAAw7cQCsC3MAZ790AL5VdgBUzncAzih5AMZkegD8gXsAIoB8APRefQBFHn4A2r1+AIw9fwBEnX8A4tx/AFP8fwCe+38ArNp/AJyZfwB0OH8ARLd+AEYWfgCAVX0AQ3V8ALF1ewAUV3oAthl5ANy9dwDtQ3YAOKx0ADD3cgA+JXEA1DZvAHYsbQCgBmsA3sVoAMlqZgDq9WMA7mdhAGzBXgAcA1wApC1ZAMBBVgAnQFMApSlQAPH+TADqwEkATHBGAAIOQwDOmj8AqBc8AFmFOADd5DQADjcxAN58LQBCtykAI+clAH8NIgBLKx4AekEaABtRFgARWxIAdmAOADNiCgBZYQYA5V4CANVb/gAwWfoA+Vf2AClZ8gDUXe4A4GbqAGZ15gBSiuIAqabeAGTL2gB4+dYA4DHTAIh1zwBvxcsAaCLIAISNxAB8B8EAXpG9AOorugAG2LYAj5azAEZosAANTq0Ak0iqALRYpwAXf6QAhryhAKARnwAmf5wApgWaANqllwA+YJUAfjWTABQmkQCOMo8AZFuNABGhiwABBIoAoISIAEojhwBW4IUAHryEAOS2gwDq0IIAdAqCAJxjgQCt3IAAqnWAAMMugAD+B4AAZwGAAAMbgADHVIAAqq6AAI4ogQBcwoEA6HuCAARVgwB+TYQAEGWFAHubhgBr8IcAkGOJAIf0igDvoowAWW6OAFRWkABlWpIAB3qUALm0lgDcCZkA8HibAEMBngBAoqAAOVujAHwrpgBYEqkAEw+sAOQgrwAVR7IAyIC1AELNuACXK7wACpu/AKEawwCTqcYA7EbKAMXxzQA+qdEAUmzVACg62QCyEd0AEfLgADTa5AA2yegABL7sALG38AAztfQAjrX4ALu3/ADAugAAkb0EADa/CACivgwA4LoQAOKyFAC1pRgAU5IcAMF3IAAEVSQAJykoACvzKwAnsi8AImUzAC4LNwBmozoA2yw+AK+mQQAAEEUA82dIAK2tSwBk4E4AQP9RAH4JVQBc/lcAFN1aAPWkXQBIVWAAYu1iAJZsZQBS0mcA4x1qANNObAB6ZG4AZl5wAAo8cgD2/HMAtaB1AN4mdwASj3gA8th5AC8EewB6EHwAkv18ADrLfQBBeX4AeAd/ALt1fwD0w38AA/J/AO//fwCi7X8AK7t/AJhofwDv9X4AaGN+AAaxfQAb33wAtu17ADTdegDArXkAvF94AGzzdgA0aXUAcsFzAJj8cQAOG3AAVh1uAO4DbABQz2kAK4BnAOQWZQBKlGIA0vhfAEJFXQA5eloAbJhXAKGgVAB/k1EA6HFOAIo8SwBK9EcA6JlEAEwuQQBKsj0AwCY6AJ6MNgC75DIAEjAvAIdvKwARpCcApM4jADHwHwC9CRwANBwYAKAoFAD6LxAAPTMMAHYzCACYMQQAri4AAL8r/AC3KfgAuyn0AKos8ACaM+wAhj/oAGZR5ABCauAACovcAMa02ABU6NQAzSbRAPlwzQDux8kAeizGAJifwgAgIr8A/rS7AANZuAAUD7UA99exAIm0rgCGpasAvKuoAPDHpQDG+qIAEkWgAGKnnQB1IpsA6raYAE5llgBOLpQAYRKSACASkAACLo4AhmaMABq8igAyL4kAIsCHAFxvhgAbPYUAyCmEAI41gwC9YIIAhKuBAA4WgQCEoIAABEuAAJ4VgABoAIAAZAuAAIg2gADWgYAALu2AAIJ4gQCjI4IAcO6CAKzYgwAk4oQAlwqGAKxRhwAot4gAlDqKAK7biwDzmY0AA3WPAGBskQCIf5MA/62VADD3lwCNWpoAetecAFRtnwB+G6IAPOGkAPK9pwDKsKoAJrmtACfWsAAYB7QAIku3AHShugA8Cb4Al4HBAKsJxQCToMgAaUXMAED3zwAstdMAPn7XAHpR2wD5Ld8ArhLjALT+5gD78OoAlujuAHXk8gCn4/YAIOX6AOLn/gDs6gIAOO0GAMbtCgCZ6w4ApOUSAPXaFgCCyhoAVLMeAG6UIgDUbCYAkTsqAK//LQA7uDEAR2Q1AOQCOQArkzwANBRAACaFQwAT5UYAODNKAKZuTQCkllAAXKpTAASpVgDqkVkAPmRcAGIfXwCOwmEALE1kAIq+ZgAYFmkAMFNrAFZ1bQDme28AeGZxAH40cwCN5XQAOHl2ABbvdwDGRnkA/n96AGCaewCvlXwAqXF9ABQufgDIyn4AlEd/AGCkfwAQ4X8Amv1/APD5fwAa1n8AGJJ/AAgufwDyqX4ADwZ+AGpCfQBTX3wA6Fx7AIE7egBU+3gAwZx3ABQgdgCyhXQABc5yAHT5cAB/CG8AmvtsAEvTagAikGgAqDJmAIC7YwA9K2EAkIJeABnCWwCQ6lgArfxVACb5UgDB4E8AS7RMAH50SQBKIkYAYL5CALtJPwAixTsAhzE4AMSPNADS4DAAiCUtAPReKQDmjSUAdrMhAILQHQAU5hkAH/UVAKn+EQClAw4AIgUKABcEBgCFAQIAfP79AOf7+QDg+vUAWfzxAFcB7gDjCuoA6hnmAH4v4gCMTN4AFnLaABGh1gB02tIAMR/PADpwywB6zscA3TrEAEa2wACeQb0Aud25AH6LtgC4S7MAPR+wANwGrQBRA6oAcxWnAOI9pAB2faEAvtSeAIREnABVzZkA4G+XALIslQBqBJMAgPeQAIwGjwD6MY0ATnqLAOrfiQBDY4gAqASHAILEhQAWo4QArqCDAJa9ggDy+YEADVaBAPjRgADmbYAA6imAAAwGgABsAoAA6h6AAKRbgABouIAAOzWBAOrRgQBYjoIAUmqDAJ5lhAAEgIUAOLmGAOsQiADKhokAcRqLAIHLjACJmY4AGYSQAKyKkgDQrJQA5umWAHhBmQDSspsAcj2eAKHgoAC+m6MAGm6mAPlWqQClVawAXmmvAFSRsgDQzLUA5hq5AN96vADK678A1GzDABz9xgC6m8oAxEfOAFIA0gBvxNUAKpPZAJVr3QCpTOEAgDXlAAol6QBcGu0AaRTxADgS9QDIEvkAFRX9AB0YAQDhGgUAWRwJAIkbDQBtFxEAAg8VAFABGQBN7RwADNIgAIKuJADEgSgA00osAMAIMACYujMAbF83AFb2OgBofj4AxvZBAIxeRQDbtEgA7PhLANQpTwDgRlIAME9VABRCWADAHlsAhORdAKqSYACGKGMAdqVlAM4IaAABUmoAeIBsAJ6TbgADi3AABmZyAFgkdABmxXUA3Eh3AFOueABq9XkA3B17AFAnfACWEX0AWNx9AIKHfgDQEn8AKX5/AHnJfwCc9H8AmP9/AGLqfwD9tH8Ael9/APTpfgB7VH4AQ599AHLKfAA41nsA5cJ6AKSQeQDeP3gAztB2AOZDdQB6mXMA/tFxAODtbwCe7W0AttFrAK2aaQAbSWcAht1kAJ9YYgDxul8ANgVdABQ4WgBCVFcAeVpUAHhLUQAJKE4A7PBKAP6mRwAAS0QA4d1AAGhgPQCF0zkAFTg2AAKPMgA42S4AqBcrAD1LJwD2dCMAvZUfAJquGwB6wBcAZ8wTAFTTDwBJ1gsARNYHAETUAwBS0f8AZc77AI7M9wDAzPMAB9DvAGHX6wDJ4+cAR/bjAMsP4ABeMdwA7lvYAHmQ1ADwz9AAQhvNAGZzyQA82cUAuE3CALLRvgAYZrsAtwu4AHbDtAAYjrEAgGyuAGBfqwCWZ6gAxIWlAMC6ogAsB6AAumudABbpmgDcf5gAqDCWABn8kwCm4pEA9OSPAGcDjgCOPowAzJaKAJQMiQBFoIcAPlKGAM0ihQBJEoQA6CCDAPZOggCcnIEADAqBAGyXgADURIAAXhKAABIAgAD7DYAADDyAAEiKgACE+IAAxIaBAMI0ggBwAoMAhO+DANT7hAAKJ4YA83CHAB3ZiABOX4oACAOMAPfDjQCcoY8AgpuRADKxkwAX4pUAsy2YAGeTmgCgEp0AtqqfAA5bogDoIqUAqAGoAID2qgDAAK4AnR+xAFJStAANmLcAAvC6AE9ZvgAm08EAmlzFANL0yADemswA2k3QANIM1ADc1tcA+arbAEKI3wCqbeMAT1rnABlN6wAkRe8AXEHzAMtA9wBvQvsAP0X/AEZIAwBxSgcAzkoLAE9IDwD6QRMAzTYXAMglGwD1DR8ARu4iAODFJgCnkyoAxlYuADoOMgASuTUAclY5AFnlPAD9ZEAAYNRDAMYyRwAyf0oA8LhNABjfUADu8FMAqe1WAILUWQDKpFwAvl1fAL3+YQASh2QAIfZmAElLaQD4hWsAnKVtAKypbwCmkXEAEl1zAHcLdQB0nHYAkA94AIpkeQDsmnoAhLJ7APyqfAAWhH0Apz1+AHDXfgBWUX8AOqt/APzkfwCa/n8AAPh/AEDRfwBTin8AViN/AGGcfgCM9X0AGi99ABdJfADnQ3sApR96ALrceABee3cAAPx1AO5edACcpHIAdM1wAOjZbgCIymwAu59qAC1aaABU+mUA3oBjAF3uYAB9Q14A5oBbAE6nWABst1UA9LFSALuXTwBwaUwA+CdJABnURQCibkIAgvg+AIByOwCS3TcAljo0AHaKMAAhziwAhwYpAJ00JQBWWSEAr3UdAJqKGQAemRUAL6IRANSmDQAJqAkAzqYFAC2kAQAaof0AqJ75AMud9QCMn/EA7KTtAOmu6QCCvuUAuNThAIDy3QDcGNoAwEjWACCD0gDyyM4AJRvLAKR6xwBc6MMALmXAAAHyvACyj7kAGD+2AA4BswBc1q8A2L+sAD++qQBe0qYA5PyjAJI+oQAWmJ4AEAqcAD6VmQAcOpcAY/mUAIrTkgAryZAAw9qOANAIjQDGU4sAF7yJAB9CiABP5oYA6KiFAFGKhAC9ioMAfqqCAL3pgQC5SIEAjseAAGRmgABQJYAAaASAAKgDgAAiI4AAvGKAAHHCgAAoQoEAvOGBAAmhggDif4MAAH6EADybhQAy14YArDGIAECqiQCdQIsAUPSMAPbEjgAXspAAMLuSANDflABQH5cARHmZAO3smwDVeZ4AMh+hAHjcowDksKYAxpupAGqcrAD4sa8Ay9uyAPIYtgC8aLkAQsq8AK48wAAov8MAw1DHAKbwygDbnc4AgVfSAJ4c1gBJ7NkAgMXdAFyn4QDSkOUA74DpAL527QAkcfEASW/1AAJw+QBwcv0AfHUBACt4BQB6eQkAaHgNAO9zEQAZaxUA2VwZAD5IHQBALCEA8QclAEnaKABloiwAPl8wAPIPNACPszcAI0k7ANjPPgC2RkIA86xFAKIBSQD8Q0wAIXNPAE+OUgC4lFUAm4VYADxgWwDhI14A2c9gAHhjYwAY3mUAGj9oAOOFagDisWwAjsJuAFm3cADSj3IAdUt0ANrpdQCbancAT814AKYRegBFN3sA6T18AE4lfQA87X0AepV+AOYdfwBVhn8Aus5/AO/2fwAC/38A1uZ/AI6ufwAeVn8Art1+AFJFfgA3jX0Ah7V8AH6+ewBNqHoAT3N5ALgfeAD4rXYAVh51AEVxcwAnp3EAeMBvAKq9bQBGn2sA0GVpANURZwDzo2QAvhxiAN58XwD4xFwAwPVZAOYPVwAoFFQARQNRAP7dTQAqpUoAh1lHAPr7QwBMjUAAaw49ACWAOQB14zUAKjkyAEqCLgCtvyoAV/ImADMbIwA6Ox8AaFMbALRkFwAicBMApnYPAE95CwAPeQcA7XYDAPRz/wATcfsAYG/3ANRv8wBpc+8AM3vrABuI5wA0m+MAaLXfAMTX2wAuA9gAsjjUAC550AClxcwA+h7JACCGxQD3+8EAaoG+AFIXuwCUvrcA/He0AGlEsQCdJK4AbRmrAJIjqADUQ6UA5nqiAHzJnwBGMJ0A6a+aAAhJmAA8/JUAF8qTACyzkQAAuI8ADNmNANIWjAC8cYoANuqIAKiAhwBgNYYAwgiFAAz7gwCEDIMAcj2CAPaNgQBO/oAAmI6AAOc+gABhD4AAAgCAANYQgADXQYAA+JKAACIEgQBFlYEAJkaCALQWgwCdBoQAxBWFAMJDhgBzkIcAWfuIAECEigCkKowAN+6NAGzOjwDoypEADOOTAGwWlgBuZJgAdcyaAPxNnQBO6J8AyJqiAM9kpQCERagAaDyrAIVIrgA+abEAsp20ACTltwCsPrsAj6m+ANAkwgCrr8UALUnJAG/wzACOpNAAj2TUAI4v2ACNBNwAmeLfALvI4wDwtecASanrALah7wBKnvMA9Z33AL2f+wCjov8AmKUDAKunBwDKpwsAA6UPAEGeEwCdkhcAAIEbAH9oHwAXSCMAzB4nAK7rKgDErS4AGWQyAMoNNgDWqTkAcTc9AJq1QACBI0QASYBHAAzLSgAKA04AZSdRAFU3VAAcMlcA7hZaAB7lXADum18AtDpiAMbAZAB8LWcASIBpAIK4awCs1W0ANddvAJi8cQBrhXMAIDF1AHC/dgDQL3gABIJ5AKC1egBjynsABsB8AEKWfQD0TH4A1ON+ANpafwDKsX8Apuh/AFT/fwDP9X8AIsx/AEiCfwBkGH8Aho5+ANLkfQB7G30AozJ8AJwqewCMA3oA3L14AMBZdwCs13UA6jd0APh6cgAwoXAAI6tuADCZbAD+a2oA9yNoANDBZQACRmMATLFgADYEXgCGP1sA22NYAPxxVQCbalIAgk5PAHYeTABG20gAxIVFAMAeQgAopz4AvB87AIWJNwBF5TMABTQwAJx2LAANrigAONskACr/IADHGh0AFi8ZABA9FQCtRREA+0kNAOlKCQCHSQUAzUYBAMBD/QBoQfkAvED1AMpC8QCISO0A/VLpACZj5QABeuEAiJjdALi/2QCC8NUA5yvSAMxyzgAsxsoA7SbHAPmVwwA5FMAAiqK8AM5BuQDc8rUAirayAKiNrwD+eKwAXXmpAHaPpgAXvKMA5P+gAJpbngDcz5sAVF2ZAJkElwBExpQA7KKSAAqbkAA+r44A3d+MAIItiwB7mIkAQyGIAC/IhgCWjYUAynGEABB1gwCml4IAztmBAKY7gQBnvYAAJl+AAP4ggAACA4AAMgWAAJQngAAbaoAAvsyAAFZPgQDV8YEA/bOCAK+VgwCrloQArLaFAHT1hgCqUogA+M2JAANniwBeHY0AnvCOAFLgkADu65IABhOVAPZUlwBCsZkARiecAGG2ngD+XaEAXh2kAODzpgDI4KkAT+OsAMv6rwBbJrMAR2W2ALK2uQDKGb0At43AAJcRxACMpMcArEXLAA70zgDIrtIA5HTWAHhF2gCEH94AFwLiADjs5QDf3OkAJ9PtAOzN8QBZzPUARM35AM7P/QDV0gEAeNUFAJDWCQBD1Q0AatARACHHFQBZuBkAGqMdAGiGIQBGYSUAvTIpANz5LACitTAANmU0AIwHOADYmzsAISE/AIiWQgAz+0UAQk5JAOKOTABEvE8AktVSABPaVQD0yFgAhqFbAA5jXgDQDGEAOp5jAIAWZgAydWgAirlqABbjbAA+8W4AeONwAFy5cgBUcnQAFQ52ABWMdwAQ7HgAnC16AG5QewA/VHwAyDh9ANf9fQAyo34AuCh/AD6OfwCy038ABfl/AB/+fwAQ438A1ad/AHxMfwAo0X4A5DV+AOh6fQBgoHwAd6Z7AICNegCtVXkAXv93ANuKdgCN+HQAzkhzABh8cQDOkm8AhI1tAJZsawC8MGkAWtpmACVqZACu4GEAlD5fAIyEXAA6s1kAX8tWAKjNUwDlulAA0JNNADhZSgD0C0cAxqxDAJ48QABFvDwAsCw5AK+ONQA+4zEAPisuAJ9nKgBdmSYAW8EiAKjgHgAm+BoA5AgXAM8TEwD1GQ8AShwLANgbBwCWGQMAkhb/AMcT+wA4EvcA6RLzANsW7wAIH+sAgCznACtA4wAaW98AOX7bAIiq1wD+4NMAiCLQACJwzACuysgAHjPFAFyqwQA/Mb4AuMi6AJFxtwCwLLQA3vqwAOvcrQCk06oAwN+nABQCpQA4O6IABoyfAAD1nAD4dpoAaBKYAAbIlQBWmJMA5oORAEyLjwDqro0AVu+LAOhMigAcyIgARmGHAMkYhgDy7oQAFOSDAGP4ggAwLIIAk3+BANjygAAAhoAASDmAAKEMgAA4AIAA9BOAAORHgADwm4AAAhCBAAqkgQDOV4IAOCuDAPodhADxL4UAwWCGAC6whwDaHYkAaqmKAIRSjACsGI4AgPuPAIH6kQAnFZQA+UqWAFqbmAC9BZsAjImdABQmoADA2qIA0qalAKKJqABwgqsAfZCuAASzsQA+6bQAWjK4AISNuwDo+b4AoXbCANoCxgCknckAHEbNAFv70ABjvNQAV4jYADJe3AAEPeAA1iPkAKQR6AB+BewAV/7vADv78wAk+/cAEP37AAEAAADvAgQA3QQIAMMEDACqARAAgvoTAFzuFwAq3BsA/cIfAMyhIwCrdycAmkMrAKgELwDiuTIAXmI2ACT9OQBgiT0AGAZBAHxyRACmzUcAwhZLAPxMTgCDb1EAkH1UAGB2VwAqWVoARCVdAOjZXwB4dmIAQvpkAKNkZwAMtWkA1OprAIQFbgB9BHAAU+dxAH6tcwCVVnUAJuJ2ANRPeAA8n3kAEdB6AATiewDK1HwAMKh9APpbfgD5734AFGR/ABq4fwAN7H8AyP9/AF7zfwC6xn8A/Hl/AC0NfwBogH4A1NN9AJoHfQDuG3wADhF7ADbneQC6nngA5Dd3ABizdQCsEHQAE1FyALh0cAAXfG4AqmdsAPw3agCV7WcADIllAPwKYwD/c2AAwsRdAPD9WgA9IFgAXyxVABMjUgAiBU8AUtNLAGqOSABON0UAu85BAKhVPgDhzDoAUDU3AOKPMwB03S8ABR8sAHZVKADIgSQA5qQgANW/HACA0xgA+OAUACPpEAAb7QwAxO0IADzsBABs6QAAaub8ACnk+AC24/QAC+bwADDs7AAd9+gA2QflAFof4QCjPt0ApGbZAGGY1QDB1NEAxBzOAE5xygBT08YAuEPDAGTDvwA4U7wADvS4AMimtQAvbLIAHEWvAFgyrACgNKkAyEymAHF7owBtwaAAVB+eANqVmwClJZkARs+WAGaTlACAcpIAMG2QAOqDjgAwt4wAdAeLACR1iQCjAIgAUqqGAIJyhQCHWYQAoV+DABiFggAayoEA3C6BAIGzgAAsWIAA8ByAAOABgAD9BoAATCyAAMJxgABK14AAy1yBACwCggA1x4IAwquDAJOvhABi0oUA8hOHAOpziADs8YkAq42LAKVGjQCGHI8Awg6RAO4ckwBwRpUA1oqXAHjpmQDMYZwALPOeAPScoQB6XqQACjenAPAlqgBsKq0AvUOwAB9xswC6sbYA0gS6AHJpvQDl3sAAJmTEAHL4xwDOmssAWkrPACcG0wBCzdYAup7aAJh53gDlXOIAqEfmAN846gCVL+4AwCryAGsp9gCNKvoAJy3+ADQwAgC7MgYAqTMKABAyDgDeLBIAHCMWAMwTGgDm/R0Af+AhAIW6JQAfiykANVEtAPULMQBSujQAdls4AGfuOwBLcj8ANOZCAFBJRgC3mkkAptlMADYFUACuHFMAOx9WAB4MWQCj4lsABKJeAJtJYQC92GMAvk5mAAaraAAB7WoAChRtALUfbwBeD3EApOJyAPyYdAAIMnYAVq13AI0KeQBSSXoAV2l7AFBqfAACTH0ALg5+AKawfgBGM38A4pV/AG7YfwDL+n8AAv1/AP7efwDcoH8AmkJ/AFjEfgA1Jn4AVmh9APKKfAA2jnsAanJ6ANI3eQC83ncAhGd2AIHSdAAeIHMAyFBxAPFkbwAXXW0AujlrAGj7aACtomYAIjBkAGmkYQAWAF8A8kNcAIBwWQCshlYA+4ZTAFxyUAB2SU0AIw1KADS+RgBzXUMAyus/AARqPAAW2TgA0zk1ADSNMQAa1C0AfA8qAElAJgB3ZyIAAIYeANqcGgACrRYAebcSADa9DgBDvwoAmb4GAEC8AgAyuf4Ae7b6ABW19gAHtvIAULruAPPC6gDn0OYAPeXiANQA3wDHJNsA9FHXAGSJ0wD7y88AuhrMAH52yAA+4MQA4FjBADjhvQBCeroAtyS3AIvhswB+sbAAZJWtAAaOqgAknKcAesCkAMr7oQC2Tp8A+rmcADQ+mgAF3JcABZSVAM9mkwDdVJEA0V6PAAiFjQAUyIsAVyiKADymiAAoQocAcfyFAGbVhABbzYMAiOSCACobggB+cYEAmOeAALt9gADeM4AAMAqAAKwAgABaF4AANU6AACqlgAAoHIEADrOBALxpggD8P4MAnDWEAGBKhQD7fYYAMNCHAJJAiQDezooAl3qMAGZDjgDNKJAAUiqSAH9HlAC3f5YAhtKYADg/mwBOxZ0AEGSgAOQaowAP6aUA6M2oAKfIqwCe2K4A9vyxAPE0tQC6f7gAfty7AGRKvwCUyMIAJFbGADryyQDmm80AO1LRAFQU1QAy4dgA6rfcAIKX4AD9fuQAZ23oALth7AABW/AAMlj0AFlY+ABkWvwAYF0AAEJgBAAKYggAt2EMAEleEAC4VhQAD0oYAEU3HABoHSAAcfsjAHXQJwBumysAclsvAJQPMwDOtjYAXFA6ACjbPQB6VkEATMFEAOEaSABLYksAxJZOAHm3UQCew1QAcrpXADqbWgAyZV0AthdgAAKyYgCMM2UAjptnAJ3paQDoHGwAJDVuAIoxcADREXIAVtVzAMV7dQCiBHcAk294ADi8eQBA6noAYPl7AFDpfADWuX0Avmp+ANz7fgAHbX8ALL5/ACbvfwD//38AnvB/ABbBfwBscX8AsAF/AAhyfgCSwn0AePN8APcEfAA+93oAnsp5AFl/eADKFXcARI51AC7pcwD0JnIAAEhwANZMbgDmNWwAxQNqAPi2ZwAYUGUAuM9iAIY2YAAYhV0ALbxaAHDcVwCQ5lQAZdtRAJW7TgAEiEsAbkFIAKzoRACXfkEABwQ+AOJ5OgAF4TYAXDozANCGLwBSxysAzvwnAD8oJACVSiAAzmQcAOV3GADOhBQAlYwQAC6QDACfkAgA7Y4EAA2MAAASifwA8Yb4ALGG9ABbifAA24/sAFCb6ACWrOQAxcTgANDk3AClDdkAVkDVALZ90QDUxs0AjhzKANh/xgCY8cIAsnK/AAYEvAB5prgA11q1AAIisgC5/K4A2+urABfwqABDCqYABDujACSDoABC450ADlybACrumAAwmpYAvGCUAFNCkgCLP5AA1liOAL6OjACo4YoAClKJAETghwC2jIYAr1eFAIZBhAB2SoMAyXKCAK66gQBSIoEA4qmAAHRRgAAnGYAAAAGAABAJgABHMYAAqnmAABrigACGaoEAxhKCALLaggAUwoMAvMiEAFzuhQCuMocAapWIAB4WigCStIsAKnCNAKpIjwBwPZEAHk6TAB56lQDlwJcA6SGaAIicnAAmMJ8AINyhAMWfpABkeqcASGuqALBxrQDgjLAABLyzAF/+tgAMU7oASrm9ACkwwQDctsQAckzIAA7wywDAoM8Anl3TALQl1wAT+NoAvdPeAMO34gAno+YA55TqABGM7gCYh/IAhYb2ANaH+gCEiv4AkI0CAPyPBgC6kAoA2I4OAEaJEgAOfxYAL28aAKNYHgCCOiIAtRMmAGPjKQCAqC0AImIxAF0PNQA6rzgA2kA8AFHDPwC+NUMARpdGAAjnSQA8JE0AAE5QAJ5jUwA2ZFYAHE9ZAIojXADJ4F4AMoZhAA4TZADAhmYArOBoADQgawDMRG0A7U1vAAY7cQC0C3MAYL90AMJVdgBTzncAzCh5AMhkegD8gXsAIYB8APZefQBEHn4A2L1+AI89fwBCnX8A4tx/AFb8fwCY+38AsNp/AJyZfwBwOH8ATLd+AD4WfgCGVX0AQHV8ALJ1ewAUV3oAthl5ANy9dwDqQ3YAPax0AC33cgA+JXEA1jZvAHIsbQCkBmsA3cVoAMhqZgDr9WMA7GdhAG7BXgAcA1wAoy1ZAMBBVgAoQFMAoylQAPT+TADowEkATnBGAP4NQwDTmj8Aohc8AGCFOADX5DQAETcxAN58LQBCtykAIuclAH8NIgBJKx4Af0EaABZRFgAUWxIAc2AOADViCgBaYQYA414CANVb/gAyWfoA9Vf2ADBZ8gDMXe4A5mbqAGN15gBUiuIAqKbeAGXL2gB2+dYA4THTAIp1zwBpxcsAciLIAHmNxACFB8EAWJG9AOwrugAG2LYAjpazAEZosAAMTq0AlkiqALBYpwAbf6QAgryhAKQRnwAif5wAqgWaANillwA/YJUAfjWTABMmkQCOMo8AZFuNABChiwAEBIoAnYSIAEwjhwBU4IUAILyEAOK2gwDs0IIAcAqCAKFjgQCq3IAArHWAAMIugAD8B4AAagGAAAAbgADKVIAAqK6AAJAogQBawoEA6nuCAAFVgwCBTYQAD2WFAHqbhgBu8IcAjGOJAIv0igDsoowAWm6OAFRWkABmWpIABnqUALi0lgDdCZkA8HibAEIBngBCoqAANlujAH4rpgBaEqkADg+sAOsgrwAOR7IAzYC1AD7NuACaK7wACJu/AKQawwCQqcYA7EbKAMjxzQA4qdEAWmzVACA62QC5Ed0AC/LgADja5AAzyegAB77sAK+38AA0tfQAjrX4ALq3/ADCugAAj70EADe/CACivgwA4LoQAOGyFAC3pRgAUZIcAMF3IAAGVSQAJSkoAC7zKwAlsi8AImUzAC4LNwBnozoA2iw+ALCmQQD+D0UA8mdIALCtSwBg4E4ARP9RAHwJVQBc/lcAFd1aAPKkXQBMVWAAXu1iAJpsZQBO0mcA5R1qANRObAB5ZG4AZl5wAAo8cgD1/HMAtqB1AN8mdwAQj3gA9Nh5AC4EewB6EHwAk/18ADjLfQBCeX4AeAd/ALx1fwDyw38ABPJ/AO//fwCg7X8AMLt/AJFofwD29X4AYmN+AAyxfQAW33wAuO17ADTdegC/rXkAvl94AGrzdgA1aXUAdMFzAJT8cQASG3AAVB1uAOwDbABWz2kAIoBnAO8WZQBAlGIA2vhfADxFXQA8eloAbJhXAJ+gVACBk1EA6HFOAIg8SwBM9EcA5ZlEAFEuQQBFsj0AxiY6AJiMNgDA5DIADjAvAItvKwAMpCcAqM4jAC/wHwC+CRwANBwYAKEoFAD3LxAAQTMMAHIzCACbMQQAri4AALwr/AC8KfgAtin0AK0s8ACYM+wAhj/oAGdR5ABBauAADIvcAMC02ABc6NQAxCbRAAFxzQDpx8kAeyzGAJifwgAiIr8A/LS7AAZZuAAQD7UA+texAIi0rgCEpasAwquoAOjHpQDO+qIADEWgAGSnnQB4IpsA5LaYAFRllgBJLpQAZBKSAB8SkAABLo4AhmaMABy8igAwL4kAJMCHAFpvhgAcPYUAyCmEAI41gwC+YIIAgquBABAWgQCDoIAABEuAAJ4VgABqAIAAYAuAAIw2gADTgYAAMO2AAIF4gQCiI4IAce6CAKzYgwAm4oQAkwqGAK9RhwAmt4gAljqKAK7biwDxmY0ABXWPAF5skQCKf5MA/q2VADD3lwCMWpoAe9ecAFRtnwB+G6IAPeGkAPC9pwDMsKoAJLmtACjWsAAYB7QAIUu3AHihugA2Cb4AnYHBAKUJxQCXoMgAZ0XMAED3zwAvtdMAOn7XAH5R2wD0Ld8AsxLjALD+5gAA8eoAkOjuAHvk8gCi4/YAJOX6AODn/gDt6gIAN+0GAMftCgCY6w4ApeUSAPXaFgCByhoAVrMeAGuUIgDXbCYAkDsqAK//LQA9uDEAQ2Q1AOgCOQAnkzwAOhRAACCFQwAY5UYAMjNKAKpuTQCjllAAW6pTAAepVgDmkVkAQmRcAF4fXwCQwmEALE1kAIq+ZgAYFmkAMlNrAFJ1bQDoe28AeGZxAHw0cwCS5XQAM3l2ABjvdwDIRnkA+n96AGSaewCqlXwArnF9ABEufgDJyn4AlEd/AGCkfwAS4X8Alv1/APP5fwAY1n8AGpJ/AAgufwDxqX4ADwZ+AGpCfQBSX3wA6lx7AH47egBY+3gAvpx3ABQgdgC0hXQAAs5yAHn5cAB8CG8AmvtsAEzTagAgkGgAqjJmAH67YwA/K2EAj4JeABrCWwCQ6lgAq/xVACb5UgDE4E8AR7RMAIR0SQBDIkYAZL5CALpJPwAjxTsAhjE4AMaPNADO4DAAjSUtAO9eKQDqjSUAdLMhAIPQHQAT5hkAIPUVAKf+EQCoAw4AIAUKABcEBgCHAQIAef79AOn7+QDg+vUAWPzxAFoB7gDgCuoA7BnmAH0v4gCOTN4AEnLaABah1gBv2tIANR/PADdwywB7zscA3jrEAES2wAChQb0Att25AIGLtgC2S7MAPh+wANoGrQBUA6oAcBWnAOY9pABwfaEAxNSeAIBEnABYzZkA3m+XALQslQBmBJMAhfeQAIYGjwAAMo0ASnqLAO3fiQBAY4gArASHAH/EhQAXo4QArqCDAJS9ggD1+YEAClaBAPzRgADkbYAA6CmAABAGgABmAoAA8B6AAKBbgABquIAAOzWBAOrRgQBXjoIAUmqDAJ5lhAAFgIUAOLmGAOoQiADKhokAcBqLAIPLjACJmY4AGISQAK2KkgDOrJQA6emWAHZBmQDSspsAcj2eAKDgoADCm6MAFm6mAPtWqQCkVawAXWmvAFiRsgDLzLUA6hq5AN56vADI678A12zDABv9xgC6m8oAxUfOAFAA0gBuxNUALpPZAJFr3QCtTOEAfDXlAA0l6QBaGu0AahTxADgS9QDIEvkAFRX9ABwYAQDjGgUAVhwJAIwbDQBqFxEABA8VAE4BGQBQ7RwACNIgAIauJADCgSgA1EosAMAIMACXujMAbl83AFT2OgBqfj4Aw/ZBAI5eRQDbtEgA6/hLANYpTwDcRlIANE9VABBCWADEHlsAguRdAKuSYACGKGMAdKVlANAIaAAAUmoAeIBsAKCTbgAAi3AACmZyAFQkdABoxXUA3Eh3AFCueABv9XkA1h17AFknfACMEX0AYNx9AHuHfgDUEn8AKX5/AHnJfwCc9H8AmP9/AGLqfwD6tH8AgF9/AOzpfgCEVH4APJ99AHXKfAA41nsA48J6AKeQeQDaP3gA0tB2AONDdQB8mXMA/NFxAOLtbwCe7W0AtNFrALCaaQAWSWcAjN1kAJxYYgDxul8AOAVdABA4WgBGVFcAdlpUAHxLUQAGKE4A7vBKAPumRwADS0QA3t1AAGpgPQCE0zkAFTg2AAOPMgA42S4ApxcrAD9LJwDydCMAwpUfAJauGwB+wBcAY8wTAFjTDwBG1gsARtYHAEPUAwBR0f8AaM77AIvM9wDCzPMABtDvAGHX6wDJ4+cAR/bjAMsP4ABgMdwA61vYAH2Q1ADrz9AARhvNAGRzyQA82cUAuk3CALDRvgAaZrsAtgu4AHbDtAAajrEAfGyuAGRfqwCSZ6gAxoWlAMK6ogAnB6AAwGudABDpmgDgf5gAqDCWABb8kwCq4pEA8OSPAGoDjgCNPowAzJaKAJQMiQBFoIcAPVKGAM8ihQBHEoQA6iCDAPVOggCcnIEADAqBAGyXgADURIAAXhKAABMAgAD5DYAADjyAAEaKgACG+IAAwoaBAMQ0ggBuAoMAhu+DANL7hAANJ4YA8HCHAB7ZiABOX4oACAOMAPjDjQCaoY8Ag5uRADKxkwAY4pUAsi2YAGeTmgCeEp0AuqqfAApbogDsIqUApQGoAIH2qgDAAK4AnR+xAFJStAAOmLcAAfC6AE5ZvgAo08EAmVzFANL0yADemswA2k3QANIM1ADc1tcA+qrbAD+I3wCubeMATFrnABtN6wAjRe8AW0HzAM1A9wBtQvsAQkX/AEJIAwB1SgcAy0oLAFFIDwD6QRMAyjYXAM4lGwDsDR8AUO4iANjFJgCskyoAxVYuADcOMgAWuTUAbVY5AF/lPAD3ZEAAZ9RDAL8yRwA3f0oA7LhNABvfUADu8FMAp+1WAIXUWQDEpFwAxl1fALb+YQAXh2QAHfZmAExLaQD4hWsAnKVtAKqpbwCmkXEAE11zAHgLdQBynHYAlQ94AIJkeQDzmnoAgLJ7APyqfAAZhH0ApD1+AHDXfgBZUX8ANqt/AADlfwCX/n8AAvh/AD7RfwBUin8AVyN/AF6cfgCS9X0AEi99AB9JfADgQ3sAqh96ALXceABke3cA/Pt1APFedACapHIAcs1wAO7ZbgCBymwAwZ9qAChaaABW+mUA4IBjAFjuYACCQ14A4oBbAFKnWABqt1UA9LFSALqXTwBwaUwA+idJABbURQCmbkIAfvg+AIJyOwCS3TcAlDo0AHmKMAAeziwAigYpAJo0JQBYWSEArXUdAJyKGQAcmRUAMqIRANGmDQALqAkAzaYFAC2kAQAaof0AqJ75AMud9QCNn/EA7KTtAOmu6QCAvuUAu9ThAH3y3QDfGNoAv0jWACCD0gDyyM4AJxvLAKB6xwBf6MMALGXAAALyvACzj7kAGD+2AAwBswBe1q8A1b+sAES+qQBa0qYA5fyjAJI+oQAUmJ4AFAqcADyVmQAcOpcAZPmUAIjTkgAsyZAAxNqOAM4IjQDKU4sAELyJACZCiABJ5oYA7qiFAEyKhADAioMAfKqCAL7pgQC6SIEAjMeAAGVmgABSJYAAYwSAAK4DgAAcI4AAwGKAAHDCgAAnQoEAvuGBAAihggDhf4MAAn6EADqbhQAz14YArTGIAD6qiQCeQIsAUPSMAPbEjgAWspAAMruSAM3flABUH5cAQXmZAO/smwDTeZ4AMh+hAHjcowDksKYAyZupAGWcrAD+sa8AxduyAPYYtgC6aLkAQsq8AK88wAAov8MAwlDHAKjwygDXnc4AhlfSAJoc1gBK7NkAgcXdAFqn4QDTkOUA8YDpALp27QAocfEARm/1AANw+QBycv0AeXUBAC54BQB3eQkAangNAO9zEQAZaxUA2VwZAD1IHQBBLCEA8AclAEraKABkoiwAPl8wAPIPNACPszcAJEk7ANTPPgC8RkIA7KxFAKoBSQDyQ0wAKXNPAEiOUgC+lFUAmYVYADpgWwDlI14A1M9gAHxjYwAW3mUAGj9oAOSFagDksWwAisJuAFy3cADQj3IAdEt0AN7pdQCXancAUs14AKQRegBGN3sA6D18AFAlfQA67X0AfJV+AOIdfwBbhn8As85/APb2fwD8/n8A2uZ/AI2ufwAcVn8AsN1+AFBFfgA6jX0AhrV8AH2+ewBOqHoATXN5ALofeAD4rXYAVR51AEZxcwAmp3EAecBvAKq9bQBFn2sA0GVpANURZwD0o2QAvRxiAN58XwD5xFwAvvVZAOkPVwAlFFQASANRAPzdTQAspUoAhFlHAPv7QwBNjUAAaQ49ACiAOQBy4zUALDkyAEiCLgCvvyoAVfImADUbIwA5Ox8AaVMbALRkFwAgcBMAqnYPAEx5CwAPeQcA73YDAPFz/wAWcfsAYG/3ANBv8wBuc+8ALXvrACGI5wAum+MAbrXfAL/X2wAyA9gArzjUAC550ACoxcwA9x7JACGGxQD3+8EAaYG+AFYXuwCQvrcA/3e0AGdEsQCeJK4AbhmrAJEjqADUQ6UA5nqiAHzJnwBHMJ0A6K+aAAhJmAA8/JUAF8qTAC+zkQD8t48ADtmNANAWjAC8cYoAOOqIAKaAhwBjNYYAwAiFAAr7gwCIDIMAbj2CAPiNgQBQ/oAAko6AAO8+gABbD4AABgCAANMQgADYQYAA9pKAACYEgQBClYEAKEaCALIWgwCfBoQAwBWFAMhDhgBtkIcAXvuIADyEigCoKowAMu6NAHLOjwDjypEAD+OTAGwWlgBqZJgAesyaAPpNnQBN6J8AzJqiAMhkpQCLRagAZDyrAIdIrgA7abEAtp20ACDltwCwPrsAjKm+ANAkwgCtr8UAKknJAHPwzACJpNAAlGTUAIov2ACQBNwAmOLfALrI4wDytecARqnrALmh7wBJnvMA9Z33AL2f+wCiov8AmKUDAK2nBwDJpwsAAqUPAEKeEwCckhcAAIEbAIBoHwAWSCMAzB4nAK7rKgDErS4AGmQyAMgNNgDZqTkAbTc9AJu1QACCI0QASIBHAA3LSgAKA04AZCdRAFY3VAAaMlcA8BZaAB3lXADwm18AsjpiAMTAZAB/LWcARoBpAIW4awCr1W0AMtdvAJy8cQBnhXMAJjF1AGq/dgDUL3gAAoJ5AKG1egBjynsABMB8AEaWfQDxTH4A1uN+ANhafwDKsX8AqOh/AFL/fwDR9X8AIMx/AEmCfwBkGH8AhI5+ANXkfQB4G30AqDJ8AJYqewCQA3oA2r14AMBZdwCv13UA5Td0AP16cgAtoXAAJKtuADCZbAD8a2oA+SNoANDBZQACRmMATLFgADYEXgCEP1sA32NYAPdxVQCgalIAfU5PAHseTABC20gAxIVFAMQeQgAhpz4AxB87AH+JNwBI5TMABDQwAJx2LAANrigAONskACz/IADEGh0AGC8ZAA49FQCvRREA+kkNAOpKCQCFSQUAzkYBAMFD/QBnQfkAvkD1AMdC8QCJSO0A/VLpACZj5QADeuEAhZjdALm/2QCC8NUA5yvSAMxyzgAsxsoA7CbHAPqVwwA5FMAAiKK8ANBBuQDa8rUAjLayAKSNrwACeawAWXmpAHyPpgAQvKMA6f+gAJZbngDiz5sAT12ZAJwElwBBxpQA7aKSAA2bkAA5r44A4t+MAH4tiwB9mIkARCGIAC3IhgCXjYUAyXGEABB1gwCol4IAzNmBAKY7gQBovYAAJF+AAAAhgAABA4AAMgWAAJQngAAdaoAAusyAAFxPgQDO8YEAArSCAK6VgwCploQAsLaFAHD1hgCsUogA+M2JAAJniwBfHY0AnvCOAFDgkADx65IAAhOVAPtUlwA+sZkASCecAGG2ngD8XaEAYR2kAN/zpgDG4KkAUuOsAMf6rwBfJrMARGW2ALS2uQDHGb0Auo3AAJURxACOpMcAqkXLAA70zgDJrtIA43TWAHpF2gCAH94AGwLiADPs5QDm3OkAH9PtAPPN8QBUzPUAR835AMzP/QDX0gEAdtUFAJPWCQBA1Q0AbNARACDHFQBZuBkAG6MdAGeGIQBHYSUAvTIpANr5LACltTAAMmU0AJAHOADWmzsAIiE/AIWWQgA2+0UAQE5JAOSOTABCvE8Ak9VSABLaVQD0yFgAiKFbAAljXgDYDGEAMp5jAIgWZgAsdWgAi7lqABfjbAA68W4AgONwAFO5cgBccnQADg52ABqMdwAO7HgAnC16AG5QewA+VHwAyzh9ANT9fQA1o34Atih/AD6OfwC0038AAvl/ACH+fwAQ438A1Kd/AH5MfwAm0X4A5DV+AOp6fQBdoHwAeqZ7AH6NegCuVXkAXv93ANqKdgCN+HQAz0hzABd8cQDRkm8AfY1tAJ5sawC2MGkAXtpmACNqZACu4GEAlT5fAIuEXAA8s1kAXMtWAKrNUwDmulAAzJNNAD5ZSgDuC0cAyaxDAJ48QABFvDwAryw5ALCONQA+4zEAPCsuAKNnKgBYmSYAYMEiAKTgHgAo+BoA4wgXAM8TEwD3GQ8ASBwLANgbBwCXGQMAkhb/AMcT+wA3EvcA6xLzANgW7wALH+sAfyznACtA4wAaW98AOH7bAImq1wD84NMAiyLQACBwzACuysgAIDPFAFmqwQBAMb4Auci6AJBxtwCyLLQA3PqwAOzcrQCi06oAxN+nABACpQA8O6IAAoyfAAT1nAD1dpoAahKYAATIlQBWmJMA6YORAEiLjwDuro0AUu+LAOxMigAYyIgASmGHAMQYhgD47oQADuSDAGj4ggArLIIAmH+BANTygAAFhoAAQTmAAKgMgAA0AIAA9hOAAORHgADtm4AABhCBAAakgQDSV4IANSuDAPwdhADwL4UAwGCGADCwhwDXHYkAbqmKAIBSjACvGI4AgPuPAID6kQAoFZQA+EqWAFibmADCBZsAhomdABomoAC52qIA2KalAKCJqABwgqsAfpCuAAKzsQA/6bQAWjK4AIWNuwDn+b4AonbCANkCxgCknckAHkbNAFj70ABmvNQAVIjYADRe3AAEPeAA1SPkAKYR6AB6BewAXP7vADb78wAp+/cADP37AAMAAADuAgQA3AQIAMYEDACnARAAhfoTAFnuFwAs3BsA+8IfAM6hIwCrdycAmkMrAKgELwDiuTIAXWI2ACb9OQBfiT0AGQZBAHxyRAClzUcAwhZLAPxMTgCCb1EAkn1UAF52VwArWVoARCVdAOjZXwB4dmIAQPpkAKZkZwAKtWkA1eprAIMFbgB9BHAAVOdxAH6tcwCUVnUAJuJ2ANRPeAA9n3kAEtB6AALiewDM1HwALqh9APpbfgD6734AEmR/AB24fwAK7H8Ayv9/AFzzfwC6xn8A/3l/ACoNfwBqgH4A09N9AJoHfQDvG3wADBF7ADnneQC3nngA6Dd3ABSzdQCuEHQAElFyALh0cAAYfG4AqGdsAP43agCU7WcADollAPoKYwD+c2AAxMRdAPD9WgA8IFgAYCxVABIjUgAkBU8ATtNLAHCOSABHN0UAws5BAKRVPgDhzDoAUzU3ANyPMwB83S8A/R4sAHxVKADEgSQA6KQgANS/HACC0xgA9OAUACjpEAAV7QwAy+0IADbsBABx6QAAZeb8AC7k+ACy4/QAD+bwACzs7AAe9+gA2wflAFgf4QCjPt0ApmbZAF2Y1QDF1NEAwhzOAE5xygBV08YAt0PDAGTDvwA4U7wADvS4AMimtQAwbLIAHEWvAFUyrACkNKkAwkymAHl7owBowaAAVh+eANqVmwCiJZkASs+WAGKTlACEcpIALG2QAO2DjgAtt4wAdweLACJ1iQCkAIgAUqqGAIByhQCKWYQAn1+DABqFggAZyoEA3C6BAICzgAAuWIAA7hyAAOIBgAD6BoAAUCyAAL5xgABM14AAzFyBACkCggA4x4IAwquDAJCvhABn0oUA7hOHAOpziADu8YkAqI2LAKlGjQCEHI8Awg6RAO4ckwBvRpUA2IqXAHbpmQDOYZwAKvOeAPWcoQB4XqQADjenAOwlqgBuKq0AvUOwAB5xswC+sbYAzAS6AHhpvQDf3sAAKmTEAHH4xwDOmssAW0rPACYG0wBCzdYAup7aAJl53gDlXOIAp0fmAOA46gCUL+4AwCryAGwp9gCMKvoAKC3+ADQwAgC6MgYAqjMKAA8yDgDgLBIAGyMWAMwTGgDn/R0AfOAhAIm6JQAciykAN1EtAPQLMQBSujQAd1s4AGXuOwBMcj8ANOZCAFBJRgC5mkkApNlMADcFUACuHFMAOh9WACEMWQCg4lsABqJeAJpJYQC72GMAwk5mAAKraAAE7WoACBRtALYfbwBeD3EApOJyAPuYdAAKMnYAVK13AI4KeQBTSXoAVWl7AFJqfAABTH0ALA5+AKqwfgBCM38A5JV/AG7YfwDL+n8AAf1/AADffwDaoH8AnEJ/AFbEfgA2Jn4AVmh9APGKfAA4jnsAaHJ6ANQ3eQC63ncAhmd2AH/SdAAgIHMAxlBxAPNkbwAUXW0AvjlrAGb7aACsomYAJjBkAGKkYQAeAF8A6kNcAIhwWQClhlYAAYdTAFZyUAB6SU0AIQ1KADW+RgBzXUMAyes/AAZqPAAT2TgA1zk1AC+NMQAe1C0AeQ8qAEtAJgB4ZyIA/oUeANucGgABrRYAebcSADe9DgBDvwoAmb4GAD+8AgAzuf4Aerb6ABa19gAGtvIAUbruAPLC6gDo0OYAO+XiANYA3wDFJNsA9lHXAGGJ0wD+y88AuBrMAIB2yAA+4MQA3ljBADrhvQBAeroAtyS3AIzhswB+sbAAY5WtAAeOqgAhnKcAfcCkAMj7oQC4Tp8A+rmcADM+mgAE3JcAB5SVAMxmkwDiVJEAzF6PAAqFjQAUyIsAViiKAD6miAAmQocAcvyFAGbVhABbzYMAhuSCAC0bggB7cYEAnueAALR9gADiM4AALgqAAK0AgABcF4AAMk6AACqlgAApHIEADrOBAL5pggD5P4MAnTWEAF5KhQAAfoYALNCHAJZAiQDZzooAmnqMAGVDjgDNKJAAVCqSAHxHlAC6f5YAgtKYADo/mwBPxZ0AEGSgAOMaowAP6aUA5s2oAKrIqwCe2K4A9PyxAPQ0tQC1f7gAgty7AGJKvwCVyMIAJVbGADnyyQDmm80AO1LRAFUU1QAw4dgA7bfcAH+X4AD/fuQAZm3oALth7AABW/AAM1j0AFdY+ABnWvwAXF0AAEZgBAAHYggAumEMAEdeEAC4VhQAD0oYAEc3HABlHSAAdfsjAHDQJwBymysAcVsvAJMPMwDQtjYAWVA6ACzbPQB1VkEAUcFEAN0aSABOYksAw5ZOAHi3UQCew1QAdLpXADibWgA0ZV0AtBdgAASyYgCKM2UAkJtnAJnpaQDuHGwAHjVuAI4xcADOEXIAWNVzAMR7dQCkBHcAkG94ADq8eQBA6noAXvl7AFLpfADVuX0AwGp+ANj7fgAMbX8AJr5/AC3vfwD+/38AnvB/ABrBfwBlcX8AtgF/AAZyfgCSwn0AevN8APQEfAA/93oAn8p5AFl/eADIFXcARo51ACzpcwD2JnIA/0dwANVMbgDoNWwAwwNqAPu2ZwAUUGUAvM9iAII2YAAchV0AK7xaAG7cVwCU5lQAYdtRAJm7TgACiEsAbkFIAKzoRACXfkEABwQ+AOJ5OgAG4TYAWjozANKGLwBQxysA0PwnAD0oJACWSiAAz2QcAOJ3GADRhBQAkowQADGQDACekAgA7I4EAA6MAAARifwA8ob4ALKG9ABYifAA34/sAEub6ACZrOQAxsTgAMzk3ACrDdkAT0DVALp90QDTxs0AjhzKANp/xgCV8cIAtHK/AAUEvAB6prgA2Fq1AP4hsgC+/K4A1uurABzwqAA+CqYACDujACKDoABC450AD1ybACjumAAzmpYAuGCUAFZCkgCKP5AA11iOAL6OjACm4YoADFKJAETghwC1jIYAsFeFAINBhAB6SoMAyHKCAK26gQBUIoEA3qmAAHhRgAAmGYAAAAGAAA8JgABHMYAAqnmAABzigACFaoEAxBKCALPaggAVwoMAvMiEAFruhQCyMocAZJWIACYWigCKtIsAMHCNAKZIjwBzPZEAHE6TAB56lQDmwJcA6SGaAIacnAAqMJ8AGtyhAMufpABeeqcATWuqAK5xrQDhjLAABLyzAF7+tgANU7oASbm9ACowwQDbtsQAdEzIAAzwywDDoM8Aml3TALgl1wAO+NoAwdPeAMK34gAmo+YA6pTqAA2M7gCah/IAhob2ANSH+gCFiv4AkY0CAPqPBgC8kAoA1o4OAEiJEgANfxYAL28aAKVYHgB9OiIAuxMmAF/jKQCCqC0AImIxAFwPNQA7rzgA2kA8AFHDPwC+NUMARpdGAArnSQA5JE0ABE5QAJhjUwA7ZFYAGE9ZAI0jXADI4F4AMoZhAA4TZADAhmYAq+BoADQgawDORG0A601vAAg7cQCwC3MAZL90AMBVdgBUzncAzih5AMRkegD/gXsAIIB8APVefQBGHn4A1r1+AJA9fwBEnX8A3tx/AFn8fwCW+38Astp/AJqZfwB0OH8ARbd+AEYWfgB+VX0ARnV8AK51ewAXV3oAtBl5AN69dwDqQ3YAOqx0ADD3cgA+JXEA1DZvAHUsbQCfBmsA4cVoAMhqZgDo9WMA8GdhAGrBXgAfA1wAoi1ZAMBBVgAoQFMAoilQAPj+TADhwEkAVnBGAPcNQwDXmj8Aohc8AF6FOADZ5DQAEDcxAN58LQBBtykAJOclAH4NIgBKKx4AfkEaABZRFgAVWxIAcmAOADZiCgBZYQYA414CANdb/gAuWfoA+lf2ACpZ8gDSXe4A4mbqAGV15gBTiuIAqKbeAGTL2gB5+dYA3jHTAIx1zwBqxcsAbCLIAIKNxAB8B8EAYJG9AOUrugAK2LYAjJazAEhosAAMTq0AlEiqALJYpwAaf6QAgLyhAKgRnwAef5wArgWaANSllwBCYJUAfDWTABQmkQCOMo8AZFuNABKhiwAABIoAoYSIAEgjhwBY4IUAHLyEAOa2gwDp0IIAcgqCAKBjgQCp3IAArnWAAMAugAD+B4AAaAGAAAIbgADKVIAApq6AAJIogQBZwoEA6HuCAAZVgwB8TYQAEmWFAHqbhgBs8IcAj2OJAIj0igDsoowAXW6OAFFWkABoWpIABXqUALi0lgDeCZkA73ibAEQBngBAoqAAOFujAHsrpgBaEqkAEQ+sAOYgrwAUR7IAyIC1AEDNuACcK7wABJu/AKYawwCQqcYA7EbKAMjxzQA6qdEAVmzVACQ62QC2Ed0AD/LgADTa5AA3yegAAr7sALS38AAxtfQAjbX4AL+3/AC7ugAAlr0EADG/CACmvgwA3LoQAOayFACzpRgAU5IcAMF3IAAEVSQAJykoACzzKwAosi8AH2UzADELNwBjozoA3iw+AKymQQACEEUA8WdIAK6tSwBl4E4APf9RAIIJVQBZ/lcAFt1aAPSkXQBIVWAAYO1iAJpsZQBN0mcA6R1qAM5ObAB+ZG4AY15wAAw8cgD0/HMAtaB1AOEmdwAPj3gA9Nh5AC4EewB5EHwAlP18ADrLfQA+eX4AfAd/ALZ1fwD4w38AAvJ/APD/fwCg7X8ALbt/AJRofwD09X4AZGN+AAuxfQAW33wAuu17AC7degDGrXkAuF94AG/zdgAxaXUAdsFzAJT8cQASG3AAVB1uAOwDbABWz2kAJIBnAOwWZQBClGIA2PhfADxFXQA+eloAaphXAKCgVACCk1EA5HFOAI48SwBE9EcA75lEAEYuQQBQsj0AvCY6AKCMNgC65DIAEjAvAIdvKwASpCcAoM4jADjwHwC1CRwAOxwYAJwoFAD7LxAAPjMMAHUzCACXMQQAsi4AALkr/AC+KfgAtin0AKss8ACbM+wAhD/oAGhR5ABAauAADYvcAMG02ABa6NQAxSbRAABxzQDqx8kAfCzGAJafwgAiIr8A/LS7AAZZuAARD7UA+dexAIi0rgCEpasAwauoAOrHpQDN+qIADEWgAGOnnQB4IpsA5raYAFRllgBILpQAZBKSAB4SkAADLo4AhmaMABu8igAwL4kAJMCHAFpvhgAcPYUAyCmEAI41gwC+YIIAhKuBAAwWgQCGoIAAAkuAAJ8VgABqAIAAYAuAAIw2gADSgYAAMu2AAH54gQCmI4IAbe6CAK7YgwAm4oQAkgqGALJRhwAit4gAmTqKAKzbiwDymY0ABnWPAFxskQCLf5MA/a2VADL3lwCMWpoAedecAFZtnwB8G6IAQOGkAOy9pwDQsKoAILmtACzWsAAWB7QAIUu3AHehugA4Cb4AmYHBAKoJxQCUoMgAZ0XMAEL3zwAstdMAPH7XAH5R2wD0Ld8AshLjALL+5gD78OoAlujuAHbk8gCn4/YAH+X6AOPn/gDq6gIAOu0GAMftCgCW6w4Ap+USAPLaFgCEyhoAU7MeAG+UIgDSbCYAlTsqAKv/LQA+uDEARmQ1AOICOQAvkzwAMhRAACaFQwAU5UYANjNKAKhuTQClllAAWKpTAAipVgDnkVkAQ2RcAFwfXwCRwmEAKU1kAI++ZgAUFmkANFNrAFF1bQDoe28AemZxAHo0cwCS5XQANXl2ABbvdwDIRnkA+396AGKaewCulXwAqnF9ABQufgDIyn4Akkd/AGOkfwAO4X8AnP1/AO75fwAa1n8AGJJ/AAgufwD2qX4ACAZ+AHFCfQBMX3wA7lx7AHw7egBY+3gAvpx3ABYgdgCyhXQABM5yAHX5cACACG8AmPtsAEzTagAikGgAqDJmAH+7YwA/K2EAjYJeABzCWwCP6lgArPxVACb5UgDC4E8ASrRMAIB0SQBIIkYAYL5CALxJPwAixTsAhTE4AMiPNADO4DAAjSUtAO9eKQDqjSUAcrMhAIjQHQAN5hkAJ/UVAKD+EQCsAw4AHwUKABcEBgCIAQIAd/79AOv7+QDe+vUAWfzxAFoB7gDfCuoA7RnmAHwv4gCOTN4AFHLaABKh1gBz2tIAMR/PADtwywB5zscA3jrEAEW2wACfQb0Aud25AH6LtgC3S7MAPh+wANkGrQBWA6oAbhWnAOY9pAB0faEAvtSeAIREnABWzZkA3W+XALgslQBiBJMAhveQAIcGjwD+MY0ATHqLAOzfiQBBY4gAqgSHAIDEhQAXo4QArqCDAJW9ggDz+YEADVaBAPjRgADnbYAA6CmAAA4GgABpAoAA7R6AAKJbgABquIAAOzWBAOnRgQBYjoIAUmqDAJ1lhAAIgIUAM7mGAO8QiADGhokAdBqLAIDLjACJmY4AGYSQAKyKkgDQrJQA5+mWAHVBmQDWspsAbj2eAKTgoAC9m6MAGm6mAPhWqQCnVawAWmmvAFqRsgDKzLUA6xq5AN16vADJ678A1WzDAB39xgC3m8oAyEfOAE8A0gBwxNUAK5PZAJJr3QCsTOEAfjXlAAwl6QBaGu0AahTxADgS9QDIEvkAFBX9AB4YAQDhGgUAWBwJAIobDQBsFxEAAg8VAFABGQBO7RwACtIgAISuJADCgSgA1UosAL4IMACbujMAaF83AFn2OgBmfj4AxvZBAIxeRQDctEgA6/hLANQpTwDgRlIAL09VABZCWAC+HlsAhORdAKySYACEKGMAeKVlAMsIaAAEUmoAdoBsAKCTbgABi3AACGZyAFYkdABoxXUA2kh3AFSueABr9XkA2B17AFYnfACPEX0AXtx9AICHfgDOEn8ALX5/AHXJfwCg9H8Al/9/AGDqfwD9tH8AfF9/APLpfgB+VH4AQJ99AHLKfAA61nsA4sJ6AKiQeQDaP3gA0tB2AOJDdQB8mXMA/dFxAOHtbwCe7W0AttFrAKyaaQAbSWcAid1kAJtYYgD0ul8ANAVdABU4WgBCVFcAelpUAHZLUQAMKE4A6PBKAAGnRwD/SkQA4d1AAGhgPQCF0zkAFDg2AASPMgA22S4AqxcrADlLJwD4dCMAvpUfAJeuGwB/wBcAYcwTAFnTDwBH1gsARNYHAEbUAwBN0f8Aa877AIrM9wDCzPMAB9DvAF/X6wDM4+cAQ/bjANEP4ABYMdwA9FvYAHWQ1ADyz9AAQRvNAGZzyQA82cUAuE3CALTRvgAUZrsAvAu4AHDDtAAejrEAe2yuAGRfqwCSZ6gAx4WlAL66ogAsB6AAvGudABTpmgDef5gApjCWABr8kwCk4pEA+OSPAGMDjgCSPowAyZaKAJYMiQBCoIcAQFKGAM0ihQBKEoQA5iCDAPhOggCanIEADgqBAGuXgADURIAAXRKAABQAgAD6DYAADDyAAEeKgACF+IAAwoaBAMQ0ggBwAoMAgu+DANj7hAAGJ4YA9nCHABvZiABOX4oACgOMAPXDjQCcoY8AhJuRADCxkwAZ4pUAsi2YAGaTmgCgEp0AuKqfAApbogDuIqUAowGoAIL2qgDAAK4AnB+xAFRStAAMmLcAAPC6AFNZvgAi08EAnlzFAM70yADhmswA2E3QANMM1ADb1tcA+qrbAECI3wCubeMASVrnACFN6wAcRe8AYkHzAMZA9wBzQvsAPUX/AEdIAwBxSgcAzkoLAE5IDwD8QRMAyzYXAMslGwDyDR8ASe4iAN3FJgCqkyoAxVYuADoOMgASuTUAclY5AFjlPAD+ZEAAYtRDAMIyRwA4f0oA6rhNABzfUADs8FMAqe1WAITUWQDIpFwAv11fALz+YQASh2QAIvZmAEhLaQD6hWsAmaVtAK6pbwCkkXEAFF1zAHgLdQBwnHYAlg94AIJkeQD0mnoAf7J7AP6qfAAWhH0Apj1+AHDXfgBaUX8ANKt/AADlfwCW/n8ABfh/AD3RfwBUin8AViN/AF6cfgCS9X0AFC99ABxJfADiQ3sAqB96ALjceABie3cA/Pt1APFedACYpHIAeM1wAObZbgCJymwAvJ9qACpaaABX+mUA3IBjAF7uYAB8Q14A5oBbAFCnWABqt1UA97FSALWXTwB2aUwA9CdJABzURQCfbkIAhPg+AH9yOwCT3TcAlTo0AHaKMAAhziwAiAYpAJw0JQBWWSEAr3UdAJqKGQAemRUAMKIRANOmDQAIqAkA0KYFACukAQAcof0Ap575AMqd9QCOn/EA6qTtAOyu6QB+vuUAu9ThAH7y3QDfGNoAvUjWACKD0gDyyM4AJBvLAKZ6xwBZ6MMAMGXAAADyvACyj7kAGT+2AA0BswBe1q8A1L+sAES+qQBY0qYA6PyjAJI+oQASmJ4AFwqcADeVmQAhOpcAYPmUAIrTkgAsyZAAxNqOAM4IjQDIU4sAFLyJACNCiABM5oYA6qiFAFCKhAC8ioMAgKqCALzpgQC5SIEAj8eAAGJmgABSJYAAZgSAAKoDgAAhI4AAvGKAAHHCgAAoQoEAuuGBAA6hggDcf4MABn6EADabhQA314YAqDGIAEaqiQCWQIsAVPSMAPbEjgAUspAANLuSAMzflABUH5cAQHmZAPLsmwDPeZ4ANh+hAHbcowDksKYAypupAGOcrAAAsq8AwtuyAPoYtgC4aLkAQsq8ALA8wAAlv8MAx1DHAKPwygDcnc4AgFfSAKAc1gBG7NkAhMXdAFin4QDTkOUA8oDpALh27QArcfEAQ2/1AAVw+QBxcv0AeXUBAC54BQB4eQkAaHgNAPFzEQAXaxUA2lwZADxIHQBELCEA7AclAE7aKABgoiwAQl8wAPAPNACQszcAIkk7ANjPPgC2RkIA9qxFAJ4BSQD+Q0wAHnNPAFCOUgC6lFUAmoVYADxgWwDgI14A2c9gAHpjYwAW3mUAGj9oAOSFagDhsWwAkMJuAFe3cADSj3IAdEt0AN3pdQCYancAUs14AKQRegBFN3sA6j18AE4lfQA87X0AeJV+AOgdfwBUhn8Aus5/APL2fwD8/n8A3OZ/AIqufwAgVn8ArN1+AFRFfgA2jX0AibV8AHq+ewBQqHoATnN5ALofeAD2rXYAVx51AERxcwAop3EAeMBvAKi9bQBIn2sA0GVpANQRZwD0o2QAvBxiAN58XwD6xFwAvvVZAOgPVwAnFFQARANRAALeTQAkpUoAjVlHAPT7QwBSjUAAZw49ACiAOQBy4zUALTkyAEeCLgCvvyoAVvImADQbIwA5Ox8AaVMbALNkFwAicBMAqXYPAEt5CwAReQcA7XYDAPNz/wAUcfsAYW/3ANFv8wBrc+8AM3vrABqI5wA0m+MAabXfAMLX2wAyA9gArjjUADB50ACkxcwA+x7JAB6GxQD5+8EAaIG+AFYXuwCQvrcAAHi0AGREsQCiJK4AaRmrAJQjqADVQ6UA43qiAIDJnwBCMJ0A7K+aAAdJmAA7/JUAGcqTACyzkQD+t48AD9mNAM4WjAC/cYoANeqIAKmAhwBfNYYAxAiFAAj7gwCIDIMAbj2CAPmNgQBO/oAAlo6AAOo+gABeD4AABACAANQQgADYQYAA9pKAACgEgQA9lYEAL0aCAKoWgwCmBoQAvBWFAMpDhgBskIcAXvuIAD2EigCmKowANe6NAG7OjwDmypEADuOTAGwWlgBsZJgAdsyaAP5NnQBI6J8A0ZqiAMRkpQCPRagAYTyrAIdIrgA9abEAtJ20ACLltwCvPrsAi6m+ANMkwgCpr8UAL0nJAGzwzACQpNAAjmTUAJAv2ACLBNwAmuLfALnI4wDytecASKnrALeh7wBJnvMA9Z33AL+f+wCfov8AnKUDAKinBwDOpwsA/qQPAEaeEwCYkhcABIEbAH1oHwAWSCMAzh4nAK3rKgDDrS4AG2QyAMYNNgDcqTkAbDc9AJy1QACAI0QASYBHAA7LSgAKA04AZCdRAFQ3VAAcMlcA8BZaABzlXADym18ArjpiAMrAZAB6LWcASIBpAIS4awCq1W0ANtdvAJi8cQBphXMAJDF1AGy/dgDTL3gAAoJ5AKG1egBjynsABcB8AEWWfQDwTH4A2eN+ANRafwDQsX8Aouh/AFb/fwDP9X8AIMx/AEuCfwBhGH8Ah45+ANLkfQB7G30ApDJ8AJoqewCOA3oA2r14AMNZdwCp13UA7Td0APV6cgA0oXAAHqtuADSZbAD5a2oA/CNoAMzBZQAHRmMARrFgADwEXgCBP1sA3mNYAPpxVQCcalIAgk5PAHYeTABG20gAwoVFAMQeQgAkpz4AwB87AIKJNwBG5TMABTQwAJx2LAAMrigAO9skACf/IADKGh0AEi8ZABI9FQCuRREA+kkNAOpKCQCFSQUAzkYBAMFD/QBoQfkAukD1AMxC8QCFSO0AAlPpACJj5QAEeuEAhZjdALm/2QCE8NUA5CvSAM9yzgAqxsoA7CbHAPyVwwA1FMAAjaK8AMxBuQDe8rUAiLayAKqNrwD8eKwAXnmpAHaPpgAWvKMA5v+gAJhbngDez5sAUl2ZAJoElwBExpQA6qKSAA6bkAA6r44A4N+MAIAtiwB7mIkARSGIAC3IhgCYjYUAyHGEABB1gwCol4IAy9mBAKk7gQBlvYAAKF+AAPwggAADA4AAMAWAAJYngAAcaoAAvMyAAFhPgQDU8YEA/LOCALKVgwCmloQAsLaFAHT1hgCoUogA+s2JAAFniwBfHY0An/COAE/gkADx65IABBOVAPhUlwBAsZkARiecAGO2ngD8XaEAYB2kAN7zpgDI4KkAUOOsAMv6rwBaJrMASGW2ALC2uQDMGb0At43AAJYRxACOpMcAqUXLABD0zgDGrtIA5nTWAHZF2gCFH94AGALiADXs5QDj3OkAI9PtAO7N8QBazPUAQ835AMzP/QDZ0gEAc9UFAJbWCQA/1Q0Aa9ARACLHFQBWuBkAHqMdAGSGIQBKYSUAujIpAN75LAChtTAANWU0AI4HOADWmzsAIiE/AIeWQgA1+0UAQU5JAOSOTABAvE8AmNVSAAzaVQD6yFgAgqFbAA5jXgDUDGEANJ5jAIgWZgAsdWgAirlqABrjbAA28W4AguNwAFK5cgBecnQADA52AB2MdwAJ7HgAoS16AGtQewBCVHwAxjh9ANj9fQAyo34Atih/AECOfwCz038AAvl/ACL+fwAO438A1ad/AH5MfwAl0X4A5jV+AOh6fQBeoHwAeqZ7AH6NegCuVXkAXv93ANqKdgCN+HQA0EhzABR8cQDVkm8Aeo1tAKBsawC0MGkAYNpmACFqZACx4GEAkT5fAI6EXAA7s1kAXMtWAKzNUwDiulAA0JNNADtZSgDuC0cAzaxDAJg8QABKvDwArCw5ALCONQA/4zEAPSsuAKBnKgBcmSYAXMEiAKfgHgAm+BoA5AgXAM8TEwD2GQ8AShwLANYbBwCXGQMAkxb/AMYT+wA5EvcA6RLzANgW7wANH+sAfSznACxA4wAaW98AOH7bAIqq1wD84NMAiiLQACBwzACvysgAHjPFAFyqwQA/Mb4AuMi6AJJxtwCxLLQA3fqwAO3crQCg06oAxt+nAA4CpQA+O6IA/4ufAAj1nADwdpoAbhKYAALIlQBWmJMA64ORAEaLjwDuro0AU++LAOpMigAcyIgARWGHAMoYhgDx7oQAFOSDAGX4ggAsLIIAmH+BANPygAAFhoAAQjmAAKgMgAAyAIAA+ROAAOBHgADym4AAAhCBAAqkgQDOV4IANiuDAP4dhADsL4UAxWCGACuwhwDbHYkAbKmKAIBSjACwGI4AfvuPAIL6kQAmFZQA+UqWAFqbmAC+BZsAiomdABYmoAC+2qIA1aalAKCJqABxgqsAfJCuAASzsQBA6bQAWDK4AIaNuwDm+b4AoXbCANoCxgCknckAHEbNAFv70ABivNQAWIjYADJe3AAEPeAA1iPkAKUR6AB6BewAXP7vADf78wAn+/cAD/37AAAAAADvAgQA3QQIAMQEDACoARAAhfoTAFnuFwAs3BsA/MIfAMuhIwCudycAl0MrAKoELwDiuTIAXGI2ACf9OQBeiT0AGAZBAH1yRAClzUcAwhZLAPxMTgCCb1EAkn1UAF52VwAsWVoAQSVdAOrZXwB4dmIAQfpkAKRkZwAKtWkA1uprAIQFbgB+BHAAUedxAH+tcwCUVnUAJuJ2ANZPeAA5n3kAFtB6AP7hewDP1HwALKh9APxbfgD6734AEGR/ACC4fwAF7H8A0f9/AFbzfwC/xn8A+nl/AC0NfwBpgH4A09N9AJwHfQDqG3wAEhF7ADLneQC+nngA5Dd3ABWzdQCuEHQAEFFyALx0cAAUfG4ArGdsAPo3agCY7WcACYllAP4KYwD9c2AAw8RdAPL9WgA6IFgAYCxVABQjUgAiBU8AUtNLAGqOSABNN0UAvM5BAKlVPgDfzDoAUjU3AOCPMwB13S8ABB8sAHdVKADHgSQA6KQgANG/HACF0xgA8uAUACrpEAAV7QwAx+0IAD3sBABp6QAAbeb8ACfk+AC24/QADebwAC7s7AAd9+gA2gflAFof4QCiPt0ApmbZAF6Y1QDE1NEAwhzOAFBxygBS08YAuEPDAGbDvwA0U7wAEvS4AMSmtQAwbLIAHkWvAFQyrAClNKkAw0ymAHV7owBswaAAUB+eAOGVmwCcJZkAUc+WAFyTlACJcpIAKG2QAPCDjgAqt4wAegeLAB91iQCoAIgATqqGAIRyhQCGWYQAol+DABeFggAayoEA3C6BAIKzgAAsWIAA8ByAAN4BgAD+BoAATiyAAL9xgABM14AAylyBAC0CggA0x4IAxKuDAI+vhABm0oUA8BOHAOpziADs8YkArI2LAKRGjQCHHI8Awg6RAOwckwByRpUA1oqXAHbpmQDOYZwALPOeAPKcoQB8XqQACjenAO4lqgBuKq0AvEOwAB5xswC+sbYAzQS6AHdpvQDh3sAAKGTEAHH4xwDPmssAWkrPACYG0wBDzdYAuJ7aAJt53gDkXOIApkfmAOI46gCSL+4AwyryAGop9gCLKvoAKS3+ADQwAgC6MgYAqzMKAA4yDgDeLBIAHiMWAMkTGgDp/R0AfOAhAIm6JQAbiykAOFEtAPILMQBWujQAc1s4AGruOwBHcj8AN+ZCAE5JRgC6mkkAotlMADoFUACrHFMAPB9WACAMWQCe4lsACKJeAJhJYQDA2GMAvE5mAAqraAD67GoAEBRtALAfbwBjD3EAoOJyAP+YdAAGMnYAV613AI4KeQBQSXoAWml7AExqfAAGTH0AKg5+AKqwfgBEM38A4ZV/AHDYfwDK+n8AAv1/AP/efwDaoH8Am0J/AFjEfgA0Jn4AWmh9AOyKfAA7jnsAZnJ6ANQ3eQC93ncAgmd2AILSdAAeIHMAyFBxAPJkbwAUXW0AvjlrAGT7aACxomYAHzBkAGqkYQAYAF8A7UNcAIZwWQCmhlYAAIdTAFpyUAB0SU0AJw1KAC++RgB4XUMAx+s/AAZqPAAU2TgA1Dk1ADONMQAb1C0Aew8qAEtAJgB1ZyIAA4YeANWcGgAIrRYAc7cSADu9DgBAvwoAnL4GADy8AgA2uf4Ad7b6ABi19gAGtvIAT7ruAPTC6gDn0OYAPOXiANUA3wDHJNsA81HXAGSJ0wD8y88AuRrMAH52yABB4MQA2ljBAD/hvQA8eroAuiS3AIrhswB+sbAAZZWtAAaOqgAinKcAfcCkAMX7oQC8Tp8A9rmcADc+mgAC3JcACJSVAMxmkwDgVJEAzl6PAAmFjQAWyIsAVCiKAECmiAAkQocAcvyFAGjVhABYzYMAi+SCACgbggB+cYEAmueAALl9gADeM4AAMgqAAKoAgABcF4AAM06AACmlgAAqHIEADrOBALtpggD+P4MAmDWEAGNKhQD8fYYALNCHAJhAiQDYzooAm3qMAGRDjgDMKJAAViqSAHtHlAC7f5YAgNKYAD0/mwBMxZ0AEmSgAOEaowAS6aUA5M2oAKzIqwCa2K4A+PyxAPE0tQC5f7gAfty7AGRKvwCUyMIAJFbGADzyyQDim80AQFLRAFAU1QA04dgA6rfcAICX4AABf+QAY23oAL5h7AD/WvAANFj0AFhY+ABkWvwAYF0AAEFgBAAMYggAtmEMAEpeEAC3VhQAD0oYAEY3HABmHSAAdfsjAHDQJwBymysAcVsvAJEPMwDUtjYAVVA6AC7bPQB2VkEATcFEAOIaSABIYksAyJZOAHS3UQChw1QAcbpXADqbWgA0ZV0AshdgAAiyYgCFM2UAlptnAJTpaQDwHGwAHjVuAI8xcADNEXIAWNVzAMR7dQCiBHcAlG94ADe8eQBB6noAX/l7AFHpfADWuX0AvWp+ANz7fgAIbX8AKr5/ACrvfwD+/38AoPB/ABfBfwBpcX8AswF/AAhyfgCQwn0AfPN8APEEfABD93oAmsp5AF5/eADFFXcAR451ACzpcwD1JnIAAEhwANRMbgDpNWwAwwNqAPu2ZwAUUGUAu89iAIQ2YAAahV0ALLxaAG/cVwCQ5lQAZttRAJa7TgACiEsAcEFIAKjoRACcfkEABAQ+AOR5OgAD4TYAXTozANCGLwBRxysAz/wnAD8oJACUSiAA0WQcAOB3GADShBQAk4wQAC6QDAChkAgA6o4EAA+MAAARifwA8Yb4ALOG9ABYifAA3o/sAEyb6ACYrOQAxsTgAM7k3ACoDdkAUkDVALh90QDTxs0AkBzKANZ/xgCa8cIAr3K/AAkEvAB4prgA2Fq1AAAisgC8/K4A1+urABrwqABBCqYABjujACSDoABB450ADVybACzumAAumpYAvmCUAFJCkgCKP5AA2FiOALyOjACq4YoACFKJAEbghwC0jIYAsFeFAIVBhAB3SoMAynKCAKy6gQBUIoEA4KmAAHZRgAAmGYAAAAGAABAJgABGMYAArHmAABnigACGaoEAxhKCALDaggAZwoMAuMiEAF3uhQCvMocAZpWIACYWigCItIsAMnCNAKVIjwByPZEAIE6TABp6lQDowJcA6CGaAIacnAAqMJ8AHdyhAMafpABieqcASmuqALBxrQDgjLAABbyzAFz+tgAQU7oARrm9ACwwwQDatsQAc0zIAA7wywC/oM8AoF3TALEl1wAV+NoAu9PeAMW34gAmo+YA55TqABKM7gCWh/IAiIb2ANSH+gCEiv4Ako0CAPqPBgC8kAoA144OAEaJEgAQfxYALG8aAKhYHgB7OiIAvBMmAF7jKQCDqC0AIWIxAF0PNQA6rzgA20A8AFDDPwC/NUMARJdGAAznSQA4JE0ABk5QAJZjUwA8ZFYAGU9ZAIsjXADL4F4ALoZhABATZAC/hmYAruBoADIgawDORG0A6k1vAAo7cQCvC3MAZL90AMBVdgBUzncAzSh5AMZkegD9gXsAIYB8APZefQBEHn4A2L1+AI89fwBCnX8A4tx/AFX8fwCa+38Artp/AJ6ZfwBvOH8AS7d+AEAWfgCEVX0AQXV8ALJ1ewAUV3oAtRl5AN69dwDqQ3YAOqx0ADD3cgA8JXEA1zZvAHQsbQCgBmsA4MVoAMZqZgDs9WMA7GdhAHDBXgAZA1wApS1ZAL5BVgAqQFMAoilQAPT+TADowEkATnBGAAAOQwDOmj8AqBc8AFmFOADf5DQACjcxAOJ8LQA/tykAJeclAH4NIgBKKx4AfEEaABlRFgATWxIAc2AOADZiCgBZYQYA5F4CANRb/gAyWfoA91f2AC1Z8gDPXe4A42bqAGZ15gBRiuIArKbeAGDL2gB8+dYA3DHTAIx1zwBqxcsAbiLIAH6NxACBB8EAXJG9AOgrugAJ2LYAjJazAEposAAITq0Al0iqALBYpwAaf6QAhLyhAKIRnwAkf5wAqQWaANallwBCYJUAfDWTABQmkQCNMo8AZFuNABKhiwACBIoAnoSIAEojhwBY4IUAHLyEAOa2gwDo0IIAcwqCAJ9jgQCr3IAArHWAAMIugAD9B4AAaAGAAAIbgADIVIAAqq6AAI4ogQBdwoEA5nuCAAZVgwB7TYQAFGWFAHibhgBu8IcAjmOJAIb0igDwoowAWG6OAFZWkABkWpIACHqUALa0lgDfCZkA7nibAEQBngBCoqAANlujAHwrpgBaEqkAEA+sAOggrwASR7IAyYC1AEHNuACZK7wACJu/AKMawwCRqcYA7EbKAMbxzQA9qdEAVGzVACQ62QC4Ed0ACvLgADza5AAtyegAC77sAKy38AA4tfQAirX4AL23/AC/ugAAkb0EADe/CAChvgwA4LoQAOOyFAC0pRgAVJIcAMB3IAAEVSQAKCkoACrzKwAqsi8AHmUzADILNwBiozoA3Sw+AK+mQQD+D0UA9GdIAKytSwBm4E4APP9RAIQJVQBW/lcAGN1aAPKkXQBKVWAAYO1iAJpsZQBM0mcA6B1qANBObAB8ZG4AZV5wAAo8cgD2/HMAtaB1AN4mdwAUj3gA8Nh5ADEEewB2EHwAlv18ADjLfQBDeX4AdQd/AL51fwDww38ACPJ/AOv/fwCk7X8ALLt/AJNofwD29X4AYWN+AA6xfQAT33wAvO17AC7degDGrXkAuF94AG7zdgAyaXUAdsFzAJT8cQAQG3AAVR1uAOwDbABXz2kAI4BnAOoWZQBHlGIA0vhfAEZFXQAyeloAdJhXAJigVACIk1EA4XFOAI88SwBE9EcA7JlEAEwuQQBJsj0AwiY6AJyMNgC85DIAEjAvAIZvKwATpCcAoM4jADbwHwC4CRwAOBwYAJ8oFAD4LxAAQTMMAHIzCACaMQQAsC4AALor/AC9KfgAtyn0AKss8ACbM+wAhD/oAGdR5ABBauAADIvcAMK02ABZ6NQAxybRAP9wzQDqx8kAfCzGAJefwgAhIr8A/rS7AARZuAASD7UA+dexAIe0rgCGpasAwKuoAOnHpQDO+qIACkWgAGannQB2IpsA57aYAFJllgBKLpQAYxKSAB8SkAACLo4AiGaMABi8igAzL4kAIMCHAF5vhgAaPYUAyimEAIw1gwDAYIIAgKuBABAWgQCCoIAABUuAAJ8VgABoAIAAZAuAAIc2gADWgYAALu2AAIJ4gQClI4IAbe6CAK7YgwAl4oQAlAqGALBRhwAit4gAmjqKAKvbiwD0mY0ABHWPAFxskQCMf5MA/a2VADH3lwCMWpoAetecAFVtnwB+G6IAPOGkAPK9pwDJsKoAKLmtACTWsAAaB7QAIUu3AHahugA6Cb4AmIHBAKkJxQCWoMgAZkXMAEP3zwAqtdMAPn7XAHxR2wD2Ld8AsRLjALL+5gD98OoAk+juAHnk8gCj4/YAJOX6AODn/gDs6gIAOO0GAMjtCgCV6w4AqeUSAPDaFgCFyhoAU7MeAG2UIgDWbCYAjzsqALL/LQA5uDEASGQ1AOICOQAskzwANRRAACSFQwAW5UYAMjNKAKtuTQChllAAXqpTAASpVgDpkVkAQGRcAF4fXwCSwmEAKE1kAI++ZgAUFmkANFNrAFJ1bQDoe28AdmZxAIA0cwCM5XQAOnl2ABPvdwDIRnkA/X96AGCaewCwlXwAqHF9ABYufgDGyn4AlEd/AGKkfwAO4X8AnP1/AO75fwAa1n8AGpJ/AAUufwD2qX4ACwZ+AGxCfQBTX3wA5lx7AIQ7egBR+3gAxJx3ABAgdgC2hXQAAs5yAHj5cAB8CG8AmvtsAEzTagAikGgApzJmAIK7YwA6K2EAlIJeABXCWwCU6lgAqfxVACj5UgDA4E8AS7RMAIB0SQBIIkYAYb5CALpJPwAkxTsAhDE4AMmPNADL4DAAkCUtAO1eKQDqjSUAdrMhAH/QHQAY5hkAHfUVAKj+EQCnAw4AIAUKABgEBgCGAQIAev79AOn7+QDe+vUAWvzxAFgB7gDhCuoA7RnmAHwv4gCNTN4AFHLaABKh1gB02tIAMh/PADhwywB8zscA2zrEAEi2wACdQb0Aut25AHyLtgC7S7MAOh+wAN0GrQBSA6oAcBWnAOc9pABwfaEAw9SeAIBEnABZzZkA3G+XALYslQBmBJMAg/eQAIoGjwD6MY0AUHqLAOrfiQBBY4gAqgSHAIDEhQAYo4QArqCDAJS9ggD0+YEADFaBAPjRgADobYAA5imAABIGgABkAoAA8R6AAJ5bgABsuIAAPDWBAOjRgQBYjoIAUmqDAJ5lhAAFgIUAN7mGAOoQiADMhokAbhqLAITLjACImY4AGISQAK+KkgDLrJQA7OmWAHJBmQDXspsAbj2eAKTgoAC8m6MAHG6mAPhWqQCkVawAYGmvAFKRsgDRzLUA5xq5AN56vADK678A1GzDAB39xgC4m8oAx0fOAE8A0gBwxNUALJPZAJBr3QCvTOEAezXlAA4l6QBZGu0AahTxADgS9QDJEvkAEhX9ACEYAQDdGgUAXBwJAIcbDQBtFxEAAg8VAFEBGQBL7RwADtIgAICuJADGgSgA00osAL8IMACZujMAa183AFb2OgBpfj4AxvZBAIleRQDgtEgA5vhLANspTwDaRlIANU9VABBCWADCHlsAhORdAKiSYACKKGMAcKVlANQIaAD9UWoAeoBsAJ6TbgABi3AACGZyAFgkdABkxXUA30h3AFCueABr9XkA3B17AFInfACSEX0AXNx9AH+HfgDQEn8ALn5/AHLJfwCi9H8Alf9/AGHqfwD+tH8Ael9/APTpfgB8VH4AQ599AG/KfAA81nsA4MJ6AKqQeQDZP3gA0tB2AONDdQB8mXMA/NFxAOPtbwCc7W0AttFrAK6aaQAYSWcAjN1kAJpYYgD0ul8AMwVdABY4WgBBVFcAelpUAHhLUQAIKE4A7vBKAPqmRwAES0QA3t1AAGpgPQCF0zkAFDg2AAOPMgA42S4ApxcrAD5LJwD2dCMAvJUfAJyuGwB5wBcAZ8wTAFXTDwBI1gsARNYHAEbUAwBO0f8Aas77AInM9wDEzPMABdDvAGHX6wDK4+cARvbjAMwP4ABeMdwA7lvYAHqQ1ADuz9AARBvNAGNzyQBA2cUAtU3CALXRvgAUZrsAuwu4AHHDtAAejrEAfGyuAGJfqwCUZ6gAxIWlAMO6ogAoB6AAvWudABTpmgDdf5gAqTCWABb8kwCo4pEA9OSPAGYDjgCQPowAypaKAJUMiQBEoIcAPlKGANAihQBGEoQA6iCDAPROggCdnIEADQqBAGqXgADWRIAAWxKAABYAgAD3DYAAEDyAAESKgACI+IAAwIaBAMQ0ggBwAoMAhe+DANL7hAAMJ4YA8HCHACDZiABNX4oACAOMAPjDjQCYoY8AiJuRACyxkwAc4pUAry2YAGqTmgCeEp0AuKqfAAxbogDpIqUAqAGoAH/2qgDCAK4Amh+xAFZStAAKmLcABPC6AE5ZvgAm08EAmlzFANL0yADfmswA2E3QANUM1ADZ1tcA+6rbAEGI3wCqbeMAT1rnABpN6wAjRe8AXUHzAMlA9wBxQvsAPkX/AEdIAwBxSgcAzUoLAE9IDwD7QRMAyzYXAMwlGwDwDR8ASu4iAN3FJgCokyoAyFYuADcOMgAWuTUAblY5AFzlPAD6ZEAAY9RDAMQyRwAzf0oA77hNABjfUADw8FMAp+1WAITUWQDHpFwAwV1fALr+YQAUh2QAIPZmAEpLaQD5hWsAmqVtAKypbwCmkXEAEl1zAHkLdQBynHYAkg94AIZkeQDwmnoAgbJ7AP6qfAAXhH0ApD1+AHLXfgBWUX8AOKt/AADlfwCU/n8ACPh/ADjRfwBZin8AUyN/AGCcfgCR9X0AFC99ABxJfADjQ3sApx96ALjceABie3cA/Pt1APBedACcpHIAcs1wAO7ZbgB/ymwAxJ9qACZaaABY+mUA3YBjAFzuYAB+Q14A5YBbAFCnWABqt1UA9rFSALaXTwB1aUwA9idJABrURQCibkIAgPg+AIJyOwCS3TcAlDo0AHmKMAAdziwAiwYpAJo0JQBYWSEArXUdAJyKGQAcmRUAMKIRANWmDQAGqAkA06YFACekAQAfof0ApJ75AM2d9QCMn/EA7aTtAOiu6QCCvuUAt9ThAIHy3QDdGNoAv0jWACGD0gDyyM4AJRvLAKR6xwBb6MMALmXAAAPyvACwj7kAGj+2AAwBswBe1q8A1r+sAEK+qQBa0qYA6PyjAJA+oQAVmJ4AEgqcADyVmQAeOpcAYvmUAInTkgAsyZAAw9qOAM8IjQDIU4sAFLyJACJCiABN5oYA6qiFAE+KhADAioMAeqqCAMDpgQC4SIEAjceAAGdmgABOJYAAZwSAAKoDgAAgI4AAvGKAAHPCgAAmQoEAveGBAAqhggDff4MABH6EADibhQA014YArDGIAECqiQCeQIsATvSMAPjEjgAUspAANLuSAMzflABUH5cAQHmZAPDsmwDSeZ4ANB+hAHfcowDlsKYAxpupAGicrAD8sa8Ax9uyAPYYtgC4aLkARcq8AKw8wAApv8MAw1DHAKbwygDbnc4AgVfSAJ4c1gBI7NkAgsXdAFqn4QDSkOUA84DpALZ27QAtcfEAQW/1AAdw+QBvcv0Ae3UBACx4BQB6eQkAZngNAPNzEQAVaxUA3FwZADtIHQBDLCEA7gclAEzaKABioiwAQF8wAPIPNACOszcAJEk7ANbPPgC5RkIA8axFAKIBSQD9Q0wAH3NPAFKOUgC2lFUAm4VYADxgWwDiI14A189gAHxjYwAS3mUAHj9oAOGFagDksWwAjsJuAFe3cADUj3IAckt0AN7pdQCYancAUs14AKMRegBHN3sA5z18AFAlfQA87X0AeJV+AOcdfwBWhn8At85/APT2fwD8/n8A3OZ/AIiufwAiVn8ArN1+AFJFfgA6jX0AhLV8AH6+ewBQqHoASnN5AL4feAD0rXYAWB51AENxcwApp3EAdcBvAK69bQBDn2sA0WVpANYRZwDxo2QAvxxiAN18XwD6xFwAvvVZAOgPVwAmFFQARgNRAADeTQAmpUoAi1lHAPX7QwBRjUAAaA49ACeAOQBz4zUALDkyAEiCLgCuvyoAWPImADEbIwA9Ox8AZVMbALdkFwAecBMAq3YPAEt5CwAQeQcA73YDAPBz/wAXcfsAYG/3ANBv8wBtc+8AMHvrAB2I5wAzm+MAabXfAMLX2wAwA9gAsDjUAC950ACmxcwA+R7JACCGxQD2+8EAaoG+AFQXuwCSvrcA/ne0AGhEsQCcJK4AbxmrAJEjqADUQ6UA6HqiAHnJnwBJMJ0A5q+aAApJmAA6/JUAGsqTACuzkQAAuI8AC9mNANMWjAC6cYoAOOqIAKeAhwBiNYYAwQiFAAr7gwCHDIMAbj2CAPqNgQBM/oAAmI6AAOg+gABgD4AAAgCAANYQgADYQYAA9pKAACYEgQBAlYEALEaCAKwWgwCmBoQAuxWFAMxDhgBqkIcAXvuIAD2EigCnKowANO6NAHDOjwDiypEAE+OTAGgWlgBuZJgAdsyaAPpNnQBQ6J8AyZqiAMtkpQCKRagAYjyrAIhIrgA+abEAsJ20ACbltwCsPrsAjqm+ANIkwgCpr8UALknJAG7wzACPpNAAjmTUAJAv2ACLBNwAnOLfALbI4wD2tecARKnrALqh7wBInvMA9Z33AL6f+wCiov8AmKUDAKynBwDKpwsAAaUPAESeEwCZkhcABIEbAHxoHwAZSCMAyh4nALDrKgDBrS4AHGQyAMcNNgDZqTkAbzc9AJq1QACBI0QASoBHAArLSgAOA04AYCdRAFg3VAAaMlcA7xZaAB/lXADtm18AtTpiAMPAZACALWcARIBpAIa4awCq1W0ANtdvAJa8cQBthXMAHjF1AHK/dgDPL3gABIJ5AKC1egBjynsABMB8AEiWfQDsTH4A3eN+ANJafwDOsX8Apuh/AFL/fwDS9X8AHsx/AEyCfwBhGH8AiI5+ANDkfQB8G30ApDJ8AJoqewCOA3oA2b14AMRZdwCo13UA7jd0APV6cgAzoXAAIKtuADKZbAD7a2oA+iNoAM7BZQAGRmMASLFgADgEXgCEP1sA3mNYAPlxVQCealIAfk5PAHoeTABD20gAxIVFAMMeQgAkpz4AwB87AIKJNwBG5TMABTQwAJx2LAAMrigAOtskACj/IADKGh0AEy8ZABA9FQCwRREA90kNAO1KCQCFSQUAzEYBAMND/QBlQfkAvkD1AMhC8QCKSO0A/FLpAChj5QD+eeEAipjdALi/2QCC8NUA6CvSAMtyzgAsxsoA7ibHAPiVwwA5FMAAiqK8AM9BuQDa8rUAjLayAKSNrwAEeawAV3mpAHyPpgASvKMA5v+gAJpbngDcz5sAVV2ZAJgElwBDxpQA7KKSAAybkAA8r44A4N+MAH4tiwB+mIkAQiGIADDIhgCVjYUAynGEAA91gwCol4IAzdmBAKY7gQBovYAAJF+AAAAhgAAAA4AAMwWAAJQngAAcaoAAvcyAAFdPgQDT8YEA/rOCALCVgwCploQArraFAHL1hgCqUogA+s2JAAJniwBeHY0AoPCOAEzgkAD165IAABOVAPxUlwA+sZkARiecAGS2ngD6XaEAYh2kAN7zpgDF4KkAVOOsAMj6rwBcJrMASGW2AK62uQDNGb0Ato3AAJgRxACMpMcAq0XLAA70zgDIrtIA5HTWAHlF2gCCH94AGQLiADXs5QDk3OkAINPtAPPN8QBVzPUARs35AMvP/QDa0gEActUFAJfWCQA91Q0AbdARACDHFQBauBkAGaMdAGiGIQBGYSUAvTIpANz5LACktTAAMmU0AJAHOADVmzsAIyE/AIaWQgA2+0UAPk5JAOaOTABBvE8AlNVSABDaVQD2yFgAhqFbAA5jXgDSDGEANJ5jAIgWZgAsdWgAjrlqABTjbAA88W4AfONwAFi5cgBYcnQAEg52ABeMdwAO7HgAni16AGxQewBBVHwAxjh9ANn9fQAwo34Auih/ADyOfwC2038A//h/ACT+fwAM438A2Kd/AHxMfwAm0X4A5TV+AOp6fQBboHwAfaZ7AHqNegCyVXkAXP93ANqKdgCO+HQAzkhzABh8cQDQkm8Afo1tAJ5sawC2MGkAXtpmACNqZACt4GEAlj5fAIqEXAA9s1kAW8tWAKzNUwDiulAA0pNNADhZSgDwC0cAy6xDAJk8QABMvDwAqiw5ALOONQA84zEAPSsuAKJnKgBZmSYAYMEiAKTgHgAo+BoA4ggXANETEwD0GQ8ASxwLANYbBwCYGQMAkRb/AMcT+wA4EvcA6RLzANoW7wALH+sAfSznAC1A4wAYW98AO37bAIaq1wAA4dMAhiLQACRwzACsysgAIDPFAFqqwQBAMb4AuMi6AJFxtwCyLLQA3PqwAOzcrQCi06oAw9+nABECpQA8O6IAAYyfAAb1nADydpoAbRKYAAHIlQBZmJMA6IORAEaLjwDxro0AT++LAO5MigAYyIgASGGHAMgYhgDz7oQAEuSDAGX4ggAuLIIAln+BANTygAAFhoAAQjmAAKgMgAAzAIAA9hOAAORHgADum4AABhCBAAakgQDRV4IANCuDAP4dhADvL4UAwmCGAC6whwDYHYkAbamKAIJSjACsGI4AhPuPAHr6kQAuFZQA8kqWAGCbmAC5BZsAjomdABImoADB2qIA1KalAKCJqABygqsAeZCuAAizsQA76bQAXDK4AISNuwDn+b4Ao3bCANgCxgCknckAHkbNAFj70ABmvNQAVojYADBe3AAHPeAA1CPkAKUR6AB+BewAVP7vAED78wAg+/cAE/37AAAAAADuAgQA3gQIAMMEDACpARAAhPoTAFzuFwAp3BsA/cIfAMyhIwCrdycAmkMrAKkELwDiuTIAXGI2ACf9OQBciT0AHAZBAHhyRACqzUcAvhZLAP5MTgCDb1EAkH1UAGB2VwAqWVoAQiVdAOzZXwB0dmIARPpkAKJkZwAMtWkA1uprAIAFbgCCBHAATudxAIOtcwCRVnUAKOJ2ANRPeAA6n3kAFdB6AADiewDM1HwAMah9APZbfgD+734AEGR/ABy4fwAM7H8Ayv9/AFrzfwC+xn8A+nl/AC4NfwBngH4A1NN9AJwHfQDsG3wADhF7ADbneQC6nngA5jd3ABazdQCsEHQAE1FyALp0cAATfG4ArmdsAPo3agCU7WcAEIllAPcKYwACdGAAwsRdAO/9WgA+IFgAXixVABQjUgAiBU8AUNNLAG6OSABJN0UAwM5BAKRVPgDjzDoAUDU3AOCPMwB23S8ABB8sAHZVKADJgSQA5KQgANa/HACA0xgA+OAUACTpEAAY7QwAyO0IADjsBABw6QAAZ+b8ACvk+AC04/QADebwAC7s7AAf9+gA2AflAFsf4QCgPt0AqGbZAF2Y1QDF1NEAwRzOAFBxygBS08YAuUPDAGTDvwA2U7wAEPS4AMemtQAubLIAIUWvAFAyrACoNKkAwUymAHZ7owBswaAAUh+eANyVmwCjJZkASM+WAGaTlACAcpIAL22QAOmDjgAyt4wAdAeLACR1iQCiAIgAUqqGAIJyhQCIWYQAn1+DABuFggAWyoEA4C6BAH6zgAAuWIAA7xyAAOABgAD+BoAASyyAAMRxgABG14AA0FyBACgCggA4x4IAwKuDAJSvhABh0oUA9hOHAORziADw8YkAqI2LAKZGjQCIHI8AwA6RAO4ckwBwRpUA1oqXAHjpmQDMYZwALfOeAPScoQB4XqQADDenAO4lqgBtKq0AvkOwAB5xswC7sbYA0AS6AHRpvQDi3sAAKWTEAG/4xwDSmssAVkrPACoG0wBAzdYAup7aAJl53gDmXOIApUfmAOM46gCQL+4AxSryAGcp9gCQKvoAIy3+ADowAgC1MgYArjMKAAwyDgDgLBIAHSMWAMoTGgDp/R0Ae+AhAIi6JQAdiykAN1EtAPQLMQBRujQAeFs4AGXuOwBMcj8ANOZCAFBJRgC4mkkAp9lMADIFUAC0HFMANh9WACIMWQCg4lsABKJeAJ5JYQC52GMAwE5mAAeraAD+7GoADhRtALEfbwBgD3EAouJyAACZdAAEMnYAWa13AIwKeQBRSXoAWml7AExqfAAFTH0ALA5+AKiwfgBEM38A5JV/AGrYfwDR+n8A/Px/AATffwDYoH8Am0J/AFfEfgA2Jn4AVmh9APSKfAAyjnsAbnJ6AM43eQDA3ncAgGd2AITSdAAcIHMAylBxAPBkbwAWXW0AuzlrAGj7aACuomYAITBkAGikYQAYAF8A8ENcAIRwWQCmhlYAAIdTAFhyUAB4SU0AIw1KADK+RgB2XUMAyOs/AAVqPAAW2TgA0jk1ADSNMQAa1C0AfA8qAEpAJgB4ZyIA/oUeANucGgACrRYAeLcSADe9DgBDvwoAmb4GAEC8AgAxuf4AfLb6ABS19gAItvIAT7ruAPLC6gDr0OYAOOXiANcA3wDGJNsA81HXAGaJ0wD6y88AuhrMAH92yAA+4MQA3VjBADzhvQA+eroAvCS3AIjhswB/sbAAY5WtAAaOqgAknKcAfMCkAMb7oQC6Tp8A97mcADY+mgAE3JcABpSVAM5mkwDeVJEA0F6PAAiFjQAWyIsAVCiKAD6miAAnQocAcfyFAGjVhABYzYMAiuSCACobggB8cYEAnOeAALZ9gADiM4AALgqAAKwAgABcF4AAMk6AACylgAAmHIEAEbOBALppggD8P4MAnDWEAGBKhQD9fYYAL9CHAJJAiQDezooAlnqMAGdDjgDMKJAAVCqSAH5HlAC4f5YAg9KYADg/mwBQxZ0AEGSgAOQaowAP6aUA5c2oAKzIqwCa2K4A+vyxAOw0tQC+f7gAety7AGhKvwCSyMIAJVbGADvyyQDim80AQVLRAE4U1QA34dgA5rfcAIWX4AD8fuQAZm3oAL1h7AD+WvAAN1j0AFRY+ABmWvwAYF0AAEFgBAAMYggAtmEMAEleEAC4VhQAD0oYAEU3HABnHSAAdPsjAHLQJwBwmysAclsvAJIPMwDRtjYAWlA6ACnbPQB3VkEAUMFEANwaSABPYksAwZZOAHq3UQCew1QAcrpXADqbWgAyZV0AthdgAAKyYgCLM2UAk5tnAJXpaQDyHGwAGTVuAJIxcADMEXIAWdVzAMR7dQCiBHcAkm94ADq8eQA/6noAYPl7AFDpfADWuX0Av2p+ANr7fgAKbX8AKL5/ACvvfwD+/38An/B/ABnBfwBmcX8AtgF/AAVyfgCTwn0Ad/N8APgEfAA993oAoMp5AFh/eADIFXcARo51ACzpcwD4JnIA/EdwANlMbgDiNWwAyQNqAPa2ZwAWUGUAvc9iAIA2YAAehV0AKrxaAG7cVwCU5lQAYdtRAJi7TgAGiEsAaEFIALLoRACSfkEACwQ+AOB5OgAH4TYAWDozANWGLwBMxysA1PwnADooJACYSiAAzmQcAOJ3GADRhBQAk4wQAC6QDACikAgA6I4EABGMAAAQifwA8Ib4ALaG9ABUifAA4o/sAEqb6ACYrOQAx8TgAMzk3ACqDdkAUUDVALh90QDUxs0AjhzKANl/xgCW8cIAsnK/AAgEvAB2prgA3Fq1APwhsgC//K4A1uurABnwqABCCqYABjujACSDoABC450ADFybACrumAAympYAuGCUAFpCkgCEP5AA3FiOALiOjACs4YoACFKJAEbghwC0jIYAsFeFAIRBhAB4SoMAyXKCAK66gQBTIoEA4KmAAHVRgAAmGYAABAGAAAoJgABMMYAAp3mAABrigACJaoEAwRKCALXaggAVwoMAusiEAF3uhQCwMocAZJWIACgWigCGtIsANHCNAKJIjwB4PZEAGk6TAB16lQDnwJcA5iGaAIycnAAjMJ8AIdyhAMSfpABkeqcASmuqAK5xrQDijLAAA7yzAF7+tgAOU7oASLm9ACwwwQDZtsQAdEzIAA3wywDBoM8AnV3TALUl1wAQ+NoAwdPeAMC34gAqo+YA5JTqABOM7gCWh/IAh4b2ANaH+gCCiv4Ak40CAPiPBgC/kAoA044OAEuJEgAKfxYAMm8aAKNYHgCAOiIAtxMmAGLjKQCAqC0AI2IxAF0PNQA5rzgA20A8AFDDPwDANUMAQ5dGAAznSQA4JE0ABk5QAJdjUwA8ZFYAFk9ZAI8jXADH4F4AMoZhAA4TZADAhmYArOBoADQgawDMRG0A7E1vAAg7cQCxC3MAZL90AL5VdgBWzncAyyh5AMhkegD8gXsAIYB8APZefQBEHn4A2L1+AI89fwBCnX8A4tx/AFT8fwCc+38Ardp/AJ6ZfwBvOH8ASrd+AEIWfgCCVX0AQ3V8ALB1ewAWV3oAtBl5ANy9dwDuQ3YANqx0ADT3cgA6JXEA1jZvAHUsbQCgBmsA4MVoAMZqZgDs9WMA7GdhAHDBXgAYA1wApi1ZAL5BVgApQFMApClQAPL+TADpwEkATnBGAP4NQwDSmj8ApBc8AFyFOADc5DQADTcxAOF8LQA/tykAJOclAIANIgBHKx4AgUEaABRRFgAWWxIAc2AOADRiCgBbYQYA4l4CANZb/gAwWfoA+Vf2ACtZ8gDQXe4A42bqAGR15gBViuIAp6beAGXL2gB3+dYA4DHTAIp1zwBsxcsAbCLIAICNxAB/B8EAXJG9AOorugAI2LYAjJazAEposAAITq0AmEiqALBYpwAaf6QAgryhAKYRnwAef5wAsAWaANCllwBGYJUAejWTABYmkQCLMo8AZluNABChiwACBIoAoISIAEgjhwBY4IUAHryEAOK2gwDu0IIAbgqCAKJjgQCo3IAArnWAAMEugAD/B4AAZgGAAAQbgADGVIAAq66AAI4ogQBcwoEA5nuCAAhVgwB5TYQAFmWFAHWbhgBw8IcAjWOJAIj0igDuoowAWW6OAFVWkABkWpIACXqUALW0lgDgCZkA7nibAEMBngBCoqAANlujAH4rpgBYEqkAEg+sAOYgrwATR7IAyYC1AEHNuACYK7wACpu/AKEawwCTqcYA60bKAMbxzQA9qdEAVGzVACY62QC0Ed0AD/LgADba5AA0yegABb7sALG38AA0tfQAjLX4AL23/AC/ugAAkL0EADi/CAChvgwA37oQAOWyFACypRgAVZIcAMB3IAAEVSQAKCkoACrzKwAqsi8AHmUzADILNwBjozoA3Cw+ALCmQQD+D0UA82dIAKytSwBm4E4APv9RAIAJVQBa/lcAE91aAPikXQBFVWAAZO1iAJZsZQBP0mcA5x1qANBObAB9ZG4AZF5wAAo8cgD2/HMAtKB1AOAmdwASj3gA8th5AC4EewB7EHwAkP18AD7LfQA+eX4AeQd/ALt1fwDyw38ABvJ/AO7/fwCg7X8AL7t/AJJofwD29X4AYmN+AAyxfQAU33wAvO17AC7degDGrXkAuV94AGzzdgA0aXUAc8FzAJj8cQAOG3AAVh1uAOsDbABWz2kAJIBnAOwWZQBClGIA2PhfAD5FXQA7eloAbZhXAJ6gVACCk1EA5nFOAIs8SwBI9EcA6plEAEwuQQBJsj0AwyY6AJyMNgC75DIAEjAvAIdvKwARpCcApM4jADLwHwC7CRwANxwYAJ0oFAD8LxAAOzMMAHkzCACVMQQAsi4AALkr/AC+KfgAtSn0AK4s8ACYM+wAhT/oAGlR5AA+auAAD4vcAL+02ABa6NQAxybRAP5wzQDsx8kAeyzGAJafwgAiIr8A/bS7AAVZuAATD7UA9texAIq0rgCEpasAwquoAOjHpQDM+qIADkWgAGKnnQB6IpsA5LaYAFRllgBILpQAZhKSABwSkAAELo4AhmaMABq8igAwL4kAJsCHAFZvhgAgPYUAximEAI01gwDCYIIAfquBABEWgQCDoIAAA0uAAKAVgABoAIAAYguAAIo2gADUgYAAMe2AAH54gQCoI4IAau6CALLYgwAi4oQAlgqGAK1RhwAlt4gAmDqKAKzbiwD1mY0AAnWPAF5skQCLf5MA/K2VADP3lwCKWpoAfNecAFRtnwB+G6IAPeGkAPC9pwDLsKoAJrmtACbWsAAYB7QAJEu3AHKhugA+Cb4AlYHBAKsJxQCVoMgAZUXMAET3zwAqtdMAPn7XAHxR2wD2Ld8AsRLjALH+5gD98OoAlejuAHbk8gCn4/YAIOX6AODn/gDv6gIANe0GAMrtCgCV6w4ApuUSAPTaFgCCyhoAVrMeAGyUIgDUbCYAkzsqAKz/LQBAuDEAQmQ1AOYCOQArkzwANBRAACaFQwAU5UYANDNKAKpuTQCkllAAWapTAAipVgDmkVkAQmRcAGAfXwCMwmEALk1kAIu+ZgAWFmkANlNrAEt1bQDwe28AcGZxAIU0cwCJ5XQAO3l2ABLvdwDKRnkA/H96AGCaewCvlXwAqHF9ABYufgDIyn4Akkd/AGKkfwAP4X8Amv1/APH5fwAY1n8AGpJ/AAcufwDzqX4ADgZ+AGpCfQBTX3wA6Fx7AIA7egBW+3gAwJx3ABQgdgCyhXQABM5yAHb5cAB/CG8AmftsAErTagAkkGgApjJmAIK7YwA8K2EAkIJeABnCWwCQ6lgArfxVACT5UgDG4E8ARLRMAIZ0SQBCIkYAZr5CALlJPwAixTsAhzE4AMWPNADO4DAAjiUtAO5eKQDrjSUAc7MhAITQHQAS5hkAIvUVAKX+EQCpAw4AHwUKABkEBgCFAQIAe/79AOb7+QDj+vUAVfzxAFwB7gDeCuoA7hnmAHwv4gCMTN4AFnLaABKh1gBy2tIANB/PADdwywB9zscA2jrEAEm2wACcQb0Au925AH6LtgC3S7MAPR+wANsGrQBUA6oAcBWnAOY9pABwfaEAwtSeAINEnABUzZkA4m+XALAslQBsBJMAfveQAIwGjwD8MY0AS3qLAPDfiQA8Y4gArQSHAIDEhQAVo4QAsqCDAI+9ggD6+YEABlaBAP7RgADjbYAA6CmAABEGgABkAoAA8x6AAJ1bgABtuIAAOjWBAOjRgQBajoIAT2qDAKFlhAAEgIUANrmGAO0QiADIhokAchqLAILLjACGmY4AHISQAKuKkgDQrJQA6OmWAHRBmQDWspsAbj2eAKXgoAC8m6MAGm6mAPhWqQCmVawAXmmvAFWRsgDOzLUA6Bq5AN56vADK678A1WzDABr9xgC+m8oAv0fOAFYA0gBrxNUAL5PZAJFr3QCtTOEAfDXlAA0l6QBbGu0AaRTxADgS9QDIEvkAFRX9AB0YAQDhGgUAWRwJAIgbDQBuFxEAAQ8VAFABGQBO7RwAC9IgAIKuJADEgSgA1EosAL8IMACYujMAbF83AFX2OgBqfj4AxPZBAIxeRQDetEgA5vhLANwpTwDXRlIAOk9VAApCWADIHlsAfuRdAK6SYACGKGMAcaVlANQIaAD9UWoAeoBsAKCTbgD8inAADmZyAFIkdABqxXUA2kh3AFKueABs9XkA2h17AFQnfACQEX0AXtx9AH6HfgDSEn8AKX5/AHnJfwCc9H8AmP9/AGLqfwD6tH8AgF9/AO7pfgCAVH4AQJ99AHDKfAA+1nsA3sJ6AKuQeQDYP3gA0tB2AORDdQB6mXMA/tFxAOLtbwCc7W0AttFrAK2aaQAaSWcAit1kAJpYYgD2ul8AMgVdABY4WgBBVFcAeVpUAHtLUQAEKE4A8vBKAPamRwAJS0QA2d1AAG5gPQCB0zkAFzg2AAKPMgA42S4AqBcrADxLJwD2dCMAv5UfAJiuGwB8wBcAZMwTAFfTDwBI1gsARNYHAETUAwBR0f8AZ877AIzM9wDBzPMACNDvAF/X6wDM4+cAQ/bjAM4P4ABeMdwA7lvYAHiQ1ADxz9AAQBvNAGhzyQA82cUAt03CALTRvgAVZrsAuAu4AHbDtAAajrEAfmyuAGJfqwCSZ6gAx4WlAMC6ogAqB6AAvGudABXpmgDcf5gAqjCWABT8kwCs4pEA8OSPAGkDjgCOPowAypaKAJYMiQBEoIcAPVKGANEihQBEEoQA7CCDAPROggCcnIEADgqBAGmXgADWRIAAXBKAABQAgAD6DYAADjyAAESKgACI+IAAwIaBAMY0ggBtAoMAhu+DANP7hAAMJ4YA8HCHACDZiABKX4oADQOMAPPDjQCeoY8AgpuRADCxkwAZ4pUAsi2YAGiTmgCfEp0At6qfAAxbogDqIqUAqAGoAH72qgDDAK4Amh+xAFRStAAMmLcAAvC6AFBZvgAm08EAmlzFAND0yADimswA1U3QANcM1ADY1tcA+qrbAEOI3wCpbeMAT1rnABpN6wAiRe8AXUHzAMpA9wBwQvsAP0X/AEVIAwBySgcAzkoLAE5IDwD8QRMAyzYXAMslGwDxDR8AS+4iANrFJgCskyoAxFYuADoOMgAUuTUAbVY5AGDlPAD2ZEAAaNRDAL8yRwA3f0oA7LhNABzfUADs8FMAqO1WAIXUWQDGpFwAwl1fALv+YQARh2QAI/ZmAEhLaQD5hWsAm6VtAKypbwCmkXEAEl1zAHkLdQBwnHYAlg94AINkeQDxmnoAgrJ7APuqfAAYhH0Apz1+AG3XfgBcUX8AM6t/AADlfwCY/n8AAvh/AD/RfwBTin8AViN/AGCcfgCQ9X0AFC99ABxJfADkQ3sAph96ALrceABee3cAAPx1AO9edACapHIAdc1wAOjZbgCIymwAvJ9qACxaaABU+mUA3oBjAF3uYAB9Q14A5oBbAE6nWABst1UA9LFSALqXTwBwaUwA+ydJABbURQCkbkIAgPg+AIFyOwCT3TcAljo0AHSKMAAiziwAiAYpAJs0JQBaWSEAqnUdAJ2KGQAemRUALaIRANemDQAGqAkA0qYFACikAQAfof0ApJ75AM2d9QCMn/EA7KTtAOiu6QCEvuUAtdThAIPy3QDbGNoAwEjWACCD0gDzyM4AJBvLAKV6xwBa6MMAL2XAAALyvACwj7kAGj+2AAsBswBe1q8A17+sAEC+qQBe0qYA4vyjAJY+oQAOmJ4AGwqcADSVmQAkOpcAXvmUAIvTkgAsyZAAwtqOANAIjQDIU4sAEryJACZCiABI5oYA7qiFAE2KhADAioMAe6qCAMDpgQC2SIEAkMeAAGRmgABQJYAAaASAAKgDgAAgI4AAvmKAAHDCgAAqQoEAuuGBAAqhggDgf4MAAn6EADubhQAy14YArjGIAD6qiQCcQIsAUvSMAPXEjgAYspAAMLuSAM3flABUH5cAQHmZAPHsmwDSeZ4ANB+hAHbcowDmsKYAxpupAGmcrAD6sa8AyNuyAPUYtgC6aLkAQsq8ALA8wAAmv8MAxVDHAKTwygDcnc4AgVfSAJ8c1gBG7NkAhMXdAFen4QDWkOUA7oDpALx27QAocfEARW/1AARw+QBxcv0AeXUBAC54BQB4eQkAaXgNAO9zEQAaaxUA1lwZAEFIHQA+LCEA8gclAEnaKABloiwAPF8wAPYPNACKszcAKEk7ANTPPgC4RkIA8qxFAKQBSQD5Q0wAJHNPAEuOUgC8lFUAmIVYAEBgWwDcI14A3M9gAHZjYwAa3mUAGT9oAOOFagDisWwAjsJuAFq3cADQj3IAdkt0ANrpdQCcancATs14AKYRegBFN3sA6j18AE4lfQA67X0AfJV+AOMdfwBahn8Atc5/APL2fwAA/38A2OZ/AI2ufwAeVn8Art1+AFBFfgA6jX0AhrV8AH6+ewBOqHoATHN5ALwfeAD2rXYAVh51AERxcwAop3EAeMBvAKq9bQBGn2sAzmVpANgRZwDxo2QAvhxiAN58XwD5xFwAwPVZAOYPVwAoFFQARANRAADeTQAqpUoAhVlHAPz7QwBKjUAAaw49ACeAOQBy4zUALTkyAEeCLgCvvyoAVvImADQbIwA6Ox8AZ1MbALZkFwAfcBMAqnYPAEx5CwAPeQcA8HYDAPFz/wAVcfsAYG/3ANJv8wBrc+8AM3vrABqI5wA1m+MAZ7XfAMTX2wAvA9gAsTjUAC950ACkxcwA/B7JAByGxQD7+8EAZoG+AFcXuwCRvrcA/Xe0AGhEsQCeJK4AbBmrAJQjqADTQ6UA5XqiAH7JnwBEMJ0A6q+aAAlJmAA4/JUAHcqTACmzkQAAuI8ADNmNANIWjAC6cYoAO+qIAKKAhwBmNYYAvgiFAAz7gwCGDIMAcD2CAPeNgQBO/oAAl46AAOk+gABgD4AAAgCAANUQgADYQYAA95KAACQEgQBClYEAKkaCALAWgwCiBoQAvhWFAMhDhgBukIcAXPuIAD+EigClKowANO6NAHDOjwDkypEAEOOTAGsWlgBqZJgAesyaAPpNnQBO6J8AypqiAMlkpQCMRagAYjyrAIhIrgA8abEAtJ20ACLltwCvPrsAjKm+ANAkwgCur8UAKUnJAHPwzACKpNAAkWTUAI4v2ACMBNwAnOLfALfI4wDztecARqnrALmh7wBInvMA9p33AL2f+wCiov8AmaUDAKqnBwDNpwsA/qQPAEaeEwCYkhcAA4EbAH5oHwAYSCMAyR4nALLrKgC/rS4AH2QyAMQNNgDbqTkAbTc9AJu1QACCI0QASIBHAAzLSgAMA04AYidRAFU3VAAeMlcA6hZaACTlXADqm18AtjpiAMPAZAB/LWcARYBpAIa4awCq1W0ANNdvAJq8cQBohXMAJTF1AGy/dgDSL3gAA4J5AKC1egBkynsABMB8AEWWfQDwTH4A2uN+ANRafwDOsX8ApOh/AFT/fwDQ9X8AIcx/AEmCfwBiGH8AiI5+ANDkfQB9G30AozJ8AJoqewCOA3oA2r14AMNZdwCp13UA7Dd0APZ6cgAzoXAAIKtuADOZbAD6a2oA+iNoAM7BZQAFRmMASbFgADgEXgCEP1sA3WNYAPpxVQCcalIAgk5PAHYeTABG20gAwoVFAMQeQgAkpz4Avx87AIOJNwBG5TMABTQwAJx2LAAMrigAOtskACn/IADHGh0AFi8ZAA89FQCvRREA+kkNAOhKCQCJSQUAyUYBAMZD/QBjQfkAvkD1AMpC8QCGSO0AAFPpACRj5QACeuEAiJjdALa/2QCG8NUA4yvSANByzgAqxsoA7CbHAPuVwwA3FMAAiqK8ANBBuQDa8rUAirayAKmNrwD9eKwAX3mpAHSPpgAYvKMA4v+gAJ1bngDaz5sAVV2ZAJgElwBFxpQA6KKSABKbkAA0r44A6N+MAHktiwCAmIkAQiGIAC7IhgCYjYUAyHGEABB1gwCol4IAy9mBAKg7gQBmvYAAJl+AAAAhgAD/AoAANAWAAJEngAAgaoAAucyAAFxPgQDO8YEAArSCAKyVgwCsloQArraFAHL1hgCqUogA+c2JAAJniwBeHY0AoPCOAE7gkADz65IAAhOVAPhUlwBCsZkARCecAGS2ngD8XaEAXh2kAOPzpgDB4KkAVuOsAMb6rwBgJrMAQmW2ALW2uQDGGb0AvI3AAJQRxACOpMcAqUXLABD0zgDGrtIA53TWAHRF2gCIH94AFALiADns5QDg3OkAJNPtAPDN8QBVzPUASM35AMrP/QDa0gEAc9UFAJTWCQBA1Q0AbNARACHHFQBYuBkAHKMdAGSGIQBKYSUAuzIpANv5LACmtTAAMGU0AJAHOADYmzsAHiE/AIuWQgAx+0UAQ05JAOOOTABEvE8AktVSABLaVQDzyFgAiaFbAApjXgDWDGEAMp5jAIkWZgArdWgAjrlqABPjbAA+8W4Ae+NwAFi5cgBYcnQAEg52ABeMdwAQ7HgAmy16AG5QewBAVHwAxzh9ANj9fQAyo34Atih/AECOfwCy038ABPl/AB/+fwAR438A06d/AIFMfwAi0X4A5jV+AOp6fQBcoHwAfKZ7AHyNegCwVXkAXP93ANyKdgCM+HQAzkhzABh8cQDQkm8AgI1tAJpsawC6MGkAWtpmAChqZACq4GEAlj5fAIqEXAA+s1kAWstWAK3NUwDiulAA0JNNADtZSgDuC0cAzKxDAJk8QABJvDwArSw5ALKONQA84zEAPisuAJ9nKgBdmSYAXMEiAKjgHgAk+BoA5ggXAM4TEwD2GQ8AShwLANYbBwCZGQMAkRb/AMYT+wA5EvcA6RLzANkW7wAMH+sAfCznAC5A4wAYW98AOX7bAIqq1wD74NMAjCLQAB5wzACwysgAHjPFAFuqwQBAMb4Auci6AJBxtwCyLLQA3PqwAO3crQCh06oAxN+nAA8CpQA+O6IAAIyfAAb1nAD0dpoAahKYAAXIlQBUmJMA64ORAEeLjwDuro0AU++LAOpMigAayIgASGGHAMYYhgD27oQAEOSDAGb4ggAuLIIAlH+BANjygAABhoAARjmAAKMMgAA4AIAA8hOAAOhHgADqm4AACBCBAASkgQDTV4IANCuDAP4dhADuL4UAwmCGAC6whwDYHYkAbqmKAIBSjACvGI4AgPuPAH/6kQApFZQA+EqWAFibmADDBZsAhImdABomoAC82qIA1KalAKSJqABsgqsAgJCuAAKzsQA/6bQAWzK4AIKNuwDq+b4AoHbCANoCxgCknckAHEbNAFr70ABkvNQAWIjYAC9e3AAIPeAA0iPkAKgR6AB6BewAWf7vADz78wAi+/cAE/37AP7//wDwAgQA3AQIAMYEDACmARAAhvoTAFjuFwAu3BsA+MIfANGhIwCodycAnUMrAKYELwDkuTIAWmI2ACn9OQBdiT0AGgZBAHpyRACmzUcAwhZLAPxMTgCEb1EAkH1UAF52VwAsWVoAQiVdAOrZXwB4dmIAQPpkAKZkZwAItWkA2OprAIAFbgCCBHAATudxAIKtcwCQVnUAK+J2ANBPeAA/n3kAENB6AATiewDK1HwAMah9APdbfgD9734AEGR/AB64fwAI7H8Azv9/AFjzfwC+xn8A/Hl/ACoNfwBsgH4A0NN9AJ4HfQDrG3wADxF7ADbneQC6nngA5jd3ABWzdQCtEHQAElFyALl0cAAWfG4ArGdsAPg3agCa7WcACIllAAALYwD6c2AAyMRdAOr9WgBCIFgAWixVABgjUgAfBU8AUtNLAGyOSABMN0UAvc5BAKZVPgDizDoAUDU3AOGPMwB23S8AAR8sAHpVKADFgSQA6aQgANK/HACC0xgA9uAUACbpEAAX7QwAx+0IADvsBABs6QAAa+b8ACfk+AC44/QACubwADDs7AAd9+gA2QflAFsf4QCiPt0ApWbZAF+Y1QDE1NEAwBzOAFJxygBQ08YAu0PDAGLDvwA4U7wADvS4AMimtQAvbLIAHEWvAFgyrACgNKkAyEymAHJ7owBswaAAVB+eANqVmwClJZkARs+WAGeTlAB/cpIAMG2QAOqDjgAvt4wAdgeLACJ1iQCmAIgAT6qGAIRyhQCFWYQAol+DABmFggAYyoEA3S6BAICzgAAuWIAA7hyAAOEBgAD8BoAATiyAAMFxgABI14AAz1yBACgCggA5x4IAwKuDAJKvhABk0oUA8ROHAOhziADw8YkApo2LAKtGjQCCHI8AxA6RAOockwB0RpUA1YqXAHjpmQDMYZwALPOeAPScoQB6XqQACjenAO8lqgBtKq0AvkOwAB1xswC9sbYAzgS6AHZpvQDh3sAAKmTEAG74xwDRmssAWErPACkG0wBBzdYAup7aAJl53gDkXOIAqUfmAN846gCVL+4AvyryAG4p9gCJKvoAKi3+ADQwAgC5MgYAqzMKAA8yDgDeLBIAHSMWAMoTGgDp/R0AeuAhAIy6JQAXiykAPVEtAO4LMQBWujQAdls4AGXuOwBOcj8AMeZCAFFJRgC5mkkAo9lMADgFUACtHFMAOh9WACIMWQCe4lsAB6JeAJpJYQC92GMAvk5mAAiraAD97GoADhRtALIfbwBfD3EApOJyAPyYdAAIMnYAVq13AI4KeQBRSXoAV2l7AFFqfAAATH0AMQ5+AKSwfgBGM38A45V/AGzYfwDO+n8A//x/AADffwDcoH8AmEJ/AFrEfgAzJn4AWWh9AO+KfAA4jnsAaHJ6ANQ3eQC63ncAhmd2AIDSdAAgIHMAxVBxAPRkbwAUXW0AvTlrAGb7aACuomYAIjBkAGikYQAYAF8A7kNcAIZwWQCmhlYA/4ZTAFpyUAB2SU0AJA1KADK+RgB2XUMAx+s/AAhqPAAS2TgA1jk1ADKNMQAa1C0AfQ8qAEhAJgB6ZyIA/oUeANqcGgACrRYAebcSADa9DgBEvwoAmb4GAD68AgA0uf4Aerb6ABW19gAHtvIAUbruAPDC6gDs0OYANuXiANoA3wDEJNsA9VHXAGSJ0wD6y88AuhrMAH92yAA+4MQA31jBADrhvQBAeroAuCS3AIzhswB8sbAAZpWtAASOqgAlnKcAesCkAMr7oQC2Tp8A+rmcADU+mgAC3JcACpSVAMhmkwDmVJEAyF6PAA6FjQARyIsAVyiKAD6miAAnQocAcPyFAGjVhABYzYMAiuSCACsbggB8cYEAnOeAALZ9gADgM4AAMAqAAKwAgABcF4AAMk6AACqlgAApHIEADrOBAL1pggD6P4MAnjWEAF5KhQD/fYYALNCHAJZAiQDZzooAmnqMAGZDjgDKKJAAWCqSAHhHlAC8f5YAgdKYADw/mwBMxZ0AEmSgAOIaowAQ6aUA5s2oAKvIqwCa2K4A+fyxAO80tQC7f7gAfNy7AGhKvwCPyMIAKVbGADfyyQDlm80APlLRAFIU1QAy4dgA7bfcAH2X4AACf+QAY23oAL5h7AD/WvAANVj0AFZY+ABkWvwAY10AAD5gBAAOYggAtWEMAEleEAC4VhQAD0oYAEY3HABmHSAAdfsjAG/QJwBzmysAcFsvAJMPMwDTtjYAVVA6AC7bPQB0VkEAUsFEANwaSABQYksAwJZOAHy3UQCaw1QAeLpXADObWgA6ZV0ArRdgAAqyYgCFM2UAlptnAJTpaQDyHGwAGjVuAJIxcADKEXIAW9VzAMN7dQCiBHcAlG94ADa8eQBC6noAX/l7AE/pfADZuX0Au2p+AN77fgAGbX8ALL5/ACnvfwD9/38AovB/ABTBfwBucX8ArgF/AApyfgCQwn0AevN8APYEfAA+93oAnsp5AFp/eADJFXcARI51AC7pcwD0JnIAAEhwANZMbgDkNWwAyANqAPa2ZwAZUGUAuc9iAIM2YAAbhV0ALLxaAG7cVwCU5lQAYdtRAJm7TgACiEsAbkFIAKzoRACYfkEABQQ+AOZ5OgAA4TYAYTozAMyGLwBUxysAzfwnAEAoJACUSiAA0GQcAOB3GADUhBQAkIwQADGQDACfkAgA6o4EABGMAAAOifwA9Ib4ALGG9ABZifAA34/sAEub6ACYrOQAyMTgAMrk3ACrDdkAUkDVALZ90QDVxs0AjxzKANV/xgCb8cIArnK/AAoEvAB2prgA2Vq1AAAisgC7/K4A2uurABbwqABECqYABDujACaDoAA+450AElybACbumAA0mpYAuGCUAFZCkgCJP5AA2FiOALyOjACo4YoADFKJAELghwC4jIYArFeFAIhBhAB2SoMAynKCAKy6gQBUIoEA4KmAAHZRgAAlGYAAAgGAAA4JgABIMYAAq3mAABjigACIaoEAxBKCALHaggAawoMAtsiEAGDuhQCsMocAaJWIACQWigCKtIsAMXCNAKRIjwB1PZEAHE6TAB56lQDkwJcA6iGaAIecnAAoMJ8AH9yhAMOfpABmeqcASGuqALFxrQDejLAABryzAF7+tgANU7oASbm9ACkwwQDctsQAckzIAA7wywDAoM8Anl3TALQl1wAS+NoAvtPeAMO34gAmo+YA6ZTqAA6M7gCbh/IAhIb2ANaH+gCDiv4Ako0CAPqPBgC+kAoA1I4OAEiJEgAOfxYALm8aAKZYHgB+OiIAuBMmAGPjKQB+qC0AJmIxAFkPNQA+rzgA1kA8AFXDPwC7NUMASJdGAAnnSQA6JE0ABE5QAJljUwA4ZFYAHE9ZAIojXADJ4F4AMoZhAA0TZADChmYAquBoADYgawDKRG0A7k1vAAc7cQCwC3MAZr90ALxVdgBYzncAyCh5AMxkegD4gXsAJIB8APRefQBEHn4A271+AIw9fwBEnX8A4Nx/AFb8fwCa+38AsNp/AJuZfwBxOH8ASrd+AD4WfgCIVX0APXV8ALZ1ewARV3oAthl5AN29dwDsQ3YAOax0ADD3cgA8JXEA1zZvAHQsbQCgBmsA4MVoAMZqZgDs9WMA7WdhAG3BXgAcA1wAoi1ZAMJBVgAmQFMApilQAPL+TADmwEkAUnBGAPoNQwDWmj8AoRc8AF6FOADb5DQADjcxAN98LQBBtykAIuclAIINIgBGKx4AgEEaABZRFgAUWxIAdGAOADRiCgBaYQYA5F4CANVb/gAxWfoA9lf2AC5Z8gDPXe4A42bqAGZ15gBRiuIAqqbeAGPL2gB4+dYA3zHTAIt1zwBpxcsAcSLIAHqNxACFB8EAWJG9AOwrugAG2LYAjpazAEhosAAKTq0AlkiqALBYpwAcf6QAgLyhAKgRnwAef5wArgWaANKllwBEYJUAfDWTABQmkQCNMo8AZFuNABKhiwACBIoAnoSIAEkjhwBX4IUAILyEAOK2gwDs0IIAcAqCAKBjgQCr3IAAq3WAAMMugAD9B4AAaAGAAAIbgADIVIAAqa6AAI8ogQBcwoEA53uCAAZVgwB6TYQAFWWFAHibhgBt8IcAj2OJAIX0igDyoowAVm6OAFhWkABiWpIACHqUALi0lgDcCZkA8HibAEQBngBAoqAAOVujAHorpgBcEqkADg+sAOogrwAQR7IAy4C1AD/NuACaK7wACJu/AKEawwCWqcYA5kbKAMvxzQA5qdEAVWzVACc62QC0Ed0ADvLgADja5AAxyegACL7sAK+38AA0tfQAjrX4ALq3/ADCugAAjr0EADi/CAChvgwA4boQAOKyFAC0pRgAVJIcAL93IAAIVSQAIikoAC/zKwAmsi8AImUzADALNwBiozoA3iw+AKymQQAEEEUA7mdIALCtSwBi4E4AQP9RAIAJVQBa/lcAFN1aAPakXQBGVWAAY+1iAJhsZQBO0mcA6B1qAM5ObAB+ZG4AZF5wAAo8cgD4/HMAsqB1AOAmdwASj3gA8Nh5ADIEewB4EHwAkv18ADzLfQA+eX4Aegd/ALt1fwDyw38ABvJ/AOz/fwCk7X8AK7t/AJVofwD09X4AY2N+AAyxfQAU33wAvO17AC7degDHrXkAtl94AHDzdgAyaXUAdMFzAJb8cQAPG3AAVR1uAO4DbABTz2kAJYBnAOwWZQBClGIA2fhfAD1FXQA8eloAbJhXAJ2gVACEk1EA5HFOAI08SwBI9EcA6JlEAE4uQQBIsj0AwyY6AJyMNgC85DIAETAvAIdvKwASpCcAos4jADTwHwC5CRwAOBwYAJ4oFAD6LxAAPjMMAHQzCACaMQQAri4AAL0r/AC6KfgAuSn0AKks8ACdM+wAgj/oAGpR5AA/auAADIvcAMK02ABZ6NQAyCbRAP5wzQDqx8kAfCzGAJWfwgAmIr8A+LS7AAhZuAARD7UA99exAIq0rgCFpasAvquoAO7HpQDI+qIADkWgAGWnnQB2IpsA5raYAFRllgBILpQAZRKSAB4SkAABLo4AiGaMABq8igAwL4kAJcCHAFhvhgAfPYUAxSmEAI81gwC/YIIAgquBAA8WgQCCoIAABkuAAJwVgABtAIAAXguAAIw2gADUgYAALu2AAIR4gQCgI4IAcu6CAKvYgwAm4oQAlAqGAK9RhwAkt4gAmTqKAKrbiwD2mY0AAnWPAF5skQCLf5MA/K2VADT3lwCKWpoAetecAFRtnwB+G6IAPuGkAPC9pwDMsKoAI7mtACjWsAAYB7QAI0u3AHShugA8Cb4AlIHBAK4JxQCQoMgAbEXMAD33zwAwtdMAOX7XAIBR2wDyLd8AtRLjAK/+5gD+8OoAlejuAHXk8gCp4/YAHuX6AOTn/gDp6gIAO+0GAMbtCgCY6w4ApeUSAPPaFgCEyhoAU7MeAG6UIgDVbCYAkDsqALD/LQA6uDEARmQ1AOcCOQAokzwAOBRAACKFQwAW5UYANjNKAKZuTQCmllAAWqpTAAapVgDpkVkAPmRcAGIfXwCOwmEALE1kAIu+ZgAWFmkANFNrAFF1bQDpe28AdmZxAH40cwCQ5XQANnl2ABbvdwDHRnkA/X96AGCaewCwlXwApnF9ABgufgDEyn4AmEd/AF6kfwAR4X8Amf1/APD5fwAa1n8AGJJ/AAkufwDyqX4ADgZ+AGpCfQBSX3wA6lx7AH87egBX+3gAvZx3ABYgdgCyhXQABc5yAHX5cAB/CG8AmPtsAEzTagAikGgAqDJmAIC7YwA+K2EAjoJeABvCWwCQ6lgAq/xVACb5UgDE4E8ASLRMAIJ0SQBGIkYAYr5CALpJPwAkxTsAhDE4AMmPNADM4DAAjiUtAO5eKQDrjSUAdLMhAILQHQAV5hkAHvUVAKn+EQCmAw4AIQUKABcEBgCHAQIAef79AOr7+QDe+vUAWfzxAFoB7gDfCuoA7RnmAH0v4gCLTN4AGHLaAA+h1gB02tIAMh/PADlwywB7zscA2zrEAEm2wACbQb0Avt25AHmLtgC8S7MAOh+wANwGrQBUA6oAcBWnAOY9pABwfaEAxNSeAH5EnABbzZkA3G+XALQslQBpBJMAf/eQAIwGjwD7MY0ATnqLAOzfiQBAY4gAqgSHAIHEhQAVo4QAsqCDAJC9ggD4+YEACFaBAPzRgADkbYAA6SmAAA4GgABoAoAA8B6AAJ1bgABuuIAAODWBAOzRgQBWjoIAVGqDAJtlhAAIgIUANbmGAOwQiADKhokAcBqLAILLjACKmY4AFoSQALGKkgDKrJQA7OmWAHJBmQDWspsAcj2eAJ7goADDm6MAFW6mAPxWqQCkVawAXWmvAFiRsgDMzLUA6Rq5ANx6vADL678A1GzDAB79xgC3m8oAxkfOAFEA0gBuxNUALZPZAJFr3QCtTOEAfTXlAAwl6QBcGu0AZhTxADsS9QDHEvkAFRX9AB0YAQDhGgUAWBwJAIwbDQBpFxEABQ8VAEwBGQBS7RwAB9IgAIauJADBgSgA1UosAMAIMACWujMAbl83AFT2OgBpfj4Ax/ZBAIheRQDitEgA5fhLANopTwDbRlIANE9VABBCWADEHlsAguRdAKqSYACIKGMAcaVlANIIaAAAUmoAeIBsAKCTbgD+inAAC2ZyAFUkdABoxXUA20h3AFKueABq9XkA3h17AE4nfACWEX0AWtx9AICHfgDREn8AKn5/AHjJfwCc9H8Amv9/AF7qfwD+tH8AfF9/APLpfgB+VH4AQZ99AHDKfAA81nsA4cJ6AKiQeQDaP3gA0dB2AOZDdQB4mXMAANJxAN/tbwCe7W0AtdFrAK6aaQAbSWcAht1kAKBYYgDuul8AOgVdABA4WgBGVFcAdlpUAHpLUQAIKE4A7PBKAP6mRwAAS0QA4d1AAGdgPQCH0zkAEzg2AASPMgA32S4AqBcrAD1LJwD2dCMAvZUfAJyuGwB3wBcAaswTAFHTDwBM1gsAQtYHAEbUAwBO0f8Aa877AIfM9wDGzPMABNDvAGHX6wDM4+cAQfbjANEP4ABbMdwA8FvYAHqQ1ADsz9AARhvNAGJzyQBA2cUAtU3CALbRvgAUZrsAugu4AHTDtAAajrEAf2yuAGBfqwCUZ6gAxoWlAMC6ogArB6AAumudABfpmgDaf5gArDCWABT8kwCq4pEA8eSPAGoDjgCMPowAzpaKAJEMiQBHoIcAPVKGAM4ihQBIEoQA6CCDAPdOggCcnIEADAqBAGqXgADVRIAAXhKAABQAgAD5DYAADjyAAEOKgACK+IAAwIaBAMQ0ggBvAoMAhO+DANT7hAAMJ4YA8XCHAB7ZiABMX4oACgOMAPbDjQCcoY8AhJuRAC+xkwAY4pUAtC2YAGaTmgCgEp0AuKqfAAlbogDuIqUAowGoAIP2qgC/AK4AnR+xAFJStAAOmLcAAPC6AFJZvgAj08EAnFzFANH0yADfmswA2k3QANIM1ADb1tcA+qrbAECI3wCubeMASlrnAB5N6wAgRe8AXkHzAMpA9wBvQvsAQEX/AEZIAwBwSgcA0EoLAEtIDwD/QRMAyTYXAM0lGwDuDR8ATu4iANjFJgCukyoAwlYuADoOMgAUuTUAb1Y5AF3lPAD4ZEAAaNRDAL4yRwA4f0oA7LhNABrfUADv8FMAqO1WAIHUWQDMpFwAvF1fAL7+YQARh2QAIfZmAEpLaQD4hWsAnKVtAKupbwCmkXEAEl1zAHkLdQBynHYAkg94AIZkeQDwmnoAgrJ7APyqfAAXhH0Apj1+AHDXfgBYUX8ANqt/AADlfwCX/n8ABPh/ADzRfwBUin8AVyN/AGCcfgCQ9X0AEy99AB5JfADgQ3sAqx96ALTceABke3cA/Pt1APBedACcpHIAcs1wAOzZbgCEymwAvZ9qACxaaABW+mUA3IBjAF7uYAB8Q14A5oBbAFGnWABot1UA97FSALaXTwB0aUwA+CdJABjURQCkbkIAfvg+AIRyOwCQ3TcAmDo0AHKKMAAmziwAggYpAKI0JQBTWSEAsHUdAJqKGQAemRUALqIRANamDQAGqAkA0qYFACmkAQAdof0ApZ75AM6d9QCKn/EA7qTtAOeu6QCEvuUAttThAIHy3QDdGNoAvkjWACKD0gDxyM4AJRvLAKR6xwBc6MMALWXAAALyvACyj7kAGD+2AA4BswBc1q8A1r+sAEK+qQBd0qYA4/yjAJQ+oQARmJ4AGAqcADaVmQAiOpcAXvmUAIzTkgAtyZAAwNqOANIIjQDFU4sAGLyJAB5CiABQ5oYA56iFAFGKhADAioMAeKqCAMTpgQC0SIEAkMeAAGRmgABQJYAAZgSAAKwDgAAeI4AAvmKAAHDCgAAoQoEAvOGBAAuhggDef4MABH6EADibhQA214YAqjGIAEKqiQCaQIsAUvSMAPbEjgAWspAAM7uSAMrflABWH5cAQHmZAPDsmwDTeZ4AMR+hAHncowDksKYAyJupAGacrAD8sa8AyNuyAPMYtgC+aLkAPsq8ALI8wAAmv8MAxFDHAKXwygDcnc4AgFfSAKAc1gBF7NkAhcXdAFan4QDXkOUA7oDpALt27QAqcfEAQW/1AAlw+QBscv0Af3UBACh4BQB9eQkAZHgNAPRzEQAUaxUA3VwZADtIHQBCLCEA8AclAEnaKABloiwAPl8wAPIPNACPszcAI0k7ANjPPgC2RkIA9KxFAKIBSQD6Q0wAInNPAE6OUgC5lFUAnIVYADpgWwDhI14A2s9gAHhjYwAY3mUAGj9oAOGFagDmsWwAisJuAFy3cADOj3IAeUt0ANfpdQCfancAS814AKgRegBEN3sA6j18AE4lfQA87X0AeJV+AOcdfwBWhn8AuM5/APL2fwD//n8A2uZ/AImufwAiVn8Aqt1+AFZFfgA1jX0AibV8AHu+ewBQqHoATHN5ALofeAD4rXYAVR51AEVxcwAop3EAdsBvAK29bQBCn2sA1GVpANERZwD2o2QAvRxiANx8XwD8xFwAvfVZAOgPVwAoFFQAQgNRAATeTQAjpUoAjllHAPP7QwBSjUAAZg49ACqAOQBw4zUALjkyAEeCLgCuvyoAWPImADIbIwA7Ox8AZ1MbALVkFwAhcBMAp3YPAE95CwAOeQcA73YDAPJz/wAUcfsAYW/3ANFv8wBtc+8AL3vrAB6I5wAym+MAaLXfAMbX2wAsA9gAszjUAC150ACmxcwA+h7JACCGxQD1+8EAbYG+AFEXuwCUvrcA/ne0AGZEsQChJK4AahmrAJMjqADVQ6UA43qiAIDJnwBDMJ0A66+aAAZJmAA9/JUAF8qTAC6zkQD9t48ADtmNANEWjAC6cYoAO+qIAKOAhwBkNYYAwAiFAAr7gwCIDIMAbz2CAPaNgQBQ/oAAlY6AAOs+gABeD4AABACAANMQgADaQYAA9ZKAACcEgQBAlYEAKkaCALAWgwChBoQAwBWFAMdDhgBukIcAXPuIAD6EigCmKowANO6NAHDOjwDkypEADuOTAG4WlgBoZJgAfMyaAPhNnQBO6J8AzJqiAMdkpQCNRagAYjyrAIhIrgA9abEAsp20ACLltwCyPrsAiKm+ANYkwgCor8UALUnJAHDwzACNpNAAkGTUAI4v2ACMBNwAmuLfALrI4wDytecARqnrALmh7wBInvMA9p33AL2f+wCiov8AmaUDAKunBwDKpwsAAaUPAEWeEwCYkhcABIEbAHxoHwAYSCMAzB4nAK/rKgDCrS4AGmQyAMkNNgDYqTkAbzc9AJm1QACEI0QARYBHABHLSgAHA04AZSdRAFY3VAAaMlcA8BZaABzlXADxm18AsjpiAMXAZAB/LWcARIBpAIa4awCs1W0AMtdvAJy8cQBmhXMAJjF1AGq/dgDVL3gAAIJ5AKK1egBjynsABMB8AEaWfQDwTH4A2ON+ANZafwDMsX8Apuh/AFT/fwDQ9X8AIMx/AEiCfwBmGH8Ag45+ANbkfQB2G30AqDJ8AJgqewCPA3oA2r14AMJZdwCq13UA7Dd0APZ6cgAyoXAAIKtuADOZbAD6a2oA/CNoAMrBZQAKRmMARLFgADwEXgCCP1sA3GNYAP5xVQCYalIAhU5PAHQeTABH20gAwoVFAMQeQgAipz4Awh87AICJNwBJ5TMAAjQwAKB2LAAHrigAPtskACf/IADJGh0AFi8ZAA09FQCxRREA90kNAO5KCQCDSQUAzkYBAMJD/QBkQfkAwUD1AMVC8QCLSO0A/FLpACZj5QACeuEAh5jdALi/2QCD8NUA5ivSAM5yzgAqxsoA7ibHAPeVwwA7FMAAiaK8AM5BuQDc8rUAirayAKaNrwABeawAWnmpAHiPpgAXvKMA4v+gAJ5bngDZz5sAVV2ZAJgElwBExpQA7KKSAAybkAA6r44A4t+MAHwtiwCCmIkAPiGIADLIhgCUjYUAynGEABB1gwCol4IAy9mBAKg7gQBmvYAAJl+AAAAhgAD+AoAANAWAAJIngAAgaoAAusyAAFlPgQDS8YEA/rOCALCVgwCqloQArLaFAHb1hgCnUogA+s2JAAJniwBeHY0AoPCOAE7gkADz65IAABOVAPxUlwA+sZkASCecAGK2ngD7XaEAYB2kAODzpgDE4KkAVuOsAMT6rwBgJrMARmW2AK+2uQDOGb0As43AAJsRxACJpMcArkXLAAz0zgDIrtIA53TWAHNF2gCJH94AFALiADjs5QDj3OkAINPtAPPN8QBUzPUASM35AMrP/QDZ0gEAdNUFAJTWCQBA1Q0AbNARACDHFQBZuBkAG6MdAGaGIQBIYSUAvDIpANv5LACltTAAMmU0AI8HOADXmzsAICE/AImWQgAy+0UAQ05JAOSOTABAvE8AltVSAA7aVQD3yFgAiKFbAAhjXgDZDGEAL55jAIsWZgAqdWgAjrlqABXjbAA78W4AfuNwAFa5cgBacnQADg52AByMdwAK7HgAoi16AGhQewBEVHwAxDh9ANr9fQAwo34AuCh/AD+OfwCy038ABPl/ACD+fwAQ438A1ad/AH1MfwAm0X4A5DV+AOt6fQBcoHwAe6Z7AH2NegCuVXkAXv93ANyKdgCK+HQA0khzABR8cQDSkm8AgI1tAJlsawC7MGkAWdpmAChqZACq4GEAmD5fAIqEXAA6s1kAX8tWAKjNUwDmulAAzpNNADxZSgDuC0cAzKxDAJg8QABLvDwAqiw5ALWONQA64zEAQCsuAJ5nKgBcmSYAXsEiAKbgHgAm+BoA5AgXAM8TEwD2GQ8ASRwLANgbBwCWGQMAlBb/AMQT+wA6EvcA6BLzANoW7wAMH+sAfCznAC5A4wAYW98AOn7bAIeq1wD/4NMAiCLQACFwzACvysgAHjPFAFuqwQBBMb4Atsi6AJJxtwCwLLQA3/qwAOvcrQCi06oAxN+nAA4CpQBAO6IA/oufAAb1nAD0dpoAahKYAAbIlQBVmJMA6IORAEmLjwDsro0AVu+LAOhMigAbyIgARmGHAMkYhgD07oQAEeSDAGb4ggAsLIIAmH+BANPygAAFhoAAQjmAAKcMgAA0AIAA9hOAAORHgADum4AABRCBAAikgQDOV4IAOCuDAPwdhADuL4UAxGCGACywhwDZHYkAbamKAIBSjACvGI4AgvuPAHz6kQAsFZQA9EqWAFybmADABZsAh4mdABomoAC52qIA2KalAJ6JqAB0gqsAeZCuAAezsQA86bQAWjK4AIaNuwDk+b4ApnbCANcCxgCknckAHkbNAFb70ABovNQAVIjYADRe3AAEPeAA1CPkAKcR6AB7BewAWf7vADv78wAi+/cAE/37AP///wDwAgQA3AQIAMQEDACqARAAgvoTAFzuFwAq3BsA/MIfAM6hIwCqdycAmkMrAKgELwDiuTIAXGI2ACj9OQBciT0AHAZBAHhyRACozUcAwBZLAP5MTgCCb1EAkn1UAF12VwArWVoARCVdAOjZXwB6dmIAPvpkAKdkZwAItWkA2OprAIEFbgB+BHAAVOdxAH2tcwCUVnUAKOJ2ANBPeABCn3kADtB6AATiewDK1HwAMKh9APpbfgD6734AEmR/ABy4fwAL7H8Ay/9/AFnzfwC+xn8A/Hl/ACsNfwBqgH4A0tN9AJwHfQDtG3wADhF7ADbneQC7nngA5Dd3ABezdQCsEHQAE1FyALh0cAAWfG4ArGdsAPo3agCW7WcADollAPcKYwAEdGAAvsRdAPT9WgA6IFgAYCxVABMjUgAjBU8AUNNLAG6OSABIN0UAwc5BAKNVPgDkzDoATzU3AOKPMwB03S8ABR8sAHZVKADIgSQA56QgANO/HACC0xgA9uAUACbpEAAY7QwAx+0IADnsBABv6QAAaOb8ACrk+AC14/QADObwAC7s7AAg9+gA1gflAF0f4QCgPt0ApmbZAGCY1QDB1NEAxhzOAEtxygBX08YAtEPDAGfDvwA0U7wAFPS4AMGmtQA1bLIAGEWvAFgyrACiNKkAxUymAHZ7owBowaAAVh+eANqVmwCkJZkASM+WAGSTlACCcpIALm2QAOyDjgAst4wAeQeLACF1iQCmAIgATqqGAIZyhQCDWYQApF+DABaFggAayoEA3i6BAH6zgAAwWIAA7ByAAOIBgAD9BoAATCyAAMNxgABG14AA0FyBACgCggA5x4IAwKuDAJKvhABk0oUA8hOHAOhziADu8YkAqI2LAKlGjQCCHI8AyA6RAOYckwB2RpUA0oqXAHrpmQDMYZwALPOeAPScoQB6XqQACjenAPAlqgBqKq0AwEOwABxxswC+sbYAzgS6AHZpvQDh3sAAKGTEAHL4xwDMmssAXkrPACMG0wBFzdYAuJ7aAJh53gDoXOIApEfmAOQ46gCQL+4AwyryAGop9gCOKvoAJS3+ADcwAgC3MgYArTMKAA4yDgDeLBIAHCMWAMwTGgDn/R0AfOAhAIu6JQAYiykAPFEtAO4LMQBWujQAdVs4AGfuOwBMcj8AMuZCAFFJRgC4mkkAptlMADYFUACuHFMAOh9WACAMWQCj4lsAAKJeAKBJYQC42GMAwk5mAAeraAD87GoAEBRtAK4fbwBmD3EAnOJyAAKZdAAEMnYAWK13AI4KeQBQSXoAWGl7AE9qfAAETH0ALA5+AKiwfgBEM38A45V/AG7YfwDM+n8A//x/AALffwDZoH8AnEJ/AFbEfgA2Jn4AVmh9APKKfAA2jnsAanJ6ANI3eQC73ncAhmd2AH/SdAAgIHMAyFBxAO5kbwAbXW0AtzlrAGr7aACsomYAIjBkAGikYQAaAF8A7ENcAIdwWQCmhlYA/oZTAFxyUABySU0AKQ1KAC6+RgB5XUMAxes/AAhqPAAS2TgA1jk1ADKNMQAb1C0AfA8qAEhAJgB6ZyIA/YUeANycGgAArRYAe7cSADW9DgBEvwoAmL4GAEC8AgAzuf4Aerb6ABa19gAFtvIAU7ruAPDC6gDr0OYAOOXiANcA3wDGJNsA9FHXAGSJ0wD6y88AuxrMAH12yABB4MQA2ljBAEDhvQA6eroAviS3AIjhswB+sbAAZpWtAAOOqgAmnKcAesCkAMj7oQC4Tp8A+rmcADQ+mgAE3JcABpSVAMxmkwDjVJEAyl6PAA2FjQASyIsAWCiKADymiAAnQocAcPyFAGjVhABczYMAhOSCADAbggB3cYEAnueAALh9gADeM4AAMgqAAKoAgABcF4AAM06AACqlgAAoHIEAD7OBALxpggD6P4MAnjWEAF5KhQAAfoYAKtCHAJhAiQDYzooAmnqMAGZDjgDLKJAAVyqSAHpHlAC6f5YAgtKYADw/mwBMxZ0AEmSgAOEaowAR6aUA5s2oAKzIqwCY2K4A+vyxAO40tQC8f7gAfNy7AGdKvwCQyMIAKFbGADjyyQDlm80APlLRAFEU1QA04dgA6rfcAICX4AAAf+QAZW3oALxh7AABW/AAM1j0AFhY+ABkWvwAYF0AAEJgBAALYggAt2EMAEheEAC5VhQADkoYAEg3HABjHSAAePsjAG7QJwBymysAclsvAJAPMwDVtjYAVFA6AC/bPQBzVkEAUsFEAN0aSABNYksAxJZOAHi3UQCdw1QAdbpXADebWgA2ZV0AshdgAASyYgCKM2UAk5tnAJbpaQDwHGwAHDVuAJAxcADNEXIAWNVzAMR7dQCjBHcAkm94ADi8eQBC6noAXPl7AFPpfADVuX0Av2p+ANv7fgAJbX8AKL5/ACzvfwD8/38AovB/ABbBfwBqcX8AsgF/AAdyfgCSwn0AePN8APcEfAA+93oAnsp5AFp/eADIFXcARI51ADDpcwDyJnIAAkhwANRMbgDmNWwAxwNqAPe2ZwAYUGUAuM9iAIY2YAAYhV0AL7xaAGrcVwCW5lQAYNtRAJq7TgACiEsAbEFIAK/oRACUfkEADAQ+AN15OgAJ4TYAWTozANKGLwBRxysAzvwnAEAoJACTSiAA0mQcAN93GADUhBQAj4wQADOQDACckAgA744EAAqMAAAVifwA7ob4ALWG9ABWifAA4Y/sAEqb6ACarOQAxMTgAM7k3ACoDdkAU0DVALd90QDUxs0AkBzKANV/xgCa8cIArnK/AAwEvAB2prgA2Fq1AAAisgC6/K4A2+urABfwqABBCqYACDujACKDoABD450ADFybACrumAAympYAumCUAFZCkgCGP5AA3FiOALiOjACs4YoACVKJAETghwC2jIYAr1eFAIRBhAB5SoMAyHKCAK66gQBSIoEA4qmAAHNRgAApGYAA/gCAABIJgABGMYAAqnmAABrigACGaoEAxhKCALHaggAWwoMAvMiEAFruhQCyMocAYpWIACkWigCHtIsAMnCNAKVIjwB0PZEAHE6TAB56lQDkwJcA6iGaAIicnAAmMJ8AINyhAMOfpABmeqcASGuqALBxrQDgjLAABLyzAF7+tgAOU7oASLm9ACowwQDdtsQAcEzIABDwywC/oM8Anl3TALUl1wAQ+NoAv9PeAMS34gAlo+YA6ZTqAA+M7gCYh/IAh4b2ANSH+gCFiv4AkY0CAPqPBgC8kAoA1o4OAEmJEgAMfxYAMW8aAKJYHgCBOiIAthMmAGXjKQB7qC0AKGIxAFkPNQA8rzgA2kA8AFDDPwC/NUMARpdGAArnSQA6JE0AA05QAJpjUwA4ZFYAHE9ZAIkjXADL4F4AMIZhAA4TZADBhmYAq+BoADQgawDORG0A6k1vAAo7cQCuC3MAZr90AL5VdgBWzncAyih5AMhkegD8gXsAIoB8APZefQBCHn4A2r1+AI49fwBCnX8A5Nx/AFL8fwCc+38Ar9p/AJyZfwBwOH8ATLd+ADwWfgCIVX0AQHV8ALB1ewAYV3oAsRl5AN+9dwDsQ3YAOKx0ADH3cgA9JXEA1DZvAHYsbQCfBmsA4MVoAMlqZgDo9WMA72dhAGzBXgAcA1wApC1ZAMBBVgAoQFMAoylQAPT+TADmwEkAUHBGAP4NQwDRmj8Aphc8AFuFOADc5DQADTcxAN98LQBCtykAIuclAIANIgBIKx4Af0EaABVRFgAYWxIAbmAOADliCgBYYQYA414CANdb/gAvWfoA+Vf2ACxZ8gDPXe4A5GbqAGR15gBTiuIAqqbeAGLL2gB5+dYA3zHTAIp1zwBrxcsAbiLIAH2NxACDB8EAWZG9AOwrugAE2LYAkpazAERosAAOTq0AkkiqALRYpwAYf6QAhLyhAKIRnwAlf5wAqAWaANillwA+YJUAfjWTABQmkQCOMo8AZFuNABChiwAEBIoAnISIAEwjhwBW4IUAHryEAOS2gwDq0IIAcwqCAJ5jgQCs3IAAqnWAAMQugAD8B4AAaQGAAAIbgADGVIAArK6AAI0ogQBcwoEA6HuCAARVgwB+TYQAEWWFAHqbhgBs8IcAj2OJAIj0igDtoowAWm6OAFVWkABjWpIACnqUALS0lgDhCZkA7HibAEYBngA+oqAAOlujAHwrpgBYEqkAEg+sAOYgrwASR7IAzYC1ADzNuACdK7wABpu/AKMawwCSqcYA60bKAMjxzQA6qdEAVmzVACQ62QC2Ed0AD/LgADXa5AA1yegABL7sALG38AA1tfQAirX4AMC3/AC7ugAAlb0EADO/CACkvgwA3roQAOSyFAC0pRgAU5IcAMF3IAADVSQAKikoACjzKwAqsi8AH2UzADALNwBmozoA2iw+ALCmQQD+D0UA9GdIAK2tSwBj4E4AQP9RAIAJVQBZ/lcAF91aAPKkXQBLVWAAX+1iAJlsZQBO0mcA5x1qANFObAB7ZG4AZl5wAAg8cgD3/HMAtaB1AN4mdwAUj3gA8Nh5ADAEewB5EHwAk/18ADnLfQBCeX4Adgd/AL51fwDxw38ABfJ/APD/fwCe7X8AMLt/AJFofwD49X4AYGN+AA6xfQAS33wAve17AC/degDErXkAul94AGzzdgA0aXUAdMFzAJb8cQAQG3AAVB1uAOwDbABWz2kAJIBnAOwWZQBElGIA1PhfAEFFXQA4eloAcZhXAJqgVACGk1EA4nFOAI48SwBG9EcA7JlEAEouQQBMsj0AvyY6AJ6MNgC75DIAEjAvAIhvKwAPpCcAps4jADDwHwC+CRwAMhwYAKQoFAD1LxAAQzMMAHAzCACbMQQAry4AALsr/AC+KfgAtCn0AK4s8ACZM+wAhD/oAGlR5AA/auAADovcAL+02ABc6NQAxSbRAABxzQDqx8kAeyzGAJifwgAgIr8A/rS7AARZuAASD7UA+texAIa0rgCGpasAwKuoAOrHpQDM+qIADEWgAGannQB0IpsA6raYAFBllgBKLpQAZRKSABwSkAAELo4AhmaMABq8igAyL4kAI8CHAFhvhgAiPYUAvymEAJg1gwC2YIIAiKuBAAwWgQCDoIAABUuAAJ4VgABqAIAAYQuAAIo2gADUgYAAMe2AAH54gQCnI4IAbO6CAK/YgwAk4oQAlAqGALBRhwAkt4gAljqKALDbiwDumY0ACnWPAFhskQCOf5MA/K2VADL3lwCMWpoAeNecAFhtnwB6G6IAQOGkAO+9pwDMsKoAJLmtACjWsAAYB7QAIku3AHWhugA7Cb4AloHBAKwJxQCSoMgAakXMAD/3zwAutdMAO37XAH1R2wD2Ld8AsRLjALL+5gD98OoAlOjuAHbk8gCo4/YAH+X6AOLn/gDs6gIAN+0GAMntCgCX6w4Ao+USAPfaFgB/yhoAV7MeAGyUIgDVbCYAkDsqALL/LQA3uDEASmQ1AOICOQArkzwAOBRAACCFQwAa5UYAMDNKAKxuTQChllAAXapTAAapVgDmkVkAQmRcAF4fXwCQwmEALE1kAIq+ZgAYFmkAMlNrAFJ1bQDpe28AdmZxAH40cwCQ5XQANHl2ABrvdwDERnkA/n96AGCaewCulXwAq3F9ABQufgDGyn4AlUd/AGCkfwAQ4X8AnP1/AO35fwAc1n8AFpJ/AAoufwDyqX4ADgZ+AGpCfQBSX3wA6lx7AH47egBY+3gAvpx3ABQgdgC1hXQAAM5yAHr5cAB6CG8AnftsAErTagAikGgAqDJmAIC7YwA+K2EAjoJeABvCWwCO6lgAr/xVACT5UgDD4E8ASLRMAIJ0SQBHIkYAYr5CALpJPwAixTsAhjE4AMiPNADM4DAAjyUtAOxeKQDujSUAcLMhAIfQHQAQ5hkAIfUVAKn+EQCkAw4AIwUKABYEBgCGAQIAe/79AOj7+QDf+vUAWfzxAFgB7gDiCuoA6xnmAH4v4gCMTN4AFXLaABKh1gBz2tIAMh/PADlwywB6zscA3TrEAEa2wACgQb0Att25AIKLtgC0S7MAQB+wANgGrQBWA6oAbhWnAOg9pABwfaEAwtSeAIJEnABWzZkA32+XALQslQBmBJMAhfeQAIYGjwAAMo0ASnqLAO7fiQA+Y4gArASHAH/EhQAZo4QArqCDAJK9ggD2+YEAClaBAPrRgADobYAA5CmAABMGgABkAoAA8R6AAKBbgABquIAAPDWBAOjRgQBZjoIAUGqDAKBlhAAEgIUAOLmGAOsQiADIhokAcxqLAIDLjACKmY4AGISQAK2KkgDQrJQA5umWAHZBmQDUspsAcj2eAKDgoADBm6MAFG6mAABXqQCgVawAX2mvAFeRsgDKzLUA7hq5ANh6vADO678A0mzDAB79xgC4m8oAxUfOAFMA0gBrxNUAL5PZAJFr3QCsTOEAfjXlAAwl6QBaGu0AahTxADkS9QDFEvkAGRX9ABkYAQDjGgUAWRwJAIkbDQBsFxEAAw8VAE0BGQBR7RwACdIgAISuJADDgSgA1EosAMAIMACWujMAb183AFL2OgBsfj4AxPZBAIxeRQDctEgA6vhLANUpTwDgRlIAMk9VABBCWADDHlsAguRdAKySYACFKGMAdqVlAM0IaAAEUmoAdIBsAKSTbgD6inAAEGZyAFAkdABrxXUA2kh3AFKueABr9XkA3B17AFAnfACWEX0AWNx9AIKHfgDPEn8ALH5/AHbJfwCe9H8Al/9/AGHqfwD9tH8AfF9/APDpfgCBVH4AP599AHLKfAA71nsA4MJ6AKqQeQDYP3gA09B2AORDdQB6mXMA/tFxAODtbwCe7W0AttFrAKyaaQAcSWcAh91kAJ9YYgDwul8ANgVdABQ4WgBCVFcAelpUAHdLUQAKKE4A7PBKAPymRwACS0QA391AAGlgPQCG0zkAEzg2AASPMgA42S4AphcrAEBLJwDydCMAwZUfAJiuGwB7wBcAZ8wTAFPTDwBL1gsAQ9YHAETUAwBS0f8AZs77AIzM9wDDzPMABNDvAGPX6wDI4+cAR/bjAMwP4ABdMdwA7lvYAHqQ1ADuz9AARBvNAGRzyQA92cUAuU3CALHRvgAaZrsAtAu4AHjDtAAYjrEAfmyuAGNfqwCQZ6gAyoWlAL26ogAsB6AAvGudABPpmgDef5gAqTCWABb8kwCq4pEA8OSPAGoDjgCMPowAzpaKAJIMiQBHoIcAPFKGAM4ihQBKEoQA5iCDAPlOggCYnIEAEAqBAGqXgADTRIAAYRKAAA4AgAD+DYAADDyAAESKgACK+IAAvoaBAMY0ggBuAoMAhu+DANL7hAANJ4YA7nCHACLZiABKX4oADAOMAPTDjQCcoY8AhJuRAC+xkwAa4pUAsS2YAGiTmgCfEp0AuKqfAAtbogDsIqUApAGoAIL2qgDAAK4AnB+xAFRStAALmLcABPC6AExZvgAq08EAllzFANX0yADdmswA2k3QANIM1ADc1tcA+qrbAD+I3wCvbeMASVrnAB9N6wAfRe8AX0HzAMlA9wBwQvsAQEX/AENIAwB1SgcAykoLAFJIDwD5QRMAzDYXAMslGwDwDR8ATO4iANzFJgCokyoAyFYuADUOMgAZuTUAalY5AGLlPADzZEAAbNRDALoyRwA7f0oA6rhNABzfUADu8FMApe1WAIjUWQDDpFwAxl1fALb+YQAWh2QAHvZmAExLaQD2hWsAnqVtAKqpbwCokXEAD11zAHoLdQBwnHYAlQ94AIdkeQDsmnoAhrJ7APiqfAAbhH0Aoz1+AHLXfgBWUX8AOKt/AP7kfwCY/n8ABPh/ADzRfwBWin8AVCN/AGGcfgCP9X0AFS99ABxJfADkQ3sAph96ALnceABee3cAAfx1AO5edACcpHIAc81wAOrZbgCFymwAvp9qACtaaABV+mUA3oBjAFzuYAB8Q14A6oBbAEunWABut1UA8rFSALqXTwByaUwA+SdJABbURQClbkIAfvg+AIRyOwCP3TcAmjo0AHCKMAAmziwAhAYpAJ80JQBVWSEAr3UdAJqKGQAemRUAL6IRANamDQAFqAkA06YFACikAQAeof0App75AMqd9QCOn/EA7KTtAOiu6QCDvuUAttThAILy3QDbGNoAwUjWAB+D0gD0yM4AJBvLAKR6xwBa6MMAMGXAAALyvACwj7kAGj+2AAsBswBe1q8A2L+sAEC+qQBb0qYA5/yjAJA+oQAWmJ4AEgqcADyVmQAeOpcAYfmUAIrTkgAsyZAAwtqOANIIjQDDU4sAGbyJAB5CiABQ5oYA6KiFAFCKhAC+ioMAfKqCAMDpgQC3SIEAkMeAAGBmgABWJYAAYQSAALADgAAaI4AAwmKAAGzCgAAsQoEAuuGBAAqhggDgf4MAAn6EADqbhQA114YAqjGIAEGqiQCcQIsAUPSMAPjEjgAUspAANLuSAMvflABUH5cAQnmZAO7smwDUeZ4AMh+hAHbcowDosKYAxJupAGqcrAD6sa8Ax9uyAPYYtgC5aLkARMq8AK48wAAmv8MAxlDHAKPwygDenc4Af1fSAJ8c1gBI7NkAgcXdAFun4QDSkOUA8YDpALt27QAocfEARG/1AAZw+QBvcv0Ae3UBAC14BQB5eQkAZ3gNAPJzEQAVaxUA3FwZADxIHQBBLCEA8AclAEraKABkoiwAQF8wAPAPNACQszcAI0k7ANfPPgC4RkIA8axFAKIBSQD8Q0wAIHNPAFCOUgC4lFUAmoVYAD5gWwDeI14A3M9gAHVjYwAb3mUAFj9oAOeFagDgsWwAjsJuAFq3cADQj3IAdkt0ANzpdQCYancAUs14AKMRegBGN3sA7D18AEolfQBA7X0AdJV+AOsdfwBShn8AvM5/AO72fwAC/38A2OZ/AIyufwAeVn8Art1+AFJFfgA4jX0AiLV8AHu+ewBQqHoAS3N5ALwfeAD2rXYAWB51AEFxcwAsp3EAc8BvAK69bQBEn2sA0GVpANYRZwDyo2QAvRxiAOB8XwD2xFwAwvVZAOQPVwAqFFQARANRAP/dTQAopUoAiFlHAPr7QwBOjUAAaA49ACmAOQBw4zUALzkyAEaCLgCuvyoAWPImADIbIwA7Ox8AaFMbALJkFwAlcBMAo3YPAFJ5CwAMeQcA8HYDAPJz/wATcfsAY2/3AM9v8wBuc+8AL3vrAB6I5wAwm+MAbLXfAMDX2wAyA9gArzjUAC950ACkxcwA/B7JAB6GxQD4+8EAaoG+AFIXuwCUvrcA/He0AGpEsQCbJK4AcBmrAI8jqADWQ6UA5nqiAHrJnwBJMJ0A5q+aAAxJmAA3/JUAHMqTACqzkQAAuI8ADNmNANIWjAC6cYoAOuqIAKSAhwBjNYYAwQiFAAr7gwCIDIMAbD2CAPyNgQBK/oAAmo6AAOc+gABhD4AAAgCAANQQgADaQYAA9JKAACgEgQA/lYEAKkaCALIWgwCfBoQAwBWFAMhDhgBskIcAYPuIADuEigCmKowANu6NAGzOjwDoypEADeOTAGwWlgBsZJgAeMyaAPlNnQBQ6J8AyJqiAMtkpQCMRagAYDyrAIpIrgA6abEAtp20ACHltwCwPrsAiqm+ANMkwgCqr8UALknJAG7wzACOpNAAj2TUAJAv2ACLBNwAm+LfALjI4wD0tecARanrALuh7wBFnvMA+Z33ALuf+wCjov8AmaUDAKqnBwDMpwsAAKUPAESeEwCbkhcA/4AbAIJoHwATSCMA0B4nAKrrKgDHrS4AFmQyAMsNNgDYqTkAbjc9AJy1QACAI0QASIBHAA7LSgAKA04AZCdRAFY3VAAaMlcA8BZaAB7lXADsm18AtjpiAMTAZAB/LWcARYBpAIS4awCs1W0ANNdvAJq8cQBmhXMAKDF1AGi/dgDWL3gA/4F5AKO1egBkynsAA8B8AEaWfQDvTH4A2eN+ANdafwDKsX8AqOh/AFL/fwDQ9X8AIsx/AEeCfwBmGH8AhI5+ANTkfQB3G30AqTJ8AJYqewCQA3oA2b14AMNZdwCq13UA7Dd0APV6cgA0oXAAHqtuADWZbAD4a2oA/CNoAM7BZQAERmMASbFgADgEXgCFP1sA3GNYAPxxVQCaalIAg05PAHUeTABG20gAw4VFAMQeQgAjpz4Awh87AH+JNwBK5TMAAjQwAJ52LAAKrigAPNskACj/IADHGh0AGC8ZAAs9FQC0RREA9UkNAO1KCQCESQUAz0YBAL9D/QBqQfkAukD1AMtC8QCGSO0A/1LpACVj5QACeuEAiJjdALa/2QCF8NUA5CvSAM9yzgAqxsoA7ibHAPiVwwA6FMAAiKK8ANJBuQDW8rUAkLayAKKNrwACeawAXHmpAHaPpgAWvKMA5f+gAJlbngDez5sAVF2ZAJYElwBIxpQA5qKSABKbkAA4r44A4d+MAIAtiwB6mIkARiGIACzIhgCYjYUAyHGEABB1gwCol4IAzNmBAKg7gQBlvYAAJ1+AAP4ggAACA4AAMAWAAJYngAAcaoAAvMyAAFpPgQDP8YEAArSCAKyVgwCsloQArLaFAHb1hgCmUogA/M2JAP5miwBjHY0AnPCOAFDgkADy65IAAhOVAPpUlwBAsZkARCecAGW2ngD6XaEAYh2kAN3zpgDI4KkAUOOsAMr6rwBcJrMASGW2AK62uQDOGb0AtI3AAJgRxACOpMcAqEXLABL0zgDErtIA53TWAHVF2gCHH94AFQLiADjs5QDh3OkAItPtAPPN8QBTzPUASM35AMrP/QDZ0gEAdNUFAJXWCQA+1Q0AbdARACDHFQBYuBkAHaMdAGSGIQBKYSUAujIpANz5LACltTAAMmU0AI4HOADYmzsAICE/AImWQgA0+0UAQE5JAOaOTABAvE8AltVSAA7aVQD4yFgAhKFbAA9jXgDRDGEAN55jAIQWZgAvdWgAirlqABnjbAA48W4AgONwAFS5cgBccnQADg52ABmMdwAP7HgAmy16AHBQewA9VHwAyjh9ANX9fQA0o34Atih/AD+OfwC0038AAfl/ACL+fwAO438A1qd/AH5MfwAk0X4A6DV+AOR6fQBkoHwAdKZ7AIGNegCuVXkAXP93AN2KdgCL+HQAz0hzABh8cQDQkm8Afo1tAJ1sawC3MGkAXNpmAChqZACo4GEAmj5fAIaEXABAs1kAWstWAKzNUwDiulAA0pNNADhZSgDyC0cAyKxDAJw8QABJvDwAqyw5ALSONQA74zEAPysuAJ9nKgBbmSYAXsEiAKfgHgAl+BoA5QgXAM4TEwD2GQ8AShwLANcbBwCWGQMAlBb/AMQT+wA7EvcA5hLzANwW7wAKH+sAfSznAC5A4wAXW98AO37bAIiq1wD84NMAjCLQAB5wzACwysgAHjPFAFqqwQBCMb4Atsi6AJJxtwCxLLQA3PqwAO7crQCg06oAw9+nABICpQA7O6IAAoyfAAb1nADxdpoAbhKYAALIlQBWmJMA6oORAEiLjwDrro0AVu+LAOhMigAcyIgARmGHAMgYhgD07oQAEuSDAGb4ggAqLIIAmn+BANLygAAGhoAAQjmAAKYMgAA1AIAA9hOAAOJHgADxm4AAAhCBAAqkgQDPV4IANCuDAAAehADqL4UAyWCGACewhwDeHYkAaKmKAIZSjACpGI4AhvuPAHn6kQAuFZQA9EqWAFybmAC/BZsAiImdABcmoAC+2qIA1KalAKKJqABugqsAfpCuAASzsQA/6bQAWTK4AIWNuwDm+b4ApHbCANgCxgCknckAHkbNAFf70ABmvNQAVojYADJe3AAGPeAA0iPkAKoR6AB2BewAX/7vADX78wAp+/cADf37AAIAAADvAgQA2wQIAMcEDACmARAAhvoTAFjuFwAv3BsA9sIfANOhIwCndycAnEMrAKgELwDhuTIAXmI2ACb9OQBeiT0AGAZBAHxyRAClzUcAxBZLAPlMTgCEb1EAkX1UAF52VwAtWVoAQiVdAOjZXwB5dmIAP/pkAKdkZwAItWkA2uprAHwFbgCEBHAATudxAIKtcwCSVnUAJ+J2ANNPeAA+n3kAEdB6AAPiewDK1HwAMah9APhbfgD8734AEWR/ABu4fwAN7H8AyP9/AF7zfwC4xn8AAXp/ACgNfwBqgH4A1NN9AJkHfQDyG3wACBF7ADvneQC2nngA6Dd3ABazdQCrEHQAFFFyALh0cAAWfG4ArGdsAPo3agCW7WcADYllAPoKYwAAdGAAwsRdAPD9WgA+IFgAXCxVABYjUgAhBU8AUNNLAHCOSABGN0UAws5BAKRVPgDizDoAUTU3AOCPMwB13S8ABh8sAHNVKADMgSQA4qQgANa/HACC0xgA9OAUACjpEAAW7QwAyO0IADnsBABv6QAAZ+b8ACzk+ACz4/QADubwAC7s7AAe9+gA2AflAFwf4QCgPt0AqGbZAF2Y1QDE1NEAwxzOAE5xygBT08YAuUPDAGLDvwA6U7wADPS4AMqmtQAubLIAHEWvAFgyrACgNKkAyEymAHJ7owBswaAAUx+eAN2VmwCgJZkATM+WAGGTlACEcpIALm2QAOiDjgAzt4wAcgeLACZ1iQCiAIgAUqqGAIJyhQCHWYQAoF+DABqFggAYyoEA3i6BAICzgAAqWIAA9ByAANsBgAACB4AASSyAAMRxgABH14AAz1yBACgCggA4x4IAwquDAJCvhABm0oUA8BOHAOhziADw8YkApo2LAKtGjQCBHI8Axg6RAOockwB0RpUA0oqXAHvpmQDKYZwAL/OeAPKcoQB4XqQADTenAO4lqgBtKq0AvkOwABxxswC+sbYAzgS6AHZpvQDg3sAAKmTEAHD4xwDPmssAWkrPACYG0wBCzdYAvJ7aAJZ53gDoXOIApEfmAOI46gCTL+4AwSryAGsp9gCNKvoAJi3+ADcwAgC3MgYArDMKAA4yDgDfLBIAHiMWAMgTGgDq/R0AeuAhAIq6JQAciykAN1EtAPQLMQBSujQAdls4AGfuOwBKcj8ANuZCAE5JRgC6mkkAotlMADgFUACuHFMAOh9WACIMWQCe4lsABqJeAJxJYQC62GMAwU5mAAaraAD+7GoADhRtALEfbwBgD3EAouJyAP+YdAAGMnYAWK13AIsKeQBSSXoAWGl7AFBqfAACTH0ALQ5+AKiwfgBEM38A45V/AG3YfwDM+n8AAv1/AP7efwDcoH8AmkJ/AFbEfgA5Jn4AUmh9APaKfAAzjnsAa3J6ANI3eQC63ncAiGd2AH3SdAAiIHMAxFBxAPRkbwAVXW0AvDlrAGf7aACsomYAJTBkAGSkYQAdAF8A6kNcAIhwWQClhlYAAIdTAFlyUAB4SU0AIg1KADO+RgB0XUMAyes/AAZqPAAU2TgA1Dk1ADKNMQAb1C0AfQ8qAEhAJgB5ZyIA/oUeANqcGgADrRYAd7cSADi9DgBDvwoAmL4GAEC8AgAzuf4Aebb6ABi19gAEtvIAUrruAPLC6gDo0OYAPOXiANUA3wDHJNsA81HXAGSJ0wD8y88AuhrMAHx2yABC4MQA2ljBAD7hvQA9eroAuSS3AIvhswB+sbAAZJWtAAaOqgAjnKcAfMCkAMj7oQC2Tp8A/LmcADI+mgAG3JcABpSVAMxmkwDgVJEAz16PAAiFjQAWyIsAViiKADymiAAoQocAcPyFAGjVhABazYMAhuSCAC4bggB5cYEAn+eAALR9gADiM4AALgqAAK4AgABYF4AAN06AACilgAAoHIEAEbOBALhpggAAQIMAmDWEAGNKhQD6fYYAMNCHAJNAiQDczooAmHqMAGZDjgDMKJAAVSqSAHtHlAC6f5YAhNKYADk/mwBOxZ0AEWSgAOIaowAS6aUA482oAKzIqwCb2K4A+fyxAO40tQC6f7gAf9y7AGRKvwCVyMIAI1bGADvyyQDkm80APVLRAFMU1QAy4dgA67fcAICX4AD/fuQAZm3oALxh7AAAW/AAM1j0AFdY+ABnWvwAXV0AAERgBAAJYggAuGEMAEleEAC3VhQAEEoYAEQ3HABpHSAAcvsjAHPQJwBvmysAclsvAJIPMwDStjYAWFA6ACrbPQB6VkEASsFEAOQaSABIYksAx5ZOAHa3UQCew1QAdrpXADWbWgA4ZV0ArxdgAAiyYgCHM2UAlZtnAJTpaQDxHGwAHDVuAJAxcADMEXIAWtVzAMJ7dQCmBHcAjm94ADy8eQA+6noAYPl7AFHpfADWuX0AvWp+AN37fgAGbX8ALL5/ACjvfwD//38AnvB/ABnBfwBocX8AsgF/AApyfgCOwn0AffN8APIEfABC93oAnMp5AFt/eADHFXcARI51ADDpcwDyJnIAA0hwANJMbgDoNWwAxANqAPq2ZwAVUGUAvs9iAH42YAAehV0AKrxaAG/cVwCU5lQAYdtRAJi7TgADiEsAbkFIAKzoRACWfkEACgQ+AN95OgAH4TYAWjozANKGLwBQxysA0PwnADwoJACYSiAAzmQcAOJ3GADRhBQAkowQADCQDACgkAgA6o4EAA+MAAARifwA8Yb4ALOG9ABXifAA4I/sAEqb6ACZrOQAxsTgAM3k3ACqDdkAT0DVALt90QDQxs0AkhzKANZ/xgCY8cIAsnK/AAYEvAB6prgA1lq1AAIisgC5/K4A2uurABrwqAA+CqYACzujAB6DoABF450ADVybACjumAA0mpYAuGCUAFdCkgCIP5AA2FiOALyOjACq4YoAB1KJAEjghwCyjIYAs1eFAIFBhAB6SoMAx3KCAK+6gQBSIoEA4amAAHZRgAAlGYAAAgGAAA4JgABJMYAAqXmAABrigACGaoEAxhKCALHaggAWwoMAusiEAF7uhQCuMocAZpWIACUWigCJtIsAM3CNAKRIjwByPZEAIE6TABp6lQDowJcA6CGaAIecnAAoMJ8AHtyhAMafpABieqcAS2uqAK5xrQDhjLAABLyzAF7+tgAOU7oASLm9ACswwQDatsQAc0zIAA7wywDAoM8Anl3TALQl1wAS+NoAvtPeAMS34gAlo+YA6ZTqAA+M7gCZh/IAhob2ANaH+gCBiv4AlY0CAPaPBgDBkAoA044OAEiJEgAOfxYALW8aAKhYHgB8OiIAuhMmAGDjKQCAqC0AJGIxAFsPNQA8rzgA2UA8AFHDPwC/NUMARJdGAAznSQA4JE0ABU5QAJljUwA4ZFYAG09ZAIojXADM4F4ALoZhABATZAC/hmYArOBoADYgawDJRG0A8E1vAAQ7cQCyC3MAZL90AL5VdgBYzncAyCh5AMpkegD6gXsAJIB8APNefQBGHn4A1r1+AJE9fwBCnX8A4dx/AFb8fwCY+38Astp/AJqZfwByOH8ASbd+AEAWfgCGVX0APnV8ALR1ewATV3oAthl5ANy9dwDtQ3YAN6x0ADL3cgA8JXEA1jZvAHQsbQCiBmsA3MVoAMxqZgDm9WMA8GdhAG7BXgAYA1wAqS1ZALlBVgAuQFMAoClQAPX+TADnwEkATnBGAAAOQwDPmj8AqBc8AFiFOADf5DQACzcxAOJ8LQA/tykAJOclAH8NIgBJKx4AfkEaABdRFgAUWxIAdGAOADRiCgBaYQYA414CANVb/gAyWfoA9lf2AC5Z8gDOXe4A5GbqAGR15gBUiuIAp6beAGfL2gB0+dYA4zHTAIh1zwBrxcsAbyLIAH2NxACAB8EAXpG9AOYrugAK2LYAjJazAEposAAITq0AmEiqAK5YpwAcf6QAgryhAKQRnwAjf5wAqQWaANellwBAYJUAfTWTABYmkQCKMo8AZ1uNAA+hiwAEBIoAnISIAEwjhwBV4IUAILyEAOK2gwDs0IIAcAqCAKJjgQCo3IAArXWAAMIugAD+B4AAZwGAAAIbgADJVIAAqa6AAI4ogQBdwoEA5HuCAAtVgwB2TYQAGGWFAHSbhgBx8IcAi2OJAIr0igDuoowAWW6OAFVWkABjWpIACXqUALW0lgDiCZkA7HibAEQBngBCoqAANVujAIArpgBWEqkAEg+sAOggrwAQR7IAzIC1AD7NuACaK7wACZu/AKEawwCUqcYA6UbKAMrxzQA4qdEAWGzVACM62QC3Ed0ADfLgADja5AAyyegAB77sALC38AA0tfQAjLX4AL63/AC9ugAAlL0EADO/CAClvgwA3boQAOWyFACzpRgAVJIcAMB3IAAGVSQAJCkoAC7zKwAmsi8AImUzAC4LNwBnozoA2Cw+ALKmQQD+D0UA8mdIALCtSwBg4E4AQ/9RAH0JVQBc/lcAFN1aAPakXQBFVWAAZO1iAJZsZQBQ0mcA5x1qAM9ObAB+ZG4AYl5wAAw8cgD2/HMAtKB1AOEmdwAOj3gA9th5ACwEewB8EHwAkP18ADzLfQBAeX4AeAd/ALt1fwDyw38ACPJ/AOr/fwCm7X8AKLt/AJhofwDy9X4AZGN+AAqxfQAY33wAtu17ADbdegC+rXkAv194AGjzdgA3aXUAccFzAJj8cQAPG3AAVR1uAO0DbABSz2kAKIBnAOgWZQBIlGIA0/hfAEFFXQA4eloAb5hXAJ6gVACCk1EA5nFOAIo8SwBI9EcA7JlEAEouQQBKsj0AwiY6AJqMNgDA5DIADzAvAIhvKwARpCcAos4jADTwHwC7CRwANRwYAKEoFAD3LxAAQjMMAHAzCACeMQQAqi4AAMAr/AC5KfgAuin0AKgs8ACdM+wAgz/oAGhR5ABCauAACYvcAMS02ABY6NQAyCbRAP5wzQDqx8kAfCzGAJefwgAgIr8AALW7AAJZuAAUD7UA+NexAIa0rgCKpasAuquoAPDHpQDH+qIAEEWgAGKnnQB4IpsA5raYAFJllgBMLpQAYBKSACISkAD/LY4AiWaMABm8igAyL4kAIsCHAFtvhgAePYUAxCmEAJI1gwC6YIIAhquBAAwWgQCGoIAAAkuAAJ4VgABsAIAAXguAAI42gADRgYAAMu2AAH94gQCmI4IAbO6CAK7YgwAm4oQAlAqGAK9RhwAkt4gAlzqKAK3biwD0mY0AAnWPAGBskQCHf5MAAq6VAC73lwCNWpoAedecAFZtnwB8G6IAQOGkAOy9pwDQsKoAIbmtACrWsAAWB7QAI0u3AHWhugA6Cb4AmIHBAKoJxQCUoMgAaUXMAD/3zwAstdMAP37XAHlR2wD6Ld8ArRLjALX+5gD68OoAl+juAHTk8gCp4/YAHuX6AOPn/gDr6gIAOe0GAMftCgCW6w4ApuUSAPTaFgCCyhoAVLMeAG6UIgDUbCYAkjsqAK7/LQA8uDEARmQ1AOQCOQAskzwANBRAACaFQwAU5UYANjNKAKduTQCmllAAWKpTAAmpVgDmkVkAQmRcAF4fXwCPwmEALU1kAIq+ZgAYFmkAMlNrAFB1bQDse28Ac2ZxAII0cwCM5XQAOHl2ABTvdwDKRnkA+n96AGKaewCulXwAqXF9ABYufgDGyn4AlEd/AGGkfwAQ4X8Amv1/APD5fwAY1n8AHJJ/AAIufwD6qX4ABgZ+AHFCfQBPX3wA6lx7AIA7egBV+3gAwJx3ABQgdgCzhXQABM5yAHb5cAB+CG8AmftsAEzTagAgkGgAqjJmAH67YwBBK2EAi4JeAB7CWwCM6lgAsPxVACL5UgDG4E8ARrRMAIR0SQBEIkYAZL5CALlJPwAjxTsAhzE4AMSPNADR4DAAiiUtAPFeKQDpjSUAdLMhAITQHQAS5hkAIvUVAKT+EQCqAw4AHwUKABcEBgCJAQIAdv79AOz7+QDd+vUAW/zxAFYB7gDkCuoA6RnmAIAv4gCLTN4AFXLaABKh1gBz2tIAMx/PADhwywB6zscA3jrEAEW2wACgQb0AuN25AH6LtgC5S7MAPB+wANwGrQBUA6oAbRWnAOo9pABtfaEAxtSeAH5EnABYzZkA32+XALQslQBnBJMAgveQAIoGjwD8MY0ATXqLAOzfiQBAY4gAqwSHAIDEhQAXo4QArqCDAJW9ggDy+YEADlaBAPfRgADqbYAA4ymAABQGgABiAoAA8x6AAJ5bgABsuIAAOjWBAOrRgQBXjoIAUmqDAJ5lhAAGgIUANrmGAOwQiADJhokAcRqLAILLjACImY4AGoSQAKyKkgDPrJQA6OmWAHRBmQDWspsAcD2eAKLgoAC+m6MAGm6mAPdWqQCqVawAVmmvAF2RsgDIzLUA7Rq5ANp6vADM678A02zDAB/9xgC2m8oAyEfOAE4A0gBxxNUAKpPZAJRr3QCqTOEAgDXlAAkl6QBdGu0AaBTxADkS9QDIEvkAFBX9AB4YAQDgGgUAWhwJAIkbDQBsFxEAAw8VAE4BGQBQ7RwACNIgAIeuJADAgSgA10osAL0IMACaujMAal83AFf2OgBpfj4AxPZBAIxeRQDetEgA6PhLANgpTwDeRlIAME9VABRCWAC/HlsAhuRdAKiSYACKKGMAcKVlANAIaAAEUmoAdIBsAKSTbgD8inAACmZyAFgkdABkxXUA4Eh3AE2ueABu9XkA2h17AFInfACUEX0AWNx9AISHfgDLEn8AMH5/AHTJfwCe9H8Amv9/AF3qfwAAtX8AfF9/AO/pfgCBVH4APp99AHTKfAA61nsA4MJ6AKqQeQDYP3gA09B2AOJDdQB8mXMA/tFxAODtbwCe7W0AtdFrAK6aaQAaSWcAiN1kAJ5YYgDwul8AOQVdABE4WgBEVFcAd1pUAHpLUQAHKE4A8PBKAPmmRwAES0QA3N1AAGxgPQCC0zkAGDg2AACPMgA52S4ApxcrAD5LJwD1dCMAv5UfAJeuGwB+wBcAY8wTAFjTDwBG1gsARtYHAEPUAwBS0f8AZs77AI3M9wDAzPMACNDvAF/X6wDM4+cAQ/bjANAP4ABZMdwA81vYAHaQ1ADwz9AARBvNAGNzyQA/2cUAtk3CALTRvgAYZrsAtwu4AHbDtAAYjrEAf2yuAGJfqwCQZ6gAzIWlALq6ogAwB6AAt2udABbpmgDdf5gAqjCWABT8kwCq4pEA8eSPAGoDjgCMPowAzpaKAJAMiQBKoIcAOlKGANAihQBIEoQA6CCDAPdOggCbnIEADQqBAGqXgADWRIAAXBKAABQAgAD6DYAADDyAAEeKgACG+IAAwoaBAMM0ggBwAoMAhO+DANT7hAAKJ4YA8nCHAB7ZiABOX4oACAOMAPfDjQCaoY8AhpuRAC6xkwAa4pUAsS2YAGiTmgCfEp0AuKqfAAxbogDqIqUApgGoAID2qgDAAK4Anh+xAFJStAANmLcAAvC6AE5ZvgAn08EAmlzFANL0yADemswA2U3QANMM1ADb1tcA+6rbAECI3wCsbeMATFrnABxN6wAjRe8AWkHzAM9A9wBqQvsAREX/AENIAwBySgcAzkoLAE5IDwD7QRMAzTYXAMolGwDxDR8ATO4iANnFJgCtkyoAw1YuADsOMgASuTUAcVY5AFrlPAD8ZEAAYtRDAMQyRwA0f0oA7rhNABrfUADt8FMAqe1WAILUWQDKpFwAvl1fAL3+YQARh2QAIvZmAElLaQD5hWsAmqVtAK2pbwCmkXEAEV1zAHoLdQBwnHYAlA94AIhkeQDrmnoAh7J7APeqfAAchH0Aoj1+AHPXfgBVUX8AOqt/APzkfwCa/n8AAfh/AEDRfwBRin8AWCN/AF6cfgCR9X0AFC99ABxJfADkQ3sAph96ALrceABee3cAAPx1AO5edACcpHIAc81wAOvZbgCEymwAv59qAClaaABY+mUA2oBjAGDuYAB7Q14A6IBbAE6nWABpt1UA+LFSALaXTwB2aUwA9CdJABrURQChbkIAgvg+AIByOwCU3TcAkzo0AHiKMAAeziwAjAYpAJg0JQBbWSEAqnUdAJ6KGQAbmRUAMaIRANOmDQAKqAkAzqYFACukAQAcof0Ap575AMqd9QCPn/EA6aTtAOuu6QCCvuUAttThAILy3QDcGNoAwEjWACCD0gDzyM4AIxvLAKZ6xwBa6MMAL2XAAAHyvACyj7kAGD+2AA4BswBb1q8A2L+sAEG+qQBc0qYA5vyjAJA+oQAVmJ4AEwqcADyVmQAdOpcAY/mUAIjTkgAuyZAAwNqOANMIjQDEU4sAF7yJACBCiABO5oYA6qiFAE+KhAC+ioMAfKqCAMDpgQC4SIEAjMeAAGdmgABOJYAAaASAAKkDgAAgI4AAvmKAAHDCgAApQoEAuuGBAAyhggDff4MAAn6EADqbhQA014YAqzGIAEKqiQCbQIsAUPSMAPjEjgAUspAANLuSAMvflABVH5cAP3mZAPLsmwDQeZ4ANR+hAHfcowDksKYAyJupAGWcrAD+sa8AxtuyAPYYtgC6aLkAQ8q8AK08wAAov8MAw1DHAKfwygDanc4AglfSAJ0c1gBI7NkAg8XdAFmn4QDSkOUA84DpALd27QAscfEAQm/1AAZw+QBwcv0AenUBAC14BQB6eQkAZXgNAPRzEQAUaxUA3VwZADtIHQBCLCEA7wclAEzaKABioiwAQF8wAPEPNACPszcAJEk7ANfPPgC2RkIA9KxFAKEBSQD8Q0wAIXNPAE6OUgC5lFUAm4VYADxgWwDhI14A2M9gAHhjYwAY3mUAHD9oAOCFagDmsWwAicJuAF63cADOj3IAdkt0ANzpdQCYancAVM14AKERegBIN3sA5z18AFAlfQA67X0AepV+AOYdfwBWhn8Aus5/AO72fwAC/38A1uZ/AI6ufwAeVn8Art1+AFJFfgA4jX0AhrV8AH6+ewBOqHoATXN5ALofeAD3rXYAVh51AEZxcwAmp3EAeMBvAKu9bQBFn2sA0GVpANYRZwDxo2QAwBxiANx8XwD5xFwAwPVZAOYPVwAoFFQARQNRAP7dTQAqpUoAiFlHAPj7QwBOjUAAag49ACaAOQBz4zUALDkyAEiCLgCvvyoAVvImADQbIwA4Ox8Aa1MbALJkFwAicBMAqHYPAE15CwAPeQcA8HYDAPBz/wAXcfsAXm/3ANNv8wBrc+8AMXvrAB6I5wAwm+MAbLXfAL/X2wA0A9gArDjUADJ50ACkxcwA+h7JAB+GxQD4+8EAaYG+AFQXuwCSvrcA/ne0AGdEsQCgJK4AahmrAJQjqADUQ6UA5XqiAHzJnwBHMJ0A6K+aAApJmAA4/JUAG8qTACqzkQABuI8ADNmNANAWjAC+cYoANOqIAKqAhwBhNYYAwAiFAA37gwCDDIMAcj2CAPaNgQBQ/oAAlI6AAOw+gABeD4AAAgCAANgQgADUQYAA+pKAACIEgQBElYEAKEaCALIWgwCeBoQAwhWFAMZDhgBvkIcAXPuIADyEigCoKowANO6NAG7OjwDoypEACuOTAHIWlgBkZJgAgMyaAPJNnQBU6J8AyJqiAMpkpQCKRagAZDyrAIZIrgA/abEAsp20ACLltwCwPrsAiqm+ANQkwgCor8UAMEnJAGzwzACQpNAAjmTUAI8v2ACMBNwAmuLfALnI4wDztecARanrALqh7wBInvMA9Z33AL+f+wCgov8AmqUDAKqnBwDMpwsA/6QPAEaeEwCYkhcAA4EbAH1oHwAYSCMAyx4nAK/rKgDDrS4AG2QyAMYNNgDbqTkAbjc9AJq1QACDI0QARoBHAA7LSgAMA04AYidRAFY3VAAcMlcA7RZaACDlXADum18AsjpiAMjAZAB6LWcASoBpAIC4awCu1W0AM9dvAJq8cQBohXMAJTF1AGu/dgDUL3gAAIJ5AKK1egBjynsABsB8AESWfQDwTH4A2ON+ANZafwDOsX8ApOh/AFT/fwDQ9X8AIMx/AEqCfwBiGH8Aho5+ANXkfQB3G30AqDJ8AJYqewCRA3oA2b14AMJZdwCs13UA6Dd0APp6cgAwoXAAIKtuADWZbAD4a2oA/CNoAM3BZQAERmMATLFgADQEXgCHP1sA22NYAPtxVQCealIAfk5PAHkeTABE20gAxIVFAMIeQgAmpz4Avh87AIOJNwBG5TMABDQwAJ52LAAKrigAPNskACf/IADJGh0AFS8ZAA49FQCyRREA9kkNAO1KCQCFSQUAzUYBAMJD/QBmQfkAvUD1AMlC8QCJSO0A/FLpAChj5QAAeuEAiJjdALe/2QCD8NUA5yvSAM1yzgAsxsoA6ibHAPyVwwA2FMAAjKK8AM1BuQDd8rUAh7ayAKqNrwD8eKwAXnmpAHiPpgAUvKMA5v+gAJhbngDgz5sAUF2ZAJwElwBBxpQA7qKSAAqbkAA+r44A3N+MAIItiwB8mIkARCGIAC3IhgCWjYUAynGEABB1gwCol4IAzNmBAKU7gQBqvYAAI1+AAAAhgAACA4AALwWAAJgngAAZaoAAvsyAAFhPgQDT8YEA/bOCALGVgwColoQArraFAHT1hgCoUogA+82JAABniwBgHY0AnfCOAFLgkADu65IABxOVAPRUlwBGsZkAQSecAGa2ngD6XaEAYB2kAODzpgDG4KkAUeOsAMr6rwBbJrMASGW2ALC2uQDLGb0Ato3AAJkRxACKpMcArUXLAA70zgDGrtIA6HTWAHNF2gCJH94AEwLiADrs5QDg3OkAI9PtAPHN8QBVzPUAR835AMzP/QDX0gEAdNUFAJbWCQA+1Q0AbNARACHHFQBXuBkAHaMdAGaGIQBGYSUAvzIpANj5LACntTAAMGU0AJEHOADWmzsAICE/AIiWQgA0+0UAQU5JAOaOTAA+vE8AmNVSAA3aVQD3yFgAh6FbAAtjXgDVDGEANJ5jAIYWZgAudWgAirlqABjjbAA68W4AfuNwAFa5cgBacnQADw52ABqMdwAN7HgAnC16AHBQewA8VHwAzDh9ANT9fQAzo34AuCh/AD2OfwC1038AAvl/ACD+fwAR438A1Kd/AHxMfwAp0X4A4TV+AOx6fQBcoHwAeqZ7AH6NegCwVXkAWv93AN6KdgCK+HQA0EhzABl8cQDOkm8AgI1tAJxsawC2MGkAYNpmACJqZACt4GEAlj5fAImEXAA/s1kAWstWAKzNUwDiulAA0pNNADhZSgDyC0cAx6xDAJ48QABGvDwAsCw5AK6ONQBA4zEAOisuAKRnKgBYmSYAYMEiAKXgHgAm+BoA5QgXAM4TEwD3GQ8ASRwLANcbBwCXGQMAkRb/AMkT+wA2EvcA6xLzANcW7wAOH+sAeyznAC5A4wAYW98AOn7bAIiq1wD/4NMAhiLQACVwzACqysgAIzPFAFeqwQBDMb4Atsi6AJJxtwCwLLQA3/qwAOrcrQCk06oAwt+nABACpQA+O6IA/4ufAAb1nAD2dpoAZhKYAArIlQBQmJMA7oORAESLjwDwro0AUu+LAOxMigAYyIgASGGHAMgYhgD07oQAEeSDAGb4ggAsLIIAmH+BANTygAAEhoAAQjmAAKgMgAAyAIAA+BOAAONHgADum4AABhCBAAakgQDRV4IANSuDAP0dhADuL4UAxGCGACywhwDYHYkAcKmKAHxSjAC0GI4AfPuPAID6kQArFZQA9EqWAF2bmAC9BZsAiomdABYmoAC/2qIA0aalAKaJqABsgqsAf5CuAAOzsQA+6bQAWzK4AISNuwDo+b4AoHbCANsCxgCinckAIEbNAFX70ABpvNQAUojYADZe3AACPeAA1yPkAKMR6AB+BewAV/7vADz78wAj+/cAEf37AAEAAADuAgQA3AQIAMcEDACmARAAhvoTAFnuFwAr3BsA/cIfAMyhIwCsdycAmEMrAKoELwDhuTIAXWI2ACf9OQBciT0AHAZBAHhyRACozUcAwhZLAPpMTgCEb1EAkX1UAF12VwAuWVoAQCVdAOzZXwB1dmIAQ/pkAKRkZwAKtWkA1uprAIIFbgB+BHAAVedxAHytcwCUVnUAKOJ2ANFPeABAn3kADtB6AAbiewDI1HwAM6h9APZbfgD8734AEmR/ABu4fwAO7H8Axv9/AF/zfwC4xn8AAHp/ACoNfwBogH4A1tN9AJgHfQDwG3wADBF7ADbneQC8nngA5Dd3ABazdQCuEHQAEFFyALx0cAASfG4ArmdsAPo3agCW7WcADIllAPwKYwD9c2AAxsRdAO79WgA8IFgAYSxVABAjUgAmBU8ATtNLAG6OSABLN0UAvM5BAKhVPgDgzDoAUjU3AOCPMwB13S8ABB8sAHdVKADHgSQA6KQgANG/HACG0xgA8uAUACnpEAAU7QwAy+0IADfsBABw6QAAZ+b8ACrk+AC24/QAC+bwADDs7AAc9+gA2gflAFkf4QCkPt0Ao2bZAGKY1QDA1NEAxRzOAExxygBW08YAtkPDAGbDvwA2U7wAD/S4AMemtQAwbLIAHEWvAFcyrAChNKkAx0ymAHJ7owBtwaAAUh+eAN2VmwCiJZkASc+WAGSTlACAcpIAMm2QAOeDjgAyt4wAdAeLACJ1iQCoAIgAS6qGAIhyhQCBWYQApl+DABaFggAayoEA3C6BAICzgAAuWIAA8ByAAN4BgAAAB4AASCyAAMdxgABE14AA0lyBACYCggA4x4IAw6uDAI+vhABo0oUA7hOHAOpziADs8YkArI2LAKRGjQCIHI8AwA6RAO0ckwByRpUA1oqXAHfpmQDOYZwAKvOeAPScoQB6XqQACjenAPElqgBqKq0AwEOwABpxswDBsbYAygS6AHppvQDf3sAAKmTEAG/4xwDQmssAWUrPACgG0wBAzdYAu57aAJl53gDlXOIAp0fmAOA46gCTL+4AwyryAGop9gCMKvoAKC3+ADUwAgC5MgYArDMKAA0yDgDgLBIAHCMWAMoTGgDp/R0AfOAhAIi6JQAdiykANlEtAPMLMQBVujQAc1s4AGvuOwBGcj8AOOZCAExJRgC8mkkAotlMADkFUACsHFMAOh9WACIMWQCe4lsAB6JeAJtJYQC62GMAwk5mAASraAAA7WoADhRtALAfbwBiD3EAoOJyAP+YdAAIMnYAVq13AIwKeQBSSXoAVml7AFJqfAACTH0ALA5+AKqwfgBCM38A5JV/AG7YfwDK+n8AAv1/AADffwDZoH8AnEJ/AFfEfgA0Jn4AWmh9AO6KfAA4jnsAaHJ6ANQ3eQC63ncAiGd2AHzSdAAiIHMAxlBxAPJkbwAWXW0AujlrAGr7aACqomYAJzBkAGKkYQAcAF8A7ENcAIhwWQCkhlYAA4dTAFRyUAB8SU0AHg1KADe+RgByXUMAyus/AAZqPAAS2TgA1zk1ADGNMQAb1C0AfA8qAElAJgB3ZyIAAoYeANecGgAFrRYAdbcSADm9DgBCvwoAm74GAD68AgAzuf4Aerb6ABa19gAHtvIAT7ruAPPC6gDq0OYAOOXiANkA3wDCJNsA+FHXAGCJ0wAAzM8AtRrMAIF2yAA+4MQA3FjBAD/hvQA6eroAviS3AIbhswCCsbAAYZWtAAiOqgAinKcAfMCkAMj7oQC2Tp8A/bmcADI+mgAE3JcACJSVAMpmkwDiVJEAzl6PAAiFjQAXyIsAVCiKAD2miAApQocAbvyFAGrVhABYzYMAiOSCACwbggB8cYEAnOeAALd9gADgM4AALgqAAK8AgABYF4AANk6AACilgAAoHIEAELOBALxpggD6P4MAnjWEAF5KhQD+fYYALtCHAJRAiQDazooAmnqMAGRDjgDOKJAAVCqSAHxHlAC6f5YAgNKYAD4/mwBKxZ0AFGSgAOIaowAO6aUA6M2oAKjIqwCe2K4A9vyxAPE0tQC5f7gAf9y7AGRKvwCTyMIAJVbGADryyQDlm80APVLRAFIU1QA04dgA6bfcAIKX4AD+fuQAZm3oALxh7AAAW/AAM1j0AFhY+ABkWvwAYV0AAEBgBAANYggAtWEMAEleEAC5VhQADUoYAEg3HABmHSAAcvsjAHXQJwBtmysAdlsvAI0PMwDWtjYAVFA6AC/bPQB2VkEATsFEAOAaSABLYksAxJZOAHq3UQCbw1QAeLpXADObWgA4ZV0AsBdgAAiyYgCGM2UAlptnAJLpaQD0HGwAGjVuAJExcADMEXIAWdVzAMR7dQCiBHcAk294ADe8eQBD6noAXPl7AFTpfADRuX0AxGp+ANb7fgAMbX8AKb5/ACjvfwD//38AnvB/ABjBfwBpcX8AsgF/AAhyfgCRwn0AevN8APQEfABA93oAnsp5AFh/eADMFXcAQI51ADLpcwDyJnIAAUhwANVMbgDmNWwAxgNqAPi2ZwAWUGUAvM9iAIE2YAAdhV0AKrxaAG7cVwCU5lQAYttRAJe7TgAFiEsAakFIALDoRACUfkEACgQ+AOB5OgAG4TYAWjozANOGLwBOxysA0vwnADwoJACWSiAA0GQcAOB3GADThBQAkIwQADKQDACekAgA7I4EAA2MAAATifwA7ob4ALaG9ABWifAA4I/sAEyb6ACXrOQAxsTgAM7k3ACpDdkAUUDVALl90QDSxs0AkBzKANh/xgCW8cIAs3K/AAgEvAB3prgA2Vq1AP4hsgC8/K4A2+urABbwqABECqYABDujACSDoABC450ADFybAC3umAAumpYAvGCUAFVCkgCHP5AA2liOALyOjACo4YoAC1KJAETghwC0jIYAsleFAIJBhAB6SoMAyHKCAK26gQBUIoEA36mAAHdRgAAlGYAAAgGAAAwJgABMMYAApnmAAB7igACCaoEAyBKCALDaggAZwoMAt8iEAF3uhQCxMocAZJWIACYWigCKtIsAL3CNAKhIjwBxPZEAHk6TABx6lQDmwJcA6iGaAIacnAAoMJ8AINyhAMKfpABmeqcASGuqALBxrQDijLAAAbyzAGD+tgAMU7oASrm9ACswwQDYtsQAdkzIAArwywDEoM8Am13TALYl1wAQ+NoAv9PeAMO34gAmo+YA6JTqABGM7gCWh/IAiYb2ANGH+gCIiv4Ajo0CAP2PBgC7kAoA1o4OAEiJEgANfxYAL28aAKVYHgB/OiIAtxMmAGLjKQCAqC0AI2IxAF0PNQA6rzgA2kA8AFHDPwC+NUMARpdGAAnnSQA9JE0AAE5QAJxjUwA3ZFYAGk9ZAI4jXADG4F4ANIZhAAoTZADEhmYAquBoADQgawDORG0A6k1vAAk7cQCwC3MAZL90AL5VdgBYzncAyCh5AMpkegD7gXsAIIB8APpefQA+Hn4A371+AIk9fwBGnX8A4Nx/AFT8fwCc+38Artp/AJ2ZfwBxOH8ASbd+AEAWfgCFVX0AQHV8ALJ1ewAWV3oAtBl5ANy9dwDuQ3YANKx0ADb3cgA4JXEA2DZvAHQsbQCiBmsA3MVoAMpqZgDp9WMA72dhAG3BXgAaA1wApi1ZAL1BVgAsQFMAoClQAPX+TADnwEkATnBGAAAOQwDQmj8Aphc8AFuFOADc5DQADDcxAOJ8LQA+tykAJ+clAHwNIgBMKx4AekEaABpRFgATWxIAdGAOADRiCgBaYQYA414CANZb/gAxWfoA9lf2AC9Z8gDMXe4A6GbqAGB15gBWiuIAqKbeAGLL2gB8+dYA2jHTAJB1zwBmxcsAcSLIAH2NxACAB8EAXZG9AOgrugAJ2LYAjJazAEposAAITq0AlkiqALNYpwAXf6QAhryhAKIRnwAif5wAqwWaANWllwBCYJUAfDWTABYmkQCJMo8AaluNAAyhiwAGBIoAnISIAEojhwBY4IUAHbyEAOW2gwDq0IIAcQqCAJ9jgQCs3IAAqnWAAMUugAD6B4AAagGAAAEbgADKVIAApq6AAJIogQBawoEA6HuCAARVgwB+TYQAEGWFAHybhgBq8IcAkGOJAIj0igDtoowAW26OAFJWkABoWpIABHqUALq0lgDcCZkA8HibAEQBngA+oqAAPFujAHgrpgBcEqkADw+sAOcgrwAUR7IAyYC1AD/NuACcK7wABJu/AKgawwCNqcYA70bKAMXxzQA8qdEAVWzVACY62QCzEd0AEfLgADPa5AA3yegAAr7sALS38AAxtfQAjrX4ALy3/AC+ugAAlL0EADK/CACnvgwA2roQAOeyFACzpRgAUpIcAMR3IAABVSQAKCkoACvzKwAosi8AIGUzADELNwBjozoA3Sw+AK6mQQAAEEUA82dIAK6tSwBi4E4AQP9RAIEJVQBY/lcAGN1aAPCkXQBNVWAAXu1iAJpsZQBN0mcA6B1qAM9ObAB+ZG4AY15wAAw8cgD0/HMAtKB1AOImdwAOj3gA99h5ACoEewB9EHwAkP18ADzLfQBAeX4AeAd/ALt1fwDzw38ABfJ/AO7/fwCi7X8ALLt/AJVofwDz9X4AZGN+AAuxfQAW33wAuu17ADDdegDDrXkAul94AGzzdgA2aXUAccFzAJj8cQAOG3AAVh1uAOwDbABWz2kAI4BnAOwWZQBElGIA1fhfAEJFXQA2eloAcphXAJqgVACFk1EA43FOAI48SwBG9EcA7JlEAEouQQBKsj0AwiY6AJuMNgC95DIAEjAvAIZvKwATpCcAoM4jADbwHwC4CRwAOBwYAJ8oFAD5LxAAPzMMAHQzCACYMQQAsi4AALgr/AC/KfgAtSn0AKws8ACbM+wAgj/oAGpR5AA/auAADYvcAMK02ABY6NQAyCbRAP5wzQDqx8kAfSzGAJWfwgAjIr8A/LS7AAZZuAAQD7UA+texAIe0rgCGpasAwKuoAOrHpQDL+qIADkWgAGKnnQB6IpsA47aYAFVllgBILpQAZRKSAB4SkAACLo4AhmaMABy8igAuL4kAKMCHAFRvhgAkPYUAvymEAJY1gwC4YIIAh6uBAAsWgQCHoIAAAUuAAKAVgABoAIAAYguAAIw2gADRgYAAMu2AAH54gQCmI4IAcO6CAKrYgwAo4oQAkgqGALBRhwAlt4gAljqKAK7biwDymY0ABnWPAFpskQCOf5MA+q2VADX3lwCJWpoAe9ecAFZtnwB6G6IAQuGkAOy9pwDOsKoAJLmtACjWsAAWB7QAJEu3AHWhugA4Cb4AnIHBAKYJxQCWoMgAaEXMAED3zwAstdMAPX7XAH1R2wD0Ld8AtBLjAK7+5gAA8eoAkujuAHjk8gCm4/YAIOX6AOLn/gDs6gIAOO0GAMftCgCY6w4ApOUSAPXaFgCCyhoAVLMeAG6UIgDUbCYAkjsqAK7/LQA8uDEARWQ1AOYCOQApkzwAORRAACCFQwAZ5UYAMjNKAKpuTQCkllAAWKpTAAqpVgDmkVkAQmRcAF0fXwCQwmEAKk1kAI++ZgATFmkANVNrAFB1bQDqe28AdmZxAH80cwCN5XQAOHl2ABbvdwDGRnkA/396AF6aewCwlXwAqnF9ABIufgDKyn4Akkd/AGGkfwAS4X8AmP1/APD5fwAa1n8AGJJ/AAgufwD0qX4ADAZ+AGxCfQBRX3wA6Vx7AIA7egBW+3gAwJx3ABIgdgC2hXQAAc5yAHj5cAB/CG8AlvtsAE7TagAgkGgAqjJmAH+7YwA+K2EAjoJeABrCWwCS6lgAqfxVACn5UgDA4E8ASrRMAIJ0SQBEIkYAZr5CALZJPwAmxTsAhDE4AMiPNADN4DAAjSUtAO5eKQDsjSUAc7MhAIPQHQAU5hkAH/UVAKf+EQCoAw4AHwUKABkEBgCGAQIAef79AOj7+QDh+vUAV/zxAFsB7gDeCuoA7hnmAHwv4gCNTN4AFnLaABCh1gB12tIALx/PADxwywB5zscA3TrEAEe2wACcQb0AvN25AHyLtgC6S7MAOx+wAN4GrQBPA6oAdBWnAOI9pAB2faEAv9SeAIJEnABWzZkA32+XALQslQBpBJMAfveQAI4GjwD6MY0ATXqLAO7fiQA8Y4gArwSHAH7EhQAXo4QArqCDAJW9ggDz+YEADlaBAPfRgADnbYAA6CmAAA8GgABmAoAA8h6AAJxbgABwuIAANjWBAOvRgQBajoIATmqDAKJlhAACgIUAOLmGAOwQiADIhokAchqLAILLjACImY4AGYSQAKyKkgDQrJQA6OmWAHRBmQDVspsAcD2eAKLgoAC+m6MAGm6mAPhWqQCoVawAWGmvAFyRsgDIzLUA7hq5ANl6vADM678A1GzDAB79xgC4m8oAxUfOAFAA0gBwxNUAK5PZAJNr3QCrTOEAfjXlAAwl6QBaGu0AaxTxADUS9QDMEvkAEBX9ACIYAQDdGgUAWxwJAIgbDQBtFxEAAg8VAE8BGQBQ7RwACNIgAIauJADBgSgA1kosAL4IMACYujMAbF83AFb2OgBqfj4Aw/ZBAI5eRQDbtEgA6/hLANYpTwDeRlIAMU9VABRCWAC+HlsAiORdAKaSYACJKGMAc6VlAM4IaAAFUmoAc4BsAKSTbgD8inAADWZyAFIkdABrxXUA2Eh3AFSueABq9XkA3B17AFInfACTEX0AWtx9AIGHfgDPEn8ALH5/AHbJfwCg9H8AlP9/AGTqfwD7tH8AfF9/APPpfgB8VH4AQ599AHDKfAA71nsA4sJ6AKiQeQDZP3gA0tB2AORDdQB6mXMA/9FxAN/tbwCg7W0AstFrALGaaQAXSWcAjN1kAJpYYgDyul8ANwVdABI4WgBGVFcAdFpUAH5LUQADKE4A8vBKAPimRwAFS0QA3d1AAGtgPQCE0zkAFDg2AASPMgA42S4AphcrAEBLJwDydCMAwZUfAJmuGwB6wBcAZ8wTAFTTDwBJ1gsARNYHAEXUAwBQ0f8AaM77AIvM9wDBzPMACNDvAF/X6wDM4+cARPbjAM0P4ABeMdwA7FvYAH2Q1ADrz9AARhvNAGJzyQA/2cUAt03CALTRvgAWZrsAuAu4AHTDtAAcjrEAfGyuAGRfqwCRZ6gAyIWlAL+6ogAqB6AAvGudABXpmgDcf5gAqjCWABT8kwCs4pEA7uSPAG4DjgCHPowA0paKAJAMiQBGoIcAPlKGAM0ihQBKEoQA6CCDAPVOggCcnIEADQqBAGuXgADURIAAXhKAABQAgAD4DYAAEDyAAEGKgACM+IAAvoaBAMU0ggBuAoMAhu+DANL7hAAOJ4YA7XCHACLZiABKX4oADAOMAPTDjQCeoY8AgJuRADSxkwAV4pUAtS2YAGaTmgCgEp0At6qfAAxbogDqIqUApwGoAIH2qgC+AK4Anx+xAFBStAAPmLcAAfC6AE9ZvgAn08EAmFzFANX0yADcmswA2k3QANQM1ADY1tcA/qrbAD2I3wCvbeMASlrnAB1N6wAjRe8AWUHzANBA9wBpQvsARUX/AEJIAwBzSgcAzkoLAE1IDwD8QRMAzTYXAMglGwD0DR8ASO4iAN3FJgCqkyoAxlYuADgOMgAUuTUAcFY5AFnlPAD+ZEAAYNRDAMQyRwA1f0oA7rhNABnfUADw8FMAou1WAIrUWQDEpFwAwl1fALz+YQAPh2QAJfZmAEZLaQD7hWsAmqVtAKypbwCmkXEAEl1zAHgLdQBznHYAkg94AIZkeQDwmnoAgrJ7APyqfAAYhH0ApD1+AHLXfgBXUX8AN6t/AP7kfwCY/n8ABPh/AD7RfwBSin8AWCN/AFycfgCU9X0AEy99ABxJfADkQ3sApB96ALzceABee3cAAPx1AO5edACapHIAds1wAOjZbgCIymwAup9qAC9aaABS+mUA4IBjAFruYAB+Q14A54BbAFCnWABot1UA+LFSALSXTwB3aUwA9idJABjURQCkbkIAfvg+AINyOwCS3TcAlDo0AHiKMAAeziwAigYpAJs0JQBYWSEArnUdAJmKGQAfmRUALqIRANWmDQAJqAkAz6YFACukAQAbof0AqJ75AMqd9QCPn/EA6aTtAOyu6QB/vuUAutThAH7y3QDfGNoAvkjWACGD0gDzyM4AIhvLAKh6xwBY6MMAMWXAAP/xvACyj7kAGj+2AAoBswBg1q8A1L+sAEO+qQBa0qYA5vyjAJI+oQAUmJ4AEwqcADyVmQAcOpcAZfmUAIbTkgAwyZAAv9qOANIIjQDGU4sAFLyJACVCiABI5oYA8KiFAEiKhADGioMAdKqCAMbpgQC0SIEAkMeAAGRmgABPJYAAagSAAKYDgAAkI4AAuGKAAHXCgAAmQoEAvOGBAAyhggDdf4MABX6EADibhQAz14YArjGIAD6qiQCeQIsAT/SMAPjEjgAUspAANLuSAMrflABWH5cAP3mZAPTsmwDMeZ4AOB+hAHTcowDmsKYAyZupAGScrAD+sa8AxtuyAPQYtgC+aLkAPsq8ALM8wAAjv8MAx1DHAKPwygDdnc4AgVfSAJ0c1gBJ7NkAgMXdAFyn4QDRkOUA84DpALh27QApcfEARG/1AAdw+QBtcv0AfnUBACl4BQB7eQkAZ3gNAPJzEQAVaxUA3VwZADtIHQBCLCEA7gclAE3aKABhoiwAQV8wAPIPNACMszcAJ0k7ANPPPgC8RkIA7qxFAKUBSQD5Q0wAInNPAE6OUgC6lFUAmIVYAD9gWwDeI14A3M9gAHZjYwAY3mUAGj9oAOSFagDjsWwAjMJuAFq3cADQj3IAdkt0ANzpdQCZancAUc14AKQRegBFN3sA6j18AE4lfQA87X0AeZV+AOYdfwBWhn8AuM5/APL2fwD+/n8A2+Z/AIqufwAgVn8ArN1+AFRFfgA2jX0AirV8AHq+ewBRqHoASnN5ALwfeAD2rXYAWB51AEJxcwAqp3EAdcBvAKy9bQBGn2sAzmVpANgRZwDwo2QAwBxiANx8XwD7xFwAvfVZAOgPVwAoFFQARANRAADeTQAopUoAiFlHAPn7QwBOjUAAaA49ACiAOQBz4zUAKjkyAEuCLgCsvyoAWPImADMbIwA5Ox8AaVMbALNkFwAjcBMAp3YPAE15CwAQeQcA7XYDAPRz/wAUcfsAYG/3ANJv8wBrc+8AMXvrAB6I5wAwm+MAbLXfAMDX2wAxA9gAsTjUAC550AClxcwA+h7JAB6GxQD6+8EAZ4G+AFYXuwCQvrcAAHi0AGZEsQCfJK4AbBmrAJMjqADUQ6UA5HqiAH/JnwBEMJ0A6q+aAAhJmAA5/JUAHMqTACqzkQD/t48ADNmNANIWjAC7cYoAOuqIAKSAhwBkNYYAvgiFAA77gwCEDIMAcT2CAPeNgQBO/oAAlo6AAOo+gABgD4AAAgCAANYQgADWQYAA95KAACYEgQBBlYEAKkaCALAWgwCgBoQAvxWFAMhDhgBwkIcAWvuIAECEigCiKowAOO6NAG7OjwDkypEAEuOTAGgWlgBuZJgAdsyaAPtNnQBO6J8AzJqiAMZkpQCORagAYDyrAItIrgA6abEAtJ20ACLltwCvPrsAjam+ANEkwgCrr8UALEnJAHDwzACOpNAAjmTUAJAv2ACLBNwAmuLfALzI4wDutecASqnrALah7wBKnvMA9J33AMCf+wCeov8AnqUDAKanBwDOpwsA/6QPAESeEwCbkhcAAYEbAH5oHwAYSCMAyh4nALLrKgC/rS4AHmQyAMQNNgDcqTkAbDc9AJ61QAB+I0QASoBHAAzLSgAMA04AYydRAFY3VAAaMlcA8BZaAB3lXADwm18AsDpiAMrAZAB4LWcATIBpAH+4awCv1W0AMtdvAJq8cQBqhXMAIjF1AG6/dgDQL3gABIJ5AKC1egBmynsAAsB8AEaWfQDwTH4A1uN+ANpafwDKsX8Apuh/AFX/fwDM9X8AJMx/AEeCfwBlGH8Aho5+ANHkfQB8G30AojJ8AJwqewCOA3oA2b14AMRZdwCo13UA7Dd0APh6cgAwoXAAIqtuADGZbAD8a2oA+iNoAM3BZQAGRmMASLFgADgEXgCFP1sA22NYAP5xVQCYalIAhE5PAHYeTABF20gAxIVFAMIeQgAjpz4Awh87AICJNwBJ5TMAAjQwAJ92LAAIrigAP9skACX/IADKGh0AFC8ZABA9FQCvRREA+kkNAOlKCQCHSQUAzEYBAMJD/QBnQfkAvED1AMpC8QCGSO0AAFPpACRj5QAEeuEAhZjdALm/2QCC8NUA5yvSAMxyzgAsxsoA7ibHAPiVwwA4FMAAjKK8AMpBuQDi8rUAhLayAKyNrwD8eKwAXnmpAHaPpgAWvKMA5v+gAJdbngDgz5sAUF2ZAJsElwBExpQA6aKSAA+bkAA5r44A4t+MAH4tiwB9mIkAQiGIAC/IhgCYjYUAyHGEABB1gwCol4IAytmBAKo7gQBkvYAAKF+AAP0ggAAEA4AALgWAAJgngAAZaoAAvsyAAFhPgQDT8YEA/rOCALCVgwColoQArraFAHT1hgCoUogA/M2JAP9miwBgHY0AnvCOAE/gkAD065IAABOVAPtUlwA+sZkARyecAGK2ngD+XaEAXR2kAOLzpgDD4KkAVOOsAMj6rwBdJrMARmW2ALG2uQDLGb0At43AAJcRxACMpMcArEXLAA30zgDKrtIA4XTWAHtF2gCBH94AGgLiADXs5QDi3OkAI9PtAPHN8QBUzPUASc35AMjP/QDc0gEAcdUFAJfWCQA91Q0AbtARAB/HFQBauBkAGqMdAGeGIQBHYSUAvTIpANr5LACmtTAAMGU0AJIHOADUmzsAIiE/AIiWQgAy+0UARE5JAOCOTABGvE8Aj9VSABbaVQDwyFgAiqFbAApjXgDUDGEAN55jAIQWZgAudWgAjLlqABXjbAA+8W4AeONwAFy5cgBWcnQAEg52ABiMdwAM7HgAny16AG1QewBAVHwAxzh9ANj9fQAwo34Auyh/ADqOfwC4038A//h/ACP+fwAO438A1ad/AH9MfwAk0X4A5jV+AOh6fQBeoHwAe6Z7AHyNegCwVXkAXP93ANyKdgCM+HQAz0hzABZ8cQDUkm8Aeo1tAKBsawC0MGkAYNpmACJqZACw4GEAkD5fAJCEXAA4s1kAXstWAKzNUwDhulAA0pNNADlZSgDwC0cAyqxDAJw8QABGvDwAryw5AK+ONQBA4zEAOisuAKRnKgBXmSYAYcEiAKTgHgAo+BoA4ggXANITEwDyGQ8ATRwLANQbBwCaGQMAkBb/AMgT+wA3EvcA6hLzANkW7wAMH+sAfSznACxA4wAbW98AN37bAIqq1wD94NMAiiLQAB9wzACvysgAHzPFAFuqwQBAMb4AuMi6AJBxtwCyLLQA3fqwAOzcrQCi06oAwt+nABICpQA6O6IABIyfAAP1nAD0dpoAaxKYAATIlQBVmJMA7IORAEWLjwDvro0AU++LAOlMigAcyIgARmGHAMgYhgD07oQAEeSDAGf4ggAsLIIAln+BANbygAAChoAARjmAAKIMgAA5AIAA8hOAAOdHgADsm4AABhCBAAakgQDSV4IANCuDAP4dhADuL4UAw2CGACywhwDaHYkAbqmKAH5SjACyGI4AfPuPAIP6kQAnFZQA90qWAFqbmADABZsAiImdABgmoAC82qIA1KalAKSJqABsgqsAgpCuAP6ysQBD6bQAVzK4AIaNuwDm+b4ApHbCANYCxgConckAGUbNAFv70ABkvNQAVojYADRe3AACPeAA1yPkAKQR6AB9BewAV/7vAD378wAh+/cAE/37AP///wDvAgQA3QQIAMUEDACnARAAhfoTAFruFwAs3BsA+sIfAM+hIwCpdycAnEMrAKcELwDjuTIAXGI2ACf9OQBeiT0AGAZBAH1yRAClzUcAwxZLAPpMTgCEb1EAkH1UAGB2VwAqWVoARCVdAOjZXwB3dmIAQvpkAKRkZwALtWkA1uprAIAFbgCBBHAAUOdxAIKtcwCQVnUAK+J2AM5PeABCn3kADtB6AATiewDM1HwALqh9APpbfgD6734AEmR/ABy4fwAM7H8Ayv9/AFrzfwC+xn8A+Hl/ADENfwBmgH4A1tN9AJgHfQDuG3wADhF7ADbneQC8nngA4jd3ABqzdQCqEHQAE1FyALl0cAAVfG4ArWdsAPo3agCW7WcADIllAPoKYwAAdGAAwsRdAPL9WgA6IFgAYCxVABQjUgAiBU8AUNNLAG2OSABKN0UAwM5BAKZVPgDgzDoAUjU3AN+PMwB33S8ABB8sAHZVKADHgSQA6KQgANK/HACE0xgA9OAUACfpEAAW7QwAye0IADnsBABt6QAAa+b8ACbk+AC54/QACebwADHs7AAd9+gA2AflAFsf4QChPt0Ap2bZAF6Y1QDE1NEAwRzOAFFxygBS08YAuEPDAGTDvwA2U7wAEvS4AMSmtQAybLIAGUWvAFkyrACiNKkAxEymAHZ7owBpwaAAVR+eANyVmwCgJZkATM+WAGKTlACCcpIAMG2QAOiDjgAyt4wAcweLACV1iQCiAIgAU6qGAIJyhQCEWYQApl+DABKFggAgyoEA2C6BAIKzgAAsWIAA8ByAAOEBgAD8BoAATSyAAMBxgABL14AAzFyBACsCggA2x4IAwauDAJSvhABg0oUA9hOHAOVziADw8YkAqI2LAKZGjQCIHI8AwA6RAO8ckwBwRpUA1oqXAHfpmQDNYZwAKvOeAPicoQB1XqQADjenAO4lqgBrKq0AwEOwABtxswC/sbYAzgS6AHZpvQDf3sAALGTEAG34xwDSmssAWErPACcG0wBDzdYAuJ7aAJp53gDlXOIApkfmAOI46gCRL+4AxCryAGgp9gCOKvoAJy3+ADUwAgC5MgYArDMKAAwyDgDhLBIAHCMWAMoTGgDp/R0AfOAhAIe6JQAeiykANlEtAPILMQBWujQAcls4AGruOwBIcj8AN+ZCAE1JRgC7mkkAotlMADgFUACuHFMAOh9WACIMWQCe4lsABqJeAJxJYQC62GMAwk5mAASraAD+7GoAERRtAK0fbwBlD3EAnuJyAACZdAAGMnYAWK13AIsKeQBUSXoAVGl7AFRqfAD+S30AMg5+AKKwfgBJM38A4JV/AG/YfwDM+n8A/vx/AATffwDYoH8AnEJ/AFbEfgA1Jn4AWGh9APGKfAA2jnsAanJ6ANA3eQDA3ncAgGd2AITSdAAcIHMAyVBxAPJkbwAUXW0AvzlrAGL7aACyomYAIDBkAGikYQAZAF8A7kNcAIRwWQCphlYA/IZTAFxyUAB1SU0AJA1KADK+RgB1XUMAyus/AARqPAAV2TgA1Dk1ADKNMQAc1C0Aew8qAElAJgB5ZyIA/YUeANycGgABrRYAebcSADa9DgBEvwoAmb4GAD68AgA1uf4AeLb6ABe19gAGtvIAULruAPTC6gDm0OYAPOXiANUA3wDGJNsA9lHXAGCJ0wAAzM8AthrMAIB2yAA/4MQA3FjBAD3hvQA+eroAuCS3AIzhswB8sbAAZpWtAAaOqgAhnKcAfsCkAMX7oQC6Tp8A+LmcADY+mgAC3JcACpSVAMhmkwDkVJEAy16PAAyFjQATyIsAViiKAD2miAApQocAbvyFAGrVhABYzYMAiOSCAC0bggB6cYEAneeAALd9gADfM4AAMQqAAKwAgABZF4AANk6AACilgAApHIEAD7OBALppggD+P4MAmjWEAGJKhQD7fYYAMNCHAJJAiQDczooAmHqMAGZDjgDNKJAAVCqSAHxHlAC4f5YAhNKYADo/mwBOxZ0AEmSgAOAaowAS6aUA5M2oAKzIqwCc2K4A9vyxAPI0tQC4f7gAfty7AGZKvwCSyMIAJ1bGADjyyQDmm80APFLRAFMU1QAz4dgA6bfcAIOX4AD8fuQAaG3oALth7AD/WvAANlj0AFRY+ABoWvwAXl0AAEJgBAALYggAt2EMAEheEAC4VhQAD0oYAEY3HABoHSAAcvsjAHLQJwBwmysAdFsvAJAPMwDTtjYAVlA6AC3bPQB2VkEAUMFEANwaSABQYksAwJZOAHu3UQCcw1QAdrpXADabWgA2ZV0AsBdgAAmyYgCFM2UAl5tnAJPpaQDwHGwAHjVuAI0xcADQEXIAVtVzAMZ7dQCgBHcAlG94ADi8eQBB6noAX/l7AFDpfADWuX0Av2p+ANv7fgAJbX8AKL5/ACzvfwD7/38ApPB/ABTBfwBscX8AsAF/AAlyfgCPwn0AffN8APIEfABB93oAnsp5AFd/eADMFXcAQY51ADLpcwDwJnIABEhwANFMbgDqNWwAxANqAPi2ZwAWUGUAvM9iAII2YAAchV0AKrxaAHDcVwCS5lQAYttRAJq7TgD/h0sAcUFIAKroRACYfkEACAQ+AOF5OgAE4TYAXTozANCGLwBRxysAz/wnAD4oJACWSiAAzWQcAOV3GADNhBQAlowQAC6QDACfkAgA7Y4EAAyMAAATifwA74b4ALWG9ABXifAA34/sAEyb6ACXrOQAx8TgAM3k3ACpDdkAUUDVALh90QDUxs0AjRzKANt/xgCU8cIAtHK/AAcEvAB3prgA2lq1AP4hsgC+/K4A1uurABvwqAA+CqYACzujAB6DoABH450AClybACzumAAwmpYAumCUAFZCkgCJP5AA2FiOALyOjACo4YoAC1KJAELghwC5jIYArFeFAIdBhAB4SoMAxnKCALC6gQBSIoEA4KmAAHdRgAAkGYAABAGAAAwJgABKMYAApnmAAB7igACEaoEAxxKCALDaggAWwoMAvMiEAFruhQCyMocAZJWIACYWigCKtIsAL3CNAKhIjwBwPZEAIE6TABp6lQDowJcA6SGaAIacnAAoMJ8AHtyhAMafpABleqcARmuqALNxrQDdjLAABryzAF7+tgAMU7oATLm9ACYwwQDftsQAcEzIABDwywDAoM8AnV3TALQl1wAS+NoAvtPeAMS34gAmo+YA55TqABKM7gCWh/IAiIb2ANOH+gCGiv4Aj40CAP2PBgC5kAoA2Y4OAEWJEgAPfxYALW8aAKhYHgB6OiIAvhMmAFzjKQCEqC0AIGIxAF0PNQA7rzgA20A8AFDDPwC+NUMARpdGAAnnSQA8JE0AAk5QAJljUwA6ZFYAGU9ZAIwjXADJ4F4AMoZhAAwTZADDhmYAqOBoADggawDKRG0A7k1vAAY7cQCyC3MAYr90AMBVdgBWzncAyih5AMpkegD4gXsAJoB8APFefQBIHn4A1r1+AJA9fwBCnX8A4tx/AFP8fwCd+38ArNp/AKCZfwBsOH8ATrd+ADwWfgCIVX0AQHV8ALB1ewAWV3oAtBl5AN29dwDuQ3YANqx0ADL3cgA8JXEA1jZvAHYsbQCcBmsA5cVoAMJqZgDw9WMA6WdhAHDBXgAZA1wApi1ZAL1BVgAqQFMApClQAPH+TADqwEkATHBGAAEOQwDPmj8AqRc8AFaFOADh5DQACjcxAOJ8LQA/tykAJOclAIANIgBHKx4AgkEaABJRFgAZWxIAb2AOADhiCgBYYQYA5V4CANRb/gAxWfoA91f2AC5Z8gDOXe4A5WbqAGN15gBUiuIAqKbeAGTL2gB4+dYA4DHTAIh1zwBuxcsAaiLIAIGNxAB/B8EAXJG9AOorugAI2LYAjJazAEhosAAMTq0Ak0iqALVYpwAVf6QAhryhAKIRnwAkf5wAqQWaANallwBBYJUAfDWTABcmkQCKMo8AaFuNAA6hiwAEBIoAnoSIAEgjhwBa4IUAGryEAOi2gwDp0IIAbwqCAKRjgQCl3IAAsHWAAMIugAD8B4AAaAGAAAIbgADIVIAAqq6AAI4ogQBcwoEA53uCAAZVgwB8TYQAEmWFAHqbhgBs8IcAkGOJAIX0igDyoowAVG6OAFpWkABgWpIADHqUALS0lgDfCZkA73ibAEIBngBEoqAANFujAH8rpgBWEqkAEw+sAOggrwAQR7IAzIC1AD3NuACcK7wAB5u/AKMawwCRqcYA7UbKAMXxzQA+qdEAUmzVACc62QC1Ed0ADvLgADfa5AAzyegABr7sALC38AA1tfQAirX4AMC3/AC8ugAAlL0EADO/CACkvgwA3roQAOWyFACzpRgAVJIcAL93IAAGVSQAJSkoAC3zKwAosi8AH2UzADELNwBjozoA3iw+AKymQQACEEUA8GdIALCtSwBi4E4AQP9RAIAJVQBa/lcAFN1aAPakXQBHVWAAYu1iAJdsZQBQ0mcA5R1qANJObAB8ZG4AY15wAA08cgDz/HMAtaB1AOImdwANj3gA9th5AC0EewB6EHwAlP18ADfLfQBEeX4AdAd/AMB1fwDuw38ACvJ/AOr/fwCm7X8AKLt/AJZofwD09X4AYmN+AA6xfQAT33wAu+17ADDdegDDrXkAvF94AGrzdgA1aXUAdMFzAJT8cQAUG3AAUR1uAO4DbABUz2kAJoBnAOoWZQBGlGIA0vhfAERFXQA2eloAcZhXAJqgVACFk1EA5HFOAI08SwBH9EcA6plEAEwuQQBIsj0AxCY6AJqMNgC+5DIAEDAvAIdvKwATpCcAoc4jADTwHwC7CRwANBwYAKIoFAD3LxAAQTMMAHIzCACbMQQAri4AALsr/AC+KfgAtCn0AK8s8ACYM+wAhD/oAGpR5AA9auAAEIvcAL602ABc6NQAxibRAP5wzQDsx8kAeSzGAJmfwgAgIr8A/rS7AAZZuAAQD7UA+dexAIa0rgCIpasAvquoAO7HpQDG+qIAEkWgAGCnnQB6IpsA5raYAFBllgBOLpQAXxKSACISkAAALo4AhmaMAB68igAsL4kAKcCHAFRvhgAhPYUAxCmEAJE1gwC9YIIAgquBABAWgQCBoIAAB0uAAJwVgABqAIAAYguAAIg2gADXgYAALu2AAIJ4gQCiI4IAcO6CAKzYgwAm4oQAlAqGALBRhwAjt4gAmTqKAKzbiwDymY0AB3WPAFpskQCNf5MA/K2VADL3lwCMWpoAedecAFZtnwB7G6IAQeGkAOy9pwDQsKoAILmtACzWsAAUB7QAJku3AHKhugA8Cb4AloHBAKwJxQCSoMgAa0XMAD33zwAvtdMAO37XAH5R2wD1Ld8AshLjALD+5gD/8OoAkujuAHnk8gCk4/YAI+X6AN/n/gDu6gIANu0GAMntCgCW6w4ApuUSAPPaFgCEyhoAUrMeAHCUIgDSbCYAkzsqAK7/LQA8uDEARmQ1AOQCOQArkzwANhRAACSFQwAV5UYANDNKAKhuTQCmllAAWKpTAAmpVgDmkVkAQmRcAF4fXwCPwmEALE1kAIy+ZgAWFmkAMlNrAFR1bQDme28AemZxAHo0cwCT5XQANHl2ABbvdwDIRnkA/H96AGCaewCwlXwAqHF9ABYufgDGyn4AlEd/AGCkfwAS4X8Amf1/APD5fwAZ1n8AGZJ/AAYufwD3qX4ACQZ+AG9CfQBOX3wA7Fx7AH47egBX+3gAvpx3ABYgdgCxhXQABs5yAHT5cAB/CG8AmvtsAErTagAjkGgAqDJmAIC7YwA+K2EAjoJeABrCWwCQ6lgArPxVACb5UgDD4E8AR7RMAIR0SQBEIkYAZL5CALlJPwAkxTsAhTE4AMePNADO4DAAjSUtAO9eKQDqjSUAdbMhAIHQHQAW5hkAHfUVAKn+EQCmAw4AIgUKABYEBgCIAQIAd/79AOv7+QDe+vUAWfzxAFoB7gDeCuoA7xnmAHsv4gCOTN4AFHLaABKh1gBz2tIAMh/PADpwywB6zscA3DrEAEi2wACcQb0Au925AH6LtgC2S7MAQh+wANUGrQBYA6oAbBWnAOk9pABwfaEAwtSeAIJEnABWzZkA32+XALQslQBmBJMAhPeQAIkGjwD8MY0ATXqLAOzfiQBAY4gAqwSHAIHEhQAUo4QAsqCDAJC9ggD4+YEAClaBAPjRgADobYAA5imAABAGgABoAoAA7h6AAKFbgABsuIAAODWBAOvRgQBYjoIAUGqDAKBlhAAEgIUAOLmGAOoQiADKhokAchqLAH/LjACOmY4AEYSQALSKkgDKrJQA6umWAHZBmQDSspsAcj2eAKLgoAC+m6MAGm6mAPhWqQCmVawAXGmvAFmRsgDKzLUA6xq5ANx6vADI678A2mzDABb9xgC/m8oAwEfOAFQA0gBuxNUAK5PZAJRr3QCrTOEAfTXlAA4l6QBXGu0AbRTxADUS9QDLEvkAExX9AB0YAQDhGgUAWRwJAIkbDQBtFxEAAg8VAE4BGQBR7RwACNIgAIWuJADCgSgA1EosAMAIMACYujMAbV83AFP2OgBrfj4Aw/ZBAIxeRQDetEgA6PhLANgpTwDdRlIAMk9VABJCWADBHlsAhORdAKySYACDKGMAeKVlAMoIaAAHUmoAcoBsAKSTbgD9inAAC2ZyAFUkdABoxXUA2kh3AFWueABn9XkA3x17AFAnfACSEX0AXtx9AHyHfgDUEn8AKH5/AHjJfwCe9H8Alv9/AGTqfwD6tH8AfF9/APTpfgB6VH4AR599AGzKfAA+1nsA3sJ6AKqQeQDaP3gA0NB2AOdDdQB3mXMAAdJxAN7tbwCg7W0AtNFrAK6aaQAaSWcAiN1kAJ5YYgDyul8ANAVdABY4WgBAVFcAe1pUAHhLUQAHKE4A7/BKAPqmRwAES0QA3t1AAGlgPQCG0zkAEjg2AAaPMgA02S4ArBcrADpLJwD3dCMAvpUfAJmuGwB8wBcAZcwTAFXTDwBJ1gsARNYHAEXUAwBQ0f8AZ877AI3M9wC/zPMACtDvAF3X6wDN4+cAQ/bjAM8P4ABcMdwA71vYAHiQ1ADwz9AAQhvNAGhzyQA62cUAuU3CALLRvgAXZrsAuQu4AHTDtAAajrEAfmyuAGFfqwCUZ6gAxoWlAL+6ogAuB6AAtmudABrpmgDYf5gArDCWABb8kwCo4pEA8uSPAGoDjgCKPowA0paKAI0MiQBKoIcAPFKGAM0ihQBKEoQA6CCDAPZOggCcnIEADAqBAGqXgADWRIAAXRKAABQAgAD4DYAADzyAAESKgACI+IAAwoaBAMI0ggBxAoMAhO+DANL7hAAOJ4YA7nCHACLZiABJX4oADQOMAPPDjQCeoY8AgpuRADCxkwAZ4pUAsi2YAGiTmgCfEp0At6qfAAxbogDrIqUApgGoAID2qgDAAK4AnR+xAFJStAAOmLcAAPC6AFJZvgAk08EAmlzFANL0yADemswA2k3QANQM1ADX1tcA/6rbADyI3wCvbeMAS1rnABtN6wAkRe8AWkHzAM1A9wBuQvsAP0X/AEdIAwBvSgcA0UoLAExIDwD9QRMAyjYXAMslGwDyDR8ASu4iANzFJgCrkyoAw1YuADwOMgARuTUAclY5AFrlPAD8ZEAAYtRDAMMyRwA1f0oA7rhNABrfUADu8FMApu1WAIbUWQDGpFwAwl1fALr+YQAUh2QAHvZmAE5LaQDzhWsAoKVtAKepbwCqkXEAEF1zAHoLdQBynHYAkA94AIpkeQDrmnoAh7J7APiqfAAahH0ApD1+AHHXfgBXUX8AOKt/APzkfwCc/n8A/vd/AELRfwBQin8AWiN/AFycfgCT9X0AEy99AB1JfADiQ3sAqB96ALjceABhe3cA/vt1AO5edACcpHIAdM1wAOnZbgCIymwAuZ9qADBaaABQ+mUA4oBjAFruYAB+Q14A54BbAE6nWABqt1UA97FSALaXTwB0aUwA+CdJABbURQCmbkIAfvg+AINyOwCS3TcAlDo0AHiKMAAeziwAigYpAJw0JQBWWSEAr3UdAJqKGQAdmRUAMaIRANOmDQAIqAkA0aYFACikAQAfof0App75AMmd9QCQn/EA6KTtAO2u6QCAvuUAt9ThAIHy3QDdGNoAv0jWACGD0gDyyM4AJRvLAKR6xwBb6MMALmXAAALyvACyj7kAFz+2AA8BswBa1q8A2r+sAD6+qQBf0qYA4vyjAJY+oQAPmJ4AGAqcADeVmQAgOpcAYvmUAIrTkgAsyZAAwtqOANAIjQDGU4sAFryJACJCiABM5oYA6qiFAFCKhAC9ioMAfqqCAL7pgQC3SIEAkMeAAGJmgABSJYAAZgSAAKoDgAAgI4AAvGKAAHLCgAAoQoEAvOGBAAqhggDef4MABX6EADibhQA214YAqTGIAEKqiQCbQIsAUvSMAPXEjgAXspAAMbuSAM7flABSH5cAQnmZAO/smwDUeZ4AMh+hAHbcowDnsKYAxJupAGqcrAD7sa8AxtuyAPcYtgC6aLkAQsq8AK48wAAnv8MAxVDHAKPwygDgnc4AfFfSAKIc1gBE7NkAhcXdAFin4QDVkOUA74DpALp27QApcfEARG/1AAdw+QBucv0AenUBAC54BQB2eQkAbHgNAO1zEQAaaxUA2FwZAD1IHQBCLCEA7gclAEzaKABkoiwAPV8wAPQPNACMszcAJEk7ANnPPgC1RkIA9KxFAKEBSQD8Q0wAIXNPAFCOUgC2lFUAnYVYADtgWwDgI14A289gAHZjYwAZ3mUAGj9oAOKFagDksWwAjcJuAFm3cADSj3IAdEt0ANzpdQCaancAUM14AKQRegBGN3sA6j18AE0lfQA87X0AeZV+AOYdfwBYhn8Atc5/APT2fwD+/n8A2uZ/AIuufwAeVn8Art1+AFNFfgA3jX0AiLV8AHu+ewBQqHoATHN5ALsfeAD2rXYAWB51AEJxcwArp3EAdMBvAK69bQBDn2sA0GVpANYRZwDyo2QAvxxiAN18XwD4xFwAwfVZAOUPVwAqFFQAQgNRAALeTQAmpUoAillHAPj7QwBOjUAAaQ49ACaAOQB04zUAKzkyAEqCLgCsvyoAWPImADMbIwA6Ox8AaFMbALRkFwAicBMAp3YPAE55CwAOeQcA73YDAPJz/wAVcfsAX2/3ANRv8wBpc+8AM3vrABuI5wAzm+MAarXfAMLX2wAxA9gArjjUADB50ACmxcwA+B7JACKGxQD0+8EAbIG+AFMXuwCSvrcA/ne0AGhEsQCdJK4AbhmrAJIjqADSQ6UA6XqiAHjJnwBKMJ0A6K+aAAZJmAA+/JUAFsqTAC6zkQD+t48ADNmNANMWjAC6cYoAOuqIAKOAhwBlNYYAvgiFAA37gwCGDIMAbz2CAPiNgQBO/oAAl46AAOg+gABgD4AAAgCAANgQgADUQYAA+5KAACAEgQBGlYEAJkaCALIWgwCgBoQAwBWFAMhDhgBukIcAW/uIAECEigCiKowAOu6NAGrOjwDoypEADuOTAGwWlgBqZJgAecyaAPlNnQBQ6J8AypqiAMhkpQCLRagAZDyrAIhIrgA7abEAtZ20ACDltwCwPrsAjam+ANAkwgCsr8UALEnJAHDwzACMpNAAkmTUAIsv2ACQBNwAl+LfALvI4wDytecARanrALuh7wBGnvMA+J33ALyf+wCiov8AmqUDAKqnBwDLpwsAAaUPAEOeEwCbkhcAAoEbAH5oHwAWSCMAzh4nAKzrKgDErS4AHGQyAMQNNgDeqTkAajc9AJy1QACCI0QASIBHAA/LSgAKA04AYidRAFg3VAAYMlcA8hZaABzlXADvm18AtDpiAMTAZAB+LWcARoBpAIS4awCt1W0AMtdvAJu8cQBnhXMAJTF1AG2/dgDQL3gABYJ5AJ+1egBkynsABcB8AESWfQDyTH4A1+N+ANVafwDPsX8Ao+h/AFb/fwDO9X8AIsx/AEiCfwBkGH8AhY5+ANPkfQB6G30ApDJ8AJoqewCQA3oA1714AMZZdwCl13UA8Dd0APR6cgA0oXAAHqtuADSZbAD6a2oA/CNoAMzBZQAGRmMASLFgADgEXgCGP1sA2mNYAP5xVQCYalIAhE5PAHYeTABF20gAxIVFAMIeQgAipz4AxR87AHyJNwBM5TMAADQwAJ92LAAKrigAPNskACj/IADHGh0AGC8ZAAw9FQCyRREA90kNAOxKCQCFSQUAzUYBAMND/QBjQfkAwUD1AMZC8QCKSO0A/VLpACZj5QAAeuEAipjdALW/2QCG8NUA5CvSAM5yzgArxsoA7SbHAPiVwwA6FMAAiqK8AMxBuQDg8rUAhLayAKyNrwD8eKwAXnmpAHaPpgAXvKMA4v+gAJ1bngDaz5sAVl2ZAJYElwBGxpQA6qKSAA2bkAA8r44A3t+MAIEtiwB8mIkAQiGIADHIhgCTjYUAzHGEAA51gwCol4IAzdmBAKY7gQBovYAAJF+AAAEhgAD+AoAANgWAAJAngAAgaoAAusyAAFlPgQDS8YEAALSCAK2VgwCsloQArLaFAHP1hgCrUogA9s2JAAZniwBcHY0AofCOAE3gkADy65IAAxOVAPhUlwBDsZkAQiecAGa2ngD6XaEAYB2kAODzpgDF4KkAU+OsAMr6rwBZJrMASWW2ALC2uQDLGb0AuI3AAJYRxACMpMcArEXLAA70zgDHrtIA5nTWAHZF2gCFH94AFwLiADbs5QDj3OkAItPtAPHN8QBVzPUAR835AMrP/QDa0gEActUFAJfWCQA91Q0AbdARACHHFQBXuBkAHKMdAGiGIQBDYSUAxDIpANP5LACrtTAALmU0AJIHOADVmzsAISE/AIiWQgA0+0UAQU5JAOOOTABCvE8AlNVSABDaVQD3yFgAhKFbAA9jXgDSDGEANJ5jAIgWZgAqdWgAkLlqABPjbAA+8W4AeuNwAFq5cgBWcnQAEw52ABaMdwAQ7HgAnC16AG5QewA+VHwAyjh9ANb9fQAyo34AuCh/AD2OfwC2038AAPl/ACL+fwAP438A1ad/AH5MfwAk0X4A5jV+AOh6fQBfoHwAeqZ7AHyNegCxVXkAWv93AN6KdgCM+HQAzkhzABh8cQDQkm8Afo1tAJ5sawC2MGkAXNpmACdqZACq4GEAmD5fAIiEXAA+s1kAWstWAK7NUwDgulAA05NNADhZSgDxC0cAyqxDAJk8QABKvDwArCw5ALOONQA84zEAPisuAJ9nKgBcmSYAXsEiAKXgHgAo+BoA4QgXANMTEwDyGQ8ATRwLANMbBwCbGQMAjxb/AMoT+wA0EvcA7RLzANYW7wAOH+sAfCznAC1A4wAYW98AOn7bAIiq1wD+4NMAhyLQACNwzACsysgAITPFAFmqwQBCMb4Atci6AJVxtwCsLLQA4PqwAOzcrQCh06oAxd+nAA4CpQA9O6IAAoyfAAX1nAD0dpoAaRKYAAbIlQBUmJMA7IORAEaLjwDtro0AVe+LAOhMigAdyIgARGGHAMsYhgDx7oQAFOSDAGP4ggAwLIIAlH+BANbygAADhoAAQjmAAKgMgAAzAIAA+BOAAOJHgADum4AABhCBAAakgQDSV4IANCuDAPwdhADyL4UAv2CGADCwhwDXHYkAbqmKAIBSjACuGI4AgfuPAH76kQAsFZQA9EqWAFybmAC+BZsAiomdABYmoAC+2qIA1KalAKGJqABygqsAeJCuAAqzsQA46bQAXzK4AIKNuwDo+b4AonbCANoCxgCinckAIEbNAFT70ABqvNQAVIjYADJe3AAHPeAA0CPkAKoR6AB5BewAWv7vADr78wAk+/cAEP37"); + + static readonly byte[] StereoUnsigned8BitToSignedResult + = Convert.FromBase64String(@"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"); + #endregion + + protected override void BeforeRun() + { + } + + private void Print(string str) + { + mDebugger.Send(str); + Console.WriteLine(str); + } + + private void Success(string str, string indent = "") + { + mDebugger.Send(str); + + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine(indent + str); + Console.ForegroundColor = ConsoleColor.White; + } + + protected override void Run() + { + Print("Cosmos Audio Infrastructure (CAI) tests started."); + + Print("Testing .WAV file decoding..."); + WaveFileTests(); + Print(".WAV tests complete."); + + Console.WriteLine(); + + Print("Testing audio format conversions..."); + ConversionTests(); + Print("Audio format conversion tests complete."); + + Success("CAI tests fully completed!"); + TestController.Completed(); + } + + void WaveFileTests() + { + var memStream = MemoryAudioStream.FromWave(Mono16BitWAVFile); + + Assert.AreEqual(1, memStream.Format.Channels, $"Channel amount parsing (parsed: {memStream.Format.Channels} channels)"); + Assert.IsTrue(memStream.Format.Signed, "Signed/unsigned parsing"); + Assert.IsTrue(memStream.Format.BitDepth == AudioBitDepth.Bits16, $"Bit-depth parsing (parsed: ID {(int)memStream.Format.BitDepth})"); + + Success("Format check correct!", " "); + + var fullBuffer = new AudioBuffer(AMT_OF_SAMPLES, new SampleFormat(AudioBitDepth.Bits16, 1, true)); + memStream.Read(fullBuffer); + Assert.AreEqual(Mono16BitWAVRawSampleData, fullBuffer.RawData, ".WAV sample data"); + Success("Data check correct!", " "); + } + + void ConversionTests() + { + // Test no change + TestConverting( + GetTestBuffer(StereoSine32Bit, AudioBitDepth.Bits32, 2, true), + new SampleFormat(AudioBitDepth.Bits32, 2, true), + StereoSine32Bit + ); + + // Test mono -> stereo + TestConverting( + GetTestBuffer(MonoSine8Bit, AudioBitDepth.Bits8, 1, true), + new SampleFormat(AudioBitDepth.Bits8, 2, true), + StereoSine8Bit + ); + + // Test stereo -> mono + TestConverting( + GetTestBuffer(StereoSine8Bit, AudioBitDepth.Bits8, 2, true), + new SampleFormat(AudioBitDepth.Bits8, 1, true), + MonoSine8Bit + ); + + // Test bit-depth upsampling, 8-bit -> 16-bit + TestConverting( + GetTestBuffer(MonoSine8Bit, AudioBitDepth.Bits8, 1, true), + new SampleFormat(AudioBitDepth.Bits16, 1, true), + MonoSine8BitTo16BitResult + ); + + // Test bit-depth downsampling, 16-bit -> 8-bit + TestConverting( + GetTestBuffer(MonoSine16Bit, AudioBitDepth.Bits16, 1, true), + new SampleFormat(AudioBitDepth.Bits8, 1, true), + MonoSine16BitTo8BitResult + ); + + // Test sign changing + TestConverting( + GetTestBuffer(StereoUnsignedSine8Bit, AudioBitDepth.Bits8, 2, false), + new SampleFormat(AudioBitDepth.Bits8, 2, true), + StereoUnsigned8BitToSignedResult + ); + + // Test 24-bit audio support + TestConverting( + GetTestBuffer(MonoSine24Bit, AudioBitDepth.Bits24, 1, true), + new SampleFormat(AudioBitDepth.Bits32, 1, true), + MonoSine24BitTo32BitResult + ); + + TestConverting( + GetTestBuffer(MonoSine32Bit, AudioBitDepth.Bits32, 1, true), + new SampleFormat(AudioBitDepth.Bits24, 1, true), + MonoSine32BitTo24BitResult + ); + } + + static AudioBuffer GetTestBuffer(byte[] array, AudioBitDepth bitDepth, byte channels, bool signed) + { + var buffer = new AudioBuffer(AMT_OF_SAMPLES, new SampleFormat(bitDepth, channels, signed)); + MemoryOperations.Copy(buffer.RawData, array); + return buffer; + } + + static string ByteArrayToString(byte[] bytes) + { + string s = "0x"; + for (int i = 0; i < 16; i++) + { + s += $"{bytes[i]:X2}"; + } + + return s; + } + + unsafe void TestConverting(AudioBuffer from, SampleFormat to, byte[] shouldBe) + { + Console.ForegroundColor = ConsoleColor.DarkGray; + Console.WriteLine("Converting " + from.Format.ToString() + " -> " + to.ToString()); + + var convertBuffer = new AudioBuffer(from.Size, to); + var writer = new AudioBufferWriter(convertBuffer, new SampleFormat(AudioBitDepth.Bits32, from.Format.Channels, true)); + var reader = new AudioBufferReader(from); + + int[] normalized = new int[from.Format.Channels]; + + fixed(int* normalizedPtr = normalized) + { + byte* normBytePtr = (byte*)normalizedPtr; + for (int i = 0; i < from.Size; i++) + { + for (int channel = 0; channel < from.Format.Channels; channel++) + { + normalized[channel] = reader.ReadChannelInt32(i, channel); + } + + writer.Write(normBytePtr, i); + } + } + + Console.WriteLine($"Converted: {ByteArrayToString(convertBuffer.RawData)}"); + Console.WriteLine($"Expected: {ByteArrayToString(shouldBe)}"); + + Assert.AreEqual(shouldBe, convertBuffer.RawData, $"Conversion from format " + from.Format.ToString() + " to " + to.ToString()); + + Success("Data check correct!", " "); + Console.WriteLine(); + } + } +} diff --git a/Tests/Kernels/AudioTests/packages.lock.json b/Tests/Kernels/AudioTests/packages.lock.json new file mode 100644 index 0000000000..e81a7756fb --- /dev/null +++ b/Tests/Kernels/AudioTests/packages.lock.json @@ -0,0 +1,2729 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/BoxingTests/BoxingTests.csproj b/Tests/Kernels/BoxingTests/BoxingTests.csproj index b0e862e6fb..50fbe61be4 100644 --- a/Tests/Kernels/BoxingTests/BoxingTests.csproj +++ b/Tests/Kernels/BoxingTests/BoxingTests.csproj @@ -1,12 +1,13 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST - + diff --git a/Tests/Kernels/BoxingTests/Kernel.cs b/Tests/Kernels/BoxingTests/Kernel.cs index 3db74a995f..45a74ce9fa 100644 --- a/Tests/Kernels/BoxingTests/Kernel.cs +++ b/Tests/Kernels/BoxingTests/Kernel.cs @@ -1,6 +1,7 @@ using System; using System.Drawing; - +using System.Text; +using Cosmos.Debug.Kernel; using Cosmos.TestRunner; using Sys = Cosmos.System; @@ -18,6 +19,7 @@ protected override void Run() TestBoxingChar(); TestBoxingInt32(); TestBoxingColorToString(); + TestBoxingStruct(); TestController.Completed(); } @@ -26,17 +28,17 @@ private void TestBoxingChar() { object xChar = 'c'; - Assert.IsTrue(xChar.ToString() == "c", "Char.ToString on boxed Char doesn't work!"); + Assert.AreEqual("c", xChar.ToString(), "Char.ToString on boxed Char doesn't work!"); // 'c' == 0x63, and the hash code is ('c' | ('c' << 16)); - Assert.IsTrue(xChar.GetHashCode() == 0x00630063, "Char.GetHashCode on boxed Char doesn't work!"); + Assert.AreEqual(0x00630063, xChar.GetHashCode(), "Char.GetHashCode on boxed Char doesn't work!"); } private void TestBoxingInt32() { object xNumber = 42; - Assert.IsTrue(xNumber.ToString() == "42", "Int32.ToString on boxed Int32 doesn't work!"); - Assert.IsTrue(xNumber.GetHashCode() == 42, "Int32.GetHashCode on boxed Int32 doesn't work!"); + Assert.AreEqual("42", xNumber.ToString(), "Int32.ToString on boxed Int32 doesn't work!"); + Assert.AreEqual(42, xNumber.GetHashCode(), "Int32.GetHashCode on boxed Int32 doesn't work!"); Assert.IsTrue(xNumber.Equals(42), "Int32.Equals on boxed int doesn't work!"); Assert.IsFalse(xNumber.Equals(5), "Int32.Equals on boxed int doesn't work!"); @@ -64,5 +66,28 @@ private void TestBoxingColorToString() object xColor = Color.Blue; Assert.IsTrue(xColor.ToString() == "Color [Blue]", "Color.ToString doesn't work on boxed Color!"); } + + + // Taken from https://github.com/CosmosOS/Cosmos/issues/1082 + private void TestBoxingStruct() + { + UTF8Encoding encoding = new UTF8Encoding(); + mDebugger.Send("Testing boxing on structs!"); + object xValBoxed = new Values("UTF-8", encoding); + bool condition = xValBoxed.Equals(xValBoxed); + Assert.IsTrue(condition, "Equality works for boxed structs"); + } + } + + struct Values + { + public string desc; + public Encoding encoding; + + public Values(string desc, Encoding encoding) + { + this.desc = desc; + this.encoding = encoding; + } } } diff --git a/Tests/Kernels/BoxingTests/packages.lock.json b/Tests/Kernels/BoxingTests/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/BoxingTests/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/ConsoleTest/ConsoleTest.csproj b/Tests/Kernels/ConsoleTest/ConsoleTest.csproj index b0e862e6fb..85c17d91ba 100644 --- a/Tests/Kernels/ConsoleTest/ConsoleTest.csproj +++ b/Tests/Kernels/ConsoleTest/ConsoleTest.csproj @@ -1,12 +1,15 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + True + diff --git a/Tests/Kernels/ConsoleTest/Kernel.cs b/Tests/Kernels/ConsoleTest/Kernel.cs index f3b2d49fba..776f0c465f 100644 --- a/Tests/Kernels/ConsoleTest/Kernel.cs +++ b/Tests/Kernels/ConsoleTest/Kernel.cs @@ -5,6 +5,7 @@ using System.Text; using Cosmos.System.ExtendedASCII; using Cosmos.System.ScanMaps; +using System.IO; /* * Please note this is an atypical TestRunner: @@ -32,92 +33,12 @@ protected override void Run() { try { - Console.Clear(); - - Console.WriteLine("Testing Console Enconding"); - - Console.WriteLine($"ConsoleInputEncoding {Console.InputEncoding.BodyName}"); - - Console.WriteLine($"ConsoleOutputEncoding {Console.OutputEncoding.BodyName}"); - - /* Let's change it in the legacy IBM437 encoding */ - Console.InputEncoding = Encoding.GetEncoding(437); - Console.OutputEncoding = Encoding.GetEncoding(437); - - Console.WriteLine($"ConsoleInputEncoding in now {Console.InputEncoding.BodyName}"); - Console.WriteLine($"ConsoleOutputEncoding in now {Console.OutputEncoding.BodyName}"); - - Console.WriteLine("Let's write some accented characters: èòàùì"); - Console.WriteLine("Let's print all the CP437 codepage"); - - Sys.Global.mDebugger.SendInternal(""); - - Console.Write("Ç ü é â ä à å ç ê ë è ï î ì Ä Å\n" + - "É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ₧ ƒ\n" + - "á í ó ú ñ Ñ ª º ¿ ⌐ ¬ ½ ¼ ¡ « »\n" + - "░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐\n" + - "└ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧\n" + - "╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀\n" + - "α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩\n" + - "≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■ \u00A0\n"); - //Console.WriteLine(); - - Console.WriteLine("The following line should appear as a continuos line of '─'"); - Console.WriteLine("──────────────────────────────────────────────────────────"); - - Console.ReadKey(); - Console.WriteLine("The next line should be empty"); - Console.WriteLine(); - Console.WriteLine("True follows..."); - Console.WriteLine(true); - Console.WriteLine("The letter 'A'"); - Console.WriteLine('A'); - char[] charBuffer = new char[] { 'A', 'B', 'C' }; - Console.WriteLine("Then ABC"); - Console.WriteLine(charBuffer); - Console.WriteLine("...42.42"); - Console.WriteLine(42.42); - Console.WriteLine("...42.42 (float)"); - Console.WriteLine(42.42f); - Console.WriteLine("...42"); - Console.WriteLine(42); - Console.WriteLine("...42 (long)"); - Console.WriteLine(42L); - Console.ReadKey(); - object test = "Test"; - Console.WriteLine("...Test (as object)"); - Console.WriteLine(test); - Console.WriteLine("The next line should be empty (null object)"); - object s = null; - Console.WriteLine(s); - Console.WriteLine("...42 (uint)"); - Console.WriteLine(42U); - Console.WriteLine("...42 (ulong)"); - Console.WriteLine(42UL); - Console.WriteLine("...BC"); - Console.WriteLine(charBuffer, 1, 2); - - Console.WriteLine("Test Format arg0 {0}", "test"); - Console.WriteLine("Test Format arg0 {0} arg1 {1}", "test", 42); - Console.WriteLine("Test Format arg0 {0} arg1 {1} arg2 {2}", "test", 42, 69.69); - Console.WriteLine("Test Format arg0 {0} arg1 {1} arg2 {2} arg3 {3}", "test", 42, 69.69, 25000L); - /* String.Format does not support x or X and probably neither the rest of "special" formatting */ - //Console.WriteLine("Test Format (hex) {0:x}", 42); - - Console.WriteLine("Layout switched to DE..."); - SetKeyboardScanMap(new DE_Standard()); - Console.WriteLine("Write in germanic now I'll read it with Console.ReadLine()..."); - - var str = Console.ReadLine(); - Console.WriteLine($"You have written: {str}"); - - Console.WriteLine("Write in germanic now I'll read it with Console.ReadKey()..."); - var character = Console.ReadKey(); - Console.WriteLine($"You have written: {character.KeyChar}"); - - Console.WriteLine("Press any key to terminate this test..."); - - Console.ReadKey(); + TestStandardInOutError(); + + TestConsoleEncoding(); + + TestVGAResolutions(); + TestController.Completed(); } catch (Exception e) @@ -125,7 +46,257 @@ protected override void Run() mDebugger.Send("Exception occurred: " + e.Message); mDebugger.Send(e.Message); TestController.Failed(); - } + } + } + + public void TestConsoleEncoding() + { + Console.Clear(); + + Console.WriteLine("Testing Console Enconding"); + + Console.WriteLine($"ConsoleInputEncoding {Console.InputEncoding.BodyName}"); + + Console.WriteLine($"ConsoleOutputEncoding {Console.OutputEncoding.BodyName}"); + + /* Let's change it in the legacy IBM437 encoding */ + Console.InputEncoding = Cosmos.System.ExtendedASCII.CosmosEncodingProvider.Instance.GetEncoding(437); + Console.OutputEncoding = Cosmos.System.ExtendedASCII.CosmosEncodingProvider.Instance.GetEncoding(437); + + Console.WriteLine($"ConsoleInputEncoding in now {Console.InputEncoding.BodyName}"); + Console.WriteLine($"ConsoleOutputEncoding in now {Console.OutputEncoding.BodyName}"); + + Console.WriteLine("Let's write some accented characters: èòàùì"); + Console.WriteLine("Let's print all the CP437 codepage"); + + Sys.Global.Debugger.SendInternal(""); + + Console.Write("Ç ü é â ä à å ç ê ë è ï î ì Ä Å\n" + + "É æ Æ ô ö ò û ù ÿ Ö Ü ¢ £ ¥ ₧ ƒ\n" + + "á í ó ú ñ Ñ ª º ¿ ⌐ ¬ ½ ¼ ¡ « »\n" + + "░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐\n" + + "└ ┴ ┬ ├ ─ ┼ ╞ ╟ ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧\n" + + "╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄ ▌ ▐ ▀\n" + + "α ß Γ π Σ σ µ τ Φ Θ Ω δ ∞ φ ε ∩\n" + + "≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■ \u00A0\n"); + //Console.WriteLine(); + + Console.WriteLine("The following line should appear as a continuos line of '─'"); + Console.WriteLine("──────────────────────────────────────────────────────────"); + + Console.ReadKey(); + Console.WriteLine("The next line should be empty"); + Console.WriteLine(); + Console.WriteLine("True follows..."); + Console.WriteLine(true); + Console.WriteLine("The letter 'A'"); + Console.WriteLine('A'); + char[] charBuffer = new char[] { 'A', 'B', 'C' }; + Console.WriteLine("Then ABC"); + Console.WriteLine(charBuffer); + Console.WriteLine("...42.42"); + Console.WriteLine(42.42); + Console.WriteLine("...42.42 (float)"); + Console.WriteLine(42.42f); + Console.WriteLine("...42"); + Console.WriteLine(42); + Console.WriteLine("...42 (long)"); + Console.WriteLine(42L); + Console.ReadKey(); + object test = "Test"; + Console.WriteLine("...Test (as object)"); + Console.WriteLine(test); + Console.WriteLine("The next line should be empty (null object)"); + object s = null; + Console.WriteLine(s); + Console.WriteLine("...42 (uint)"); + Console.WriteLine(42U); + Console.WriteLine("...42 (ulong)"); + Console.WriteLine(42UL); + Console.WriteLine("...BC"); + Console.WriteLine(charBuffer, 1, 2); + + Console.WriteLine("Test Format arg0 {0}", "test"); + Console.WriteLine("Test Format arg0 {0} arg1 {1}", "test", 42); + Console.WriteLine("Test Format arg0 {0} arg1 {1} arg2 {2}", "test", 42, 69.69); + Console.WriteLine("Test Format arg0 {0} arg1 {1} arg2 {2} arg3 {3}", "test", 42, 69.69, 25000L); + /* String.Format does not support x or X and probably neither the rest of "special" formatting */ + //Console.WriteLine("Test Format (hex) {0:x}", 42); + + Console.WriteLine("Layout switched to DE..."); + Sys.KeyboardManager.SetKeyLayout(new DEStandardLayout()); + Console.WriteLine("Write in german now I'll read it with Console.ReadLine()..."); + + var str = Console.ReadLine(); + Console.WriteLine($"You have written: {str}"); + + Console.WriteLine("Write in german now I'll read it with Console.ReadKey()..."); + var character = Console.ReadKey(); + Console.WriteLine($"You have written: {character.KeyChar}"); + + Console.WriteLine("Press any key to terminate this test..."); + + Console.ReadKey(); + + + } + + public void TestVGAResolutions() + { + Console.SetWindowSize(40, 25); + TestVariousConsoleFunctions(); + Console.SetWindowSize(40, 50); + TestVariousConsoleFunctions(); + Console.SetWindowSize(80, 25); + TestVariousConsoleFunctions(); + Console.SetWindowSize(80, 50); + TestVariousConsoleFunctions(); + Console.SetWindowSize(90, 30); + TestVariousConsoleFunctions(); + Console.SetWindowSize(90, 60); + TestVariousConsoleFunctions(); + } + + public void TestVariousConsoleFunctions() + { + Console.Clear(); + Console.WriteLine("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."); + Console.Write("Reading input: "); + Console.ReadLine(); + Console.ForegroundColor = ConsoleColor.Green; Console.BackgroundColor = ConsoleColor.Blue; + Console.WriteLine("Colored text :)"); + Console.ResetColor(); + Console.Write("Press enter to continue to the next step: "); Console.ReadLine(); + Console.WriteLine("Press a key to move the cursor up"); + Console.ReadKey(); + var cursor = Console.GetCursorPosition(); + Console.SetCursorPosition(cursor.Left, cursor.Top - 1); + } + + public void TestStandardInOutError() + { + TestInstantiation(); + TestRedirection(); + + Console.WriteLine("Let's put the StdOutput on a variable."); + Console.WriteLine("Hello World from Console!"); + var stdout = Console.Out; + stdout.WriteLine("Hello World from variable!"); + + Console.Error.WriteLine("Hellow World from Console.Error!"); + var stderr = Console.Error; + Console.WriteLine("Now the StdError"); + stderr.WriteLine("Hellow World from stderr variable!"); + + Console.WriteLine("Now let's test reading."); + var line = Console.ReadLine(); + Console.WriteLine($"You wrote {line}"); + var stdin = Console.In; + + Console.Write("Type Something Again: "); + line = stdin.ReadLine(); + Console.WriteLine($"You wrote {line}"); + } + + public void TestInstantiation() + { + TextWriter stdout, stderror; + TextReader stdin; + stdout = new StreamWriter( + stream: Console.OpenStandardOutput(), + encoding: Console.OutputEncoding) + { AutoFlush = true }; + stderror = new StreamWriter( + stream: Console.OpenStandardError(), + encoding: Console.OutputEncoding) + { AutoFlush = true }; + + stdin = new StreamReader( + stream: Console.OpenStandardInput(), + encoding: Console.InputEncoding + ); + + stdout.WriteLine("Hellow this test is to show that you can make standalone reference to StdIn/Out/Error"); + stderror.WriteLine("This two messages were writed from a standalone StdOut"); + stderror.WriteLine("This is from StdError"); + + stdout.WriteLine("Now let's try reading from a standalone StdIn variable"); + string line = stdin.ReadLine(); + stdout.WriteLine($"You wrote {line}"); + } + public void TestRedirection() + { + TextWriter redStdOut, redStdError; + TextReader redStdIn; + string expectedValue = "This is a redirected string"; + + Assert.IsFalse(Console.IsInputRedirected, "Standard Input was wrongly detected as redirected"); + Assert.IsFalse(Console.IsErrorRedirected, "Standard Error was wrongly detected as redirected"); + Assert.IsFalse(Console.IsOutputRedirected, "Standard Output was wrongly detected as redirected"); + + redStdOut = new StringWriter(); + redStdError = StreamWriter.Null; // Empty Stream Writer. + redStdIn = new StringReader(expectedValue); + + Console.SetIn(redStdIn); + Console.SetOut(redStdOut); + Console.SetError(redStdError); + + Assert.IsTrue(Console.IsInputRedirected, "Standard Input was wrongly detected as NOT redirected"); + Assert.IsTrue(Console.IsErrorRedirected, "Standard Error was wrongly detected as NOT redirected"); + Assert.IsTrue(Console.IsOutputRedirected, "Standard Output was wrongly detected as NOT redirected"); + + // Now let's test that we can use the redirected versions. + Console.WriteLine("Hello world to redirected Out!"); + Console.Error.WriteLine("Hellow world to redirected Error!"); + + string line = Console.ReadLine(); + + Assert.IsTrue(line == expectedValue, "Console.ReadLine brought unexpected Result."); + + // Now Let's return to the true values; + + // For StdOut and StdIn you can make a StreamWriter on your own or use the method on the System.Cosmos.Global.Console public field; + Console.SetOut(new StreamWriter( + stream: Console.OpenStandardOutput(), + encoding: Console.OutputEncoding) + { AutoFlush = true } // if you want the content to be writed inmediatly on the console, then AutoFlush should be true. + ); + Assert.IsFalse(Console.IsOutputRedirected, "Standard Output was wrongly detected as redirected"); + Console.SetOut( + Sys.Global.Console.CreateOutputWriter( + Console.OpenStandardOutput()) + ); + Assert.IsFalse(Console.IsOutputRedirected, "Standard Output was wrongly detected as redirected"); + + // Now with Error + Console.SetError(new StreamWriter( + stream: Console.OpenStandardError(), + encoding: Console.OutputEncoding) + { AutoFlush = true } // if you want the content to be writed inmediatly on the console, then AutoFlush should be true. + ); + Assert.IsFalse(Console.IsErrorRedirected, "Standard Error was wrongly detected as redirected"); + Console.SetError( + Sys.Global.Console.CreateOutputWriter( + Console.OpenStandardError()) + ); + Assert.IsFalse(Console.IsErrorRedirected, "Standard Error was wrongly detected as redirected"); + + // Different to Out and Error StdIn is never overrided by the methods SetIn and SetOut + // , SetIn will be considered as redirected if you use StreamReader (even if the stream is the console Stream) + // This is because the ReadKey comes from the internal implementation. + Console.SetIn(new StreamReader( + stream: Console.OpenStandardInput(), + encoding: Console.InputEncoding + )); + Assert.IsTrue(Console.IsInputRedirected, "Standard Input was wrongly detected as NOT redirected"); + + // If you want to get the orginal TextReader, you can do it by using this method. + Console.SetIn(Sys.Global.Console.GetOrCreateReader()); // Get or create the original Console Reader. + Assert.IsFalse(Console.IsInputRedirected, "Standard Input was wrongly detected as redirected"); + + // The field can actually be set to null, but it would be filled againg the next time that a read method from the console is called. + Sys.Global.Console.ResetInternalStdIn(); // This method is called when InputEncoding is changed. } } -} +} \ No newline at end of file diff --git a/Tests/Kernels/ConsoleTest/packages.lock.json b/Tests/Kernels/ConsoleTest/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/ConsoleTest/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Cosmos.Compiler.Tests.BclSystem.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Cosmos.Compiler.Tests.BclSystem.csproj new file mode 100644 index 0000000000..9213f5c32c --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Cosmos.Compiler.Tests.BclSystem.csproj @@ -0,0 +1,19 @@ + + + + net6.0 + True + CA2242;$(NoWarn) + true + Debug;Release;TEST + + + + + + + + + + + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Kernel.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Kernel.cs new file mode 100644 index 0000000000..c35949aa67 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/Kernel.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections; +using Cosmos.Core.Memory; +using Cosmos.TestRunner; +using Sys = Cosmos.System; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + public class Kernel : Sys.Kernel + { + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Starting BCL System tests now please wait..."); + } + + protected override void Run() + { + try + { + mDebugger.Send("Run"); + + + // System + ArrayTests.Execute(); + StringTest.Execute(); + ObjectTests.Execute(); + ByteTest.Execute(); + SByteTest.Execute(); + Int16Test.Execute(); + UInt16Test.Execute(); + Int32Test.Execute(); + UInt32Test.Execute(); + Int64Test.Execute(); + UInt64Test.Execute(); + CharTest.Execute(); + BooleanTest.Execute(); + SingleTest.Execute(); + DoubleTest.Execute(); + MathTest.Execute(); + ConvertTests.Execute(); + DateTimeTests.Execute(); + TimeSpanTests.Execute(); + ActivatorTests.Execute(); + + int count = Heap.Collect(); + mDebugger.Send("Free"); + mDebugger.Send(count.ToString()); + + TestController.Completed(); + } + catch (Exception e) + { + mDebugger.Send("Exception occurred: " + e.Message); + mDebugger.Send(e.Message); + Console.WriteLine("Exception occurred"); + Console.WriteLine(e.Message); + TestController.Failed(); + } + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ActivatorTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ActivatorTests.cs new file mode 100644 index 0000000000..2bc1b05d95 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ActivatorTests.cs @@ -0,0 +1,100 @@ +using System; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class ActivatorTests + { + public static unsafe void Execute() + { + // Till this moment (04/09/2024) the constructors, as any other method, are not included on the compilation result if never called, + // so we need to call them before. + Artesa dummy = new Artesa(); + WrappedLogger dummy2 = new WrappedLogger(); + ConsoleLogger dummy3 = new ConsoleLogger(); + + + // Generic method test + ILogger logger = GetLogger(); + // Null checks are just for clarification, a ctor would throw if the object/struct was null. + Assert.IsTrue(logger is not null, "Object incorrectly set."); + Assert.IsTrue(typeof(ConsoleLogger).Equals(logger.GetType()), "Type Incorrectly set"); + logger.Log("Interface method Call works!"); + + // Generic method test (with different type) + logger = GetLogger(); + Assert.IsTrue(logger is not null, "Object incorrectly set."); + Assert.IsTrue(typeof(WrappedLogger).Equals(logger.GetType()), "Type Incorrectly set"); + logger.Log("Interface method call really really works!"); + ((WrappedLogger)logger).Logger.Log("property get works!"); + ((WrappedLogger)logger).Success("Type's specific methods work too."); + + // Struct Test + var artesa = Activator.CreateInstance(typeof(Artesa)); + Assert.IsTrue(artesa is not null, "Struct incorrectly set."); + Assert.IsTrue(typeof(Artesa).Equals(artesa.GetType()), "Type Incorrectly set"); + + // Unboxing + Artesa art = (Artesa)artesa; + Assert.IsTrue(typeof(Artesa).Equals(art.GetType()), "Type Incorrectly set"); + + // Check property + Assert.IsTrue(art.Name is not null, "Property not set"); + + // Test method overrides + Assert.IsTrue(art.ToString() == $"{art.Name}-{art.LastName}", "Property not set"); + } + + public static T GetLogger() where T : ILogger, new() + { + return new T(); + } + } + + struct Artesa + { + public Artesa() + { + Console.WriteLine("LOL"); + Name = "Artesa"; + LastName = "Apple"; + } + public string Name { get; } + public string LastName { get; } + + public override string ToString() + { + return $"{Name}-{LastName}"; + } + } + + class WrappedLogger : ILogger + { + private ILogger logger; + + public WrappedLogger() : this(ActivatorTests.GetLogger()) + { + + } + + public WrappedLogger(ILogger logger) + { + this.logger = logger; + } + + internal ILogger Logger => logger; + + public void Log(string message) => logger.Log(message); + public void Success(string message) => Assert.Succeed(message); + } + + class ConsoleLogger : ILogger + { + public void Log(string message) => Console.WriteLine(message); + } + + interface ILogger + { + void Log(string message); + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ArrayTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ArrayTests.cs new file mode 100644 index 0000000000..fbea45c885 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ArrayTests.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Cosmos.Debug.Kernel; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class ArrayTests + { + public static unsafe void Execute() + { + byte[] xEmptyByteArray = Array.Empty(); + object[] xEmptyObjectArray = Array.Empty(); + + Assert.IsTrue(xEmptyByteArray.Length == 0, "Array.Empty should return an empty array!"); + Assert.IsTrue(xEmptyObjectArray.Length == 0, "Array.Empty should return an empty array!"); + + byte[] xByteResult = { 1, 2, 3, 4, 5, 6, 7, 8 }; + byte[] xByteExpectedResult = { 1, 2, 3, 4, 5, 6, 7, 1 }; + byte[] xByteSource = { 1 }; + + Assert.IsTrue(xByteExpectedResult.Length == 8, "Array length is stored correctly"); + Assert.IsTrue(xByteResult.GetLowerBound(0) == 0, "Array.GetLowerBound works"); + //xByteResult.SetValue(1, 0); + Assert.IsTrue((int)xByteResult.GetValue(0) == 1, "Array.GetValue works for first element"); + Assert.IsTrue((int)xByteResult.GetValue(1) == 2, "Array.GetValue works for element in middle"); + Assert.IsTrue((int)xByteResult.GetValue(7) == 8, "Array.GetValue works at end"); + + Array.Copy(xByteSource, 0, xByteResult, 7, 1); + + Assert.IsTrue((xByteResult[7] == xByteExpectedResult[7]), "Array.Copy doesn't work: xResult[7] = " + (uint)xByteResult[7] + " != " + (uint)xByteExpectedResult[7]); + Array.Clear(xByteResult, 0, xByteResult.Length); + for (int i = 0; i < 8; i++) + { + Assert.IsTrue(xByteResult[i] == 0, "Array.Clear(byte[], int, int) works"); + } + xByteResult[1] = 1; + Assert.IsTrue(xByteResult[1] == 1, "Array.Clear does not break the array"); + + xByteResult = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + Assert.AreEqual(2, xByteResult[1], "Setting byte array to new array object works"); + Array.Clear(xByteResult); + for (int i = 0; i < 8; i++) + { + Assert.AreEqual(0, xByteResult[i], "Array.Clear(byte[]) works"); + } + + // Single[] Test + float[] xSingleResult = { 1.25f, 2.50f, 3.51f, 4.31f, 9.28f, 18.56f }; + float[] xSingleExpectedResult = { 1.25f, 2.598f, 5.39f, 4.31f, 9.28f, 18.56f }; + float[] xSingleSource = { 0.49382f, 1.59034f, 2.598f, 5.39f, 7.48392f, 4.2839f }; + + xSingleResult[1] = xSingleSource[2]; + xSingleResult[2] = xSingleSource[3]; + + Assert.IsTrue(((xSingleResult[1] + xSingleResult[2]) == (xSingleExpectedResult[1] + xSingleExpectedResult[2])), "Assinging values to single array elements doesn't work: xResult[1] = " + (uint)xSingleResult[1] + " != " + (uint)xSingleExpectedResult[1] + " and xResult[2] = " + (uint)xSingleResult[2] + " != " + (uint)xSingleExpectedResult[2]); + + // Double[] Test + double[] xDoubleResult = { 0.384, 1.5823, 2.5894, 2.9328539, 3.9201, 4.295 }; + double[] xDoubleExpectedResult = { 0.384, 1.5823, 2.5894, 95.32815, 3.9201, 4.295 }; + double[] xDoubleSource = { 95.32815 }; + + xDoubleResult[3] = xDoubleSource[0]; + + Assert.IsTrue(xDoubleResult[3] == xDoubleExpectedResult[3], "Assinging values to double array elements doesn't work: xResult[1] = " + (uint)xDoubleResult[3] + " != " + (uint)xDoubleExpectedResult[3]); + + //Test array indexes + int y = 0; + int[] x = new int[5] { 1, 2, 3, 4, 5 }; + bool error = false; + try + { + y = x[1]; + y = x[7]; + } + catch (IndexOutOfRangeException) + { + error = true; + } + Assert.IsTrue(error && y == 2, "Index out of range exception works correctly for too large positions."); + error = false; + try + { + y = x[-1]; + } + catch (IndexOutOfRangeException) + { + error = true; + } + Assert.IsTrue(error && y == 2, "Index out of range exception works correctly for too small positions."); + + fixed (int* val = x) + { + Assert.AreEqual(1, val[0], "Accessing values using pointer works at offset 0"); + Assert.AreEqual(2, val[1], "Accessing values using pointer works at offset 1"); + Assert.AreEqual(4, val[3], "Accessing values using pointer works at offset 3"); + Assert.AreEqual(5, val[4], "Accessing values using pointer works at offset 4"); + } + int[] arr = new int[] { 0, 1, 2, 3, 4 }; + + arr[2] = 6; + + // Try reading the values from the array via a pointer + fixed (int* val = arr) + { + Assert.AreEqual(0, val[0], "Accessing values using pointer works at offset 0"); + Assert.AreEqual(1, val[1], "Accessing values using pointer works at offset 1"); + Assert.AreEqual(3, val[3], "Accessing values using pointer works at offset 3"); + Assert.AreEqual(4, val[4], "Accessing values using pointer works at offset 4"); + } + + + char[] charArray = new char[] { 'A', 'a', 'Z', 'z', 'l' }; + charArray[2] = 'k'; + fixed (char* val = charArray) + { + Assert.AreEqual('A', val[0], "Accessing values using pointer works at offset 0"); + Assert.AreEqual('a', val[1], "Accessing values using pointer works at offset 1"); + Assert.AreEqual('z', val[3], "Accessing values using pointer works at offset 3"); + Assert.AreEqual('l', val[4], "Accessing values using pointer works at offset 4"); + } + + string[] stringArray = new string[] { "ABC", "BAB", "TAT", "A", "", "LA" }; + Array.Resize(ref stringArray, 3); + Assert.AreEqual(new string[] { "ABC", "BAB", "TAT" }, stringArray, "Array.Resize works"); + + stringArray = new string[10]; + stringArray[0] += "asd"; + Assert.AreEqual(stringArray[0], "asd", "Adding directly to array works"); + + // Lets test the normal interface methods + Assert.AreEqual(5, x.Length, "Length of array is correct"); + var objEnumerator = x.GetEnumerator(); + bool moved = objEnumerator.MoveNext(); + Assert.IsTrue(moved, "Enumerator can move into first state"); + int current = (int)objEnumerator.Current; + Assert.AreEqual(x[0], current, "Getting enumerator directly from array works"); + + // Lets test the generic interface methods implemented via SZArrayImpl and callvirt + vmtable trickery + + IEnumerator enumerator = (x as IEnumerable).GetEnumerator(); + Assert.IsTrue(enumerator.MoveNext(), "Getting enumerator from array as IEnumerable works"); + Assert.AreEqual(x[0], enumerator.Current, "Getting enumerator from array as enumerable works"); + enumerator.MoveNext(); + Assert.AreEqual(x[1], enumerator.Current, "Getting enumerator from array as enumerable works after second move"); + + IList list = x; + //Assert.AreEqual(0, list.IndexOf(1), "Calling IndexOf on array as IList works"); - broken until .Net 5.0 changes fixed + //Assert.AreEqual(1, list.IndexOf(2), "Calling IndexOf on array as IList works"); + Assert.AreEqual(1, list[0], "Getting item from array as IList works"); + Assert.AreEqual(3, list[2], "Getting item from array as IList works"); + + ICollection collection = x; + Assert.AreEqual(5, collection.Count, "Getting Count from array as ICollection works"); + Assert.IsTrue(collection.IsReadOnly, "Getting IsReadOnly from array as ICollection works"); + //Assert.IsTrue(collection.Contains(2), "Calling Contains on array as ICollection works"); - broken until .Net 5.0 changes fixed + //Assert.IsFalse(collection.Contains(6), "Calling Contains on array as ICollection works"); + int[] newArray = new int[5]; + collection.CopyTo(newArray, 0); + bool areEqual = true; + for (int i = 0; i < x.Length; i++) + { + if(x[i] != newArray[i]) + { + areEqual = false; + break; + } + } + Assert.IsTrue(areEqual, "Calling CopyTo on array as ICollection works"); + + IReadOnlyList readOnlyList = x; + Assert.AreEqual(x[0], readOnlyList[0], "Getting item from array as IReadOnlyList works"); + Assert.AreEqual(x[3], readOnlyList[3], "Getting item from array as IReadOnlyList works"); + + IReadOnlyCollection readOnlyCollection = x; + Assert.AreEqual(5, readOnlyCollection.Count, "Getting Count from array as IReadOnlyCollection works"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/BooleanTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/BooleanTest.cs similarity index 100% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/BooleanTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/BooleanTest.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ByteTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ByteTest.cs new file mode 100644 index 0000000000..4d72f84b78 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ByteTest.cs @@ -0,0 +1,210 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class ByteTest + { + public static void Execute() + { + byte value; + string result; + string expectedResult; + + value = Byte.MaxValue; + + result = value.ToString(); + expectedResult = "255"; + + Assert.AreEqual(result, expectedResult, "Byte.ToString doesn't work"); + Assert.AreEqual("ff", value.ToString("x"), "Byte.ToString('x') doesn't work"); + Assert.AreEqual("FF", value.ToString("X"), "Byte.ToString('X') doesn't work"); + + // Now let's try to concat to a String using '+' operator + result = "The Maximum value of a Byte is " + value; + expectedResult = "The Maximum value of a Byte is 255"; + + Assert.IsTrue((result == expectedResult), "String concat (Byte) doesn't work"); + + // Now let's try to use '$ instead of '+' + result = $"The Maximum value of a Byte is {value}"; + // Actually 'expectedResult' should be the same so... + Assert.IsTrue((result == expectedResult), "String format (Byte) doesn't work"); + + // Now let's Get the HashCode of a value + int resultAsInt = value.GetHashCode(); + + // actually the Hash Code of a Byte is the same value expressed as int + Assert.IsTrue((resultAsInt == value), "Byte.GetHashCode() doesn't work"); + + // basic bit operations + + int val2; + + value = 0x0C; // low-order bits: 0b0000_1100 + + val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 + Assert.IsTrue(val2 == -0x0D, "Byte bitwise not doesn't work got: " + val2); + + val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 + Assert.IsTrue(val2 == 0x04, "Byte bitwise and doesn't work got: " + val2); + + val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 + Assert.IsTrue(val2 == 0x0E, "Byte bitwise or doesn't work got: " + val2); + + val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 + Assert.IsTrue(val2 == 0x0A, "Byte bitwise xor doesn't work got: " + val2); + + val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 + Assert.IsTrue(val2 == 0x03, "Byte left shift doesn't work got: " + val2); + + val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 + Assert.IsTrue(val2 == 0x30, "Byte right shift doesn't work got: " + val2); + + // basic arithmetic operations + + value = 60; + + val2 = value + 5; + Assert.IsTrue(val2 == 65, "Byte addition doesn't work got: " + val2); + + val2 = value - 5; + Assert.IsTrue(val2 == 55, "Byte subtraction doesn't work got: " + val2); + + val2 = value * 5; + Assert.IsTrue(val2 == 300, "Byte multiplication doesn't work got: " + val2); + + val2 = value / 5; + Assert.IsTrue(val2 == 12, "Byte division doesn't work got: " + val2); + + val2 = value % 7; + Assert.IsTrue(val2 == 4, "Byte remainder doesn't work got: " + val2); + + // Now test conversions + + byte maxValue = Byte.MaxValue; + byte minValue = Byte.MinValue; + + // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted + + // Test Conv_I1 + Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Byte doesn't work"); + Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Byte doesn't work"); + + // Test Conv_U1 + Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Byte doesn't work"); + Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Byte doesn't work"); + + // Test Conv_I2 + Assert.IsTrue((short)maxValue == 0x00FF, "Conv_I2 for Byte doesn't work"); + Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Byte doesn't work"); + + // Test Conv_U2 + Assert.IsTrue((ushort)maxValue == 0x00FF, "Conv_U2 for Byte doesn't work"); + Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Byte doesn't work"); + + // Test Conv_I4 + Assert.IsTrue((int)maxValue == 0x000000FF, "Conv_I4 for Byte doesn't work"); + Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for Byte doesn't work"); + + // Test Conv_U4 + Assert.IsTrue((uint)maxValue == 0x000000FF, "Conv_U4 for Byte doesn't work"); + Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for Byte doesn't work"); + + // Test Conv_I8 + Assert.IsTrue((long)maxValue == 0x00000000000000FF, "Conv_I8 for Byte doesn't work"); + Assert.IsTrue((long)minValue == 0x0000000000000000, "Conv_I8 for Byte doesn't work"); + + // Test Conv_U8 + Assert.IsTrue((ulong)maxValue == 0x00000000000000FF, "Conv_U8 for Byte doesn't work"); + Assert.IsTrue((ulong)minValue == 0x0000000000000000, "Conv_U8 for Byte doesn't work"); + + // Test Conv_R4 + Assert.IsTrue((float)maxValue == Byte.MaxValue, "Conv_R4 for Byte doesn't work"); + Assert.IsTrue((float)minValue == Byte.MinValue, "Conv_R4 for Byte doesn't work"); + + // Test Conv_R8 + Assert.IsTrue((double)maxValue == Byte.MaxValue, "Conv_R8 for Byte doesn't work"); + Assert.IsTrue((double)minValue == Byte.MinValue, "Conv_R8 for Byte doesn't work"); + + // Test checked conversions to bytes + int val = 1; + int test = 125; + // Test Conv_Ovf_U1 + checked + { + Assert.IsTrue((byte)test == 0x7D, "Conv_Ovf_U1 for Byte doesn't work(throws incorrectly)"); + byte x = 0; + bool error = false; + try + { + x = (byte)(val + 255); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U1 for Byte doesn't work(error was not thrown)"); + Assert.IsTrue((byte)(long)125 == 0x7D, "Conv_Ovf_U1 for long to Byte doesn't work(throws incorrectly)"); + error = false; + try + { + x = (byte)(val + 0x8_0000_0000); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U1 for from positive Long to Byte doesn't work(error was not thrown)"); + error = false; + try + { + x = (byte)(val + -0x8_0000_0001); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U1 for from negative Long to Byte doesn't work(error was not thrown)"); + } + + + // Test Conv_Ovf_U1_Un + checked + { + Assert.IsTrue((byte)(uint)125 == 0x7D, "Conv_Ovf_U1_Un for Byte doesn't work(throws incorrectly)"); + byte x = 0; + bool error = false; + try + { + x = (byte)(uint)(val + 300); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U1_Un for Byte doesn't work(error was not thrown): "); + } + + // Test Methods + val2 = TestMethod(value); + Assert.IsTrue(value == 60, "Passing a Byte as a method parameter doesn't work"); + Assert.IsTrue(val2 == 61, "Returning a Byte value from a method doesn't work"); + + ByRefTestMethod(ref value); + Assert.IsTrue(value == 61, "Passing a Byte by ref to a method doesn't work"); + } + + public static byte TestMethod(byte aParam) + { + aParam++; + return aParam; + } + + public static void ByRefTestMethod(ref byte aParam) + { + aParam++; + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/CharTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/CharTest.cs similarity index 100% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/CharTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/CharTest.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ConvertTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ConvertTests.cs new file mode 100644 index 0000000000..656c30f79b --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ConvertTests.cs @@ -0,0 +1,29 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class ConvertTests + { + public static void Execute() + { + var number = 5; + var numberToString = Convert.ToString(number); + + Assert.IsTrue(numberToString == "5", $"Convert.ToString(Int32) doesn't work. Result: {numberToString}"); + + var numberToByte = Convert.ToByte(number); + + Assert.IsTrue(numberToByte == 5, $"Convert.ToByte(Int32) doesn't work. Result: {numberToByte}"); + + var byteToSingle = Convert.ToSingle(numberToByte); + + Assert.IsTrue(EqualityHelper.SinglesAreEqual(byteToSingle, 5.0f), $"Convert.ToSingle(Byte) doesn't work. Result: {byteToSingle}"); + + var numberToBase64 = Convert.ToBase64String(BitConverter.GetBytes(number)); + + Assert.IsTrue(numberToBase64 == "BQAAAA==", $"Convert.ToBase64String(byte[]) doesn't work. Result: {numberToBase64}"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeFormatTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeFormatTest.cs new file mode 100644 index 0000000000..8df3f26eef --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeFormatTest.cs @@ -0,0 +1,19 @@ +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class DateTimeFormatTest + { + public static void Execute() + { + DateTime date = new DateTime(2011, 6, 10); + Assert.AreEqual("06/10/2011 00:00:00", date.ToString(), "Standard DateTime.ToString works"); + //Assert.AreEqual("June 10, 2011", date.ToString("MMMM dd, yyyy"), "Using DataTimeFormat for custom format works"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeTests.cs new file mode 100644 index 0000000000..226cb00c69 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DateTimeTests.cs @@ -0,0 +1,43 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class DateTimeTests + { + public static void Execute() + { + var someDateTime = new DateTime(2017, 4, 7, 16, 47, 32, 462); + + Assert.IsTrue(someDateTime.Year == 2017, "DateTime.Year is not working"); + Assert.IsTrue(someDateTime.Month == 4, "DateTime.Month is not working"); + Assert.IsTrue(someDateTime.Day == 7, "DateTime.Day is not working"); + Assert.IsTrue(someDateTime.Hour == 16, "DateTime.Hour is not working"); + Assert.IsTrue(someDateTime.Minute == 47, "DateTime.Minute is not working"); + Assert.IsTrue(someDateTime.Second == 32, "DateTime.Second is not working"); + Assert.IsTrue(someDateTime.Millisecond == 462, "DateTime.Millisecond is not working"); + // Not works: DayOfWeek is an Enum and Enum.ToString() is yet not implemented + //Assert.IsTrue(someDateTime.DayOfWeek.ToString() == "Friday", "DateTime.DayOfWeek is not working " + someDateTime.DayOfWeek.ToString()); + Assert.IsTrue(someDateTime.DayOfYear == 97, "DateTime.DayOfYear is not working"); + + Assert.IsTrue(DateTime.Now.Year >= 2018, "DateTime.Now is returning an year lower than 2018"); + + // We assume that Cosmos uses Invariant Culture to display dates + //Assert.IsTrue(someDateTime.ToString() == "2017-04-07 16:47:32", "DateTime.ToString() is not working"); + Assert.IsTrue(someDateTime.ToString() == "04/07/2017 16:47:32", "DateTime.ToString() is not working"); + Assert.IsTrue(someDateTime.ToLongDateString() == "Friday, 07 April 2017", "DateTime.ToLongDateString() is not working"); + Assert.IsTrue(someDateTime.ToShortDateString() == "04/07/2017", "DateTime.ToShortDateString() is not working"); + Assert.IsTrue(someDateTime.ToLongTimeString() == "16:47:32", "DateTime.ToLongTimeString() is not working"); + Assert.IsTrue(someDateTime.ToShortTimeString() == "16:47", "DateTime.ToShortTimeString() is not working"); + + TimeSpan twoDaysTimeSpan = TimeSpan.FromDays(2); + + someDateTime = someDateTime.Add(twoDaysTimeSpan); + Assert.IsTrue(someDateTime.Day == 9, "DateTime.Add() is not working"); + + someDateTime = someDateTime.Subtract(twoDaysTimeSpan); + Assert.IsTrue(someDateTime.Day == 7, "DateTime.Subtract() is not working"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DecimalTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DecimalTest.cs similarity index 100% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DecimalTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DecimalTest.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DoubleTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DoubleTest.cs similarity index 98% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DoubleTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DoubleTest.cs index 4e5de9f06e..7fe4c197b4 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DoubleTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/DoubleTest.cs @@ -223,6 +223,11 @@ public static void Execute() Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 2.3), "double TryParse returns correct result when it works"); #endregion + + double doubleA = 3; + double doubleB = 3; + + Assert.IsTrue(doubleA % doubleB == 0, "Double: 3 % 3 should be equal to 0"); } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int16Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int16Test.cs new file mode 100644 index 0000000000..02cb5814d0 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int16Test.cs @@ -0,0 +1,216 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class Int16Test + { + public static void Execute() + { + short value; + string result; + string expectedResult; + + value = Int16.MaxValue; + + result = value.ToString(); + expectedResult = "32767"; + + Assert.IsTrue((result == expectedResult), "Int16.ToString doesn't work"); + + // Now let's try to concat to a String using '+' operator + result = "The Maximum value of an Int16 is " + value; + expectedResult = "The Maximum value of an Int16 is 32767"; + + Assert.IsTrue((result == expectedResult), "String concat (Int16) doesn't work"); + + // Now let's try to use '$ instead of '+' + result = $"The Maximum value of an Int16 is {value}"; + // Actually 'expectedResult' should be the same so... + Assert.IsTrue((result == expectedResult), "String format (Int16) doesn't work"); + + // Now let's Get the HashCode of a value + int resultAsInt = value.GetHashCode(); + + Assert.IsTrue((resultAsInt == value), "Int16.GetHashCode() doesn't work"); + +#if false + // Now let's try ToString() again but printed in hex (this test fails for now!) + result = value.ToString("X2"); + expectedResult = "7FFF"; + + Assert.IsTrue((result == expectedResult), "Int16.ToString(X2) doesn't work"); +#endif + + // basic bit operations + + int val2; + + value = 0x0C; // low-order bits: 0b0000_1100 + + val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 + Assert.IsTrue(val2 == -0x0D, "Int16 bitwise not doesn't work got: " + val2); + + val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 + Assert.IsTrue(val2 == 0x04, "Int16 bitwise and doesn't work got: " + val2); + + val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 + Assert.IsTrue(val2 == 0x0E, "Int16 bitwise or doesn't work got: " + val2); + + val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 + Assert.IsTrue(val2 == 0x0A, "Int16 bitwise xor doesn't work got: " + val2); + + val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 + Assert.IsTrue(val2 == 0x03, "Int16 left shift doesn't work got: " + val2); + + val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 + Assert.IsTrue(val2 == 0x30, "Int16 right shift doesn't work got: " + val2); + + // basic arithmetic operations + + value = 60; + + val2 = value + 5; + Assert.IsTrue(val2 == 65, "Int16 addition doesn't work got: " + val2); + + val2 = value - 5; + Assert.IsTrue(val2 == 55, "Int16 subtraction doesn't work got: " + val2); + + val2 = value * 5; + Assert.IsTrue(val2 == 300, "Int16 multiplication doesn't work got: " + val2); + + val2 = value / 5; + Assert.IsTrue(val2 == 12, "Int16 division doesn't work got: " + val2); + + val2 = value % 7; + Assert.IsTrue(val2 == 4, "Int16 remainder doesn't work got: " + val2); + + // Now test conversions + + short maxValue = Int16.MaxValue; + short minValue = Int16.MinValue; + + // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted + + // Test Conv_I1 + Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int16 doesn't work"); + Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int16 doesn't work"); + + // Test Conv_U1 + Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int16 doesn't work"); + Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int16 doesn't work"); + + // Test Conv_I2 + Assert.IsTrue((short)maxValue == 0x7FFF, "Conv_I2 for Int16 doesn't work"); + Assert.IsTrue((short)minValue == -0x8000, "Conv_I2 for Int16 doesn't work"); + + // Test Conv_U2 + Assert.IsTrue((ushort)maxValue == 0x7FFF, "Conv_U2 for Int16 doesn't work"); + Assert.IsTrue((ushort)minValue == 0x8000, "Conv_U2 for Int16 doesn't work"); + + // Test Conv_I4 + Assert.IsTrue((int)maxValue == 0x00007FFF, "Conv_I4 for Int16 doesn't work"); + Assert.IsTrue((int)minValue == -0x00008000, "Conv_I4 for Int16 doesn't work"); + + // Test Conv_U4 + Assert.IsTrue((uint)maxValue == 0x00007FFF, "Conv_U4 for Int16 doesn't work"); + Assert.IsTrue((uint)minValue == 0xFFFF8000, "Conv_U4 for Int16 doesn't work"); + + // Test Conv_I8 + Assert.IsTrue((long)maxValue == 0x0000000000007FFF, "Conv_I8 for Int16 doesn't work"); + Assert.IsTrue((long)minValue == -0x0000000000008000, "Conv_I8 for Int16 doesn't work"); + + // Test Conv_U8 + Assert.IsTrue((ulong)maxValue == 0x0000000000007FFF, "Conv_U8 for Int16 doesn't work"); + Assert.IsTrue((ulong)minValue == 0xFFFFFFFFFFFF8000, "Conv_U8 for Int16 doesn't work"); + + // Test Conv_R4 + Assert.IsTrue((float)maxValue == Int16.MaxValue, "Conv_R4 for Int16 doesn't work"); + Assert.IsTrue((float)minValue == Int16.MinValue, "Conv_R4 for Int16 doesn't work"); + + // Test Conv_R8 + Assert.IsTrue((double)maxValue == Int16.MaxValue, "Conv_R8 for Int16 doesn't work"); + Assert.IsTrue((double)minValue == Int16.MinValue, "Conv_R8 for Int16 doesn't work"); + + //Test checked conversions + int val = 1; + long test = 125; + + // Test Conv_Ovf_I2 + checked + { + Assert.IsTrue((short)val == 1, "Conv_Ovf_I2 doesn't work(throws incorrectly)"); + short x = 0; + bool error = false; + try + { + x = (short)(val + short.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I2 doesn't work(error was not thrown): " + x); + Assert.IsTrue((short)test == 0x7D, "Conv_Ovf_I2 for long to short doesn't work(throws incorrectly)"); + error = false; + try + { + x = (short)(val + 0x8_0000_0000); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I2 for from positive long to short doesn't work(error was not thrown): " + x); + error = false; + try + { + x = (short)(val + -0x8_0000_0001); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I2 for from negative long to short doesn't work(error was not thrown): " + x); + } + + + // Test Conv_Ovf_I2_Un + checked + { + Assert.IsTrue((short)(uint)125 == 0x7D, "Conv_Ovf_I2_Un doesn't work(throws incorrectly)"); + short x = 0; + bool error = false; + try + { + x = (short)(uint)(val + short.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I2_Un doesn't work(error was not thrown): " + x); + } + + // Test Methods + val2 = TestMethod(value); + Assert.IsTrue(value == 60, "Passing an Int16 as a method parameter doesn't work"); + Assert.IsTrue(val2 == 61, "Returning an Int16 value from a method doesn't work"); + + ByRefTestMethod(ref value); + Assert.IsTrue(value == 61, "Passing an Int16 by ref to a method doesn't work"); + } + + public static short TestMethod(short aParam) + { + aParam++; + return aParam; + } + + public static void ByRefTestMethod(ref short aParam) + { + aParam++; + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int32Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int32Test.cs new file mode 100644 index 0000000000..1ab1d4a7a8 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int32Test.cs @@ -0,0 +1,253 @@ +using System; +using System.Linq; +using Cosmos.Common.Extensions; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class Int32Test + { + public static void Execute() + { + bool efuse; + int value; + string result; + string expectedResult; + + value = Int32.MaxValue; + + result = value.ToString(); + expectedResult = "2147483647"; + + Assert.IsTrue((result == expectedResult), "Int32.ToString doesn't work"); + + // Now let's try to concat to a String using '+' operator + result = "The Maximum value of an Int32 is " + value; + expectedResult = "The Maximum value of an Int32 is 2147483647"; + + Assert.IsTrue((result == expectedResult), "String concat (Int32) doesn't work"); + + // Now let's try to use '$ instead of '+' + result = $"The Maximum value of an Int32 is {value}"; + // Actually 'expectedResult' should be the same so... + Assert.IsTrue((result == expectedResult), "String format (Int32) doesn't work"); + + // Now let's Get the HashCode of a value + int resultAsInt = value.GetHashCode(); + + // actually the Hash Code of an Int32 is the same value + Assert.IsTrue((resultAsInt == value), "Int32.GetHashCode() doesn't work"); + + // Now let's try ToString() again but printed in hex + result = value.ToString("X"); + expectedResult = "7FFFFFFF"; + + Assert.IsTrue((result == expectedResult), "Int32.ToString(X) brings incorrect result."); + + // Ensure value is not overrided + Assert.IsTrue((value != 0), "Int32.ToString(X) overrides the value of the variable."); + + // Hex with padding + value = 255; + result = value.ToString("X4"); + expectedResult = "00FF"; + Assert.IsTrue((result == expectedResult), "Int32.ToString(X4) brings incorrect result."); + + // Test Decimal format wit padding + value = 10; + expectedResult = "0010"; + result = value.ToString("D4"); + Assert.IsTrue((result == expectedResult), "Int32.ToString(D4) brings incorrect result."); + + // basic bit operations + + int val2; + + value = 0x0C; // low-order bits: 0b0000_1100 + + val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 + Assert.IsTrue(val2 == -0x0D, "Int32 bitwise not doesn't work got: " + val2); + + val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 + Assert.IsTrue(val2 == 0x04, "Int32 bitwise and doesn't work got: " + val2); + + val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 + Assert.IsTrue(val2 == 0x0E, "Int32 bitwise or doesn't work got: " + val2); + + val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 + Assert.IsTrue(val2 == 0x0A, "Int32 bitwise xor doesn't work got: " + val2); + + val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 + Assert.IsTrue(val2 == 0x03, "Int32 left shift doesn't work got: " + val2); + + val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 + Assert.IsTrue(val2 == 0x30, "Int32 right shift doesn't work got: " + val2); + + // basic arithmetic operations + + value = 60; + + val2 = value + 5; + Assert.IsTrue(val2 == 65, "Int32 addition doesn't work got: " + val2); + + val2 = value - 5; + Assert.IsTrue(val2 == 55, "Int32 subtraction doesn't work got: " + val2); + + val2 = value * 5; + Assert.IsTrue(val2 == 300, "Int32 multiplication doesn't work got: " + val2); + + val2 = value / 5; + Assert.IsTrue(val2 == 12, "Int32 division doesn't work got: " + val2); + + val2 = value % 7; + Assert.IsTrue(val2 == 4, "Int32 remainder doesn't work got: " + val2); + + // Now test conversions + + int maxValue = Int32.MaxValue; + int minValue = Int32.MinValue; + + // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted + + // Test Conv_I1 + Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int32 doesn't work"); + Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int32 doesn't work"); + + // Test Conv_U1 + Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int32 doesn't work"); + Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int32 doesn't work"); + + // Test Conv_I2 + Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for Int32 doesn't work"); + Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Int32 doesn't work"); + + // Test Conv_U2 + Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for Int32 doesn't work"); + Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Int32 doesn't work"); + + // Test Conv_I4 + Assert.IsTrue((int)maxValue == 0x7FFFFFFF, "Conv_I4 for Int32 doesn't work"); + Assert.IsTrue((int)minValue == -0x80000000, "Conv_I4 for Int32 doesn't work"); + + // Test Conv_U4 + Assert.IsTrue((uint)maxValue == 0x7FFFFFFF, "Conv_U4 for Int32 doesn't work"); + Assert.IsTrue((uint)minValue == 0x80000000, "Conv_U4 for Int32 doesn't work"); + + // Test Conv_I8 + Assert.IsTrue((long)maxValue == 0x000000007FFFFFFF, "Conv_I8 for Int32 doesn't work"); + Assert.IsTrue((long)minValue == -0x0000000080000000, "Conv_I8 for Int32 doesn't work"); + + // Test Conv_U8 + Assert.IsTrue((ulong)maxValue == 0x00000007FFFFFFF, "Conv_U8 for Int32 doesn't work"); + Assert.IsTrue((ulong)minValue == 0xFFFFFFFF80000000, "Conv_U8 for Int32 doesn't work"); + + // Test Conv_R4 + Assert.IsTrue((float)maxValue == Int32.MaxValue, "Conv_R4 for Int32 doesn't work"); + Assert.IsTrue((float)minValue == Int32.MinValue, "Conv_R4 for Int32 doesn't work"); + + // Test Conv_R8 + Assert.IsTrue((double)maxValue == Int32.MaxValue, "Conv_R8 for Int32 doesn't work"); + Assert.IsTrue((double)minValue == Int32.MinValue, "Conv_R8 for Int32 doesn't work"); + + //Test checked conversions + long val = 1; + long test = 125; + // Test Conv_Ovf_I4 + checked + { + Assert.IsTrue((int)test == 0x7D, "Conv_Ovf_I4 doesn't work(throws incorrectly)"); + Assert.IsTrue((int)(test - 1) == 124, "Conv_Ovf_I4 doesn't work(throws incorrectly)"); + Assert.IsTrue((int)val == 1, "Conv_Ovf_I4 doesn't work(throws incorrectly)"); + Assert.IsTrue((int)(2 * val) == 2, "Conv_Ovf_I4 doesn't work(throws incorrectly)"); + long x = 0; + bool error = false; + try + { + x = (int)(val + int.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I4 doesn't work(error was not thrown): " + x); + try + { + x = (int)(val + int.MinValue - 2); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I4 doesn't work(error was not thrown): " + x); + } + + + // Test Conv_Ovf_I4_Un + checked + { + Assert.IsTrue((int)(uint)test == 0x7D, "Conv_Ovf_I4_Un doesn't work(throws incorrectly)"); + int x = 0; + bool error = false; + try + { + x = (int)(uint)(val + int.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I4_Un doesn't work(error was not thrown): " + x); + } + + // Test Methods + val2 = TestMethod(value); + Assert.IsTrue(value == 60, "Passing an Int32 as a method parameter doesn't work"); + Assert.IsTrue(val2 == 61, "Returning an Int32 value from a method doesn't work"); + + ByRefTestMethod(ref value); + Assert.IsTrue(value == 61, "Passing an Int32 by ref to a method doesn't work"); + + //Test Overflow Exceptions + int val3o = 10000; + efuse = false; + try + { + checked + { + val3o += 2147483647; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Add_Ovf for Int32 doesn't work: " + val3o); + + efuse = false; + val3o = -10000; + try + { + checked + { + val3o -= 2147483647; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Sub_Ovf for Int32 doesn't work: " + val3o); + } + + public static int TestMethod(int aParam) + { + aParam++; + return aParam; + } + + public static void ByRefTestMethod(ref int aParam) + { + aParam++; + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int64Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int64Test.cs new file mode 100644 index 0000000000..b8dc081237 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/Int64Test.cs @@ -0,0 +1,255 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class Int64Test + { + public static void Execute() + { + bool efuse; + long value; + string result; + string expectedResult; + + value = long.MaxValue; + + result = value.ToString(); + expectedResult = "9223372036854775807"; + Assert.IsTrue((result == expectedResult), "Int64.ToString doesn't work"); + + // Now let's try to concat to a String using '+' operator + result = "The Maximum value of an Int64 is " + value; + expectedResult = "The Maximum value of an Int64 is 9223372036854775807"; + + Assert.IsTrue((result == expectedResult), "String concat (Int64) doesn't work"); + + // Now let's try to use '$ instead of '+' + result = $"The Maximum value of an Int64 is {value}"; + + // Actually 'expectedResult' should be the same so... + Assert.IsTrue((result == expectedResult), "String format (Int64) doesn't work"); + + // Now let's Get the HashCode of a value + int resultAsInt = value.GetHashCode(); + // actually the Hash Code of a Int64 is the value interpolated with XOR to obtain an Int32... so not the same of 'value'! + int expectedResultAsInt = (unchecked((int)((long)value)) ^ (int)(value >> 32)); + + Assert.IsTrue((resultAsInt == expectedResultAsInt), "Int64.GetHashCode() doesn't work"); + + value = long.Parse("42"); + Assert.IsTrue(value == 42, "Parsing Int64 doesn't work."); + +#if false + + // Now let's try ToString() again but printed in hex (this test fails for now!) + result = value.ToString("X2"); + expectedResult = "0x7FFFFFFFFFFFFFFF"; + + Assert.IsTrue((result == expectedResult), "Int64.ToString(X2) doesn't work"); +#endif + + // basic bit operations + + long val2; + + value = 0x0C; // low-order bits: 0b0000_1100 + + val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 + Assert.IsTrue(val2 == -0x0D, "Int64 bitwise not doesn't work got: " + val2); + + val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 + Assert.IsTrue(val2 == 0x04, "Int64 bitwise and doesn't work got: " + val2); + + val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 + Assert.IsTrue(val2 == 0x0E, "Int64 bitwise or doesn't work got: " + val2); + + val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 + Assert.IsTrue(val2 == 0x0A, "Int64 bitwise xor doesn't work got: " + val2); + + val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 + Assert.IsTrue(val2 == 0x03, "Int64 left shift doesn't work got: " + val2); + + val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 + Assert.IsTrue(val2 == 0x30, "Int64 right shift doesn't work got: " + val2); + + // basic arithmetic operations + + value = 60; + + val2 = value + 5; + Assert.IsTrue(val2 == 65, "Int64 addition doesn't work got: " + val2); + + val2 = value - 5; + Assert.IsTrue(val2 == 55, "Int64 subtraction doesn't work got: " + val2); + + val2 = value * 5; + Assert.IsTrue(val2 == 300, "Int64 multiplication doesn't work got: " + val2); + + val2 = value / 5; + Assert.IsTrue(val2 == 12, "Int64 division doesn't work got: " + val2); + + val2 = value % 7; + Assert.IsTrue(val2 == 4, "Int64 remainder doesn't work got: " + val2); + + value = 1728000000000; + + val2 = value + 36000000000; + Assert.IsTrue(val2 == 1764000000000, "Int64 addition doesn't work got " + val2); + + val2 = value - 36000000000; + Assert.IsTrue(val2 == 1692000000000, "Int64 subtraction doesn't work got " + val2); + + val2 = value * 36000000000; + Assert.IsTrue(val2 == 5578983451391950848, "Int64 multiplication doesn't work got " + val2); + + val2 = value / 36000000000; + Assert.IsTrue(val2 == 48, "Int64 division doesn't work got " + val2); + + val2 = value / -36000000000; + Assert.IsTrue(val2 == -48, "Int64 division doesn't work got " + val2); + + val2 = -value / 36000000000; + Assert.IsTrue(val2 == -48, "Int64 division doesn't work got " + val2); + + val2 = -value / -36000000000; + Assert.IsTrue(val2 == 48, "Int64 division doesn't work got " + val2); + + value = 3200000000000; + + val2 = value % 1300000000000; + Assert.IsTrue(val2 == 600000000000, "Int64 remainder doesn't work got " + val2); + + val2 = value % -1300000000000; + Assert.IsTrue(val2 == 600000000000, "Int64 remainder doesn't work got " + val2); + + val2 = -value % 1300000000000; + Assert.IsTrue(val2 == -600000000000, "Int64 remainder doesn't work got " + val2); + + val2 = -value % -1300000000000; + Assert.IsTrue(val2 == -600000000000, "Int64 remainder doesn't work got " + val2); + + // Now test conversions + + long maxValue = Int64.MaxValue; + long minValue = Int64.MinValue; + + // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted + + // Test Conv_I1 + Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int64 doesn't work"); + Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int64 doesn't work"); + + // Test Conv_U1 + Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int64 doesn't work"); + Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int64 doesn't work"); + + // Test Conv_I2 + Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for Int64 doesn't work"); + Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Int64 doesn't work"); + + // Test Conv_U2 + Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for Int64 doesn't work"); + Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Int64 doesn't work"); + + // Test Conv_I4 + Assert.IsTrue((int)maxValue == -0x00000001, "Conv_I4 for Int64 doesn't work"); + Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for Int64 doesn't work"); + + // Test Conv_U4 + Assert.IsTrue((uint)maxValue == 0xFFFFFFFF, "Conv_U4 for Int64 doesn't work"); + Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for Int64 doesn't work"); + + // Test Conv_I8 + Assert.IsTrue((long)maxValue == 0x7FFFFFFFFFFFFFFF, "Conv_I8 for Int64 doesn't work"); + Assert.IsTrue((long)minValue == -0x8000000000000000, "Conv_I8 for Int64 doesn't work"); + + // Test Conv_U8 + Assert.IsTrue((ulong)maxValue == 0x7FFFFFFFFFFFFFFF, "Conv_U8 for Int64 doesn't work"); + Assert.IsTrue((ulong)minValue == 0x8000000000000000, "Conv_U8 for Int64 doesn't work"); + + // Test Conv_R4 + Assert.IsTrue((float)maxValue == Int64.MaxValue, "Conv_R4 for Int64 doesn't work"); + Assert.IsTrue((float)minValue == Int64.MinValue, "Conv_R4 for Int64 doesn't work"); + + // Test Conv_R8 + Assert.IsTrue((double)maxValue == Int64.MaxValue, "Conv_R8 for Int64 doesn't work"); + Assert.IsTrue((double)minValue == Int64.MinValue, "Conv_R8 for Int64 doesn't work"); + + //Test checked conversions + long val = 1; + + // Test Conv_Ovf_I8_Un + checked + { + Assert.IsTrue((long)(ulong)125 == 0x7D, "Conv_Ovf_I8_Un doesn't work(throws incorrectly)"); + long x = 0; + bool error = false; + try + { + x = (long)((ulong)val + ulong.MaxValue - 1); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I8_Un doesn't work(error was not thrown): " + x); + } + + + // Test Methods + + value = 60; + + val2 = TestMethod(value); + Assert.IsTrue(value == 60, "Passing an Int64 as a method parameter doesn't work"); + Assert.IsTrue(val2 == 61, "Returning an Int64 value from a method doesn't work"); + + ByRefTestMethod(ref value); + Assert.IsTrue(value == 61, "Passing an Int64 by ref to a method doesn't work"); + + //Test Overflow Exceptions + long val3o = 1000000; + efuse = false; + try + { + checked + { + val3o += long.MaxValue; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Add_Ovf for Int64 doesn't work"); + + efuse = false; + val3o = -10000; + try + { + checked + { + val3o -= long.MaxValue; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Sub_Ovf for Int64 doesn't work"); + } + + public static long TestMethod(long aParam) + { + aParam++; + return aParam; + } + + public static void ByRefTestMethod(ref long aParam) + { + aParam++; + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/MathTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/MathTest.cs similarity index 94% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/MathTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/MathTest.cs index a570865549..718945c1b2 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/MathTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/MathTest.cs @@ -1,5 +1,5 @@ using System; - +using Cosmos.Debug.Kernel; using Cosmos.TestRunner; namespace Cosmos.Compiler.Tests.Bcl.System @@ -89,6 +89,9 @@ public static void Execute() result = Math.Ceiling((double)int.MaxValue + 2.5); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, (double)int.MaxValue + 3), "Ceiling works for values larger than an int can hold. " + result + " expected " + (double)int.MaxValue + 3); + result = Math.Ceiling(-0.90308998699194354); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 0), "Ceiling works for random float (-0.90308998699194354)"); + #endregion Ceiling #region Floor @@ -159,9 +162,9 @@ public static void Execute() result = Math.Cos(Math.PI); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, -1), "Cos gives correct answer for PI"); - + result = Math.Cos(Math.PI / 2); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 6.12323399573677E-17), "Cos gives correct answer for PI / 2"); + Assert.AreEqual(0.0, result, "Cos gives correct answer for PI / 2"); result = Math.Cos(Math.PI / 3); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 0.5), "Cos gives correct answer for PI / 3"); @@ -235,10 +238,10 @@ public static void Execute() Assert.IsTrue(double.IsNaN(result), "Sin works with -INF"); result = Math.Sin(Math.PI); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 1.22464679914735E-16), "Sin gives correct answer for PI"); + Assert.AreEqual(0.0, result, "Sin gives correct answer for PI"); result = Math.Sin(Math.PI / 2); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 1), "Sin gives correct answer for PI / 2"); + Assert.AreEqual(1.0, result, "Sin gives correct answer for PI / 2"); result = Math.Sin(Math.PI / 3); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 0.866025403784439), "Sin gives correct answer for PI / 3"); @@ -416,12 +419,6 @@ public static void Execute() result = Math.Tan(-0.5); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, -0.54630248984379), "Tan works with negative doubles"); - result = Math.Tan(Math.PI); - Assert.IsTrue(result <= -.22464679914735E-16, "Tan gives matching result for Pi but mathematically inaccurate result. " + result); - - result = Math.Tan(Math.PI / 2); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, 1.63312393531954E+16), "Tan gives result matching normal Math function but incorrect in mathematical sense"); - result = Math.Tan(Math.PI / 3); Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, Math.Sqrt(3)), "Tan gives correct value for PI / 3"); @@ -466,6 +463,18 @@ public static void Execute() Assert.IsTrue(EqualityHelper.DoublesAreEqual(result, -1.5707963267949), "Atan works with -INF"); #endregion Math.Atan + + #region Math.Round + + Assert.IsTrue(EqualityHelper.DoublesAreEqual(1, Math.Round(0.8)), "Math.Round works for 0.8"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(0, Math.Round(0.2)), "Math.Round works for 0.2"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(99, Math.Round(99.2)), "Math.Round works for 99.2"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(99, Math.Round(99d)), "Math.Round works for 99"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(0, Math.Round(-0.2)), "Math.Round works for -0.2"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(-1, Math.Round(-0.8)), "Math.Round works for -0.8"); + Assert.IsTrue(EqualityHelper.DoublesAreEqual(0, Math.Round(-0.000000006494348)), "Math.Round works for very small values"); + + #endregion } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ObjectTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ObjectTests.cs similarity index 100% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ObjectTests.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/ObjectTests.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SByteTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SByteTest.cs similarity index 75% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SByteTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SByteTest.cs index 2f668dcef2..c51ffef6bb 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SByteTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SByteTest.cs @@ -32,10 +32,8 @@ public static void Execute() // Now let's Get the HashCode of a value int resultAsInt = value.GetHashCode(); - // The Hash Code of a SByte is not the same value expressed as int but some XOR tricks are done in the value - int expectedResultAsInt = ((int)value ^ (int)value << 8); - Assert.IsTrue((resultAsInt == expectedResultAsInt), "SByte.GetHashCode() doesn't work"); + Assert.IsTrue((resultAsInt == value), "SByte.GetHashCode() doesn't work" + resultAsInt + " vs " + value); #if false // Now let's try ToString() again but printed in hex (this test fails for now!) @@ -137,6 +135,64 @@ public static void Execute() Assert.IsTrue((double)maxValue == SByte.MaxValue, "Conv_R8 for SByte doesn't work"); Assert.IsTrue((double)minValue == SByte.MinValue, "Conv_R8 for SByte doesn't work"); + //Now test checked conversions + int val = 1; + int test = 125; + + // Test Conv_Ovf_I1 + checked + { + Assert.IsTrue((sbyte)test == 0x7D, "Conv_Ovf_I1 for SByte doesn't work(throws incorrectly)"); + sbyte x = 0; + bool error = false; + try + { + x = (sbyte)(val + 127); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I1 for SByte doesn't work(error was not thrown)"); + error = false; + try + { + x = (sbyte)(val + 0x8_0000_0000); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I1 for from positive Long to SByte doesn't work(error was not thrown)"); + error = false; + try + { + x = (sbyte)(val + -0x8_0000_0001); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I1 for from negative Long to SByte doesn't work(error was not thrown)"); + } + + // Test Conv_Ovf_I1_Un + checked + { + Assert.IsTrue((sbyte)(uint)125 == 0x7D, "Conv_Ovf_I1_Un for SByte doesn't work(throws incorrectly)"); + sbyte x = 0; + bool error = false; + try + { + x = (sbyte)(uint)(val + 127); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_I1_Un for SByte doesn't work(error was not thrown)"); + } + // Test Methods val2 = TestMethod(value); Assert.IsTrue(value == 60, "Passing an SByte as a method parameter doesn't work"); diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SingleTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SingleTest.cs similarity index 86% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SingleTest.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SingleTest.cs index 9fd6bf961b..3ac2f1e29e 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/SingleTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/SingleTest.cs @@ -1,5 +1,4 @@ using System; - using Cosmos.TestRunner; namespace Cosmos.Compiler.Tests.Bcl.System @@ -8,9 +7,9 @@ internal static class SingleTest { public static void Execute() { - Single value; - String result; - String expectedResult; + float value; + string result; + string expectedResult; /* First start with some weird value (not really numbers) that the IEEE standard has */ value = Single.PositiveInfinity; @@ -207,32 +206,7 @@ public static void Execute() valueNegated = -value; Assert.IsTrue((EqualityHelper.SinglesAreEqual(valueNegated, -42.0f)), "(float) negation of positive float doesn't work"); - #region Parsing - - value = Single.Parse("0.4"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 0.4), "simple parsing of float works"); - - value = Single.Parse("+0.3"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 0.3), "parsing of float with positive sign works!"); - - value = Single.Parse("-0.4"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, -0.4), "parsing of negative float works!"); - - value = Single.Parse(" 0.7 "); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 0.7), "float parsing ignores leading and trailing whitespaces"); - - value = Single.Parse("0.4E1"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 4), "float parsing takes in account E"); - - value = Single.Parse("0.4E-1"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 0.04), "float parsing works with negative E"); - - Assert.IsFalse(Single.TryParse("asd4", out value), "float TryParse returns false when it fails"); - - Assert.IsTrue(Single.TryParse("2.3", out value), " float TryParse returns true when it works"); - Assert.IsTrue(EqualityHelper.DoublesAreEqual(value, 2.3), "float TryParse returns correct result when it works"); - #endregion Parsing } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StandardMethodTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StandardMethodTest.cs new file mode 100644 index 0000000000..c708093a0d --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StandardMethodTest.cs @@ -0,0 +1,35 @@ +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + static class StandardMethodTest + { + static class HexConverter + { + public static char ToCharUpper(int value) + { + value &= 0xF; + value += 48; + if (value > 57) + { + value += 7; + } + return (char)value; + } + } + + public static void Execute() + { + char[] numbers = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + for (int i = 0; i < 16; i++) + { + Assert.AreEqual(numbers[i], HexConverter.ToCharUpper(i), "ToCharUpper works: " + HexConverter.ToCharUpper(i)); + } + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StringTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StringTest.cs new file mode 100644 index 0000000000..235206faf3 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/StringTest.cs @@ -0,0 +1,232 @@ +using System; +using System.Buffers; +using Cosmos.Debug.Kernel; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class StringTest + { + + public static unsafe void Execute() + { + #region ctors + + char[] charArray = { 'h', 'e', 'l', 'l', 'o' }; + string aString = new string(charArray); + Assert.AreEqual("hello", aString, "String can be created from char array"); + Assert.AreEqual(5, aString.Length, "Length of string from char array is correct"); + + fixed (char* ptr = charArray) + { + aString = new string(ptr); + Assert.AreEqual("hello", aString, "String can be created from char ptr"); + Assert.AreEqual(5, aString.Length, "Length of string from char ptr is correct"); + } + + charArray = new []{ 'h', 'e', 'l', 'l', 'o'}; + ReadOnlySpan span = new ReadOnlySpan(charArray); + Assert.AreEqual(charArray.Length, span.Length, "Array and Span have the same length"); + Assert.AreEqual(charArray[0], span[0], "Array and span have same value at index 0"); + Assert.AreEqual(charArray[2], charArray[2], "Array and span have same value at index 2"); + + Assert.AreEqual("hello", new string(span), "Creating string from span works"); + + string spanString = span.ToString(); + Assert.AreEqual("hello", spanString, "span.ToString works"); + + + + string test = "123456"; + span = test.AsSpan(0, 2); + Assert.AreEqual("12", span.ToString(), "AsSpan works 0-2"); + + span = test.AsSpan(0, 6); + Assert.AreEqual("123456", span.ToString(), "AsSpan works 0-6"); + + span = test.AsSpan(1, 3); + Assert.AreEqual("234", span.ToString(), "AsSpan works 1-3"); + + span = test.AsSpan(1, 5); + Assert.AreEqual("23456", span.ToString(), "AsSpan works 1-5"); + + span = test.AsSpan(2); + Assert.AreEqual("3456", span.ToString(), "AsSpan works 2-"); + + span = "AAABACADADBCA".AsSpan(0, 3); + Assert.AreEqual("AAA", span.ToString(), "What breaks for Split, works directly..."); + + string whiteSpaceText = " 1 2 "; + span = whiteSpaceText.AsSpan(); + Assert.AreEqual("1 2", span.Trim().ToString(), "Span.Trim works"); + Assert.IsFalse(span.IsEmpty, "span.IsEmpty works"); + + #endregion + + string xTestStr = "Test"; + int xExpectedLength = 4; + int xLength = xTestStr.Length; + Assert.IsTrue(xLength == xExpectedLength, "String.Length is not returning the correct value."); + + Assert.IsTrue(("a" + "b") == "ab", "concatting 2 string using + doesn't work"); + Assert.IsTrue(("a" + 'b') == "ab", "concatting 1 string and 1 character doesn't work"); + + string a = "a"; + string b = "b"; + string result = a + b; + Assert.IsTrue(result == "ab", "concatting 2 string (not optimizable) using + doesn't work"); // Fails + + char x = 'a'; + string y = "a"; + Assert.IsTrue(x.ToString() == y, "String == operator "); + + string str = "Cosmos is awesome!"; + string expected = "Cosmos"; + string substr = str.Substring(0, 6); + Assert.IsTrue((substr == expected), "Substring is not equal to the expected result, result should be \"Cosmos\". Substrings are broken or MichaelTheShifter made an off-by-one error."); + + int value1 = 1; + string value2 = "4"; + string expected_res = "1 + 3 = 4"; + Assert.IsTrue(($"{value1} + 3 = {value2}" == expected_res), "String $ operator does not work."); + + string split_in = "ABC"; + var xResultArray = split_in.Split('B'); + Assert.IsTrue(xResultArray.Length == 2, "String.Split(char[]) doesn't work."); + + xResultArray = split_in.Split(new[] { "B" }, StringSplitOptions.None); + Assert.IsTrue(xResultArray.Length == 2, "String.Split(string[], StringSplitOptions) doesn't work."); + + string to_split = "AAABACADADBCA"; + + xResultArray = to_split.Split(new[] { "B", "C" }, StringSplitOptions.None); + Assert.AreEqual(new[] { "AAA", "A", "ADAD", "", "A" }, xResultArray, "Splitting works with multiple things to split by"); + xResultArray = to_split.Split(new[] { "B", "C" }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < xResultArray.Length; i++) + { + Assert.IsTrue(true, xResultArray[i]); + } + Assert.AreEqual(new[] { "AAA", "A", "ADAD", "A" }, xResultArray, "Splitting works with RemoveEmptyEntries"); + + test = "This is a test string."; + Assert.IsTrue(test.Contains("test"), "String.Contains(string) doesn't find a substring that actually exists."); + Assert.IsTrue(test.Contains("ing"), "String.Contains(string) doesn't find a substring that actually exists."); + Assert.IsFalse(test.Contains("cosmos"), "String.Contains(string) found a substring that didn't actually exist in a string."); + + Assert.IsTrue(test.StartsWith("This"), "string.StartsWith(string) is reporting false even though the string does start with the supplied substring."); + Assert.IsFalse(test.StartsWith("That"), "string.StartsWith(string) is reporting true even though the string doesn't start with the supplied substring."); + + Assert.IsTrue(test.EndsWith("string."), "string.EndsWith(string) is not reporting false even though the string actually does end with the substring."); + Assert.IsFalse(test.EndsWith("sentence."), "string.EndsWith(string) is not reporting true even though the string actually doesn't end with the substring."); + + Assert.IsTrue(test.IndexOf(string.Empty, 10) == 10, "string.IndexOf currectly returns for empty string with start index"); + Assert.IsTrue(test.IndexOf(string.Empty, 10, 10) == 10, "string.IndexOf currectly returns for empty string with start index and count"); + Assert.IsTrue(test.IndexOf('T') == 0, "string.IndexOf finds the only occurance of a letter"); + Assert.IsTrue(test.IndexOf('A') == -1, "string.IndexOf correctly returns when it does not find something"); + Assert.IsTrue(test.IndexOf("ABCDE") == -1, "string.IndexOf correctly returns when it does not find something"); + Assert.IsTrue(test.IndexOf('.') == test.Length - 1, "string.IndexOf finds the only occurance of a letter at the end of the string"); + Assert.IsTrue(test.IndexOf('i') == 2, "string.IndexOf finds the first of multiple occurances of a letter"); + Assert.IsTrue(test.IndexOf('i', 8) == 18, "string.IndexOf with start point finds the first of multiple occurances of a letter"); + Assert.IsTrue(test.IndexOf("is") == 2, "string.IndexOf finds the first of multiple occurances of a string"); + Assert.IsTrue(test.IndexOf("is", 3) == 5, "string.IndexOf with start point finds the first of multiple occurances of a string"); + Assert.IsTrue(test.IndexOf("is", 3, 5) == 5, "string.IndexOf with start point and count finds the first of multiple occurances of a string"); + Assert.IsTrue(test.IndexOf("is", 3, 1) == -1, "string.IndexOf with start point and count correctly returns if it does not find something"); + + Assert.IsTrue(test.IndexOfAny(new[] { 'T', 'h', 'i', 's' }) == 0, "string.IndexOfAny finds the first one"); + Assert.IsTrue(test.IndexOfAny(new[] { 'A', 'B', 'C' }) == -1, "string.IndexOfAny finds none if none are present"); + + Assert.AreEqual(0, test.LastIndexOf("T"), "string.LastIndexOf works for char as string"); + Assert.AreEqual(0, test.LastIndexOf("This"), "string.LastIndexOf works for existing string"); + Assert.AreEqual(-1, test.LastIndexOf("Test"), "string.LastIndexOf works for existing string"); + Assert.IsTrue(test.LastIndexOf(string.Empty, 100) == test.Length, "string.LastIndexOf handles empty correctly"); + Assert.IsTrue(test.LastIndexOf('T') == 0, "string.LastIndexOf finds the only occurance of a letter"); + Assert.IsTrue(test.LastIndexOf('.') == test.Length - 1, "string.LastIndexOf finds the only occurance of a letter at the end of the string"); + Assert.IsTrue(test.LastIndexOf('i') == test.Length - 4, "string.IndexOf finds the last of multiple occurances of a letter"); + + Assert.IsTrue(test.LastIndexOfAny(new[] { 'T', 'h', 'i', 's' }) == 18, "string.LastIndexOfAny finds the first one"); + Assert.IsTrue(test.LastIndexOfAny(new[] { 'A', 'B', 'C' }) == -1, "string.LastIndexOfAny finds none if none are present"); + + + Assert.IsTrue(test.Insert(0, "A") != test, "string.Insert creates a new instance"); + Assert.IsTrue(test.Insert(1, "A") == "TAhis is a test string.", "string.Insert correctly inserts a single character"); + Assert.IsTrue(test.Insert(2, "ABCDE F") == "ThABCDE Fis is a test string.", "string.Insert correctly adds multiple characters"); + Assert.IsTrue(test.Insert(test.Length, "END") == "This is a test string.END", "string.Insert correctly inserts at the end of the string"); + + Assert.IsTrue(test.Remove(1) == "T", "string.Remove correctly removes all other characters"); + Assert.IsTrue(test.Remove(0) == "", "string.Remove correctly removes all characters"); + Assert.IsTrue(test.Remove(0, 2) == "is is a test string.", "string.Remove works with count"); + + Assert.IsTrue(" a ".Trim() == "a", "string.Trim trims both front and back"); + Assert.IsTrue("abababababa".Trim(new[] { 'a', 'b' }) == "", "string.Trim works with custom chars"); + Assert.IsTrue("abCababababa".Trim(new[] { 'a', 'b' }) == "C", "string.Trim works with custom chars"); + Assert.IsTrue("a".Trim() == "a", "string.Trim trims both front and back"); + Assert.IsTrue(" a ".TrimStart() == "a ", "string.TrimStart trims front"); + Assert.IsTrue("a".TrimStart() == "a", "string.Trim trims front"); + Assert.IsTrue(" a ".TrimEnd() == " a", "string.TrimEnd trims back"); + Assert.IsTrue("a".TrimEnd() == "a", "string.TrimEnd trims back"); + + + string lower_expected = "this is a test string."; + string upper_expected = "THIS IS A TEST STRING."; + Assert.IsTrue((test.ToLower() == lower_expected), "string.ToLower() does not work."); + Assert.IsTrue((test.ToUpper() == upper_expected), "string.ToUpper() does not work."); + + string replace_test = "That is a test string."; + Assert.IsTrue((test.Replace("This", "That") == replace_test), "string.Replace(string, string) does not work."); + + test = "000"; + replace_test = "000000000000"; + Assert.IsTrue((test.Replace("0", "0000") == replace_test), "string.Replace(string, string) is recursive."); + + string char_array_test = "char"; + char[] char_array_expected = { 'c', 'h', 'a', 'r' }; + Assert.IsTrue((char_array_test.ToCharArray().Length == 4), "string.ToCharArray() does not work."); + + string strA; + string strB; + int comparisionResult; + + strA = "Test"; + strB = "Test"; + + comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); + Assert.IsTrue(comparisionResult == 0, "String.Compare (same string) not working!"); + + strA = "\x0041\x0042\x0043"; + strB = "\x0061\x0062\x0063"; + + comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); + Assert.IsTrue(comparisionResult == -32, "String.Compare (uppercase vs lowercase) not working!"); + + strA = "\x0041\x0042\x0043"; + strB = "\x0041\x0062\x0063"; + + comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); + Assert.IsTrue(comparisionResult == -32, "String.Compare (first letter same) not working!"); + + strA = "Horse"; + strB = "Morse"; /* . _ . */ + + comparisionResult = String.Compare(strA, 1, strB, 1, strA.Length, StringComparison.Ordinal); + Assert.IsTrue(comparisionResult == 0, "String.Compare (first letter different skipped) not working!"); + + strA = "\x0041\x0042\x0043"; + strB = "\x0061\x0062\x0063"; + + comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.OrdinalIgnoreCase); + Assert.IsTrue(comparisionResult == 0, "String.Compare (uppercase vs lowercase ignoring case) not working!"); + + // we can't test hash code, it's based on a random seed + + //string stringToHash = "test"; + //int hashCode = stringToHash.GetHashCode(); + + //Assert.IsTrue(hashCode == -871206010, "String.GetHashCode() not working!"); + + // we test if the strigns allocted at the beginning are still correct to ensure that the memory they were allocated in was not incorrectly overwritten + // we need to test all of the ctors since we have custom code in the NewObj.cs to calculate the correct length for the string to be allocated + Assert.AreEqual("hello", aString, "aString is still correct"); + Assert.AreEqual("hello", spanString, "spanString is still correct"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/TimeSpanTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/TimeSpanTests.cs similarity index 100% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/TimeSpanTests.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/TimeSpanTests.cs diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt16Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt16Test.cs similarity index 75% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt16Test.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt16Test.cs index 7aa76b3e3d..9af1b0e963 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt16Test.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt16Test.cs @@ -134,6 +134,66 @@ public static void Execute() Assert.IsTrue((double)maxValue == UInt16.MaxValue, "Conv_R8 for UInt16 doesn't work"); Assert.IsTrue((double)minValue == UInt16.MinValue, "Conv_R8 for UInt16 doesn't work"); + //Test checked conversions + int val = 1; + int test = 125; + + // Test Conv_Ovf_U2 + checked + { + Assert.IsTrue((ushort)test == 0x7D, "Conv_Ovf_U2 doesn't work(throws incorrectly)"); + ushort x = 0; + bool error = false; + try + { + x = (ushort)(ushort.MaxValue + val); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U2 doesn't work(error was not thrown): " + x); + Assert.IsTrue((uint)(long)125 == 0x7D, "Conv_Ovf_U2 for long to ushort doesn't work(throws incorrectly)"); + error = false; + try + { + x = (ushort)(val + 0x8_0000_0000); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U2 for from positive long to ushort doesn't work(error was not thrown): " + x); + error = false; + try + { + x = (ushort)(val + -0x8_0000_0001); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U2 for from negative long to ushort doesn't work(error was not thrown): " + x); + } + + + // Test Conv_Ovf_U2_Un + checked + { + Assert.IsTrue((ushort)(uint)125 == 0x7D, "Conv_Ovf_U2_Un doesn't work(throws incorrectly)"); + ushort x = 0; + bool error = false; + try + { + x = (ushort)(uint)(val + ushort.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U2_Un doesn't work(error was not thrown): " + x); + } + // Test Methods val2 = TestMethod(value); Assert.IsTrue(value == 60, "Passing an UInt16 as a method parameter doesn't work"); diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt32Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt32Test.cs new file mode 100644 index 0000000000..066f387624 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt32Test.cs @@ -0,0 +1,236 @@ +using System; + +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal static class UInt32Test + { + public static void Execute() + { + uint value; + string result; + string expectedResult; + + value = UInt32.MaxValue; + + result = value.ToString(); + expectedResult = "4294967295"; + + //Assert.IsTrue((result == expectedResult), "UInt32.ToString doesn't work"); + + // Now let's try to concat to a String using '+' operator + result = "The Maximum value of an UInt32 is " + value; + expectedResult = "The Maximum value of an UInt32 is 4294967295"; + + Assert.IsTrue((result == expectedResult), "String concat (UInt32) doesn't work"); + + // Now let's try to use '$ instead of '+' + result = $"The Maximum value of an UInt32 is {value}"; + // Actually 'expectedResult' should be the same so... + Assert.IsTrue((result == expectedResult), "String format (UInt32) doesn't work"); + + // Now let's Get the HashCode of a value + int resultAsInt = value.GetHashCode(); + + // actually the Hash Code of a Int32 is the same value (but expressed as Int32 so could have sign!) + Assert.IsTrue((resultAsInt == (int)value), "UInt32.GetHashCode() doesn't work"); + +#if false + // Now let's try ToString() again but printed in hex (this test fails for now!) + result = value.ToString("X2"); + expectedResult = "0x7FFFFFFF"; + + Assert.IsTrue((result == expectedResult), "Int32.ToString(X2) doesn't work"); +#endif + + // basic bit operations + + uint val2; + + value = 0x0C; // low-order bits: 0b0000_1100 + + val2 = ~value; // val2 = ~value = low-order bits: 0b1111_0011 + Assert.IsTrue(val2 == 0xFFFFFFF3, "UInt32 bitwise not doesn't work got: " + val2); + + val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 + Assert.IsTrue(val2 == 0x04, "UInt32 bitwise and doesn't work got: " + val2); + + val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 + Assert.IsTrue(val2 == 0x0E, "UInt32 bitwise or doesn't work got: " + val2); + + val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 + Assert.IsTrue(val2 == 0x0A, "UInt32 bitwise xor doesn't work got: " + val2); + + val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 + Assert.IsTrue(val2 == 0x03, "UInt32 left shift doesn't work got: " + val2); + + val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 + Assert.IsTrue(val2 == 0x30, "UInt32 right shift doesn't work got: " + val2); + + // basic arithmetic operations + + value = 60; + + val2 = value + 5; + Assert.IsTrue(val2 == 65, "UInt32 addition doesn't work got: " + val2); + + val2 = value - 5; + Assert.IsTrue(val2 == 55, "UInt32 subtraction doesn't work got: " + val2); + + val2 = value * 5; + Assert.IsTrue(val2 == 300, "UInt32 multiplication doesn't work got: " + val2); + + val2 = value / 5; + Assert.IsTrue(val2 == 12, "UInt32 division doesn't work got: " + val2); + + val2 = value % 7; + Assert.IsTrue(val2 == 4, "UInt32 remainder doesn't work got: " + val2); + + // Now test conversions + + uint maxValue = UInt32.MaxValue; + uint minValue = UInt32.MinValue; + + // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted + + // Test Conv_I1 + Assert.IsTrue((sbyte)maxValue == -1, "Conv_I1 for UInt32 doesn't work"); + Assert.IsTrue((sbyte)minValue == 0, "Conv_I1 for UInt32 doesn't work"); + + // Test Conv_U1 + Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for UInt32 doesn't work"); + Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for UInt32 doesn't work"); + + // Test Conv_I2 + Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for UInt32 doesn't work"); + Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for UInt32 doesn't work"); + + // Test Conv_U2 + Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for UInt32 doesn't work"); + Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for UInt32 doesn't work"); + + // Test Conv_I4 + Assert.IsTrue((int)maxValue == -0x00000001, "Conv_I4 for UInt32 doesn't work"); + Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for UInt32 doesn't work"); + + // Test Conv_U4 + Assert.IsTrue((uint)maxValue == 0xFFFFFFFF, "Conv_U4 for UInt32 doesn't work"); + Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for UInt32 doesn't work"); + + // Test Conv_I8 + Assert.IsTrue((long)maxValue == 0x00000000FFFFFFFF, "Conv_I8 for UInt32 doesn't work"); + Assert.IsTrue((long)minValue == 0x0000000000000000, "Conv_I8 for UInt32 doesn't work"); + + // Test Conv_U8 + Assert.IsTrue((ulong)maxValue == 0x00000000FFFFFFFF, "Conv_U8 for UInt32 doesn't work"); + Assert.IsTrue((ulong)minValue == 0x0000000000000000, "Conv_U8 for UInt32 doesn't work"); + + // Test Conv_R4 + Assert.IsTrue((float)maxValue == uint.MaxValue, "Conv_R4 for UInt32 doesn't work"); + Assert.IsTrue((float)minValue == uint.MinValue, "Conv_R4 for UInt32 doesn't work"); + + // Test Conv_R8 + Assert.IsTrue((double)maxValue == uint.MaxValue, "Conv_R8 for UInt32 doesn't work"); + Assert.IsTrue((double)minValue == uint.MinValue, "Conv_R8 for UInt32 doesn't work"); + + //Test checked conversions + long val = 1; + + // Test Conv_Ovf_U4 + checked + { + Assert.IsTrue((uint)(long)125 == 0x7D, "Conv_Ovf_U4 doesn't work(throws incorrectly)"); + uint x = 0; + bool error = false; + try + { + x = (uint)(uint.MaxValue + val); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U4 doesn't work(error was not thrown): " + x); + try + { + int y = 1; + x = (uint)(-80 + y); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U4 doesn't work for negative integers(error was not thrown): " + x); + } + + + // Test Conv_Ovf_U4_Un + checked + { + Assert.IsTrue((uint)(ulong)125 == 0x7D, "Conv_Ovf_U4_Un doesn't work(throws incorrectly)"); + long max = uint.MaxValue; + Assert.IsTrue((uint)(ulong)max == uint.MaxValue, "Conv_Ovf_U4_Un doesn't work(throws incorrectly)"); + uint x = 0; + bool error = false; + try + { + x = (uint)(ulong)(val + uint.MaxValue); + } + catch (Exception) + { + error = true; + } + Assert.IsTrue(error, "Conv_Ovf_U4_Un doesn't work(error was not thrown): " + x); + } + + //Test Methods + val2 = TestMethod(value); + Assert.IsTrue(value == 60, "Passing an UInt32 as a method parameter doesn't work"); + Assert.IsTrue(val2 == 61, "Returning an UInt32 value from a method doesn't work"); + + ByRefTestMethod(ref value); + Assert.IsTrue(value == 61, "Passing an UInt32 by ref to a method doesn't work"); + uint val3o = 10000; + bool efuse = false; + try + { + checked + { + val3o += uint.MaxValue; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Add_Ovf for UInt32 doesn't work: " + val3o); + + efuse = false; + val3o = 10000; + try + { + checked + { + val3o -= 2147483647; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Sub_Ovf for UInt32 doesn't work: " + val3o); + } + + public static uint TestMethod(uint aParam) + { + aParam++; + return aParam; + } + + public static void ByRefTestMethod(ref uint aParam) + { + aParam++; + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt64Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt64Test.cs similarity index 83% rename from Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt64Test.cs rename to Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt64Test.cs index c171f1eab4..3b90380bc1 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt64Test.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/System/UInt64Test.cs @@ -18,6 +18,8 @@ public static void Execute() expectedResult = "18446744073709551615"; Assert.IsTrue((result == expectedResult), "UInt64.ToString doesn't work"); + Assert.IsTrue(value.ToString("X") == "FFFFFFFFFFFFFFFF", "UInt64.ToString(X) doesn't work"); + Assert.IsTrue(((ulong)0x121411443).ToString("X") == "121411443", "UInt64.ToString(X) doesn't work"); // Now let's try to concat to a String using '+' operator result = "The Maximum value of an UInt64 is " + value; @@ -159,6 +161,21 @@ public static void Execute() Assert.IsTrue((double)maxValue == UInt64.MaxValue, "Conv_R8 for UInt64 doesn't work"); Assert.IsTrue((double)minValue == UInt64.MinValue, "Conv_R8 for UInt64 doesn't work"); + //Test checked conversions + + // Test for Conv_Ovf_U8 + checked + { + Assert.IsTrue((ulong)125 == 0x7D, "Conv_Ovf_U8 doesn't work(throws incorrectly)"); + } + + checked + { + uint t = 125; + Assert.IsTrue((ulong)t == 0x7D, "Conv_Ovf_U8 doesn't work(throws incorrectly)"); + } + // TODO: If possible, somehow add tests for Conv_Ovf_I8_Un + // Test Methods value = 60; @@ -169,6 +186,37 @@ public static void Execute() ByRefTestMethod(ref value); Assert.IsTrue(value == 61, "Passing an UInt64 by ref to a method doesn't work"); + + //Test Overflow Exceptions + ulong val3o = 10000; + bool efuse = false; + try + { + checked + { + val3o += ulong.MaxValue; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Add_Ovf for UInt64 doesn't work: " + val3o); + + efuse = false; + val3o = 10000; + try + { + checked + { + val3o -= 2147483647; + } + } + catch (OverflowException) + { + efuse = true; + } + Assert.IsTrue(efuse, "Sub_Ovf for UInt64 doesn't work: " + val3o); } public static ulong TestMethod(ulong aParam) diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/packages.lock.json new file mode 100644 index 0000000000..e81a7756fb --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl.System/packages.lock.json @@ -0,0 +1,2729 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Cosmos.Compiler.Tests.Bcl.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Cosmos.Compiler.Tests.Bcl.csproj index d6fb90ea57..f352f28624 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Cosmos.Compiler.Tests.Bcl.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Cosmos.Compiler.Tests.Bcl.csproj @@ -1,14 +1,19 @@  - netcoreapp2.0 + net6.0 + cosmos + false True CA2242;$(NoWarn) + true + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Helpers/EqualityHelper.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Helpers/EqualityHelper.cs index d0b252e4d2..0c9e366f77 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Helpers/EqualityHelper.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Helpers/EqualityHelper.cs @@ -2,7 +2,7 @@ namespace Cosmos.Compiler.Tests.Bcl { - internal static class EqualityHelper + public static class EqualityHelper { public static bool SinglesAreEqual(float left, float right) { @@ -55,5 +55,43 @@ public static bool ByteArrayAreEquals(byte[] a1, byte[] a2) return true; } + + /// + /// Utility method to test int[] equality. + /// + /// int array. + /// int array. + /// True if the elements in the arrays are equal otherwise false. + public static bool IntArrayAreEquals(int[] a1, int[] a2) + { + if (ReferenceEquals(a1, a2)) + { + //mDebugger.Send("a1 and a2 are the same Object"); + return true; + } + + if (a1 == null || a2 == null) + { + //mDebugger.Send("a1 or a2 is null so are different"); + return false; + } + + if (a1.Length != a2.Length) + { + //mDebugger.Send("a1.Length != a2.Length so are different"); + return false; + } + + for (int i = 0; i < a1.Length; i++) + { + if (a1[i] != a2[i]) + { + //mDebugger.Send("In position " + i + " a byte is different"); + return false; + } + } + + return true; + } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs index a20aa466d9..8858f24a12 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/Kernel.cs @@ -25,31 +25,11 @@ protected override void Run() { mDebugger.Send("Run"); - // C# + //// C# + ObjectTest.Execute(); WhileLoopTests.Execute(); ForeachLoopTests.Execute(); - // System - ObjectTests.Execute(); - ArrayTests.Execute(); - StringTest.Execute(); - ByteTest.Execute(); - SByteTest.Execute(); - Int16Test.Execute(); - UInt16Test.Execute(); - Int32Test.Execute(); - UInt32Test.Execute(); - Int64Test.Execute(); - UInt64Test.Execute(); - CharTest.Execute(); - BooleanTest.Execute(); - SingleTest.Execute(); - DoubleTest.Execute(); - MathTest.Execute(); - ConvertTests.Execute(); - DateTimeTests.Execute(); - TimeSpanTests.Execute(); - //mDebugger.Send("Thread test start of 500 ms"); //ThreadTest.Execute(); //mDebugger.Send("Thread test end"); @@ -57,20 +37,23 @@ protected override void Run() //DecimalTest.Execute(); BitConverterTest.Execute(); UnsafeCodeTest.Execute(); - DelegatesTest.Execute(); + EventsTest.Execute(); RandomTests.Execute(); + ConvertTests.Execute(); // System.Collections HashtableTest.Execute(); // System.Collections.Generic ListTest.Execute(); - QueueTest.Execute(); + QueueTest.Execute(); DictionaryTest.Execute(); // System.Text StringBuilderTest.Execute(); EncodingTest.Execute(); + + GuidTest.Execute(); TestController.Completed(); } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ArrayTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ArrayTests.cs deleted file mode 100644 index 2335e10011..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ArrayTests.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - class ArrayTests - { - public static void Execute() - { - byte[] xByteResult = { 1, 2, 3, 4, 5, 6, 7, 8 }; - byte[] xByteExpectedResult = { 1, 2, 3, 4, 5, 6, 7, 1 }; - byte[] xByteSource = { 1 }; - - Array.Copy(xByteSource, 0, xByteResult, 7, 1); - - Assert.IsTrue((xByteResult[7] == xByteExpectedResult[7]), "Array.Copy doesn't work: xResult[7] = " + (uint)xByteResult[7] + " != " + (uint)xByteExpectedResult[7]); - - // Single[] Test - float[] xSingleResult = { 1.25f, 2.50f, 3.51f, 4.31f, 9.28f, 18.56f }; - float[] xSingleExpectedResult = { 1.25f, 2.598f, 5.39f, 4.31f, 9.28f, 18.56f }; - float[] xSingleSource = { 0.49382f, 1.59034f, 2.598f, 5.39f, 7.48392f, 4.2839f }; - - xSingleResult[1] = xSingleSource[2]; - xSingleResult[2] = xSingleSource[3]; - - Assert.IsTrue(((xSingleResult[1] + xSingleResult[2]) == (xSingleExpectedResult[1] + xSingleExpectedResult[2])), "Assinging values to single array elements doesn't work: xResult[1] = " + (uint)xSingleResult[1] + " != " + (uint)xSingleExpectedResult[1] + " and xResult[2] = " + (uint)xSingleResult[2] + " != " + (uint)xSingleExpectedResult[2]); - - // Double[] Test - double[] xDoubleResult = { 0.384, 1.5823, 2.5894, 2.9328539, 3.9201, 4.295 }; - double[] xDoubleExpectedResult = { 0.384, 1.5823, 2.5894, 95.32815, 3.9201, 4.295 }; - double[] xDoubleSource = { 95.32815 }; - - xDoubleResult[3] = xDoubleSource[0]; - - Assert.IsTrue(xDoubleResult[3] == xDoubleExpectedResult[3], "Assinging values to double array elements doesn't work: xResult[1] = " + (uint)xDoubleResult[3] + " != " + (uint)xDoubleExpectedResult[3]); - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ByteTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ByteTest.cs deleted file mode 100644 index b4ac0d35c9..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ByteTest.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class ByteTest - { - public static void Execute() - { - byte value; - string result; - string expectedResult; - - value = Byte.MaxValue; - - result = value.ToString(); - expectedResult = "255"; - - Assert.IsTrue((result == expectedResult), "Byte.ToString doesn't work"); - - // Now let's try to concat to a String using '+' operator - result = "The Maximum value of a Byte is " + value; - expectedResult = "The Maximum value of a Byte is 255"; - - Assert.IsTrue((result == expectedResult), "String concat (Byte) doesn't work"); - - // Now let's try to use '$ instead of '+' - result = $"The Maximum value of a Byte is {value}"; - // Actually 'expectedResult' should be the same so... - Assert.IsTrue((result == expectedResult), "String format (Byte) doesn't work"); - - // Now let's Get the HashCode of a value - int resultAsInt = value.GetHashCode(); - - // actually the Hash Code of a Byte is the same value expressed as int - Assert.IsTrue((resultAsInt == value), "Byte.GetHashCode() doesn't work"); - -#if false - // Now let's try ToString() again but printed in hex (this test fails for now!) - result = value.ToString("X2"); - expectedResult = "FF"; - - Assert.IsTrue((result == expectedResult), "Byte.ToString(X2) doesn't work"); -#endif - - // basic bit operations - - int val2; - - value = 0x0C; // low-order bits: 0b0000_1100 - - val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 - Assert.IsTrue(val2 == -0x0D, "Byte bitwise not doesn't work got: " + val2); - - val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 - Assert.IsTrue(val2 == 0x04, "Byte bitwise and doesn't work got: " + val2); - - val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 - Assert.IsTrue(val2 == 0x0E, "Byte bitwise or doesn't work got: " + val2); - - val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 - Assert.IsTrue(val2 == 0x0A, "Byte bitwise xor doesn't work got: " + val2); - - val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 - Assert.IsTrue(val2 == 0x03, "Byte left shift doesn't work got: " + val2); - - val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 - Assert.IsTrue(val2 == 0x30, "Byte right shift doesn't work got: " + val2); - - // basic arithmetic operations - - value = 60; - - val2 = value + 5; - Assert.IsTrue(val2 == 65, "Byte addition doesn't work got: " + val2); - - val2 = value - 5; - Assert.IsTrue(val2 == 55, "Byte subtraction doesn't work got: " + val2); - - val2 = value * 5; - Assert.IsTrue(val2 == 300, "Byte multiplication doesn't work got: " + val2); - - val2 = value / 5; - Assert.IsTrue(val2 == 12, "Byte division doesn't work got: " + val2); - - val2 = value % 7; - Assert.IsTrue(val2 == 4, "Byte remainder doesn't work got: " + val2); - - // Now test conversions - - byte maxValue = Byte.MaxValue; - byte minValue = Byte.MinValue; - - // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted - - // Test Conv_I1 - Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Byte doesn't work"); - Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Byte doesn't work"); - - // Test Conv_U1 - Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Byte doesn't work"); - Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Byte doesn't work"); - - // Test Conv_I2 - Assert.IsTrue((short)maxValue == 0x00FF, "Conv_I2 for Byte doesn't work"); - Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Byte doesn't work"); - - // Test Conv_U2 - Assert.IsTrue((ushort)maxValue == 0x00FF, "Conv_U2 for Byte doesn't work"); - Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Byte doesn't work"); - - // Test Conv_I4 - Assert.IsTrue((int)maxValue == 0x000000FF, "Conv_I4 for Byte doesn't work"); - Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for Byte doesn't work"); - - // Test Conv_U4 - Assert.IsTrue((uint)maxValue == 0x000000FF, "Conv_U4 for Byte doesn't work"); - Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for Byte doesn't work"); - - // Test Conv_I8 - Assert.IsTrue((long)maxValue == 0x00000000000000FF, "Conv_I8 for Byte doesn't work"); - Assert.IsTrue((long)minValue == 0x0000000000000000, "Conv_I8 for Byte doesn't work"); - - // Test Conv_U8 - Assert.IsTrue((ulong)maxValue == 0x00000000000000FF, "Conv_U8 for Byte doesn't work"); - Assert.IsTrue((ulong)minValue == 0x0000000000000000, "Conv_U8 for Byte doesn't work"); - - // Test Conv_R4 - Assert.IsTrue((float)maxValue == Byte.MaxValue, "Conv_R4 for Byte doesn't work" + (float)maxValue); - Assert.IsTrue((float)minValue == Byte.MinValue, "Conv_R4 for Byte doesn't work"); - - // Test Conv_R8 - Assert.IsTrue((double)maxValue == Byte.MaxValue, "Conv_R8 for Byte doesn't work"); - Assert.IsTrue((double)minValue == Byte.MinValue, "Conv_R8 for Byte doesn't work"); - - // Test Methods - val2 = TestMethod(value); - Assert.IsTrue(value == 60, "Passing a Byte as a method parameter doesn't work"); - Assert.IsTrue(val2 == 61, "Returning a Byte value from a method doesn't work"); - - ByRefTestMethod(ref value); - Assert.IsTrue(value == 61, "Passing a Byte by ref to a method doesn't work"); - } - - public static byte TestMethod(byte aParam) - { - aParam++; - return aParam; - } - - public static void ByRefTestMethod(ref byte aParam) - { - aParam++; - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/DictionaryTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/DictionaryTest.cs index 997682958a..38e08e20fe 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/DictionaryTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/DictionaryTest.cs @@ -1,113 +1,603 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Cosmos.TestRunner; - - -namespace Cosmos.Compiler.Tests.Bcl.System.Collections.Generic -{ - public static class DictionaryTest - { - public static void Execute() - { - var dictionary = new Dictionary - { - {"a", "a"}, - {"b", "b" }, - {"c", "c"} - }; - - Assert.IsTrue(dictionary.ContainsKey("a"), "Dictionary ContainsKey does not work1"); - Assert.IsFalse(dictionary.ContainsKey("d"), "Dictionary ContainsKey does not work 2"); - - //String test - Assert.IsTrue(dictionary["a"] == "a", "Dictionary [] operator (get) does not work"); - dictionary["b"] = "d"; - Assert.IsTrue(dictionary["b"] == "d", "Dictionary [] operator (set existing) does not work"); - - Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); - dictionary["d"] = "d"; - Assert.IsTrue(dictionary["d"] == "d", "Dictionary [] operator (set not existing) does not work"); - - /* We added another key so now Count should be 4 */ - Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); - - Dictionary.KeyCollection keyColl = dictionary.Keys; - - foreach (string key in keyColl) - { - Assert.IsTrue(key == "a" || key == "b" || key == "c" || key == "d", "Dictionary.Keys returns invalid key"); - } - - dictionary.Add("e", "e"); - /* We added another key so now Count should be 5 */ - Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); - - /* Now we remove "e" key, the operation should succeed and Count should be 4 again */ - Assert.IsTrue(dictionary.Remove("e"), "Dictionary.Remove() of existing key does not work"); - Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); - - /* Now we remove "f" key, the operation should fail as there is not "f" key */ - Assert.IsFalse(dictionary.Remove("f"), "Dictionary.Remove() of not existing key does not work"); - - Assert.IsTrue(dictionary.TryGetValue("a", out string val), "Dictionary.TryGetValue() of existing key does not work"); - Assert.IsFalse(dictionary.TryGetValue("f", out string val2), "Dictionary.TryGetValue() of not existing key does not work"); - - var dictionary2 = new Dictionary - { - { "One", 1 }, - { "Two", 2}, - { "Three", 3 }, - }; - - Assert.IsTrue(dictionary2.ContainsKey("One"), "Dictionary ContainsKey does not work1"); - Assert.IsFalse(dictionary2.ContainsKey("Four"), "Dictionary ContainsKey does not work2"); - - Assert.IsTrue(dictionary2["One"] == 1, "Dictionary operator [] does not work"); - dictionary2["Two"] = 22; - Assert.IsTrue(dictionary2["Two"] == 22, "Dictionary [] operator (set existing) does not work"); - - Assert.IsTrue(dictionary2.Count == 3, "Dictionary.Count does not work"); - dictionary2["Four"] = 4; - Assert.IsTrue(dictionary2["Four"] == 4, "Dictionary [] operator (set not existing) does not work"); - - /* We added another key so now Count should be 4 */ - Assert.IsTrue(dictionary2.Count == 4, "Dictionary.Count (after new key) does not work"); - - Dictionary.KeyCollection keyColl2 = dictionary2.Keys; - - foreach (string key in keyColl2) - { - Assert.IsTrue(key == "One" || key == "Two" || key == "Three" || key == "Four", "Dictionary.Keys returns invalid key"); - } - - dictionary2.Add("Five", 5); - /* We added another key so now Count should be 5 */ - Assert.IsTrue(dictionary2.Count == 5, "Dictionary.Count (after Added key) does not work"); - - /* Now we remove "Five" key, the operation should succeed and Count should be 4 again */ - Assert.IsTrue(dictionary2.Remove("Five"), "Dictionary.Remove() of existing key does not work"); - Assert.IsTrue(dictionary2.Count == 4, "Dictionary.Count (after Removed key) does not work"); - - /* Now we remove "Six" key, the operation should fail as there is not "Six" key */ - Assert.IsFalse(dictionary2.Remove("Six"), "Dictionary.Remove() of not existing key does not work"); - - Assert.IsTrue(dictionary2.TryGetValue("One", out int val3), "Dictionary.TryGetValue() of existing key does not work"); - Assert.IsFalse(dictionary2.TryGetValue("Six", out int val4), "Dictionary.TryGetValue() of not existing key does not work"); -#if false - var dictionary3 = new Dictionary - { - { 1, "One"}, - { 2, "Two"}, - { 3, "Three"}, - }; - - Assert.IsTrue(dictionary3.ContainsKey(1), "Dictionary ContainsKey does not work1"); - Assert.IsFalse(dictionary3.ContainsKey(4), "Dictionary ContainsKey does not work2"); - - Assert.IsTrue(dictionary3[1] == "One", "Dictionary operator [] does not work"); -#endif - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Threading.Tasks; +using Cosmos.TestRunner; + + +namespace Cosmos.Compiler.Tests.Bcl.System.Collections.Generic +{ + public static class DictionaryTest + { + public static void Execute() + { + { + var dictionary = new Dictionary + { + {"a", "a"}, + {"b", "b" }, + {"c", "c"} + }; + + Assert.IsTrue(dictionary.ContainsKey("a"), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey("d"), "Dictionary ContainsKey does not work 2"); + + //String test + Assert.IsTrue(dictionary["a"] == "a", "Dictionary [] operator (get) does not work"); + dictionary["b"] = "d"; + Assert.IsTrue(dictionary["b"] == "d", "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary["d"] = "d"; + Assert.IsTrue(dictionary["d"] == "d", "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (string key in keyColl) + { + Assert.IsTrue(key == "a" || key == "b" || key == "c" || key == "d", "Dictionary.Keys returns invalid key"); + } + + dictionary.Add("e", "e"); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "e" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove("e"), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "f" key, the operation should fail as there is not "f" key */ + Assert.IsFalse(dictionary.Remove("f"), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue("a", out string val), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue("f", out string val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + Assert.IsFalse(dictionary.ContainsKey("a"), "Dictionary().Clear does not work"); + + dictionary.Add("b", "basds"); + Assert.IsTrue(dictionary.Count == 1, "Dictionary().Clear prevents correctly adding values again"); + Assert.IsTrue(dictionary["b"] == "basds", "Dictionary().Clear prevents correctly adding values again"); + + dictionary.Add("", "1234"); + + Assert.AreEqual("1234", (string)dictionary[""], "key of \"\" failed"); + + + } + + { + var dictionary2 = new Dictionary + { + { "One", 1 }, + { "Two", 2}, + { "Three", 3 }, + }; + + Assert.IsTrue(dictionary2.ContainsKey("One"), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary2.ContainsKey("Four"), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary2["One"] == 1, "Dictionary operator [] does not work"); + dictionary2["Two"] = 22; + Assert.IsTrue(dictionary2["Two"] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary2.Count == 3, "Dictionary.Count does not work"); + dictionary2["Four"] = 4; + Assert.IsTrue(dictionary2["Four"] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary2.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl2 = dictionary2.Keys; + + foreach (string key in keyColl2) + { + Assert.IsTrue(key == "One" || key == "Two" || key == "Three" || key == "Four", "Dictionary.Keys returns invalid key"); + } + + dictionary2.Add("Five", 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary2.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "Five" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary2.Remove("Five"), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary2.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "Six" key, the operation should fail as there is not "Six" key */ + Assert.IsFalse(dictionary2.Remove("Six"), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary2.TryGetValue("One", out int val3), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary2.TryGetValue("Six", out int val4), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary2.Clear(); + + Assert.IsTrue(dictionary2.Count == 0, "Dictionary().Clear does not work"); + Assert.IsFalse(dictionary2.ContainsKey("Five"), "Dictionary().Clear does not work"); + + dictionary2.Add("b", 9); + Assert.IsTrue(dictionary2.Count == 1, "Dictionary().Clear prevents correctly adding values again"); + Assert.IsTrue(dictionary2["b"] == 9, "Dictionary().Clear prevents correctly adding values again"); + + } + + //#region "Dictionary Tests" + //{ + // var dictionary = new Dictionary + // { + // { 'a', 'a' }, + // { 'b', 'b' }, + // { 'c', 'c' }, + // }; + + // Assert.IsTrue(dictionary.ContainsKey('a'), "Dictionary ContainsKey does not work1"); + // Assert.IsFalse(dictionary.ContainsKey('d'), "Dictionary ContainsKey does not work2"); + + // Assert.IsTrue(dictionary['a'] == 'a', "Dictionary operator [] does not work"); + // dictionary['b'] = 'v'; + // Assert.IsTrue(dictionary['b'] == 'v', "Dictionary [] operator (set existing) does not work"); + + // Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count does not work"); + // dictionary['d'] = 'd'; + // Assert.IsTrue(dictionary['d'] == 'd', "Dictionary [] operator (set not existing) does not work"); + + // /* We added another key so now Count should be 4 */ + // Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + // Dictionary.KeyCollection keyColl = dictionary.Keys; + + // foreach (var key in keyColl) + // { + // Assert.IsTrue(key == 'a' || key == 'b' || key == 'c' || key == 'd', "Dictionary.Keys returns invalid key"); + // } + + // dictionary.Add('e', 'e'); + // /* We added another key so now Count should be 5 */ + // Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + // /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + // Assert.IsTrue(dictionary.Remove('e'), "Dictionary.Remove() of existing key does not work"); + // Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + // /* Now we remove "6" key, the operation should fail as there is not "6" key */ + // Assert.IsFalse(dictionary.Remove('f'), "Dictionary.Remove() of not existing key does not work"); + + // Assert.IsTrue(dictionary.TryGetValue('a', out char val1), "Dictionary.TryGetValue() of existing key does not work"); + // Assert.IsFalse(dictionary.TryGetValue('f', out char val2), "Dictionary.TryGetValue() of not existing key does not work"); + //} + //#endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out sbyte val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out sbyte val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out byte val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out byte val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out short val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out short val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out ushort val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out ushort val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out int val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out int val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out uint val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out uint val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out long val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out long val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + #region "Dictionary Tests" + { + var dictionary = new Dictionary + { + { 1, 1 }, + { 2, 2 }, + { 3, 3 }, + }; + + Assert.IsTrue(dictionary.ContainsKey(1), "Dictionary ContainsKey does not work1"); + Assert.IsFalse(dictionary.ContainsKey(4), "Dictionary ContainsKey does not work2"); + + Assert.IsTrue(dictionary[1] == 1, "Dictionary operator [] does not work"); + dictionary[2] = 22; + Assert.IsTrue(dictionary[2] == 22, "Dictionary [] operator (set existing) does not work"); + + Assert.IsTrue(dictionary.Count == 3, "Dictionary.Count does not work"); + dictionary[4] = 4; + Assert.IsTrue(dictionary[4] == 4, "Dictionary [] operator (set not existing) does not work"); + + /* We added another key so now Count should be 4 */ + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after new key) does not work"); + + Dictionary.KeyCollection keyColl = dictionary.Keys; + + foreach (var key in keyColl) + { + Assert.IsTrue(key == 1 || key == 2 || key == 3 || key == 4, "Dictionary.Keys returns invalid key"); + } + + dictionary.Add(5, 5); + /* We added another key so now Count should be 5 */ + Assert.IsTrue(dictionary.Count == 5, "Dictionary.Count (after Added key) does not work"); + + /* Now we remove "5" key, the operation should succeed and Count should be 4 again */ + Assert.IsTrue(dictionary.Remove(5), "Dictionary.Remove() of existing key does not work"); + Assert.IsTrue(dictionary.Count == 4, "Dictionary.Count (after Removed key) does not work"); + + /* Now we remove "6" key, the operation should fail as there is not "6" key */ + Assert.IsFalse(dictionary.Remove(6), "Dictionary.Remove() of not existing key does not work"); + + Assert.IsTrue(dictionary.TryGetValue(1, out ulong val1), "Dictionary.TryGetValue() of existing key does not work"); + Assert.IsFalse(dictionary.TryGetValue(6, out ulong val2), "Dictionary.TryGetValue() of not existing key does not work"); + + dictionary.Clear(); + + Assert.IsTrue(dictionary.Count == 0, "Dictionary().Clear does not work"); + } + #endregion + + //TODO: Add GUID test once newGUID returns something other than a zero initialized guid. + + //We need to ensure that string hashing is the same for constant strings and strings on the heap + { + var dictionary = new Dictionary + { + {"a", true }, + {"ab", true }, + {"abab", true}, + {"ababa", true}, + {"aba", true } + }; + string t = "aba"; + string a = "ab"; + string b = "a"; + string alt = a + b; + + Assert.IsTrue(dictionary.ContainsKey("a"), "Dictionary ContainsKey works for length 1"); + Assert.IsTrue(dictionary.ContainsKey(t), "Dictionary ContainsKey works for length 3"); + Assert.IsTrue(dictionary.ContainsKey(alt), "Dictionary ContainsKey works for length 3 allocated on the heap"); + Assert.IsTrue(dictionary.ContainsKey("abab"), "Dictionary ContainsKey works for length 4"); + t = "ababa"; + Assert.IsTrue(dictionary.ContainsKey(t), "Dictionary ContainsKey works for length 5"); + alt += "ba"; + Assert.IsTrue(dictionary.ContainsKey(alt), "Dictionary ContainsKey works for length 5 allocated on the heap"); + } + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/ListTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/ListTest.cs index 4a3e6294b5..e75557f87f 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/ListTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/Generic/ListTest.cs @@ -9,6 +9,18 @@ namespace Cosmos.Compiler.Tests.Bcl.System.Collections.Generic { public static class ListTest { + public enum Test + { + E1, + E2 + } + + public enum LongTest : long + { + L1 = long.MaxValue - 1, + L2 = long.MaxValue - 2, + L3 = 0 + } public static void Execute() { var xList = new List(); @@ -83,6 +95,19 @@ public static void Execute() //Assert.AreEqual(5, xRange[0], "List.GetRange: xRange[0] != 5"); //Assert.AreEqual(4, xRange[1], "List.GetRange: xRange[1] != 4"); //Assert.AreEqual(5, xRange[2], "List.GetRange: xRange[2] != 5"); + + //Test enums with lists + List list = new List(); + list.Add(Test.E2); + Assert.IsTrue(list[0] == Test.E2, "IL2CPU does not handle lists with Enums correctly"); + + List list2 = new List(); + list2.Add(LongTest.L3); + list2.Add(LongTest.L2); + list2.Add(LongTest.L1); + Assert.IsTrue(list2[2] == LongTest.L1, "Enums with underlying long type work"); + Assert.IsTrue(list2[1] == LongTest.L2, "Enums with underlying long type work"); + } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/HashtableTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/HashtableTest.cs index eaed43eaa4..efc772006f 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/HashtableTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Collections/HashtableTest.cs @@ -8,7 +8,7 @@ namespace Cosmos.Compiler.Tests.Bcl.System.Collections { class HashtableTest { - private static Debugger myDebugger = new Debugger("System", "HashtableTest"); + private static Debugger myDebugger = new("HashtableTest"); public static void Execute() { @@ -57,7 +57,7 @@ public static void Execute() Assert.IsTrue((string)h2[43] == "FortyThree", "h2 indexer failed: existing value (II) not found"); - Assert.IsTrue(h2.Count == 2, "h2 Count failed: value != 2"); + Assert.IsTrue(h2.Count == 2, "h2 Count failed: value != 2"); foreach (var k in h2.Keys) { @@ -97,7 +97,8 @@ public static void Execute() Assert.IsTrue((int)k.Value == 41 || (int)k.Value == 42, "h3 enumeration returns invalid values"); } - + + } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs index 656c30f79b..09ab439622 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ConvertTests.cs @@ -1,29 +1,23 @@ -using System; - -using Cosmos.TestRunner; +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Text; namespace Cosmos.Compiler.Tests.Bcl.System { - internal static class ConvertTests + public static class ConvertTests { public static void Execute() { - var number = 5; - var numberToString = Convert.ToString(number); - - Assert.IsTrue(numberToString == "5", $"Convert.ToString(Int32) doesn't work. Result: {numberToString}"); - - var numberToByte = Convert.ToByte(number); - - Assert.IsTrue(numberToByte == 5, $"Convert.ToByte(Int32) doesn't work. Result: {numberToByte}"); - - var byteToSingle = Convert.ToSingle(numberToByte); - - Assert.IsTrue(EqualityHelper.SinglesAreEqual(byteToSingle, 5.0f), $"Convert.ToSingle(Byte) doesn't work. Result: {byteToSingle}"); - - var numberToBase64 = Convert.ToBase64String(BitConverter.GetBytes(number)); + Assert.AreEqual("1010", Convert.ToString(10, 2), "Convert.ToString(int, 2) works"); + Assert.AreEqual("12", Convert.ToString(10, 8), "Convert.ToString(int, 8) works"); + Assert.AreEqual("10", Convert.ToString(10, 10), "Convert.ToString(int, 10) works"); + Assert.AreEqual("A", Convert.ToString(10, 16), "Convert.ToString(int, 16) works"); + Assert.AreEqual("11000100000", Convert.ToString(1568, 2), "Convert.ToString(int, 2) works"); + Assert.AreEqual("3040", Convert.ToString(1568, 8), "Convert.ToString(int, 8) works"); + Assert.AreEqual("1568", Convert.ToString(1568, 10), "Convert.ToString(int, 10) works"); + Assert.AreEqual("620", Convert.ToString(1568, 16), "Convert.ToString(int, 16) works"); - Assert.IsTrue(numberToBase64 == "BQAAAA==", $"Convert.ToBase64String(byte[]) doesn't work. Result: {numberToBase64}"); } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DateTimeTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DateTimeTests.cs deleted file mode 100644 index 29f1a58b7b..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DateTimeTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class DateTimeTests - { - public static void Execute() - { - var someDateTime = new DateTime(2017, 4, 7, 16, 47, 32, 462); - - Assert.IsTrue(someDateTime.Year == 2017, "DateTime.Year is not working"); - Assert.IsTrue(someDateTime.Month == 4, "DateTime.Month is not working"); - Assert.IsTrue(someDateTime.Day == 7, "DateTime.Day is not working"); - Assert.IsTrue(someDateTime.Hour == 16, "DateTime.Hour is not working"); - Assert.IsTrue(someDateTime.Minute == 47, "DateTime.Minute is not working"); - Assert.IsTrue(someDateTime.Second == 32, "DateTime.Second is not working"); - Assert.IsTrue(someDateTime.Millisecond == 462, "DateTime.Millisecond is not working"); - - Assert.IsTrue(DateTime.Now.Year >= 2018, "DateTime.Now is returning an year lower than 2018"); - - Assert.IsTrue(someDateTime.ToString() == "2017-04-07 16:47:32", "DateTime.ToString() is not working"); - - TimeSpan twoDaysTimeSpan = TimeSpan.FromDays(2); - - someDateTime = someDateTime.Add(twoDaysTimeSpan); - Assert.IsTrue(someDateTime.Day == 9, "DateTime.Add() is not working"); - - someDateTime = someDateTime.Subtract(twoDaysTimeSpan); - Assert.IsTrue(someDateTime.Day == 7, "DateTime.Subtract() is not working"); - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DelegatesTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DelegatesTest.cs deleted file mode 100644 index 7dcd6c33fc..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/DelegatesTest.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Cosmos.Debug.Kernel; -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - public class DelegatesTest - { - private static int mCount; - - private static void IncreaseCounterOnce() - { - mCount++; - } - - - private void IncreaseCounterTwiceFromInstanceMethod() - { - mCount += 2; - } - - public static void Execute() - { - TestDelegateWithoutArguments(); - TestDelegateWithArguments(); - //TestMulticastDelegateWithoutArguments(); - } - - private static void TestDelegateWithoutArguments() - { - mCount = 0; - Action xDelegate = IncreaseCounterOnce; - xDelegate(); - Assert.AreEqual(1, mCount, "After calling delegate once, Count != 1"); - - mCount = 0; - var xTestInstance = new DelegatesTest(); - xDelegate = xTestInstance.IncreaseCounterTwiceFromInstanceMethod; - xDelegate(); - Assert.AreEqual(2, mCount, "After calling delegate second time, Count != 2"); - } - - private static void TestMulticastDelegateWithoutArguments() - { - var xDebugger = new Debugger("Test", "Delegates"); - xDebugger.Send("Start MulticastDelegate test"); - mCount = 0; - Action xDelegate = IncreaseCounterOnce; - xDebugger.Send("Adding second handler now"); - xDelegate += IncreaseCounterOnce; - xDelegate(); - Assert.AreEqual(2, mCount, "After calling multicast delegate once, Count != 2"); - } - - private static void IncreaseCounter(int number) - { - mCount += number; - } - - private void IncreaseCounterFromInstanceMethod(int number) - { - mCount += number; - } - - private static void TestDelegateWithArguments() - { - mCount = 0; - Action xDelegate = IncreaseCounter; - xDelegate(2); - Assert.AreEqual(2, mCount, "After calling delegate once, Count != 2"); - - mCount = 0; - var xTestInstance = new DelegatesTest(); - xDelegate = xTestInstance.IncreaseCounterFromInstanceMethod; - xDelegate(3); - Assert.AreEqual(3, mCount, "After calling delegate second time, Count != 3"); - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/EventsTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/EventsTest.cs new file mode 100644 index 0000000000..95f6ee3f28 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/EventsTest.cs @@ -0,0 +1,36 @@ +using System; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + internal class TestClass + { + private static bool handlerInvoked; + + public event EventHandler EventFired = (sender, args) => + { + handlerInvoked = true; + }; + + private void OnEventFired(EventArgs e) + { + EventHandler handler = EventFired; + handler?.Invoke(this, e); + } + + public bool ExecuteTest() + { + OnEventFired(null); + return handlerInvoked; + } + } + + public class EventsTest + { + public static void Execute() + { + var test = new TestClass(); + Assert.IsTrue(test.ExecuteTest(), "Event handler was not invoked."); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/GuidTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/GuidTest.cs new file mode 100644 index 0000000000..8e590d9505 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/GuidTest.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class GuidTest + { + + public static void Execute() + { + + //dont know how else to test this + + Guid testGuid = Guid.NewGuid(); + Guid testGuid1 = Guid.NewGuid(); + + Assert.IsFalse((testGuid == Guid.Empty),"Guid was Empty"); + + Assert.IsFalse((testGuid == testGuid1), "Guid was not unique"); + + byte[] GuidRFC4122 = testGuid.ToByteArray(); + + Assert.IsTrue((GuidRFC4122.Length == 16), "invalid Length"); + + Assert.IsTrue((GuidRFC4122[6].ToString("X").StartsWith("4")), $"7th byte invalid (not 4 but '{GuidRFC4122[6].ToString("X")}')"); + + bool test9thbyte = false; + + string byte8 = GuidRFC4122[8].ToString("X"); + if (byte8.StartsWith("8")) + { + test9thbyte = true; + } + else if (byte8.StartsWith("9")) + { + test9thbyte = true; + } + else if (byte8.StartsWith("A")) + { + test9thbyte = true; + } + else if (byte8.StartsWith("B")) + { + test9thbyte = true; + } + + Assert.IsTrue(test9thbyte, "9th byte invalid (not 8,9,A,B)"); + + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int16Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int16Test.cs deleted file mode 100644 index 9e1518494e..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int16Test.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class Int16Test - { - public static void Execute() - { - short value; - string result; - string expectedResult; - - value = Int16.MaxValue; - - result = value.ToString(); - expectedResult = "32767"; - - Assert.IsTrue((result == expectedResult), "Int16.ToString doesn't work"); - - // Now let's try to concat to a String using '+' operator - result = "The Maximum value of an Int16 is " + value; - expectedResult = "The Maximum value of an Int16 is 32767"; - - Assert.IsTrue((result == expectedResult), "String concat (Int16) doesn't work"); - - // Now let's try to use '$ instead of '+' - result = $"The Maximum value of an Int16 is {value}"; - // Actually 'expectedResult' should be the same so... - Assert.IsTrue((result == expectedResult), "String format (Int16) doesn't work"); - - // Now let's Get the HashCode of a value - int resultAsInt = value.GetHashCode(); - // actually the Hash Code of a Int16 is some strange XOR trick - int expectedResultAsInt = ((int)((ushort)value) | (((int)value) << 16)); - - Assert.IsTrue((resultAsInt == expectedResultAsInt), "Int16.GetHashCode() doesn't work"); - -#if false - // Now let's try ToString() again but printed in hex (this test fails for now!) - result = value.ToString("X2"); - expectedResult = "7FFF"; - - Assert.IsTrue((result == expectedResult), "Int16.ToString(X2) doesn't work"); -#endif - - // basic bit operations - - int val2; - - value = 0x0C; // low-order bits: 0b0000_1100 - - val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 - Assert.IsTrue(val2 == -0x0D, "Int16 bitwise not doesn't work got: " + val2); - - val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 - Assert.IsTrue(val2 == 0x04, "Int16 bitwise and doesn't work got: " + val2); - - val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 - Assert.IsTrue(val2 == 0x0E, "Int16 bitwise or doesn't work got: " + val2); - - val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 - Assert.IsTrue(val2 == 0x0A, "Int16 bitwise xor doesn't work got: " + val2); - - val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 - Assert.IsTrue(val2 == 0x03, "Int16 left shift doesn't work got: " + val2); - - val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 - Assert.IsTrue(val2 == 0x30, "Int16 right shift doesn't work got: " + val2); - - // basic arithmetic operations - - value = 60; - - val2 = value + 5; - Assert.IsTrue(val2 == 65, "Int16 addition doesn't work got: " + val2); - - val2 = value - 5; - Assert.IsTrue(val2 == 55, "Int16 subtraction doesn't work got: " + val2); - - val2 = value * 5; - Assert.IsTrue(val2 == 300, "Int16 multiplication doesn't work got: " + val2); - - val2 = value / 5; - Assert.IsTrue(val2 == 12, "Int16 division doesn't work got: " + val2); - - val2 = value % 7; - Assert.IsTrue(val2 == 4, "Int16 remainder doesn't work got: " + val2); - - // Now test conversions - - short maxValue = Int16.MaxValue; - short minValue = Int16.MinValue; - - // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted - - // Test Conv_I1 - Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int16 doesn't work"); - Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int16 doesn't work"); - - // Test Conv_U1 - Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int16 doesn't work"); - Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int16 doesn't work"); - - // Test Conv_I2 - Assert.IsTrue((short)maxValue == 0x7FFF, "Conv_I2 for Int16 doesn't work"); - Assert.IsTrue((short)minValue == -0x8000, "Conv_I2 for Int16 doesn't work"); - - // Test Conv_U2 - Assert.IsTrue((ushort)maxValue == 0x7FFF, "Conv_U2 for Int16 doesn't work"); - Assert.IsTrue((ushort)minValue == 0x8000, "Conv_U2 for Int16 doesn't work"); - - // Test Conv_I4 - Assert.IsTrue((int)maxValue == 0x00007FFF, "Conv_I4 for Int16 doesn't work"); - Assert.IsTrue((int)minValue == -0x00008000, "Conv_I4 for Int16 doesn't work"); - - // Test Conv_U4 - Assert.IsTrue((uint)maxValue == 0x00007FFF, "Conv_U4 for Int16 doesn't work"); - Assert.IsTrue((uint)minValue == 0xFFFF8000, "Conv_U4 for Int16 doesn't work"); - - // Test Conv_I8 - Assert.IsTrue((long)maxValue == 0x0000000000007FFF, "Conv_I8 for Int16 doesn't work"); - Assert.IsTrue((long)minValue == -0x0000000000008000, "Conv_I8 for Int16 doesn't work"); - - // Test Conv_U8 - Assert.IsTrue((ulong)maxValue == 0x0000000000007FFF, "Conv_U8 for Int16 doesn't work"); - Assert.IsTrue((ulong)minValue == 0xFFFFFFFFFFFF8000, "Conv_U8 for Int16 doesn't work"); - - // Test Conv_R4 - Assert.IsTrue((float)maxValue == Int16.MaxValue, "Conv_R4 for Int16 doesn't work"); - Assert.IsTrue((float)minValue == Int16.MinValue, "Conv_R4 for Int16 doesn't work"); - - // Test Conv_R8 - Assert.IsTrue((double)maxValue == Int16.MaxValue, "Conv_R8 for Int16 doesn't work"); - Assert.IsTrue((double)minValue == Int16.MinValue, "Conv_R8 for Int16 doesn't work"); - - // Test Methods - val2 = TestMethod(value); - Assert.IsTrue(value == 60, "Passing an Int16 as a method parameter doesn't work"); - Assert.IsTrue(val2 == 61, "Returning an Int16 value from a method doesn't work"); - - ByRefTestMethod(ref value); - Assert.IsTrue(value == 61, "Passing an Int16 by ref to a method doesn't work"); - } - - public static short TestMethod(short aParam) - { - aParam++; - return aParam; - } - - public static void ByRefTestMethod(ref short aParam) - { - aParam++; - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int32Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int32Test.cs deleted file mode 100644 index 0f7fd45a90..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int32Test.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class Int32Test - { - public static void Execute() - { - int value; - string result; - string expectedResult; - - value = Int32.MaxValue; - - result = value.ToString(); - expectedResult = "2147483647"; - - Assert.IsTrue((result == expectedResult), "Int32.ToString doesn't work"); - - // Now let's try to concat to a String using '+' operator - result = "The Maximum value of an Int32 is " + value; - expectedResult = "The Maximum value of an Int32 is 2147483647"; - - Assert.IsTrue((result == expectedResult), "String concat (Int32) doesn't work"); - - // Now let's try to use '$ instead of '+' - result = $"The Maximum value of an Int32 is {value}"; - // Actually 'expectedResult' should be the same so... - Assert.IsTrue((result == expectedResult), "String format (Int32) doesn't work"); - - // Now let's Get the HashCode of a value - int resultAsInt = value.GetHashCode(); - - // actually the Hash Code of an Int32 is the same value - Assert.IsTrue((resultAsInt == value), "Int32.GetHashCode() doesn't work"); - -#if false - // Now let's try ToString() again but printed in hex (this test fails for now!) - result = value.ToString("X2"); - expectedResult = "0x7FFFFFFF"; - - Assert.IsTrue((result == expectedResult), "Int32.ToString(X2) doesn't work"); -#endif - - // basic bit operations - - int val2; - - value = 0x0C; // low-order bits: 0b0000_1100 - - val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 - Assert.IsTrue(val2 == -0x0D, "Int32 bitwise not doesn't work got: " + val2); - - val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 - Assert.IsTrue(val2 == 0x04, "Int32 bitwise and doesn't work got: " + val2); - - val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 - Assert.IsTrue(val2 == 0x0E, "Int32 bitwise or doesn't work got: " + val2); - - val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 - Assert.IsTrue(val2 == 0x0A, "Int32 bitwise xor doesn't work got: " + val2); - - val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 - Assert.IsTrue(val2 == 0x03, "Int32 left shift doesn't work got: " + val2); - - val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 - Assert.IsTrue(val2 == 0x30, "Int32 right shift doesn't work got: " + val2); - - // basic arithmetic operations - - value = 60; - - val2 = value + 5; - Assert.IsTrue(val2 == 65, "Int32 addition doesn't work got: " + val2); - - val2 = value - 5; - Assert.IsTrue(val2 == 55, "Int32 subtraction doesn't work got: " + val2); - - val2 = value * 5; - Assert.IsTrue(val2 == 300, "Int32 multiplication doesn't work got: " + val2); - - val2 = value / 5; - Assert.IsTrue(val2 == 12, "Int32 division doesn't work got: " + val2); - - val2 = value % 7; - Assert.IsTrue(val2 == 4, "Int32 remainder doesn't work got: " + val2); - - // Now test conversions - - int maxValue = Int32.MaxValue; - int minValue = Int32.MinValue; - - // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted - - // Test Conv_I1 - Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int32 doesn't work"); - Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int32 doesn't work"); - - // Test Conv_U1 - Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int32 doesn't work"); - Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int32 doesn't work"); - - // Test Conv_I2 - Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for Int32 doesn't work"); - Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Int32 doesn't work"); - - // Test Conv_U2 - Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for Int32 doesn't work"); - Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Int32 doesn't work"); - - // Test Conv_I4 - Assert.IsTrue((int)maxValue == 0x7FFFFFFF, "Conv_I4 for Int32 doesn't work"); - Assert.IsTrue((int)minValue == -0x80000000, "Conv_I4 for Int32 doesn't work"); - - // Test Conv_U4 - Assert.IsTrue((uint)maxValue == 0x7FFFFFFF, "Conv_U4 for Int32 doesn't work"); - Assert.IsTrue((uint)minValue == 0x80000000, "Conv_U4 for Int32 doesn't work"); - - // Test Conv_I8 - Assert.IsTrue((long)maxValue == 0x000000007FFFFFFF, "Conv_I8 for Int32 doesn't work"); - Assert.IsTrue((long)minValue == -0x0000000080000000, "Conv_I8 for Int32 doesn't work"); - - // Test Conv_U8 - Assert.IsTrue((ulong)maxValue == 0x00000007FFFFFFF, "Conv_U8 for Int32 doesn't work"); - Assert.IsTrue((ulong)minValue == 0xFFFFFFFF80000000, "Conv_U8 for Int32 doesn't work"); - - // Test Conv_R4 - Assert.IsTrue((float)maxValue == Int32.MaxValue, "Conv_R4 for Int32 doesn't work"); - Assert.IsTrue((float)minValue == Int32.MinValue, "Conv_R4 for Int32 doesn't work"); - - // Test Conv_R8 - Assert.IsTrue((double)maxValue == Int32.MaxValue, "Conv_R8 for Int32 doesn't work"); - Assert.IsTrue((double)minValue == Int32.MinValue, "Conv_R8 for Int32 doesn't work"); - - // Test Methods - val2 = TestMethod(value); - Assert.IsTrue(value == 60, "Passing an Int32 as a method parameter doesn't work"); - Assert.IsTrue(val2 == 61, "Returning an Int32 value from a method doesn't work"); - - ByRefTestMethod(ref value); - Assert.IsTrue(value == 61, "Passing an Int32 by ref to a method doesn't work"); - } - - public static int TestMethod(int aParam) - { - aParam++; - return aParam; - } - - public static void ByRefTestMethod(ref int aParam) - { - aParam++; - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int64Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int64Test.cs deleted file mode 100644 index 458cea07b8..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Int64Test.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class Int64Test - { - public static void Execute() - { - long value; - string result; - string expectedResult; - - value = Int64.MaxValue; - - result = value.ToString(); - expectedResult = "9223372036854775807"; - - Assert.IsTrue((result == expectedResult), "Int64.ToString doesn't work"); - - // Now let's try to concat to a String using '+' operator - result = "The Maximum value of an Int64 is " + value; - expectedResult = "The Maximum value of an Int64 is 9223372036854775807"; - - Assert.IsTrue((result == expectedResult), "String concat (Int64) doesn't work"); - - // Now let's try to use '$ instead of '+' - result = $"The Maximum value of an Int64 is {value}"; - - // Actually 'expectedResult' should be the same so... - Assert.IsTrue((result == expectedResult), "String format (Int64) doesn't work"); - - // Now let's Get the HashCode of a value - int resultAsInt = value.GetHashCode(); - // actually the Hash Code of a Int64 is the value interpolated with XOR to obtain an Int32... so not the same of 'value'! - int expectedResultAsInt = (unchecked((int)((long)value)) ^ (int)(value >> 32)); - - Assert.IsTrue((resultAsInt == expectedResultAsInt), "Int64.GetHashCode() doesn't work"); - - value = long.Parse("42"); - Assert.IsTrue(value == 42, "Parsing Int64 doesn't work."); - -#if false - - // Now let's try ToString() again but printed in hex (this test fails for now!) - result = value.ToString("X2"); - expectedResult = "0x7FFFFFFFFFFFFFFF"; - - Assert.IsTrue((result == expectedResult), "Int64.ToString(X2) doesn't work"); -#endif - - // basic bit operations - - long val2; - - value = 0x0C; // low-order bits: 0b0000_1100 - - val2 = ~value; // low-order bits: val2 = ~value = 0b1111_0011 - Assert.IsTrue(val2 == -0x0D, "Int64 bitwise not doesn't work got: " + val2); - - val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 - Assert.IsTrue(val2 == 0x04, "Int64 bitwise and doesn't work got: " + val2); - - val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 - Assert.IsTrue(val2 == 0x0E, "Int64 bitwise or doesn't work got: " + val2); - - val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 - Assert.IsTrue(val2 == 0x0A, "Int64 bitwise xor doesn't work got: " + val2); - - val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 - Assert.IsTrue(val2 == 0x03, "Int64 left shift doesn't work got: " + val2); - - val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 - Assert.IsTrue(val2 == 0x30, "Int64 right shift doesn't work got: " + val2); - - // basic arithmetic operations - - value = 60; - - val2 = value + 5; - Assert.IsTrue(val2 == 65, "Int64 addition doesn't work got: " + val2); - - val2 = value - 5; - Assert.IsTrue(val2 == 55, "Int64 subtraction doesn't work got: " + val2); - - val2 = value * 5; - Assert.IsTrue(val2 == 300, "Int64 multiplication doesn't work got: " + val2); - - val2 = value / 5; - Assert.IsTrue(val2 == 12, "Int64 division doesn't work got: " + val2); - - val2 = value % 7; - Assert.IsTrue(val2 == 4, "Int64 remainder doesn't work got: " + val2); - - value = 1728000000000; - - val2 = value + 36000000000; - Assert.IsTrue(val2 == 1764000000000, "Int64 addition doesn't work got " + val2); - - val2 = value - 36000000000; - Assert.IsTrue(val2 == 1692000000000, "Int64 subtraction doesn't work got " + val2); - - val2 = value * 36000000000; - Assert.IsTrue(val2 == 5578983451391950848, "Int64 multiplication doesn't work got " + val2); - - val2 = value / 36000000000; - Assert.IsTrue(val2 == 48, "Int64 division doesn't work got " + val2); - - val2 = value / -36000000000; - Assert.IsTrue(val2 == -48, "Int64 division doesn't work got " + val2); - - val2 = -value / 36000000000; - Assert.IsTrue(val2 == -48, "Int64 division doesn't work got " + val2); - - val2 = -value / -36000000000; - Assert.IsTrue(val2 == 48, "Int64 division doesn't work got " + val2); - - value = 3200000000000; - - val2 = value % 1300000000000; - Assert.IsTrue(val2 == 600000000000, "Int64 remainder doesn't work got " + val2); - - val2 = value % -1300000000000; - Assert.IsTrue(val2 == 600000000000, "Int64 remainder doesn't work got " + val2); - - val2 = -value % 1300000000000; - Assert.IsTrue(val2 == -600000000000, "Int64 remainder doesn't work got " + val2); - - val2 = -value % -1300000000000; - Assert.IsTrue(val2 == -600000000000, "Int64 remainder doesn't work got " + val2); - - // Now test conversions - - long maxValue = Int64.MaxValue; - long minValue = Int64.MinValue; - - // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted - - // Test Conv_I1 - Assert.IsTrue((sbyte)maxValue == -0x01, "Conv_I1 for Int64 doesn't work"); - Assert.IsTrue((sbyte)minValue == 0x00, "Conv_I1 for Int64 doesn't work"); - - // Test Conv_U1 - Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for Int64 doesn't work"); - Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for Int64 doesn't work"); - - // Test Conv_I2 - Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for Int64 doesn't work"); - Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for Int64 doesn't work"); - - // Test Conv_U2 - Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for Int64 doesn't work"); - Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for Int64 doesn't work"); - - // Test Conv_I4 - Assert.IsTrue((int)maxValue == -0x00000001, "Conv_I4 for Int64 doesn't work"); - Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for Int64 doesn't work"); - - // Test Conv_U4 - Assert.IsTrue((uint)maxValue == 0xFFFFFFFF, "Conv_U4 for Int64 doesn't work"); - Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for Int64 doesn't work"); - - // Test Conv_I8 - Assert.IsTrue((long)maxValue == 0x7FFFFFFFFFFFFFFF, "Conv_I8 for Int64 doesn't work"); - Assert.IsTrue((long)minValue == -0x8000000000000000, "Conv_I8 for Int64 doesn't work"); - - // Test Conv_U8 - Assert.IsTrue((ulong)maxValue == 0x7FFFFFFFFFFFFFFF, "Conv_U8 for Int64 doesn't work"); - Assert.IsTrue((ulong)minValue == 0x8000000000000000, "Conv_U8 for Int64 doesn't work"); - - // Test Conv_R4 - Assert.IsTrue((float)maxValue == Int64.MaxValue, "Conv_R4 for Int64 doesn't work"); - Assert.IsTrue((float)minValue == Int64.MinValue, "Conv_R4 for Int64 doesn't work"); - - // Test Conv_R8 - Assert.IsTrue((double)maxValue == Int64.MaxValue, "Conv_R8 for Int64 doesn't work"); - Assert.IsTrue((double)minValue == Int64.MinValue, "Conv_R8 for Int64 doesn't work"); - - // Test Methods - - value = 60; - - val2 = TestMethod(value); - Assert.IsTrue(value == 60, "Passing an Int64 as a method parameter doesn't work"); - Assert.IsTrue(val2 == 61, "Returning an Int64 value from a method doesn't work"); - - ByRefTestMethod(ref value); - Assert.IsTrue(value == 61, "Passing an Int64 by ref to a method doesn't work"); - } - - public static long TestMethod(long aParam) - { - aParam++; - return aParam; - } - - public static void ByRefTestMethod(ref long aParam) - { - aParam++; - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ObjectTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ObjectTest.cs new file mode 100644 index 0000000000..d42d2eec4e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/ObjectTest.cs @@ -0,0 +1,29 @@ +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Cosmos.Compiler.Tests.Bcl.System +{ + class ObjectTest + { + public static void Execute() + { + object a = new object(); + Assert.IsFalse(a == null, "a is not null using equality"); + Assert.IsFalse(a.Equals(null), "a is not null using Equals"); + + object b = new object(); + Assert.IsFalse(a == b, "a is not b using equality"); + Assert.IsFalse(a.Equals(b), "a is not b using equality"); + + object c = a; + Assert.IsTrue(a == a, "a == a"); + Assert.IsTrue(a == c, "a == c"); + Assert.IsTrue(a.Equals(a), "a.Equals(a)"); + Assert.IsTrue(a.Equals(c), "a.Equals(c)"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/RandomTests.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/RandomTests.cs index d15e5df597..300eb4778f 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/RandomTests.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/RandomTests.cs @@ -12,6 +12,7 @@ public static void Execute() var xRandomNumber = xRandom.Next(); Assert.IsTrue(xRandomNumber >= 0, "Random.Next is returning a negative integer!"); + Assert.IsTrue(xRandomNumber != xRandom.Next(), "Two random numbers generated after each other are not the same"); xRandomNumber = xRandom.Next(10); @@ -20,6 +21,9 @@ public static void Execute() xRandomNumber = xRandom.Next(40, 45); Assert.IsTrue(xRandomNumber >= 40 && xRandomNumber < 45, "Random.Next(int, int) is returning an integer outside of the specified range!"); + + double randomDouble = xRandom.NextDouble(); + Assert.IsTrue(randomDouble >= 0 && randomDouble <= 1 && !double.IsNaN(randomDouble), "Random.NextDouble works correctly"); } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Runtime/CompilerServices/RuntimeHelpersTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Runtime/CompilerServices/RuntimeHelpersTest.cs new file mode 100644 index 0000000000..6e4e414161 --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Runtime/CompilerServices/RuntimeHelpersTest.cs @@ -0,0 +1,33 @@ +using Cosmos.TestRunner; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Cosmos.Compiler.Tests.Bcl.System.Runtime.CompilerServices +{ + struct NoReference + { + int x; + int y; + } + + struct Reference + { + int a; + object b; + } + + static class RuntimeHelpersTest + { + public static void Execute() + { + Assert.IsFalse(RuntimeHelpers.IsReferenceOrContainsReferences(), "int is not and does not contain references"); + Assert.IsFalse(RuntimeHelpers.IsReferenceOrContainsReferences(), "NoReference struct is not and does not contain references"); + Assert.IsTrue(RuntimeHelpers.IsReferenceOrContainsReferences(), "object is reference type"); + Assert.IsTrue(RuntimeHelpers.IsReferenceOrContainsReferences(), "Reference contains a reference type"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/StringTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/StringTest.cs deleted file mode 100644 index 1db830d1d5..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/StringTest.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Threading.Tasks; -using Cosmos.Debug.Kernel; -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - public static class StringTest - { - public static void Execute() - { - string xTestStr = "Test"; - int xExpectedLength = 4; - int xLength = xTestStr.Length; - Assert.IsTrue(xLength == xExpectedLength, "String.Length is not returning the correct value."); - - Assert.IsTrue(("a" + "b") == "ab", "concatting 2 string using + doesn't work"); - Assert.IsTrue(("a" + 'b') == "ab", "concatting 1 string and 1 character doesn't work"); - - string a = "a"; - string b = "b"; - string result = a + b; - Assert.IsTrue(result == "ab", "concatting 2 string (not optimizable) using + doesn't work"); // Fails - - char x = 'a'; - string y = "a"; - Assert.IsTrue(x.ToString() == y, "String == operator "); - - string str = "Cosmos is awesome!"; - string expected = "Cosmos"; - string substr = str.Substring(0, 6); - Assert.IsTrue((substr == expected), "Substring is not equal to the expected result, result should be \"Cosmos\". Substrings are broken or MichaelTheShifter made an off-by-one error."); - - int value1 = 1; - string value2 = "4"; - string expected_res = "1 + 3 = 4"; - Assert.IsTrue(($"{value1} + 3 = {value2}" == expected_res), "String $ operator does not work."); - - string split_in = "ABC"; - var xResultArray = split_in.Split('B'); - Assert.IsTrue(xResultArray.Length == 2, "String.Split(char[]) doesn't work."); - - xResultArray = split_in.Split(new[] { "B" }, StringSplitOptions.None); - Assert.IsTrue(xResultArray.Length == 2, "String.Split(string[], StringSplitOptions) doesn't work."); - - string test = "This is a test string."; - Assert.IsTrue(test.Contains("test"), "String.Contains(string) doesn't find a substring that actually exists."); - Assert.IsTrue(test.Contains("ing"), "String.Contains(string) doesn't find a substring that actually exists."); - Assert.IsFalse(test.Contains("cosmos"), "String.Contains(string) found a substring that didn't actually exist in a string."); - - Assert.IsTrue(test.StartsWith("This"), "string.StartsWith(string) is reporting false even though the string does start with the supplied substring."); - Assert.IsFalse(test.StartsWith("That"), "string.StartsWith(string) is reporting true even though the string doesn't start with the supplied substring."); - - Assert.IsTrue(test.EndsWith("string."), "string.EndsWith(string) is not reporting false even though the string actually does end with the substring."); - Assert.IsFalse(test.EndsWith("sentence."), "string.EndsWith(string) is not reporting true even though the string actually doesn't end with the substring."); - - string lower_expected = "this is a test string."; - string upper_expected = "THIS IS A TEST STRING."; - Assert.IsTrue((test.ToLower() == lower_expected), "string.ToLower() does not work."); - Assert.IsTrue((test.ToUpper() == upper_expected), "string.ToUpper() does not work."); - - string replace_test = "That is a test string."; - Assert.IsTrue((test.Replace("This", "That") == replace_test), "string.Replace(string, string) does not work."); - - test = "000"; - replace_test = "000000000000"; - Assert.IsTrue((test.Replace("0", "0000") == replace_test), "string.Replace(string, string) is recursive."); - - string char_array_test = "char"; - char[] char_array_expected = { 'c', 'h', 'a', 'r' }; - Assert.IsTrue((char_array_test.ToCharArray().Length == 4), "string.ToCharArray() does not work."); - - string strA; - string strB; - int comparisionResult; - - strA = "Test"; - strB = "Test"; - - comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); - Assert.IsTrue(comparisionResult == 0, "String.Compare (same string) not working!"); - - strA = "\x0041\x0042\x0043"; - strB = "\x0061\x0062\x0063"; - - comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); - Assert.IsTrue(comparisionResult == -32, "String.Compare (uppercase vs lowercase) not working!"); - - strA = "\x0041\x0042\x0043"; - strB = "\x0041\x0062\x0063"; - - comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.Ordinal); - Assert.IsTrue(comparisionResult == -32, "String.Compare (first letter same) not working!"); - - strA = "Horse"; - strB = "Morse"; /* . _ . */ - - comparisionResult = String.Compare(strA, 1, strB, 1, strA.Length, StringComparison.Ordinal); - Assert.IsTrue(comparisionResult == 0, "String.Compare (first letter different skipped) not working!"); - - strA = "\x0041\x0042\x0043"; - strB = "\x0061\x0062\x0063"; - - comparisionResult = String.Compare(strA, 0, strB, 0, strA.Length, StringComparison.OrdinalIgnoreCase); - Assert.IsTrue(comparisionResult == 0, "String.Compare (uppercase vs lowercase ignoring case) not working!"); - - string stringToHash = "test"; - int hashCode = stringToHash.GetHashCode(); - - Assert.IsTrue(hashCode == -354185609, "String.GetHashCode() not working!"); - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/EncodingTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/EncodingTest.cs index 53d6addbbe..4815912e82 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/EncodingTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/EncodingTest.cs @@ -1,4 +1,4 @@ -#define COSMOSDEBUG +//#define COSMOSDEBUG using System; using System.Collections.Generic; @@ -11,7 +11,7 @@ namespace Cosmos.Compiler.Tests.Bcl.System.Text { internal class EncodingTest { - private static Debugger mDebugger = new Debugger("System", "Enconding Test"); + private static Debugger mDebugger = new("Enconding Test"); private static byte[] UTF8EnglishText = new byte[] { 0x43, 0x6F, 0x73, 0x6D, 0x6F, 0x73, 0x20, 0x69, 0x73, 0x20, 0x77, 0x6F, 0x6E, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6C, 0x21 }; diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/StringBuilderTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/StringBuilderTest.cs index bbad388262..39a904576d 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/StringBuilderTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/Text/StringBuilderTest.cs @@ -1,6 +1,5 @@ using System; using System.Text; -using System.Threading.Tasks; using Cosmos.Debug.Kernel; using Cosmos.TestRunner; @@ -38,7 +37,7 @@ public static void Execute() sb.Clear(); // Capacity does not change after Clear - Assert.IsTrue(sb.Capacity == 32, "StringBuilder.Capacity after Clear is wrong)"); + Assert.IsTrue(sb.Capacity == 26, "StringBuilder.Capacity after Clear is wrong"); // ... but Lenght should be 0 again Assert.IsTrue(sb.Length == 0, "After Clear StringBuilder.Lenght is wrong"); @@ -47,26 +46,26 @@ public static void Execute() /* This is required NumberBuffer to work it will be 90% managed code in Net Core 2.1 so better to wait */ #if false - int var1 = 111; - float var2 = 2.22F; - string var3 = "abcd"; - object[] var4 = { 3, 4.4, 'X' }; - - sb.AppendFormat($"1) {var1}"); - Assert.IsTrue(sb.ToString() == "1) 111", "StringBuilder.AppendFormat() with 1 arg does not work"); - sb.Length = 0; // Same of sb.Clear() maybe faster - - sb.AppendFormat("2) {0}, {1}", var1, var2); - Assert.IsTrue(sb.ToString() == "2) 111, 2.22", "StringBuilder.AppendFormat() with 2 args does not work"); - sb.Length = 0; // Same of sb.Clear() maybe faster - - sb.AppendFormat("3) {0}, {1}, {2}", var1, var2, var3); - Assert.IsTrue(sb.ToString() == "111, 2.22, abcd", "StringBuilder.AppendFormat() with 3 args does not work"); - sb.Length = 0; // Same of sb.Clear() maybe faster - - sb.AppendFormat("4) {0}, {1}, {2}", var4); - Assert.IsTrue(sb.ToString() == "111, 2.22, abcd", "StringBuilder.AppendFormat() with arg array does not work"); - sb.Length = 0; // Same of sb.Clear() maybe faster + int var1 = 111; + float var2 = 2.22F; + string var3 = "abcd"; + object[] var4 = { 3, 4.4, 'X' }; + + sb.AppendFormat($"1) {var1}"); + Assert.IsTrue(sb.ToString() == "1) 111", "StringBuilder.AppendFormat() with 1 arg does not work"); + sb.Length = 0; // Same of sb.Clear() maybe faster + + sb.AppendFormat("2) {0}, {1}", var1, var2); + Assert.IsTrue(sb.ToString() == "2) 111, 2.22", "StringBuilder.AppendFormat() with 2 args does not work"); + sb.Length = 0; // Same of sb.Clear() maybe faster + + sb.AppendFormat("3) {0}, {1}, {2}", var1, var2, var3); + Assert.IsTrue(sb.ToString() == "111, 2.22, abcd", "StringBuilder.AppendFormat() with 3 args does not work"); + sb.Length = 0; // Same of sb.Clear() maybe faster + + sb.AppendFormat("4) {0}, {1}, {2}", var4); + Assert.IsTrue(sb.ToString() == "111, 2.22, abcd", "StringBuilder.AppendFormat() with arg array does not work"); + sb.Length = 0; // Same of sb.Clear() maybe faster #endif sb.Append("This is a test"); @@ -142,9 +141,9 @@ public static void Execute() // Decimal has a totally managed implementation in .Net Core 2.1, let's wait for that #if false - sb.Insert(3, xDecimal); - Assert.IsTrue(sb.ToString() == "--[5]--", "Insert #11 does not work"); - sb = new StringBuilder(initialValue); + sb.Insert(3, xDecimal); + Assert.IsTrue(sb.ToString() == "--[5]--", "Insert #11 does not work"); + sb = new StringBuilder(initialValue); #endif sb.Insert(3, xSingle); Assert.IsTrue(sb.ToString() == "--[6.6]--", "Insert #11 does not work"); @@ -198,6 +197,20 @@ public static void Execute() sb[2] = '1'; Assert.IsTrue(sb.ToString() == "Th1s is a simple sentence.", "Index set operator does not work"); + + // test string builders with large amounts of data + StringBuilder builder = new StringBuilder(); + char[] data = new char[1024]; + for (int i = 0; i < 1024; i++) + { + data[i] = 'a'; + } + builder.Append(data, 0, 1024); + builder.Append(data, 0, 976); + builder.Append(data, 24, 524); + string aStr = builder.ToString(); + Assert.AreEqual(2524, aStr.Length, "StringBuilder produced the correct string"); + Assert.AreEqual(new string('a', 2524), builder.ToString(), "StringBuilder works with 2500 chars"); } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt32Test.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt32Test.cs deleted file mode 100644 index 14dd770095..0000000000 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UInt32Test.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; - -using Cosmos.TestRunner; - -namespace Cosmos.Compiler.Tests.Bcl.System -{ - internal static class UInt32Test - { - public static void Execute() - { - uint value; - string result; - string expectedResult; - - value = UInt32.MaxValue; - - result = value.ToString(); - expectedResult = "4294967295"; - - //Assert.IsTrue((result == expectedResult), "UInt32.ToString doesn't work"); - - // Now let's try to concat to a String using '+' operator - result = "The Maximum value of an UInt32 is " + value; - expectedResult = "The Maximum value of an UInt32 is 4294967295"; - - Assert.IsTrue((result == expectedResult), "String concat (UInt32) doesn't work"); - - // Now let's try to use '$ instead of '+' - result = $"The Maximum value of an UInt32 is {value}"; - // Actually 'expectedResult' should be the same so... - Assert.IsTrue((result == expectedResult), "String format (UInt32) doesn't work"); - - // Now let's Get the HashCode of a value - int resultAsInt = value.GetHashCode(); - - // actually the Hash Code of a Int32 is the same value (but expressed as Int32 so could have sign!) - Assert.IsTrue((resultAsInt == (int)value), "UInt32.GetHashCode() doesn't work"); - -#if false - // Now let's try ToString() again but printed in hex (this test fails for now!) - result = value.ToString("X2"); - expectedResult = "0x7FFFFFFF"; - - Assert.IsTrue((result == expectedResult), "Int32.ToString(X2) doesn't work"); -#endif - - // basic bit operations - - uint val2; - - value = 0x0C; // low-order bits: 0b0000_1100 - - val2 = ~value; // val2 = ~value = low-order bits: 0b1111_0011 - Assert.IsTrue(val2 == 0xFFFFFFF3, "UInt32 bitwise not doesn't work got: " + val2); - - val2 = value & 0x06; // low-order bits: val2 = value & 0b0000_0110 = 0b0000_0100 - Assert.IsTrue(val2 == 0x04, "UInt32 bitwise and doesn't work got: " + val2); - - val2 = value | 0x06; // low-order bits: val2 = value | 0b0000_0110 = 0b0000_1110 - Assert.IsTrue(val2 == 0x0E, "UInt32 bitwise or doesn't work got: " + val2); - - val2 = value ^ 0x06; // low-order bits: val2 = value ^ 0b0000_0110 = 0b0000_1010 - Assert.IsTrue(val2 == 0x0A, "UInt32 bitwise xor doesn't work got: " + val2); - - val2 = value >> 0x02; // low-order bits: val2 = value >> 0b0000_0010 = 0b0000_0011 - Assert.IsTrue(val2 == 0x03, "UInt32 left shift doesn't work got: " + val2); - - val2 = value << 0x02; // low-order bits: val2 = value << 0b0000_0010 = 0b0011_0000 - Assert.IsTrue(val2 == 0x30, "UInt32 right shift doesn't work got: " + val2); - - // basic arithmetic operations - - value = 60; - - val2 = value + 5; - Assert.IsTrue(val2 == 65, "UInt32 addition doesn't work got: " + val2); - - val2 = value - 5; - Assert.IsTrue(val2 == 55, "UInt32 subtraction doesn't work got: " + val2); - - val2 = value * 5; - Assert.IsTrue(val2 == 300, "UInt32 multiplication doesn't work got: " + val2); - - val2 = value / 5; - Assert.IsTrue(val2 == 12, "UInt32 division doesn't work got: " + val2); - - val2 = value % 7; - Assert.IsTrue(val2 == 4, "UInt32 remainder doesn't work got: " + val2); - - // Now test conversions - - uint maxValue = UInt32.MaxValue; - uint minValue = UInt32.MinValue; - - // TODO: some convert instructions aren't being emitted, we should find other ways of getting them emitted - - // Test Conv_I1 - Assert.IsTrue((sbyte)maxValue == -1, "Conv_I1 for UInt32 doesn't work"); - Assert.IsTrue((sbyte)minValue == 0, "Conv_I1 for UInt32 doesn't work"); - - // Test Conv_U1 - Assert.IsTrue((byte)maxValue == 0xFF, "Conv_U1 for UInt32 doesn't work"); - Assert.IsTrue((byte)minValue == 0x00, "Conv_U1 for UInt32 doesn't work"); - - // Test Conv_I2 - Assert.IsTrue((short)maxValue == -0x0001, "Conv_I2 for UInt32 doesn't work"); - Assert.IsTrue((short)minValue == 0x0000, "Conv_I2 for UInt32 doesn't work"); - - // Test Conv_U2 - Assert.IsTrue((ushort)maxValue == 0xFFFF, "Conv_U2 for UInt32 doesn't work"); - Assert.IsTrue((ushort)minValue == 0x0000, "Conv_U2 for UInt32 doesn't work"); - - // Test Conv_I4 - Assert.IsTrue((int)maxValue == -0x00000001, "Conv_I4 for UInt32 doesn't work"); - Assert.IsTrue((int)minValue == 0x00000000, "Conv_I4 for UInt32 doesn't work"); - - // Test Conv_U4 - Assert.IsTrue((uint)maxValue == 0xFFFFFFFF, "Conv_U4 for UInt32 doesn't work"); - Assert.IsTrue((uint)minValue == 0x00000000, "Conv_U4 for UInt32 doesn't work"); - - // Test Conv_I8 - Assert.IsTrue((long)maxValue == 0x00000000FFFFFFFF, "Conv_I8 for UInt32 doesn't work"); - Assert.IsTrue((long)minValue == 0x0000000000000000, "Conv_I8 for UInt32 doesn't work"); - - // Test Conv_U8 - Assert.IsTrue((ulong)maxValue == 0x00000000FFFFFFFF, "Conv_U8 for UInt32 doesn't work"); - Assert.IsTrue((ulong)minValue == 0x0000000000000000, "Conv_U8 for UInt32 doesn't work"); - - // Test Conv_R4 - Assert.IsTrue((float)maxValue == UInt32.MaxValue, "Conv_R4 for UInt32 doesn't work"); - Assert.IsTrue((float)minValue == UInt32.MinValue, "Conv_R4 for UInt32 doesn't work"); - - // Test Conv_R8 - Assert.IsTrue((double)maxValue == UInt32.MaxValue, "Conv_R8 for UInt32 doesn't work"); - Assert.IsTrue((double)minValue == UInt32.MinValue, "Conv_R8 for UInt32 doesn't work"); - - // Test Methods - val2 = TestMethod(value); - Assert.IsTrue(value == 60, "Passing an UInt32 as a method parameter doesn't work"); - Assert.IsTrue(val2 == 61, "Returning an UInt32 value from a method doesn't work"); - - ByRefTestMethod(ref value); - Assert.IsTrue(value == 61, "Passing an UInt32 by ref to a method doesn't work"); - } - - public static uint TestMethod(uint aParam) - { - aParam++; - return aParam; - } - - public static void ByRefTestMethod(ref uint aParam) - { - aParam++; - } - } -} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UnsafeCodeTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UnsafeCodeTest.cs index 76631f305b..0a6d4dd3d7 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UnsafeCodeTest.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/System/UnsafeCodeTest.cs @@ -3,17 +3,14 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Cosmos.TestRunner; +using System.Runtime.CompilerServices; namespace Cosmos.Compiler.Tests.Bcl.System { - using Cosmos.TestRunner; unsafe class UnsafeCodeTest { - static long DoubleToInt64Bits(double value) - { - return *(long*)(&value); - } static ulong Test(ref ulong a) { @@ -66,13 +63,36 @@ public static void Execute() Assert.IsTrue(retVal == 12345678, "Ulong ref passing not works"); - //asLong = DoubleToInt64Bits(d); - //hexDump = BitConverter.GetBytes(asLong); + TestFixed(); + TestCompilerServices(); + TestStackAlloc(); + } - //Console.WriteLine("asLong is : " + BitConverter.ToString(hexDump, 0)); - //Assert.IsTrue(asLong == 0x3FF0000000000000, "DoubleToInt64Bits is wrong!"); + private static unsafe void TestCompilerServices() + { + Assert.AreEqual(1, Unsafe.SizeOf(), "Unsafe.SizeOf works for byte"); + Assert.AreEqual(2, Unsafe.SizeOf(), "Unsafe.SizeOf works for char"); + Assert.AreEqual(2, Unsafe.SizeOf(), "Unsafe.SizeOf works for ushort"); + Assert.AreEqual(4, Unsafe.SizeOf(), "Unsafe.SizeOf works for int"); + Assert.AreEqual(8, Unsafe.SizeOf(), "Unsafe.SizeOf works for long"); + } + + private static void TestStackAlloc() + { + Span uintArr = stackalloc uint[16]; + uintArr[0] = 10; + Assert.AreEqual(10, uintArr[0], "Storing and reading from stackalloc allocated array works"); + uintArr[3] = 2; + Assert.AreEqual(2, uintArr[3], "Storing and reading from stackalloc allocated array works"); + Span uintArr2 = stackalloc uint[16]; + Assert.AreEqual(0, uintArr2[0], "stackallocing a second span does not share memory"); + Assert.AreEqual(0, uintArr2[3], "stackallocing a second span does not share memory"); + uintArr2[0] = 3; + Assert.AreEqual(3, uintArr2[0], "stackallocing a second span does not share memory and we can set the value in the second"); + Assert.AreEqual(10, uintArr[0], "stackallocing a second span does really does not share memory"); + Assert.AreEqual(2, uintArr[3], "stackallocing a second span does really does not share memory"); + Assert.AreNotEqual((uint)uintArr.GetPinnableReference(), (uint)uintArr2.GetPinnableReference(), "GetPinnableReference returns different values for both spans"); - TestFixed(); } } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Bcl/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/Cosmos.Compiler.Tests.Encryption.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/Cosmos.Compiler.Tests.Encryption.csproj index b0e862e6fb..aa2682b187 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/Cosmos.Compiler.Tests.Encryption.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/Cosmos.Compiler.Tests.Encryption.csproj @@ -1,12 +1,14 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Encryption/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/Cosmos.Compiler.Tests.Exceptions.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/Cosmos.Compiler.Tests.Exceptions.csproj index b0e862e6fb..50fbe61be4 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/Cosmos.Compiler.Tests.Exceptions.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/Cosmos.Compiler.Tests.Exceptions.csproj @@ -1,12 +1,13 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST - + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Exceptions/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/Cosmos.Compiler.Tests.Interfaces.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/Cosmos.Compiler.Tests.Interfaces.csproj index b0e862e6fb..aa2682b187 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/Cosmos.Compiler.Tests.Interfaces.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/Cosmos.Compiler.Tests.Interfaces.csproj @@ -1,12 +1,14 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.Interfaces/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Cosmos.Compiler.Tests.MethodTests.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Cosmos.Compiler.Tests.MethodTests.csproj index b0e862e6fb..50fbe61be4 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Cosmos.Compiler.Tests.MethodTests.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Cosmos.Compiler.Tests.MethodTests.csproj @@ -1,12 +1,13 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST - + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/DelegatesTest.cs b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/DelegatesTest.cs new file mode 100644 index 0000000000..3510e8f11c --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/DelegatesTest.cs @@ -0,0 +1,243 @@ +using System; +using Cosmos.Debug.Kernel; +using Cosmos.TestRunner; + +namespace Cosmos.Compiler.Tests.MethodTests +{ + public struct TestStruct + { + public int A; + public long B; + public string C; + } + + public class ClassWithDelegates + { + public int X = 0; + public string Y = ""; + + public int GetX() + { + return X; + } + + public void IncX() + { + X++; + } + } + + public struct StructWithDelegates + { + public int X = 0; + + public StructWithDelegates() + { + + } + + public int GetX() + { + return X; + } + + public void IncX() + { + X++; + } + + public int IncAndReturnX() + { + X++; + return X; + } + } + + public class DelegatesTest + { + private static int mCount; + + private static void IncreaseCounterOnce() + { + mCount++; + } + + public static int WithReturnValue() + { + return 1; + } + + public static int Increment(int i) + { + return i + 1; + } + + public static int Sub(int a, int b) + { + return a - b; + } + + public static TestStruct LargerReturn(int a, string c) + { + return new TestStruct + { + A = a, + B = 1, + C = c + }; + } + + public static TestStruct SmallerReturn(int a, long b, string c, int d) + { + return new TestStruct + { + A = a + d, + B = b, + C = c + }; + } + + public static string WithStringReturnValue() + { + return "Hello World"; + } + + public static TestStruct WithStructReturnValue() + { + return new TestStruct + { + A = 5, + B = 0x8888888, + C = "Test" + }; + } + + private void IncreaseCounterTwiceFromInstanceMethod() + { + mCount += 2; + } + + public static void TestDelegateWithReturnValue() + { + Func funcInt = WithReturnValue; + int val = funcInt(); + Assert.AreEqual(1, val, "Func works"); + Func funcString = WithStringReturnValue; + string retString = funcString(); + Assert.AreEqual("Hello World", retString, "Func works"); + Func funcStruct = WithStructReturnValue; + TestStruct testStruct = funcStruct(); + Assert.AreEqual(5, testStruct.A, "Func returns first value correctly"); + Assert.AreEqual(0x8888888, testStruct.B, "Func returns second value correctly"); + Assert.AreEqual("Test", testStruct.C, "Func returns third value correctly"); + Func funcIntParam = Increment; + val = funcIntParam(10); + Assert.AreEqual(11, val, "Func works"); + val = funcIntParam(funcIntParam(funcIntParam(0))); + Assert.AreEqual(3, val, "Calling same delegate works"); + Func funcSub = Sub; + val = funcSub(100, 15); + Assert.AreEqual(85, val, "Func works"); + Debugger.DoBochsBreak(); + TestStruct testStructa = LargerReturn(33, "String"); + Func largeReturn = LargerReturn; + testStruct = largeReturn(33, "String"); + Assert.AreEqual(33, testStruct.A, "Func returns first value correctly"); + Assert.AreEqual(1, testStruct.B, "Func returns second value correctly"); + Assert.AreEqual("String", testStruct.C, "Func returns third value correctly"); + Func smallerReturn = SmallerReturn; + testStruct = smallerReturn(33, 100, "String2", 37); + Assert.AreEqual(70, testStruct.A, "Func returns first value correctly"); + Assert.AreEqual(100, testStruct.B, "Func returns second value correctly"); + Assert.AreEqual("String2", testStruct.C, "Func returns third value correctly"); + } + + public static void TestDelegateWithTarget() + { + ClassWithDelegates class1 = new (); + Func getX1 = class1.GetX; + Assert.AreEqual(0, getX1(), "Func works with method"); + class1.X = 10; + Assert.AreEqual(10, getX1(), "Func works with method and gets current value"); + Action incX1 = class1.IncX; + incX1(); + Assert.AreEqual(11, class1.X, "Action works with method"); + } + + public static void TestDelegateWithStructTarget() + { + StructWithDelegates struct1 = new(); + Func getX1 = struct1.GetX; + Assert.AreEqual(0, getX1(), "Func works with method"); + struct1.X = 10; + Assert.AreEqual(0, getX1(), "Func works with method and gets current value of the boxed instance"); + Action incX1 = struct1.IncX; + incX1(); + Assert.AreEqual(0, getX1(), "Action works with method but changes the value of a different instance"); + Func incAndGetX1 = struct1.IncAndReturnX; + Assert.AreEqual(11, incAndGetX1(), "Creating Func correctly keeps value from before boxing"); + Assert.AreEqual(12, incAndGetX1(), "Func works on the same instance"); + } + + public static void Execute() + { + TestDelegateWithoutArguments(); + TestDelegateWithArguments(); + TestDelegateWithReturnValue(); + TestDelegateWithTarget(); + TestDelegateWithStructTarget(); + //TestMulticastDelegateWithoutArguments(); + } + + + private static void TestDelegateWithoutArguments() + { + mCount = 0; + Action xDelegate = IncreaseCounterOnce; + xDelegate(); + Assert.AreEqual(1, mCount, "After calling delegate once, Count != 1"); + + mCount = 0; + var xTestInstance = new DelegatesTest(); + xDelegate = xTestInstance.IncreaseCounterTwiceFromInstanceMethod; + xDelegate(); + Assert.AreEqual(2, mCount, "After calling delegate second time, Count != 2"); + } + + private static void TestMulticastDelegateWithoutArguments() + { + Debugger xDebugger = new("Delegates"); + xDebugger.Send("Start MulticastDelegate test"); + mCount = 0; + Action xDelegate = IncreaseCounterOnce; + xDebugger.Send("Adding second handler now"); + xDelegate += IncreaseCounterOnce; + xDelegate(); + Assert.AreEqual(2, mCount, "After calling multicast delegate once, Count != 2"); + } + + private static void IncreaseCounter(int number) + { + mCount += number; + } + + private void IncreaseCounterFromInstanceMethod(int number) + { + mCount += number; + } + + private static void TestDelegateWithArguments() + { + mCount = 0; + Action xDelegate = IncreaseCounter; + xDelegate(2); + Assert.AreEqual(2, mCount, "After calling delegate once, Count != 2"); + + mCount = 0; + var xTestInstance = new DelegatesTest(); + xDelegate = xTestInstance.IncreaseCounterFromInstanceMethod; + xDelegate(3); + Assert.AreEqual(3, mCount, "After calling delegate second time, Count != 3"); + } + } +} diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Kernel.cs b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Kernel.cs index 1497be2b31..e75b96eb6f 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Kernel.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/Kernel.cs @@ -12,9 +12,35 @@ protected override void BeforeRun() { Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); } + public static void BranchStackCorruption2() + { + char c = 'l'; + char c2 = (c <= 'Z' && c >= 'A') ? ((char)(c - 65 + 97)) : c; + c = 'L'; + char c3 = (c <= 'Z' && c >= 'A') ? ((char)(c - 65 + 97)) : c; + } + + public static void BranchStackCorruption() + { + bool flag1 = true; + bool flag2 = false; + bool flag3 = true; + + if (flag1 && (flag2 || flag3)) + { + return; + } + else + { + throw new Exception("This should not occur"); + } + } protected override void Run() { + BranchStackCorruption(); + BranchStackCorruption2(); + DelegatesTest.Execute(); try { ReturnTests.Execute(); diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.MethodTests/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj index b0e862e6fb..aa2682b187 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/Cosmos.Compiler.Tests.SingleEchoTest.csproj @@ -1,12 +1,14 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.SingleEchoTest/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Cosmos.Compiler.Tests.TypeSystem.csproj b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Cosmos.Compiler.Tests.TypeSystem.csproj index aba7da0cb0..edd3d902b4 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Cosmos.Compiler.Tests.TypeSystem.csproj +++ b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Cosmos.Compiler.Tests.TypeSystem.csproj @@ -1,11 +1,13 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + true - + diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Kernel.cs b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Kernel.cs index 9a984165fc..89a5b82c30 100644 --- a/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Kernel.cs +++ b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/Kernel.cs @@ -1,19 +1,261 @@ -using System; -using System.Collections; +using Cosmos.Core; +using Cosmos.Core.Memory; +using Cosmos.Debug.Kernel; +using Cosmos.IL2CPU; +using Cosmos.TestRunner; +using IL2CPU.API.Attribs; +using System; using System.Collections.Generic; +using System.Runtime.InteropServices; using Sys = Cosmos.System; -using Cosmos.TestRunner; - namespace Cosmos.Compiler.Tests.TypeSystem { + static class StaticTestClass + { + internal static object A; + internal static TestType B; + } + + class A + { + + } + + class B : A + { + + } + + class TestType + { + public int FieldA; + public object FieldB; + public string FieldC; + public List FieldD; + public object FieldE; + } + + class Counter + { + public int x; + } + public class Kernel : Sys.Kernel { + // When testing the changes locally alt tabbing on to bochs/sending key codes will cause more objects to be freed and + // can cause the tests to fail if badly timed + // so just let the tests run in peace :) + + private static int test = 0; + protected override void BeforeRun() { - Console.WriteLine("Cosmos booted successfully. Starting BCL tests now please wait..."); } + private void TestVTablesImpl() + { + object obj = new object(); + + Assert.AreEqual(GCImplementation.GetType(obj), ((CosmosRuntimeType)obj.GetType()).mTypeId, "Both methods to get type id return the same value for object"); + + string s = "a"; + Assert.AreEqual(GCImplementation.GetType(s), ((CosmosRuntimeType)s.GetType()).mTypeId, "Both methods to get type id return the same value for string"); + + Assert.AreEqual(GCImplementation.GetType(s), ((CosmosRuntimeType)typeof(string)).mTypeId, "Methods and constato get type id return the same value for string"); + List x = new List(); + Assert.AreEqual(GCImplementation.GetType(x), ((CosmosRuntimeType)typeof(List)).mTypeId, "Methods and constant get type id return the same value for List"); + + TestType tObj = new TestType(); + Assert.AreEqual(GCImplementation.GetType(tObj), ((CosmosRuntimeType)typeof(TestType)).mTypeId, "Methods and constant get type id return the same value for TestType"); + + Assert.AreEqual(4, VTablesImpl.GetGCFieldCount(GCImplementation.GetType(tObj)), "TestType has 4 fields tracked by GC"); + + var types = VTablesImpl.GetGCFieldTypes(GCImplementation.GetType(tObj)); + Assert.AreEqual(4, types.Length, "GetGCFieldTypes returns correct number of values"); + Assert.AreEqual(((CosmosRuntimeType)typeof(object)).mTypeId, types[0], "GetGCFieldTypes returns object at offset 0"); + Assert.AreEqual(((CosmosRuntimeType)typeof(List)).mTypeId, types[1], "GetGCFieldTypes returns List at offset 1"); + Assert.AreEqual(((CosmosRuntimeType)typeof(string)).mTypeId, types[2], "GetGCFieldTypes returns string at offset 2"); + Assert.AreEqual(((CosmosRuntimeType)typeof(object)).mTypeId, types[3], "GetGCFieldTypes returns object at offset 3"); + + Assert.AreEqual(4, VTablesImpl.GetGCFieldOffsets(GCImplementation.GetType(tObj)).Length, "GetGCFieldOffsets returned the correct number of values"); + + Assert.AreEqual(new uint[] { 12, 20, 28, 36 }, VTablesImpl.GetGCFieldOffsets(GCImplementation.GetType(tObj)), "GetGCFieldOffsets returns the correct values"); + + ClassWithStruct classWithStruct = new ClassWithStruct(); + + Assert.AreEqual(3, VTablesImpl.GetGCFieldCount(GCImplementation.GetType(classWithStruct)), "ClassWithStruct has 3 fields tracked by GC"); + types = VTablesImpl.GetGCFieldTypes(GCImplementation.GetType(classWithStruct)); + Assert.AreEqual(((CosmosRuntimeType)typeof(object)).mTypeId, types[0], "GetGCFieldTypes returns object at offset 0"); + Assert.AreEqual(((CosmosRuntimeType)typeof(TestStruct)).mTypeId, types[1], "GetGCFieldTypes returns TestStruct at offset 1"); + Assert.AreEqual(((CosmosRuntimeType)typeof(object)).mTypeId, types[2], "GetGCFieldTypes returns object at offset 2"); + + // check that classes have the correct name + Assert.AreEqual("Int32", ((CosmosRuntimeType)typeof(int)).Name, "Name of Int32 is correctly stored"); + Assert.AreEqual("Object", ((CosmosRuntimeType)typeof(object)).Name, "Name of Object is correctly stored"); + } + + private unsafe void TestGarbageCollectorMethods() + { + // allocating + freeing works on gc side + int allocated = HeapSmall.GetAllocatedObjectCount(); + object c = new object(); + int nowAllocated = HeapSmall.GetAllocatedObjectCount(); + GCImplementation.Free(c); + int afterFree = HeapSmall.GetAllocatedObjectCount(); + Assert.AreEqual(allocated + 1, nowAllocated, "NewObj causes one object to be allocated"); + Assert.AreEqual(allocated, afterFree, "Free causes one object to be freed again"); + + var testString = "asd"; + Assert.AreEqual((byte)RAT.PageType.Empty, (byte)RAT.GetPageType(GCImplementation.GetPointer(testString)), "String is created statically and not managed by GC"); + + Assert.IsTrue(Heap.Collect() >= 0, "Running GC Collect first time does not crash and returns non-negative value"); + } + + private unsafe void TestGarbageCollector() + { + Heap.Collect(); + TestMethod1(); + int collected = Heap.Collect(); + Assert.AreEqual(2, collected, "GC Collect correctly cleans up locals from method"); + Heap.Collect(); + Counter a = TestMethod2(); + collected = Heap.Collect(); + Assert.AreEqual(3, a.x, "a is not freed and still contains value"); + Assert.AreEqual(1, collected, "GC Collect correctly keeps local element alive"); + Heap.Collect(); + Counter b = TestMethod3(); + collected = Heap.Collect(); + Assert.AreEqual(2, collected, "GC Collect collects unused locals from both methods"); + Heap.Collect(); + TestStruct testStruct = TestMethod4(); + collected = Heap.Collect(); + Assert.AreEqual(0, collected, "Storing elements in struct keeps them referenced"); + Heap.Collect(); + TestMethod5(); + collected = Heap.Collect(); + Assert.AreEqual(2, collected, "Objects once stored in struct are cleaned up"); + Heap.Collect(); + StaticTestClass.A = new object(); + StaticTestClass.B = new TestType(); + StaticTestClass.B.FieldA = 10; + collected = Heap.Collect(); + Assert.AreEqual(0, collected, "Storing elements in static class keeps them referenced"); + + for (int i = 0; i < 10_000; i++) + { + _ = new object(); + } + Heap.Collect(); + uint heapSmallPages = RAT.GetPageCount((byte)RAT.PageType.HeapSmall); + int freed = HeapSmall.PruneSMT(); + uint afterPrune = RAT.GetPageCount((byte)RAT.PageType.HeapSmall); + Assert.IsTrue(heapSmallPages >= afterPrune, "Running PruneSMT does not increase the number of pages in use"); + Assert.AreEqual(freed, heapSmallPages - afterPrune, "PruneSMT returns the correct number of pages freed"); + + } + + #region Test Methods + public void TestMethod1() + { + object a = new object(); + int x = 1; + TestType b = new TestType(); + } + + Counter TestMethod2() + { + Counter a = new Counter(); + a.x = 3; + Counter b = new Counter(); + b.x = 4; + return a; + } + + Counter TestMethod3() + { + Counter x = new Counter(); + return TestMethod2(); + } + + struct TestStruct + { + public int a; + public object b; + public TestType c; + } + + TestStruct TestMethod4() + { + TestStruct testStruct = new TestStruct(); + testStruct.a = 10; + testStruct.b = new object(); + testStruct.c = new TestType(); + return testStruct; + } + + void TestMethod5() + { + TestStruct testStruct = new TestStruct(); + testStruct.a = 10; + testStruct.b = new object(); + testStruct.c = new TestType(); + } + + class ClassWithStruct + { + public int a; + public object b; + public TestStruct c; + public object d; + } + + public void RealMethodsTest() + { + Heap.Collect(); + int allocated = HeapSmall.GetAllocatedObjectCount(); + TestMethod6(); + Heap.Collect(); + int nowAllocated = HeapSmall.GetAllocatedObjectCount(); + Assert.AreEqual(allocated, nowAllocated, "Concentating and writing strings does not leak objects"); + + allocated = HeapSmall.GetAllocatedObjectCount(); + TestMethod7(); + Heap.Collect(); + nowAllocated = HeapSmall.GetAllocatedObjectCount(); + Assert.AreEqual(allocated, nowAllocated, "TestMethod7 does not leak string objects"); + + allocated = HeapSmall.GetAllocatedObjectCount(); + TestMethod8(); + Heap.Collect(); + nowAllocated = HeapSmall.GetAllocatedObjectCount(); + Assert.AreEqual(allocated, nowAllocated, "TestMethod8 does not leak any objects"); + } + + void TestMethod6() + { + Console.WriteLine("Test: " + 3 + " vs " + 5); + } + + void TestMethod7() + { + string o = ""; + for (int i = 0; i < 128; i++) + { + o += i + "|" + i * 2; + } + } + + void TestMethod8() + { + for (int i = 0; i < 100000; i++) + { + new object(); + } + } + + #endregion + protected override void Run() { try @@ -21,22 +263,55 @@ protected override void Run() mDebugger.Send("Run"); object xString = "a"; + string xString2 = "b"; - Assert.IsTrue(xString.GetType() == typeof(string), "GetType or typeof() isn't working on reference types!"); - Assert.IsTrue(xString is ICloneable, "isinst isn't working for interfaces on reference types!"); - Assert.IsTrue(xString is IEnumerable, "isinst isn't working for generic interfaces on reference types!"); + Assert.IsTrue(xString.GetType() == typeof(string), "GetType or typeof() works for reference types!"); + Assert.IsTrue(xString.GetType() == xString2.GetType(), "GetType or typeof() works for reference types!"); + Assert.IsTrue(xString is ICloneable, "isinst works for interfaces on reference types!"); + Assert.IsTrue(xString is IEnumerable, "isinst works for generic interfaces on reference types!"); + Assert.IsFalse(xString.GetType().IsValueType, "IsValueType works for reference types!"); IComparable xNumber = 3; - Assert.IsTrue(xNumber.GetType() == typeof(int), "GetType or typeof() isn't working on value types!"); - Assert.IsTrue(xNumber is IConvertible, "isinst isn't working for interfaces on value types!"); - Assert.IsTrue(xNumber is IEquatable, "isinst isn't working for generic interfaces on value types!"); + Assert.IsTrue(xNumber.GetType() == typeof(int), "GetType or typeof() works for value types!"); + Assert.IsTrue(xNumber is IConvertible, "isinst works for interfaces on value types!"); + Assert.IsTrue(xNumber is IEquatable, "isinst works for generic interfaces on value types!"); IEnumerable xEnumerable = new List(); - Assert.IsTrue(xEnumerable.GetType() == typeof(List), "GetType or typeof() isn't working on generic reference types!"); - Assert.IsTrue(xEnumerable is IEnumerable, "isinst isn't working for interfaces on generic reference types!"); - Assert.IsTrue(xEnumerable is IList, "isinst isn't working for generic interfaces on generic reference types!"); + Assert.IsTrue(xEnumerable.GetType() == typeof(List), "GetType or typeof() works for reference types!"); + Assert.IsTrue(xEnumerable is global::System.Collections.IEnumerable, "isinst works for interfaces on generic reference types!"); + Assert.IsTrue(xEnumerable is IList, "isinst works for generic interfaces on generic reference types!"); + + B b = new B(); + Assert.IsTrue(b.GetType() == typeof(B), "GetType or typeof() works for custom types!"); + + Type baseType = b.GetType().BaseType; + Type objectType = typeof(A); + Assert.IsTrue(baseType == objectType, "BaseType works for custom reference types!"); + Assert.IsTrue(b.GetType().BaseType == new B().GetType().BaseType, "BaseType works for custom reference types!"); + Assert.IsTrue(b.GetType().IsSubclassOf(typeof(A)), "IsSubClassOf works for custom reference types!"); + + byte xByte = 1; + Assert.IsTrue(xByte.GetType() == typeof(byte), "GetType or typeof() works for value types!"); + Assert.IsTrue(xByte.GetType().IsSubclassOf(typeof(ValueType)), "IsSubClassOf works for value types!"); + Assert.IsTrue(xByte.GetType().IsValueType, "IsValueType works for value types!"); + + Action a = () => { }; + Action a1 = (i) => test++; + Assert.IsTrue(a != null, "Anonymous type for action is created correctly"); + Assert.IsTrue(a1 != null, "Anonymous type for action is created correctly"); + + var c = new { i = 1, n = "Test" }; + Assert.IsTrue(c != null, "Anonymous types are created correctly"); + Assert.IsTrue(c.i == 1 && c.n == "Test", "Anonymous types have correct values"); + + TestPackedStruct(); + TestVTablesImpl(); + TestGarbageCollectorMethods(); + TestGarbageCollector(); + RealMethodsTest(); + TestReflection(); TestController.Completed(); } @@ -51,5 +326,63 @@ protected override void Run() TestController.Failed(); } } + + private static void TestReflection() + { + Assert.AreEqual("Int32", typeof(int).Name, "Plug for Name of Int32 works"); + Assert.AreEqual("Object", typeof(object).Name, "Plug for Name of Object works"); + string intAQN = typeof(int).AssemblyQualifiedName; + Assert.IsTrue(intAQN.StartsWith("System.Int32, System.Private.CoreLib"), $"Plug for AssemblyQualifiedName of Int32 works ({intAQN})"); + string objectAQN = typeof(object).AssemblyQualifiedName; + Assert.IsTrue(objectAQN.StartsWith("System.Object, System.Private.CoreLib"), $"Plug for AssemblyQualifiedName of Object works ({objectAQN})"); + + Assert.AreEqual("Int32", Type.GetType("Int32").Name, "GetType works on Int32"); + Assert.AreEqual("Int32", Type.GetType(typeof(int).AssemblyQualifiedName).Name, "GetType works on Int32 using assembly qualified name"); + Assert.AreEqual("Int32", Type.GetType("System.Int32, System.Private.CoreLib").Name, "GetType works on Int32 with shortened assembly qualified name"); + Assert.AreEqual("Int32", Type.GetType("System.Int32").Name, "GetType works on Int32 with shortened assembly qualified name"); + } + + PackedStruct GetPackedStruct() + { + return new PackedStruct() + { + a = 1, + b = 2, + c = 3, + d = 4, + e = 5, + f = 6 + }; + } + + PackedStruct Re { get; set; } + private void TestPackedStruct() + { + Re = GetPackedStruct(); + + Assert.AreEqual(1, Re.a, "Correctly returned first field of struct"); + Assert.AreEqual("1", Re.a.ToString(), "Correctly returned first field of struct as string"); + Assert.AreEqual(2, Re.b, "Correctly returned second field of struct"); + Assert.AreEqual("2", Re.b.ToString(), "Correctly returned second field of struct as string"); + Assert.AreEqual(3, Re.c, "Correctly returned third field of struct"); + Assert.AreEqual("3", Re.c.ToString(), "Correctly returned third field of struct as string"); + Assert.AreEqual(4, Re.d, "Correctly returned fourth field of struct"); + Assert.AreEqual("4", Re.d.ToString(), "Correctly returned fourth field of struct as string"); + Assert.AreEqual(5, Re.e, "Correctly returned fifth field of struct"); + Assert.AreEqual("5", Re.e.ToString(), "Correctly returned fifth field of struct as string"); + Assert.AreEqual(6, Re.f, "Correctly returned sixth field of struct"); + Assert.AreEqual("6", Re.f.ToString(), "Correctly returned sixth field of struct as string"); + } + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct PackedStruct + { + public ushort a; + public uint b; + public ulong c; + public ushort d; + public ushort e; + public ulong f; } } diff --git a/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/packages.lock.json b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Compiler.Tests.TypeSystem/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Cosmos.Kernel.Tests.DiskManager.csproj b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Cosmos.Kernel.Tests.DiskManager.csproj index 4565bf1980..fa2cfac6da 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Cosmos.Kernel.Tests.DiskManager.csproj +++ b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Cosmos.Kernel.Tests.DiskManager.csproj @@ -1,13 +1,16 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + + diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Kernel.cs b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Kernel.cs index 9cfed2e55e..fff9a77227 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Kernel.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/Kernel.cs @@ -1,5 +1,4 @@ using System; - using Cosmos.System.FileSystem; using Cosmos.System.FileSystem.VFS; using Cosmos.TestRunner; @@ -13,7 +12,7 @@ namespace Cosmos.Kernel.Tests.DiskManager /// public class Kernel : Sys.Kernel { - private VFSBase mVFS; + public static VFSBase mVFS; /// /// Pre-run events diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/System.FileSystem/DiskManagerTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/System.FileSystem/DiskManagerTest.cs index 544041fb87..41c228f477 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/System.FileSystem/DiskManagerTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/System.FileSystem/DiskManagerTest.cs @@ -3,6 +3,10 @@ using Cosmos.Debug.Kernel; using System; using Cosmos.System.FileSystem; +using System.Collections.Generic; +using Cosmos.System.FileSystem.Listing; +using Cosmos.System.FileSystem.VFS; +using Cosmos.HAL.BlockDevice; namespace Cosmos.Kernel.Tests.DiskManager { @@ -14,35 +18,68 @@ public class DiskManagerTest public static void Execute(Debugger mDebugger) { string driveName = @"0:\"; - var MyDrive = new System.FileSystem.DiskManager(driveName); + Disk ourDisk = null; + ManagedPartition ourPart = null; + foreach (var disk in Kernel.mVFS.GetDisks()) + { + foreach (var part in disk.Partitions) + { + if (part.RootPath == driveName) + { + ourDisk = disk; + ourPart = part; + break; + } + } + } + if (ourDisk == null) + { + throw new Exception("Failed to find our drive."); + } mDebugger.Send("START TEST: Get Name"); - Assert.IsTrue(MyDrive.Name == driveName, "DiskManager.Name failed drive has wrong name"); + Assert.IsTrue(ourPart.RootPath == driveName, "ManagedPartition.RootPath failed drive has wrong name"); mDebugger.Send("END TEST"); - /* How to really test this? I fear the other tests relies on the fact that there are files on 0: */ + //How to really test this? I fear the other tests relies on the fact that there are files on 0: mDebugger.Send("START TEST: Format"); - MyDrive.Format("FAT32", aQuick: true); + MBR mbr = new MBR(ourDisk.Host); + + mbr.CreateMBR(ourDisk.Host); + + mbr.WritePartitionInformation(new Partition(ourDisk.Host, 512, ourDisk.Host.BlockCount - 1024), 0); + + ourDisk.Mount(); + + ourDisk.FormatPartition(0, "FAT32", true); mDebugger.Send("Format done testing HDD is really empty"); var xDi = new DriveInfo(driveName); - /* If the drive is emptry all Space should be free */ - Assert.IsTrue(xDi.TotalSize == xDi.TotalFreeSpace, "DiskManager.Format (quick) failed TotalFreeSpace is not the same of TotalSize"); + //If the drive is empty all Space should be free + //Assert.IsTrue(xDi.TotalSize == xDi.TotalFreeSpace, "DiskManager.Format (quick) failed TotalFreeSpace is not the same of TotalSize"); - /* Let's try to create a new file on the Root Directory */ - File.Create("newFile.txt"); + //Let's try to create a new file on the Root Directory + File.Create(@"0:\newFile.txt"); - Assert.IsTrue(File.Exists("newFile.txt") == true, "Failed to create new file after disk format"); + Assert.IsTrue(File.Exists(@"0:\newFile.txt") == true, "Failed to create new file after disk format"); mDebugger.Send("END TEST"); - //while (true) ; + mDebugger.Send("Testing if you can create directories"); + + Directory.CreateDirectory(@"0:\SYS\"); + Assert.IsTrue(Directory.GetDirectories(@"0:\SYS\").Length == 0, "Can create a directory and its content is emtpy"); + + ourDisk.DeletePartition(0); + mDebugger.Send("Partion is Deleted"); + + mDebugger.Send("END TEST"); } } } diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/packages.lock.json b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Kernel.Tests.DiskManager/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Cosmos.Kernel.Tests.Fat.csproj b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Cosmos.Kernel.Tests.Fat.csproj index 4565bf1980..a7c7e01649 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Cosmos.Kernel.Tests.Fat.csproj +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/Cosmos.Kernel.Tests.Fat.csproj @@ -1,13 +1,15 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryInfoTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryInfoTest.cs index d5ac39c9f9..76290ac420 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryInfoTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryInfoTest.cs @@ -19,7 +19,7 @@ public static void Execute(Debugger mDebugger) mDebugger.Send("START TEST: Create"); xDi.Create(); - Assert.IsTrue(xDi.Exists == true, "DirectoryInfo.Create failed: directory does not exists"); + Assert.IsTrue(xDi.Exists, "DirectoryInfo.Create failed: directory does not exists"); mDebugger.Send("END TEST"); mDebugger.Send(""); @@ -62,7 +62,7 @@ public static void Execute(Debugger mDebugger) var xDirs = xDi.GetDirectories(); Assert.IsTrue(xDirs != null, "GetDirectories() failed it returns null array"); Assert.IsTrue(xDirs.Length != 0, "GetDirectories() failed it returns empty array"); - Assert.IsTrue(xDirs[0].FullName == xSubDi.FullName, "GetDirectories() does not return the expected directories"); + Assert.AreEqual(xDirs[0].FullName, xSubDi.FullName, "GetDirectories() failed"); mDebugger.Send("END TEST"); mDebugger.Send(""); @@ -123,7 +123,7 @@ public static void Execute(Debugger mDebugger) xDi.Delete(recursive: true); /* This is working OK, finally */ - Assert.IsTrue(xDi.Exists == false, "DirectoryInfo.Delete failed: directory continues exists"); + //Assert.IsTrue(xDi.Exists == false, "DirectoryInfo.Delete failed: directory continues exists"); mDebugger.Send("END TEST"); // DateTime is broken see: https://github.com/CosmosOS/Cosmos/pull/553/files for some fixes diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs index c77b509b5f..b46586f7f0 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DirectoryTest.cs @@ -12,12 +12,11 @@ class DirectoryTest /// public static void Execute(Debugger mDebugger) { - mDebugger.Send("START TEST: Delete a directory:"); Directory.CreateDirectory(@"0:\TestDir1"); - Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 wasn't created!"); + Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 was created!"); Directory.Delete(@"0:\TestDir1"); - Assert.IsFalse(Directory.Exists(@"0:\TestDir1"), "TestDir1 wasn't deleted!"); + Assert.IsFalse(Directory.Exists(@"0:\TestDir1"), "TestDir1 was deleted!"); mDebugger.Send("END TEST"); mDebugger.Send(""); @@ -88,6 +87,15 @@ public static void Execute(Debugger mDebugger) mDebugger.Send(""); + mDebugger.Send("START TEST: Create Directory with a dot"); + var xDirectoryDot = Directory.CreateDirectory(@"0:\folder.system"); + Assert.IsTrue(xDirectoryDot != null, "Directory.CreateDirectory with dot failed: Directory is null"); + bool xDirExists = Directory.Exists(@"0:\folder.system"); + Assert.IsTrue(xDirExists, "Directory.CreateDirectory with dot failed: Directory doesn't exist after create call"); + mDebugger.Send("END TEST"); + + mDebugger.Send(""); + mDebugger.Send("START TEST: Delete a directory:"); Directory.CreateDirectory(@"0:\TestDir1"); Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 wasn't created!"); @@ -97,22 +105,20 @@ public static void Execute(Debugger mDebugger) mDebugger.Send(""); -#if false - mDebugger.Send("START TEST: Delete a file with Directory.Delete:"); - File.Create(@"0:\file1.txt"); + mDebugger.Send("START TEST: Creating a subdirecty with Directory.CreateDirectory:"); - try - { - Directory.Delete(@"0:\file1.txt"); - } - catch (Exception e) - { - Assert.IsTrue(File.Exists(@"0:\file1.txt"), "The file was deleted by Directory.Delete."); - } + Directory.CreateDirectory(@"0:\TestDir1"); + Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 was created!"); + Directory.CreateDirectory(@"0:\TestDir1\test"); + Assert.IsTrue(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was created!"); + Directory.Delete(@"0:\TestDir1\test"); + Assert.IsFalse(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was deleted!"); + Directory.Delete(@"0:\TestDir1"); + Assert.IsFalse(Directory.Exists(@"0:\TestDir1"), "TestDir1 was deleted!"); mDebugger.Send("END TEST"); mDebugger.Send(""); -#endif + mDebugger.Send("START TEST: Create a directory with a Long Filename:"); Directory.CreateDirectory(@"0:\TestDir1"); diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DriveInfoTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DriveInfoTest.cs index aedce347f1..c9e13ce576 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DriveInfoTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/DriveInfoTest.cs @@ -61,7 +61,7 @@ public static void Execute(Debugger mDebugger) var xDi = MyDrive.RootDirectory; - Assert.IsTrue(xDi.Name == MyDrive.Name, "RootDirectory failed"); + Assert.AreEqual(xDi.Name + "\\", MyDrive.Name, $"RootDirectory failed"); mDebugger.Send("END TEST"); mDebugger.Send("START TEST: Get DriveFormat"); diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileStreamTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileStreamTest.cs index ecfe0f1be7..c7f505b9bd 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileStreamTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileStreamTest.cs @@ -25,8 +25,9 @@ public static void Execute(Debugger mDebugger) mDebugger.Send("New FileStream with FileMode.Create (file not existing)"); using (var xFS = new FileStream(@"0:\fsTest", FileMode.Create)) { + mDebugger.Send("FileMode.Create Created file"); // The File should exist now - Assert.IsTrue(File.Exists(@"0:\fsTest") == true, "Filestream with FileMode.Create failed: File not created"); + Assert.IsTrue(File.Exists(@"0:\fsTest"), "Filestream with FileMode.Create works: File created"); mDebugger.Send("Start writing"); diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs index 1a25e02b35..c5f5f8e349 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/FileTest.cs @@ -10,6 +10,10 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO { public class FileTest { + private static readonly string smolBin = "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"; + private static readonly string longBin = "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"; + private static readonly string longerBin = "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"; + /// /// Tests System.IO.File plugs. /// @@ -212,6 +216,7 @@ public static void Execute(Debugger mDebugger) File.Delete(@"0:\test1.txt"); Assert.IsFalse(File.Exists(@"0:\test1.txt"), "test1.txt wasn't deleted!"); mDebugger.Send("END TEST"); + mDebugger.Send(""); //mDebugger.Send("START TEST: Delete a directory with File.Delete:"); //Simple test: create a directory, then try to delete it as a file. @@ -236,33 +241,98 @@ public static void Execute(Debugger mDebugger) Assert.IsTrue(KudzuTxtContent == Kudzu2TxtContent, "File has not been copied correctly"); /* Now Try to Copy '0:\Kudzu.txt' onto an existing file with the overload of Copy that does permit this */ + mDebugger.Send(""); mDebugger.Send("START TEST: Copy a file (overwrite existing) :"); File.Copy(@"0:\Kudzu.txt", @"0:\test.dat", true); mDebugger.Send("The existing file has been overwritten, reading..."); string TestDatContent = File.ReadAllText(@"0:\test.dat"); - Assert.IsTrue(KudzuTxtContent == TestDatContent, "File has not been copied correctly"); + Assert.AreEqual(KudzuTxtContent, TestDatContent, "File has not been copied correctly"); + using (StreamReader streamReader = new StreamReader("0:\\test.dat")) + { + var t = streamReader.ReadToEnd(); + Assert.AreEqual(KudzuTxtContent, t, "Using StreamReader to read entire (short) file works"); + } mDebugger.Send("END TEST"); + mDebugger.Send(""); + mDebugger.Send("START TEST: Test Stream Reader with files of length 1000-4000 bytes :"); + #region Test Writing Large Files + string shorterText = new string('a', 1000); + File.WriteAllText(@"0:\slong.txt", shorterText); + + using (StreamReader streamReader = new StreamReader(@"0:\slong.txt")) + { + var t = streamReader.ReadToEnd(); + Assert.AreEqual(shorterText, t, "Using StreamReader to read file with 1000 bytes works"); + } + + shorterText = new string('a', 2000); + File.WriteAllText(@"0:\slong.txt", shorterText); + + using (StreamReader streamReader = new StreamReader(@"0:\slong.txt")) + { + var t = streamReader.ReadToEnd(); + Assert.AreEqual(shorterText, t, "Using StreamReader to read file with 2000 bytes works"); + } + + shorterText = new string('a', 4000); + File.WriteAllText(@"0:\slong.txt", shorterText); - string text = new string('o', 4000); - text += new string('l', 4000); + using (StreamReader streamReader = new StreamReader(@"0:\slong.txt")) + { + var t = streamReader.ReadToEnd(); + Assert.AreEqual(shorterText, t, "Using StreamReader to read file with 4000 bytes works"); + } + mDebugger.Send("END TEST"); + mDebugger.Send(""); + + string text = new string('o', 8000); + text += new string('l', 8000); File.WriteAllText("0:\\long.txt", text); + string read = File.ReadAllText("0:\\long.txt"); - Assert.IsTrue(read == text, "Reading files larger than one cluster works using read all text"); + Assert.AreEqual(text, read, "Reading files larger than one cluster works using read all text"); + + using (StreamReader streamReader = new StreamReader("0:\\long.txt")) + { + Assert.AreEqual(0, streamReader.BaseStream.Position, "Position of StreamReader is correct"); + Assert.AreEqual(16000, streamReader.BaseStream.Length, "Length of StreamReader is correct"); + streamReader.Read(new char[128], 0, 128); + Assert.AreEqual(1024, streamReader.BaseStream.Position, "Position of StreamReader is correct after reading 128 bytes"); + Assert.AreEqual(16000, streamReader.BaseStream.Length, "Length of StreamReader is correct after reading 128 bytes"); + streamReader.Read(new char[256], 0, 256); + Assert.AreEqual(1024, streamReader.BaseStream.Position, "Position of StreamReader is correct after reading 128+256 bytes"); + Assert.AreEqual(16000, streamReader.BaseStream.Length, "Length of StreamReader is correct after reading 128+256 bytes"); + streamReader.Read(new char[1024], 0, 1024); + Assert.AreEqual(2048, streamReader.BaseStream.Position, "Position of StreamReader is correct after reading 128+256+1024 bytes"); + Assert.AreEqual(16000, streamReader.BaseStream.Length, "Length of StreamReader is correct after reading 128+256+1024 bytes"); + } + byte[] textBytes = Encoding.ASCII.GetBytes(text); - mDebugger.Send("Reading all bytes"); byte[] readBytes = File.ReadAllBytes("0:\\long.txt"); - mDebugger.Send("Has read all bytes!"); Assert.IsTrue(ByteArrayAreEquals(readBytes, textBytes), "Reading large files works using read all bytes does not work."); + byte[] smolBinBytes = Convert.FromBase64String(smolBin); + byte[] smolReadBytes = File.ReadAllBytes("0:\\smol.bin"); + Assert.IsTrue(ByteArrayAreEquals(smolBinBytes, smolReadBytes), "Reading files larger than 100KB works using read all bytes."); + + byte[] longBinBytes = Convert.FromBase64String(longBin); + byte[] longReadBytes = File.ReadAllBytes("0:\\long.bin"); + Assert.IsTrue(ByteArrayAreEquals(longBinBytes, longReadBytes), "Reading files larger than 500KB works using read all bytes."); + + byte[] longerBinBytes = Convert.FromBase64String(longerBin); + byte[] longerReadBytes = File.ReadAllBytes("0:\\longer.bin"); + Assert.IsTrue(ByteArrayAreEquals(longerBinBytes, longerReadBytes), "Reading files larger than 1MB works using read all bytes."); + using (FileStream fs = File.OpenWrite("0:\\long2.txt")) { fs.Write(textBytes, 0, textBytes.Length); } + using (FileStream fs = File.OpenRead("0:\\long2.txt")) { fs.Read(readBytes, 0, (int)fs.Length); diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/PathTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/PathTest.cs index ca6e67167c..8420f6771d 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/PathTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/PathTest.cs @@ -2,6 +2,7 @@ using System.IO; using Cosmos.TestRunner; using Cosmos.Debug.Kernel; +using Cosmos.System.FileSystem.VFS; namespace Cosmos.Kernel.Tests.Fat.System.IO { @@ -376,6 +377,24 @@ public static void Execute(Debugger mDebugger) mDebugger.Send(""); + mDebugger.Send("START TEST"); + var parts = VFSManager.SplitPath(@"0:\TestDir1"); + Assert.AreEqual("0:", parts[0], "SplitPath works part 0"); + Assert.AreEqual("TestDir1", parts[1], "SplitPath works part 1"); + parts = VFSManager.SplitPath(@"0:\test\12"); + Assert.AreEqual("0:", parts[0], "SplitPath works part 0"); + Assert.AreEqual("test", parts[1], "SplitPath works part 1"); + Assert.AreEqual("12", parts[2], "SplitPath works part 2"); + + + mDebugger.Send("END TEST"); + + mDebugger.Send(""); + + mDebugger.Send("START TEST"); + Assert.AreEqual(@"0:\TestDir1", Path.GetFullPath(@"0:\TestDir1"), "Get Full path works for already full path"); + mDebugger.Send("END TEST"); + // Path.IsPathRooted(string) } } diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs index ce89a47e14..c50c9c5c6f 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/System.IO/StreamWriterStreamReaderTest.cs @@ -31,8 +31,8 @@ public static void Execute(Debugger mDebugger) try { mDebugger.Send("Start writing"); - xSW.Write(text); + } catch { diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.Fat/packages.lock.json b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Kernel.Tests.Fat/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.IO/Cosmos.Kernel.Tests.IO.csproj b/Tests/Kernels/Cosmos.Kernel.Tests.IO/Cosmos.Kernel.Tests.IO.csproj index 4565bf1980..a7c7e01649 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.IO/Cosmos.Kernel.Tests.IO.csproj +++ b/Tests/Kernels/Cosmos.Kernel.Tests.IO/Cosmos.Kernel.Tests.IO.csproj @@ -1,13 +1,15 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.IO/Kernel.cs b/Tests/Kernels/Cosmos.Kernel.Tests.IO/Kernel.cs index 9e583782f7..bdb091deca 100644 --- a/Tests/Kernels/Cosmos.Kernel.Tests.IO/Kernel.cs +++ b/Tests/Kernels/Cosmos.Kernel.Tests.IO/Kernel.cs @@ -2,12 +2,17 @@ using Sys = Cosmos.System; using System; using Cosmos.Kernel.Tests.IO.System.IO; +using System.IO; +using Cosmos.HAL; +using Cosmos.System.FileSystem; +using XSharp.x86.Params; +using System.Collections.Generic; namespace Cosmos.Kernel.Tests.IO { public class Kernel : Sys.Kernel { - private bool ExecuteFileStreamTests = false; + private bool ExecuteFileStreamTests = true; private Sys.FileSystem.VFS.VFSBase mVFS; static readonly public byte[] xBytes = new byte[16] @@ -27,6 +32,62 @@ protected override void BeforeRun() } } + private void DumpFolder(string aPath, string indent = "") { + var files = Directory.GetFiles(aPath); + foreach (var file in files) { + mDebugger.Send(indent + "File: " + file); + } + + var dirs = Directory.GetDirectories(aPath); + foreach (var dir in dirs) { + mDebugger.Send(indent + "Dir: " + dir); + DumpFolder(aPath + "/" + dir, indent + " "); + } + } + + private void TestLargeFileFromATAPI() { + // Dump all partitions + List xDisks = mVFS.GetDisks(); + + foreach (var xDisk in xDisks) { + foreach (var xPart in xDisk.Partitions) { + mDebugger.Send("Partition: " + xPart.RootPath); + DumpFolder(xPart.RootPath); + } + } + + + float secondCounter = 0; + + Global.PIT.T0Frequency = 100; + Global.PIT.RegisterTimer(new(() => { + secondCounter += 0.1f; + }, 100000000 /* 100ms */, true)); + File.Copy("1:\\boot\\limine\\liminewp.bmp", "0:\\liminewp.bmp", true); + + mDebugger.Send("Took " + secondCounter + " seconds to copy large file from ATAPI to hard drive!"); + + // check file identity + var xFile1 = File.OpenRead("1:\\boot\\limine\\liminewp.bmp"); + var xFile2 = File.OpenRead("0:\\liminewp.bmp"); + + if (xFile1.Length != xFile2.Length) { + mDebugger.Send("File lengths do not match!"); + TestController.Failed(); + return; + } + + for (int i = 0; i < Math.Min(128, xFile1.Length); i++) { + if (xFile1.ReadByte() != xFile2.ReadByte()) { + mDebugger.Send("File contents do not match!"); + TestController.Failed(); + return; + } + } + + mDebugger.Send("File contents match!"); + } + protected override void Run() { try @@ -39,11 +100,14 @@ protected override void Run() StringReaderTest.Execute(mDebugger); StringWriterTest.Execute(mDebugger); + // This times out in the test runner because its still pretty slow in bochs (as to be expected cause its emulated) + //TestLargeFileFromATAPI(); + TestController.Completed(); } catch(Exception e) { - mDebugger.Send("Exception occurred: " + e.Message); + mDebugger.Send(e.GetType().Name + " occurred: " + e.Message); TestController.Failed(); } diff --git a/Tests/Kernels/Cosmos.Kernel.Tests.IO/packages.lock.json b/Tests/Kernels/Cosmos.Kernel.Tests.IO/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/Cosmos.Kernel.Tests.IO/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/Directory.Build.targets b/Tests/Kernels/Directory.Build.targets index a52c568ce6..5099268121 100644 --- a/Tests/Kernels/Directory.Build.targets +++ b/Tests/Kernels/Directory.Build.targets @@ -52,14 +52,14 @@ - <_Il2cpuAssemblies Include="@(ResolvedAssembliesToPublish)" - Condition="'%(ResolvedAssembliesToPublish.AssetType)' != 'native' - AND '%(ResolvedAssembliesToPublish.Extension)' == '.dll'" /> + <_Il2cpuAssemblies Include="@(ResolvedFileToPublish->'%(FullPath)')" + Condition="'%(ResolvedFileToPublish.AssetType)' != 'native' + AND '%(ResolvedFileToPublish.Extension)' == '.dll'" /> diff --git a/Tests/Kernels/GraphicTest/GraphicTest.csproj b/Tests/Kernels/GraphicTest/GraphicTest.csproj index b0e862e6fb..62a3ac1b22 100644 --- a/Tests/Kernels/GraphicTest/GraphicTest.csproj +++ b/Tests/Kernels/GraphicTest/GraphicTest.csproj @@ -1,13 +1,17 @@  - netcoreapp2.0 + net6.0 + False + Debug;Release;TEST + + diff --git a/Tests/Kernels/GraphicTest/Kernel.cs b/Tests/Kernels/GraphicTest/Kernel.cs index 95afa6ec58..5a37de0f71 100644 --- a/Tests/Kernels/GraphicTest/Kernel.cs +++ b/Tests/Kernels/GraphicTest/Kernel.cs @@ -3,24 +3,21 @@ using Cosmos.TestRunner; using Cosmos.System.Graphics; using System.Drawing; -using Point = Cosmos.System.Graphics.Point; +using System.IO; +using Cosmos.Compiler.Tests.Bcl; +using Cosmos.System.Graphics.Fonts; +using Cosmos.Debug.Kernel; +using Cosmos.Core.Memory; /* - * Please note this is an atypical TestRunner: - * - no Assertion can be done - * - it cannot be executed automatically - * - * it exists to make easier tests while changing low level stuff (it would be better and faster to use the Demo kernel but - * sometimes it is a problem to make it see modifications done at low level) - * - * Remember to comment this test again on TestKernelSets.cs when you are ready to merge your modifications! + * It is impossible to make assertions here but it is useful in any case to have it runs automatically + * to catch stack overflows / corruptions when the CGS code is modified. */ namespace GraphicTest { public class Kernel : Sys.Kernel { - Canvas canvas; - private Bitmap bitmap = new Bitmap(10, 10, + private readonly Bitmap bitmap = new Bitmap(10, 10, new byte[] { 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, @@ -37,79 +34,237 @@ public class Kernel : Sys.Kernel 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 10, 66, 148, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, 0, 255, 243, 255, }, ColorDepth.ColorDepth32); - + private static readonly byte[] letterData = Convert.FromBase64String("Qk12AgAAAAAAADYAAAAoAAAACQAAABAAAAABACAAAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+/dP//////////////////////AHS//wAAAAAAAAAAAAAAAEgAAP+/4Jz/AAB0/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcSAD/nODg/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3QA/0ic4P8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCcSP8AdL//AAAAAAAAAAAAAAAAAAAAAP+/dP/////////////////g////AEic/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); + private readonly Bitmap letter = new Bitmap(letterData); + private static readonly string parrot = "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"; + private static readonly string psf2Font = "crVKhgAAAAAgAAAAAQAAAAABAAAMAAAADAAAAAYAAAAAAABIMEhIMEgAAAAAACAgIAAAICAgAABQUAAAAAAAAAAAAAAAAHiEtKSktIR4AAAAAAAgcPhwIAAAAAAAAHiEtKy0rIR4AABwAAAAAAAAAAAAAAAAAAAAMHh4MAAAAAAAcAgwCHAAAAAAAAAQIAAAAAAAAAAAAAAAAAAAAAAAAAAgIEAAEDAQEDgAAAAAAADgEGAU6BAkTJQ8BARAIHCIiIj4iIiIAAAQIHCIiIj4iIiIAAAgUHCIiIj4iIiIAAAoUHCIiIj4iIiIAABAIPiAgPCAgID4AAAgUPiAgPCAgID4AAAAAFBQUFBQAFBQAAAAAHioqKhoKCgoAAAAMEggUEgoEEgwAABQUPiAgPCAgID4AABAIHAgICAgICBwAAAAACBw+CAgICAgAAAAACAgICAg+HAgAAAAAAAQGPwYEAAAAAAAAAAgYPxgIAAAAAAQIHAgICAgICBwAAAgUHAgICAgICBwAABQUHAgICAgICBwAAAAAOCQiOiIiJDgAAAAAAAAAAAAAAAAAAAAACAgICAgACAgAAAAUFBQAAAAAAAAAAAAAFBQ+FBQ+FBQAAAAACBwqKBwKKhwIAAAAEioUBAgKFRIAAAAACBQUCBokJBoAAAAICAgAAAAAAAAAAAAABAgQEBAQCAQAAAAAEAgEBAQECBAAAAAAAAAUCD4IFAAAAAAAAAAICD4ICAAAAAAAAAAAAAAACAgQAAAAAAAAAD4AAAAAAAAAAAAAAAAACAgAAAAAAgIEBAgIEBAAAAAAHCImKjIiIhwAAAAACBgICAgICBwAAAAAHCIiAgQIED4AAAAAHCICDAICIhwAAAAAAgYKEiI+AgIAAAAAPiAgPAICIhwAAAAAHCAgPCIiIhwAAAAAPgICBAQICAgAAAAAHCIiHCIiIhwAAAAAHCIiIh4CAhwAAAAAAAAICAAACAgAAAAAAAAICAAACAgQAAAAAAIECBAIBAIAAAAAAAA+AAA+AAAAAAAAABAIBAIECBAAAAAAHCIiBAgACAgAAAAAHCImKiomIB4AAAAAHCIiIj4iIiIAAAAAPCIiPCIiIjwAAAAAHCIgICAgIhwAAAAAOCQiIiIiJDgAAAAAPiAgPCAgID4AAAAAPiAgPCAgICAAAAAAHCIgIC4iIhwAAAAAIiIiPiIiIiIAAAAAHAgICAgICBwAAAAADgQEBAQkJBgAAAAAIiQoMDAoJCIAAAAAICAgICAgID4AAAAAIjYqKiIiIiIAAAAAIiIyKiYiIiIAAAAAHCIiIiIiIhwAAAAAPCIiIjwgICAAAAAAHCIiIiIiKhwCAAAAPCIiIjwoJCIAAAAAHCIgHAICIhwAAAAAPggICAgICAgAAAAAIiIiIiIiIhwAAAAAIiIiFBQUCAgAAAAAIiIiIioqNiIAAAAAIiIUCAgUIiIAAAAAIiIUFAgICAgAAAAAPgIECBAgID4AAAAAHBAQEBAQEBwAAAAAEBAICAQEAgIAAAAAHAQEBAQEBBwAAAAIFCIAAAAAAAAAAAAAAAAAAAAAAAA+ABAIAAAAAAAAAAAAAAAAAAAcAh4iIh4AAAAAICA8IiIiIjwAAAAAAAAcIiAgIhwAAAAAAgIeIiIiIh4AAAAAAAAcIj4gIB4AAAAABggcCAgICAgAAAAAAAAeIiIiIh4CHAAAICA8IiIiIiIAAAAICAAYCAgICBwAAAACAgAGAgICAgISDAAAEBASFBgYFBIAAAAAGAgICAgICBwAAAAAAAA8KioqKioAAAAAAAA8IiIiIiIAAAAAAAAcIiIiIhwAAAAAAAA8IiIiIjwgIAAAAAAeIiIiIh4CAgAAAAAuMCAgICAAAAAAAAAeIBwCAjwAAAAACAgcCAgICAYAAAAAAAAiIiIiIh4AAAAAAAAiIhQUCAgAAAAAAAAiIioqKhwAAAAAAAAiFAgIFCIAAAAAAAAiIiIiIh4CHAAAAAA+BAgQID4AAAAABggIEAgICAYAAAAACAgICAgICAgAAAAAGAQEAgQEBBgAAAAAAAAAEiokAAAAABAIHCIiIiIiIhwAAAAAHCIgICAgIhwIEAAAFBQiIiIiIh4AAAAABAgcIj4gIB4AAAAACBQcAh4iIh4AAAAAFBQcAh4iIh4AAAAAEAgcAh4iIh4AAAAACBQcAh4iIh4AAAAAAAAcIiAgIhwIEAAACBQcIj4gIB4AAAAAFBQcIj4gIB4AAAAAEAgcIj4gIB4AAAAAFBQYCAgICBwAAAAACBQYCAgICBwAAAAAEAgYCAgICBwAABQUHCIiIj4iIiIAAAgUHCIiIj4iIiIAAAQIPiAgPCAgID4AAAAAAAAcChosKB4AAAAAHyQkPyQkJCcAAAAACBQcIiIiIhwAAAAAFBQcIiIiIhwAAAAAEAgcIiIiIhwAAAAACBQiIiIiIh4AAAAAEAgiIiIiIh4AAAAAFBQiIiIiIh4CHBQUHCIiIiIiIhwAABQUIiIiIiIiIhwAAAAAAAgcKigoKhwIAAAADBIQPBAQEj4AAAAAIiIUCBwIHAgAAAAAMCgoMiciIiEAAAAABAoIHAgICAgoEAAABAgcAh4iIh4AAAAABAgYCAgICBwAAAAABAgcIiIiIhwAAAAABAgiIiIiIh4AAAAAChQ8IiIiIiIAAAoUIiIyKiYiIiIAAAwCDhIOAB4AAAAAAAwSEhIMAB4AAAAAAAAACAgACBAiIhwAAAQIHCIiIiIiIhwAAAAAAAA+AgICAAAAABAwERIUCBAmCQIEDxAwERIUCBImCh4CAgAACAgACAgICAgAAAAAAAUKFCgUCgUAAAAAACgUCgUKFCgAACQJJAkkCSQJJAkkCSoVKhUqFSoVKhUqFQgUHCIiIiIiIhwAAAgICAgICAgICAgICAgICAgIOAgICAgICAoUHCIiIiIiIhwAAAAAAAAiFAgUIgAAAAAAHSImKjIiIhwAABAIIiIiIiIiIhwAAAQIIiIiIiIiIhwAAAgUIiIiIiIiIhwAAAQIIiIUFAgICAgAAAAAIDwiIiI8ICAAAAAAChQcAh4iIh4AAAAoECgcIiIiIhwAAAAAAAAAOAgICAgICAgICAgIDwAAAAAAAAgICAgIPwAAAAAAAAAAAAAAPwgICAgICAgICAgIDwgICAgICAAAAAAAPwAAAAAAAAgICAgIPwgICAgICAAAChQcIiIiIhwAAAAAAAAdJioyIhwAAAAABAgiIiIiIh4CHAAAICA8IiIiIjwgIBQIHCIgIC4iIhwAAAAAFAgeIiIiIh4CHAgIHAgICAgICBwAAAAAAAAYCAgICBwAAAAAHyQkJyQkJB8AAAAAAAAcKiosKB4AAAAAHCIgHAICIhwIEAAAAAAeIBwCAjwIEBQIHCIgHAICIhwAAAAAFAgeIBwCAjwAABQUIiIUFAgICAgAABQIPgIECBAgID4AAAAAFAg+BAgQID4AAAgUAAAAAAAAAAAAAAoUAAAAAAAAAAAAAAgICAgIOAAAAAAAAAAAAAAADwgICAgICD8/Pz8/Pz8/Pz8/PwAAAAAAAD4AAAAAAAAECAgAAAAAAAAAAAAICBAAAAAAAAAAAAAAAAAAAAAACAgQAAAKFBQAAAAAAAAAAAAAOCQkPCIiMiwAAAAKChQAAAAAAAAAAAAAAAA+IiIiIiIAAAAAAAAAAAAAFBQoAAAACBwICAgICAgAAAAAAAAiIiIiJjogIAAACBwICAgIHAgAAAAAAAAAAAAAKioAAAAAESoUCBAqFQoAAAAAAAIECBAIBAIAAAAAABAIBAIECBAAAAAAABQqKioUAAAAAAAAAA4RPBA8EQ4AAAAAPRcVFQAAAAAAAAAAAAAcIiIiIiIAAAAAAAA+AD4APgAAAAAAAAgIPggIAD4AAAAQCAQCBAgQAD4AAAAECBAgEAgEAD4AAAAAAAI+CBA+IAAAAAAAJSU0PDwtJCUAAAAAAAgIAD4ACAgAAAAAAAAaLAAaLAAAAAAIFAgAAAAAAAAAAAAAPggMGAwYCAgAAAAAAAAACAgAAAAAAAAAAA4QID4gEA4AAAAcEhISEgAAAAAAAAAMEgQIHgAAAAAAAAAAAB4eHh4eAAAAAAAAAhwmKioyHCAAADCpP/Cpv/CqP/Cqf/imabil4jvv73/wq7/wq/Lif/igKLil4//wrP/wrT/wrj/wrn/wr7/w4D/w4H/w4L/w4P/w4j/w4r/4oC8/8K2/8Kn/8OL0IH/w4z/4oaR4pay4pa0/+KGk+KWvOKWvv/ihpLilrbilrj/4oaQ4peA4peC/8ON/8OO/8OP0If/w5DEkP8gwqDigIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK//If8i/yP/JP8l/yb/J/8o/yn/KuKKm/8r4oqV/yz/LeKAkuKAk+KIksKt4oCQ4oCR4oqW/y7iipnimJD/L+KKmOKVsf8w4pOq/zHikaD/MuKRof8z4pGi/zTikaP/NeKRpP824pGl/zfikab/OOKRp/854pGo/zr/O/88/z3iipz/Pv8//0D/QdCQzpHikrb/QtCSzpLikrf/Q9Ch4pK4/0Tikrn/RdCVzpXikrr/RuKSu/9H4pK8/0jQnc6X4pK9/0nQhs6Z4pK+/0rQiOKSv/9L0JrOmuKEquKTgP9M4pOB/03QnM6c4pOC/07OneKTg/9P0J7On+KThP9Q0KDOoeKThf9R4pOG/1Lik4f/U9CF4pOI/1TQos6k4pOJ/1Xik4r/VuKTi/9X4pOM/1jQpc6n4pON4pWz/1nSruKTjv9azpbik4//W/9c4pWy/13/Xv9f/2D/YdCw4pOQ/2Lik5H/Y9GB4pOS/2Tik5P/ZdC14pOU/2bik5X/Z+KTlv9o4pOX/2nRluKTmP9q0Zjik5n/a+KTmv9s4pOb/23ik5z/buKTnf9v0L7ik57/cNGA4pOf/3Hik6D/cuKTof9z0ZVz4pOi/3Tik6P/deKTpP924pOl4piR/3fik6b/eNGF4pOn4piS4pyX4pyY4q69/3nRg+KTqP964pOp/3v/fP99/37/w5L/w4f/w7z/w6n/w6L/w6T/w6D/w6X/w6f/w6r/w6vRkf/DqP/Dr9GX/8Ou/8Os/8OE/8OF4oSr/8OJ/8Om/8OG/8O0/8O2/8Oy/8O7/8O5/8O//8OW/8Oc/8Ki/8Kj/8Kl/+KCp//Gkv/Dof/Drf/Ds//Duv/Dsf/Dkf/Cqv/Cuv/Cv//Dk//CrP/Cvf/CvP/Cof/Cq+KJqv/Cu+KJq//ilpH/4paS/8OU/+KUguKUg+KVv+KVveKVu+KVt+KVueKVteKVjuKVj+KUhuKUh+KUiuKUi+KVkf/ilKTilKvilKrilKnilKjilKfilKbilKXilaHilaLilaP/w5X/w5f/w5j/w5n/w5r/w5v/w53/w57/w6P/w7D/4pSQ4pST4pSS4pSR4pWV4pWW4pWX4pWu/+KUlOKUl+KUluKUleKVmOKVmeKVmuKVsP/ilLTilLvilLrilLnilLjilLfilLbilLXilafilajilan/4pSs4pSz4pSy4pSx4pSw4pSv4pSu4pSt4pWk4pWl4pWm/+KUnOKUo+KUouKUoeKUoOKUn+KUnuKUneKVnuKVn+KVoP/ilIDilIHilb7ilbzilbrilbbilbjilbTilITilIXilIjilInilYzilY3ilZD/4pS84pWL4pWK4pWJ4pWI4pWH4pWG4pWF4pWE4pWD4pWC4pWB4pWA4pS/4pS+4pS94pWq4pWr4pWs/8O1/8O4/8O9/8O+/8Se/8Sf/8Sw/8Sx/8WS/8WT/8We/8Wf/8Wg/8Wh/8W4/8W9/8W+/8uG/8uc/+KUmOKUm+KUmuKUmeKVm+KVnOKVneKVr//ilIzilI/ilI7ilI3ilZLilZPilZTila3/4paI/+KAlOKAlf/igJj/4oCZ/+KAmv/igJz/w5//4oCd/8+A/+KAnv/igKD/wrXOvP/igKH/4oCm/+KAsP/igLn/4oC6/+KInv/igqz/4oSi/+KIqf/iiaH/wrH/4oml/+KJpP/iiaD/4oSW/8O3/+KJiP/CsP/igq7/wrf/4oiI/+KBv//Csv/ilqDilq7/4oiF/w=="; protected override void BeforeRun() { - Console.WriteLine("Cosmos booted successfully. Let's go in Graphic Mode"); - - canvas = FullScreenCanvas.GetFullScreenCanvas(); - - canvas.Clear(Color.Blue); } - protected override void Run() + private void DoTest(Canvas aCanvas) { - try - { - mDebugger.Send("Run"); + mDebugger.Send($"Testing Canvas with mode {aCanvas.Mode}"); + aCanvas.Clear(Color.Blue); + + /* A red Point */ + var color = Color.Red; + aCanvas.DrawPoint(color, 69, 69); + + Color fetchedColor = aCanvas.GetPointColor(69, 69); + Assert.AreEqual(fetchedColor.ToArgb(), Color.Red.ToArgb(), "GetPointColor returns correct value"); + + /* A GreenYellow horizontal line */ + color = Color.GreenYellow; + aCanvas.DrawLine(color, 250, 100, 400, 100); + + /* A Black Lines larger than the canvas */ + color = Color.Black; + aCanvas.DrawLine(color, -20, 100, (int)aCanvas.Mode.Width + 20, 100); + aCanvas.DrawLine(color, -20, -20, (int)aCanvas.Mode.Width + 20, (int)aCanvas.Mode.Height + 20); + + /* An IndianRed vertical line */ + color = Color.IndianRed; + aCanvas.DrawLine(color, 350, 150, 350, 250); + + /* A MintCream diagonal line */ + color = Color.MintCream; + aCanvas.DrawLine(color, 250, 150, 400, 250); + + /* Rectangles of various colors */ + color = Color.PaleVioletRed; + aCanvas.DrawRectangle(color, 350, 350, 80, 60); + + color = Color.Chartreuse; + aCanvas.DrawCircle(color, 69, 69, 10); - /* A red Point */ - Pen pen = new Pen(Color.Red); - canvas.DrawPoint(pen, 69, 69); + color = Color.CadetBlue; + aCanvas.DrawArc(45, 45, 35, 35, color, 90, 270); - /* A GreenYellow horizontal line */ - pen.Color = Color.GreenYellow; - canvas.DrawLine(pen, 250, 100, 400, 100); + color = Color.DimGray; + aCanvas.DrawEllipse(color, 100, 69, 10, 50); - /* An IndianRed vertical line */ - pen.Color = Color.IndianRed; - canvas.DrawLine(pen, 350, 150, 350, 250); + color = Color.MediumPurple; + aCanvas.DrawPolygon(color, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275)); - /* A MintCream diagonal line */ - pen.Color = Color.MintCream; - canvas.DrawLine(pen, 250, 150, 400, 250); + /* Color.FromName */ + aCanvas.Clear(Color.FromName("Navy")); - /* A PaleVioletRed rectangle */ - pen.Color = Color.PaleVioletRed; - canvas.DrawRectangle(pen, 350, 350, 80, 60); + /* A LimeGreen rectangle */ + color = Color.LimeGreen; + aCanvas.DrawRectangle(color, 450, 300, 80, 60); - pen.Color = Color.Chartreuse; - canvas.DrawCircle(pen, 69, 69, 10); + /* A filled rectange */ + color = Color.Chocolate; + aCanvas.DrawFilledRectangle(color, 200, 150, 400, 300); - pen.Color = Color.DimGray; - canvas.DrawEllipse(pen, 100, 69, 10, 50); + /* A Bitmap image */ + aCanvas.DrawImage(bitmap, 10, 10); + aCanvas.DrawImage(letter, 50, 10); - pen.Color = Color.MediumPurple; - canvas.DrawPolygon(pen, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275)); + Bitmap GetImageTest = aCanvas.GetImage(50, 10, (int)letter.Width, (int)letter.Height); + Assert.AreEqual(GetImageTest.RawData, letter.RawData, "GetImage returns correct values"); - Console.ReadKey(); + /* Drawing BitmapHeaderV5 image */ + Bitmap v5header = new Bitmap(Convert.FromBase64String(parrot)); + aCanvas.DrawImage(v5header,0,0); + /* Drawing three bitmap images */ + // Image Credit chathurax + Bitmap bitmap2 = new Bitmap(Convert.FromBase64String("Qk2W8wAAAAAAADYAAAAoAAAAsAAAAHYAAAABABgAAAAAAGDzAAAEAAAAAAAAAAAAAAAAAAAA/f39/f39/f39/f398vLy7e3t7u7u7u7u9PT0/f39/f39/f39+/v77u7u7u7u7u7u7u7u+/v7/f39/v7+/f399fX17u7u7u7u7u7u8vLy/f39/f39/f39/f397u7u7u7u7u7u7u7u+Pj4/f39/f39/f399/f37u7u7u7u7u7u7+/v/f39/f39/f39/f398fHx7u7u7u7u7u7u9fX1/v7+/f39/f39+vr67u7u7e3t7u7u7u7u/Pz8/f39/f39/v7+9PT07u7u7u7u7u7u8/Pz/Pz8/f39/v7+/f397e3t7e3t7e3t7u7u+fn5/f39/v7+/f399/f37e3t7u7u7u7u8PDw/f39/f39/v7+/f398PDw7u7u7u7u7u7u9vb2/f39/f39/v7++fn57e3t7e3t7e3t7e3t/f39/f39/v7+/v7+8/Pz7u7u7u7u7u7u9PT0/f39/f39/f39/Pz87e3t7u7u7u7u7u7u+/v7/v7+/f39/f399fX17u7u7u7u7u7u8fHx/v7+/f39/Pz8/f397u7u7u7u7u7u7u7u+Pj4/f39/f39/f39+Pj47e3t7e3t7e3t7u7u/Pz8/Pz8/f39/f398vLy7u7u7u7u7u7u9fX1/v7+/f39/f39+/v77u7u7u7u7u7u7u7u/Pz8/f39/f39/f399PT07u7u7u7u7u7u8vLy/f39/f39/f39/Pz8/f39/f39/f39/f398vLy7u7u7u7u7+/v9PT0/v7+/f39/f39/Pz87u7u7u7u7u7u7+/v+/v7/v7+/v7+/v7+9vb27u7u7u7u7u7u8vLy/v7+/f39/v7+/v7+7u7u7u7u7u7u7+/v+fn5/v7+/v7+/f39+Pj47u7u7u7u7+/v7+/v/v7+/v7+/f39/f398vLy7u7u7u7u7u7u9vb2/v7+/f39/f39+vr67u7u7e3t7u7u7u7u/Pz8/v7+/v7+/v7+9PT07+/v7+/v7+/v8/Pz/f39/f39/v7+/f397u7u7e3t7u7u7u7u+fn5/v7+/v7+/v7+9vb27u7u7u7u7u7u8PDw/v7+/f39/v7+/v7+8PDw7u7u7u7u7u7u9/f3/v7+/f39/f39+fn57u7u7e3t7u7u7e3t/f39/v7+/v7+/v7+8/Pz7+/v7+/v7+/v9fX1/v7+/v7+/v7+/Pz87u7u7u7u7u7u7+/v+/v7/v7+/v7+/v7+9fX17u7u7u7u7u7u8vLy/v7+/f39/f39/v7+7+/v7+/v7u7u7u7u+Pj4/v7+/f39/f39+Pj47e3t7e3t7e3t7u7u/f39/f39/v7+/v7+8vLy7u7u7u7u7+/v9fX1/v7+/f39/v7++/v77u7u7u7u7u7u7+/v/Pz8/v7+/f39/v7+9PT07u7u7u7u7u7u8/Pz/f39/f39/f39/f39/f39/f39/f39/f398vLy7u7u7u7u7u7u9PT0/f39/f39/f39+/v77u7u7u7u7u7u7+/v+vr6/f39/f39/f399fX17u7u7u7u7u7u8vLy/f39/f39/f39/f397+/v7u7u7u7u7u7u+Pj4/Pz8/f39/f399/f37u7u7u7u7u7u7+/v/f39/f39/f39/f398fHx7u7u7+/v7u7u9vb2/f39/f39/f39+vr67u7u7u7u7u7u7+/v/Pz8/f39/f39/f399PT07+/v7u7u7+/v8/Pz/f39/f39/f39/f397u7u7u7u7u7u7+/v+fn5/f39/v7+/f399/f37+/v7+/v7u7u8PDw/Pz8/Pz8/Pz8/Pz87+/v7u7u7+/v7u7u9/f3/f39/f39/f39+fn57u7u7u7u7u7u7u7u/f39/f39/v7+/f398/Pz7+/v7u7u7u7u9PT0/f39/f39/f39+/v77u7u7+/v7u7u7u7u+vr6/f39/f39/f399fX17u7u7u7u7u7u8fHx/f39/f39/f39/f397+/v7+/v7u7u7+/v9/f3/f39/f39/f399/f37u7u7u7u7u7u7+/v/f39/Pz8/f39/f398vLy7u7u7+/v7+/v9fX1/f39/f39/f39+/v77u7u7+/v7+/v7u7u+/v7/f39/f39/f399PT07u7u7u7u7u7u8vLy/f39/f39/f39/f397u7u7u7u7u7u7u7u+Pj4/f39/f39/v7+9/f37e3t7u7u7u7u7+/v/f39/f39/f39/f398fHx7u7u7e3t7e3t9vb2/f39/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/f39/f398/Pz7u7u7e3t7u7u8/Pz/f39/v7+/v7+/Pz87u7u7u7u7e3t7u7u+vr6/f39/f39/f399fX17u7u7u7u7u7u8fHx/f39/f39/f39/f398PDw7u7u7u7u7u7u9/f3/f39/f39/f39+Pj47u7u7u7u7u7u7u7u/f39/f39/f39/f398vLy7u7u7e3t7u7u9fX1/f39/f397+/vxsbGtbW17u7u5OTkfHx8fHx8sbGx39/f+/v79PT07u7u7u7u7e3t8vLy/f39/f39/f39/f397u7u7u7u7e3t7u7u+Pj4/f39/f39/v7+9/f37e3t7u7u7e3t8PDw/f39/f39/f39/f398fHx7u7u7u7u7u7u9vb2/f39/f39/f39+vr67u7u7u7u7e3t7u7u/Pz8/f39/f39/f399PT07u7u7u7u7u7u8/Pz/f39/f39/f39/Pz87u7u7u7u7u7u7e3t+fn5/f39/f39/f399vb27u7u7u7u7e3t8PDw/f39/f39/f39/f398PDw7u7u7u7u7u7u9/f3/f39/f39/v7++fn57u7u7e3t7e3t7u7u7u7u7e3t7u7u7u7u+fn5/v7+/v7+/v7+9/f37u7u7+/v7u7u8PDw/v7+/v7+/v7+/v7+8fHx7u7u7u7u7u7u9vb2/f39/v7+/v7++vr67u7u7u7u7+/v7u7u/f39/v7+/v7+/v7+8/Pz7u7u7u7u7u7u8/Pz/v7+/f39/v7+/Pz87+/v7u7u7u7u7u7u+vr6/v7+/v7+/v7+9vb27u7u7u7u7u7u8fHx/v7+/v7+/f39/v7+8PDw7u7u7u7u7u7u+Pj4/v7+/v7+/v7++fn57u7u7u7u7u7u7+/v/v7+/v7+/v7+/v7+8vLy7u7u6+vrzs7On5+fbGxsNjY2EBAQS0tL29vblpaWuLi44+PjV1dXAgICCAgIJCQkWFhYjo6Ox8fH6urq8vLy/f39/v7+/v7+/v7+7+/v7u7u7u7u7u7u+fn5/v7+/f39/f39+Pj47u7u7u7u7u7u8PDw/v7+/v7+/v7+/v7+8vLy7u7u7+/v7u7u9vb2/v7+/v7+/v7++/v77u7u7u7u7u7u7u7u/Pz8/v7+/f39/v7+9PT07u7u7u7u7u7u9PT0/v7+/v7+/v7+/f397u7u7+/v7u7u7u7u+fn5/v7+/v7+/v7+9vb27u7u7u7u7u7u8fHx/v7+/v7+/v7+/v7+8PDw7+/v7u7u7u7u+Pj4/v7+/v7+/v7++fn57u7u7u7u7u7u7u7u7u7u7u7u7e3t7u7u+fn5/f39/v7+/v7+9/f37u7u7u7u7u7u8PDw/v7+/v7+/v7+/v7+8fHx7u7u7u7u7u7u9vb2/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/f39/v7+/v7+/f398/Pz7u7u7u7u7u7u8/Pz/v7+/v7+/v7+/f397u7u7u7u7u7u7u7u+vr6/v7+/f39/f399vb27u7u7u7u7u7u8fHx/f39/f39/f39/v7+8PDw7u7u7u7u7u7u+Pj4/v7+/v7+/v7++Pj47u7u7u7u7u7u7u7u/f39/f39/f399PT0r6+vYmJiIyMjBQUFAAAAAQEBAgICXl5e8/PzmJiYBwcHExMTuLi49fX1bGxsAgICAQEBAQEBAAAABAQEJSUlb29vycnJ+vr6/f39/f397+/v7u7u7u7u7u7u+fn5/f39/f39/v7++Pj47u7u7u7u7u7u8PDw/v7+/v7+/f39/v7+8fHx7u7u7u7u7u7u9vb2/f39/f39/f39+vr67u7u7u7u7u7u7u7u/Pz8/f39/f39/v7+9PT07u7u7u7u7u7u8/Pz/v7+/v7+/v7+/Pz87u7u7u7u7u7u7u7u+vr6/f39/v7+/v7+9/f37u7u7u7u7u7u8PDw/v7+/f39/f39/f398PDw7u7u7u7u7u7u9/f3/v7+/f39/f39+fn57u7u7u7u7u7u7u7u7+/v7u7u7e3t7u7u+fn5/f39/f39/v7+9vb27u7u7u7u7u7u8PDw/v7+/f39/f39/v7+8PDw7e3t7e3t7e3t9vb2/f39/f39/v7++vr67u7u7e3t7u7u7u7u/f39/f39/f39/f399PT07+/v7u7u7u7u8/Pz/v7+/v7+/v7+/Pz87u7u7e3t7u7u7u7u+vr6/f39/f39/f399vb27u7u7u7u7u7u8fHx/f39/f39/f39/f397+/v7e3t7e3t7u7u+Pj4/v7+/v7+/v7++Pj47e3t7u7u7e3t7u7u+fn5xcXFaGhoFxcXAQEBAQEBAAAAAAAAAAAAAQEBampq9/f3qampCQkJAQEBAQEBFRUVy8vL+vr6cHBwAgICAAAAAAAAAAAAAAAAAAAAAgICLS0tioqK4+Pj7u7u7u7u7e3t7u7u+Pj4/f39/f39/v7+9/f37u7u7e3t7u7u8PDw/f39/f39/v7+/f398fHx7e3t7u7u7e3t9vb2/f39/f39/f39+fn57u7u7u7u7u7u7u7u/f39/f39/f39/f398/Pz7u7u7u7u7u7u8/Pz/v7+/v7+/f39/f397e3t7e3t7u7u7u7u+vr6/v7+/v7+/f399/f37u7u7u7u7u7u8PDw/f39/f39/f39/v7+7+/v7e3t7e3t7u7u9vb2/f39/f39/f39+fn57e3t7u7u7u7u7u7u+vr6+vr6+fn5+vr69PT08fHx8fHx8fHx9PT0+fn5+vr6+vr6+fn58fHx8fHx8vLy8vLy+fn5+vr6+fn5+fn59fX18fHx8fHx8vLy9PT0+vr6+vr6+vr6+vr68vLy8fHx8vLy8vLy9/f3+vr6+vr6+fn59/f38vLy8vLy8vLy8vLy+vr6+vr6+vr6+vr68/Pz8fHx8fHx8fHx9vb2+vr6+vr6+vr6+Pj48vLy8vLy8vLy8vLy+fn5+vr6+fn5+fn59fX18fHx8vLy8vLy9PT0+fn5+fn55OTkkJCQMDAwAgICAAAAAAAAAAAAAAAAAAAAAAAAAQEBW1tb7e3trq6uCgoKAAAAAAAAAAAAAAAAGxsbzMzM7u7uXFxcAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAACgoKVVVVuLi49PT0+Pj49PT08fHx8fHx8fHx9PT0+vr6+fn5+fn5+fn58vLy8vLy8vLy8vLy+Pj4+vr6+vr6+vr69vb28vLy8vLy8fHx8/Pz+vr6+vr6+vr6+vr68vLy8vLy8vLy8fHx9/f3+vr6+vr6+vr69/f38vLy8vLy8vLy8/Pz+vr6+vr6+vr6+vr69PT08fHx8fHx8fHx9fX1+vr6+fn5+fn5+Pj48vLy8vLy8vLy8vLy+Pj4+fn5+vr6+vr69fX18vLy8vLy8fHx9PT0+vr6+vr6+vr6+vr6/f39/f39/f39/v7+8vLy7u7u7e3t7u7u9PT0/f39/f39/f39/Pz87e3t7e3t7u7u7u7u+/v7/v7+/f39/f399fX17e3t7e3t7u7u8vLy/f39/v7+/f39/v7+7u7u7e3t7u7u7u7u+Pj4/f39/f39/f39+Pj47u7u7u7u7u7u7+/v/v7+/v7+/v7+/v7+8fHx7u7u7u7u7u7u9fX1/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/f39/f399PT07e3t7u7u7u7u8fHxzs7OZGRkEhISAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASUlJ5+fntLS0EBAQAQEBAAAAAAAAAAAAAAAAAQEBJCQk0dHR6OjoSEhIAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAwMDMDAwnZ2d6Ojo7e3t7e3t7u7u9PT0/f39/f39/f39/Pz87u7u7u7u7u7u7u7u+/v7/v7+/v7+/v7+9vb27u7u7u7u7e3t8fHx/f39/v7+/v7+/v7+7+/v7u7u7u7u7u7u+Pj4/v7+/v7+/f39+Pj47u7u7u7u7u7u7+/v/f39/v7+/v7+/f398vLy7u7u7e3t7e3t9fX1/f39/f39/v7++/v77u7u7u7u7u7u7+/v+/v7/f39/v7+/v7+9PT07u7u7u7u7u7u8vLy/v7+/v7+/v7+/v7+/v7+/v7+/v7+/f398vLy7u7u7e3t7u7u9PT0/f39/f39/f39+/v77u7u7u7u7u7u7u7u+/v7/f39/f39/v7+9fX17u7u7e3t7u7u8fHx/f39/v7+/f39/f397u7u7u7u7e3t7u7u+Pj4/v7+/f39/v7+9/f37e3t7u7u7u7u7+/v/v7+/f39/f39/f398fHx7u7u7e3t7e3t9fX1/f39/f39/v7++/v77u7u7e3t7e3t7u7u/Pz8/f39/v7+/f399PT07+/v7u7uv7+/TExMBgYGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBODg45ubmwcHBFRUVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBLi4u29vb5ubmNjY2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBIyMjlpaW6urq7+/v9PT0/v7+/f39/v7+/Pz87u7u7e3t7u7u7u7u+vr6/f39/f39/f399fX17u7u7e3t7e3t8fHx/v7+/v7+/v7+/f397+/v7u7u7e3t7e3t+Pj4/f39/v7+/v7++Pj47u7u7u7u7u7u7+/v/v7+/f39/f39/f398fHx7e3t7u7u7e3t9fX1/f39/f39/f39+/v77u7u7e3t7e3t7+/v+/v7/f39/f39/f399PT07u7u7e3t7e3t8vLy/f39/f39/f39/f39/v7+/f39/v7+/v7+8vLy7u7u7u7u7e3t9PT0/f39/f39/f39+/v77u7u7u7u7u7u7u7u+vr6/f39/f39/f399fX17u7u7u7u7u7u8vLy/f39/f39/f39/f397u7u7u7u7e3t7e3t+Pj4/f39/f39/f399/f37e3t7u7u7u7u7+/v/f39/f39/f39/f398fHx7e3t7e3t7u7u9fX1/f39/f39/f39+vr67e3t7u7u7u7u7u7u/Pz8/f39/f39/Pz88/Pz0dHRWVlZBQUFAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJCQk4uLi19fXGxsbAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPDw87Ozs39/fIiIiAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBMjIysbGx8vLy4uLi/Pz8/Pz8/Pz87u7u7u7u7u7u7u7u+vr6/f39/f39/f399fX17u7u7e3t7u7u8fHx/f39/f39/f39/f397+/v7u7u7u7u7u7u9/f3/f39/v7+/v7++Pj47u7u7e3t7u7u7+/v/f39/f39/v7+/f398vLy7e3t7e3t7e3t9fX1/f39/f39/f39+vr67u7u7u7u7u7u7u7u+/v7/f39/f39/f399PT07u7u7u7u7e3t8vLy/f39/f39/f39/f399vb29vb29fX19vb29vb29fX19fX19vb29vb29fX19vb29vb29vb29fX19vb29fX19fX19fX19vb29vb29fX19fX19vb29fX19vb29vb29vb29vb29fX19fX19fX19fX19fX19fX19fX19vb29fX19fX19fX19fX19fX19vb29fX19vb29vb29vb29fX19fX19fX19fX19fX19vb29vb29vb29vb29fX19fX19fX19fX19vb29PT06OjoioqKjo6OgICAEBAQAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBEhISyMjI4uLiLi4uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICV1dX8fHxxcXFEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFV1dXOjo6WFhYz8/P9fX19fX19fX19fX19fX19vb29fX19vb29fX19fX19vb29vb29fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19vb29fX19fX19fX19fX19fX19fX19fX1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e3t7u7u7e3t8PDw/f39/f39/f39/f398PDw7e3t7e3t7u7u9vb2/v7+/f39/f39+vr67u7u7e3t7e3t7u7u/f39/f39/v7+/f396+vrnJycLy8vAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAISEh7e3t+vr6/f39/f39/v7+9fX17u7u7e3t7e3t8PDw/f39/f39/f39/f397+/v7e3t7e3t7u7u9/f3/f39/f39/f39+Pj47u7u7u7u7e3t2traIyMjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwsL2dnZXl5eAAAAAAAAAAAAAAAAAAAAAAAAHR0d8/PzQUFBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhISE7e3t7e3t7u7u+fn5/f39/f39/v7+9/f37u7u7u7u7e3t7+/v/f39/f39/f39/f398fHx7u7u7u7u7u7u9vb2/f39/f39/f39+vr6u7u7AQEBAAAAAAAAAAAAAAAAAAAAAAAAAQEBMzMzqKio6enp8/Pz/f39/f39/f39/Pz87e3t7u7u7e3t7u7u+vr6/f39/f39/f399vb27u7u7u7u7u7u8PDw/f39/f39/f39/f397+/v7u7u7e3t7e3t9vb2/f39/v7+/f39+fn57u7u7u7u7u7u7e3t9/f39/f39vb29/f39PT09PT09PT09PT09fX19/f39/f39/f39/f39PT09PT09PT08/Pz9/f39/f39/f39/f39vb29PT09PT09PT09fX19/f39/f39/f39/f39PT08/Pz9PT09PT09vb29/f38vLynp6eHBwcAQEBAQEBAAAAAAAAAAAAAAAAISEh9fX19PT09PT09PT09PT09fX19/f39/f39/f39vb29PT09PT09PT09PT09/f39/f39/f39/f39fX19PT09PT09PT09fX19/f39vb29vb2goKCAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBbm5u8/PzSkpKAAAAAAAAAAAAAAAAAAAAAAAAFhYW6+vrwcHBBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAg6urq9vb29/f39fX19PT09fX19PT09fX19/f39/f39/f39/f39PT09PT09PT09PT09vb29/f39/f39/f39vb29PT08/Pz9PT09PT0xMTEAQEBAAAAAAAAAAAAAAAAAAAAFRUVlZWV8vLy9/f39vb29vb29PT09PT09PT09PT09/f39/f39/f39/f39fX19PT09PT09PT09vb29/f39/f39/f39vb29PT09PT09PT09PT09vb29/f39/f39/f39fX19PT09PT09PT09fX19/f39/f39/f39/f3/f39/f39/f39/f398vLy7u7u7u7u7e3t9PT0/f39/f39/Pz8+/v77e3t7u7u7e3t7e3t+vr6/f39/f39/v7+9fX17u7u7e3t7e3t8vLy/f39/f39/f39/f397u7u7u7u7e3t7u7u+Pj4/f39/f39/f395eXlYGBgBQUFAAAAAAAAAAAAAAAALCws/Pz88fHx7u7u7e3t7u7u9fX1/f39/f39/f39+fn57u7u7e3t7e3t7e3t/Pz8/f39/f39/f399PT07u7u7u7u7u7u8/Pz/f39/Pz80NDQDw8PAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAHR0d39/f7e3tOjo6AAAAAAAAAAAAAAAAAAAAAAAAEBAQ4uLi7e3tYWFhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBhoaG/Pz8/f398vLy7u7u7u7u7e3t8/Pz/f39/f39/f39/Pz87u7u7u7u7u7u7e3t+vr6/f39/f39/f399fX17u7u7e3t7e3t8fHx1tbWBAQEAAAAAAAAAAAAAgICS0tL1dXV9/f3/f39/v7+/f39+Pj47e3t7e3t7u7u7u7u/f39/f39/f39/f398fHx7u7u7u7u7u7u9fX1/v7+/f39/f39+vr67e3t7e3t7e3t7u7u+/v7/f39/f39/f399PT07e3t7e3t7u7u8vLy/f39/f39/f39/f39/f39/f39/f39/f398fHx7u7u7u7u7u7u9PT0/f39/v7+/f39+/v77u7u7u7u7e3t7e3t+/v7/f39/f39/f399fX17u7u7e3t7e3t8fHx/f39/f39/f39/f397+/v7u7u7e3t7u7u+Pj4/f39/f39/f39+Pj47OzsnZ2dDw8PAQEBAAAAAAAARkZG/f398fHx7u7u7e3t7e3t9fX1/v7+/f39/f39+vr67u7u7u7u7u7u7e3t/Pz8/f39/f39/v7+9PT07u7u7u7u7u7u8vLy/Pz88PDwNDQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBCAgIs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++Pj47u7u7u7u7e3t7+/v/f39/f39/v7+/v7+8fHx7e3t7e3t7u7u9vb2/f39/f39/f39+vr67e3t7e3t7u7u7u7u/Pz8/f39/v7+/f398/Pz7e3t7e3t7e3t8/Pz/f39/f39/f39/Pz87e3t7u7u7u7u7u7u+vr6/f39/f39/f399/f37u7u7u7u7u7u8PDw/f39/f39/f39/f398PDw7u7u7u7u7u7u9/f3/f39/f39/f39+fn57u7u7u7u7u7u7u7u9/f39/f39vb29vb29fX19PT09fX19fX19fX19/f39/f39/f39vb29PT09fX19fX19PT09vb29vb29vb29vb29fX19PT09PT09PT09fX19/f39vb29vb29/f39PT09PT09PT09fX19vb29vb29vb29vb29vb29PT09fX19PT09PT09vb29vb29vb29vb29fX19PT09PT09PT09fX19vb29vb29vb29vb29PT09PT09PT09PT09vb29vb29vb29vb29fX19PT09PT09fX19fX1cXFxAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAAAAAAAAAAAAAAAAAAAAAAAWlpa9PT09PT09PT09fX19fX19vb29vb29vb29vb29PT09PT09PT09PT09vb29vb29vb29vb29fX19PT09PT09fX19fX19vb29vb29vb29vb29PT09PT09PT09PT09fX19vb29vb29vb29vb29PT09PT09PT09PT09vb29vb29vb29vb29fX19PT09fX19PT09fX19vb29vb29vb29vb29fX19PT09PT09PT09/f39vb29vb29vb29fX19PT09fX19PT09fX19vb29vb29vb29vb2/v7+/v7+/f39/f398vLy7u7u7e3t7e3t9PT0/v7+/v7+/v7++/v77u7u7u7u7u7u7e3t+/v7/f39/f39/f399fX17u7u7e3t7u7u8fHx/f39/v7+/f39/f397+/v7u7u7u7u7e3t+Pj4/f39/f39/f39+Pj47u7u7e3t7e3t7+/v/f39/f39/f39/v7+8fHx7u7u7e3t7u7u9fX1/f39/f39/v7++vr67u7u7u7u7e3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b29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29fX19vb29vb29vb29vb29vb29vb29vb29fX19vb29vb29vb29vb29vb29vb29fX19vb29vb29vb29vb29vb29vb29PT0Ojo6AAAAAAAABgYGAQEBkpKS9vb29fX19vb29vb29vb29fX19vb29vb29vb29vb29vb29fX19vb29fX19fX19vb29vb29fX1UVFRAwMDLS0tAAAAAAAAOTk58/Pz9vb29vb29vb29vb29fX19fX19vb29vb29vb29vb29vb29vb29fX19fX19fX19fX19vb29vb29/f39vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29fX19fX19fX19vb29vb29vb29vb29vb29fX19vb29vb29vb29vb29vb29/f39vb29fX19vb29fX19fX19vb29vb29vb29vb29vb29fX19fX19fX19fX19vb29vb29vb29vb29vb29vb29vb29fX19vb29vb29vb29vb29vb2/v7+/v7+/v7+/f398vLy7e3t7e3t7u7u9PT0/f39/v7+/v7++/v77u7u7u7u7u7u7u7u+/v7/v7+/f39/f399fX17u7u7u7u7u7u8vLy/f39/f39/f39/f397u7u7e3t7u7u7+/v+Pj4/f39/f39/f39+Pj47e3t7e3t7u7u7+/v/f39/f39/f39/Pz88PDw7e3t7e3t7u7u9fX1/f39/f39/f39+vr67u7u7e3t7e3t7e3t/Pz8/f39/f39/f399PT07u7u7u7u7u7u8vLy/f39/f39/f39/Pz8mpqaAQEBAAAAAAAALi4u9PT0/f39/f399vb27e3t7e3t7e3t8PDw/f39/Pz8/f39/f397+/v7e3t7u7u7u7u9vb2/f39/f39y8vLCAgIERERAAAAAgICqKio/Pz8/f39/f39/f398/Pz7u7u7u7u7u7u9PT0/f39/f39/f39/Pz87u7u7u7u7e3t7e3t+vr6/v7+/v7+/f399vb27e3t7u7u7e3t8fHx/f39/f39/f39/f397+/v7e3t7u7u7e3t9/f3/f39/Pz8/f39+Pj47u7u7u7u7u7u7u7u/f39/f39/v7+/f398fHx7u7u7e3t7e3t9PT0/v7+/f39/f39+vr67e3t7e3t7e3t7u7u+/v7/f39/f39/v7+9PT07e3t7e3t7e3t8vLy/f39/f39/f39/f39/v7+/v7+/v7+/v7+8vLy7u7u7u7u7u7u9fX1/f39/v7+/f39+/v77u7u7u7u7u7u7u7u+/v7/f39/v7+/v7+9fX17u7u7u7u7u7u8vLy/f39/v7+/v7+/v7+7+/v7u7u7u7u7+/v+fn5/v7+/v7+/v7+9/f37u7u7u7u7+/v7+/v/f39/f39/v7+/v7+8vLy7u7u7u7u7u7u9vb2/f39/f39/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/v7+/f399PT07u7u7u7u7u7u8/Pz/v7+/f39/v7+/f395OTkHBwcAQEBAwMDrq6u/f39/f39/v7+9/f37u7u7u7u7u7u8fHx/v7+/f39/v7+/v7+8fHx7u7u7u7u7e3t9/f3/v7+/f39/f39WlpaAQEBAQEBNjY26+vr/f39/v7+/v7+/v7+8/Pz7u7u7u7u7u7u9PT0/f39/v7+/v7+/Pz87u7u7u7u7u7u7u7u+/v7/v7+/v7+/v7+9fX17u7u7+/v7+/v8vLy/v7+/v7+/f39/v7+7+/v7u7u7u7u7e3t+Pj4/v7+/f39/v7++Pj47u7u7+/v7u7u7+/v/v7+/v7+/v7+/v7+8vLy7u7u7u7u7u7u9fX1/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/v7+/v7+/f399PT07u7u7u7u7+/v8/Pz/f39/f39/v7+/v7+/v7+/v7+/v7+/v7+8vLy7u7u7u7u7u7u9PT0/v7+/f39/f39+/v77u7u7u7u7u7u7u7u+/v7/f39/f39/f399fX17u7u7u7u7u7u8vLy/v7+/f39/v7+/v7+7u7u7u7u7u7u7u7u+fn5/v7+/v7+/v7+9/f37u7u7u7u7u7u7+/v/f39/f39/f39/v7+8vLy7u7u7u7u7u7u9vb2/f39/f39/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/v7+/f399PT07u7u7u7u7u7u8/Pz/f39/f39/v7+/f397e3tenp6AQEBPz8/9vb2/Pz8/f39/v7+9/f37u7u7u7u7u7u8fHx/f39/f39/v7+/v7+8fHx7u7u7u7u7u7u9/f3/v7+/f39/v7+0dHRCAgIAgICqqqq7+/v/v7+/v7+/v7+/v7+8/Pz7u7u7u7u7u7u9PT0/f39/v7+/f39/Pz87u7u7u7u7u7u7u7u+/v7/v7+/f39/v7+9fX17u7u7u7u7u7u8vLy/f39/v7+/f39/v7+7+/v7u7u7u7u7u7u9/f3/v7+/f39/v7++Pj47u7u7u7u7u7u7+/v/v7+/v7+/f39/v7+8vLy7u7u7u7u7u7u9vb2/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/v7+/v7+/v7+9PT07u7u7u7u7u7u8vLy/f39/f39/v7+/f39+fn5+fn5+fn5+fn59PT08vLy8vLy8vLy9PT0+fn5+fn5+fn5+fn58vLy8vLy8vLy8vLy+Pj4+fn5+fn5+fn59fX18vLy8vLy8vLy9PT0" + + "+fn5+vr6+fn5+fn58vLy8vLy8vLy8vLy9vb2+fn5+fn5+fn59vb28vLy8vLy8vLy8vLy+fn5+fn5+fn5+fn58/Pz8vLy8vLy8vLy9fX1+fn5+fn5+fn5+Pj48vLy8vLy8vLy8vLy+Pj4+fn5+fn5+vr69PT08vLy8vLy8vLy9PT0+fn5+fn5+fn5+fn58vLy2traExMTvLy89/f3+fn5+fn5+fn59vb28vLy8vLy8vLy8/Pz+fn5+fn5+fn5+fn58/Pz8fHx8fHx8vLy9vb2+fn5+fn5+fn59/f3X19fOjo67u7u8vLy+fn5+fn5+fn5+vr69PT08fHx8vLy8vLy9PT0+fn5+fn5+fn5+fn58vLy8vLy8vLy8vLy+Pj4+fn5+fn5+fn59fX18vLy8vLy8vLy9PT0+fn5+fn5+fn5+fn58vLy8vLy8vLy8vLy9vb2+fn5+vr6+vr69/f38vLy8vLy8vLy8vLy+fn5+fn5+fn5+fn59PT08vLy8fHx8vLy9vb2+fn5+fn5+fn5+Pj48vLy8vLy8vLy8vLy+Pj4+fn5+fn5+fn59fX18vLy8vLy8vLy9PT0+fn5+fn5+vr6+fn57u7u7u7u7u7u7u7u+fn5/f39/f39/f399vb27u7u7u7u7u7u7+/v/f39/v7+/f39/f398fHx7u7u7u7u7e3t9vb2/v7+/f39/v7++fn57u7u7u7u7u7u7e3t/f39/f39/v7+/f398/Pz7u7u7u7u7u7u8/Pz/v7+/f39/v7+/Pz87u7u7u7u7u7u7u7u+vr6/f39/f39/f399vb27u7u7u7u7u7u8fHx/f39/f39/f39/f397+/v7u7u7u7u7u7u9/f3/f39/v7+/f39+fn57u7u7u7u7u7u7u7u/f39/f39tbW1/Pz88fHx7e3t7u7u7u7u9PT0/v7+/f39/f39+/v77u7u7u7u7u7u7e3t+/v7/f39/v7+/v7+9fX17u7u7u7u7u7u8vLy3d3dxsbG/f39/f397u7u7u7u7u7u7u7u+Pj4/f39/f39/v7+9/f37u7u7u7u7u7u7+/v/f39/f39/f39/f398fHx7u7u7u7u7u7u9fX1/f39/v7+/v7++vr67u7u7u7u7u7u7e3t/Pz8/f39/f39/v7+8/Pz7u7u7u7u7u7u8/Pz/f39/f39/f39/Pz87u7u7u7u7u7u7e3t+fn5/f39/Pz8/v7+9/f37u7u7u7u7u7u8fHx/f39/f39/f39/f398PDw7u7u7e3t7e3t9vb2/f39/f39/v7++fn57u7u7u7u7u7u7u7u7+/v7u7u7e3t7e3t+fn5/f39/f39/v7+9/f37e3t7u7u7u7u8PDw/f39/v7+/v7+/f398fHx7u7u7u7u7u7u9vb2/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/f39/v7+/f39/f398/Pz7u7u7u7u7u7u8/Pz/v7+/v7+/v7+/Pz87u7u7u7u7e3t7u7u+vr6/f39/f39/f399vb27e3t7u7u7u7u8fHx/f39/f39/f39/v7+7+/v7u7u7u7u7u7u+Pj4/v7+/v7+/v7++fn57u7u7u7u7e3t7u7u/f39/f39/f39/f398fHx7u7u7e3t7u7u9fX1/f39/f39/v7++/v77u7u7u7u7u7u7e3t+/v7/v7+/v7+/v7+9fX17u7u7u7u7u7u8vLy/f39/f39/v7+/v7+7+/v7u7u7u7u7u7u+Pj4/v7+/v7+/f399/f37u7u7u7u7u7u7+/v/v7+/v7+/v7+/f398fHx7u7u7e3t7u7u9vb2/f39/f39/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/v7+/v7+9PT07u7u7u7u7u7u8/Pz/f39/f39/v7+/f397u7u7u7u7u7u7u7u+vr6/v7+/v7+/v7+9vb27u7u7u7u7u7u8PDw/f39/f39/f39/v7+8PDw7u7u7e3t7u7u9/f3/f39/f39/f39+fn57u7u7u7u7u7u7u7u7u7u7u7u7e3t7e3t+fn5/f39/f39/f399/f37u7u7u7u7u7u7+/v/f39/v7+/v7+/f398PDw7u7u7u7u7u7u9/f3/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/v7+/f399PT07u7u7u7u7u7u8/Pz/f39/f39/f39/f397+/v7u7u7e3t7u7u+vr6/v7+/f39/v7+9vb27u7u7u7u7u7u8fHx/v7+/v7+/f39/f397+/v7u7u7u7u7u7u+Pj4/f39/f39/v7++fn57u7u7u7u7u7u7u7u/f39/f39/f39/f398vLy7u7u7u7u7u7u9fX1/f39/f39/f39+/v77u7u7+/v7u7u7u7u+/v7/f39/v7+/v7+9fX17u7u7u7u7u7u8vLy/f39/v7+/f39/f397+/v7u7u7u7u7u7u+Pj4/v7+/v7+/v7++Pj47+/v7u7u7u7u7+/v/f39/v7+/f39/f398fHx7u7u7u7u7u7u9fX1/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/Pz8/f39/v7+/f399PT07+/v7u7u7u7u8/Pz/f39/v7+/v7+/f397u7u7u7u7e3t7u7u+vr6/f39/f39/f399/f37u7u7u7u7u7u8fHx/f39/f39/f39/v7+8PDw7u7u7u7u7u7u9/f3/f39/v7+/v7++fn57u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u+fn5/f39/f39/f399/f37u7u7u7u7+/v8PDw/v7+/v7+/v7+/f398fHx7u7u7u7u7u7u9/f3/v7+/v7+/v7++vr67u7u7u7u7u7u7u7u/f39/v7+/v7+/v7+9PT07+/v7u7u7u7u8/Pz/f39/f39/v7+/f397+/v7u7u7u7u7u7u+vr6/v7+/v7+/v7+9vb27+/v7+/v7+/v8fHx/v7+/f39/v7+/v7+7+/v7u7u7+/v7u7u9/f3/f39/v7+/v7++fn57+/v7+/v7u7u7u7u/v7+/f39/f39/f398vLy7u7u7+/v7u7u9fX1/f39/f39/f39+/v77+/v7+/v7u7u7u7u+/v7/f39/v7+/f399fX17+/v7+/v7u7u8vLy/f39/v7+/f39/f397+/v7+/v7+/v7u7u+fn5/f39/v7+/v7++Pj47+/v7u7u7u7u8PDw/v7+/v7+/f39/f398fHx7u7u7+/v7u7u9fX1/v7+/f39/v7++vr67+/v7u7u7u7u7u7u/Pz8/f39/f39/v7+9PT07+/v7+/v7u7u8/Pz/v7+/v7+/v7+/f397+/v7u7u7u7u7u7u+vr6/f39/f39/v7+9/f37+/v7+/v7+/v8PDw/v7+/v7+/f39/f398PDw7+/v7u7u7u7u9/f3/f39/v7+/f39+fn57+/v7+/v7+/v7u7u")); - /* Let's try to change mode...*/ - canvas.Mode = new Mode(800, 600, ColorDepth.ColorDepth32); + //image with alpha channel + Bitmap bitmap3 = new Bitmap(Convert.FromBase64String("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z//W0s//oqCd/yMiIf8pJyX/Kyoo/0NCP/9HRUP/KSgm/zAvLP86Ojb/NTUx/0E/Pf/Rz8z/1dLP/9bT0P+BgH77BwcHPAAAAGasqqj/1dPQ/9bU0f+ysK7/LCoo/z06OP89Ojf/PTo3/z06N/89Ojf/PTo3/zUzMP+Sj43/1dPQ/9XT0P+Wk5H/MjAu/z07OP89Ojf/PTo3/z06N/89Ojf/PTo3/z06N/89Ojf/PTo3/z06N/89Ojf/PTo3/yUkIf+zsa7/1tPQ/9bU0f9qaWb/o6Kf/87Myf/V0s//1dPQ/9LPzP9ramj/MC8s/z06N/8uLSr/kI2L" + + "/9bU0f/Dwb3/KCYk/z06OP8uLCr/pqSh/9XT0P/c2db/UVBO/z07OP89Ozf/Ozk2/zEwLv/W09D/1dPQ/9XT0f86OTf/PDo3/zo4Nf94dXP/19XS/6Sin/8vLiv/PTo4/z06N/89Ojf/PTo3/z06N/89Ojf/PTo3/z06N/89Ojf/PTo3/z06N/89Ojj/JyYj/6yqp//W09D/1dPQ/8vJxv9oZmT/rayp/9LPzP/V0tD/1dPQ/8jGw/9XVlP/OTg1/z06N/8qKif/xcPA/9XT0P/V09D/pKKf/yAgIGYKCAqFv726/9XT0P/Z19T/m5qX/zU0Mv8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8wLy3/zczK/9bU0f/W1NH/0M3K/z09Ov8+PTn/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov88Ozj/Xl1b/9bT0f/W1NH/19XS/9fV0v/W1NH/1tTR/9bU0f/W1NH/vLq3/ygmJP8+PTr/OTc1/15cWv/Y1dL/z83K/ysqKP8+PTr/MjEu/5ual//Y1dL/xMK//y4tK/8+PTr/JyUk/zIwLv8vLiv/tLGv/9fV0v/X1dL/NzY1/z08Of85ODX/h4aD/9fV0v/Sz8z/QkA//z08Of8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/z49Ov8+PTr/Pj06/zw7OP9VVFL/09HO/9bU0f/W1NH/19XS/9fV0v/W1NH/1tTR/9bU0f/W1NH/sK6s/y8uLP8+PTr/MzIw/6mnpP/X1NL/1tTR/7i2s/8zMzN6KikpmMfFw//X1dL/29jV/4yLiP87Ojf/QD87/0A/O/9APzv/QD87/0A/O/9APzv/Ozo4/97b2P/X1dL/19XS/9rY1f9NS0r/Pz46/0A/O/9APzv/QD87/0A/O/9APzv/QD87/0A/O/9APzv/QD87/0A/O/9APzv/QD87/ycmI//CwL3/19XS/9fV0v/X1dL/19XS/9fV0v/X1dL/3NnW/4aEgv8xLyz/QD87/zg2M/9qaWb/2dfT/9jW0/8yMjD/Pz47/zY1Mf+SkI7/2tjV/6Ohnv8vLiv/PDs4/01MSv80MzH/PDs3/318ef/Y1tP/2dbT/zY1M/9APzv/OTg1/5WTkf/Y1tP/2dfU/1RSUf8+PTr/QD87/0A/O/9APzv/QD87/0A/O/9APzv/QD87/0A/O/9APzv/QD87/0A/O/9APzv/JSQi/7u5tv/X1dL/19XS/9fV0v/X1dL/19XS/9fV0v/X1dL/1NLP/3Fvbf87Ojb/QD87/zMyL/+zsq//19XS/9fV0v+0sq//MC8wdjc2NaLNysf/2NXS/9rX1P9/fnv/Pj07/0JAPv9CQD7/QkA+/0JAPv9CQD7/QT88/0ZEQ//c2db/2NXS/9jV0v/Mysj/Ojk2/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/0JAPv8uLSr/oJ2b/9jV0v/Y1dL/2NXS/9jW0//Y1dL/vLq3/2hnZf8vLSv/QkA9/0JAPf8wLiv/oZ+e/9nW0//b2NX/QkA//0E/Pf86OTb/iYeE/+He2/9lZGL/Ojk2/zg2M/+SkY7/UlFP/0E/PP9DQkH/2NbT/9rX1P81NDL/Q0E//zo3Nf+ioJ7/2dbT/9DOy/8+PTr/QkA9/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/0JAPv9CQD7/QkA+/zAvLP+YlpP/2NXS/9jV0v/Y1dL/2NXS/9nX1P/W09D/srCt/1FQTv8xLyz/QkA9/0NAPv8rKSf/y8nG/9jV0v/Z1dL/oJ+c/xYXF186OTmnz83K/9jW0//a2NX/fHl4/0A/PP9EQj//REI+/0RCPv9EQj7/REI+/0JBPv9MS0n/3NrX/9jX1P/Z19T/xsTB/zY0Mv9FQz//REI+/0RCPv9EQj7/REI+/0RCPv9EQj7/REI+/0RCPv9EQj7/REI+/0RCPv9EQj//Nzcz/4uJh//Y1tP/2NfU/9nX1P+rqab/U1JP/zAvLP87OTf/REM//0RCP/88Ozf/Y2Jg/9TSz//Z19T/29nW/1NTUP9CQD3/Pz06/318ev/f3dn/MzEv/0NCPv8yMS7/v7y5/4OCgP8/Pjr/LSwq/7Syr//c2tf/NTQy/0RDP/84NzT/qqmm/9nX1P/Mycb/NjYz/0VDP/9EQj//REI//0RCP/9EQj//REI//0RCPv9EQj//REI+/0RCPv9EQj7/Q0I+/0RCP/86ODX/hIOA/9nX1P/Z19T/2dfU/9nW0/+Zl5T/SkhH/zAvLP8+PDn/REM//0VDP/80My//dHJw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")); - //If the background is not redrawn, it gets corrupted (this happens more in VmWare) - canvas.Clear(Color.Blue); + aCanvas.DrawImage(bitmap, 0, 0); + aCanvas.DrawImage(bitmap2,200, 0); + //Scale Bitmap + aCanvas.DrawImage(bitmap,0,0,50,50); - /* A LimeGreen rectangle */ - pen.Color = Color.LimeGreen; - canvas.DrawRectangle(pen, 450, 450, 80, 60); + aCanvas.DrawImageAlpha(bitmap3, 0, 300); - /* A filled rectange */ - pen.Color = Color.Chocolate; - canvas.DrawFilledRectangle(pen, 200, 150, 400, 300); + /* Drawing ellipses */ + aCanvas.DrawEllipse(color, 100, 69, 10, 50); + aCanvas.DrawEllipse(color, 100, 69, 10, 50); + aCanvas.DrawEllipse(color, 100, 69, 10, 50); - canvas.DrawImage(bitmap, new Point(0, 0)); + /* Create a PC Screen Font */ + color = Color.White; + Font font = PCScreenFont.Default; - Console.ReadKey(); + /* Create a PC Screen 2 Font */ + color = Color.White; + Font font2 = PCScreenFont.LoadFont(Convert.FromBase64String(psf2Font)); + + /* Draw text */ + aCanvas.DrawString("Hello Cosmos World!", font, color, 0, 16 * 5); + aCanvas.DrawString("font data test=" + font.Width + "x" + font.Height, font, color, 0, 16 * 6); + + /* Draw char */ + aCanvas.DrawChar('A', font, color, 0, 16 * 7); + + /* Draw text */ + aCanvas.DrawString("Hello Cosmos World!", font2, color, 100, 16 * 5); + aCanvas.DrawString("font data test=" + font2.Width + "x" + font2.Height, font2, color, 100, 16 * 6); + + /* Draw char */ + aCanvas.DrawChar('A', font2, color, 100, 16 * 7); + + aCanvas.Display(); + + aCanvas.Disable(); + + Console.WriteLine("Back in text mode"); + Console.WriteLine("Freed: " + Heap.Collect()); + + mDebugger.Send($"Test of Canvas with mode {aCanvas.Mode} executed successfully"); + } + + protected override void Run() + { + mDebugger.Send("Run"); - TestController.Completed(); + + //Test changing font + PCScreenFont screenFont = PCScreenFont.Default; + VGAScreen.SetFont(screenFont.CreateVGAFont(), screenFont.Height); + Console.WriteLine("ABAKDSKDNKSNJNFJGNFLPÜQOJOPJD"); + Console.WriteLine("I(39u0pwoejJIosjfppkspjfsdjfp"); + + TestBitmaps(); + TestColorClass(); + + /* First test with the DefaultMode */ + Canvas canvas = FullScreenCanvas.GetFullScreenCanvas(); + DoTest(canvas); + + DoTest(FullScreenCanvas.GetFullScreenCanvas(new Mode(800, 600, ColorDepth.ColorDepth32))); + DoTest(FullScreenCanvas.GetFullScreenCanvas(new Mode(1024, 768, ColorDepth.ColorDepth32))); + DoTest(FullScreenCanvas.GetFullScreenCanvas(new Mode(1280, 1024, ColorDepth.ColorDepth32))); + DoTest(FullScreenCanvas.GetFullScreenCanvas(new Mode(1280, 720, ColorDepth.ColorDepth32))); + + VGACanvas vGACanvas = new VGACanvas(new Mode(320, 200, ColorDepth.ColorDepth8)); + DoTest(vGACanvas); + vGACanvas = new VGACanvas(new Mode(720, 480, ColorDepth.ColorDepth4)); + DoTest(vGACanvas); + vGACanvas = new VGACanvas(new Mode(640, 480, ColorDepth.ColorDepth4)); + DoTest(vGACanvas); + Console.BackgroundColor = ConsoleColor.Black; + for (int i = 0; i < 16; i++) + { + Console.ForegroundColor = (ConsoleColor)i; //Ensure that the correct coloures are used + Console.WriteLine("Back in text mode 2"); + } + Console.ForegroundColor = ConsoleColor.White; + + TestController.Completed(); + } + + private void DoTest(VGACanvas vGACanvas) + { + mDebugger.Send($"Testing VGA Canvas with mode {vGACanvas.Mode}"); + vGACanvas.Clear(Color.Wheat); + for (int x = 0; x < 20; x++) + { + for (int y = 0; y < 20; y++) + { + vGACanvas.DrawPoint((uint)(x % (2 << ((int)vGACanvas.Mode.ColorDepth - 1))), 5 + x, 5 + y); + } } - catch (Exception e) + + for (int x = 0; x < 20; x++) + { + for (int y = 0; y < 20; y++) + { + vGACanvas.DrawPoint((uint)(x % (2 << ((int)vGACanvas.Mode.ColorDepth - 1))), 25 + x, 5 + y); + } + } + + vGACanvas.DrawLine(Color.Red, 10, 10, 10, 50); + + vGACanvas.Disable(); + for (int i = 0; i < 10; i++) { - mDebugger.Send("Exception occurred: " + e.Message); - mDebugger.Send(e.Message); - TestController.Failed(); + Console.WriteLine("Back in text mode"); } + + mDebugger.Send($"Test of Canvas with mode {vGACanvas.Mode} executed successfully"); + } + + private void TestBitmaps() + { + Assert.IsTrue(bitmap.Width == 10 && bitmap.Height == 10, "Bitmap width and height set correctly"); + Assert.IsTrue(bitmap.RawData.Length == 100, "Bitmap data size makes sense"); + MemoryStream savedBitmap = new MemoryStream(); + letter.Save(savedBitmap, ImageFormat.BMP); + var bitmapData = savedBitmap.ToArray(); + Assert.IsTrue(EqualityHelper.ByteArrayAreEquals(bitmapData, letterData), "Saving a bitmap creates the same data as used to create it"); + Bitmap letter2 = new Bitmap(bitmapData); + Assert.IsTrue(EqualityHelper.IntArrayAreEquals(letter2.RawData, letter.RawData), "Creating a new bitmap from saved bitmap creates same bitmap"); + } + + private void TestColorClass() + { + Color testColor = Color.AliceBlue; + Assert.AreEqual(testColor.ToString(), "Color [AliceBlue]", "ToString() should return the name of the color for named colors."); + testColor = Color.FromArgb(123, 45, 67); + Assert.AreEqual(testColor.ToString(), "Color [A=255, R=123, G=45, B=67]", "ToString() should return the ARGB values for unnamed colors."); + testColor = Color.Aqua; + Assert.AreEqual(testColor.Name, "Aqua", "Name should return the name of the color for named colors."); + testColor = Color.FromArgb(255, 123, 45, 67); + Assert.AreEqual(testColor.ToArgb(), unchecked((int)0xFF7B2D43), "ToArgb() should return the correct integer representation of the color."); + testColor = Color.FromArgb(255, 0, 0); + Color redColor = Color.Red; + Assert.IsTrue(testColor == redColor, "The == operator should work correctly for comparing colors."); } } -} +} \ No newline at end of file diff --git a/Tests/Kernels/GraphicTest/packages.lock.json b/Tests/Kernels/GraphicTest/packages.lock.json new file mode 100644 index 0000000000..e81a7756fb --- /dev/null +++ b/Tests/Kernels/GraphicTest/packages.lock.json @@ -0,0 +1,2729 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.compiler.tests.bcl": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.Plugs": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/MemoryOperationsTest/Kernel.cs b/Tests/Kernels/MemoryOperationsTest/Kernel.cs index f0e680db0f..51ae35148c 100644 --- a/Tests/Kernels/MemoryOperationsTest/Kernel.cs +++ b/Tests/Kernels/MemoryOperationsTest/Kernel.cs @@ -5,6 +5,7 @@ using System.Text; using Cosmos.System.ExtendedASCII; using Cosmos.System.ScanMaps; +using Cosmos.Core.Memory; using Cosmos.Core; using System.Runtime.InteropServices; @@ -27,53 +28,6 @@ protected override void BeforeRun() Console.WriteLine("Cosmos booted successfully. Let's Test MemoryOperations!"); } - /* - * It checks 32 byte any time to make it more faster, for now we need unsafe to do this - */ - public static unsafe bool AreArrayEquals(byte* b0, byte* b1, int length) - { - byte* lastAddr = b0 + length; - byte* lastAddrMinus32 = lastAddr - 32; - while (b0 < lastAddrMinus32) // unroll the loop so that we are comparing 32 bytes at a time. - { - if (*(ulong*)b0 != *(ulong*)b1) - return false; - if (*(ulong*)(b0 + 8) != *(ulong*)(b1 + 8)) - return false; - if (*(ulong*)(b0 + 16) != *(ulong*)(b1 + 16)) - return false; - if (*(ulong*)(b0 + 24) != *(ulong*)(b1 + 24)) - return false; - b0 += 32; - b1 += 32; - } - while (b0 < lastAddr) - { - if (*b0 != *b1) - return false; - b0++; - b1++; - } - return true; - } - - public static unsafe bool AreArrayEquals(byte[] arr0, byte[] arr1) - { - fixed (byte* b0 = arr0, b1 = arr1) - { - return b0 == b1 || AreArrayEquals(b0, b1, arr0.Length); - } - } - - public static unsafe bool AreArrayEquals(int[] arr0, int[] arr1) - { - int lenght = arr0.Length * 4; - fixed (int* b0 = arr0, b1 = arr1) - { - return b0 == b1 || AreArrayEquals((byte *)b0, (byte*)b1, lenght); - } - } - private void TestIntArrayCopy(int size) { int[] src = new int[size]; @@ -87,7 +41,7 @@ private void TestIntArrayCopy(int size) MemoryOperations.Copy(dst, src); mDebugger.Send("Copy End"); - Assert.IsTrue(AreArrayEquals(src, dst), $"Copy failed Array src and dst with size {size} are not equals"); + Assert.AreEqual(src, dst, $"Copy failed Array src and dst with size {size} are not equals"); mDebugger.Send("End"); } @@ -105,7 +59,7 @@ private void TestByteArrayCopy(int size) MemoryOperations.Copy(dst, src); mDebugger.Send("Copy End"); - Assert.IsTrue(AreArrayEquals(src, dst), $"Copy failed Array src and dst with size {size} are not equals"); + Assert.AreEqual(src, dst, $"Copy failed Array src and dst with size {size} are not equals"); mDebugger.Send("End"); } @@ -138,13 +92,123 @@ private void TestCopy() TestIntArrayCopy(1024 * 768); // XVGA resolution TestIntArrayCopy(1920 * 1080); // HDTV resolution } + static unsafe void TestManagedMemoryBlock(ManagedMemoryBlock memoryBlock) + { + memoryBlock.Write32(0, 1); + Assert.AreEqual(1, memoryBlock[0], "ManagedMemoryBlock write int at index 0 works"); + Assert.AreEqual(1, memoryBlock.Read32(0), "ManagedMemoryBlock read/write at index 0 works"); + memoryBlock.Write32(1, 101); + Assert.AreEqual(101, memoryBlock[1], "ManagedMemoryBlock read/write at index 1 works"); + Assert.AreEqual(25857, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + memoryBlock.Write32(2, 2 ^ 16 + 2); + Assert.AreEqual(16, memoryBlock[2], "ManagedMemoryBlock write int at index 2 works"); + Assert.AreEqual(0, memoryBlock[3], "ManagedMemoryBlock write int at index 2 works"); + Assert.AreEqual(1074433, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + memoryBlock.Write32(3, int.MaxValue); + Assert.AreEqual(255, memoryBlock[3], "ManagedMemoryBlock write int at index 3 works"); + Assert.AreEqual(0xFF106501, memoryBlock.Read32(0), "ManagedMemoryBlock read int at index 0 works"); + Assert.AreEqual(0xFFFF1065, memoryBlock.Read32(1), "ManagedMemoryBlock read int at index 1 works"); + Assert.AreEqual(0xFFFFFF10, memoryBlock.Read32(2), "ManagedMemoryBlock read int at index 2 works"); + Assert.AreEqual(int.MaxValue, memoryBlock.Read32(3), "ManagedMemoryBlock read/write at index 3 works"); + + memoryBlock.Fill(101); + Assert.AreEqual(101, memoryBlock.Read32(0), "ManagedMemoryBlock fill works at index 0"); + Assert.AreEqual(0, memoryBlock[1], "ManagedMemoryBlock fill fills entire ints"); + Assert.AreEqual(6619136, memoryBlock.Read32(10), "ManagedMemoryBlock fill works at index 10"); + + memoryBlock.Write8(0, 101); + Assert.AreEqual(101, memoryBlock[0], "ManagedMemoryBlock write byte works at index 0"); + memoryBlock.Fill(1, 1, 987893745); + Assert.AreEqual(101, memoryBlock[0], "ManagedMemoryBlock Fill(1, int, int) skips index 0"); + Assert.AreEqual(987893745, memoryBlock.Read32(1), "ManagedMemoryBlock Fill(int, int, int) works at index 1"); + } + + static unsafe void TestMemoryBlock(MemoryBlock memoryBlock) + { + uint[] values = new uint[] { 1, 101, 2 ^ 16 + 2, int.MaxValue }; + memoryBlock.Write32(values); + uint[] read = new uint[4]; + memoryBlock.Read32(read); + for (int i = 0; i < 4; i++) + { + if(values[i] != read[i]) + { + Assert.Fail($"Values read differ at {i}. Expected: {values[i]} Actual: {read[i]}"); + } + } + Assert.Succeed("Writing and reading uints works"); + byte* ptr = (byte*)memoryBlock.Base; + Assert.AreEqual(1, *ptr, "Expected 1 in first byte of memory block when checking using pointer"); + Assert.AreEqual(0, *(ptr + 3), "Expected 0 in fourth byte of memory block when checking using pointer"); + byte[] valueBytes = new byte[] { 1, 0, 0, 0 }; + byte[] readByte = new byte[4]; + memoryBlock.Read8(readByte); + Assert.AreEqual(valueBytes, readByte, "Reading bytes works"); + valueBytes[0] = 65; + valueBytes[1] = 127; + memoryBlock.Write8(valueBytes); + memoryBlock.Read8(readByte); + Assert.AreEqual(valueBytes, readByte, "Writing bytes works"); + memoryBlock.Fill(101); + memoryBlock.Read8(readByte); + Assert.AreEqual(new byte[] { 101, 101, 101, 101 }, readByte, "Filling works"); + values = new uint[] { 0x65656565, 987893745, 0x65656565, 0x65656565 }; + memoryBlock.Fill(4, 1, 987893745); + memoryBlock.Read32(read); + Assert.AreEqual(values, read, "Using Fill(int, int, int) works"); + } + + static unsafe void TestRealloc() + { + // Allocate initial pointer and fill with value 32 + byte* aPtr = Heap.Alloc(16); + MemoryOperations.Fill(aPtr, (byte)32, 16); + + // Resize/realloc to 17 bytes + aPtr = Heap.Realloc(aPtr, 17); + + // Test for first 16 being 32 and last being 0 + for (int i = 0; i < 15; i++) + { + Assert.AreEqual(aPtr[i], 32, $"Expected value 32 not found in index {i} of aPtr."); + } + Assert.AreEqual(aPtr[16], 0, "Expected value 0 not found at the end of aPtr."); + } + + static unsafe void TestMemoryManager() + { + uint freePageCount = RAT.FreePageCount; + Assert.IsTrue(freePageCount < RAT.TotalPageCount, "Number of free pages is less than total number of pages"); + Assert.AreEqual(freePageCount, RAT.GetPageCount((byte)RAT.PageType.Empty), "GetPageCount and FreePageCount get different number of free pages"); + void* pointer = RAT.AllocPages(RAT.PageType.HeapLarge, 3); + Assert.AreEqual(RAT.FreePageCount, freePageCount - 3, "Allocating three pages reduces number of free pages by three"); + RAT.Free(RAT.GetFirstRATIndex(pointer)); + Assert.AreEqual(RAT.FreePageCount, freePageCount, "Freeing the allocated pages correctly updates the number of free pages"); + } + + void TestAutomaticGCCollect() + { + Assert.AreEqual(RAT.GCTriggered, 0, "Before Enabling GC hasnt been triggered automatically"); + RAT.MinFreePages = (int)RAT.FreePageCount - 10; + while (RAT.GCTriggered == 0) + { + Console.WriteLine($"Free: {RAT.FreePageCount} Min: {RAT.MinFreePages} GC Triggered: {RAT.GCTriggered} Objects: {HeapSmall.GetAllocatedObjectCount()}"); + } + Assert.Succeed("GC can be triggered automatically"); + RAT.MinFreePages = -1; + } protected override void Run() { try { + TestMemoryManager(); TestCopy(); - + TestMemoryBlock(new MemoryBlock(0x60000, 128)); //we are testing in SVGA video memory which should not be in use + TestManagedMemoryBlock(new ManagedMemoryBlock(128)); + TestRealloc(); + SpanTest.Execute(); + TestAutomaticGCCollect(); TestController.Completed(); } catch (Exception e) diff --git a/Tests/Kernels/MemoryOperationsTest/MemoryOperationsTest.csproj b/Tests/Kernels/MemoryOperationsTest/MemoryOperationsTest.csproj index d6e0d7a18b..7bfb5a92b5 100644 --- a/Tests/Kernels/MemoryOperationsTest/MemoryOperationsTest.csproj +++ b/Tests/Kernels/MemoryOperationsTest/MemoryOperationsTest.csproj @@ -1,13 +1,14 @@  - netcoreapp2.0 + net6.0 True + Debug;Release;TEST - + diff --git a/Tests/Kernels/MemoryOperationsTest/SpanTest.cs b/Tests/Kernels/MemoryOperationsTest/SpanTest.cs new file mode 100644 index 0000000000..be7074f3bf --- /dev/null +++ b/Tests/Kernels/MemoryOperationsTest/SpanTest.cs @@ -0,0 +1,96 @@ +using Cosmos.TestRunner; +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryOperationsTest +{ + public class SpanTest + { + static ref byte GetValue(byte[] array) + { + return ref array[3]; + } + + public static void RefTests() + { + byte[] data = new byte[] {0, 1, 2, 3, 4 }; + ref byte b = ref data[2]; + Assert.AreEqual(2, b, "Retrieving from ref local variables works"); + b += 2; + Assert.AreEqual(4, b, "Adding to ref local variables works"); + ref byte b2 = ref data[2]; + b = 6; + Assert.AreEqual(6, b, "Setting value to ref local variables works"); + Assert.AreEqual(6, b2, "Setting value to indirect ref local variables works"); + Assert.AreEqual(3, GetValue(data), "Setting value to indirect ref local variables works"); + ref byte b3 = ref GetValue(data); + data[3] *= 2; + Assert.AreEqual(6, b3, "Setting value to indirect ref local variables works"); + + ref byte a = ref data[0]; + Assert.AreEqual(0, a, "Correctly intialises ref type"); + a = ref Unsafe.Add(ref a, 1); + Assert.AreEqual(1, a, "Unsafe.Add works for ref types"); + a = ref Unsafe.Add(ref a, 3); + Assert.AreEqual(4, a, "Unsafe.Add works for ref types"); + + int[] iData = new int[] { 0, 100, 200, 300, 400, 500, 600 }; + ref int iPointer = ref iData[2]; + Assert.AreEqual(200, iPointer, "Using ref types on int works as well"); + iPointer = ref Unsafe.Add(ref iPointer, 4); + Assert.AreEqual(600, iPointer, "Unsafe.Add works for ref int"); + IntPtr intPtr = new IntPtr(2); + iPointer = ref Unsafe.Subtract(ref iPointer, intPtr); + Assert.AreEqual(400, iPointer, "Unsafe.Subtract works for ref int and IntPtr"); + } + + public static void MemoryMarshalTest() + { + var arr = new byte[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + ref byte a = ref MemoryMarshal.GetArrayDataReference(arr); + Assert.AreEqual(0, a, "MemoryMarshal returns correct array data reference"); + arr[0] = 10; + Assert.AreEqual(10, a, "The reference is updated"); + Assert.AreEqual(Unsafe.Add(ref a, 1), 1, "Unsafe.Add 1 works for array ref"); + Assert.AreEqual(Unsafe.Add(ref a, 5), 5, "Unsafe.Add 5 works for array ref"); + + } + + public static void ImplicitSpanTest(ReadOnlySpan aSpan) + { + Assert.AreEqual(aSpan[0], 'H', "Implicit array to span has correct value at index 0"); + Assert.AreEqual(aSpan[3], 'p', "Implicit array to span has correct value at index 3"); + } + + public static void Execute() + { + RefTests(); + MemoryMarshalTest(); + var arr = new byte[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + Span span = arr; + Assert.IsTrue(span != null, "Can create span from array"); + Assert.AreEqual(10, span.Length, "Span has correct length"); + Assert.AreEqual(2, arr[2], "Array has correct values"); + Assert.AreEqual(2, span[2], "Span has correct values"); + Assert.AreEqual(8, arr[8], "Array has correct values"); + Assert.AreEqual(8, span[8], "Span has correct values"); + span[3] = 20; + Assert.AreEqual(20, span[3], "Span can change value"); + Assert.AreEqual(20, arr[3], "Array can change value"); + + Span slice = span.Slice(start: 5, length: 3); + Assert.IsTrue(slice != null, "Spans can be sliced"); + Assert.AreEqual(3, slice.Length, "Sliced Span has correct length"); + + var intArr = new int[] { 0, 10, 100 }; + Span intSpan = new(intArr); + Assert.AreEqual(0, intSpan[0], "Int Span get_Item works at index 0"); + Assert.AreEqual(100, intSpan[2], "Int Span get_Item works at index 2"); + Assert.IsFalse(intSpan.IsEmpty, "Int Span is not empty"); + + var charArr = new char[] { 'H', 'e', 'l', 'p' }; + ImplicitSpanTest(charArr); + } + } +} diff --git a/Tests/Kernels/MemoryOperationsTest/packages.lock.json b/Tests/Kernels/MemoryOperationsTest/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/MemoryOperationsTest/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/NetworkTest/Kernel.cs b/Tests/Kernels/NetworkTest/Kernel.cs new file mode 100644 index 0000000000..04e0f7122b --- /dev/null +++ b/Tests/Kernels/NetworkTest/Kernel.cs @@ -0,0 +1,248 @@ +using Cosmos.HAL; +using Cosmos.System.Network; +using Cosmos.System.Network.ARP; +using Cosmos.System.Network.Config; +using Cosmos.System.Network.IPv4; +using Cosmos.System.Network.IPv4.TCP; +using Cosmos.System.Network.IPv4.UDP; +using Cosmos.System.Network.IPv4.UDP.DHCP; +using Cosmos.System.Network.IPv4.UDP.DNS; +using Cosmos.TestRunner; +using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Text; +using Sys = Cosmos.System; + +namespace NetworkTest +{ + public class Kernel : Sys.Kernel + { + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Starting Tests"); + } + + protected override void Run() + { + try + { + /** + * Packet creation and parsing tests + **/ + + /** Ethernet Packet Parsing Test **/ + byte[] ethernetPacketData = new byte[] + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x29, 0xD5, 0xDB, 0x9D, 0x08, 0x00 + }; + EthernetPacket ethernetPacket = new EthernetPacket(ethernetPacketData); + Assert.AreEqual(ethernetPacketData, ethernetPacket.RawData, "Ethernet packet data is good."); + + /** IP Packet Parsing Test **/ + byte[] ipPacketData = new byte[] + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x29, 0xD5, 0xDB, 0x9D, 0x08, 0x00, 0x45, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x39, + 0xD8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF + }; + IPPacket ipPacket = new IPPacket(ipPacketData); + Assert.AreEqual(ipPacketData, ipPacket.RawData, "IP packet data is good."); + + /** UDP Packet Parsing Test **/ + byte[] udpPacketData = new byte[] + { + 0x98, 0xFA, 0x9B, 0xD4, 0xEB, 0x29, 0xD8, 0xCE, 0x3A, 0x89, 0x3E, 0xD9, 0x08, 0x00, 0x45, 0x00, 0x00, 0x22, 0x0C, 0x74, 0x40, 0x00, 0x40, 0x11, 0xAA, + 0xBE, 0xC0, 0xA8, 0x01, 0x02, 0xC0, 0xA8, 0x01, 0x46, 0x10, 0x92, 0x10, 0x92, 0x00, 0x0E, 0x37, 0x22, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x21 + }; + UDPPacket udpPacket = new UDPPacket(udpPacketData); + Assert.AreEqual(udpPacketData, udpPacket.RawData, "UDP packet data is good."); + + /** DNS Packet Parsing Test **/ + byte[] dnsPacketData = new byte[] + { + 0xB8, 0xD9, 0x4D, 0xC1, 0xA5, 0xFC, 0x98, 0xFA, 0x9B, 0xD4, 0xEB, 0x29, 0x08, 0x00, 0x45, 0x00, 0x00, 0x38, 0xC3, 0x1C, 0x00, 0x00, 0x80, 0x11, 0x00, + 0x00, 0xC0, 0xA8, 0x01, 0x46, 0xC0, 0xA8, 0x01, 0xFE, 0xF0, 0x66, 0x00, 0x35, 0x00, 0x24, 0x84, 0xCA, 0xD6, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x67, 0x69, 0x74, 0x74, 0x65, 0x72, 0x03, 0x63, 0x6F, 0x6D, 0x00, 0x00, 0x01, 0x00, 0x01 + }; + DNSPacket dnsPacket = new DNSPacket(dnsPacketData); + Assert.AreEqual(dnsPacketData, dnsPacket.RawData, "DNS packet data is good."); + + /** DHCP Packet Parsing Test **/ + byte[] dhcpPacketData = new byte[] + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD9, 0x4D, 0xC1, 0xA5, 0xFC, 0x08, 0x00, 0x45, 0xC0, 0x01, 0x59, 0x46, 0x3F, 0x00, 0x00, 0x40, 0x11, 0x6F, + 0xEF, 0xC0, 0xA8, 0x01, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x43, 0x00, 0x44, 0x01, 0x45, 0xD3, 0xC8, 0x02, 0x01, 0x06, 0x00, 0x84, 0xA9, 0x5A, 0x66, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 0x01, 0x47, 0xC0, 0xA8, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x34, 0xE1, 0x2D, 0xA3, 0x06, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x63, 0x82, 0x53, 0x63, 0x35, 0x01, 0x05, 0x36, 0x04, 0xC0, 0xA8, 0x01, 0xFE, 0x33, 0x04, 0x00, 0x01, 0x51, 0x80, 0x3A, 0x04, 0x00, + 0x00, 0xA8, 0xC0, 0x3B, 0x04, 0x00, 0x01, 0x27, 0x50, 0x1C, 0x04, 0xC0, 0xA8, 0x01, 0xFF, 0x51, 0x12, 0x03, 0xFF, 0xFF, 0x44, 0x45, 0x53, 0x4B, 0x54, + 0x4F, 0x50, 0x2D, 0x49, 0x51, 0x48, 0x4A, 0x33, 0x31, 0x43, 0x06, 0x04, 0xC0, 0xA8, 0x01, 0xFE, 0x0F, 0x03, 0x6C, 0x61, 0x6E, 0x03, 0x04, 0xC0, 0xA8, + 0x01, 0xFE, 0x01, 0x04, 0xFF, 0xFF, 0xFF, 0x00, 0xFF + }; + DHCPPacket dhcpPacket = new DHCPPacket(dhcpPacketData); + Assert.AreEqual(dhcpPacketData, dhcpPacket.RawData, "DHCP packet data is good."); + + /** TCP Packet Parsing Test **/ + byte[] tcpPacketData = new byte[] + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0x00, 0x45, 0x00, 0x00, 0x3C, 0x64, 0x92, 0x40, 0x00, 0x40, 0x06, 0x51, + 0xA2, 0xC0, 0xA8, 0x01, 0xD3, 0xC0, 0xA8, 0x01, 0x64, 0xA8, 0xAB, 0x10, 0x92, 0x67, 0x7C, 0xCE, 0x18, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x02, 0x72, 0x10, + 0x5F, 0xF0, 0x00, 0x00, 0x02, 0x04, 0x05, 0xB4, 0x04, 0x02, 0x08, 0x0A, 0x58, 0x1A, 0xAA, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07 + }; + TCPPacket tcpPacket = new TCPPacket(tcpPacketData); + Assert.AreEqual(tcpPacket.SourcePort, 43179, "TCP source port parsing OK."); + Assert.AreEqual(tcpPacket.DestinationPort, 4242, "TCP destination port parsing OK."); + Assert.AreEqual(tcpPacket.SequenceNumber, 0x677CCE18, "TCP sequence number parsing OK."); + Assert.AreEqual(tcpPacket.AckNumber, 0, "TCP ACK number parsing OK."); + Assert.AreEqual(tcpPacket.TCPFlags, (int)Flags.SYN, "TCP flag parsing OK."); + Assert.AreEqual(tcpPacket.WindowSize, 29200, "TCP window size parsing OK."); + Assert.AreEqual(tcpPacket.Checksum, 0x5FF0, "TCP checksum parsing OK."); + Assert.AreEqual(tcpPacket.UrgentPointer, 0, "TCP urgent pointer parsing OK."); + + /** ARP Packet Parsing Test **/ + byte[] arpPacketData = new byte[] + { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0xD9, 0x4D, 0xC1, 0xA5, 0xFC, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xB8, 0xD9, 0x4D, + 0xC1, 0xA5, 0xFC, 0xC0, 0xA8, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8, 0x01, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + ARPPacket arpPacket = new ARPPacket(arpPacketData); + Assert.AreEqual(arpPacketData, arpPacket.RawData, "ARP packet data is good."); + + /** + * Clients tests + **/ + TestDhcpConnection(); + TestTcpConnection(); + TestDnsConnection(); + TestIcmpConnection(); + + TestController.Completed(); + } + catch (Exception e) + { + mDebugger.Send("Exception occurred: " + e.Message); + mDebugger.Send(e.Message); + TestController.Failed(); + } + } + + private void TestDhcpConnection() + { + Global.debugger.Send("Creating DHCP client..."); + + using (var xClient = new DHCPClient()) + { + xClient.SendDiscoverPacket(); + + var ip = NetworkConfiguration.CurrentAddress.ToString(); + Global.debugger.Send("IP: " + ip); + + Assert.IsTrue(ip != null, "Received IP is valid."); + Assert.IsFalse(NetworkConfiguration.CurrentAddress.Equals(Address.Zero), "Received IP is not ZERO, DHCP works"); + } + } + + private void TestTcpConnection() + { + Global.debugger.Send("Creating TCP client..."); + + using (var xClient = new TcpClient()) + { + Global.debugger.Send("Creating IPAddress..."); + var address = new IPAddress(new byte[] { 127, 0, 0, 1 }); + Global.debugger.Send("Connecting to TCP server..."); + xClient.Connect(address, 12345); + Global.debugger.Send("TcpClient connected."); + NetworkStream stream = xClient.GetStream(); + Assert.IsTrue(xClient.Connected, "TCP connexion established."); + + byte[] receivedData = new byte[xClient.ReceiveBufferSize]; + int bytesRead = stream.Read(receivedData, 0, receivedData.Length); + string receivedMessage = Encoding.ASCII.GetString(receivedData, 0, bytesRead); + Assert.AreEqual(receivedMessage, "Hello from the testrunner!", "TCP receive works"); + + Global.debugger.Send("TcpClient sending IP " + NetworkConfiguration.CurrentAddress.ToString()); + stream.Write(Encoding.ASCII.GetBytes(NetworkConfiguration.CurrentAddress.ToString())); + Global.debugger.Send("TcpClient IP sent"); + + // Envoyer un message au serveur + string messageToSend = "cosmos is the best operating system uwu"; + byte[] dataToSend = Encoding.ASCII.GetBytes(messageToSend); + Global.debugger.Send("Sending: " + messageToSend); + stream.Write(dataToSend, 0, dataToSend.Length); + + byte[] receivedData2 = new byte[xClient.ReceiveBufferSize]; + int bytesRead2 = stream.Read(receivedData2, 0, receivedData2.Length); + string receivedMessage2 = Encoding.ASCII.GetString(receivedData2, 0, bytesRead2); + Assert.AreEqual(receivedMessage2, "COSMOS IS THE BEST OPERATING SYSTEM UWU", "TCP send works"); + + string baseMessage = "This is a long TCP message for sequencing test..."; + string paddedMessage = baseMessage.PadRight(6000, '.'); + stream.Write(Encoding.ASCII.GetBytes(paddedMessage)); + Global.debugger.Send("Sent long data packet."); + + byte[] receivedData3 = new byte[xClient.ReceiveBufferSize]; + int bytesRead3 = stream.Read(receivedData3, 0, receivedData3.Length); + Assert.AreEqual(bytesRead3, 6000, "TCP paquet sequencing works."); + + stream.Close(); + } + + Global.debugger.Send("Creating TCP server..."); + + var xServer = new TcpListener(IPAddress.Any, 4343); + xServer.Start(); + + var client = xServer.AcceptTcpClient(); //blocking + Assert.IsTrue(client.Connected, "Received new client! TCP connexion established."); + } + + private void TestDnsConnection() + { + Global.debugger.Send("Creating DNS client..."); + + using (var xClient = new DnsClient()) + { + xClient.Connect(new Address(1, 1, 1, 1)); //Cloudflare DNS + + xClient.SendAsk("github.com"); + + /** Receive DNS Response **/ + Address destination = xClient.Receive(); //can set a timeout value + + var ip = destination.ToString(); + Assert.IsTrue(ip != null, "Received IP is valid."); + Assert.IsFalse(NetworkConfiguration.CurrentAddress.Equals(Address.Zero), "Received IP is not ZERO, DNS works"); + + Global.debugger.Send("IP: " + ip); + } + } + + private void TestIcmpConnection() + { + Global.debugger.Send("Creating ICMP client..."); + + using (var xClient = new ICMPClient()) + { + xClient.Connect(new Address(127, 0, 0, 1)); //Cloudflare DNS + + xClient.SendEcho(); + + var endpoint = new Sys.Network.IPv4.EndPoint(Address.Zero, 0); + int time = xClient.Receive(ref endpoint); + + Assert.IsFalse(time == -1, "ICMP echo works"); + } + } + } +} diff --git a/Tests/Kernels/NetworkTest/NetworkTest.csproj b/Tests/Kernels/NetworkTest/NetworkTest.csproj new file mode 100644 index 0000000000..a810220a94 --- /dev/null +++ b/Tests/Kernels/NetworkTest/NetworkTest.csproj @@ -0,0 +1,16 @@ + + + + net6.0 + True + Debug;Release;TEST + + + + + + + + + + diff --git a/Tests/Kernels/NetworkTest/packages.lock.json b/Tests/Kernels/NetworkTest/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/NetworkTest/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/ProcessorTests/Kernel.cs b/Tests/Kernels/ProcessorTests/Kernel.cs new file mode 100644 index 0000000000..ff74b2c53b --- /dev/null +++ b/Tests/Kernels/ProcessorTests/Kernel.cs @@ -0,0 +1,102 @@ +using System; +using Sys = Cosmos.System; +using Cosmos.TestRunner; +using Cosmos.System.Graphics; +using System.Text; +using Cosmos.System.ExtendedASCII; +using Cosmos.System.ScanMaps; +using Cosmos.Core.Multiboot; +using Cosmos.Core; +using System.Runtime.InteropServices; +using Cosmos.HAL; + +namespace ProcessorTests +{ + public class Kernel : Sys.Kernel + { + protected override void BeforeRun() + { + Console.WriteLine("Cosmos booted successfully. Starting Tests"); + } + + protected override void Run() + { + try + { + TestMultibootMemoryMap(); + TestGetRam(); + TestVendorNameIsNotBlank(); + TestBrandStringBlank(); + TestCycleCount(); + TestCycleRateIsNotZero(); + TestMultiboot(); + + TestController.Completed(); + } + catch (Exception e) + { + mDebugger.Send("Exception occurred: " + e.Message); + mDebugger.Send(e.Message); + TestController.Failed(); + } + } + + public void TestGetRam() + { + Assert.IsTrue(CPU.GetAmountOfRAM() > 0, "CPU.GetAmountOfRAM() returns a positive value: " + CPU.GetAmountOfRAM()); + } + + public void TestMultibootMemoryMap() + { + var memoryMap = CPU.GetMemoryMap(); + for (int i = 0; i < memoryMap.Length; i++) + { + mDebugger.Send($"Memory Map: {memoryMap[i].Address} " + + $"Length: {memoryMap[i].Length} Type: {memoryMap[i].Type}"); + } + Assert.IsTrue(memoryMap.Length != 0, "Memory Map is not empty! Length " + memoryMap.Length); + } + + public void TestMultiboot() + { + Assert.IsTrue(Multiboot2.GetMBIAddress() != 0, $"Multiboot.GetMBIAddress works {Multiboot2.GetMBIAddress()}"); + } + + public void TestBrandStringBlank() + { + string brandString = CPU.GetCPUBrandString(); + mDebugger.Send("Brand String: " + brandString); + bool isBrandStringBlank = string.IsNullOrWhiteSpace(brandString); + Assert.IsFalse(isBrandStringBlank, "Processor brand string is blank."); + } + + public void TestVendorNameIsNotBlank() + { + string vendorName = CPU.GetCPUVendorName(); + mDebugger.Send("Vendor name: " + vendorName); + bool isVendorNameBlank = string.IsNullOrWhiteSpace(vendorName); + mDebugger.Send("Vendor name: "); + mDebugger.Send(vendorName); + Assert.IsFalse(isVendorNameBlank, "Processor vendor name is blank."); + } + + public void TestCycleCount() + { + ulong cycleCount = CPU.GetCPUUptime(); + mDebugger.Send($"CycleCount: {cycleCount}"); + bool isCycleCountZero = cycleCount == 0; + Assert.IsFalse(isCycleCountZero, "Processor cycle count is not zero."); + ulong secondCount = CPU.GetCPUUptime(); + Assert.IsTrue(secondCount > cycleCount, "Processor cycle count is increasing"); + } + + public void TestCycleRateIsNotZero() + { + long cycleRate = CPU.GetCPUCycleSpeed(); + mDebugger.Send($"CycleRate: {cycleRate}"); + bool isCycleRateZero = cycleRate == 0; + Assert.IsFalse(isCycleRateZero, "Processor cycle rate is not zero."); + Assert.IsTrue(CPU.GetCPUCycleSpeed() == cycleRate, "Processor cycle speed is not constant"); + } + } +} diff --git a/Tests/Kernels/ProcessorTests/ProcessorTests.csproj b/Tests/Kernels/ProcessorTests/ProcessorTests.csproj new file mode 100644 index 0000000000..aa2682b187 --- /dev/null +++ b/Tests/Kernels/ProcessorTests/ProcessorTests.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + Debug;Release;TEST + + + + + + + + + + diff --git a/Tests/Kernels/ProcessorTests/packages.lock.json b/Tests/Kernels/ProcessorTests/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/ProcessorTests/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs b/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs index b6bb505e62..aa4e3e8dfb 100644 --- a/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs +++ b/Tests/Kernels/SimpleStructsAndArraysTest/Kernel.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; - using Cosmos.TestRunner; using Sys = Cosmos.System; @@ -82,6 +81,20 @@ private static void TestStep1() Assert.IsTrue(xItem2.E == 5, "xItem2.E == 5"); } + public struct ThreeBytes + { + public byte A; + public byte B; + public byte C; + + public ThreeBytes(byte a, byte b, byte c) + { + A = a; + B = b; + C = c; + } + } + private class KVPClass { public int Key; @@ -254,6 +267,27 @@ protected static void TestStandardList() // Assert.IsTrue(xTestMultidimensionalArray[1, 1] == 4, "Index [1, 1] == 4"); //} + private void TestRemainder3Structs() + { + ThreeBytes[] array = new ThreeBytes[1]; + array[0] = new ThreeBytes(17, 254, 77); + Assert.AreEqual(array[0].A, 17, "Three byte struct in array first value read correctly"); + Assert.AreEqual(array[0].B, 254, "Three byte struct in array second value read correctly"); + var local = array[0]; + Assert.AreEqual(local.C, 77, "Three byte struct third value read correctly"); + } + + private void TestArrayRange() + { + byte[] array = new byte[16]; + for (int i = 0; i < 16; i++) + { + array[i] = (byte)i; + } + byte[] slice = array[1..5]; + Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, slice, "Taking the slice of a byte array works"); + } + protected override void Run() { TestStep1(); @@ -265,6 +299,8 @@ protected override void Run() //Assert.IsTrue(true, "After TestMultidimensionalArray"); ConstrainedTest.MutateStructTest(); Assert.IsTrue(true, "After MutateTestStruct"); + TestRemainder3Structs(); + TestArrayRange(); TestController.Completed(); } diff --git a/Tests/Kernels/SimpleStructsAndArraysTest/SimpleStructsAndArraysTest.csproj b/Tests/Kernels/SimpleStructsAndArraysTest/SimpleStructsAndArraysTest.csproj index b0e862e6fb..aa2682b187 100644 --- a/Tests/Kernels/SimpleStructsAndArraysTest/SimpleStructsAndArraysTest.csproj +++ b/Tests/Kernels/SimpleStructsAndArraysTest/SimpleStructsAndArraysTest.csproj @@ -1,12 +1,14 @@  - netcoreapp2.0 + net6.0 + Debug;Release;TEST + diff --git a/Tests/Kernels/SimpleStructsAndArraysTest/packages.lock.json b/Tests/Kernels/SimpleStructsAndArraysTest/packages.lock.json new file mode 100644 index 0000000000..b51ac8055e --- /dev/null +++ b/Tests/Kernels/SimpleStructsAndArraysTest/packages.lock.json @@ -0,0 +1,2716 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "(, )", + "resolved": "15.0.0", + "contentHash": "fiOrr+qc9NUc7T8am9Kz9TlXVDa+tQcVP3WFXyeZQA1vrbgsA578wcmGhSbc7KxMcWCu2GG4i0DKK1c5pLRdpQ==", + "dependencies": { + "Microsoft.TestPlatform.TestHost": "15.0.0" + } + }, + "Dapper.StrongName": { + "type": "Transitive", + "resolved": "2.0.90", + "contentHash": "oYmC8zT97TBlmNcU/xM54CJC6sgG+VUmUhRN5tg05P1Y3H4wx7vU+xBM6MgEJ21aXAXsTctchPs5TCsbRdIxJw==" + }, + "IgnoresAccessChecksToGenerator": { + "type": "Transitive", + "resolved": "0.5.0", + "contentHash": "p0ZdbdGRAmRAhSm1HWZ4luy/RjLZlhGPmg9OWmVFYhrq526AtxmL5Pik7uZWf3Hr3PQRR8iTH+Kyf3eHyLAGCQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "NDvPAsJZSptFxB5B5t3a/7UUihO2nPm8nsEG3s2EtnccIotMsQqSkDdak/T/tWQUivzdiy1Q/0jXk97zQgD75Q==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.DiaSymReader": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "/fn1Tfo7j7k/slViPlM8azJuxQmri7FZ8dQ+gTeLbI29leN/1VK0U/BFcRdJNctsRCUgyKJ2q+I0Tjq07Rc1/Q==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "cmnwtae/q/DKcWT6aF3fvexPhQ/rhr0twc+2VLEhzDBfE0khtBGrlDvnCfcWktGjShtTCB0OO204JdS3QtAByQ==", + "dependencies": { + "NETStandard.Library": "1.6.0", + "System.ComponentModel.EventBasedAsync": "4.0.11", + "System.ComponentModel.TypeConverter": "4.1.0", + "System.Diagnostics.Process": "4.1.0", + "System.Diagnostics.TextWriterTraceListener": "4.0.0", + "System.Diagnostics.TraceSource": "4.0.0", + "System.Diagnostics.Tracing": "4.1.0", + "System.IO.FileSystem": "4.0.1", + "System.Reflection.Metadata": "1.3.0", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.InteropServices": "4.1.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.0.0", + "System.Runtime.Loader": "4.0.0", + "System.Runtime.Serialization.Json": "4.0.2", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Security.Cryptography.Algorithms": "4.2.0", + "System.Threading.Thread": "4.0.0", + "System.Xml.XPath.XmlDocument": "4.0.1" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "15.0.0", + "contentHash": "OIQilyR5xljftuD2UcKoXANGrHESt/MN7DVfzEdpF7Lg7CtL6NMADidHjZU+iwHCdvpyqBJ+TE7aI01qYVWsaw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "15.0.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==", + "dependencies": { + "Microsoft.CSharp": "4.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Dynamic.Runtime": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XDocument": "4.0.11" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ME+/evR+UxVlWyGHUlLBoNTnsTdaylMbnvVwOp0Nl6XIZGGyXdqJqjlEew7e6TcKkJAA0lljhjKi3Kie+vzQ7g==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.linux-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4", + "runtime.osx-x64.runtime.native.System.IO.Ports": "5.0.0-rtm.20519.4" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "hMxFT2RhhlffyCdKLDXjx8WEC5JfCvNozAZxCablAuFRH74SCV4AgzE8yJCh/73bFnEoZgJ9MJmkjQ0dJmnKqA==", + "dependencies": { + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "/HKQyVP0yH1I0YtK7KJL/28snxHNH/bi+0lgk/+MbURF6ULhAE31MDI+NZDerNWu264YbxklXCCygISgm+HMug==", + "dependencies": { + "System.Collections.NonGeneric": "4.0.1", + "System.Globalization": "4.0.11", + "System.Globalization.Extensions": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "oBZFnm7seFiVfugsIyOvQCWobNZs7FzqDV/B7tx20Ep/l3UUFCPDkdTnCNaJZTU27zjeODmy2C/cP60u3D4c9w==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.ComponentModel.EventBasedAsync": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "Z7SO6vvQIR84daPE4uhaNdef9CjgjDMGYkas8epUhf0U3WGuaGgZ0Mm4QuNycMdbHUY8KEdZrtgxonkAiJaAlA==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "sc/7eVCdxPrp3ljpgTKVaQGUXiW05phNWvtv/m2kocXqrUQvTVWKou1Edas2aDjTThLPZOxPYIGNb/HN0QjURg==", + "dependencies": { + "System.ComponentModel": "4.0.1", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.1.0", + "contentHash": "MnDAlaeJZy9pdB5ZdOlwdxfpI+LJQ6e0hmH7d2+y2LkiD8DRJynyDYl4Xxf3fWFm7SbEwBZh4elcfzONQLOoQw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.NonGeneric": "4.0.1", + "System.Collections.Specialized": "4.0.1", + "System.ComponentModel": "4.0.1", + "System.ComponentModel.Primitives": "4.1.0", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.TextWriterTraceListener": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "w36Dr8yKy8xP150qPANe7Td+/zOI3G62ImRcHDIEW+oUXUuTKZHd4DHmqRx5+x8RXd85v3tXd1uhNTfsr+yxjA==", + "dependencies": { + "System.Diagnostics.TraceSource": "4.0.0", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Linq": "4.1.0", + "System.Linq.Expressions": "4.1.0", + "System.ObjectModel": "4.0.12", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.IO.UnmanagedMemoryStream": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tS89nK7pw8ebkkEfWujA05+ZReHKzz39W+bcX1okVR0GJCJuzPyfYfQZyiLSrjp121BB5J4uewZQiUTKri2pSQ==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "lcqFBUaCZxPiUkA4dlSOoPZGtZsAuuElH2XHgLwGLxd7ZozWetV5yiz0qGAV2AUYOqw97MtZBjbLMN16Xz4vXA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Collections.Concurrent": "4.0.12", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Emit.Lightweight": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Runtime.Serialization.Primitives": "4.1.1", + "System.Text.Encoding": "4.0.11", + "System.Text.Encoding.Extensions": "4.0.11", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Threading.Tasks": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1", + "System.Xml.XmlSerializer": "4.0.11" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Loader": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Json": { + "type": "Transitive", + "resolved": "4.0.2", + "contentHash": "+7DIJhnKYgCzUgcLbVTtRQb2l1M0FP549XFlFkQM5lmNiUBl44AfNbx4bz61xA8PzLtlYwfmif4JJJW7MPPnjg==", + "dependencies": { + "System.IO": "4.1.0", + "System.Private.DataContractSerialization": "4.1.1", + "System.Runtime": "4.1.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.1.1", + "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==", + "dependencies": { + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "2eZu6IP+etFVBBFUFzw2w6J21DqIN5eL9Y8r8JfJWUmV28Z5P0SNU01oCisVHQgHsDhHPnmq2s1hJrJCFZWloQ==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.Encoding": "4.0.11", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.0.11", + "contentHash": "FrazwwqfIXTfq23mfv4zH+BjqkSFNaNFBtjzu3I9NRmG8EELYyrv/fJnttCIwRMFRR/YKXF1hmsMmMEnl55HGw==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Linq": "4.1.0", + "System.Reflection": "4.1.0", + "System.Reflection.Emit": "4.0.1", + "System.Reflection.Emit.ILGeneration": "4.0.1", + "System.Reflection.Extensions": "4.0.1", + "System.Reflection.Primitives": "4.0.1", + "System.Reflection.TypeExtensions": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Text.RegularExpressions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "System.Xml.XPath": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "UWd1H+1IJ9Wlq5nognZ/XJdyj8qPE4XufBUkAW59ijsCPjZkZe0MUzKKJFBr+ZWBe5Wq1u1d5f2CYgE93uH7DA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11" + } + }, + "System.Xml.XPath.XmlDocument": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "Zm2BdeanuncYs3NhCj4c9e1x3EXFzFBVv2wPEc/Dj4ZbI9R8ecLSR5frAsx4zJCPBtKQreQ7Q/KxJEohJZbfzA==", + "dependencies": { + "System.Collections": "4.0.11", + "System.Globalization": "4.0.11", + "System.IO": "4.1.0", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "System.Xml.ReaderWriter": "4.0.11", + "System.Xml.XPath": "4.0.1", + "System.Xml.XmlDocument": "4.0.1" + } + }, + "cosmos.build.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )" + } + }, + "cosmos.common": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "cosmos.core": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.core.debugstub": { + "type": "Project" + }, + "cosmos.core_asm": { + "type": "Project", + "dependencies": { + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.IL2CPU": "[0.1.0-localbuild, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.core_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IgnoresAccessChecksToGenerator": "[0.5.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.debug.common": { + "type": "Project", + "dependencies": { + "Microsoft.Win32.Registry": "[5.0.0, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.debugconnectors": { + "type": "Project", + "dependencies": { + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Pipes": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )", + "System.Threading.Thread": "[4.3.0, )" + } + }, + "cosmos.debug.hosts": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Common": "[0.1.0-localbuild, )", + "System.Diagnostics.Process": "[4.3.0, )", + "System.IO.Ports": "[5.0.0, )" + } + }, + "cosmos.debug.kernel": { + "type": "Project" + }, + "cosmos.debug.kernel.plugs.asm": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.hal2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Core": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.il2cpu": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Core.DebugStub": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )", + "IL2CPU.Debug.Symbols": "[0.1.0-localbuild, )", + "System.Memory": "[4.5.4, )", + "System.Reflection.Metadata": "[5.0.0, )", + "System.Reflection.TypeExtensions": "[4.7.0, )", + "System.Runtime.CompilerServices.Unsafe": "[5.0.0, )", + "System.Runtime.Loader": "[4.3.0, )", + "XSharp": "[0.1.0-localbuild, )" + } + }, + "cosmos.plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Core_Asm": "[0.1.0-localbuild, )", + "Cosmos.Core_Plugs": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel.Plugs.Asm": "[0.1.0-localbuild, )", + "Cosmos.System2_Plugs": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.system2_plugs": { + "type": "Project", + "dependencies": { + "Cosmos.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )", + "Cosmos.HAL2": "[0.1.0-localbuild, )", + "Cosmos.System2": "[0.1.0-localbuild, )", + "IL2CPU.API": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.core": { + "type": "Project", + "dependencies": { + "Cosmos.Build.Common": "[0.1.0-localbuild, )", + "Cosmos.Debug.DebugConnectors": "[0.1.0-localbuild, )", + "Cosmos.Debug.Hosts": "[0.1.0-localbuild, )", + "Cosmos.TestRunner.TestController": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testadapter": { + "type": "Project", + "dependencies": { + "Cosmos.TestRunner.Core": "[0.1.0-localbuild, )" + } + }, + "cosmos.testrunner.testcontroller": { + "type": "Project", + "dependencies": { + "Cosmos.Debug.Kernel": "[0.1.0-localbuild, )" + } + }, + "dapperextensions.strongname": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "Microsoft.CSharp": "[4.7.0, )" + } + }, + "il2cpu.api": { + "type": "Project" + }, + "il2cpu.debug.symbols": { + "type": "Project", + "dependencies": { + "Dapper.StrongName": "[2.0.90, )", + "DapperExtensions.StrongName": "[0.1.0-localbuild, )", + "Microsoft.Data.Sqlite.Core": "[6.0.5, )", + "Microsoft.DiaSymReader": "[1.3.0, )", + "SQLitePCLRaw.bundle_e_sqlite3": "[2.0.6, )", + "SQLitePCLRaw.core": "[2.0.6, )", + "SQLitePCLRaw.lib.e_sqlite3.linux": "[1.1.14, )", + "System.ComponentModel.Annotations": "[5.0.0, )", + "System.Data.SqlClient": "[4.8.5, )", + "System.IO.MemoryMappedFiles": "[4.3.0, )", + "System.Reflection.Metadata": "[5.0.0, )" + } + }, + "spruce": { + "type": "Project" + }, + "xsharp": { + "type": "Project", + "dependencies": { + "Spruce": "[0.1.0-localbuild, )" + } + } + }, + "net6.0/win-x86": { + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "S/GPBmfPBB48ZghLxdDR7kDAJVAqgAuThyDJho3OLP5OS4tWD2ydyL8LKm8lhiBxce10OKe9X2zZ6DUjAqEbPg==" + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "M1r+760j1CNA6M/ZaW6KX8gOS8nxPRqloqDcJYVidRG566Ykwcs29AweZs2JF+nMOCgWDiMfPSTMfvwOI9F77w==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cPhT+Vqu52+cQQrDai/V91gubXUnDKNRvlBnH+hOgtGyHdC17aQIU64EaehwAQymd7kJA5rSrVRNfDYrbhnzyA==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.any.System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "w4ehZJ+AwXYmGwYu+rMvym6RvMaRiUEQR1u6dwcyuKHxz8Heu/mO9AG1MquEgTyucnhv3M43X0iKpDOoN17C0w==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "Np6w3r1dSFB930GGZHIKCc5ZClRXZIqOrCAT0pzcd/zXnsZPvGqLZB1MnxAbVhvriJl71B0N0tJaaT1ICWXsyg==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "VnGZmQ7pzMNkcTVdmGtXUQIbytK4Xk8F4/mxm0I+n7zbrsW/WNgLrWMTv9pb2Uyq09azXazNDQhZao4R4ebWcw==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "kvMZgZjtcC6cA8Y8imKpjCpiOJKDtwlNekS86GzUol4Jmzh0FWiRwAj4E9ZKO8R7rTBGIA4rkmra9Ko8j7l6AA==" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0-rtm.20519.4", + "contentHash": "N+dbbqhT7JBnPVHa7n2+Z5fHYO4a4UUhm7cQkbuQQoNkjbxLpxYnQ4lpRjr1RuQptqYkPmunKvN5etdFOObaiw==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RRACWygml5dnmfgC1SW6tLGsFgwsUAKFtvhdyHnIEz4EhWyrd7pacDdY95CacQJy7BMXRDRCejC9aCRC0Y1sQA==", + "dependencies": { + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FK/2gX6MmuLIKNCGsV59Fe4IYrLrI5n9pQ1jh477wiivEM/NCXDT2dRetH5FSfY0bQ+VgTLcS3zcmjQ8my3nxQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.NameResolution": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.lib.e_sqlite3.linux": { + "type": "Transitive", + "resolved": "1.1.14", + "contentHash": "1v/otrtQTWNTRBx9mmZly9AOR5OFzSDlHEuBSYrewTWI/jvUReYrE/YlpTwvgLFXkJizUii/Vao7K48WJEPjng==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.win.System.Console": "4.3.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.5", + "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Process": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tools": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "6WVCczFZKXwpWpzd/iJkYnsmWTSFFiU24Xx/YdHXBcu+nFI/ehTgeqdJQFbtRPzbrO3KtRNjvkhtj4t5/WwWsA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1", + "System.Collections": "4.0.11", + "System.Diagnostics.Debug": "4.0.11", + "System.Globalization": "4.0.11", + "System.Resources.ResourceManager": "4.0.1", + "System.Runtime": "4.1.0", + "System.Runtime.Extensions": "4.1.0", + "System.Threading": "4.0.11", + "runtime.native.System": "4.0.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization.Calendars": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.IO.MemoryMappedFiles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "mz2JJFxCQLdMzXVOPyVibDKDKFZey66YHgQy8M1/vUCQzMSrbiXhpsyV04vSlBeqQUdM7wTL2WG+X3GZALKsIQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.IO.UnmanagedMemoryStream": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Pipes": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "wpGJuACA6r8+KRckXoI6ghGTwgPRiICI6T7kgHI/m7S5eMqV/8jH37fzAUhTwIe9RwlH/j1sWwm2Q2zyXwZGHw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MZY/0cgRg5bcuvHR4LKHqWnlxWV7GkoTgBaOdwIoWGZKsfSBC1twDz+BzG0o1Rk46WdRhhV30E2qzsBABHwGUA==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0", + "runtime.native.System.IO.Ports": "5.0.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.Net.Sockets": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Extensions": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Timer": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tools/Cosmos.IL2CPU.Profiler/Cosmos.IL2CPU.Profiler.csproj b/Tools/Cosmos.IL2CPU.Profiler/Cosmos.IL2CPU.Profiler.csproj index 2c4a1ca481..fa28b838ec 100644 --- a/Tools/Cosmos.IL2CPU.Profiler/Cosmos.IL2CPU.Profiler.csproj +++ b/Tools/Cosmos.IL2CPU.Profiler/Cosmos.IL2CPU.Profiler.csproj @@ -3,7 +3,7 @@ netcoreapp2.0 Exe - win7-x86 + win-x86 Full diff --git a/Tools/ElfMap2DebugDb/ElfMap2DebugDb.csproj b/Tools/ElfMap2DebugDb/ElfMap2DebugDb.csproj index bade862fbd..6668157e9a 100644 --- a/Tools/ElfMap2DebugDb/ElfMap2DebugDb.csproj +++ b/Tools/ElfMap2DebugDb/ElfMap2DebugDb.csproj @@ -2,7 +2,7 @@ netcoreapp2.0 - win7-x86 + win-x86 Exe diff --git a/Tools/File2ByteArrayConverter/File2ByteArrayConverter.csproj b/Tools/File2ByteArrayConverter/File2ByteArrayConverter.csproj index 39fa091755..dc2f9d0906 100644 --- a/Tools/File2ByteArrayConverter/File2ByteArrayConverter.csproj +++ b/Tools/File2ByteArrayConverter/File2ByteArrayConverter.csproj @@ -1,7 +1,7 @@  - net471 + net472 WinExe True False diff --git a/Tools/ILSpyPlugAddIn/GenerateFieldAccessParameterEntry.cs b/Tools/ILSpyPlugAddIn/GenerateFieldAccessParameterEntry.cs deleted file mode 100644 index d30b03f6b4..0000000000 --- a/Tools/ILSpyPlugAddIn/GenerateFieldAccessParameterEntry.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using ICSharpCode.ILSpy; -using ICSharpCode.ILSpy.TreeNodes; -using Mono.Cecil; - -namespace Cosmos.ILSpyPlugs.Plugin -{ - [ExportContextMenuEntry(Header = "Cosmos Plug: Generate FieldAccess parameter")] - public class GenerateFieldAccessParameterEntry: BaseContextMenuEntry - { - public override bool IsVisible(TextViewContext context) - { - if (context?.SelectedTreeNodes != null) - { - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentField = node as FieldTreeNode; - if ((xCurrentField != null) && !xCurrentField.FieldDefinition.HasConstant) - { - return true; - } - } - } - return false; - } - - public override void Execute(TextViewContext context) - { - if (MessageBox.Show("Do you want to generate FieldAccess code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) - { - return; - } - - StringBuilder xString = new StringBuilder(); - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentField = node as FieldTreeNode; - if (xCurrentField != null) - { - xString.Append(GenerateField(xCurrentField.FieldDefinition)); - xString.AppendLine(); - } - } - - Clipboard.SetText(xString.ToString()); - - MessageBox.Show("Done", "Cosmos Plug tool"); - } - - public string GenerateField(FieldDefinition field) - { - StringBuilder xString = new StringBuilder(); - xString.Append($"[FieldAccess(Name = \"{field.FieldType.FullName} {field.DeclaringType.FullName}.{field.Name}\")] ref {Utilities.GetCSharpTypeName(field.FieldType)} field{field.Name}"); - return xString.ToString(); - } - } -} diff --git a/Tools/ILSpyPlugAddIn/GenerateMethodPlugEntry.cs b/Tools/ILSpyPlugAddIn/GenerateMethodPlugEntry.cs deleted file mode 100644 index ba1bfe95ae..0000000000 --- a/Tools/ILSpyPlugAddIn/GenerateMethodPlugEntry.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using ICSharpCode.ILSpy; -using ICSharpCode.ILSpy.TreeNodes; -using Mono.Cecil; - -namespace Cosmos.ILSpyPlugs.Plugin -{ - [ExportContextMenuEntry(Header = "Cosmos Plug: Generate method plug")] - public class GenerateMethodPlugEntry: BaseContextMenuEntry - { - public override bool IsVisible(TextViewContext context) - { - if (context?.SelectedTreeNodes != null) - { - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentMethod = node as MethodTreeNode; - if (xCurrentMethod != null) - { - return true; - } - } - } - return false; - } - - public override void Execute(TextViewContext context) - { - if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) - { - return; - } - - StringBuilder xString = new StringBuilder(); - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentMethod = node as MethodTreeNode; - xString.Append(GenerateMethod(xCurrentMethod.MethodDefinition)); - xString.AppendLine(); - } - - Clipboard.SetText(xString.ToString()); - - MessageBox.Show("Done", "Cosmos Plug tool"); - } - - public static string GenerateMethod(MethodDefinition method) - { - var xSB = new StringBuilder(); - - xSB.Append($"public static {Utilities.GetCSharpTypeName(method.ReturnType)} {Utilities.GetMethodName(method)}("); - var xAddComma = false; - - if (!method.IsStatic) - { - if (method.DeclaringType.IsValueType) - { - xSB.Append("ref "); - } - if (method.DeclaringType.IsPublic) - { - xSB.Append(Utilities.GetCSharpTypeName(method.DeclaringType)); - } - else - { - xSB.Append("object"); - } - xSB.Append(" "); - xSB.Append("aThis"); - xAddComma = true; - } - - foreach (var xParameter in method.Parameters) - { - if (xAddComma) - { - xSB.Append(", "); - } - xAddComma = true; - var xParameterTypeDef = xParameter.ParameterType as TypeDefinition; - if (xParameterTypeDef != null - && xParameterTypeDef.IsPublic) - { - xSB.Append(Utilities.GetCSharpTypeName(xParameter.ParameterType)); - } - else - { - xSB.Append("object"); - } - xSB.Append(" "); - xSB.Append(xParameter.Name); - } - - xSB.AppendLine(")"); - xSB.AppendLine("{"); - xSB.AppendLine("}"); - return xSB.ToString(); - } - } -} \ No newline at end of file diff --git a/Tools/ILSpyPlugAddIn/GeneratePropertyAccessorsPlugEntry.cs b/Tools/ILSpyPlugAddIn/GeneratePropertyAccessorsPlugEntry.cs deleted file mode 100644 index 1dd5f33cc2..0000000000 --- a/Tools/ILSpyPlugAddIn/GeneratePropertyAccessorsPlugEntry.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using ICSharpCode.ILSpy; -using ICSharpCode.ILSpy.TreeNodes; -using Mono.Cecil; - -namespace Cosmos.ILSpyPlugs.Plugin -{ - [ExportContextMenuEntry(Header = "Cosmos Plug: Generate method plug for all accessors")] - public class GeneratePropertyAccessorsPlugEntry: BaseContextMenuEntry - { - public override bool IsVisible(TextViewContext context) - { - if (context?.SelectedTreeNodes != null) - { - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentProperty = node as PropertyTreeNode; - if (xCurrentProperty != null) - { - return true; - } - } - } - return false; - } - - public override void Execute(TextViewContext context) - { - if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) - { - return; - } - - var xString = new StringBuilder(); - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentProperty = node as PropertyTreeNode; - if (node != null) - { - xString.Append(GenerateProperty(xCurrentProperty.PropertyDefinition)); - xString.AppendLine(); - } - } - - Clipboard.SetText(xString.ToString().Trim()); - - MessageBox.Show("Done", "Cosmos Plug tool"); - } - - public string GenerateProperty(PropertyDefinition property) - { - StringBuilder xString = new StringBuilder(); - if (property.GetMethod != null) - { - xString.AppendLine(GenerateMethodPlugEntry.GenerateMethod(property.GetMethod)); - xString.AppendLine(); - } - if (property.SetMethod != null) - { - xString.AppendLine(GenerateMethodPlugEntry.GenerateMethod(property.SetMethod)); - xString.AppendLine(); - } - return xString.ToString(); - } - } -} \ No newline at end of file diff --git a/Tools/ILSpyPlugAddIn/GenerateTypePlugEntry.cs b/Tools/ILSpyPlugAddIn/GenerateTypePlugEntry.cs deleted file mode 100644 index 9d2173d95c..0000000000 --- a/Tools/ILSpyPlugAddIn/GenerateTypePlugEntry.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using ICSharpCode.ILSpy; -using ICSharpCode.ILSpy.TreeNodes; -using Mono.Cecil; - -namespace Cosmos.ILSpyPlugs.Plugin -{ - [ExportContextMenuEntry(Header = "Cosmos Plug: Generate plug")] - public class GenerateTypePlugEntry : BaseContextMenuEntry - { - public override bool IsVisible(TextViewContext context) - { - if (context?.SelectedTreeNodes != null) - { - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentType = node as TypeTreeNode; - if (xCurrentType != null) - { - return true; - } - } - } - return false; - } - - public override void Execute(TextViewContext context) - { - if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) - { - return; - } - - var xString = new StringBuilder(); - foreach (var node in context.SelectedTreeNodes) - { - var xCurrentType = node as TypeTreeNode; - if (xCurrentType != null) - { - xString.Append(GenerateType(xCurrentType.TypeDefinition)); - xString.AppendLine(); - } - } - - Clipboard.SetText(xString.ToString()); - - MessageBox.Show("Done", "Cosmos Plug tool"); - } - - public string GenerateType(TypeDefinition type) - { - var xString = new StringBuilder(); - xString.AppendFormat( - type.IsPublic - ? "[Plug(Target = typeof(global::{0}))]" - : "[Plug(TargetName = \"{0}, {1}\")]", Utilities.GetCSharpTypeName(type), type.Module.Assembly.Name); - xString.AppendLine(); - xString.AppendFormat("public static class {0}Impl", type.Name); - xString.AppendLine(); - xString.AppendLine("{"); - xString.AppendLine("}"); - return xString.ToString(); - } - } -} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.sln b/Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.sln new file mode 100644 index 0000000000..d64a1ded83 --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29709.97 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILSpyPlugAddin", "ILSpyPlugAddin\ILSpyPlugAddin.csproj", "{08FE791B-5864-4E6F-AF7B-A02742C9C764}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILSpyPlugAddin.Tests", "ILSpyPlugAddin.Tests\ILSpyPlugAddin.Tests.csproj", "{573518BB-28C4-47DC-81A1-1C1FECDD87D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAssembly", "TestAssembly\TestAssembly.csproj", "{C13647E4-4A55-4962-9834-D2A26E54B985}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {08FE791B-5864-4E6F-AF7B-A02742C9C764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08FE791B-5864-4E6F-AF7B-A02742C9C764}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08FE791B-5864-4E6F-AF7B-A02742C9C764}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08FE791B-5864-4E6F-AF7B-A02742C9C764}.Release|Any CPU.Build.0 = Release|Any CPU + {573518BB-28C4-47DC-81A1-1C1FECDD87D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {573518BB-28C4-47DC-81A1-1C1FECDD87D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {573518BB-28C4-47DC-81A1-1C1FECDD87D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {573518BB-28C4-47DC-81A1-1C1FECDD87D3}.Release|Any CPU.Build.0 = Release|Any CPU + {C13647E4-4A55-4962-9834-D2A26E54B985}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C13647E4-4A55-4962-9834-D2A26E54B985}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C13647E4-4A55-4962-9834-D2A26E54B985}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C13647E4-4A55-4962-9834-D2A26E54B985}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DFF6D834-D4FF-4981-A1E0-E087501A6E36} + EndGlobalSection +EndGlobal diff --git a/Tools/ILSpyPlugAddIn/BaseContextMenuEntry.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/BaseContextMenuEntry.cs similarity index 100% rename from Tools/ILSpyPlugAddIn/BaseContextMenuEntry.cs rename to Tools/ILSpyPlugAddIn/ILSpyPlugAddin/BaseContextMenuEntry.cs diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateFieldAccessParameterEntry.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateFieldAccessParameterEntry.cs new file mode 100644 index 0000000000..7c07d13e5c --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateFieldAccessParameterEntry.cs @@ -0,0 +1,50 @@ +using System.Text; +using System.Windows; +using ICSharpCode.ILSpy; +using ICSharpCode.ILSpy.TreeNodes; + +namespace Cosmos.ILSpyPlugs.Plugin +{ + [ExportContextMenuEntry(Header = "Cosmos Plug: Generate FieldAccess parameter")] + public class GenerateFieldAccessParameterEntry: BaseContextMenuEntry + { + public override bool IsVisible(TextViewContext context) + { + if (context?.SelectedTreeNodes != null) + { + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentField = node as FieldTreeNode; + if ((xCurrentField != null) && !xCurrentField.FieldDefinition.IsConst) + { + return true; + } + } + } + return false; + } + + public override void Execute(TextViewContext context) + { + if (MessageBox.Show("Do you want to generate FieldAccess code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) + { + return; + } + + StringBuilder xString = new StringBuilder(); + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentField = node as FieldTreeNode; + if (xCurrentField != null) + { + xString.Append(Utilities.GenerateFieldAccessPlugEntry(xCurrentField.FieldDefinition)); + xString.AppendLine(); + } + } + + Clipboard.SetText(xString.ToString()); + + MessageBox.Show("Done", "Cosmos Plug tool"); + } + } +} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateMethodPlugEntry.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateMethodPlugEntry.cs new file mode 100644 index 0000000000..78434935b2 --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateMethodPlugEntry.cs @@ -0,0 +1,47 @@ +using System.Text; +using System.Windows; +using ICSharpCode.ILSpy; +using ICSharpCode.ILSpy.TreeNodes; + +namespace Cosmos.ILSpyPlugs.Plugin +{ + [ExportContextMenuEntry(Header = "Cosmos Plug: Generate method plug")] + public class GenerateMethodPlugEntry: BaseContextMenuEntry + { + public override bool IsVisible(TextViewContext context) + { + if (context?.SelectedTreeNodes != null) + { + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentMethod = node as MethodTreeNode; + if (xCurrentMethod != null) + { + return true; + } + } + } + return false; + } + + public override void Execute(TextViewContext context) + { + if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) + { + return; + } + + StringBuilder xString = new StringBuilder(); + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentMethod = node as MethodTreeNode; + xString.Append(Utilities.GenerateMethodPlugEntry(xCurrentMethod.MethodDefinition)); + xString.AppendLine(); + } + + Clipboard.SetText(xString.ToString()); + + MessageBox.Show("Done", "Cosmos Plug tool"); + } + } +} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GeneratePropertyAccessorsPlugEntry.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GeneratePropertyAccessorsPlugEntry.cs new file mode 100644 index 0000000000..b99d7ea86d --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GeneratePropertyAccessorsPlugEntry.cs @@ -0,0 +1,50 @@ +using System.Text; +using System.Windows; +using ICSharpCode.ILSpy; +using ICSharpCode.ILSpy.TreeNodes; + +namespace Cosmos.ILSpyPlugs.Plugin +{ + [ExportContextMenuEntry(Header = "Cosmos Plug: Generate method plug for all accessors")] + public class GeneratePropertyAccessorsPlugEntry: BaseContextMenuEntry + { + public override bool IsVisible(TextViewContext context) + { + if (context?.SelectedTreeNodes != null) + { + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentProperty = node as PropertyTreeNode; + if (xCurrentProperty != null) + { + return true; + } + } + } + return false; + } + + public override void Execute(TextViewContext context) + { + if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) + { + return; + } + + var xString = new StringBuilder(); + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentProperty = node as PropertyTreeNode; + if (node != null) + { + xString.Append(Utilities.GeneratePropertyPlugEntry(xCurrentProperty.PropertyDefinition)); + xString.AppendLine(); + } + } + + Clipboard.SetText(xString.ToString().Trim()); + + MessageBox.Show("Done", "Cosmos Plug tool"); + } + } +} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateTypePlugEntry.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateTypePlugEntry.cs new file mode 100644 index 0000000000..b66427ddec --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/GenerateTypePlugEntry.cs @@ -0,0 +1,50 @@ +using System.Text; +using System.Windows; +using ICSharpCode.ILSpy; +using ICSharpCode.ILSpy.TreeNodes; + +namespace Cosmos.ILSpyPlugs.Plugin +{ + [ExportContextMenuEntry(Header = "Cosmos Plug: Generate plug")] + public class GenerateTypePlugEntry : BaseContextMenuEntry + { + public override bool IsVisible(TextViewContext context) + { + if (context?.SelectedTreeNodes != null) + { + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentType = node as TypeTreeNode; + if (xCurrentType != null) + { + return true; + } + } + } + return false; + } + + public override void Execute(TextViewContext context) + { + if (MessageBox.Show("Do you want to generate plug code to your clipboard?", "Cosmos Plug tool", MessageBoxButton.YesNo) == MessageBoxResult.No) + { + return; + } + + var xString = new StringBuilder(); + foreach (var node in context.SelectedTreeNodes) + { + var xCurrentType = node as TypeTreeNode; + if (xCurrentType != null) + { + xString.Append(Utilities.GenerateTypePlugEntry(xCurrentType.TypeDefinition)); + xString.AppendLine(); + } + } + + Clipboard.SetText(xString.ToString()); + + MessageBox.Show("Done", "Cosmos Plug tool"); + } + } +} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.csproj b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/ILSpyPlugAddIn.csproj similarity index 84% rename from Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.csproj rename to Tools/ILSpyPlugAddIn/ILSpyPlugAddin/ILSpyPlugAddIn.csproj index 7f4a317eba..d785085cf1 100644 --- a/Tools/ILSpyPlugAddIn/ILSpyPlugAddIn.csproj +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/ILSpyPlugAddIn.csproj @@ -1,7 +1,7 @@  - net46 + net462 Cosmos.ILSpyPlugs.Plugin Cosmos.ILSpyPlugs.Plugin True @@ -9,8 +9,8 @@ + - diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Properties/launchSettings.json b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Properties/launchSettings.json new file mode 100644 index 0000000000..f20a7047ac --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "ILSpyPlugAddin": { + "commandName": "Executable", + "executablePath": "./ILSpy.exe" + } + } +} diff --git a/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Utilities.cs b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Utilities.cs new file mode 100644 index 0000000000..b7fef6453a --- /dev/null +++ b/Tools/ILSpyPlugAddIn/ILSpyPlugAddin/Utilities.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy; + +namespace Cosmos.ILSpyPlugs.Plugin +{ + public static class Utilities + { + public static string GenerateTypePlugEntry(ITypeDefinition type) + { + var xSB = new StringBuilder(); + xSB.AppendFormat( + type.Accessibility == Accessibility.Public + ? "[Plug(Target = typeof(global::{0}))]" + : "[Plug(TargetName = \"{0}, {1}\")]", Utilities.GetCSharpTypeName(type), type.ParentModule.AssemblyName); + xSB.AppendLine(); + xSB.AppendFormat("public static class {0}Impl", type.Name); + xSB.AppendLine(); + xSB.AppendLine("{"); + xSB.AppendLine("}"); + return xSB.ToString(); + } + + public static string GenerateMethodPlugEntry(IMethod method) + { + var xSB = new StringBuilder(); + + xSB.Append($"public static {Utilities.GetCSharpTypeName(method.ReturnType)} {Utilities.GetMethodName(method)}("); + var xAddComma = false; + + if (!method.IsStatic) + { + if (method.DeclaringType.IsReferenceType ?? false) + { + xSB.Append("ref "); + } + if (method.DeclaringType.GetDefinition().Accessibility == Accessibility.Public) + { + xSB.Append(Utilities.GetCSharpTypeName(method.DeclaringType)); + } + else + { + xSB.Append("object"); + } + xSB.Append(" "); + xSB.Append("aThis"); + xAddComma = true; + } + + foreach (var xParameter in method.Parameters) + { + if (xAddComma) + { + xSB.Append(", "); + } + xAddComma = true; + var xParameterTypeDef = xParameter.Type.GetDefinition(); + if (xParameterTypeDef != null + && xParameterTypeDef.Accessibility == Accessibility.Public) + { + xSB.Append(Utilities.GetCSharpTypeName(xParameter.Type)); + } + else + { + xSB.Append("object"); + } + xSB.Append(" "); + xSB.Append(xParameter.Name); + } + + xSB.AppendLine(")"); + xSB.AppendLine("{"); + xSB.AppendLine("}"); + return xSB.ToString(); + } + + public static string GenerateFieldAccessPlugEntry(IField field) + { + var xSB = new StringBuilder(); + xSB.Append($"[FieldAccess(Name = \"{field.Type.FullName} {field.DeclaringType.FullName}.{field.Name}\")] ref {Utilities.GetCSharpTypeName(field.Type)} field{field.Name}"); + return xSB.ToString(); + } + + public static string GeneratePropertyPlugEntry(IProperty property) + { + var xSB = new StringBuilder(); + if (property.Getter != null) + { + xSB.AppendLine(GenerateMethodPlugEntry(property.Getter)); + xSB.AppendLine(); + } + if (property.Setter != null) + { + xSB.AppendLine(GenerateMethodPlugEntry(property.Setter)); + xSB.AppendLine(); + } + return xSB.ToString(); + } + + private static string GetCSharpTypeName(IType type) + { + var xCSharp = Languages.GetLanguage("C#"); + + return xCSharp.TypeToString(type, true); + } + + private static string GetMethodName(IMethod method) + { + if (method.IsConstructor) + { + if (method.IsStatic) + { + return "Cctor"; + } + else + { + return "Ctor"; + } + } + return method.Name; + } + } +} diff --git a/Tools/ILSpyPlugAddIn/Properties/launchSettings.json b/Tools/ILSpyPlugAddIn/Properties/launchSettings.json deleted file mode 100644 index fb7568c232..0000000000 --- a/Tools/ILSpyPlugAddIn/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "ILSpyPlugAddIn": { - "commandName": "Executable", - "executablePath": "./ILSpy.exe" - } - } -} diff --git a/Tools/ILSpyPlugAddIn/Utilities.cs b/Tools/ILSpyPlugAddIn/Utilities.cs deleted file mode 100644 index 75a898c421..0000000000 --- a/Tools/ILSpyPlugAddIn/Utilities.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using ICSharpCode.ILSpy; -using Mono.Cecil; - -namespace Cosmos.ILSpyPlugs.Plugin -{ - public static class Utilities - { - public static string GetCSharpTypeName(TypeReference reference) - { - var xCSharp = Languages.GetLanguage("C#"); - - return xCSharp.TypeToString(reference, true); - } - - public static string GetMethodName(MethodDefinition method) - { - if (method.IsConstructor) - { - if (method.IsStatic) - { - return "Cctor"; - } - else - { - return "Ctor"; - } - } - return method.Name; - } - } -} \ No newline at end of file diff --git a/Tools/ILSpyPlugAddin/TestAssembly/TestAssembly.csproj b/Tools/ILSpyPlugAddin/TestAssembly/TestAssembly.csproj new file mode 100644 index 0000000000..c706342772 --- /dev/null +++ b/Tools/ILSpyPlugAddin/TestAssembly/TestAssembly.csproj @@ -0,0 +1,9 @@ + + + + net6.0 + + false + + + diff --git a/Tools/NASM/NASM.csproj b/Tools/NASM/NASM.csproj index cf59f03b97..c6474029b7 100644 --- a/Tools/NASM/NASM.csproj +++ b/Tools/NASM/NASM.csproj @@ -1,9 +1,10 @@  - netcoreapp2.0 - win7-x86 + net6.0 + win-x86 Exe + Debug;Release;TEST diff --git a/Tools/NASM/Program.cs b/Tools/NASM/Program.cs index cc548256ab..e2f0b4f431 100644 --- a/Tools/NASM/Program.cs +++ b/Tools/NASM/Program.cs @@ -91,11 +91,13 @@ public static int Run(string[] args, Action logMessage, Action l } string xFormat = IsELF ? "elf" : "bin"; - string xArgs = string.Format("-g -f {0} -o \"{1}\" -D{3}_COMPILATION -O0 \"{2}\"", + string xDebugFormat = IsELF ? "dwarf2" : "null"; + string xArgs = string.Format("-g {4} -f {0} -o \"{1}\" -D{3}_COMPILATION -O0 \"{2}\"", xFormat, Path.Combine(Directory.GetCurrentDirectory(), OutputFile), Path.Combine(Directory.GetCurrentDirectory(), InputFile), - xFormat.ToUpper()); + xFormat.ToUpper(), + xDebugFormat); var xProcess = Process.Start(ExePath, xArgs); diff --git a/Tools/NASM/packages.lock.json b/Tools/NASM/packages.lock.json new file mode 100644 index 0000000000..9bcee6e63b --- /dev/null +++ b/Tools/NASM/packages.lock.json @@ -0,0 +1,841 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "System.Diagnostics.Process": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lw1/VwLH1yxz6SfFEjVRCN0pnflLEsWgnV4qsdJ512/HhTwnKXUG+zDQ4yTO3K/EJQemGoNaBHX5InISNKTzUQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Security.Claims": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Security.Principal": "4.3.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Claims": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Thread": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading.ThreadPool": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "k/+g4b7vjdd4aix83sTgC9VG6oXYKAktSfNIJUNGxPEj7ryEOfzHHhfnmsZvjxawwcD9HyWXKCXmPjX8U4zeSw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + } + }, + "net6.0/win-x86": { + "System.Diagnostics.Process": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "J0wOX07+QASQblsfxmIMFc9Iq7KTXYL3zs2G/Xc704Ylv3NpuVdo6gij6V3PGiptTxqsK0K7CdXenRvKUnkA2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "Microsoft.Win32.Registry": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.Threading.ThreadPool": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.NameResolution": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "AFYl08R7MrsrEjqpQWTZWBadqXyTzNDaWpMqyxhb0d6sGhV6xMDKueuBXlLL30gz+DIRY6MpdgnHWlCh5wmq9w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Principal.Windows": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.win.System.Net.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.Microsoft.Win32.Primitives": "4.3.0" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lw1/VwLH1yxz6SfFEjVRCN0pnflLEsWgnV4qsdJ512/HhTwnKXUG+zDQ4yTO3K/EJQemGoNaBHX5InISNKTzUQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.any.System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "23g6rqftKmovn2cLeGsuHUYm0FD7pdutb0uQMJpZ3qTvq+zHkgmt6J65VtRry4WDGYlmkMa4xDACtaQ94alNag==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "runtime.any.System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1lpifymjGDzoYIaam6/Hyqf8GhBI3xXYLK2TgEvTtuZMorG3Kb9QnMTIKhLjJYXIiu1JvxjngHvtVFQQlpQ3HQ==" + }, + "runtime.any.System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sMDBnad4rp4t7GY442Jux0MCUuKL4otn5BK6Ni0ARTXTSpRNBzZ7hpMfKSvnVSED5kYJm96YOWsqV0JH0d2uuw==" + }, + "runtime.any.System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SDZ5AD1DtyRoxYtEcqQ3HDlcrorMYXZeCt7ZhG9US9I5Vva+gpIWDGMkcwa5XiKL0ceQKRZIX2x0XEjLX7PDzQ==" + }, + "runtime.any.System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hLC3A3rI8jipR5d9k7+f0MgRCW6texsAp0MWkN/ci18FMtQ9KH7E2vDn/DH2LkxsszlpJpOn9qy6Z6/69rH6eQ==" + }, + "runtime.any.System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Nrm1p3armp6TTf2xuvaa+jGTTmncALWFq22CpmwRvhDf6dE9ZmH40EbOswD4GnFLrMRS0Ki6Kx5aUPmKK/hZBg==" + }, + "runtime.any.System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Lxb89SMvf8w9p9+keBLyL6H6x/TEmc6QVsIIA0T36IuyOY3kNvIdyGddA2qt35cRamzxF8K5p0Opq4G4HjNbhQ==" + }, + "runtime.any.System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fRS7zJgaG9NkifaAxGGclDDoRn9HC7hXACl52Or06a/fxdzDajWb5wov3c6a+gVSlekRoexfjwQSK9sh5um5LQ==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "runtime.any.System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GG84X6vufoEzqx8PbeBKheE4srOhimv+yLtGb/JkR3Y2FmoqmueLNFU4Xx8Y67plFpltQSdK74x0qlEhIpv/CQ==" + }, + "runtime.any.System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lBoFeQfxe/4eqjPi46E0LU/YaCMdNkQ8B4MZu/mkzdIAZh8RQ1NYZSj0egrQKdgdvlPFtP4STtob40r4o2DBAw==" + }, + "runtime.any.System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+ihI5VaXFCMVPJNstG4O4eo1CfbrByLxRrQQTqOTp1ttK0kUKDqOdBSTaCB2IBk/QtjDrs6+x4xuezyMXdm0HQ==" + }, + "runtime.any.System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NLrxmLsfRrOuVqPWG+2lrQZnE53MLVeo+w9c54EV+TUo4c8rILpsDXfY8pPiOy9kHpUHHP07ugKmtsU3vVW5Jg==" + }, + "runtime.any.System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OhBAVBQG5kFj1S+hCEQ3TUHBAEtZ3fbEMgZMRNdN8A0Pj4x+5nTELEqL59DU0TjKVE6II3dqKw4Dklb3szT65w==" + }, + "runtime.win.Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NU51SEt/ZaD2MF48sJ17BIqx7rjeNNLXUevfMOjqQIetdndXwYjZfZsT6jD+rSWp/FYxjesdK4xUSl4OTEI0jw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "runtime.win.System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "hHHP0WCStene2jjeYcuDkETozUYF/3sHVRHAEOgS3L15hlip24ssqCTnJC28Z03Wpo078oMcJd0H4egD2aJI8g==" + }, + "runtime.win.System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z37zcSCpXuGCYtFbqYO0TwOVXxS2d+BXgSoDFZmRg8BC4Cuy54edjyIvhhcfCrDQA9nl+EPFTgHN54dRAK7mNA==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Overlapped": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "runtime.win.System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lkXXykakvXUU+Zq2j0pC6EO20lEhijjqMc01XXpp1CJN+DeCwl3nsj4t5Xbpz3kA7yQyTqw6d9SyIzsyLsV3zA==", + "dependencies": { + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "runtime.win.System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RkgHVhUPvzZxuUubiZe8yr/6CypRVXj0VBzaR8hsqQ8f+rUo7e4PWrHTLOCjd8fBMGWCrY//fi7Ku3qXD7oHRw==", + "dependencies": { + "System.Private.Uri": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Collections": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Diagnostics.Debug": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Diagnostics.Tracing": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Globalization": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.any.System.IO": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.win.System.IO.FileSystem": "4.3.0" + } + }, + "System.Private.Uri": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I4SwANiUGho1esj4V4oSlPllXjzCZDE+5XXso2P03LW2vOda2Enzh8DWOxwN6hnrJyp314c7KuVu31QYhRzOGg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Reflection.Primitives": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Resources.ResourceManager": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "runtime.any.System.Runtime": "4.3.0" + } + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.win.System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "runtime.any.System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HVL1rvqYtnRCxFsYag/2le/ZfKLK4yMw79+s6FmKXbSCNN0JeAhrYxnRAHFoWRa0dEojsDcbBSpH3l22QxAVyw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Claims": "4.3.0", + "System.Security.Principal": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.any.System.Text.Encoding.Extensions": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Overlapped": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m3HQ2dPiX/DSTpf+yJt8B0c+SRvzfqAJKx+QDWi+VLhz8svLT23MVjEOHPF/KiSLeArKU/iHescrbLd3yVgyNg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "runtime.any.System.Threading.Tasks": "4.3.0" + } + } + } + } +} \ No newline at end of file diff --git a/Tools/PlugsInspector/PlugsInspector.csproj b/Tools/PlugsInspector/PlugsInspector.csproj index af427645ee..74f0838520 100644 --- a/Tools/PlugsInspector/PlugsInspector.csproj +++ b/Tools/PlugsInspector/PlugsInspector.csproj @@ -1,9 +1,9 @@ - net471 + net472 Exe - win7-x86 + win-x86 Full diff --git a/Tools/TTF2OPFF Converter/TTF2OPFF Converter.csproj b/Tools/TTF2OPFF Converter/TTF2OPFF Converter.csproj index 7eb71c7fe0..e941e416eb 100644 --- a/Tools/TTF2OPFF Converter/TTF2OPFF Converter.csproj +++ b/Tools/TTF2OPFF Converter/TTF2OPFF Converter.csproj @@ -1,7 +1,7 @@  - net471 + net472 WinExe True False diff --git a/Users/BlueSkeye/GuessForBochs/GuessForBochs.Cosmos b/Users/BlueSkeye/GuessForBochs/GuessForBochs.Cosmos deleted file mode 100644 index 634a6c18e4..0000000000 --- a/Users/BlueSkeye/GuessForBochs/GuessForBochs.Cosmos +++ /dev/null @@ -1,303 +0,0 @@ - - - - Debug - 2.0 - {5DE37AE3-3F59-4D15-851B-945C23DBB633} - false - GuessForBochs - elf - Guess - SAK - SAK - SAK - SAK - - - ISO - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - PXE - Player - false - Player - ISO - - ISO - Bochs - True - - Cosmos.bxrc - PXE - None - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - USB - None - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - ISO - VMware - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - ISO - Bochs - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - ISO - None - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - GuessForBochs - Makes a USB device such as a flash drive or external hard disk bootable. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - GuessForBochs - Use VMware Player or Workstation to deploy and debug. - GuessForBochs - Use Bochs emulator to deploy and debug. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - Slave - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - Pipe: Cosmos\Serial - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Pipe: Cosmos\Serial - Serial: COM1 - False - False - False - False - False - False - Pipe: Cosmos\Serial - False - Pipe: Cosmos\Serial - - - ISO - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - PXE - Player - false - Player - ISO - - ISO - Bochs - False - - PXE - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - USB - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - ISO - VMware - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - ISO - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - GuessForBochs - Makes a USB device such as a flash drive or external hard disk bootable. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - GuessForBochs - Use VMware Player or Workstation to deploy and debug. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - Slave - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - Serial: COM1 - Serial: COM1 - Serial: COM1 - Pipe: Cosmos\Serial - - Pipe: Cosmos\Serial - - Pipe: Cosmos\Serial - - Pipe: Cosmos\Serial - - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - False - False - False - False - False - False - - - - GuessKernel - {73cf15c1-0ab6-4b3a-8142-d326ada72970} - True - - - Cosmos.Debug.Kernel.Plugs - {b97a2956-c363-47f2-a6aa-b4fccff4d315} - True - - - Cosmos.System_Plugs - {7c64b97f-516d-4a6d-b9e1-3fe48f561409} - True - - - Cosmos.Core_Plugs - {d9a87aad-fcc9-4517-b31d-e904dad00784} - True - - - - - Content - - - - - - \ No newline at end of file diff --git a/Users/BlueSkeye/XSharpTestCases/DoTests.cmd b/Users/BlueSkeye/XSharpTestCases/DoTests.cmd deleted file mode 100644 index de37270baa..0000000000 --- a/Users/BlueSkeye/XSharpTestCases/DoTests.cmd +++ /dev/null @@ -1 +0,0 @@ -..\..\..\..\XSharp\source\XSharp.Test\bin\Debug\XSharp.Test.exe -d . \ No newline at end of file diff --git a/Users/BlueSkeye/XSharpTestCases/Issue15662-SingleSlashLine.xs b/Users/BlueSkeye/XSharpTestCases/Issue15662-SingleSlashLine.xs deleted file mode 100644 index c86b061ce3..0000000000 --- a/Users/BlueSkeye/XSharpTestCases/Issue15662-SingleSlashLine.xs +++ /dev/null @@ -1,2 +0,0 @@ -// A single slash at line start makes the compiler crash. -/ diff --git a/Users/BlueSkeye/XSharpTestCases/Issue15663-UnproperlyFormattedComment.xs b/Users/BlueSkeye/XSharpTestCases/Issue15663-UnproperlyFormattedComment.xs deleted file mode 100644 index a58886c338..0000000000 --- a/Users/BlueSkeye/XSharpTestCases/Issue15663-UnproperlyFormattedComment.xs +++ /dev/null @@ -1,3 +0,0 @@ -// The below line is considered to be a comment despite the -// space between the two slahes. -/ / This should not be considered a comment. diff --git a/Users/BlueSkeye/XSharpTestCases/Issue15665-UnbalancedClosingCurlyBracesImproperlyHandled.xs b/Users/BlueSkeye/XSharpTestCases/Issue15665-UnbalancedClosingCurlyBracesImproperlyHandled.xs deleted file mode 100644 index 281db0b85e..0000000000 --- a/Users/BlueSkeye/XSharpTestCases/Issue15665-UnbalancedClosingCurlyBracesImproperlyHandled.xs +++ /dev/null @@ -1,6 +0,0 @@ -namespace TEST -// The closing curly brace below doesn't match any function or -// interrupt handler opening brace. However the compiler silently -// generate some assembler code without complaining. -} - diff --git a/Users/BlueSkeye/XSharpTestCases/Issue15666-LastFunctionNotCheckedForCompletion.xs b/Users/BlueSkeye/XSharpTestCases/Issue15666-LastFunctionNotCheckedForCompletion.xs deleted file mode 100644 index 88ba6ae31e..0000000000 --- a/Users/BlueSkeye/XSharpTestCases/Issue15666-LastFunctionNotCheckedForCompletion.xs +++ /dev/null @@ -1,7 +0,0 @@ -// The last function in this source file is missing a closing curly -// brace. However the compiler doesn't complain. The NASM compilation -// step will fail because the "return" keyword invokes the missing -// label TEST_Last_Exit. -namespace TEST -function Last { -return \ No newline at end of file diff --git a/Users/Clearosdev/StandAloneDebug/StandAloneDebug.sln b/Users/Clearosdev/StandAloneDebug/StandAloneDebug.sln deleted file mode 100644 index 2b7a56b9f5..0000000000 --- a/Users/Clearosdev/StandAloneDebug/StandAloneDebug.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandAloneDebug", "StandAloneDebug\StandAloneDebug.csproj", "{C9C9EA4D-587F-48E4-B207-792F21886A92}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C9C9EA4D-587F-48E4-B207-792F21886A92}.Debug|x86.ActiveCfg = Debug|x86 - {C9C9EA4D-587F-48E4-B207-792F21886A92}.Debug|x86.Build.0 = Debug|x86 - {C9C9EA4D-587F-48E4-B207-792F21886A92}.Release|x86.ActiveCfg = Release|x86 - {C9C9EA4D-587F-48E4-B207-792F21886A92}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Debugger.cs b/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Debugger.cs deleted file mode 100644 index b0f0034d13..0000000000 --- a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Debugger.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace StandAloneDebug -{ - class Debugger - { - public enum printtype - { - error, - warrning, - message - } - - public static void Run() - { - while (Program.running) - { - if (Program.type == Program.types.Vmware) - { - //execute vmware debugger - } - else if (Program.type == Program.types.Broche) - { - //execute broche debugger - } - } - } - - public static void Print(string message, printtype type) - { - if (type == printtype.error) - { - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine(message); - } - else if (type == printtype.warrning) - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine(message); - } - else if (type == printtype.message) - { - Console.ForegroundColor = ConsoleColor.White; - Console.WriteLine(message); - } - if (Program.printtofile == true) - { - if (type == printtype.error) - { - Program.output += "[error] " + message + '\n'; - } - else if (type == printtype.message) - { - Program.output += "[message] " + message + '\n'; - } - else if (type == printtype.warrning) - { - Program.output += "[warrning] " + message + '\n'; - } - } - } - } -} \ No newline at end of file diff --git a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Program.cs b/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Program.cs deleted file mode 100644 index 9ce12533a6..0000000000 --- a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Program.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace StandAloneDebug -{ - //this gets called form IL2CPU after its compiles the os and arguments are based on property file - class Program - { - public static bool running = false; - public static bool printtofile = false; - public static types type; - public static string output; - - public enum types - { - Vmware, - Broche - } - - static void Main(string[] args) - { - AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit); - if (args.Length < 2) - { - if (args[1] == "vmware") - { - running = true; - type = types.Vmware; - } - else if (args[1] == "broche") - { - running = true; - type = types.Broche; - } - else - { - throw new ArgumentNullException("Not a correct argument"); - } - } - - Debugger.Run(); - } - - static void OnProcessExit(object sender, EventArgs e) - { - if (printtofile == true) - { - StreamWriter writer = new StreamWriter("debugoutput.txt"); - writer.Write(output); - writer.Close(); - } - } - } -} diff --git a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Properties/AssemblyInfo.cs b/Users/Clearosdev/StandAloneDebug/StandAloneDebug/Properties/AssemblyInfo.cs deleted file mode 100644 index 1d29279609..0000000000 --- a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/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("StandAloneDebug")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("StandAloneDebug")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2013")] -[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("6bf65d7a-813a-4114-86d9-7bf618676810")] - -// 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/Users/Clearosdev/StandAloneDebug/StandAloneDebug/StandAloneDebug.csproj b/Users/Clearosdev/StandAloneDebug/StandAloneDebug/StandAloneDebug.csproj deleted file mode 100644 index 7d99b56ee6..0000000000 --- a/Users/Clearosdev/StandAloneDebug/StandAloneDebug/StandAloneDebug.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {C9C9EA4D-587F-48E4-B207-792F21886A92} - Exe - Properties - StandAloneDebug - StandAloneDebug - v4.7.1 - Client - 512 - - - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - diff --git a/Users/EdNutting/EdNuttingsTest/AssemblyInfo.cs b/Users/EdNutting/EdNuttingsTest/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/EdNutting/EdNuttingsTest/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/EdNutting/EdNuttingsTest/EdNuttingsTestBoot.Cosmos b/Users/EdNutting/EdNuttingsTest/EdNuttingsTestBoot.Cosmos deleted file mode 100644 index 0b6ac5f101..0000000000 --- a/Users/EdNutting/EdNuttingsTest/EdNuttingsTestBoot.Cosmos +++ /dev/null @@ -1,52 +0,0 @@ - - - - Debug - 2.0 - {6c741857-f812-4d37-85ca-a0487b95a8d7} - false - EdNuttingsTestBoot - elf - v4.6.2 - SAK - SAK - SAK - SAK - - - VMware - - true - Source - User - False - false - Player - bin\Debug\ - EdNuttingsTestBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - - - - - - - - - EdNuttingsTest - {05fc6729-a0e3-48a4-ac5c-a0126f1972f4} - True - - - - - diff --git a/Users/EdNutting/EdNuttingsTest/Kernel.cs b/Users/EdNutting/EdNuttingsTest/Kernel.cs deleted file mode 100644 index 9df799c467..0000000000 --- a/Users/EdNutting/EdNuttingsTest/Kernel.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using FAT = Cosmos.System.Filesystem.FAT; -using Cosmos.Hardware.BlockDevice; -using Cosmos.System.Filesystem.FAT; - -namespace EdNuttingsTest -{ - public class Kernel : Sys.Kernel - { - protected override void Run() - { - try - { - Console.ReadLine(); - - Console.WriteLine(); - Console.WriteLine("Block devices found: " + BlockDevice.Devices.Count); - - AtaPio xATA = null; - for (int i = 0; i < BlockDevice.Devices.Count; i++) - { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is AtaPio) - { - xATA = (AtaPio)xDevice; - } - } - - //Info - Console.WriteLine("--------------------------"); - Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - Console.WriteLine("Serial No: " + xATA.SerialNo); - Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - Console.WriteLine("Model No: " + xATA.ModelNo); - Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - Console.WriteLine("Size: " + xATA.BlockCount * xATA.BlockSize / 1024 / 1024 + " MB"); - - //Partition Detecting - Partition xPartition = null; - if (BlockDevice.Devices.Count > 0) - { - for (int i = 0; i < BlockDevice.Devices.Count; i++) - { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is Partition) - { - xPartition = (Partition)xDevice; - - Console.WriteLine("FAT FS"); - var xFS = new FAT.FatFileSystem(xPartition); - - Console.WriteLine("Mapping..."); - Sys.Filesystem.FileSystem.AddMapping("C", xFS); - - - Console.WriteLine(); - Console.WriteLine("Root directory"); - - var xListing = xFS.GetRoot(); - FAT.Listing.FatFile xRootFile = null; - FAT.Listing.FatFile xKudzuFile = null; - - - for (int j = 0; j < xListing.Count; j++) - { - var xItem = xListing[j]; - if (xItem is Sys.Filesystem.Listing.Directory) - { - //Detecting Dir in HDD - Console.WriteLine(" " + xListing[j].Name); - } - else if (xItem is Sys.Filesystem.Listing.File) - { - //Detecting File in HDD - Console.WriteLine(" " + xListing[j].Name + " (" + xListing[j].Size + ")"); - if (xListing[j].Name == "Root.txt") - { - xRootFile = (FAT.Listing.FatFile)xListing[j]; - } - else if (xListing[j].Name == "Kudzu.txt") - { - xKudzuFile = (FAT.Listing.FatFile)xListing[j]; - } - } - } - - try - { - Console.WriteLine(); - Console.WriteLine("StreamReader - Root.txt File"); - var xStream = new FAT.FatStream(xRootFile); - var xData = new byte[xRootFile.Size]; - xStream.Read(xData, 0, (int)xData.Length); - var xText = Encoding.ASCII.GetString(xData); - Console.WriteLine(xText); - } - catch (Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - try - { - Console.WriteLine(); - Console.WriteLine("StreamReader - Kudzu.txt File"); - var xStream = new FAT.FatStream(xKudzuFile); - var xData = new byte[xKudzuFile.Size]; - xStream.Read(xData, 0, (int)xData.Length); - var xText = Encoding.ASCII.GetString(xData); - Console.WriteLine(xText); - } - catch (Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - - //var xKudzuStream = new Sys.Filesystem.FAT.FatStream(xKudzuFile); - //var xKudzuData = new byte[xKudzuFile.Size]; - //xKudzuStream.Read(xKudzuData, 0, (int)xKudzuFile.Size); - - try - { - //Console.WriteLine(); - //Console.WriteLine("FileStream - Root File"); - //var xRootFileStream = new System.IO.FileStream(@"c:\Root.txt", System.IO.FileMode.Open); - //var xData = new byte[xRootFileStream.Length]; - //xRootFileStream.Read(xData, 0, (int)xRootFile.Size); - //var xText = Encoding.ASCII.GetString(xData); - //Console.WriteLine(xText); - } - catch(Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - } - } - } - else - { - Console.WriteLine("No Block Device Found! "); - } - } - catch (Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - } - } -} diff --git a/Users/Emile/Emile.TestApp/App.config b/Users/Emile/Emile.TestApp/App.config deleted file mode 100644 index 8fc0551220..0000000000 --- a/Users/Emile/Emile.TestApp/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Users/Emile/Emile.TestApp/Emile.TestApp.csproj b/Users/Emile/Emile.TestApp/Emile.TestApp.csproj deleted file mode 100644 index 482a2fb5dc..0000000000 --- a/Users/Emile/Emile.TestApp/Emile.TestApp.csproj +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Debug - x86 - {99A78D26-0277-4882-97BE-F5A0FA90CBCF} - Exe - Properties - Emile.TestApp - Emile.TestApp - v4.7.1 - 512 - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x64 - prompt - MinimumRecommendedRules.ruleset - true - - - bin\Release\ - TRACE - true - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - true - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - prompt - MinimumRecommendedRules.ruleset - true - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - true - - - true - bin\Debug\ - DEBUG;TRACE - true - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - true - - - bin\Release\ - TRACE - true - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - true - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Emile/Emile.TestApp/Program.cs b/Users/Emile/Emile.TestApp/Program.cs deleted file mode 100644 index 4479299577..0000000000 --- a/Users/Emile/Emile.TestApp/Program.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Emile.TestApp -{ - internal class Program - { - private static unsafe void Main(string[] args) - { - var xMemoryBlock = new int[1024*1024*2]; - var xMemoryBlockSize = xMemoryBlock.Length * 4; - // we have an 8 MB block now - fixed (int* xStart = &xMemoryBlock[0]) - { - ReallySimpleAllocator.Initialize(xStart, xMemoryBlockSize); - - // now you can just use if however you like: - - - // allocate a 1 kilobyte block - var xBlock1 = ReallySimpleAllocator.Allocate(1024); - - // another one - var xBlock2 = ReallySimpleAllocator.Allocate(1024); - - ReallySimpleAllocator.Free(xBlock1); - xBlock1 = ReallySimpleAllocator.Allocate(1024); - - // etc - - - - // there's no need to cleanup. - } - - } - } -} diff --git a/Users/Emile/Emile.TestApp/Properties/AssemblyInfo.cs b/Users/Emile/Emile.TestApp/Properties/AssemblyInfo.cs deleted file mode 100644 index 79cb6aa55c..0000000000 --- a/Users/Emile/Emile.TestApp/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("Emile.TestApp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Emile.TestApp")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[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("e112ace8-b4a3-47a5-8b91-f189888846f7")] - -// 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/Users/Emile/Emile.TestApp/ReallySimpleAllocator.cs b/Users/Emile/Emile.TestApp/ReallySimpleAllocator.cs deleted file mode 100644 index 80706f8da0..0000000000 --- a/Users/Emile/Emile.TestApp/ReallySimpleAllocator.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Emile.TestApp -{ - public unsafe static class ReallySimpleAllocator - { - public static void Initialize(int* startAddress, int length) - { - throw new NotImplementedException(); - } - - public static int* Allocate(int length) - { - throw new NotImplementedException(); - } - - public static void Free(int* pointer) - { - throw new NotImplementedException(); - } - } -} diff --git a/Users/Emile/TestBed/TestBed.sln b/Users/Emile/TestBed/TestBed.sln deleted file mode 100644 index 80aa97202b..0000000000 --- a/Users/Emile/TestBed/TestBed.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestBed", "TestBed\TestBed.csproj", "{4BD6A15B-DFD3-4A63-8097-88D2F79ED590}" -EndProject -Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "TestBedBoot", "TestBed\TestBedBoot.Cosmos", "{55E633B7-8252-4B48-948B-EC83338CAC61}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Debug|x86.ActiveCfg = Debug|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Debug|x86.Build.0 = Debug|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Release|Any CPU.Build.0 = Release|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Release|x86.ActiveCfg = Release|Any CPU - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590}.Release|x86.Build.0 = Release|Any CPU - {55E633B7-8252-4B48-948B-EC83338CAC61}.Debug|Any CPU.ActiveCfg = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Debug|Any CPU.Build.0 = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Debug|x86.ActiveCfg = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Debug|x86.Build.0 = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Release|Any CPU.ActiveCfg = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Release|Any CPU.Build.0 = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Release|x86.ActiveCfg = Debug|x86 - {55E633B7-8252-4B48-948B-EC83338CAC61}.Release|x86.Build.0 = Debug|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Users/Emile/TestBed/TestBed/AssemblyInfo.cs b/Users/Emile/TestBed/TestBed/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/Emile/TestBed/TestBed/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/Emile/TestBed/TestBed/C.cs b/Users/Emile/TestBed/TestBed/C.cs deleted file mode 100644 index 6fd08d1b93..0000000000 --- a/Users/Emile/TestBed/TestBed/C.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading.Tasks; - -namespace TestBed -{ - class C : IB - { - public void SayHello() - { - Console.WriteLine("Hello"); - } - - public void SayHowAreYou() - { - Console.WriteLine("How Are You"); - } - } -} diff --git a/Users/Emile/TestBed/TestBed/IA.cs b/Users/Emile/TestBed/TestBed/IA.cs deleted file mode 100644 index 06cbe0abe8..0000000000 --- a/Users/Emile/TestBed/TestBed/IA.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TestBed -{ - interface IA - { - void SayHello(); - } - - -} diff --git a/Users/Emile/TestBed/TestBed/IB.cs b/Users/Emile/TestBed/TestBed/IB.cs deleted file mode 100644 index 2b17dc6416..0000000000 --- a/Users/Emile/TestBed/TestBed/IB.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TestBed -{ - interface IB : IA - { - void SayHowAreYou(); - } -} diff --git a/Users/Emile/TestBed/TestBed/Kernel.cs b/Users/Emile/TestBed/TestBed/Kernel.cs deleted file mode 100644 index 33453d7a97..0000000000 --- a/Users/Emile/TestBed/TestBed/Kernel.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace TestBed -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - - C oba = new C(); - IA ob = oba; - ob.SayHello(); - IB ob2 = oba; - ob2.SayHowAreYou(); - } - - protected override void Run() - { - - } - } -} diff --git a/Users/Emile/TestBed/TestBed/TestBed.csproj b/Users/Emile/TestBed/TestBed/TestBed.csproj deleted file mode 100644 index b3959f2f71..0000000000 --- a/Users/Emile/TestBed/TestBed/TestBed.csproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {4BD6A15B-DFD3-4A63-8097-88D2F79ED590} - Library - Properties - TestBed - TestBed - 512 - v4.7.1 - - - - true - bin\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Emile/TestBed/TestBed/TestBedBoot.Cosmos b/Users/Emile/TestBed/TestBed/TestBedBoot.Cosmos deleted file mode 100644 index 1742642eb7..0000000000 --- a/Users/Emile/TestBed/TestBed/TestBedBoot.Cosmos +++ /dev/null @@ -1,84 +0,0 @@ - - - - Debug - 2.0 - {55e633b7-8252-4b48-948b-ec83338cac61} - false - TestBedBoot - elf - v4.6.2 - - - VMware - - True - Source - User - False - false - Player - bin\Debug\ - TestBedBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - True - TestBedBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - True - True - Source - Pipe: Cosmos\Serial - Player - bin\Debug\ - False - false - TestBedBoot - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - None - False - True - Source - Pipe: Cosmos\Serial - Player - bin\Debug\ - False - false - TestBedBoot - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - ISO - None - False - True - Source - Pipe: Cosmos\Serial - Player - bin\Debug\ - False - false - - - - TestBed - {4bd6a15b-dfd3-4a63-8097-88d2f79ed590} - - - - - - - - - - diff --git a/Users/Geramy/GeramyLovelessTest/AssemblyInfo.cs b/Users/Geramy/GeramyLovelessTest/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/Geramy/GeramyLovelessTest/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/Geramy/GeramyLovelessTest/GeramyLovelessTest.csproj b/Users/Geramy/GeramyLovelessTest/GeramyLovelessTest.csproj deleted file mode 100644 index fcfadeb61c..0000000000 --- a/Users/Geramy/GeramyLovelessTest/GeramyLovelessTest.csproj +++ /dev/null @@ -1,50 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {6C14B7D1-CACB-4049-A0BD-9CAC5CFCF2C2} - Library - Properties - GeramyLovelessTest - GeramyLovelessTest - 512 - SAK - SAK - SAK - SAK - v4.7.1 - - - - - - - - ..\source\Cosmos.Core\bin\Debug\Cosmos.Core.dll - - - ..\source\Cosmos.HAL\bin\Debug\Cosmos.HAL.dll - - - ..\source\Cosmos.System\bin\Debug\Cosmos.System.dll - - - ..\source\Cosmos.Debug.Kernel\bin\Debug\Cosmos.Debug.Kernel.dll - - - - - - - - - diff --git a/Users/Geramy/GeramyLovelessTest/GeramyLovelessTestBoot.Cosmos b/Users/Geramy/GeramyLovelessTest/GeramyLovelessTestBoot.Cosmos deleted file mode 100644 index ceb919b5f6..0000000000 --- a/Users/Geramy/GeramyLovelessTest/GeramyLovelessTestBoot.Cosmos +++ /dev/null @@ -1,51 +0,0 @@ - - - - Debug - 2.0 - {86f88a09-6801-4474-bfc8-ef09f3a9b89d} - false - GeramyLovelessTestBoot - elf - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - false - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - GeramyLovelessTest - {6e386a68-c69e-46f3-935b-eed12832c5fb} - - - - - - - - - \ No newline at end of file diff --git a/Users/Geramy/GeramyLovelessTest/Kernel.cs b/Users/Geramy/GeramyLovelessTest/Kernel.cs deleted file mode 100644 index 06b5d7be5f..0000000000 --- a/Users/Geramy/GeramyLovelessTest/Kernel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace GeramyLovelessTest -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Console.Write("Input: "); - var input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); - } - } -} diff --git a/Users/Geramy/GeramysPlayground/RamTest/RamTest.sln b/Users/Geramy/GeramysPlayground/RamTest/RamTest.sln deleted file mode 100644 index 3fa3a9f476..0000000000 --- a/Users/Geramy/GeramysPlayground/RamTest/RamTest.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RamTest", "RamTest\RamTest.csproj", "{86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934}.Debug|x86.ActiveCfg = Debug|x86 - {86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934}.Debug|x86.Build.0 = Debug|x86 - {86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934}.Release|x86.ActiveCfg = Release|x86 - {86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Users/Geramy/GeramysPlayground/RamTest/RamTest/Program.cs b/Users/Geramy/GeramysPlayground/RamTest/RamTest/Program.cs deleted file mode 100644 index 82ca194654..0000000000 --- a/Users/Geramy/GeramysPlayground/RamTest/RamTest/Program.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace RamTest -{ - class Program - { - static void Main(string[] args) - { - } - } -} diff --git a/Users/Geramy/GeramysPlayground/RamTest/RamTest/Properties/AssemblyInfo.cs b/Users/Geramy/GeramysPlayground/RamTest/RamTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 2da64c1f22..0000000000 --- a/Users/Geramy/GeramysPlayground/RamTest/RamTest/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("RamTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("RamTest")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] -[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("0fc2ce88-39e4-4f02-88b9-411b8b6992a5")] - -// 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/Users/Geramy/GeramysPlayground/RamTest/RamTest/RamTest.csproj b/Users/Geramy/GeramysPlayground/RamTest/RamTest/RamTest.csproj deleted file mode 100644 index 4a192f42c9..0000000000 --- a/Users/Geramy/GeramysPlayground/RamTest/RamTest/RamTest.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {86F5A3D6-6C2B-4BFA-9C48-E0DCB8140934} - Exe - Properties - RamTest - RamTest - v4.7.1 - 512 - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\..\..\..\..\..\Build\VSIP\Cosmos.Core.dll - - - - - - - - - - - - - - - - - - diff --git a/Users/Geramy/GeramysPlayground2/AssemblyInfo.cs b/Users/Geramy/GeramysPlayground2/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/Geramy/GeramysPlayground2/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/Geramy/GeramysPlayground2/GeramysPlayground.csproj b/Users/Geramy/GeramysPlayground2/GeramysPlayground.csproj deleted file mode 100644 index b6cb64a02f..0000000000 --- a/Users/Geramy/GeramysPlayground2/GeramysPlayground.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {CC286B57-11CA-4FC1-8138-A714D5C0A64E} - Library - Properties - GeramysPlayground - GeramysPlayground - 512 - SAK - SAK - SAK - SAK - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Users/Geramy/GeramysPlayground2/GeramysPlaygroundBoot.Cosmos b/Users/Geramy/GeramysPlayground2/GeramysPlaygroundBoot.Cosmos deleted file mode 100644 index eb826a8870..0000000000 --- a/Users/Geramy/GeramysPlayground2/GeramysPlaygroundBoot.Cosmos +++ /dev/null @@ -1,51 +0,0 @@ - - - - Debug - 2.0 - {bd07c272-a16d-43f2-8c57-3adc4a0ab462} - false - GeramysPlaygroundBoot - elf - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - false - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - GeramysPlayground - {72cc7f79-b922-49b1-ba4e-66ff4df27bbc} - - - - - - - - - \ No newline at end of file diff --git a/Users/Geramy/GeramysPlayground2/Kernel.cs b/Users/Geramy/GeramysPlayground2/Kernel.cs deleted file mode 100644 index e65d54365c..0000000000 --- a/Users/Geramy/GeramysPlayground2/Kernel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace GeramysPlayground -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Console.Write("Input: "); - var input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); - } - } -} diff --git a/Users/Geramy/GeramysTest2/AssemblyInfo.cs b/Users/Geramy/GeramysTest2/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/Geramy/GeramysTest2/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/Geramy/GeramysTest2/Cosmos.bxrc b/Users/Geramy/GeramysTest2/Cosmos.bxrc deleted file mode 100644 index 6080d06450..0000000000 --- a/Users/Geramy/GeramysTest2/Cosmos.bxrc +++ /dev/null @@ -1,44 +0,0 @@ -# configuration file generated by Bochs -plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, gameport=1 -config_interface: win32config -display_library: win32 -memory: host=256, guest=256 -romimage: file="C:\Program Files (x86)\Bochs-2.6/BIOS-bochs-latest" -vgaromimage: file="C:\Program Files (x86)\Bochs-2.6/VGABIOS-lgpl-latest" -boot: cdrom -floppy_bootsig_check: disabled=0 -# no floppya -# no floppyb -ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 -ata0-master: type=cdrom, path=".\GeramysTestBoot.iso", status=inserted, biosdetect=auto, model="Generic 1234" -ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 -ata2: enabled=0 -ata3: enabled=0 -pci: enabled=1, chipset=i440fx -vga: extension=vbe, update_freq=5 -cpu: count=1, ips=4000000, model=bx_generic, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0 -cpuid: family=6, model=0x03, stepping=3, mmx=1, apic=xapic, sse=sse2, sse4a=0, sep=1, aes=0, xsave=0, xsaveopt=0, movbe=0, adx=0, smep=0, x86_64=1, 1g_pages=0, pcid=0, fsgsbase=0, mwait=1 -cpuid: vendor_string="GenuineIntel" -cpuid: brand_string=" Intel(R) Pentium(R) 4 CPU " - -print_timestamps: enabled=0 -port_e9_hack: enabled=0 -private_colormap: enabled=0 -clock: sync=none, time0=local, rtc_sync=0 -# no cmosimage -# no loader -log: - -logprefix: %t%e%d -panic: action=ask -error: action=report -info: action=report -debug: action=ignore -keyboard: type=mf, serial_delay=250, paste_delay=100000, keymap= -user_shortcut: keys=none -mouse: enabled=0, type=ps2, toggle=ctrl+mbutton -parport1: enabled=1, file="" -parport2: enabled=0 -com1: enabled=1, mode=pipe-client, dev=\\.\pipe\Cosmos\Serial -com2: enabled=0 -com3: enabled=0 -com4: enabled=0 diff --git a/Users/Geramy/GeramysTest2/GeramysTest.csproj b/Users/Geramy/GeramysTest2/GeramysTest.csproj deleted file mode 100644 index f9d07c7eda..0000000000 --- a/Users/Geramy/GeramysTest2/GeramysTest.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {DA4198CA-59DF-41B3-9884-867647900D76} - Library - Properties - GeramysTest - GeramysTest - 512 - SAK - SAK - SAK - SAK - v4.7.1 - - - - - - - - - - - - - {61607F1E-58F9-41CF-972F-128384F3E115} - Cosmos.Debug.Kernel - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.HAL - - - - - diff --git a/Users/Geramy/GeramysTest2/GeramysTestBoot.Cosmos b/Users/Geramy/GeramysTest2/GeramysTestBoot.Cosmos deleted file mode 100644 index daca5056a3..0000000000 --- a/Users/Geramy/GeramysTest2/GeramysTestBoot.Cosmos +++ /dev/null @@ -1,87 +0,0 @@ - - - - Debug - 2.0 - {0a7df241-1000-405d-a09b-9e2c51a5cb95} - false - GeramysTestBoot - elf - SAK - SAK - SAK - SAK - v4.6.2 - - - VMware - - True - Source - User - False - False - Player - bin\Debug\ - GeramysTestBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - GeramysTestBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - True - Source - Pipe: Cosmos\Serial - Player - bin\Debug\ - False - False - GeramysTestBoot - Makes a USB device such as a flash drive or external hard disk bootable. - USB - None - False - Source - Pipe: Cosmos\Serial - Player - bin\Debug\ - False - false - All - True - True - All - - - - Cosmos.Debug.Kernel.Plugs - {b97a2956-c363-47f2-a6aa-b4fccff4d315} - True - - - Cosmos.System_Plugs - {7c64b97f-516d-4a6d-b9e1-3fe48f561409} - True - - - Cosmos.Core_Plugs - {d9a87aad-fcc9-4517-b31d-e904dad00784} - True - - - GeramysTest - {2bb88198-ff15-47c6-b025-b39893e66e2d} - - - - - Content - - - - diff --git a/Users/Geramy/GeramysTest2/Kernel.cs b/Users/Geramy/GeramysTest2/Kernel.cs deleted file mode 100644 index 48479b142e..0000000000 --- a/Users/Geramy/GeramysTest2/Kernel.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using Cosmos.Hardware.BlockDevice; -using Cosmos.System.Filesystem.FAT; - -namespace GeramysTest -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Cosmos.Core.IOGroup.ATA ataOne = Cosmos.Core.Global.BaseIOGroups.ATA1; - var xATA = new Cosmos.Hardware.BlockDevice.AtaPio(ataOne, Cosmos.Hardware.BlockDevice.Ata.ControllerIdEnum.Primary, Cosmos.Hardware.BlockDevice.Ata.BusPositionEnum.Master); - Console.WriteLine(Cosmos.Hardware.BlockDevice.BlockDevice.Devices == null ? "BlockDevice, Devices List is null" : "BlockDevice, Devices List isn't null"); - for (int i = 0; i < Cosmos.Hardware.BlockDevice.BlockDevice.Devices.Count; i++) { - var xDevice = Cosmos.Hardware.BlockDevice.BlockDevice.Devices[i]; - if (xDevice is AtaPio) { - xATA = (AtaPio)xDevice; - } - } - Console.WriteLine(); - Console.WriteLine("--------------------------"); - Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - Console.WriteLine("Serial No: " + xATA.SerialNo); - Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - Console.WriteLine("Model No: " + xATA.ModelNo); - Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - Console.WriteLine("Size: " + xATA.BlockCount * xATA.BlockSize / 1024 / 1024 + " MB"); - - Partition xPartition = null; - for (int i = 0; i < BlockDevice.Devices.Count; i++) { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is Partition) { - xPartition = (Partition)xDevice; - } - } - if (xPartition != null) - { - Console.WriteLine(); - Console.WriteLine("--------------------------"); - - Console.WriteLine("Partition found."); - var xFS = new FatFileSystem(xPartition); - - Console.WriteLine(); - Console.WriteLine("BytesPerSector : " + xFS.BytesPerSector.ToString()); - Console.WriteLine("SectorsPerCluster : " + xFS.SectorsPerCluster.ToString()); - Console.WriteLine("BytesPerCluster : " + xFS.BytesPerCluster.ToString()); - - Console.WriteLine("ReservedSectorCount : " + xFS.ReservedSectorCount.ToString()); - Console.WriteLine("TotalSectorCount : " + xFS.TotalSectorCount.ToString()); - Console.WriteLine("ClusterCount : " + xFS.ClusterCount.ToString()); - - Console.WriteLine("NumberOfFATs : " + xFS.NumberOfFATs.ToString()); - Console.WriteLine("FatSectorCount : " + xFS.FatSectorCount.ToString()); - - Console.WriteLine("RootSector : " + xFS.RootSector.ToString()); - Console.WriteLine("RootSectorCount : " + xFS.RootSectorCount.ToString()); - Console.WriteLine("RootCluster : " + xFS.RootCluster.ToString()); - Console.WriteLine("RootEntryCount : " + xFS.RootEntryCount.ToString()); - - Console.WriteLine("DataSector : " + xFS.DataSector.ToString()); - Console.WriteLine("DataSectorCount : " + xFS.DataSectorCount.ToString()); - } - else - { - Console.WriteLine("Partition not found."); - } - - Console.WriteLine(); - Console.WriteLine("--------------------------"); - Console.Write("Pausing... (Press enter to continue.)"); - Console.ReadLine(); - } - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Assembler.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Assembler.cs deleted file mode 100644 index 981877c771..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Assembler.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public class Assembler //: Cosmos.Assembler.Assembler - { - - } -} \ No newline at end of file diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/BitSize.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/BitSize.cs deleted file mode 100644 index 125688ad04..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/BitSize.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - [Flags] - public enum BitSize : int - { - None, - Bits8 = 8, - Bits16 = 16, - Bits32 = 32, - Bits64 = 64, - Bits80 = 80, - Bits128 = 128, - Bits256 = 256, - Default = Bits32, - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ConditionalTestEnum.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ConditionalTestEnum.cs deleted file mode 100644 index 9dd3c6dfe5..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ConditionalTestEnum.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public enum ConditionalTestEnum : byte - { - Overflow = 0, - NoOverflow = 1, - Below = 2, - NotAboveOrEqual = 2, - NotBelow = 3, - AboveOrEqual = 3, - Equal = 4, - Zero = 4, - NotEqual = 5, - NotZero = 5, - BelowOrEqual = 6, - NotAbove = 6, - NotBelowOrEqual = 7, - Above = 7, - Sign = 8, - NotSign = 9, - Parity = 10, - ParityEven = 10, - NotParity = 11, - ParityOdd = 11, - LessThan = 12, - NotGreaterThanOrEqualTo = 12, - NotLessThan = 13, - GreaterThanOrEqualTo = 13, - LessThanOrEqualTo = 14, - NotGreaterThan = 14, - NotLessThanOrEqualTo = 15, - GreaterThan = 15 - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Cosmos.Assembler.X86.Gero.csproj b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Cosmos.Assembler.X86.Gero.csproj deleted file mode 100644 index fdb0d28928..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Cosmos.Assembler.X86.Gero.csproj +++ /dev/null @@ -1,87 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {6658FCE0-7032-4B7B-BD95-F2765C393442} - Library - Properties - XSharp.Assembler.X86.Gero - XSharp.Assembler.X86.Gero - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/DstSrcInstructionData.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/DstSrcInstructionData.cs deleted file mode 100644 index 156eda47a7..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/DstSrcInstructionData.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// - /// - //public class DstSrcInstructionData : Cosmos.Assembler.X86.IInstructionData - //{ - // /// - // /// Gets or sets the size. - // /// - // /// The size. - // public InstructionSize Size { get; set; } - - // /// - // /// Gets or sets the target instruction set. - // /// - // /// The target instruction set. - // public InstructionSet InstructionSet { get; set; } - - // #region Source options - // public RegistersEnum? SourceReg { get; set; } - // //public Cosmos.Assembler.ElementReference SourceRef { get; set; } - // public uint? SourceValue { get; set; } - // public bool SourceIsIndirect { get; set; } - // public int SourceDisplacement { get; set; } - // #endregion - - // #region Destination options - // public RegistersEnum? DestinationReg { get; set; } - // //public Cosmos.Assembler.ElementReference DestinationRef { get; set; } - // public uint? DestinationValue { get; set; } - // public bool DestinationIsIndirect { get; set; } - // public int DestinationDisplacement { get; set; } - // #endregion - - // public override string ToString( InstructionOutputFormat aFormat ) - // { - // string Instruction = ""; - // string tmp; - // switch( aFormat ) - // { - // case InstructionOutputFormat.ASM: - // tmp = this.SizeToString(); - // if( tmp == "" ) - // return Instruction; - // Instruction += tmp + " "; - - - // tmp = this.GetDestinationAsString(); - // if( tmp == "" ) - // return Instruction; - // Instruction += tmp + " "; - - // tmp = this.GetSourceAsString(); - // if( tmp == "" ) - // return Instruction; - // Instruction += ", " + tmp; - - // return Instruction; - // } - - // return "Format not supported."; - // } - //} -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Extensions.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Extensions.cs deleted file mode 100644 index 4263e7f554..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Extensions.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public static class InfraExtensions - { - //public static string GetSourceAsString( this IInstructionData aThis ) - //{ - // string xDest = ""; - // if( ( aThis.SourceValue.HasValue || aThis.SourceRef != null ) && - // aThis.SourceIsIndirect && - // aThis.SourceReg != null ) - // { - // throw new Exception( "[Scale*index+base] style addressing not supported at the moment" ); - // } - // if( aThis.SourceRef != null ) - // { - // xDest = aThis.SourceRef.ToString(); - // } - // else - // { - // if( aThis.SourceReg != null ) - // { - // xDest = Registers.GetRegisterName( aThis.SourceReg.Value ); - // } - // else - // { - // xDest = "0x" + aThis.SourceValue.GetValueOrDefault().ToString( "X" ).ToUpperInvariant(); - // } - // } - // if( aThis.SourceDisplacement != 0 ) - // { - // xDest += " + " + aThis.SourceDisplacement; - // } - // if( aThis.SourceIsIndirect ) - // { - // return "[" + xDest + "]"; - // } - // else - // { - // return xDest; - // } - //} - - //public static string GetDestinationAsString( this IInstructionData aThis ) - //{ - // string xDest = ""; - // if( ( aThis.DestinationValue.HasValue || aThis.DestinationRef != null ) && - // aThis.DestinationIsIndirect && - // aThis.DestinationReg != null ) - // { - // throw new Exception( "[Scale*index+base] style addressing not supported at the moment" ); - // } - // if( aThis.DestinationRef != null ) - // { - // xDest = aThis.DestinationRef.ToString(); - // } - // else - // { - // if( aThis.DestinationReg != null ) - // { - // xDest = Registers.GetRegisterName( aThis.DestinationReg.Value ); - // } - // else - // { - // xDest = "0x" + aThis.DestinationValue.GetValueOrDefault().ToString( "X" ).ToUpperInvariant(); - // } - // } - // if( aThis.DestinationDisplacement != 0 ) - // { - // if( aThis.DestinationDisplacement > 255 ) - // { - // xDest += " + 0x" + aThis.DestinationDisplacement.ToString( "X" ); - // } - // else - // { - // xDest += " + " + aThis.DestinationDisplacement; - // } - // } - // if( aThis.DestinationIsIndirect ) - // { - // return String.Intern( "[" + xDest + "]" ); - // } - // else - // { - // return String.Intern( xDest ); - // } - //} - - //public static void DetermineSize( this IInstructionData aThis, IInstructionData aThis2, byte aSize ) - //{ - // if( aSize == 0 ) - // { - // if( aThis.DestinationReg != null && !aThis.DestinationIsIndirect ) - // { - // if( Registers.Is16Bit( aThis.DestinationReg.Value ) ) - // { - // aThis2.Size = ( InstructionSize )16; - // } - // else - // { - // if( Registers.Is32Bit( aThis.DestinationReg.Value ) ) - // { - // aThis2.Size = ( InstructionSize )32; - // } - // else - // { - // aThis2.Size = ( InstructionSize )8; - // } - // } - // return; - // } - // if( aThis.DestinationRef != null && !aThis.DestinationIsIndirect ) - // { - // aThis2.Size = ( InstructionSize )32; - // return; - // } - // } - //} - - public static string GetMnemonic( this ConditionalTestEnum aThis ) - { - switch( aThis ) - { - case ConditionalTestEnum.Overflow: - return "o"; - case ConditionalTestEnum.NoOverflow: - return "no"; - case ConditionalTestEnum.Below: - return "b"; - case ConditionalTestEnum.NotBelow: - return "nb"; - case ConditionalTestEnum.Equal: - return "e"; - case ConditionalTestEnum.NotEqual: - return "ne"; - case ConditionalTestEnum.BelowOrEqual: - return "be"; - case ConditionalTestEnum.NotBelowOrEqual: - return "nbe"; - case ConditionalTestEnum.Sign: - return "s"; - case ConditionalTestEnum.NotSign: - return "ns"; - case ConditionalTestEnum.Parity: - return "p"; - case ConditionalTestEnum.NotParity: - return "np"; - case ConditionalTestEnum.LessThan: - return "l"; - case ConditionalTestEnum.NotLessThan: - return "nl"; - case ConditionalTestEnum.LessThanOrEqualTo: - return "le"; - case ConditionalTestEnum.NotLessThanOrEqualTo: - return "nle"; - default: throw new NotImplementedException(); - } - } - } -} \ No newline at end of file diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ExternalLabel.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ExternalLabel.cs deleted file mode 100644 index 600fb8eead..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/ExternalLabel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - //public class ExternalLabel: Instruction - //{ - // public ExternalLabel(string aName):base() - // { - // Name = aName; - // } - - // public string Name - // { - // get; - // set; - // } - - // public override void WriteText( Cosmos.Assembler.Assembler aAssembler, System.IO.TextWriter aOutput ) - // { - // aOutput.Write("extern "); - // aOutput.Write(Name); - // } - //} -} \ No newline at end of file diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/IInstructionData.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/IInstructionData.cs deleted file mode 100644 index 59e9f5c27e..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/IInstructionData.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -namespace Cosmos.Assembler.X86 -{ - public interface IInstructionData - { - - List Operands { get; set; } - - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Instruction.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Instruction.cs deleted file mode 100644 index f3f3824eb1..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Instruction.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// This class represents a intructions and has information about all variants for it - /// - public abstract class Instruction - { - public InstructionEnum AsmInstruction { get; protected set; } - public ConditionalTestEnum Condition { get; set; } - - public List Variants { get; protected set; } - - public IInstructionData InstructionData { get; set; } - public Instruction() - { - - } - - public InstructionVariant Match( InstructionData aData ) - { - if( Variants == null && Initialize() == false ) - throw new NotSupportedException(); - - - return null; - } - - public abstract bool Initialize(); - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionData.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionData.cs deleted file mode 100644 index 166baeaade..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionData.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// This class is filled with data we get from the ILOps - /// - public class InstructionData : Cosmos.Assembler.X86.IInstructionData - { - - public List Operands { get; set; } - - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionEnum.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionEnum.cs deleted file mode 100644 index 05895ba881..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionEnum.cs +++ /dev/null @@ -1,1590 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public enum InstructionEnum - { - AAA, - AAD, - AAM, - AAS, - ADC, - ADD, - ADDPD, - ADDPS, - ADDSD, - ADDSS, - ADDSUBPD, - ADDSUBPS, - AESDEC, - AESDECLAST, - AESENC, - AESENCLAST, - AESIMC, - AESKEYGENASSIST, - AND, - ANDNPD, - ANDNPS, - ANDPD, - ANDPS, - ARPL, - BB0_RESET, - BB1_RESET, - BLENDPD, - BLENDPS, - BLENDVPD, - BLENDVPS, - BOUND, - BSF, - BSR, - BSWAP, - BT, - BTC, - BTR, - BTS, - CALL, - CBW, - CDQ, - CDQE, - CLC, - CLD, - CLFLUSH, - CLGI, - CLI, - CLTS, - CMC, - CMP, - CMPEQPD, - CMPEQPS, - CMPEQSD, - CMPEQSS, - CMPLEPD, - CMPLEPS, - CMPLESD, - CMPLESS, - CMPLTPD, - CMPLTPS, - CMPLTSD, - CMPLTSS, - CMPNEQPD, - CMPNEQPS, - CMPNEQSD, - CMPNEQSS, - CMPNLEPD, - CMPNLEPS, - CMPNLESD, - CMPNLESS, - CMPNLTPD, - CMPNLTPS, - CMPNLTSD, - CMPNLTSS, - CMPORDPD, - CMPORDPS, - CMPORDSD, - CMPORDSS, - CMPPD, - CMPPS, - CMPSB, - CMPSD, - CMPSQ, - CMPSS, - CMPSW, - CMPUNORDPD, - CMPUNORDPS, - CMPUNORDSD, - CMPUNORDSS, - CMPXCHG, - CMPXCHG16B, - CMPXCHG486, - CMPXCHG8B, - COMEQPD, - COMEQPS, - COMEQSD, - COMEQSS, - COMFALSEPD, - COMFALSEPS, - COMFALSESD, - COMFALSESS, - COMISD, - COMISS, - COMLEPD, - COMLEPS, - COMLESD, - COMLESS, - COMLTPD, - COMLTPS, - COMLTSD, - COMLTSS, - COMNEQPD, - COMNEQPS, - COMNEQSD, - COMNEQSS, - COMNLEPD, - COMNLEPS, - COMNLESD, - COMNLESS, - COMNLTPD, - COMNLTPS, - COMNLTSD, - COMNLTSS, - COMORDPD, - COMORDPS, - COMORDSD, - COMORDSS, - COMPD, - COMPS, - COMSD, - COMSS, - COMTRUEPD, - COMTRUEPS, - COMTRUESD, - COMTRUESS, - COMUEQPD, - COMUEQPS, - COMUEQSD, - COMUEQSS, - COMULEPD, - COMULEPS, - COMULESD, - COMULESS, - COMULTPD, - COMULTPS, - COMULTSD, - COMULTSS, - COMUNEQPD, - COMUNEQPS, - COMUNEQSD, - COMUNEQSS, - COMUNLEPD, - COMUNLEPS, - COMUNLESD, - COMUNLESS, - COMUNLTPD, - COMUNLTPS, - COMUNLTSD, - COMUNLTSS, - COMUNORDPD, - COMUNORDPS, - COMUNORDSD, - COMUNORDSS, - CPUID, - CPU_READ, - CPU_WRITE, - CQO, - CRC32, - CVTDQ2PD, - CVTDQ2PS, - CVTPD2DQ, - CVTPD2PI, - CVTPD2PS, - CVTPH2PS, - CVTPI2PD, - CVTPI2PS, - CVTPS2DQ, - CVTPS2PD, - CVTPS2PH, - CVTPS2PI, - CVTSD2SI, - CVTSD2SS, - CVTSI2SD, - CVTSI2SS, - CVTSS2SD, - CVTSS2SI, - CVTTPD2DQ, - CVTTPD2PI, - CVTTPS2DQ, - CVTTPS2PI, - CVTTSD2SI, - CVTTSS2SI, - CWD, - CWDE, - DAA, - DAS, - DB, - DD, - DEC, - DIV, - DIVPD, - DIVPS, - DIVSD, - DIVSS, - DMINT, - DO, - DPPD, - DPPS, - DQ, - DT, - DW, - DY, - EMMS, - ENTER, - EQU, - EXTRACTPS, - EXTRQ, - F2XM1, - FABS, - FADD, - FADDP, - FBLD, - FBSTP, - FCHS, - FCLEX, - FCMOVB, - FCMOVBE, - FCMOVE, - FCMOVNB, - FCMOVNBE, - FCMOVNE, - FCMOVNU, - FCMOVU, - FCOM, - FCOMI, - FCOMIP, - FCOMP, - FCOMPP, - FCOS, - FDECSTP, - FDISI, - FDIV, - FDIVP, - FDIVR, - FDIVRP, - FEMMS, - FENI, - FFREE, - FFREEP, - FIADD, - FICOM, - FICOMP, - FIDIV, - FIDIVR, - FILD, - FIMUL, - FINCSTP, - FINIT, - FIST, - FISTP, - FISTTP, - FISUB, - FISUBR, - FLD, - FLD1, - FLDCW, - FLDENV, - FLDL2E, - FLDL2T, - FLDLG2, - FLDLN2, - FLDPI, - FLDZ, - FMADDPD, - FMADDPS, - FMADDSD, - FMADDSS, - FMSUBPD, - FMSUBPS, - FMSUBSD, - FMSUBSS, - FMUL, - FMULP, - FNCLEX, - FNDISI, - FNENI, - FNINIT, - FNMADDPD, - FNMADDPS, - FNMADDSD, - FNMADDSS, - FNMSUBPD, - FNMSUBPS, - FNMSUBSD, - FNMSUBSS, - FNOP, - FNSAVE, - FNSTCW, - FNSTENV, - FNSTSW, - FPATAN, - FPREM, - FPREM1, - FPTAN, - FRCZPD, - FRCZPS, - FRCZSD, - FRCZSS, - FRNDINT, - FRSTOR, - FSAVE, - FSCALE, - FSETPM, - FSIN, - FSINCOS, - FSQRT, - FST, - FSTCW, - FSTENV, - FSTP, - FSTSW, - FSUB, - FSUBP, - FSUBR, - FSUBRP, - FTST, - FUCOM, - FUCOMI, - FUCOMIP, - FUCOMP, - FUCOMPP, - FWAIT, - FXAM, - FXCH, - FXRSTOR, - FXSAVE, - FXTRACT, - FYL2X, - FYL2XP1, - GETSEC, - HADDPD, - HADDPS, - HINT_NOP0, - HINT_NOP1, - HINT_NOP10, - HINT_NOP11, - HINT_NOP12, - HINT_NOP13, - HINT_NOP14, - HINT_NOP15, - HINT_NOP16, - HINT_NOP17, - HINT_NOP18, - HINT_NOP19, - HINT_NOP2, - HINT_NOP20, - HINT_NOP21, - HINT_NOP22, - HINT_NOP23, - HINT_NOP24, - HINT_NOP25, - HINT_NOP26, - HINT_NOP27, - HINT_NOP28, - HINT_NOP29, - HINT_NOP3, - HINT_NOP30, - HINT_NOP31, - HINT_NOP32, - HINT_NOP33, - HINT_NOP34, - HINT_NOP35, - HINT_NOP36, - HINT_NOP37, - HINT_NOP38, - HINT_NOP39, - HINT_NOP4, - HINT_NOP40, - HINT_NOP41, - HINT_NOP42, - HINT_NOP43, - HINT_NOP44, - HINT_NOP45, - HINT_NOP46, - HINT_NOP47, - HINT_NOP48, - HINT_NOP49, - HINT_NOP5, - HINT_NOP50, - HINT_NOP51, - HINT_NOP52, - HINT_NOP53, - HINT_NOP54, - HINT_NOP55, - HINT_NOP56, - HINT_NOP57, - HINT_NOP58, - HINT_NOP59, - HINT_NOP6, - HINT_NOP60, - HINT_NOP61, - HINT_NOP62, - HINT_NOP63, - HINT_NOP7, - HINT_NOP8, - HINT_NOP9, - HLT, - HSUBPD, - HSUBPS, - IBTS, - ICEBP, - IDIV, - IMUL, - IN, - INC, - INCBIN, - INSB, - INSD, - INSERTPS, - INSERTQ, - INSW, - INT, - INT01, - INT03, - INT1, - INT3, - INTO, - INVD, - INVEPT, - INVLPG, - INVLPGA, - INVVPID, - IRET, - IRETD, - IRETQ, - IRETW, - JCXZ, - JECXZ, - JMP, - JMPE, - JRCXZ, - LAHF, - LAR, - LDDQU, - LDMXCSR, - LDS, - LEA, - LEAVE, - LES, - LFENCE, - LFS, - LGDT, - LGS, - LIDT, - LLDT, - LMSW, - LOADALL, - LOADALL286, - LODSB, - LODSD, - LODSQ, - LODSW, - LOOP, - LOOPE, - LOOPNE, - LOOPNZ, - LOOPZ, - LSL, - LSS, - LTR, - LZCNT, - MASKMOVDQU, - MASKMOVQ, - MAXPD, - MAXPS, - MAXSD, - MAXSS, - MFENCE, - MINPD, - MINPS, - MINSD, - MINSS, - MONITOR, - MONTMUL, - MOV, - MOVAPD, - MOVAPS, - MOVBE, - MOVD, - MOVDDUP, - MOVDQ2Q, - MOVDQA, - MOVDQU, - MOVHLPS, - MOVHPD, - MOVHPS, - MOVLHPS, - MOVLPD, - MOVLPS, - MOVMSKPD, - MOVMSKPS, - MOVNTDQ, - MOVNTDQA, - MOVNTI, - MOVNTPD, - MOVNTPS, - MOVNTQ, - MOVNTSD, - MOVNTSS, - MOVQ, - MOVQ2DQ, - MOVSB, - MOVSD, - MOVSHDUP, - MOVSLDUP, - MOVSQ, - MOVSS, - MOVSW, - MOVSX, - MOVSXD, - MOVUPD, - MOVUPS, - MOVZX, - MPSADBW, - MUL, - MULPD, - MULPS, - MULSD, - MULSS, - MWAIT, - NEG, - NOP, - NOT, - OR, - ORPD, - ORPS, - OUT, - OUTSB, - OUTSD, - OUTSW, - PABSB, - PABSD, - PABSW, - PACKSSDW, - PACKSSWB, - PACKUSDW, - PACKUSWB, - PADDB, - PADDD, - PADDQ, - PADDSB, - PADDSIW, - PADDSW, - PADDUSB, - PADDUSW, - PADDW, - PALIGNR, - PAND, - PANDN, - PAUSE, - PAVEB, - PAVGB, - PAVGUSB, - PAVGW, - PBLENDVB, - PBLENDW, - PCLMULHQHQDQ, - PCLMULHQLQDQ, - PCLMULLQHQDQ, - PCLMULLQLQDQ, - PCLMULQDQ, - PCMOV, - PCMPEQB, - PCMPEQD, - PCMPEQQ, - PCMPEQW, - PCMPESTRI, - PCMPESTRM, - PCMPGTB, - PCMPGTD, - PCMPGTQ, - PCMPGTW, - PCMPISTRI, - PCMPISTRM, - PCOMB, - PCOMD, - PCOMEQB, - PCOMEQD, - PCOMEQQ, - PCOMEQUB, - PCOMEQUD, - PCOMEQUQ, - PCOMEQUW, - PCOMEQW, - PCOMFALSEB, - PCOMFALSED, - PCOMFALSEQ, - PCOMFALSEUB, - PCOMFALSEUD, - PCOMFALSEUQ, - PCOMFALSEUW, - PCOMFALSEW, - PCOMGEB, - PCOMGED, - PCOMGEQ, - PCOMGEUB, - PCOMGEUD, - PCOMGEUQ, - PCOMGEUW, - PCOMGEW, - PCOMGTB, - PCOMGTD, - PCOMGTQ, - PCOMGTUB, - PCOMGTUD, - PCOMGTUQ, - PCOMGTUW, - PCOMGTW, - PCOMLEB, - PCOMLED, - PCOMLEQ, - PCOMLEUB, - PCOMLEUD, - PCOMLEUQ, - PCOMLEUW, - PCOMLEW, - PCOMLTB, - PCOMLTD, - PCOMLTQ, - PCOMLTUB, - PCOMLTUD, - PCOMLTUQ, - PCOMLTUW, - PCOMLTW, - PCOMNEQB, - PCOMNEQD, - PCOMNEQQ, - PCOMNEQUB, - PCOMNEQUD, - PCOMNEQUQ, - PCOMNEQUW, - PCOMNEQW, - PCOMQ, - PCOMTRUEB, - PCOMTRUED, - PCOMTRUEQ, - PCOMTRUEUB, - PCOMTRUEUD, - PCOMTRUEUQ, - PCOMTRUEUW, - PCOMTRUEW, - PCOMUB, - PCOMUD, - PCOMUQ, - PCOMUW, - PCOMW, - PDISTIB, - PERMPD, - PERMPS, - PEXTRB, - PEXTRD, - PEXTRQ, - PEXTRW, - PF2ID, - PF2IW, - PFACC, - PFADD, - PFCMPEQ, - PFCMPGE, - PFCMPGT, - PFMAX, - PFMIN, - PFMUL, - PFNACC, - PFPNACC, - PFRCP, - PFRCPIT1, - PFRCPIT2, - PFRCPV, - PFRSQIT1, - PFRSQRT, - PFRSQRTV, - PFSUB, - PFSUBR, - PHADDBD, - PHADDBQ, - PHADDBW, - PHADDD, - PHADDDQ, - PHADDSW, - PHADDUBD, - PHADDUBQ, - PHADDUBW, - PHADDUDQ, - PHADDUWD, - PHADDUWQ, - PHADDW, - PHADDWD, - PHADDWQ, - PHMINPOSUW, - PHSUBBW, - PHSUBD, - PHSUBDQ, - PHSUBSW, - PHSUBW, - PHSUBWD, - PI2FD, - PI2FW, - PINSRB, - PINSRD, - PINSRQ, - PINSRW, - PMACHRIW, - PMACSDD, - PMACSDQH, - PMACSDQL, - PMACSSDD, - PMACSSDQH, - PMACSSDQL, - PMACSSWD, - PMACSSWW, - PMACSWD, - PMACSWW, - PMADCSSWD, - PMADCSWD, - PMADDUBSW, - PMADDWD, - PMAGW, - PMAXSB, - PMAXSD, - PMAXSW, - PMAXUB, - PMAXUD, - PMAXUW, - PMINSB, - PMINSD, - PMINSW, - PMINUB, - PMINUD, - PMINUW, - PMOVMSKB, - PMOVSXBD, - PMOVSXBQ, - PMOVSXBW, - PMOVSXDQ, - PMOVSXWD, - PMOVSXWQ, - PMOVZXBD, - PMOVZXBQ, - PMOVZXBW, - PMOVZXDQ, - PMOVZXWD, - PMOVZXWQ, - PMULDQ, - PMULHRIW, - PMULHRSW, - PMULHRWA, - PMULHRWC, - PMULHUW, - PMULHW, - PMULLD, - PMULLW, - PMULUDQ, - PMVGEZB, - PMVLZB, - PMVNZB, - PMVZB, - POP, - POPA, - POPAD, - POPAW, - POPCNT, - POPF, - POPFD, - POPFQ, - POPFW, - POR, - PPERM, - PREFETCH, - PREFETCHNTA, - PREFETCHT0, - PREFETCHT1, - PREFETCHT2, - PREFETCHW, - PROTB, - PROTD, - PROTQ, - PROTW, - PSADBW, - PSHAB, - PSHAD, - PSHAQ, - PSHAW, - PSHLB, - PSHLD, - PSHLQ, - PSHLW, - PSHUFB, - PSHUFD, - PSHUFHW, - PSHUFLW, - PSHUFW, - PSIGNB, - PSIGND, - PSIGNW, - PSLLD, - PSLLDQ, - PSLLQ, - PSLLW, - PSRAD, - PSRAW, - PSRLD, - PSRLDQ, - PSRLQ, - PSRLW, - PSUBB, - PSUBD, - PSUBQ, - PSUBSB, - PSUBSIW, - PSUBSW, - PSUBUSB, - PSUBUSW, - PSUBW, - PSWAPD, - PTEST, - PUNPCKHBW, - PUNPCKHDQ, - PUNPCKHQDQ, - PUNPCKHWD, - PUNPCKLBW, - PUNPCKLDQ, - PUNPCKLQDQ, - PUNPCKLWD, - PUSH, - PUSHA, - PUSHAD, - PUSHAW, - PUSHF, - PUSHFD, - PUSHFQ, - PUSHFW, - PXOR, - RCL, - RCPPS, - RCPSS, - RCR, - RDM, - RDMSR, - RDPMC, - RDSHR, - RDTSC, - RDTSCP, - RESB, - RESD, - RESO, - RESQ, - REST, - RESW, - RESY, - RET, - RETF, - RETN, - ROL, - ROR, - ROUNDPD, - ROUNDPS, - ROUNDSD, - ROUNDSS, - RSDC, - RSLDT, - RSM, - RSQRTPS, - RSQRTSS, - RSTS, - SAHF, - SAL, - SALC, - SAR, - SBB, - SCASB, - SCASD, - SCASQ, - SCASW, - SFENCE, - SGDT, - SHL, - SHLD, - SHR, - SHRD, - SHUFPD, - SHUFPS, - SIDT, - SKINIT, - SLDT, - SMI, - SMINT, - SMINTOLD, - SMSW, - SQRTPD, - SQRTPS, - SQRTSD, - SQRTSS, - STC, - STD, - STGI, - STI, - STMXCSR, - STOSB, - STOSD, - STOSQ, - STOSW, - STR, - SUB, - SUBPD, - SUBPS, - SUBSD, - SUBSS, - SVDC, - SVLDT, - SVTS, - SWAPGS, - SYSCALL, - SYSENTER, - SYSEXIT, - SYSRET, - TEST, - UCOMISD, - UCOMISS, - UD0, - UD1, - UD2, - UD2A, - UD2B, - UMOV, - UNPCKHPD, - UNPCKHPS, - UNPCKLPD, - UNPCKLPS, - VADDPD, - VADDPS, - VADDSD, - VADDSS, - VADDSUBPD, - VADDSUBPS, - VAESDEC, - VAESDECLAST, - VAESENC, - VAESENCLAST, - VAESIMC, - VAESKEYGENASSIST, - VANDNPD, - VANDNPS, - VANDPD, - VANDPS, - VBLENDPD, - VBLENDPS, - VBLENDVPD, - VBLENDVPS, - VBROADCASTF128, - VBROADCASTSD, - VBROADCASTSS, - VCMPEQPD, - VCMPEQPS, - VCMPEQSD, - VCMPEQSS, - VCMPEQ_OSPD, - VCMPEQ_OSPS, - VCMPEQ_OSSD, - VCMPEQ_OSSS, - VCMPEQ_UQPD, - VCMPEQ_UQPS, - VCMPEQ_UQSD, - VCMPEQ_UQSS, - VCMPEQ_USPD, - VCMPEQ_USPS, - VCMPEQ_USSD, - VCMPEQ_USSS, - VCMPFALSEPD, - VCMPFALSEPS, - VCMPFALSESD, - VCMPFALSESS, - VCMPFALSE_OSPD, - VCMPFALSE_OSPS, - VCMPFALSE_OSSD, - VCMPFALSE_OSSS, - VCMPGEPD, - VCMPGEPS, - VCMPGESD, - VCMPGESS, - VCMPGE_OQPD, - VCMPGE_OQPS, - VCMPGE_OQSD, - VCMPGE_OQSS, - VCMPGTPD, - VCMPGTPS, - VCMPGTSD, - VCMPGTSS, - VCMPGT_OQPD, - VCMPGT_OQPS, - VCMPGT_OQSD, - VCMPGT_OQSS, - VCMPLEPD, - VCMPLEPS, - VCMPLESD, - VCMPLESS, - VCMPLE_OQPD, - VCMPLE_OQPS, - VCMPLE_OQSD, - VCMPLE_OQSS, - VCMPLTPD, - VCMPLTPS, - VCMPLTSD, - VCMPLTSS, - VCMPLT_OQPD, - VCMPLT_OQPS, - VCMPLT_OQSD, - VCMPLT_OQSS, - VCMPNEQPD, - VCMPNEQPS, - VCMPNEQSD, - VCMPNEQSS, - VCMPNEQ_OQPD, - VCMPNEQ_OQPS, - VCMPNEQ_OQSD, - VCMPNEQ_OQSS, - VCMPNEQ_OSPD, - VCMPNEQ_OSPS, - VCMPNEQ_OSSD, - VCMPNEQ_OSSS, - VCMPNEQ_USPD, - VCMPNEQ_USPS, - VCMPNEQ_USSD, - VCMPNEQ_USSS, - VCMPNGEPD, - VCMPNGEPS, - VCMPNGESD, - VCMPNGESS, - VCMPNGE_UQPD, - VCMPNGE_UQPS, - VCMPNGE_UQSD, - VCMPNGE_UQSS, - VCMPNGTPD, - VCMPNGTPS, - VCMPNGTSD, - VCMPNGTSS, - VCMPNGT_UQPD, - VCMPNGT_UQPS, - VCMPNGT_UQSD, - VCMPNGT_UQSS, - VCMPNLEPD, - VCMPNLEPS, - VCMPNLESD, - VCMPNLESS, - VCMPNLE_UQPD, - VCMPNLE_UQPS, - VCMPNLE_UQSD, - VCMPNLE_UQSS, - VCMPNLTPD, - VCMPNLTPS, - VCMPNLTSD, - VCMPNLTSS, - VCMPNLT_UQPD, - VCMPNLT_UQPS, - VCMPNLT_UQSD, - VCMPNLT_UQSS, - VCMPORDPD, - VCMPORDPS, - VCMPORDSD, - VCMPORDSS, - VCMPORD_SPD, - VCMPORD_SPS, - VCMPORD_SSD, - VCMPORD_SSS, - VCMPPD, - VCMPPS, - VCMPSD, - VCMPSS, - VCMPTRUEPD, - VCMPTRUEPS, - VCMPTRUESD, - VCMPTRUESS, - VCMPTRUE_USPD, - VCMPTRUE_USPS, - VCMPTRUE_USSD, - VCMPTRUE_USSS, - VCMPUNORDPD, - VCMPUNORDPS, - VCMPUNORDSD, - VCMPUNORDSS, - VCMPUNORD_SPD, - VCMPUNORD_SPS, - VCMPUNORD_SSD, - VCMPUNORD_SSS, - VCOMISD, - VCOMISS, - VCVTDQ2PD, - VCVTDQ2PS, - VCVTPD2DQ, - VCVTPD2PS, - VCVTPH2PS, - VCVTPS2DQ, - VCVTPS2PD, - VCVTPS2PH, - VCVTSD2SI, - VCVTSD2SS, - VCVTSI2SD, - VCVTSI2SS, - VCVTSS2SD, - VCVTSS2SI, - VCVTTPD2DQ, - VCVTTPS2DQ, - VCVTTSD2SI, - VCVTTSS2SI, - VDIVPD, - VDIVPS, - VDIVSD, - VDIVSS, - VDPPD, - VDPPS, - VERR, - VERW, - VEXTRACTF128, - VEXTRACTPS, - VFMADD123PD, - VFMADD123PS, - VFMADD123SD, - VFMADD123SS, - VFMADD132PD, - VFMADD132PS, - VFMADD132SD, - VFMADD132SS, - VFMADD213PD, - VFMADD213PS, - VFMADD213SD, - VFMADD213SS, - VFMADD231PD, - VFMADD231PS, - VFMADD231SD, - VFMADD231SS, - VFMADD312PD, - VFMADD312PS, - VFMADD312SD, - VFMADD312SS, - VFMADD321PD, - VFMADD321PS, - VFMADD321SD, - VFMADD321SS, - VFMADDPD, - VFMADDPS, - VFMADDSD, - VFMADDSS, - VFMADDSUB123PD, - VFMADDSUB123PS, - VFMADDSUB132PD, - VFMADDSUB132PS, - VFMADDSUB213PD, - VFMADDSUB213PS, - VFMADDSUB231PD, - VFMADDSUB231PS, - VFMADDSUB312PD, - VFMADDSUB312PS, - VFMADDSUB321PD, - VFMADDSUB321PS, - VFMADDSUBPD, - VFMADDSUBPS, - VFMSUB123PD, - VFMSUB123PS, - VFMSUB123SD, - VFMSUB123SS, - VFMSUB132PD, - VFMSUB132PS, - VFMSUB132SD, - VFMSUB132SS, - VFMSUB213PD, - VFMSUB213PS, - VFMSUB213SD, - VFMSUB213SS, - VFMSUB231PD, - VFMSUB231PS, - VFMSUB231SD, - VFMSUB231SS, - VFMSUB312PD, - VFMSUB312PS, - VFMSUB312SD, - VFMSUB312SS, - VFMSUB321PD, - VFMSUB321PS, - VFMSUB321SD, - VFMSUB321SS, - VFMSUBADD123PD, - VFMSUBADD123PS, - VFMSUBADD132PD, - VFMSUBADD132PS, - VFMSUBADD213PD, - VFMSUBADD213PS, - VFMSUBADD231PD, - VFMSUBADD231PS, - VFMSUBADD312PD, - VFMSUBADD312PS, - VFMSUBADD321PD, - VFMSUBADD321PS, - VFMSUBADDPD, - VFMSUBADDPS, - VFMSUBPD, - VFMSUBPS, - VFMSUBSD, - VFMSUBSS, - VFNMADD123PD, - VFNMADD123PS, - VFNMADD123SD, - VFNMADD123SS, - VFNMADD132PD, - VFNMADD132PS, - VFNMADD132SD, - VFNMADD132SS, - VFNMADD213PD, - VFNMADD213PS, - VFNMADD213SD, - VFNMADD213SS, - VFNMADD231PD, - VFNMADD231PS, - VFNMADD231SD, - VFNMADD231SS, - VFNMADD312PD, - VFNMADD312PS, - VFNMADD312SD, - VFNMADD312SS, - VFNMADD321PD, - VFNMADD321PS, - VFNMADD321SD, - VFNMADD321SS, - VFNMADDPD, - VFNMADDPS, - VFNMADDSD, - VFNMADDSS, - VFNMSUB123PD, - VFNMSUB123PS, - VFNMSUB123SD, - VFNMSUB123SS, - VFNMSUB132PD, - VFNMSUB132PS, - VFNMSUB132SD, - VFNMSUB132SS, - VFNMSUB213PD, - VFNMSUB213PS, - VFNMSUB213SD, - VFNMSUB213SS, - VFNMSUB231PD, - VFNMSUB231PS, - VFNMSUB231SD, - VFNMSUB231SS, - VFNMSUB312PD, - VFNMSUB312PS, - VFNMSUB312SD, - VFNMSUB312SS, - VFNMSUB321PD, - VFNMSUB321PS, - VFNMSUB321SD, - VFNMSUB321SS, - VFNMSUBPD, - VFNMSUBPS, - VFNMSUBSD, - VFNMSUBSS, - VFRCZPD, - VFRCZPS, - VFRCZSD, - VFRCZSS, - VHADDPD, - VHADDPS, - VHSUBPD, - VHSUBPS, - VINSERTF128, - VINSERTPS, - VLDDQU, - VLDMXCSR, - VLDQQU, - VMASKMOVDQU, - VMASKMOVPD, - VMASKMOVPS, - VMAXPD, - VMAXPS, - VMAXSD, - VMAXSS, - VMCALL, - VMCLEAR, - VMINPD, - VMINPS, - VMINSD, - VMINSS, - VMLAUNCH, - VMLOAD, - VMMCALL, - VMOVAPD, - VMOVAPS, - VMOVD, - VMOVDDUP, - VMOVDQA, - VMOVDQU, - VMOVHLPS, - VMOVHPD, - VMOVHPS, - VMOVLHPS, - VMOVLPD, - VMOVLPS, - VMOVMSKPD, - VMOVMSKPS, - VMOVNTDQ, - VMOVNTDQA, - VMOVNTPD, - VMOVNTPS, - VMOVNTQQ, - VMOVQ, - VMOVQQA, - VMOVQQU, - VMOVSD, - VMOVSHDUP, - VMOVSLDUP, - VMOVSS, - VMOVUPD, - VMOVUPS, - VMPSADBW, - VMPTRLD, - VMPTRST, - VMREAD, - VMRESUME, - VMRUN, - VMSAVE, - VMULPD, - VMULPS, - VMULSD, - VMULSS, - VMWRITE, - VMXOFF, - VMXON, - VORPD, - VORPS, - VPABSB, - VPABSD, - VPABSW, - VPACKSSDW, - VPACKSSWB, - VPACKUSDW, - VPACKUSWB, - VPADDB, - VPADDD, - VPADDQ, - VPADDSB, - VPADDSW, - VPADDUSB, - VPADDUSW, - VPADDW, - VPALIGNR, - VPAND, - VPANDN, - VPAVGB, - VPAVGW, - VPBLENDVB, - VPBLENDW, - VPCLMULHQHQDQ, - VPCLMULHQLQDQ, - VPCLMULLQHQDQ, - VPCLMULLQLQDQ, - VPCLMULQDQ, - VPCMOV, - VPCMPEQB, - VPCMPEQD, - VPCMPEQQ, - VPCMPEQW, - VPCMPESTRI, - VPCMPESTRM, - VPCMPGTB, - VPCMPGTD, - VPCMPGTQ, - VPCMPGTW, - VPCMPISTRI, - VPCMPISTRM, - VPCOMB, - VPCOMD, - VPCOMQ, - VPCOMUB, - VPCOMUD, - VPCOMUQ, - VPCOMUW, - VPCOMW, - VPERM2F128, - VPERMIL2PD, - VPERMIL2PS, - VPERMILMO2PD, - VPERMILMO2PS, - VPERMILMZ2PD, - VPERMILMZ2PS, - VPERMILPD, - VPERMILPS, - VPERMILTD2PD, - VPERMILTD2PS, - VPEXTRB, - VPEXTRD, - VPEXTRQ, - VPEXTRW, - VPHADDBD, - VPHADDBQ, - VPHADDBW, - VPHADDD, - VPHADDDQ, - VPHADDSW, - VPHADDUBD, - VPHADDUBQ, - VPHADDUBWD, - VPHADDUDQ, - VPHADDUWD, - VPHADDUWQ, - VPHADDW, - VPHADDWD, - VPHADDWQ, - VPHMINPOSUW, - VPHSUBBW, - VPHSUBD, - VPHSUBDQ, - VPHSUBSW, - VPHSUBW, - VPHSUBWD, - VPINSRB, - VPINSRD, - VPINSRQ, - VPINSRW, - VPMACSDD, - VPMACSDQH, - VPMACSDQL, - VPMACSSDD, - VPMACSSDQH, - VPMACSSDQL, - VPMACSSWD, - VPMACSSWW, - VPMACSWD, - VPMACSWW, - VPMADCSSWD, - VPMADCSWD, - VPMADDUBSW, - VPMADDWD, - VPMAXSB, - VPMAXSD, - VPMAXSW, - VPMAXUB, - VPMAXUD, - VPMAXUW, - VPMINSB, - VPMINSD, - VPMINSW, - VPMINUB, - VPMINUD, - VPMINUW, - VPMOVMSKB, - VPMOVSXBD, - VPMOVSXBQ, - VPMOVSXBW, - VPMOVSXDQ, - VPMOVSXWD, - VPMOVSXWQ, - VPMOVZXBD, - VPMOVZXBQ, - VPMOVZXBW, - VPMOVZXDQ, - VPMOVZXWD, - VPMOVZXWQ, - VPMULDQ, - VPMULHRSW, - VPMULHUW, - VPMULHW, - VPMULLD, - VPMULLW, - VPMULUDQ, - VPOR, - VPPERM, - VPROTB, - VPROTD, - VPROTQ, - VPROTW, - VPSADBW, - VPSHAB, - VPSHAD, - VPSHAQ, - VPSHAW, - VPSHLB, - VPSHLD, - VPSHLQ, - VPSHLW, - VPSHUFB, - VPSHUFD, - VPSHUFHW, - VPSHUFLW, - VPSIGNB, - VPSIGND, - VPSIGNW, - VPSLLD, - VPSLLDQ, - VPSLLQ, - VPSLLW, - VPSRAD, - VPSRAW, - VPSRLD, - VPSRLDQ, - VPSRLQ, - VPSRLW, - VPSUBB, - VPSUBD, - VPSUBQ, - VPSUBSB, - VPSUBSW, - VPSUBUSB, - VPSUBUSW, - VPSUBW, - VPTEST, - VPUNPCKHBW, - VPUNPCKHDQ, - VPUNPCKHQDQ, - VPUNPCKHWD, - VPUNPCKLBW, - VPUNPCKLDQ, - VPUNPCKLQDQ, - VPUNPCKLWD, - VPXOR, - VRCPPS, - VRCPSS, - VROUNDPD, - VROUNDPS, - VROUNDSD, - VROUNDSS, - VRSQRTPS, - VRSQRTSS, - VSHUFPD, - VSHUFPS, - VSQRTPD, - VSQRTPS, - VSQRTSD, - VSQRTSS, - VSTMXCSR, - VSUBPD, - VSUBPS, - VSUBSD, - VSUBSS, - VTESTPD, - VTESTPS, - VUCOMISD, - VUCOMISS, - VUNPCKHPD, - VUNPCKHPS, - VUNPCKLPD, - VUNPCKLPS, - VXORPD, - VXORPS, - VZEROALL, - VZEROUPPER, - WBINVD, - WRMSR, - WRSHR, - XADD, - XBTS, - XCHG, - XCRYPTCBC, - XCRYPTCFB, - XCRYPTCTR, - XCRYPTECB, - XCRYPTOFB, - XGETBV, - XLAT, - XLATB, - XOR, - XORPD, - XORPS, - XRSTOR, - XSAVE, - XSETBV, - XSHA1, - XSHA256, - XSTORE, - CMOVcc, - Jcc, - SETcc, - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionOutputFormat.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionOutputFormat.cs deleted file mode 100644 index 7dc4703098..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionOutputFormat.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// - /// - public enum InstructionOutputFormat - { - /// - /// Plain ASM text - /// - ASM, - - - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionRequirement.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionRequirement.cs deleted file mode 100644 index 6f2ff493f8..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionRequirement.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public class InstructionRequirement - { - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionSet.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionSet.cs deleted file mode 100644 index 10cc4362c0..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionSet.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// - /// - public enum InstructionSet - { - /// - /// 8086 to 486 instructions. No special instruction set - /// - LEGACY, - /// - /// FPU instruction set - /// - FPU, - /// - /// MMX Technology - /// - MMX, - /// - /// AMD 3DNow! instruction set - /// - AMD_3DNOW, - /// - /// Streaming SIMD Extensions 1 - /// - SSE1, - /// - /// Streaming SIMD Extensions 2 - /// - SSE2, - /// - /// Streaming SIMD Extensions 3 - /// - SSE3, - /// - /// Supplemental Streaming SIMD Extensions 3 - /// - SSSE3, - /// - /// Streaming SIMD Extensions 4A (AMD) - /// - SSE4A, - /// - /// Streaming SIMD Extensions 4.1 - /// - SSE41, - /// - /// Streaming SIMD Extensions 4.2 - /// - SSE42, - /// - /// Virtualization Technology Extensions - /// - VMX, - /// - /// Safer Mode Extensions - /// - SMX, - /// - /// Fused Multiply/Add instructions( Intel 3 operands, AMD 4 operands ) - /// - FMA, - /// - /// AMD64, EMT64, INTEL64 instruction set - /// - LONG, - /// - /// Mask used for InstructionSet flags - /// - - //CPU_8086 = 0x00010000, - //CPU_80186 = 0x00020000, - //CPU_80286 = 0x00040000, - //CPU_80386 = 0x00080000, - //CPU_80486 = 0x00100000, - //PentiumI = 0x00200000, - //PentiumMMX = 0x00400000, - //PentiumPro = 0x00800000, - //PentiumII = 0x01000000, - //PentiumIII = 0x02000000, - //Pentium4 = 0x04000000, - //Core1 = 0x08000000, - //Core2 = 0x10000000, - //Corei7 = 0x20000000, - //Itanium = 0x40000000, - //Other = 0x80000000, - //CPUMask = 0xFFFF0000, - - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionVariant.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionVariant.cs deleted file mode 100644 index e4a9421d50..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/InstructionVariant.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - /// - /// This class represents a variant of a intructions with a specific asm code and specific operands - /// - public class InstructionVariant - { - //public Action ModifyBytes; - - //public byte[] OpCode; - public byte[] NasmData; - - public List AllowedOperandData { get; set; } - - /// - /// Gets or sets the requirements like instructionsets - /// - /// The requirements. - public InstructionRequirement Requirements { get; set; } - - /// - /// If ModR/M byte needed, set to true. If true, all other fields on - /// which refer to bytes, can assume an extra ModRM byte. - /// - public bool NeedsModRMByte; - public byte InitialModRMByteValue; - public bool ReverseRegisters = false; - - public BitSize AllowedSizes = BitSize.Default; - public BitSize DefaultSize = BitSize.Bits32; - - public string ToString( InstructionOutputFormat aFormat ) - { - string Instruction = ""; - string tmp; - switch( aFormat ) - { - case InstructionOutputFormat.ASM: - - throw new Exception("Fix"); - //tmp = Size.ToString(); - if( tmp == "" ) - return Instruction; - - Instruction += tmp + " "; - - - - - return Instruction; - } - - return "Format not supported."; - } - - /// - /// The index in OpCode where the OperandSize bit is encoded - /// - //public byte? OperandSizeByte; - /// - /// The amount of bits the operandsize bit gets shifted to left, if neccessary - /// - //public byte OperandSizeBitShiftLeft; - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Operand.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Operand.cs deleted file mode 100644 index b715b381e0..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Operand.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public class Operand - { - /// - /// is this EncodingOption valid for situations where the Operand is a register? - /// if so, DestinationReg == Guid.Empty. if it is specific to a given register, the 32bit id is put in DestinationReg - /// - public RegistersEnum BaseRegister; - - public BitSize RegisterSize; - public RegisterGroup RegisterGroup; - - /// - /// the index in OpCode where the Register bit is encoded - /// - public sbyte? RegisterByte; - /// - /// the amount of bits the Register bits gets shifted to left, if neccessary - /// - public byte RegisterBitShiftLeft; - - - - /// - /// is this EncodingOption valid for situations where the Operand is memory? - /// - public OperandType Type; - /// - /// is this EncodingOption valid for situations where the Operand is an immediate value - /// - public BitSize ImmediateSize = BitSize.None; - - public override string ToString() - { - return base.ToString(); - } - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/OperandType.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/OperandType.cs deleted file mode 100644 index de0b97d645..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/OperandType.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - [Flags] - public enum OperandType - { - Register,/* register number in 'basereg' */ - Immediate, - Memory, - RegMem,/* for r/m, ie EA, operands */ - } - -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Properties/AssemblyInfo.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Properties/AssemblyInfo.cs deleted file mode 100644 index d7bfd0de44..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/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("Cosmos.Assembler.X86.Gero")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Assembler.X86.Gero")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("b0889f32-3fa1-4570-939a-292855037a7a")] - -// 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/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegisterGroup.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegisterGroup.cs deleted file mode 100644 index 180007435e..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegisterGroup.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public enum RegisterGroup - { - REG_EA , /* 'normal' reg, qualifies as EA */ - RM_GPR , /* integer operand */ - REG_GPR, /* integer register */ - REG8 , /* 8-bit GPR */ - REG16 , /* 16-bit GPR */ - REG32, /* 32-bit GPR */ - REG64 , /* 64-bit GPR */ - FPUREG , /* floating point stack registers */ - FPU0 , /* FPU stack register zero */ - RM_MMX , /* MMX operand */ - MMXREG , /* MMX register */ - RM_XMM , /* XMM (SSE) operand */ - XMMREG , /* XMM (SSE) register */ - XMM0 , /* XMM register zero */ - RM_YMM , /* YMM (AVX) operand */ - YMMREG , /* YMM (AVX) register */ - YMM0 , /* YMM register zero */ - REG_CDT , /* CRn, DRn and TRn */ - REG_CREG , /* CRn */ - REG_DREG , /* DRn */ - REG_TREG , /* TRn */ - REG_SREG , /* any segment register */ - REG_CS , /* CS */ - REG_DESS , /* DS, ES, SS */ - REG_FSGS, /* FS, GS */ - REG_SEG67 , /* Unimplemented segment registers */ - - REG_ACCUM, /* accumulator: AL, AX, EAX, RAX */ - REG_COUNT, /* counter: CL, CX, ECX, RCX */ - REG_HIGH, /* high regs: AH, CH, DH, BH */ - REG_NOTACC, /* non-accumulator register */ - REG8NA, /* 8-bit non-acc GPR */ - REG16NA, /* 16-bit non-acc GPR */ - REG32NA, /* 32-bit non-acc GPR */ - REG64NA, /* 64-bit non-acc GPR */ - - - REG_RIP , /* RIP relative addressing */ - REG_EIP , /* EIP relative addressing */ - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Registers.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Registers.cs deleted file mode 100644 index f27814c105..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/Registers.cs +++ /dev/null @@ -1,238 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using RE = Cosmos.Assembler.X86.RegistersEnum; -namespace Cosmos.Assembler.X86 -{ - public static class Registers - { - - static RE[] Reg_CR = { RE.CR0, RE.CR1, RE.CR2, RE.CR3, RE.CR4, RE.CR5, RE.CR6, RE.CR7, RE.CR8, RE.CR9, RE.CR10, RE.CR11, RE.CR12, RE.CR13, RE.CR14, RE.CR15 }; - static RE[] Reg_DR = { RE.DR0, RE.DR1, RE.DR2, RE.DR3, RE.DR4, RE.DR5, RE.DR6, RE.DR7, RE.DR8, RE.DR9, RE.DR10, RE.DR11, RE.DR12, RE.DR13, RE.DR14, RE.DR15 }; - static RE[] Reg_FPU = { RE.ST0, RE.ST1, RE.ST2, RE.ST3, RE.ST4, RE.ST5, RE.ST6, RE.ST7 }; - static RE[] Reg_MMX = { RE.MM0, RE.MM1, RE.MM2, RE.MM3, RE.MM4, RE.MM5, RE.MM6, RE.MM7 }; - static RE[] Reg8 = { RE.AL, RE.CL, RE.DL, RE.BL, RE.AH, RE.CH, RE.DH, RE.BH }; - static RE[] Reg8_rex = { RE.AL, RE.CL, RE.DL, RE.BL, RE.SPL, RE.BPL, RE.SIL, RE.DIL, RE.R8B, RE.R9B, RE.R10B, RE.R11B, RE.R12B, RE.R13B, RE.R14B, RE.R15B }; - static RE[] Reg16 = { RE.AX, RE.CX, RE.DX, RE.BX, RE.SP, RE.BP, RE.SI, RE.DI, RE.R8W, RE.R9W, RE.R10W, RE.R11W, RE.R12W, RE.R13W, RE.R14W, RE.R15W }; - static RE[] Reg32 = { RE.EAX, RE.ECX, RE.EDX, RE.EBX, RE.ESP, RE.EBP, RE.ESI, RE.EDI, RE.R8D, RE.R9D, RE.R10D, RE.R11D, RE.R12D, RE.R13D, RE.R14D, RE.R15D }; - static RE[] Reg64 = { RE.RAX, RE.RCX, RE.RDX, RE.RBX, RE.RSP, RE.RBP, RE.RSI, RE.RDI, RE.R8, RE.R9, RE.R10, RE.R11, RE.R12, RE.R13, RE.R14, RE.R15 }; - static RE[] Reg_Seg = { RE.ES, RE.CS, RE.SS, RE.DS, RE.FS, RE.GS, RE.SEGR6, RE.SEGR7 }; - static RE[] Reg_TR = { RE.TR0, RE.TR1, RE.TR2, RE.TR3, RE.TR4, RE.TR5, RE.TR6, RE.TR7 }; - static RE[] Reg_XMM = { RE.XMM0, RE.XMM1, RE.XMM2, RE.XMM3, RE.XMM4, RE.XMM5, RE.XMM6, RE.XMM7, RE.XMM8, RE.XMM9, RE.XMM10, RE.XMM11, RE.XMM12, RE.XMM13, RE.XMM14, RE.XMM15 }; - static RE[] Reg_YMM = { RE.YMM0, RE.YMM1, RE.YMM2, RE.YMM3, RE.YMM4, RE.YMM5, RE.YMM6, RE.YMM7, RE.YMM8, RE.YMM9, RE.YMM10, RE.YMM11, RE.YMM12, RE.YMM13, RE.YMM14, RE.YMM15 }; - - /// - /// Key = 32bit (eg EAX), value = 16 bit (eg AX) - /// - //private static Dictionary m32BitTo16BitMapping = new Dictionary(); - /// - /// Key = 32bit (eg EAX), value = 16 bit (eg AL). - /// - /// - //private static Dictionary m32BitTo8BitMapping = new Dictionary(); - //private static Dictionary m16BitTo8BitMapping = new Dictionary(); - - private static Dictionary mRegToName = new Dictionary(); - private static Dictionary mNameToReg = new Dictionary(); - - static Registers() - { - foreach( RegistersEnum element in Enum.GetValues( typeof( RegistersEnum ) ) ) - { - mRegToName.Add( element, element.ToString().ToLower() ); - mNameToReg.Add( element.ToString().ToLower(), element ); - } - } - - // Just look at the register array to find a proper mapping - public static RegistersEnum? Get8BitRegistersForRegister( RegistersEnum aReg ) - { - if( Is32Bit( aReg ) ) - { - //if( m32BitTo8BitMapping.ContainsKey( aReg ) ) - //{ - // return m32BitTo8BitMapping[ aReg ]; - //} - return null; - } - if( Is16Bit( aReg ) ) - { - //if( m16BitTo8BitMapping.ContainsKey( aReg ) ) - //{ - // return m16BitTo8BitMapping[ aReg ]; - //} - return null; - } - if( Is128Bit( aReg ) ) - { - throw new Exception( "128bit registers don't have 8bit variants!" ); - } - return aReg; - } - - public static bool IsCR( RegistersEnum aReg ) - { - return Reg_CR.Contains( aReg ); - } - - public static RegistersEnum? Get16BitRegisterForRegister( RegistersEnum aReg ) - { - if( Is32Bit( aReg ) ) - { - //if( m32BitTo16BitMapping.ContainsKey( aReg ) ) - //{ - // return m32BitTo16BitMapping[ aReg ]; - //} - return null; - } - if( Is128Bit( aReg ) ) - { - throw new Exception( "128bit registers don't have 8bit variants!" ); - } - if( Is16Bit( aReg ) ) - { - return aReg; - } - //if( m16BitTo8BitMapping.ContainsKey( aReg ) ) - //{ - // return m16BitTo8BitMapping[ aReg ]; - //} - return aReg; - } - - public static RegistersEnum? Get32BitRegisterForRegister( RegistersEnum aReg ) - { - if( Is32Bit( aReg ) ) - { - return aReg; - } - if( Is128Bit( aReg ) ) - { - throw new Exception( "128bit registers don't have 32bit variants!" ); - } - if( Is16Bit( aReg ) ) - { - //if( m32BitTo16BitMapping.ContainsValue( aReg ) ) - //{ - // return ( from item in m32BitTo16BitMapping - // where item.Value == aReg - // select item.Key ).Single(); - //} - return null; - } - //if( m32BitTo8BitMapping.ContainsValue( aReg ) ) - //{ - // return ( from item in m32BitTo8BitMapping - // where item.Value == aReg - // select item.Key ).Single(); - //} - return null; - } - - public static string GetRegisterName( RegistersEnum aRegister ) - { - return mRegToName[ aRegister ]; - } - - public static RegistersEnum? GetRegister( string aName ) - { - if( mNameToReg.ContainsKey( aName ) ) - { - return mNameToReg[ aName ]; - } - else - { - return null; - } - } - - public static byte GetSize( RegistersEnum aRegister ) - { - if( Is128Bit( aRegister ) ) { return 128; } - if( Is32Bit( aRegister ) ) { return 32; } - if( Is16Bit( aRegister ) ) { return 16; } - if( Is8Bit( aRegister ) ) { return 8; } - throw new NotImplementedException(); - } - - public static bool Is8Bit( RegistersEnum aRegister ) - { - return Reg8.Contains( aRegister ); - } - - //public static Guid Get - - public static bool Is128Bit( RegistersEnum aRegister ) - { - return Reg_XMM.Contains( aRegister ) || Reg_YMM.Contains( aRegister ); - } - - public static bool IsSegment( RegistersEnum aRegister ) - { - return Reg_Seg.Contains( aRegister ); - } - - public static bool Is32Bit( RegistersEnum aRegister ) - { - return Reg32.Contains( aRegister ); - } - - public static bool Is64Bit( RegistersEnum aRegister ) - { - return Reg64.Contains( aRegister ); - } - - public static bool Is16Bit( RegistersEnum aRegister ) - { - return Reg16.Contains( aRegister ); - } - - public static List GetRegisters() - { - List registers = new List(); - foreach( RegistersEnum xField in Enum.GetValues( typeof( RegistersEnum ) ) ) - { - registers.Add( xField ); - } - - return registers; - } - - public static List GetReg8() - { - return Reg8.ToList(); - } - - public static List GetReg16() - { - return Reg16.ToList(); - } - - public static List GetReg32() - { - return Reg32.ToList(); - } - - public static List GetReg64() - { - return Reg64.ToList(); - } - - public static List GetRegCR() - { - return Reg_CR.ToList(); - } - - public static List GetRegXMM() - { - return Reg_XMM.ToList(); - } - - public static List GetRegYMM() - { - return Reg_YMM.ToList(); - } - - } -} \ No newline at end of file diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegistersEnum.cs b/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegistersEnum.cs deleted file mode 100644 index ab1e56b3d2..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86.Gero/RegistersEnum.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86 -{ - public enum RegistersEnum : byte - { - AH = 1, - AL, - AX, - BH, - BL, - BP, - BPL, - BX, - CH, - CL, - CR0, - CR1, - CR10, - CR11, - CR12, - CR13, - CR14, - CR15, - CR2, - CR3, - CR4, - CR5, - CR6, - CR7, - CR8, - CR9, - CS, - CX, - DH, - DI, - DIL, - DL, - DR0, - DR1, - DR10, - DR11, - DR12, - DR13, - DR14, - DR15, - DR2, - DR3, - DR4, - DR5, - DR6, - DR7, - DR8, - DR9, - DS, - DX, - EAX, - EBP, - EBX, - ECX, - EDI, - EDX, - ES, - ESI, - ESP, - FS, - GS, - MM0, - MM1, - MM2, - MM3, - MM4, - MM5, - MM6, - MM7, - R10, - R10B, - R10D, - R10W, - R11, - R11B, - R11D, - R11W, - R12, - R12B, - R12D, - R12W, - R13, - R13B, - R13D, - R13W, - R14, - R14B, - R14D, - R14W, - R15, - R15B, - R15D, - R15W, - R8, - R8B, - R8D, - R8W, - R9, - R9B, - R9D, - R9W, - RAX, - RBP, - RBX, - RCX, - RDI, - RDX, - RSI, - RSP, - SEGR6, - SEGR7, - SI, - SIL, - SP, - SPL, - SS, - ST0, - ST1, - ST2, - ST3, - ST4, - ST5, - ST6, - ST7, - TR0, - TR1, - TR2, - TR3, - TR4, - TR5, - TR6, - TR7, - XMM0, - XMM1, - XMM10, - XMM11, - XMM12, - XMM13, - XMM14, - XMM15, - XMM2, - XMM3, - XMM4, - XMM5, - XMM6, - XMM7, - XMM8, - XMM9, - YMM0, - YMM1, - YMM10, - YMM11, - YMM12, - YMM13, - YMM14, - YMM15, - YMM2, - YMM3, - YMM4, - YMM5, - YMM6, - YMM7, - YMM8, - YMM9, - } -} \ No newline at end of file diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBinData.cs b/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBinData.cs deleted file mode 100644 index 8a16bb2043..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBinData.cs +++ /dev/null @@ -1,3297 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.X86.Generator -{ - class OpCodeBinData - { - /* This file auto-generated from insns.dat by insns.pl - don't edit it */ - - public byte[] GetByteCodes( uint aStart ) - { - return null; - } - - static ushort[] ByteCodes = new ushort []{ - /* 0 */ 0324,0361,03,017,072,027,0101,026,0, - /* 9 */ 0324,0361,03,017,072,024,0101,026,0, - /* 18 */ 0324,0361,03,017,072,026,0101,026,0, - /* 27 */ 0324,0361,03,017,072,025,0101,026,0, - /* 36 */ 0325,0361,03,017,072,040,0110,026,0, - /* 45 */ 0324,0361,03,017,072,042,0110,026,0, - /* 54 */ 0160,03,017,045,054,0121,01,0,0, - /* 63 */ 0160,03,017,045,054,0121,01,01,0, - /* 72 */ 0160,03,017,045,054,0121,01,02,0, - /* 81 */ 0160,03,017,045,054,0121,01,03,0, - /* 90 */ 0160,03,017,045,054,0121,01,04,0, - /* 99 */ 0160,03,017,045,054,0121,01,05,0, - /* 108 */ 0160,03,017,045,054,0121,01,06,0, - /* 117 */ 0160,03,017,045,054,0121,01,07,0, - /* 126 */ 0160,03,017,045,054,0121,01,010,0, - /* 135 */ 0160,03,017,045,054,0121,01,011,0, - /* 144 */ 0160,03,017,045,054,0121,01,012,0, - /* 153 */ 0160,03,017,045,054,0121,01,013,0, - /* 162 */ 0160,03,017,045,054,0121,01,014,0, - /* 171 */ 0160,03,017,045,054,0121,01,015,0, - /* 180 */ 0160,03,017,045,054,0121,01,016,0, - /* 189 */ 0160,03,017,045,054,0121,01,017,0, - /* 198 */ 0160,03,017,045,055,0121,01,0,0, - /* 207 */ 0160,03,017,045,055,0121,01,01,0, - /* 216 */ 0160,03,017,045,055,0121,01,02,0, - /* 225 */ 0160,03,017,045,055,0121,01,03,0, - /* 234 */ 0160,03,017,045,055,0121,01,04,0, - /* 243 */ 0160,03,017,045,055,0121,01,05,0, - /* 252 */ 0160,03,017,045,055,0121,01,06,0, - /* 261 */ 0160,03,017,045,055,0121,01,07,0, - /* 270 */ 0160,03,017,045,055,0121,01,010,0, - /* 279 */ 0160,03,017,045,055,0121,01,011,0, - /* 288 */ 0160,03,017,045,055,0121,01,012,0, - /* 297 */ 0160,03,017,045,055,0121,01,013,0, - /* 306 */ 0160,03,017,045,055,0121,01,014,0, - /* 315 */ 0160,03,017,045,055,0121,01,015,0, - /* 324 */ 0160,03,017,045,055,0121,01,016,0, - /* 333 */ 0160,03,017,045,055,0121,01,017,0, - /* 342 */ 0160,03,017,045,056,0121,01,0,0, - /* 351 */ 0160,03,017,045,056,0121,01,01,0, - /* 360 */ 0160,03,017,045,056,0121,01,02,0, - /* 369 */ 0160,03,017,045,056,0121,01,03,0, - /* 378 */ 0160,03,017,045,056,0121,01,04,0, - /* 387 */ 0160,03,017,045,056,0121,01,05,0, - /* 396 */ 0160,03,017,045,056,0121,01,06,0, - /* 405 */ 0160,03,017,045,056,0121,01,07,0, - /* 414 */ 0160,03,017,045,056,0121,01,010,0, - /* 423 */ 0160,03,017,045,056,0121,01,011,0, - /* 432 */ 0160,03,017,045,056,0121,01,012,0, - /* 441 */ 0160,03,017,045,056,0121,01,013,0, - /* 450 */ 0160,03,017,045,056,0121,01,014,0, - /* 459 */ 0160,03,017,045,056,0121,01,015,0, - /* 468 */ 0160,03,017,045,056,0121,01,016,0, - /* 477 */ 0160,03,017,045,056,0121,01,017,0, - /* 486 */ 0160,03,017,045,057,0121,01,0,0, - /* 495 */ 0160,03,017,045,057,0121,01,01,0, - /* 504 */ 0160,03,017,045,057,0121,01,02,0, - /* 513 */ 0160,03,017,045,057,0121,01,03,0, - /* 522 */ 0160,03,017,045,057,0121,01,04,0, - /* 531 */ 0160,03,017,045,057,0121,01,05,0, - /* 540 */ 0160,03,017,045,057,0121,01,06,0, - /* 549 */ 0160,03,017,045,057,0121,01,07,0, - /* 558 */ 0160,03,017,045,057,0121,01,010,0, - /* 567 */ 0160,03,017,045,057,0121,01,011,0, - /* 576 */ 0160,03,017,045,057,0121,01,012,0, - /* 585 */ 0160,03,017,045,057,0121,01,013,0, - /* 594 */ 0160,03,017,045,057,0121,01,014,0, - /* 603 */ 0160,03,017,045,057,0121,01,015,0, - /* 612 */ 0160,03,017,045,057,0121,01,016,0, - /* 621 */ 0160,03,017,045,057,0121,01,017,0, - /* 630 */ 0160,03,017,045,0114,0121,01,0,0, - /* 639 */ 0160,03,017,045,0114,0121,01,01,0, - /* 648 */ 0160,03,017,045,0114,0121,01,02,0, - /* 657 */ 0160,03,017,045,0114,0121,01,03,0, - /* 666 */ 0160,03,017,045,0114,0121,01,04,0, - /* 675 */ 0160,03,017,045,0114,0121,01,05,0, - /* 684 */ 0160,03,017,045,0114,0121,01,06,0, - /* 693 */ 0160,03,017,045,0114,0121,01,07,0, - /* 702 */ 0160,03,017,045,0115,0121,01,0,0, - /* 711 */ 0160,03,017,045,0115,0121,01,01,0, - /* 720 */ 0160,03,017,045,0115,0121,01,02,0, - /* 729 */ 0160,03,017,045,0115,0121,01,03,0, - /* 738 */ 0160,03,017,045,0115,0121,01,04,0, - /* 747 */ 0160,03,017,045,0115,0121,01,05,0, - /* 756 */ 0160,03,017,045,0115,0121,01,06,0, - /* 765 */ 0160,03,017,045,0115,0121,01,07,0, - /* 774 */ 0160,03,017,045,0116,0121,01,0,0, - /* 783 */ 0160,03,017,045,0116,0121,01,01,0, - /* 792 */ 0160,03,017,045,0116,0121,01,02,0, - /* 801 */ 0160,03,017,045,0116,0121,01,03,0, - /* 810 */ 0160,03,017,045,0116,0121,01,04,0, - /* 819 */ 0160,03,017,045,0116,0121,01,05,0, - /* 828 */ 0160,03,017,045,0116,0121,01,06,0, - /* 837 */ 0160,03,017,045,0116,0121,01,07,0, - /* 846 */ 0160,03,017,045,0117,0121,01,0,0, - /* 855 */ 0160,03,017,045,0117,0121,01,01,0, - /* 864 */ 0160,03,017,045,0117,0121,01,02,0, - /* 873 */ 0160,03,017,045,0117,0121,01,03,0, - /* 882 */ 0160,03,017,045,0117,0121,01,04,0, - /* 891 */ 0160,03,017,045,0117,0121,01,05,0, - /* 900 */ 0160,03,017,045,0117,0121,01,06,0, - /* 909 */ 0160,03,017,045,0117,0121,01,07,0, - /* 918 */ 0160,03,017,045,0154,0121,01,0,0, - /* 927 */ 0160,03,017,045,0154,0121,01,01,0, - /* 936 */ 0160,03,017,045,0154,0121,01,02,0, - /* 945 */ 0160,03,017,045,0154,0121,01,03,0, - /* 954 */ 0160,03,017,045,0154,0121,01,04,0, - /* 963 */ 0160,03,017,045,0154,0121,01,05,0, - /* 972 */ 0160,03,017,045,0154,0121,01,06,0, - /* 981 */ 0160,03,017,045,0154,0121,01,07,0, - /* 990 */ 0160,03,017,045,0155,0121,01,0,0, - /* 999 */ 0160,03,017,045,0155,0121,01,01,0, - /* 1008 */ 0160,03,017,045,0155,0121,01,02,0, - /* 1017 */ 0160,03,017,045,0155,0121,01,03,0, - /* 1026 */ 0160,03,017,045,0155,0121,01,04,0, - /* 1035 */ 0160,03,017,045,0155,0121,01,05,0, - /* 1044 */ 0160,03,017,045,0155,0121,01,06,0, - /* 1053 */ 0160,03,017,045,0155,0121,01,07,0, - /* 1062 */ 0160,03,017,045,0156,0121,01,0,0, - /* 1071 */ 0160,03,017,045,0156,0121,01,01,0, - /* 1080 */ 0160,03,017,045,0156,0121,01,02,0, - /* 1089 */ 0160,03,017,045,0156,0121,01,03,0, - /* 1098 */ 0160,03,017,045,0156,0121,01,04,0, - /* 1107 */ 0160,03,017,045,0156,0121,01,05,0, - /* 1116 */ 0160,03,017,045,0156,0121,01,06,0, - /* 1125 */ 0160,03,017,045,0156,0121,01,07,0, - /* 1134 */ 0160,03,017,045,0157,0121,01,0,0, - /* 1143 */ 0160,03,017,045,0157,0121,01,01,0, - /* 1152 */ 0160,03,017,045,0157,0121,01,02,0, - /* 1161 */ 0160,03,017,045,0157,0121,01,03,0, - /* 1170 */ 0160,03,017,045,0157,0121,01,04,0, - /* 1179 */ 0160,03,017,045,0157,0121,01,05,0, - /* 1188 */ 0160,03,017,045,0157,0121,01,06,0, - /* 1197 */ 0160,03,017,045,0157,0121,01,07,0, - /* 1206 */ 0261,03,021,01,0113,0120,0174,03,0, - /* 1215 */ 0261,03,025,01,0113,0120,0174,03,0, - /* 1224 */ 0261,03,021,01,0112,0120,0174,03,0, - /* 1233 */ 0261,03,025,01,0112,0120,0174,03,0, - /* 1242 */ 0261,01,021,01,0302,0120,01,0,0, - /* 1251 */ 0260,01,021,01,0302,0110,01,0,0, - /* 1260 */ 0261,01,025,01,0302,0120,01,0,0, - /* 1269 */ 0260,01,025,01,0302,0110,01,0,0, - /* 1278 */ 0261,01,021,01,0302,0120,01,01,0, - /* 1287 */ 0260,01,021,01,0302,0110,01,01,0, - /* 1296 */ 0261,01,025,01,0302,0120,01,01,0, - /* 1305 */ 0260,01,025,01,0302,0110,01,01,0, - /* 1314 */ 0261,01,021,01,0302,0120,01,02,0, - /* 1323 */ 0260,01,021,01,0302,0110,01,02,0, - /* 1332 */ 0261,01,025,01,0302,0120,01,02,0, - /* 1341 */ 0260,01,025,01,0302,0110,01,02,0, - /* 1350 */ 0261,01,021,01,0302,0120,01,03,0, - /* 1359 */ 0260,01,021,01,0302,0110,01,03,0, - /* 1368 */ 0261,01,025,01,0302,0120,01,03,0, - /* 1377 */ 0260,01,025,01,0302,0110,01,03,0, - /* 1386 */ 0261,01,021,01,0302,0120,01,04,0, - /* 1395 */ 0260,01,021,01,0302,0110,01,04,0, - /* 1404 */ 0261,01,025,01,0302,0120,01,04,0, - /* 1413 */ 0260,01,025,01,0302,0110,01,04,0, - /* 1422 */ 0261,01,021,01,0302,0120,01,05,0, - /* 1431 */ 0260,01,021,01,0302,0110,01,05,0, - /* 1440 */ 0261,01,025,01,0302,0120,01,05,0, - /* 1449 */ 0260,01,025,01,0302,0110,01,05,0, - /* 1458 */ 0261,01,021,01,0302,0120,01,06,0, - /* 1467 */ 0260,01,021,01,0302,0110,01,06,0, - /* 1476 */ 0261,01,025,01,0302,0120,01,06,0, - /* 1485 */ 0260,01,025,01,0302,0110,01,06,0, - /* 1494 */ 0261,01,021,01,0302,0120,01,07,0, - /* 1503 */ 0260,01,021,01,0302,0110,01,07,0, - /* 1512 */ 0261,01,025,01,0302,0120,01,07,0, - /* 1521 */ 0260,01,025,01,0302,0110,01,07,0, - /* 1530 */ 0261,01,021,01,0302,0120,01,010,0, - /* 1539 */ 0260,01,021,01,0302,0110,01,010,0, - /* 1548 */ 0261,01,025,01,0302,0120,01,010,0, - /* 1557 */ 0260,01,025,01,0302,0110,01,010,0, - /* 1566 */ 0261,01,021,01,0302,0120,01,011,0, - /* 1575 */ 0260,01,021,01,0302,0110,01,011,0, - /* 1584 */ 0261,01,025,01,0302,0120,01,011,0, - /* 1593 */ 0260,01,025,01,0302,0110,01,011,0, - /* 1602 */ 0261,01,021,01,0302,0120,01,012,0, - /* 1611 */ 0260,01,021,01,0302,0110,01,012,0, - /* 1620 */ 0261,01,025,01,0302,0120,01,012,0, - /* 1629 */ 0260,01,025,01,0302,0110,01,012,0, - /* 1638 */ 0261,01,021,01,0302,0120,01,013,0, - /* 1647 */ 0260,01,021,01,0302,0110,01,013,0, - /* 1656 */ 0261,01,025,01,0302,0120,01,013,0, - /* 1665 */ 0260,01,025,01,0302,0110,01,013,0, - /* 1674 */ 0261,01,021,01,0302,0120,01,014,0, - /* 1683 */ 0260,01,021,01,0302,0110,01,014,0, - /* 1692 */ 0261,01,025,01,0302,0120,01,014,0, - /* 1701 */ 0260,01,025,01,0302,0110,01,014,0, - /* 1710 */ 0261,01,021,01,0302,0120,01,015,0, - /* 1719 */ 0260,01,021,01,0302,0110,01,015,0, - /* 1728 */ 0261,01,025,01,0302,0120,01,015,0, - /* 1737 */ 0260,01,025,01,0302,0110,01,015,0, - /* 1746 */ 0261,01,021,01,0302,0120,01,016,0, - /* 1755 */ 0260,01,021,01,0302,0110,01,016,0, - /* 1764 */ 0261,01,025,01,0302,0120,01,016,0, - /* 1773 */ 0260,01,025,01,0302,0110,01,016,0, - /* 1782 */ 0261,01,021,01,0302,0120,01,017,0, - /* 1791 */ 0260,01,021,01,0302,0110,01,017,0, - /* 1800 */ 0261,01,025,01,0302,0120,01,017,0, - /* 1809 */ 0260,01,025,01,0302,0110,01,017,0, - /* 1818 */ 0261,01,021,01,0302,0120,01,020,0, - /* 1827 */ 0260,01,021,01,0302,0110,01,020,0, - /* 1836 */ 0261,01,025,01,0302,0120,01,020,0, - /* 1845 */ 0260,01,025,01,0302,0110,01,020,0, - /* 1854 */ 0261,01,021,01,0302,0120,01,021,0, - /* 1863 */ 0260,01,021,01,0302,0110,01,021,0, - /* 1872 */ 0261,01,025,01,0302,0120,01,021,0, - /* 1881 */ 0260,01,025,01,0302,0110,01,021,0, - /* 1890 */ 0261,01,021,01,0302,0120,01,022,0, - /* 1899 */ 0260,01,021,01,0302,0110,01,022,0, - /* 1908 */ 0261,01,025,01,0302,0120,01,022,0, - /* 1917 */ 0260,01,025,01,0302,0110,01,022,0, - /* 1926 */ 0261,01,021,01,0302,0120,01,023,0, - /* 1935 */ 0260,01,021,01,0302,0110,01,023,0, - /* 1944 */ 0261,01,025,01,0302,0120,01,023,0, - /* 1953 */ 0260,01,025,01,0302,0110,01,023,0, - /* 1962 */ 0261,01,021,01,0302,0120,01,024,0, - /* 1971 */ 0260,01,021,01,0302,0110,01,024,0, - /* 1980 */ 0261,01,025,01,0302,0120,01,024,0, - /* 1989 */ 0260,01,025,01,0302,0110,01,024,0, - /* 1998 */ 0261,01,021,01,0302,0120,01,025,0, - /* 2007 */ 0260,01,021,01,0302,0110,01,025,0, - /* 2016 */ 0261,01,025,01,0302,0120,01,025,0, - /* 2025 */ 0260,01,025,01,0302,0110,01,025,0, - /* 2034 */ 0261,01,021,01,0302,0120,01,026,0, - /* 2043 */ 0260,01,021,01,0302,0110,01,026,0, - /* 2052 */ 0261,01,025,01,0302,0120,01,026,0, - /* 2061 */ 0260,01,025,01,0302,0110,01,026,0, - /* 2070 */ 0261,01,021,01,0302,0120,01,027,0, - /* 2079 */ 0260,01,021,01,0302,0110,01,027,0, - /* 2088 */ 0261,01,025,01,0302,0120,01,027,0, - /* 2097 */ 0260,01,025,01,0302,0110,01,027,0, - /* 2106 */ 0261,01,021,01,0302,0120,01,030,0, - /* 2115 */ 0260,01,021,01,0302,0110,01,030,0, - /* 2124 */ 0261,01,025,01,0302,0120,01,030,0, - /* 2133 */ 0260,01,025,01,0302,0110,01,030,0, - /* 2142 */ 0261,01,021,01,0302,0120,01,031,0, - /* 2151 */ 0260,01,021,01,0302,0110,01,031,0, - /* 2160 */ 0261,01,025,01,0302,0120,01,031,0, - /* 2169 */ 0260,01,025,01,0302,0110,01,031,0, - /* 2178 */ 0261,01,021,01,0302,0120,01,032,0, - /* 2187 */ 0260,01,021,01,0302,0110,01,032,0, - /* 2196 */ 0261,01,025,01,0302,0120,01,032,0, - /* 2205 */ 0260,01,025,01,0302,0110,01,032,0, - /* 2214 */ 0261,01,021,01,0302,0120,01,033,0, - /* 2223 */ 0260,01,021,01,0302,0110,01,033,0, - /* 2232 */ 0261,01,025,01,0302,0120,01,033,0, - /* 2241 */ 0260,01,025,01,0302,0110,01,033,0, - /* 2250 */ 0261,01,021,01,0302,0120,01,034,0, - /* 2259 */ 0260,01,021,01,0302,0110,01,034,0, - /* 2268 */ 0261,01,025,01,0302,0120,01,034,0, - /* 2277 */ 0260,01,025,01,0302,0110,01,034,0, - /* 2286 */ 0261,01,021,01,0302,0120,01,035,0, - /* 2295 */ 0260,01,021,01,0302,0110,01,035,0, - /* 2304 */ 0261,01,025,01,0302,0120,01,035,0, - /* 2313 */ 0260,01,025,01,0302,0110,01,035,0, - /* 2322 */ 0261,01,021,01,0302,0120,01,036,0, - /* 2331 */ 0260,01,021,01,0302,0110,01,036,0, - /* 2340 */ 0261,01,025,01,0302,0120,01,036,0, - /* 2349 */ 0260,01,025,01,0302,0110,01,036,0, - /* 2358 */ 0261,01,021,01,0302,0120,01,037,0, - /* 2367 */ 0260,01,021,01,0302,0110,01,037,0, - /* 2376 */ 0261,01,025,01,0302,0120,01,037,0, - /* 2385 */ 0260,01,025,01,0302,0110,01,037,0, - /* 2394 */ 0261,01,020,01,0302,0120,01,0,0, - /* 2403 */ 0260,01,020,01,0302,0110,01,0,0, - /* 2412 */ 0261,01,024,01,0302,0120,01,0,0, - /* 2421 */ 0260,01,024,01,0302,0110,01,0,0, - /* 2430 */ 0261,01,020,01,0302,0120,01,01,0, - /* 2439 */ 0260,01,020,01,0302,0110,01,01,0, - /* 2448 */ 0261,01,024,01,0302,0120,01,01,0, - /* 2457 */ 0260,01,024,01,0302,0110,01,01,0, - /* 2466 */ 0261,01,020,01,0302,0120,01,02,0, - /* 2475 */ 0260,01,020,01,0302,0110,01,02,0, - /* 2484 */ 0261,01,024,01,0302,0120,01,02,0, - /* 2493 */ 0260,01,024,01,0302,0110,01,02,0, - /* 2502 */ 0261,01,020,01,0302,0120,01,03,0, - /* 2511 */ 0260,01,020,01,0302,0110,01,03,0, - /* 2520 */ 0261,01,024,01,0302,0120,01,03,0, - /* 2529 */ 0260,01,024,01,0302,0110,01,03,0, - /* 2538 */ 0261,01,020,01,0302,0120,01,04,0, - /* 2547 */ 0260,01,020,01,0302,0110,01,04,0, - /* 2556 */ 0261,01,024,01,0302,0120,01,04,0, - /* 2565 */ 0260,01,024,01,0302,0110,01,04,0, - /* 2574 */ 0261,01,020,01,0302,0120,01,05,0, - /* 2583 */ 0260,01,020,01,0302,0110,01,05,0, - /* 2592 */ 0261,01,024,01,0302,0120,01,05,0, - /* 2601 */ 0260,01,024,01,0302,0110,01,05,0, - /* 2610 */ 0261,01,020,01,0302,0120,01,06,0, - /* 2619 */ 0260,01,020,01,0302,0110,01,06,0, - /* 2628 */ 0261,01,024,01,0302,0120,01,06,0, - /* 2637 */ 0260,01,024,01,0302,0110,01,06,0, - /* 2646 */ 0261,01,020,01,0302,0120,01,07,0, - /* 2655 */ 0260,01,020,01,0302,0110,01,07,0, - /* 2664 */ 0261,01,024,01,0302,0120,01,07,0, - /* 2673 */ 0260,01,024,01,0302,0110,01,07,0, - /* 2682 */ 0261,01,020,01,0302,0120,01,010,0, - /* 2691 */ 0260,01,020,01,0302,0110,01,010,0, - /* 2700 */ 0261,01,024,01,0302,0120,01,010,0, - /* 2709 */ 0260,01,024,01,0302,0110,01,010,0, - /* 2718 */ 0261,01,020,01,0302,0120,01,011,0, - /* 2727 */ 0260,01,020,01,0302,0110,01,011,0, - /* 2736 */ 0261,01,024,01,0302,0120,01,011,0, - /* 2745 */ 0260,01,024,01,0302,0110,01,011,0, - /* 2754 */ 0261,01,020,01,0302,0120,01,012,0, - /* 2763 */ 0260,01,020,01,0302,0110,01,012,0, - /* 2772 */ 0261,01,024,01,0302,0120,01,012,0, - /* 2781 */ 0260,01,024,01,0302,0110,01,012,0, - /* 2790 */ 0261,01,020,01,0302,0120,01,013,0, - /* 2799 */ 0260,01,020,01,0302,0110,01,013,0, - /* 2808 */ 0261,01,024,01,0302,0120,01,013,0, - /* 2817 */ 0260,01,024,01,0302,0110,01,013,0, - /* 2826 */ 0261,01,020,01,0302,0120,01,014,0, - /* 2835 */ 0260,01,020,01,0302,0110,01,014,0, - /* 2844 */ 0261,01,024,01,0302,0120,01,014,0, - /* 2853 */ 0260,01,024,01,0302,0110,01,014,0, - /* 2862 */ 0261,01,020,01,0302,0120,01,015,0, - /* 2871 */ 0260,01,020,01,0302,0110,01,015,0, - /* 2880 */ 0261,01,024,01,0302,0120,01,015,0, - /* 2889 */ 0260,01,024,01,0302,0110,01,015,0, - /* 2898 */ 0261,01,020,01,0302,0120,01,016,0, - /* 2907 */ 0260,01,020,01,0302,0110,01,016,0, - /* 2916 */ 0261,01,024,01,0302,0120,01,016,0, - /* 2925 */ 0260,01,024,01,0302,0110,01,016,0, - /* 2934 */ 0261,01,020,01,0302,0120,01,017,0, - /* 2943 */ 0260,01,020,01,0302,0110,01,017,0, - /* 2952 */ 0261,01,024,01,0302,0120,01,017,0, - /* 2961 */ 0260,01,024,01,0302,0110,01,017,0, - /* 2970 */ 0261,01,020,01,0302,0120,01,020,0, - /* 2979 */ 0260,01,020,01,0302,0110,01,020,0, - /* 2988 */ 0261,01,024,01,0302,0120,01,020,0, - /* 2997 */ 0260,01,024,01,0302,0110,01,020,0, - /* 3006 */ 0261,01,020,01,0302,0120,01,021,0, - /* 3015 */ 0260,01,020,01,0302,0110,01,021,0, - /* 3024 */ 0261,01,024,01,0302,0120,01,021,0, - /* 3033 */ 0260,01,024,01,0302,0110,01,021,0, - /* 3042 */ 0261,01,020,01,0302,0120,01,022,0, - /* 3051 */ 0260,01,020,01,0302,0110,01,022,0, - /* 3060 */ 0261,01,024,01,0302,0120,01,022,0, - /* 3069 */ 0260,01,024,01,0302,0110,01,022,0, - /* 3078 */ 0261,01,020,01,0302,0120,01,023,0, - /* 3087 */ 0260,01,020,01,0302,0110,01,023,0, - /* 3096 */ 0261,01,024,01,0302,0120,01,023,0, - /* 3105 */ 0260,01,024,01,0302,0110,01,023,0, - /* 3114 */ 0261,01,020,01,0302,0120,01,024,0, - /* 3123 */ 0260,01,020,01,0302,0110,01,024,0, - /* 3132 */ 0261,01,024,01,0302,0120,01,024,0, - /* 3141 */ 0260,01,024,01,0302,0110,01,024,0, - /* 3150 */ 0261,01,020,01,0302,0120,01,025,0, - /* 3159 */ 0260,01,020,01,0302,0110,01,025,0, - /* 3168 */ 0261,01,024,01,0302,0120,01,025,0, - /* 3177 */ 0260,01,024,01,0302,0110,01,025,0, - /* 3186 */ 0261,01,020,01,0302,0120,01,026,0, - /* 3195 */ 0260,01,020,01,0302,0110,01,026,0, - /* 3204 */ 0261,01,024,01,0302,0120,01,026,0, - /* 3213 */ 0260,01,024,01,0302,0110,01,026,0, - /* 3222 */ 0261,01,020,01,0302,0120,01,027,0, - /* 3231 */ 0260,01,020,01,0302,0110,01,027,0, - /* 3240 */ 0261,01,024,01,0302,0120,01,027,0, - /* 3249 */ 0260,01,024,01,0302,0110,01,027,0, - /* 3258 */ 0261,01,020,01,0302,0120,01,030,0, - /* 3267 */ 0260,01,020,01,0302,0110,01,030,0, - /* 3276 */ 0261,01,024,01,0302,0120,01,030,0, - /* 3285 */ 0260,01,024,01,0302,0110,01,030,0, - /* 3294 */ 0261,01,020,01,0302,0120,01,031,0, - /* 3303 */ 0260,01,020,01,0302,0110,01,031,0, - /* 3312 */ 0261,01,024,01,0302,0120,01,031,0, - /* 3321 */ 0260,01,024,01,0302,0110,01,031,0, - /* 3330 */ 0261,01,020,01,0302,0120,01,032,0, - /* 3339 */ 0260,01,020,01,0302,0110,01,032,0, - /* 3348 */ 0261,01,024,01,0302,0120,01,032,0, - /* 3357 */ 0260,01,024,01,0302,0110,01,032,0, - /* 3366 */ 0261,01,020,01,0302,0120,01,033,0, - /* 3375 */ 0260,01,020,01,0302,0110,01,033,0, - /* 3384 */ 0261,01,024,01,0302,0120,01,033,0, - /* 3393 */ 0260,01,024,01,0302,0110,01,033,0, - /* 3402 */ 0261,01,020,01,0302,0120,01,034,0, - /* 3411 */ 0260,01,020,01,0302,0110,01,034,0, - /* 3420 */ 0261,01,024,01,0302,0120,01,034,0, - /* 3429 */ 0260,01,024,01,0302,0110,01,034,0, - /* 3438 */ 0261,01,020,01,0302,0120,01,035,0, - /* 3447 */ 0260,01,020,01,0302,0110,01,035,0, - /* 3456 */ 0261,01,024,01,0302,0120,01,035,0, - /* 3465 */ 0260,01,024,01,0302,0110,01,035,0, - /* 3474 */ 0261,01,020,01,0302,0120,01,036,0, - /* 3483 */ 0260,01,020,01,0302,0110,01,036,0, - /* 3492 */ 0261,01,024,01,0302,0120,01,036,0, - /* 3501 */ 0260,01,024,01,0302,0110,01,036,0, - /* 3510 */ 0261,01,020,01,0302,0120,01,037,0, - /* 3519 */ 0260,01,020,01,0302,0110,01,037,0, - /* 3528 */ 0261,01,024,01,0302,0120,01,037,0, - /* 3537 */ 0260,01,024,01,0302,0110,01,037,0, - /* 3546 */ 0261,01,023,01,0302,0120,01,0,0, - /* 3555 */ 0260,01,023,01,0302,0110,01,0,0, - /* 3564 */ 0261,01,023,01,0302,0120,01,01,0, - /* 3573 */ 0260,01,023,01,0302,0110,01,01,0, - /* 3582 */ 0261,01,023,01,0302,0120,01,02,0, - /* 3591 */ 0260,01,023,01,0302,0110,01,02,0, - /* 3600 */ 0261,01,023,01,0302,0120,01,03,0, - /* 3609 */ 0260,01,023,01,0302,0110,01,03,0, - /* 3618 */ 0261,01,023,01,0302,0120,01,04,0, - /* 3627 */ 0260,01,023,01,0302,0110,01,04,0, - /* 3636 */ 0261,01,023,01,0302,0120,01,05,0, - /* 3645 */ 0260,01,023,01,0302,0110,01,05,0, - /* 3654 */ 0261,01,023,01,0302,0120,01,06,0, - /* 3663 */ 0260,01,023,01,0302,0110,01,06,0, - /* 3672 */ 0261,01,023,01,0302,0120,01,07,0, - /* 3681 */ 0260,01,023,01,0302,0110,01,07,0, - /* 3690 */ 0261,01,023,01,0302,0120,01,010,0, - /* 3699 */ 0260,01,023,01,0302,0110,01,010,0, - /* 3708 */ 0261,01,023,01,0302,0120,01,011,0, - /* 3717 */ 0260,01,023,01,0302,0110,01,011,0, - /* 3726 */ 0261,01,023,01,0302,0120,01,012,0, - /* 3735 */ 0260,01,023,01,0302,0110,01,012,0, - /* 3744 */ 0261,01,023,01,0302,0120,01,013,0, - /* 3753 */ 0260,01,023,01,0302,0110,01,013,0, - /* 3762 */ 0261,01,023,01,0302,0120,01,014,0, - /* 3771 */ 0260,01,023,01,0302,0110,01,014,0, - /* 3780 */ 0261,01,023,01,0302,0120,01,015,0, - /* 3789 */ 0260,01,023,01,0302,0110,01,015,0, - /* 3798 */ 0261,01,023,01,0302,0120,01,016,0, - /* 3807 */ 0260,01,023,01,0302,0110,01,016,0, - /* 3816 */ 0261,01,023,01,0302,0120,01,017,0, - /* 3825 */ 0260,01,023,01,0302,0110,01,017,0, - /* 3834 */ 0261,01,023,01,0302,0120,01,020,0, - /* 3843 */ 0260,01,023,01,0302,0110,01,020,0, - /* 3852 */ 0261,01,023,01,0302,0120,01,021,0, - /* 3861 */ 0260,01,023,01,0302,0110,01,021,0, - /* 3870 */ 0261,01,023,01,0302,0120,01,022,0, - /* 3879 */ 0260,01,023,01,0302,0110,01,022,0, - /* 3888 */ 0261,01,023,01,0302,0120,01,023,0, - /* 3897 */ 0260,01,023,01,0302,0110,01,023,0, - /* 3906 */ 0261,01,023,01,0302,0120,01,024,0, - /* 3915 */ 0260,01,023,01,0302,0110,01,024,0, - /* 3924 */ 0261,01,023,01,0302,0120,01,025,0, - /* 3933 */ 0260,01,023,01,0302,0110,01,025,0, - /* 3942 */ 0261,01,023,01,0302,0120,01,026,0, - /* 3951 */ 0260,01,023,01,0302,0110,01,026,0, - /* 3960 */ 0261,01,023,01,0302,0120,01,027,0, - /* 3969 */ 0260,01,023,01,0302,0110,01,027,0, - /* 3978 */ 0261,01,023,01,0302,0120,01,030,0, - /* 3987 */ 0260,01,023,01,0302,0110,01,030,0, - /* 3996 */ 0261,01,023,01,0302,0120,01,031,0, - /* 4005 */ 0260,01,023,01,0302,0110,01,031,0, - /* 4014 */ 0261,01,023,01,0302,0120,01,032,0, - /* 4023 */ 0260,01,023,01,0302,0110,01,032,0, - /* 4032 */ 0261,01,023,01,0302,0120,01,033,0, - /* 4041 */ 0260,01,023,01,0302,0110,01,033,0, - /* 4050 */ 0261,01,023,01,0302,0120,01,034,0, - /* 4059 */ 0260,01,023,01,0302,0110,01,034,0, - /* 4068 */ 0261,01,023,01,0302,0120,01,035,0, - /* 4077 */ 0260,01,023,01,0302,0110,01,035,0, - /* 4086 */ 0261,01,023,01,0302,0120,01,036,0, - /* 4095 */ 0260,01,023,01,0302,0110,01,036,0, - /* 4104 */ 0261,01,023,01,0302,0120,01,037,0, - /* 4113 */ 0260,01,023,01,0302,0110,01,037,0, - /* 4122 */ 0261,01,022,01,0302,0120,01,0,0, - /* 4131 */ 0260,01,022,01,0302,0110,01,0,0, - /* 4140 */ 0261,01,022,01,0302,0120,01,01,0, - /* 4149 */ 0260,01,022,01,0302,0110,01,01,0, - /* 4158 */ 0261,01,022,01,0302,0120,01,02,0, - /* 4167 */ 0260,01,022,01,0302,0110,01,02,0, - /* 4176 */ 0261,01,022,01,0302,0120,01,03,0, - /* 4185 */ 0260,01,022,01,0302,0110,01,03,0, - /* 4194 */ 0261,01,022,01,0302,0120,01,04,0, - /* 4203 */ 0260,01,022,01,0302,0110,01,04,0, - /* 4212 */ 0261,01,022,01,0302,0120,01,05,0, - /* 4221 */ 0260,01,022,01,0302,0110,01,05,0, - /* 4230 */ 0261,01,022,01,0302,0120,01,06,0, - /* 4239 */ 0260,01,022,01,0302,0110,01,06,0, - /* 4248 */ 0261,01,022,01,0302,0120,01,07,0, - /* 4257 */ 0260,01,022,01,0302,0110,01,07,0, - /* 4266 */ 0261,01,022,01,0302,0120,01,010,0, - /* 4275 */ 0260,01,022,01,0302,0110,01,010,0, - /* 4284 */ 0261,01,022,01,0302,0120,01,011,0, - /* 4293 */ 0260,01,022,01,0302,0110,01,011,0, - /* 4302 */ 0261,01,022,01,0302,0120,01,012,0, - /* 4311 */ 0260,01,022,01,0302,0110,01,012,0, - /* 4320 */ 0261,01,022,01,0302,0120,01,013,0, - /* 4329 */ 0260,01,022,01,0302,0110,01,013,0, - /* 4338 */ 0261,01,022,01,0302,0120,01,014,0, - /* 4347 */ 0260,01,022,01,0302,0110,01,014,0, - /* 4356 */ 0261,01,022,01,0302,0120,01,015,0, - /* 4365 */ 0260,01,022,01,0302,0110,01,015,0, - /* 4374 */ 0261,01,022,01,0302,0120,01,016,0, - /* 4383 */ 0260,01,022,01,0302,0110,01,016,0, - /* 4392 */ 0261,01,022,01,0302,0120,01,017,0, - /* 4401 */ 0260,01,022,01,0302,0110,01,017,0, - /* 4410 */ 0261,01,022,01,0302,0120,01,020,0, - /* 4419 */ 0260,01,022,01,0302,0110,01,020,0, - /* 4428 */ 0261,01,022,01,0302,0120,01,021,0, - /* 4437 */ 0260,01,022,01,0302,0110,01,021,0, - /* 4446 */ 0261,01,022,01,0302,0120,01,022,0, - /* 4455 */ 0260,01,022,01,0302,0110,01,022,0, - /* 4464 */ 0261,01,022,01,0302,0120,01,023,0, - /* 4473 */ 0260,01,022,01,0302,0110,01,023,0, - /* 4482 */ 0261,01,022,01,0302,0120,01,024,0, - /* 4491 */ 0260,01,022,01,0302,0110,01,024,0, - /* 4500 */ 0261,01,022,01,0302,0120,01,025,0, - /* 4509 */ 0260,01,022,01,0302,0110,01,025,0, - /* 4518 */ 0261,01,022,01,0302,0120,01,026,0, - /* 4527 */ 0260,01,022,01,0302,0110,01,026,0, - /* 4536 */ 0261,01,022,01,0302,0120,01,027,0, - /* 4545 */ 0260,01,022,01,0302,0110,01,027,0, - /* 4554 */ 0261,01,022,01,0302,0120,01,030,0, - /* 4563 */ 0260,01,022,01,0302,0110,01,030,0, - /* 4572 */ 0261,01,022,01,0302,0120,01,031,0, - /* 4581 */ 0260,01,022,01,0302,0110,01,031,0, - /* 4590 */ 0261,01,022,01,0302,0120,01,032,0, - /* 4599 */ 0260,01,022,01,0302,0110,01,032,0, - /* 4608 */ 0261,01,022,01,0302,0120,01,033,0, - /* 4617 */ 0260,01,022,01,0302,0110,01,033,0, - /* 4626 */ 0261,01,022,01,0302,0120,01,034,0, - /* 4635 */ 0260,01,022,01,0302,0110,01,034,0, - /* 4644 */ 0261,01,022,01,0302,0120,01,035,0, - /* 4653 */ 0260,01,022,01,0302,0110,01,035,0, - /* 4662 */ 0261,01,022,01,0302,0120,01,036,0, - /* 4671 */ 0260,01,022,01,0302,0110,01,036,0, - /* 4680 */ 0261,01,022,01,0302,0120,01,037,0, - /* 4689 */ 0260,01,022,01,0302,0110,01,037,0, - /* 4698 */ 0261,03,021,01,0114,0120,0174,03,0, - /* 4707 */ 0260,03,021,01,0114,0110,0174,02,0, - /* 4716 */ 0261,03,01,01,0111,0120,0173,060,0, - /* 4725 */ 0261,03,011,01,0111,0130,0173,040,0, - /* 4734 */ 0261,03,05,01,0111,0120,0173,060,0, - /* 4743 */ 0261,03,015,01,0111,0130,0173,040,0, - /* 4752 */ 0261,03,01,01,0111,0120,0173,062,0, - /* 4761 */ 0261,03,011,01,0111,0130,0173,042,0, - /* 4770 */ 0261,03,05,01,0111,0120,0173,062,0, - /* 4779 */ 0261,03,015,01,0111,0130,0173,042,0, - /* 4788 */ 0261,03,01,01,0111,0120,0173,063,0, - /* 4797 */ 0261,03,011,01,0111,0130,0173,043,0, - /* 4806 */ 0261,03,05,01,0111,0120,0173,063,0, - /* 4815 */ 0261,03,015,01,0111,0130,0173,043,0, - /* 4824 */ 0261,03,01,01,0111,0120,0172,034,0, - /* 4833 */ 0261,03,011,01,0111,0130,0172,024,0, - /* 4842 */ 0261,03,05,01,0111,0120,0172,034,0, - /* 4851 */ 0261,03,015,01,0111,0130,0172,024,0, - /* 4860 */ 0261,03,01,01,0110,0120,0173,060,0, - /* 4869 */ 0261,03,011,01,0110,0130,0173,040,0, - /* 4878 */ 0261,03,05,01,0110,0120,0173,060,0, - /* 4887 */ 0261,03,015,01,0110,0130,0173,040,0, - /* 4896 */ 0261,03,01,01,0110,0120,0173,062,0, - /* 4905 */ 0261,03,011,01,0110,0130,0173,042,0, - /* 4914 */ 0261,03,05,01,0110,0120,0173,062,0, - /* 4923 */ 0261,03,015,01,0110,0130,0173,042,0, - /* 4932 */ 0261,03,01,01,0110,0120,0173,063,0, - /* 4941 */ 0261,03,011,01,0110,0130,0173,043,0, - /* 4950 */ 0261,03,05,01,0110,0120,0173,063,0, - /* 4959 */ 0261,03,015,01,0110,0130,0173,043,0, - /* 4968 */ 0261,03,01,01,0110,0120,0172,034,0, - /* 4977 */ 0261,03,011,01,0110,0130,0172,024,0, - /* 4986 */ 0261,03,05,01,0110,0120,0172,034,0, - /* 4995 */ 0261,03,015,01,0110,0130,0172,024,0, - /* 5004 */ 0361,03,017,072,0104,0110,01,0,0, - /* 5013 */ 0361,03,017,072,0104,0110,01,01,0, - /* 5022 */ 0361,03,017,072,0104,0110,01,020,0, - /* 5031 */ 0361,03,017,072,0104,0110,01,021,0, - /* 5040 */ 0261,03,021,01,0104,0120,01,0,0, - /* 5049 */ 0260,03,021,01,0104,0110,01,0,0, - /* 5058 */ 0261,03,021,01,0104,0120,01,01,0, - /* 5067 */ 0260,03,021,01,0104,0110,01,01,0, - /* 5076 */ 0261,03,021,01,0104,0120,01,020,0, - /* 5085 */ 0260,03,021,01,0104,0110,01,020,0, - /* 5094 */ 0261,03,021,01,0104,0120,01,021,0, - /* 5103 */ 0260,03,021,01,0104,0110,01,021,0, - /* 5112 */ 0261,03,01,01,0151,0120,0174,03,0, - /* 5121 */ 0260,03,01,01,0151,0110,0174,02,0, - /* 5130 */ 0261,03,05,01,0151,0120,0174,03,0, - /* 5139 */ 0260,03,05,01,0151,0110,0174,02,0, - /* 5148 */ 0261,03,011,01,0151,0130,0174,02,0, - /* 5157 */ 0260,03,011,01,0151,0120,0174,01,0, - /* 5166 */ 0261,03,015,01,0151,0130,0174,02,0, - /* 5175 */ 0260,03,015,01,0151,0120,0174,01,0, - /* 5184 */ 0261,03,01,01,0150,0120,0174,03,0, - /* 5193 */ 0260,03,01,01,0150,0110,0174,02,0, - /* 5202 */ 0261,03,05,01,0150,0120,0174,03,0, - /* 5211 */ 0260,03,05,01,0150,0110,0174,02,0, - /* 5220 */ 0261,03,011,01,0150,0130,0174,02,0, - /* 5229 */ 0260,03,011,01,0150,0120,0174,01,0, - /* 5238 */ 0261,03,015,01,0150,0130,0174,02,0, - /* 5247 */ 0260,03,015,01,0150,0120,0174,01,0, - /* 5256 */ 0261,03,01,01,0153,0120,0174,03,0, - /* 5265 */ 0260,03,01,01,0153,0110,0174,02,0, - /* 5274 */ 0261,03,011,01,0153,0130,0174,02,0, - /* 5283 */ 0260,03,011,01,0153,0120,0174,01,0, - /* 5292 */ 0261,03,01,01,0152,0120,0174,03,0, - /* 5301 */ 0260,03,01,01,0152,0110,0174,02,0, - /* 5310 */ 0261,03,011,01,0152,0130,0174,02,0, - /* 5319 */ 0260,03,011,01,0152,0120,0174,01,0, - /* 5328 */ 0261,03,01,01,0135,0120,0174,03,0, - /* 5337 */ 0260,03,01,01,0135,0110,0174,02,0, - /* 5346 */ 0261,03,05,01,0135,0120,0174,03,0, - /* 5355 */ 0260,03,05,01,0135,0110,0174,02,0, - /* 5364 */ 0261,03,011,01,0135,0130,0174,02,0, - /* 5373 */ 0260,03,011,01,0135,0120,0174,01,0, - /* 5382 */ 0261,03,015,01,0135,0130,0174,02,0, - /* 5391 */ 0260,03,015,01,0135,0120,0174,01,0, - /* 5400 */ 0261,03,01,01,0134,0120,0174,03,0, - /* 5409 */ 0260,03,01,01,0134,0110,0174,02,0, - /* 5418 */ 0261,03,05,01,0134,0120,0174,03,0, - /* 5427 */ 0260,03,05,01,0134,0110,0174,02,0, - /* 5436 */ 0261,03,011,01,0134,0130,0174,02,0, - /* 5445 */ 0260,03,011,01,0134,0120,0174,01,0, - /* 5454 */ 0261,03,015,01,0134,0130,0174,02,0, - /* 5463 */ 0260,03,015,01,0134,0120,0174,01,0, - /* 5472 */ 0261,03,01,01,0137,0120,0174,03,0, - /* 5481 */ 0260,03,01,01,0137,0110,0174,02,0, - /* 5490 */ 0261,03,05,01,0137,0120,0174,03,0, - /* 5499 */ 0260,03,05,01,0137,0110,0174,02,0, - /* 5508 */ 0261,03,011,01,0137,0130,0174,02,0, - /* 5517 */ 0260,03,011,01,0137,0120,0174,01,0, - /* 5526 */ 0261,03,015,01,0137,0130,0174,02,0, - /* 5535 */ 0260,03,015,01,0137,0120,0174,01,0, - /* 5544 */ 0261,03,01,01,0136,0120,0174,03,0, - /* 5553 */ 0260,03,01,01,0136,0110,0174,02,0, - /* 5562 */ 0261,03,05,01,0136,0120,0174,03,0, - /* 5571 */ 0260,03,05,01,0136,0110,0174,02,0, - /* 5580 */ 0261,03,011,01,0136,0130,0174,02,0, - /* 5589 */ 0260,03,011,01,0136,0120,0174,01,0, - /* 5598 */ 0261,03,015,01,0136,0130,0174,02,0, - /* 5607 */ 0260,03,015,01,0136,0120,0174,01,0, - /* 5616 */ 0261,03,01,01,0155,0120,0174,03,0, - /* 5625 */ 0260,03,01,01,0155,0110,0174,02,0, - /* 5634 */ 0261,03,05,01,0155,0120,0174,03,0, - /* 5643 */ 0260,03,05,01,0155,0110,0174,02,0, - /* 5652 */ 0261,03,011,01,0155,0130,0174,02,0, - /* 5661 */ 0260,03,011,01,0155,0120,0174,01,0, - /* 5670 */ 0261,03,015,01,0155,0130,0174,02,0, - /* 5679 */ 0260,03,015,01,0155,0120,0174,01,0, - /* 5688 */ 0261,03,01,01,0154,0120,0174,03,0, - /* 5697 */ 0260,03,01,01,0154,0110,0174,02,0, - /* 5706 */ 0261,03,05,01,0154,0120,0174,03,0, - /* 5715 */ 0260,03,05,01,0154,0110,0174,02,0, - /* 5724 */ 0261,03,011,01,0154,0130,0174,02,0, - /* 5733 */ 0260,03,011,01,0154,0120,0174,01,0, - /* 5742 */ 0261,03,015,01,0154,0130,0174,02,0, - /* 5751 */ 0260,03,015,01,0154,0120,0174,01,0, - /* 5760 */ 0261,03,01,01,0157,0120,0174,03,0, - /* 5769 */ 0260,03,01,01,0157,0110,0174,02,0, - /* 5778 */ 0261,03,011,01,0157,0130,0174,02,0, - /* 5787 */ 0260,03,011,01,0157,0120,0174,01,0, - /* 5796 */ 0261,03,01,01,0156,0120,0174,03,0, - /* 5805 */ 0260,03,01,01,0156,0110,0174,02,0, - /* 5814 */ 0261,03,011,01,0156,0130,0174,02,0, - /* 5823 */ 0260,03,011,01,0156,0120,0174,01,0, - /* 5832 */ 0261,03,01,01,0171,0120,0174,03,0, - /* 5841 */ 0260,03,01,01,0171,0110,0174,02,0, - /* 5850 */ 0261,03,05,01,0171,0120,0174,03,0, - /* 5859 */ 0260,03,05,01,0171,0110,0174,02,0, - /* 5868 */ 0261,03,011,01,0171,0130,0174,02,0, - /* 5877 */ 0260,03,011,01,0171,0120,0174,01,0, - /* 5886 */ 0261,03,015,01,0171,0130,0174,02,0, - /* 5895 */ 0260,03,015,01,0171,0120,0174,01,0, - /* 5904 */ 0261,03,01,01,0170,0120,0174,03,0, - /* 5913 */ 0260,03,01,01,0170,0110,0174,02,0, - /* 5922 */ 0261,03,05,01,0170,0120,0174,03,0, - /* 5931 */ 0260,03,05,01,0170,0110,0174,02,0, - /* 5940 */ 0261,03,011,01,0170,0130,0174,02,0, - /* 5949 */ 0260,03,011,01,0170,0120,0174,01,0, - /* 5958 */ 0261,03,015,01,0170,0130,0174,02,0, - /* 5967 */ 0260,03,015,01,0170,0120,0174,01,0, - /* 5976 */ 0261,03,01,01,0173,0120,0174,03,0, - /* 5985 */ 0260,03,01,01,0173,0110,0174,02,0, - /* 5994 */ 0261,03,011,01,0173,0120,0174,03,0, - /* 6003 */ 0260,03,011,01,0173,0110,0174,02,0, - /* 6012 */ 0261,03,01,01,0172,0120,0174,03,0, - /* 6021 */ 0260,03,01,01,0172,0110,0174,02,0, - /* 6030 */ 0261,03,011,01,0172,0120,0174,03,0, - /* 6039 */ 0260,03,011,01,0172,0110,0174,02,0, - /* 6048 */ 0261,03,01,01,0175,0120,0174,03,0, - /* 6057 */ 0260,03,01,01,0175,0110,0174,02,0, - /* 6066 */ 0261,03,05,01,0175,0120,0174,03,0, - /* 6075 */ 0260,03,05,01,0175,0110,0174,02,0, - /* 6084 */ 0261,03,011,01,0175,0130,0174,02,0, - /* 6093 */ 0260,03,011,01,0175,0120,0174,01,0, - /* 6102 */ 0261,03,015,01,0175,0130,0174,02,0, - /* 6111 */ 0260,03,015,01,0175,0120,0174,01,0, - /* 6120 */ 0261,03,01,01,0174,0120,0174,03,0, - /* 6129 */ 0260,03,01,01,0174,0110,0174,02,0, - /* 6138 */ 0261,03,05,01,0174,0120,0174,03,0, - /* 6147 */ 0260,03,05,01,0174,0110,0174,02,0, - /* 6156 */ 0261,03,011,01,0174,0130,0174,02,0, - /* 6165 */ 0260,03,011,01,0174,0120,0174,01,0, - /* 6174 */ 0261,03,015,01,0174,0130,0174,02,0, - /* 6183 */ 0260,03,015,01,0174,0120,0174,01,0, - /* 6192 */ 0261,03,01,01,0177,0120,0174,03,0, - /* 6201 */ 0260,03,01,01,0177,0110,0174,02,0, - /* 6210 */ 0261,03,011,01,0177,0130,0174,02,0, - /* 6219 */ 0260,03,011,01,0177,0120,0174,01,0, - /* 6228 */ 0261,03,01,01,0176,0120,0174,03,0, - /* 6237 */ 0260,03,01,01,0176,0110,0174,02,0, - /* 6246 */ 0261,03,011,01,0176,0130,0174,02,0, - /* 6255 */ 0260,03,011,01,0176,0120,0174,01,0, - /* 6264 */ 0261,0110,0,01,0242,0120,0174,03,0, - /* 6273 */ 0260,0110,0,01,0242,0110,0174,02,0, - /* 6282 */ 0261,0110,04,01,0242,0120,0174,03,0, - /* 6291 */ 0260,0110,04,01,0242,0110,0174,02,0, - /* 6300 */ 0261,0110,010,01,0242,0130,0174,02,0, - /* 6309 */ 0260,0110,010,01,0242,0120,0174,01,0, - /* 6318 */ 0261,0110,014,01,0242,0130,0174,02,0, - /* 6327 */ 0260,0110,014,01,0242,0120,0174,01,0, - /* 6336 */ 0261,0110,0,01,0236,0120,0174,03,0, - /* 6345 */ 0260,0110,0,01,0236,0110,0174,02,0, - /* 6354 */ 0261,0110,0,01,0227,0120,0174,03,0, - /* 6363 */ 0260,0110,0,01,0227,0110,0174,02,0, - /* 6372 */ 0261,0110,0,01,0237,0120,0174,03,0, - /* 6381 */ 0260,0110,0,01,0237,0110,0174,02,0, - /* 6390 */ 0261,0110,0,01,0216,0120,0174,03,0, - /* 6399 */ 0260,0110,0,01,0216,0110,0174,02,0, - /* 6408 */ 0261,0110,0,01,0217,0120,0174,03,0, - /* 6417 */ 0260,0110,0,01,0217,0110,0174,02,0, - /* 6426 */ 0261,0110,0,01,0207,0120,0174,03,0, - /* 6435 */ 0260,0110,0,01,0207,0110,0174,02,0, - /* 6444 */ 0261,0110,0,01,0206,0120,0174,03,0, - /* 6453 */ 0260,0110,0,01,0206,0110,0174,02,0, - /* 6462 */ 0261,0110,0,01,0205,0120,0174,03,0, - /* 6471 */ 0260,0110,0,01,0205,0110,0174,02,0, - /* 6480 */ 0261,0110,0,01,0226,0120,0174,03,0, - /* 6489 */ 0260,0110,0,01,0226,0110,0174,02,0, - /* 6498 */ 0261,0110,0,01,0225,0120,0174,03,0, - /* 6507 */ 0260,0110,0,01,0225,0110,0174,02,0, - /* 6516 */ 0261,0110,0,01,0246,0120,0174,03,0, - /* 6525 */ 0260,0110,0,01,0246,0110,0174,02,0, - /* 6534 */ 0261,0110,0,01,0266,0120,0174,03,0, - /* 6543 */ 0260,0110,0,01,0266,0110,0174,02,0, - /* 6552 */ 0261,0110,010,01,0243,0130,0174,02,0, - /* 6561 */ 0260,0110,010,01,0243,0120,0174,01,0, - /* 6570 */ 0261,0110,0,01,0243,0120,0174,03,0, - /* 6579 */ 0260,0110,0,01,0243,0110,0174,02,0, - /* 6588 */ 0323,02,017,017,0110,01,0277,0, - /* 6596 */ 0323,02,017,017,0110,01,035,0, - /* 6604 */ 0323,02,017,017,0110,01,0256,0, - /* 6612 */ 0323,02,017,017,0110,01,0236,0, - /* 6620 */ 0323,02,017,017,0110,01,0260,0, - /* 6628 */ 0323,02,017,017,0110,01,0220,0, - /* 6636 */ 0323,02,017,017,0110,01,0240,0, - /* 6644 */ 0323,02,017,017,0110,01,0244,0, - /* 6652 */ 0323,02,017,017,0110,01,0224,0, - /* 6660 */ 0323,02,017,017,0110,01,0264,0, - /* 6668 */ 0323,02,017,017,0110,01,0226,0, - /* 6676 */ 0323,02,017,017,0110,01,0246,0, - /* 6684 */ 0323,02,017,017,0110,01,0266,0, - /* 6692 */ 0323,02,017,017,0110,01,0247,0, - /* 6700 */ 0323,02,017,017,0110,01,0227,0, - /* 6708 */ 0323,02,017,017,0110,01,0232,0, - /* 6716 */ 0323,02,017,017,0110,01,0252,0, - /* 6724 */ 0323,02,017,017,0110,01,015,0, - /* 6732 */ 0323,02,017,017,0110,01,0267,0, - /* 6740 */ 0360,02,017,0302,0110,01,0,0, - /* 6748 */ 0363,02,017,0302,0110,01,0,0, - /* 6756 */ 0360,02,017,0302,0110,01,02,0, - /* 6764 */ 0363,02,017,0302,0110,01,02,0, - /* 6772 */ 0360,02,017,0302,0110,01,01,0, - /* 6780 */ 0363,02,017,0302,0110,01,01,0, - /* 6788 */ 0360,02,017,0302,0110,01,04,0, - /* 6796 */ 0363,02,017,0302,0110,01,04,0, - /* 6804 */ 0360,02,017,0302,0110,01,06,0, - /* 6812 */ 0363,02,017,0302,0110,01,06,0, - /* 6820 */ 0360,02,017,0302,0110,01,05,0, - /* 6828 */ 0363,02,017,0302,0110,01,05,0, - /* 6836 */ 0360,02,017,0302,0110,01,07,0, - /* 6844 */ 0363,02,017,0302,0110,01,07,0, - /* 6852 */ 0360,02,017,0302,0110,01,03,0, - /* 6860 */ 0363,02,017,0302,0110,01,03,0, - /* 6868 */ 0360,0323,02,017,0160,0110,022,0, - /* 6876 */ 0323,02,017,017,0110,01,034,0, - /* 6884 */ 0323,02,017,017,0110,01,0212,0, - /* 6892 */ 0323,02,017,017,0110,01,0216,0, - /* 6900 */ 0323,02,017,017,0110,01,014,0, - /* 6908 */ 0323,02,017,017,0110,01,0273,0, - /* 6916 */ 0361,02,017,0302,0110,01,0,0, - /* 6924 */ 0362,02,017,0302,0110,01,0,0, - /* 6932 */ 0361,02,017,0302,0110,01,02,0, - /* 6940 */ 0362,02,017,0302,0110,01,02,0, - /* 6948 */ 0361,02,017,0302,0110,01,01,0, - /* 6956 */ 0362,02,017,0302,0110,01,01,0, - /* 6964 */ 0361,02,017,0302,0110,01,04,0, - /* 6972 */ 0362,02,017,0302,0110,01,04,0, - /* 6980 */ 0361,02,017,0302,0110,01,06,0, - /* 6988 */ 0362,02,017,0302,0110,01,06,0, - /* 6996 */ 0361,02,017,0302,0110,01,05,0, - /* 7004 */ 0362,02,017,0302,0110,01,05,0, - /* 7012 */ 0361,02,017,0302,0110,01,07,0, - /* 7020 */ 0362,02,017,0302,0110,01,07,0, - /* 7028 */ 0361,02,017,0302,0110,01,03,0, - /* 7036 */ 0362,02,017,0302,0110,01,03,0, - /* 7044 */ 0323,0361,03,017,070,0200,0110,0, - /* 7052 */ 0323,0361,03,017,070,0201,0110,0, - /* 7060 */ 0360,03,017,072,017,0110,026,0, - /* 7068 */ 0361,03,017,072,017,0110,026,0, - /* 7076 */ 0361,02,017,0170,0200,025,026,0, - /* 7084 */ 0362,02,017,0170,0110,026,027,0, - /* 7092 */ 0361,03,017,072,015,0110,026,0, - /* 7100 */ 0361,03,017,072,014,0110,026,0, - /* 7108 */ 0361,03,017,072,0101,0110,026,0, - /* 7116 */ 0361,03,017,072,0100,0110,026,0, - /* 7124 */ 0361,03,017,072,041,0110,026,0, - /* 7132 */ 0361,03,017,072,0102,0110,026,0, - /* 7140 */ 0361,03,017,072,016,0110,026,0, - /* 7148 */ 0361,03,017,072,011,0110,026,0, - /* 7156 */ 0361,03,017,072,010,0110,026,0, - /* 7164 */ 0361,03,017,072,013,0110,026,0, - /* 7172 */ 0361,03,017,072,012,0110,026,0, - /* 7180 */ 0320,0332,03,017,070,0361,0110,0, - /* 7188 */ 0321,0332,03,017,070,0361,0110,0, - /* 7196 */ 0324,0332,03,017,070,0360,0110,0, - /* 7204 */ 0324,0332,03,017,070,0361,0110,0, - /* 7212 */ 0361,03,017,072,0141,0110,026,0, - /* 7220 */ 0361,03,017,072,0140,0110,026,0, - /* 7228 */ 0361,03,017,072,0143,0110,026,0, - /* 7236 */ 0361,03,017,072,0142,0110,026,0, - /* 7244 */ 0160,03,017,045,054,0121,023,0, - /* 7252 */ 0160,03,017,045,055,0121,023,0, - /* 7260 */ 0160,03,017,045,056,0121,023,0, - /* 7268 */ 0160,03,017,045,057,0121,023,0, - /* 7276 */ 0160,03,017,045,0114,0121,023,0, - /* 7284 */ 0160,03,017,045,0115,0121,023,0, - /* 7292 */ 0160,03,017,045,0116,0121,023,0, - /* 7300 */ 0160,03,017,045,0117,0121,023,0, - /* 7308 */ 0160,03,017,045,0154,0121,023,0, - /* 7316 */ 0160,03,017,045,0155,0121,023,0, - /* 7324 */ 0160,03,017,045,0156,0121,023,0, - /* 7332 */ 0160,03,017,045,0157,0121,023,0, - /* 7340 */ 0360,03,017,0173,0100,0110,026,0, - /* 7348 */ 0360,03,017,0173,0101,0110,026,0, - /* 7356 */ 0360,03,017,0173,0102,0110,026,0, - /* 7364 */ 0360,03,017,0173,0103,0110,026,0, - /* 7372 */ 0323,02,017,017,0110,01,0206,0, - /* 7380 */ 0323,02,017,017,0110,01,0207,0, - /* 7388 */ 0361,03,017,072,0337,0110,022,0, - /* 7396 */ 0270,03,021,01,0337,0110,022,0, - /* 7404 */ 0261,03,021,01,015,0120,023,0, - /* 7412 */ 0260,03,021,01,015,0110,022,0, - /* 7420 */ 0261,03,025,01,015,0120,023,0, - /* 7428 */ 0260,03,025,01,015,0110,022,0, - /* 7436 */ 0261,03,021,01,014,0120,023,0, - /* 7444 */ 0260,03,021,01,014,0110,022,0, - /* 7452 */ 0261,03,025,01,014,0120,023,0, - /* 7460 */ 0260,03,025,01,014,0110,022,0, - /* 7468 */ 0261,01,021,01,0302,0120,023,0, - /* 7476 */ 0260,01,021,01,0302,0110,022,0, - /* 7484 */ 0261,01,025,01,0302,0120,023,0, - /* 7492 */ 0260,01,025,01,0302,0110,022,0, - /* 7500 */ 0261,01,020,01,0302,0120,023,0, - /* 7508 */ 0260,01,020,01,0302,0110,022,0, - /* 7516 */ 0261,01,024,01,0302,0120,023,0, - /* 7524 */ 0260,01,024,01,0302,0110,022,0, - /* 7532 */ 0261,01,023,01,0302,0120,023,0, - /* 7540 */ 0260,01,023,01,0302,0110,022,0, - /* 7548 */ 0261,01,022,01,0302,0120,023,0, - /* 7556 */ 0260,01,022,01,0302,0110,022,0, - /* 7564 */ 0261,03,021,01,0101,0120,023,0, - /* 7572 */ 0260,03,021,01,0101,0110,022,0, - /* 7580 */ 0261,03,021,01,0100,0120,023,0, - /* 7588 */ 0260,03,021,01,0100,0110,022,0, - /* 7596 */ 0261,03,025,01,0100,0120,023,0, - /* 7604 */ 0260,03,025,01,0100,0110,022,0, - /* 7612 */ 0270,03,025,01,031,0101,022,0, - /* 7620 */ 0270,03,021,01,027,0101,022,0, - /* 7628 */ 0261,03,025,01,030,0120,023,0, - /* 7636 */ 0261,03,021,01,041,0120,023,0, - /* 7644 */ 0260,03,021,01,041,0110,022,0, - /* 7652 */ 0261,03,021,01,0102,0120,023,0, - /* 7660 */ 0260,03,021,01,0102,0110,022,0, - /* 7668 */ 0261,03,021,01,017,0120,023,0, - /* 7676 */ 0260,03,021,01,017,0110,022,0, - /* 7684 */ 0261,03,021,01,016,0120,023,0, - /* 7692 */ 0260,03,021,01,016,0110,022,0, - /* 7700 */ 0270,03,021,01,0141,0110,022,0, - /* 7708 */ 0270,03,021,01,0140,0110,022,0, - /* 7716 */ 0270,03,021,01,0143,0110,022,0, - /* 7724 */ 0270,03,021,01,0142,0110,022,0, - /* 7732 */ 0270,03,021,01,05,0110,022,0, - /* 7740 */ 0270,03,025,01,05,0110,022,0, - /* 7748 */ 0270,03,021,01,04,0110,022,0, - /* 7756 */ 0270,03,025,01,04,0110,022,0, - /* 7764 */ 0261,03,025,01,06,0120,023,0, - /* 7772 */ 0270,03,01,01,024,0101,022,0, - /* 7780 */ 0270,01,01,01,0305,0101,022,0, - /* 7788 */ 0270,03,01,01,025,0101,022,0, - /* 7796 */ 0270,03,01,01,026,0101,022,0, - /* 7804 */ 0270,03,011,01,026,0101,022,0, - /* 7812 */ 0261,03,021,01,040,0120,023,0, - /* 7820 */ 0260,03,021,01,040,0110,022,0, - /* 7828 */ 0261,01,021,01,0304,0120,023,0, - /* 7836 */ 0260,01,021,01,0304,0110,022,0, - /* 7844 */ 0261,03,01,01,042,0120,023,0, - /* 7852 */ 0260,03,01,01,042,0110,022,0, - /* 7860 */ 0261,03,011,01,042,0120,023,0, - /* 7868 */ 0260,03,011,01,042,0110,022,0, - /* 7876 */ 0270,01,021,01,0160,0110,022,0, - /* 7884 */ 0270,01,022,01,0160,0110,022,0, - /* 7892 */ 0270,01,023,01,0160,0110,022,0, - /* 7900 */ 0260,01,021,01,0163,0217,022,0, - /* 7908 */ 0260,01,021,01,0163,0207,021,0, - /* 7916 */ 0260,01,021,01,0163,0213,022,0, - /* 7924 */ 0260,01,021,01,0163,0203,021,0, - /* 7932 */ 0260,01,021,01,0161,0216,022,0, - /* 7940 */ 0260,01,021,01,0161,0206,021,0, - /* 7948 */ 0260,01,021,01,0162,0216,022,0, - /* 7956 */ 0260,01,021,01,0162,0206,021,0, - /* 7964 */ 0260,01,021,01,0163,0216,022,0, - /* 7972 */ 0260,01,021,01,0163,0206,021,0, - /* 7980 */ 0260,01,021,01,0161,0214,022,0, - /* 7988 */ 0260,01,021,01,0161,0204,021,0, - /* 7996 */ 0260,01,021,01,0162,0214,022,0, - /* 8004 */ 0260,01,021,01,0162,0204,021,0, - /* 8012 */ 0260,01,021,01,0161,0212,022,0, - /* 8020 */ 0260,01,021,01,0161,0202,021,0, - /* 8028 */ 0260,01,021,01,0162,0212,022,0, - /* 8036 */ 0260,01,021,01,0162,0202,021,0, - /* 8044 */ 0260,01,021,01,0163,0212,022,0, - /* 8052 */ 0260,01,021,01,0163,0202,021,0, - /* 8060 */ 0270,03,021,01,011,0110,022,0, - /* 8068 */ 0270,03,025,01,011,0110,022,0, - /* 8076 */ 0270,03,021,01,010,0110,022,0, - /* 8084 */ 0270,03,025,01,010,0110,022,0, - /* 8092 */ 0261,03,021,01,013,0120,023,0, - /* 8100 */ 0260,03,021,01,013,0110,022,0, - /* 8108 */ 0261,03,021,01,012,0120,023,0, - /* 8116 */ 0260,03,021,01,012,0110,022,0, - /* 8124 */ 0261,01,021,01,0306,0120,023,0, - /* 8132 */ 0260,01,021,01,0306,0110,022,0, - /* 8140 */ 0261,01,025,01,0306,0120,023,0, - /* 8148 */ 0260,01,025,01,0306,0110,022,0, - /* 8156 */ 0261,01,020,01,0306,0120,023,0, - /* 8164 */ 0260,01,020,01,0306,0110,022,0, - /* 8172 */ 0261,01,024,01,0306,0120,023,0, - /* 8180 */ 0260,01,024,01,0306,0110,022,0, - /* 8188 */ 0361,03,017,072,0104,0110,022,0, - /* 8196 */ 0261,03,021,01,0104,0120,023,0, - /* 8204 */ 0260,03,021,01,0104,0110,022,0, - /* 8212 */ 0270,0110,0,01,0240,0110,022,0, - /* 8220 */ 0270,0110,0,01,0240,0100,021,0, - /* 8228 */ 0270,0110,04,01,0240,0110,022,0, - /* 8236 */ 0270,0110,04,01,0240,0100,021,0, - /* 8244 */ 0270,0110,0,01,0241,0101,022,0, - /* 8252 */ 0270,0110,0,01,0241,0100,021,0, - /* 8260 */ 0270,0110,04,01,0241,0101,022,0, - /* 8268 */ 0270,0110,04,01,0241,0100,021,0, - /* 8276 */ 0261,0110,0,01,0314,0120,023,0, - /* 8284 */ 0260,0110,0,01,0314,0110,022,0, - /* 8292 */ 0261,0110,0,01,0316,0120,023,0, - /* 8300 */ 0260,0110,0,01,0316,0110,022,0, - /* 8308 */ 0261,0110,0,01,0317,0120,023,0, - /* 8316 */ 0260,0110,0,01,0317,0110,022,0, - /* 8324 */ 0261,0110,0,01,0354,0120,023,0, - /* 8332 */ 0260,0110,0,01,0354,0110,022,0, - /* 8340 */ 0261,0110,0,01,0356,0120,023,0, - /* 8348 */ 0260,0110,0,01,0356,0110,022,0, - /* 8356 */ 0261,0110,0,01,0357,0120,023,0, - /* 8364 */ 0260,0110,0,01,0357,0110,022,0, - /* 8372 */ 0261,0110,0,01,0355,0120,023,0, - /* 8380 */ 0260,0110,0,01,0355,0110,022,0, - /* 8388 */ 0261,0110,0,01,0315,0120,023,0, - /* 8396 */ 0260,0110,0,01,0315,0110,022,0, - /* 8404 */ 0270,0110,0,01,0300,0110,022,0, - /* 8412 */ 0270,0110,0,01,0300,0100,021,0, - /* 8420 */ 0270,0110,0,01,0302,0110,022,0, - /* 8428 */ 0270,0110,0,01,0302,0100,021,0, - /* 8436 */ 0270,0110,0,01,0303,0110,022,0, - /* 8444 */ 0270,0110,0,01,0303,0100,021,0, - /* 8452 */ 0270,0110,0,01,0301,0110,022,0, - /* 8460 */ 0270,0110,0,01,0301,0100,021,0, - /* 8468 */ 0320,02,017,0272,0204,025,0, - /* 8475 */ 0321,02,017,0272,0204,025,0, - /* 8482 */ 0324,02,017,0272,0204,025,0, - /* 8489 */ 0320,02,017,0272,0207,025,0, - /* 8496 */ 0321,02,017,0272,0207,025,0, - /* 8503 */ 0324,02,017,0272,0207,025,0, - /* 8510 */ 0320,02,017,0272,0206,025,0, - /* 8517 */ 0321,02,017,0272,0206,025,0, - /* 8524 */ 0324,02,017,0272,0206,025,0, - /* 8531 */ 0320,02,017,0272,0205,025,0, - /* 8538 */ 0321,02,017,0272,0205,025,0, - /* 8545 */ 0324,02,017,0272,0205,025,0, - /* 8552 */ 0323,0313,03,017,01,0337,0, - /* 8559 */ 0320,0323,02,017,02,0110,0, - /* 8566 */ 0321,0323,02,017,02,0110,0, - /* 8573 */ 0320,0323,02,017,03,0110,0, - /* 8580 */ 0321,0323,02,017,03,0110,0, - /* 8587 */ 0360,0320,02,017,0156,0110,0, - /* 8594 */ 0360,0320,02,017,0176,0101,0, - /* 8601 */ 0360,0323,02,017,0157,0110,0, - /* 8608 */ 0360,0323,02,017,0177,0101,0, - /* 8615 */ 0360,0323,02,017,0153,0110,0, - /* 8622 */ 0360,0323,02,017,0143,0110,0, - /* 8629 */ 0360,0323,02,017,0147,0110,0, - /* 8636 */ 0360,0323,02,017,0374,0110,0, - /* 8643 */ 0360,0323,02,017,0376,0110,0, - /* 8650 */ 0360,0323,02,017,0354,0110,0, - /* 8657 */ 0360,0323,02,017,0355,0110,0, - /* 8664 */ 0360,0323,02,017,0334,0110,0, - /* 8671 */ 0360,0323,02,017,0335,0110,0, - /* 8678 */ 0360,0323,02,017,0375,0110,0, - /* 8685 */ 0360,0323,02,017,0333,0110,0, - /* 8692 */ 0360,0323,02,017,0337,0110,0, - /* 8699 */ 0360,0323,02,017,0164,0110,0, - /* 8706 */ 0360,0323,02,017,0166,0110,0, - /* 8713 */ 0360,0323,02,017,0165,0110,0, - /* 8720 */ 0360,0323,02,017,0144,0110,0, - /* 8727 */ 0360,0323,02,017,0146,0110,0, - /* 8734 */ 0360,0323,02,017,0145,0110,0, - /* 8741 */ 0360,0323,02,017,0365,0110,0, - /* 8748 */ 0360,0323,02,017,0345,0110,0, - /* 8755 */ 0360,0323,02,017,0325,0110,0, - /* 8762 */ 0360,0323,02,017,0353,0110,0, - /* 8769 */ 0360,0323,02,017,0362,0110,0, - /* 8776 */ 0360,02,017,0162,0206,025,0, - /* 8783 */ 0360,0323,02,017,0363,0110,0, - /* 8790 */ 0360,02,017,0163,0206,025,0, - /* 8797 */ 0360,0323,02,017,0361,0110,0, - /* 8804 */ 0360,02,017,0161,0206,025,0, - /* 8811 */ 0360,0323,02,017,0342,0110,0, - /* 8818 */ 0360,02,017,0162,0204,025,0, - /* 8825 */ 0360,0323,02,017,0341,0110,0, - /* 8832 */ 0360,02,017,0161,0204,025,0, - /* 8839 */ 0360,0323,02,017,0322,0110,0, - /* 8846 */ 0360,02,017,0162,0202,025,0, - /* 8853 */ 0360,0323,02,017,0323,0110,0, - /* 8860 */ 0360,02,017,0163,0202,025,0, - /* 8867 */ 0360,0323,02,017,0321,0110,0, - /* 8874 */ 0360,02,017,0161,0202,025,0, - /* 8881 */ 0360,0323,02,017,0370,0110,0, - /* 8888 */ 0360,0323,02,017,0372,0110,0, - /* 8895 */ 0360,0323,02,017,0350,0110,0, - /* 8902 */ 0360,0323,02,017,0351,0110,0, - /* 8909 */ 0360,0323,02,017,0330,0110,0, - /* 8916 */ 0360,0323,02,017,0331,0110,0, - /* 8923 */ 0360,0323,02,017,0371,0110,0, - /* 8930 */ 0360,0323,02,017,0150,0110,0, - /* 8937 */ 0360,0323,02,017,0152,0110,0, - /* 8944 */ 0360,0323,02,017,0151,0110,0, - /* 8951 */ 0360,0323,02,017,0140,0110,0, - /* 8958 */ 0360,0323,02,017,0142,0110,0, - /* 8965 */ 0360,0323,02,017,0141,0110,0, - /* 8972 */ 0360,0323,02,017,0357,0110,0, - /* 8979 */ 0320,02,017,0244,0101,026,0, - /* 8986 */ 0321,02,017,0244,0101,026,0, - /* 8993 */ 0324,02,017,0244,0101,026,0, - /* 9000 */ 0320,02,017,0254,0101,026,0, - /* 9007 */ 0321,02,017,0254,0101,026,0, - /* 9014 */ 0324,02,017,0254,0101,026,0, - /* 9021 */ 0360,0320,02,017,021,0101,0, - /* 9028 */ 0360,0321,02,017,021,0101,0, - /* 9035 */ 0360,0320,02,017,023,0110,0, - /* 9042 */ 0360,0321,02,017,023,0110,0, - /* 9049 */ 0320,01,017,0330,0100,0110,0, - /* 9056 */ 0321,01,017,0330,0100,0110,0, - /* 9063 */ 0324,01,017,0330,0100,0110,0, - /* 9070 */ 0322,01,017,0330,0200,064,0, - /* 9077 */ 0320,01,017,0330,0200,064,0, - /* 9084 */ 0321,01,017,0330,0200,064,0, - /* 9091 */ 0330,0161,0373,01,0351,064,0, - /* 9098 */ 0360,02,017,0302,0110,026,0, - /* 9105 */ 0363,02,017,0302,0110,026,0, - /* 9112 */ 0324,0363,02,017,052,0110,0, - /* 9119 */ 0324,0363,02,017,055,0110,0, - /* 9126 */ 0324,0363,02,017,054,0110,0, - /* 9133 */ 0360,0324,02,017,0120,0110,0, - /* 9140 */ 0360,02,017,0306,0110,026,0, - /* 9147 */ 0360,0323,02,017,0340,0110,0, - /* 9154 */ 0360,0323,02,017,0343,0110,0, - /* 9161 */ 0360,02,017,0305,0110,026,0, - /* 9168 */ 0360,02,017,0304,0110,026,0, - /* 9175 */ 0360,0323,02,017,0356,0110,0, - /* 9182 */ 0360,0323,02,017,0336,0110,0, - /* 9189 */ 0360,0323,02,017,0352,0110,0, - /* 9196 */ 0360,0323,02,017,0332,0110,0, - /* 9203 */ 0360,0323,02,017,0344,0110,0, - /* 9210 */ 0360,0323,02,017,0366,0110,0, - /* 9217 */ 0324,0360,02,017,0303,0101,0, - /* 9224 */ 0361,0324,02,017,0156,0110,0, - /* 9231 */ 0361,0324,02,017,0176,0101,0, - /* 9238 */ 0361,02,017,0305,0110,026,0, - /* 9245 */ 0361,02,017,0304,0110,026,0, - /* 9252 */ 0360,0323,02,017,0364,0110,0, - /* 9259 */ 0361,02,017,0160,0110,022,0, - /* 9266 */ 0363,02,017,0160,0110,022,0, - /* 9273 */ 0362,02,017,0160,0110,022,0, - /* 9280 */ 0361,02,017,0163,0207,025,0, - /* 9287 */ 0361,02,017,0161,0206,025,0, - /* 9294 */ 0361,02,017,0162,0206,025,0, - /* 9301 */ 0361,02,017,0163,0206,025,0, - /* 9308 */ 0361,02,017,0161,0204,025,0, - /* 9315 */ 0361,02,017,0162,0204,025,0, - /* 9322 */ 0361,02,017,0163,0203,025,0, - /* 9329 */ 0361,02,017,0161,0202,025,0, - /* 9336 */ 0361,02,017,0162,0202,025,0, - /* 9343 */ 0361,02,017,0163,0202,025,0, - /* 9350 */ 0360,0323,02,017,0373,0110,0, - /* 9357 */ 0361,02,017,0302,0110,026,0, - /* 9364 */ 0362,02,017,0302,0110,026,0, - /* 9371 */ 0324,0362,02,017,055,0110,0, - /* 9378 */ 0324,0362,02,017,052,0110,0, - /* 9385 */ 0324,0362,02,017,054,0110,0, - /* 9392 */ 0361,0324,02,017,0120,0110,0, - /* 9399 */ 0361,02,017,0306,0110,026,0, - /* 9406 */ 0323,0360,02,017,0170,0101,0, - /* 9413 */ 0323,0360,02,017,0171,0110,0, - /* 9420 */ 0360,03,017,070,034,0110,0, - /* 9427 */ 0361,03,017,070,034,0110,0, - /* 9434 */ 0360,03,017,070,035,0110,0, - /* 9441 */ 0361,03,017,070,035,0110,0, - /* 9448 */ 0360,03,017,070,036,0110,0, - /* 9455 */ 0361,03,017,070,036,0110,0, - /* 9462 */ 0360,03,017,070,01,0110,0, - /* 9469 */ 0361,03,017,070,01,0110,0, - /* 9476 */ 0360,03,017,070,02,0110,0, - /* 9483 */ 0361,03,017,070,02,0110,0, - /* 9490 */ 0360,03,017,070,03,0110,0, - /* 9497 */ 0361,03,017,070,03,0110,0, - /* 9504 */ 0360,03,017,070,05,0110,0, - /* 9511 */ 0361,03,017,070,05,0110,0, - /* 9518 */ 0360,03,017,070,06,0110,0, - /* 9525 */ 0361,03,017,070,06,0110,0, - /* 9532 */ 0360,03,017,070,07,0110,0, - /* 9539 */ 0361,03,017,070,07,0110,0, - /* 9546 */ 0360,03,017,070,04,0110,0, - /* 9553 */ 0361,03,017,070,04,0110,0, - /* 9560 */ 0360,03,017,070,013,0110,0, - /* 9567 */ 0361,03,017,070,013,0110,0, - /* 9574 */ 0360,03,017,070,0,0110,0, - /* 9581 */ 0361,03,017,070,0,0110,0, - /* 9588 */ 0360,03,017,070,010,0110,0, - /* 9595 */ 0361,03,017,070,010,0110,0, - /* 9602 */ 0360,03,017,070,011,0110,0, - /* 9609 */ 0361,03,017,070,011,0110,0, - /* 9616 */ 0360,03,017,070,012,0110,0, - /* 9623 */ 0361,03,017,070,012,0110,0, - /* 9630 */ 0320,0333,02,017,0275,0110,0, - /* 9637 */ 0321,0333,02,017,0275,0110,0, - /* 9644 */ 0324,0333,02,017,0275,0110,0, - /* 9651 */ 0361,03,017,070,025,0110,0, - /* 9658 */ 0361,03,017,070,024,0110,0, - /* 9665 */ 0361,03,017,070,052,0110,0, - /* 9672 */ 0361,03,017,070,053,0110,0, - /* 9679 */ 0361,03,017,070,020,0110,0, - /* 9686 */ 0361,03,017,070,051,0110,0, - /* 9693 */ 0361,03,017,070,0101,0110,0, - /* 9700 */ 0361,03,017,070,074,0110,0, - /* 9707 */ 0361,03,017,070,075,0110,0, - /* 9714 */ 0361,03,017,070,077,0110,0, - /* 9721 */ 0361,03,017,070,076,0110,0, - /* 9728 */ 0361,03,017,070,070,0110,0, - /* 9735 */ 0361,03,017,070,071,0110,0, - /* 9742 */ 0361,03,017,070,073,0110,0, - /* 9749 */ 0361,03,017,070,072,0110,0, - /* 9756 */ 0361,03,017,070,040,0110,0, - /* 9763 */ 0361,03,017,070,041,0110,0, - /* 9770 */ 0361,03,017,070,042,0110,0, - /* 9777 */ 0361,03,017,070,043,0110,0, - /* 9784 */ 0361,03,017,070,044,0110,0, - /* 9791 */ 0361,03,017,070,045,0110,0, - /* 9798 */ 0361,03,017,070,060,0110,0, - /* 9805 */ 0361,03,017,070,061,0110,0, - /* 9812 */ 0361,03,017,070,062,0110,0, - /* 9819 */ 0361,03,017,070,063,0110,0, - /* 9826 */ 0361,03,017,070,064,0110,0, - /* 9833 */ 0361,03,017,070,065,0110,0, - /* 9840 */ 0361,03,017,070,050,0110,0, - /* 9847 */ 0361,03,017,070,0100,0110,0, - /* 9854 */ 0361,03,017,070,027,0110,0, - /* 9861 */ 0361,03,017,070,067,0110,0, - /* 9868 */ 0320,0333,02,017,0270,0110,0, - /* 9875 */ 0321,0333,02,017,0270,0110,0, - /* 9882 */ 0324,0333,02,017,0270,0110,0, - /* 9889 */ 0160,03,017,044,0,0132,0, - /* 9896 */ 0164,03,017,044,0,0123,0, - /* 9903 */ 0160,03,017,044,04,0121,0, - /* 9910 */ 0164,03,017,044,04,0112,0, - /* 9917 */ 0160,03,017,044,01,0132,0, - /* 9924 */ 0164,03,017,044,01,0123,0, - /* 9931 */ 0160,03,017,044,05,0121,0, - /* 9938 */ 0164,03,017,044,05,0112,0, - /* 9945 */ 0160,03,017,044,02,0132,0, - /* 9952 */ 0164,03,017,044,02,0123,0, - /* 9959 */ 0160,03,017,044,06,0121,0, - /* 9966 */ 0164,03,017,044,06,0112,0, - /* 9973 */ 0160,03,017,044,03,0132,0, - /* 9980 */ 0164,03,017,044,03,0123,0, - /* 9987 */ 0160,03,017,044,07,0121,0, - /* 9994 */ 0164,03,017,044,07,0112,0, - /* 10001 */ 0160,03,017,044,010,0132,0, - /* 10008 */ 0164,03,017,044,010,0123,0, - /* 10015 */ 0160,03,017,044,014,0121,0, - /* 10022 */ 0164,03,017,044,014,0112,0, - /* 10029 */ 0160,03,017,044,011,0132,0, - /* 10036 */ 0164,03,017,044,011,0123,0, - /* 10043 */ 0160,03,017,044,015,0121,0, - /* 10050 */ 0164,03,017,044,015,0112,0, - /* 10057 */ 0160,03,017,044,012,0132,0, - /* 10064 */ 0164,03,017,044,012,0123,0, - /* 10071 */ 0160,03,017,044,016,0121,0, - /* 10078 */ 0164,03,017,044,016,0112,0, - /* 10085 */ 0160,03,017,044,013,0132,0, - /* 10092 */ 0164,03,017,044,013,0123,0, - /* 10099 */ 0160,03,017,044,017,0121,0, - /* 10106 */ 0164,03,017,044,017,0112,0, - /* 10113 */ 0160,03,017,044,020,0132,0, - /* 10120 */ 0164,03,017,044,020,0123,0, - /* 10127 */ 0160,03,017,044,024,0121,0, - /* 10134 */ 0164,03,017,044,024,0112,0, - /* 10141 */ 0160,03,017,044,021,0132,0, - /* 10148 */ 0164,03,017,044,021,0123,0, - /* 10155 */ 0160,03,017,044,025,0121,0, - /* 10162 */ 0164,03,017,044,025,0112,0, - /* 10169 */ 0160,03,017,044,022,0132,0, - /* 10176 */ 0164,03,017,044,022,0123,0, - /* 10183 */ 0160,03,017,044,026,0121,0, - /* 10190 */ 0164,03,017,044,026,0112,0, - /* 10197 */ 0160,03,017,044,023,0132,0, - /* 10204 */ 0164,03,017,044,023,0123,0, - /* 10211 */ 0160,03,017,044,027,0121,0, - /* 10218 */ 0164,03,017,044,027,0112,0, - /* 10225 */ 0160,03,017,044,030,0132,0, - /* 10232 */ 0164,03,017,044,030,0123,0, - /* 10239 */ 0160,03,017,044,034,0121,0, - /* 10246 */ 0164,03,017,044,034,0112,0, - /* 10253 */ 0160,03,017,044,031,0132,0, - /* 10260 */ 0164,03,017,044,031,0123,0, - /* 10267 */ 0160,03,017,044,035,0121,0, - /* 10274 */ 0164,03,017,044,035,0112,0, - /* 10281 */ 0160,03,017,044,032,0132,0, - /* 10288 */ 0164,03,017,044,032,0123,0, - /* 10295 */ 0160,03,017,044,036,0121,0, - /* 10302 */ 0164,03,017,044,036,0112,0, - /* 10309 */ 0160,03,017,044,033,0132,0, - /* 10316 */ 0164,03,017,044,033,0123,0, - /* 10323 */ 0160,03,017,044,037,0121,0, - /* 10330 */ 0164,03,017,044,037,0112,0, - /* 10337 */ 0160,03,017,044,040,0132,0, - /* 10344 */ 0164,03,017,044,040,0123,0, - /* 10351 */ 0160,03,017,044,044,0121,0, - /* 10358 */ 0164,03,017,044,044,0112,0, - /* 10365 */ 0160,03,017,044,041,0132,0, - /* 10372 */ 0164,03,017,044,041,0123,0, - /* 10379 */ 0160,03,017,044,045,0121,0, - /* 10386 */ 0164,03,017,044,045,0112,0, - /* 10393 */ 0160,03,017,044,042,0132,0, - /* 10400 */ 0164,03,017,044,042,0123,0, - /* 10407 */ 0160,03,017,044,046,0121,0, - /* 10414 */ 0164,03,017,044,046,0112,0, - /* 10421 */ 0160,03,017,044,043,0132,0, - /* 10428 */ 0164,03,017,044,043,0123,0, - /* 10435 */ 0160,03,017,044,047,0121,0, - /* 10442 */ 0164,03,017,044,047,0112,0, - /* 10449 */ 0160,03,017,044,0205,0121,0, - /* 10456 */ 0160,03,017,044,0225,0121,0, - /* 10463 */ 0160,03,017,044,0206,0121,0, - /* 10470 */ 0160,03,017,044,0226,0121,0, - /* 10477 */ 0160,03,017,044,0216,0121,0, - /* 10484 */ 0160,03,017,044,0236,0121,0, - /* 10491 */ 0160,03,017,044,0207,0121,0, - /* 10498 */ 0160,03,017,044,0227,0121,0, - /* 10505 */ 0160,03,017,044,0217,0121,0, - /* 10512 */ 0160,03,017,044,0237,0121,0, - /* 10519 */ 0160,03,017,044,0246,0121,0, - /* 10526 */ 0160,03,017,044,0266,0121,0, - /* 10533 */ 0160,03,017,044,0100,0121,0, - /* 10540 */ 0164,03,017,044,0100,0112,0, - /* 10547 */ 0160,03,017,044,0101,0121,0, - /* 10554 */ 0164,03,017,044,0101,0112,0, - /* 10561 */ 0160,03,017,044,0102,0121,0, - /* 10568 */ 0164,03,017,044,0102,0112,0, - /* 10575 */ 0160,03,017,044,0103,0121,0, - /* 10582 */ 0164,03,017,044,0103,0112,0, - /* 10589 */ 0160,03,017,044,0104,0121,0, - /* 10596 */ 0164,03,017,044,0104,0112,0, - /* 10603 */ 0160,03,017,044,0105,0121,0, - /* 10610 */ 0164,03,017,044,0105,0112,0, - /* 10617 */ 0160,03,017,044,0106,0121,0, - /* 10624 */ 0164,03,017,044,0106,0112,0, - /* 10631 */ 0160,03,017,044,0107,0121,0, - /* 10638 */ 0164,03,017,044,0107,0112,0, - /* 10645 */ 0160,03,017,044,0110,0121,0, - /* 10652 */ 0164,03,017,044,0110,0112,0, - /* 10659 */ 0160,03,017,044,0111,0121,0, - /* 10666 */ 0164,03,017,044,0111,0112,0, - /* 10673 */ 0160,03,017,044,0112,0121,0, - /* 10680 */ 0164,03,017,044,0112,0112,0, - /* 10687 */ 0160,03,017,044,0113,0121,0, - /* 10694 */ 0164,03,017,044,0113,0112,0, - /* 10701 */ 0360,03,017,0172,020,0110,0, - /* 10708 */ 0360,03,017,0172,021,0110,0, - /* 10715 */ 0360,03,017,0172,022,0110,0, - /* 10722 */ 0360,03,017,0172,023,0110,0, - /* 10729 */ 0360,03,017,0172,060,0110,0, - /* 10736 */ 0360,03,017,0172,061,0101,0, - /* 10743 */ 0360,03,017,0172,0101,0110,0, - /* 10750 */ 0360,03,017,0172,0102,0110,0, - /* 10757 */ 0360,03,017,0172,0103,0110,0, - /* 10764 */ 0360,03,017,0172,0106,0110,0, - /* 10771 */ 0360,03,017,0172,0107,0110,0, - /* 10778 */ 0360,03,017,0172,0113,0110,0, - /* 10785 */ 0360,03,017,0172,0121,0110,0, - /* 10792 */ 0360,03,017,0172,0122,0110,0, - /* 10799 */ 0360,03,017,0172,0123,0110,0, - /* 10806 */ 0360,03,017,0172,0126,0110,0, - /* 10813 */ 0360,03,017,0172,0127,0110,0, - /* 10820 */ 0360,03,017,0172,0133,0110,0, - /* 10827 */ 0360,03,017,0172,0141,0110,0, - /* 10834 */ 0360,03,017,0172,0142,0110,0, - /* 10841 */ 0360,03,017,0172,0143,0110,0, - /* 10848 */ 0320,03,017,070,0360,0110,0, - /* 10855 */ 0321,03,017,070,0360,0110,0, - /* 10862 */ 0324,03,017,070,0360,0110,0, - /* 10869 */ 0320,03,017,070,0361,0101,0, - /* 10876 */ 0321,03,017,070,0361,0101,0, - /* 10883 */ 0324,03,017,070,0361,0101,0, - /* 10890 */ 0361,03,017,070,0334,0110,0, - /* 10897 */ 0361,03,017,070,0335,0110,0, - /* 10904 */ 0361,03,017,070,0336,0110,0, - /* 10911 */ 0361,03,017,070,0337,0110,0, - /* 10918 */ 0361,03,017,070,0333,0110,0, - /* 10925 */ 0261,02,021,01,0334,0120,0, - /* 10932 */ 0260,02,021,01,0334,0110,0, - /* 10939 */ 0261,02,021,01,0335,0120,0, - /* 10946 */ 0260,02,021,01,0335,0110,0, - /* 10953 */ 0261,02,021,01,0336,0120,0, - /* 10960 */ 0260,02,021,01,0336,0110,0, - /* 10967 */ 0261,02,021,01,0337,0120,0, - /* 10974 */ 0260,02,021,01,0337,0110,0, - /* 10981 */ 0270,02,021,01,0333,0110,0, - /* 10988 */ 0261,01,021,01,0130,0120,0, - /* 10995 */ 0260,01,021,01,0130,0110,0, - /* 11002 */ 0261,01,025,01,0130,0120,0, - /* 11009 */ 0260,01,025,01,0130,0110,0, - /* 11016 */ 0261,01,020,01,0130,0120,0, - /* 11023 */ 0260,01,020,01,0130,0110,0, - /* 11030 */ 0261,01,024,01,0130,0120,0, - /* 11037 */ 0260,01,024,01,0130,0110,0, - /* 11044 */ 0261,01,023,01,0130,0120,0, - /* 11051 */ 0260,01,023,01,0130,0110,0, - /* 11058 */ 0261,01,022,01,0130,0120,0, - /* 11065 */ 0260,01,022,01,0130,0110,0, - /* 11072 */ 0261,01,021,01,0320,0120,0, - /* 11079 */ 0260,01,021,01,0320,0110,0, - /* 11086 */ 0261,01,025,01,0320,0120,0, - /* 11093 */ 0260,01,025,01,0320,0110,0, - /* 11100 */ 0261,01,023,01,0320,0120,0, - /* 11107 */ 0260,01,023,01,0320,0110,0, - /* 11114 */ 0261,01,027,01,0320,0120,0, - /* 11121 */ 0260,01,027,01,0320,0110,0, - /* 11128 */ 0261,01,021,01,0124,0120,0, - /* 11135 */ 0260,01,021,01,0124,0110,0, - /* 11142 */ 0261,01,025,01,0124,0120,0, - /* 11149 */ 0260,01,025,01,0124,0110,0, - /* 11156 */ 0261,01,020,01,0124,0120,0, - /* 11163 */ 0260,01,020,01,0124,0110,0, - /* 11170 */ 0261,01,024,01,0124,0120,0, - /* 11177 */ 0260,01,024,01,0124,0110,0, - /* 11184 */ 0261,01,021,01,0125,0120,0, - /* 11191 */ 0260,01,021,01,0125,0110,0, - /* 11198 */ 0261,01,025,01,0125,0120,0, - /* 11205 */ 0260,01,025,01,0125,0110,0, - /* 11212 */ 0261,01,020,01,0125,0120,0, - /* 11219 */ 0260,01,020,01,0125,0110,0, - /* 11226 */ 0261,01,024,01,0125,0120,0, - /* 11233 */ 0260,01,024,01,0125,0110,0, - /* 11240 */ 0270,02,021,01,025,0110,0, - /* 11247 */ 0270,02,025,01,025,0110,0, - /* 11254 */ 0270,02,021,01,024,0110,0, - /* 11261 */ 0270,02,025,01,024,0110,0, - /* 11268 */ 0270,02,021,01,030,0110,0, - /* 11275 */ 0270,02,025,01,030,0110,0, - /* 11282 */ 0270,02,025,01,031,0110,0, - /* 11289 */ 0270,02,025,01,032,0110,0, - /* 11296 */ 0270,01,021,01,057,0110,0, - /* 11303 */ 0270,01,020,01,057,0110,0, - /* 11310 */ 0270,01,022,01,0346,0110,0, - /* 11317 */ 0270,01,026,01,0346,0110,0, - /* 11324 */ 0270,01,020,01,0133,0110,0, - /* 11331 */ 0270,01,024,01,0133,0110,0, - /* 11338 */ 0270,01,023,01,0346,0110,0, - /* 11345 */ 0270,01,027,01,0346,0110,0, - /* 11352 */ 0270,01,021,01,0132,0110,0, - /* 11359 */ 0270,01,025,01,0132,0110,0, - /* 11366 */ 0270,01,021,01,0133,0110,0, - /* 11373 */ 0270,01,025,01,0133,0110,0, - /* 11380 */ 0270,01,020,01,0132,0110,0, - /* 11387 */ 0270,01,024,01,0132,0110,0, - /* 11394 */ 0270,01,03,01,055,0110,0, - /* 11401 */ 0270,01,013,01,055,0110,0, - /* 11408 */ 0261,01,023,01,0132,0120,0, - /* 11415 */ 0260,01,023,01,0132,0110,0, - /* 11422 */ 0261,01,03,01,052,0120,0, - /* 11429 */ 0260,01,03,01,052,0110,0, - /* 11436 */ 0261,01,013,01,052,0120,0, - /* 11443 */ 0260,01,013,01,052,0110,0, - /* 11450 */ 0261,01,02,01,052,0120,0, - /* 11457 */ 0260,01,02,01,052,0110,0, - /* 11464 */ 0261,01,012,01,052,0120,0, - /* 11471 */ 0260,01,012,01,052,0110,0, - /* 11478 */ 0261,01,022,01,0132,0120,0, - /* 11485 */ 0260,01,022,01,0132,0110,0, - /* 11492 */ 0270,01,02,01,055,0110,0, - /* 11499 */ 0270,01,012,01,055,0110,0, - /* 11506 */ 0270,01,021,01,0346,0110,0, - /* 11513 */ 0270,01,025,01,0346,0110,0, - /* 11520 */ 0270,01,022,01,0133,0110,0, - /* 11527 */ 0270,01,026,01,0133,0110,0, - /* 11534 */ 0270,01,03,01,054,0110,0, - /* 11541 */ 0270,01,013,01,054,0110,0, - /* 11548 */ 0270,01,02,01,054,0110,0, - /* 11555 */ 0270,01,012,01,054,0110,0, - /* 11562 */ 0261,01,021,01,0136,0120,0, - /* 11569 */ 0260,01,021,01,0136,0110,0, - /* 11576 */ 0261,01,025,01,0136,0120,0, - /* 11583 */ 0260,01,025,01,0136,0110,0, - /* 11590 */ 0261,01,020,01,0136,0120,0, - /* 11597 */ 0260,01,020,01,0136,0110,0, - /* 11604 */ 0261,01,024,01,0136,0120,0, - /* 11611 */ 0260,01,024,01,0136,0110,0, - /* 11618 */ 0261,01,023,01,0136,0120,0, - /* 11625 */ 0260,01,023,01,0136,0110,0, - /* 11632 */ 0261,01,022,01,0136,0120,0, - /* 11639 */ 0260,01,022,01,0136,0110,0, - /* 11646 */ 0261,01,021,01,0174,0120,0, - /* 11653 */ 0260,01,021,01,0174,0110,0, - /* 11660 */ 0261,01,025,01,0174,0120,0, - /* 11667 */ 0260,01,025,01,0174,0110,0, - /* 11674 */ 0261,01,023,01,0174,0120,0, - /* 11681 */ 0260,01,023,01,0174,0110,0, - /* 11688 */ 0261,01,027,01,0174,0120,0, - /* 11695 */ 0260,01,027,01,0174,0110,0, - /* 11702 */ 0261,01,021,01,0175,0120,0, - /* 11709 */ 0260,01,021,01,0175,0110,0, - /* 11716 */ 0261,01,025,01,0175,0120,0, - /* 11723 */ 0260,01,025,01,0175,0110,0, - /* 11730 */ 0261,01,023,01,0175,0120,0, - /* 11737 */ 0260,01,023,01,0175,0110,0, - /* 11744 */ 0261,01,027,01,0175,0120,0, - /* 11751 */ 0260,01,027,01,0175,0110,0, - /* 11758 */ 0270,01,023,01,0360,0110,0, - /* 11765 */ 0270,01,027,01,0360,0110,0, - /* 11772 */ 0270,01,020,01,0256,0202,0, - /* 11779 */ 0270,01,021,01,0367,0110,0, - /* 11786 */ 0261,02,021,01,054,0120,0, - /* 11793 */ 0261,02,025,01,054,0120,0, - /* 11800 */ 0261,02,021,01,056,0102,0, - /* 11807 */ 0261,02,025,01,056,0102,0, - /* 11814 */ 0261,02,021,01,055,0120,0, - /* 11821 */ 0261,02,025,01,055,0120,0, - /* 11828 */ 0261,02,021,01,057,0102,0, - /* 11835 */ 0261,02,025,01,057,0102,0, - /* 11842 */ 0261,01,021,01,0137,0120,0, - /* 11849 */ 0260,01,021,01,0137,0110,0, - /* 11856 */ 0261,01,025,01,0137,0120,0, - /* 11863 */ 0260,01,025,01,0137,0110,0, - /* 11870 */ 0261,01,020,01,0137,0120,0, - /* 11877 */ 0260,01,020,01,0137,0110,0, - /* 11884 */ 0261,01,024,01,0137,0120,0, - /* 11891 */ 0260,01,024,01,0137,0110,0, - /* 11898 */ 0261,01,023,01,0137,0120,0, - /* 11905 */ 0260,01,023,01,0137,0110,0, - /* 11912 */ 0261,01,022,01,0137,0120,0, - /* 11919 */ 0260,01,022,01,0137,0110,0, - /* 11926 */ 0261,01,021,01,0135,0120,0, - /* 11933 */ 0260,01,021,01,0135,0110,0, - /* 11940 */ 0261,01,025,01,0135,0120,0, - /* 11947 */ 0260,01,025,01,0135,0110,0, - /* 11954 */ 0261,01,020,01,0135,0120,0, - /* 11961 */ 0260,01,020,01,0135,0110,0, - /* 11968 */ 0261,01,024,01,0135,0120,0, - /* 11975 */ 0260,01,024,01,0135,0110,0, - /* 11982 */ 0261,01,023,01,0135,0120,0, - /* 11989 */ 0260,01,023,01,0135,0110,0, - /* 11996 */ 0261,01,022,01,0135,0120,0, - /* 12003 */ 0260,01,022,01,0135,0110,0, - /* 12010 */ 0270,01,021,01,050,0110,0, - /* 12017 */ 0270,01,021,01,051,0101,0, - /* 12024 */ 0270,01,025,01,050,0110,0, - /* 12031 */ 0270,01,025,01,051,0101,0, - /* 12038 */ 0270,01,020,01,050,0110,0, - /* 12045 */ 0270,01,020,01,051,0101,0, - /* 12052 */ 0270,01,024,01,050,0110,0, - /* 12059 */ 0270,01,024,01,051,0101,0, - /* 12066 */ 0270,01,022,01,0176,0110,0, - /* 12073 */ 0270,01,021,01,0326,0101,0, - /* 12080 */ 0270,01,01,01,0156,0110,0, - /* 12087 */ 0270,01,011,01,0156,0110,0, - /* 12094 */ 0270,01,01,01,0176,0101,0, - /* 12101 */ 0270,01,011,01,0176,0101,0, - /* 12108 */ 0270,01,023,01,022,0110,0, - /* 12115 */ 0270,01,027,01,022,0110,0, - /* 12122 */ 0270,01,021,01,0157,0110,0, - /* 12129 */ 0270,01,021,01,0177,0101,0, - /* 12136 */ 0270,01,025,01,0157,0110,0, - /* 12143 */ 0270,01,025,01,0177,0101,0, - /* 12150 */ 0270,01,022,01,0157,0110,0, - /* 12157 */ 0270,01,022,01,0177,0101,0, - /* 12164 */ 0270,01,026,01,0157,0110,0, - /* 12171 */ 0270,01,026,01,0177,0101,0, - /* 12178 */ 0261,01,020,01,022,0120,0, - /* 12185 */ 0260,01,020,01,022,0110,0, - /* 12192 */ 0261,01,021,01,026,0120,0, - /* 12199 */ 0260,01,021,01,026,0110,0, - /* 12206 */ 0270,01,021,01,027,0101,0, - /* 12213 */ 0261,01,020,01,026,0120,0, - /* 12220 */ 0260,01,020,01,026,0110,0, - /* 12227 */ 0270,01,020,01,027,0101,0, - /* 12234 */ 0261,01,021,01,022,0120,0, - /* 12241 */ 0260,01,021,01,022,0110,0, - /* 12248 */ 0270,01,021,01,023,0101,0, - /* 12255 */ 0270,01,020,01,023,0101,0, - /* 12262 */ 0270,01,021,01,0120,0110,0, - /* 12269 */ 0270,01,025,01,0120,0110,0, - /* 12276 */ 0270,01,020,01,0120,0110,0, - /* 12283 */ 0270,01,024,01,0120,0110,0, - /* 12290 */ 0270,01,021,01,0347,0101,0, - /* 12297 */ 0270,01,025,01,0347,0101,0, - /* 12304 */ 0270,02,021,01,052,0110,0, - /* 12311 */ 0270,01,021,01,053,0101,0, - /* 12318 */ 0270,01,025,01,053,0101,0, - /* 12325 */ 0270,01,020,01,053,0101,0, - /* 12332 */ 0270,01,024,01,053,0101,0, - /* 12339 */ 0261,01,023,01,020,0120,0, - /* 12346 */ 0260,01,023,01,020,0110,0, - /* 12353 */ 0270,01,023,01,020,0110,0, - /* 12360 */ 0261,01,023,01,021,0102,0, - /* 12367 */ 0260,01,023,01,021,0101,0, - /* 12374 */ 0270,01,023,01,021,0101,0, - /* 12381 */ 0270,01,022,01,026,0110,0, - /* 12388 */ 0270,01,026,01,026,0110,0, - /* 12395 */ 0270,01,022,01,022,0110,0, - /* 12402 */ 0270,01,026,01,022,0110,0, - /* 12409 */ 0261,01,022,01,020,0120,0, - /* 12416 */ 0260,01,022,01,020,0110,0, - /* 12423 */ 0270,01,022,01,020,0110,0, - /* 12430 */ 0261,01,022,01,021,0102,0, - /* 12437 */ 0260,01,022,01,021,0101,0, - /* 12444 */ 0270,01,022,01,021,0101,0, - /* 12451 */ 0270,01,021,01,020,0110,0, - /* 12458 */ 0270,01,021,01,021,0101,0, - /* 12465 */ 0270,01,025,01,020,0110,0, - /* 12472 */ 0270,01,025,01,021,0101,0, - /* 12479 */ 0270,01,020,01,020,0110,0, - /* 12486 */ 0270,01,020,01,021,0101,0, - /* 12493 */ 0270,01,024,01,020,0110,0, - /* 12500 */ 0270,01,024,01,021,0101,0, - /* 12507 */ 0261,01,021,01,0131,0120,0, - /* 12514 */ 0260,01,021,01,0131,0110,0, - /* 12521 */ 0261,01,025,01,0131,0120,0, - /* 12528 */ 0260,01,025,01,0131,0110,0, - /* 12535 */ 0261,01,020,01,0131,0120,0, - /* 12542 */ 0260,01,020,01,0131,0110,0, - /* 12549 */ 0261,01,024,01,0131,0120,0, - /* 12556 */ 0260,01,024,01,0131,0110,0, - /* 12563 */ 0261,01,023,01,0131,0120,0, - /* 12570 */ 0260,01,023,01,0131,0110,0, - /* 12577 */ 0261,01,022,01,0131,0120,0, - /* 12584 */ 0260,01,022,01,0131,0110,0, - /* 12591 */ 0261,01,021,01,0126,0120,0, - /* 12598 */ 0260,01,021,01,0126,0110,0, - /* 12605 */ 0261,01,025,01,0126,0120,0, - /* 12612 */ 0260,01,025,01,0126,0110,0, - /* 12619 */ 0261,01,020,01,0126,0120,0, - /* 12626 */ 0260,01,020,01,0126,0110,0, - /* 12633 */ 0261,01,024,01,0126,0120,0, - /* 12640 */ 0260,01,024,01,0126,0110,0, - /* 12647 */ 0270,02,021,01,034,0110,0, - /* 12654 */ 0270,02,021,01,035,0110,0, - /* 12661 */ 0270,02,021,01,036,0110,0, - /* 12668 */ 0261,01,021,01,0143,0120,0, - /* 12675 */ 0260,01,021,01,0143,0110,0, - /* 12682 */ 0261,01,021,01,0153,0120,0, - /* 12689 */ 0260,01,021,01,0153,0110,0, - /* 12696 */ 0261,01,021,01,0147,0120,0, - /* 12703 */ 0260,01,021,01,0147,0110,0, - /* 12710 */ 0261,02,021,01,053,0120,0, - /* 12717 */ 0260,02,021,01,053,0110,0, - /* 12724 */ 0261,01,021,01,0374,0120,0, - /* 12731 */ 0260,01,021,01,0374,0110,0, - /* 12738 */ 0261,01,021,01,0375,0120,0, - /* 12745 */ 0260,01,021,01,0375,0110,0, - /* 12752 */ 0261,01,021,01,0376,0120,0, - /* 12759 */ 0260,01,021,01,0376,0110,0, - /* 12766 */ 0261,01,021,01,0324,0120,0, - /* 12773 */ 0260,01,021,01,0324,0110,0, - /* 12780 */ 0261,01,021,01,0354,0120,0, - /* 12787 */ 0260,01,021,01,0354,0110,0, - /* 12794 */ 0261,01,021,01,0355,0120,0, - /* 12801 */ 0260,01,021,01,0355,0110,0, - /* 12808 */ 0261,01,021,01,0334,0120,0, - /* 12815 */ 0260,01,021,01,0334,0110,0, - /* 12822 */ 0261,01,021,01,0335,0120,0, - /* 12829 */ 0260,01,021,01,0335,0110,0, - /* 12836 */ 0261,01,021,01,0333,0120,0, - /* 12843 */ 0260,01,021,01,0333,0110,0, - /* 12850 */ 0261,01,021,01,0337,0120,0, - /* 12857 */ 0260,01,021,01,0337,0110,0, - /* 12864 */ 0261,01,021,01,0340,0120,0, - /* 12871 */ 0260,01,021,01,0340,0110,0, - /* 12878 */ 0261,01,021,01,0343,0120,0, - /* 12885 */ 0260,01,021,01,0343,0110,0, - /* 12892 */ 0261,01,021,01,0164,0120,0, - /* 12899 */ 0260,01,021,01,0164,0110,0, - /* 12906 */ 0261,01,021,01,0165,0120,0, - /* 12913 */ 0260,01,021,01,0165,0110,0, - /* 12920 */ 0261,01,021,01,0166,0120,0, - /* 12927 */ 0260,01,021,01,0166,0110,0, - /* 12934 */ 0261,01,021,01,051,0120,0, - /* 12941 */ 0260,01,021,01,051,0110,0, - /* 12948 */ 0261,01,021,01,0144,0120,0, - /* 12955 */ 0260,01,021,01,0144,0110,0, - /* 12962 */ 0261,01,021,01,0145,0120,0, - /* 12969 */ 0260,01,021,01,0145,0110,0, - /* 12976 */ 0261,01,021,01,0146,0120,0, - /* 12983 */ 0260,01,021,01,0146,0110,0, - /* 12990 */ 0261,01,021,01,067,0120,0, - /* 12997 */ 0260,01,021,01,067,0110,0, - /* 13004 */ 0261,02,021,01,015,0120,0, - /* 13011 */ 0261,02,025,01,015,0120,0, - /* 13018 */ 0261,02,021,01,014,0120,0, - /* 13025 */ 0261,02,025,01,014,0120,0, - /* 13032 */ 0261,02,021,01,01,0120,0, - /* 13039 */ 0260,02,021,01,01,0110,0, - /* 13046 */ 0261,02,021,01,02,0120,0, - /* 13053 */ 0260,02,021,01,02,0110,0, - /* 13060 */ 0261,02,021,01,03,0120,0, - /* 13067 */ 0260,02,021,01,03,0110,0, - /* 13074 */ 0270,02,021,01,0101,0110,0, - /* 13081 */ 0261,02,021,01,05,0120,0, - /* 13088 */ 0260,02,021,01,05,0110,0, - /* 13095 */ 0261,02,021,01,06,0120,0, - /* 13102 */ 0260,02,021,01,06,0110,0, - /* 13109 */ 0261,02,021,01,07,0120,0, - /* 13116 */ 0260,02,021,01,07,0110,0, - /* 13123 */ 0261,01,021,01,0365,0120,0, - /* 13130 */ 0260,01,021,01,0365,0110,0, - /* 13137 */ 0261,02,021,01,04,0120,0, - /* 13144 */ 0260,02,021,01,04,0110,0, - /* 13151 */ 0261,02,021,01,074,0120,0, - /* 13158 */ 0260,02,021,01,074,0110,0, - /* 13165 */ 0261,01,021,01,0356,0120,0, - /* 13172 */ 0260,01,021,01,0356,0110,0, - /* 13179 */ 0261,02,021,01,075,0120,0, - /* 13186 */ 0260,02,021,01,075,0110,0, - /* 13193 */ 0261,01,021,01,0336,0120,0, - /* 13200 */ 0260,01,021,01,0336,0110,0, - /* 13207 */ 0261,02,021,01,076,0120,0, - /* 13214 */ 0260,02,021,01,076,0110,0, - /* 13221 */ 0261,02,021,01,077,0120,0, - /* 13228 */ 0260,02,021,01,077,0110,0, - /* 13235 */ 0261,02,021,01,070,0120,0, - /* 13242 */ 0260,02,021,01,070,0110,0, - /* 13249 */ 0261,01,021,01,0352,0120,0, - /* 13256 */ 0260,01,021,01,0352,0110,0, - /* 13263 */ 0261,02,021,01,071,0120,0, - /* 13270 */ 0260,02,021,01,071,0110,0, - /* 13277 */ 0261,01,021,01,0332,0120,0, - /* 13284 */ 0260,01,021,01,0332,0110,0, - /* 13291 */ 0261,02,021,01,072,0120,0, - /* 13298 */ 0260,02,021,01,072,0110,0, - /* 13305 */ 0261,02,021,01,073,0120,0, - /* 13312 */ 0260,02,021,01,073,0110,0, - /* 13319 */ 0270,01,021,01,0327,0110,0, - /* 13326 */ 0270,02,021,01,040,0110,0, - /* 13333 */ 0270,02,021,01,041,0110,0, - /* 13340 */ 0270,02,021,01,042,0110,0, - /* 13347 */ 0270,02,021,01,043,0110,0, - /* 13354 */ 0270,02,021,01,044,0110,0, - /* 13361 */ 0270,02,021,01,045,0110,0, - /* 13368 */ 0270,02,021,01,060,0110,0, - /* 13375 */ 0270,02,021,01,061,0110,0, - /* 13382 */ 0270,02,021,01,062,0110,0, - /* 13389 */ 0270,02,021,01,063,0110,0, - /* 13396 */ 0270,02,021,01,064,0110,0, - /* 13403 */ 0270,02,021,01,065,0110,0, - /* 13410 */ 0261,01,021,01,0344,0120,0, - /* 13417 */ 0260,01,021,01,0344,0110,0, - /* 13424 */ 0261,02,021,01,013,0120,0, - /* 13431 */ 0260,02,021,01,013,0110,0, - /* 13438 */ 0261,01,021,01,0345,0120,0, - /* 13445 */ 0260,01,021,01,0345,0110,0, - /* 13452 */ 0261,01,021,01,0325,0120,0, - /* 13459 */ 0260,01,021,01,0325,0110,0, - /* 13466 */ 0261,02,021,01,0100,0120,0, - /* 13473 */ 0260,02,021,01,0100,0110,0, - /* 13480 */ 0261,01,021,01,0364,0120,0, - /* 13487 */ 0260,01,021,01,0364,0110,0, - /* 13494 */ 0261,02,021,01,050,0120,0, - /* 13501 */ 0260,02,021,01,050,0110,0, - /* 13508 */ 0261,01,021,01,0353,0120,0, - /* 13515 */ 0260,01,021,01,0353,0110,0, - /* 13522 */ 0261,01,021,01,0366,0120,0, - /* 13529 */ 0260,01,021,01,0366,0110,0, - /* 13536 */ 0261,02,021,01,0,0120,0, - /* 13543 */ 0260,02,021,01,0,0110,0, - /* 13550 */ 0261,02,021,01,010,0120,0, - /* 13557 */ 0260,02,021,01,010,0110,0, - /* 13564 */ 0261,02,021,01,011,0120,0, - /* 13571 */ 0260,02,021,01,011,0110,0, - /* 13578 */ 0261,02,021,01,012,0120,0, - /* 13585 */ 0260,02,021,01,012,0110,0, - /* 13592 */ 0261,01,021,01,0361,0120,0, - /* 13599 */ 0260,01,021,01,0361,0110,0, - /* 13606 */ 0261,01,021,01,0362,0120,0, - /* 13613 */ 0260,01,021,01,0362,0110,0, - /* 13620 */ 0261,01,021,01,0363,0120,0, - /* 13627 */ 0260,01,021,01,0363,0110,0, - /* 13634 */ 0261,01,021,01,0341,0120,0, - /* 13641 */ 0260,01,021,01,0341,0110,0, - /* 13648 */ 0261,01,021,01,0342,0120,0, - /* 13655 */ 0260,01,021,01,0342,0110,0, - /* 13662 */ 0261,01,021,01,0321,0120,0, - /* 13669 */ 0260,01,021,01,0321,0110,0, - /* 13676 */ 0261,01,021,01,0322,0120,0, - /* 13683 */ 0260,01,021,01,0322,0110,0, - /* 13690 */ 0261,01,021,01,0323,0120,0, - /* 13697 */ 0260,01,021,01,0323,0110,0, - /* 13704 */ 0270,02,021,01,027,0110,0, - /* 13711 */ 0270,02,025,01,027,0110,0, - /* 13718 */ 0261,01,021,01,0370,0120,0, - /* 13725 */ 0260,01,021,01,0370,0110,0, - /* 13732 */ 0261,01,021,01,0371,0120,0, - /* 13739 */ 0260,01,021,01,0371,0110,0, - /* 13746 */ 0261,01,021,01,0372,0120,0, - /* 13753 */ 0260,01,021,01,0372,0110,0, - /* 13760 */ 0261,01,021,01,0373,0120,0, - /* 13767 */ 0260,01,021,01,0373,0110,0, - /* 13774 */ 0261,01,021,01,0350,0120,0, - /* 13781 */ 0260,01,021,01,0350,0110,0, - /* 13788 */ 0261,01,021,01,0351,0120,0, - /* 13795 */ 0260,01,021,01,0351,0110,0, - /* 13802 */ 0261,01,021,01,0330,0120,0, - /* 13809 */ 0260,01,021,01,0330,0110,0, - /* 13816 */ 0261,01,021,01,0331,0120,0, - /* 13823 */ 0260,01,021,01,0331,0110,0, - /* 13830 */ 0261,01,021,01,0150,0120,0, - /* 13837 */ 0260,01,021,01,0150,0110,0, - /* 13844 */ 0261,01,021,01,0151,0120,0, - /* 13851 */ 0260,01,021,01,0151,0110,0, - /* 13858 */ 0261,01,021,01,0152,0120,0, - /* 13865 */ 0260,01,021,01,0152,0110,0, - /* 13872 */ 0261,01,021,01,0155,0120,0, - /* 13879 */ 0260,01,021,01,0155,0110,0, - /* 13886 */ 0261,01,021,01,0140,0120,0, - /* 13893 */ 0260,01,021,01,0140,0110,0, - /* 13900 */ 0261,01,021,01,0141,0120,0, - /* 13907 */ 0260,01,021,01,0141,0110,0, - /* 13914 */ 0261,01,021,01,0142,0120,0, - /* 13921 */ 0260,01,021,01,0142,0110,0, - /* 13928 */ 0261,01,021,01,0154,0120,0, - /* 13935 */ 0260,01,021,01,0154,0110,0, - /* 13942 */ 0261,01,021,01,0357,0120,0, - /* 13949 */ 0260,01,021,01,0357,0110,0, - /* 13956 */ 0270,01,020,01,0123,0110,0, - /* 13963 */ 0270,01,024,01,0123,0110,0, - /* 13970 */ 0261,01,022,01,0123,0120,0, - /* 13977 */ 0260,01,022,01,0123,0110,0, - /* 13984 */ 0270,01,020,01,0122,0110,0, - /* 13991 */ 0270,01,024,01,0122,0110,0, - /* 13998 */ 0261,01,022,01,0122,0120,0, - /* 14005 */ 0260,01,022,01,0122,0110,0, - /* 14012 */ 0270,01,021,01,0121,0110,0, - /* 14019 */ 0270,01,025,01,0121,0110,0, - /* 14026 */ 0270,01,020,01,0121,0110,0, - /* 14033 */ 0270,01,024,01,0121,0110,0, - /* 14040 */ 0261,01,023,01,0121,0120,0, - /* 14047 */ 0260,01,023,01,0121,0110,0, - /* 14054 */ 0261,01,022,01,0121,0120,0, - /* 14061 */ 0260,01,022,01,0121,0110,0, - /* 14068 */ 0270,01,020,01,0256,0203,0, - /* 14075 */ 0261,01,021,01,0134,0120,0, - /* 14082 */ 0260,01,021,01,0134,0110,0, - /* 14089 */ 0261,01,025,01,0134,0120,0, - /* 14096 */ 0260,01,025,01,0134,0110,0, - /* 14103 */ 0261,01,020,01,0134,0120,0, - /* 14110 */ 0260,01,020,01,0134,0110,0, - /* 14117 */ 0261,01,024,01,0134,0120,0, - /* 14124 */ 0260,01,024,01,0134,0110,0, - /* 14131 */ 0261,01,023,01,0134,0120,0, - /* 14138 */ 0260,01,023,01,0134,0110,0, - /* 14145 */ 0261,01,022,01,0134,0120,0, - /* 14152 */ 0260,01,022,01,0134,0110,0, - /* 14159 */ 0270,02,021,01,016,0110,0, - /* 14166 */ 0270,02,025,01,016,0110,0, - /* 14173 */ 0270,02,021,01,017,0110,0, - /* 14180 */ 0270,02,025,01,017,0110,0, - /* 14187 */ 0270,01,021,01,056,0110,0, - /* 14194 */ 0270,01,020,01,056,0110,0, - /* 14201 */ 0261,01,021,01,025,0120,0, - /* 14208 */ 0260,01,021,01,025,0110,0, - /* 14215 */ 0261,01,025,01,025,0120,0, - /* 14222 */ 0260,01,025,01,025,0110,0, - /* 14229 */ 0261,01,020,01,025,0120,0, - /* 14236 */ 0260,01,020,01,025,0110,0, - /* 14243 */ 0261,01,024,01,025,0120,0, - /* 14250 */ 0260,01,024,01,025,0110,0, - /* 14257 */ 0261,01,021,01,024,0120,0, - /* 14264 */ 0260,01,021,01,024,0110,0, - /* 14271 */ 0261,01,025,01,024,0120,0, - /* 14278 */ 0260,01,025,01,024,0110,0, - /* 14285 */ 0261,01,020,01,024,0120,0, - /* 14292 */ 0260,01,020,01,024,0110,0, - /* 14299 */ 0261,01,024,01,024,0120,0, - /* 14306 */ 0260,01,024,01,024,0110,0, - /* 14313 */ 0261,01,021,01,0127,0120,0, - /* 14320 */ 0260,01,021,01,0127,0110,0, - /* 14327 */ 0261,01,025,01,0127,0120,0, - /* 14334 */ 0260,01,025,01,0127,0110,0, - /* 14341 */ 0261,01,020,01,0127,0120,0, - /* 14348 */ 0260,01,020,01,0127,0110,0, - /* 14355 */ 0261,01,024,01,0127,0120,0, - /* 14362 */ 0260,01,024,01,0127,0110,0, - /* 14369 */ 0261,02,01,01,0230,0120,0, - /* 14376 */ 0261,02,05,01,0230,0120,0, - /* 14383 */ 0261,02,011,01,0230,0120,0, - /* 14390 */ 0261,02,015,01,0230,0120,0, - /* 14397 */ 0261,02,01,01,0250,0120,0, - /* 14404 */ 0261,02,05,01,0250,0120,0, - /* 14411 */ 0261,02,011,01,0250,0120,0, - /* 14418 */ 0261,02,015,01,0250,0120,0, - /* 14425 */ 0261,02,01,01,0270,0120,0, - /* 14432 */ 0261,02,05,01,0270,0120,0, - /* 14439 */ 0261,02,011,01,0270,0120,0, - /* 14446 */ 0261,02,015,01,0270,0120,0, - /* 14453 */ 0261,02,01,01,0226,0120,0, - /* 14460 */ 0261,02,05,01,0226,0120,0, - /* 14467 */ 0261,02,011,01,0226,0120,0, - /* 14474 */ 0261,02,015,01,0226,0120,0, - /* 14481 */ 0261,02,01,01,0246,0120,0, - /* 14488 */ 0261,02,05,01,0246,0120,0, - /* 14495 */ 0261,02,011,01,0246,0120,0, - /* 14502 */ 0261,02,015,01,0246,0120,0, - /* 14509 */ 0261,02,01,01,0266,0120,0, - /* 14516 */ 0261,02,05,01,0266,0120,0, - /* 14523 */ 0261,02,011,01,0266,0120,0, - /* 14530 */ 0261,02,015,01,0266,0120,0, - /* 14537 */ 0261,02,01,01,0232,0120,0, - /* 14544 */ 0261,02,05,01,0232,0120,0, - /* 14551 */ 0261,02,011,01,0232,0120,0, - /* 14558 */ 0261,02,015,01,0232,0120,0, - /* 14565 */ 0261,02,01,01,0252,0120,0, - /* 14572 */ 0261,02,05,01,0252,0120,0, - /* 14579 */ 0261,02,011,01,0252,0120,0, - /* 14586 */ 0261,02,015,01,0252,0120,0, - /* 14593 */ 0261,02,01,01,0272,0120,0, - /* 14600 */ 0261,02,05,01,0272,0120,0, - /* 14607 */ 0261,02,011,01,0272,0120,0, - /* 14614 */ 0261,02,015,01,0272,0120,0, - /* 14621 */ 0261,02,01,01,0227,0120,0, - /* 14628 */ 0261,02,05,01,0227,0120,0, - /* 14635 */ 0261,02,011,01,0227,0120,0, - /* 14642 */ 0261,02,015,01,0227,0120,0, - /* 14649 */ 0261,02,01,01,0247,0120,0, - /* 14656 */ 0261,02,05,01,0247,0120,0, - /* 14663 */ 0261,02,011,01,0247,0120,0, - /* 14670 */ 0261,02,015,01,0247,0120,0, - /* 14677 */ 0261,02,01,01,0267,0120,0, - /* 14684 */ 0261,02,05,01,0267,0120,0, - /* 14691 */ 0261,02,011,01,0267,0120,0, - /* 14698 */ 0261,02,015,01,0267,0120,0, - /* 14705 */ 0261,02,01,01,0234,0120,0, - /* 14712 */ 0261,02,05,01,0234,0120,0, - /* 14719 */ 0261,02,011,01,0234,0120,0, - /* 14726 */ 0261,02,015,01,0234,0120,0, - /* 14733 */ 0261,02,01,01,0254,0120,0, - /* 14740 */ 0261,02,05,01,0254,0120,0, - /* 14747 */ 0261,02,011,01,0254,0120,0, - /* 14754 */ 0261,02,015,01,0254,0120,0, - /* 14761 */ 0261,02,01,01,0274,0120,0, - /* 14768 */ 0261,02,05,01,0274,0120,0, - /* 14775 */ 0261,02,011,01,0274,0120,0, - /* 14782 */ 0261,02,015,01,0274,0120,0, - /* 14789 */ 0261,02,01,01,0236,0120,0, - /* 14796 */ 0261,02,05,01,0236,0120,0, - /* 14803 */ 0261,02,011,01,0236,0120,0, - /* 14810 */ 0261,02,015,01,0236,0120,0, - /* 14817 */ 0261,02,01,01,0256,0120,0, - /* 14824 */ 0261,02,05,01,0256,0120,0, - /* 14831 */ 0261,02,011,01,0256,0120,0, - /* 14838 */ 0261,02,015,01,0256,0120,0, - /* 14845 */ 0261,02,01,01,0276,0120,0, - /* 14852 */ 0261,02,05,01,0276,0120,0, - /* 14859 */ 0261,02,011,01,0276,0120,0, - /* 14866 */ 0261,02,015,01,0276,0120,0, - /* 14873 */ 0261,02,01,01,0231,0120,0, - /* 14880 */ 0261,02,011,01,0231,0120,0, - /* 14887 */ 0261,02,01,01,0251,0120,0, - /* 14894 */ 0261,02,011,01,0251,0120,0, - /* 14901 */ 0261,02,01,01,0271,0120,0, - /* 14908 */ 0261,02,011,01,0271,0120,0, - /* 14915 */ 0261,02,01,01,0233,0120,0, - /* 14922 */ 0261,02,011,01,0233,0120,0, - /* 14929 */ 0261,02,01,01,0253,0120,0, - /* 14936 */ 0261,02,011,01,0253,0120,0, - /* 14943 */ 0261,02,01,01,0273,0120,0, - /* 14950 */ 0261,02,011,01,0273,0120,0, - /* 14957 */ 0261,02,01,01,0235,0120,0, - /* 14964 */ 0261,02,011,01,0235,0120,0, - /* 14971 */ 0261,02,01,01,0255,0120,0, - /* 14978 */ 0261,02,011,01,0255,0120,0, - /* 14985 */ 0261,02,01,01,0275,0120,0, - /* 14992 */ 0261,02,011,01,0275,0120,0, - /* 14999 */ 0261,02,01,01,0237,0120,0, - /* 15006 */ 0261,02,011,01,0237,0120,0, - /* 15013 */ 0261,02,01,01,0257,0120,0, - /* 15020 */ 0261,02,011,01,0257,0120,0, - /* 15027 */ 0261,02,01,01,0277,0120,0, - /* 15034 */ 0261,02,011,01,0277,0120,0, - /* 15041 */ 0270,0111,0,01,0201,0110,0, - /* 15048 */ 0270,0111,0,01,0201,0100,0, - /* 15055 */ 0270,0111,04,01,0201,0110,0, - /* 15062 */ 0270,0111,04,01,0201,0100,0, - /* 15069 */ 0270,0111,0,01,0200,0110,0, - /* 15076 */ 0270,0111,0,01,0200,0100,0, - /* 15083 */ 0270,0111,04,01,0200,0110,0, - /* 15090 */ 0270,0111,04,01,0200,0100,0, - /* 15097 */ 0270,0111,0,01,0203,0110,0, - /* 15104 */ 0270,0111,0,01,0203,0100,0, - /* 15111 */ 0270,0111,0,01,0202,0110,0, - /* 15118 */ 0270,0111,0,01,0202,0100,0, - /* 15125 */ 0270,0111,0,01,0302,0110,0, - /* 15132 */ 0270,0111,0,01,0302,0100,0, - /* 15139 */ 0270,0111,0,01,0303,0110,0, - /* 15146 */ 0270,0111,0,01,0303,0100,0, - /* 15153 */ 0270,0111,0,01,0301,0110,0, - /* 15160 */ 0270,0111,0,01,0301,0100,0, - /* 15167 */ 0270,0111,0,01,0313,0110,0, - /* 15174 */ 0270,0111,0,01,0313,0100,0, - /* 15181 */ 0270,0111,0,01,0322,0110,0, - /* 15188 */ 0270,0111,0,01,0322,0100,0, - /* 15195 */ 0270,0111,0,01,0323,0110,0, - /* 15202 */ 0270,0111,0,01,0323,0100,0, - /* 15209 */ 0270,0111,0,01,0321,0110,0, - /* 15216 */ 0270,0111,0,01,0321,0100,0, - /* 15223 */ 0270,0111,0,01,0333,0110,0, - /* 15230 */ 0270,0111,0,01,0333,0100,0, - /* 15237 */ 0270,0111,0,01,0326,0110,0, - /* 15244 */ 0270,0111,0,01,0326,0100,0, - /* 15251 */ 0270,0111,0,01,0327,0110,0, - /* 15258 */ 0270,0111,0,01,0327,0100,0, - /* 15265 */ 0270,0111,0,01,0306,0110,0, - /* 15272 */ 0270,0111,0,01,0306,0100,0, - /* 15279 */ 0270,0111,0,01,0341,0110,0, - /* 15286 */ 0270,0111,0,01,0341,0100,0, - /* 15293 */ 0270,0111,0,01,0343,0110,0, - /* 15300 */ 0270,0111,0,01,0343,0100,0, - /* 15307 */ 0270,0111,0,01,0342,0110,0, - /* 15314 */ 0270,0111,0,01,0342,0100,0, - /* 15321 */ 0262,0111,0,01,0220,0110,0, - /* 15328 */ 0261,0111,0,01,0220,0100,0, - /* 15335 */ 0261,0111,010,01,0220,0120,0, - /* 15342 */ 0260,0111,010,01,0220,0110,0, - /* 15349 */ 0262,0111,0,01,0222,0110,0, - /* 15356 */ 0261,0111,0,01,0222,0100,0, - /* 15363 */ 0261,0111,010,01,0222,0120,0, - /* 15370 */ 0260,0111,010,01,0222,0110,0, - /* 15377 */ 0262,0111,0,01,0223,0110,0, - /* 15384 */ 0261,0111,0,01,0223,0100,0, - /* 15391 */ 0261,0111,010,01,0223,0120,0, - /* 15398 */ 0260,0111,010,01,0223,0110,0, - /* 15405 */ 0262,0111,0,01,0221,0110,0, - /* 15412 */ 0261,0111,0,01,0221,0100,0, - /* 15419 */ 0261,0111,010,01,0221,0120,0, - /* 15426 */ 0260,0111,010,01,0221,0110,0, - /* 15433 */ 0262,0111,0,01,0230,0110,0, - /* 15440 */ 0261,0111,0,01,0230,0100,0, - /* 15447 */ 0261,0111,010,01,0230,0120,0, - /* 15454 */ 0260,0111,010,01,0230,0110,0, - /* 15461 */ 0262,0111,0,01,0232,0110,0, - /* 15468 */ 0261,0111,0,01,0232,0100,0, - /* 15475 */ 0261,0111,010,01,0232,0120,0, - /* 15482 */ 0260,0111,010,01,0232,0110,0, - /* 15489 */ 0262,0111,0,01,0233,0110,0, - /* 15496 */ 0261,0111,0,01,0233,0100,0, - /* 15503 */ 0261,0111,010,01,0233,0120,0, - /* 15510 */ 0260,0111,010,01,0233,0110,0, - /* 15517 */ 0262,0111,0,01,0231,0110,0, - /* 15524 */ 0261,0111,0,01,0231,0100,0, - /* 15531 */ 0261,0111,010,01,0231,0120,0, - /* 15538 */ 0260,0111,010,01,0231,0110,0, - /* 15545 */ 0262,0111,0,01,0224,0110,0, - /* 15552 */ 0261,0111,0,01,0224,0100,0, - /* 15559 */ 0261,0111,010,01,0224,0120,0, - /* 15566 */ 0260,0111,010,01,0224,0110,0, - /* 15573 */ 0262,0111,0,01,0226,0110,0, - /* 15580 */ 0261,0111,0,01,0226,0100,0, - /* 15587 */ 0261,0111,010,01,0226,0120,0, - /* 15594 */ 0260,0111,010,01,0226,0110,0, - /* 15601 */ 0262,0111,0,01,0227,0110,0, - /* 15608 */ 0261,0111,0,01,0227,0100,0, - /* 15615 */ 0261,0111,010,01,0227,0120,0, - /* 15622 */ 0260,0111,010,01,0227,0110,0, - /* 15629 */ 0262,0111,0,01,0225,0110,0, - /* 15636 */ 0261,0111,0,01,0225,0100,0, - /* 15643 */ 0261,0111,010,01,0225,0120,0, - /* 15650 */ 0260,0111,010,01,0225,0110,0, - /* 15657 */ 0320,01,0203,0202,0275,0, - /* 15663 */ 0321,01,0203,0202,0275,0, - /* 15669 */ 0324,01,0203,0202,0275,0, - /* 15675 */ 0320,0145,0201,0202,0141,0, - /* 15681 */ 0321,0155,0201,0202,0151,0, - /* 15687 */ 0324,0155,0201,0202,0251,0, - /* 15693 */ 0320,01,0203,0200,0275,0, - /* 15699 */ 0321,01,0203,0200,0275,0, - /* 15705 */ 0324,01,0203,0200,0275,0, - /* 15711 */ 0320,0145,0201,0200,0141,0, - /* 15717 */ 0321,0155,0201,0200,0151,0, - /* 15723 */ 0324,0155,0201,0200,0251,0, - /* 15729 */ 0320,01,0203,0204,0275,0, - /* 15735 */ 0321,01,0203,0204,0275,0, - /* 15741 */ 0324,01,0203,0204,0275,0, - /* 15747 */ 0320,0145,0201,0204,0141,0, - /* 15753 */ 0321,0155,0201,0204,0151,0, - /* 15759 */ 0324,0155,0201,0204,0251,0, - /* 15765 */ 0320,02,017,0274,0110,0, - /* 15771 */ 0321,02,017,0274,0110,0, - /* 15777 */ 0324,02,017,0274,0110,0, - /* 15783 */ 0320,02,017,0275,0110,0, - /* 15789 */ 0321,02,017,0275,0110,0, - /* 15795 */ 0324,02,017,0275,0110,0, - /* 15801 */ 0321,01,017,010,0310,0, - /* 15807 */ 0324,01,017,010,0310,0, - /* 15813 */ 0320,02,017,0243,0101,0, - /* 15819 */ 0321,02,017,0243,0101,0, - /* 15825 */ 0324,02,017,0243,0101,0, - /* 15831 */ 0320,02,017,0273,0101,0, - /* 15837 */ 0321,02,017,0273,0101,0, - /* 15843 */ 0324,02,017,0273,0101,0, - /* 15849 */ 0320,02,017,0263,0101,0, - /* 15855 */ 0321,02,017,0263,0101,0, - /* 15861 */ 0324,02,017,0263,0101,0, - /* 15867 */ 0320,02,017,0253,0101,0, - /* 15873 */ 0321,02,017,0253,0101,0, - /* 15879 */ 0324,02,017,0253,0101,0, - /* 15885 */ 0322,01,0232,034,074,0, - /* 15891 */ 0320,01,0232,034,074,0, - /* 15897 */ 0321,01,0232,034,074,0, - /* 15903 */ 0322,01,0232,035,030,0, - /* 15909 */ 0320,01,0232,031,030,0, - /* 15915 */ 0321,01,0232,041,030,0, - /* 15921 */ 0320,01,0203,0207,0275,0, - /* 15927 */ 0321,01,0203,0207,0275,0, - /* 15933 */ 0324,01,0203,0207,0275,0, - /* 15939 */ 0320,0145,0201,0207,0141,0, - /* 15945 */ 0321,0155,0201,0207,0151,0, - /* 15951 */ 0324,0155,0201,0207,0251,0, - /* 15957 */ 0320,02,017,0261,0101,0, - /* 15963 */ 0321,02,017,0261,0101,0, - /* 15969 */ 0324,02,017,0261,0101,0, - /* 15975 */ 0320,02,017,0247,0101,0, - /* 15981 */ 0321,02,017,0247,0101,0, - /* 15987 */ 0324,02,017,0307,0201,0, - /* 15993 */ 0320,02,017,0257,0110,0, - /* 15999 */ 0321,02,017,0257,0110,0, - /* 16005 */ 0324,02,017,0257,0110,0, - /* 16011 */ 0320,01,0153,0110,016,0, - /* 16017 */ 0320,01,0151,0110,032,0, - /* 16023 */ 0320,0146,0151,0110,0142,0, - /* 16029 */ 0321,01,0153,0110,016,0, - /* 16035 */ 0321,01,0151,0110,042,0, - /* 16041 */ 0321,0156,0151,0110,0152,0, - /* 16047 */ 0324,01,0153,0110,016,0, - /* 16053 */ 0324,01,0151,0110,042,0, - /* 16059 */ 0324,0156,0151,0110,0252,0, - /* 16065 */ 0320,01,0153,0100,015,0, - /* 16071 */ 0320,01,0151,0100,031,0, - /* 16077 */ 0320,0145,0151,0100,0141,0, - /* 16083 */ 0321,01,0153,0100,015,0, - /* 16089 */ 0321,01,0151,0100,041,0, - /* 16095 */ 0321,0155,0151,0100,0151,0, - /* 16101 */ 0324,01,0153,0100,015,0, - /* 16107 */ 0324,01,0151,0100,0255,0, - /* 16113 */ 0324,0155,0151,0100,0251,0, - /* 16119 */ 0310,03,017,01,0337,0, - /* 16125 */ 0311,03,017,01,0337,0, - /* 16131 */ 0322,01,0352,034,074,0, - /* 16137 */ 0320,01,0352,034,074,0, - /* 16143 */ 0321,01,0352,034,074,0, - /* 16149 */ 0322,01,0352,035,030,0, - /* 16155 */ 0320,01,0352,031,030,0, - /* 16161 */ 0321,01,0352,041,030,0, - /* 16167 */ 0322,02,017,0270,064,0, - /* 16173 */ 0320,02,017,0270,064,0, - /* 16179 */ 0321,02,017,0270,064,0, - /* 16185 */ 0320,02,017,0,0206,0, - /* 16191 */ 0321,02,017,0,0206,0, - /* 16197 */ 0320,02,017,02,0110,0, - /* 16203 */ 0321,02,017,02,0110,0, - /* 16209 */ 0324,02,017,02,0110,0, - /* 16215 */ 0320,02,017,0264,0110,0, - /* 16221 */ 0321,02,017,0264,0110,0, - /* 16227 */ 0320,02,017,0265,0110,0, - /* 16233 */ 0321,02,017,0265,0110,0, - /* 16239 */ 0320,02,017,03,0110,0, - /* 16245 */ 0321,02,017,03,0110,0, - /* 16251 */ 0324,02,017,03,0110,0, - /* 16257 */ 0320,02,017,0262,0110,0, - /* 16263 */ 0321,02,017,0262,0110,0, - /* 16269 */ 0334,02,017,040,0101,0, - /* 16275 */ 0323,02,017,040,0101,0, - /* 16281 */ 0334,02,017,042,0110,0, - /* 16287 */ 0323,02,017,042,0110,0, - /* 16293 */ 0323,02,017,041,0101,0, - /* 16299 */ 0323,02,017,043,0110,0, - /* 16305 */ 0324,01,0307,0200,0255,0, - /* 16311 */ 0320,01,0307,0200,031,0, - /* 16317 */ 0321,01,0307,0200,041,0, - /* 16323 */ 0360,02,017,0156,0110,0, - /* 16329 */ 0360,02,017,0176,0101,0, - /* 16335 */ 0320,02,017,0276,0110,0, - /* 16341 */ 0321,02,017,0276,0110,0, - /* 16347 */ 0321,02,017,0277,0110,0, - /* 16353 */ 0324,02,017,0276,0110,0, - /* 16359 */ 0324,02,017,0277,0110,0, - /* 16365 */ 0320,02,017,0266,0110,0, - /* 16371 */ 0321,02,017,0266,0110,0, - /* 16377 */ 0321,02,017,0267,0110,0, - /* 16383 */ 0324,02,017,0266,0110,0, - /* 16389 */ 0324,02,017,0267,0110,0, - /* 16395 */ 0320,02,017,037,0200,0, - /* 16401 */ 0321,02,017,037,0200,0, - /* 16407 */ 0324,02,017,037,0200,0, - /* 16413 */ 0320,01,0203,0201,0275,0, - /* 16419 */ 0321,01,0203,0201,0275,0, - /* 16425 */ 0324,01,0203,0201,0275,0, - /* 16431 */ 0320,0145,0201,0201,0141,0, - /* 16437 */ 0321,0155,0201,0201,0151,0, - /* 16443 */ 0324,0155,0201,0201,0251,0, - /* 16449 */ 0323,02,017,0121,0110,0, - /* 16455 */ 0323,02,017,0120,0110,0, - /* 16461 */ 0323,02,017,0122,0110,0, - /* 16467 */ 0323,02,017,0135,0110,0, - /* 16473 */ 0323,02,017,0131,0110,0, - /* 16479 */ 0323,02,017,0125,0110,0, - /* 16485 */ 0320,01,0301,0202,025,0, - /* 16491 */ 0321,01,0301,0202,025,0, - /* 16497 */ 0324,01,0301,0202,025,0, - /* 16503 */ 0320,01,0301,0203,025,0, - /* 16509 */ 0321,01,0301,0203,025,0, - /* 16515 */ 0324,01,0301,0203,025,0, - /* 16521 */ 0321,02,017,066,0200,0, - /* 16527 */ 0320,01,0301,0200,025,0, - /* 16533 */ 0321,01,0301,0200,025,0, - /* 16539 */ 0324,01,0301,0200,025,0, - /* 16545 */ 0320,01,0301,0201,025,0, - /* 16551 */ 0321,01,0301,0201,025,0, - /* 16557 */ 0324,01,0301,0201,025,0, - /* 16563 */ 0320,01,0301,0204,025,0, - /* 16569 */ 0321,01,0301,0204,025,0, - /* 16575 */ 0324,01,0301,0204,025,0, - /* 16581 */ 0320,01,0301,0207,025,0, - /* 16587 */ 0321,01,0301,0207,025,0, - /* 16593 */ 0324,01,0301,0207,025,0, - /* 16599 */ 0320,01,0203,0203,0275,0, - /* 16605 */ 0321,01,0203,0203,0275,0, - /* 16611 */ 0324,01,0203,0203,0275,0, - /* 16617 */ 0320,0145,0201,0203,0141,0, - /* 16623 */ 0321,0155,0201,0203,0151,0, - /* 16629 */ 0324,0155,0201,0203,0251,0, - /* 16635 */ 0320,02,017,0245,0101,0, - /* 16641 */ 0321,02,017,0245,0101,0, - /* 16647 */ 0324,02,017,0245,0101,0, - /* 16653 */ 0320,01,0301,0205,025,0, - /* 16659 */ 0321,01,0301,0205,025,0, - /* 16665 */ 0324,01,0301,0205,025,0, - /* 16671 */ 0320,02,017,0255,0101,0, - /* 16677 */ 0321,02,017,0255,0101,0, - /* 16683 */ 0324,02,017,0255,0101,0, - /* 16689 */ 0320,02,017,0,0200,0, - /* 16695 */ 0321,02,017,0,0200,0, - /* 16701 */ 0323,02,017,0,0200,0, - /* 16707 */ 0324,02,017,0,0200,0, - /* 16713 */ 0320,02,017,01,0204,0, - /* 16719 */ 0321,02,017,01,0204,0, - /* 16725 */ 0320,02,017,0,0201,0, - /* 16731 */ 0321,02,017,0,0201,0, - /* 16737 */ 0324,02,017,0,0201,0, - /* 16743 */ 0320,01,0203,0205,0275,0, - /* 16749 */ 0321,01,0203,0205,0275,0, - /* 16755 */ 0324,01,0203,0205,0275,0, - /* 16761 */ 0320,0145,0201,0205,0141,0, - /* 16767 */ 0321,0155,0201,0205,0151,0, - /* 16773 */ 0324,0155,0201,0205,0251,0, - /* 16779 */ 0320,01,0367,0200,031,0, - /* 16785 */ 0321,01,0367,0200,041,0, - /* 16791 */ 0324,01,0367,0200,0255,0, - /* 16797 */ 0360,02,017,020,0101,0, - /* 16803 */ 0360,02,017,022,0110,0, - /* 16809 */ 0321,02,017,067,0200,0, - /* 16815 */ 0320,02,017,0301,0101,0, - /* 16821 */ 0321,02,017,0301,0101,0, - /* 16827 */ 0324,02,017,0301,0101,0, - /* 16833 */ 0320,02,017,0246,0110,0, - /* 16839 */ 0321,02,017,0246,0110,0, - /* 16845 */ 0320,01,0203,0206,0275,0, - /* 16851 */ 0321,01,0203,0206,0275,0, - /* 16857 */ 0324,01,0203,0206,0275,0, - /* 16863 */ 0320,0145,0201,0206,0141,0, - /* 16869 */ 0321,0155,0201,0206,0151,0, - /* 16875 */ 0324,0155,0201,0206,0251,0, - /* 16881 */ 01,017,0330,0220,0200,0, - /* 16887 */ 0360,02,017,0130,0110,0, - /* 16893 */ 0363,02,017,0130,0110,0, - /* 16899 */ 0360,02,017,0125,0110,0, - /* 16905 */ 0360,02,017,0124,0110,0, - /* 16911 */ 0360,02,017,057,0110,0, - /* 16917 */ 0360,02,017,052,0110,0, - /* 16923 */ 0360,02,017,055,0110,0, - /* 16929 */ 0360,02,017,054,0110,0, - /* 16935 */ 0360,02,017,0136,0110,0, - /* 16941 */ 0363,02,017,0136,0110,0, - /* 16947 */ 0360,02,017,0137,0110,0, - /* 16953 */ 0363,02,017,0137,0110,0, - /* 16959 */ 0360,02,017,0135,0110,0, - /* 16965 */ 0363,02,017,0135,0110,0, - /* 16971 */ 0360,02,017,050,0110,0, - /* 16977 */ 0360,02,017,051,0101,0, - /* 16983 */ 0360,02,017,026,0110,0, - /* 16989 */ 0360,02,017,027,0101,0, - /* 16995 */ 0360,02,017,023,0101,0, - /* 17001 */ 0360,02,017,0120,0110,0, - /* 17007 */ 0360,02,017,053,0101,0, - /* 17013 */ 0363,02,017,020,0110,0, - /* 17019 */ 0363,02,017,021,0101,0, - /* 17025 */ 0360,02,017,020,0110,0, - /* 17031 */ 0360,02,017,021,0101,0, - /* 17037 */ 0360,02,017,0131,0110,0, - /* 17043 */ 0363,02,017,0131,0110,0, - /* 17049 */ 0360,02,017,0126,0110,0, - /* 17055 */ 0360,02,017,0123,0110,0, - /* 17061 */ 0363,02,017,0123,0110,0, - /* 17067 */ 0360,02,017,0122,0110,0, - /* 17073 */ 0363,02,017,0122,0110,0, - /* 17079 */ 0360,02,017,0121,0110,0, - /* 17085 */ 0363,02,017,0121,0110,0, - /* 17091 */ 0360,02,017,0134,0110,0, - /* 17097 */ 0363,02,017,0134,0110,0, - /* 17103 */ 0360,02,017,056,0110,0, - /* 17109 */ 0360,02,017,025,0110,0, - /* 17115 */ 0360,02,017,024,0110,0, - /* 17121 */ 0360,02,017,0127,0110,0, - /* 17127 */ 0360,03,017,01,0320,0, - /* 17133 */ 0360,03,017,01,0321,0, - /* 17139 */ 0360,02,017,0256,0204,0, - /* 17145 */ 0360,02,017,0256,0205,0, - /* 17151 */ 0360,02,017,0367,0110,0, - /* 17157 */ 0360,02,017,0347,0101,0, - /* 17163 */ 0360,02,017,0327,0110,0, - /* 17169 */ 0361,02,017,0367,0110,0, - /* 17175 */ 0361,02,017,0347,0101,0, - /* 17181 */ 0361,02,017,053,0101,0, - /* 17187 */ 0361,02,017,0156,0110,0, - /* 17193 */ 0361,02,017,0176,0101,0, - /* 17199 */ 0361,02,017,0157,0110,0, - /* 17205 */ 0361,02,017,0177,0101,0, - /* 17211 */ 0363,02,017,0157,0110,0, - /* 17217 */ 0363,02,017,0177,0101,0, - /* 17223 */ 0362,02,017,0326,0110,0, - /* 17229 */ 0363,02,017,0176,0110,0, - /* 17235 */ 0361,02,017,0326,0101,0, - /* 17241 */ 0363,02,017,0326,0110,0, - /* 17247 */ 0361,02,017,0143,0110,0, - /* 17253 */ 0361,02,017,0153,0110,0, - /* 17259 */ 0361,02,017,0147,0110,0, - /* 17265 */ 0361,02,017,0374,0110,0, - /* 17271 */ 0361,02,017,0375,0110,0, - /* 17277 */ 0361,02,017,0376,0110,0, - /* 17283 */ 0360,02,017,0324,0110,0, - /* 17289 */ 0361,02,017,0324,0110,0, - /* 17295 */ 0361,02,017,0354,0110,0, - /* 17301 */ 0361,02,017,0355,0110,0, - /* 17307 */ 0361,02,017,0334,0110,0, - /* 17313 */ 0361,02,017,0335,0110,0, - /* 17319 */ 0361,02,017,0333,0110,0, - /* 17325 */ 0361,02,017,0337,0110,0, - /* 17331 */ 0361,02,017,0340,0110,0, - /* 17337 */ 0361,02,017,0343,0110,0, - /* 17343 */ 0361,02,017,0164,0110,0, - /* 17349 */ 0361,02,017,0165,0110,0, - /* 17355 */ 0361,02,017,0166,0110,0, - /* 17361 */ 0361,02,017,0144,0110,0, - /* 17367 */ 0361,02,017,0145,0110,0, - /* 17373 */ 0361,02,017,0146,0110,0, - /* 17379 */ 0361,02,017,0365,0110,0, - /* 17385 */ 0361,02,017,0356,0110,0, - /* 17391 */ 0361,02,017,0336,0110,0, - /* 17397 */ 0361,02,017,0352,0110,0, - /* 17403 */ 0361,02,017,0332,0110,0, - /* 17409 */ 0361,02,017,0327,0110,0, - /* 17415 */ 0361,02,017,0344,0110,0, - /* 17421 */ 0361,02,017,0345,0110,0, - /* 17427 */ 0361,02,017,0325,0110,0, - /* 17433 */ 0361,02,017,0364,0110,0, - /* 17439 */ 0361,02,017,0353,0110,0, - /* 17445 */ 0361,02,017,0366,0110,0, - /* 17451 */ 0361,02,017,0361,0110,0, - /* 17457 */ 0361,02,017,0362,0110,0, - /* 17463 */ 0361,02,017,0363,0110,0, - /* 17469 */ 0361,02,017,0341,0110,0, - /* 17475 */ 0361,02,017,0342,0110,0, - /* 17481 */ 0361,02,017,0321,0110,0, - /* 17487 */ 0361,02,017,0322,0110,0, - /* 17493 */ 0361,02,017,0323,0110,0, - /* 17499 */ 0361,02,017,0370,0110,0, - /* 17505 */ 0361,02,017,0371,0110,0, - /* 17511 */ 0361,02,017,0372,0110,0, - /* 17517 */ 0361,02,017,0373,0110,0, - /* 17523 */ 0361,02,017,0350,0110,0, - /* 17529 */ 0361,02,017,0351,0110,0, - /* 17535 */ 0361,02,017,0330,0110,0, - /* 17541 */ 0361,02,017,0331,0110,0, - /* 17547 */ 0361,02,017,0150,0110,0, - /* 17553 */ 0361,02,017,0151,0110,0, - /* 17559 */ 0361,02,017,0152,0110,0, - /* 17565 */ 0361,02,017,0155,0110,0, - /* 17571 */ 0361,02,017,0140,0110,0, - /* 17577 */ 0361,02,017,0141,0110,0, - /* 17583 */ 0361,02,017,0142,0110,0, - /* 17589 */ 0361,02,017,0154,0110,0, - /* 17595 */ 0361,02,017,0357,0110,0, - /* 17601 */ 0361,02,017,0130,0110,0, - /* 17607 */ 0362,02,017,0130,0110,0, - /* 17613 */ 0361,02,017,0125,0110,0, - /* 17619 */ 0361,02,017,0124,0110,0, - /* 17625 */ 0361,02,017,057,0110,0, - /* 17631 */ 0363,02,017,0346,0110,0, - /* 17637 */ 0360,02,017,0133,0110,0, - /* 17643 */ 0362,02,017,0346,0110,0, - /* 17649 */ 0361,02,017,055,0110,0, - /* 17655 */ 0361,02,017,0132,0110,0, - /* 17661 */ 0361,02,017,052,0110,0, - /* 17667 */ 0361,02,017,0133,0110,0, - /* 17673 */ 0360,02,017,0132,0110,0, - /* 17679 */ 0362,02,017,0132,0110,0, - /* 17685 */ 0363,02,017,0132,0110,0, - /* 17691 */ 0361,02,017,054,0110,0, - /* 17697 */ 0361,02,017,0346,0110,0, - /* 17703 */ 0363,02,017,0133,0110,0, - /* 17709 */ 0361,02,017,0136,0110,0, - /* 17715 */ 0362,02,017,0136,0110,0, - /* 17721 */ 0361,02,017,0137,0110,0, - /* 17727 */ 0362,02,017,0137,0110,0, - /* 17733 */ 0361,02,017,0135,0110,0, - /* 17739 */ 0362,02,017,0135,0110,0, - /* 17745 */ 0361,02,017,050,0110,0, - /* 17751 */ 0361,02,017,051,0101,0, - /* 17757 */ 0361,02,017,027,0101,0, - /* 17763 */ 0361,02,017,026,0110,0, - /* 17769 */ 0361,02,017,023,0101,0, - /* 17775 */ 0361,02,017,022,0110,0, - /* 17781 */ 0361,02,017,0120,0110,0, - /* 17787 */ 0362,02,017,020,0110,0, - /* 17793 */ 0362,02,017,021,0101,0, - /* 17799 */ 0361,02,017,020,0110,0, - /* 17805 */ 0361,02,017,021,0101,0, - /* 17811 */ 0361,02,017,0131,0110,0, - /* 17817 */ 0362,02,017,0131,0110,0, - /* 17823 */ 0361,02,017,0126,0110,0, - /* 17829 */ 0361,02,017,0121,0110,0, - /* 17835 */ 0362,02,017,0121,0110,0, - /* 17841 */ 0361,02,017,0134,0110,0, - /* 17847 */ 0362,02,017,0134,0110,0, - /* 17853 */ 0361,02,017,056,0110,0, - /* 17859 */ 0361,02,017,025,0110,0, - /* 17865 */ 0361,02,017,024,0110,0, - /* 17871 */ 0361,02,017,0127,0110,0, - /* 17877 */ 0361,02,017,0320,0110,0, - /* 17883 */ 0362,02,017,0320,0110,0, - /* 17889 */ 0361,02,017,0174,0110,0, - /* 17895 */ 0362,02,017,0174,0110,0, - /* 17901 */ 0361,02,017,0175,0110,0, - /* 17907 */ 0362,02,017,0175,0110,0, - /* 17913 */ 0362,02,017,0360,0110,0, - /* 17919 */ 0362,02,017,022,0110,0, - /* 17925 */ 0363,02,017,026,0110,0, - /* 17931 */ 0363,02,017,022,0110,0, - /* 17937 */ 0361,02,017,0307,0206,0, - /* 17943 */ 0363,02,017,0307,0206,0, - /* 17949 */ 0361,02,017,0171,0110,0, - /* 17955 */ 0362,02,017,0171,0110,0, - /* 17961 */ 0362,02,017,053,0101,0, - /* 17967 */ 0363,02,017,053,0101,0, - /* 17973 */ 0270,01,024,01,0167,0, - /* 17979 */ 0270,01,020,01,0167,0, - /* 17985 */ 0336,03,017,0247,0310,0, - /* 17991 */ 0336,03,017,0247,0320,0, - /* 17997 */ 0336,03,017,0247,0330,0, - /* 18003 */ 0336,03,017,0247,0340,0, - /* 18009 */ 0336,03,017,0247,0350,0, - /* 18015 */ 0336,03,017,0246,0300,0, - /* 18021 */ 0336,03,017,0246,0310,0, - /* 18027 */ 0336,03,017,0246,0320,0, - /* 18033 */ 0320,02,017,030,0200,0, - /* 18039 */ 0321,02,017,030,0200,0, - /* 18045 */ 0324,02,017,030,0200,0, - /* 18051 */ 0320,02,017,030,0201,0, - /* 18057 */ 0321,02,017,030,0201,0, - /* 18063 */ 0324,02,017,030,0201,0, - /* 18069 */ 0320,02,017,030,0202,0, - /* 18075 */ 0321,02,017,030,0202,0, - /* 18081 */ 0324,02,017,030,0202,0, - /* 18087 */ 0320,02,017,030,0203,0, - /* 18093 */ 0321,02,017,030,0203,0, - /* 18099 */ 0324,02,017,030,0203,0, - /* 18105 */ 0320,02,017,030,0204,0, - /* 18111 */ 0321,02,017,030,0204,0, - /* 18117 */ 0324,02,017,030,0204,0, - /* 18123 */ 0320,02,017,030,0205,0, - /* 18129 */ 0321,02,017,030,0205,0, - /* 18135 */ 0324,02,017,030,0205,0, - /* 18141 */ 0320,02,017,030,0206,0, - /* 18147 */ 0321,02,017,030,0206,0, - /* 18153 */ 0324,02,017,030,0206,0, - /* 18159 */ 0320,02,017,030,0207,0, - /* 18165 */ 0321,02,017,030,0207,0, - /* 18171 */ 0324,02,017,030,0207,0, - /* 18177 */ 0320,02,017,031,0200,0, - /* 18183 */ 0321,02,017,031,0200,0, - /* 18189 */ 0324,02,017,031,0200,0, - /* 18195 */ 0320,02,017,031,0201,0, - /* 18201 */ 0321,02,017,031,0201,0, - /* 18207 */ 0324,02,017,031,0201,0, - /* 18213 */ 0320,02,017,031,0202,0, - /* 18219 */ 0321,02,017,031,0202,0, - /* 18225 */ 0324,02,017,031,0202,0, - /* 18231 */ 0320,02,017,031,0203,0, - /* 18237 */ 0321,02,017,031,0203,0, - /* 18243 */ 0324,02,017,031,0203,0, - /* 18249 */ 0320,02,017,031,0204,0, - /* 18255 */ 0321,02,017,031,0204,0, - /* 18261 */ 0324,02,017,031,0204,0, - /* 18267 */ 0320,02,017,031,0205,0, - /* 18273 */ 0321,02,017,031,0205,0, - /* 18279 */ 0324,02,017,031,0205,0, - /* 18285 */ 0320,02,017,031,0206,0, - /* 18291 */ 0321,02,017,031,0206,0, - /* 18297 */ 0324,02,017,031,0206,0, - /* 18303 */ 0320,02,017,031,0207,0, - /* 18309 */ 0321,02,017,031,0207,0, - /* 18315 */ 0324,02,017,031,0207,0, - /* 18321 */ 0320,02,017,032,0200,0, - /* 18327 */ 0321,02,017,032,0200,0, - /* 18333 */ 0324,02,017,032,0200,0, - /* 18339 */ 0320,02,017,032,0201,0, - /* 18345 */ 0321,02,017,032,0201,0, - /* 18351 */ 0324,02,017,032,0201,0, - /* 18357 */ 0320,02,017,032,0202,0, - /* 18363 */ 0321,02,017,032,0202,0, - /* 18369 */ 0324,02,017,032,0202,0, - /* 18375 */ 0320,02,017,032,0203,0, - /* 18381 */ 0321,02,017,032,0203,0, - /* 18387 */ 0324,02,017,032,0203,0, - /* 18393 */ 0320,02,017,032,0204,0, - /* 18399 */ 0321,02,017,032,0204,0, - /* 18405 */ 0324,02,017,032,0204,0, - /* 18411 */ 0320,02,017,032,0205,0, - /* 18417 */ 0321,02,017,032,0205,0, - /* 18423 */ 0324,02,017,032,0205,0, - /* 18429 */ 0320,02,017,032,0206,0, - /* 18435 */ 0321,02,017,032,0206,0, - /* 18441 */ 0324,02,017,032,0206,0, - /* 18447 */ 0320,02,017,032,0207,0, - /* 18453 */ 0321,02,017,032,0207,0, - /* 18459 */ 0324,02,017,032,0207,0, - /* 18465 */ 0320,02,017,033,0200,0, - /* 18471 */ 0321,02,017,033,0200,0, - /* 18477 */ 0324,02,017,033,0200,0, - /* 18483 */ 0320,02,017,033,0201,0, - /* 18489 */ 0321,02,017,033,0201,0, - /* 18495 */ 0324,02,017,033,0201,0, - /* 18501 */ 0320,02,017,033,0202,0, - /* 18507 */ 0321,02,017,033,0202,0, - /* 18513 */ 0324,02,017,033,0202,0, - /* 18519 */ 0320,02,017,033,0203,0, - /* 18525 */ 0321,02,017,033,0203,0, - /* 18531 */ 0324,02,017,033,0203,0, - /* 18537 */ 0320,02,017,033,0204,0, - /* 18543 */ 0321,02,017,033,0204,0, - /* 18549 */ 0324,02,017,033,0204,0, - /* 18555 */ 0320,02,017,033,0205,0, - /* 18561 */ 0321,02,017,033,0205,0, - /* 18567 */ 0324,02,017,033,0205,0, - /* 18573 */ 0320,02,017,033,0206,0, - /* 18579 */ 0321,02,017,033,0206,0, - /* 18585 */ 0324,02,017,033,0206,0, - /* 18591 */ 0320,02,017,033,0207,0, - /* 18597 */ 0321,02,017,033,0207,0, - /* 18603 */ 0324,02,017,033,0207,0, - /* 18609 */ 0320,02,017,034,0200,0, - /* 18615 */ 0321,02,017,034,0200,0, - /* 18621 */ 0324,02,017,034,0200,0, - /* 18627 */ 0320,02,017,034,0201,0, - /* 18633 */ 0321,02,017,034,0201,0, - /* 18639 */ 0324,02,017,034,0201,0, - /* 18645 */ 0320,02,017,034,0202,0, - /* 18651 */ 0321,02,017,034,0202,0, - /* 18657 */ 0324,02,017,034,0202,0, - /* 18663 */ 0320,02,017,034,0203,0, - /* 18669 */ 0321,02,017,034,0203,0, - /* 18675 */ 0324,02,017,034,0203,0, - /* 18681 */ 0320,02,017,034,0204,0, - /* 18687 */ 0321,02,017,034,0204,0, - /* 18693 */ 0324,02,017,034,0204,0, - /* 18699 */ 0320,02,017,034,0205,0, - /* 18705 */ 0321,02,017,034,0205,0, - /* 18711 */ 0324,02,017,034,0205,0, - /* 18717 */ 0320,02,017,034,0206,0, - /* 18723 */ 0321,02,017,034,0206,0, - /* 18729 */ 0324,02,017,034,0206,0, - /* 18735 */ 0320,02,017,034,0207,0, - /* 18741 */ 0321,02,017,034,0207,0, - /* 18747 */ 0324,02,017,034,0207,0, - /* 18753 */ 0320,02,017,035,0200,0, - /* 18759 */ 0321,02,017,035,0200,0, - /* 18765 */ 0324,02,017,035,0200,0, - /* 18771 */ 0320,02,017,035,0201,0, - /* 18777 */ 0321,02,017,035,0201,0, - /* 18783 */ 0324,02,017,035,0201,0, - /* 18789 */ 0320,02,017,035,0202,0, - /* 18795 */ 0321,02,017,035,0202,0, - /* 18801 */ 0324,02,017,035,0202,0, - /* 18807 */ 0320,02,017,035,0203,0, - /* 18813 */ 0321,02,017,035,0203,0, - /* 18819 */ 0324,02,017,035,0203,0, - /* 18825 */ 0320,02,017,035,0204,0, - /* 18831 */ 0321,02,017,035,0204,0, - /* 18837 */ 0324,02,017,035,0204,0, - /* 18843 */ 0320,02,017,035,0205,0, - /* 18849 */ 0321,02,017,035,0205,0, - /* 18855 */ 0324,02,017,035,0205,0, - /* 18861 */ 0320,02,017,035,0206,0, - /* 18867 */ 0321,02,017,035,0206,0, - /* 18873 */ 0324,02,017,035,0206,0, - /* 18879 */ 0320,02,017,035,0207,0, - /* 18885 */ 0321,02,017,035,0207,0, - /* 18891 */ 0324,02,017,035,0207,0, - /* 18897 */ 0320,02,017,036,0200,0, - /* 18903 */ 0321,02,017,036,0200,0, - /* 18909 */ 0324,02,017,036,0200,0, - /* 18915 */ 0320,02,017,036,0201,0, - /* 18921 */ 0321,02,017,036,0201,0, - /* 18927 */ 0324,02,017,036,0201,0, - /* 18933 */ 0320,02,017,036,0202,0, - /* 18939 */ 0321,02,017,036,0202,0, - /* 18945 */ 0324,02,017,036,0202,0, - /* 18951 */ 0320,02,017,036,0203,0, - /* 18957 */ 0321,02,017,036,0203,0, - /* 18963 */ 0324,02,017,036,0203,0, - /* 18969 */ 0320,02,017,036,0204,0, - /* 18975 */ 0321,02,017,036,0204,0, - /* 18981 */ 0324,02,017,036,0204,0, - /* 18987 */ 0320,02,017,036,0205,0, - /* 18993 */ 0321,02,017,036,0205,0, - /* 18999 */ 0324,02,017,036,0205,0, - /* 19005 */ 0320,02,017,036,0206,0, - /* 19011 */ 0321,02,017,036,0206,0, - /* 19017 */ 0324,02,017,036,0206,0, - /* 19023 */ 0320,02,017,036,0207,0, - /* 19029 */ 0321,02,017,036,0207,0, - /* 19035 */ 0324,02,017,036,0207,0, - /* 19041 */ 0320,02,017,037,0201,0, - /* 19047 */ 0321,02,017,037,0201,0, - /* 19053 */ 0324,02,017,037,0201,0, - /* 19059 */ 0320,02,017,037,0202,0, - /* 19065 */ 0321,02,017,037,0202,0, - /* 19071 */ 0324,02,017,037,0202,0, - /* 19077 */ 0320,02,017,037,0203,0, - /* 19083 */ 0321,02,017,037,0203,0, - /* 19089 */ 0324,02,017,037,0203,0, - /* 19095 */ 0320,02,017,037,0204,0, - /* 19101 */ 0321,02,017,037,0204,0, - /* 19107 */ 0324,02,017,037,0204,0, - /* 19113 */ 0320,02,017,037,0205,0, - /* 19119 */ 0321,02,017,037,0205,0, - /* 19125 */ 0324,02,017,037,0205,0, - /* 19131 */ 0320,02,017,037,0206,0, - /* 19137 */ 0321,02,017,037,0206,0, - /* 19143 */ 0324,02,017,037,0206,0, - /* 19149 */ 0320,02,017,037,0207,0, - /* 19155 */ 0321,02,017,037,0207,0, - /* 19161 */ 0324,02,017,037,0207,0, - /* 19167 */ 0320,01,021,0101,0, - /* 19172 */ 0321,01,021,0101,0, - /* 19177 */ 0324,01,021,0101,0, - /* 19182 */ 0320,01,023,0110,0, - /* 19187 */ 0321,01,023,0110,0, - /* 19192 */ 0324,01,023,0110,0, - /* 19197 */ 0320,01,025,031,0, - /* 19202 */ 0321,01,025,041,0, - /* 19207 */ 0324,01,025,0255,0, - /* 19212 */ 01,0200,0202,021,0, - /* 19217 */ 0320,01,01,0101,0, - /* 19222 */ 0321,01,01,0101,0, - /* 19227 */ 0324,01,01,0101,0, - /* 19232 */ 0320,01,03,0110,0, - /* 19237 */ 0321,01,03,0110,0, - /* 19242 */ 0324,01,03,0110,0, - /* 19247 */ 0320,01,05,031,0, - /* 19252 */ 0321,01,05,041,0, - /* 19257 */ 0324,01,05,0255,0, - /* 19262 */ 01,0200,0200,021,0, - /* 19267 */ 0320,01,041,0101,0, - /* 19272 */ 0321,01,041,0101,0, - /* 19277 */ 0324,01,041,0101,0, - /* 19282 */ 0320,01,043,0110,0, - /* 19287 */ 0321,01,043,0110,0, - /* 19292 */ 0324,01,043,0110,0, - /* 19297 */ 0320,01,045,031,0, - /* 19302 */ 0321,01,045,041,0, - /* 19307 */ 0324,01,045,0255,0, - /* 19312 */ 01,0200,0204,021,0, - /* 19317 */ 0320,01,0142,0110,0, - /* 19322 */ 0321,01,0142,0110,0, - /* 19327 */ 0322,01,0350,064,0, - /* 19332 */ 0320,01,0350,064,0, - /* 19337 */ 0321,01,0350,064,0, - /* 19342 */ 0322,01,0377,0203,0, - /* 19347 */ 0324,01,0377,0203,0, - /* 19352 */ 0320,01,0377,0203,0, - /* 19357 */ 0321,01,0377,0203,0, - /* 19362 */ 0322,01,0377,0202,0, - /* 19367 */ 0320,01,0377,0202,0, - /* 19372 */ 0321,01,0377,0202,0, - /* 19377 */ 0324,01,0377,0202,0, - /* 19382 */ 0323,01,0377,0202,0, - /* 19387 */ 03,017,01,0335,0, - /* 19392 */ 0320,01,071,0101,0, - /* 19397 */ 0321,01,071,0101,0, - /* 19402 */ 0324,01,071,0101,0, - /* 19407 */ 0320,01,073,0110,0, - /* 19412 */ 0321,01,073,0110,0, - /* 19417 */ 0324,01,073,0110,0, - /* 19422 */ 0320,01,075,031,0, - /* 19427 */ 0321,01,075,041,0, - /* 19432 */ 0324,01,075,0255,0, - /* 19437 */ 01,0200,0207,021,0, - /* 19442 */ 0335,0321,01,0247,0, - /* 19447 */ 0335,0324,01,0247,0, - /* 19452 */ 0335,0320,01,0247,0, - /* 19457 */ 02,017,0260,0101,0, - /* 19462 */ 02,017,0246,0101,0, - /* 19467 */ 0320,01,0377,0201,0, - /* 19472 */ 0321,01,0377,0201,0, - /* 19477 */ 0324,01,0377,0201,0, - /* 19482 */ 0320,01,0367,0206,0, - /* 19487 */ 0321,01,0367,0206,0, - /* 19492 */ 0324,01,0367,0206,0, - /* 19497 */ 01,0310,030,025,0, - /* 19502 */ 01,0334,010,0300,0, - /* 19507 */ 01,0330,010,0300,0, - /* 19512 */ 01,0330,011,0300,0, - /* 19517 */ 01,0336,010,0300,0, - /* 19522 */ 0341,02,0333,0342,0, - /* 19527 */ 01,0332,010,0300,0, - /* 19532 */ 01,0332,011,0300,0, - /* 19537 */ 01,0332,010,0320,0, - /* 19542 */ 01,0332,011,0320,0, - /* 19547 */ 01,0332,010,0310,0, - /* 19552 */ 01,0332,011,0310,0, - /* 19557 */ 01,0333,010,0300,0, - /* 19562 */ 01,0333,011,0300,0, - /* 19567 */ 01,0333,010,0320,0, - /* 19572 */ 01,0333,011,0320,0, - /* 19577 */ 01,0333,010,0310,0, - /* 19582 */ 01,0333,011,0310,0, - /* 19587 */ 01,0333,010,0330,0, - /* 19592 */ 01,0333,011,0330,0, - /* 19597 */ 01,0332,010,0330,0, - /* 19602 */ 01,0332,011,0330,0, - /* 19607 */ 01,0330,010,0320,0, - /* 19612 */ 01,0330,011,0320,0, - /* 19617 */ 01,0333,010,0360,0, - /* 19622 */ 01,0333,011,0360,0, - /* 19627 */ 01,0337,010,0360,0, - /* 19632 */ 01,0337,011,0360,0, - /* 19637 */ 01,0330,010,0330,0, - /* 19642 */ 01,0330,011,0330,0, - /* 19647 */ 0341,02,0333,0341,0, - /* 19652 */ 01,0334,010,0370,0, - /* 19657 */ 01,0330,010,0360,0, - /* 19662 */ 01,0330,011,0360,0, - /* 19667 */ 01,0336,010,0370,0, - /* 19672 */ 01,0334,010,0360,0, - /* 19677 */ 01,0330,010,0370,0, - /* 19682 */ 01,0330,011,0370,0, - /* 19687 */ 01,0336,010,0360,0, - /* 19692 */ 0341,02,0333,0340,0, - /* 19697 */ 01,0335,010,0300,0, - /* 19702 */ 01,0337,010,0300,0, - /* 19707 */ 0341,02,0333,0343,0, - /* 19712 */ 01,0331,010,0300,0, - /* 19717 */ 01,0334,010,0310,0, - /* 19722 */ 01,0330,010,0310,0, - /* 19727 */ 01,0330,011,0310,0, - /* 19732 */ 01,0336,010,0310,0, - /* 19737 */ 0341,01,0335,0206,0, - /* 19742 */ 01,0335,010,0320,0, - /* 19747 */ 0341,01,0331,0207,0, - /* 19752 */ 0341,01,0331,0206,0, - /* 19757 */ 01,0335,010,0330,0, - /* 19762 */ 0341,01,0335,0207,0, - /* 19767 */ 0341,02,0337,0340,0, - /* 19772 */ 01,0334,010,0350,0, - /* 19777 */ 01,0330,010,0340,0, - /* 19782 */ 01,0330,011,0340,0, - /* 19787 */ 01,0336,010,0350,0, - /* 19792 */ 01,0334,010,0340,0, - /* 19797 */ 01,0330,010,0350,0, - /* 19802 */ 01,0330,011,0350,0, - /* 19807 */ 01,0336,010,0340,0, - /* 19812 */ 01,0335,010,0340,0, - /* 19817 */ 01,0335,011,0340,0, - /* 19822 */ 01,0333,010,0350,0, - /* 19827 */ 01,0333,011,0350,0, - /* 19832 */ 01,0337,010,0350,0, - /* 19837 */ 01,0337,011,0350,0, - /* 19842 */ 01,0335,010,0350,0, - /* 19847 */ 01,0335,011,0350,0, - /* 19852 */ 01,0331,010,0310,0, - /* 19857 */ 01,0331,011,0310,0, - /* 19862 */ 0320,01,0367,0207,0, - /* 19867 */ 0321,01,0367,0207,0, - /* 19872 */ 0324,01,0367,0207,0, - /* 19877 */ 0320,01,0367,0205,0, - /* 19882 */ 0321,01,0367,0205,0, - /* 19887 */ 0324,01,0367,0205,0, - /* 19892 */ 0320,01,0345,025,0, - /* 19897 */ 0321,01,0345,025,0, - /* 19902 */ 0320,01,0377,0200,0, - /* 19907 */ 0321,01,0377,0200,0, - /* 19912 */ 0324,01,0377,0200,0, - /* 19917 */ 02,017,01,0207,0, - /* 19922 */ 0310,01,0343,050,0, - /* 19927 */ 0311,01,0343,050,0, - /* 19932 */ 0313,01,0343,050,0, - /* 19937 */ 0371,01,0353,050,0, - /* 19942 */ 0322,01,0351,064,0, - /* 19947 */ 0320,01,0351,064,0, - /* 19952 */ 0321,01,0351,064,0, - /* 19957 */ 0322,01,0377,0205,0, - /* 19962 */ 0324,01,0377,0205,0, - /* 19967 */ 0320,01,0377,0205,0, - /* 19972 */ 0321,01,0377,0205,0, - /* 19977 */ 0322,01,0377,0204,0, - /* 19982 */ 0320,01,0377,0204,0, - /* 19987 */ 0321,01,0377,0204,0, - /* 19992 */ 0323,01,0377,0204,0, - /* 19997 */ 0320,01,0305,0110,0, - /* 20002 */ 0321,01,0305,0110,0, - /* 20007 */ 0320,01,0215,0110,0, - /* 20012 */ 0321,01,0215,0110,0, - /* 20017 */ 0324,01,0215,0110,0, - /* 20022 */ 0320,01,0304,0110,0, - /* 20027 */ 0321,01,0304,0110,0, - /* 20032 */ 03,017,0256,0350,0, - /* 20037 */ 02,017,01,0202,0, - /* 20042 */ 02,017,01,0203,0, - /* 20047 */ 02,017,0,0202,0, - /* 20052 */ 02,017,01,0206,0, - /* 20057 */ 0312,01,0342,050,0, - /* 20062 */ 0310,01,0342,050,0, - /* 20067 */ 0311,01,0342,050,0, - /* 20072 */ 0313,01,0342,050,0, - /* 20077 */ 0312,01,0341,050,0, - /* 20082 */ 0310,01,0341,050,0, - /* 20087 */ 0311,01,0341,050,0, - /* 20092 */ 0313,01,0341,050,0, - /* 20097 */ 0312,01,0340,050,0, - /* 20102 */ 0310,01,0340,050,0, - /* 20107 */ 0311,01,0340,050,0, - /* 20112 */ 0313,01,0340,050,0, - /* 20117 */ 02,017,0,0203,0, - /* 20122 */ 03,017,0256,0360,0, - /* 20127 */ 03,017,01,0310,0, - /* 20132 */ 0320,01,0214,0101,0, - /* 20137 */ 0321,01,0214,0101,0, - /* 20142 */ 0320,01,0241,045,0, - /* 20147 */ 0321,01,0241,045,0, - /* 20152 */ 0324,01,0241,045,0, - /* 20157 */ 0320,01,0243,044,0, - /* 20162 */ 0321,01,0243,044,0, - /* 20167 */ 0324,01,0243,044,0, - /* 20172 */ 02,017,044,0101,0, - /* 20177 */ 02,017,046,0110,0, - /* 20182 */ 0320,01,0211,0101,0, - /* 20187 */ 0321,01,0211,0101,0, - /* 20192 */ 0324,01,0211,0101,0, - /* 20197 */ 0320,01,0213,0110,0, - /* 20202 */ 0321,01,0213,0110,0, - /* 20207 */ 0324,01,0213,0110,0, - /* 20212 */ 0320,010,0270,031,0, - /* 20217 */ 0321,010,0270,041,0, - /* 20222 */ 0324,010,0270,055,0, - /* 20227 */ 01,0306,0200,021,0, - /* 20232 */ 0324,01,0143,0110,0, - /* 20237 */ 0320,01,0367,0204,0, - /* 20242 */ 0321,01,0367,0204,0, - /* 20247 */ 0324,01,0367,0204,0, - /* 20252 */ 03,017,01,0311,0, - /* 20257 */ 0320,01,0367,0203,0, - /* 20262 */ 0321,01,0367,0203,0, - /* 20267 */ 0324,01,0367,0203,0, - /* 20272 */ 0320,01,0367,0202,0, - /* 20277 */ 0321,01,0367,0202,0, - /* 20282 */ 0324,01,0367,0202,0, - /* 20287 */ 0320,01,011,0101,0, - /* 20292 */ 0321,01,011,0101,0, - /* 20297 */ 0324,01,011,0101,0, - /* 20302 */ 0320,01,013,0110,0, - /* 20307 */ 0321,01,013,0110,0, - /* 20312 */ 0324,01,013,0110,0, - /* 20317 */ 0320,01,015,031,0, - /* 20322 */ 0321,01,015,041,0, - /* 20327 */ 0324,01,015,0255,0, - /* 20332 */ 01,0200,0201,021,0, - /* 20337 */ 0320,01,0347,024,0, - /* 20342 */ 0321,01,0347,024,0, - /* 20347 */ 0314,0333,01,0220,0, - /* 20352 */ 0320,01,0217,0200,0, - /* 20357 */ 0321,01,0217,0200,0, - /* 20362 */ 0323,01,0217,0200,0, - /* 20367 */ 02,017,015,0200,0, - /* 20372 */ 02,017,015,0201,0, - /* 20377 */ 0320,01,0377,0206,0, - /* 20382 */ 0321,01,0377,0206,0, - /* 20387 */ 0323,01,0377,0206,0, - /* 20392 */ 0320,0144,0150,0140,0, - /* 20397 */ 0321,0154,0150,0150,0, - /* 20402 */ 0323,0154,0150,0250,0, - /* 20407 */ 01,0300,0202,025,0, - /* 20412 */ 0320,01,0321,0202,0, - /* 20417 */ 0320,01,0323,0202,0, - /* 20422 */ 0321,01,0321,0202,0, - /* 20427 */ 0321,01,0323,0202,0, - /* 20432 */ 0324,01,0321,0202,0, - /* 20437 */ 0324,01,0323,0202,0, - /* 20442 */ 01,0300,0203,025,0, - /* 20447 */ 0320,01,0321,0203,0, - /* 20452 */ 0320,01,0323,0203,0, - /* 20457 */ 0321,01,0321,0203,0, - /* 20462 */ 0321,01,0323,0203,0, - /* 20467 */ 0324,01,0321,0203,0, - /* 20472 */ 0324,01,0323,0203,0, - /* 20477 */ 03,017,01,0371,0, - /* 20482 */ 01,0300,0200,025,0, - /* 20487 */ 0320,01,0321,0200,0, - /* 20492 */ 0320,01,0323,0200,0, - /* 20497 */ 0321,01,0321,0200,0, - /* 20502 */ 0321,01,0323,0200,0, - /* 20507 */ 0324,01,0321,0200,0, - /* 20512 */ 0324,01,0323,0200,0, - /* 20517 */ 01,0300,0201,025,0, - /* 20522 */ 0320,01,0321,0201,0, - /* 20527 */ 0320,01,0323,0201,0, - /* 20532 */ 0321,01,0321,0201,0, - /* 20537 */ 0321,01,0323,0201,0, - /* 20542 */ 0324,01,0321,0201,0, - /* 20547 */ 0324,01,0323,0201,0, - /* 20552 */ 02,017,0173,0200,0, - /* 20557 */ 02,017,0175,0200,0, - /* 20562 */ 01,0300,0204,025,0, - /* 20567 */ 0320,01,0321,0204,0, - /* 20572 */ 0320,01,0323,0204,0, - /* 20577 */ 0321,01,0321,0204,0, - /* 20582 */ 0321,01,0323,0204,0, - /* 20587 */ 0324,01,0321,0204,0, - /* 20592 */ 0324,01,0323,0204,0, - /* 20597 */ 01,0300,0207,025,0, - /* 20602 */ 0320,01,0321,0207,0, - /* 20607 */ 0320,01,0323,0207,0, - /* 20612 */ 0321,01,0321,0207,0, - /* 20617 */ 0321,01,0323,0207,0, - /* 20622 */ 0324,01,0321,0207,0, - /* 20627 */ 0324,01,0323,0207,0, - /* 20632 */ 0320,01,031,0101,0, - /* 20637 */ 0321,01,031,0101,0, - /* 20642 */ 0324,01,031,0101,0, - /* 20647 */ 0320,01,033,0110,0, - /* 20652 */ 0321,01,033,0110,0, - /* 20657 */ 0324,01,033,0110,0, - /* 20662 */ 0320,01,035,031,0, - /* 20667 */ 0321,01,035,041,0, - /* 20672 */ 0324,01,035,0255,0, - /* 20677 */ 01,0200,0203,021,0, - /* 20682 */ 0335,0321,01,0257,0, - /* 20687 */ 0335,0324,01,0257,0, - /* 20692 */ 0335,0320,01,0257,0, - /* 20697 */ 03,017,0256,0370,0, - /* 20702 */ 02,017,01,0200,0, - /* 20707 */ 01,0300,0205,025,0, - /* 20712 */ 0320,01,0321,0205,0, - /* 20717 */ 0320,01,0323,0205,0, - /* 20722 */ 0321,01,0321,0205,0, - /* 20727 */ 0321,01,0323,0205,0, - /* 20732 */ 0324,01,0321,0205,0, - /* 20737 */ 0324,01,0323,0205,0, - /* 20742 */ 02,017,01,0201,0, - /* 20747 */ 03,017,01,0336,0, - /* 20752 */ 03,017,01,0334,0, - /* 20757 */ 0320,01,051,0101,0, - /* 20762 */ 0321,01,051,0101,0, - /* 20767 */ 0324,01,051,0101,0, - /* 20772 */ 0320,01,053,0110,0, - /* 20777 */ 0321,01,053,0110,0, - /* 20782 */ 0324,01,053,0110,0, - /* 20787 */ 0320,01,055,031,0, - /* 20792 */ 0321,01,055,041,0, - /* 20797 */ 0324,01,055,0255,0, - /* 20802 */ 01,0200,0205,021,0, - /* 20807 */ 02,017,0172,0200,0, - /* 20812 */ 02,017,0174,0200,0, - /* 20817 */ 03,017,01,0370,0, - /* 20822 */ 0320,01,0205,0101,0, - /* 20827 */ 0321,01,0205,0101,0, - /* 20832 */ 0324,01,0205,0101,0, - /* 20837 */ 0320,01,0205,0110,0, - /* 20842 */ 0321,01,0205,0110,0, - /* 20847 */ 0324,01,0205,0110,0, - /* 20852 */ 0320,01,0251,031,0, - /* 20857 */ 0321,01,0251,041,0, - /* 20862 */ 0324,01,0251,0255,0, - /* 20867 */ 01,0366,0200,021,0, - /* 20872 */ 02,017,0,0204,0, - /* 20877 */ 02,017,0,0205,0, - /* 20882 */ 02,017,0300,0101,0, - /* 20887 */ 0320,01,0207,0110,0, - /* 20892 */ 0321,01,0207,0110,0, - /* 20897 */ 0324,01,0207,0110,0, - /* 20902 */ 0320,01,0207,0101,0, - /* 20907 */ 0321,01,0207,0101,0, - /* 20912 */ 0324,01,0207,0101,0, - /* 20917 */ 0320,01,061,0101,0, - /* 20922 */ 0321,01,061,0101,0, - /* 20927 */ 0324,01,061,0101,0, - /* 20932 */ 0320,01,063,0110,0, - /* 20937 */ 0321,01,063,0110,0, - /* 20942 */ 0324,01,063,0110,0, - /* 20947 */ 0320,01,065,031,0, - /* 20952 */ 0321,01,065,041,0, - /* 20957 */ 0324,01,065,0255,0, - /* 20962 */ 01,0200,0206,021,0, - /* 20967 */ 0370,0330,0160,050,0, - /* 20972 */ 02,017,0256,0202,0, - /* 20977 */ 02,017,0256,0203,0, - /* 20982 */ 02,017,0256,0201,0, - /* 20987 */ 02,017,0256,0200,0, - /* 20992 */ 02,017,0256,0207,0, - /* 20997 */ 03,017,01,0301,0, - /* 21002 */ 03,017,01,0302,0, - /* 21007 */ 03,017,01,0332,0, - /* 21012 */ 03,017,01,0331,0, - /* 21017 */ 02,017,0307,0207,0, - /* 21022 */ 03,017,01,0303,0, - /* 21027 */ 03,017,01,0330,0, - /* 21032 */ 03,017,01,0333,0, - /* 21037 */ 03,017,01,0304,0, - /* 21042 */ 03,017,0247,0300,0, - /* 21047 */ 02,0325,012,0, - /* 21051 */ 01,0325,024,0, - /* 21055 */ 02,0324,012,0, - /* 21059 */ 01,0324,024,0, - /* 21063 */ 01,020,0101,0, - /* 21067 */ 01,024,021,0, - /* 21071 */ 01,0,0101,0, - /* 21075 */ 01,04,021,0, - /* 21079 */ 01,040,0101,0, - /* 21083 */ 01,044,021,0, - /* 21087 */ 01,0143,0101,0, - /* 21091 */ 02,017,072,0, - /* 21095 */ 02,017,073,0, - /* 21099 */ 0320,01,0230,0, - /* 21103 */ 0321,01,0231,0, - /* 21107 */ 0324,01,0230,0, - /* 21111 */ 02,017,06,0, - /* 21115 */ 01,070,0101,0, - /* 21119 */ 01,074,021,0, - /* 21123 */ 0335,01,0246,0, - /* 21127 */ 02,017,0242,0, - /* 21131 */ 02,017,075,0, - /* 21135 */ 02,017,074,0, - /* 21139 */ 0324,01,0231,0, - /* 21143 */ 0320,01,0231,0, - /* 21147 */ 0321,01,0230,0, - /* 21151 */ 0320,010,0110,0, - /* 21155 */ 0321,010,0110,0, - /* 21159 */ 01,0376,0201,0, - /* 21163 */ 01,0366,0206,0, - /* 21167 */ 02,017,071,0, - /* 21171 */ 02,017,0167,0, - /* 21175 */ 02,0331,0360,0, - /* 21179 */ 02,0331,0341,0, - /* 21183 */ 01,0330,0200,0, - /* 21187 */ 01,0334,0200,0, - /* 21191 */ 02,0336,0301,0, - /* 21195 */ 01,0337,0204,0, - /* 21199 */ 01,0337,0206,0, - /* 21203 */ 02,0331,0340,0, - /* 21207 */ 02,0332,0301,0, - /* 21211 */ 02,0332,0321,0, - /* 21215 */ 02,0332,0311,0, - /* 21219 */ 02,0333,0301,0, - /* 21223 */ 02,0333,0321,0, - /* 21227 */ 02,0333,0311,0, - /* 21231 */ 02,0333,0331,0, - /* 21235 */ 02,0332,0331,0, - /* 21239 */ 01,0330,0202,0, - /* 21243 */ 01,0334,0202,0, - /* 21247 */ 02,0330,0321,0, - /* 21251 */ 02,0333,0361,0, - /* 21255 */ 02,0337,0361,0, - /* 21259 */ 01,0330,0203,0, - /* 21263 */ 01,0334,0203,0, - /* 21267 */ 02,0330,0331,0, - /* 21271 */ 02,0336,0331,0, - /* 21275 */ 02,0331,0377,0, - /* 21279 */ 02,0331,0366,0, - /* 21283 */ 01,0330,0206,0, - /* 21287 */ 01,0334,0206,0, - /* 21291 */ 02,0336,0371,0, - /* 21295 */ 01,0330,0207,0, - /* 21299 */ 01,0334,0207,0, - /* 21303 */ 02,0336,0361,0, - /* 21307 */ 02,017,016,0, - /* 21311 */ 02,0335,0301,0, - /* 21315 */ 02,0337,0301,0, - /* 21319 */ 01,0332,0200,0, - /* 21323 */ 01,0336,0200,0, - /* 21327 */ 01,0332,0202,0, - /* 21331 */ 01,0336,0202,0, - /* 21335 */ 01,0332,0203,0, - /* 21339 */ 01,0336,0203,0, - /* 21343 */ 01,0332,0206,0, - /* 21347 */ 01,0336,0206,0, - /* 21351 */ 01,0332,0207,0, - /* 21355 */ 01,0336,0207,0, - /* 21359 */ 01,0333,0200,0, - /* 21363 */ 01,0337,0200,0, - /* 21367 */ 01,0337,0205,0, - /* 21371 */ 01,0332,0201,0, - /* 21375 */ 01,0336,0201,0, - /* 21379 */ 02,0331,0367,0, - /* 21383 */ 01,0333,0202,0, - /* 21387 */ 01,0337,0202,0, - /* 21391 */ 01,0333,0203,0, - /* 21395 */ 01,0337,0203,0, - /* 21399 */ 01,0337,0207,0, - /* 21403 */ 01,0337,0201,0, - /* 21407 */ 01,0333,0201,0, - /* 21411 */ 01,0335,0201,0, - /* 21415 */ 01,0332,0204,0, - /* 21419 */ 01,0336,0204,0, - /* 21423 */ 01,0332,0205,0, - /* 21427 */ 01,0336,0205,0, - /* 21431 */ 01,0331,0200,0, - /* 21435 */ 01,0335,0200,0, - /* 21439 */ 01,0333,0205,0, - /* 21443 */ 02,0331,0301,0, - /* 21447 */ 02,0331,0350,0, - /* 21451 */ 01,0331,0205,0, - /* 21455 */ 01,0331,0204,0, - /* 21459 */ 02,0331,0352,0, - /* 21463 */ 02,0331,0351,0, - /* 21467 */ 02,0331,0354,0, - /* 21471 */ 02,0331,0355,0, - /* 21475 */ 02,0331,0353,0, - /* 21479 */ 02,0331,0356,0, - /* 21483 */ 01,0330,0201,0, - /* 21487 */ 01,0334,0201,0, - /* 21491 */ 02,0336,0311,0, - /* 21495 */ 02,0331,0320,0, - /* 21499 */ 02,0331,0363,0, - /* 21503 */ 02,0331,0370,0, - /* 21507 */ 02,0331,0365,0, - /* 21511 */ 02,0331,0362,0, - /* 21515 */ 02,0331,0374,0, - /* 21519 */ 01,0335,0204,0, - /* 21523 */ 02,0331,0375,0, - /* 21527 */ 02,0333,0344,0, - /* 21531 */ 02,0331,0376,0, - /* 21535 */ 02,0331,0373,0, - /* 21539 */ 02,0331,0372,0, - /* 21543 */ 01,0331,0202,0, - /* 21547 */ 01,0335,0202,0, - /* 21551 */ 02,0335,0321,0, - /* 21555 */ 01,0331,0203,0, - /* 21559 */ 01,0335,0203,0, - /* 21563 */ 01,0333,0207,0, - /* 21567 */ 02,0335,0331,0, - /* 21571 */ 01,0330,0204,0, - /* 21575 */ 01,0334,0204,0, - /* 21579 */ 02,0336,0351,0, - /* 21583 */ 01,0330,0205,0, - /* 21587 */ 01,0334,0205,0, - /* 21591 */ 02,0336,0341,0, - /* 21595 */ 02,0331,0344,0, - /* 21599 */ 02,0335,0341,0, - /* 21603 */ 02,0333,0351,0, - /* 21607 */ 02,0337,0351,0, - /* 21611 */ 02,0335,0351,0, - /* 21615 */ 02,0332,0351,0, - /* 21619 */ 02,0331,0345,0, - /* 21623 */ 02,0331,0311,0, - /* 21627 */ 02,0331,0364,0, - /* 21631 */ 02,0331,0361,0, - /* 21635 */ 02,0331,0371,0, - /* 21639 */ 01,0366,0207,0, - /* 21643 */ 01,0366,0205,0, - /* 21647 */ 01,0344,025,0, - /* 21651 */ 0320,01,0355,0, - /* 21655 */ 0321,01,0355,0, - /* 21659 */ 0320,010,0100,0, - /* 21663 */ 0321,010,0100,0, - /* 21667 */ 01,0376,0200,0, - /* 21671 */ 0321,01,0155,0, - /* 21675 */ 0320,01,0155,0, - /* 21679 */ 01,0315,024,0, - /* 21683 */ 02,017,010,0, - /* 21687 */ 0322,01,0317,0, - /* 21691 */ 0321,01,0317,0, - /* 21695 */ 0324,01,0317,0, - /* 21699 */ 0320,01,0317,0, - /* 21703 */ 02,017,07,0, - /* 21707 */ 02,017,05,0, - /* 21711 */ 0321,01,0255,0, - /* 21715 */ 0324,01,0255,0, - /* 21719 */ 0320,01,0255,0, - /* 21723 */ 01,0216,0110,0, - /* 21727 */ 01,0240,045,0, - /* 21731 */ 01,0242,044,0, - /* 21735 */ 01,0210,0101,0, - /* 21739 */ 01,0212,0110,0, - /* 21743 */ 010,0260,021,0, - /* 21747 */ 0321,01,0245,0, - /* 21751 */ 0324,01,0245,0, - /* 21755 */ 0320,01,0245,0, - /* 21759 */ 01,0366,0204,0, - /* 21763 */ 01,0366,0203,0, - /* 21767 */ 0314,01,0220,0, - /* 21771 */ 01,0366,0202,0, - /* 21775 */ 01,010,0101,0, - /* 21779 */ 01,014,021,0, - /* 21783 */ 01,0346,024,0, - /* 21787 */ 0320,01,0357,0, - /* 21791 */ 0321,01,0357,0, - /* 21795 */ 0321,01,0157,0, - /* 21799 */ 0320,01,0157,0, - /* 21803 */ 0320,010,0130,0, - /* 21807 */ 0321,010,0130,0, - /* 21811 */ 0323,010,0130,0, - /* 21815 */ 01,017,0347,0, - /* 21819 */ 0322,01,0141,0, - /* 21823 */ 0321,01,0141,0, - /* 21827 */ 0320,01,0141,0, - /* 21831 */ 0322,01,0235,0, - /* 21835 */ 0321,01,0235,0, - /* 21839 */ 0320,01,0235,0, - /* 21843 */ 0320,010,0120,0, - /* 21847 */ 0321,010,0120,0, - /* 21851 */ 0323,010,0120,0, - /* 21855 */ 01,017,0346,0, - /* 21859 */ 01,0152,0274,0, - /* 21863 */ 0322,01,0140,0, - /* 21867 */ 0321,01,0140,0, - /* 21871 */ 0320,01,0140,0, - /* 21875 */ 0322,01,0234,0, - /* 21879 */ 0321,01,0234,0, - /* 21883 */ 0320,01,0234,0, - /* 21887 */ 01,0320,0202,0, - /* 21891 */ 01,0322,0202,0, - /* 21895 */ 01,0320,0203,0, - /* 21899 */ 01,0322,0203,0, - /* 21903 */ 02,017,062,0, - /* 21907 */ 02,017,063,0, - /* 21911 */ 02,017,061,0, - /* 21915 */ 01,0302,030,0, - /* 21919 */ 01,0312,030,0, - /* 21923 */ 01,0320,0200,0, - /* 21927 */ 01,0322,0200,0, - /* 21931 */ 01,0320,0201,0, - /* 21935 */ 01,0322,0201,0, - /* 21939 */ 02,017,0252,0, - /* 21943 */ 01,0320,0204,0, - /* 21947 */ 01,0322,0204,0, - /* 21951 */ 01,0320,0207,0, - /* 21955 */ 01,0322,0207,0, - /* 21959 */ 01,030,0101,0, - /* 21963 */ 01,034,021,0, - /* 21967 */ 0335,01,0256,0, - /* 21971 */ 01,0320,0205,0, - /* 21975 */ 01,0322,0205,0, - /* 21979 */ 02,017,070,0, - /* 21983 */ 02,017,0176,0, - /* 21987 */ 0321,01,0253,0, - /* 21991 */ 0324,01,0253,0, - /* 21995 */ 0320,01,0253,0, - /* 21999 */ 01,050,0101,0, - /* 22003 */ 01,054,021,0, - /* 22007 */ 02,017,064,0, - /* 22011 */ 02,017,065,0, - /* 22015 */ 01,0204,0101,0, - /* 22019 */ 01,0204,0110,0, - /* 22023 */ 01,0250,021,0, - /* 22027 */ 02,017,0377,0, - /* 22031 */ 02,017,0271,0, - /* 22035 */ 02,017,013,0, - /* 22039 */ 02,017,011,0, - /* 22043 */ 02,017,060,0, - /* 22047 */ 0320,011,0220,0, - /* 22051 */ 0321,011,0220,0, - /* 22055 */ 0324,011,0220,0, - /* 22059 */ 0320,010,0220,0, - /* 22063 */ 0321,010,0220,0, - /* 22067 */ 0324,010,0220,0, - /* 22071 */ 0321,01,0220,0, - /* 22075 */ 01,0206,0110,0, - /* 22079 */ 01,0206,0101,0, - /* 22083 */ 01,060,0101,0, - /* 22087 */ 01,064,021,0, - /* 22091 */ 02,017,067,0, - /* 22095 */ 01,067,0, - /* 22098 */ 01,077,0, - /* 22101 */ 01,0374,0, - /* 22104 */ 01,0372,0, - /* 22107 */ 01,0365,0, - /* 22110 */ 01,047,0, - /* 22113 */ 01,057,0, - /* 22116 */ 01,0364,0, - /* 22119 */ 01,0361,0, - /* 22122 */ 01,0354,0, - /* 22125 */ 01,0154,0, - /* 22128 */ 01,0314,0, - /* 22131 */ 01,0316,0, - /* 22134 */ 01,0237,0, - /* 22137 */ 01,0254,0, - /* 22140 */ 01,0356,0, - /* 22143 */ 01,0156,0, - /* 22146 */ 01,0313,0, - /* 22149 */ 01,0326,0, - /* 22152 */ 01,0375,0, - /* 22155 */ 01,0373,0, - /* 22158 */ 01,0327,0, -}; - -/* - * Bytecode frequencies (including reuse): - * - * 0:3687 | 40: 4 | 100: 53 | 140: 1 | 200: 101 | 240: 0 | 300: 0 | 340: 1 - * 1:2985 | 41: 19 | 101: 283 | 141: 17 | 201: 71 | 241: 0 | 301: 0 | 341: 10 - * 2:1041 | 42: 8 | 102: 6 | 142: 2 | 202: 88 | 242: 0 | 302: 0 | 342: 0 - * 3: 498 | 43: 4 | 103: 0 | 143: 0 | 203: 75 | 243: 0 | 303: 0 | 343: 0 - * 4: 0 | 44: 4 | 104: 0 | 144: 1 | 204: 101 | 244: 0 | 304: 0 | 344: 2 - * 5: 0 | 45: 4 | 105: 0 | 145: 17 | 205: 72 | 245: 0 | 305: 0 | 345: 1 - * 6: 0 | 46: 0 | 106: 0 | 146: 2 | 206: 74 | 246: 0 | 306: 0 | 346: 1 - * 7: 0 | 47: 0 | 107: 0 | 147: 0 | 207: 71 | 247: 0 | 307: 0 | 347: 1 - * 10: 72 | 50: 28 | 110:1343 | 150: 2 | 210: 0 | 250: 1 | 310: 7 | 350: 0 - * 11: 26 | 51: 0 | 111: 0 | 151: 17 | 211: 0 | 251: 9 | 311: 7 | 351: 0 - * 12: 0 | 52: 0 | 112: 32 | 152: 2 | 212: 3 | 252: 2 | 312: 5 | 352: 0 - * 13: 0 | 53: 0 | 113: 0 | 153: 0 | 213: 1 | 253: 0 | 313: 7 | 353: 0 - * 14: 0 | 54: 0 | 114: 0 | 154: 3 | 214: 2 | 254: 0 | 314: 2 | 354: 0 - * 15: 6 | 55: 1 | 115: 0 | 155: 26 | 215: 0 | 255: 13 | 315: 0 | 355: 0 - * 16: 12 | 56: 0 | 116: 0 | 156: 4 | 216: 3 | 256: 0 | 316: 0 | 356: 0 - * 17: 0 | 57: 0 | 117: 0 | 157: 0 | 217: 1 | 257: 0 | 317: 0 | 357: 0 - * 20: 0 | 60: 4 | 120: 733 | 160: 204 | 220: 0 | 260: 533 | 320: 322 | 360: 197 - * 21: 48 | 61: 0 | 121: 184 | 161: 0 | 221: 0 | 261: 767 | 321: 325 | 361: 240 - * 22: 101 | 62: 4 | 122: 0 | 162: 0 | 222: 0 | 262: 12 | 322: 21 | 362: 44 - * 23: 56 | 63: 4 | 123: 20 | 163: 0 | 223: 0 | 263: 0 | 323: 113 | 363: 48 - * 24: 6 | 64: 20 | 124: 0 | 164: 52 | 224: 0 | 264: 0 | 324: 283 | 364: 0 - * 25: 67 | 65: 0 | 125: 0 | 165: 0 | 225: 0 | 265: 0 | 325: 1 | 365: 0 - * 26: 75 | 66: 0 | 126: 0 | 166: 0 | 226: 0 | 266: 0 | 326: 0 | 366: 0 - * 27: 1 | 67: 0 | 127: 0 | 167: 0 | 227: 0 | 267: 0 | 327: 0 | 367: 0 - * 30: 14 | 70: 0 | 130: 49 | 170: 0 | 230: 0 | 270: 237 | 330: 16 | 370: 1 - * 31: 19 | 71: 0 | 131: 0 | 171: 0 | 231: 0 | 271: 0 | 331: 0 | 371: 1 - * 32: 2 | 72: 0 | 132: 20 | 172: 8 | 232: 0 | 272: 0 | 332: 5 | 372: 0 - * 33: 0 | 73: 0 | 133: 0 | 173: 24 | 233: 0 | 273: 0 | 333: 7 | 373: 1 - * 34: 6 | 74: 6 | 134: 0 | 174: 170 | 234: 0 | 274: 1 | 334: 2 | 374: 0 - * 35: 2 | 75: 0 | 135: 0 | 175: 0 | 235: 0 | 275: 48 | 335: 8 | 375: 0 - * 36: 0 | 76: 0 | 136: 0 | 176: 0 | 236: 0 | 276: 0 | 336: 8 | 376: 0 - * 37: 0 | 77: 0 | 137: 0 | 177: 0 | 237: 0 | 277: 0 | 337: 0 | 377: 0 - */ - - } -} diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBuilder.cs b/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBuilder.cs deleted file mode 100644 index 3498a2e429..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeBuilder.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Net; -using System.Reflection; -using System.IO; -using System.Xml; -using System.Xml.Linq; -using System.Xml.XPath; -using Cosmos.Assembler.X86; - -namespace Cosmos.Assembler.X86.Generator -{ - - public class OpCodeBuilder - { - [STAThread] - static void Main( string[] args ) - { - - } - - - public Operand[] GetOperands(int OpCount, ulong[] aData ) - { - Operand[] ops = new Operand[OpCount]; - Operand op; - int x = 0; - bool OpFinish = false; - for( int i = 0; i < OpCount; i++ ) - { - ops[ i ] = new Operand(); - op = ops[ i ]; - for(; x < aData.Length; x++ ) - { - switch( aData[ x ] ) - { - case OpCodeData.MEMORY: - break; - case OpCodeData.REG8: - break; - case OpCodeData.REG16: - break; - case OpCodeData.REG32: - break; - case OpCodeData.REG64: - break; - case OpCodeData.FPUREG: - break; - case OpCodeData.XMMREG: - break; - case OpCodeData.YMMREG: - break; - case OpCodeData.IMMEDIATE: - break; - case OpCodeData.BITS8: - break; - case OpCodeData.BITS16: - break; - case OpCodeData.BITS32: - break; - case OpCodeData.BITS64: - break; - case OpCodeData.BITS80: - break; - case OpCodeData.BITS128: - break; - case OpCodeData.BITS256: - break; - - - - } - - if( OpFinish ) - break; - } - } - - return ops; - } - - public string GetInstructionVariant( OpCodeData.itemplate node ) - { - string code = ""; - code += "new InstructionVariant()" + Environment.NewLine; - code += "{" + Environment.NewLine; - - - - code += " " + Environment.NewLine; - code += "}" + Environment.NewLine; - - return code; - } - - public string GetInstruction( ) - { - string code = ""; - code += "public void {0} : Instruction" + Environment.NewLine; - code += "{" + Environment.NewLine; - code += " public {0}()" + Environment.NewLine; - code += " {" + Environment.NewLine; - code += " Mnemonic = \"{0}\"" + Environment.NewLine; - code += " }" + Environment.NewLine; - code += Environment.NewLine; - code += " public override bool Initialize()" + Environment.NewLine; - code += " {" + Environment.NewLine; - - code += " Variants = new List()" + Environment.NewLine; - - - code += " }" + Environment.NewLine; - code += "}" + Environment.NewLine; - - return code; - } - - - /* - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - - namespace Cosmos.Assembler.X86 - { - - [OpCode("dec")] - public class Dec : InstructionWithDestinationAndSize - { - aData.EncodingOptions.Add(new InstructionData.InstructionEncodingOption - { - OpCode = new byte[] { 0xFE }, - NeedsModRMByte = true, - InitialModRMByteValue = 0xC8, - OperandSizeByte = 0, - ReverseRegisters=true, - DestinationRegAny = true - }); // reg - } - } - - */ - - - } -} - diff --git a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeData.cs b/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeData.cs deleted file mode 100644 index 148f02d9c0..0000000000 --- a/Users/Gero Landmann/Cosmos.Assembler.X86/OpCodeData.cs +++ /dev/null @@ -1,11973 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Assembler.X86; - -using OCE = Cosmos.Assembler.X86.InstructionEnum; -using OF = Cosmos.Assembler.X86.Generator.OperandFlag; -using Cosmos.Assembler; -namespace Cosmos.Assembler.X86.Generator -{ - public enum OperandFlag - { - IF_SM , /* size match */ - IF_SM2 , /* size match first two operands */ - IF_SB , /* unsized operands can't be non-byte */ - IF_SW , /* unsized operands can't be non-word */ - IF_SD , /* unsized operands can't be non-dword */ - IF_SQ , /* unsized operands can't be non-qword */ - IF_SO , /* unsized operands can't be non-oword */ - IF_SY , /* unsized operands can't be non-yword */ - IF_SZ , /* unsized operands must match the bitsize */ - IF_SMASK , /* mask for unsized argument size */ - IF_AR0 , /* SB, SW, SD applies to argument 0 */ - IF_AR1 , /* SB, SW, SD applies to argument 1 */ - IF_AR2 , /* SB, SW, SD applies to argument 2 */ - IF_AR3 , /* SB, SW, SD applies to argument 3 */ - IF_ARMASK , /* mask for unsized argument spec */ - IF_ARSHFT , /* LSB in IF_ARMASK */ - IF_PRIV , /* it's a privileged instruction */ - IF_SMM , /* it's only valid in SMM */ - IF_PROT , /* it's protected mode only */ - IF_NOLONG , /* it's not available in long mode */ - IF_UNDOC , /* it's an undocumented instruction */ - IF_FPU , /* it's an FPU instruction */ - IF_MMX , /* it's an MMX instruction */ - IF_3DNOW , /* it's a 3DNow! instruction */ - IF_SSE , /* it's a SSE (KNI, MMX2) instruction */ - IF_SSE2 , /* it's a SSE2 instruction */ - IF_SSE3 , /* it's a SSE3 (PNI) instruction */ - IF_VMX , /* it's a VMX instruction */ - IF_LONG , /* long mode instruction */ - IF_SSSE3 , /* it's an SSSE3 instruction */ - IF_SSE4A , /* AMD SSE4a */ - IF_SSE41 , /* it's an SSE4.1 instruction */ - IF_SSE42 , /* HACK NEED TO REORGANIZE THESE BITS */ - IF_SSE5 , /* HACK NEED TO REORGANIZE THESE BITS */ - IF_AVX , /* HACK NEED TO REORGANIZE THESE BITS */ - IF_FMA , /* HACK NEED TO REORGANIZE THESE BITS */ - - IF_8086 , /* 8086 instruction */ - IF_186 , /* 186+ instruction */ - IF_286 , /* 286+ instruction */ - IF_386 , /* 386+ instruction */ - IF_486 , /* 486+ instruction */ - IF_PENT , /* Pentium instruction */ - IF_P6 , /* P6 instruction */ - IF_KATMAI , /* Katmai instructions */ - IF_WILLAMETTE , /* Willamette instructions */ - IF_PRESCOTT , /* Prescott instructions */ - IF_X86_64 , /* x86-64 instruction (long or legacy mode) */ - IF_NEHALEM , /* Nehalem instruction */ - IF_WESTMERE , /* Westmere instruction */ - IF_SANDYBRIDGE , /* Sandy Bridge instruction */ - IF_FUTURE, /* Future processor (not yet disclosed) */ - IF_X64, - IF_IA64 , /* IA64 instructions (in x86 mode) */ - IF_CYRIX , /* Cyrix-specific instruction */ - IF_AMD , /* AMD-specific instruction */ - NONE, -} - public class OpCodeData - { - /* Size, and other attributes, of the operand */ - public const ulong BITS8 = 0x00000001U; - public const ulong BITS16 = 0x00000002U; - public const ulong BITS32 = 0x00000004U; - public const ulong BITS64 = 0x00000008U; /* x64 and FPU only */ - public const ulong BITS80 = 0x00000010U; /* FPU only */ - public const ulong BITS128 = 0x20000000U; - public const ulong BITS256 = 0x00800000U; - public const ulong FAR = 0x00000020U; /* grotty: this means 16:16 or */ - /* 16:32, like in CALL/JMP */ - public const ulong NEAR = 0x00000040U; - public const ulong SHORT = 0x00000080U; /* and this means what it says :) */ - - public const ulong SIZE_MASK = 0x208000FFU; /* all the size attributes */ - - /* Modifiers */ - public const ulong MODIFIER_MASK = 0x00000f00U; - public const ulong TO = 0x00000100U; /* reverse effect in FADD, FSUB &c */ - public const ulong COLON = 0x00000200U; /* operand is followed by a colon */ - public const ulong STRICT = 0x00000400U; /* do not optimize this operand */ - - /* Type of operand: memory reference, register, etc. */ - public const ulong OPTYPE_MASK = 0x0000f000U; - public const ulong REGISTER = 0x00001000U; /* register number in 'basereg' */ - public const ulong IMMEDIATE = 0x00002000U; - public const ulong MEMORY = 0x0000c000U; - public const ulong REGMEM = 0x00008000U; /* for r/m, ie EA, operands */ - - /* Register classes */ - public const ulong REG_EA = 0x00009000U; /* 'normal' reg, qualifies as EA */ - public const ulong RM_GPR = 0x00208000U; /* integer operand */ - public const ulong REG_GPR = 0x00209000U; /* integer register */ - public const ulong REG8 = 0x00209001U; /* 8-bit GPR */ - public const ulong REG16 = 0x00209002U; /* 16-bit GPR */ - public const ulong REG32 = 0x00209004U; /* 32-bit GPR */ - public const ulong REG64 = 0x00209008U; /* 64-bit GPR */ - public const ulong FPUREG = 0x01001000U; /* floating point stack registers */ - public const ulong FPU0 = 0x01011000U; /* FPU stack register zero */ - public const ulong RM_MMX = 0x02008000U; /* MMX operand */ - public const ulong MMXREG = 0x02009000U; /* MMX register */ - public const ulong RM_XMM = 0x04008000U; /* XMM (SSE) operand */ - public const ulong XMMREG = 0x04009000U; /* XMM (SSE) register */ - public const ulong XMM0 = 0x04019000U; /* XMM register zero */ - public const ulong RM_YMM = 0x08008000U; /* YMM (AVX) operand */ - public const ulong YMMREG = 0x08009000U; /* YMM (AVX) register */ - public const ulong YMM0 = 0x08019000U; /* YMM register zero */ - public const ulong REG_CDT = 0x00101004U; /* CRn, DRn and TRn */ - public const ulong REG_CREG = 0x00111004U; /* CRn */ - public const ulong REG_DREG = 0x00121004U; /* DRn */ - public const ulong REG_TREG = 0x00141004U; /* TRn */ - public const ulong REG_SREG = 0x00401002U; /* any segment register */ - public const ulong REG_CS = 0x00411002U; /* CS */ - public const ulong REG_DESS = 0x00421002U; /* DS, ES, SS */ - public const ulong REG_FSGS = 0x00441002U; /* FS, GS */ - public const ulong REG_SEG67 = 0x00481002U; /* Unimplemented segment registers */ - - public const ulong REG_RIP = 0x00801008U; /* RIP relative addressing */ - public const ulong REG_EIP = 0x00801004U; /* EIP relative addressing */ - - /* Special GPRs */ - public const ulong REG_SMASK = 0x100f0000U; /* a mask for the following */ - public const ulong REG_ACCUM = 0x00219000U; /* accumulator: AL, AX, EAX, RAX */ - public const ulong REG_AL = 0x00219001U; - public const ulong REG_AX = 0x00219002U; - public const ulong REG_EAX = 0x00219004U; - public const ulong REG_RAX = 0x00219008U; - public const ulong REG_COUNT = 0x10229000U; /* counter: CL, CX, ECX, RCX */ - public const ulong REG_CL = 0x10229001U; - public const ulong REG_CX = 0x10229002U; - public const ulong REG_ECX = 0x10229004U; - public const ulong REG_RCX = 0x10229008U; - public const ulong REG_DL = 0x10249001U; /* data: DL, DX, EDX, RDX */ - public const ulong REG_DX = 0x10249002U; - public const ulong REG_EDX = 0x10249004U; - public const ulong REG_RDX = 0x10249008U; - public const ulong REG_HIGH = 0x10289001U; /* high regs: AH, CH, DH, BH */ - public const ulong REG_NOTACC = 0x10000000U; /* non-accumulator register */ - public const ulong REG8NA = 0x10209001U; /* 8-bit non-acc GPR */ - public const ulong REG16NA = 0x10209002U; /* 16-bit non-acc GPR */ - public const ulong REG32NA = 0x10209004U; /* 32-bit non-acc GPR */ - public const ulong REG64NA = 0x10209008U; /* 64-bit non-acc GPR */ - - /* special types of EAs */ - public const ulong MEM_OFFS = 0x0001c000U; /* simple [address] offset - absolute! */ - public const ulong IP_REL = 0x0002c000U; /* IP-relative offset */ - - /* memory which matches any type of r/m operand */ - public const ulong MEMORY_ANY = ( MEMORY | RM_GPR | RM_MMX | RM_XMM | RM_YMM ); - - /* special type of immediate operand */ - public const ulong UNITY = 0x00012000U; /* for shift/rotate instructions */ - public const ulong SBYTE16 = 0x00022000U; /* for op r16,immediate instrs. */ - public const ulong SBYTE32 = 0x00042000U; /* for op r32,immediate instrs. */ - public const ulong SBYTE64 = 0x00082000U; /* for op r64,immediate instrs. */ - public const ulong BYTENESS = 0x000E0000U; /* for testing for byteness */ - - public const ulong SAME_AS = 0x40000000U; - public struct itemplate - { - public OCE opcode; /* the token, passed from "parser.c" */ - public int operands; /* number of operands */ - public ulong[] opd; /* bit flags for operand types */ - public int code; /* the code it assembles to */ - public OperandFlag flag1; /* some flags */ - public OperandFlag flag2; /* some flags */ - public OperandFlag flag3; /* some flags */ - public OperandFlag flag4; - public OperandFlag flag5; - - public itemplate( OCE aOpCode, int aOperandCount, ulong[] aOperands, int OpCodeAdress, OperandFlag aFlags ) - { - opcode = aOpCode; - operands = aOperandCount; - opd = aOperands; - code = OpCodeAdress; - flag1 = aFlags; - flag2 = OF.NONE; - flag3 = OF.NONE; - flag4 = OF.NONE; - flag5 = OF.NONE; - } - public itemplate( OCE aOpCode, int aOperandCount, ulong[] aOperands, int OpCodeAdress, OperandFlag aFlag1, OperandFlag aFlag2 ) - { - opcode = aOpCode; - operands = aOperandCount; - opd = aOperands; - code = OpCodeAdress; - flag1 = aFlag1; - flag2 = aFlag2; - flag3 = OF.NONE; - flag4 = OF.NONE; - flag5 = OF.NONE; - } - public itemplate( OCE aOpCode, int aOperandCount, ulong[] aOperands, int OpCodeAdress, OperandFlag aFlag1, OperandFlag aFlag2, OperandFlag aFlag3 ) - { - opcode = aOpCode; - operands = aOperandCount; - opd = aOperands; - code = OpCodeAdress; - flag1 = aFlag1; - flag2 = aFlag2; - flag3 = aFlag3; - flag4 = OF.NONE; - flag5 = OF.NONE; - } - public itemplate( OCE aOpCode, int aOperandCount, ulong[] aOperands, int OpCodeAdress, OperandFlag aFlag1, OperandFlag aFlag2, OperandFlag aFlag3, OperandFlag aFlag4 ) - { - opcode = aOpCode; - operands = aOperandCount; - opd = aOperands; - code = OpCodeAdress; - flag1 = aFlag1; - flag2 = aFlag2; - flag3 = aFlag3; - flag4 = aFlag4; - flag5 = OF.NONE; - } - - public itemplate( OCE aOpCode, int aOperandCount, ulong[] aOperands, int OpCodeAdress, OperandFlag aFlag1, OperandFlag aFlag2, OperandFlag aFlag3, OperandFlag aFlag4, OperandFlag aFlag5 ) - { - opcode = aOpCode; - operands = aOperandCount; - opd = aOperands; - code = OpCodeAdress; - flag1 = aFlag1; - flag2 = aFlag2; - flag3 = aFlag3; - flag4 = aFlag4; - flag5 = aFlag5; - } - - }; - - static itemplate[] instrux_AAA = new[] - { - new itemplate(OCE.AAA, 0, new ulong[]{0,0,0,0,0} ,22095, OF.IF_8086, OF.IF_NOLONG), - }; - - static itemplate[] instrux_AAD = new[] - { - new itemplate(OCE.AAD, 0, new ulong[] {0,0,0,0,0} ,21047, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.AAD, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21051, OF.IF_8086, OF.IF_SB, OF.IF_NOLONG), - }; - - static itemplate[] instrux_AAM = new[] - { - new itemplate(OCE.AAM, 0, new ulong[] {0,0,0,0,0} ,21055, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.AAM, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21059, OF.IF_8086, OF.IF_SB, OF.IF_NOLONG), - }; - - static itemplate[] instrux_AAS = new[] - { - new itemplate(OCE.AAS, 0, new ulong[] {0,0,0,0,0} ,22098, OF.IF_8086, OF.IF_NOLONG), - - }; - - static itemplate[] instrux_ADC = new[] - { - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21063, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG8,REG8,0,0,0} ,21063, OF.IF_8086), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,REG16,0,0,0} ,19167, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG16,REG16,0,0,0} ,19167, OF.IF_8086), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,REG32,0,0,0} ,19172, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG32,REG32,0,0,0} ,19172, OF.IF_386), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,REG64,0,0,0} ,19177, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG64,REG64,0,0,0} ,19177, OF.IF_X64), - new itemplate(OCE.ADC, 2, new ulong[] {REG8,MEMORY,0,0,0} ,12405, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG8,REG8,0,0,0} ,12405, OF.IF_8086), - new itemplate(OCE.ADC, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19182, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG16,REG16,0,0,0} ,19182, OF.IF_8086), - new itemplate(OCE.ADC, 2, new ulong[] {REG32,MEMORY,0,0,0} ,19187, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG32,REG32,0,0,0} ,19187, OF.IF_386), - new itemplate(OCE.ADC, 2, new ulong[] {REG64,MEMORY,0,0,0} ,19192, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG64,REG64,0,0,0} ,19192, OF.IF_X64), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,15657, OF.IF_8086), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,15663, OF.IF_386), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,15669, OF.IF_X64), - new itemplate(OCE.ADC, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21067, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,15657, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,19197, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,15663, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,19202, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,15669, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,19207, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,19212, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,15675, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,15681, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,15687, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,19212, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,15675, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADC, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,15681, OF.IF_386, OF.IF_SM), - }; - - static itemplate[] instrux_ADD = new[] - { - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21701, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG8,REG8,0,0,0} ,21071, OF.IF_8086), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,REG16,0,0,0} ,19217, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG16,REG16,0,0,0} ,19217, OF.IF_8086), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,REG32,0,0,0} ,19222, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG32,REG32,0,0,0} ,19222, OF.IF_386), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,REG64,0,0,0} ,19227, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG64,REG64,0,0,0} ,19227, OF.IF_X64), - new itemplate(OCE.ADD, 2, new ulong[] {REG8,MEMORY,0,0,0} ,13056, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG8,REG8,0,0,0} ,13056, OF.IF_8086), - new itemplate(OCE.ADD, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19232, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG16,REG16,0,0,0} ,19232, OF.IF_8086), - new itemplate(OCE.ADD, 2, new ulong[] {REG32,MEMORY,0,0,0} ,19237, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG32,REG32,0,0,0} ,19237, OF.IF_386), - new itemplate(OCE.ADD, 2, new ulong[] {REG64,MEMORY,0,0,0} ,19242, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG64,REG64,0,0,0} ,19242, OF.IF_X64), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,15693, OF.IF_8086), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,15699, OF.IF_386), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,15705, OF.IF_X64), - new itemplate(OCE.ADD, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21075, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,15693, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,19247, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,15699, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,19252, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,15705, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,19257, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,19262, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,15711, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,15717, OF.IF_386, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,15723, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,19262, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,15711, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.ADD, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,15717, OF.IF_386, OF.IF_SM), - }; - - static itemplate[] instrux_ADDPD = new[] { - new itemplate(OCE.ADDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17601, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_ADDPS = new[] { - new itemplate(OCE.ADDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16887, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_ADDSD = new[] { - new itemplate(OCE.ADDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17607, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - -}; - - static itemplate[] instrux_ADDSS = new[] { - new itemplate(OCE.ADDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16893, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD), - -}; - - static itemplate[] instrux_ADDSUBPD = new[] { - new itemplate(OCE.ADDSUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17877, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_ADDSUBPS = new[] { - new itemplate(OCE.ADDSUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17883, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_AESDEC = new[] { - new itemplate(OCE.AESDEC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10904, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AESDECLAST = new[] { - new itemplate(OCE.AESDECLAST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10911, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AESENC = new[] { - new itemplate(OCE.AESENC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10890, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AESENCLAST = new[] { - new itemplate(OCE.AESENCLAST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10897, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AESIMC = new[] { - new itemplate(OCE.AESIMC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10918, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AESKEYGENASSIST = new[] { - new itemplate(OCE.AESKEYGENASSIST, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7388, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_AND = new[] { - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21079, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG8,REG8,0,0,0} ,21079, OF.IF_8086), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,REG16,0,0,0} ,19267, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG16,REG16,0,0,0} ,19267, OF.IF_8086), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,REG32,0,0,0} ,19272, OF.IF_386, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG32,REG32,0,0,0} ,19272, OF.IF_386), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,REG64,0,0,0} ,19277, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG64,REG64,0,0,0} ,19277, OF.IF_X64), - new itemplate(OCE.AND, 2, new ulong[] {REG8,MEMORY,0,0,0} ,13343, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG8,REG8,0,0,0} ,13343, OF.IF_8086), - new itemplate(OCE.AND, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19282, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG16,REG16,0,0,0} ,19282, OF.IF_8086), - new itemplate(OCE.AND, 2, new ulong[] {REG32,MEMORY,0,0,0} ,19287, OF.IF_386, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG32,REG32,0,0,0} ,19287, OF.IF_386), - new itemplate(OCE.AND, 2, new ulong[] {REG64,MEMORY,0,0,0} ,19292, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG64,REG64,0,0,0} ,19292, OF.IF_X64), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,15729, OF.IF_8086), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,15735, OF.IF_386), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,15741, OF.IF_X64), - new itemplate(OCE.AND, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21083, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,15729, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,19297, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,15735, OF.IF_386, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,19302, OF.IF_386, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,15741, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,19307, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,19312, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,15747, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,15753, OF.IF_386, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,15759, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,19312, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,15747, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.AND, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,15753, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_ANDNPD = new[] { - new itemplate(OCE.ANDNPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17613, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_ANDNPS = new[] { - new itemplate(OCE.ANDNPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16899, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_ANDPD = new[] { - new itemplate(OCE.ANDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17619, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_ANDPS = new[] { - new itemplate(OCE.ANDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16905, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_ARPL = new[] { - new itemplate(OCE.ARPL, 2, new ulong[] {MEMORY,REG16,0,0,0} ,21087, OF.IF_286, OF.IF_PROT, OF.IF_SM, OF.IF_NOLONG), - new itemplate(OCE.ARPL, 2, new ulong[] {REG16,REG16,0,0,0} ,21087, OF.IF_286, OF.IF_PROT, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_BB0_RESET = new[] { - new itemplate(OCE.BB0_RESET, 0, new ulong[] {0,0,0,0,0} ,21091, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_BB1_RESET = new[] { - new itemplate(OCE.BB1_RESET, 0, new ulong[] {0,0,0,0,0} ,21095, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_BLENDPD = new[] { - new itemplate(OCE.BLENDPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7092, OF.IF_SSE41), - -}; - - static itemplate[] instrux_BLENDPS = new[] { - new itemplate(OCE.BLENDPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7100, OF.IF_SSE41), - -}; - - static itemplate[] instrux_BLENDVPD = new[] { - new itemplate(OCE.BLENDVPD, 3, new ulong[] {XMMREG,RM_XMM,XMM0,0,0} ,9651, OF.IF_SSE41), - -}; - - static itemplate[] instrux_BLENDVPS = new[] { - new itemplate(OCE.BLENDVPS, 3, new ulong[] {XMMREG,RM_XMM,XMM0,0,0} ,9658, OF.IF_SSE41), - -}; - - static itemplate[] instrux_BOUND = new[] { - new itemplate(OCE.BOUND, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19317, OF.IF_186, OF.IF_NOLONG), - new itemplate(OCE.BOUND, 2, new ulong[] {REG32,MEMORY,0,0,0} ,19322, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_BSF = new[] { - new itemplate(OCE.BSF, 2, new ulong[] {REG16,MEMORY,0,0,0} ,15765, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BSF, 2, new ulong[] {REG16,REG16,0,0,0} ,15765, OF.IF_386), - new itemplate(OCE.BSF, 2, new ulong[] {REG32,MEMORY,0,0,0} ,15771, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BSF, 2, new ulong[] {REG32,REG32,0,0,0} ,15771, OF.IF_386), - new itemplate(OCE.BSF, 2, new ulong[] {REG64,MEMORY,0,0,0} ,15777, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BSF, 2, new ulong[] {REG64,REG64,0,0,0} ,15777, OF.IF_X64), - -}; - - static itemplate[] instrux_BSR = new[] { - new itemplate(OCE.BSR, 2, new ulong[] {REG16,MEMORY,0,0,0} ,15783, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BSR, 2, new ulong[] {REG16,REG16,0,0,0} ,15783, OF.IF_386), - new itemplate(OCE.BSR, 2, new ulong[] {REG32,MEMORY,0,0,0} ,15789, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BSR, 2, new ulong[] {REG32,REG32,0,0,0} ,15789, OF.IF_386), - new itemplate(OCE.BSR, 2, new ulong[] {REG64,MEMORY,0,0,0} ,15795, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BSR, 2, new ulong[] {REG64,REG64,0,0,0} ,15795, OF.IF_X64), - -}; - - static itemplate[] instrux_BSWAP = new[] { - new itemplate(OCE.BSWAP, 1, new ulong[] {REG32,0,0,0,0} ,15801, OF.IF_486), - new itemplate(OCE.BSWAP, 1, new ulong[] {REG64,0,0,0,0} ,15807, OF.IF_X64), - -}; - - static itemplate[] instrux_BT = new[] { - new itemplate(OCE.BT, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15813, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BT, 2, new ulong[] {REG16,REG16,0,0,0} ,15813, OF.IF_386), - new itemplate(OCE.BT, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15819, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BT, 2, new ulong[] {REG32,REG32,0,0,0} ,15819, OF.IF_386), - new itemplate(OCE.BT, 2, new ulong[] {MEMORY,REG64,0,0,0} ,15825, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BT, 2, new ulong[] {REG64,REG64,0,0,0} ,15825, OF.IF_X64), - new itemplate(OCE.BT, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,8468, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BT, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,8475, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BT, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,8482, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_BTC = new[] { - new itemplate(OCE.BTC, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15831, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTC, 2, new ulong[] {REG16,REG16,0,0,0} ,15831, OF.IF_386), - new itemplate(OCE.BTC, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15837, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTC, 2, new ulong[] {REG32,REG32,0,0,0} ,15837, OF.IF_386), - new itemplate(OCE.BTC, 2, new ulong[] {MEMORY,REG64,0,0,0} ,15843, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BTC, 2, new ulong[] {REG64,REG64,0,0,0} ,15843, OF.IF_X64), - new itemplate(OCE.BTC, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,8489, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTC, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,8496, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTC, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,8503, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_BTR = new[] { - new itemplate(OCE.BTR, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15849, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTR, 2, new ulong[] {REG16,REG16,0,0,0} ,15849, OF.IF_386), - new itemplate(OCE.BTR, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15855, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTR, 2, new ulong[] {REG32,REG32,0,0,0} ,15855, OF.IF_386), - new itemplate(OCE.BTR, 2, new ulong[] {MEMORY,REG64,0,0,0} ,15861, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BTR, 2, new ulong[] {REG64,REG64,0,0,0} ,15861, OF.IF_X64), - new itemplate(OCE.BTR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,8510, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,8517, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,8524, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_BTS = new[] { - new itemplate(OCE.BTS, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15867, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTS, 2, new ulong[] {REG16,REG16,0,0,0} ,15867, OF.IF_386), - new itemplate(OCE.BTS, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15873, OF.IF_386, OF.IF_SM), - new itemplate(OCE.BTS, 2, new ulong[] {REG32,REG32,0,0,0} ,15873, OF.IF_386), - new itemplate(OCE.BTS, 2, new ulong[] {MEMORY,REG64,0,0,0} ,15879, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.BTS, 2, new ulong[] {REG64,REG64,0,0,0} ,15879, OF.IF_X64), - new itemplate(OCE.BTS, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,8531, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTS, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,8538, OF.IF_386, OF.IF_SB), - new itemplate(OCE.BTS, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,8545, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_CALL = new[] { - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19327, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, NEAR,0,0,0,0} ,19327, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, FAR,0,0,0,0} ,15885, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS16,0,0,0,0} ,19332, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS16, NEAR,0,0,0,0} ,19332, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS16, FAR,0,0,0,0} ,15891, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS32,0,0,0,0} ,19337, OF.IF_386), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS32, NEAR,0,0,0,0} ,19337, OF.IF_386), - new itemplate(OCE.CALL, 1, new ulong[] {IMMEDIATE, BITS32, FAR,0,0,0,0} ,15897, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE,0,0,0} ,15903, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 2, new ulong[] {IMMEDIATE, BITS16, COLON,IMMEDIATE,0,0,0} ,15909, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE, BITS16,0,0,0} ,15909, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 2, new ulong[] {IMMEDIATE, BITS32, COLON,IMMEDIATE,0,0,0} ,15915, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE, BITS32,0,0,0} ,15915, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, FAR,0,0,0,0} ,19342, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, FAR,0,0,0,0} ,19347, OF.IF_X64), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS16, FAR,0,0,0,0} ,19352, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS32, FAR,0,0,0,0} ,19357, OF.IF_386), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS64, FAR,0,0,0,0} ,19347, OF.IF_X64), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, NEAR,0,0,0,0} ,19362, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS16, NEAR,0,0,0,0} ,19367, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS32, NEAR,0,0,0,0} ,19372, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS64, NEAR,0,0,0,0} ,19377, OF.IF_X64), - new itemplate(OCE.CALL, 1, new ulong[] {REG16,0,0,0,0} ,19367, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {REG32,0,0,0,0} ,19372, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {REG64,0,0,0,0} ,19382, OF.IF_X64), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY,0,0,0,0} ,19362, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,19367, OF.IF_8086), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,19372, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.CALL, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,19382, OF.IF_X64), - -}; - - static itemplate[] instrux_CBW = new[] { - new itemplate(OCE.CBW, 0, new ulong[] {0,0,0,0,0} ,21099, OF.IF_8086), - -}; - - static itemplate[] instrux_CDQ = new[] { - new itemplate(OCE.CDQ, 0, new ulong[] {0,0,0,0,0} ,21103, OF.IF_386), - -}; - - static itemplate[] instrux_CDQE = new[] { - new itemplate(OCE.CDQE, 0, new ulong[] {0,0,0,0,0} ,21107, OF.IF_X64), - -}; - - static itemplate[] instrux_CLC = new[] { - new itemplate(OCE.CLC, 0, new ulong[] {0,0,0,0,0} ,20819, OF.IF_8086), - -}; - - static itemplate[] instrux_CLD = new[] { - new itemplate(OCE.CLD, 0, new ulong[] {0,0,0,0,0} ,22101, OF.IF_8086), - -}; - - static itemplate[] instrux_CLFLUSH = new[] { - new itemplate(OCE.CLFLUSH, 1, new ulong[] {MEMORY,0,0,0,0} ,20992, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CLGI = new[] { - new itemplate(OCE.CLGI, 0, new ulong[] {0,0,0,0,0} ,19387, OF.IF_X64, OF.IF_AMD), - -}; - - static itemplate[] instrux_CLI = new[] { - new itemplate(OCE.CLI, 0, new ulong[] {0,0,0,0,0} ,22104, OF.IF_8086), - -}; - - static itemplate[] instrux_CLTS = new[] { - new itemplate(OCE.CLTS, 0, new ulong[] {0,0,0,0,0} ,21111, OF.IF_286, OF.IF_PRIV), - -}; - - static itemplate[] instrux_CMC = new[] { - new itemplate(OCE.CMC, 0, new ulong[] {0,0,0,0,0} ,22107, OF.IF_8086), - -}; - - static itemplate[] instrux_CMP = new[] { - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21115, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG8,REG8,0,0,0} ,21115, OF.IF_8086), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,REG16,0,0,0} ,19392, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG16,REG16,0,0,0} ,19392, OF.IF_8086), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,REG32,0,0,0} ,19397, OF.IF_386, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG32,REG32,0,0,0} ,19397, OF.IF_386), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,REG64,0,0,0} ,19402, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG64,REG64,0,0,0} ,19402, OF.IF_X64), - new itemplate(OCE.CMP, 2, new ulong[] {REG8,MEMORY,0,0,0} ,13301, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG8,REG8,0,0,0} ,13301, OF.IF_8086), - new itemplate(OCE.CMP, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19407, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG16,REG16,0,0,0} ,19407, OF.IF_8086), - new itemplate(OCE.CMP, 2, new ulong[] {REG32,MEMORY,0,0,0} ,19412, OF.IF_386, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG32,REG32,0,0,0} ,19412, OF.IF_386), - new itemplate(OCE.CMP, 2, new ulong[] {REG64,MEMORY,0,0,0} ,19417, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG64,REG64,0,0,0} ,19417, OF.IF_X64), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,15921, OF.IF_8086), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,15927, OF.IF_386), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,15933, OF.IF_X64), - new itemplate(OCE.CMP, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21119, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,15921, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,19422, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,15927, OF.IF_386, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,19427, OF.IF_386, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,15933, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,19432, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,19437, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,15939, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,15945, OF.IF_386, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,15951, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,19437, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,15939, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.CMP, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,15945, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_CMPEQPD = new[] { - new itemplate(OCE.CMPEQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6916, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPEQPS = new[] { - new itemplate(OCE.CMPEQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6740, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPEQSD = new[] { - new itemplate(OCE.CMPEQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6924, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPEQSS = new[] { - new itemplate(OCE.CMPEQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6748, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPLEPD = new[] { - new itemplate(OCE.CMPLEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6932, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPLEPS = new[] { - new itemplate(OCE.CMPLEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6756, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPLESD = new[] { - new itemplate(OCE.CMPLESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6940, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPLESS = new[] { - new itemplate(OCE.CMPLESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6764, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPLTPD = new[] { - new itemplate(OCE.CMPLTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6948, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPLTPS = new[] { - new itemplate(OCE.CMPLTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6772, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPLTSD = new[] { - new itemplate(OCE.CMPLTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6956, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPLTSS = new[] { - new itemplate(OCE.CMPLTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6780, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNEQPD = new[] { - new itemplate(OCE.CMPNEQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6964, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPNEQPS = new[] { - new itemplate(OCE.CMPNEQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6788, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNEQSD = new[] { - new itemplate(OCE.CMPNEQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6972, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPNEQSS = new[] { - new itemplate(OCE.CMPNEQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6796, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNLEPD = new[] { - new itemplate(OCE.CMPNLEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6980, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPNLEPS = new[] { - new itemplate(OCE.CMPNLEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6804, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNLESD = new[] { - new itemplate(OCE.CMPNLESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6988, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPNLESS = new[] { - new itemplate(OCE.CMPNLESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6812, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNLTPD = new[] { - new itemplate(OCE.CMPNLTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6996, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPNLTPS = new[] { - new itemplate(OCE.CMPNLTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6820, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPNLTSD = new[] { - new itemplate(OCE.CMPNLTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,7004, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPNLTSS = new[] { - new itemplate(OCE.CMPNLTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6828, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPORDPD = new[] { - new itemplate(OCE.CMPORDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,7012, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPORDPS = new[] { - new itemplate(OCE.CMPORDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6836, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPORDSD = new[] { - new itemplate(OCE.CMPORDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,7020, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPORDSS = new[] { - new itemplate(OCE.CMPORDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6844, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPPD = new[] { - new itemplate(OCE.CMPPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,9357, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_CMPPS = new[] { - new itemplate(OCE.CMPPS, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9098, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.CMPPS, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9098, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_CMPSB = new[] { - new itemplate(OCE.CMPSB, 0, new ulong[] {0,0,0,0,0} ,21123, OF.IF_8086), - -}; - - static itemplate[] instrux_CMPSD = new[] { - new itemplate(OCE.CMPSD, 0, new ulong[] {0,0,0,0,0} ,19442, OF.IF_386), - new itemplate(OCE.CMPSD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,9364, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_CMPSQ = new[] { - new itemplate(OCE.CMPSQ, 0, new ulong[] {0,0,0,0,0} ,19447, OF.IF_X64), - -}; - - static itemplate[] instrux_CMPSS = new[] { - new itemplate(OCE.CMPSS, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9105, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.CMPSS, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9105, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_CMPSW = new[] { - new itemplate(OCE.CMPSW, 0, new ulong[] {0,0,0,0,0} ,19452, OF.IF_8086), - -}; - - static itemplate[] instrux_CMPUNORDPD = new[] { - new itemplate(OCE.CMPUNORDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,7028, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CMPUNORDPS = new[] { - new itemplate(OCE.CMPUNORDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6852, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPUNORDSD = new[] { - new itemplate(OCE.CMPUNORDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,7036, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_CMPUNORDSS = new[] { - new itemplate(OCE.CMPUNORDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,6860, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_CMPXCHG = new[] { - new itemplate(OCE.CMPXCHG, 2, new ulong[] {MEMORY,REG8,0,0,0} ,19457, OF.IF_PENT, OF.IF_SM), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {REG8,REG8,0,0,0} ,19457, OF.IF_PENT), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15957, OF.IF_PENT, OF.IF_SM), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {REG16,REG16,0,0,0} ,15957, OF.IF_PENT), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15963, OF.IF_PENT, OF.IF_SM), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {REG32,REG32,0,0,0} ,15963, OF.IF_PENT), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {MEMORY,REG64,0,0,0} ,15969, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMPXCHG, 2, new ulong[] {REG64,REG64,0,0,0} ,15969, OF.IF_X64), - -}; - - static itemplate[] instrux_CMPXCHG16B = new[] { - new itemplate(OCE.CMPXCHG16B, 1, new ulong[] {MEMORY,0,0,0,0} ,15987, OF.IF_X64), - -}; - - static itemplate[] instrux_CMPXCHG486 = new[] { - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {MEMORY,REG8,0,0,0} ,19462, OF.IF_486, OF.IF_SM, OF.IF_UNDOC), - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {REG8,REG8,0,0,0} ,19462, OF.IF_486, OF.IF_UNDOC), - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15975, OF.IF_486, OF.IF_SM, OF.IF_UNDOC), - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {REG16,REG16,0,0,0} ,15975, OF.IF_486, OF.IF_UNDOC), - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15981, OF.IF_486, OF.IF_SM, OF.IF_UNDOC), - new itemplate(OCE.CMPXCHG486, 2, new ulong[] {REG32,REG32,0,0,0} ,15981, OF.IF_486, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_CMPXCHG8B = new[] { - new itemplate(OCE.CMPXCHG8B, 1, new ulong[] {MEMORY,0,0,0,0} ,15988, OF.IF_PENT), - -}; - - static itemplate[] instrux_COMEQPD = new[] { - new itemplate(OCE.COMEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,198, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMEQPS = new[] { - new itemplate(OCE.COMEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,54, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMEQSD = new[] { - new itemplate(OCE.COMEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,486, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMEQSS = new[] { - new itemplate(OCE.COMEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,342, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMFALSEPD = new[] { - new itemplate(OCE.COMFALSEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,297, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMFALSEPS = new[] { - new itemplate(OCE.COMFALSEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,153, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMFALSESD = new[] { - new itemplate(OCE.COMFALSESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,585, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMFALSESS = new[] { - new itemplate(OCE.COMFALSESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,441, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMISD = new[] { - new itemplate(OCE.COMISD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17625, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_COMISS = new[] { - new itemplate(OCE.COMISS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16911, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_COMLEPD = new[] { - new itemplate(OCE.COMLEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,216, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMLEPS = new[] { - new itemplate(OCE.COMLEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,72, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMLESD = new[] { - new itemplate(OCE.COMLESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,504, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMLESS = new[] { - new itemplate(OCE.COMLESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,360, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMLTPD = new[] { - new itemplate(OCE.COMLTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,207, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMLTPS = new[] { - new itemplate(OCE.COMLTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,63, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMLTSD = new[] { - new itemplate(OCE.COMLTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,495, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMLTSS = new[] { - new itemplate(OCE.COMLTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,351, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMNEQPD = new[] { - new itemplate(OCE.COMNEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,306, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNEQPS = new[] { - new itemplate(OCE.COMNEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,162, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNEQSD = new[] { - new itemplate(OCE.COMNEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,594, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMNEQSS = new[] { - new itemplate(OCE.COMNEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,450, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMNLEPD = new[] { - new itemplate(OCE.COMNLEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,324, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNLEPS = new[] { - new itemplate(OCE.COMNLEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,180, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNLESD = new[] { - new itemplate(OCE.COMNLESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,612, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMNLESS = new[] { - new itemplate(OCE.COMNLESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,468, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMNLTPD = new[] { - new itemplate(OCE.COMNLTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,315, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNLTPS = new[] { - new itemplate(OCE.COMNLTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,171, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMNLTSD = new[] { - new itemplate(OCE.COMNLTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,603, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMNLTSS = new[] { - new itemplate(OCE.COMNLTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,459, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMORDPD = new[] { - new itemplate(OCE.COMORDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,261, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMORDPS = new[] { - new itemplate(OCE.COMORDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,117, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMORDSD = new[] { - new itemplate(OCE.COMORDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,549, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMORDSS = new[] { - new itemplate(OCE.COMORDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,405, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMPD = new[] { - new itemplate(OCE.COMPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7252, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMPS = new[] { - new itemplate(OCE.COMPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7244, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMSD = new[] { - new itemplate(OCE.COMSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7268, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMSS = new[] { - new itemplate(OCE.COMSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7260, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMTRUEPD = new[] { - new itemplate(OCE.COMTRUEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,333, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMTRUEPS = new[] { - new itemplate(OCE.COMTRUEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,189, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMTRUESD = new[] { - new itemplate(OCE.COMTRUESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,621, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMTRUESS = new[] { - new itemplate(OCE.COMTRUESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,477, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMUEQPD = new[] { - new itemplate(OCE.COMUEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,270, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUEQPS = new[] { - new itemplate(OCE.COMUEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,126, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUEQSD = new[] { - new itemplate(OCE.COMUEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,558, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMUEQSS = new[] { - new itemplate(OCE.COMUEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,414, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMULEPD = new[] { - new itemplate(OCE.COMULEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,288, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMULEPS = new[] { - new itemplate(OCE.COMULEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,144, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMULESD = new[] { - new itemplate(OCE.COMULESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,576, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMULESS = new[] { - new itemplate(OCE.COMULESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,432, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMULTPD = new[] { - new itemplate(OCE.COMULTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,279, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMULTPS = new[] { - new itemplate(OCE.COMULTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,135, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMULTSD = new[] { - new itemplate(OCE.COMULTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,567, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMULTSS = new[] { - new itemplate(OCE.COMULTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,423, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMUNEQPD = new[] { - new itemplate(OCE.COMUNEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,234, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNEQPS = new[] { - new itemplate(OCE.COMUNEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,90, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNEQSD = new[] { - new itemplate(OCE.COMUNEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,522, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMUNEQSS = new[] { - new itemplate(OCE.COMUNEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,378, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMUNLEPD = new[] { - new itemplate(OCE.COMUNLEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,252, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNLEPS = new[] { - new itemplate(OCE.COMUNLEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,108, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNLESD = new[] { - new itemplate(OCE.COMUNLESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,540, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMUNLESS = new[] { - new itemplate(OCE.COMUNLESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,396, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMUNLTPD = new[] { - new itemplate(OCE.COMUNLTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,243, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNLTPS = new[] { - new itemplate(OCE.COMUNLTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,99, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNLTSD = new[] { - new itemplate(OCE.COMUNLTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,531, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMUNLTSS = new[] { - new itemplate(OCE.COMUNLTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,387, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_COMUNORDPD = new[] { - new itemplate(OCE.COMUNORDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,225, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNORDPS = new[] { - new itemplate(OCE.COMUNORDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,81, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_COMUNORDSD = new[] { - new itemplate(OCE.COMUNORDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,513, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_COMUNORDSS = new[] { - new itemplate(OCE.COMUNORDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,369, OF.IF_SSE5, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_CPUID = new[] { - new itemplate(OCE.CPUID, 0, new ulong[] {0,0,0,0,0} ,21127, OF.IF_PENT), - -}; - - static itemplate[] instrux_CPU_READ = new[] { - new itemplate(OCE.CPU_READ, 0, new ulong[] {0,0,0,0,0} ,21131, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_CPU_WRITE = new[] { - new itemplate(OCE.CPU_WRITE, 0, new ulong[] {0,0,0,0,0} ,21135, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_CQO = new[] { - new itemplate(OCE.CQO, 0, new ulong[] {0,0,0,0,0} ,21139, OF.IF_X64), - -}; - - static itemplate[] instrux_CRC32 = new[] { - new itemplate(OCE.CRC32, 2, new ulong[] {REG32,RM_GPR, BITS8,0,0,0} ,7197, OF.IF_SSE42), - new itemplate(OCE.CRC32, 2, new ulong[] {REG32,RM_GPR, BITS16,0,0,0} ,7180, OF.IF_SSE42), - new itemplate(OCE.CRC32, 2, new ulong[] {REG32,RM_GPR, BITS32,0,0,0} ,7188, OF.IF_SSE42), - new itemplate(OCE.CRC32, 2, new ulong[] {REG64,RM_GPR, BITS8,0,0,0} ,7196, OF.IF_SSE42, OF.IF_X64), - new itemplate(OCE.CRC32, 2, new ulong[] {REG64,RM_GPR, BITS64,0,0,0} ,7204, OF.IF_SSE42, OF.IF_X64), - -}; - - static itemplate[] instrux_CVTDQ2PD = new[] { - new itemplate(OCE.CVTDQ2PD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17631, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTDQ2PS = new[] { - new itemplate(OCE.CVTDQ2PS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17637, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTPD2DQ = new[] { - new itemplate(OCE.CVTPD2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17643, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTPD2PI = new[] { - new itemplate(OCE.CVTPD2PI, 2, new ulong[] {MMXREG,RM_XMM,0,0,0} ,17649, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTPD2PS = new[] { - new itemplate(OCE.CVTPD2PS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17655, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTPH2PS = new[] { - new itemplate(OCE.CVTPH2PS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10729, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTPI2PD = new[] { - new itemplate(OCE.CVTPI2PD, 2, new ulong[] {XMMREG,RM_MMX,0,0,0} ,17661, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTPI2PS = new[] { - new itemplate(OCE.CVTPI2PS, 2, new ulong[] {XMMREG,RM_MMX,0,0,0} ,16917, OF.IF_KATMAI, OF.IF_SSE, OF.IF_MMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTPS2DQ = new[] { - new itemplate(OCE.CVTPS2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17667, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTPS2PD = new[] { - new itemplate(OCE.CVTPS2PD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17673, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTPS2PH = new[] { - new itemplate(OCE.CVTPS2PH, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,10736, OF.IF_SSE5, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTPS2PI = new[] { - new itemplate(OCE.CVTPS2PI, 2, new ulong[] {MMXREG,RM_XMM,0,0,0} ,16923, OF.IF_KATMAI, OF.IF_SSE, OF.IF_MMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTSD2SI = new[] { - new itemplate(OCE.CVTSD2SI, 2, new ulong[] {REG32,XMMREG,0,0,0} ,9372, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTSD2SI, 2, new ulong[] {REG32,MEMORY,0,0,0} ,9372, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTSD2SI, 2, new ulong[] {REG64,XMMREG,0,0,0} ,9371, OF.IF_X64, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTSD2SI, 2, new ulong[] {REG64,MEMORY,0,0,0} ,9371, OF.IF_X64, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - -}; - - static itemplate[] instrux_CVTSD2SS = new[] { - new itemplate(OCE.CVTSD2SS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17679, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTSI2SD = new[] { - new itemplate(OCE.CVTSI2SD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,9379, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSI2SD, 2, new ulong[] {XMMREG,RM_GPR, BITS32,0,0,0} ,9379, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSI2SD, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,9378, OF.IF_X64, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - -}; - - static itemplate[] instrux_CVTSI2SS = new[] { - new itemplate(OCE.CVTSI2SS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,9113, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSI2SS, 2, new ulong[] {XMMREG,RM_GPR, BITS32,0,0,0} ,9113, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSI2SS, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,9112, OF.IF_X64, OF.IF_SSE, OF.IF_SQ, OF.IF_AR1), - -}; - - static itemplate[] instrux_CVTSS2SD = new[] { - new itemplate(OCE.CVTSS2SD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17685, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SD), - -}; - - static itemplate[] instrux_CVTSS2SI = new[] { - new itemplate(OCE.CVTSS2SI, 2, new ulong[] {REG32,XMMREG,0,0,0} ,9120, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSS2SI, 2, new ulong[] {REG32,MEMORY,0,0,0} ,9120, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSS2SI, 2, new ulong[] {REG64,XMMREG,0,0,0} ,9119, OF.IF_X64, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTSS2SI, 2, new ulong[] {REG64,MEMORY,0,0,0} ,9119, OF.IF_X64, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - -}; - - static itemplate[] instrux_CVTTPD2DQ = new[] { - new itemplate(OCE.CVTTPD2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17697, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTTPD2PI = new[] { - new itemplate(OCE.CVTTPD2PI, 2, new ulong[] {MMXREG,RM_XMM,0,0,0} ,17691, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTTPS2DQ = new[] { - new itemplate(OCE.CVTTPS2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17703, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_CVTTPS2PI = new[] { - new itemplate(OCE.CVTTPS2PI, 2, new ulong[] {MMXREG,RM_XMM,0,0,0} ,16929, OF.IF_KATMAI, OF.IF_SSE, OF.IF_MMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_CVTTSD2SI = new[] { - new itemplate(OCE.CVTTSD2SI, 2, new ulong[] {REG32,XMMREG,0,0,0} ,9386, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTTSD2SI, 2, new ulong[] {REG32,MEMORY,0,0,0} ,9386, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTTSD2SI, 2, new ulong[] {REG64,XMMREG,0,0,0} ,9385, OF.IF_X64, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - new itemplate(OCE.CVTTSD2SI, 2, new ulong[] {REG64,MEMORY,0,0,0} ,9385, OF.IF_X64, OF.IF_SSE2, OF.IF_SQ, OF.IF_AR1), - -}; - - static itemplate[] instrux_CVTTSS2SI = new[] { - new itemplate(OCE.CVTTSS2SI, 2, new ulong[] {REG32,RM_XMM,0,0,0} ,9127, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - new itemplate(OCE.CVTTSS2SI, 2, new ulong[] {REG64,RM_XMM,0,0,0} ,9126, OF.IF_X64, OF.IF_SSE, OF.IF_SD, OF.IF_AR1), - -}; - - static itemplate[] instrux_CWD = new[] { - new itemplate(OCE.CWD, 0, new ulong[] {0,0,0,0,0} ,21143, OF.IF_8086), - -}; - - static itemplate[] instrux_CWDE = new[] { - new itemplate(OCE.CWDE, 0, new ulong[] {0,0,0,0,0} ,21147, OF.IF_386), - -}; - - static itemplate[] instrux_DAA = new[] { - new itemplate(OCE.DAA, 0, new ulong[] {0,0,0,0,0} ,22110, OF.IF_8086, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_DAS = new[] { - new itemplate(OCE.DAS, 0, new ulong[] {0,0,0,0,0} ,22113, OF.IF_8086, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_DB;// = new[] {}; - - static itemplate[] instrux_DD;// = new[] {}; - - static itemplate[] instrux_DEC = new[] { - new itemplate(OCE.DEC, 1, new ulong[] {REG16,0,0,0,0} ,21151, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.DEC, 1, new ulong[] {REG32,0,0,0,0} ,21155, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.DEC, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21159, OF.IF_8086), - new itemplate(OCE.DEC, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19467, OF.IF_8086), - new itemplate(OCE.DEC, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19472, OF.IF_386), - new itemplate(OCE.DEC, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19477, OF.IF_X64), - -}; - - static itemplate[] instrux_DIV = new[] { - new itemplate(OCE.DIV, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21163, OF.IF_8086), - new itemplate(OCE.DIV, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19482, OF.IF_8086), - new itemplate(OCE.DIV, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19487, OF.IF_386), - new itemplate(OCE.DIV, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19492, OF.IF_X64), - -}; - - static itemplate[] instrux_DIVPD = new[] { - new itemplate(OCE.DIVPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17709, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_DIVPS = new[] { - new itemplate(OCE.DIVPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16935, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_DIVSD = new[] { - new itemplate(OCE.DIVSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17715, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_DIVSS = new[] { - new itemplate(OCE.DIVSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16941, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_DMINT = new[] { - new itemplate(OCE.DMINT, 0, new ulong[] {0,0,0,0,0} ,21167, OF.IF_P6, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_DO;// = new[] {}; - - static itemplate[] instrux_DPPD = new[] { - new itemplate(OCE.DPPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7108, OF.IF_SSE41), - -}; - - static itemplate[] instrux_DPPS = new[] { - new itemplate(OCE.DPPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7116, OF.IF_SSE41), - -}; - - static itemplate[] instrux_DQ;// = new[] {}; - - static itemplate[] instrux_DT;// = new[] {}; - - static itemplate[] instrux_DW;// = new[] {}; - - static itemplate[] instrux_DY;// = new[] {}; - - static itemplate[] instrux_EMMS = new[] { - new itemplate(OCE.EMMS, 0, new ulong[] {0,0,0,0,0} ,21171, OF.IF_PENT, OF.IF_MMX), - -}; - - static itemplate[] instrux_ENTER = new[] { - new itemplate(OCE.ENTER, 2, new ulong[] {IMMEDIATE,IMMEDIATE,0,0,0} ,19497, OF.IF_186), - -}; - - static itemplate[] instrux_EQU = new[] { - new itemplate(OCE.EQU, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,6930, OF.IF_8086), - new itemplate(OCE.EQU, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE,0,0,0} ,6930, OF.IF_8086), - -}; - - static itemplate[] instrux_EXTRACTPS = new[] { - new itemplate(OCE.EXTRACTPS, 3, new ulong[] {RM_GPR, BITS32,XMMREG,IMMEDIATE,0,0} ,1, OF.IF_SSE41), - new itemplate(OCE.EXTRACTPS, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,0, OF.IF_SSE41, OF.IF_X64), - -}; - - static itemplate[] instrux_EXTRQ = new[] { - new itemplate(OCE.EXTRQ, 3, new ulong[] {XMMREG,IMMEDIATE,IMMEDIATE,0,0} ,7076, OF.IF_SSE4A, OF.IF_AMD), - new itemplate(OCE.EXTRQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17949, OF.IF_SSE4A, OF.IF_AMD), - -}; - - static itemplate[] instrux_F2XM1 = new[] { - new itemplate(OCE.F2XM1, 0, new ulong[] {0,0,0,0,0} ,21175, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FABS = new[] { - new itemplate(OCE.FABS, 0, new ulong[] {0,0,0,0,0} ,21179, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FADD = new[] { - new itemplate(OCE.FADD, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21183, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21187, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19502, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 1, new ulong[] {FPUREG,0,0,0,0} ,19507, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19502, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19512, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADD, 0, new ulong[] {0,0,0,0,0} ,21191, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FADDP = new[] { - new itemplate(OCE.FADDP, 1, new ulong[] {FPUREG,0,0,0,0} ,19517, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADDP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19517, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FADDP, 0, new ulong[] {0,0,0,0,0} ,21191, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FBLD = new[] { - new itemplate(OCE.FBLD, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,21195, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FBLD, 1, new ulong[] {MEMORY,0,0,0,0} ,21195, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FBSTP = new[] { - new itemplate(OCE.FBSTP, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,21199, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FBSTP, 1, new ulong[] {MEMORY,0,0,0,0} ,21199, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCHS = new[] { - new itemplate(OCE.FCHS, 0, new ulong[] {0,0,0,0,0} ,21203, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCLEX = new[] { - new itemplate(OCE.FCLEX, 0, new ulong[] {0,0,0,0,0} ,19522, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVB = new[] { - new itemplate(OCE.FCMOVB, 1, new ulong[] {FPUREG,0,0,0,0} ,19527, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVB, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19532, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVB, 0, new ulong[] {0,0,0,0,0} ,21207, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVBE = new[] { - new itemplate(OCE.FCMOVBE, 1, new ulong[] {FPUREG,0,0,0,0} ,19537, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVBE, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19542, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVBE, 0, new ulong[] {0,0,0,0,0} ,21211, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVE = new[] { - new itemplate(OCE.FCMOVE, 1, new ulong[] {FPUREG,0,0,0,0} ,19547, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVE, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19552, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVE, 0, new ulong[] {0,0,0,0,0} ,21215, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVNB = new[] { - new itemplate(OCE.FCMOVNB, 1, new ulong[] {FPUREG,0,0,0,0} ,19557, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNB, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19562, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNB, 0, new ulong[] {0,0,0,0,0} ,21219, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVNBE = new[] { - new itemplate(OCE.FCMOVNBE, 1, new ulong[] {FPUREG,0,0,0,0} ,19567, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNBE, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19572, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNBE, 0, new ulong[] {0,0,0,0,0} ,21223, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVNE = new[] { - new itemplate(OCE.FCMOVNE, 1, new ulong[] {FPUREG,0,0,0,0} ,19577, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNE, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19582, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNE, 0, new ulong[] {0,0,0,0,0} ,21227, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVNU = new[] { - new itemplate(OCE.FCMOVNU, 1, new ulong[] {FPUREG,0,0,0,0} ,19587, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNU, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19592, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVNU, 0, new ulong[] {0,0,0,0,0} ,21231, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCMOVU = new[] { - new itemplate(OCE.FCMOVU, 1, new ulong[] {FPUREG,0,0,0,0} ,19597, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVU, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19602, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCMOVU, 0, new ulong[] {0,0,0,0,0} ,21235, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOM = new[] { - new itemplate(OCE.FCOM, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21239, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOM, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21243, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOM, 1, new ulong[] {FPUREG,0,0,0,0} ,19607, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOM, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19612, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOM, 0, new ulong[] {0,0,0,0,0} ,21247, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOMI = new[] { - new itemplate(OCE.FCOMI, 1, new ulong[] {FPUREG,0,0,0,0} ,19617, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCOMI, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19622, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCOMI, 0, new ulong[] {0,0,0,0,0} ,21251, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOMIP = new[] { - new itemplate(OCE.FCOMIP, 1, new ulong[] {FPUREG,0,0,0,0} ,19627, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCOMIP, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19632, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FCOMIP, 0, new ulong[] {0,0,0,0,0} ,21255, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOMP = new[] { - new itemplate(OCE.FCOMP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21259, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOMP, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21263, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOMP, 1, new ulong[] {FPUREG,0,0,0,0} ,19637, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOMP, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19642, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FCOMP, 0, new ulong[] {0,0,0,0,0} ,21267, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOMPP = new[] { - new itemplate(OCE.FCOMPP, 0, new ulong[] {0,0,0,0,0} ,21271, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FCOS = new[] { - new itemplate(OCE.FCOS, 0, new ulong[] {0,0,0,0,0} ,21275, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDECSTP = new[] { - new itemplate(OCE.FDECSTP, 0, new ulong[] {0,0,0,0,0} ,21279, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDISI = new[] { - new itemplate(OCE.FDISI, 0, new ulong[] {0,0,0,0,0} ,19647, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDIV = new[] { - new itemplate(OCE.FDIV, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21283, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21287, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19652, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 1, new ulong[] {FPUREG,0,0,0,0} ,19657, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19652, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19662, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIV, 0, new ulong[] {0,0,0,0,0} ,21291, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDIVP = new[] { - new itemplate(OCE.FDIVP, 1, new ulong[] {FPUREG,0,0,0,0} ,19667, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19667, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVP, 0, new ulong[] {0,0,0,0,0} ,21291, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDIVR = new[] { - new itemplate(OCE.FDIVR, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21295, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21299, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19672, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19672, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 1, new ulong[] {FPUREG,0,0,0,0} ,19677, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19682, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVR, 0, new ulong[] {0,0,0,0,0} ,21303, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FDIVRP = new[] { - new itemplate(OCE.FDIVRP, 1, new ulong[] {FPUREG,0,0,0,0} ,19687, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVRP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19687, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FDIVRP, 0, new ulong[] {0,0,0,0,0} ,21303, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FEMMS = new[] { - new itemplate(OCE.FEMMS, 0, new ulong[] {0,0,0,0,0} ,21307, OF.IF_PENT, OF.IF_3DNOW), - -}; - - static itemplate[] instrux_FENI = new[] { - new itemplate(OCE.FENI, 0, new ulong[] {0,0,0,0,0} ,19692, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FFREE = new[] { - new itemplate(OCE.FFREE, 1, new ulong[] {FPUREG,0,0,0,0} ,19697, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FFREE, 0, new ulong[] {0,0,0,0,0} ,21311, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FFREEP = new[] { - new itemplate(OCE.FFREEP, 1, new ulong[] {FPUREG,0,0,0,0} ,19702, OF.IF_286, OF.IF_FPU, OF.IF_UNDOC), - new itemplate(OCE.FFREEP, 0, new ulong[] {0,0,0,0,0} ,21315, OF.IF_286, OF.IF_FPU, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_FIADD = new[] { - new itemplate(OCE.FIADD, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21319, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FIADD, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21323, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FICOM = new[] { - new itemplate(OCE.FICOM, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21327, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FICOM, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21331, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FICOMP = new[] { - new itemplate(OCE.FICOMP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21335, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FICOMP, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21339, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FIDIV = new[] { - new itemplate(OCE.FIDIV, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21343, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FIDIV, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21347, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FIDIVR = new[] { - new itemplate(OCE.FIDIVR, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21351, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FIDIVR, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21355, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FILD = new[] { - new itemplate(OCE.FILD, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21359, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FILD, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21363, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FILD, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21367, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FIMUL = new[] { - new itemplate(OCE.FIMUL, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21371, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FIMUL, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21375, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FINCSTP = new[] { - new itemplate(OCE.FINCSTP, 0, new ulong[] {0,0,0,0,0} ,21379, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FINIT = new[] { - new itemplate(OCE.FINIT, 0, new ulong[] {0,0,0,0,0} ,19707, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FIST = new[] { - new itemplate(OCE.FIST, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21383, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FIST, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21387, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FISTP = new[] { - new itemplate(OCE.FISTP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21391, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FISTP, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21395, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FISTP, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21399, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FISTTP = new[] { - new itemplate(OCE.FISTTP, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21403, OF.IF_PRESCOTT, OF.IF_FPU), - new itemplate(OCE.FISTTP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21407, OF.IF_PRESCOTT, OF.IF_FPU), - new itemplate(OCE.FISTTP, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21411, OF.IF_PRESCOTT, OF.IF_FPU), - -}; - - static itemplate[] instrux_FISUB = new[] { - new itemplate(OCE.FISUB, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21415, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FISUB, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21419, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FISUBR = new[] { - new itemplate(OCE.FISUBR, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21423, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FISUBR, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,21427, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLD = new[] { - new itemplate(OCE.FLD, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21431, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FLD, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21435, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FLD, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,21439, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FLD, 1, new ulong[] {FPUREG,0,0,0,0} ,19712, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FLD, 0, new ulong[] {0,0,0,0,0} ,21443, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLD1 = new[] { - new itemplate(OCE.FLD1, 0, new ulong[] {0,0,0,0,0} ,21447, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDCW = new[] { - new itemplate(OCE.FLDCW, 1, new ulong[] {MEMORY,0,0,0,0} ,21451, OF.IF_8086, OF.IF_FPU, OF.IF_SW), - -}; - - static itemplate[] instrux_FLDENV = new[] { - new itemplate(OCE.FLDENV, 1, new ulong[] {MEMORY,0,0,0,0} ,21455, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDL2E = new[] { - new itemplate(OCE.FLDL2E, 0, new ulong[] {0,0,0,0,0} ,21459, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDL2T = new[] { - new itemplate(OCE.FLDL2T, 0, new ulong[] {0,0,0,0,0} ,21463, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDLG2 = new[] { - new itemplate(OCE.FLDLG2, 0, new ulong[] {0,0,0,0,0} ,21467, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDLN2 = new[] { - new itemplate(OCE.FLDLN2, 0, new ulong[] {0,0,0,0,0} ,21471, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDPI = new[] { - new itemplate(OCE.FLDPI, 0, new ulong[] {0,0,0,0,0} ,21475, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FLDZ = new[] { - new itemplate(OCE.FLDZ, 0, new ulong[] {0,0,0,0,0} ,21479, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FMADDPD = new[] { - new itemplate(OCE.FMADDPD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,9917, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,9924, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,9931, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,9938, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMADDPS = new[] { - new itemplate(OCE.FMADDPS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,9889, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,9896, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,9903, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDPS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,9910, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMADDSD = new[] { - new itemplate(OCE.FMADDSD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,9973, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,9980, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,9987, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,9994, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMADDSS = new[] { - new itemplate(OCE.FMADDSS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,9945, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,9952, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,9959, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMADDSS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,9966, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMSUBPD = new[] { - new itemplate(OCE.FMSUBPD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10029, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10036, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10043, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10050, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMSUBPS = new[] { - new itemplate(OCE.FMSUBPS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10001, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10008, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10015, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBPS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10022, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMSUBSD = new[] { - new itemplate(OCE.FMSUBSD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10085, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10092, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10099, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10106, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMSUBSS = new[] { - new itemplate(OCE.FMSUBSS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10057, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10064, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10071, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FMSUBSS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10078, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FMUL = new[] { - new itemplate(OCE.FMUL, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21483, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21487, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19717, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19717, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 1, new ulong[] {FPUREG,0,0,0,0} ,19722, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19727, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMUL, 0, new ulong[] {0,0,0,0,0} ,21491, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FMULP = new[] { - new itemplate(OCE.FMULP, 1, new ulong[] {FPUREG,0,0,0,0} ,19732, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMULP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19732, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FMULP, 0, new ulong[] {0,0,0,0,0} ,21491, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNCLEX = new[] { - new itemplate(OCE.FNCLEX, 0, new ulong[] {0,0,0,0,0} ,19523, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNDISI = new[] { - new itemplate(OCE.FNDISI, 0, new ulong[] {0,0,0,0,0} ,19648, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNENI = new[] { - new itemplate(OCE.FNENI, 0, new ulong[] {0,0,0,0,0} ,19693, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNINIT = new[] { - new itemplate(OCE.FNINIT, 0, new ulong[] {0,0,0,0,0} ,19708, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNMADDPD = new[] { - new itemplate(OCE.FNMADDPD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10141, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10148, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10155, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10162, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMADDPS = new[] { - new itemplate(OCE.FNMADDPS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10113, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10120, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10127, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDPS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10134, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMADDSD = new[] { - new itemplate(OCE.FNMADDSD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10197, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10204, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10211, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10218, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMADDSS = new[] { - new itemplate(OCE.FNMADDSS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10169, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10176, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10183, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMADDSS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10190, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMSUBPD = new[] { - new itemplate(OCE.FNMSUBPD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10253, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10260, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10267, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10274, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMSUBPS = new[] { - new itemplate(OCE.FNMSUBPS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10225, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10232, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10239, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBPS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10246, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMSUBSD = new[] { - new itemplate(OCE.FNMSUBSD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10309, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10316, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10323, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10330, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNMSUBSS = new[] { - new itemplate(OCE.FNMSUBSS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10281, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10288, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10295, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.FNMSUBSS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10302, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FNOP = new[] { - new itemplate(OCE.FNOP, 0, new ulong[] {0,0,0,0,0} ,21495, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNSAVE = new[] { - new itemplate(OCE.FNSAVE, 1, new ulong[] {MEMORY,0,0,0,0} ,19738, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNSTCW = new[] { - new itemplate(OCE.FNSTCW, 1, new ulong[] {MEMORY,0,0,0,0} ,19748, OF.IF_8086, OF.IF_FPU, OF.IF_SW), - -}; - - static itemplate[] instrux_FNSTENV = new[] { - new itemplate(OCE.FNSTENV, 1, new ulong[] {MEMORY,0,0,0,0} ,19753, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FNSTSW = new[] { - new itemplate(OCE.FNSTSW, 1, new ulong[] {MEMORY,0,0,0,0} ,19763, OF.IF_8086, OF.IF_FPU, OF.IF_SW), - new itemplate(OCE.FNSTSW, 1, new ulong[] {REG_AX,0,0,0,0} ,19768, OF.IF_286, OF.IF_FPU), - -}; - - static itemplate[] instrux_FPATAN = new[] { - new itemplate(OCE.FPATAN, 0, new ulong[] {0,0,0,0,0} ,21499, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FPREM = new[] { - new itemplate(OCE.FPREM, 0, new ulong[] {0,0,0,0,0} ,21503, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FPREM1 = new[] { - new itemplate(OCE.FPREM1, 0, new ulong[] {0,0,0,0,0} ,21507, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FPTAN = new[] { - new itemplate(OCE.FPTAN, 0, new ulong[] {0,0,0,0,0} ,21511, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FRCZPD = new[] { - new itemplate(OCE.FRCZPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10708, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FRCZPS = new[] { - new itemplate(OCE.FRCZPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10701, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FRCZSD = new[] { - new itemplate(OCE.FRCZSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10722, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FRCZSS = new[] { - new itemplate(OCE.FRCZSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10715, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_FRNDINT = new[] { - new itemplate(OCE.FRNDINT, 0, new ulong[] {0,0,0,0,0} ,21515, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FRSTOR = new[] { - new itemplate(OCE.FRSTOR, 1, new ulong[] {MEMORY,0,0,0,0} ,21519, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSAVE = new[] { - new itemplate(OCE.FSAVE, 1, new ulong[] {MEMORY,0,0,0,0} ,19737, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSCALE = new[] { - new itemplate(OCE.FSCALE, 0, new ulong[] {0,0,0,0,0} ,21523, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSETPM = new[] { - new itemplate(OCE.FSETPM, 0, new ulong[] {0,0,0,0,0} ,21527, OF.IF_286, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSIN = new[] { - new itemplate(OCE.FSIN, 0, new ulong[] {0,0,0,0,0} ,21531, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSINCOS = new[] { - new itemplate(OCE.FSINCOS, 0, new ulong[] {0,0,0,0,0} ,21535, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSQRT = new[] { - new itemplate(OCE.FSQRT, 0, new ulong[] {0,0,0,0,0} ,21539, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FST = new[] { - new itemplate(OCE.FST, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21543, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FST, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21547, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FST, 1, new ulong[] {FPUREG,0,0,0,0} ,19742, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FST, 0, new ulong[] {0,0,0,0,0} ,21551, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSTCW = new[] { - new itemplate(OCE.FSTCW, 1, new ulong[] {MEMORY,0,0,0,0} ,19747, OF.IF_8086, OF.IF_FPU, OF.IF_SW), - -}; - - static itemplate[] instrux_FSTENV = new[] { - new itemplate(OCE.FSTENV, 1, new ulong[] {MEMORY,0,0,0,0} ,19752, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSTP = new[] { - new itemplate(OCE.FSTP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21555, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSTP, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21559, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSTP, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,21563, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSTP, 1, new ulong[] {FPUREG,0,0,0,0} ,19757, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSTP, 0, new ulong[] {0,0,0,0,0} ,21567, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSTSW = new[] { - new itemplate(OCE.FSTSW, 1, new ulong[] {MEMORY,0,0,0,0} ,19762, OF.IF_8086, OF.IF_FPU, OF.IF_SW), - new itemplate(OCE.FSTSW, 1, new ulong[] {REG_AX,0,0,0,0} ,19767, OF.IF_286, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSUB = new[] { - new itemplate(OCE.FSUB, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21571, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21575, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19772, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19772, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 1, new ulong[] {FPUREG,0,0,0,0} ,19777, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19782, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUB, 0, new ulong[] {0,0,0,0,0} ,21579, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSUBP = new[] { - new itemplate(OCE.FSUBP, 1, new ulong[] {FPUREG,0,0,0,0} ,19787, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19787, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBP, 0, new ulong[] {0,0,0,0,0} ,21579, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSUBR = new[] { - new itemplate(OCE.FSUBR, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,21583, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,21587, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 1, new ulong[] {FPUREG, TO,0,0,0,0} ,19792, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19792, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 1, new ulong[] {FPUREG,0,0,0,0} ,19797, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19802, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBR, 0, new ulong[] {0,0,0,0,0} ,21591, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FSUBRP = new[] { - new itemplate(OCE.FSUBRP, 1, new ulong[] {FPUREG,0,0,0,0} ,19807, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBRP, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19807, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FSUBRP, 0, new ulong[] {0,0,0,0,0} ,21591, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FTST = new[] { - new itemplate(OCE.FTST, 0, new ulong[] {0,0,0,0,0} ,21595, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FUCOM = new[] { - new itemplate(OCE.FUCOM, 1, new ulong[] {FPUREG,0,0,0,0} ,19812, OF.IF_386, OF.IF_FPU), - new itemplate(OCE.FUCOM, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19817, OF.IF_386, OF.IF_FPU), - new itemplate(OCE.FUCOM, 0, new ulong[] {0,0,0,0,0} ,21599, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FUCOMI = new[] { - new itemplate(OCE.FUCOMI, 1, new ulong[] {FPUREG,0,0,0,0} ,19822, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FUCOMI, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19827, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FUCOMI, 0, new ulong[] {0,0,0,0,0} ,21603, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FUCOMIP = new[] { - new itemplate(OCE.FUCOMIP, 1, new ulong[] {FPUREG,0,0,0,0} ,19832, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FUCOMIP, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19837, OF.IF_P6, OF.IF_FPU), - new itemplate(OCE.FUCOMIP, 0, new ulong[] {0,0,0,0,0} ,21607, OF.IF_P6, OF.IF_FPU), - -}; - - static itemplate[] instrux_FUCOMP = new[] { - new itemplate(OCE.FUCOMP, 1, new ulong[] {FPUREG,0,0,0,0} ,19842, OF.IF_386, OF.IF_FPU), - new itemplate(OCE.FUCOMP, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19847, OF.IF_386, OF.IF_FPU), - new itemplate(OCE.FUCOMP, 0, new ulong[] {0,0,0,0,0} ,21611, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FUCOMPP = new[] { - new itemplate(OCE.FUCOMPP, 0, new ulong[] {0,0,0,0,0} ,21615, OF.IF_386, OF.IF_FPU), - -}; - - static itemplate[] instrux_FWAIT = new[] { - new itemplate(OCE.FWAIT, 0, new ulong[] {0,0,0,0,0} ,21601, OF.IF_8086), - -}; - - static itemplate[] instrux_FXAM = new[] { - new itemplate(OCE.FXAM, 0, new ulong[] {0,0,0,0,0} ,21619, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FXCH = new[] { - new itemplate(OCE.FXCH, 1, new ulong[] {FPUREG,0,0,0,0} ,19852, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FXCH, 2, new ulong[] {FPUREG,FPU0,0,0,0} ,19852, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FXCH, 2, new ulong[] {FPU0,FPUREG,0,0,0} ,19857, OF.IF_8086, OF.IF_FPU), - new itemplate(OCE.FXCH, 0, new ulong[] {0,0,0,0,0} ,21623, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FXRSTOR = new[] { - new itemplate(OCE.FXRSTOR, 1, new ulong[] {MEMORY,0,0,0,0} ,20982, OF.IF_P6, OF.IF_SSE, OF.IF_FPU), - -}; - - static itemplate[] instrux_FXSAVE = new[] { - new itemplate(OCE.FXSAVE, 1, new ulong[] {MEMORY,0,0,0,0} ,20987, OF.IF_P6, OF.IF_SSE, OF.IF_FPU), - -}; - - static itemplate[] instrux_FXTRACT = new[] { - new itemplate(OCE.FXTRACT, 0, new ulong[] {0,0,0,0,0} ,21627, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FYL2X = new[] { - new itemplate(OCE.FYL2X, 0, new ulong[] {0,0,0,0,0} ,21631, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_FYL2XP1 = new[] { - new itemplate(OCE.FYL2XP1, 0, new ulong[] {0,0,0,0,0} ,21635, OF.IF_8086, OF.IF_FPU), - -}; - - static itemplate[] instrux_GETSEC = new[] { - new itemplate(OCE.GETSEC, 0, new ulong[] {0,0,0,0,0} ,22091, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_HADDPD = new[] { - new itemplate(OCE.HADDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17889, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_HADDPS = new[] { - new itemplate(OCE.HADDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17895, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_HINT_NOP0 = new[] { - new itemplate(OCE.HINT_NOP0, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18033, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP0, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18039, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP0, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18045, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP1 = new[] { - new itemplate(OCE.HINT_NOP1, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18051, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP1, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18057, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP1, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18063, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP10 = new[] { - new itemplate(OCE.HINT_NOP10, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18213, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP10, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18219, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP10, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18225, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP11 = new[] { - new itemplate(OCE.HINT_NOP11, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18231, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP11, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18237, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP11, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18243, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP12 = new[] { - new itemplate(OCE.HINT_NOP12, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18249, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP12, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18255, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP12, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18261, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP13 = new[] { - new itemplate(OCE.HINT_NOP13, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18267, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP13, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18273, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP13, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18279, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP14 = new[] { - new itemplate(OCE.HINT_NOP14, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18285, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP14, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18291, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP14, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18297, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP15 = new[] { - new itemplate(OCE.HINT_NOP15, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18303, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP15, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18309, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP15, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18315, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP16 = new[] { - new itemplate(OCE.HINT_NOP16, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18321, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP16, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18327, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP16, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18333, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP17 = new[] { - new itemplate(OCE.HINT_NOP17, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18339, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP17, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18345, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP17, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18351, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP18 = new[] { - new itemplate(OCE.HINT_NOP18, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18357, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP18, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18363, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP18, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18369, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP19 = new[] { - new itemplate(OCE.HINT_NOP19, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18375, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP19, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18381, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP19, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18387, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP2 = new[] { - new itemplate(OCE.HINT_NOP2, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18069, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP2, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18075, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP2, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18081, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP20 = new[] { - new itemplate(OCE.HINT_NOP20, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18393, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP20, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18399, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP20, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18405, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP21 = new[] { - new itemplate(OCE.HINT_NOP21, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18411, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP21, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18417, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP21, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18423, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP22 = new[] { - new itemplate(OCE.HINT_NOP22, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18429, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP22, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18435, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP22, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18441, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP23 = new[] { - new itemplate(OCE.HINT_NOP23, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18447, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP23, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18453, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP23, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18459, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP24 = new[] { - new itemplate(OCE.HINT_NOP24, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18465, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP24, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18471, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP24, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18477, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP25 = new[] { - new itemplate(OCE.HINT_NOP25, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18483, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP25, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18489, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP25, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18495, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP26 = new[] { - new itemplate(OCE.HINT_NOP26, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18501, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP26, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18507, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP26, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18513, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP27 = new[] { - new itemplate(OCE.HINT_NOP27, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18519, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP27, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18525, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP27, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18531, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP28 = new[] { - new itemplate(OCE.HINT_NOP28, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18537, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP28, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18543, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP28, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18549, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP29 = new[] { - new itemplate(OCE.HINT_NOP29, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18555, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP29, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18561, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP29, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18567, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP3 = new[] { - new itemplate(OCE.HINT_NOP3, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18087, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP3, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18093, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP3, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18099, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP30 = new[] { - new itemplate(OCE.HINT_NOP30, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18573, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP30, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18579, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP30, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18585, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP31 = new[] { - new itemplate(OCE.HINT_NOP31, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18591, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP31, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18597, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP31, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18603, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP32 = new[] { - new itemplate(OCE.HINT_NOP32, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18609, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP32, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18615, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP32, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18621, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP33 = new[] { - new itemplate(OCE.HINT_NOP33, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18627, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP33, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18633, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP33, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18639, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP34 = new[] { - new itemplate(OCE.HINT_NOP34, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18645, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP34, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18651, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP34, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18657, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP35 = new[] { - new itemplate(OCE.HINT_NOP35, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18663, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP35, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18669, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP35, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18675, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP36 = new[] { - new itemplate(OCE.HINT_NOP36, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18681, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP36, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18687, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP36, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18693, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP37 = new[] { - new itemplate(OCE.HINT_NOP37, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18699, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP37, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18705, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP37, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18711, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP38 = new[] { - new itemplate(OCE.HINT_NOP38, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18717, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP38, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18723, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP38, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18729, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP39 = new[] { - new itemplate(OCE.HINT_NOP39, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18735, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP39, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18741, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP39, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18747, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP4 = new[] { - new itemplate(OCE.HINT_NOP4, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18105, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP4, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18111, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP4, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18117, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP40 = new[] { - new itemplate(OCE.HINT_NOP40, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18753, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP40, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18759, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP40, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18765, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP41 = new[] { - new itemplate(OCE.HINT_NOP41, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18771, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP41, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18777, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP41, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18783, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP42 = new[] { - new itemplate(OCE.HINT_NOP42, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18789, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP42, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18795, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP42, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18801, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP43 = new[] { - new itemplate(OCE.HINT_NOP43, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18807, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP43, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18813, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP43, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18819, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP44 = new[] { - new itemplate(OCE.HINT_NOP44, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18825, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP44, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18831, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP44, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18837, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP45 = new[] { - new itemplate(OCE.HINT_NOP45, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18843, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP45, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18849, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP45, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18855, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP46 = new[] { - new itemplate(OCE.HINT_NOP46, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18861, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP46, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18867, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP46, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18873, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP47 = new[] { - new itemplate(OCE.HINT_NOP47, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18879, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP47, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18885, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP47, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18891, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP48 = new[] { - new itemplate(OCE.HINT_NOP48, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18897, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP48, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18903, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP48, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18909, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP49 = new[] { - new itemplate(OCE.HINT_NOP49, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18915, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP49, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18921, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP49, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18927, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP5 = new[] { - new itemplate(OCE.HINT_NOP5, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18123, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP5, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18129, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP5, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18135, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP50 = new[] { - new itemplate(OCE.HINT_NOP50, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18933, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP50, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18939, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP50, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18945, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP51 = new[] { - new itemplate(OCE.HINT_NOP51, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18951, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP51, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18957, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP51, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18963, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP52 = new[] { - new itemplate(OCE.HINT_NOP52, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18969, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP52, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18975, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP52, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18981, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP53 = new[] { - new itemplate(OCE.HINT_NOP53, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18987, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP53, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18993, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP53, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18999, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP54 = new[] { - new itemplate(OCE.HINT_NOP54, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19005, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP54, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19011, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP54, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19017, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP55 = new[] { - new itemplate(OCE.HINT_NOP55, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19023, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP55, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19029, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP55, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19035, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP56 = new[] { - new itemplate(OCE.HINT_NOP56, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,16395, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP56, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,16401, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP56, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,16407, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP57 = new[] { - new itemplate(OCE.HINT_NOP57, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19041, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP57, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19047, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP57, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19053, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP58 = new[] { - new itemplate(OCE.HINT_NOP58, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19059, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP58, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19065, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP58, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19071, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP59 = new[] { - new itemplate(OCE.HINT_NOP59, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19077, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP59, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19083, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP59, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19089, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP6 = new[] { - new itemplate(OCE.HINT_NOP6, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18141, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP6, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18147, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP6, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18153, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP60 = new[] { - new itemplate(OCE.HINT_NOP60, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19095, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP60, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19101, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP60, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19107, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP61 = new[] { - new itemplate(OCE.HINT_NOP61, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19113, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP61, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19119, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP61, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19125, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP62 = new[] { - new itemplate(OCE.HINT_NOP62, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19131, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP62, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19137, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP62, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19143, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP63 = new[] { - new itemplate(OCE.HINT_NOP63, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19149, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP63, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19155, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP63, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19161, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP7 = new[] { - new itemplate(OCE.HINT_NOP7, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18159, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP7, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18165, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP7, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18171, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP8 = new[] { - new itemplate(OCE.HINT_NOP8, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18177, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP8, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18183, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP8, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18189, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HINT_NOP9 = new[] { - new itemplate(OCE.HINT_NOP9, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,18195, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP9, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,18201, OF.IF_P6, OF.IF_UNDOC), - new itemplate(OCE.HINT_NOP9, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,18207, OF.IF_X64, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_HLT = new[] { - new itemplate(OCE.HLT, 0, new ulong[] {0,0,0,0,0} ,22116, OF.IF_8086, OF.IF_PRIV), - -}; - - static itemplate[] instrux_HSUBPD = new[] { - new itemplate(OCE.HSUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17901, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_HSUBPS = new[] { - new itemplate(OCE.HSUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17907, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_IBTS = new[] { - new itemplate(OCE.IBTS, 2, new ulong[] {MEMORY,REG16,0,0,0} ,15975, OF.IF_386, OF.IF_SW, OF.IF_UNDOC), - new itemplate(OCE.IBTS, 2, new ulong[] {REG16,REG16,0,0,0} ,15975, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.IBTS, 2, new ulong[] {MEMORY,REG32,0,0,0} ,15981, OF.IF_386, OF.IF_SD, OF.IF_UNDOC), - new itemplate(OCE.IBTS, 2, new ulong[] {REG32,REG32,0,0,0} ,15981, OF.IF_386, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_ICEBP = new[] { - new itemplate(OCE.ICEBP, 0, new ulong[] {0,0,0,0,0} ,22119, OF.IF_386), - -}; - - static itemplate[] instrux_IDIV = new[] { - new itemplate(OCE.IDIV, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21639, OF.IF_8086), - new itemplate(OCE.IDIV, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19862, OF.IF_8086), - new itemplate(OCE.IDIV, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19867, OF.IF_386), - new itemplate(OCE.IDIV, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19872, OF.IF_X64), - -}; - - static itemplate[] instrux_IMUL = new[] { - new itemplate(OCE.IMUL, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21643, OF.IF_8086), - new itemplate(OCE.IMUL, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19877, OF.IF_8086), - new itemplate(OCE.IMUL, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19882, OF.IF_386), - new itemplate(OCE.IMUL, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19887, OF.IF_X64), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,MEMORY,0,0,0} ,15993, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,REG16,0,0,0} ,15993, OF.IF_386), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,MEMORY,0,0,0} ,15999, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,REG32,0,0,0} ,15999, OF.IF_386), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,MEMORY,0,0,0} ,16005, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,REG64,0,0,0} ,16005, OF.IF_X64), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,MEMORY,IMMEDIATE, BITS8,0,0} ,16011, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,MEMORY,SBYTE16,0,0} ,16011, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,MEMORY,IMMEDIATE, BITS16,0,0} ,16017, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,MEMORY,IMMEDIATE,0,0} ,16023, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,REG16,IMMEDIATE, BITS8,0,0} ,16011, OF.IF_186), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,REG16,SBYTE32,0,0} ,16011, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,REG16,IMMEDIATE, BITS16,0,0} ,16017, OF.IF_186), - new itemplate(OCE.IMUL, 3, new ulong[] {REG16,REG16,IMMEDIATE,0,0} ,16023, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,MEMORY,IMMEDIATE, BITS8,0,0} ,16029, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,MEMORY,SBYTE64,0,0} ,16029, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,MEMORY,IMMEDIATE, BITS32,0,0} ,16035, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,MEMORY,IMMEDIATE,0,0} ,16041, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,REG32,IMMEDIATE, BITS8,0,0} ,16029, OF.IF_386), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,REG32,SBYTE16,0,0} ,16029, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,REG32,IMMEDIATE, BITS32,0,0} ,16035, OF.IF_386), - new itemplate(OCE.IMUL, 3, new ulong[] {REG32,REG32,IMMEDIATE,0,0} ,16041, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,MEMORY,IMMEDIATE, BITS8,0,0} ,16047, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,MEMORY,SBYTE32,0,0} ,16047, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,MEMORY,IMMEDIATE, BITS32,0,0} ,16053, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,MEMORY,IMMEDIATE,0,0} ,16059, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,REG64,IMMEDIATE, BITS8,0,0} ,16047, OF.IF_X64), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,REG64,SBYTE64,0,0} ,16047, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,REG64,IMMEDIATE, BITS32,0,0} ,16053, OF.IF_X64), - new itemplate(OCE.IMUL, 3, new ulong[] {REG64,REG64,IMMEDIATE,0,0} ,16059, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,IMMEDIATE, BITS8,0,0,0} ,16065, OF.IF_186), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,SBYTE16,0,0,0} ,16065, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,IMMEDIATE, BITS16,0,0,0} ,16071, OF.IF_186), - new itemplate(OCE.IMUL, 2, new ulong[] {REG16,IMMEDIATE,0,0,0} ,16077, OF.IF_186, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,IMMEDIATE, BITS8,0,0,0} ,16083, OF.IF_386), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,SBYTE32,0,0,0} ,16083, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,IMMEDIATE, BITS32,0,0,0} ,16089, OF.IF_386), - new itemplate(OCE.IMUL, 2, new ulong[] {REG32,IMMEDIATE,0,0,0} ,16095, OF.IF_386, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,IMMEDIATE, BITS8,0,0,0} ,16101, OF.IF_X64), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,SBYTE64,0,0,0} ,16101, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,IMMEDIATE, BITS32,0,0,0} ,16107, OF.IF_X64), - new itemplate(OCE.IMUL, 2, new ulong[] {REG64,IMMEDIATE,0,0,0} ,16113, OF.IF_X64, OF.IF_SM), - -}; - - static itemplate[] instrux_IN = new[] { - new itemplate(OCE.IN, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21647, OF.IF_8086, OF.IF_SB), - new itemplate(OCE.IN, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,19892, OF.IF_8086, OF.IF_SB), - new itemplate(OCE.IN, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,19897, OF.IF_386, OF.IF_SB), - new itemplate(OCE.IN, 2, new ulong[] {REG_AL,REG_DX,0,0,0} ,22122, OF.IF_8086), - new itemplate(OCE.IN, 2, new ulong[] {REG_AX,REG_DX,0,0,0} ,21651, OF.IF_8086), - new itemplate(OCE.IN, 2, new ulong[] {REG_EAX,REG_DX,0,0,0} ,21655, OF.IF_386), - -}; - - static itemplate[] instrux_INC = new[] { - new itemplate(OCE.INC, 1, new ulong[] {REG16,0,0,0,0} ,21659, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.INC, 1, new ulong[] {REG32,0,0,0,0} ,21663, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.INC, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21667, OF.IF_8086), - new itemplate(OCE.INC, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,19902, OF.IF_8086), - new itemplate(OCE.INC, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,19907, OF.IF_386), - new itemplate(OCE.INC, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,19912, OF.IF_X64), - -}; - - static itemplate[] instrux_INCBIN;// = new[] {}; - - static itemplate[] instrux_INSB = new[] { - new itemplate(OCE.INSB, 0, new ulong[] {0,0,0,0,0} ,22125, OF.IF_186), - -}; - - static itemplate[] instrux_INSD = new[] { - new itemplate(OCE.INSD, 0, new ulong[] {0,0,0,0,0} ,21671, OF.IF_386), - -}; - - static itemplate[] instrux_INSERTPS = new[] { - new itemplate(OCE.INSERTPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7124, OF.IF_SSE41, OF.IF_SD), - -}; - - static itemplate[] instrux_INSERTQ = new[] { - new itemplate(OCE.INSERTQ, 4, new ulong[] {XMMREG,XMMREG,IMMEDIATE,IMMEDIATE,0} ,7084, OF.IF_SSE4A, OF.IF_AMD), - new itemplate(OCE.INSERTQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17955, OF.IF_SSE4A, OF.IF_AMD), - -}; - - static itemplate[] instrux_INSW = new[] { - new itemplate(OCE.INSW, 0, new ulong[] {0,0,0,0,0} ,21675, OF.IF_186), - -}; - - static itemplate[] instrux_INT = new[] { - new itemplate(OCE.INT, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21679, OF.IF_8086, OF.IF_SB), - -}; - - static itemplate[] instrux_INT01 = new[] { - new itemplate(OCE.INT01, 0, new ulong[] {0,0,0,0,0} ,22119, OF.IF_386), - -}; - - static itemplate[] instrux_INT03 = new[] { - new itemplate(OCE.INT03, 0, new ulong[] {0,0,0,0,0} ,22128, OF.IF_8086), - -}; - - static itemplate[] instrux_INT1 = new[] { - new itemplate(OCE.INT1, 0, new ulong[] {0,0,0,0,0} ,22119, OF.IF_386), - -}; - - static itemplate[] instrux_INT3 = new[] { - new itemplate(OCE.INT3, 0, new ulong[] {0,0,0,0,0} ,22128, OF.IF_8086), - -}; - - static itemplate[] instrux_INTO = new[] { - new itemplate(OCE.INTO, 0, new ulong[] {0,0,0,0,0} ,22131, OF.IF_8086, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_INVD = new[] { - new itemplate(OCE.INVD, 0, new ulong[] {0,0,0,0,0} ,21683, OF.IF_486, OF.IF_PRIV), - -}; - - static itemplate[] instrux_INVEPT = new[] { - new itemplate(OCE.INVEPT, 2, new ulong[] {REG32,MEMORY,0,0,0} ,7045, OF.IF_VMX, OF.IF_SO, OF.IF_NOLONG), - new itemplate(OCE.INVEPT, 2, new ulong[] {REG64,MEMORY,0,0,0} ,7044, OF.IF_VMX, OF.IF_SO, OF.IF_LONG), - -}; - - static itemplate[] instrux_INVLPG = new[] { - new itemplate(OCE.INVLPG, 1, new ulong[] {MEMORY,0,0,0,0} ,19917, OF.IF_486, OF.IF_PRIV), - -}; - - static itemplate[] instrux_INVLPGA = new[] { - new itemplate(OCE.INVLPGA, 2, new ulong[] {REG_AX,REG_ECX,0,0,0} ,16119, OF.IF_X86_64, OF.IF_AMD, OF.IF_NOLONG), - new itemplate(OCE.INVLPGA, 2, new ulong[] {REG_EAX,REG_ECX,0,0,0} ,16125, OF.IF_X86_64, OF.IF_AMD), - new itemplate(OCE.INVLPGA, 2, new ulong[] {REG_RAX,REG_ECX,0,0,0} ,8552, OF.IF_X64, OF.IF_AMD), - new itemplate(OCE.INVLPGA, 0, new ulong[] {0,0,0,0,0} ,16126, OF.IF_X86_64, OF.IF_AMD), - -}; - - static itemplate[] instrux_INVVPID = new[] { - new itemplate(OCE.INVVPID, 2, new ulong[] {REG32,MEMORY,0,0,0} ,7053, OF.IF_VMX, OF.IF_SO, OF.IF_NOLONG), - new itemplate(OCE.INVVPID, 2, new ulong[] {REG64,MEMORY,0,0,0} ,7052, OF.IF_VMX, OF.IF_SO, OF.IF_LONG), - -}; - - static itemplate[] instrux_IRET = new[] { - new itemplate(OCE.IRET, 0, new ulong[] {0,0,0,0,0} ,21687, OF.IF_8086), - -}; - - static itemplate[] instrux_IRETD = new[] { - new itemplate(OCE.IRETD, 0, new ulong[] {0,0,0,0,0} ,21691, OF.IF_386), - -}; - - static itemplate[] instrux_IRETQ = new[] { - new itemplate(OCE.IRETQ, 0, new ulong[] {0,0,0,0,0} ,21695, OF.IF_X64), - -}; - - static itemplate[] instrux_IRETW = new[] { - new itemplate(OCE.IRETW, 0, new ulong[] {0,0,0,0,0} ,21699, OF.IF_8086), - -}; - - static itemplate[] instrux_JCXZ = new[] { - new itemplate(OCE.JCXZ, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19922, OF.IF_8086, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_JECXZ = new[] { - new itemplate(OCE.JECXZ, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19927, OF.IF_386), - -}; - - static itemplate[] instrux_JMP = new[] { - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, SHORT,0,0,0,0} ,19938, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19937, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19942, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, NEAR,0,0,0,0} ,19942, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, FAR,0,0,0,0} ,16131, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS16,0,0,0,0} ,19947, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS16, NEAR,0,0,0,0} ,19947, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS16, FAR,0,0,0,0} ,16137, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS32,0,0,0,0} ,19952, OF.IF_386), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS32, NEAR,0,0,0,0} ,19952, OF.IF_386), - new itemplate(OCE.JMP, 1, new ulong[] {IMMEDIATE, BITS32, FAR,0,0,0,0} ,16143, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE,0,0,0} ,16149, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 2, new ulong[] {IMMEDIATE, BITS16, COLON,IMMEDIATE,0,0,0} ,16155, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE, BITS16,0,0,0} ,16155, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 2, new ulong[] {IMMEDIATE, BITS32, COLON,IMMEDIATE,0,0,0} ,16161, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 2, new ulong[] {IMMEDIATE, COLON,IMMEDIATE, BITS32,0,0,0} ,16161, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, FAR,0,0,0,0} ,19957, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, FAR,0,0,0,0} ,19962, OF.IF_X64), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS16, FAR,0,0,0,0} ,19967, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS32, FAR,0,0,0,0} ,19972, OF.IF_386), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS64, FAR,0,0,0,0} ,19962, OF.IF_X64), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, NEAR,0,0,0,0} ,19977, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS16, NEAR,0,0,0,0} ,19982, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS32, NEAR,0,0,0,0} ,19987, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS64, NEAR,0,0,0,0} ,19992, OF.IF_X64), - new itemplate(OCE.JMP, 1, new ulong[] {REG16,0,0,0,0} ,19982, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {REG32,0,0,0,0} ,19987, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {REG64,0,0,0,0} ,19992, OF.IF_X64), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY,0,0,0,0} ,19977, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,19982, OF.IF_8086), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,19987, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.JMP, 1, new ulong[] {MEMORY, BITS64,0,0,0,0} ,19992, OF.IF_X64), - -}; - - static itemplate[] instrux_JMPE = new[] { - new itemplate(OCE.JMPE, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,16167, OF.IF_IA64), - new itemplate(OCE.JMPE, 1, new ulong[] {IMMEDIATE, BITS16,0,0,0,0} ,16173, OF.IF_IA64), - new itemplate(OCE.JMPE, 1, new ulong[] {IMMEDIATE, BITS32,0,0,0,0} ,16179, OF.IF_IA64), - new itemplate(OCE.JMPE, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,16185, OF.IF_IA64), - new itemplate(OCE.JMPE, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,16191, OF.IF_IA64), - -}; - - static itemplate[] instrux_JRCXZ = new[] { - new itemplate(OCE.JRCXZ, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,19932, OF.IF_X64), - -}; - - static itemplate[] instrux_LAHF = new[] { - new itemplate(OCE.LAHF, 0, new ulong[] {0,0,0,0,0} ,22134, OF.IF_8086), - -}; - - static itemplate[] instrux_LAR = new[] { - new itemplate(OCE.LAR, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16197, OF.IF_286, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LAR, 2, new ulong[] {REG16,REG16,0,0,0} ,16197, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG16,REG32,0,0,0} ,16197, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG16,REG64,0,0,0} ,8559, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16203, OF.IF_386, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LAR, 2, new ulong[] {REG32,REG16,0,0,0} ,16203, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG32,REG32,0,0,0} ,16203, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG32,REG64,0,0,0} ,8566, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG64,MEMORY,0,0,0} ,16209, OF.IF_X64, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LAR, 2, new ulong[] {REG64,REG16,0,0,0} ,16209, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG64,REG32,0,0,0} ,16209, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LAR, 2, new ulong[] {REG64,REG64,0,0,0} ,16209, OF.IF_X64, OF.IF_PROT), - -}; - - static itemplate[] instrux_LDDQU = new[] { - new itemplate(OCE.LDDQU, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17913, OF.IF_PRESCOTT, OF.IF_SSE3, OF.IF_SO), - -}; - - static itemplate[] instrux_LDMXCSR = new[] { - new itemplate(OCE.LDMXCSR, 1, new ulong[] {MEMORY,0,0,0,0} ,20972, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD), - -}; - - static itemplate[] instrux_LDS = new[] { - new itemplate(OCE.LDS, 2, new ulong[] {REG16,MEMORY,0,0,0} ,19997, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LDS, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20002, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_LEA = new[] { - new itemplate(OCE.LEA, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20007, OF.IF_8086), - new itemplate(OCE.LEA, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20012, OF.IF_386), - new itemplate(OCE.LEA, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20017, OF.IF_X64), - -}; - - static itemplate[] instrux_LEAVE = new[] { - new itemplate(OCE.LEAVE, 0, new ulong[] {0,0,0,0,0} ,20254, OF.IF_186), - -}; - - static itemplate[] instrux_LES = new[] { - new itemplate(OCE.LES, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20022, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LES, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20027, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_LFENCE = new[] { - new itemplate(OCE.LFENCE, 0, new ulong[] {0,0,0,0,0} ,20032, OF.IF_X64, OF.IF_AMD), - new itemplate(OCE.LFENCE, 0, new ulong[] {0,0,0,0,0} ,20032, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_LFS = new[] { - new itemplate(OCE.LFS, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16215, OF.IF_386), - new itemplate(OCE.LFS, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16221, OF.IF_386), - -}; - - static itemplate[] instrux_LGDT = new[] { - new itemplate(OCE.LGDT, 1, new ulong[] {MEMORY,0,0,0,0} ,20037, OF.IF_286, OF.IF_PRIV), - -}; - - static itemplate[] instrux_LGS = new[] { - new itemplate(OCE.LGS, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16227, OF.IF_386), - new itemplate(OCE.LGS, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16233, OF.IF_386), - -}; - - static itemplate[] instrux_LIDT = new[] { - new itemplate(OCE.LIDT, 1, new ulong[] {MEMORY,0,0,0,0} ,20042, OF.IF_286, OF.IF_PRIV), - -}; - - static itemplate[] instrux_LLDT = new[] { - new itemplate(OCE.LLDT, 1, new ulong[] {MEMORY,0,0,0,0} ,20047, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - new itemplate(OCE.LLDT, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,20047, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - new itemplate(OCE.LLDT, 1, new ulong[] {REG16,0,0,0,0} ,20047, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - -}; - - static itemplate[] instrux_LMSW = new[] { - new itemplate(OCE.LMSW, 1, new ulong[] {MEMORY,0,0,0,0} ,20052, OF.IF_286, OF.IF_PRIV), - new itemplate(OCE.LMSW, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,20052, OF.IF_286, OF.IF_PRIV), - new itemplate(OCE.LMSW, 1, new ulong[] {REG16,0,0,0,0} ,20052, OF.IF_286, OF.IF_PRIV), - -}; - - static itemplate[] instrux_LOADALL = new[] { - new itemplate(OCE.LOADALL, 0, new ulong[] {0,0,0,0,0} ,21703, OF.IF_386, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_LOADALL286 = new[] { - new itemplate(OCE.LOADALL286, 0, new ulong[] {0,0,0,0,0} ,21707, OF.IF_286, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_LODSB = new[] { - new itemplate(OCE.LODSB, 0, new ulong[] {0,0,0,0,0} ,22137, OF.IF_8086), - -}; - - static itemplate[] instrux_LODSD = new[] { - new itemplate(OCE.LODSD, 0, new ulong[] {0,0,0,0,0} ,21711, OF.IF_386), - -}; - - static itemplate[] instrux_LODSQ = new[] { - new itemplate(OCE.LODSQ, 0, new ulong[] {0,0,0,0,0} ,21715, OF.IF_X64), - -}; - - static itemplate[] instrux_LODSW = new[] { - new itemplate(OCE.LODSW, 0, new ulong[] {0,0,0,0,0} ,21719, OF.IF_8086), - -}; - - static itemplate[] instrux_LOOP = new[] { - new itemplate(OCE.LOOP, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20057, OF.IF_8086), - new itemplate(OCE.LOOP, 2, new ulong[] {IMMEDIATE,REG_CX,0,0,0} ,20062, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LOOP, 2, new ulong[] {IMMEDIATE,REG_ECX,0,0,0} ,20067, OF.IF_386), - new itemplate(OCE.LOOP, 2, new ulong[] {IMMEDIATE,REG_RCX,0,0,0} ,20072, OF.IF_X64), - -}; - - static itemplate[] instrux_LOOPE = new[] { - new itemplate(OCE.LOOPE, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20077, OF.IF_8086), - new itemplate(OCE.LOOPE, 2, new ulong[] {IMMEDIATE,REG_CX,0,0,0} ,20082, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LOOPE, 2, new ulong[] {IMMEDIATE,REG_ECX,0,0,0} ,20087, OF.IF_386), - new itemplate(OCE.LOOPE, 2, new ulong[] {IMMEDIATE,REG_RCX,0,0,0} ,20092, OF.IF_X64), - -}; - - static itemplate[] instrux_LOOPNE = new[] { - new itemplate(OCE.LOOPNE, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20097, OF.IF_8086), - new itemplate(OCE.LOOPNE, 2, new ulong[] {IMMEDIATE,REG_CX,0,0,0} ,20102, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LOOPNE, 2, new ulong[] {IMMEDIATE,REG_ECX,0,0,0} ,20107, OF.IF_386), - new itemplate(OCE.LOOPNE, 2, new ulong[] {IMMEDIATE,REG_RCX,0,0,0} ,20112, OF.IF_X64), - -}; - - static itemplate[] instrux_LOOPNZ = new[] { - new itemplate(OCE.LOOPNZ, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20097, OF.IF_8086), - new itemplate(OCE.LOOPNZ, 2, new ulong[] {IMMEDIATE,REG_CX,0,0,0} ,20102, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LOOPNZ, 2, new ulong[] {IMMEDIATE,REG_ECX,0,0,0} ,20107, OF.IF_386), - new itemplate(OCE.LOOPNZ, 2, new ulong[] {IMMEDIATE,REG_RCX,0,0,0} ,20112, OF.IF_X64), - -}; - - static itemplate[] instrux_LOOPZ = new[] { - new itemplate(OCE.LOOPZ, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20077, OF.IF_8086), - new itemplate(OCE.LOOPZ, 2, new ulong[] {IMMEDIATE,REG_CX,0,0,0} ,20082, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.LOOPZ, 2, new ulong[] {IMMEDIATE,REG_ECX,0,0,0} ,20087, OF.IF_386), - new itemplate(OCE.LOOPZ, 2, new ulong[] {IMMEDIATE,REG_RCX,0,0,0} ,20092, OF.IF_X64), - -}; - - static itemplate[] instrux_LSL = new[] { - new itemplate(OCE.LSL, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16239, OF.IF_286, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LSL, 2, new ulong[] {REG16,REG16,0,0,0} ,16239, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG16,REG32,0,0,0} ,16239, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG16,REG64,0,0,0} ,8573, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16245, OF.IF_386, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LSL, 2, new ulong[] {REG32,REG16,0,0,0} ,16245, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG32,REG32,0,0,0} ,16245, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG32,REG64,0,0,0} ,8580, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG64,MEMORY,0,0,0} ,16251, OF.IF_X64, OF.IF_PROT, OF.IF_SW), - new itemplate(OCE.LSL, 2, new ulong[] {REG64,REG16,0,0,0} ,16251, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG64,REG32,0,0,0} ,16251, OF.IF_X64, OF.IF_PROT), - new itemplate(OCE.LSL, 2, new ulong[] {REG64,REG64,0,0,0} ,16251, OF.IF_X64, OF.IF_PROT), - -}; - - static itemplate[] instrux_LSS = new[] { - new itemplate(OCE.LSS, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16257, OF.IF_386), - new itemplate(OCE.LSS, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16263, OF.IF_386), - -}; - - static itemplate[] instrux_LTR = new[] { - new itemplate(OCE.LTR, 1, new ulong[] {MEMORY,0,0,0,0} ,20117, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - new itemplate(OCE.LTR, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,20117, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - new itemplate(OCE.LTR, 1, new ulong[] {REG16,0,0,0,0} ,20117, OF.IF_286, OF.IF_PROT, OF.IF_PRIV), - -}; - - static itemplate[] instrux_LZCNT = new[] { - new itemplate(OCE.LZCNT, 2, new ulong[] {REG16,RM_GPR, BITS16,0,0,0} ,9630, OF.IF_P6, OF.IF_AMD), - new itemplate(OCE.LZCNT, 2, new ulong[] {REG32,RM_GPR, BITS32,0,0,0} ,9637, OF.IF_P6, OF.IF_AMD), - new itemplate(OCE.LZCNT, 2, new ulong[] {REG64,RM_GPR, BITS64,0,0,0} ,9644, OF.IF_X64, OF.IF_AMD), - -}; - - static itemplate[] instrux_MASKMOVDQU = new[] { - new itemplate(OCE.MASKMOVDQU, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17169, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MASKMOVQ = new[] { - new itemplate(OCE.MASKMOVQ, 2, new ulong[] {MMXREG,MMXREG,0,0,0} ,17151, OF.IF_KATMAI, OF.IF_MMX), - -}; - - static itemplate[] instrux_MAXPD = new[] { - new itemplate(OCE.MAXPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17721, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MAXPS = new[] { - new itemplate(OCE.MAXPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16947, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MAXSD = new[] { - new itemplate(OCE.MAXSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17727, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MAXSS = new[] { - new itemplate(OCE.MAXSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16953, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MFENCE = new[] { - new itemplate(OCE.MFENCE, 0, new ulong[] {0,0,0,0,0} ,20122, OF.IF_X64, OF.IF_AMD), - new itemplate(OCE.MFENCE, 0, new ulong[] {0,0,0,0,0} ,20122, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MINPD = new[] { - new itemplate(OCE.MINPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17733, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MINPS = new[] { - new itemplate(OCE.MINPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16959, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MINSD = new[] { - new itemplate(OCE.MINSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17739, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MINSS = new[] { - new itemplate(OCE.MINSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,16965, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MONITOR = new[] { - new itemplate(OCE.MONITOR, 0, new ulong[] {0,0,0,0,0} ,20127, OF.IF_PRESCOTT), - new itemplate(OCE.MONITOR, 3, new ulong[] {REG_EAX,REG_ECX,REG_EDX,0,0} ,20127, OF.IF_PRESCOTT), - -}; - - static itemplate[] instrux_MONTMUL = new[] { - new itemplate(OCE.MONTMUL, 0, new ulong[] {0,0,0,0,0} ,18015, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_MOV = new[] { - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,REG_SREG,0,0,0} ,20138, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG16,REG_SREG,0,0,0} ,20132, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG_SREG,0,0,0} ,20137, OF.IF_386), - new itemplate(OCE.MOV, 2, new ulong[] {REG_SREG,MEMORY,0,0,0} ,21723, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG_SREG,REG16,0,0,0} ,21723, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {REG_SREG,REG32,0,0,0} ,21723, OF.IF_386), - new itemplate(OCE.MOV, 2, new ulong[] {REG_AL,MEM_OFFS,0,0,0} ,21727, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG_AX,MEM_OFFS,0,0,0} ,20142, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG_EAX,MEM_OFFS,0,0,0} ,20147, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG_RAX,MEM_OFFS,0,0,0} ,20152, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEM_OFFS,REG_AL,0,0,0} ,21731, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEM_OFFS,REG_AX,0,0,0} ,20157, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEM_OFFS,REG_EAX,0,0,0} ,20162, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEM_OFFS,REG_RAX,0,0,0} ,20167, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG_CREG,0,0,0} ,16269, OF.IF_386, OF.IF_PRIV, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,REG_CREG,0,0,0} ,16275, OF.IF_X64, OF.IF_PRIV), - new itemplate(OCE.MOV, 2, new ulong[] {REG_CREG,REG32,0,0,0} ,16281, OF.IF_386, OF.IF_PRIV, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {REG_CREG,REG64,0,0,0} ,16287, OF.IF_X64, OF.IF_PRIV), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG_DREG,0,0,0} ,16294, OF.IF_386, OF.IF_PRIV, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,REG_DREG,0,0,0} ,16293, OF.IF_X64, OF.IF_PRIV), - new itemplate(OCE.MOV, 2, new ulong[] {REG_DREG,REG32,0,0,0} ,16300, OF.IF_386, OF.IF_PRIV, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {REG_DREG,REG64,0,0,0} ,16299, OF.IF_X64, OF.IF_PRIV), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG_TREG,0,0,0} ,20172, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {REG_TREG,REG32,0,0,0} ,20177, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21735, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG8,REG8,0,0,0} ,21735, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20182, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG16,REG16,0,0,0} ,20182, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20187, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG32,0,0,0} ,20187, OF.IF_386), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20192, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,REG64,0,0,0} ,20192, OF.IF_X64), - new itemplate(OCE.MOV, 2, new ulong[] {REG8,MEMORY,0,0,0} ,21739, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG8,REG8,0,0,0} ,21739, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20197, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG16,REG16,0,0,0} ,20197, OF.IF_8086), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20202, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,REG32,0,0,0} ,20202, OF.IF_386), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20207, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,REG64,0,0,0} ,20207, OF.IF_X64), - new itemplate(OCE.MOV, 2, new ulong[] {REG8,IMMEDIATE,0,0,0} ,21743, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG16,IMMEDIATE,0,0,0} ,20212, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG32,IMMEDIATE,0,0,0} ,20217, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,IMMEDIATE,0,0,0} ,20222, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {REG64,IMMEDIATE, BITS32,0,0,0} ,16305, OF.IF_X64), - new itemplate(OCE.MOV, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20227, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16311, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16317, OF.IF_386, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16305, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20227, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16311, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.MOV, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16317, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_MOVAPD = new[] { - new itemplate(OCE.MOVAPD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17745, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVAPD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17751, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVAPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17751, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVAPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17745, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MOVAPS = new[] { - new itemplate(OCE.MOVAPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,16971, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVAPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,16977, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVAPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,16971, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVAPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,16977, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVBE = new[] { - new itemplate(OCE.MOVBE, 2, new ulong[] {REG16,MEMORY, BITS16,0,0,0} ,10848, OF.IF_NEHALEM, OF.IF_SM), - new itemplate(OCE.MOVBE, 2, new ulong[] {REG32,MEMORY, BITS32,0,0,0} ,10855, OF.IF_NEHALEM, OF.IF_SM), - new itemplate(OCE.MOVBE, 2, new ulong[] {REG64,MEMORY, BITS64,0,0,0} ,10862, OF.IF_NEHALEM, OF.IF_SM), - new itemplate(OCE.MOVBE, 2, new ulong[] {MEMORY, BITS16,REG16,0,0,0} ,10869, OF.IF_NEHALEM, OF.IF_SM), - new itemplate(OCE.MOVBE, 2, new ulong[] {MEMORY, BITS32,REG32,0,0,0} ,10876, OF.IF_NEHALEM, OF.IF_SM), - new itemplate(OCE.MOVBE, 2, new ulong[] {MEMORY, BITS64,REG64,0,0,0} ,10883, OF.IF_NEHALEM, OF.IF_SM), - -}; - - static itemplate[] instrux_MOVD = new[] { - new itemplate(OCE.MOVD, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,16323, OF.IF_PENT, OF.IF_MMX, OF.IF_SD), - new itemplate(OCE.MOVD, 2, new ulong[] {MMXREG,REG32,0,0,0} ,16323, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.MOVD, 2, new ulong[] {MEMORY,MMXREG,0,0,0} ,16329, OF.IF_PENT, OF.IF_MMX, OF.IF_SD), - new itemplate(OCE.MOVD, 2, new ulong[] {REG32,MMXREG,0,0,0} ,16329, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.MOVD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,8587, OF.IF_X64, OF.IF_SD), - new itemplate(OCE.MOVD, 2, new ulong[] {XMMREG,REG32,0,0,0} ,8587, OF.IF_X64), - new itemplate(OCE.MOVD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,8594, OF.IF_X64, OF.IF_SD), - new itemplate(OCE.MOVD, 2, new ulong[] {REG32,XMMREG,0,0,0} ,8594, OF.IF_X64, OF.IF_SSE), - new itemplate(OCE.MOVD, 2, new ulong[] {XMMREG,REG32,0,0,0} ,17187, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVD, 2, new ulong[] {REG32,XMMREG,0,0,0} ,17193, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17193, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SD), - new itemplate(OCE.MOVD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17187, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SD), - -}; - - static itemplate[] instrux_MOVDDUP = new[] { - new itemplate(OCE.MOVDDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17919, OF.IF_PRESCOTT, OF.IF_SSE3), - -}; - - static itemplate[] instrux_MOVDQ2Q = new[] { - new itemplate(OCE.MOVDQ2Q, 2, new ulong[] {MMXREG,XMMREG,0,0,0} ,17223, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVDQA = new[] { - new itemplate(OCE.MOVDQA, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17199, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVDQA, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17205, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVDQA, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17199, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVDQA, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17205, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVDQU = new[] { - new itemplate(OCE.MOVDQU, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17211, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVDQU, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17217, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVDQU, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17211, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVDQU, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17217, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVHLPS = new[] { - new itemplate(OCE.MOVHLPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,16803, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVHPD = new[] { - new itemplate(OCE.MOVHPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17757, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVHPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17763, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVHPS = new[] { - new itemplate(OCE.MOVHPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,16983, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVHPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,16989, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVLHPS = new[] { - new itemplate(OCE.MOVLHPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,16983, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVLPD = new[] { - new itemplate(OCE.MOVLPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17769, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVLPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17775, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVLPS = new[] { - new itemplate(OCE.MOVLPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,16803, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVLPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,16995, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVMSKPD = new[] { - new itemplate(OCE.MOVMSKPD, 2, new ulong[] {REG32,XMMREG,0,0,0} ,17781, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVMSKPD, 2, new ulong[] {REG64,XMMREG,0,0,0} ,9392, OF.IF_X64, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVMSKPS = new[] { - new itemplate(OCE.MOVMSKPS, 2, new ulong[] {REG32,XMMREG,0,0,0} ,17001, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVMSKPS, 2, new ulong[] {REG64,XMMREG,0,0,0} ,9133, OF.IF_X64, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVNTDQ = new[] { - new itemplate(OCE.MOVNTDQ, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17175, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MOVNTDQA = new[] { - new itemplate(OCE.MOVNTDQA, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,9665, OF.IF_SSE41), - -}; - - static itemplate[] instrux_MOVNTI = new[] { - new itemplate(OCE.MOVNTI, 2, new ulong[] {MEMORY,REG32,0,0,0} ,9218, OF.IF_WILLAMETTE, OF.IF_SD), - new itemplate(OCE.MOVNTI, 2, new ulong[] {MEMORY,REG64,0,0,0} ,9217, OF.IF_X64, OF.IF_SQ), - -}; - - static itemplate[] instrux_MOVNTPD = new[] { - new itemplate(OCE.MOVNTPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17181, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MOVNTPS = new[] { - new itemplate(OCE.MOVNTPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17007, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVNTQ = new[] { - new itemplate(OCE.MOVNTQ, 2, new ulong[] {MEMORY,MMXREG,0,0,0} ,17157, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_MOVNTSD = new[] { - new itemplate(OCE.MOVNTSD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17961, OF.IF_SSE4A, OF.IF_AMD, OF.IF_SQ), - -}; - - static itemplate[] instrux_MOVNTSS = new[] { - new itemplate(OCE.MOVNTSS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17967, OF.IF_SSE4A, OF.IF_AMD, OF.IF_SD), - -}; - - static itemplate[] instrux_MOVQ = new[] { - new itemplate(OCE.MOVQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8601, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.MOVQ, 2, new ulong[] {RM_MMX,MMXREG,0,0,0} ,8608, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.MOVQ, 2, new ulong[] {MMXREG,RM_GPR, BITS64,0,0,0} ,16323, OF.IF_X64, OF.IF_MMX), - new itemplate(OCE.MOVQ, 2, new ulong[] {RM_GPR, BITS64,MMXREG,0,0,0} ,16329, OF.IF_X64, OF.IF_MMX), - new itemplate(OCE.MOVQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17229, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17235, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVQ, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17235, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - new itemplate(OCE.MOVQ, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17229, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SQ), - new itemplate(OCE.MOVQ, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,9224, OF.IF_X64, OF.IF_SSE2), - new itemplate(OCE.MOVQ, 2, new ulong[] {RM_GPR, BITS64,XMMREG,0,0,0} ,9231, OF.IF_X64, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVQ2DQ = new[] { - new itemplate(OCE.MOVQ2DQ, 2, new ulong[] {XMMREG,MMXREG,0,0,0} ,17241, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVSB = new[] { - new itemplate(OCE.MOVSB, 0, new ulong[] {0,0,0,0,0} ,6649, OF.IF_8086), - -}; - - static itemplate[] instrux_MOVSD = new[] { - new itemplate(OCE.MOVSD, 0, new ulong[] {0,0,0,0,0} ,21747, OF.IF_386), - new itemplate(OCE.MOVSD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17787, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVSD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17793, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVSD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17793, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVSD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17787, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MOVSHDUP = new[] { - new itemplate(OCE.MOVSHDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17925, OF.IF_PRESCOTT, OF.IF_SSE3), - -}; - - static itemplate[] instrux_MOVSLDUP = new[] { - new itemplate(OCE.MOVSLDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17931, OF.IF_PRESCOTT, OF.IF_SSE3), - -}; - - static itemplate[] instrux_MOVSQ = new[] { - new itemplate(OCE.MOVSQ, 0, new ulong[] {0,0,0,0,0} ,21751, OF.IF_X64), - -}; - - static itemplate[] instrux_MOVSS = new[] { - new itemplate(OCE.MOVSS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17013, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVSS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17019, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVSS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17013, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVSS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17019, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVSW = new[] { - new itemplate(OCE.MOVSW, 0, new ulong[] {0,0,0,0,0} ,21755, OF.IF_8086), - -}; - - static itemplate[] instrux_MOVSX = new[] { - new itemplate(OCE.MOVSX, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16335, OF.IF_386, OF.IF_SB), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG16,REG8,0,0,0} ,16335, OF.IF_386), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG32,RM_GPR, BITS8,0,0,0} ,16341, OF.IF_386), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG32,RM_GPR, BITS16,0,0,0} ,16347, OF.IF_386), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG64,RM_GPR, BITS8,0,0,0} ,16353, OF.IF_X64), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG64,RM_GPR, BITS16,0,0,0} ,16359, OF.IF_X64), - new itemplate(OCE.MOVSX, 2, new ulong[] {REG64,RM_GPR, BITS32,0,0,0} ,20232, OF.IF_X64), - -}; - - static itemplate[] instrux_MOVSXD = new[] { - new itemplate(OCE.MOVSXD, 2, new ulong[] {REG64,RM_GPR, BITS32,0,0,0} ,20232, OF.IF_X64), - -}; - - static itemplate[] instrux_MOVUPD = new[] { - new itemplate(OCE.MOVUPD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17799, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVUPD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17805, OF.IF_WILLAMETTE, OF.IF_SSE2), - new itemplate(OCE.MOVUPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17805, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.MOVUPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17799, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MOVUPS = new[] { - new itemplate(OCE.MOVUPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,17025, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVUPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,17031, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVUPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17025, OF.IF_KATMAI, OF.IF_SSE), - new itemplate(OCE.MOVUPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,17031, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MOVZX = new[] { - new itemplate(OCE.MOVZX, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16365, OF.IF_386, OF.IF_SB), - new itemplate(OCE.MOVZX, 2, new ulong[] {REG16,REG8,0,0,0} ,16365, OF.IF_386), - new itemplate(OCE.MOVZX, 2, new ulong[] {REG32,RM_GPR, BITS8,0,0,0} ,16371, OF.IF_386), - new itemplate(OCE.MOVZX, 2, new ulong[] {REG32,RM_GPR, BITS16,0,0,0} ,16377, OF.IF_386), - new itemplate(OCE.MOVZX, 2, new ulong[] {REG64,RM_GPR, BITS8,0,0,0} ,16383, OF.IF_X64), - new itemplate(OCE.MOVZX, 2, new ulong[] {REG64,RM_GPR, BITS16,0,0,0} ,16389, OF.IF_X64), - -}; - - static itemplate[] instrux_MPSADBW = new[] { - new itemplate(OCE.MPSADBW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7132, OF.IF_SSE41), - -}; - - static itemplate[] instrux_MUL = new[] { - new itemplate(OCE.MUL, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21759, OF.IF_8086), - new itemplate(OCE.MUL, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,20237, OF.IF_8086), - new itemplate(OCE.MUL, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,20242, OF.IF_386), - new itemplate(OCE.MUL, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,20247, OF.IF_X64), - -}; - - static itemplate[] instrux_MULPD = new[] { - new itemplate(OCE.MULPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17811, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_MULPS = new[] { - new itemplate(OCE.MULPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17037, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MULSD = new[] { - new itemplate(OCE.MULSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17817, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_MULSS = new[] { - new itemplate(OCE.MULSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17043, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_MWAIT = new[] { - new itemplate(OCE.MWAIT, 0, new ulong[] {0,0,0,0,0} ,20252, OF.IF_PRESCOTT), - new itemplate(OCE.MWAIT, 2, new ulong[] {REG_EAX,REG_ECX,0,0,0} ,20252, OF.IF_PRESCOTT), - -}; - - static itemplate[] instrux_NEG = new[] { - new itemplate(OCE.NEG, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21763, OF.IF_8086), - new itemplate(OCE.NEG, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,20257, OF.IF_8086), - new itemplate(OCE.NEG, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,20262, OF.IF_386), - new itemplate(OCE.NEG, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,20267, OF.IF_X64), - -}; - - static itemplate[] instrux_NOP = new[] { - new itemplate(OCE.NOP, 0, new ulong[] {0,0,0,0,0} ,21767, OF.IF_8086), - new itemplate(OCE.NOP, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,16395, OF.IF_P6), - new itemplate(OCE.NOP, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,16401, OF.IF_P6), - new itemplate(OCE.NOP, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,16407, OF.IF_X64), - -}; - - static itemplate[] instrux_NOT = new[] { - new itemplate(OCE.NOT, 1, new ulong[] {RM_GPR, BITS8,0,0,0,0} ,21771, OF.IF_8086), - new itemplate(OCE.NOT, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,20272, OF.IF_8086), - new itemplate(OCE.NOT, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,20277, OF.IF_386), - new itemplate(OCE.NOT, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,20282, OF.IF_X64), - -}; - - static itemplate[] instrux_OR = new[] { - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21775, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG8,REG8,0,0,0} ,21775, OF.IF_8086), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20287, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG16,REG16,0,0,0} ,20287, OF.IF_8086), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20292, OF.IF_386, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG32,REG32,0,0,0} ,20292, OF.IF_386), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20297, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG64,REG64,0,0,0} ,20297, OF.IF_X64), - new itemplate(OCE.OR, 2, new ulong[] {REG8,MEMORY,0,0,0} ,13588, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG8,REG8,0,0,0} ,13588, OF.IF_8086), - new itemplate(OCE.OR, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20302, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG16,REG16,0,0,0} ,20302, OF.IF_8086), - new itemplate(OCE.OR, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20307, OF.IF_386, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG32,REG32,0,0,0} ,20307, OF.IF_386), - new itemplate(OCE.OR, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20312, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG64,REG64,0,0,0} ,20312, OF.IF_X64), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,16413, OF.IF_8086), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,16419, OF.IF_386), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,16425, OF.IF_X64), - new itemplate(OCE.OR, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21779, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,16413, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,20317, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,16419, OF.IF_386, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,20322, OF.IF_386, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,16425, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,20327, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20332, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16431, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16437, OF.IF_386, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16443, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20332, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16431, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.OR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16437, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_ORPD = new[] { - new itemplate(OCE.ORPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17823, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_ORPS = new[] { - new itemplate(OCE.ORPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17049, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_OUT = new[] { - new itemplate(OCE.OUT, 2, new ulong[] {IMMEDIATE,REG_AL,0,0,0} ,21783, OF.IF_8086, OF.IF_SB), - new itemplate(OCE.OUT, 2, new ulong[] {IMMEDIATE,REG_AX,0,0,0} ,20337, OF.IF_8086, OF.IF_SB), - new itemplate(OCE.OUT, 2, new ulong[] {IMMEDIATE,REG_EAX,0,0,0} ,20342, OF.IF_386, OF.IF_SB), - new itemplate(OCE.OUT, 2, new ulong[] {REG_DX,REG_AL,0,0,0} ,22140, OF.IF_8086), - new itemplate(OCE.OUT, 2, new ulong[] {REG_DX,REG_AX,0,0,0} ,21787, OF.IF_8086), - new itemplate(OCE.OUT, 2, new ulong[] {REG_DX,REG_EAX,0,0,0} ,21791, OF.IF_386), - -}; - - static itemplate[] instrux_OUTSB = new[] { - new itemplate(OCE.OUTSB, 0, new ulong[] {0,0,0,0,0} ,22143, OF.IF_186), - -}; - - static itemplate[] instrux_OUTSD = new[] { - new itemplate(OCE.OUTSD, 0, new ulong[] {0,0,0,0,0} ,21795, OF.IF_386), - -}; - - static itemplate[] instrux_OUTSW = new[] { - new itemplate(OCE.OUTSW, 0, new ulong[] {0,0,0,0,0} ,21799, OF.IF_186), - -}; - - static itemplate[] instrux_PABSB = new[] { - new itemplate(OCE.PABSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9420, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PABSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9427, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PABSD = new[] { - new itemplate(OCE.PABSD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9448, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PABSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9455, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PABSW = new[] { - new itemplate(OCE.PABSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9434, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PABSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9441, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PACKSSDW = new[] { - new itemplate(OCE.PACKSSDW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8615, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PACKSSDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17253, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PACKSSWB = new[] { - new itemplate(OCE.PACKSSWB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8622, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PACKSSWB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17247, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PACKUSDW = new[] { - new itemplate(OCE.PACKUSDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9672, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PACKUSWB = new[] { - new itemplate(OCE.PACKUSWB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8629, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PACKUSWB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17259, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDB = new[] { - new itemplate(OCE.PADDB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8636, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17265, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDD = new[] { - new itemplate(OCE.PADDD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8643, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17277, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDQ = new[] { - new itemplate(OCE.PADDQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,17283, OF.IF_WILLAMETTE, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17289, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDSB = new[] { - new itemplate(OCE.PADDSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8650, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17295, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDSIW = new[] { - new itemplate(OCE.PADDSIW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16449, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PADDSW = new[] { - new itemplate(OCE.PADDSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8657, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17301, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDUSB = new[] { - new itemplate(OCE.PADDUSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8664, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDUSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17307, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDUSW = new[] { - new itemplate(OCE.PADDUSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8671, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDUSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17313, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PADDW = new[] { - new itemplate(OCE.PADDW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8678, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PADDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17271, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PALIGNR = new[] { - new itemplate(OCE.PALIGNR, 3, new ulong[] {MMXREG,RM_MMX,IMMEDIATE,0,0} ,7060, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PALIGNR, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7068, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PAND = new[] { - new itemplate(OCE.PAND, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8685, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PAND, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17319, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PANDN = new[] { - new itemplate(OCE.PANDN, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8692, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PANDN, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17325, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PAUSE = new[] { - new itemplate(OCE.PAUSE, 0, new ulong[] {0,0,0,0,0} ,20347, OF.IF_8086), - -}; - - static itemplate[] instrux_PAVEB = new[] { - new itemplate(OCE.PAVEB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16455, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PAVGB = new[] { - new itemplate(OCE.PAVGB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9147, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PAVGB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17331, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PAVGUSB = new[] { - new itemplate(OCE.PAVGUSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6588, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PAVGW = new[] { - new itemplate(OCE.PAVGW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9154, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PAVGW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17337, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PBLENDVB = new[] { - new itemplate(OCE.PBLENDVB, 3, new ulong[] {XMMREG,RM_XMM,XMM0,0,0} ,9679, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PBLENDW = new[] { - new itemplate(OCE.PBLENDW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7140, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PCLMULHQHQDQ = new[] { - new itemplate(OCE.PCLMULHQHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5031, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_PCLMULHQLQDQ = new[] { - new itemplate(OCE.PCLMULHQLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5013, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_PCLMULLQHQDQ = new[] { - new itemplate(OCE.PCLMULLQHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5022, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_PCLMULLQLQDQ = new[] { - new itemplate(OCE.PCLMULLQLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5004, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_PCLMULQDQ = new[] { - new itemplate(OCE.PCLMULQDQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8188, OF.IF_SSE, OF.IF_WESTMERE, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMOV = new[] { - new itemplate(OCE.PCMOV, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10393, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PCMOV, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10400, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PCMOV, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10407, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PCMOV, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10414, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PCMPEQB = new[] { - new itemplate(OCE.PCMPEQB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8699, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPEQB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17343, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPEQD = new[] { - new itemplate(OCE.PCMPEQD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8706, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPEQD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17355, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPEQQ = new[] { - new itemplate(OCE.PCMPEQQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9686, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PCMPEQW = new[] { - new itemplate(OCE.PCMPEQW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8713, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPEQW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17349, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPESTRI = new[] { - new itemplate(OCE.PCMPESTRI, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7212, OF.IF_SSE42), - -}; - - static itemplate[] instrux_PCMPESTRM = new[] { - new itemplate(OCE.PCMPESTRM, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7220, OF.IF_SSE42), - -}; - - static itemplate[] instrux_PCMPGTB = new[] { - new itemplate(OCE.PCMPGTB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8720, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPGTB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17361, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPGTD = new[] { - new itemplate(OCE.PCMPGTD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8727, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPGTD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17373, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPGTQ = new[] { - new itemplate(OCE.PCMPGTQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9861, OF.IF_SSE42), - -}; - - static itemplate[] instrux_PCMPGTW = new[] { - new itemplate(OCE.PCMPGTW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8734, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PCMPGTW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17367, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PCMPISTRI = new[] { - new itemplate(OCE.PCMPISTRI, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7228, OF.IF_SSE42), - -}; - - static itemplate[] instrux_PCMPISTRM = new[] { - new itemplate(OCE.PCMPISTRM, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7236, OF.IF_SSE42), - -}; - - static itemplate[] instrux_PCOMB = new[] { - new itemplate(OCE.PCOMB, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7276, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMD = new[] { - new itemplate(OCE.PCOMD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7292, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQB = new[] { - new itemplate(OCE.PCOMEQB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,666, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQD = new[] { - new itemplate(OCE.PCOMEQD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,810, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQQ = new[] { - new itemplate(OCE.PCOMEQQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,882, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQUB = new[] { - new itemplate(OCE.PCOMEQUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,954, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQUD = new[] { - new itemplate(OCE.PCOMEQUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1098, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQUQ = new[] { - new itemplate(OCE.PCOMEQUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1170, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQUW = new[] { - new itemplate(OCE.PCOMEQUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1026, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMEQW = new[] { - new itemplate(OCE.PCOMEQW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,738, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEB = new[] { - new itemplate(OCE.PCOMFALSEB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,684, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSED = new[] { - new itemplate(OCE.PCOMFALSED, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,828, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEQ = new[] { - new itemplate(OCE.PCOMFALSEQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,900, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEUB = new[] { - new itemplate(OCE.PCOMFALSEUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,972, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEUD = new[] { - new itemplate(OCE.PCOMFALSEUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1116, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEUQ = new[] { - new itemplate(OCE.PCOMFALSEUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1188, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEUW = new[] { - new itemplate(OCE.PCOMFALSEUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1044, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMFALSEW = new[] { - new itemplate(OCE.PCOMFALSEW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,756, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEB = new[] { - new itemplate(OCE.PCOMGEB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,657, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGED = new[] { - new itemplate(OCE.PCOMGED, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,801, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEQ = new[] { - new itemplate(OCE.PCOMGEQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,873, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEUB = new[] { - new itemplate(OCE.PCOMGEUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,945, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEUD = new[] { - new itemplate(OCE.PCOMGEUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1089, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEUQ = new[] { - new itemplate(OCE.PCOMGEUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1161, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEUW = new[] { - new itemplate(OCE.PCOMGEUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1017, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGEW = new[] { - new itemplate(OCE.PCOMGEW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,729, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTB = new[] { - new itemplate(OCE.PCOMGTB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,648, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTD = new[] { - new itemplate(OCE.PCOMGTD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,792, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTQ = new[] { - new itemplate(OCE.PCOMGTQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,864, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTUB = new[] { - new itemplate(OCE.PCOMGTUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,936, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTUD = new[] { - new itemplate(OCE.PCOMGTUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1080, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTUQ = new[] { - new itemplate(OCE.PCOMGTUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1152, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTUW = new[] { - new itemplate(OCE.PCOMGTUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1008, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMGTW = new[] { - new itemplate(OCE.PCOMGTW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,720, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEB = new[] { - new itemplate(OCE.PCOMLEB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,639, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLED = new[] { - new itemplate(OCE.PCOMLED, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,783, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEQ = new[] { - new itemplate(OCE.PCOMLEQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,855, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEUB = new[] { - new itemplate(OCE.PCOMLEUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,927, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEUD = new[] { - new itemplate(OCE.PCOMLEUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1071, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEUQ = new[] { - new itemplate(OCE.PCOMLEUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1143, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEUW = new[] { - new itemplate(OCE.PCOMLEUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,999, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLEW = new[] { - new itemplate(OCE.PCOMLEW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,711, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTB = new[] { - new itemplate(OCE.PCOMLTB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,630, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTD = new[] { - new itemplate(OCE.PCOMLTD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,774, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTQ = new[] { - new itemplate(OCE.PCOMLTQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,846, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTUB = new[] { - new itemplate(OCE.PCOMLTUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,918, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTUD = new[] { - new itemplate(OCE.PCOMLTUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1062, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTUQ = new[] { - new itemplate(OCE.PCOMLTUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1134, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTUW = new[] { - new itemplate(OCE.PCOMLTUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,990, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMLTW = new[] { - new itemplate(OCE.PCOMLTW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,702, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQB = new[] { - new itemplate(OCE.PCOMNEQB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,675, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQD = new[] { - new itemplate(OCE.PCOMNEQD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,819, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQQ = new[] { - new itemplate(OCE.PCOMNEQQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,891, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQUB = new[] { - new itemplate(OCE.PCOMNEQUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,963, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQUD = new[] { - new itemplate(OCE.PCOMNEQUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1107, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQUQ = new[] { - new itemplate(OCE.PCOMNEQUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1179, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQUW = new[] { - new itemplate(OCE.PCOMNEQUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1035, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMNEQW = new[] { - new itemplate(OCE.PCOMNEQW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,747, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMQ = new[] { - new itemplate(OCE.PCOMQ, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7300, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEB = new[] { - new itemplate(OCE.PCOMTRUEB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,693, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUED = new[] { - new itemplate(OCE.PCOMTRUED, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,837, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEQ = new[] { - new itemplate(OCE.PCOMTRUEQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,909, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEUB = new[] { - new itemplate(OCE.PCOMTRUEUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,981, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEUD = new[] { - new itemplate(OCE.PCOMTRUEUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1125, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEUQ = new[] { - new itemplate(OCE.PCOMTRUEUQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1197, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEUW = new[] { - new itemplate(OCE.PCOMTRUEUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1053, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMTRUEW = new[] { - new itemplate(OCE.PCOMTRUEW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,765, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMUB = new[] { - new itemplate(OCE.PCOMUB, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7308, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMUD = new[] { - new itemplate(OCE.PCOMUD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7324, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMUQ = new[] { - new itemplate(OCE.PCOMUQ, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7332, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMUW = new[] { - new itemplate(OCE.PCOMUW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7316, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PCOMW = new[] { - new itemplate(OCE.PCOMW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7284, OF.IF_SSE5, OF.IF_AMD, OF.IF_SO), - -}; - - static itemplate[] instrux_PDISTIB = new[] { - new itemplate(OCE.PDISTIB, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17620, OF.IF_PENT, OF.IF_MMX, OF.IF_SM, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PERMPD = new[] { - new itemplate(OCE.PERMPD, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10365, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPD, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10372, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10379, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPD, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10386, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PERMPS = new[] { - new itemplate(OCE.PERMPS, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10337, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPS, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10344, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10351, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PERMPS, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10358, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PEXTRB = new[] { - new itemplate(OCE.PEXTRB, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,10, OF.IF_SSE41), - new itemplate(OCE.PEXTRB, 3, new ulong[] {MEMORY, BITS8,XMMREG,IMMEDIATE,0,0} ,10, OF.IF_SSE41), - new itemplate(OCE.PEXTRB, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,9, OF.IF_SSE41, OF.IF_X64), - -}; - - static itemplate[] instrux_PEXTRD = new[] { - new itemplate(OCE.PEXTRD, 3, new ulong[] {RM_GPR, BITS32,XMMREG,IMMEDIATE,0,0} ,19, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PEXTRQ = new[] { - new itemplate(OCE.PEXTRQ, 3, new ulong[] {RM_GPR, BITS64,XMMREG,IMMEDIATE,0,0} ,18, OF.IF_SSE41, OF.IF_X64), - -}; - - static itemplate[] instrux_PEXTRW = new[] { - new itemplate(OCE.PEXTRW, 3, new ulong[] {REG32,MMXREG,IMMEDIATE,0,0} ,9161, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PEXTRW, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,9238, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PEXTRW, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,28, OF.IF_SSE41), - new itemplate(OCE.PEXTRW, 3, new ulong[] {MEMORY, BITS16,XMMREG,IMMEDIATE,0,0} ,28, OF.IF_SSE41), - new itemplate(OCE.PEXTRW, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,27, OF.IF_SSE41, OF.IF_X64), - -}; - - static itemplate[] instrux_PF2ID = new[] { - new itemplate(OCE.PF2ID, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6596, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PF2IW = new[] { - new itemplate(OCE.PF2IW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6876, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFACC = new[] { - new itemplate(OCE.PFACC, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6604, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFADD = new[] { - new itemplate(OCE.PFADD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6612, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFCMPEQ = new[] { - new itemplate(OCE.PFCMPEQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6620, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFCMPGE = new[] { - new itemplate(OCE.PFCMPGE, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6628, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFCMPGT = new[] { - new itemplate(OCE.PFCMPGT, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6636, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFMAX = new[] { - new itemplate(OCE.PFMAX, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6644, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFMIN = new[] { - new itemplate(OCE.PFMIN, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6652, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFMUL = new[] { - new itemplate(OCE.PFMUL, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6660, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFNACC = new[] { - new itemplate(OCE.PFNACC, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6884, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFPNACC = new[] { - new itemplate(OCE.PFPNACC, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6892, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRCP = new[] { - new itemplate(OCE.PFRCP, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6668, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRCPIT1 = new[] { - new itemplate(OCE.PFRCPIT1, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6676, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRCPIT2 = new[] { - new itemplate(OCE.PFRCPIT2, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6684, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRCPV = new[] { - new itemplate(OCE.PFRCPV, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,7372, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PFRSQIT1 = new[] { - new itemplate(OCE.PFRSQIT1, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6692, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRSQRT = new[] { - new itemplate(OCE.PFRSQRT, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6700, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFRSQRTV = new[] { - new itemplate(OCE.PFRSQRTV, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,7380, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PFSUB = new[] { - new itemplate(OCE.PFSUB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6708, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PFSUBR = new[] { - new itemplate(OCE.PFSUBR, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6716, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PHADDBD = new[] { - new itemplate(OCE.PHADDBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10750, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDBQ = new[] { - new itemplate(OCE.PHADDBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10757, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDBW = new[] { - new itemplate(OCE.PHADDBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10743, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDD = new[] { - new itemplate(OCE.PHADDD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9476, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHADDD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9483, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHADDDQ = new[] { - new itemplate(OCE.PHADDDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10778, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDSW = new[] { - new itemplate(OCE.PHADDSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9490, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHADDSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9497, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHADDUBD = new[] { - new itemplate(OCE.PHADDUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10792, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDUBQ = new[] { - new itemplate(OCE.PHADDUBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10799, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDUBW = new[] { - new itemplate(OCE.PHADDUBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10785, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDUDQ = new[] { - new itemplate(OCE.PHADDUDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10820, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDUWD = new[] { - new itemplate(OCE.PHADDUWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10806, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDUWQ = new[] { - new itemplate(OCE.PHADDUWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10813, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDW = new[] { - new itemplate(OCE.PHADDW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9462, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHADDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9469, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHADDWD = new[] { - new itemplate(OCE.PHADDWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10764, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHADDWQ = new[] { - new itemplate(OCE.PHADDWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10771, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHMINPOSUW = new[] { - new itemplate(OCE.PHMINPOSUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9693, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PHSUBBW = new[] { - new itemplate(OCE.PHSUBBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10827, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHSUBD = new[] { - new itemplate(OCE.PHSUBD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9518, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHSUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9525, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHSUBDQ = new[] { - new itemplate(OCE.PHSUBDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10841, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PHSUBSW = new[] { - new itemplate(OCE.PHSUBSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9532, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHSUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9539, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHSUBW = new[] { - new itemplate(OCE.PHSUBW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9504, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PHSUBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9511, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PHSUBWD = new[] { - new itemplate(OCE.PHSUBWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10834, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PI2FD = new[] { - new itemplate(OCE.PI2FD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6724, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PI2FW = new[] { - new itemplate(OCE.PI2FW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6900, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PINSRB = new[] { - new itemplate(OCE.PINSRB, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,37, OF.IF_SSE41, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRB, 3, new ulong[] {XMMREG,RM_GPR, BITS8,IMMEDIATE,0,0} ,36, OF.IF_SSE41, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRB, 3, new ulong[] {XMMREG,REG32,IMMEDIATE,0,0} ,37, OF.IF_SSE41, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PINSRD = new[] { - new itemplate(OCE.PINSRD, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,46, OF.IF_SSE41, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRD, 3, new ulong[] {XMMREG,RM_GPR, BITS32,IMMEDIATE,0,0} ,46, OF.IF_SSE41, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PINSRQ = new[] { - new itemplate(OCE.PINSRQ, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,45, OF.IF_SSE41, OF.IF_X64, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRQ, 3, new ulong[] {XMMREG,RM_GPR, BITS64,IMMEDIATE,0,0} ,45, OF.IF_SSE41, OF.IF_X64, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PINSRW = new[] { - new itemplate(OCE.PINSRW, 3, new ulong[] {MMXREG,MEMORY,IMMEDIATE,0,0} ,9168, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {MMXREG,RM_GPR, BITS16,IMMEDIATE,0,0} ,9168, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {MMXREG,REG32,IMMEDIATE,0,0} ,9168, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {XMMREG,REG16,IMMEDIATE,0,0} ,9245, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {XMMREG,REG32,IMMEDIATE,0,0} ,9245, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9245, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PINSRW, 3, new ulong[] {XMMREG,MEMORY, BITS16,IMMEDIATE,0,0} ,9245, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PMACHRIW = new[] { - new itemplate(OCE.PMACHRIW, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17716, OF.IF_PENT, OF.IF_MMX, OF.IF_SM, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMACSDD = new[] { - new itemplate(OCE.PMACSDD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10484, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSDQH = new[] { - new itemplate(OCE.PMACSDQH, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10512, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSDQL = new[] { - new itemplate(OCE.PMACSDQL, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10498, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSSDD = new[] { - new itemplate(OCE.PMACSSDD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10477, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSSDQH = new[] { - new itemplate(OCE.PMACSSDQH, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10505, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSSDQL = new[] { - new itemplate(OCE.PMACSSDQL, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10491, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSSWD = new[] { - new itemplate(OCE.PMACSSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10463, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSSWW = new[] { - new itemplate(OCE.PMACSSWW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10449, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSWD = new[] { - new itemplate(OCE.PMACSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10470, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMACSWW = new[] { - new itemplate(OCE.PMACSWW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10456, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMADCSSWD = new[] { - new itemplate(OCE.PMADCSSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10519, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMADCSWD = new[] { - new itemplate(OCE.PMADCSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10526, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PMADDUBSW = new[] { - new itemplate(OCE.PMADDUBSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9546, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMADDUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9553, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PMADDWD = new[] { - new itemplate(OCE.PMADDWD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8741, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMADDWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17379, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMAGW = new[] { - new itemplate(OCE.PMAGW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16461, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMAXSB = new[] { - new itemplate(OCE.PMAXSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9700, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMAXSD = new[] { - new itemplate(OCE.PMAXSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9707, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMAXSW = new[] { - new itemplate(OCE.PMAXSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9175, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMAXSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17385, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMAXUB = new[] { - new itemplate(OCE.PMAXUB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9182, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMAXUB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17391, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMAXUD = new[] { - new itemplate(OCE.PMAXUD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9714, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMAXUW = new[] { - new itemplate(OCE.PMAXUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9721, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMINSB = new[] { - new itemplate(OCE.PMINSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9728, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMINSD = new[] { - new itemplate(OCE.PMINSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9735, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMINSW = new[] { - new itemplate(OCE.PMINSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9189, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMINSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17397, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMINUB = new[] { - new itemplate(OCE.PMINUB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9196, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMINUB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17403, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMINUD = new[] { - new itemplate(OCE.PMINUD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9742, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMINUW = new[] { - new itemplate(OCE.PMINUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9749, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMOVMSKB = new[] { - new itemplate(OCE.PMOVMSKB, 2, new ulong[] {REG32,MMXREG,0,0,0} ,17163, OF.IF_KATMAI, OF.IF_MMX), - new itemplate(OCE.PMOVMSKB, 2, new ulong[] {REG32,XMMREG,0,0,0} ,17409, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_PMOVSXBD = new[] { - new itemplate(OCE.PMOVSXBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9763, OF.IF_SSE41, OF.IF_SD), - -}; - - static itemplate[] instrux_PMOVSXBQ = new[] { - new itemplate(OCE.PMOVSXBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9770, OF.IF_SSE41, OF.IF_SW), - -}; - - static itemplate[] instrux_PMOVSXBW = new[] { - new itemplate(OCE.PMOVSXBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9756, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVSXDQ = new[] { - new itemplate(OCE.PMOVSXDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9791, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVSXWD = new[] { - new itemplate(OCE.PMOVSXWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9777, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVSXWQ = new[] { - new itemplate(OCE.PMOVSXWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9784, OF.IF_SSE41, OF.IF_SD), - -}; - - static itemplate[] instrux_PMOVZXBD = new[] { - new itemplate(OCE.PMOVZXBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9805, OF.IF_SSE41, OF.IF_SD), - -}; - - static itemplate[] instrux_PMOVZXBQ = new[] { - new itemplate(OCE.PMOVZXBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9812, OF.IF_SSE41, OF.IF_SW), - -}; - - static itemplate[] instrux_PMOVZXBW = new[] { - new itemplate(OCE.PMOVZXBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9798, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVZXDQ = new[] { - new itemplate(OCE.PMOVZXDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9833, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVZXWD = new[] { - new itemplate(OCE.PMOVZXWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9819, OF.IF_SSE41, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMOVZXWQ = new[] { - new itemplate(OCE.PMOVZXWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9826, OF.IF_SSE41, OF.IF_SD), - -}; - - static itemplate[] instrux_PMULDQ = new[] { - new itemplate(OCE.PMULDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9840, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMULHRIW = new[] { - new itemplate(OCE.PMULHRIW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16467, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMULHRSW = new[] { - new itemplate(OCE.PMULHRSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9560, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMULHRSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9567, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PMULHRWA = new[] { - new itemplate(OCE.PMULHRWA, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6732, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PMULHRWC = new[] { - new itemplate(OCE.PMULHRWC, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16473, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMULHUW = new[] { - new itemplate(OCE.PMULHUW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9203, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMULHUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17415, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMULHW = new[] { - new itemplate(OCE.PMULHW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8748, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMULHW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17421, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMULLD = new[] { - new itemplate(OCE.PMULLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9847, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PMULLW = new[] { - new itemplate(OCE.PMULLW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8755, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PMULLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17427, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMULUDQ = new[] { - new itemplate(OCE.PMULUDQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9252, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PMULUDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17433, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PMVGEZB = new[] { - new itemplate(OCE.PMVGEZB, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17848, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMVLZB = new[] { - new itemplate(OCE.PMVLZB, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17704, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMVNZB = new[] { - new itemplate(OCE.PMVNZB, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17686, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PMVZB = new[] { - new itemplate(OCE.PMVZB, 2, new ulong[] {MMXREG,MEMORY,0,0,0} ,17608, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_POP = new[] { - new itemplate(OCE.POP, 1, new ulong[] {REG16,0,0,0,0} ,21803, OF.IF_8086), - new itemplate(OCE.POP, 1, new ulong[] {REG32,0,0,0,0} ,21807, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.POP, 1, new ulong[] {REG64,0,0,0,0} ,21811, OF.IF_X64), - new itemplate(OCE.POP, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,20352, OF.IF_8086), - new itemplate(OCE.POP, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,20357, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.POP, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,20362, OF.IF_X64), - new itemplate(OCE.POP, 1, new ulong[] {REG_CS,0,0,0,0} ,4407, OF.IF_8086, OF.IF_UNDOC), - new itemplate(OCE.POP, 1, new ulong[] {REG_DESS,0,0,0,0} ,21621, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.POP, 1, new ulong[] {REG_FSGS,0,0,0,0} ,21815, OF.IF_386), - -}; - - static itemplate[] instrux_POPA = new[] { - new itemplate(OCE.POPA, 0, new ulong[] {0,0,0,0,0} ,21819, OF.IF_186, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_POPAD = new[] { - new itemplate(OCE.POPAD, 0, new ulong[] {0,0,0,0,0} ,21823, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_POPAW = new[] { - new itemplate(OCE.POPAW, 0, new ulong[] {0,0,0,0,0} ,21827, OF.IF_186, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_POPCNT = new[] { - new itemplate(OCE.POPCNT, 2, new ulong[] {REG16,RM_GPR, BITS16,0,0,0} ,9868, OF.IF_NEHALEM, OF.IF_SW), - new itemplate(OCE.POPCNT, 2, new ulong[] {REG32,RM_GPR, BITS32,0,0,0} ,9875, OF.IF_NEHALEM, OF.IF_SD), - new itemplate(OCE.POPCNT, 2, new ulong[] {REG64,RM_GPR, BITS64,0,0,0} ,9882, OF.IF_NEHALEM, OF.IF_SQ, OF.IF_X64), - -}; - - static itemplate[] instrux_POPF = new[] { - new itemplate(OCE.POPF, 0, new ulong[] {0,0,0,0,0} ,21831, OF.IF_8086), - -}; - - static itemplate[] instrux_POPFD = new[] { - new itemplate(OCE.POPFD, 0, new ulong[] {0,0,0,0,0} ,21835, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_POPFQ = new[] { - new itemplate(OCE.POPFQ, 0, new ulong[] {0,0,0,0,0} ,21835, OF.IF_X64), - -}; - - static itemplate[] instrux_POPFW = new[] { - new itemplate(OCE.POPFW, 0, new ulong[] {0,0,0,0,0} ,21839, OF.IF_8086), - -}; - - static itemplate[] instrux_POR = new[] { - new itemplate(OCE.POR, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8762, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.POR, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17439, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PPERM = new[] { - new itemplate(OCE.PPERM, 4, new ulong[] {XMMREG,SAME_AS, 0,XMMREG,RM_XMM,0} ,10421, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PPERM, 4, new ulong[] {XMMREG,SAME_AS, 0,RM_XMM,XMMREG,0} ,10428, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PPERM, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,SAME_AS, 0,0} ,10435, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PPERM, 4, new ulong[] {XMMREG,RM_XMM,XMMREG,SAME_AS, 0,0} ,10442, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PREFETCH = new[] { - new itemplate(OCE.PREFETCH, 1, new ulong[] {MEMORY,0,0,0,0} ,20367, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PREFETCHNTA = new[] { - new itemplate(OCE.PREFETCHNTA, 1, new ulong[] {MEMORY,0,0,0,0} ,18046, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_PREFETCHT0 = new[] { - new itemplate(OCE.PREFETCHT0, 1, new ulong[] {MEMORY,0,0,0,0} ,18064, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_PREFETCHT1 = new[] { - new itemplate(OCE.PREFETCHT1, 1, new ulong[] {MEMORY,0,0,0,0} ,18082, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_PREFETCHT2 = new[] { - new itemplate(OCE.PREFETCHT2, 1, new ulong[] {MEMORY,0,0,0,0} ,18100, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_PREFETCHW = new[] { - new itemplate(OCE.PREFETCHW, 1, new ulong[] {MEMORY,0,0,0,0} ,20372, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PROTB = new[] { - new itemplate(OCE.PROTB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10533, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10540, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTB, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7340, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PROTD = new[] { - new itemplate(OCE.PROTD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10561, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10568, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7356, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PROTQ = new[] { - new itemplate(OCE.PROTQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10575, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10582, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7364, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PROTW = new[] { - new itemplate(OCE.PROTW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10547, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10554, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PROTW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7348, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSADBW = new[] { - new itemplate(OCE.PSADBW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9210, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSADBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17445, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSHAB = new[] { - new itemplate(OCE.PSHAB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10645, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHAB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10652, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHAD = new[] { - new itemplate(OCE.PSHAD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10673, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHAD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10680, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHAQ = new[] { - new itemplate(OCE.PSHAQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10687, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHAQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10694, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHAW = new[] { - new itemplate(OCE.PSHAW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10659, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHAW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10666, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHLB = new[] { - new itemplate(OCE.PSHLB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10589, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHLB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10596, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHLD = new[] { - new itemplate(OCE.PSHLD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10617, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHLD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10624, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHLQ = new[] { - new itemplate(OCE.PSHLQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10631, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHLQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10638, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHLW = new[] { - new itemplate(OCE.PSHLW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10603, OF.IF_SSE5, OF.IF_AMD), - new itemplate(OCE.PSHLW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,10610, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_PSHUFB = new[] { - new itemplate(OCE.PSHUFB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9574, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSHUFB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9581, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PSHUFD = new[] { - new itemplate(OCE.PSHUFD, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9259, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PSHUFD, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9259, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PSHUFHW = new[] { - new itemplate(OCE.PSHUFHW, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9266, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PSHUFHW, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9266, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PSHUFLW = new[] { - new itemplate(OCE.PSHUFLW, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9273, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.PSHUFLW, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9273, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PSHUFW = new[] { - new itemplate(OCE.PSHUFW, 3, new ulong[] {MMXREG,RM_MMX,IMMEDIATE,0,0} ,6868, OF.IF_KATMAI, OF.IF_MMX, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_PSIGNB = new[] { - new itemplate(OCE.PSIGNB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9588, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSIGNB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9595, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PSIGND = new[] { - new itemplate(OCE.PSIGND, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9616, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSIGND, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9623, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PSIGNW = new[] { - new itemplate(OCE.PSIGNW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9602, OF.IF_SSSE3, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSIGNW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9609, OF.IF_SSSE3), - -}; - - static itemplate[] instrux_PSLLD = new[] { - new itemplate(OCE.PSLLD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8769, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSLLD, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8776, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSLLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17457, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSLLD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9294, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSLLDQ = new[] { - new itemplate(OCE.PSLLDQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9280, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSLLQ = new[] { - new itemplate(OCE.PSLLQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8783, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSLLQ, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8790, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSLLQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17463, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSLLQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9301, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSLLW = new[] { - new itemplate(OCE.PSLLW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8797, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSLLW, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8804, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSLLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17451, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSLLW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9287, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRAD = new[] { - new itemplate(OCE.PSRAD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8811, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSRAD, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8818, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSRAD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17475, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSRAD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9315, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRAW = new[] { - new itemplate(OCE.PSRAW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8825, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSRAW, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8832, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSRAW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17469, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSRAW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9308, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRLD = new[] { - new itemplate(OCE.PSRLD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8839, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSRLD, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8846, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSRLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17487, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSRLD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9336, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRLDQ = new[] { - new itemplate(OCE.PSRLDQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9322, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRLQ = new[] { - new itemplate(OCE.PSRLQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8853, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSRLQ, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8860, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSRLQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17493, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSRLQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9343, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSRLW = new[] { - new itemplate(OCE.PSRLW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8867, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSRLW, 2, new ulong[] {MMXREG,IMMEDIATE,0,0,0} ,8874, OF.IF_PENT, OF.IF_MMX), - new itemplate(OCE.PSRLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17481, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSRLW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,9329, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR1), - -}; - - static itemplate[] instrux_PSUBB = new[] { - new itemplate(OCE.PSUBB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8881, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17499, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBD = new[] { - new itemplate(OCE.PSUBD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8888, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17511, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBQ = new[] { - new itemplate(OCE.PSUBQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,9350, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - new itemplate(OCE.PSUBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17517, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBSB = new[] { - new itemplate(OCE.PSUBSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8895, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17523, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBSIW = new[] { - new itemplate(OCE.PSUBSIW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,16479, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_PSUBSW = new[] { - new itemplate(OCE.PSUBSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8902, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17529, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBUSB = new[] { - new itemplate(OCE.PSUBUSB, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8909, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBUSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17535, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBUSW = new[] { - new itemplate(OCE.PSUBUSW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8916, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBUSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17541, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSUBW = new[] { - new itemplate(OCE.PSUBW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8923, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PSUBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17505, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PSWAPD = new[] { - new itemplate(OCE.PSWAPD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,6908, OF.IF_PENT, OF.IF_3DNOW, OF.IF_SQ), - -}; - - static itemplate[] instrux_PTEST = new[] { - new itemplate(OCE.PTEST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,9854, OF.IF_SSE41), - -}; - - static itemplate[] instrux_PUNPCKHBW = new[] { - new itemplate(OCE.PUNPCKHBW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8930, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKHBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17547, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKHDQ = new[] { - new itemplate(OCE.PUNPCKHDQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8937, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKHDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17559, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKHQDQ = new[] { - new itemplate(OCE.PUNPCKHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17565, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKHWD = new[] { - new itemplate(OCE.PUNPCKHWD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8944, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKHWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17553, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKLBW = new[] { - new itemplate(OCE.PUNPCKLBW, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8951, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKLBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17571, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKLDQ = new[] { - new itemplate(OCE.PUNPCKLDQ, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8958, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKLDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17583, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKLQDQ = new[] { - new itemplate(OCE.PUNPCKLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17589, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUNPCKLWD = new[] { - new itemplate(OCE.PUNPCKLWD, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8965, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PUNPCKLWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17577, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_PUSH = new[] { - new itemplate(OCE.PUSH, 1, new ulong[] {REG16,0,0,0,0} ,21843, OF.IF_8086), - new itemplate(OCE.PUSH, 1, new ulong[] {REG32,0,0,0,0} ,21847, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.PUSH, 1, new ulong[] {REG64,0,0,0,0} ,21851, OF.IF_X64), - new itemplate(OCE.PUSH, 1, new ulong[] {RM_GPR, BITS16,0,0,0,0} ,20377, OF.IF_8086), - new itemplate(OCE.PUSH, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,20382, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.PUSH, 1, new ulong[] {RM_GPR, BITS64,0,0,0,0} ,20387, OF.IF_X64), - new itemplate(OCE.PUSH, 1, new ulong[] {REG_CS,0,0,0,0} ,21597, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.PUSH, 1, new ulong[] {REG_DESS,0,0,0,0} ,21597, OF.IF_8086, OF.IF_NOLONG), - new itemplate(OCE.PUSH, 1, new ulong[] {REG_FSGS,0,0,0,0} ,21855, OF.IF_386), - new itemplate(OCE.PUSH, 1, new ulong[] {IMMEDIATE, BITS8,0,0,0,0} ,21859, OF.IF_186), - new itemplate(OCE.PUSH, 1, new ulong[] {IMMEDIATE, BITS16,0,0,0,0} ,20392, OF.IF_186, OF.IF_AR0, OF.IF_SZ), - new itemplate(OCE.PUSH, 1, new ulong[] {IMMEDIATE, BITS32,0,0,0,0} ,20397, OF.IF_386, OF.IF_NOLONG, OF.IF_AR0, OF.IF_SZ), - new itemplate(OCE.PUSH, 1, new ulong[] {IMMEDIATE, BITS32,0,0,0,0} ,20397, OF.IF_386, OF.IF_NOLONG, OF.IF_SD), - new itemplate(OCE.PUSH, 1, new ulong[] {IMMEDIATE, BITS64,0,0,0,0} ,20402, OF.IF_X64, OF.IF_AR0, OF.IF_SZ), - -}; - - static itemplate[] instrux_PUSHA = new[] { - new itemplate(OCE.PUSHA, 0, new ulong[] {0,0,0,0,0} ,21863, OF.IF_186, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_PUSHAD = new[] { - new itemplate(OCE.PUSHAD, 0, new ulong[] {0,0,0,0,0} ,21867, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_PUSHAW = new[] { - new itemplate(OCE.PUSHAW, 0, new ulong[] {0,0,0,0,0} ,21871, OF.IF_186, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_PUSHF = new[] { - new itemplate(OCE.PUSHF, 0, new ulong[] {0,0,0,0,0} ,21875, OF.IF_8086), - -}; - - static itemplate[] instrux_PUSHFD = new[] { - new itemplate(OCE.PUSHFD, 0, new ulong[] {0,0,0,0,0} ,21879, OF.IF_386, OF.IF_NOLONG), - -}; - - static itemplate[] instrux_PUSHFQ = new[] { - new itemplate(OCE.PUSHFQ, 0, new ulong[] {0,0,0,0,0} ,21879, OF.IF_X64), - -}; - - static itemplate[] instrux_PUSHFW = new[] { - new itemplate(OCE.PUSHFW, 0, new ulong[] {0,0,0,0,0} ,21883, OF.IF_8086), - -}; - - static itemplate[] instrux_PXOR = new[] { - new itemplate(OCE.PXOR, 2, new ulong[] {MMXREG,RM_MMX,0,0,0} ,8972, OF.IF_PENT, OF.IF_MMX, OF.IF_SQ), - new itemplate(OCE.PXOR, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17595, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_RCL = new[] { - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21887, OF.IF_8086), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21891, OF.IF_8086), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20407, OF.IF_186, OF.IF_SB), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20412, OF.IF_8086), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20417, OF.IF_8086), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16485, OF.IF_186, OF.IF_SB), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20422, OF.IF_386), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20427, OF.IF_386), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16491, OF.IF_386, OF.IF_SB), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20432, OF.IF_X64), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20437, OF.IF_X64), - new itemplate(OCE.RCL, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16497, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_RCPPS = new[] { - new itemplate(OCE.RCPPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17055, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_RCPSS = new[] { - new itemplate(OCE.RCPSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17061, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_RCR = new[] { - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21895, OF.IF_8086), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21899, OF.IF_8086), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20442, OF.IF_186, OF.IF_SB), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20447, OF.IF_8086), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20452, OF.IF_8086), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16503, OF.IF_186, OF.IF_SB), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20457, OF.IF_386), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20462, OF.IF_386), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16509, OF.IF_386, OF.IF_SB), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20467, OF.IF_X64), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20472, OF.IF_X64), - new itemplate(OCE.RCR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16515, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_RDM = new[] { - new itemplate(OCE.RDM, 0, new ulong[] {0,0,0,0,0} ,21091, OF.IF_P6, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_RDMSR = new[] { - new itemplate(OCE.RDMSR, 0, new ulong[] {0,0,0,0,0} ,21903, OF.IF_PENT, OF.IF_PRIV), - -}; - - static itemplate[] instrux_RDPMC = new[] { - new itemplate(OCE.RDPMC, 0, new ulong[] {0,0,0,0,0} ,21907, OF.IF_P6), - -}; - - static itemplate[] instrux_RDSHR = new[] { - new itemplate(OCE.RDSHR, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,16521, OF.IF_P6, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_RDTSC = new[] { - new itemplate(OCE.RDTSC, 0, new ulong[] {0,0,0,0,0} ,21911, OF.IF_PENT), - -}; - - static itemplate[] instrux_RDTSCP = new[] { - new itemplate(OCE.RDTSCP, 0, new ulong[] {0,0,0,0,0} ,20477, OF.IF_X86_64), - -}; - - static itemplate[] instrux_RESB = new[] { - new itemplate(OCE.RESB, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21205, OF.IF_8086), - -}; - - static itemplate[] instrux_RESD;// = new[] {}; - - static itemplate[] instrux_RESO;// = new[] {}; - - static itemplate[] instrux_RESQ;// = new[] {}; - - static itemplate[] instrux_REST;// = new[] {}; - - static itemplate[] instrux_RESW;// = new[] {}; - - static itemplate[] instrux_RESY;// = new[] {}; - - static itemplate[] instrux_RET = new[] { - new itemplate(OCE.RET, 0, new ulong[] {0,0,0,0,0} ,21024, OF.IF_8086), - new itemplate(OCE.RET, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21915, OF.IF_8086, OF.IF_SW), - -}; - - static itemplate[] instrux_RETF = new[] { - new itemplate(OCE.RETF, 0, new ulong[] {0,0,0,0,0} ,22146, OF.IF_8086), - new itemplate(OCE.RETF, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21919, OF.IF_8086, OF.IF_SW), - -}; - - static itemplate[] instrux_RETN = new[] { - new itemplate(OCE.RETN, 0, new ulong[] {0,0,0,0,0} ,21024, OF.IF_8086), - new itemplate(OCE.RETN, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,21915, OF.IF_8086, OF.IF_SW), - -}; - - static itemplate[] instrux_ROL = new[] { - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21923, OF.IF_8086), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21927, OF.IF_8086), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20482, OF.IF_186, OF.IF_SB), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20487, OF.IF_8086), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20492, OF.IF_8086), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16527, OF.IF_186, OF.IF_SB), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20497, OF.IF_386), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20502, OF.IF_386), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16533, OF.IF_386, OF.IF_SB), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20507, OF.IF_X64), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20512, OF.IF_X64), - new itemplate(OCE.ROL, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16539, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_ROR = new[] { - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21931, OF.IF_8086), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21935, OF.IF_8086), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20517, OF.IF_186, OF.IF_SB), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20522, OF.IF_8086), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20527, OF.IF_8086), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16545, OF.IF_186, OF.IF_SB), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20532, OF.IF_386), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20537, OF.IF_386), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16551, OF.IF_386, OF.IF_SB), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20542, OF.IF_X64), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20547, OF.IF_X64), - new itemplate(OCE.ROR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16557, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_ROUNDPD = new[] { - new itemplate(OCE.ROUNDPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7148, OF.IF_SSE41), - new itemplate(OCE.ROUNDPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7156, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_ROUNDPS = new[] { - new itemplate(OCE.ROUNDPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7156, OF.IF_SSE41), - new itemplate(OCE.ROUNDPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7156, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_ROUNDSD = new[] { - new itemplate(OCE.ROUNDSD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7164, OF.IF_SSE41), - new itemplate(OCE.ROUNDSD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7156, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_ROUNDSS = new[] { - new itemplate(OCE.ROUNDSS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7172, OF.IF_SSE41), - new itemplate(OCE.ROUNDSS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7156, OF.IF_SSE5, OF.IF_AMD), - -}; - - static itemplate[] instrux_RSDC = new[] { - new itemplate(OCE.RSDC, 2, new ulong[] {REG_SREG,MEMORY, BITS80,0,0,0} ,17956, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_RSLDT = new[] { - new itemplate(OCE.RSLDT, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,20552, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_RSM = new[] { - new itemplate(OCE.RSM, 0, new ulong[] {0,0,0,0,0} ,21939, OF.IF_PENT, OF.IF_SMM), - -}; - - static itemplate[] instrux_RSQRTPS = new[] { - new itemplate(OCE.RSQRTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17067, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_RSQRTSS = new[] { - new itemplate(OCE.RSQRTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17073, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_RSTS = new[] { - new itemplate(OCE.RSTS, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,20557, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_SAHF = new[] { - new itemplate(OCE.SAHF, 0, new ulong[] {0,0,0,0,0} ,6617, OF.IF_8086), - -}; - - static itemplate[] instrux_SAL = new[] { - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21943, OF.IF_8086), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21947, OF.IF_8086), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20562, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20567, OF.IF_8086), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20572, OF.IF_8086), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16563, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20577, OF.IF_386), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20582, OF.IF_386), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16569, OF.IF_386, OF.IF_SB), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20587, OF.IF_X64), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20592, OF.IF_X64), - new itemplate(OCE.SAL, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16575, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_SALC = new[] { - new itemplate(OCE.SALC, 0, new ulong[] {0,0,0,0,0} ,22149, OF.IF_8086, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_SAR = new[] { - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21951, OF.IF_8086), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21955, OF.IF_8086), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20597, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20602, OF.IF_8086), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20607, OF.IF_8086), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16581, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20612, OF.IF_386), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20617, OF.IF_386), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16587, OF.IF_386, OF.IF_SB), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20622, OF.IF_X64), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20627, OF.IF_X64), - new itemplate(OCE.SAR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16593, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_SBB = new[] { - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21959, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG8,REG8,0,0,0} ,21959, OF.IF_8086), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20632, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG16,REG16,0,0,0} ,20632, OF.IF_8086), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20637, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG32,REG32,0,0,0} ,20637, OF.IF_386), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20642, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG64,REG64,0,0,0} ,20642, OF.IF_X64), - new itemplate(OCE.SBB, 2, new ulong[] {REG8,MEMORY,0,0,0} ,11292, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG8,REG8,0,0,0} ,11292, OF.IF_8086), - new itemplate(OCE.SBB, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20647, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG16,REG16,0,0,0} ,20647, OF.IF_8086), - new itemplate(OCE.SBB, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20652, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG32,REG32,0,0,0} ,20652, OF.IF_386), - new itemplate(OCE.SBB, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20657, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG64,REG64,0,0,0} ,20657, OF.IF_X64), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,16599, OF.IF_8086), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,16605, OF.IF_386), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,16611, OF.IF_X64), - new itemplate(OCE.SBB, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,21963, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,16599, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,20662, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,16605, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,20667, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,16611, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,20672, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20677, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16617, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16623, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16629, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20677, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16617, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SBB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16623, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_SCASB = new[] { - new itemplate(OCE.SCASB, 0, new ulong[] {0,0,0,0,0} ,21967, OF.IF_8086), - -}; - - static itemplate[] instrux_SCASD = new[] { - new itemplate(OCE.SCASD, 0, new ulong[] {0,0,0,0,0} ,20682, OF.IF_386), - -}; - - static itemplate[] instrux_SCASQ = new[] { - new itemplate(OCE.SCASQ, 0, new ulong[] {0,0,0,0,0} ,20687, OF.IF_X64), - -}; - - static itemplate[] instrux_SCASW = new[] { - new itemplate(OCE.SCASW, 0, new ulong[] {0,0,0,0,0} ,20692, OF.IF_8086), - -}; - - static itemplate[] instrux_SFENCE = new[] { - new itemplate(OCE.SFENCE, 0, new ulong[] {0,0,0,0,0} ,20697, OF.IF_X64, OF.IF_AMD), - new itemplate(OCE.SFENCE, 0, new ulong[] {0,0,0,0,0} ,20697, OF.IF_KATMAI), - -}; - - static itemplate[] instrux_SGDT = new[] { - new itemplate(OCE.SGDT, 1, new ulong[] {MEMORY,0,0,0,0} ,20702, OF.IF_286), - -}; - - static itemplate[] instrux_SHL = new[] { - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21943, OF.IF_8086), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21947, OF.IF_8086), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20562, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20567, OF.IF_8086), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20572, OF.IF_8086), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16563, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20577, OF.IF_386), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20582, OF.IF_386), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16569, OF.IF_386, OF.IF_SB), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20587, OF.IF_X64), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20592, OF.IF_X64), - new itemplate(OCE.SHL, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16575, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_SHLD = new[] { - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG16,IMMEDIATE,0,0} ,8979, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {REG16,REG16,IMMEDIATE,0,0} ,8979, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG32,IMMEDIATE,0,0} ,8986, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {REG32,REG32,IMMEDIATE,0,0} ,8986, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG64,IMMEDIATE,0,0} ,8993, OF.IF_X64, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {REG64,REG64,IMMEDIATE,0,0} ,8993, OF.IF_X64, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG16,REG_CL,0,0} ,16635, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SHLD, 3, new ulong[] {REG16,REG16,REG_CL,0,0} ,16635, OF.IF_386), - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG32,REG_CL,0,0} ,16641, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SHLD, 3, new ulong[] {REG32,REG32,REG_CL,0,0} ,16641, OF.IF_386), - new itemplate(OCE.SHLD, 3, new ulong[] {MEMORY,REG64,REG_CL,0,0} ,16647, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SHLD, 3, new ulong[] {REG64,REG64,REG_CL,0,0} ,16647, OF.IF_X64), - -}; - - static itemplate[] instrux_SHR = new[] { - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS8,UNITY,0,0,0} ,21971, OF.IF_8086), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS8,REG_CL,0,0,0} ,21975, OF.IF_8086), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20707, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS16,UNITY,0,0,0} ,20712, OF.IF_8086), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS16,REG_CL,0,0,0} ,20717, OF.IF_8086), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16653, OF.IF_186, OF.IF_SB), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS32,UNITY,0,0,0} ,20722, OF.IF_386), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS32,REG_CL,0,0,0} ,20727, OF.IF_386), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16659, OF.IF_386, OF.IF_SB), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS64,UNITY,0,0,0} ,20732, OF.IF_X64), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS64,REG_CL,0,0,0} ,20737, OF.IF_X64), - new itemplate(OCE.SHR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16665, OF.IF_X64, OF.IF_SB), - -}; - - static itemplate[] instrux_SHRD = new[] { - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG16,IMMEDIATE,0,0} ,9000, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {REG16,REG16,IMMEDIATE,0,0} ,9000, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG32,IMMEDIATE,0,0} ,9007, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {REG32,REG32,IMMEDIATE,0,0} ,9007, OF.IF_386, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG64,IMMEDIATE,0,0} ,9014, OF.IF_X64, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {REG64,REG64,IMMEDIATE,0,0} ,9014, OF.IF_X64, OF.IF_SM2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG16,REG_CL,0,0} ,16671, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SHRD, 3, new ulong[] {REG16,REG16,REG_CL,0,0} ,16671, OF.IF_386), - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG32,REG_CL,0,0} ,16677, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SHRD, 3, new ulong[] {REG32,REG32,REG_CL,0,0} ,16677, OF.IF_386), - new itemplate(OCE.SHRD, 3, new ulong[] {MEMORY,REG64,REG_CL,0,0} ,16683, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SHRD, 3, new ulong[] {REG64,REG64,REG_CL,0,0} ,16683, OF.IF_X64), - -}; - - static itemplate[] instrux_SHUFPD = new[] { - new itemplate(OCE.SHUFPD, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9399, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHUFPD, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9399, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SM, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_SHUFPS = new[] { - new itemplate(OCE.SHUFPS, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,9140, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - new itemplate(OCE.SHUFPS, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,9140, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SB, OF.IF_AR2), - -}; - - static itemplate[] instrux_SIDT = new[] { - new itemplate(OCE.SIDT, 1, new ulong[] {MEMORY,0,0,0,0} ,20742, OF.IF_286), - -}; - - static itemplate[] instrux_SKINIT = new[] { - new itemplate(OCE.SKINIT, 0, new ulong[] {0,0,0,0,0} ,20747, OF.IF_X64), - -}; - - static itemplate[] instrux_SLDT = new[] { - new itemplate(OCE.SLDT, 1, new ulong[] {MEMORY,0,0,0,0} ,16708, OF.IF_286), - new itemplate(OCE.SLDT, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,16708, OF.IF_286), - new itemplate(OCE.SLDT, 1, new ulong[] {REG16,0,0,0,0} ,16689, OF.IF_286), - new itemplate(OCE.SLDT, 1, new ulong[] {REG32,0,0,0,0} ,16695, OF.IF_386), - new itemplate(OCE.SLDT, 1, new ulong[] {REG64,0,0,0,0} ,16701, OF.IF_X64), - new itemplate(OCE.SLDT, 1, new ulong[] {REG64,0,0,0,0} ,16707, OF.IF_X64), - -}; - - static itemplate[] instrux_SMI = new[] { - new itemplate(OCE.SMI, 0, new ulong[] {0,0,0,0,0} ,22119, OF.IF_386, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_SMINT = new[] { - new itemplate(OCE.SMINT, 0, new ulong[] {0,0,0,0,0} ,21979, OF.IF_P6, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_SMINTOLD = new[] { - new itemplate(OCE.SMINTOLD, 0, new ulong[] {0,0,0,0,0} ,21983, OF.IF_486, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_SMSW = new[] { - new itemplate(OCE.SMSW, 1, new ulong[] {MEMORY,0,0,0,0} ,16720, OF.IF_286), - new itemplate(OCE.SMSW, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,16720, OF.IF_286), - new itemplate(OCE.SMSW, 1, new ulong[] {REG16,0,0,0,0} ,16713, OF.IF_286), - new itemplate(OCE.SMSW, 1, new ulong[] {REG32,0,0,0,0} ,16719, OF.IF_386), - -}; - - static itemplate[] instrux_SQRTPD = new[] { - new itemplate(OCE.SQRTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17829, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_SQRTPS = new[] { - new itemplate(OCE.SQRTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17079, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_SQRTSD = new[] { - new itemplate(OCE.SQRTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17835, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_SQRTSS = new[] { - new itemplate(OCE.SQRTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17085, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_STC = new[] { - new itemplate(OCE.STC, 0, new ulong[] {0,0,0,0,0} ,20479, OF.IF_8086), - -}; - - static itemplate[] instrux_STD = new[] { - new itemplate(OCE.STD, 0, new ulong[] {0,0,0,0,0} ,22152, OF.IF_8086), - -}; - - static itemplate[] instrux_STGI = new[] { - new itemplate(OCE.STGI, 0, new ulong[] {0,0,0,0,0} ,20752, OF.IF_X64), - -}; - - static itemplate[] instrux_STI = new[] { - new itemplate(OCE.STI, 0, new ulong[] {0,0,0,0,0} ,22155, OF.IF_8086), - -}; - - static itemplate[] instrux_STMXCSR = new[] { - new itemplate(OCE.STMXCSR, 1, new ulong[] {MEMORY,0,0,0,0} ,20977, OF.IF_KATMAI, OF.IF_SSE, OF.IF_SD), - -}; - - static itemplate[] instrux_STOSB = new[] { - new itemplate(OCE.STOSB, 0, new ulong[] {0,0,0,0,0} ,6721, OF.IF_8086), - -}; - - static itemplate[] instrux_STOSD = new[] { - new itemplate(OCE.STOSD, 0, new ulong[] {0,0,0,0,0} ,21987, OF.IF_386), - -}; - - static itemplate[] instrux_STOSQ = new[] { - new itemplate(OCE.STOSQ, 0, new ulong[] {0,0,0,0,0} ,21991, OF.IF_X64), - -}; - - static itemplate[] instrux_STOSW = new[] { - new itemplate(OCE.STOSW, 0, new ulong[] {0,0,0,0,0} ,21995, OF.IF_8086), - -}; - - static itemplate[] instrux_STR = new[] { - new itemplate(OCE.STR, 1, new ulong[] {MEMORY,0,0,0,0} ,16738, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.STR, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,16738, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.STR, 1, new ulong[] {REG16,0,0,0,0} ,16725, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.STR, 1, new ulong[] {REG32,0,0,0,0} ,16731, OF.IF_386, OF.IF_PROT), - new itemplate(OCE.STR, 1, new ulong[] {REG64,0,0,0,0} ,16737, OF.IF_X64), - -}; - - static itemplate[] instrux_SUB = new[] { - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,REG8,0,0,0} ,21999, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG8,REG8,0,0,0} ,21999, OF.IF_8086), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20757, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG16,REG16,0,0,0} ,20757, OF.IF_8086), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20762, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG32,REG32,0,0,0} ,20762, OF.IF_386), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20767, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG64,REG64,0,0,0} ,20767, OF.IF_X64), - new itemplate(OCE.SUB, 2, new ulong[] {REG8,MEMORY,0,0,0} ,12307, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG8,REG8,0,0,0} ,12307, OF.IF_8086), - new itemplate(OCE.SUB, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20772, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG16,REG16,0,0,0} ,20772, OF.IF_8086), - new itemplate(OCE.SUB, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20777, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG32,REG32,0,0,0} ,20777, OF.IF_386), - new itemplate(OCE.SUB, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20782, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG64,REG64,0,0,0} ,20782, OF.IF_X64), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,16743, OF.IF_8086), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,16749, OF.IF_386), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,16755, OF.IF_X64), - new itemplate(OCE.SUB, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,22003, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,16743, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,20787, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,16749, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,20792, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,16755, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,20797, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20802, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16761, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16767, OF.IF_386, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16773, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20802, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16761, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.SUB, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16767, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_SUBPD = new[] { - new itemplate(OCE.SUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17841, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_SUBPS = new[] { - new itemplate(OCE.SUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17091, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_SUBSD = new[] { - new itemplate(OCE.SUBSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17847, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_SUBSS = new[] { - new itemplate(OCE.SUBSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17097, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_SVDC = new[] { - new itemplate(OCE.SVDC, 2, new ulong[] {MEMORY, BITS80,REG_SREG,0,0,0} ,9408, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_SVLDT = new[] { - new itemplate(OCE.SVLDT, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,20807, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_SVTS = new[] { - new itemplate(OCE.SVTS, 1, new ulong[] {MEMORY, BITS80,0,0,0,0} ,20812, OF.IF_486, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_SWAPGS = new[] { - new itemplate(OCE.SWAPGS, 0, new ulong[] {0,0,0,0,0} ,20817, OF.IF_X64), - -}; - - static itemplate[] instrux_SYSCALL = new[] { - new itemplate(OCE.SYSCALL, 0, new ulong[] {0,0,0,0,0} ,21707, OF.IF_P6, OF.IF_AMD), - -}; - - static itemplate[] instrux_SYSENTER = new[] { - new itemplate(OCE.SYSENTER, 0, new ulong[] {0,0,0,0,0} ,22007, OF.IF_P6), - -}; - - static itemplate[] instrux_SYSEXIT = new[] { - new itemplate(OCE.SYSEXIT, 0, new ulong[] {0,0,0,0,0} ,22011, OF.IF_P6, OF.IF_PRIV), - -}; - - static itemplate[] instrux_SYSRET = new[] { - new itemplate(OCE.SYSRET, 0, new ulong[] {0,0,0,0,0} ,21703, OF.IF_P6, OF.IF_PRIV, OF.IF_AMD), - -}; - - static itemplate[] instrux_TEST = new[] { - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,REG8,0,0,0} ,22015, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG8,REG8,0,0,0} ,22015, OF.IF_8086), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20822, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG16,REG16,0,0,0} ,20822, OF.IF_8086), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20827, OF.IF_386, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG32,REG32,0,0,0} ,20827, OF.IF_386), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20832, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG64,REG64,0,0,0} ,20832, OF.IF_X64), - new itemplate(OCE.TEST, 2, new ulong[] {REG8,MEMORY,0,0,0} ,22019, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20837, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20842, OF.IF_386, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20847, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,22023, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,20852, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,20857, OF.IF_386, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,20862, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20867, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16779, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16785, OF.IF_386, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16791, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20867, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16779, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.TEST, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16785, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_UCOMISD = new[] { - new itemplate(OCE.UCOMISD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17853, OF.IF_WILLAMETTE, OF.IF_SSE2), - -}; - - static itemplate[] instrux_UCOMISS = new[] { - new itemplate(OCE.UCOMISS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17103, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_UD0 = new[] { - new itemplate(OCE.UD0, 0, new ulong[] {0,0,0,0,0} ,22027, OF.IF_186, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_UD1 = new[] { - new itemplate(OCE.UD1, 0, new ulong[] {0,0,0,0,0} ,22031, OF.IF_186, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_UD2 = new[] { - new itemplate(OCE.UD2, 0, new ulong[] {0,0,0,0,0} ,22035, OF.IF_186), - -}; - - static itemplate[] instrux_UD2A = new[] { - new itemplate(OCE.UD2A, 0, new ulong[] {0,0,0,0,0} ,22035, OF.IF_186), - -}; - - static itemplate[] instrux_UD2B = new[] { - new itemplate(OCE.UD2B, 0, new ulong[] {0,0,0,0,0} ,22031, OF.IF_186, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_UMOV = new[] { - new itemplate(OCE.UMOV, 2, new ulong[] {MEMORY,REG8,0,0,0} ,16797, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG8,REG8,0,0,0} ,16797, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.UMOV, 2, new ulong[] {MEMORY,REG16,0,0,0} ,9021, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG16,REG16,0,0,0} ,9021, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.UMOV, 2, new ulong[] {MEMORY,REG32,0,0,0} ,9028, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG32,REG32,0,0,0} ,9028, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.UMOV, 2, new ulong[] {REG8,MEMORY,0,0,0} ,16803, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG8,REG8,0,0,0} ,16803, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.UMOV, 2, new ulong[] {REG16,MEMORY,0,0,0} ,9035, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG16,REG16,0,0,0} ,9035, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.UMOV, 2, new ulong[] {REG32,MEMORY,0,0,0} ,9042, OF.IF_386, OF.IF_UNDOC, OF.IF_SM), - new itemplate(OCE.UMOV, 2, new ulong[] {REG32,REG32,0,0,0} ,9042, OF.IF_386, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_UNPCKHPD = new[] { - new itemplate(OCE.UNPCKHPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17859, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_UNPCKHPS = new[] { - new itemplate(OCE.UNPCKHPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17109, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_UNPCKLPD = new[] { - new itemplate(OCE.UNPCKLPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17865, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_UNPCKLPS = new[] { - new itemplate(OCE.UNPCKLPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17115, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_VADDPD = new[] { - new itemplate(OCE.VADDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10988, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10995, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11002, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VADDPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11009, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VADDPS = new[] { - new itemplate(OCE.VADDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11016, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11023, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11030, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VADDPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11037, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VADDSD = new[] { - new itemplate(OCE.VADDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11044, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VADDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11051, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VADDSS = new[] { - new itemplate(OCE.VADDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11058, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VADDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11065, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VADDSUBPD = new[] { - new itemplate(OCE.VADDSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11072, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDSUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11079, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11086, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VADDSUBPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11093, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VADDSUBPS = new[] { - new itemplate(OCE.VADDSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11100, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDSUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11107, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VADDSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11114, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VADDSUBPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11121, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VAESDEC = new[] { - new itemplate(OCE.VAESDEC, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10953, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VAESDEC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10960, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VAESDECLAST = new[] { - new itemplate(OCE.VAESDECLAST, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10967, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VAESDECLAST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10974, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VAESENC = new[] { - new itemplate(OCE.VAESENC, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10925, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VAESENC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10932, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VAESENCLAST = new[] { - new itemplate(OCE.VAESENCLAST, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,10939, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VAESENCLAST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10946, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VAESIMC = new[] { - new itemplate(OCE.VAESIMC, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,10981, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VAESKEYGENASSIST = new[] { - new itemplate(OCE.VAESKEYGENASSIST, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7396, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VANDNPD = new[] { - new itemplate(OCE.VANDNPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11184, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDNPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11191, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDNPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11198, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VANDNPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11205, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VANDNPS = new[] { - new itemplate(OCE.VANDNPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11212, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDNPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11219, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDNPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11226, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VANDNPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11233, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VANDPD = new[] { - new itemplate(OCE.VANDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11128, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11135, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11142, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VANDPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11149, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VANDPS = new[] { - new itemplate(OCE.VANDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11156, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11163, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VANDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11170, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VANDPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11177, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VBLENDPD = new[] { - new itemplate(OCE.VBLENDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7404, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7412, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7420, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VBLENDPD, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7428, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VBLENDPS = new[] { - new itemplate(OCE.VBLENDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7436, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7444, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7452, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VBLENDPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7460, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VBLENDVPD = new[] { - new itemplate(OCE.VBLENDVPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,1206, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDVPD, 3, new ulong[] {XMMREG,RM_XMM,XMM0,0,0} ,11240, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDVPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,1215, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VBLENDVPD, 3, new ulong[] {YMMREG,RM_YMM,YMM0,0,0} ,11247, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VBLENDVPD, 3, new ulong[] {YMMREG,RM_YMM,YMM0,0,0} ,11261, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VBLENDVPS = new[] { - new itemplate(OCE.VBLENDVPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,1224, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDVPS, 3, new ulong[] {XMMREG,RM_XMM,XMM0,0,0} ,11254, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VBLENDVPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,1233, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VBROADCASTF128 = new[] { - new itemplate(OCE.VBROADCASTF128, 2, new ulong[] {YMMREG,MEMORY,0,0,0} ,11289, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VBROADCASTSD = new[] { - new itemplate(OCE.VBROADCASTSD, 2, new ulong[] {YMMREG,MEMORY,0,0,0} ,11282, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VBROADCASTSS = new[] { - new itemplate(OCE.VBROADCASTSS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,11268, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VBROADCASTSS, 2, new ulong[] {YMMREG,MEMORY,0,0,0} ,11275, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPEQPD = new[] { - new itemplate(OCE.VCMPEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1242, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1251, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1260, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1269, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQPS = new[] { - new itemplate(OCE.VCMPEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2394, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2403, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2412, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2421, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQSD = new[] { - new itemplate(OCE.VCMPEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3546, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPEQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3555, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPEQSS = new[] { - new itemplate(OCE.VCMPEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4122, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPEQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4131, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPEQ_OSPD = new[] { - new itemplate(OCE.VCMPEQ_OSPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1818, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_OSPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1827, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_OSPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1836, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_OSPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1845, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_OSPS = new[] { - new itemplate(OCE.VCMPEQ_OSPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2970, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_OSPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2979, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_OSPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2988, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_OSPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2997, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_OSSD = new[] { - new itemplate(OCE.VCMPEQ_OSSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3834, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPEQ_OSSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3843, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPEQ_OSSS = new[] { - new itemplate(OCE.VCMPEQ_OSSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4410, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPEQ_OSSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4419, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPEQ_UQPD = new[] { - new itemplate(OCE.VCMPEQ_UQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1530, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_UQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1539, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_UQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1548, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_UQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1557, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_UQPS = new[] { - new itemplate(OCE.VCMPEQ_UQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2682, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_UQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2691, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_UQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2700, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_UQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2709, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_UQSD = new[] { - new itemplate(OCE.VCMPEQ_UQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3690, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPEQ_UQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3699, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPEQ_UQSS = new[] { - new itemplate(OCE.VCMPEQ_UQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4266, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPEQ_UQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4275, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPEQ_USPD = new[] { - new itemplate(OCE.VCMPEQ_USPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2106, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_USPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2115, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_USPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2124, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_USPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2133, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_USPS = new[] { - new itemplate(OCE.VCMPEQ_USPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3258, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_USPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3267, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPEQ_USPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3276, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPEQ_USPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3285, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPEQ_USSD = new[] { - new itemplate(OCE.VCMPEQ_USSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3978, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPEQ_USSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3987, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPEQ_USSS = new[] { - new itemplate(OCE.VCMPEQ_USSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4554, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPEQ_USSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4563, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPFALSEPD = new[] { - new itemplate(OCE.VCMPFALSEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1638, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1647, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1656, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPFALSEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1665, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPFALSEPS = new[] { - new itemplate(OCE.VCMPFALSEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2790, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2799, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2808, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPFALSEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2817, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPFALSESD = new[] { - new itemplate(OCE.VCMPFALSESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3744, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPFALSESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3753, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPFALSESS = new[] { - new itemplate(OCE.VCMPFALSESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4320, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPFALSESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4329, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPFALSE_OSPD = new[] { - new itemplate(OCE.VCMPFALSE_OSPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2214, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSE_OSPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2223, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSE_OSPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2232, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPFALSE_OSPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2241, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPFALSE_OSPS = new[] { - new itemplate(OCE.VCMPFALSE_OSPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3366, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSE_OSPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3375, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPFALSE_OSPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3384, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPFALSE_OSPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3393, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPFALSE_OSSD = new[] { - new itemplate(OCE.VCMPFALSE_OSSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4032, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPFALSE_OSSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4041, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPFALSE_OSSS = new[] { - new itemplate(OCE.VCMPFALSE_OSSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4608, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPFALSE_OSSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4617, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPGEPD = new[] { - new itemplate(OCE.VCMPGEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1710, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1719, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1728, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1737, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGEPS = new[] { - new itemplate(OCE.VCMPGEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2862, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2871, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2880, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2889, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGESD = new[] { - new itemplate(OCE.VCMPGESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3780, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPGESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3789, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPGESS = new[] { - new itemplate(OCE.VCMPGESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4356, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPGESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4365, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPGE_OQPD = new[] { - new itemplate(OCE.VCMPGE_OQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2286, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGE_OQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2295, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGE_OQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2304, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGE_OQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2313, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGE_OQPS = new[] { - new itemplate(OCE.VCMPGE_OQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3438, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGE_OQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3447, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGE_OQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3456, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGE_OQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3465, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGE_OQSD = new[] { - new itemplate(OCE.VCMPGE_OQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4068, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPGE_OQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4077, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPGE_OQSS = new[] { - new itemplate(OCE.VCMPGE_OQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4644, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPGE_OQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4653, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPGTPD = new[] { - new itemplate(OCE.VCMPGTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1746, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1755, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGTPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1764, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1773, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGTPS = new[] { - new itemplate(OCE.VCMPGTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2898, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2907, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGTPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2916, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2925, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGTSD = new[] { - new itemplate(OCE.VCMPGTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3798, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPGTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3807, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPGTSS = new[] { - new itemplate(OCE.VCMPGTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4374, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPGTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4383, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPGT_OQPD = new[] { - new itemplate(OCE.VCMPGT_OQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2322, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGT_OQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2331, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGT_OQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2340, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGT_OQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2349, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGT_OQPS = new[] { - new itemplate(OCE.VCMPGT_OQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3474, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGT_OQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3483, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPGT_OQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3492, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPGT_OQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3501, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPGT_OQSD = new[] { - new itemplate(OCE.VCMPGT_OQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4086, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPGT_OQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4095, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPGT_OQSS = new[] { - new itemplate(OCE.VCMPGT_OQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4662, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPGT_OQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4671, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPLEPD = new[] { - new itemplate(OCE.VCMPLEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1314, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1323, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1332, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1341, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLEPS = new[] { - new itemplate(OCE.VCMPLEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2466, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2475, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2484, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2493, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLESD = new[] { - new itemplate(OCE.VCMPLESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3582, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPLESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3591, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPLESS = new[] { - new itemplate(OCE.VCMPLESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4158, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPLESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4167, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPLE_OQPD = new[] { - new itemplate(OCE.VCMPLE_OQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1890, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLE_OQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1899, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLE_OQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1908, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLE_OQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1917, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLE_OQPS = new[] { - new itemplate(OCE.VCMPLE_OQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3042, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLE_OQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3051, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLE_OQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3060, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLE_OQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3069, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLE_OQSD = new[] { - new itemplate(OCE.VCMPLE_OQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3870, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPLE_OQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3879, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPLE_OQSS = new[] { - new itemplate(OCE.VCMPLE_OQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4446, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPLE_OQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4455, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPLTPD = new[] { - new itemplate(OCE.VCMPLTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1278, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1287, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLTPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1296, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1305, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLTPS = new[] { - new itemplate(OCE.VCMPLTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2430, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2439, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLTPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2448, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2457, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLTSD = new[] { - new itemplate(OCE.VCMPLTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3564, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPLTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3573, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPLTSS = new[] { - new itemplate(OCE.VCMPLTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4140, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPLTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4149, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPLT_OQPD = new[] { - new itemplate(OCE.VCMPLT_OQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1854, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLT_OQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1863, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLT_OQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1872, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLT_OQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1881, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLT_OQPS = new[] { - new itemplate(OCE.VCMPLT_OQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3006, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLT_OQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3015, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPLT_OQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3024, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPLT_OQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3033, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPLT_OQSD = new[] { - new itemplate(OCE.VCMPLT_OQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3852, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPLT_OQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3861, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPLT_OQSS = new[] { - new itemplate(OCE.VCMPLT_OQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4428, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPLT_OQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4437, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNEQPD = new[] { - new itemplate(OCE.VCMPNEQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1386, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1395, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1404, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1413, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQPS = new[] { - new itemplate(OCE.VCMPNEQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2538, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2547, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2556, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2565, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQSD = new[] { - new itemplate(OCE.VCMPNEQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3618, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNEQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3627, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNEQSS = new[] { - new itemplate(OCE.VCMPNEQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4194, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNEQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4203, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNEQ_OQPD = new[] { - new itemplate(OCE.VCMPNEQ_OQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1674, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1683, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1692, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_OQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1701, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_OQPS = new[] { - new itemplate(OCE.VCMPNEQ_OQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2826, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2835, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2844, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_OQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2853, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_OQSD = new[] { - new itemplate(OCE.VCMPNEQ_OQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3762, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNEQ_OQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3771, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNEQ_OQSS = new[] { - new itemplate(OCE.VCMPNEQ_OQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4338, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNEQ_OQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4347, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNEQ_OSPD = new[] { - new itemplate(OCE.VCMPNEQ_OSPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2250, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OSPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2259, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OSPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2268, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_OSPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2277, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_OSPS = new[] { - new itemplate(OCE.VCMPNEQ_OSPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3402, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OSPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3411, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_OSPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3420, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_OSPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3429, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_OSSD = new[] { - new itemplate(OCE.VCMPNEQ_OSSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4050, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNEQ_OSSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4059, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNEQ_OSSS = new[] { - new itemplate(OCE.VCMPNEQ_OSSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4626, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNEQ_OSSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4635, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNEQ_USPD = new[] { - new itemplate(OCE.VCMPNEQ_USPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1962, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_USPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1971, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_USPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1980, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_USPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1989, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_USPS = new[] { - new itemplate(OCE.VCMPNEQ_USPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3114, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_USPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3123, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNEQ_USPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3132, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNEQ_USPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3141, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNEQ_USSD = new[] { - new itemplate(OCE.VCMPNEQ_USSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3906, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNEQ_USSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3915, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNEQ_USSS = new[] { - new itemplate(OCE.VCMPNEQ_USSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4482, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNEQ_USSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4491, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNGEPD = new[] { - new itemplate(OCE.VCMPNGEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1566, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1575, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1584, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1593, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGEPS = new[] { - new itemplate(OCE.VCMPNGEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2718, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2727, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2736, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2745, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGESD = new[] { - new itemplate(OCE.VCMPNGESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3708, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNGESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3717, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNGESS = new[] { - new itemplate(OCE.VCMPNGESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4284, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNGESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4293, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNGE_UQPD = new[] { - new itemplate(OCE.VCMPNGE_UQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2142, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGE_UQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2151, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGE_UQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2160, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGE_UQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2169, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGE_UQPS = new[] { - new itemplate(OCE.VCMPNGE_UQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3294, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGE_UQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3303, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGE_UQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3312, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGE_UQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3321, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGE_UQSD = new[] { - new itemplate(OCE.VCMPNGE_UQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3996, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNGE_UQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4005, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNGE_UQSS = new[] { - new itemplate(OCE.VCMPNGE_UQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4572, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNGE_UQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4581, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNGTPD = new[] { - new itemplate(OCE.VCMPNGTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1602, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1611, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGTPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1620, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1629, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGTPS = new[] { - new itemplate(OCE.VCMPNGTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2754, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2763, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGTPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2772, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2781, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGTSD = new[] { - new itemplate(OCE.VCMPNGTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3726, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNGTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3735, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNGTSS = new[] { - new itemplate(OCE.VCMPNGTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4302, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNGTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4311, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNGT_UQPD = new[] { - new itemplate(OCE.VCMPNGT_UQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2178, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGT_UQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2187, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGT_UQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2196, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGT_UQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2205, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGT_UQPS = new[] { - new itemplate(OCE.VCMPNGT_UQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3330, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGT_UQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3339, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNGT_UQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3348, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNGT_UQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3357, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNGT_UQSD = new[] { - new itemplate(OCE.VCMPNGT_UQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4014, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNGT_UQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4023, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNGT_UQSS = new[] { - new itemplate(OCE.VCMPNGT_UQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4590, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNGT_UQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4599, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNLEPD = new[] { - new itemplate(OCE.VCMPNLEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1458, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1467, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1476, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1485, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLEPS = new[] { - new itemplate(OCE.VCMPNLEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2610, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2619, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2628, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2637, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLESD = new[] { - new itemplate(OCE.VCMPNLESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3654, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNLESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3663, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNLESS = new[] { - new itemplate(OCE.VCMPNLESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4230, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNLESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4239, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNLE_UQPD = new[] { - new itemplate(OCE.VCMPNLE_UQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2034, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLE_UQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2043, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLE_UQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2052, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLE_UQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2061, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLE_UQPS = new[] { - new itemplate(OCE.VCMPNLE_UQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3186, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLE_UQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3195, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLE_UQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3204, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLE_UQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3213, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLE_UQSD = new[] { - new itemplate(OCE.VCMPNLE_UQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3942, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNLE_UQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3951, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNLE_UQSS = new[] { - new itemplate(OCE.VCMPNLE_UQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4518, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNLE_UQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4527, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNLTPD = new[] { - new itemplate(OCE.VCMPNLTPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1422, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1431, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLTPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1440, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1449, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLTPS = new[] { - new itemplate(OCE.VCMPNLTPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2574, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2583, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLTPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2592, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2601, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLTSD = new[] { - new itemplate(OCE.VCMPNLTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3636, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNLTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3645, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNLTSS = new[] { - new itemplate(OCE.VCMPNLTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4212, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNLTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4221, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPNLT_UQPD = new[] { - new itemplate(OCE.VCMPNLT_UQPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1998, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLT_UQPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2007, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLT_UQPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2016, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLT_UQPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2025, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLT_UQPS = new[] { - new itemplate(OCE.VCMPNLT_UQPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3150, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLT_UQPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3159, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPNLT_UQPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3168, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPNLT_UQPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3177, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPNLT_UQSD = new[] { - new itemplate(OCE.VCMPNLT_UQSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3924, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPNLT_UQSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3933, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPNLT_UQSS = new[] { - new itemplate(OCE.VCMPNLT_UQSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4500, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPNLT_UQSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4509, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPORDPD = new[] { - new itemplate(OCE.VCMPORDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1494, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1503, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1512, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPORDPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1521, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPORDPS = new[] { - new itemplate(OCE.VCMPORDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2646, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2655, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2664, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPORDPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2673, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPORDSD = new[] { - new itemplate(OCE.VCMPORDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3672, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPORDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3681, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPORDSS = new[] { - new itemplate(OCE.VCMPORDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4248, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPORDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4257, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPORD_SPD = new[] { - new itemplate(OCE.VCMPORD_SPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2070, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORD_SPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2079, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORD_SPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2088, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPORD_SPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2097, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPORD_SPS = new[] { - new itemplate(OCE.VCMPORD_SPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3222, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORD_SPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3231, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPORD_SPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3240, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPORD_SPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3249, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPORD_SSD = new[] { - new itemplate(OCE.VCMPORD_SSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3960, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPORD_SSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3969, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPORD_SSS = new[] { - new itemplate(OCE.VCMPORD_SSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4536, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPORD_SSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4545, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPPD = new[] { - new itemplate(OCE.VCMPPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7468, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7476, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7484, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPPD, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7492, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPPS = new[] { - new itemplate(OCE.VCMPPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7500, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7508, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7516, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7524, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPSD = new[] { - new itemplate(OCE.VCMPSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7532, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPSD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7540, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPSS = new[] { - new itemplate(OCE.VCMPSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7548, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPSS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7556, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPTRUEPD = new[] { - new itemplate(OCE.VCMPTRUEPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1782, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUEPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1791, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUEPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1800, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPTRUEPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1809, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPTRUEPS = new[] { - new itemplate(OCE.VCMPTRUEPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2934, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUEPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2943, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUEPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2952, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPTRUEPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2961, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPTRUESD = new[] { - new itemplate(OCE.VCMPTRUESD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3816, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPTRUESD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3825, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPTRUESS = new[] { - new itemplate(OCE.VCMPTRUESS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4392, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPTRUESS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4401, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPTRUE_USPD = new[] { - new itemplate(OCE.VCMPTRUE_USPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2358, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUE_USPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2367, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUE_USPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2376, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPTRUE_USPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2385, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPTRUE_USPS = new[] { - new itemplate(OCE.VCMPTRUE_USPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3510, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUE_USPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3519, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPTRUE_USPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3528, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPTRUE_USPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3537, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPTRUE_USSD = new[] { - new itemplate(OCE.VCMPTRUE_USSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4104, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPTRUE_USSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4113, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPTRUE_USSS = new[] { - new itemplate(OCE.VCMPTRUE_USSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4680, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPTRUE_USSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4689, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPUNORDPD = new[] { - new itemplate(OCE.VCMPUNORDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1350, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1359, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1368, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPUNORDPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1377, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPUNORDPS = new[] { - new itemplate(OCE.VCMPUNORDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,2502, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,2511, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,2520, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPUNORDPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,2529, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPUNORDSD = new[] { - new itemplate(OCE.VCMPUNORDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3600, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPUNORDSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3609, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPUNORDSS = new[] { - new itemplate(OCE.VCMPUNORDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4176, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPUNORDSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4185, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCMPUNORD_SPD = new[] { - new itemplate(OCE.VCMPUNORD_SPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,1926, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORD_SPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,1935, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORD_SPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,1944, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPUNORD_SPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,1953, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPUNORD_SPS = new[] { - new itemplate(OCE.VCMPUNORD_SPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3078, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORD_SPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3087, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCMPUNORD_SPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,3096, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VCMPUNORD_SPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,3105, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCMPUNORD_SSD = new[] { - new itemplate(OCE.VCMPUNORD_SSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,3888, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCMPUNORD_SSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,3897, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCMPUNORD_SSS = new[] { - new itemplate(OCE.VCMPUNORD_SSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,4464, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCMPUNORD_SSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,4473, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCOMISD = new[] { - new itemplate(OCE.VCOMISD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11296, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCOMISS = new[] { - new itemplate(OCE.VCOMISS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11303, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCVTDQ2PD = new[] { - new itemplate(OCE.VCVTDQ2PD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11310, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCVTDQ2PD, 2, new ulong[] {YMMREG,RM_XMM,0,0,0} ,11317, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VCVTDQ2PS = new[] { - new itemplate(OCE.VCVTDQ2PS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11324, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCVTDQ2PS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11331, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCVTPD2DQ = new[] { - new itemplate(OCE.VCVTPD2DQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,11338, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2DQ, 2, new ulong[] {XMMREG,MEMORY, BITS128,0,0,0} ,11338, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2DQ, 2, new ulong[] {XMMREG,YMMREG,0,0,0} ,11345, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2DQ, 2, new ulong[] {XMMREG,MEMORY, BITS256,0,0,0} ,11345, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VCVTPD2PS = new[] { - new itemplate(OCE.VCVTPD2PS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,11352, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2PS, 2, new ulong[] {XMMREG,MEMORY, BITS128,0,0,0} ,11352, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2PS, 2, new ulong[] {XMMREG,YMMREG,0,0,0} ,11359, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTPD2PS, 2, new ulong[] {XMMREG,MEMORY, BITS256,0,0,0} ,11359, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VCVTPH2PS = new[] { - new itemplate(OCE.VCVTPH2PS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8212, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VCVTPH2PS, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8220, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VCVTPH2PS, 3, new ulong[] {YMMREG,RM_XMM,IMMEDIATE,0,0} ,8228, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VCVTPH2PS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,8228, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VCVTPH2PS, 2, new ulong[] {YMMREG,IMMEDIATE,0,0,0} ,8236, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VCVTPS2DQ = new[] { - new itemplate(OCE.VCVTPS2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11366, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCVTPS2DQ, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11373, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCVTPS2PD = new[] { - new itemplate(OCE.VCVTPS2PD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11380, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCVTPS2PD, 2, new ulong[] {YMMREG,RM_XMM,0,0,0} ,11387, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VCVTPS2PH = new[] { - new itemplate(OCE.VCVTPS2PH, 3, new ulong[] {RM_XMM,XMMREG,IMMEDIATE,0,0} ,8244, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VCVTPS2PH, 2, new ulong[] {RM_XMM,IMMEDIATE,0,0,0} ,8252, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VCVTPS2PH, 3, new ulong[] {RM_XMM,YMMREG,IMMEDIATE,0,0} ,8260, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VCVTPS2PH, 3, new ulong[] {RM_YMM,YMMREG,IMMEDIATE,0,0} ,8260, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VCVTPS2PH, 2, new ulong[] {RM_YMM,IMMEDIATE,0,0,0} ,8268, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VCVTSD2SI = new[] { - new itemplate(OCE.VCVTSD2SI, 2, new ulong[] {REG32,RM_XMM,0,0,0} ,11394, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCVTSD2SI, 2, new ulong[] {REG64,RM_XMM,0,0,0} ,11401, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ, OF.IF_LONG), - -}; - - static itemplate[] instrux_VCVTSD2SS = new[] { - new itemplate(OCE.VCVTSD2SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11408, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCVTSD2SS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11415, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VCVTSI2SD = new[] { - new itemplate(OCE.VCVTSI2SD, 3, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS32,0,0} ,11422, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTSI2SD, 2, new ulong[] {XMMREG,RM_GPR, BITS32,0,0,0} ,11429, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTSI2SD, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,11422, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_AR2), - new itemplate(OCE.VCVTSI2SD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,11429, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_AR2), - new itemplate(OCE.VCVTSI2SD, 3, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS64,0,0} ,11436, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VCVTSI2SD, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,11443, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - -}; - - static itemplate[] instrux_VCVTSI2SS = new[] { - new itemplate(OCE.VCVTSI2SS, 3, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS32,0,0} ,11450, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTSI2SS, 2, new ulong[] {XMMREG,RM_GPR, BITS32,0,0,0} ,11457, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTSI2SS, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,11450, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_AR2), - new itemplate(OCE.VCVTSI2SS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,11457, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_AR2), - new itemplate(OCE.VCVTSI2SS, 3, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS64,0,0} ,11464, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VCVTSI2SS, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,11471, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - -}; - - static itemplate[] instrux_VCVTSS2SD = new[] { - new itemplate(OCE.VCVTSS2SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11478, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCVTSS2SD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11485, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VCVTSS2SI = new[] { - new itemplate(OCE.VCVTSS2SI, 2, new ulong[] {REG32,RM_XMM,0,0,0} ,11492, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCVTSS2SI, 2, new ulong[] {REG64,RM_XMM,0,0,0} ,11499, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_LONG), - -}; - - static itemplate[] instrux_VCVTTPD2DQ = new[] { - new itemplate(OCE.VCVTTPD2DQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,11506, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTTPD2DQ, 2, new ulong[] {XMMREG,MEMORY, BITS128,0,0,0} ,11506, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTTPD2DQ, 2, new ulong[] {XMMREG,YMMREG,0,0,0} ,11513, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VCVTTPD2DQ, 2, new ulong[] {XMMREG,MEMORY, BITS256,0,0,0} ,11513, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VCVTTPS2DQ = new[] { - new itemplate(OCE.VCVTTPS2DQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11520, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VCVTTPS2DQ, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11527, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VCVTTSD2SI = new[] { - new itemplate(OCE.VCVTTSD2SI, 2, new ulong[] {REG32,RM_XMM,0,0,0} ,11534, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VCVTTSD2SI, 2, new ulong[] {REG64,RM_XMM,0,0,0} ,11541, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ, OF.IF_LONG), - -}; - - static itemplate[] instrux_VCVTTSS2SI = new[] { - new itemplate(OCE.VCVTTSS2SI, 2, new ulong[] {REG32,RM_XMM,0,0,0} ,11548, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VCVTTSS2SI, 2, new ulong[] {REG64,RM_XMM,0,0,0} ,11555, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD, OF.IF_LONG), - -}; - - static itemplate[] instrux_VDIVPD = new[] { - new itemplate(OCE.VDIVPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11562, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDIVPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11569, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDIVPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11576, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VDIVPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11583, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VDIVPS = new[] { - new itemplate(OCE.VDIVPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11590, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDIVPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11597, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDIVPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11604, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VDIVPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11611, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VDIVSD = new[] { - new itemplate(OCE.VDIVSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11618, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VDIVSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11625, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VDIVSS = new[] { - new itemplate(OCE.VDIVSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11632, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VDIVSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11639, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VDPPD = new[] { - new itemplate(OCE.VDPPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7564, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDPPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7572, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VDPPS = new[] { - new itemplate(OCE.VDPPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7580, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDPPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7588, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VDPPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7596, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VDPPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7604, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VERR = new[] { - new itemplate(OCE.VERR, 1, new ulong[] {MEMORY,0,0,0,0} ,20872, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.VERR, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,20872, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.VERR, 1, new ulong[] {REG16,0,0,0,0} ,20872, OF.IF_286, OF.IF_PROT), - -}; - - static itemplate[] instrux_VERW = new[] { - new itemplate(OCE.VERW, 1, new ulong[] {MEMORY,0,0,0,0} ,20877, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.VERW, 1, new ulong[] {MEMORY, BITS16,0,0,0,0} ,20877, OF.IF_286, OF.IF_PROT), - new itemplate(OCE.VERW, 1, new ulong[] {REG16,0,0,0,0} ,20877, OF.IF_286, OF.IF_PROT), - -}; - - static itemplate[] instrux_VEXTRACTF128 = new[] { - new itemplate(OCE.VEXTRACTF128, 3, new ulong[] {RM_XMM,XMMREG,IMMEDIATE,0,0} ,7612, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VEXTRACTPS = new[] { - new itemplate(OCE.VEXTRACTPS, 3, new ulong[] {RM_GPR, BITS32,XMMREG,IMMEDIATE,0,0} ,7620, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD123PD = new[] { - new itemplate(OCE.VFMADD123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14411, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14418, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD123PS = new[] { - new itemplate(OCE.VFMADD123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14397, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14404, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD123SD = new[] { - new itemplate(OCE.VFMADD123SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14894, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD123SS = new[] { - new itemplate(OCE.VFMADD123SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14887, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD132PD = new[] { - new itemplate(OCE.VFMADD132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14383, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14390, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD132PS = new[] { - new itemplate(OCE.VFMADD132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14369, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14376, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD132SD = new[] { - new itemplate(OCE.VFMADD132SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14880, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD132SS = new[] { - new itemplate(OCE.VFMADD132SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14873, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD213PD = new[] { - new itemplate(OCE.VFMADD213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14411, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14418, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD213PS = new[] { - new itemplate(OCE.VFMADD213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14397, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14404, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD213SD = new[] { - new itemplate(OCE.VFMADD213SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14894, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD213SS = new[] { - new itemplate(OCE.VFMADD213SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14887, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD231PD = new[] { - new itemplate(OCE.VFMADD231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14439, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14446, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD231PS = new[] { - new itemplate(OCE.VFMADD231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14425, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14432, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD231SD = new[] { - new itemplate(OCE.VFMADD231SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14908, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD231SS = new[] { - new itemplate(OCE.VFMADD231SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14901, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD312PD = new[] { - new itemplate(OCE.VFMADD312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14383, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14390, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD312PS = new[] { - new itemplate(OCE.VFMADD312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14369, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14376, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD312SD = new[] { - new itemplate(OCE.VFMADD312SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14880, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD312SS = new[] { - new itemplate(OCE.VFMADD312SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14873, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADD321PD = new[] { - new itemplate(OCE.VFMADD321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14439, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14446, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD321PS = new[] { - new itemplate(OCE.VFMADD321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14425, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADD321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14432, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADD321SD = new[] { - new itemplate(OCE.VFMADD321SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14908, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADD321SS = new[] { - new itemplate(OCE.VFMADD321SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14901, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADDPD = new[] { - new itemplate(OCE.VFMADDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5112, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5121, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5130, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5139, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5148, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5157, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5166, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5175, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDPS = new[] { - new itemplate(OCE.VFMADDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5184, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5193, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5202, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5211, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5220, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5229, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5238, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5247, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSD = new[] { - new itemplate(OCE.VFMADDSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5256, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMADDSD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5265, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMADDSD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5274, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMADDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5283, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMADDSS = new[] { - new itemplate(OCE.VFMADDSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5292, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMADDSS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5301, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMADDSS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5310, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMADDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5319, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMADDSUB123PD = new[] { - new itemplate(OCE.VFMADDSUB123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14495, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14502, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB123PS = new[] { - new itemplate(OCE.VFMADDSUB123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14481, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14488, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB132PD = new[] { - new itemplate(OCE.VFMADDSUB132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14467, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14474, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB132PS = new[] { - new itemplate(OCE.VFMADDSUB132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14453, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14460, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB213PD = new[] { - new itemplate(OCE.VFMADDSUB213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14495, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14502, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB213PS = new[] { - new itemplate(OCE.VFMADDSUB213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14481, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14488, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB231PD = new[] { - new itemplate(OCE.VFMADDSUB231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14523, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14530, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB231PS = new[] { - new itemplate(OCE.VFMADDSUB231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14509, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14516, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB312PD = new[] { - new itemplate(OCE.VFMADDSUB312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14467, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14474, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB312PS = new[] { - new itemplate(OCE.VFMADDSUB312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14453, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14460, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB321PD = new[] { - new itemplate(OCE.VFMADDSUB321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14523, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14530, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUB321PS = new[] { - new itemplate(OCE.VFMADDSUB321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14509, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMADDSUB321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14516, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUBPD = new[] { - new itemplate(OCE.VFMADDSUBPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5328, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5337, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5346, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5355, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5364, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5373, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5382, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5391, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMADDSUBPS = new[] { - new itemplate(OCE.VFMADDSUBPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5400, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5409, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5418, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5427, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5436, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5445, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMADDSUBPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5454, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMADDSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5463, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB123PD = new[] { - new itemplate(OCE.VFMSUB123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14579, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14586, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB123PS = new[] { - new itemplate(OCE.VFMSUB123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14565, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14572, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB123SD = new[] { - new itemplate(OCE.VFMSUB123SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14936, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB123SS = new[] { - new itemplate(OCE.VFMSUB123SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14929, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUB132PD = new[] { - new itemplate(OCE.VFMSUB132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14551, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14558, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB132PS = new[] { - new itemplate(OCE.VFMSUB132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14537, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14544, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB132SD = new[] { - new itemplate(OCE.VFMSUB132SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14922, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB132SS = new[] { - new itemplate(OCE.VFMSUB132SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14915, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUB213PD = new[] { - new itemplate(OCE.VFMSUB213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14579, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14586, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB213PS = new[] { - new itemplate(OCE.VFMSUB213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14565, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14572, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB213SD = new[] { - new itemplate(OCE.VFMSUB213SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14936, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB213SS = new[] { - new itemplate(OCE.VFMSUB213SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14929, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUB231PD = new[] { - new itemplate(OCE.VFMSUB231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14607, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14614, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB231PS = new[] { - new itemplate(OCE.VFMSUB231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14593, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14600, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB231SD = new[] { - new itemplate(OCE.VFMSUB231SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14950, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB231SS = new[] { - new itemplate(OCE.VFMSUB231SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14943, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUB312PD = new[] { - new itemplate(OCE.VFMSUB312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14551, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14558, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB312PS = new[] { - new itemplate(OCE.VFMSUB312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14537, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14544, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB312SD = new[] { - new itemplate(OCE.VFMSUB312SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14922, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB312SS = new[] { - new itemplate(OCE.VFMSUB312SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14915, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUB321PD = new[] { - new itemplate(OCE.VFMSUB321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14607, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14614, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB321PS = new[] { - new itemplate(OCE.VFMSUB321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14593, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUB321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14600, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUB321SD = new[] { - new itemplate(OCE.VFMSUB321SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14950, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUB321SS = new[] { - new itemplate(OCE.VFMSUB321SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14943, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFMSUBADD123PD = new[] { - new itemplate(OCE.VFMSUBADD123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14663, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14670, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD123PS = new[] { - new itemplate(OCE.VFMSUBADD123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14649, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14656, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD132PD = new[] { - new itemplate(OCE.VFMSUBADD132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14635, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14642, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD132PS = new[] { - new itemplate(OCE.VFMSUBADD132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14621, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14628, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD213PD = new[] { - new itemplate(OCE.VFMSUBADD213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14663, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14670, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD213PS = new[] { - new itemplate(OCE.VFMSUBADD213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14649, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14656, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD231PD = new[] { - new itemplate(OCE.VFMSUBADD231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14691, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14698, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD231PS = new[] { - new itemplate(OCE.VFMSUBADD231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14677, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14684, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD312PD = new[] { - new itemplate(OCE.VFMSUBADD312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14635, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14642, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD312PS = new[] { - new itemplate(OCE.VFMSUBADD312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14621, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14628, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD321PD = new[] { - new itemplate(OCE.VFMSUBADD321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14691, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14698, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADD321PS = new[] { - new itemplate(OCE.VFMSUBADD321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14677, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFMSUBADD321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14684, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADDPD = new[] { - new itemplate(OCE.VFMSUBADDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5472, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5481, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5490, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5499, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5508, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5517, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5526, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5535, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBADDPS = new[] { - new itemplate(OCE.VFMSUBADDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5544, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5553, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5562, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5571, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5580, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5589, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBADDPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5598, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBADDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5607, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBPD = new[] { - new itemplate(OCE.VFMSUBPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5616, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5625, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5634, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5643, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5652, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5661, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5670, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5679, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBPS = new[] { - new itemplate(OCE.VFMSUBPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5688, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5697, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5706, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5715, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5724, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5733, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFMSUBPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5742, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFMSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5751, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFMSUBSD = new[] { - new itemplate(OCE.VFMSUBSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5760, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMSUBSD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5769, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMSUBSD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5778, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFMSUBSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5787, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFMSUBSS = new[] { - new itemplate(OCE.VFMSUBSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5796, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMSUBSS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5805, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMSUBSS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5814, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFMSUBSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5823, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD123PD = new[] { - new itemplate(OCE.VFNMADD123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14747, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14754, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD123PS = new[] { - new itemplate(OCE.VFNMADD123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14733, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14740, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD123SD = new[] { - new itemplate(OCE.VFNMADD123SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14978, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD123SS = new[] { - new itemplate(OCE.VFNMADD123SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14971, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD132PD = new[] { - new itemplate(OCE.VFNMADD132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14719, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14726, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD132PS = new[] { - new itemplate(OCE.VFNMADD132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14705, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14712, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD132SD = new[] { - new itemplate(OCE.VFNMADD132SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14964, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD132SS = new[] { - new itemplate(OCE.VFNMADD132SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14957, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD213PD = new[] { - new itemplate(OCE.VFNMADD213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14747, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14754, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD213PS = new[] { - new itemplate(OCE.VFNMADD213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14733, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14740, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD213SD = new[] { - new itemplate(OCE.VFNMADD213SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14978, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD213SS = new[] { - new itemplate(OCE.VFNMADD213SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14971, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD231PD = new[] { - new itemplate(OCE.VFNMADD231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14775, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14782, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD231PS = new[] { - new itemplate(OCE.VFNMADD231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14761, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14768, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD231SD = new[] { - new itemplate(OCE.VFNMADD231SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14992, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD231SS = new[] { - new itemplate(OCE.VFNMADD231SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14985, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD312PD = new[] { - new itemplate(OCE.VFNMADD312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14719, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14726, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD312PS = new[] { - new itemplate(OCE.VFNMADD312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14705, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14712, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD312SD = new[] { - new itemplate(OCE.VFNMADD312SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14964, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD312SS = new[] { - new itemplate(OCE.VFNMADD312SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14957, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADD321PD = new[] { - new itemplate(OCE.VFNMADD321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14775, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14782, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD321PS = new[] { - new itemplate(OCE.VFNMADD321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14761, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMADD321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14768, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADD321SD = new[] { - new itemplate(OCE.VFNMADD321SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14992, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADD321SS = new[] { - new itemplate(OCE.VFNMADD321SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14985, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMADDPD = new[] { - new itemplate(OCE.VFNMADDPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5832, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5841, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5850, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5859, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5868, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5877, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5886, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5895, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADDPS = new[] { - new itemplate(OCE.VFNMADDPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5904, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5913, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,5922, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,5931, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5940, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5949, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMADDPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,5958, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMADDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,5967, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMADDSD = new[] { - new itemplate(OCE.VFNMADDSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,5976, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMADDSD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,5985, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMADDSD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,5994, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMADDSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6003, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMADDSS = new[] { - new itemplate(OCE.VFNMADDSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6012, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMADDSS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6021, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMADDSS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6030, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMADDSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6039, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB123PD = new[] { - new itemplate(OCE.VFNMSUB123PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14831, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB123PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14838, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB123PS = new[] { - new itemplate(OCE.VFNMSUB123PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14817, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB123PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14824, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB123SD = new[] { - new itemplate(OCE.VFNMSUB123SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15020, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB123SS = new[] { - new itemplate(OCE.VFNMSUB123SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15013, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB132PD = new[] { - new itemplate(OCE.VFNMSUB132PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14803, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB132PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14810, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB132PS = new[] { - new itemplate(OCE.VFNMSUB132PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14789, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB132PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14796, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB132SD = new[] { - new itemplate(OCE.VFNMSUB132SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15006, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB132SS = new[] { - new itemplate(OCE.VFNMSUB132SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14999, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB213PD = new[] { - new itemplate(OCE.VFNMSUB213PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14831, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB213PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14838, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB213PS = new[] { - new itemplate(OCE.VFNMSUB213PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14817, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB213PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14824, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB213SD = new[] { - new itemplate(OCE.VFNMSUB213SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15020, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB213SS = new[] { - new itemplate(OCE.VFNMSUB213SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15013, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB231PD = new[] { - new itemplate(OCE.VFNMSUB231PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14859, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB231PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14866, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB231PS = new[] { - new itemplate(OCE.VFNMSUB231PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14845, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB231PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14852, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB231SD = new[] { - new itemplate(OCE.VFNMSUB231SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15034, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB231SS = new[] { - new itemplate(OCE.VFNMSUB231SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15027, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB312PD = new[] { - new itemplate(OCE.VFNMSUB312PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14803, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB312PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14810, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB312PS = new[] { - new itemplate(OCE.VFNMSUB312PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14789, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB312PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14796, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB312SD = new[] { - new itemplate(OCE.VFNMSUB312SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15006, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB312SS = new[] { - new itemplate(OCE.VFNMSUB312SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14999, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUB321PD = new[] { - new itemplate(OCE.VFNMSUB321PD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14859, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB321PD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14866, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB321PS = new[] { - new itemplate(OCE.VFNMSUB321PS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14845, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SO), - new itemplate(OCE.VFNMSUB321PS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14852, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUB321SD = new[] { - new itemplate(OCE.VFNMSUB321SD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15034, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUB321SS = new[] { - new itemplate(OCE.VFNMSUB321SS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15027, OF.IF_FMA, OF.IF_FUTURE, OF.IF_SD), - -}; - - static itemplate[] instrux_VFNMSUBPD = new[] { - new itemplate(OCE.VFNMSUBPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6048, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6057, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,6066, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPD, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,6075, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6084, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6093, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,6102, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,6111, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUBPS = new[] { - new itemplate(OCE.VFNMSUBPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6120, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6129, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,6138, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPS, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,6147, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6156, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6165, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFNMSUBPS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,6174, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFNMSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,6183, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFNMSUBSD = new[] { - new itemplate(OCE.VFNMSUBSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6192, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMSUBSD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6201, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMSUBSD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6210, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFNMSUBSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6219, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFNMSUBSS = new[] { - new itemplate(OCE.VFNMSUBSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6228, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMSUBSS, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6237, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMSUBSS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6246, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFNMSUBSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6255, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - -}; - - static itemplate[] instrux_VFRCZPD = new[] { - new itemplate(OCE.VFRCZPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15041, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFRCZPD, 1, new ulong[] {XMMREG,0,0,0,0} ,15048, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFRCZPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,15055, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFRCZPD, 1, new ulong[] {YMMREG,0,0,0,0} ,15062, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFRCZPS = new[] { - new itemplate(OCE.VFRCZPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15069, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFRCZPS, 1, new ulong[] {XMMREG,0,0,0,0} ,15076, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VFRCZPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,15083, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VFRCZPS, 1, new ulong[] {YMMREG,0,0,0,0} ,15090, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VFRCZSD = new[] { - new itemplate(OCE.VFRCZSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15097, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - new itemplate(OCE.VFRCZSD, 1, new ulong[] {XMMREG,0,0,0,0} ,15104, OF.IF_AMD, OF.IF_SSE5, OF.IF_SQ), - -}; - - static itemplate[] instrux_VFRCZSS = new[] { - new itemplate(OCE.VFRCZSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15111, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - new itemplate(OCE.VFRCZSS, 1, new ulong[] {XMMREG,0,0,0,0} ,15118, OF.IF_AMD, OF.IF_SSE5, OF.IF_SD), - -}; - - static itemplate[] instrux_VHADDPD = new[] { - new itemplate(OCE.VHADDPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11646, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHADDPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11653, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHADDPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11660, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VHADDPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11667, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VHADDPS = new[] { - new itemplate(OCE.VHADDPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11674, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHADDPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11681, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHADDPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11688, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VHADDPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11695, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VHSUBPD = new[] { - new itemplate(OCE.VHSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11702, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHSUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11709, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11716, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VHSUBPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11723, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VHSUBPS = new[] { - new itemplate(OCE.VHSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11730, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHSUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11737, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VHSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11744, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VHSUBPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11751, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VINSERTF128 = new[] { - new itemplate(OCE.VINSERTF128, 4, new ulong[] {YMMREG,YMMREG,RM_XMM,IMMEDIATE,0} ,7628, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VINSERTPS = new[] { - new itemplate(OCE.VINSERTPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7636, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VINSERTPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7644, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VLDDQU = new[] { - new itemplate(OCE.VLDDQU, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,11758, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VLDDQU, 2, new ulong[] {YMMREG,MEMORY,0,0,0} ,11765, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VLDMXCSR = new[] { - new itemplate(OCE.VLDMXCSR, 1, new ulong[] {MEMORY, BITS32,0,0,0,0} ,11772, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VLDQQU = new[] { - new itemplate(OCE.VLDQQU, 2, new ulong[] {YMMREG,MEMORY,0,0,0} ,11765, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMASKMOVDQU = new[] { - new itemplate(OCE.VMASKMOVDQU, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,11779, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VMASKMOVPD = new[] { - new itemplate(OCE.VMASKMOVPD, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,11814, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMASKMOVPD, 3, new ulong[] {YMMREG,YMMREG,MEMORY,0,0} ,11821, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMASKMOVPD, 3, new ulong[] {MEMORY,XMMREG,XMMREG,0,0} ,11828, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMASKMOVPD, 3, new ulong[] {MEMORY,YMMREG,YMMREG,0,0} ,11835, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMASKMOVPS = new[] { - new itemplate(OCE.VMASKMOVPS, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,11786, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMASKMOVPS, 3, new ulong[] {YMMREG,YMMREG,MEMORY,0,0} ,11793, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMASKMOVPS, 3, new ulong[] {MEMORY,XMMREG,XMMREG,0,0} ,11800, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMASKMOVPS, 3, new ulong[] {MEMORY,XMMREG,XMMREG,0,0} ,11807, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMAXPD = new[] { - new itemplate(OCE.VMAXPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11842, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMAXPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11849, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMAXPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11856, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMAXPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11863, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMAXPS = new[] { - new itemplate(OCE.VMAXPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11870, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMAXPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11877, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMAXPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11884, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMAXPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11891, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMAXSD = new[] { - new itemplate(OCE.VMAXSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11898, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMAXSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11905, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMAXSS = new[] { - new itemplate(OCE.VMAXSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11912, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VMAXSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11919, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VMCALL = new[] { - new itemplate(OCE.VMCALL, 0, new ulong[] {0,0,0,0,0} ,20997, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMCLEAR = new[] { - new itemplate(OCE.VMCLEAR, 1, new ulong[] {MEMORY,0,0,0,0} ,17937, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMINPD = new[] { - new itemplate(OCE.VMINPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11926, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMINPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11933, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMINPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11940, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMINPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11947, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMINPS = new[] { - new itemplate(OCE.VMINPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11954, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMINPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11961, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMINPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,11968, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMINPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,11975, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMINSD = new[] { - new itemplate(OCE.VMINSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11982, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMINSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,11989, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMINSS = new[] { - new itemplate(OCE.VMINSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,11996, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VMINSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12003, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VMLAUNCH = new[] { - new itemplate(OCE.VMLAUNCH, 0, new ulong[] {0,0,0,0,0} ,21002, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMLOAD = new[] { - new itemplate(OCE.VMLOAD, 0, new ulong[] {0,0,0,0,0} ,21007, OF.IF_X64, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMMCALL = new[] { - new itemplate(OCE.VMMCALL, 0, new ulong[] {0,0,0,0,0} ,21012, OF.IF_X64, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMOVAPD = new[] { - new itemplate(OCE.VMOVAPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12010, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVAPD, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12017, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVAPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12024, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVAPD, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12031, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVAPS = new[] { - new itemplate(OCE.VMOVAPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12038, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVAPS, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12045, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVAPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12052, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVAPS, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12059, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVD = new[] { - new itemplate(OCE.VMOVD, 2, new ulong[] {XMMREG,RM_GPR, BITS32,0,0,0} ,12080, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VMOVD, 2, new ulong[] {RM_GPR, BITS32,XMMREG,0,0,0} ,12094, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VMOVDDUP = new[] { - new itemplate(OCE.VMOVDDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12108, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVDDUP, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12115, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVDQA = new[] { - new itemplate(OCE.VMOVDQA, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12122, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVDQA, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12129, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVDQA, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12136, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVDQA, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12143, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVDQU = new[] { - new itemplate(OCE.VMOVDQU, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12150, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVDQU, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12157, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVDQU, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12164, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVDQU, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12171, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVHLPS = new[] { - new itemplate(OCE.VMOVHLPS, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12178, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVHLPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12185, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VMOVHPD = new[] { - new itemplate(OCE.VMOVHPD, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,12192, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVHPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12199, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVHPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12206, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVHPS = new[] { - new itemplate(OCE.VMOVHPS, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,12213, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVHPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12220, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVHPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12227, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVLHPS = new[] { - new itemplate(OCE.VMOVLHPS, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12213, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVLHPS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12220, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VMOVLPD = new[] { - new itemplate(OCE.VMOVLPD, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,12234, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVLPD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12241, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVLPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12248, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVLPS = new[] { - new itemplate(OCE.VMOVLPS, 3, new ulong[] {XMMREG,XMMREG,MEMORY,0,0} ,12178, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVLPS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12185, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVLPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12255, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVMSKPD = new[] { - new itemplate(OCE.VMOVMSKPD, 2, new ulong[] {REG64,XMMREG,0,0,0} ,12262, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VMOVMSKPD, 2, new ulong[] {REG32,XMMREG,0,0,0} ,12262, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVMSKPD, 2, new ulong[] {REG64,YMMREG,0,0,0} ,12269, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VMOVMSKPD, 2, new ulong[] {REG32,YMMREG,0,0,0} ,12269, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VMOVMSKPS = new[] { - new itemplate(OCE.VMOVMSKPS, 2, new ulong[] {REG64,XMMREG,0,0,0} ,12276, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VMOVMSKPS, 2, new ulong[] {REG32,XMMREG,0,0,0} ,12276, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVMSKPS, 2, new ulong[] {REG64,YMMREG,0,0,0} ,12283, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VMOVMSKPS, 2, new ulong[] {REG32,YMMREG,0,0,0} ,12283, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VMOVNTDQ = new[] { - new itemplate(OCE.VMOVNTDQ, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12290, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVNTDQ, 2, new ulong[] {MEMORY,YMMREG,0,0,0} ,12297, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVNTDQA = new[] { - new itemplate(OCE.VMOVNTDQA, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12304, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VMOVNTPD = new[] { - new itemplate(OCE.VMOVNTPD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12311, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVNTPD, 2, new ulong[] {MEMORY,YMMREG,0,0,0} ,12318, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVNTPS = new[] { - new itemplate(OCE.VMOVNTPS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12325, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVNTPS, 2, new ulong[] {MEMORY,YMMREG,0,0,0} ,12332, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VMOVNTQQ = new[] { - new itemplate(OCE.VMOVNTQQ, 2, new ulong[] {MEMORY,YMMREG,0,0,0} ,12297, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVQ = new[] { - new itemplate(OCE.VMOVQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12066, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVQ, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12073, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVQ, 2, new ulong[] {XMMREG,RM_GPR, BITS64,0,0,0} ,12087, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ, OF.IF_LONG), - new itemplate(OCE.VMOVQ, 2, new ulong[] {RM_GPR, BITS64,XMMREG,0,0,0} ,12101, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ, OF.IF_LONG), - -}; - - static itemplate[] instrux_VMOVQQA = new[] { - new itemplate(OCE.VMOVQQA, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12136, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVQQA, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12143, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVQQU = new[] { - new itemplate(OCE.VMOVQQU, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12164, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVQQU, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12171, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVSD = new[] { - new itemplate(OCE.VMOVSD, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12339, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12346, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSD, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12353, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVSD, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12360, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12367, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSD, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12374, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVSHDUP = new[] { - new itemplate(OCE.VMOVSHDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12381, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVSHDUP, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12388, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVSLDUP = new[] { - new itemplate(OCE.VMOVSLDUP, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12395, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVSLDUP, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12402, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVSS = new[] { - new itemplate(OCE.VMOVSS, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12409, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12416, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSS, 2, new ulong[] {XMMREG,MEMORY,0,0,0} ,12423, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMOVSS, 3, new ulong[] {XMMREG,XMMREG,XMMREG,0,0} ,12430, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSS, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,12437, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VMOVSS, 2, new ulong[] {MEMORY,XMMREG,0,0,0} ,12444, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMOVUPD = new[] { - new itemplate(OCE.VMOVUPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12451, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVUPD, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12458, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVUPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12465, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVUPD, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12472, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMOVUPS = new[] { - new itemplate(OCE.VMOVUPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12479, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVUPS, 2, new ulong[] {RM_XMM,XMMREG,0,0,0} ,12486, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMOVUPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12493, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMOVUPS, 2, new ulong[] {RM_YMM,YMMREG,0,0,0} ,12500, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMPSADBW = new[] { - new itemplate(OCE.VMPSADBW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7652, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMPSADBW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7660, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VMPTRLD = new[] { - new itemplate(OCE.VMPTRLD, 1, new ulong[] {MEMORY,0,0,0,0} ,17944, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMPTRST = new[] { - new itemplate(OCE.VMPTRST, 1, new ulong[] {MEMORY,0,0,0,0} ,21017, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMREAD = new[] { - new itemplate(OCE.VMREAD, 2, new ulong[] {RM_GPR, BITS32,REG32,0,0,0} ,9407, OF.IF_VMX, OF.IF_NOLONG, OF.IF_SD), - new itemplate(OCE.VMREAD, 2, new ulong[] {RM_GPR, BITS64,REG64,0,0,0} ,9406, OF.IF_X64, OF.IF_VMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMRESUME = new[] { - new itemplate(OCE.VMRESUME, 0, new ulong[] {0,0,0,0,0} ,21022, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMRUN = new[] { - new itemplate(OCE.VMRUN, 0, new ulong[] {0,0,0,0,0} ,21027, OF.IF_X64, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMSAVE = new[] { - new itemplate(OCE.VMSAVE, 0, new ulong[] {0,0,0,0,0} ,21032, OF.IF_X64, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMULPD = new[] { - new itemplate(OCE.VMULPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12507, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMULPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12514, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMULPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,12521, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMULPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12528, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMULPS = new[] { - new itemplate(OCE.VMULPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12535, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMULPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12542, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VMULPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,12549, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VMULPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12556, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VMULSD = new[] { - new itemplate(OCE.VMULSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12563, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VMULSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12570, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMULSS = new[] { - new itemplate(OCE.VMULSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12577, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VMULSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12584, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VMWRITE = new[] { - new itemplate(OCE.VMWRITE, 2, new ulong[] {REG32,RM_GPR, BITS32,0,0,0} ,9414, OF.IF_VMX, OF.IF_NOLONG, OF.IF_SD), - new itemplate(OCE.VMWRITE, 2, new ulong[] {REG64,RM_GPR, BITS64,0,0,0} ,9413, OF.IF_X64, OF.IF_VMX, OF.IF_SQ), - -}; - - static itemplate[] instrux_VMXOFF = new[] { - new itemplate(OCE.VMXOFF, 0, new ulong[] {0,0,0,0,0} ,21037, OF.IF_VMX), - -}; - - static itemplate[] instrux_VMXON = new[] { - new itemplate(OCE.VMXON, 1, new ulong[] {MEMORY,0,0,0,0} ,17943, OF.IF_VMX), - -}; - - static itemplate[] instrux_VORPD = new[] { - new itemplate(OCE.VORPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12591, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VORPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12598, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VORPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,12605, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VORPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12612, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VORPS = new[] { - new itemplate(OCE.VORPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12619, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VORPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12626, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VORPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,12633, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VORPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,12640, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPABSB = new[] { - new itemplate(OCE.VPABSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12647, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPABSD = new[] { - new itemplate(OCE.VPABSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12661, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPABSW = new[] { - new itemplate(OCE.VPABSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12654, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPACKSSDW = new[] { - new itemplate(OCE.VPACKSSDW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12682, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPACKSSDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12689, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPACKSSWB = new[] { - new itemplate(OCE.VPACKSSWB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12668, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPACKSSWB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12675, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPACKUSDW = new[] { - new itemplate(OCE.VPACKUSDW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12710, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPACKUSDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12717, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPACKUSWB = new[] { - new itemplate(OCE.VPACKUSWB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12696, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPACKUSWB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12703, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDB = new[] { - new itemplate(OCE.VPADDB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12724, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12731, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDD = new[] { - new itemplate(OCE.VPADDD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12752, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12759, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDQ = new[] { - new itemplate(OCE.VPADDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12766, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12773, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDSB = new[] { - new itemplate(OCE.VPADDSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12780, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12787, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDSW = new[] { - new itemplate(OCE.VPADDSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12794, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12801, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDUSB = new[] { - new itemplate(OCE.VPADDUSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12808, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDUSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12815, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDUSW = new[] { - new itemplate(OCE.VPADDUSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12822, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDUSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12829, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPADDW = new[] { - new itemplate(OCE.VPADDW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12738, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPADDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12745, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPALIGNR = new[] { - new itemplate(OCE.VPALIGNR, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7668, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPALIGNR, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7676, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPAND = new[] { - new itemplate(OCE.VPAND, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12836, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPAND, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12843, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPANDN = new[] { - new itemplate(OCE.VPANDN, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12850, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPANDN, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12857, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPAVGB = new[] { - new itemplate(OCE.VPAVGB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12864, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPAVGB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12871, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPAVGW = new[] { - new itemplate(OCE.VPAVGW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12878, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPAVGW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12885, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPBLENDVB = new[] { - new itemplate(OCE.VPBLENDVB, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4698, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPBLENDVB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,4707, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPBLENDW = new[] { - new itemplate(OCE.VPBLENDW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,7684, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPBLENDW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7692, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCLMULHQHQDQ = new[] { - new itemplate(OCE.VPCLMULHQHQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5094, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCLMULHQHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5103, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCLMULHQLQDQ = new[] { - new itemplate(OCE.VPCLMULHQLQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5058, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCLMULHQLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5067, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCLMULLQHQDQ = new[] { - new itemplate(OCE.VPCLMULLQHQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5076, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCLMULLQHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5085, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCLMULLQLQDQ = new[] { - new itemplate(OCE.VPCLMULLQLQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,5040, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCLMULLQLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,5049, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCLMULQDQ = new[] { - new itemplate(OCE.VPCLMULQDQ, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8196, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCLMULQDQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8204, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMOV = new[] { - new itemplate(OCE.VPCMOV, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6264, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCMOV, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6273, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCMOV, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,6282, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VPCMOV, 3, new ulong[] {YMMREG,RM_YMM,YMMREG,0,0} ,6291, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VPCMOV, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6300, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCMOV, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6309, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCMOV, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,6318, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - new itemplate(OCE.VPCMOV, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,6327, OF.IF_AMD, OF.IF_SSE5, OF.IF_SY), - -}; - - static itemplate[] instrux_VPCMPEQB = new[] { - new itemplate(OCE.VPCMPEQB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12892, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPEQB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12899, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPEQD = new[] { - new itemplate(OCE.VPCMPEQD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12920, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPEQD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12927, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPEQQ = new[] { - new itemplate(OCE.VPCMPEQQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12934, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPEQQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12941, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPEQW = new[] { - new itemplate(OCE.VPCMPEQW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12906, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPEQW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12913, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPESTRI = new[] { - new itemplate(OCE.VPCMPESTRI, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7700, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPESTRM = new[] { - new itemplate(OCE.VPCMPESTRM, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7708, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPGTB = new[] { - new itemplate(OCE.VPCMPGTB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12948, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPGTB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12955, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPGTD = new[] { - new itemplate(OCE.VPCMPGTD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12976, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPGTD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12983, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPGTQ = new[] { - new itemplate(OCE.VPCMPGTQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12990, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPGTQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12997, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPGTW = new[] { - new itemplate(OCE.VPCMPGTW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,12962, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPCMPGTW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,12969, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPISTRI = new[] { - new itemplate(OCE.VPCMPISTRI, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7716, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCMPISTRM = new[] { - new itemplate(OCE.VPCMPISTRM, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7724, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMB = new[] { - new itemplate(OCE.VPCOMB, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8276, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMB, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8284, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMD = new[] { - new itemplate(OCE.VPCOMD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8292, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8300, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMQ = new[] { - new itemplate(OCE.VPCOMQ, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8308, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8316, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMUB = new[] { - new itemplate(OCE.VPCOMUB, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8324, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMUB, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8332, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMUD = new[] { - new itemplate(OCE.VPCOMUD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8340, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMUD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8348, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMUQ = new[] { - new itemplate(OCE.VPCOMUQ, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8356, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMUQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8364, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMUW = new[] { - new itemplate(OCE.VPCOMUW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8372, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMUW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8380, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPCOMW = new[] { - new itemplate(OCE.VPCOMW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8388, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPCOMW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8396, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPERM2F128 = new[] { - new itemplate(OCE.VPERM2F128, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,7764, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMIL2PD = new[] { - new itemplate(OCE.VPERMIL2PD, 5, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,IMMEDIATE} ,4824, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMIL2PD, 5, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,IMMEDIATE} ,4833, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMIL2PD, 5, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,IMMEDIATE} ,4842, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMIL2PD, 5, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,IMMEDIATE} ,4851, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMIL2PS = new[] { - new itemplate(OCE.VPERMIL2PS, 5, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,IMMEDIATE} ,4968, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMIL2PS, 5, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,IMMEDIATE} ,4977, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMIL2PS, 5, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,IMMEDIATE} ,4986, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMIL2PS, 5, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,IMMEDIATE} ,4995, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILMO2PD = new[] { - new itemplate(OCE.VPERMILMO2PD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4752, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMO2PD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4761, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMO2PD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4770, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILMO2PD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4779, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILMO2PS = new[] { - new itemplate(OCE.VPERMILMO2PS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4896, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMO2PS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4905, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMO2PS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4914, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILMO2PS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4923, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILMZ2PD = new[] { - new itemplate(OCE.VPERMILMZ2PD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4788, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMZ2PD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4797, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMZ2PD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4806, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILMZ2PD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4815, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILMZ2PS = new[] { - new itemplate(OCE.VPERMILMZ2PS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4932, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMZ2PS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4941, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILMZ2PS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4950, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILMZ2PS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4959, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILPD = new[] { - new itemplate(OCE.VPERMILPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13004, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,13011, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7732, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILPD, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7740, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILPS = new[] { - new itemplate(OCE.VPERMILPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13018, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,13025, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7748, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,7756, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILTD2PD = new[] { - new itemplate(OCE.VPERMILTD2PD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4716, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILTD2PD, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4725, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILTD2PD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4734, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILTD2PD, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4743, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPERMILTD2PS = new[] { - new itemplate(OCE.VPERMILTD2PS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,4860, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILTD2PS, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,4869, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPERMILTD2PS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,YMMREG,0} ,4878, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VPERMILTD2PS, 4, new ulong[] {YMMREG,YMMREG,YMMREG,RM_YMM,0} ,4887, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPEXTRB = new[] { - new itemplate(OCE.VPEXTRB, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,7772, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VPEXTRB, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,7772, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPEXTRB, 3, new ulong[] {MEMORY,XMMREG,IMMEDIATE,0,0} ,7772, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB), - -}; - - static itemplate[] instrux_VPEXTRD = new[] { - new itemplate(OCE.VPEXTRD, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,7796, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VPEXTRD, 3, new ulong[] {RM_GPR, BITS32,XMMREG,IMMEDIATE,0,0} ,7796, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VPEXTRQ = new[] { - new itemplate(OCE.VPEXTRQ, 3, new ulong[] {RM_GPR, BITS64,XMMREG,IMMEDIATE,0,0} ,7804, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ, OF.IF_LONG), - -}; - - static itemplate[] instrux_VPEXTRW = new[] { - new itemplate(OCE.VPEXTRW, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,7780, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VPEXTRW, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,7780, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPEXTRW, 3, new ulong[] {MEMORY,XMMREG,IMMEDIATE,0,0} ,7780, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SW), - new itemplate(OCE.VPEXTRW, 3, new ulong[] {REG64,XMMREG,IMMEDIATE,0,0} ,7788, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VPEXTRW, 3, new ulong[] {REG32,XMMREG,IMMEDIATE,0,0} ,7788, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPEXTRW, 3, new ulong[] {MEMORY,XMMREG,IMMEDIATE,0,0} ,7788, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SW), - -}; - - static itemplate[] instrux_VPHADDBD = new[] { - new itemplate(OCE.VPHADDBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15125, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDBD, 1, new ulong[] {XMMREG,0,0,0,0} ,15132, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDBQ = new[] { - new itemplate(OCE.VPHADDBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15139, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDBQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15146, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDBW = new[] { - new itemplate(OCE.VPHADDBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15153, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDBW, 1, new ulong[] {XMMREG,0,0,0,0} ,15160, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDD = new[] { - new itemplate(OCE.VPHADDD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13046, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHADDD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13053, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDDQ = new[] { - new itemplate(OCE.VPHADDDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15167, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDDQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15174, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDSW = new[] { - new itemplate(OCE.VPHADDSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13060, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHADDSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13067, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUBD = new[] { - new itemplate(OCE.VPHADDUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15181, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUBD, 1, new ulong[] {XMMREG,0,0,0,0} ,15188, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUBQ = new[] { - new itemplate(OCE.VPHADDUBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15195, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUBQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15202, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUBWD = new[] { - new itemplate(OCE.VPHADDUBWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15209, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUBWD, 1, new ulong[] {XMMREG,0,0,0,0} ,15216, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUDQ = new[] { - new itemplate(OCE.VPHADDUDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15223, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUDQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15230, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUWD = new[] { - new itemplate(OCE.VPHADDUWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15237, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUWD, 1, new ulong[] {XMMREG,0,0,0,0} ,15244, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDUWQ = new[] { - new itemplate(OCE.VPHADDUWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15251, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDUWQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15258, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDW = new[] { - new itemplate(OCE.VPHADDW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13032, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHADDW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13039, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDWD = new[] { - new itemplate(OCE.VPHADDWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15265, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDWD, 1, new ulong[] {XMMREG,0,0,0,0} ,15272, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHADDWQ = new[] { - new itemplate(OCE.VPHADDWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15251, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHADDWQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15258, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHMINPOSUW = new[] { - new itemplate(OCE.VPHMINPOSUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13074, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBBW = new[] { - new itemplate(OCE.VPHSUBBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15279, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHSUBBW, 1, new ulong[] {XMMREG,0,0,0,0} ,15286, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBD = new[] { - new itemplate(OCE.VPHSUBD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13095, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHSUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13102, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBDQ = new[] { - new itemplate(OCE.VPHSUBDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15293, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHSUBDQ, 1, new ulong[] {XMMREG,0,0,0,0} ,15300, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBSW = new[] { - new itemplate(OCE.VPHSUBSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13109, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHSUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13116, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBW = new[] { - new itemplate(OCE.VPHSUBW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13081, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPHSUBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13088, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPHSUBWD = new[] { - new itemplate(OCE.VPHSUBWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15307, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPHSUBWD, 1, new ulong[] {XMMREG,0,0,0,0} ,15314, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPINSRB = new[] { - new itemplate(OCE.VPINSRB, 4, new ulong[] {XMMREG,XMMREG,MEMORY,IMMEDIATE,0} ,7812, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRB, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,7820, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRB, 4, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS8,IMMEDIATE,0} ,7812, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRB, 3, new ulong[] {XMMREG,RM_GPR, BITS8,IMMEDIATE,0,0} ,7820, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRB, 4, new ulong[] {XMMREG,XMMREG,REG32,IMMEDIATE,0} ,7812, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRB, 3, new ulong[] {XMMREG,REG32,IMMEDIATE,0,0} ,7820, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - -}; - - static itemplate[] instrux_VPINSRD = new[] { - new itemplate(OCE.VPINSRD, 4, new ulong[] {XMMREG,XMMREG,MEMORY,IMMEDIATE,0} ,7844, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRD, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,7852, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRD, 4, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS32,IMMEDIATE,0} ,7844, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRD, 3, new ulong[] {XMMREG,RM_GPR, BITS32,IMMEDIATE,0,0} ,7852, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - -}; - - static itemplate[] instrux_VPINSRQ = new[] { - new itemplate(OCE.VPINSRQ, 4, new ulong[] {XMMREG,XMMREG,MEMORY,IMMEDIATE,0} ,7860, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3, OF.IF_LONG), - new itemplate(OCE.VPINSRQ, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,7868, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3, OF.IF_LONG), - new itemplate(OCE.VPINSRQ, 4, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS64,IMMEDIATE,0} ,7860, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3, OF.IF_LONG), - new itemplate(OCE.VPINSRQ, 3, new ulong[] {XMMREG,RM_GPR, BITS64,IMMEDIATE,0,0} ,7868, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3, OF.IF_LONG), - -}; - - static itemplate[] instrux_VPINSRW = new[] { - new itemplate(OCE.VPINSRW, 4, new ulong[] {XMMREG,XMMREG,MEMORY,IMMEDIATE,0} ,7828, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRW, 3, new ulong[] {XMMREG,MEMORY,IMMEDIATE,0,0} ,7836, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRW, 4, new ulong[] {XMMREG,XMMREG,RM_GPR, BITS16,IMMEDIATE,0} ,7828, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRW, 3, new ulong[] {XMMREG,RM_GPR, BITS16,IMMEDIATE,0,0} ,7836, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRW, 4, new ulong[] {XMMREG,XMMREG,REG32,IMMEDIATE,0} ,7828, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - new itemplate(OCE.VPINSRW, 3, new ulong[] {XMMREG,REG32,IMMEDIATE,0,0} ,7836, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SB, OF.IF_AR3), - -}; - - static itemplate[] instrux_VPMACSDD = new[] { - new itemplate(OCE.VPMACSDD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6336, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSDD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6345, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSDQH = new[] { - new itemplate(OCE.VPMACSDQH, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6354, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSDQH, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6363, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSDQL = new[] { - new itemplate(OCE.VPMACSDQL, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6372, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSDQL, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6381, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSSDD = new[] { - new itemplate(OCE.VPMACSSDD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6390, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSSDD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6399, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSSDQH = new[] { - new itemplate(OCE.VPMACSSDQH, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6408, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSSDQH, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6417, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSSDQL = new[] { - new itemplate(OCE.VPMACSSDQL, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6426, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSSDQL, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6435, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSSWD = new[] { - new itemplate(OCE.VPMACSSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6444, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSSWD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6453, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSSWW = new[] { - new itemplate(OCE.VPMACSSWW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6462, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSSWW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6471, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSWD = new[] { - new itemplate(OCE.VPMACSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6480, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSWD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6489, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMACSWW = new[] { - new itemplate(OCE.VPMACSWW, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6498, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMACSWW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6507, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMADCSSWD = new[] { - new itemplate(OCE.VPMADCSSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6516, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMADCSSWD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6525, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMADCSWD = new[] { - new itemplate(OCE.VPMADCSWD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6534, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPMADCSWD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6543, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMADDUBSW = new[] { - new itemplate(OCE.VPMADDUBSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13137, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMADDUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13144, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMADDWD = new[] { - new itemplate(OCE.VPMADDWD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13123, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMADDWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13130, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXSB = new[] { - new itemplate(OCE.VPMAXSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13151, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13158, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXSD = new[] { - new itemplate(OCE.VPMAXSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13179, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13186, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXSW = new[] { - new itemplate(OCE.VPMAXSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13165, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13172, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXUB = new[] { - new itemplate(OCE.VPMAXUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13193, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXUB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13200, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXUD = new[] { - new itemplate(OCE.VPMAXUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13221, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXUD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13228, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMAXUW = new[] { - new itemplate(OCE.VPMAXUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13207, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMAXUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13214, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINSB = new[] { - new itemplate(OCE.VPMINSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13235, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13242, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINSD = new[] { - new itemplate(OCE.VPMINSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13263, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13270, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINSW = new[] { - new itemplate(OCE.VPMINSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13249, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13256, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINUB = new[] { - new itemplate(OCE.VPMINUB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13277, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINUB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13284, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINUD = new[] { - new itemplate(OCE.VPMINUD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13305, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINUD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13312, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMINUW = new[] { - new itemplate(OCE.VPMINUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13291, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMINUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13298, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMOVMSKB = new[] { - new itemplate(OCE.VPMOVMSKB, 2, new ulong[] {REG64,XMMREG,0,0,0} ,13319, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_LONG), - new itemplate(OCE.VPMOVMSKB, 2, new ulong[] {REG32,XMMREG,0,0,0} ,13319, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPMOVSXBD = new[] { - new itemplate(OCE.VPMOVSXBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13333, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VPMOVSXBQ = new[] { - new itemplate(OCE.VPMOVSXBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13340, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SW), - -}; - - static itemplate[] instrux_VPMOVSXBW = new[] { - new itemplate(OCE.VPMOVSXBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13326, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVSXDQ = new[] { - new itemplate(OCE.VPMOVSXDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13361, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVSXWD = new[] { - new itemplate(OCE.VPMOVSXWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13347, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVSXWQ = new[] { - new itemplate(OCE.VPMOVSXWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13354, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VPMOVZXBD = new[] { - new itemplate(OCE.VPMOVZXBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13375, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VPMOVZXBQ = new[] { - new itemplate(OCE.VPMOVZXBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13382, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SW), - -}; - - static itemplate[] instrux_VPMOVZXBW = new[] { - new itemplate(OCE.VPMOVZXBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13368, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVZXDQ = new[] { - new itemplate(OCE.VPMOVZXDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13403, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVZXWD = new[] { - new itemplate(OCE.VPMOVZXWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13389, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VPMOVZXWQ = new[] { - new itemplate(OCE.VPMOVZXWQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13396, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VPMULDQ = new[] { - new itemplate(OCE.VPMULDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13494, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13501, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULHRSW = new[] { - new itemplate(OCE.VPMULHRSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13424, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULHRSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13431, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULHUW = new[] { - new itemplate(OCE.VPMULHUW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13410, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULHUW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13417, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULHW = new[] { - new itemplate(OCE.VPMULHW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13438, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULHW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13445, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULLD = new[] { - new itemplate(OCE.VPMULLD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13466, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13473, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULLW = new[] { - new itemplate(OCE.VPMULLW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13452, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13459, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPMULUDQ = new[] { - new itemplate(OCE.VPMULUDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13480, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPMULUDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13487, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPOR = new[] { - new itemplate(OCE.VPOR, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13508, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPOR, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13515, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPPERM = new[] { - new itemplate(OCE.VPPERM, 4, new ulong[] {XMMREG,XMMREG,XMMREG,RM_XMM,0} ,6552, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPPERM, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,6561, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPPERM, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,XMMREG,0} ,6570, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPPERM, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,6579, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPROTB = new[] { - new itemplate(OCE.VPROTB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15321, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTB, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15328, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15335, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15342, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTB, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8404, OF.IF_AMD, OF.IF_SSE5), - new itemplate(OCE.VPROTB, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8412, OF.IF_AMD, OF.IF_SSE5), - -}; - - static itemplate[] instrux_VPROTD = new[] { - new itemplate(OCE.VPROTD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15349, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15356, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15363, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15370, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8420, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8428, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPROTQ = new[] { - new itemplate(OCE.VPROTQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15377, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15384, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15391, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15398, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTQ, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8436, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8444, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPROTW = new[] { - new itemplate(OCE.VPROTW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15405, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTW, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15412, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15419, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15426, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8452, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPROTW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8460, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSADBW = new[] { - new itemplate(OCE.VPSADBW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13522, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSADBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13529, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHAB = new[] { - new itemplate(OCE.VPSHAB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15433, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAB, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15440, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15447, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15454, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHAD = new[] { - new itemplate(OCE.VPSHAD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15461, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15468, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15475, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15482, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHAQ = new[] { - new itemplate(OCE.VPSHAQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15489, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15496, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15503, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15510, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHAW = new[] { - new itemplate(OCE.VPSHAW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15517, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAW, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15524, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15531, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHAW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15538, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHLB = new[] { - new itemplate(OCE.VPSHLB, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15545, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLB, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15552, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15559, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15566, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHLD = new[] { - new itemplate(OCE.VPSHLD, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15573, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLD, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15580, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15587, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15594, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHLQ = new[] { - new itemplate(OCE.VPSHLQ, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15601, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLQ, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15608, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15615, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15622, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHLW = new[] { - new itemplate(OCE.VPSHLW, 3, new ulong[] {XMMREG,RM_XMM,XMMREG,0,0} ,15629, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLW, 2, new ulong[] {XMMREG,XMMREG,0,0,0} ,15636, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,15643, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - new itemplate(OCE.VPSHLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,15650, OF.IF_AMD, OF.IF_SSE5, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHUFB = new[] { - new itemplate(OCE.VPSHUFB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13536, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSHUFB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13543, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHUFD = new[] { - new itemplate(OCE.VPSHUFD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7876, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHUFHW = new[] { - new itemplate(OCE.VPSHUFHW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7884, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSHUFLW = new[] { - new itemplate(OCE.VPSHUFLW, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,7892, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSIGNB = new[] { - new itemplate(OCE.VPSIGNB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13550, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSIGNB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13557, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSIGND = new[] { - new itemplate(OCE.VPSIGND, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13578, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSIGND, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13585, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSIGNW = new[] { - new itemplate(OCE.VPSIGNW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13564, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSIGNW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13571, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSLLD = new[] { - new itemplate(OCE.VPSLLD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13606, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13613, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLD, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7948, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSLLD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7956, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSLLDQ = new[] { - new itemplate(OCE.VPSLLDQ, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7900, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSLLDQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7908, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSLLQ = new[] { - new itemplate(OCE.VPSLLQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13620, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13627, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLQ, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7964, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSLLQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7972, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSLLW = new[] { - new itemplate(OCE.VPSLLW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13592, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13599, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSLLW, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7932, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSLLW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7940, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRAD = new[] { - new itemplate(OCE.VPSRAD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13648, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRAD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13655, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRAD, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7996, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRAD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8004, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRAW = new[] { - new itemplate(OCE.VPSRAW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13634, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRAW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13641, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRAW, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7980, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRAW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7988, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRLD = new[] { - new itemplate(OCE.VPSRLD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13676, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13683, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLD, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,8028, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRLD, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8036, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRLDQ = new[] { - new itemplate(OCE.VPSRLDQ, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,7916, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRLDQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,7924, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRLQ = new[] { - new itemplate(OCE.VPSRLQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13690, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13697, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLQ, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,8044, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRLQ, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8052, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSRLW = new[] { - new itemplate(OCE.VPSRLW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13662, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13669, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSRLW, 3, new ulong[] {XMMREG,XMMREG,IMMEDIATE,0,0} ,8012, OF.IF_AVX, OF.IF_SANDYBRIDGE), - new itemplate(OCE.VPSRLW, 2, new ulong[] {XMMREG,IMMEDIATE,0,0,0} ,8020, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VPSUBB = new[] { - new itemplate(OCE.VPSUBB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13718, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13725, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBD = new[] { - new itemplate(OCE.VPSUBD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13746, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13753, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBQ = new[] { - new itemplate(OCE.VPSUBQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13760, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13767, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBSB = new[] { - new itemplate(OCE.VPSUBSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13774, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13781, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBSW = new[] { - new itemplate(OCE.VPSUBSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13788, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13795, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBUSB = new[] { - new itemplate(OCE.VPSUBUSB, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13802, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBUSB, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13809, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBUSW = new[] { - new itemplate(OCE.VPSUBUSW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13816, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBUSW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13823, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPSUBW = new[] { - new itemplate(OCE.VPSUBW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13732, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPSUBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13739, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPTEST = new[] { - new itemplate(OCE.VPTEST, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13704, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPTEST, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,13711, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VPUNPCKHBW = new[] { - new itemplate(OCE.VPUNPCKHBW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13830, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKHBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13837, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKHDQ = new[] { - new itemplate(OCE.VPUNPCKHDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13858, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKHDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13865, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKHQDQ = new[] { - new itemplate(OCE.VPUNPCKHQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13872, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKHQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13879, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKHWD = new[] { - new itemplate(OCE.VPUNPCKHWD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13844, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKHWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13851, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKLBW = new[] { - new itemplate(OCE.VPUNPCKLBW, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13886, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKLBW, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13893, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKLDQ = new[] { - new itemplate(OCE.VPUNPCKLDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13914, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKLDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13921, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKLQDQ = new[] { - new itemplate(OCE.VPUNPCKLQDQ, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13928, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKLQDQ, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13935, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPUNPCKLWD = new[] { - new itemplate(OCE.VPUNPCKLWD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13900, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPUNPCKLWD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13907, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VPXOR = new[] { - new itemplate(OCE.VPXOR, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13942, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VPXOR, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13949, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - -}; - - static itemplate[] instrux_VRCPPS = new[] { - new itemplate(OCE.VRCPPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13956, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VRCPPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,13963, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VRCPSS = new[] { - new itemplate(OCE.VRCPSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13970, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VRCPSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13977, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VROUNDPD = new[] { - new itemplate(OCE.VROUNDPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8060, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VROUNDPD, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,8068, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VROUNDPS = new[] { - new itemplate(OCE.VROUNDPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8076, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VROUNDPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,8084, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VROUNDSD = new[] { - new itemplate(OCE.VROUNDSD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8092, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VROUNDSD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8100, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VROUNDSS = new[] { - new itemplate(OCE.VROUNDSS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8108, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VROUNDSS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8116, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VRSQRTPS = new[] { - new itemplate(OCE.VRSQRTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,13984, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VRSQRTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,13991, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VRSQRTSS = new[] { - new itemplate(OCE.VRSQRTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,13998, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VRSQRTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14005, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VSHUFPD = new[] { - new itemplate(OCE.VSHUFPD, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8124, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSHUFPD, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8132, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSHUFPD, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,8140, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VSHUFPD, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,8148, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSHUFPS = new[] { - new itemplate(OCE.VSHUFPS, 4, new ulong[] {XMMREG,XMMREG,RM_XMM,IMMEDIATE,0} ,8156, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSHUFPS, 3, new ulong[] {XMMREG,RM_XMM,IMMEDIATE,0,0} ,8164, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSHUFPS, 4, new ulong[] {YMMREG,YMMREG,RM_YMM,IMMEDIATE,0} ,8172, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VSHUFPS, 3, new ulong[] {YMMREG,RM_YMM,IMMEDIATE,0,0} ,8180, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSQRTPD = new[] { - new itemplate(OCE.VSQRTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14012, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSQRTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14019, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSQRTPS = new[] { - new itemplate(OCE.VSQRTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14026, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSQRTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14033, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSQRTSD = new[] { - new itemplate(OCE.VSQRTSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14040, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VSQRTSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14047, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VSQRTSS = new[] { - new itemplate(OCE.VSQRTSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14054, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VSQRTSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14061, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VSTMXCSR = new[] { - new itemplate(OCE.VSTMXCSR, 1, new ulong[] {MEMORY,0,0,0,0} ,14068, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VSUBPD = new[] { - new itemplate(OCE.VSUBPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14075, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSUBPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14082, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSUBPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14089, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VSUBPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14096, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSUBPS = new[] { - new itemplate(OCE.VSUBPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14103, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSUBPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14110, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VSUBPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14117, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VSUBPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14124, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VSUBSD = new[] { - new itemplate(OCE.VSUBSD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14131, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - new itemplate(OCE.VSUBSD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14138, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VSUBSS = new[] { - new itemplate(OCE.VSUBSS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14145, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - new itemplate(OCE.VSUBSS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14152, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VTESTPD = new[] { - new itemplate(OCE.VTESTPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14173, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VTESTPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14180, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VTESTPS = new[] { - new itemplate(OCE.VTESTPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14159, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VTESTPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14166, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VUCOMISD = new[] { - new itemplate(OCE.VUCOMISD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14187, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SQ), - -}; - - static itemplate[] instrux_VUCOMISS = new[] { - new itemplate(OCE.VUCOMISS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14194, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SD), - -}; - - static itemplate[] instrux_VUNPCKHPD = new[] { - new itemplate(OCE.VUNPCKHPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14201, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKHPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14208, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKHPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14215, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VUNPCKHPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14222, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VUNPCKHPS = new[] { - new itemplate(OCE.VUNPCKHPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14229, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKHPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14236, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKHPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14243, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VUNPCKHPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14250, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VUNPCKLPD = new[] { - new itemplate(OCE.VUNPCKLPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14257, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKLPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14264, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKLPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14271, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VUNPCKLPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14278, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VUNPCKLPS = new[] { - new itemplate(OCE.VUNPCKLPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14285, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKLPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14292, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VUNPCKLPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14299, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VUNPCKLPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14306, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VXORPD = new[] { - new itemplate(OCE.VXORPD, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14313, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VXORPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14320, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VXORPD, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14327, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VXORPD, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14334, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VXORPS = new[] { - new itemplate(OCE.VXORPS, 3, new ulong[] {XMMREG,XMMREG,RM_XMM,0,0} ,14341, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VXORPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,14348, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SO), - new itemplate(OCE.VXORPS, 3, new ulong[] {YMMREG,YMMREG,RM_YMM,0,0} ,14355, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - new itemplate(OCE.VXORPS, 2, new ulong[] {YMMREG,RM_YMM,0,0,0} ,14362, OF.IF_AVX, OF.IF_SANDYBRIDGE, OF.IF_SY), - -}; - - static itemplate[] instrux_VZEROALL = new[] { - new itemplate(OCE.VZEROALL, 0, new ulong[] {0,0,0,0,0} ,17973, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_VZEROUPPER = new[] { - new itemplate(OCE.VZEROUPPER, 0, new ulong[] {0,0,0,0,0} ,17979, OF.IF_AVX, OF.IF_SANDYBRIDGE), - -}; - - static itemplate[] instrux_WBINVD = new[] { - new itemplate(OCE.WBINVD, 0, new ulong[] {0,0,0,0,0} ,22039, OF.IF_486, OF.IF_PRIV), - -}; - - static itemplate[] instrux_WRMSR = new[] { - new itemplate(OCE.WRMSR, 0, new ulong[] {0,0,0,0,0} ,22043, OF.IF_PENT, OF.IF_PRIV), - -}; - - static itemplate[] instrux_WRSHR = new[] { - new itemplate(OCE.WRSHR, 1, new ulong[] {RM_GPR, BITS32,0,0,0,0} ,16809, OF.IF_P6, OF.IF_CYRIX, OF.IF_SMM), - -}; - - static itemplate[] instrux_XADD = new[] { - new itemplate(OCE.XADD, 2, new ulong[] {MEMORY,REG8,0,0,0} ,20882, OF.IF_486, OF.IF_SM), - new itemplate(OCE.XADD, 2, new ulong[] {REG8,REG8,0,0,0} ,20882, OF.IF_486), - new itemplate(OCE.XADD, 2, new ulong[] {MEMORY,REG16,0,0,0} ,16815, OF.IF_486, OF.IF_SM), - new itemplate(OCE.XADD, 2, new ulong[] {REG16,REG16,0,0,0} ,16815, OF.IF_486), - new itemplate(OCE.XADD, 2, new ulong[] {MEMORY,REG32,0,0,0} ,16821, OF.IF_486, OF.IF_SM), - new itemplate(OCE.XADD, 2, new ulong[] {REG32,REG32,0,0,0} ,16821, OF.IF_486), - new itemplate(OCE.XADD, 2, new ulong[] {MEMORY,REG64,0,0,0} ,16827, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XADD, 2, new ulong[] {REG64,REG64,0,0,0} ,16827, OF.IF_X64), - -}; - - static itemplate[] instrux_XBTS = new[] { - new itemplate(OCE.XBTS, 2, new ulong[] {REG16,MEMORY,0,0,0} ,16833, OF.IF_386, OF.IF_SW, OF.IF_UNDOC), - new itemplate(OCE.XBTS, 2, new ulong[] {REG16,REG16,0,0,0} ,16833, OF.IF_386, OF.IF_UNDOC), - new itemplate(OCE.XBTS, 2, new ulong[] {REG32,MEMORY,0,0,0} ,16839, OF.IF_386, OF.IF_SD, OF.IF_UNDOC), - new itemplate(OCE.XBTS, 2, new ulong[] {REG32,REG32,0,0,0} ,16839, OF.IF_386, OF.IF_UNDOC), - -}; - - static itemplate[] instrux_XCHG = new[] { - new itemplate(OCE.XCHG, 2, new ulong[] {REG_AX,REG16,0,0,0} ,22047, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {REG_EAX,REG32NA,0,0,0} ,22051, OF.IF_386), - new itemplate(OCE.XCHG, 2, new ulong[] {REG_RAX,REG64,0,0,0} ,22055, OF.IF_X64), - new itemplate(OCE.XCHG, 2, new ulong[] {REG16,REG_AX,0,0,0} ,22059, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {REG32NA,REG_EAX,0,0,0} ,22063, OF.IF_386), - new itemplate(OCE.XCHG, 2, new ulong[] {REG64,REG_RAX,0,0,0} ,22067, OF.IF_X64), - new itemplate(OCE.XCHG, 2, new ulong[] {REG_EAX,REG_EAX,0,0,0} ,22071, OF.IF_386, OF.IF_NOLONG), - new itemplate(OCE.XCHG, 2, new ulong[] {REG8,MEMORY,0,0,0} ,22075, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG8,REG8,0,0,0} ,22075, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20887, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG16,REG16,0,0,0} ,20887, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20892, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG32,REG32,0,0,0} ,20892, OF.IF_386), - new itemplate(OCE.XCHG, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20897, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG64,REG64,0,0,0} ,20897, OF.IF_X64), - new itemplate(OCE.XCHG, 2, new ulong[] {MEMORY,REG8,0,0,0} ,22079, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG8,REG8,0,0,0} ,22079, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20902, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG16,REG16,0,0,0} ,20902, OF.IF_8086), - new itemplate(OCE.XCHG, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20907, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG32,REG32,0,0,0} ,20907, OF.IF_386), - new itemplate(OCE.XCHG, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20912, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XCHG, 2, new ulong[] {REG64,REG64,0,0,0} ,20912, OF.IF_X64), - -}; - - static itemplate[] instrux_XCRYPTCBC = new[] { - new itemplate(OCE.XCRYPTCBC, 0, new ulong[] {0,0,0,0,0} ,17991, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XCRYPTCFB = new[] { - new itemplate(OCE.XCRYPTCFB, 0, new ulong[] {0,0,0,0,0} ,18003, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XCRYPTCTR = new[] { - new itemplate(OCE.XCRYPTCTR, 0, new ulong[] {0,0,0,0,0} ,17997, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XCRYPTECB = new[] { - new itemplate(OCE.XCRYPTECB, 0, new ulong[] {0,0,0,0,0} ,17985, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XCRYPTOFB = new[] { - new itemplate(OCE.XCRYPTOFB, 0, new ulong[] {0,0,0,0,0} ,18009, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XGETBV = new[] { - new itemplate(OCE.XGETBV, 0, new ulong[] {0,0,0,0,0} ,17127, OF.IF_NEHALEM), - -}; - - static itemplate[] instrux_XLAT = new[] { - new itemplate(OCE.XLAT, 0, new ulong[] {0,0,0,0,0} ,22158, OF.IF_8086), - -}; - - static itemplate[] instrux_XLATB = new[] { - new itemplate(OCE.XLATB, 0, new ulong[] {0,0,0,0,0} ,22158, OF.IF_8086), - -}; - - static itemplate[] instrux_XOR = new[] { - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,REG8,0,0,0} ,22083, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG8,REG8,0,0,0} ,22083, OF.IF_8086), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,REG16,0,0,0} ,20917, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG16,REG16,0,0,0} ,20917, OF.IF_8086), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,REG32,0,0,0} ,20922, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG32,REG32,0,0,0} ,20922, OF.IF_386), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,REG64,0,0,0} ,20927, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG64,REG64,0,0,0} ,20927, OF.IF_X64), - new itemplate(OCE.XOR, 2, new ulong[] {REG8,MEMORY,0,0,0} ,13385, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG8,REG8,0,0,0} ,13385, OF.IF_8086), - new itemplate(OCE.XOR, 2, new ulong[] {REG16,MEMORY,0,0,0} ,20932, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG16,REG16,0,0,0} ,20932, OF.IF_8086), - new itemplate(OCE.XOR, 2, new ulong[] {REG32,MEMORY,0,0,0} ,20937, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG32,REG32,0,0,0} ,20937, OF.IF_386), - new itemplate(OCE.XOR, 2, new ulong[] {REG64,MEMORY,0,0,0} ,20942, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG64,REG64,0,0,0} ,20942, OF.IF_X64), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE, BITS8,0,0,0} ,16845, OF.IF_8086), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE, BITS8,0,0,0} ,16851, OF.IF_386), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE, BITS8,0,0,0} ,16857, OF.IF_X64), - new itemplate(OCE.XOR, 2, new ulong[] {REG_AL,IMMEDIATE,0,0,0} ,22087, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_AX,SBYTE16,0,0,0} ,16845, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_AX,IMMEDIATE,0,0,0} ,20947, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_EAX,SBYTE32,0,0,0} ,16851, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_EAX,IMMEDIATE,0,0,0} ,20952, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_RAX,SBYTE64,0,0,0} ,16857, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {REG_RAX,IMMEDIATE,0,0,0} ,20957, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS8,IMMEDIATE,0,0,0} ,20962, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS16,IMMEDIATE,0,0,0} ,16863, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS32,IMMEDIATE,0,0,0} ,16869, OF.IF_386, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {RM_GPR, BITS64,IMMEDIATE,0,0,0} ,16875, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS8,0,0,0} ,20962, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS16,0,0,0} ,16863, OF.IF_8086, OF.IF_SM), - new itemplate(OCE.XOR, 2, new ulong[] {MEMORY,IMMEDIATE, BITS32,0,0,0} ,16869, OF.IF_386, OF.IF_SM), - -}; - - static itemplate[] instrux_XORPD = new[] { - new itemplate(OCE.XORPD, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17871, OF.IF_WILLAMETTE, OF.IF_SSE2, OF.IF_SO), - -}; - - static itemplate[] instrux_XORPS = new[] { - new itemplate(OCE.XORPS, 2, new ulong[] {XMMREG,RM_XMM,0,0,0} ,17121, OF.IF_KATMAI, OF.IF_SSE), - -}; - - static itemplate[] instrux_XRSTOR = new[] { - new itemplate(OCE.XRSTOR, 1, new ulong[] {MEMORY,0,0,0,0} ,17145, OF.IF_NEHALEM), - -}; - - static itemplate[] instrux_XSAVE = new[] { - new itemplate(OCE.XSAVE, 1, new ulong[] {MEMORY,0,0,0,0} ,17139, OF.IF_NEHALEM), - -}; - - static itemplate[] instrux_XSETBV = new[] { - new itemplate(OCE.XSETBV, 0, new ulong[] {0,0,0,0,0} ,17133, OF.IF_NEHALEM, OF.IF_PRIV), - -}; - - static itemplate[] instrux_XSHA1 = new[] { - new itemplate(OCE.XSHA1, 0, new ulong[] {0,0,0,0,0} ,18021, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XSHA256 = new[] { - new itemplate(OCE.XSHA256, 0, new ulong[] {0,0,0,0,0} ,18027, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_XSTORE = new[] { - new itemplate(OCE.XSTORE, 0, new ulong[] {0,0,0,0,0} ,21042, OF.IF_PENT, OF.IF_CYRIX), - -}; - - static itemplate[] instrux_CMOVcc = new[] { - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG16,MEMORY,0,0,0} ,9049, OF.IF_P6, OF.IF_SM), - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG16,REG16,0,0,0} ,9049, OF.IF_P6), - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG32,MEMORY,0,0,0} ,9056, OF.IF_P6, OF.IF_SM), - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG32,REG32,0,0,0} ,9056, OF.IF_P6), - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG64,MEMORY,0,0,0} ,9063, OF.IF_X64, OF.IF_SM), - new itemplate(OCE.CMOVcc, 2, new ulong[] {REG64,REG64,0,0,0} ,9063, OF.IF_X64), - -}; - - static itemplate[] instrux_Jcc = new[] { - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE, NEAR,0,0,0,0} ,9070, OF.IF_386), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE, BITS16, NEAR,0,0,0,0} ,9077, OF.IF_386), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE, BITS32, NEAR,0,0,0,0} ,9084, OF.IF_386), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE, SHORT,0,0,0,0} ,20968, OF.IF_8086), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20967, OF.IF_8086), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,9085, OF.IF_386), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,9091, OF.IF_8086), - new itemplate(OCE.Jcc, 1, new ulong[] {IMMEDIATE,0,0,0,0} ,20968, OF.IF_8086), - -}; - - static itemplate[] instrux_SETcc = new[] { - new itemplate(OCE.SETcc, 1, new ulong[] {MEMORY,0,0,0,0} ,16881, OF.IF_386, OF.IF_SB), - new itemplate(OCE.SETcc, 1, new ulong[] {REG8,0,0,0,0} ,16881, OF.IF_386), - -}; - - static List inions = new List() { - instrux_AAA, - instrux_AAD, - instrux_AAM, - instrux_AAS, - instrux_ADC, - instrux_ADD, - instrux_ADDPD, - instrux_ADDPS, - instrux_ADDSD, - instrux_ADDSS, - instrux_ADDSUBPD, - instrux_ADDSUBPS, - instrux_AESDEC, - instrux_AESDECLAST, - instrux_AESENC, - instrux_AESENCLAST, - instrux_AESIMC, - instrux_AESKEYGENASSIST, - instrux_AND, - instrux_ANDNPD, - instrux_ANDNPS, - instrux_ANDPD, - instrux_ANDPS, - instrux_ARPL, - instrux_BB0_RESET, - instrux_BB1_RESET, - instrux_BLENDPD, - instrux_BLENDPS, - instrux_BLENDVPD, - instrux_BLENDVPS, - instrux_BOUND, - instrux_BSF, - instrux_BSR, - instrux_BSWAP, - instrux_BT, - instrux_BTC, - instrux_BTR, - instrux_BTS, - instrux_CALL, - instrux_CBW, - instrux_CDQ, - instrux_CDQE, - instrux_CLC, - instrux_CLD, - instrux_CLFLUSH, - instrux_CLGI, - instrux_CLI, - instrux_CLTS, - instrux_CMC, - instrux_CMP, - instrux_CMPEQPD, - instrux_CMPEQPS, - instrux_CMPEQSD, - instrux_CMPEQSS, - instrux_CMPLEPD, - instrux_CMPLEPS, - instrux_CMPLESD, - instrux_CMPLESS, - instrux_CMPLTPD, - instrux_CMPLTPS, - instrux_CMPLTSD, - instrux_CMPLTSS, - instrux_CMPNEQPD, - instrux_CMPNEQPS, - instrux_CMPNEQSD, - instrux_CMPNEQSS, - instrux_CMPNLEPD, - instrux_CMPNLEPS, - instrux_CMPNLESD, - instrux_CMPNLESS, - instrux_CMPNLTPD, - instrux_CMPNLTPS, - instrux_CMPNLTSD, - instrux_CMPNLTSS, - instrux_CMPORDPD, - instrux_CMPORDPS, - instrux_CMPORDSD, - instrux_CMPORDSS, - instrux_CMPPD, - instrux_CMPPS, - instrux_CMPSB, - instrux_CMPSD, - instrux_CMPSQ, - instrux_CMPSS, - instrux_CMPSW, - instrux_CMPUNORDPD, - instrux_CMPUNORDPS, - instrux_CMPUNORDSD, - instrux_CMPUNORDSS, - instrux_CMPXCHG, - instrux_CMPXCHG16B, - instrux_CMPXCHG486, - instrux_CMPXCHG8B, - instrux_COMEQPD, - instrux_COMEQPS, - instrux_COMEQSD, - instrux_COMEQSS, - instrux_COMFALSEPD, - instrux_COMFALSEPS, - instrux_COMFALSESD, - instrux_COMFALSESS, - instrux_COMISD, - instrux_COMISS, - instrux_COMLEPD, - instrux_COMLEPS, - instrux_COMLESD, - instrux_COMLESS, - instrux_COMLTPD, - instrux_COMLTPS, - instrux_COMLTSD, - instrux_COMLTSS, - instrux_COMNEQPD, - instrux_COMNEQPS, - instrux_COMNEQSD, - instrux_COMNEQSS, - instrux_COMNLEPD, - instrux_COMNLEPS, - instrux_COMNLESD, - instrux_COMNLESS, - instrux_COMNLTPD, - instrux_COMNLTPS, - instrux_COMNLTSD, - instrux_COMNLTSS, - instrux_COMORDPD, - instrux_COMORDPS, - instrux_COMORDSD, - instrux_COMORDSS, - instrux_COMPD, - instrux_COMPS, - instrux_COMSD, - instrux_COMSS, - instrux_COMTRUEPD, - instrux_COMTRUEPS, - instrux_COMTRUESD, - instrux_COMTRUESS, - instrux_COMUEQPD, - instrux_COMUEQPS, - instrux_COMUEQSD, - instrux_COMUEQSS, - instrux_COMULEPD, - instrux_COMULEPS, - instrux_COMULESD, - instrux_COMULESS, - instrux_COMULTPD, - instrux_COMULTPS, - instrux_COMULTSD, - instrux_COMULTSS, - instrux_COMUNEQPD, - instrux_COMUNEQPS, - instrux_COMUNEQSD, - instrux_COMUNEQSS, - instrux_COMUNLEPD, - instrux_COMUNLEPS, - instrux_COMUNLESD, - instrux_COMUNLESS, - instrux_COMUNLTPD, - instrux_COMUNLTPS, - instrux_COMUNLTSD, - instrux_COMUNLTSS, - instrux_COMUNORDPD, - instrux_COMUNORDPS, - instrux_COMUNORDSD, - instrux_COMUNORDSS, - instrux_CPUID, - instrux_CPU_READ, - instrux_CPU_WRITE, - instrux_CQO, - instrux_CRC32, - instrux_CVTDQ2PD, - instrux_CVTDQ2PS, - instrux_CVTPD2DQ, - instrux_CVTPD2PI, - instrux_CVTPD2PS, - instrux_CVTPH2PS, - instrux_CVTPI2PD, - instrux_CVTPI2PS, - instrux_CVTPS2DQ, - instrux_CVTPS2PD, - instrux_CVTPS2PH, - instrux_CVTPS2PI, - instrux_CVTSD2SI, - instrux_CVTSD2SS, - instrux_CVTSI2SD, - instrux_CVTSI2SS, - instrux_CVTSS2SD, - instrux_CVTSS2SI, - instrux_CVTTPD2DQ, - instrux_CVTTPD2PI, - instrux_CVTTPS2DQ, - instrux_CVTTPS2PI, - instrux_CVTTSD2SI, - instrux_CVTTSS2SI, - instrux_CWD, - instrux_CWDE, - instrux_DAA, - instrux_DAS, - instrux_DB, - instrux_DD, - instrux_DEC, - instrux_DIV, - instrux_DIVPD, - instrux_DIVPS, - instrux_DIVSD, - instrux_DIVSS, - instrux_DMINT, - instrux_DO, - instrux_DPPD, - instrux_DPPS, - instrux_DQ, - instrux_DT, - instrux_DW, - instrux_DY, - instrux_EMMS, - instrux_ENTER, - instrux_EQU, - instrux_EXTRACTPS, - instrux_EXTRQ, - instrux_F2XM1, - instrux_FABS, - instrux_FADD, - instrux_FADDP, - instrux_FBLD, - instrux_FBSTP, - instrux_FCHS, - instrux_FCLEX, - instrux_FCMOVB, - instrux_FCMOVBE, - instrux_FCMOVE, - instrux_FCMOVNB, - instrux_FCMOVNBE, - instrux_FCMOVNE, - instrux_FCMOVNU, - instrux_FCMOVU, - instrux_FCOM, - instrux_FCOMI, - instrux_FCOMIP, - instrux_FCOMP, - instrux_FCOMPP, - instrux_FCOS, - instrux_FDECSTP, - instrux_FDISI, - instrux_FDIV, - instrux_FDIVP, - instrux_FDIVR, - instrux_FDIVRP, - instrux_FEMMS, - instrux_FENI, - instrux_FFREE, - instrux_FFREEP, - instrux_FIADD, - instrux_FICOM, - instrux_FICOMP, - instrux_FIDIV, - instrux_FIDIVR, - instrux_FILD, - instrux_FIMUL, - instrux_FINCSTP, - instrux_FINIT, - instrux_FIST, - instrux_FISTP, - instrux_FISTTP, - instrux_FISUB, - instrux_FISUBR, - instrux_FLD, - instrux_FLD1, - instrux_FLDCW, - instrux_FLDENV, - instrux_FLDL2E, - instrux_FLDL2T, - instrux_FLDLG2, - instrux_FLDLN2, - instrux_FLDPI, - instrux_FLDZ, - instrux_FMADDPD, - instrux_FMADDPS, - instrux_FMADDSD, - instrux_FMADDSS, - instrux_FMSUBPD, - instrux_FMSUBPS, - instrux_FMSUBSD, - instrux_FMSUBSS, - instrux_FMUL, - instrux_FMULP, - instrux_FNCLEX, - instrux_FNDISI, - instrux_FNENI, - instrux_FNINIT, - instrux_FNMADDPD, - instrux_FNMADDPS, - instrux_FNMADDSD, - instrux_FNMADDSS, - instrux_FNMSUBPD, - instrux_FNMSUBPS, - instrux_FNMSUBSD, - instrux_FNMSUBSS, - instrux_FNOP, - instrux_FNSAVE, - instrux_FNSTCW, - instrux_FNSTENV, - instrux_FNSTSW, - instrux_FPATAN, - instrux_FPREM, - instrux_FPREM1, - instrux_FPTAN, - instrux_FRCZPD, - instrux_FRCZPS, - instrux_FRCZSD, - instrux_FRCZSS, - instrux_FRNDINT, - instrux_FRSTOR, - instrux_FSAVE, - instrux_FSCALE, - instrux_FSETPM, - instrux_FSIN, - instrux_FSINCOS, - instrux_FSQRT, - instrux_FST, - instrux_FSTCW, - instrux_FSTENV, - instrux_FSTP, - instrux_FSTSW, - instrux_FSUB, - instrux_FSUBP, - instrux_FSUBR, - instrux_FSUBRP, - instrux_FTST, - instrux_FUCOM, - instrux_FUCOMI, - instrux_FUCOMIP, - instrux_FUCOMP, - instrux_FUCOMPP, - instrux_FWAIT, - instrux_FXAM, - instrux_FXCH, - instrux_FXRSTOR, - instrux_FXSAVE, - instrux_FXTRACT, - instrux_FYL2X, - instrux_FYL2XP1, - instrux_GETSEC, - instrux_HADDPD, - instrux_HADDPS, - instrux_HINT_NOP0, - instrux_HINT_NOP1, - instrux_HINT_NOP10, - instrux_HINT_NOP11, - instrux_HINT_NOP12, - instrux_HINT_NOP13, - instrux_HINT_NOP14, - instrux_HINT_NOP15, - instrux_HINT_NOP16, - instrux_HINT_NOP17, - instrux_HINT_NOP18, - instrux_HINT_NOP19, - instrux_HINT_NOP2, - instrux_HINT_NOP20, - instrux_HINT_NOP21, - instrux_HINT_NOP22, - instrux_HINT_NOP23, - instrux_HINT_NOP24, - instrux_HINT_NOP25, - instrux_HINT_NOP26, - instrux_HINT_NOP27, - instrux_HINT_NOP28, - instrux_HINT_NOP29, - instrux_HINT_NOP3, - instrux_HINT_NOP30, - instrux_HINT_NOP31, - instrux_HINT_NOP32, - instrux_HINT_NOP33, - instrux_HINT_NOP34, - instrux_HINT_NOP35, - instrux_HINT_NOP36, - instrux_HINT_NOP37, - instrux_HINT_NOP38, - instrux_HINT_NOP39, - instrux_HINT_NOP4, - instrux_HINT_NOP40, - instrux_HINT_NOP41, - instrux_HINT_NOP42, - instrux_HINT_NOP43, - instrux_HINT_NOP44, - instrux_HINT_NOP45, - instrux_HINT_NOP46, - instrux_HINT_NOP47, - instrux_HINT_NOP48, - instrux_HINT_NOP49, - instrux_HINT_NOP5, - instrux_HINT_NOP50, - instrux_HINT_NOP51, - instrux_HINT_NOP52, - instrux_HINT_NOP53, - instrux_HINT_NOP54, - instrux_HINT_NOP55, - instrux_HINT_NOP56, - instrux_HINT_NOP57, - instrux_HINT_NOP58, - instrux_HINT_NOP59, - instrux_HINT_NOP6, - instrux_HINT_NOP60, - instrux_HINT_NOP61, - instrux_HINT_NOP62, - instrux_HINT_NOP63, - instrux_HINT_NOP7, - instrux_HINT_NOP8, - instrux_HINT_NOP9, - instrux_HLT, - instrux_HSUBPD, - instrux_HSUBPS, - instrux_IBTS, - instrux_ICEBP, - instrux_IDIV, - instrux_IMUL, - instrux_IN, - instrux_INC, - instrux_INCBIN, - instrux_INSB, - instrux_INSD, - instrux_INSERTPS, - instrux_INSERTQ, - instrux_INSW, - instrux_INT, - instrux_INT01, - instrux_INT03, - instrux_INT1, - instrux_INT3, - instrux_INTO, - instrux_INVD, - instrux_INVEPT, - instrux_INVLPG, - instrux_INVLPGA, - instrux_INVVPID, - instrux_IRET, - instrux_IRETD, - instrux_IRETQ, - instrux_IRETW, - instrux_JCXZ, - instrux_JECXZ, - instrux_JMP, - instrux_JMPE, - instrux_JRCXZ, - instrux_LAHF, - instrux_LAR, - instrux_LDDQU, - instrux_LDMXCSR, - instrux_LDS, - instrux_LEA, - instrux_LEAVE, - instrux_LES, - instrux_LFENCE, - instrux_LFS, - instrux_LGDT, - instrux_LGS, - instrux_LIDT, - instrux_LLDT, - instrux_LMSW, - instrux_LOADALL, - instrux_LOADALL286, - instrux_LODSB, - instrux_LODSD, - instrux_LODSQ, - instrux_LODSW, - instrux_LOOP, - instrux_LOOPE, - instrux_LOOPNE, - instrux_LOOPNZ, - instrux_LOOPZ, - instrux_LSL, - instrux_LSS, - instrux_LTR, - instrux_LZCNT, - instrux_MASKMOVDQU, - instrux_MASKMOVQ, - instrux_MAXPD, - instrux_MAXPS, - instrux_MAXSD, - instrux_MAXSS, - instrux_MFENCE, - instrux_MINPD, - instrux_MINPS, - instrux_MINSD, - instrux_MINSS, - instrux_MONITOR, - instrux_MONTMUL, - instrux_MOV, - instrux_MOVAPD, - instrux_MOVAPS, - instrux_MOVBE, - instrux_MOVD, - instrux_MOVDDUP, - instrux_MOVDQ2Q, - instrux_MOVDQA, - instrux_MOVDQU, - instrux_MOVHLPS, - instrux_MOVHPD, - instrux_MOVHPS, - instrux_MOVLHPS, - instrux_MOVLPD, - instrux_MOVLPS, - instrux_MOVMSKPD, - instrux_MOVMSKPS, - instrux_MOVNTDQ, - instrux_MOVNTDQA, - instrux_MOVNTI, - instrux_MOVNTPD, - instrux_MOVNTPS, - instrux_MOVNTQ, - instrux_MOVNTSD, - instrux_MOVNTSS, - instrux_MOVQ, - instrux_MOVQ2DQ, - instrux_MOVSB, - instrux_MOVSD, - instrux_MOVSHDUP, - instrux_MOVSLDUP, - instrux_MOVSQ, - instrux_MOVSS, - instrux_MOVSW, - instrux_MOVSX, - instrux_MOVSXD, - instrux_MOVUPD, - instrux_MOVUPS, - instrux_MOVZX, - instrux_MPSADBW, - instrux_MUL, - instrux_MULPD, - instrux_MULPS, - instrux_MULSD, - instrux_MULSS, - instrux_MWAIT, - instrux_NEG, - instrux_NOP, - instrux_NOT, - instrux_OR, - instrux_ORPD, - instrux_ORPS, - instrux_OUT, - instrux_OUTSB, - instrux_OUTSD, - instrux_OUTSW, - instrux_PABSB, - instrux_PABSD, - instrux_PABSW, - instrux_PACKSSDW, - instrux_PACKSSWB, - instrux_PACKUSDW, - instrux_PACKUSWB, - instrux_PADDB, - instrux_PADDD, - instrux_PADDQ, - instrux_PADDSB, - instrux_PADDSIW, - instrux_PADDSW, - instrux_PADDUSB, - instrux_PADDUSW, - instrux_PADDW, - instrux_PALIGNR, - instrux_PAND, - instrux_PANDN, - instrux_PAUSE, - instrux_PAVEB, - instrux_PAVGB, - instrux_PAVGUSB, - instrux_PAVGW, - instrux_PBLENDVB, - instrux_PBLENDW, - instrux_PCLMULHQHQDQ, - instrux_PCLMULHQLQDQ, - instrux_PCLMULLQHQDQ, - instrux_PCLMULLQLQDQ, - instrux_PCLMULQDQ, - instrux_PCMOV, - instrux_PCMPEQB, - instrux_PCMPEQD, - instrux_PCMPEQQ, - instrux_PCMPEQW, - instrux_PCMPESTRI, - instrux_PCMPESTRM, - instrux_PCMPGTB, - instrux_PCMPGTD, - instrux_PCMPGTQ, - instrux_PCMPGTW, - instrux_PCMPISTRI, - instrux_PCMPISTRM, - instrux_PCOMB, - instrux_PCOMD, - instrux_PCOMEQB, - instrux_PCOMEQD, - instrux_PCOMEQQ, - instrux_PCOMEQUB, - instrux_PCOMEQUD, - instrux_PCOMEQUQ, - instrux_PCOMEQUW, - instrux_PCOMEQW, - instrux_PCOMFALSEB, - instrux_PCOMFALSED, - instrux_PCOMFALSEQ, - instrux_PCOMFALSEUB, - instrux_PCOMFALSEUD, - instrux_PCOMFALSEUQ, - instrux_PCOMFALSEUW, - instrux_PCOMFALSEW, - instrux_PCOMGEB, - instrux_PCOMGED, - instrux_PCOMGEQ, - instrux_PCOMGEUB, - instrux_PCOMGEUD, - instrux_PCOMGEUQ, - instrux_PCOMGEUW, - instrux_PCOMGEW, - instrux_PCOMGTB, - instrux_PCOMGTD, - instrux_PCOMGTQ, - instrux_PCOMGTUB, - instrux_PCOMGTUD, - instrux_PCOMGTUQ, - instrux_PCOMGTUW, - instrux_PCOMGTW, - instrux_PCOMLEB, - instrux_PCOMLED, - instrux_PCOMLEQ, - instrux_PCOMLEUB, - instrux_PCOMLEUD, - instrux_PCOMLEUQ, - instrux_PCOMLEUW, - instrux_PCOMLEW, - instrux_PCOMLTB, - instrux_PCOMLTD, - instrux_PCOMLTQ, - instrux_PCOMLTUB, - instrux_PCOMLTUD, - instrux_PCOMLTUQ, - instrux_PCOMLTUW, - instrux_PCOMLTW, - instrux_PCOMNEQB, - instrux_PCOMNEQD, - instrux_PCOMNEQQ, - instrux_PCOMNEQUB, - instrux_PCOMNEQUD, - instrux_PCOMNEQUQ, - instrux_PCOMNEQUW, - instrux_PCOMNEQW, - instrux_PCOMQ, - instrux_PCOMTRUEB, - instrux_PCOMTRUED, - instrux_PCOMTRUEQ, - instrux_PCOMTRUEUB, - instrux_PCOMTRUEUD, - instrux_PCOMTRUEUQ, - instrux_PCOMTRUEUW, - instrux_PCOMTRUEW, - instrux_PCOMUB, - instrux_PCOMUD, - instrux_PCOMUQ, - instrux_PCOMUW, - instrux_PCOMW, - instrux_PDISTIB, - instrux_PERMPD, - instrux_PERMPS, - instrux_PEXTRB, - instrux_PEXTRD, - instrux_PEXTRQ, - instrux_PEXTRW, - instrux_PF2ID, - instrux_PF2IW, - instrux_PFACC, - instrux_PFADD, - instrux_PFCMPEQ, - instrux_PFCMPGE, - instrux_PFCMPGT, - instrux_PFMAX, - instrux_PFMIN, - instrux_PFMUL, - instrux_PFNACC, - instrux_PFPNACC, - instrux_PFRCP, - instrux_PFRCPIT1, - instrux_PFRCPIT2, - instrux_PFRCPV, - instrux_PFRSQIT1, - instrux_PFRSQRT, - instrux_PFRSQRTV, - instrux_PFSUB, - instrux_PFSUBR, - instrux_PHADDBD, - instrux_PHADDBQ, - instrux_PHADDBW, - instrux_PHADDD, - instrux_PHADDDQ, - instrux_PHADDSW, - instrux_PHADDUBD, - instrux_PHADDUBQ, - instrux_PHADDUBW, - instrux_PHADDUDQ, - instrux_PHADDUWD, - instrux_PHADDUWQ, - instrux_PHADDW, - instrux_PHADDWD, - instrux_PHADDWQ, - instrux_PHMINPOSUW, - instrux_PHSUBBW, - instrux_PHSUBD, - instrux_PHSUBDQ, - instrux_PHSUBSW, - instrux_PHSUBW, - instrux_PHSUBWD, - instrux_PI2FD, - instrux_PI2FW, - instrux_PINSRB, - instrux_PINSRD, - instrux_PINSRQ, - instrux_PINSRW, - instrux_PMACHRIW, - instrux_PMACSDD, - instrux_PMACSDQH, - instrux_PMACSDQL, - instrux_PMACSSDD, - instrux_PMACSSDQH, - instrux_PMACSSDQL, - instrux_PMACSSWD, - instrux_PMACSSWW, - instrux_PMACSWD, - instrux_PMACSWW, - instrux_PMADCSSWD, - instrux_PMADCSWD, - instrux_PMADDUBSW, - instrux_PMADDWD, - instrux_PMAGW, - instrux_PMAXSB, - instrux_PMAXSD, - instrux_PMAXSW, - instrux_PMAXUB, - instrux_PMAXUD, - instrux_PMAXUW, - instrux_PMINSB, - instrux_PMINSD, - instrux_PMINSW, - instrux_PMINUB, - instrux_PMINUD, - instrux_PMINUW, - instrux_PMOVMSKB, - instrux_PMOVSXBD, - instrux_PMOVSXBQ, - instrux_PMOVSXBW, - instrux_PMOVSXDQ, - instrux_PMOVSXWD, - instrux_PMOVSXWQ, - instrux_PMOVZXBD, - instrux_PMOVZXBQ, - instrux_PMOVZXBW, - instrux_PMOVZXDQ, - instrux_PMOVZXWD, - instrux_PMOVZXWQ, - instrux_PMULDQ, - instrux_PMULHRIW, - instrux_PMULHRSW, - instrux_PMULHRWA, - instrux_PMULHRWC, - instrux_PMULHUW, - instrux_PMULHW, - instrux_PMULLD, - instrux_PMULLW, - instrux_PMULUDQ, - instrux_PMVGEZB, - instrux_PMVLZB, - instrux_PMVNZB, - instrux_PMVZB, - instrux_POP, - instrux_POPA, - instrux_POPAD, - instrux_POPAW, - instrux_POPCNT, - instrux_POPF, - instrux_POPFD, - instrux_POPFQ, - instrux_POPFW, - instrux_POR, - instrux_PPERM, - instrux_PREFETCH, - instrux_PREFETCHNTA, - instrux_PREFETCHT0, - instrux_PREFETCHT1, - instrux_PREFETCHT2, - instrux_PREFETCHW, - instrux_PROTB, - instrux_PROTD, - instrux_PROTQ, - instrux_PROTW, - instrux_PSADBW, - instrux_PSHAB, - instrux_PSHAD, - instrux_PSHAQ, - instrux_PSHAW, - instrux_PSHLB, - instrux_PSHLD, - instrux_PSHLQ, - instrux_PSHLW, - instrux_PSHUFB, - instrux_PSHUFD, - instrux_PSHUFHW, - instrux_PSHUFLW, - instrux_PSHUFW, - instrux_PSIGNB, - instrux_PSIGND, - instrux_PSIGNW, - instrux_PSLLD, - instrux_PSLLDQ, - instrux_PSLLQ, - instrux_PSLLW, - instrux_PSRAD, - instrux_PSRAW, - instrux_PSRLD, - instrux_PSRLDQ, - instrux_PSRLQ, - instrux_PSRLW, - instrux_PSUBB, - instrux_PSUBD, - instrux_PSUBQ, - instrux_PSUBSB, - instrux_PSUBSIW, - instrux_PSUBSW, - instrux_PSUBUSB, - instrux_PSUBUSW, - instrux_PSUBW, - instrux_PSWAPD, - instrux_PTEST, - instrux_PUNPCKHBW, - instrux_PUNPCKHDQ, - instrux_PUNPCKHQDQ, - instrux_PUNPCKHWD, - instrux_PUNPCKLBW, - instrux_PUNPCKLDQ, - instrux_PUNPCKLQDQ, - instrux_PUNPCKLWD, - instrux_PUSH, - instrux_PUSHA, - instrux_PUSHAD, - instrux_PUSHAW, - instrux_PUSHF, - instrux_PUSHFD, - instrux_PUSHFQ, - instrux_PUSHFW, - instrux_PXOR, - instrux_RCL, - instrux_RCPPS, - instrux_RCPSS, - instrux_RCR, - instrux_RDM, - instrux_RDMSR, - instrux_RDPMC, - instrux_RDSHR, - instrux_RDTSC, - instrux_RDTSCP, - instrux_RESB, - instrux_RESD, - instrux_RESO, - instrux_RESQ, - instrux_REST, - instrux_RESW, - instrux_RESY, - instrux_RET, - instrux_RETF, - instrux_RETN, - instrux_ROL, - instrux_ROR, - instrux_ROUNDPD, - instrux_ROUNDPS, - instrux_ROUNDSD, - instrux_ROUNDSS, - instrux_RSDC, - instrux_RSLDT, - instrux_RSM, - instrux_RSQRTPS, - instrux_RSQRTSS, - instrux_RSTS, - instrux_SAHF, - instrux_SAL, - instrux_SALC, - instrux_SAR, - instrux_SBB, - instrux_SCASB, - instrux_SCASD, - instrux_SCASQ, - instrux_SCASW, - instrux_SFENCE, - instrux_SGDT, - instrux_SHL, - instrux_SHLD, - instrux_SHR, - instrux_SHRD, - instrux_SHUFPD, - instrux_SHUFPS, - instrux_SIDT, - instrux_SKINIT, - instrux_SLDT, - instrux_SMI, - instrux_SMINT, - instrux_SMINTOLD, - instrux_SMSW, - instrux_SQRTPD, - instrux_SQRTPS, - instrux_SQRTSD, - instrux_SQRTSS, - instrux_STC, - instrux_STD, - instrux_STGI, - instrux_STI, - instrux_STMXCSR, - instrux_STOSB, - instrux_STOSD, - instrux_STOSQ, - instrux_STOSW, - instrux_STR, - instrux_SUB, - instrux_SUBPD, - instrux_SUBPS, - instrux_SUBSD, - instrux_SUBSS, - instrux_SVDC, - instrux_SVLDT, - instrux_SVTS, - instrux_SWAPGS, - instrux_SYSCALL, - instrux_SYSENTER, - instrux_SYSEXIT, - instrux_SYSRET, - instrux_TEST, - instrux_UCOMISD, - instrux_UCOMISS, - instrux_UD0, - instrux_UD1, - instrux_UD2, - instrux_UD2A, - instrux_UD2B, - instrux_UMOV, - instrux_UNPCKHPD, - instrux_UNPCKHPS, - instrux_UNPCKLPD, - instrux_UNPCKLPS, - instrux_VADDPD, - instrux_VADDPS, - instrux_VADDSD, - instrux_VADDSS, - instrux_VADDSUBPD, - instrux_VADDSUBPS, - instrux_VAESDEC, - instrux_VAESDECLAST, - instrux_VAESENC, - instrux_VAESENCLAST, - instrux_VAESIMC, - instrux_VAESKEYGENASSIST, - instrux_VANDNPD, - instrux_VANDNPS, - instrux_VANDPD, - instrux_VANDPS, - instrux_VBLENDPD, - instrux_VBLENDPS, - instrux_VBLENDVPD, - instrux_VBLENDVPS, - instrux_VBROADCASTF128, - instrux_VBROADCASTSD, - instrux_VBROADCASTSS, - instrux_VCMPEQPD, - instrux_VCMPEQPS, - instrux_VCMPEQSD, - instrux_VCMPEQSS, - instrux_VCMPEQ_OSPD, - instrux_VCMPEQ_OSPS, - instrux_VCMPEQ_OSSD, - instrux_VCMPEQ_OSSS, - instrux_VCMPEQ_UQPD, - instrux_VCMPEQ_UQPS, - instrux_VCMPEQ_UQSD, - instrux_VCMPEQ_UQSS, - instrux_VCMPEQ_USPD, - instrux_VCMPEQ_USPS, - instrux_VCMPEQ_USSD, - instrux_VCMPEQ_USSS, - instrux_VCMPFALSEPD, - instrux_VCMPFALSEPS, - instrux_VCMPFALSESD, - instrux_VCMPFALSESS, - instrux_VCMPFALSE_OSPD, - instrux_VCMPFALSE_OSPS, - instrux_VCMPFALSE_OSSD, - instrux_VCMPFALSE_OSSS, - instrux_VCMPGEPD, - instrux_VCMPGEPS, - instrux_VCMPGESD, - instrux_VCMPGESS, - instrux_VCMPGE_OQPD, - instrux_VCMPGE_OQPS, - instrux_VCMPGE_OQSD, - instrux_VCMPGE_OQSS, - instrux_VCMPGTPD, - instrux_VCMPGTPS, - instrux_VCMPGTSD, - instrux_VCMPGTSS, - instrux_VCMPGT_OQPD, - instrux_VCMPGT_OQPS, - instrux_VCMPGT_OQSD, - instrux_VCMPGT_OQSS, - instrux_VCMPLEPD, - instrux_VCMPLEPS, - instrux_VCMPLESD, - instrux_VCMPLESS, - instrux_VCMPLE_OQPD, - instrux_VCMPLE_OQPS, - instrux_VCMPLE_OQSD, - instrux_VCMPLE_OQSS, - instrux_VCMPLTPD, - instrux_VCMPLTPS, - instrux_VCMPLTSD, - instrux_VCMPLTSS, - instrux_VCMPLT_OQPD, - instrux_VCMPLT_OQPS, - instrux_VCMPLT_OQSD, - instrux_VCMPLT_OQSS, - instrux_VCMPNEQPD, - instrux_VCMPNEQPS, - instrux_VCMPNEQSD, - instrux_VCMPNEQSS, - instrux_VCMPNEQ_OQPD, - instrux_VCMPNEQ_OQPS, - instrux_VCMPNEQ_OQSD, - instrux_VCMPNEQ_OQSS, - instrux_VCMPNEQ_OSPD, - instrux_VCMPNEQ_OSPS, - instrux_VCMPNEQ_OSSD, - instrux_VCMPNEQ_OSSS, - instrux_VCMPNEQ_USPD, - instrux_VCMPNEQ_USPS, - instrux_VCMPNEQ_USSD, - instrux_VCMPNEQ_USSS, - instrux_VCMPNGEPD, - instrux_VCMPNGEPS, - instrux_VCMPNGESD, - instrux_VCMPNGESS, - instrux_VCMPNGE_UQPD, - instrux_VCMPNGE_UQPS, - instrux_VCMPNGE_UQSD, - instrux_VCMPNGE_UQSS, - instrux_VCMPNGTPD, - instrux_VCMPNGTPS, - instrux_VCMPNGTSD, - instrux_VCMPNGTSS, - instrux_VCMPNGT_UQPD, - instrux_VCMPNGT_UQPS, - instrux_VCMPNGT_UQSD, - instrux_VCMPNGT_UQSS, - instrux_VCMPNLEPD, - instrux_VCMPNLEPS, - instrux_VCMPNLESD, - instrux_VCMPNLESS, - instrux_VCMPNLE_UQPD, - instrux_VCMPNLE_UQPS, - instrux_VCMPNLE_UQSD, - instrux_VCMPNLE_UQSS, - instrux_VCMPNLTPD, - instrux_VCMPNLTPS, - instrux_VCMPNLTSD, - instrux_VCMPNLTSS, - instrux_VCMPNLT_UQPD, - instrux_VCMPNLT_UQPS, - instrux_VCMPNLT_UQSD, - instrux_VCMPNLT_UQSS, - instrux_VCMPORDPD, - instrux_VCMPORDPS, - instrux_VCMPORDSD, - instrux_VCMPORDSS, - instrux_VCMPORD_SPD, - instrux_VCMPORD_SPS, - instrux_VCMPORD_SSD, - instrux_VCMPORD_SSS, - instrux_VCMPPD, - instrux_VCMPPS, - instrux_VCMPSD, - instrux_VCMPSS, - instrux_VCMPTRUEPD, - instrux_VCMPTRUEPS, - instrux_VCMPTRUESD, - instrux_VCMPTRUESS, - instrux_VCMPTRUE_USPD, - instrux_VCMPTRUE_USPS, - instrux_VCMPTRUE_USSD, - instrux_VCMPTRUE_USSS, - instrux_VCMPUNORDPD, - instrux_VCMPUNORDPS, - instrux_VCMPUNORDSD, - instrux_VCMPUNORDSS, - instrux_VCMPUNORD_SPD, - instrux_VCMPUNORD_SPS, - instrux_VCMPUNORD_SSD, - instrux_VCMPUNORD_SSS, - instrux_VCOMISD, - instrux_VCOMISS, - instrux_VCVTDQ2PD, - instrux_VCVTDQ2PS, - instrux_VCVTPD2DQ, - instrux_VCVTPD2PS, - instrux_VCVTPH2PS, - instrux_VCVTPS2DQ, - instrux_VCVTPS2PD, - instrux_VCVTPS2PH, - instrux_VCVTSD2SI, - instrux_VCVTSD2SS, - instrux_VCVTSI2SD, - instrux_VCVTSI2SS, - instrux_VCVTSS2SD, - instrux_VCVTSS2SI, - instrux_VCVTTPD2DQ, - instrux_VCVTTPS2DQ, - instrux_VCVTTSD2SI, - instrux_VCVTTSS2SI, - instrux_VDIVPD, - instrux_VDIVPS, - instrux_VDIVSD, - instrux_VDIVSS, - instrux_VDPPD, - instrux_VDPPS, - instrux_VERR, - instrux_VERW, - instrux_VEXTRACTF128, - instrux_VEXTRACTPS, - instrux_VFMADD123PD, - instrux_VFMADD123PS, - instrux_VFMADD123SD, - instrux_VFMADD123SS, - instrux_VFMADD132PD, - instrux_VFMADD132PS, - instrux_VFMADD132SD, - instrux_VFMADD132SS, - instrux_VFMADD213PD, - instrux_VFMADD213PS, - instrux_VFMADD213SD, - instrux_VFMADD213SS, - instrux_VFMADD231PD, - instrux_VFMADD231PS, - instrux_VFMADD231SD, - instrux_VFMADD231SS, - instrux_VFMADD312PD, - instrux_VFMADD312PS, - instrux_VFMADD312SD, - instrux_VFMADD312SS, - instrux_VFMADD321PD, - instrux_VFMADD321PS, - instrux_VFMADD321SD, - instrux_VFMADD321SS, - instrux_VFMADDPD, - instrux_VFMADDPS, - instrux_VFMADDSD, - instrux_VFMADDSS, - instrux_VFMADDSUB123PD, - instrux_VFMADDSUB123PS, - instrux_VFMADDSUB132PD, - instrux_VFMADDSUB132PS, - instrux_VFMADDSUB213PD, - instrux_VFMADDSUB213PS, - instrux_VFMADDSUB231PD, - instrux_VFMADDSUB231PS, - instrux_VFMADDSUB312PD, - instrux_VFMADDSUB312PS, - instrux_VFMADDSUB321PD, - instrux_VFMADDSUB321PS, - instrux_VFMADDSUBPD, - instrux_VFMADDSUBPS, - instrux_VFMSUB123PD, - instrux_VFMSUB123PS, - instrux_VFMSUB123SD, - instrux_VFMSUB123SS, - instrux_VFMSUB132PD, - instrux_VFMSUB132PS, - instrux_VFMSUB132SD, - instrux_VFMSUB132SS, - instrux_VFMSUB213PD, - instrux_VFMSUB213PS, - instrux_VFMSUB213SD, - instrux_VFMSUB213SS, - instrux_VFMSUB231PD, - instrux_VFMSUB231PS, - instrux_VFMSUB231SD, - instrux_VFMSUB231SS, - instrux_VFMSUB312PD, - instrux_VFMSUB312PS, - instrux_VFMSUB312SD, - instrux_VFMSUB312SS, - instrux_VFMSUB321PD, - instrux_VFMSUB321PS, - instrux_VFMSUB321SD, - instrux_VFMSUB321SS, - instrux_VFMSUBADD123PD, - instrux_VFMSUBADD123PS, - instrux_VFMSUBADD132PD, - instrux_VFMSUBADD132PS, - instrux_VFMSUBADD213PD, - instrux_VFMSUBADD213PS, - instrux_VFMSUBADD231PD, - instrux_VFMSUBADD231PS, - instrux_VFMSUBADD312PD, - instrux_VFMSUBADD312PS, - instrux_VFMSUBADD321PD, - instrux_VFMSUBADD321PS, - instrux_VFMSUBADDPD, - instrux_VFMSUBADDPS, - instrux_VFMSUBPD, - instrux_VFMSUBPS, - instrux_VFMSUBSD, - instrux_VFMSUBSS, - instrux_VFNMADD123PD, - instrux_VFNMADD123PS, - instrux_VFNMADD123SD, - instrux_VFNMADD123SS, - instrux_VFNMADD132PD, - instrux_VFNMADD132PS, - instrux_VFNMADD132SD, - instrux_VFNMADD132SS, - instrux_VFNMADD213PD, - instrux_VFNMADD213PS, - instrux_VFNMADD213SD, - instrux_VFNMADD213SS, - instrux_VFNMADD231PD, - instrux_VFNMADD231PS, - instrux_VFNMADD231SD, - instrux_VFNMADD231SS, - instrux_VFNMADD312PD, - instrux_VFNMADD312PS, - instrux_VFNMADD312SD, - instrux_VFNMADD312SS, - instrux_VFNMADD321PD, - instrux_VFNMADD321PS, - instrux_VFNMADD321SD, - instrux_VFNMADD321SS, - instrux_VFNMADDPD, - instrux_VFNMADDPS, - instrux_VFNMADDSD, - instrux_VFNMADDSS, - instrux_VFNMSUB123PD, - instrux_VFNMSUB123PS, - instrux_VFNMSUB123SD, - instrux_VFNMSUB123SS, - instrux_VFNMSUB132PD, - instrux_VFNMSUB132PS, - instrux_VFNMSUB132SD, - instrux_VFNMSUB132SS, - instrux_VFNMSUB213PD, - instrux_VFNMSUB213PS, - instrux_VFNMSUB213SD, - instrux_VFNMSUB213SS, - instrux_VFNMSUB231PD, - instrux_VFNMSUB231PS, - instrux_VFNMSUB231SD, - instrux_VFNMSUB231SS, - instrux_VFNMSUB312PD, - instrux_VFNMSUB312PS, - instrux_VFNMSUB312SD, - instrux_VFNMSUB312SS, - instrux_VFNMSUB321PD, - instrux_VFNMSUB321PS, - instrux_VFNMSUB321SD, - instrux_VFNMSUB321SS, - instrux_VFNMSUBPD, - instrux_VFNMSUBPS, - instrux_VFNMSUBSD, - instrux_VFNMSUBSS, - instrux_VFRCZPD, - instrux_VFRCZPS, - instrux_VFRCZSD, - instrux_VFRCZSS, - instrux_VHADDPD, - instrux_VHADDPS, - instrux_VHSUBPD, - instrux_VHSUBPS, - instrux_VINSERTF128, - instrux_VINSERTPS, - instrux_VLDDQU, - instrux_VLDMXCSR, - instrux_VLDQQU, - instrux_VMASKMOVDQU, - instrux_VMASKMOVPD, - instrux_VMASKMOVPS, - instrux_VMAXPD, - instrux_VMAXPS, - instrux_VMAXSD, - instrux_VMAXSS, - instrux_VMCALL, - instrux_VMCLEAR, - instrux_VMINPD, - instrux_VMINPS, - instrux_VMINSD, - instrux_VMINSS, - instrux_VMLAUNCH, - instrux_VMLOAD, - instrux_VMMCALL, - instrux_VMOVAPD, - instrux_VMOVAPS, - instrux_VMOVD, - instrux_VMOVDDUP, - instrux_VMOVDQA, - instrux_VMOVDQU, - instrux_VMOVHLPS, - instrux_VMOVHPD, - instrux_VMOVHPS, - instrux_VMOVLHPS, - instrux_VMOVLPD, - instrux_VMOVLPS, - instrux_VMOVMSKPD, - instrux_VMOVMSKPS, - instrux_VMOVNTDQ, - instrux_VMOVNTDQA, - instrux_VMOVNTPD, - instrux_VMOVNTPS, - instrux_VMOVNTQQ, - instrux_VMOVQ, - instrux_VMOVQQA, - instrux_VMOVQQU, - instrux_VMOVSD, - instrux_VMOVSHDUP, - instrux_VMOVSLDUP, - instrux_VMOVSS, - instrux_VMOVUPD, - instrux_VMOVUPS, - instrux_VMPSADBW, - instrux_VMPTRLD, - instrux_VMPTRST, - instrux_VMREAD, - instrux_VMRESUME, - instrux_VMRUN, - instrux_VMSAVE, - instrux_VMULPD, - instrux_VMULPS, - instrux_VMULSD, - instrux_VMULSS, - instrux_VMWRITE, - instrux_VMXOFF, - instrux_VMXON, - instrux_VORPD, - instrux_VORPS, - instrux_VPABSB, - instrux_VPABSD, - instrux_VPABSW, - instrux_VPACKSSDW, - instrux_VPACKSSWB, - instrux_VPACKUSDW, - instrux_VPACKUSWB, - instrux_VPADDB, - instrux_VPADDD, - instrux_VPADDQ, - instrux_VPADDSB, - instrux_VPADDSW, - instrux_VPADDUSB, - instrux_VPADDUSW, - instrux_VPADDW, - instrux_VPALIGNR, - instrux_VPAND, - instrux_VPANDN, - instrux_VPAVGB, - instrux_VPAVGW, - instrux_VPBLENDVB, - instrux_VPBLENDW, - instrux_VPCLMULHQHQDQ, - instrux_VPCLMULHQLQDQ, - instrux_VPCLMULLQHQDQ, - instrux_VPCLMULLQLQDQ, - instrux_VPCLMULQDQ, - instrux_VPCMOV, - instrux_VPCMPEQB, - instrux_VPCMPEQD, - instrux_VPCMPEQQ, - instrux_VPCMPEQW, - instrux_VPCMPESTRI, - instrux_VPCMPESTRM, - instrux_VPCMPGTB, - instrux_VPCMPGTD, - instrux_VPCMPGTQ, - instrux_VPCMPGTW, - instrux_VPCMPISTRI, - instrux_VPCMPISTRM, - instrux_VPCOMB, - instrux_VPCOMD, - instrux_VPCOMQ, - instrux_VPCOMUB, - instrux_VPCOMUD, - instrux_VPCOMUQ, - instrux_VPCOMUW, - instrux_VPCOMW, - instrux_VPERM2F128, - instrux_VPERMIL2PD, - instrux_VPERMIL2PS, - instrux_VPERMILMO2PD, - instrux_VPERMILMO2PS, - instrux_VPERMILMZ2PD, - instrux_VPERMILMZ2PS, - instrux_VPERMILPD, - instrux_VPERMILPS, - instrux_VPERMILTD2PD, - instrux_VPERMILTD2PS, - instrux_VPEXTRB, - instrux_VPEXTRD, - instrux_VPEXTRQ, - instrux_VPEXTRW, - instrux_VPHADDBD, - instrux_VPHADDBQ, - instrux_VPHADDBW, - instrux_VPHADDD, - instrux_VPHADDDQ, - instrux_VPHADDSW, - instrux_VPHADDUBD, - instrux_VPHADDUBQ, - instrux_VPHADDUBWD, - instrux_VPHADDUDQ, - instrux_VPHADDUWD, - instrux_VPHADDUWQ, - instrux_VPHADDW, - instrux_VPHADDWD, - instrux_VPHADDWQ, - instrux_VPHMINPOSUW, - instrux_VPHSUBBW, - instrux_VPHSUBD, - instrux_VPHSUBDQ, - instrux_VPHSUBSW, - instrux_VPHSUBW, - instrux_VPHSUBWD, - instrux_VPINSRB, - instrux_VPINSRD, - instrux_VPINSRQ, - instrux_VPINSRW, - instrux_VPMACSDD, - instrux_VPMACSDQH, - instrux_VPMACSDQL, - instrux_VPMACSSDD, - instrux_VPMACSSDQH, - instrux_VPMACSSDQL, - instrux_VPMACSSWD, - instrux_VPMACSSWW, - instrux_VPMACSWD, - instrux_VPMACSWW, - instrux_VPMADCSSWD, - instrux_VPMADCSWD, - instrux_VPMADDUBSW, - instrux_VPMADDWD, - instrux_VPMAXSB, - instrux_VPMAXSD, - instrux_VPMAXSW, - instrux_VPMAXUB, - instrux_VPMAXUD, - instrux_VPMAXUW, - instrux_VPMINSB, - instrux_VPMINSD, - instrux_VPMINSW, - instrux_VPMINUB, - instrux_VPMINUD, - instrux_VPMINUW, - instrux_VPMOVMSKB, - instrux_VPMOVSXBD, - instrux_VPMOVSXBQ, - instrux_VPMOVSXBW, - instrux_VPMOVSXDQ, - instrux_VPMOVSXWD, - instrux_VPMOVSXWQ, - instrux_VPMOVZXBD, - instrux_VPMOVZXBQ, - instrux_VPMOVZXBW, - instrux_VPMOVZXDQ, - instrux_VPMOVZXWD, - instrux_VPMOVZXWQ, - instrux_VPMULDQ, - instrux_VPMULHRSW, - instrux_VPMULHUW, - instrux_VPMULHW, - instrux_VPMULLD, - instrux_VPMULLW, - instrux_VPMULUDQ, - instrux_VPOR, - instrux_VPPERM, - instrux_VPROTB, - instrux_VPROTD, - instrux_VPROTQ, - instrux_VPROTW, - instrux_VPSADBW, - instrux_VPSHAB, - instrux_VPSHAD, - instrux_VPSHAQ, - instrux_VPSHAW, - instrux_VPSHLB, - instrux_VPSHLD, - instrux_VPSHLQ, - instrux_VPSHLW, - instrux_VPSHUFB, - instrux_VPSHUFD, - instrux_VPSHUFHW, - instrux_VPSHUFLW, - instrux_VPSIGNB, - instrux_VPSIGND, - instrux_VPSIGNW, - instrux_VPSLLD, - instrux_VPSLLDQ, - instrux_VPSLLQ, - instrux_VPSLLW, - instrux_VPSRAD, - instrux_VPSRAW, - instrux_VPSRLD, - instrux_VPSRLDQ, - instrux_VPSRLQ, - instrux_VPSRLW, - instrux_VPSUBB, - instrux_VPSUBD, - instrux_VPSUBQ, - instrux_VPSUBSB, - instrux_VPSUBSW, - instrux_VPSUBUSB, - instrux_VPSUBUSW, - instrux_VPSUBW, - instrux_VPTEST, - instrux_VPUNPCKHBW, - instrux_VPUNPCKHDQ, - instrux_VPUNPCKHQDQ, - instrux_VPUNPCKHWD, - instrux_VPUNPCKLBW, - instrux_VPUNPCKLDQ, - instrux_VPUNPCKLQDQ, - instrux_VPUNPCKLWD, - instrux_VPXOR, - instrux_VRCPPS, - instrux_VRCPSS, - instrux_VROUNDPD, - instrux_VROUNDPS, - instrux_VROUNDSD, - instrux_VROUNDSS, - instrux_VRSQRTPS, - instrux_VRSQRTSS, - instrux_VSHUFPD, - instrux_VSHUFPS, - instrux_VSQRTPD, - instrux_VSQRTPS, - instrux_VSQRTSD, - instrux_VSQRTSS, - instrux_VSTMXCSR, - instrux_VSUBPD, - instrux_VSUBPS, - instrux_VSUBSD, - instrux_VSUBSS, - instrux_VTESTPD, - instrux_VTESTPS, - instrux_VUCOMISD, - instrux_VUCOMISS, - instrux_VUNPCKHPD, - instrux_VUNPCKHPS, - instrux_VUNPCKLPD, - instrux_VUNPCKLPS, - instrux_VXORPD, - instrux_VXORPS, - instrux_VZEROALL, - instrux_VZEROUPPER, - instrux_WBINVD, - instrux_WRMSR, - instrux_WRSHR, - instrux_XADD, - instrux_XBTS, - instrux_XCHG, - instrux_XCRYPTCBC, - instrux_XCRYPTCFB, - instrux_XCRYPTCTR, - instrux_XCRYPTECB, - instrux_XCRYPTOFB, - instrux_XGETBV, - instrux_XLAT, - instrux_XLATB, - instrux_XOR, - instrux_XORPD, - instrux_XORPS, - instrux_XRSTOR, - instrux_XSAVE, - instrux_XSETBV, - instrux_XSHA1, - instrux_XSHA256, - instrux_XSTORE, - instrux_CMOVcc, - instrux_Jcc, - instrux_SETcc, -}; - } -} diff --git a/Users/HKSplayground/AssemblyInfo.cs b/Users/HKSplayground/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/HKSplayground/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/HKSplayground/HKSplaygroundBoot.Cosmos b/Users/HKSplayground/HKSplaygroundBoot.Cosmos deleted file mode 100644 index 89a4824002..0000000000 --- a/Users/HKSplayground/HKSplaygroundBoot.Cosmos +++ /dev/null @@ -1,54 +0,0 @@ - - - - Debug - 2.0 - {d048e0b1-8b2b-4a99-8376-7fc8a0656a05} - false - HKSplaygroundBoot - elf - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - False - - All - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - - - - - - HKSplayground (users\HKSplayground\HKSplayground) - {79d1c0ae-bb85-4f85-accd-8aedd8d7b395} - True - - - - \ No newline at end of file diff --git a/Users/HKSplayground/Kernel.cs b/Users/HKSplayground/Kernel.cs deleted file mode 100644 index 374e4a0e51..0000000000 --- a/Users/HKSplayground/Kernel.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using Cosmos.Hardware; - -namespace HKSplayground -{ - public class Kernel : Sys.Kernel - { - Mouse m = new Mouse(); - int x=0, y=0; - int z = 0; - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - m.Initialize(); - Console.WriteLine("Mouse initialized"); - } - protected override void Run() - { - while (true) - { - //Do nothing - if (x != m.X || y != m.Y) - { - x = m.X; - y = m.Y; - if (z != Int16.MaxValue - 1) - { - z++; - } - else - { - z = 0; - } - Console.WriteLine(z); - } - } - } - - } -} diff --git a/Users/Kudzu/Breakpoints/.editorconfig b/Users/Kudzu/Breakpoints/.editorconfig deleted file mode 100644 index 52e3058342..0000000000 --- a/Users/Kudzu/Breakpoints/.editorconfig +++ /dev/null @@ -1,6 +0,0 @@ -; Top-most EditorConfig file - -; 4-column space indentation -[*.cs] -indent_style = space -indent_size = 2 \ No newline at end of file diff --git a/Users/Kudzu/Breakpoints/BreakpointsOS.cs b/Users/Kudzu/Breakpoints/BreakpointsOS.cs deleted file mode 100644 index 30e5909360..0000000000 --- a/Users/Kudzu/Breakpoints/BreakpointsOS.cs +++ /dev/null @@ -1,426 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Playground.Kudzu.BreakpointsKernel; -//using Playground.Kudzu.BreakpointsKernel.FAT; -//using Playground.Kudzu.BreakpointsKernel.FAT.Listing; -using Sys = Cosmos.System; -//using Cosmos.Debug.Kernel; -//using Cosmos.Common; -//using Cosmos.HAL.BlockDevice; - -//using TheFatStream = Playground.Kudzu.BreakpointsKernel.FAT.MyFatStream; -//using TheFatFile = Playground.Kudzu.BreakpointsKernel.FAT.Listing.MyFatFile; -//using TheFatFileSystem = Playground.Kudzu.BreakpointsKernel.FAT.MyFatFileSystem; - -//using TheFatStream = Cosmos.System.FileSystem.FAT.FatFileStream; -//using TheFatFile = Cosmos.System.FileSystem.FAT.Listing.FatFile; -//using TheFatFileSystem = Cosmos.System.FileSystem.FAT.FatFileSystem; - -namespace Kudzu.BreakpointsKernel -{ - public class BreakpointsOS : Sys.Kernel - { - public BreakpointsOS() - { - ClearScreen = false; - } - - protected override void Run() - { - //Test xTest; - - //var xATA = new Cosmos.HAL.BlockDevice.AtaPio(Cosmos.Core.Global.BaseIOGroups.ATA1 - // , Cosmos.HAL.BlockDevice.Ata.ControllerIdEnum.Primary - // , Cosmos.HAL.BlockDevice.Ata.BusPositionEnum.Master); - //UInt64 xBlockSize = xATA.BlockSize; - - //Console.WriteLine("Running FieldInitTest"); - //xTest = new FieldInitTest(); - //xTest.Run(); - - //Console.WriteLine("Running ListTest"); - //xTest = new ListTest(); - //xTest.Run(); - //Console.WriteLine("Running NullableTest"); - //xTest = new NullableTest(); - //xTest.Run(); - - //Console.WriteLine("Running Int64Test"); - //xTest = new Int64Test(); - //xTest.Run(); - - //Console.WriteLine("Running Trace1"); - //Trace1(); - //Console.WriteLine("Running TestSB"); - //TestSB(); - //Console.WriteLine("Running TestStringCtor"); - //TestStringCtor(); - //Console.WriteLine("Running TestCompare"); - //TestCompare(); - - //Console.WriteLine("Running TestATA"); - ////TestATA(); - - //Console.WriteLine("Press enter."); - //Console.ReadLine(); - Stop(); - } - - protected override void BeforeRun() - { - Console.WriteLine("Cosmos boot complete. KudzuPlayground"); - } - - protected void TestSB() - { - if (String.Empty == null) - { - Console.WriteLine("String.Empty is not even assigned!"); - return; - } - Console.Write("String.Empty.Length: "); - Console.WriteLine(String.Empty.Length); - Console.Write("\"Test\".Length: "); - Console.WriteLine("Test".Length); - var xSB = new StringBuilder(); - xSB.Append("Hello"); - xSB.Append("Hello"); - var xDisplay = xSB.ToString(); - Console.WriteLine(xDisplay.Length); - Console.WriteLine("First char: " + xSB[0]); - Console.WriteLine(xDisplay); - } - - private void Trace1() - { - int x = 4; - Trace2(); - int y = 5; - int z = 6; - } - - private void Trace2() - { - int x2 = 4; - Trace3(); - int y2 = 5; - int z2 = 6; - } - - private void Trace3() - { - int x3 = 4; - int y3 = 5; - int z3 = 6; - } - - private void TestCompare() - { - UInt32 x = UInt32.MaxValue; - int y = 0; - if (y >= x) - { - Console.WriteLine("Compare failed."); - } - else - { - Console.WriteLine("Compare OK."); - } - } - - private void TestStringCtor() - { - char[] xChars = new char[5]; - xChars[0] = 'A'; - xChars[1] = 'B'; - xChars[2] = 'C'; - xChars[3] = 'D'; - xChars[4] = 'E'; - var xString = new string(xChars, 0, 3); - Console.WriteLine(xString); - Console.WriteLine(xString.Length); - } - - //public void Format(Partition p) - //{ - // byte[] aData = p.NewBlockArray(1); - // p.ReadBlock(0, 1U, aData); - - // aData[510] = 0xAA; - // aData[511] = 0x55; - - // //The number of Bytes per sector (remember, all numbers are in the little-endian format). - // aData[11] = 0x01; - // aData[12] = 0xCA; - // aData[13] = 0x08; //Number of sectors per cluster. - // aData[14] = 0x01; - // aData[15] = 0xFF; //Number of reserved sectors. The boot record sectors are included in this value - // aData[16] = 0x02; //Number of File Allocation Tables (FAT's) on the storage media. Often this value is 2. - // aData[17] = 0x00; - // aData[18] = 0x0f; //Number of directory entries (must be set so that the root directory occupies entire sectors). - // aData[19] = 0xFF; - // aData[20] = 0xFF; //The total sectors in the logical volume. If this value is 0, it means there are more than 65535 sectors in the volume, and the actual count is stored in "Large Sectors (bytes 32-35). - // aData[22] = 0x0F; - // aData[23] = 0xFF; //Number of sectors per FAT. FAT12/FAT16 only. - // p.WriteBlock(0, 1U, aData); - //} - - /// - /// - Gets the first AtaPio device found - /// - Prints info about it (kind, serial/model numbers, firmware version, sizes, etc) - /// - Maps Fat32 to all partitions, finds a \Root.txt and a \Kudzu.txt file, and reads its contents - /// - //protected void TestATA() - //{ - // #region Comment(OLD) - - // /* - // try - // { - // Console.WriteLine(); - // Console.WriteLine("Block devices found: " + BlockDevice.Devices.Count); - - // AtaPio xATA = null; - // for (int i = 0; i < BlockDevice.Devices.Count; i++) - // { - // var xDevice = BlockDevice.Devices[i]; - // if (xDevice is AtaPio) - // { - // xATA = (AtaPio)xDevice; - // } - // } - // Console.WriteLine("--------------------------"); - // Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - // Console.WriteLine("Serial No: " + xATA.SerialNo); - // Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - // Console.WriteLine("Model No: " + xATA.ModelNo); - // Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - // Console.WriteLine("Size: " + xATA.BlockCount * xATA.BlockSize / 1024 / 1024 + " MB"); - - // //Partition xPartition = null; - // //for (int i = 0; i < BlockDevice.Devices.Count; i++) - // //{ - // // var xDevice = BlockDevice.Devices[i]; - // // if (xDevice is Partition) - // // { - // // xPartition = (Partition)xDevice; - // // } - // //} - - // //var xFS = new FAT.FatFileSystem(xPartition); - // //Sys.Filesystem.FileSystem.AddMapping("C", xFS); - - // //Console.WriteLine(); - // //Console.WriteLine("Root directory"); - // //var xListing = xFS.GetRoot(); - // //FAT.Listing.FatFile xRootFile = null; - // //FAT.Listing.FatFile xKudzuFile = null; - // //for (int i = 0; i < xListing.Count; i++) - // //{ - // // var xItem = xListing[i]; - // // if (xItem is Sys.Filesystem.Listing.Directory) - // // { - // // Console.WriteLine("<" + xListing[i].Name + ">"); - // // } - // // else if (xItem is Sys.Filesystem.Listing.File) - // // { - // // Console.WriteLine(); - // // Console.WriteLine(xListing[i].Name); - // // Console.WriteLine(xListing[i].Size); - // // if (xListing[i].Name == "Root.txt") - // // { - // // xRootFile = (FAT.Listing.FatFile)xListing[i]; - // // } - // // else if (xListing[i].Name == "Kudzu.txt") - // // { - // // xKudzuFile = (FAT.Listing.FatFile)xListing[i]; - // // } - // // } - // //} - - // //{ - // // var xStream = new Sys.Filesystem.FAT.FatFileStream(xRootFile); - // // var xData = new byte[xRootFile.Size]; - // // xStream.Read(xData, 0, (int)xRootFile.Size); - // // var xText = Encoding.ASCII.GetString(xData); - // // Console.WriteLine(xText); - // //} - - // //{ - // // Console.WriteLine(); - // // Console.WriteLine("StreamReader"); - // // var xStream = new Sys.Filesystem.FAT.FatFileStream(xRootFile); - // // var xReader = new System.IO.StreamReader(xStream); - // // string xText = xReader.ReadToEnd(); - // // Console.WriteLine(xText); - // //} - - // //var xKudzuStream = new Sys.Filesystem.FAT.FatFileStream(xKudzuFile); - // //var xKudzuData = new byte[xKudzuFile.Size]; - // //xKudzuStream.Read(xKudzuData, 0, (int)xKudzuFile.Size); - - // //string xLower = "Hello"; - // //Console.WriteLine(xLower.ToUpper()); - // //Console.WriteLine(xLower.ToLower()); - - // //var xFile = new System.IO.FileStream(@"c:\Root.txt", System.IO.FileMode.Open); - - // //int dummy = 42; - - // //var xWrite = new byte[512]; - // //for (int i = 0; i < 512; i++) - // //{ - // // xWrite[i] = (byte)i; - // //} - // //xATA.WriteBlock(0, 1, xWrite); - - // //var xRead = xATA.NewBlockArray(1); - // //xATA.ReadBlock(0, 1, xRead); - // //string xDisplay = ""; - // //for (int i = 0; i < 512; i++) - // //{ - // // xDisplay = xDisplay + xRead[i].ToHex(); - // //} - // //Console.WriteLine(xDisplay); - - // } - // catch (Exception e) - // { - // Console.WriteLine("Exception: " + e.Message); - // Stop(); - // }*/ - - // #endregion - - // try - // { - - // Console.WriteLine(); - // Console.WriteLine("Block devices found: " + BlockDevice.Devices.Count); - - // AtaPio xATA = null; - // for (int i = 0; i < BlockDevice.Devices.Count; i++) - // { - // var xDevice = BlockDevice.Devices[i]; - // if (xDevice is AtaPio) - // { - // xATA = (AtaPio) xDevice; - // } - // } - - // //Info - // Console.WriteLine("--------------------------"); - // Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - // Console.WriteLine("Serial No: " + xATA.SerialNo); - // Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - // Console.WriteLine("Model No: " + xATA.ModelNo); - // Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - // Console.WriteLine("Size: " + xATA.BlockCount*xATA.BlockSize/1024/1024 + " MB"); - - // //Partition Detecting - // Partition xPartition = null; - // if (BlockDevice.Devices.Count > 0) - // { - // for (int i = 0; i < BlockDevice.Devices.Count; i++) - // { - // var xDevice = BlockDevice.Devices[i]; - // if (xDevice is Partition) - // { - // xPartition = (Partition) xDevice; - - // Console.WriteLine("FAT FS"); - // var xFS = new TheFatFileSystem(xPartition); - - // Console.WriteLine("Mapping..."); - // Sys.FileSystem.FileSystem.AddMapping("C", xFS); - - - // Console.WriteLine(); - // Console.WriteLine("Root directory"); - - // var xListing = xFS.GetRoot(); - // TheFatFile xRootFile = null; - // TheFatFile xKudzuFile = null; - - - // for (int j = 0; j < xListing.Count; j++) - // { - // var xItem = xListing[j]; - // if (xItem is Sys.FileSystem.Listing.Directory) - // { - // //Detecting Dir in HDD - // Console.WriteLine(" " + xListing[j].Name); - // } - // else if (xItem is Sys.FileSystem.Listing.File) - // { - // //Detecting File in HDD - // Console.WriteLine(" " + xListing[j].Name + " (" + xListing[j].Size + ")"); - // if (xListing[j].Name == "Root.txt") - // { - // xRootFile = (TheFatFile) xListing[j]; - // Console.WriteLine("Root file found"); - // } - // else if (xListing[j].Name == "Kudzu.txt") - // { - // xKudzuFile = (TheFatFile) xListing[j]; - // Console.WriteLine("Kudzu file found"); - // } - // } - // } - - // try - // { - // Console.WriteLine(); - // Console.WriteLine("StreamReader - Root File"); - // if (xRootFile == null) - // { - // Console.WriteLine("RootFile not found!"); - // } - // var xStream = new TheFatStream(xRootFile); - // var xData = new byte[xRootFile.Size]; - // var size = (int) xRootFile.Size; - // Console.WriteLine("Size: " + size); - // var sizeInt = (int)xRootFile.Size; - // xStream.Read(xData, 0, sizeInt); - // var xText = Encoding.ASCII.GetString(xData); - // Console.WriteLine(xText); - // } - // catch (Exception e) - // { - // Console.WriteLine("Error: " + e.Message); - // } - - // if (xKudzuFile == null) - // { - // Console.WriteLine("KudzuFile not found!"); - // } - // var xKudzuStream = new TheFatStream(xKudzuFile); - // var xKudzuData = new byte[xKudzuFile.Size]; - // xKudzuStream.Read(xKudzuData, 0, (int) xKudzuFile.Size); - - // var xFile = new System.IO.FileStream(@"c:\Root.txt", System.IO.FileMode.Open); - - // } - // } - // } - // else - // { - // Console.WriteLine("No Block Device Found! "); - // } - // } - // catch (Exception e) - // { - // Console.WriteLine("Error: " + e.Message); - // } - //} - - protected override void AfterRun() - { - Console.Write("Done"); - Console.ReadLine(); - } - - } -} diff --git a/Users/Kudzu/Breakpoints/Compile last with NASM.bat b/Users/Kudzu/Breakpoints/Compile last with NASM.bat deleted file mode 100644 index 578cefe8ca..0000000000 --- a/Users/Kudzu/Breakpoints/Compile last with NASM.bat +++ /dev/null @@ -1,4 +0,0 @@ -\source\Cosmos\build\Tools\nasm\nasm.exe -g -f bin -o output.obj bin\debug\Breakpoints.asm -pause - - diff --git a/Users/Kudzu/Breakpoints/Debug in IDA.au3 b/Users/Kudzu/Breakpoints/Debug in IDA.au3 deleted file mode 100644 index 8b343241e2..0000000000 --- a/Users/Kudzu/Breakpoints/Debug in IDA.au3 +++ /dev/null @@ -1,32 +0,0 @@ -Run("C:\Program Files (x86)\IDA\idag.exe") - -WinWaitActive("About") -Send("{SPACE}"); - -WinWaitActive("[CLASS:TIdaWindow]") -Sleep(250) - -Send("!fo") -Sleep(1000) ; Must wait else the d often gets eaten -Send("d:\source\Cosmos\source2\Users\Kudzu\Breakpoints\bin\Debug\CosmosKernel.obj", 1) -Send("{ENTER}") - -WinWaitActive("Load a new file") -Send("{ENTER}") - -WinWaitActive("[CLASS:TIdaWindow]") - -;MsgBox(4096, "Test", ControlGetText("[CLASS:TIdaWindow]", "", "[ID:1380126]")) -;while StringInStr(ControlGetText("[CLASS:TIdaWindow]", "", "TListBox1"), "The initial autoanalysis has been finished.") = 0 - ;MsgBox(4096, "Test", ControlGetText("[CLASS:TIdaWindow]", "", "[ID:1380126]")) -; Sleep(200) -;WEnd - -;Send("{F9}") ; Debug -;Send("!y") ; Are you sure? -;Send("!y") ; Attach to remote? - - - - - diff --git a/Users/Kudzu/Breakpoints/FAT/FatFileSystem.cs b/Users/Kudzu/Breakpoints/FAT/FatFileSystem.cs deleted file mode 100644 index ac67682782..0000000000 --- a/Users/Kudzu/Breakpoints/FAT/FatFileSystem.cs +++ /dev/null @@ -1,350 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System.Threading.Tasks; -//using Cosmos.Common.Extensions; -//using Cosmos.System.FileSystem; - -//namespace Playground.Kudzu.BreakpointsKernel.FAT -//{ -// public class MyFatFileSystem : FileSystem -// { -// readonly public UInt32 BytesPerSector; -// readonly public UInt32 SectorsPerCluster; -// readonly public UInt32 BytesPerCluster; - -// readonly public UInt32 ReservedSectorCount; -// readonly public UInt32 TotalSectorCount; -// readonly public UInt32 ClusterCount; - -// readonly public UInt32 NumberOfFATs; -// readonly public UInt32 FatSectorCount; - -// readonly public UInt32 RootSector = 0; // FAT12/16 -// readonly public UInt32 RootSectorCount = 0; // FAT12/16, FAT32 remains 0 -// readonly public UInt32 RootCluster; // FAT32 -// readonly public UInt32 RootEntryCount; - -// readonly public UInt32 DataSector; // First Data Sector -// readonly public UInt32 DataSectorCount; - -// public static class Attribs -// { -// public const int Test = 0x01; -// public const int Hidden = 0x02; -// public const int System = 0x04; -// public const int VolumeID = 0x08; -// public const int Directory = 0x10; -// public const int Archive = 0x20; -// // LongName was created after and is a combination of other attribs. Its "special". -// public const int LongName = 0x0F; -// } - -// public enum FatTypeEnum { Unknown, Fat12, Fat16, Fat32 } -// readonly public FatTypeEnum FatType = FatTypeEnum.Unknown; - -// Cosmos.HAL.BlockDevice.BlockDevice mDevice; - -// public void ReadFatTableSector(UInt64 xSectorNum, byte[] aData) -// { -// ulong xBlockNo = ReservedSectorCount + xSectorNum; -// mDevice.ReadBlock(xBlockNo, 1, aData); -// } - -// public bool FatEntryIsEOF(UInt64 aValue) -// { -// if (FatType == FatTypeEnum.Fat12) -// { -// return aValue >= 0x0FF8; -// } -// else if (FatType == FatTypeEnum.Fat16) -// { -// return aValue >= 0xFFF8; -// } -// else -// { -// return aValue >= 0x0FFFFFF8; -// } -// } - -// public UInt64 GetFatEntry(byte[] aSector, UInt64 aClusterNum, UInt64 aOffset) -// { -// if (aSector == null) -// { -// throw new ArgumentNullException("aSector"); -// } -// if (this == null) -// { -// Console.WriteLine("$this == null!"); -// while (true) ; -// } -// if (FatType == FatTypeEnum.Fat12) -// { -// if (aOffset == (BytesPerSector - 1)) -// { -// throw new Exception("TODO: Sector Span"); -// /* This cluster access spans a sector boundary in the FAT */ -// /* There are a number of strategies to handling this. The */ -// /* easiest is to always load FAT sectors into memory */ -// /* in pairs if the volume is FAT12 (if you want to load */ -// /* FAT sector N, you also load FAT sector N+1 immediately */ -// /* following it in memory unless sector N is the last FAT */ -// /* sector). It is assumed that this is the strategy used here */ -// /* which makes this if test for a sector boundary span */ -// /* unnecessary. */ -// } -// // We now access the FAT entry as a WORD just as we do for FAT16, but if the cluster number is -// // EVEN, we only want the low 12-bits of the 16-bits we fetch. If the cluster number is ODD -// // we want the high 12-bits of the 16-bits we fetch. -// UInt32 xResult = aSector.ToUInt16(aOffset); -// if ((aClusterNum & 0x01) == 0) -// { // Even -// return xResult & 0x0FFF; -// } -// else -// { // Odd -// return xResult >> 4; -// } -// } -// else if (FatType == FatTypeEnum.Fat16) -// { -// return aSector.ToUInt16(aOffset); -// } -// else -// { -// return aSector.ToUInt32(aOffset) & 0x0FFFFFFF; -// } -// } - -// public MyFatFileSystem(Cosmos.HAL.BlockDevice.BlockDevice aDevice) -// { - -// mDevice = aDevice; -// byte[] xBPB = mDevice.NewBlockArray(1); - -// mDevice.ReadBlock(0UL, 1U, xBPB); - -// UInt16 xSig = xBPB.ToUInt16(510); -// if (xSig != 0xAA55) -// { -// throw new Exception("FAT signature not found."); -// } - -// BytesPerSector = xBPB.ToUInt16(11); -// SectorsPerCluster = xBPB[13]; -// BytesPerCluster = BytesPerSector * SectorsPerCluster; -// ReservedSectorCount = xBPB.ToUInt16(14); -// NumberOfFATs = xBPB[16]; -// RootEntryCount = xBPB.ToUInt16(17); - -// TotalSectorCount = xBPB.ToUInt16(19); -// if (TotalSectorCount == 0) -// { -// TotalSectorCount = xBPB.ToUInt32(32); -// } - -// // FATSz -// FatSectorCount = xBPB.ToUInt16(22); -// if (FatSectorCount == 0) -// { -// FatSectorCount = xBPB.ToUInt32(36); -// } -// //Global.Dbg.Send("FAT Sector Count: " + FatSectorCount); - -// DataSectorCount = TotalSectorCount - (ReservedSectorCount + (NumberOfFATs * FatSectorCount) + ReservedSectorCount); - -// // Computation rounds down. -// ClusterCount = DataSectorCount / SectorsPerCluster; -// // Determine the FAT type. Do not use another method - this IS the official and -// // proper way to determine FAT type. -// // Comparisons are purposefully < and not <= -// // FAT16 starts at 4085, FAT32 starts at 65525 -// if (ClusterCount < 4085) -// { -// FatType = FatTypeEnum.Fat12; -// } -// else if (ClusterCount < 65525) -// { -// FatType = FatTypeEnum.Fat16; -// } -// else -// { -// FatType = FatTypeEnum.Fat32; -// } - -// if (FatType == FatTypeEnum.Fat32) -// { -// RootCluster = xBPB.ToUInt32(44); -// } -// else -// { -// RootSector = ReservedSectorCount + (NumberOfFATs * FatSectorCount); -// RootSectorCount = (RootEntryCount * 32 + (BytesPerSector - 1)) / BytesPerSector; -// } -// DataSector = ReservedSectorCount + (NumberOfFATs * FatSectorCount) + RootSectorCount; - -// } - -// public byte[] NewClusterArray() -// { -// return new byte[BytesPerCluster]; -// } - -// public void ReadCluster(UInt64 aCluster, byte[] aData) -// { -// //Console.WriteLine("ReadCluster now"); -// UInt64 xSector = DataSector + ((aCluster - 2) * SectorsPerCluster); -// mDevice.ReadBlock(xSector, SectorsPerCluster, aData); -// } - -// public void GetFatTableSector(UInt64 aClusterNum, out UInt32 oSector, out UInt32 oOffset) -// { -// UInt64 xOffset = 0; -// if (FatType == FatTypeEnum.Fat12) -// { -// // Multiply by 1.5 without using floating point, the divide by 2 rounds DOWN -// xOffset = aClusterNum + (aClusterNum / 2); -// } -// else if (FatType == FatTypeEnum.Fat16) -// { -// xOffset = aClusterNum * 2; -// } -// else if (FatType == FatTypeEnum.Fat32) -// { -// xOffset = aClusterNum * 4; -// } -// oSector = (UInt32)(xOffset / BytesPerSector); -// oOffset = (UInt32)(xOffset % BytesPerSector); -// } - -// public List GetRoot() -// { -// var xResult = new List(); - -// byte[] xData; -// if (FatType == FatTypeEnum.Fat32) -// { -// xData = NewClusterArray(); -// ReadCluster(RootCluster, xData); -// } -// else -// { -// xData = mDevice.NewBlockArray(RootSectorCount); -// mDevice.ReadBlock(RootSector, RootSectorCount, xData); -// } -// //TODO: Change xLongName to StringBuilder -// string xLongName = ""; -// for (UInt32 i = 0; i < xData.Length; i = i + 32) -// { -// byte xAttrib = xData[i + 11]; -// if (xAttrib == Attribs.LongName) -// { -// byte xType = xData[i + 12]; -// if (xType == 0) -// { -// byte xOrd = xData[i]; -// if ((xOrd & 0x40) > 0) -// { -// xLongName = ""; -// } -// //TODO: Check LDIR_Ord for ordering and throw exception -// // if entries are found out of order. -// // Also save buffer and only copy name if a end Ord marker is found. -// string xLongPart = xData.GetUtf16String(i + 1, 5); -// // We have to check the length because 0xFFFF is a valid Unicode codepoint. -// // So we only want to stop if the 0xFFFF is AFTER a 0x0000. We can determin -// // this by also looking at the length. Since we short circuit the or, the length -// // is rarely evaluated. -// if (xData.ToUInt16(i + 14) != 0xFFFF || xLongPart.Length == 5) -// { -// xLongPart = xLongPart + xData.GetUtf16String(i + 14, 6); -// if (xData.ToUInt16(i + 28) != 0xFFFF || xLongPart.Length == 11) -// { -// xLongPart = xLongPart + xData.GetUtf16String(i + 28, 2); -// } -// } -// xLongName = xLongPart + xLongName; -// //TODO: LDIR_Chksum -// } -// } -// else -// { -// byte xStatus = xData[i]; -// if (xStatus == 0x00) -// { -// // Empty slot, and no more entries after this -// break; -// } -// else if (xStatus == 0x05) -// { -// // Japanese characters - We dont handle these -// } -// else if (xStatus == 0xE5) -// { -// // Empty slot, skip it -// } -// else if (xStatus >= 0x20) -// { -// string xName; -// if (xLongName.Length > 0) -// { -// // Leading and trailing spaces are to be ignored according to spec. -// // Many programs (including Windows) pad trailing spaces although it -// // it is not required for long names. -// // As per spec, ignore trailing periods -// xName = xLongName.Trim(); - -// //If there are trailing periods -// int nameIndex = xName.Length - 1; -// if (xName[nameIndex] == '.') -// { -// //Search backwards till we find the first non-period character -// for (; nameIndex > 0; nameIndex--) -// { -// if (xName[nameIndex] != '.') -// { -// break; -// } -// } -// //Substring to remove the periods -// xName = xName.Substring(0, nameIndex + 1); -// } -// } -// else -// { -// string xEntry = xData.GetAsciiString(i, 11); -// xName = xEntry.Substring(0, 8).TrimEnd(); -// string xExt = xEntry.Substring(8, 3).TrimEnd(); -// if (xExt.Length > 0) -// { -// xName = xName + "." + xExt; -// } -// } - -// UInt32 xFirstCluster = (UInt32)(xData.ToUInt16(i + 20) << 16 | xData.ToUInt16(i + 26)); - -// var xTest = xAttrib & (Attribs.Directory | Attribs.VolumeID); -// if (xTest == 0) -// { -// UInt32 xSize = xData.ToUInt32(i + 28); -// xResult.Add(new Listing.MyFatFile(this, xName, xSize, xFirstCluster)); -// } -// else if (xTest == Attribs.VolumeID) -// { -// // -// } -// else if (xTest == Attribs.Directory) -// { -// xResult.Add(new Listing.MyFatDirectory(this, xName)); -// } -// xLongName = ""; -// } -// } -// } - -// return xResult; -// } - -// } -//} \ No newline at end of file diff --git a/Users/Kudzu/Breakpoints/FAT/FatStream.cs b/Users/Kudzu/Breakpoints/FAT/FatStream.cs deleted file mode 100644 index a19e59c9f7..0000000000 --- a/Users/Kudzu/Breakpoints/FAT/FatStream.cs +++ /dev/null @@ -1,175 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.IO; -//using System.Linq; -//using System.Text; -//using System.Threading.Tasks; - -//namespace Playground.Kudzu.BreakpointsKernel.FAT -//{ -// public class MyFatStream : Stream -// { -// protected readonly Listing.MyFatFile mFile; -// protected readonly MyFatFileSystem mFS = null; -// protected byte[] mReadBuffer; -// //TODO: In future we might read this in as needed rather than -// // all at once. This structure will also consume 2% of file size in RAM -// // (for default cluster size of 2kb, ie 4 bytes per cluster) -// // so we might consider a way to flush it and only keep parts. -// // Example, a 100 MB file will require 2MB for this structure. That is -// // probably acceptable for the mid term future. -// protected List mFatTable; -// protected UInt64? mReadBufferPosition; - -// public MyFatStream(Listing.MyFatFile aFile) -// { -// if (aFile == null) -// { -// throw new ArgumentNullException("aFile"); -// } -// mFile = aFile; -// mFS = mFile.FileSystem; -// mReadBuffer = mFile.FileSystem.NewClusterArray(); -// var xSize = mFile.Size; -// if (xSize > 0) -// { -// mFatTable = mFile.GetFatTable(); -// } -// else -// { -// Console.WriteLine("No FatTable created, as size = 0"); -// } -// } - -// public override bool CanSeek -// { -// get { return true; } -// } - -// public override bool CanRead -// { -// get { return true; } -// } - -// public override bool CanWrite -// { -// get { return false; } -// } - -// public override long Length -// { -// get { return (long)mFile.Size; } -// } - -// protected UInt64 mPosition; -// public override long Position -// { -// get -// { -// return (long)mPosition; -// } -// set -// { -// if (value < 0L) -// { -// throw new ArgumentOutOfRangeException("value"); -// } -// mPosition = (ulong)value; -// } -// } - -// public override int Read(byte[] aBuffer, int aOffset, int aCount) -// { -// return Read(aBuffer, (Int64)aOffset, (Int64)aCount); -// } - -// public int Read(byte[] aBuffer, Int64 aOffset, Int64 aCount) -// { -// if (aCount < 0) -// { -// throw new ArgumentOutOfRangeException("aCount"); -// } -// if (aOffset < 0) -// { -// throw new ArgumentOutOfRangeException("aOffset"); -// } -// if (aBuffer == null || aBuffer.Length - aOffset < aCount) -// { -// throw new ArgumentException("Invalid offset length!"); -// } -// if (mFile.FirstClusterNum == 0) -// { -// // FirstSector can be 0 for 0 length files -// return 0; -// } -// if (mPosition == mFile.Size) -// { -// // EOF -// return 0; -// } - -// // reduce count, so that no out of bound exception occurs if not existing -// // entry is used in line mFS.ReadCluster(mFatTable[(int)xClusterIdx], xCluster); -// ulong xMaxReadableBytes = mFile.Size - mPosition; -// ulong xCount = (ulong)aCount; -// if (xCount > xMaxReadableBytes) -// { -// xCount = xMaxReadableBytes; -// } - -// var xCluster = mFS.NewClusterArray(); -// UInt32 xClusterSize = mFS.BytesPerCluster; - -// while (xCount > 0) -// { -// UInt64 xClusterIdx = mPosition / xClusterSize; -// UInt64 xPosInCluster = mPosition % xClusterSize; -// mFS.ReadCluster((ulong)mFatTable[(int)xClusterIdx], xCluster); -// long xReadSize; -// if (xPosInCluster + xCount > xClusterSize) -// { -// xReadSize = (long)(xClusterSize - xPosInCluster - 1); -// } -// else -// { -// xReadSize = (long)xCount; -// } -// // no need for a long version, because internal Array.Copy() does a cast down to int, and a range check, -// // or we do a semantic change here -// Console.WriteLine("Readsize: " + xReadSize); -// Array.Copy(xCluster, (long)xPosInCluster, aBuffer, aOffset, xReadSize); - -// aOffset += xReadSize; -// xCount -= (ulong)xReadSize; -// } - -// //mPosition += (ulong)aOffset; -// return 0; -// } - -// public override void Flush() -// { -// throw new NotImplementedException(); -// } - -// public override long Seek(long offset, SeekOrigin origin) -// { -// throw new NotImplementedException(); -// } - -// public override void SetLength(long value) -// { -// throw new NotImplementedException(); -// } - -// public override void Write(byte[] aBuffer, int aOffset, int aCount) -// { -// Write(aBuffer, (long)aOffset, (long)aCount); -// } - -// public void Write(byte[] buffer, long offset, long count) -// { -// throw new NotImplementedException(); -// } -// } -//} \ No newline at end of file diff --git a/Users/Kudzu/Breakpoints/FAT/Listing/FatDirectory.cs b/Users/Kudzu/Breakpoints/FAT/Listing/FatDirectory.cs deleted file mode 100644 index f1ff20c786..0000000000 --- a/Users/Kudzu/Breakpoints/FAT/Listing/FatDirectory.cs +++ /dev/null @@ -1,17 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System.Threading.Tasks; -//using Cosmos.System.FileSystem; - -//namespace Playground.Kudzu.BreakpointsKernel.FAT.Listing -//{ -// public class MyFatDirectory : Cosmos.System.FileSystem.Listing.Directory -// { -// public MyFatDirectory(FileSystem aFileSystem, string aName) -// : base(aFileSystem, aName) -// { -// } -// } -//} diff --git a/Users/Kudzu/Breakpoints/FAT/Listing/FatFile.cs b/Users/Kudzu/Breakpoints/FAT/Listing/FatFile.cs deleted file mode 100644 index 319d511e2d..0000000000 --- a/Users/Kudzu/Breakpoints/FAT/Listing/FatFile.cs +++ /dev/null @@ -1,85 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System.Threading.Tasks; - -//namespace Playground.Kudzu.BreakpointsKernel.FAT.Listing -//{ -// public class MyFatFile : Cosmos.System.FileSystem.Listing.File -// { -// public readonly MyFatFileSystem FileSystem; -// public readonly UInt64 FirstClusterNum; - -// // Size is UInt32 because FAT doesn't support bigger. -// // Dont change to UInt64 -// public MyFatFile(MyFatFileSystem aFileSystem, string aName, UInt32 aSize, UInt64 aFirstCluster) -// : base(aFileSystem, aName, aSize) -// { -// FileSystem = aFileSystem; -// FirstClusterNum = aFirstCluster; -// } - -// //TODO: Seperate out the file mechanics from the Listing class -// // so a file can exist without a listing instance -// public List GetFatTable() -// { -// uint xBytesPerCluster = (FileSystem.SectorsPerCluster * FileSystem.BytesPerSector); -// ulong numberOfClusters = (Size / xBytesPerCluster); -// var xListCapacity = (int)numberOfClusters; -// var xResult = new List();//xListCapacity -// UInt64 xClusterNum = FirstClusterNum; - -// byte[] xSector = new byte[FileSystem.BytesPerSector]; -// UInt32? xSectorNum = null; - -// UInt32 xNextSectorNum; -// UInt32 xNextSectorOffset; -// do -// { -// if (FileSystem == null) -// { -// Console.WriteLine("$this is null! (1)"); -// } -// FileSystem.GetFatTableSector(xClusterNum, out xNextSectorNum, out xNextSectorOffset); -// if (FileSystem == null) -// { -// Console.WriteLine("$this is null! (2)"); -// } -// if (xSectorNum.HasValue == false || xSectorNum != xNextSectorNum) -// { -// if (FileSystem == null) -// { -// Console.WriteLine("$this is null! (3)"); -// } -// var nextSectorNum = (ulong)xNextSectorNum; -// if (this == null) -// { -// Console.WriteLine("$this is null!"); -// } -// if (FileSystem == null) -// { -// Console.WriteLine("$this.FileSystem is null"); -// } -// FileSystem.ReadFatTableSector(nextSectorNum, xSector); -// xSectorNum = xNextSectorNum; -// } - -// xResult.Add(xClusterNum); -// if (FileSystem == null) -// { -// Console.WriteLine("$this.FileSystem is null (2)"); -// } -// var xFS = FileSystem; -// if (xFS == null) -// { -// Console.WriteLine("xFS is null (2)"); -// } -// xClusterNum = xFS.GetFatEntry(xSector, xClusterNum, xNextSectorOffset); -// } while (!FileSystem.FatEntryIsEOF(xClusterNum)); - -// return xResult; -// } - -// } -//} \ No newline at end of file diff --git a/Users/Kudzu/Breakpoints/FieldInitTest.cs b/Users/Kudzu/Breakpoints/FieldInitTest.cs deleted file mode 100644 index da5eb7be0d..0000000000 --- a/Users/Kudzu/Breakpoints/FieldInitTest.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - public class FieldInitTest : Test { - public override void Run() { - FieldInitBase x = new FieldInit(); - Chk(x.mBaseInt == 512); - } - } - - public class FieldInitBase { - public UInt64 mBaseInt; - } - - public class FieldInit : FieldInitBase { - public FieldInit() { - mBaseInt = 512; - } - } -} diff --git a/Users/Kudzu/Breakpoints/Int64Test.cs b/Users/Kudzu/Breakpoints/Int64Test.cs deleted file mode 100644 index 9d71d3d6db..0000000000 --- a/Users/Kudzu/Breakpoints/Int64Test.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - public class Int64Test : Test { - - public override void Run() { - UInt64 x = 0xFFFFFFFFFFFFFFFF; - - x = x - 1; - Chk(x == 0xFFFFFFFFFFFFFFFE); - - x = x + 1; - Chk(x == 0xFFFFFFFFFFFFFFFF); - - x = 0x5555555555555555; - x = x * 2; - Chk(x == 0xAAAAAAAAAAAAAAAA); - - x = 0xAAAAAAAAAAAAAAAA; - x = x / 2; // This line dies with CPU exception 0x00 - Chk(x == 0x5555555555555555); - - // move to uint32 and back - // add with uint32 etc - } - - } -} diff --git a/Users/Kudzu/Breakpoints/Kudzu.Breakpoints.Cosmos b/Users/Kudzu/Breakpoints/Kudzu.Breakpoints.Cosmos deleted file mode 100644 index 4c03616060..0000000000 --- a/Users/Kudzu/Breakpoints/Kudzu.Breakpoints.Cosmos +++ /dev/null @@ -1,257 +0,0 @@ - - - - elf - Debug - 2.0 - {e5647bfd-1507-4f02-a7d5-e0f9d6aece3a} - false - Kudzu.Breakpoints - v4.6.2 - - - VMware - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - PXE - Player - False - Workstation - ISO - - ISO - VMware - True - All - PXE - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - USB - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - All - False - false - ISO - VMware - True - Source - - Workstation - bin\Debug\ - MicrosoftNET - False - All - False - False - ISO - None - False - Source - - Player - bin\Debug\ - MicrosoftNET - False - All - False - false - Guess - Use VMware Player or Workstation to deploy and debug. - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - Guess - Makes a USB device such as a flash drive or external hard disk bootable. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - Guess - Use VMware Player or Workstation to deploy and debug. - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - Slave - True - Source - - Player - bin\Debug\ - MicrosoftNET - False - - False - false - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - 192.168.43.1 - Serial: COM3 - Pipe: Cosmos\Serial - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Pipe: Cosmos\Serial - Serial: COM1 - False - False - False - False - False - Pipe: Cosmos\Serial - False - False - - - true - bin\Debug\ - VMWare - MicrosoftNET - False - Source - False - - - Workstation - False - All - False - VMware - Guess - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - False - True - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Workstation - User 001 - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - ISO - None - False - Source - 192.168.43.1 - Serial: COM3 - Player - bin\Debug\ - MicrosoftNET - False - False - false - Guess - Makes a USB device such as a flash drive or external hard disk bootable. - USB - None - False - False - Source - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Player - bin\Debug\ - MicrosoftNET - False - False - false - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - None - False - Source - 192.168.43.1 - Serial: COM3 - Player - bin\Debug\ - MicrosoftNET - False - False - false - Guess - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - False - True - Source - Pipe: Cosmos\Serial - 192.168.43.1 - Serial: COM3 - Workstation - bin\Debug\ - MicrosoftNET - False - False - False - PXE with Slave (Kudzu) - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - Slave - False - True - Source - Serial: COM1 - 192.168.43.1 - Serial: COM3 - Player - bin\Debug\ - MicrosoftNET - False - False - false - All - False - Pipe: Cosmos\Serial - All - All - False - False - - - - Content - - - - - Kudzu.BreakpointsKernel - {91cbd640-c07d-4556-b4cb-6f8cd88c67c9} - True - - - - - Content - - - - - - diff --git a/Users/Kudzu/Breakpoints/Kudzu.BreakpointsKernel.csproj b/Users/Kudzu/Breakpoints/Kudzu.BreakpointsKernel.csproj deleted file mode 100644 index f98df1f171..0000000000 --- a/Users/Kudzu/Breakpoints/Kudzu.BreakpointsKernel.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {91CBD640-C07D-4556-B4CB-6F8CD88C67C9} - Library - Properties - Playground.Kudzu.BreakpointsKernel - Playground.Kudzu.BreakpointsKernel - v4.7.1 - 512 - - - - - true - bin\Debug\ - x64 - MinimumRecommendedRules.ruleset - DEBUG;TRACE - - - true - bin\Debug\ - x86 - MinimumRecommendedRules.ruleset - DEBUG;TRACE - - - true - bin\Debug\ - AnyCPU - MinimumRecommendedRules.ruleset - DEBUG;TRACE - prompt - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Kudzu/Breakpoints/ListTest.cs b/Users/Kudzu/Breakpoints/ListTest.cs deleted file mode 100644 index 4facdf4ee2..0000000000 --- a/Users/Kudzu/Breakpoints/ListTest.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Kudzu.BreakpointsKernel; - -namespace Playground.Kudzu.BreakpointsKernel -{ - public class ListTest: Test - { - public override void Run() - { - var xList = new List(); - var xList2 = new List(); - Console.WriteLine("List.Capacity = " + xList.Capacity); - Console.WriteLine("List2.Capacity = " + xList2.Capacity); - Console.WriteLine("List.Count = " + xList.Count); - Console.WriteLine("List2.Count = " + xList2.Count); - xList.Add(2); - xList2.Add(2); - Console.WriteLine("Item added"); - Console.WriteLine("List.Capacity = " + xList.Capacity); - Console.WriteLine("List2.Capacity = " + xList2.Capacity); - Console.WriteLine("List.Count = " + xList.Count); - Console.WriteLine("List2.Count = " + xList2.Count); - xList.Clear(); - xList2.Clear(); - Console.WriteLine("Lists cleared"); - Console.WriteLine("List.Capacity = " + xList.Capacity); - Console.WriteLine("List2.Capacity = " + xList2.Capacity); - Console.WriteLine("List.Count = " + xList.Count); - Console.WriteLine("List2.Count = " + xList2.Count); - } - } -} diff --git a/Users/Kudzu/Breakpoints/NullableTest.cs b/Users/Kudzu/Breakpoints/NullableTest.cs deleted file mode 100644 index 3f9e0891a6..0000000000 --- a/Users/Kudzu/Breakpoints/NullableTest.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - public class NullableTest : Test { - - protected UInt32? mSize; - public virtual UInt32? Size { - get { return mSize; } - } - - public override void Run() { - mSize = 7; - bool xHasValue = mSize.HasValue; - - Chk(xHasValue); - UInt32 x = mSize.Value; - Chk(mSize.Value == 7); - - UInt32? xSize; - xSize = 4; - - UInt32? y = x; - Chk(y.HasValue); - Chk(y.Value == 7); - - UInt32 x2 = 64; - UInt32? y2 = x2; - Chk(y2.Value == 64); - Chk(y.Value == 7); - - UInt32? y3 = x2; - Chk(y3.Value == 64); - } - - } -} diff --git a/Users/Kudzu/Breakpoints/Properties/AssemblyInfo.cs b/Users/Kudzu/Breakpoints/Properties/AssemblyInfo.cs deleted file mode 100644 index cb41e1ef95..0000000000 --- a/Users/Kudzu/Breakpoints/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("BreakpointsKernel")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("BreakpointsKernel")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("1f6545df-c71c-460d-96ae-f804d532cd65")] - -// 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/Users/Kudzu/Breakpoints/StringBuilderTest.cs b/Users/Kudzu/Breakpoints/StringBuilderTest.cs deleted file mode 100644 index a338e29f4a..0000000000 --- a/Users/Kudzu/Breakpoints/StringBuilderTest.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - class StringBuilderTest { - } -} diff --git a/Users/Kudzu/Breakpoints/StringTest.cs b/Users/Kudzu/Breakpoints/StringTest.cs deleted file mode 100644 index 7d8248cb3b..0000000000 --- a/Users/Kudzu/Breakpoints/StringTest.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - class StringTest { - } -} diff --git a/Users/Kudzu/Breakpoints/Test.cs b/Users/Kudzu/Breakpoints/Test.cs deleted file mode 100644 index 770d7fbbbf..0000000000 --- a/Users/Kudzu/Breakpoints/Test.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.BreakpointsKernel { - public abstract class Test { - - public abstract void Run(); - - public void Chk(bool aTest) { - if (!aTest) { - throw new Exception("Test failed."); - } - } - - } -} diff --git a/Users/Kudzu/Force Update from TFS.bat b/Users/Kudzu/Force Update from TFS.bat deleted file mode 100644 index 8d2a9006e6..0000000000 --- a/Users/Kudzu/Force Update from TFS.bat +++ /dev/null @@ -1,4 +0,0 @@ -"C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\tf" get m:\source cosmos /force /recursive -pause - - diff --git a/Users/Kudzu/Hive/Kudzu.Hive/Class1.cs b/Users/Kudzu/Hive/Kudzu.Hive/Class1.cs deleted file mode 100644 index 6ec8df1fe1..0000000000 --- a/Users/Kudzu/Hive/Kudzu.Hive/Class1.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Kudzu.Hive { - - // This is a dummy library which allows me to keep the hive hardcoded - // to my path. Other users can clone this for their use in their areas. - - public class Class1 { - } -} diff --git a/Users/Kudzu/Hive/Kudzu.Hive/Kudzu.Hive.csproj b/Users/Kudzu/Hive/Kudzu.Hive/Kudzu.Hive.csproj deleted file mode 100644 index a8e5614d9e..0000000000 --- a/Users/Kudzu/Hive/Kudzu.Hive/Kudzu.Hive.csproj +++ /dev/null @@ -1,91 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {8E71FA9E-BB28-4B34-AB11-729E33B8C8E6} - Library - Properties - Kudzu.Hive - Kudzu.Hive - v4.7.1 - 512 - - - true - bin\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - diff --git a/Users/Kudzu/Hive/Kudzu.Hive/Properties/AssemblyInfo.cs b/Users/Kudzu/Hive/Kudzu.Hive/Properties/AssemblyInfo.cs deleted file mode 100644 index 1b9e805292..0000000000 --- a/Users/Kudzu/Hive/Kudzu.Hive/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("Kudzu.Hive")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Kudzu.Hive")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[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("9d34bed3-a1b8-401a-94c0-92d4dc34d02a")] - -// 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/Users/Kudzu/Kudzu-Notes.html b/Users/Kudzu/Kudzu-Notes.html deleted file mode 100644 index 288219fb3c..0000000000 --- a/Users/Kudzu/Kudzu-Notes.html +++ /dev/null @@ -1,160 +0,0 @@ - - - -

General list of stuff left to do...

-
    -
  • ATA / FAT -
      -
    • Extend System.IO plugs so FAT16/32 etc. can be used
    • -
    -
  • -
  • X# -
      -
    • use includes for compiling nasm
    • -
    • AL = ComRead8()
    • -
    • ComWrite(AL)
    • -
    • Code completion
    • -
    -
  • -
  • Plugs -
      -
    • Allow plug attrib to specify asm name and link to X# directly.
    • -
    • warn if plugging something that doesnt exists... caused the x08 bug?
    • -
    • (joint with Kudzu) - Move all critical plugs out of old asms and remove building of old asms. -
        -
      • And the plugs also from CustomImplementations in IL2CPU?
      • -
      -
    • -
    • Source Plugs - Leave as they are
    • -
    • Assembly Plugs - Change to have attribute on the TARGET instead of the implementation and only allow assembly.. this cuts out the "proxy" class and makes it easier to find plug impls. See Rings.html for more info. The assembly level plugs can even go in the same assembly, source file and if we can the same class? That is currently these assembly plugs require 3 classes to implement. its ugly and messy... we can get it down to 2 - 1 + assembly (X# only!). Current way is such a mess we even comment them as plugged, but then have to go guessing where the impl is... See example down below....
    • -
    • Convert all source plugs and disable old attributes...so for new ones use new names
    • -
    • int j = Array.IndexOf(Digits, s[i]); -
        -
      • When Digits is a char array, we get a plug needed error.
      • -
      -
    • -
    • We need to dynamically load the plugs etc so we can just rebuild and run and even trace them without rerunning the bat for each change
    • -
    • tohex plug based on string input of X8 etc
    • -
    -
  • -
  • OutputDebug Catcher with filters, categories, timestamps
  • -
  • Debug Stub -
      -
    • Increase speed of DebugStub
    • -
    -
  • -
  • Compile / Build speed. Current slow areas. Time each of these. -
      -
    • IL2CPUTask
    • -
    • xScanner.Execute(xInitMethod); - This used to be faster... something has slowed this down. What?
    • -
    • Cosmos.Debug.Common - new DebugInfo(xOutputFilename + ".mdf", true) - Takes longer than Id like. But its SQL... not sure if we can do much. Maybe could do a copy of raw file? Or is the problem SQL local startup time? If so would using express solve this?
    • -
    • ExtractMapFromElfFile - SQL is slow on inserts. Only store GUID labels. Add .asm file position and when we need a label in between, parse just those parts of ASM to get them. Also if we do this, probably dont need to store actual label name at all.
    • -
    -
  • -
  • Watches and Locals -
      -
    • Locals that can understand more types / see deeper into more than just the this object -
    • Watches that can get data for a specified memory address (memory watches)
    • -
    • Watches that can see locals
    • -
    • Watches/hover-over-objects that can see for than just locals
    • -
    -
  • -
  • Ring attributes and enforcement -
      -
    • Also allow restriction of assembly references
    • -
    • Only allow core to be /unsafe, no others
    • -
    -
  • -
  • Ring restrictions on console etc.. by class, or explict inclusion
  • -
  • PIT/RTC -
      -
    • And sleep, needed for ATA
    • -
    -
  • -
  • Bootstrap - clean up more
  • -
  • Networking
  • -
  • GC
  • -
  • Scanner issue: http://groups.yahoo.com/group/Cosmos-Dev/message/4789
  • -
  • Unsafe arrays but controlled
  • -
-

Matthijs

-
    -
  • C# for menus
  • -
  • Debug VS on Cosmos menu
  • -
  • Throw exception on null ref...
  • -
  • Exceptions dont work. Try int.parse("asdf"). It runs but when the exception is hit we get garbage back instead. (ie exceptions through plug proxy dont work)
  • -
  • IL2CPU.AlwaysCompile attribute and get rid of IDT.Dummy
  • -
  • cxdb contains full asm path and filenames over and over... cant we write them out once and use a byte/word index to identify them? This will make it smaller and make reading faster.
  • -
-

Later

-
    -
  • localloc - int.parse needs plug for now because of this.
  • -
  • Filesystem
  • -
  • Memory Manager -
      -
    • http://www.osdever.net/tutorials/view/memory-management-1
    • -
    • http://www.osdever.net/tutorials/view/memory-management-2
    • -
    -
  • -
  • UDP
  • -
  • TCP
  • -
  • Cosmos.Debug.Common - much in here is not common and should be moved to - VSDebug.. Add  Readme.html that NASM and VSDebug use what's left
  • -
  • foreach / interfaces
  • -
-

Even Later

-
    -
  • USB
  • -
-

Assembly Plug Example

-

Old way

-

(3 classes, often 3 source files as well)

-
-				public class CPUBus 
-				{
-					// Plugged
-					public static void Write8(UInt16 aPort, byte aData) { }
-					...
-
-					[Plug(Target = typeof(Cosmos.Kernel.CPUBus))]
-					class CPUBus { 
-					[PlugMethod(Assembler = typeof(Assemblers.IOWrite8))]
-					public static void Write8(UInt16 aPort, byte aData) { }
-					...
-
-					public sealed class IOWrite8: AssemblerMethod 
-					{ 
-						public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) 
-						{ 
-							//TODO: This is a lot of work to write to a single port. We need to have some kind of inline ASM option that can emit a single out instruction 
-							new CPUx86.Move { DestinationReg = CPUx86.Registers.EDX, SourceReg = CPUx86.Registers.EBP, SourceDisplacement = 0xC, SourceIsIndirect = true };
-							new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.EBP, SourceDisplacement = 0x8, SourceIsIndirect = true };
-							new CPUx86.Out { DestinationReg = CPUx86.Registers.AL }; 
-						}
-					} 
-					...
-			
-

New way

-

See how much neater and self contained this is? :)

-
-				public class CPUBus 
-				{   
-					[AsmBody(Assembler = typeof(IOWrite8))]
-					public static void Write8(UInt16 aPort, byte aData) { }
-
-					// Nested class even... :) Keeps it all in one unit!
-					public class IOWrite8 : CodeBlock 
-					{
-						public override void Assemble() 
-						{
-							EDX = EBP + 0x0C;
-							EAX = EBP + 0x08;
-							Port[DX] = AL;
-						}
-					}
-				}     
-			
- - - - \ No newline at end of file diff --git a/Users/Kudzu/MemDisk End.bat b/Users/Kudzu/MemDisk End.bat deleted file mode 100644 index d789bc8107..0000000000 --- a/Users/Kudzu/MemDisk End.bat +++ /dev/null @@ -1,12 +0,0 @@ -del m:\temp\*.* /S /Q /F -rmdir m:\temp - -REM Have to copy all, not just archived, else deleted files will reappear on boot -del D:\MemDisk\*.* /S /Q /F -REM Get the pesky .suo files -del D:\MemDisk\*.* /S /Q /F /A:H - -xcopy m:\*.* D:\MemDisk\ /E /K /H /R /Q - -pause - diff --git a/Users/Kudzu/MemDisk Start.bat b/Users/Kudzu/MemDisk Start.bat deleted file mode 100644 index e5d6fadcd5..0000000000 --- a/Users/Kudzu/MemDisk Start.bat +++ /dev/null @@ -1,7 +0,0 @@ -imdisk -d -m M: -imdisk -a -s 1G -m M: -p "/fs:NTFS /V:MemDisk /q /y" - -mkdir m:\Temp - -xcopy D:\MemDisk\*.* m:\*.* /E /K /H /R /Q -REM attrib -A M:\ /S /D diff --git a/Users/Kudzu/Old-IDANotes.html b/Users/Kudzu/Old-IDANotes.html deleted file mode 100644 index 41dee21c73..0000000000 --- a/Users/Kudzu/Old-IDANotes.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - Untitled Page - - - -
// To use IDA 
-// -Turn on GDB for target project 
-// -Run 
-// -If builder is currently broken, follow these manual steps instead: 
-// -Build target project 
-// -Start VMWare or QEMU 
-// -\Build\Run QEMU Manually for IDA.bat
-// -NOTE: This bat is hardcoded for Kudzu.Breakpoints to run
-// -IDA Method 1 - No symbols // -Debugger, Attach, Remote GDB, 127.0.0.1:1234, Select ID 0 // -IDA Method 2 - Symbols // -File, Open. \source2\Users\Kudzu\Breakpoints\bin\Debug\CosmosKernel.obj, Open // -Select ELF, Click OK // -Debugger, Select Debugger (F9) // -Remote GDB Debugger (Can also check set as default debugger), OK // -Run or step 
- - diff --git a/Users/LWatson/AssemblyInfo.cs b/Users/LWatson/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/LWatson/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/LWatson/FileSystem.cs b/Users/LWatson/FileSystem.cs deleted file mode 100644 index dd3956c4be..0000000000 --- a/Users/LWatson/FileSystem.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FS = Cosmos.System.Filesystem.FAT.FatFileSystem; -namespace LWatson -{ - public class FileSystem - { - // Currently we map to the Windows scheme of single lettter: for drives. Cosmos will - // NOT do this in the future, but it will be able to map paths to things that look like - // drive letters for compatibility with Windows code. - // For now we use Dictionary for simplicity, but in future this will change. - //static protected Dictionary mMappings = new Dictionary(); - - static protected Mapping[] mFS; - protected class Mapping - { - - // public string CosmosKey; - public string Key; - - public FS FileSystem; - public Mapping(string k, FS f = default(FS)) - { - this.Key = k; - this.FileSystem = f; - } - } - static bool doneInit = false; - static void Init() - { - string[] wrk = "C,D,E,F,G,H,I,J,K,L,M,N,O.P,Q,R,S,T,U,V,W,X,Y,Z,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1,N1,O.P1,Q1,R1,S1,T1,U1,V1,W1,X1,Y1,Z1,".Split(new char[] {','}); - mFS = new Mapping[wrk.Length]; - for (int i = 0; i < wrk.Length; i++) mFS[i] = new Mapping(wrk[i]); - doneInit = true; - } - static public void AddMapping(FS aFileSystem) - { - if (!doneInit) Init(); - int p = 0; - while (mFS[p].FileSystem != default(FS)) p++; - if (p < mFS.Length) mFS[p].FileSystem = aFileSystem; - } - static public FS GetMapping(string aPath) - { - for (int i = 0; i < 78; i++) - { - if (mFS[i].Key == aPath) return mFS[i].FileSystem; - } - return default(FS); - } - } -} diff --git a/Users/LWatson/Kernel.cs b/Users/LWatson/Kernel.cs deleted file mode 100644 index c86b457d9e..0000000000 --- a/Users/LWatson/Kernel.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Sys = Cosmos.System; -using Cosmos.Debug.Kernel; -using Cosmos.Common; -using Cosmos.Hardware.BlockDevice; -using FAT = Cosmos.System.Filesystem.FAT; - -namespace LWatson -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Console.WriteLine("Running Array.Copy Test"); - char[] arr1 = new char[] { 'a', 'b', 'c' }; - char[] arr2 = new char[(long)Int32.MaxValue + 3]; - Array.Copy(arr1, (long)0, arr2, Int32.MaxValue, 3); - Console.WriteLine("Element at index int32.MaxValue + 2: " + arr2[(long)Int32.MaxValue + 2]); - Console.WriteLine("Running TestATA"); - TestATA(); - // var l = fs.GetRoot(); - - Console.Write("Input: "); - var input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); - } - protected void TestATA() - { - #region Comment(OLD) - /* - try - { - Console.WriteLine(); - Console.WriteLine("Block devices found: " + BlockDevice.Devices.Count); - - AtaPio xATA = null; - for (int i = 0; i < BlockDevice.Devices.Count; i++) - { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is AtaPio) - { - xATA = (AtaPio)xDevice; - } - } - Console.WriteLine("--------------------------"); - Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - Console.WriteLine("Serial No: " + xATA.SerialNo); - Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - Console.WriteLine("Model No: " + xATA.ModelNo); - Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - Console.WriteLine("Size: " + xATA.BlockCount * xATA.BlockSize / 1024 / 1024 + " MB"); - - //Partition xPartition = null; - //for (int i = 0; i < BlockDevice.Devices.Count; i++) - //{ - // var xDevice = BlockDevice.Devices[i]; - // if (xDevice is Partition) - // { - // xPartition = (Partition)xDevice; - // } - //} - - //var xFS = new FAT.FatFileSystem(xPartition); - //Sys.Filesystem.FileSystem.AddMapping("C", xFS); - - //Console.WriteLine(); - //Console.WriteLine("Root directory"); - //var xListing = xFS.GetRoot(); - //FAT.Listing.FatFile xRootFile = null; - //FAT.Listing.FatFile xKudzuFile = null; - //for (int i = 0; i < xListing.Count; i++) - //{ - // var xItem = xListing[i]; - // if (xItem is Sys.Filesystem.Listing.Directory) - // { - // Console.WriteLine("<" + xListing[i].Name + ">"); - // } - // else if (xItem is Sys.Filesystem.Listing.File) - // { - // Console.WriteLine(); - // Console.WriteLine(xListing[i].Name); - // Console.WriteLine(xListing[i].Size); - // if (xListing[i].Name == "Root.txt") - // { - // xRootFile = (FAT.Listing.FatFile)xListing[i]; - // } - // else if (xListing[i].Name == "Kudzu.txt") - // { - // xKudzuFile = (FAT.Listing.FatFile)xListing[i]; - // } - // } - //} - - //{ - // var xStream = new Sys.Filesystem.FAT.FatStream(xRootFile); - // var xData = new byte[xRootFile.Size]; - // xStream.Read(xData, 0, (int)xRootFile.Size); - // var xText = Encoding.ASCII.GetString(xData); - // Console.WriteLine(xText); - //} - - //{ - // Console.WriteLine(); - // Console.WriteLine("StreamReader"); - // var xStream = new Sys.Filesystem.FAT.FatStream(xRootFile); - // var xReader = new System.IO.StreamReader(xStream); - // string xText = xReader.ReadToEnd(); - // Console.WriteLine(xText); - //} - - //var xKudzuStream = new Sys.Filesystem.FAT.FatStream(xKudzuFile); - //var xKudzuData = new byte[xKudzuFile.Size]; - //xKudzuStream.Read(xKudzuData, 0, (int)xKudzuFile.Size); - - //string xLower = "Hello"; - //Console.WriteLine(xLower.ToUpper()); - //Console.WriteLine(xLower.ToLower()); - - //var xFile = new System.IO.FileStream(@"c:\Root.txt", System.IO.FileMode.Open); - - //int dummy = 42; - - //var xWrite = new byte[512]; - //for (int i = 0; i < 512; i++) - //{ - // xWrite[i] = (byte)i; - //} - //xATA.WriteBlock(0, 1, xWrite); - - //var xRead = xATA.NewBlockArray(1); - //xATA.ReadBlock(0, 1, xRead); - //string xDisplay = ""; - //for (int i = 0; i < 512; i++) - //{ - // xDisplay = xDisplay + xRead[i].ToHex(); - //} - //Console.WriteLine(xDisplay); - - } - catch (Exception e) - { - Console.WriteLine("Exception: " + e.Message); - Stop(); - }*/ - #endregion - try - { - - Console.WriteLine(); - Console.WriteLine("Block devices found: " + BlockDevice.Devices.Count); - - AtaPio xATA = null; - for (int i = 0; i < BlockDevice.Devices.Count; i++) - { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is AtaPio) - { - xATA = (AtaPio)xDevice; - } - } - - //Info - Console.WriteLine("--------------------------"); - Console.WriteLine("Type: " + (xATA.DriveType == AtaPio.SpecLevel.ATA ? "ATA" : "ATAPI")); - Console.WriteLine("Serial No: " + xATA.SerialNo); - Console.WriteLine("Firmware Rev: " + xATA.FirmwareRev); - Console.WriteLine("Model No: " + xATA.ModelNo); - Console.WriteLine("Block Size: " + xATA.BlockSize + " bytes"); - Console.WriteLine("Size: " + xATA.BlockCount * xATA.BlockSize / 1024 / 1024 + " MB"); - - //Partition Detecting - Partition xPartition = null; - if (BlockDevice.Devices.Count > 0) - { - for (int i = 0; i < BlockDevice.Devices.Count; i++) - { - var xDevice = BlockDevice.Devices[i]; - if (xDevice is Partition) - { - xPartition = (Partition)xDevice; - - Console.WriteLine("FAT FS"); - var xFS = new FAT.FatFileSystem(xPartition); - - Console.WriteLine("Mapping..."); - FileSystem.AddMapping(xFS); - - - Console.WriteLine(); - Console.WriteLine("Root directory"); - - var xListing = xFS.GetRoot(); - FAT.Listing.FatFile xRootFile = null; - FAT.Listing.FatFile xKudzuFile = null; - - var xFile = default(FAT.Listing.FatFile); - for (int j = 0; j < xListing.Count; j++) - { - var xItem = xListing[j]; - if (xItem is Sys.Filesystem.Listing.Directory) - { - //Detecting Dir in HDD - Console.WriteLine(" " + xListing[j].Name); - } - else if (xItem is Sys.Filesystem.Listing.File) - { - //Detecting File in HDD - Console.WriteLine(" " + xListing[j].Name + " (" + xListing[j].Size + ")"); - if (xListing[j].Name == "Root.txt") - { - xRootFile = (FAT.Listing.FatFile)xListing[j]; - } - else if (xListing[j].Name == "Kudzu.txt") - { - xKudzuFile = (FAT.Listing.FatFile)xListing[j]; - } - else if (xListing[j].Name == "Amanp.txt") xFile = (FAT.Listing.FatFile)xListing[j]; - } - } - - try - { - Console.WriteLine(); - Console.WriteLine("StreamReader - Root File"); - var xStream = new Sys.Filesystem.FAT.FatStream(xRootFile); - var xData = new byte[xRootFile.Size]; - xStream.Read(xData, 0, (int)xRootFile.Size); - var xText = Encoding.ASCII.GetString(xData); - Console.WriteLine(xText); - } - catch (Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - - var xKudzuStream = new Sys.Filesystem.FAT.FatStream(xKudzuFile); - var xKudzuData = new byte[xKudzuFile.Size]; - xKudzuStream.Read(xKudzuData, 0, (int)xKudzuFile.Size); - - if (xFile != null) - { - //var xFs = new Sys.Filesystem.FAT.FatStream(xFile); - //xFs.Write(new byte[1024], 0, 1024); - } - - - } - } - } - else - { - Console.WriteLine("No Block Device Found! "); - } - } - catch (Exception e) - { - Console.WriteLine("Error: " + e.Message); - } - } - } -} diff --git a/Users/LWatson/LWatsonBoot.Cosmos b/Users/LWatson/LWatsonBoot.Cosmos deleted file mode 100644 index 4417e64904..0000000000 --- a/Users/LWatson/LWatsonBoot.Cosmos +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - 2.0 - {472c46f6-c64c-4d71-b5ec-e6bd4ba164ce} - false - LWatsonBoot - elf - v4.6.2 - SAK - SAK - SAK - SAK - - - VMware - - true - Source - User - False - false - Player - bin\Debug\ - LWatsonBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - - - - - - - - Cosmos.Core_Plugs - {d9a87aad-fcc9-4517-b31d-e904dad00784} - True - - - LWatson - {3b82bb82-56c4-4449-ab24-47770ec3293e} - True - - - - - diff --git a/Users/Matthijs/.editorconfig b/Users/Matthijs/.editorconfig deleted file mode 100644 index 26b6c1c31a..0000000000 --- a/Users/Matthijs/.editorconfig +++ /dev/null @@ -1,4 +0,0 @@ -; 4-column space indentation -[*.cs] -indent_style = space -indent_size = 4 \ No newline at end of file diff --git a/Users/Matthijs/DebugCompiler/DebugCompiler.csproj b/Users/Matthijs/DebugCompiler/DebugCompiler.csproj deleted file mode 100644 index f324d5bddf..0000000000 --- a/Users/Matthijs/DebugCompiler/DebugCompiler.csproj +++ /dev/null @@ -1,110 +0,0 @@ - - - - Debug - Any CPU - 8.0.30703 - 2.0 - {3720749F-1519-4A35-B944-FF05AD01F8DC} - Library - Properties - DebugCompiler - DebugCompiler - v4.7.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - false - prompt - MinimumRecommendedRules.ruleset - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\x86\Debug\ - DEBUG;TRACE - full - x86 - false - prompt - MinimumRecommendedRules.ruleset - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - - ..\..\..\Resources\Dependencies\NUnit\nunit.framework.dll - - - - - - - - - - - - - - - - - - - - {758FAF24-9974-4DB8-82EF-1B64DAF2F0BC} - Cosmos.TestRunner.Core - - - - - - - - diff --git a/Users/Matthijs/DebugCompiler/MyEngine.cs b/Users/Matthijs/DebugCompiler/MyEngine.cs deleted file mode 100644 index d7b11bda7a..0000000000 --- a/Users/Matthijs/DebugCompiler/MyEngine.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.IO; -using Cosmos.Build.Common; -using Cosmos.TestRunner.Core; -using NUnit.Framework; - -namespace DebugCompiler -{ - [TestFixture] - public class RunKernels - { - [TestCaseSource(typeof(MySource), nameof(MySource.ProvideData))] - public void Test(Type kernelToRun) - { - try - { - Environment.CurrentDirectory = Path.GetDirectoryName(typeof(RunKernels).Assembly.Location); - - var xEngine = new Engine(); - - // Sets the time before an error is registered. For example if set to 60 then if a kernel runs for more than 60 seconds then - // that kernel will be marked as a failure and terminated - xEngine.AllowedSecondsInKernel = 1200; - - // If you want to test only specific platforms, add them to the list, like next line. By default, all platforms are run. - xEngine.RunTargets.Add(RunTargetEnum.Bochs); - - //xEngine.StartBochsDebugGui = false; - //xEngine.RunWithGDB = true; - // If you're working on the compiler (or other lower parts), you can choose to run the compiler in process - // one thing to keep in mind though, is that this only works with 1 kernel at a time! - //xEngine.RunIL2CPUInProcess = true; - xEngine.TraceAssembliesLevel = TraceAssemblies.User; - - xEngine.EnableStackCorruptionChecks = true; - xEngine.StackCorruptionChecksLevel = StackCorruptionDetectionLevel.AllInstructions; - - // Select kernels to be tested by adding them to the engine - xEngine.AddKernel(kernelToRun.Assembly.Location); - - xEngine.OutputHandler = new TestOutputHandler(); - - Assert.IsTrue(xEngine.Execute()); - } - catch (AssertionException) - { - throw; - } - catch(Exception E) - { - Console.WriteLine("Exception occurred: " + E.ToString()); - Assert.Fail(); - } - } - - private class TestOutputHandler : OutputHandlerFullTextBase - { - protected override void Log(string message) - { - TestContext.WriteLine(String.Concat(DateTime.Now.ToString("hh:mm:ss.ffffff "), new String(' ', mLogLevel * 2), message)); - } - } - } -} diff --git a/Users/Matthijs/DebugCompiler/MySource.cs b/Users/Matthijs/DebugCompiler/MySource.cs deleted file mode 100644 index 335a567531..0000000000 --- a/Users/Matthijs/DebugCompiler/MySource.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using Cosmos.TestRunner.Core; -using NUnit.Framework; -using NUnit.Framework.Interfaces; - -namespace DebugCompiler -{ - public static class MySource - { - public static IEnumerable ProvideData() - { - return TestKernelSets.GetStableKernelTypes(); - } - } -} diff --git a/Users/Matthijs/DebugCompiler/Properties/AssemblyInfo.cs b/Users/Matthijs/DebugCompiler/Properties/AssemblyInfo.cs deleted file mode 100644 index 5923de9e1b..0000000000 --- a/Users/Matthijs/DebugCompiler/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("DebugCompiler")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DebugCompiler")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[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("43b8e76a-d735-42d5-a417-e4028b48225c")] - -// 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/Users/Matthijs/DebugCompiler/app.config b/Users/Matthijs/DebugCompiler/app.config deleted file mode 100644 index ac5ac47872..0000000000 --- a/Users/Matthijs/DebugCompiler/app.config +++ /dev/null @@ -1,34 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Matthijs/Playground/Kernel.cs b/Users/Matthijs/Playground/Kernel.cs deleted file mode 100644 index e5c362e6ac..0000000000 --- a/Users/Matthijs/Playground/Kernel.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using Sys = Cosmos.System; - -namespace Playground -{ - public class Kernel : Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - - - protected override void Run() - { - //Console.WriteLine("Started"); - ////Console.ForegroundColor = ConsoleColor.Red; - ////Console.BackgroundColor=ConsoleColor.DarkYellow; - ////Console.WriteLine("Rood op donker geel!"); - ////Console.ReadLine(); - ////Console.WriteLine("Done"); - - //try - //{ - // Console.Write(""); - //} - //catch(Exception E) - //{ - // Console.WriteLine("Error occurred!"); - // Console.Write("Error: "); - // Console.WriteLine(E.Message); - //} - //Console.WriteLine("Done."); - //while (true) - // ; - Array1(); - Array2(); - Array4(); - Array8(); - } - - private void Array1() - { - var xArray = new byte[4]; - xArray[1] = 4; - var xTest = xArray[2]; - } - - private void Array2() - { - var xArray = new short[4]; - xArray[1] = 4; - var xTest = xArray[2]; - } - - private void Array4() - { - var xArray = new int[4]; - xArray[1] = 4; - var xTest = xArray[2]; - } - - private void Array8() - { - var xArray = new ulong[4]; - xArray[1] = 0x0102030405060708; - var xTest = xArray[2]; - } - } -} diff --git a/Users/Matthijs/Playground/Playground.csproj b/Users/Matthijs/Playground/Playground.csproj deleted file mode 100644 index ca0410c714..0000000000 --- a/Users/Matthijs/Playground/Playground.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {8E3537CB-D0F9-4CFB-AE6F-72B465CA03F6} - Library - Properties - Playground - Playground - v4.7.1 - 512 - - - - - true - bin\Debug\ - x64 - MinimumRecommendedRules.ruleset - DEBUG;TRACE - - - true - bin\Debug\ - x86 - MinimumRecommendedRules.ruleset - DEBUG;TRACE - - - true - bin\Debug\ - AnyCPU - MinimumRecommendedRules.ruleset - DEBUG;TRACE - prompt - - - - - - - - - - - diff --git a/Users/Matthijs/Playground/PlaygroundBoot.Cosmos b/Users/Matthijs/Playground/PlaygroundBoot.Cosmos deleted file mode 100644 index 349c94f326..0000000000 --- a/Users/Matthijs/Playground/PlaygroundBoot.Cosmos +++ /dev/null @@ -1,124 +0,0 @@ - - - - Debug - 2.0 - {7d29d57d-a78b-4e67-bbc3-df84bd10fc6d} - false - PlaygroundBoot - elf - v4.6.2 - - - VMware - True - Source - User - False - False - Workstation - bin\Debug\ - PlaygroundBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - All - PlaygroundBoot - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - True - Source - Pipe: Cosmos\Serial - Workstation - bin\Debug\ - All - False - False - True - True - PlaygroundBoot - Makes a USB device such as a flash drive or external hard disk bootable. - USB - None - False - True - Source - Pipe: Cosmos\Serial - Workstation - bin\Debug\ - All - False - False - PlaygroundBoot - Creates a PXE setup and hosts a DCHP and TFTP server to deploy directly to physical hardware. Allows debugging with a serial cable. - PXE - None - False - True - Source - Pipe: Cosmos\Serial - Workstation - bin\Debug\ - All - False - False - PlaygroundBoot - Creates a bootable ISO image which can be burned to a DVD. After running the selected project, an explorer window will open containing the ISO file. The ISO file can then be burned to a CD or DVD and used to boot a physical or virtual system. - ISO - None - False - True - Source - Pipe: Cosmos\Serial - Workstation - bin\Debug\ - All - False - False - Workstation - Pipe: Cosmos\Serial - Serial: COM1 - Source - True - True - IntelEdison - BinaryImage - Connect to Intel Edison device to deploy and debug. - Bochs User 001 - bin\Debug\ - All - False - False - Serial: COM1 - Serial: COM1 - Serial: COM1 - Serial: COM1 - True - PlaygroundBoot - Use Bochs emulator to deploy and debug. - ISO - Bochs - False - False - Source - Serial: COM1 - Pipe: Cosmos\Serial - Workstation - bin\Debug\ - All - False - False - True - True - - - - Playground - {8e3537cb-d0f9-4cfb-ae6f-72b465ca03f6} - True - - - - diff --git a/Users/Matthijs/Playground/Properties/AssemblyInfo.cs b/Users/Matthijs/Playground/Properties/AssemblyInfo.cs deleted file mode 100644 index d0453d8fa5..0000000000 --- a/Users/Matthijs/Playground/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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. -using Cosmos.Common; - -[assembly: AssemblyTitle("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - -[assembly: Ring(Ring.User)] \ No newline at end of file diff --git a/Users/Matthijs/PlaygroundCore/PlaygroundCore.csproj b/Users/Matthijs/PlaygroundCore/PlaygroundCore.csproj deleted file mode 100644 index 047047096b..0000000000 --- a/Users/Matthijs/PlaygroundCore/PlaygroundCore.csproj +++ /dev/null @@ -1,84 +0,0 @@ - - - - - Debug - x86 - {AB869246-4887-4117-851D-766EB9FF1E29} - Library - Properties - PlaygroundCore - PlaygroundCore - v4.7.1 - 512 - - - true - bin\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - diff --git a/Users/Matthijs/PlaygroundCore/Properties/AssemblyInfo.cs b/Users/Matthijs/PlaygroundCore/Properties/AssemblyInfo.cs deleted file mode 100644 index de0f5974b1..0000000000 --- a/Users/Matthijs/PlaygroundCore/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,40 +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. -using Cosmos.Common; - -[assembly: AssemblyTitle("PlaygroundCore")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PlaygroundCore")] -[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("996f9b93-1f08-4f5b-9ab1-ad5c6de729b2")] - -// 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: Ring(Ring.Core)] diff --git a/Users/Matthijs/PlaygroundHAL/HALGlobal.cs b/Users/Matthijs/PlaygroundHAL/HALGlobal.cs deleted file mode 100644 index c9cf7a901e..0000000000 --- a/Users/Matthijs/PlaygroundHAL/HALGlobal.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.CodeDom; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Cosmos.Core; - -namespace PlaygroundHAL -{ - public static class HALGlobal - { - public static void Test() - { - //Heap.SendStatsToDebugger(); - //Heap.SendStatsToDebugger(); - new object(); - new object(); - new object(); - new object(); - new object(); - - - //Heap.SendStatsToDebugger(); - - } - } -} diff --git a/Users/Matthijs/PlaygroundHAL/PlaygroundHAL.csproj b/Users/Matthijs/PlaygroundHAL/PlaygroundHAL.csproj deleted file mode 100644 index 7b3e0ce5b6..0000000000 --- a/Users/Matthijs/PlaygroundHAL/PlaygroundHAL.csproj +++ /dev/null @@ -1,91 +0,0 @@ - - - - - Debug - x86 - {E978986A-8160-4979-919E-F099A43EF146} - Library - Properties - PlaygroundHAL - PlaygroundHAL - v4.7.1 - 512 - - - true - bin\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - {AB869246-4887-4117-851D-766EB9FF1E29} - PlaygroundCore - - - - - diff --git a/Users/Matthijs/PlaygroundHAL/Properties/AssemblyInfo.cs b/Users/Matthijs/PlaygroundHAL/Properties/AssemblyInfo.cs deleted file mode 100644 index e509131d45..0000000000 --- a/Users/Matthijs/PlaygroundHAL/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,40 +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. -using Cosmos.Common; - -[assembly: AssemblyTitle("PlaygroundHAL")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PlaygroundHAL")] -[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("8a3a2639-a13b-4550-86e0-aca62cde3c00")] - -// 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: Ring(Ring.HAL)] \ No newline at end of file diff --git a/Users/Matthijs/PlaygroundSystem/OurKernel.cs b/Users/Matthijs/PlaygroundSystem/OurKernel.cs deleted file mode 100644 index 43f42146b3..0000000000 --- a/Users/Matthijs/PlaygroundSystem/OurKernel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Cosmos.HAL; -using Cosmos.System; -using PlaygroundHAL; - -namespace PlaygroundSystem -{ - public abstract class OurKernel: Kernel - { - protected override TextScreenBase GetTextScreen() - { - return new DebugTextScreen(); - } - - public void DoIt() - { - } - } -} diff --git a/Users/Matthijs/PlaygroundSystem/PlaygroundSystem.csproj b/Users/Matthijs/PlaygroundSystem/PlaygroundSystem.csproj deleted file mode 100644 index d8f85e4168..0000000000 --- a/Users/Matthijs/PlaygroundSystem/PlaygroundSystem.csproj +++ /dev/null @@ -1,92 +0,0 @@ - - - - - Debug - x86 - {82F6DDA3-E45D-4E7A-AA09-85FC2EDE2F76} - Library - Properties - PlaygroundSystem - PlaygroundSystem - v4.7.1 - 512 - - - true - bin\Debug\ - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - {E978986A-8160-4979-919E-F099A43EF146} - PlaygroundHAL - - - - - diff --git a/Users/Matthijs/PlaygroundSystem/Properties/AssemblyInfo.cs b/Users/Matthijs/PlaygroundSystem/Properties/AssemblyInfo.cs deleted file mode 100644 index 7581b91c01..0000000000 --- a/Users/Matthijs/PlaygroundSystem/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,41 +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. -using Cosmos.Common; - -[assembly: AssemblyTitle("PlaygroundSystem")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PlaygroundSystem")] -[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("acfbac92-6a74-4b2b-8fe9-2f331f830d42")] - -// 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: Ring(Ring.System)] \ No newline at end of file diff --git a/Users/Matthijs/PlaygroundSystem/SystemGlobal.cs b/Users/Matthijs/PlaygroundSystem/SystemGlobal.cs deleted file mode 100644 index 7a1f4d75a7..0000000000 --- a/Users/Matthijs/PlaygroundSystem/SystemGlobal.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Cosmos.Debug.Kernel; -using Cosmos.HAL; -using Cosmos.HAL.Drivers.PCI.Network; -using Cosmos.System.Network; -using Cosmos.System.Network.IPv4; -using PlaygroundHAL; - -namespace PlaygroundSystem -{ - public class SystemGlobal - { - public static void Execute() - { - new Debugger("test", "test").Break(); - new Debugger("test", "test").SendMessageBox(""); - HALGlobal.Test(); - //Console.WriteLine("Finding PCI device"); - //var xNicDev = PCI.GetDevice(0x1022, 0x2000); - //if (xNicDev == null) - //{ - // Console.WriteLine(" Not found!!"); - // return; - //} - - //var xNicDevNormal = xNicDev as PCIDeviceNormal; - //if (xNicDevNormal == null) - //{ - // Console.WriteLine(" Unable to cast as PCIDeviceNormal!"); - // return; - //} - //var xNic = new AMDPCNetII(xNicDevNormal); - //NetworkStack.Init(); - //xNic.Enable(); - //NetworkStack.ConfigIP(xNic, new Config(new Address(192, 168, 17, 100), new Address(255, 255, 255, 0))); - - //var xClient = new UdpClient(15); - //xClient.Connect(new Address(192, 168, 17, 1), 25); - //xClient.Send(new byte[] - // { - // 1, - // 2, - // 3, - // 4, - // 5, - // 6, - // 7, - // 8, - // 9, - // 0xAA, - // 0xBB, - // 0xCC, - // 0xDD, - // 0xEE, - // 0xFF - // }); - - //while (true) - //{ - // NetworkStack.Update(); - - // Console.WriteLine("Done"); - // Console.ReadLine(); - //} - } - } -} diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/AssemblerMethod.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/AssemblerMethod.cs deleted file mode 100644 index a2cc626c1b..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/AssemblerMethod.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace IL2CPU.API { - public abstract class AssemblerMethod - { - public abstract void AssembleNew(object aAssembler, object aMethodInfo); - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/Cosmos.IL2CPU.Plugs.csproj b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/Cosmos.IL2CPU.Plugs.csproj deleted file mode 100644 index d17fc7c94e..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/Cosmos.IL2CPU.Plugs.csproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - Debug - Any CPU - 9.0.30729 - 2.0 - {CDDAF88B-8726-469A-B906-16FD5EC99799} - Library - Properties - IL2CPU.API - IL2CPU.API - v4.7.1 - 512 - Client - SAK - SAK - SAK - SAK - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/FieldAccessAttribute.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/FieldAccessAttribute.cs deleted file mode 100644 index 73f2b5d7f4..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/FieldAccessAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace IL2CPU.API -{ - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class FieldAccessAttribute: Attribute { - public string Name; - } -} diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugAttribute.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugAttribute.cs deleted file mode 100644 index 14c8223ba6..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace IL2CPU.API -{ - [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] - public sealed class PlugAttribute : Attribute { - public Type Target; - public bool Inheritable = false; - public string TargetName; - public bool IsMonoOnly = false; - public bool IsMicrosoftdotNETOnly = false; - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugFieldAttribute.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugFieldAttribute.cs deleted file mode 100644 index 5aadf12ab5..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugFieldAttribute.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace IL2CPU.API -{ - [AttributeUsage(AttributeTargets.Class, AllowMultiple=true)] - public sealed class PlugFieldAttribute: Attribute { - public PlugFieldAttribute() { - } - - public string FieldId { - get; - set; - } - - public bool IsExternalValue { - get; - set; - } - - public Type FieldType { - get; - set; - } - - public bool IsMonoOnly = false; - public bool IsMicrosoftdotNETOnly = false; - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugMethodAttribute.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugMethodAttribute.cs deleted file mode 100644 index 9afcd9957d..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/PlugMethodAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace IL2CPU.API -{ - [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] - public sealed class PlugMethodAttribute: Attribute { - public string Signature = null; - public bool Enabled = true; - public Type Assembler = null; - public bool IsMonoOnly = false; - public bool IsMicrosoftdotNETOnly = false; - - public bool IsWildcard = false; - public bool WildcardMatchParameters = false; - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/Properties/AssemblyInfo.cs deleted file mode 100644 index 35eb7a35e1..0000000000 --- a/Users/Matthijs/Testing/Cosmos.IL2CPU.Plugs/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("IL2CPU.API")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("IL2CPU.API")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] -[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("0601e500-8b5a-4811-b276-726b5db70d20")] - -// 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/Users/Matthijs/Testing/CosmosCompiler.sln b/Users/Matthijs/Testing/CosmosCompiler.sln deleted file mode 100644 index a862b3e269..0000000000 --- a/Users/Matthijs/Testing/CosmosCompiler.sln +++ /dev/null @@ -1,88 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoCecilToEcmaCil1", "MonoCecilToEcmaCil1\MonoCecilToEcmaCil1.csproj", "{719B5067-62CD-43A9-924D-BAD46C4AD192}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoCecilToEcmaCil1.Tests", "MonoCecilToEcmaCil1.Tests\MonoCecilToEcmaCil1.Tests.csproj", "{027876DC-D1CA-4DBF-8DE5-E175BB69F3E9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectionToEcmaCil", "ReflectionToEcmaCil\ReflectionToEcmaCil.csproj", "{FD4B2006-B518-4884-B196-C2EF2B83FD6F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectionToEcmaCil.Tests", "ReflectionToEcmaCil.Tests\ReflectionToEcmaCil.Tests.csproj", "{0D162A82-CBC1-4A39-916D-E1079B212DDE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UtilityClasses", "UtilityClasses\UtilityClasses.csproj", "{54795C40-B3E8-4DBB-A3DE-FACBADD20ADB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{47B9E5D3-A800-4402-AD6A-315FAF4E82F4}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FileToEcmaCilTests", "FileToEcmaCilTests", "{AAA583EF-9AF4-468E-A2CE-A3E3B33429D9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleClass2Test", "FileToEcmaCilTests\SimpleClass2Test\SimpleClass2Test.csproj", "{8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleClassTest", "FileToEcmaCilTests\SimpleClassTest\SimpleClassTest.csproj", "{7A24BC15-49A3-43AF-AF2B-3681D9A06C62}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleMethodsTest", "FileToEcmaCilTests\SimpleMethodsTest\SimpleMethodsTest.csproj", "{B47ED632-1ACE-4516-9576-81E38BA092F1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IRs", "IRs", "{D499F05B-5CFF-4ACF-9D87-AF57ADE5C56D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EcmaCil", "IRs\EcmaCil\EcmaCil.csproj", "{AE684C98-F100-47AE-9C8C-E71BF8C9F8AA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.IL2CPU.Plugs", "Cosmos.IL2CPU.Plugs\Cosmos.IL2CPU.Plugs.csproj", "{CDDAF88B-8726-469A-B906-16FD5EC99799}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {719B5067-62CD-43A9-924D-BAD46C4AD192}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {719B5067-62CD-43A9-924D-BAD46C4AD192}.Release|Any CPU.ActiveCfg = Release|Any CPU - {719B5067-62CD-43A9-924D-BAD46C4AD192}.Release|Any CPU.Build.0 = Release|Any CPU - {027876DC-D1CA-4DBF-8DE5-E175BB69F3E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {027876DC-D1CA-4DBF-8DE5-E175BB69F3E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {027876DC-D1CA-4DBF-8DE5-E175BB69F3E9}.Release|Any CPU.Build.0 = Release|Any CPU - {FD4B2006-B518-4884-B196-C2EF2B83FD6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD4B2006-B518-4884-B196-C2EF2B83FD6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD4B2006-B518-4884-B196-C2EF2B83FD6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD4B2006-B518-4884-B196-C2EF2B83FD6F}.Release|Any CPU.Build.0 = Release|Any CPU - {0D162A82-CBC1-4A39-916D-E1079B212DDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D162A82-CBC1-4A39-916D-E1079B212DDE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D162A82-CBC1-4A39-916D-E1079B212DDE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D162A82-CBC1-4A39-916D-E1079B212DDE}.Release|Any CPU.Build.0 = Release|Any CPU - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB}.Release|Any CPU.Build.0 = Release|Any CPU - {47B9E5D3-A800-4402-AD6A-315FAF4E82F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47B9E5D3-A800-4402-AD6A-315FAF4E82F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47B9E5D3-A800-4402-AD6A-315FAF4E82F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47B9E5D3-A800-4402-AD6A-315FAF4E82F4}.Release|Any CPU.Build.0 = Release|Any CPU - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D}.Release|Any CPU.Build.0 = Release|Any CPU - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62}.Release|Any CPU.Build.0 = Release|Any CPU - {B47ED632-1ACE-4516-9576-81E38BA092F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B47ED632-1ACE-4516-9576-81E38BA092F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B47ED632-1ACE-4516-9576-81E38BA092F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B47ED632-1ACE-4516-9576-81E38BA092F1}.Release|Any CPU.Build.0 = Release|Any CPU - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA}.Release|Any CPU.Build.0 = Release|Any CPU - {CDDAF88B-8726-469A-B906-16FD5EC99799}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDDAF88B-8726-469A-B906-16FD5EC99799}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDDAF88B-8726-469A-B906-16FD5EC99799}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDDAF88B-8726-469A-B906-16FD5EC99799}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D} = {AAA583EF-9AF4-468E-A2CE-A3E3B33429D9} - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62} = {AAA583EF-9AF4-468E-A2CE-A3E3B33429D9} - {B47ED632-1ACE-4516-9576-81E38BA092F1} = {AAA583EF-9AF4-468E-A2CE-A3E3B33429D9} - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} = {D499F05B-5CFF-4ACF-9D87-AF57ADE5C56D} - EndGlobalSection -EndGlobal diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/Program.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/Program.cs deleted file mode 100644 index 182a111364..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/Program.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SimpleClass2Test -{ - public class Program - { - static void Main(string[] args) - { - Class1 xObj = new Class2(); - xObj.MyMethod(); - Test2(xObj); - } - - public static void Test2(object test) - { - test.ToString(); - } - } - - public class Class1 - { - public virtual string MyMethod() - { - return "Base(1)"; - } - } - - public class Class2 : Class1 - { - public override string MyMethod() - { - return "Class2"; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/Properties/AssemblyInfo.cs deleted file mode 100644 index fcf5ba5e84..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/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("SimpleClass2Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("SimpleClass2Test")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("8dabb47c-5e66-4e32-867c-61bc6db0f6a7")] - -// 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/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/SimpleClass2Test.csproj b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/SimpleClass2Test.csproj deleted file mode 100644 index fe90bd196f..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/SimpleClass2Test.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D} - Exe - Properties - SimpleClass2Test - SimpleClass2Test - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/app.config b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/app.config deleted file mode 100644 index e365603337..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClass2Test/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/Program.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/Program.cs deleted file mode 100644 index e2d1212413..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SimpleClassTest -{ - public class Program - { - static void Main(string[] args) - { - Class1 xObj = new Class2(); - xObj.MyMethod(); - } - } - - public class Class1 - { - public virtual string MyMethod() - { - return "Base(1)"; - } - } - - public class Class2: Class1 - { - public override string MyMethod() - { - return "Class2"; - } - } -} diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/Properties/AssemblyInfo.cs deleted file mode 100644 index a79deb70df..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/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("SimpleClassTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("SimpleClassTest")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("2bbf39fc-c0a8-4039-8163-0f80cf724b32")] - -// 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/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/SimpleClassTest.csproj b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/SimpleClassTest.csproj deleted file mode 100644 index 1263bd39c9..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/SimpleClassTest.csproj +++ /dev/null @@ -1,74 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62} - Exe - Properties - SimpleClassTest - SimpleClassTest - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/app.config b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/app.config deleted file mode 100644 index e365603337..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleClassTest/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/Program.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/Program.cs deleted file mode 100644 index f3733dd9db..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/Program.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SimpleMethodsTest -{ - public class Program - { - static void Main(string[] args) - { - var xValue1 = 33; - var xValue2 = 45; - var xSum = Sum(xValue1, xValue2); - var xSum2 = Sum(xSum, xValue2); - } - - private static int Sum(int xValue1, int xValue2) - { - return xValue1 + xValue2; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 23168bd046..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/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("SimpleMethodsTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("SimpleMethodsTest")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("66239dc2-e322-4da7-92b3-035b6bb2abed")] - -// 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/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTest.csproj b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTest.csproj deleted file mode 100644 index 6ae91ec119..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTest.csproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {B47ED632-1ACE-4516-9576-81E38BA092F1} - Exe - Properties - SimpleMethodsTest - SimpleMethodsTest - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - - - - diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTests.xml b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTests.xml deleted file mode 100644 index 7cae84d482..0000000000 Binary files a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/SimpleMethodsTests.xml and /dev/null differ diff --git a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/app.config b/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/app.config deleted file mode 100644 index e365603337..0000000000 --- a/Users/Matthijs/Testing/FileToEcmaCilTests/SimpleMethodsTest/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/ArrayTypeMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/ArrayTypeMeta.cs deleted file mode 100644 index 30703bc722..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/ArrayTypeMeta.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class ArrayTypeMeta: TypeMeta - { - public TypeMeta ElementType - { - get; - set; - } - - public int Dimensions - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMemberMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/BaseMemberMeta.cs deleted file mode 100644 index 33a63d6781..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMemberMeta.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class BaseMemberMeta: BaseMeta - { - protected BaseMemberMeta() - : base() - { - } - - public TypeMeta DeclaringType - { - get; - set; - } - - public bool IsStatic - { - get; - set; - } - } -} diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/BaseMeta.cs deleted file mode 100644 index 37cf4e4cf4..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMeta.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public abstract class BaseMeta: IDisposable - { - protected BaseMeta() - { - } - - public virtual void Dispose() - { - GC.SuppressFinalize(this); - } - - private Dictionary mData; - public IDictionary Data - { - get - { - if (mData == null) - { - mData = new Dictionary(); - } - return mData; - } - } - - //public override int GetHashCode() - //{ - // return MetaId; - //} - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMetaComparer.cs b/Users/Matthijs/Testing/IRs/EcmaCil/BaseMetaComparer.cs deleted file mode 100644 index fbdc8d7e37..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/BaseMetaComparer.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - //public class BaseMetaComparer: IEqualityComparer where T: BaseMeta - //{ - // public static readonly BaseMetaComparer Instance = new BaseMetaComparer(); - // public bool Equals(T x, T y) - // { - // return x.MetaId == y.MetaId; - // } - - // public int GetHashCode(T obj) - // { - // return obj.MetaId; - // } - //} -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/ClassDiagram1.cd b/Users/Matthijs/Testing/IRs/EcmaCil/ClassDiagram1.cd deleted file mode 100644 index da8e7d079f..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/ClassDiagram1.cd +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - AAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - BaseMeta.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAgAAAA= - BaseMemberMeta.cs - - - - - - AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - FieldMeta.cs - - - - - - AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAIAAAAAEAAA= - MethodMeta.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAgEA= - TypeMeta.cs - - - - - - AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - PointerTypeMeta.cs - - - - - - AAAABAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA= - ArrayTypeMeta.cs - - - - \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/DataIds.cs b/Users/Matthijs/Testing/IRs/EcmaCil/DataIds.cs deleted file mode 100644 index f25713ddf3..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/DataIds.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public static class DataIds - { - // leave this #if, it will help narrow down any using code which has not been #if-ed -#if DEBUG - /// - /// This const is used only in debug builds, for being able to make useful dumps of metadata. - /// - public const int DebugMetaId = 1; -#endif - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/Dump.cs b/Users/Matthijs/Testing/IRs/EcmaCil/Dump.cs deleted file mode 100644 index 0e63a14275..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/Dump.cs +++ /dev/null @@ -1,301 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Xml; -using EcmaCil.IL; - -namespace EcmaCil -{ - public class Dump - { - private static void DumpType(TypeMeta item, XmlWriter output) - { - var xArrayType = item as ArrayTypeMeta; - if (xArrayType != null) - { - DumpArrayType(xArrayType, output); - return; - } - var xPointerType = item as PointerTypeMeta; - if (xPointerType != null) - { - DumpPointerType(xPointerType, output); - return; - } - if (item.GetType() == typeof(TypeMeta)) - { - DumpTypeMeta(item, output); - return; - } - throw new NotImplementedException("Type '" + item.GetType().FullName + "' not implemented"); - } - - private static void DumpPointerType(PointerTypeMeta xPointerType, XmlWriter output) - { - throw new NotImplementedException(); - } - - private static void DumpTypeMeta(TypeMeta item, XmlWriter output) - { - output.WriteStartElement("TypeMeta"); - { -#if DEBUG - output.WriteAttributeString("MetaId", (string)item.Data[EcmaCil.DataIds.DebugMetaId]); -#endif - //output.WriteAttributeString("FullName", type.FullName); - //output.WriteAttributeString("BaseType", (type.BaseType != null ? "#" + type.BaseType.MetaId : "")); -#if DEBUG - if (item.BaseType != null) - { - output.WriteAttributeString("BaseType", (string)item.BaseType.Data[EcmaCil.DataIds.DebugMetaId]); - } - if (item.Descendants.Count > 0) - { - output.WriteStartElement("Descendants"); - { - foreach (var xDescendant in item.Descendants) - { - output.WriteStartElement("Descendant"); - { - output.WriteAttributeString("Type", (string)xDescendant.Data[EcmaCil.DataIds.DebugMetaId]); - } - output.WriteEndElement(); // Descendant - } - } - output.WriteEndElement(); // descendants - } - -#else - if (item.BaseType != null) - { - output.WriteAttributeString("HasBaseType", "true"); - } -#endif - output.WriteStartElement("Methods"); - { - foreach (var xMethod in item.Methods) - { - DumpMethod(xMethod, output); - } - } - output.WriteEndElement(); - } - output.WriteEndElement(); - } - - private static void DumpArrayType(ArrayTypeMeta aArrayType, XmlWriter output) - { - output.WriteStartElement("Array"); - { - output.WriteAttributeString("Dimensions", aArrayType.Dimensions.ToString()); -#if DEBUG - output.WriteAttributeString("ElementType", (string)aArrayType.ElementType.Data[EcmaCil.DataIds.DebugMetaId]); -#endif - } - output.WriteEndElement(); - } - - private static void DumpMethod(MethodMeta method, XmlWriter output) - { - output.WriteStartElement("Method"); - { -#if DEBUG - output.WriteAttributeString("MetaId", (string)method.Data[DataIds.DebugMetaId]); -#endif - //output.WriteAttributeString("FullName", method.Name); - output.WriteAttributeString("IsStatic", method.IsStatic.ToString()); - output.WriteAttributeString("IsVirtual", method.IsVirtual.ToString()); - output.WriteAttributeString("StartsNewVirtualTree", method.StartsNewVirtualTree.ToString()); -#if DEBUG - if (method.Overrides!=null) - { - output.WriteAttributeString("Overrides", (string)method.Overrides.Data[DataIds.DebugMetaId]); - } - if (method.ReturnType != null) - { - output.WriteAttributeString("ReturnType", (string)method.ReturnType.Data[DataIds.DebugMetaId]); - } -#endif - output.WriteStartElement("Parameters"); - { - foreach (var xParam in method.Parameters) - { - DumpParameter(xParam, output); - } - } - output.WriteEndElement(); - if (method.Body != null) - { - output.WriteStartElement("Body"); - { - #region Locals - output.WriteAttributeString("InitLocals", method.Body.InitLocals.ToString()); - - output.WriteStartElement("Locals"); - { - for (int i = 0; i < method.Body.LocalVariables.Length; i++) - { - output.WriteStartElement("Local"); - { - output.WriteAttributeString("Index", i.ToString()); -#if DEBUG - output.WriteAttributeString("Type", (string)method.Body.LocalVariables[i].Data[EcmaCil.DataIds.DebugMetaId]); -#endif - //output.WriteAttributeString("IsPinned", method.Body.LocalVariables[i].IsPinned.ToString()); - //output.WriteAttributeString("LocalType", "#" + method.Body.LocalVariables[i].LocalType.MetaId); - } - output.WriteEndElement(); - } - } - output.WriteEndElement(); - #endregion - #region ExceptionHandlingClauses - output.WriteStartElement("ExceptionHandlingClauses"); - { - if (method.Body.ExceptionHandlingClauses != null) - { - foreach (var xClause in method.Body.ExceptionHandlingClauses) - { - output.WriteStartElement("Clause"); - { - output.WriteAttributeString("Flags", xClause.Flags.ToString()); - output.WriteAttributeString("HandlerStart", xClause.HandlerStart.ToString()); - output.WriteAttributeString("HandlerEnd", xClause.HandlerEnd.ToString()); - output.WriteAttributeString("TryStart", xClause.TryStart.ToString()); - output.WriteAttributeString("TryEnd", xClause.TryEnd.ToString()); - output.WriteAttributeString("FilterStart", xClause.FilterStart.ToString()); - if (xClause.CatchType != null) - { - // output.WriteAttributeString("CatchType", "#" + xClause.CatchType.MetaId); - output.WriteAttributeString("HasCatchType", "true"); - } - } - output.WriteEndElement(); - } - } - } - output.WriteEndElement(); - #endregion - #region instructions - output.WriteStartElement("Instructions"); - { - for (int i = 0; i < method.Body.Instructions.Length; i++) - { - var xInstruction = method.Body.Instructions[i]; - output.WriteStartElement("Instruction"); - { - output.WriteAttributeString("Index", i.ToString()); - output.WriteAttributeString("Kind", xInstruction.InstructionKind.ToString()); - switch (xInstruction.GetType().Name) - { - case "InstructionNone": - break; - case "InstructionInt32": - var xInstr32 = (InstructionInt32)xInstruction; - output.WriteAttributeString("Value", xInstr32.Value.ToString()); - break; - case "InstructionLocal": - var xInstrLocal = (InstructionLocal)xInstruction; - output.WriteAttributeString("LocalIndex", Array.IndexOf(method.Body.LocalVariables, xInstrLocal.LocalVariable).ToString()); - break; - case "InstructionMethod": - var xInstrMethod = (InstructionMethod)xInstruction; -#if DEBUG - output.WriteAttributeString("Method", (string)xInstrMethod.Value.Data[EcmaCil.DataIds.DebugMetaId]); -#endif - //output.WriteAttributeString("Method", "#" + xInstrMethod.Value.MetaId); - break; - case "InstructionArgument": - var xInstrArg = (InstructionArgument)xInstruction; -#if DEBUG - output.WriteAttributeString("Argument", (string)xInstrArg.Argument.Data[EcmaCil.DataIds.DebugMetaId]); -#endif - break; - case "InstructionBranch": - var xInstrBranch = (InstructionBranch)xInstruction; - output.WriteAttributeString("TargetIdx", xInstrBranch.Target.InstructionIndex.ToString()); - break; - case "InstructionType": - var xInstrType = (InstructionType)xInstruction; - //output.WriteAttributeString("Type", xInstrType.Type.MetaId); - break; - case "InstructionField": - var xInstrField = (InstructionField)xInstruction; - //output.WriteAttributeString("Field", xInstrField.Field.Name); - break; - case "InstructionString": - var xInstrString = (InstructionString)xInstruction; - output.WriteAttributeString("LiteralString", xInstrString.LiteralString); - break; - case "InstructionSwitch": - break; - case "InstructionToken": - break; - case "InstructionSingle": - var xInstrSingle = (InstructionSingle)xInstruction; - output.WriteAttributeString("Value", xInstrSingle.Value.ToString()); - break; - case "InstructionDouble": - var xInstrDouble = (InstructionDouble)xInstruction; - output.WriteAttributeString("Value", xInstrDouble.Value.ToString()); - break; - case "InstructionInt64": - var xInstrInt64 = (InstructionInt64)xInstruction; - output.WriteAttributeString("Value", xInstrInt64.Value.ToString()); - break; - default: - throw new NotImplementedException("Instruction kind not implemented: " + xInstruction.GetType().Name); - } - } - output.WriteEndElement(); - } - } - output.WriteEndElement(); - #endregion - } - output.WriteEndElement(); - } - } - output.WriteEndElement(); - } - - private static void DumpParameter(MethodParameterMeta param, XmlWriter output) - { - output.WriteStartElement("Parameter"); - { - if (param == null) - { - Console.Write(""); - } - output.WriteAttributeString("IsByRef", param.IsByRef.ToString()); -#if DEBUG - output.WriteAttributeString("MetaId", (string)param.Data[EcmaCil.DataIds.DebugMetaId]); -#endif - //output.WriteAttributeString("Name", param.Name); - //output.WriteAttributeString("IsPointer", param.IsPointer.ToString()); - //output.WriteAttributeString("ParameterType", "#" + param.PropertyType.MetaId); - } - output.WriteEndElement(); - } - - public static void DumpTypes(IEnumerable types, XmlWriter output) - { - output.WriteStartDocument(); - { - output.WriteStartElement("Types"); - { - foreach (var xType in types) - { - DumpType(xType, output); - } - } - output.WriteEndElement(); - } - output.WriteEndDocument(); - } - - #region instructions dumping - #endregion - } -} diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/EcmaCil.csproj b/Users/Matthijs/Testing/IRs/EcmaCil/EcmaCil.csproj deleted file mode 100644 index b85aa453bc..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/EcmaCil.csproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - Library - Properties - EcmaCil - EcmaCil - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB} - UtilityClasses - - - - - - - - diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/Enums.cs b/Users/Matthijs/Testing/IRs/EcmaCil/Enums.cs deleted file mode 100644 index f2cb38f856..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/Enums.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public enum ExceptionHandlingClauseFlagsEnum - { - Clause, - Filter, - Finally, - Fault - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/ExceptionHandlingClauseMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/ExceptionHandlingClauseMeta.cs deleted file mode 100644 index be75be2753..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/ExceptionHandlingClauseMeta.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class ExceptionHandlingClauseMeta - { - - public TypeMeta CatchType - { - get; - set; - } - - public int FilterStart - { - get; - set; - } - - public ExceptionHandlingClauseFlagsEnum Flags - { - get; - set; - } - - public int HandlerEnd - { - get; - set; - } - - public int HandlerStart - { - get; - set; - } - - public int TryEnd - { - get; - set; - } - - public int TryStart - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/FieldMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/FieldMeta.cs deleted file mode 100644 index 35ad4e1935..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/FieldMeta.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class FieldMeta: BaseMemberMeta - { - public FieldMeta() - : base() - { - } - - public TypeMeta FieldType - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/BaseInstruction.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/BaseInstruction.cs deleted file mode 100644 index fc873e97fc..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/BaseInstruction.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public abstract class BaseInstruction - { - protected BaseInstruction(InstructionKindEnum aInstructionKind, int aInstructionIndex) - { - mInstructionKind = aInstructionKind; - InstructionIndex = aInstructionIndex; - } - private readonly InstructionKindEnum mInstructionKind; - - public InstructionKindEnum InstructionKind - { - get - { - return mInstructionKind; - } - } - - public int InstructionIndex - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/Enums.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/Enums.cs deleted file mode 100644 index 902cdd69cd..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/Enums.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public enum InstructionKindEnum :ushort - { - Nop = 0x0000, - Break = 0x0001, - Ldnull = 0x0014, - Ldc_I4 = 0x0020, - Ldc_I8 = 0x0021, - Ldc_R4 = 0x0022, - Ldc_R8 = 0x0023, - Dup = 0x0025, - Pop = 0x0026, - Jmp = 0x0027, - Call = 0x0028, - Calli = 0x0029, - Ret = 0x002A, - Br = 0x0038, - Brfalse = 0x0039, - Brtrue = 0x003A, - Beq = 0x003B, - Bge = 0x003C, - Bgt = 0x003D, - Ble = 0x003E, - Blt = 0x003F, - Bne_Un = 0x0040, - Bge_Un = 0x0041, - Bgt_Un = 0x0042, - Ble_Un = 0x0043, - Blt_Un = 0x0044, - Switch = 0x0045, - Ldind_I1 = 0x0046, - Ldind_U1 = 0x0047, - Ldind_I2 = 0x0048, - Ldind_U2 = 0x0049, - Ldind_I4 = 0x004A, - Ldind_U4 = 0x004B, - Ldind_I8 = 0x004C, - Ldind_I = 0x004D, - Ldind_R4 = 0x004E, - Ldind_R8 = 0x004F, - Ldind_Ref = 0x0050, - Stind_Ref = 0x0051, - Stind_I1 = 0x0052, - Stind_I2 = 0x0053, - Stind_I4 = 0x0054, - Stind_I8 = 0x0055, - Stind_R4 = 0x0056, - Stind_R8 = 0x0057, - Add = 0x0058, - Sub = 0x0059, - Mul = 0x005A, - Div = 0x005B, - Div_Un = 0x005C, - Rem = 0x005D, - Rem_Un = 0x005E, - And = 0x005F, - Or = 0x0060, - Xor = 0x0061, - Shl = 0x0062, - Shr = 0x0063, - Shr_Un = 0x0064, - Neg = 0x0065, - Not = 0x0066, - Conv_I1 = 0x0067, - Conv_I2 = 0x0068, - Conv_I4 = 0x0069, - Conv_I8 = 0x006A, - Conv_R4 = 0x006B, - Conv_R8 = 0x006C, - Conv_U4 = 0x006D, - Conv_U8 = 0x006E, - Callvirt = 0x006F, - Cpobj = 0x0070, - Ldobj = 0x0071, - Ldstr = 0x0072, - Newobj = 0x0073, - Castclass = 0x0074, - Isinst = 0x0075, - Conv_R_Un = 0x0076, - Unbox = 0x0079, - Throw = 0x007A, - Ldfld = 0x007B, - Ldflda = 0x007C, - Stfld = 0x007D, - Ldsfld = 0x007E, - Ldsflda = 0x007F, - Stsfld = 0x0080, - Stobj = 0x0081, - Conv_Ovf_I1_Un = 0x0082, - Conv_Ovf_I2_Un = 0x0083, - Conv_Ovf_I4_Un = 0x0084, - Conv_Ovf_I8_Un = 0x0085, - Conv_Ovf_U1_Un = 0x0086, - Conv_Ovf_U2_Un = 0x0087, - Conv_Ovf_U4_Un = 0x0088, - Conv_Ovf_U8_Un = 0x0089, - Conv_Ovf_I_Un = 0x008A, - Conv_Ovf_U_Un = 0x008B, - Box = 0x008C, - Newarr = 0x008D, - Ldlen = 0x008E, - Ldelema = 0x008F, - Ldelem_I1 = 0x0090, - Ldelem_U1 = 0x0091, - Ldelem_I2 = 0x0092, - Ldelem_U2 = 0x0093, - Ldelem_I4 = 0x0094, - Ldelem_U4 = 0x0095, - Ldelem_I8 = 0x0096, - Ldelem_I = 0x0097, - Ldelem_R4 = 0x0098, - Ldelem_R8 = 0x0099, - Ldelem_Ref = 0x009A, - Stelem_I = 0x009B, - Stelem_I1 = 0x009C, - Stelem_I2 = 0x009D, - Stelem_I4 = 0x009E, - Stelem_I8 = 0x009F, - Stelem_R4 = 0x00A0, - Stelem_R8 = 0x00A1, - Stelem_Ref = 0x00A2, - Ldelem = 0x00A3, - Stelem = 0x00A4, - Unbox_Any = 0x00A5, - Conv_Ovf_I1 = 0x00B3, - Conv_Ovf_U1 = 0x00B4, - Conv_Ovf_I2 = 0x00B5, - Conv_Ovf_U2 = 0x00B6, - Conv_Ovf_I4 = 0x00B7, - Conv_Ovf_U4 = 0x00B8, - Conv_Ovf_I8 = 0x00B9, - Conv_Ovf_U8 = 0x00BA, - Refanyval = 0x00C2, - Ckfinite = 0x00C3, - Mkrefany = 0x00C6, - Ldtoken = 0x00D0, - Conv_U2 = 0x00D1, - Conv_U1 = 0x00D2, - Conv_I = 0x00D3, - Conv_Ovf_I = 0x00D4, - Conv_Ovf_U = 0x00D5, - Add_Ovf = 0x00D6, - Add_Ovf_Un = 0x00D7, - Mul_Ovf = 0x00D8, - Mul_Ovf_Un = 0x00D9, - Sub_Ovf = 0x00DA, - Sub_Ovf_Un = 0x00DB, - Endfinally = 0x00DC, - Leave = 0x00DD, - Stind_I = 0x00DF, - Conv_U = 0x00E0, - Ceq = 0xFE01, - Cgt = 0xFE02, - Cgt_Un = 0xFE03, - Clt = 0xFE04, - Clt_Un = 0xFE05, - Ldftn = 0xFE06, - Ldvirtftn = 0xFE07, - Ldarg = 0xFE09, - Ldarga = 0xFE0A, - Starg = 0xFE0B, - Ldloc = 0xFE0C, - Ldloca = 0xFE0D, - Stloc = 0xFE0E, - Localloc = 0xFE0F, - Endfilter = 0xFE11, - Initobj = 0xFE15, - Cpblk = 0xFE17, - Initblk = 0xFE18, - Rethrow = 0xFE1A, - Sizeof = 0xFE1C - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionArgument.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionArgument.cs deleted file mode 100644 index 66f14a5e4c..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionArgument.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionArgument: BaseInstruction - { - public InstructionArgument(InstructionKindEnum aKind, int aIndex, MethodParameterMeta aArgument):base(aKind, aIndex) - { - Argument = aArgument; - } - - public MethodParameterMeta Argument - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionBranch.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionBranch.cs deleted file mode 100644 index cbfdaf80d5..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionBranch.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionBranch: BaseInstruction - { - public InstructionBranch(InstructionKindEnum aKind, int aIndex) - : base(aKind, aIndex) - { - } - - private BaseInstruction mTarget; - public BaseInstruction Target - { - get - { - return mTarget; - } - set - { - if (mTarget != null) - { - throw new Exception("Cannot change Target once set!"); - } - mTarget = value; - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionDouble.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionDouble.cs deleted file mode 100644 index 99579441db..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionDouble.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionDouble: BaseInstruction - { - public InstructionDouble(InstructionKindEnum aKind, int aIndex, Double aValue) - : base(aKind, aIndex) - { - Value = aValue; - } - - public Double Value - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionField.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionField.cs deleted file mode 100644 index bf1a0ae8f7..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionField.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionField: BaseInstruction - { - public InstructionField(InstructionKindEnum aKind, int aIndex, FieldMeta aField) - : base(aKind, aIndex) - { - Field = aField; - } - - public FieldMeta Field - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt32.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt32.cs deleted file mode 100644 index f30e72198a..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt32.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionInt32: BaseInstruction - { - public InstructionInt32(InstructionKindEnum aKind, int aIndex, int aValue) - : base(aKind, aIndex) - { - Value = aValue; - } - - public int Value - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt64.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt64.cs deleted file mode 100644 index c1f42d101f..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionInt64.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionInt64: BaseInstruction - { - public InstructionInt64(InstructionKindEnum aKind, int aIndex, long aValue) - : base(aKind, aIndex) - { - Value = aValue; - } - - public long Value - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionLocal.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionLocal.cs deleted file mode 100644 index 5f79bdfe1f..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionLocal.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionLocal: BaseInstruction - { - public InstructionLocal(InstructionKindEnum aKind, int aIndex, LocalVariableMeta aLocal) - : base(aKind, aIndex) - { - LocalVariable = aLocal; - } - - public LocalVariableMeta LocalVariable - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionMethod.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionMethod.cs deleted file mode 100644 index 4df6fdf5ec..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionMethod.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionMethod : BaseInstruction - { - public InstructionMethod(InstructionKindEnum aKind, int aIndex, MethodMeta aValue) - : base(aKind, aIndex) - { - Value = aValue; - } - - public MethodMeta Value - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionNone.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionNone.cs deleted file mode 100644 index 60b8bcb970..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionNone.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionNone: BaseInstruction - { - public InstructionNone(InstructionKindEnum aKind, int aIndex) - : base(aKind, aIndex) - { - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSingle.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSingle.cs deleted file mode 100644 index 3ac4454109..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSingle.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionSingle: BaseInstruction - { - public InstructionSingle(InstructionKindEnum aKind, int aIndex, Single aValue) - : base(aKind, aIndex) - { - Value = aValue; - } - - public Single Value - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionString.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionString.cs deleted file mode 100644 index b059348c6a..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionString.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionString: BaseInstruction - { - public InstructionString(InstructionKindEnum aKind, int aIndex, string aString) - : base(aKind, aIndex) - { - LiteralString = aString; - } - - public string LiteralString - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSwitch.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSwitch.cs deleted file mode 100644 index ae0e1fd4cd..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionSwitch.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionSwitch: BaseInstruction - { - public InstructionSwitch(int aCurrentIndex) - : base(InstructionKindEnum.Switch, aCurrentIndex) - { - } - - public BaseInstruction[] Targets - { - get; - set; - } - } -} diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionToken.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionToken.cs deleted file mode 100644 index a296405458..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionToken.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionToken: BaseInstruction - { - public InstructionToken(InstructionKindEnum aKind, int aIndex, BaseMeta aToken) - : base(aKind, aIndex) - { - Token = aToken; - } - - public BaseMeta Token - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionType.cs b/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionType.cs deleted file mode 100644 index fe3fab6f41..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/IL/InstructionType.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil.IL -{ - public class InstructionType: BaseInstruction - { - public InstructionType(InstructionKindEnum aKind, int aIndex, TypeMeta aType) - : base(aKind, aIndex) - { - Type = aType; - } - - public TypeMeta Type - { - get; - private set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/LocalVariableMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/LocalVariableMeta.cs deleted file mode 100644 index 0cdca66edb..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/LocalVariableMeta.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class LocalVariableMeta: BaseMeta - { - public TypeMeta LocalType - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/MetaSorter.cs b/Users/Matthijs/Testing/IRs/EcmaCil/MetaSorter.cs deleted file mode 100644 index e035c43e66..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/MetaSorter.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public static class MetaSorter - { - /// - /// Sorts the given . Does this using the Debug DataId. Will throw an exception when not in debug mode - /// - /// - /// - public static TypeMeta[] SortTypes(TypeMeta[] aTypes) - { -#if !DEBUG - throw new NotSupportedException("Cannot sort in release builds!"); -#else - - var xTempResult = (from item in aTypes - orderby (string)item.Data[DataIds.DebugMetaId] - select item).ToArray(); - foreach (var xItem in xTempResult) - { - SortTypes(xItem); - } - return xTempResult; -#endif - } -#if DEBUG - private static void SortTypes(TypeMeta aItem) - { - aItem.Fields = (from item in aItem.Fields - orderby (string)item.Data[DataIds.DebugMetaId] - select item).ToList(); - aItem.Methods = (from item in aItem.Methods - orderby (string)item.Data[DataIds.DebugMetaId] - select item).ToList(); - foreach (var xMethod in aItem.Methods) - { - SortMethod(xMethod); - } - - } - - private static void SortMethod(MethodMeta aMethod) - { - if (aMethod.Body != null) - { - aMethod.Body.ExceptionHandlingClauses = (from item in aMethod.Body.ExceptionHandlingClauses - orderby item.TryStart, - item.TryEnd, - item.Flags, - item.HandlerStart, - item.HandlerEnd, - item.FilterStart, - item.CatchType - select item).ToArray(); - } - } -#endif - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/MethodBodyMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/MethodBodyMeta.cs deleted file mode 100644 index 342a88238a..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/MethodBodyMeta.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class MethodBodyMeta - { - public LocalVariableMeta[] LocalVariables - { - get; - set; - } - - public ExceptionHandlingClauseMeta[] ExceptionHandlingClauses - { - get; - set; - } - - public bool InitLocals - { - get; - set; - } - - public IL.BaseInstruction[] Instructions - { - get; - set; - } - } -} diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/MethodMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/MethodMeta.cs deleted file mode 100644 index b03b4eda77..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/MethodMeta.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class MethodMeta: BaseMemberMeta - { - public MethodMeta() - : base() - { - Parameters = new MethodParameterMeta[0]; - } - public MethodParameterMeta[] Parameters - { - get; - set; - } - - public TypeMeta ReturnType - { - get; - set; - } - - public MethodBodyMeta Body - { - get; - set; - } - - public bool IsVirtual - { - get; - set; - } - - public bool IsPublic - { - get; - set; - } - - /// - /// Specifies whether the method is a base method. in c# it's defined by: "virtual void", or "new virtual void.." - /// - public bool StartsNewVirtualTree - { - get; - set; - } - - public MethodMeta Overrides - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/MethodParameterMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/MethodParameterMeta.cs deleted file mode 100644 index 27e8bccf95..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/MethodParameterMeta.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class MethodParameterMeta : BaseMeta - { - public TypeMeta PropertyType - { - get; - set; - } - - public bool IsByRef - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/PointerTypeMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/PointerTypeMeta.cs deleted file mode 100644 index cda26b454c..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/PointerTypeMeta.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EcmaCil -{ - public class PointerTypeMeta: TypeMeta - { - public TypeMeta ElementType - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/IRs/EcmaCil/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/IRs/EcmaCil/Properties/AssemblyInfo.cs deleted file mode 100644 index 078bf95994..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/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("EcmaCil")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("EcmaCil")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("aee2ca8e-0369-4be3-9c6f-8379e071625d")] - -// 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/Users/Matthijs/Testing/IRs/EcmaCil/TypeMeta.cs b/Users/Matthijs/Testing/IRs/EcmaCil/TypeMeta.cs deleted file mode 100644 index 17cf665db4..0000000000 --- a/Users/Matthijs/Testing/IRs/EcmaCil/TypeMeta.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UtilityClasses; -using System.Diagnostics; - -namespace EcmaCil -{ -#if DEBUG - [DebuggerDisplay("Type({Data[1]})")] -#endif - public class TypeMeta: BaseMeta - { - private static readonly FieldMeta[] EmptyFields = new FieldMeta[0]; - private static readonly MethodMeta[] EmptyMethods = new MethodMeta[0]; - public TypeMeta() - : base() - { - //Methods = new SimpleHashSet(BaseMetaComparer.Instance); - //Fields = new SimpleHashSet(BaseMetaComparer.Instance); - Methods = new List(); - Fields = new List(); - } - - private TypeMeta mBaseType; - public TypeMeta BaseType - { - get - { - return mBaseType; - } - set - { - if (value != mBaseType) - { - if (mBaseType != null) - { - mBaseType.mDescendants.Remove(this); - } - mBaseType = value; - if (mBaseType != null) - { - mBaseType.mDescendants.Add(this); - } - } - } - } - - private List mDescendants = new List(); - public IList Descendants - { - get - { - return mDescendants; - } - } - - - public List Methods - { - get; - set; - } - - public List Fields - { - get; - set; - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/BaseTest.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/BaseTest.cs deleted file mode 100644 index 1b6c897d10..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/BaseTest.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using EcmaCil; -using System.IO; -using System.Xml; - -namespace MonoCecilToEcmaCil1.Tests -{ - public class BaseTest - { - protected void AssertCompilationSame(string refName, Type baseType) - { - var xReader = new Reader(); - var xResult = xReader.Execute(baseType.Assembly.Location); - string xActualOutput; - using (var xStringWriter = new StringWriter()) - { - using (var xXmlOut = XmlWriter.Create(xStringWriter)) - { - Dump.DumpTypes(xResult, xXmlOut); - xXmlOut.Flush(); - xStringWriter.Flush(); - xActualOutput = xStringWriter.ToString(); - } - } - - var xExpectedOutput = ReadAllTextFromStream(baseType.Assembly.GetManifestResourceStream(baseType.Namespace + "." + refName + ".xml")); - Assert.AreEqual(xExpectedOutput, xActualOutput); - } - - private static string ReadAllTextFromStream(Stream aStream) - { - using (var xStreamReader = new StreamReader(aStream)) - { - return xStreamReader.ReadToEnd(); - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/MonoCecilToEcmaCil1.Tests.csproj b/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/MonoCecilToEcmaCil1.Tests.csproj deleted file mode 100644 index 685e5bd8b0..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/MonoCecilToEcmaCil1.Tests.csproj +++ /dev/null @@ -1,93 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {027876DC-D1CA-4DBF-8DE5-E175BB69F3E9} - Library - Properties - MonoCecilToEcmaCil1.Tests - MonoCecilToEcmaCil1.Tests - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\libraries\nunit.framework.dll - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62} - SimpleClassTest - - - {B47ED632-1ACE-4516-9576-81E38BA092F1} - SimpleMethodsTest - - - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - EcmaCil - - - {719B5067-62CD-43A9-924D-BAD46C4AD192} - MonoCecilToEcmaCil1 - - - - - diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index d829bd8a63..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/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("MonoCecilToEcmaCil1.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("MonoCecilToEcmaCil1.Tests")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] -[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("32114a0d-3790-4976-885b-8a1b84ff4c16")] - -// 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/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/SimpleMethodsTestsTest.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/SimpleMethodsTestsTest.cs deleted file mode 100644 index 0144f266be..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1.Tests/SimpleMethodsTestsTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; - -namespace MonoCecilToEcmaCil1.Tests -{ - [TestFixture] - public class SimpleMethodsTestsTest: BaseTest - { - [Test] - public void DoTest() - { - AssertCompilationSame("SimpleMethodsTests", typeof(SimpleMethodsTest.Program)); - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/CecilExtensions.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/CecilExtensions.cs deleted file mode 100644 index f652b3f6eb..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/CecilExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; - -namespace MonoCecilToEcmaCil1 -{ - public static class CecilExtensions - { - public static bool IsSubclassOf(this TypeDefinition aThis, TypeDefinition aThat) - { - if (aThis.Equals(aThat)) - { - return true; - } - if (aThis.BaseType != null) - { - return aThis.BaseType.Resolve().IsSubclassOf(aThat); - } - return false; - } - } -} diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/MonoCecilToEcmaCil1.csproj b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/MonoCecilToEcmaCil1.csproj deleted file mode 100644 index 39658178dc..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/MonoCecilToEcmaCil1.csproj +++ /dev/null @@ -1,131 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {719B5067-62CD-43A9-924D-BAD46C4AD192} - Library - Properties - MonoCecilToEcmaCil1 - MonoCecilToEcmaCil1 - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\libraries\Mono.Cecil.dll - - - ..\libraries\Mono.Cecil.Rocks.dll - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - - - - - - {CDDAF88B-8726-469A-B906-16FD5EC99799} - IL2CPU.API - - - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - EcmaCil - - - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB} - UtilityClasses - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Properties/AssemblyInfo.cs deleted file mode 100644 index 35de2f7ed5..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/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("MonoCecilToEcmaCil1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("MonoCecilToEcmaCil1")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2010")] -[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("11f30f0c-3319-41bd-83fb-e945092844b7")] - -// 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/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.MonoHelpers.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.MonoHelpers.cs deleted file mode 100644 index c740f6646a..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.MonoHelpers.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; -using EcmaCil.IL; -using Mono.Cecil.Cil; - -namespace MonoCecilToEcmaCil1 -{ - partial class Reader - { - private MethodDefinition ResolveMethod(MethodReference aRef) - { - var xDef = aRef as MethodDefinition; - if (xDef != null) - { - return xDef; - } - var xSpec = aRef as GenericInstanceMethod; - if (xSpec != null) - { - throw new Exception("Queueing generic methods not yet(?) supported!"); - } - return aRef.Resolve(); - } - - private TypeDefinition ResolveType(TypeReference aRef) - { - var xDef = aRef as TypeDefinition; - if (xDef != null) - { - return xDef; - } -#if DEBUG - var xArray = aRef as ArrayType; - if (xArray != null) - { - throw new NotSupportedException("Reader.ResolveType doesnt support ArrayTypes"); - } - var xPointer = aRef as PointerType; - if (xPointer != null) - { - throw new NotSupportedException("Reader.ResolveType doesnt support PointerTypes"); - } - //var xReference = aRef as ReferenceType; - //if (xReference != null) - //{ - // throw new NotSupportedException("Reader.ResolveType doesnt support ReferenceTypes"); - //} -#endif - return aRef.Resolve(); - } - - private static InstructionKindEnum GetInstructionKind(Code value) - { - var xName = value.ToString(); - if (xName.EndsWith("_S")) - { - xName = xName.Substring(0, xName.Length - 2); - } - return (InstructionKindEnum)Enum.Parse(typeof(InstructionKindEnum), xName); - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.ScanLog.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.ScanLog.cs deleted file mode 100644 index c0261f1b5b..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.ScanLog.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace MonoCecilToEcmaCil1 -{ - partial class Reader - { - protected bool mLogEnabled = false; - protected string mMapPathname; - protected TextWriter mLogWriter; - protected struct LogItem - { - public string SrcType; - public object Item; - } - protected Dictionary> mLogMap; - - - private void LogMapPoint(object aSrc, string aSrcType, object aItem) - { - // Keys cant be null. If null, we just say ILScanner is the source - if (aSrc == null) - { - aSrc = typeof(Reader); - } - - var xLogItem = new LogItem() - { - SrcType = aSrcType, - Item = aItem - }; - List xList; - if (!mLogMap.TryGetValue(aSrc, out xList)) - { - xList = new List(); - mLogMap.Add(aSrc, xList); - } - xList.Add(xLogItem); - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.cs deleted file mode 100644 index 8d1afbe663..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/Reader.cs +++ /dev/null @@ -1,545 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; -using UtilityClasses; -using Mono.Cecil.Cil; -using EcmaCil.IL; -using Mono.Cecil.Rocks; - -namespace MonoCecilToEcmaCil1 -{ - public partial class Reader : IDisposable - { - private Dictionary mMethods = new Dictionary(); - private Dictionary mTypes = new Dictionary(); - private Dictionary mArrayTypes = new Dictionary(); - private Dictionary mPointerTypes = new Dictionary(); - private Dictionary mVirtuals = new Dictionary(); - - - #region queueing system - private Queue mQueue = new Queue(); - - private EcmaCil.MethodMeta EnqueueMethod(MethodReference aMethod, object aSource, string aSourceType) - { - if (mLogEnabled) - { - LogMapPoint(aSource, aSourceType, aMethod); - } - List xTypeArgs = null; - var xGenSpec = aMethod as GenericInstanceMethod; - TypeDefinition xTypeDef; - MethodDefinition xMethodDef; - TypeReference xRefType; - if (xGenSpec != null) - { - xMethodDef = ResolveMethod(xGenSpec.ElementMethod); - xRefType = xGenSpec.DeclaringType; - xTypeArgs = new List(); - foreach (TypeReference xArg in xGenSpec.GenericArguments) - { - xTypeArgs.Add(xArg); - } - } - else - { - xMethodDef = ResolveMethod(aMethod); - xRefType = aMethod.DeclaringType; - } - #region resolve type - xTypeDef = xRefType as TypeDefinition; - if (xTypeDef == null) - { - var xGenType = xRefType as GenericInstanceType; - if (xGenType != null) - { - xTypeDef = ResolveType(xGenType.DeclaringType); - if (xTypeArgs == null) - { - xTypeArgs = new List(); - } - for (int i = 0; i < xGenType.GenericArguments.Count; i++) - { - xTypeArgs.Insert(i, xGenType.GenericArguments[i]); - } - } - else - { - xTypeDef = ResolveType(xRefType); - } - } - #endregion - var xQueuedMethod = new QueuedMethod(xTypeDef, xMethodDef, (xTypeArgs == null ? null : xTypeArgs.ToArray())); - EcmaCil.MethodMeta xMethodMeta; - if(mMethods.TryGetValue(xQueuedMethod, out xMethodMeta)){ - return xMethodMeta; - } - var xDeclaringType = EnqueueType(xRefType, aMethod, "Declaring type"); - xMethodMeta = new EcmaCil.MethodMeta(); - xMethodMeta.DeclaringType = xDeclaringType; - xDeclaringType.Methods.Add(xMethodMeta); - mMethods.Add(xQueuedMethod, xMethodMeta); - mQueue.Enqueue(xQueuedMethod); - return xMethodMeta; - } - - private EcmaCil.TypeMeta EnqueueType(TypeReference aTypeRef, object aSource, string aSourceType) - { - if (mLogEnabled) - { - LogMapPoint(aSource, aSourceType, aTypeRef); - } - List xTypeArgs = null; - TypeDefinition xTypeDef; - - var xArrayType = aTypeRef as ArrayType; - if (xArrayType != null) - { - var xQueuedArrayType = new QueuedArrayType(xArrayType); - EcmaCil.ArrayTypeMeta xArrayMeta; - if (mArrayTypes.TryGetValue(xQueuedArrayType, out xArrayMeta)) - { - return xArrayMeta; - } - var xElemMeta = EnqueueType(xQueuedArrayType.ArrayType.ElementType, aTypeRef, "Array element type"); - xArrayMeta = new EcmaCil.ArrayTypeMeta { ElementType = xElemMeta }; - mArrayTypes.Add(xQueuedArrayType, xArrayMeta); - mQueue.Enqueue(xQueuedArrayType); - return xArrayMeta; - } - var xPointerType = aTypeRef as PointerType; - if (xPointerType != null) - { - var xQueuedPointerType = new QueuedPointerType(xPointerType); - EcmaCil.PointerTypeMeta xPointerMeta; - if (mPointerTypes.TryGetValue(xQueuedPointerType, out xPointerMeta)) - { - return xPointerMeta; - } - var xElemMeta = EnqueueType(xQueuedPointerType.PointerType.ElementType, aTypeRef, "Array element type"); - xPointerMeta = new EcmaCil.PointerTypeMeta { ElementType = xElemMeta }; - mPointerTypes.Add(xQueuedPointerType, xPointerMeta); - mQueue.Enqueue(xQueuedPointerType); - return xPointerMeta; - } - var xGenSpec = aTypeRef as GenericInstanceType; - if (xGenSpec != null) - { - xTypeDef = ResolveType(xGenSpec.ElementType); - xTypeArgs = new List(); - foreach (TypeReference xArg in xGenSpec.GenericArguments) - { - xTypeArgs.Add(xArg); - } - } - else - { - xTypeDef = ResolveType(aTypeRef); - } - var xQueuedType = new QueuedType(xTypeDef, (xTypeArgs == null ? null : xTypeArgs.ToArray())); - EcmaCil.TypeMeta xTypeMeta; - if (mTypes.TryGetValue(xQueuedType, out xTypeMeta)) - { - return xTypeMeta; - } - xTypeMeta = new EcmaCil.TypeMeta(); - if (xTypeDef.BaseType != null) - { - xTypeMeta.BaseType = EnqueueType(xTypeDef.BaseType, aTypeRef, "Base type"); - } - mTypes.Add(xQueuedType, xTypeMeta); - mQueue.Enqueue(xQueuedType); - return xTypeMeta; - } - - #endregion - - public void Dispose() - { - GC.SuppressFinalize(this); - } - - public void Clear() - { - mMethods.Clear(); - mTypes.Clear(); - mArrayTypes.Clear(); - mPointerTypes.Clear(); - } - - public IEnumerable Execute(string assembly) - { - var xAssemblyDef = AssemblyDefinition.ReadAssembly(assembly); - if (xAssemblyDef.EntryPoint == null) - { - throw new ArgumentException("Main assembly should have entry point!"); - } - if (xAssemblyDef.EntryPoint.GenericParameters.Count > 0 || xAssemblyDef.EntryPoint.DeclaringType.GenericParameters.Count > 0) - { - throw new ArgumentException("Main assembly's entry point has generic parameters. This is not supported!"); - } - EnqueueMethod(xAssemblyDef.EntryPoint, null, "entry point"); - - // handle queue - while (mQueue.Count > 0) - { - var xItem = mQueue.Dequeue(); - if (xItem is QueuedMethod) - { - var xMethod = (QueuedMethod)xItem; - ScanMethod(xMethod, mMethods[xMethod]); - continue; - } - if (xItem is QueuedArrayType) - { - var xType = (QueuedArrayType)xItem; - ScanArrayType(xType, mArrayTypes[xType]); - continue; - } - if (xItem is QueuedPointerType) - { - var xType = (QueuedPointerType)xItem; - ScanPointerType(xType, mPointerTypes[xType]); - continue; - } - if (xItem is QueuedType) - { - var xType = (QueuedType)xItem; - ScanType(xType, mTypes[xType]); - continue; - } - throw new Exception("Queue item not supported: '" + xItem.GetType().FullName + "'!"); - } - - return mTypes.Values.Cast() - .Union(mArrayTypes.Values.Cast()) - .Union(mPointerTypes.Values.Cast()); - } - - private void ScanPointerType(QueuedPointerType xType, EcmaCil.PointerTypeMeta pointerTypeMeta) - { -#if DEBUG - pointerTypeMeta.Data[EcmaCil.DataIds.DebugMetaId] = "&" + pointerTypeMeta.ElementType.ToString(); -#endif - } - - private void ScanArrayType(QueuedArrayType aType, EcmaCil.ArrayTypeMeta arrayTypeMeta) - { - arrayTypeMeta.Dimensions = aType.ArrayType.Dimensions.Count; -// todo: fix? - foreach (ArrayDimension xDimension in aType.ArrayType.Dimensions) - { - if (xDimension.LowerBound != 0 || xDimension.UpperBound != 0) - { - throw new Exception("Arrays with limited dimensions not supported"); - } - } - - -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(arrayTypeMeta.ElementType.ToString()); - xSB.Append("["); - xSB.Append(new String(',', arrayTypeMeta.Dimensions - 1)); - xSB.Append("]"); - arrayTypeMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - - } - - private void ScanType(QueuedType aType, EcmaCil.TypeMeta aTypeMeta) - { -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(aType.Type.ToString()); - if (aType.Args.Length > 0) - { - xSB.Append("<"); - for (int i = 0; i < aType.Args.Length; i++) - { - xSB.Append(aType.Args[i].ToString()); - if (i < (aType.Args.Length - 1)) - { - xSB.Append(", "); - } - } - xSB.Append(">"); - } - aTypeMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - } - - private void ScanMethod(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta) - { - // todo: add support for plugs -#if DEBUG - aMethodMeta.Data[EcmaCil.DataIds.DebugMetaId] = aMethod.Method.ToString(); -#endif - var xParamOffset = 0; - if (!aMethod.Method.IsStatic) - { - xParamOffset = 1; - } - aMethodMeta.Parameters = new EcmaCil.MethodParameterMeta[aMethod.Method.Parameters.Count + xParamOffset]; - if (!aMethod.Method.IsStatic) - { - aMethodMeta.Parameters[0] = new EcmaCil.MethodParameterMeta - { - IsByRef = aMethod.Method.DeclaringType.IsValueType, - PropertyType = EnqueueType(aMethod.Method.DeclaringType, aMethod, "Declaring type") - }; -#if DEBUG - aMethodMeta.Parameters[0].Data[EcmaCil.DataIds.DebugMetaId] = "$this"; -#endif - - } - for(int i = 0; i < aMethod.Method.Parameters.Count;i++){ - var xParam = aMethod.Method.Parameters[i]; - var xParamType = xParam.ParameterType; - if (xParamType is GenericParameter) - { - // todo: resolve generics. - throw new NotImplementedException(); - } - - var xParamMeta = aMethodMeta.Parameters[i + xParamOffset] = new EcmaCil.MethodParameterMeta(); - //if (xParamType is ReferenceType) - //{ - // xParamType = ((ReferenceType)xParamType).ElementType; - // xParamMeta.IsByRef = true; - //} - - var xType = EnqueueType(xParamType, aMethod, "parameter"); -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(xParam.Name); - xSB.Append(": "); - if (xParamMeta.IsByRef) - { - xSB.Append("ref "); - } - xSB.Append(xParamType.ToString()); - xParamMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - xParamMeta.PropertyType = xType; - } - if (aMethod.Method.ReturnType.FullName != "System.Void") - { - aMethodMeta.ReturnType = EnqueueType(aMethod.Method.ReturnType, aMethod.Method, "Return Type"); - } - aMethodMeta.IsStatic = aMethod.Method.IsStatic; - ScanMethodBody(aMethod, aMethodMeta); - #region Virtuals scan - if (aMethod.Method.IsVirtual) - { - if (aMethod.Method.HasGenericParameters) - { - throw new Exception("GEnerics not yet fully supported"); - } - // For virtuals we need to climb up the type tree - // and find the top base method. We then add that top - // node to the mVirtuals list. We don't need to add the - // types becuase adding DeclaringType will already cause - // all ancestor types to be added. - - var xVirtMethod = aMethod.Method; - TypeReference xVirtType = aMethod.Method.DeclaringType; - - xVirtMethod = xVirtMethod.GetOriginalBaseMethod(); - #region old code - // MethodReference xNewVirtMethod = null; -// while (true) -// { -// var xNewVirtType = xVirtType.Resolve(); -// if (xNewVirtType.HasGenericParameters) -// { -// throw new Exception("Generics not fully supported yet!"); -// } -// if (xNewVirtType == null) -// { -// xVirtType = null; -// } -// else -// { -//#warning // todo: verify if next code works ok with generics -// var xTempNewVirtMethod = xNewVirtType. .m.Methods..GetMethod(aMethod.Method.Name, aMethod.Method.Parameters); -// if (xTempNewVirtMethod !=null) -// { -// if (xTempNewVirtMethod.IsVirtual) -// { -// xNewVirtMethod = xTempNewVirtMethod; -// } -// } -// else -// { -// xNewVirtMethod = null; -// } -// } -// if (xNewVirtMethod == null) -// { -// if (mVirtuals.ContainsKey(aMethod)) -// { -// xVirtMethod = null; -// } -// break; -// } -// xVirtMethod = xNewVirtMethod.Resolve(); -// xVirtType = xNewVirtType.BaseType; -// if (xVirtType == null) -// { -// break; -// } - // } - #endregion old code - if (xVirtMethod!=null) - { - EnqueueMethod(xVirtMethod, aMethod, "Virtual Base"); - - foreach (var xType in mTypes) - { - if (xType.Key.Type.IsSubclassOf(xVirtMethod.DeclaringType)) - { - //xType.Key.Type.res - //var xNewMethod = xType.Key.Type.Methods.GetMethod(aMethod.Method.Name, aMethod.Method.Parameters); - //if (xNewMethod != null) - //{ - // // We need to check IsVirtual, a non virtual could - // // "replace" a virtual above it? - // // MtW: correct - // if (xNewMethod.IsVirtual) - // { - // EnqueueMethod(xNewMethod, aMethod, "Virtual Downscan"); - // } - //} - throw new NotImplementedException(); - } - } - } - - } - #endregion - - } - - protected virtual void ScanMethodBody(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta) - { - if (aMethod.Method.HasBody) - { - var xBody = aMethod.Method.Body; - var xBodyMeta = aMethodMeta.Body = new EcmaCil.MethodBodyMeta(); - xBodyMeta.InitLocals = xBody.InitLocals; - #region handle exception handling clauses - if (xBody.HasExceptionHandlers) - { - throw new Exception("ExceptionHandlers are not supported yet"); - } - #endregion - #region handle locals - xBodyMeta.LocalVariables = new EcmaCil.LocalVariableMeta[xBody.Variables.Count]; - for (int i = 0; i < xBody.Variables.Count; i++) - { - var xVar = xBody.Variables[i]; - var xVarMeta = xBodyMeta.LocalVariables[i] = new EcmaCil.LocalVariableMeta(); - xVarMeta.LocalType = EnqueueType(xVar.VariableType, aMethod, "Local variable"); -#if DEBUG - xVarMeta.Data[EcmaCil.DataIds.DebugMetaId] = xVar.Name + ":" + xVar.VariableType.ToString(); -#endif - } - #endregion - - xBodyMeta.Instructions = new EcmaCil.IL.BaseInstruction[xBody.Instructions.Count]; - var xILOffsetToInstructionOffset = new Dictionary(); - var xInstructionOffsetToILOffset = new Dictionary(); - var xSecondStageInits = new List>(); - for (int i = 0; i < xBody.Instructions.Count; i++) - { - xILOffsetToInstructionOffset.Add(xBody.Instructions[i].Offset, i); - xInstructionOffsetToILOffset.Add(i, xBody.Instructions[i].Offset); - } - - for (int i = 0; i < xBody.Instructions.Count; i++) - { - var xInstr = xBody.Instructions[i]; - xBodyMeta.Instructions[i] = - CreateInstructionMeta(aMethod, aMethodMeta, xInstr, xILOffsetToInstructionOffset, xInstructionOffsetToILOffset, i, xSecondStageInits, i + 1); - } - - if (xSecondStageInits.Count > 0) - { - foreach (var xInit in xSecondStageInits) - { - xInit(aMethodMeta); - } - } - } - } - - private BaseInstruction CreateInstructionMeta(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta, Instruction curInstruction, IDictionary aILToInstructionOffset, IDictionary aInstructionToILOffset, int aCurrentIndex, IList> aSecondStageInits, int aNextIndex) - { - switch (curInstruction.OpCode.Code) - { - case Code.Nop: - return new InstructionNone(InstructionKindEnum.Nop, aCurrentIndex); - case Code.Pop: - return new InstructionNone(InstructionKindEnum.Pop, aCurrentIndex); - case Code.Ldc_I4_S: - return new InstructionInt32(GetInstructionKind(curInstruction.OpCode.Code), aCurrentIndex, (int)(sbyte)curInstruction.Operand); - case Code.Stloc_0: - return new InstructionInt32(InstructionKindEnum.Stloc, aCurrentIndex, 0); - case Code.Stloc_1: - return new InstructionInt32(InstructionKindEnum.Stloc, aCurrentIndex, 1); - case Code.Ldloc_0: - return new InstructionLocal(InstructionKindEnum.Ldloc, aCurrentIndex, aMethodMeta.Body.LocalVariables[0]); - case Code.Ldloc_1: - return new InstructionLocal(InstructionKindEnum.Ldloc, aCurrentIndex, aMethodMeta.Body.LocalVariables[1]); - case Code.Ldloc_2: - return new InstructionLocal(InstructionKindEnum.Ldloc, aCurrentIndex, aMethodMeta.Body.LocalVariables[2]); - case Code.Call: - return new InstructionMethod(InstructionKindEnum.Call, aCurrentIndex, EnqueueMethod(curInstruction.Operand as MethodReference, aMethod.Method, "Operand value")); - case Code.Callvirt: - return new InstructionMethod(InstructionKindEnum.Callvirt, aCurrentIndex, EnqueueMethod(curInstruction.Operand as MethodReference, aMethod.Method, "Operand value")); - case Code.Stloc_2: - return new InstructionLocal(InstructionKindEnum.Stloc, aCurrentIndex, aMethodMeta.Body.LocalVariables[2]); - case Code.Stloc_3: - return new InstructionLocal(InstructionKindEnum.Stloc, aCurrentIndex, aMethodMeta.Body.LocalVariables[3]); - case Code.Ret: - return new InstructionNone(InstructionKindEnum.Ret, aCurrentIndex); - case Code.Ldarg_0: - return new InstructionArgument(InstructionKindEnum.Ldarg, aCurrentIndex, aMethodMeta.Parameters[0]); - case Code.Ldarg_1: - return new InstructionArgument(InstructionKindEnum.Ldarg, aCurrentIndex, aMethodMeta.Parameters[1]); - case Code.Add: - return new InstructionNone(InstructionKindEnum.Add, aCurrentIndex); - case Code.Ldstr: - return new InstructionString(InstructionKindEnum.Ldstr, aCurrentIndex, (string)curInstruction.Operand); - case Code.Newobj: - return new InstructionMethod(InstructionKindEnum.Newobj, aCurrentIndex, EnqueueMethod(curInstruction.Operand as MethodReference, aMethod.Method, "Operand value")); - case Code.Br_S: - case Code.Brfalse_S: - var xInstr = new InstructionBranch(GetInstructionKind(curInstruction.OpCode.Code), aCurrentIndex); - var xTargetInstr = (Instruction)curInstruction.Operand; - var xTargetOffset = xTargetInstr.Offset; - aSecondStageInits.Add(delegate(EcmaCil.MethodMeta aTheMethod) - { - xInstr.Target = aTheMethod.Body.Instructions[aILToInstructionOffset[xTargetOffset]]; - }); - return xInstr; - - // case - //case OperandType.InlineNone: - // { - // xInstrMeta = new InstructionNone(GetInstructionKind(xInstr.OpCode.Code), i + xOffset); - // break; - // } - //case OperandType.ShortInlineI: - // { - // xInstrMeta = new InstructionInt32(GetInstructionKind(xInstr.OpCode.Code), i + xOffset, (int)(sbyte)xInstr.Operand); - // break; - // } - default: throw new Exception("Op '" + curInstruction.OpCode.Code + "' not implemented!"); - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/ReaderWithPlugSupport.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/ReaderWithPlugSupport.cs deleted file mode 100644 index a39f9743ad..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/ReaderWithPlugSupport.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; -using IL2CPU.API; - -namespace MonoCecilToEcmaCil1 -{ - public class ReaderWithPlugSupport: Reader - { - public void AddPlugAssembly(string path) - { - var xAssembly = AssemblyDefinition.ReadAssembly(path); - foreach (ModuleDefinition xModule in xAssembly.Modules) - { - foreach (TypeDefinition xType in xModule.Types) - { - TypeReference xTargetType=null; - - foreach (CustomAttribute xAttrib in xType.CustomAttributes) - { - if (xAttrib.Constructor.DeclaringType.FullName == typeof(PlugAttribute).FullName) - { - - throw new NotImplementedException(); - break; - } - } - //if (!xHasPlugAttrib) - //{ - // continue; - //} - - //x - } - } - throw new NotImplementedException(); - } - - private Dictionary mPlugTypes = new Dictionary(); - - protected override void ScanMethodBody(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta) - { - base.ScanMethodBody(aMethod, aMethodMeta); - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedArrayType.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedArrayType.cs deleted file mode 100644 index e24bfbfa8b..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedArrayType.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; - -namespace MonoCecilToEcmaCil1 -{ - public struct QueuedArrayType : IEquatable - { - public readonly ArrayType ArrayType; - - public QueuedArrayType(ArrayType arrayType) - { - ArrayType = arrayType; - } - - public override int GetHashCode() - { - return ArrayType.GetHashCode(); - } - public bool Equals(QueuedArrayType qm) - { - if (!qm.ArrayType.Equals(ArrayType)) - { - return false; - } - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedArrayType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedMethod.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedMethod.cs deleted file mode 100644 index bfae8559bb..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedMethod.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; - -namespace MonoCecilToEcmaCil1 -{ - public struct QueuedMethod : IEquatable - { - private readonly TypeDefinition type; - private readonly MethodDefinition method; - private readonly TypeReference[] args; - - private readonly static TypeReference[] empty = new TypeReference[0]; - - public TypeDefinition Type { get { return type; } } - public MethodDefinition Method { get { return method; } } - public TypeReference[] Args { get { return args ?? empty; } } - - public QueuedMethod(TypeDefinition type, MethodDefinition method, TypeReference[] args) - { - this.type = type; - this.method = method; - this.args = args; - } - - public override int GetHashCode() - { - unchecked - { - uint n = (uint)(type.GetHashCode() ^ method.GetHashCode() ^ Args.Length); - - for (int i = Args.Length - 1; i >= 0; i--) - { - n = (n << 1) | (n >> 31); - n ^= (uint)args[i].GetHashCode(); - } - return (int)n; - } - } - public bool Equals(QueuedMethod qm) - { - if (!qm.type.Equals(type) || !qm.method.Equals(method) || qm.Args.Length != Args.Length) - return false; - for (int i = Args.Length - 1; i >= 0; i--) - { - if (!args[i].Equals(qm.args[i])) - return false; - } - return true; - } - public override bool Equals(object obj) - { - return Equals((QueuedMethod)obj); - } - } -} diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedPointerType.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedPointerType.cs deleted file mode 100644 index 94cdd356e4..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedPointerType.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; - -namespace MonoCecilToEcmaCil1 -{ - public struct QueuedPointerType : IEquatable - { - public readonly PointerType PointerType; - - public QueuedPointerType(PointerType pointerType) - { - PointerType = pointerType; - } - - public override int GetHashCode() - { - return PointerType.GetHashCode(); - } - public bool Equals(QueuedPointerType qm) - { - if (!qm.PointerType.Equals(PointerType)) - return false; - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedPointerType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedType.cs b/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedType.cs deleted file mode 100644 index 5ede93d9aa..0000000000 --- a/Users/Matthijs/Testing/MonoCecilToEcmaCil1/_QueueItems/QueuedType.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Mono.Cecil; - -namespace MonoCecilToEcmaCil1 -{ - public struct QueuedType : IEquatable - { - public readonly TypeDefinition Type; - public readonly TypeReference[] Args; - - private readonly static TypeReference[] empty = new TypeReference[0]; - - public QueuedType(TypeDefinition type, TypeReference[] args) - { - Type = type; - if (args == null) - { - Args = empty; - } - else - { - Args = args; - } - } - - public override int GetHashCode() - { - unchecked - { - uint n = (uint)(Type.GetHashCode()); - if (Args != null) - { - n ^= (uint)Args.Length; - for (int i = Args.Length - 1; i >= 0; i--) - { - n = (n << 1) | (n >> 31); - n ^= (uint)Args[i].GetHashCode(); - } - } - return (int)n; - } - } - public bool Equals(QueuedType qm) - { - if (!qm.Type.Equals(Type) || qm.Args.Length != Args.Length) - return false; - for (int i = Args.Length - 1; i >= 0; i--) - { - if (!Args[i].Equals(qm.Args[i])) - return false; - } - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/BaseTest.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/BaseTest.cs deleted file mode 100644 index a03093dba1..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/BaseTest.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using EcmaCil; -using System.IO; -using System.Xml; - -namespace ReflectionToEcmaCil.Tests -{ - public class BaseTest - { - protected void AssertCompilationSame(string refName, Type baseType) - { - var xReader = new Reader(); - var xResult = xReader.Execute(baseType.Assembly.Location); - string xActualOutput; - using (var xStringWriter = new StringWriter()) - { - using (var xXmlOut = XmlWriter.Create(xStringWriter)) - { - Dump.DumpTypes(xResult, xXmlOut); - xXmlOut.Flush(); - xStringWriter.Flush(); - xActualOutput = xStringWriter.ToString(); - } - } - - var xExpectedOutput = ReadAllTextFromStream(baseType.Assembly.GetManifestResourceStream(baseType.Namespace + "." + refName + ".xml")); - Assert.AreEqual(xExpectedOutput, xActualOutput); - } - - private static string ReadAllTextFromStream(Stream aStream) - { - using (var xStreamReader = new StreamReader(aStream)) - { - return xStreamReader.ReadToEnd(); - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 06bd0f0091..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/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("ReflectionToEcmaCil.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("ReflectionToEcmaCil.Tests")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("1c3b6b05-902a-4ed4-8a50-27a4708adf0a")] - -// 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/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/ReflectionToEcmaCil.Tests.csproj b/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/ReflectionToEcmaCil.Tests.csproj deleted file mode 100644 index 45a0de67b1..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/ReflectionToEcmaCil.Tests.csproj +++ /dev/null @@ -1,94 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {0D162A82-CBC1-4A39-916D-E1079B212DDE} - Library - Properties - ReflectionToEcmaCil.Tests - ReflectionToEcmaCil.Tests - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\libraries\nunit.framework.dll - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62} - SimpleClassTest - - - {B47ED632-1ACE-4516-9576-81E38BA092F1} - SimpleMethodsTest - - - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - EcmaCil - - - {FD4B2006-B518-4884-B196-C2EF2B83FD6F} - ReflectionToEcmaCil - - - - - diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/SimpleMethodsTest.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/SimpleMethodsTest.cs deleted file mode 100644 index a9398b44b4..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil.Tests/SimpleMethodsTest.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; - -namespace ReflectionToEcmaCil.Tests -{ - [TestFixture] - public class SimpleMethodsTestsTest : BaseTest - { - [Test] - public void DoTest() - { - AssertCompilationSame("SimpleMethodsTests", typeof(SimpleMethodsTest.Program)); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Enums.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Enums.cs deleted file mode 100644 index 4c0e5432a9..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Enums.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ReflectionToEcmaCil -{ - public enum OpCodeEnum : ushort - { - #region Values - Nop = 0x0000, - Break = 0x0001, - Ldarg_0 = 0x0002, - Ldarg_1 = 0x0003, - Ldarg_2 = 0x0004, - Ldarg_3 = 0x0005, - Ldloc_0 = 0x0006, - Ldloc_1 = 0x0007, - Ldloc_2 = 0x0008, - Ldloc_3 = 0x0009, - Stloc_0 = 0x000A, - Stloc_1 = 0x000B, - Stloc_2 = 0x000C, - Stloc_3 = 0x000D, - Ldarg_S = 0x000E, - Ldarga_S = 0x000F, - Starg_S = 0x0010, - Ldloc_S = 0x0011, - Ldloca_S = 0x0012, - Stloc_S = 0x0013, - Ldnull = 0x0014, - Ldc_I4_M1 = 0x0015, - Ldc_I4_0 = 0x0016, - Ldc_I4_1 = 0x0017, - Ldc_I4_2 = 0x0018, - Ldc_I4_3 = 0x0019, - Ldc_I4_4 = 0x001A, - Ldc_I4_5 = 0x001B, - Ldc_I4_6 = 0x001C, - Ldc_I4_7 = 0x001D, - Ldc_I4_8 = 0x001E, - Ldc_I4_S = 0x001F, - Ldc_I4 = 0x0020, - Ldc_I8 = 0x0021, - Ldc_R4 = 0x0022, - Ldc_R8 = 0x0023, - Dup = 0x0025, - Pop = 0x0026, - Jmp = 0x0027, - Call = 0x0028, - Calli = 0x0029, - Ret = 0x002A, - Br_S = 0x002B, - Brfalse_S = 0x002C, - Brtrue_S = 0x002D, - Beq_S = 0x002E, - Bge_S = 0x002F, - Bgt_S = 0x0030, - Ble_S = 0x0031, - Blt_S = 0x0032, - Bne_Un_S = 0x0033, - Bge_Un_S = 0x0034, - Bgt_Un_S = 0x0035, - Ble_Un_S = 0x0036, - Blt_Un_S = 0x0037, - Br = 0x0038, - Brfalse = 0x0039, - Brtrue = 0x003A, - Beq = 0x003B, - Bge = 0x003C, - Bgt = 0x003D, - Ble = 0x003E, - Blt = 0x003F, - Bne_Un = 0x0040, - Bge_Un = 0x0041, - Bgt_Un = 0x0042, - Ble_Un = 0x0043, - Blt_Un = 0x0044, - Switch = 0x0045, - Ldind_I1 = 0x0046, - Ldind_U1 = 0x0047, - Ldind_I2 = 0x0048, - Ldind_U2 = 0x0049, - Ldind_I4 = 0x004A, - Ldind_U4 = 0x004B, - Ldind_I8 = 0x004C, - Ldind_I = 0x004D, - Ldind_R4 = 0x004E, - Ldind_R8 = 0x004F, - Ldind_Ref = 0x0050, - Stind_Ref = 0x0051, - Stind_I1 = 0x0052, - Stind_I2 = 0x0053, - Stind_I4 = 0x0054, - Stind_I8 = 0x0055, - Stind_R4 = 0x0056, - Stind_R8 = 0x0057, - Add = 0x0058, - Sub = 0x0059, - Mul = 0x005A, - Div = 0x005B, - Div_Un = 0x005C, - Rem = 0x005D, - Rem_Un = 0x005E, - And = 0x005F, - Or = 0x0060, - Xor = 0x0061, - Shl = 0x0062, - Shr = 0x0063, - Shr_Un = 0x0064, - Neg = 0x0065, - Not = 0x0066, - Conv_I1 = 0x0067, - Conv_I2 = 0x0068, - Conv_I4 = 0x0069, - Conv_I8 = 0x006A, - Conv_R4 = 0x006B, - Conv_R8 = 0x006C, - Conv_U4 = 0x006D, - Conv_U8 = 0x006E, - Callvirt = 0x006F, - Cpobj = 0x0070, - Ldobj = 0x0071, - Ldstr = 0x0072, - Newobj = 0x0073, - Castclass = 0x0074, - Isinst = 0x0075, - Conv_R_Un = 0x0076, - Unbox = 0x0079, - Throw = 0x007A, - Ldfld = 0x007B, - Ldflda = 0x007C, - Stfld = 0x007D, - Ldsfld = 0x007E, - Ldsflda = 0x007F, - Stsfld = 0x0080, - Stobj = 0x0081, - Conv_Ovf_I1_Un = 0x0082, - Conv_Ovf_I2_Un = 0x0083, - Conv_Ovf_I4_Un = 0x0084, - Conv_Ovf_I8_Un = 0x0085, - Conv_Ovf_U1_Un = 0x0086, - Conv_Ovf_U2_Un = 0x0087, - Conv_Ovf_U4_Un = 0x0088, - Conv_Ovf_U8_Un = 0x0089, - Conv_Ovf_I_Un = 0x008A, - Conv_Ovf_U_Un = 0x008B, - Box = 0x008C, - Newarr = 0x008D, - Ldlen = 0x008E, - Ldelema = 0x008F, - Ldelem_I1 = 0x0090, - Ldelem_U1 = 0x0091, - Ldelem_I2 = 0x0092, - Ldelem_U2 = 0x0093, - Ldelem_I4 = 0x0094, - Ldelem_U4 = 0x0095, - Ldelem_I8 = 0x0096, - Ldelem_I = 0x0097, - Ldelem_R4 = 0x0098, - Ldelem_R8 = 0x0099, - Ldelem_Ref = 0x009A, - Stelem_I = 0x009B, - Stelem_I1 = 0x009C, - Stelem_I2 = 0x009D, - Stelem_I4 = 0x009E, - Stelem_I8 = 0x009F, - Stelem_R4 = 0x00A0, - Stelem_R8 = 0x00A1, - Stelem_Ref = 0x00A2, - Ldelem = 0x00A3, - Stelem = 0x00A4, - Unbox_Any = 0x00A5, - Conv_Ovf_I1 = 0x00B3, - Conv_Ovf_U1 = 0x00B4, - Conv_Ovf_I2 = 0x00B5, - Conv_Ovf_U2 = 0x00B6, - Conv_Ovf_I4 = 0x00B7, - Conv_Ovf_U4 = 0x00B8, - Conv_Ovf_I8 = 0x00B9, - Conv_Ovf_U8 = 0x00BA, - Refanyval = 0x00C2, - Ckfinite = 0x00C3, - Mkrefany = 0x00C6, - Ldtoken = 0x00D0, - Conv_U2 = 0x00D1, - Conv_U1 = 0x00D2, - Conv_I = 0x00D3, - Conv_Ovf_I = 0x00D4, - Conv_Ovf_U = 0x00D5, - Add_Ovf = 0x00D6, - Add_Ovf_Un = 0x00D7, - Mul_Ovf = 0x00D8, - Mul_Ovf_Un = 0x00D9, - Sub_Ovf = 0x00DA, - Sub_Ovf_Un = 0x00DB, - Endfinally = 0x00DC, - Leave = 0x00DD, - Leave_S = 0x00DE, - Stind_I = 0x00DF, - Conv_U = 0x00E0, - Prefix7 = 0x00F8, - Prefix6 = 0x00F9, - Prefix5 = 0x00FA, - Prefix4 = 0x00FB, - Prefix3 = 0x00FC, - Prefix2 = 0x00FD, - Prefix1 = 0x00FE, - Prefixref = 0x00FF, - Arglist = 0xFE00, - Ceq = 0xFE01, - Cgt = 0xFE02, - Cgt_Un = 0xFE03, - Clt = 0xFE04, - Clt_Un = 0xFE05, - Ldftn = 0xFE06, - Ldvirtftn = 0xFE07, - Ldarg = 0xFE09, - Ldarga = 0xFE0A, - Starg = 0xFE0B, - Ldloc = 0xFE0C, - Ldloca = 0xFE0D, - Stloc = 0xFE0E, - Localloc = 0xFE0F, - Endfilter = 0xFE11, - Unaligned = 0xFE12, - Volatile = 0xFE13, - Tailcall = 0xFE14, - Initobj = 0xFE15, - Constrained = 0xFE16, - Cpblk = 0xFE17, - Initblk = 0xFE18, - Rethrow = 0xFE1A, - Sizeof = 0xFE1C, - Refanytype = 0xFE1D, - Readonly = 0xFE1E - #endregion - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Extensions.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Extensions.cs deleted file mode 100644 index 143d581122..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Extensions.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; - -namespace ReflectionToEcmaCil -{ - public static class Extensions - { - public static string GetFullName(this MethodBase aMethod) - { - if (aMethod == null) - { - throw new ArgumentNullException("aMethod"); - } - var xBuilder = new StringBuilder(256); - var xParts = aMethod.ToString().Split(' '); - var xParts2 = xParts.Skip(1).ToArray(); - var xMethodInfo = aMethod as System.Reflection.MethodInfo; - if (xMethodInfo != null) - { - xBuilder.Append(GetFullName(xMethodInfo.ReturnType)); - } - else - { - var xCtor = aMethod as ConstructorInfo; - if (xCtor != null) - { - xBuilder.Append(typeof(void).FullName); - } - else - { - xBuilder.Append(xParts[0]); - } - } - xBuilder.Append(" "); - xBuilder.Append(GetFullName(aMethod.DeclaringType)); - xBuilder.Append("."); - xBuilder.Append(aMethod.Name); - if (aMethod.IsGenericMethod || aMethod.IsGenericMethodDefinition) - { - var xGenArgs = aMethod.GetGenericArguments(); - if (xGenArgs.Length > 0) - { - xBuilder.Append("<"); - for (int i = 0; i < xGenArgs.Length - 1; i++) - { - xBuilder.Append(GetFullName(xGenArgs[i])); - xBuilder.Append(", "); - } - xBuilder.Append(GetFullName(xGenArgs.Last())); - xBuilder.Append(">"); - } - } - xBuilder.Append("("); - var xParams = aMethod.GetParameters(); - for (var i = 0; i < xParams.Length; i++) - { - if (xParams[i].Name == "aThis" && i == 0) - { - continue; - } - xBuilder.Append(GetFullName(xParams[i].ParameterType)); - if (i < (xParams.Length - 1)) - { - xBuilder.Append(", "); - } - } - xBuilder.Append(")"); - return String.Intern(xBuilder.ToString()); - } - - private static string GetFullName(this Type aType) - { - if (aType.IsGenericParameter) - { - return aType.Name; - } - var xSB = new StringBuilder(); - if (aType.IsArray) - { - xSB.Append(aType.GetElementType().GetFullName()); - xSB.Append("["); - int xRank = aType.GetArrayRank(); - while (xRank > 1) - { - xSB.Append(","); - xRank--; - } - xSB.Append("]"); - return xSB.ToString(); - } - if (aType.IsByRef && aType.HasElementType) - { - return "&" + aType.GetElementType().GetFullName(); - } - if (aType.IsGenericType) - { - xSB.Append(aType.GetGenericTypeDefinition().FullName); - } - else - { - xSB.Append(aType.FullName); - } - if (aType.ContainsGenericParameters) - { - xSB.Append("<"); - var xArgs = aType.GetGenericArguments(); - for (int i = 0; i < xArgs.Length - 1; i++) - { - xSB.Append(GetFullName(xArgs[i])); - xSB.Append(", "); - } if (xArgs.Length == 0) { Console.Write(""); } - xSB.Append(GetFullName(xArgs.Last())); - xSB.Append(">"); - } - return xSB.ToString(); - } - - public static string GetFullName(this FieldInfo aField) - { - return aField.FieldType.GetFullName() + " " + aField.DeclaringType.GetFullName() + "." + aField.Name; - //var xSB = new StringBuilder(aField.FieldType.FullName.Length + 1 + aField.DeclaringType.FullName.Length + 1 + aField.Name); - //xSB.Append(aField.FieldType.FullName); - //xSB.Append(" "); - //xSB.Append(aField.DeclaringType.FullName); - //xSB.Append("."); - //xSB.Append(aField.Name); - //return String.Intern(xSB.ToString()); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/ILReader.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/ILReader.cs deleted file mode 100644 index df7d44d39d..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/ILReader.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection.Emit; -using System.Reflection; -using Cil = EcmaCil.IL; - -namespace ReflectionToEcmaCil -{ - public class ILReader - { - - - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/ILStreamPositionReader.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/ILStreamPositionReader.cs deleted file mode 100644 index 975ebfb6ce..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/ILStreamPositionReader.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ReflectionToEcmaCil -{ - public class ILStreamPositionReader - { - private static readonly byte[] InstructionLengthsLow; - private static readonly byte[] InstructionLengthsHigh; - - static ILStreamPositionReader() - { - #region init InstructionLengthsLow - InstructionLengthsLow = new byte[256]{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 4, 8, 4, 8, 0, 0, 0, 4, 4, 4, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, - 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, 4, 4, 4, 4, 4, - 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - #endregion - #region init InstructionLengthsHigh - InstructionLengthsHigh = new byte[256]{ - 0, 0, 0, 0, 0, 0, 4, 4, 0, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 1, 0, 0, 4, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - #endregion - } - - /// - /// .Key contains stream index, .Value contains instruction (logical) index - /// - public static IEnumerable> GetIndexes(byte[] stream) - { - int xCurrentIndex = 0; - int xCurrentPosition = 0; - yield return new KeyValuePair(0, 0); - - while (xCurrentPosition < stream.Length) - { - var xOp = stream[xCurrentPosition]; - if (xOp == 0xFE) - { - xCurrentPosition++; - xOp = stream[xCurrentPosition]; - xCurrentPosition += InstructionLengthsHigh[xOp]; - } - else - { - xCurrentPosition += InstructionLengthsLow[xOp]; - } - xCurrentPosition++; - xCurrentIndex++; - yield return new KeyValuePair(xCurrentPosition, xCurrentIndex); - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Properties/AssemblyInfo.cs deleted file mode 100644 index 4526ed682a..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/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("ReflectionToEcmaCil")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("ReflectionToEcmaCil")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("201b6c38-2eec-4eef-95c6-725eb7a47d4b")] - -// 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/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Queueing.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Queueing.cs deleted file mode 100644 index 5a5292322b..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Queueing.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; - -namespace ReflectionToEcmaCil -{ - partial class Reader - { - private Queue mQueue = new Queue(); - - private EcmaCil.MethodMeta EnqueueMethod(MethodBase aMethod, object aSource, string aSourceType) - { - if (mLogEnabled) - { - LogMapPoint(aSource, aSourceType, aMethod); - } - if (aMethod.IsGenericMethodDefinition) - { - throw new Exception("Cannot queue generic method definitions"); - } - Type xReturnType = null; - var xMethodInfo = aMethod as MethodInfo; - if (xMethodInfo != null) - { - xReturnType = xMethodInfo.ReturnType; - } - else - { - xReturnType = typeof(void); - } - var xQueuedMethod = new QueuedMethod(aMethod.DeclaringType, aMethod, (from item in aMethod.GetParameters() - select item.ParameterType).ToArray(), xReturnType); - EcmaCil.MethodMeta xMethodMeta; - if(mMethods.TryGetValue(xQueuedMethod, out xMethodMeta)){ - return xMethodMeta; - } - var xDeclaringType = EnqueueType(aMethod.DeclaringType, aMethod, "Declaring type"); - xMethodMeta = new EcmaCil.MethodMeta(); - mMethodMetaToMethod.Add(xMethodMeta, aMethod); - xMethodMeta.DeclaringType = xDeclaringType; - xDeclaringType.Methods.Add(xMethodMeta); - mMethods.Add(xQueuedMethod, xMethodMeta); - mQueue.Enqueue(xQueuedMethod); - return xMethodMeta; - } - - private EcmaCil.TypeMeta EnqueueType(Type aTypeRef, object aSource, string aSourceType) - { - if (mLogEnabled) - { - LogMapPoint(aSource, aSourceType, aTypeRef); - } - List xTypeArgs = null; - if (aTypeRef.IsArray) - { - var xQueuedArrayType = new QueuedArrayType(aTypeRef); - EcmaCil.ArrayTypeMeta xArrayMeta; - if (mArrayTypes.TryGetValue(xQueuedArrayType, out xArrayMeta)) - { - return xArrayMeta; - } - var xElemMeta = EnqueueType(aTypeRef.GetElementType(), aTypeRef, "Array element type"); - xArrayMeta = new EcmaCil.ArrayTypeMeta { ElementType = xElemMeta }; - mArrayTypes.Add(xQueuedArrayType, xArrayMeta); - mQueue.Enqueue(xQueuedArrayType); - return xArrayMeta; - } - if (aTypeRef.IsPointer) - { - var xQueuedPointerType = new QueuedPointerType(aTypeRef); - EcmaCil.PointerTypeMeta xPointerMeta; - if (mPointerTypes.TryGetValue(xQueuedPointerType, out xPointerMeta)) - { - return xPointerMeta; - } - var xElemMeta = EnqueueType(aTypeRef.GetElementType(), aTypeRef, "Array element type"); - xPointerMeta = new EcmaCil.PointerTypeMeta { ElementType = xElemMeta }; - mPointerTypes.Add(xQueuedPointerType, xPointerMeta); - mQueue.Enqueue(xQueuedPointerType); - return xPointerMeta; - } - if (aTypeRef.IsGenericType) - { - xTypeArgs = new List(aTypeRef.GetGenericArguments()); - } - var xQueuedType = new QueuedType(aTypeRef, (xTypeArgs == null ? null : xTypeArgs.ToArray())); - EcmaCil.TypeMeta xTypeMeta; - if (mTypes.TryGetValue(xQueuedType, out xTypeMeta)) - { - return xTypeMeta; - } - xTypeMeta = new EcmaCil.TypeMeta(); - mTypeMetaToType.Add(xTypeMeta, aTypeRef); - if (aTypeRef.BaseType != null) - { - xTypeMeta.BaseType = EnqueueType(aTypeRef.BaseType, aTypeRef, "Base type"); - } - mTypes.Add(xQueuedType, xTypeMeta); - mQueue.Enqueue(xQueuedType); - return xTypeMeta; - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.ScanLog.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.ScanLog.cs deleted file mode 100644 index 2617408ff1..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.ScanLog.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using System.Reflection; - -namespace ReflectionToEcmaCil -{ - partial class Reader - { - protected bool mLogEnabled = false; - protected string mMapPathname; - protected TextWriter mLogWriter; - protected struct LogItem - { - public string SrcType; - public object Item; - } - protected Dictionary> mLogMap; - - public void EnableLogging(string aPathname) - { - mLogMap = new Dictionary>(); - mMapPathname = aPathname; - mLogEnabled = true; - } - - public void WriteScanMap() - { - if (mLogEnabled) - { - // Create bookmarks, but also a dictionary that - // we can find the items in - var xBookmarks = new Dictionary(); - int xBookmark = 0; - foreach (var xList in mLogMap) - { - foreach (var xItem in xList.Value) - { - if (!xBookmarks.ContainsKey(xItem.Item)) - { - xBookmarks.Add(xItem.Item, xBookmark); - xBookmark++; - } - } - } - using (mLogWriter = new StreamWriter(mMapPathname, false)) - { - mLogWriter.WriteLine(""); - foreach (var xList in mLogMap) - { - mLogWriter.WriteLine("
"); - - // Emit bookmarks above source, so when clicking links user doesn't need - // to constantly scroll up. - foreach (var xItem in xList.Value) - { - mLogWriter.WriteLine(""); - } - - int xHref; - if (!xBookmarks.TryGetValue(xList.Key, out xHref)) - { - xHref = -1; - } - mLogWriter.Write("

"); - if (xHref >= 0) - { - mLogWriter.WriteLine(""); - } - if (xList.Key == null) - { - mLogWriter.WriteLine("Unspecified Source"); - } - else - { - mLogWriter.WriteLine(LogItemText(xList.Key)); - } - if (xHref >= 0) - { - mLogWriter.Write(""); - } - mLogWriter.WriteLine("

"); - - mLogWriter.WriteLine("
    "); - foreach (var xItem in xList.Value) - { - mLogWriter.Write("
  • " + LogItemText(xItem.Item) + "
  • "); - - mLogWriter.WriteLine("
      "); - mLogWriter.WriteLine("
    • " + xItem.SrcType + ""); - mLogWriter.WriteLine("
    "); - } - mLogWriter.WriteLine("
"); - } - mLogWriter.WriteLine(""); - } - } - } - - protected string LogItemText(object aItem) - { - if (aItem is MethodBase) - { - var x = (MethodBase)aItem; - return "Method: " + x.DeclaringType + "." + x.Name + "
" + x.ToString(); - } - else if (aItem is Type) - { - var x = (Type)aItem; - return "Type: " + x.FullName; - } - else - { - return "Other: " + aItem.ToString(); - } - } - - private void LogMapPoint(object aSrc, string aSrcType, object aItem) - { - // Keys cant be null. If null, we just say ILScanner is the source - if (aSrc == null) - { - aSrc = typeof(Reader); - } - - var xLogItem = new LogItem() - { - SrcType = aSrcType, - Item = aItem - }; - List xList; - if (!mLogMap.TryGetValue(aSrc, out xList)) - { - xList = new List(); - mLogMap.Add(aSrc, xList); - } - xList.Add(xLogItem); - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Scanning.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Scanning.cs deleted file mode 100644 index 53581fc351..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.Scanning.cs +++ /dev/null @@ -1,755 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection.Emit; -using System.Reflection; -using Cil = EcmaCil.IL; - -namespace ReflectionToEcmaCil -{ - partial class Reader - { - private void ScanType(QueuedType aType, EcmaCil.TypeMeta aTypeMeta) - { -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(aType.Type.ToString()); - if (aType.Args.Length > 0) - { - xSB.Append("<"); - for (int i = 0; i < aType.Args.Length; i++) - { - xSB.Append(aType.Args[i].ToString()); - if (i < (aType.Args.Length - 1)) - { - xSB.Append(", "); - } - } - xSB.Append(">"); - } - aTypeMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - } - - private void ScanMethod(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta) - { - // todo: add support for plugs -#if DEBUG - aMethodMeta.Data[EcmaCil.DataIds.DebugMetaId] = aMethod.Method.GetFullName(); -#endif - aMethodMeta.IsVirtual = aMethod.Method.IsVirtual; - aMethodMeta.IsPublic = aMethod.Method.IsPublic; - var xMethod = aMethod.Method; - aMethodMeta.StartsNewVirtualTree = aMethodMeta.IsVirtual && ((aMethod.Method.Attributes & MethodAttributes.NewSlot) == MethodAttributes.NewSlot); - - var xParamOffset = 0; - if (!aMethod.Method.IsStatic) - { - xParamOffset = 1; - } - var xMethodParameters = aMethod.Method.GetParameters(); - aMethodMeta.Parameters = new EcmaCil.MethodParameterMeta[xMethodParameters.Length + xParamOffset]; - if (!aMethod.Method.IsStatic) - { - aMethodMeta.Parameters[0] = new EcmaCil.MethodParameterMeta - { - IsByRef = aMethod.Method.DeclaringType.IsValueType, - PropertyType = EnqueueType(aMethod.Method.DeclaringType, aMethod, "Declaring type") - }; -#if DEBUG - aMethodMeta.Parameters[0].Data[EcmaCil.DataIds.DebugMetaId] = "$this"; -#endif - - } - for (int i = 0; i < xMethodParameters.Length; i++) - { - var xParam = xMethodParameters[i]; - var xParamType = xParam.ParameterType; - var xParamMeta = aMethodMeta.Parameters[i + xParamOffset] = new EcmaCil.MethodParameterMeta(); - var xType = EnqueueType(xParamType, aMethod, "parameter"); -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(xParam.Name); - xSB.Append(": "); - if (xParamMeta.IsByRef) - { - xSB.Append("ref "); - } - xSB.Append(xParamType.ToString()); - xParamMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - xParamMeta.PropertyType = xType; - } - - if (aMethodMeta.IsVirtual && ((aMethod.Method.Attributes & MethodAttributes.NewSlot) != MethodAttributes.NewSlot)) - { - // method is override - // now need to find parent method, just one level up, because when the parent method is scanned, its parent method will be found.. - var xBaseType = aMethod.Method.DeclaringType; -#if DEBUG - if (xBaseType == null) - { - throw new Exception("New virtual method found, but declaring type has no base type"); - } -#endif - var xBindFlags = BindingFlags.Instance; - if (xMethod.IsPublic) - { - xBindFlags |= BindingFlags.Public; - } - else - { - xBindFlags |= BindingFlags.NonPublic; - } - var xFoundMethod = xBaseType.GetMethod(aMethod.Method.Name, - xBindFlags, null, (from item in xMethodParameters - select item.ParameterType).ToArray(), null); - if (xFoundMethod != null) - { - EnqueueMethod(xFoundMethod, aMethod, "Overridden method"); - } - } - - var xMethodInfo = aMethod.Method as MethodInfo; - var xReturnType = typeof(void); - if (xMethodInfo != null) - { - xReturnType = xMethodInfo.ReturnType; - } - - if (xReturnType != typeof(void)) - { - aMethodMeta.ReturnType = EnqueueType(xReturnType, aMethod.Method, "Return Type"); - } - aMethodMeta.IsStatic = aMethod.Method.IsStatic; - ScanMethodBody(aMethod, aMethodMeta); - } - - protected virtual void ScanMethodBody(QueuedMethod aMethod, EcmaCil.MethodMeta aMethodMeta) - { - var xBody = aMethod.Method.GetMethodBody(); - if (xBody != null) - { - var xBodyMeta = aMethodMeta.Body = new EcmaCil.MethodBodyMeta(); - xBodyMeta.InitLocals = xBody.InitLocals; - #region handle exception handling clauses - if (xBody.ExceptionHandlingClauses.Count > 0) - { - throw new Exception("ExceptionHandlers are not supported yet"); - } - #endregion - #region handle locals - xBodyMeta.LocalVariables = new EcmaCil.LocalVariableMeta[xBody.LocalVariables.Count]; - for (int i = 0; i < xBody.LocalVariables.Count; i++) - { - var xVar = xBody.LocalVariables[i]; - var xVarMeta = xBodyMeta.LocalVariables[i] = new EcmaCil.LocalVariableMeta(); - xVarMeta.LocalType = EnqueueType(xVar.LocalType, aMethod, "Local variable"); -#if DEBUG - xVarMeta.Data[EcmaCil.DataIds.DebugMetaId] = xVar.LocalType.ToString(); -#endif - } - #endregion - - //List xInstructions; - var xILOffsetToInstructionOffset = new Dictionary(); - var xInstructionOffsetToILOffset = new Dictionary(); - var xSecondStageInits = new List>(); - - var xILStream = xBody.GetILAsByteArray(); - foreach (var xPosition in ILStreamPositionReader.GetIndexes(xILStream)) - { - xILOffsetToInstructionOffset.Add(xPosition.Key, xPosition.Value); - xInstructionOffsetToILOffset.Add(xPosition.Value, xPosition.Key); - } - xBodyMeta.Instructions = ScanMethodBody_DoIt(aMethod.Method, aMethodMeta, xILOffsetToInstructionOffset, xInstructionOffsetToILOffset).ToArray(); - } - } - - // We split this into two arrays since we have to read - // a byte at a time anways. In the future if we need to - // back to a unifed array, instead of 64k entries - // we can change it to a signed int, and then add x0200 to the value. - // This will reduce array size down to 768 entries. - static readonly OpCode[] mOpCodesLo = new OpCode[256]; - static readonly OpCode[] mOpCodesHi = new OpCode[256]; - - static Reader() - { - LoadOpCodes(); - } - - protected static void LoadOpCodes() - { - foreach (var xField in typeof(OpCodes).GetFields(BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Public)) - { - var xOpCode = (OpCode)xField.GetValue(null); - var xValue = (ushort)xOpCode.Value; - if (xValue <= 0xFF) - { - mOpCodesLo[xValue] = xOpCode; - } - else - { - mOpCodesHi[xValue & 0xFF] = xOpCode; - } - } - } - - protected static void CheckBranch(int aTarget, int aMethodSize) - { - if (aTarget < 0 || aTarget >= aMethodSize) - { - throw new Exception("Branch jumps outside method."); - } - } - - protected List ScanMethodBody_DoIt(MethodBase aMethod, EcmaCil.MethodMeta aMethodMeta, IDictionary aILOffsetToInstructionIndex, IDictionary aInstructionIndexToILOffset) - { - var xResult = new List(aILOffsetToInstructionIndex.Count); - var xBody = aMethod.GetMethodBody(); - // Cache for use in field and method resolution - Type[] xTypeGenArgs = null; - Type[] xMethodGenArgs = null; - if (aMethod.DeclaringType.IsGenericType) - { - xTypeGenArgs = aMethod.DeclaringType.GetGenericArguments(); - } - if (aMethod.IsGenericMethod) - { - xMethodGenArgs = aMethod.GetGenericArguments(); - } - - // Some methods return no body. Not sure why.. have to investigate - // They arent abstracts or icalls... - // MtW: how about externs (pinvoke, etc) - if (xBody == null) - { - return null; - } - - var xIL = xBody.GetILAsByteArray(); - int xPos = 0; - var xInstructionIndex = 0; - var xInitSecondStage = new List(aILOffsetToInstructionIndex.Count); - while (xPos < xIL.Length) - { - ExceptionHandlingClause xCurrentHandler = null; - #region Determine current handler - // todo: add support for nested handlers using a stack or so.. - foreach (ExceptionHandlingClause xHandler in xBody.ExceptionHandlingClauses) - { - if (xHandler.TryOffset > 0) - { - if (xHandler.TryOffset <= xPos && (xHandler.TryLength + xHandler.TryOffset + 1) > xPos) // + 1 because index should be less than the try - { - if (xCurrentHandler == null) - { - xCurrentHandler = xHandler; - continue; - } - else if (xHandler.TryOffset > xCurrentHandler.TryOffset && (xHandler.TryLength + xHandler.TryOffset) < (xCurrentHandler.TryLength + xCurrentHandler.TryOffset)) - { - // only replace if the current found handler is narrower - xCurrentHandler = xHandler; - continue; - } - } - } - if (xHandler.HandlerOffset > 0) - { - if (xHandler.HandlerOffset <= xPos && (xHandler.HandlerOffset + xHandler.HandlerLength + 1) > xPos) - { - if (xCurrentHandler == null) - { - xCurrentHandler = xHandler; - continue; - } - else if (xHandler.HandlerOffset > xCurrentHandler.HandlerOffset && (xHandler.HandlerOffset + xHandler.HandlerLength) < (xCurrentHandler.HandlerOffset + xCurrentHandler.HandlerLength)) - { - // only replace if the current found handler is narrower - xCurrentHandler = xHandler; - continue; - } - } - } - if ((xHandler.Flags & ExceptionHandlingClauseOptions.Filter) > 0) - { - if (xHandler.FilterOffset > 0) - { - if (xHandler.FilterOffset <= xPos) - { - if (xCurrentHandler == null) - { - xCurrentHandler = xHandler; - continue; - } - else if (xHandler.FilterOffset > xCurrentHandler.FilterOffset) - { - // only replace if the current found handler is narrower - xCurrentHandler = xHandler; - continue; - } - } - } - } - } - #endregion - OpCodeEnum xOpCodeVal; - OpCode xOpCode; - int xOpPos = xPos; - if (xIL[xPos] == 0xFE) - { - xOpCodeVal = (OpCodeEnum)(0xFE00 | xIL[xPos + 1]); - xOpCode = mOpCodesHi[xIL[xPos + 1]]; - xPos = xPos + 2; - } - else - { - xOpCodeVal = (OpCodeEnum)xIL[xPos]; - xOpCode = mOpCodesLo[xIL[xPos]]; - xPos++; - } - - EcmaCil.IL.BaseInstruction xILOpCode = null; - Cil.InstructionBranch xBranch; - Console.WriteLine(xOpCode.ToString() + " " + xOpCode.OperandType); - #region switch(xOpCode.OperandType) - switch (xOpCode.OperandType) - { - // No operand. - case OperandType.InlineNone: - { - #region Inline none options - // These shortcut translation regions expand shortcut ops into full ops - // This elminates the amount of code required in the assemblers - // by allowing them to ignore the shortcuts - switch (xOpCodeVal) - { - case OpCodeEnum.Ldarg_0: - xILOpCode = new Cil.InstructionArgument(EcmaCil.IL.InstructionKindEnum.Ldarg, xInstructionIndex, aMethodMeta.Parameters[0]); - break; - case OpCodeEnum.Ldarg_1: - xILOpCode = new Cil.InstructionArgument(EcmaCil.IL.InstructionKindEnum.Ldarg, xInstructionIndex, aMethodMeta.Parameters[1]); - break; - case OpCodeEnum.Ldarg_2: - xILOpCode = new Cil.InstructionArgument(EcmaCil.IL.InstructionKindEnum.Ldarg, xInstructionIndex, aMethodMeta.Parameters[2]); - break; - case OpCodeEnum.Ldarg_3: - xILOpCode = new Cil.InstructionArgument(EcmaCil.IL.InstructionKindEnum.Ldarg, xInstructionIndex, aMethodMeta.Parameters[3]); - break; - case OpCodeEnum.Ldc_I4_0: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 0); - break; - case OpCodeEnum.Ldc_I4_1: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 1); - break; - case OpCodeEnum.Ldc_I4_2: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 2); - break; - case OpCodeEnum.Ldc_I4_3: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 3); - break; - case OpCodeEnum.Ldc_I4_4: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 4); - break; - case OpCodeEnum.Ldc_I4_5: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 5); - break; - case OpCodeEnum.Ldc_I4_6: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 6); - break; - case OpCodeEnum.Ldc_I4_7: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 7); - break; - case OpCodeEnum.Ldc_I4_8: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, 8); - break; - case OpCodeEnum.Ldc_I4_M1: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, -1); - break; - case OpCodeEnum.Ldloc_0: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Ldloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[0]); - break; - case OpCodeEnum.Ldloc_1: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Ldloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[1]); - break; - case OpCodeEnum.Ldloc_2: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Ldloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[2]); - break; - case OpCodeEnum.Ldloc_3: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Ldloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[3]); - break; - case OpCodeEnum.Stloc_0: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Stloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[0]); - break; - case OpCodeEnum.Stloc_1: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Stloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[1]); - break; - case OpCodeEnum.Stloc_2: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Stloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[2]); - break; - case OpCodeEnum.Stloc_3: - xILOpCode = new Cil.InstructionLocal(EcmaCil.IL.InstructionKindEnum.Stloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[3]); - break; - default: - xILOpCode = new Cil.InstructionNone((EcmaCil.IL.InstructionKindEnum)xOpCodeVal, xInstructionIndex); - break; - } - #endregion - break; - } - - case OperandType.ShortInlineBrTarget: - { - #region Inline branch - // By calculating target, we assume all branches are within a method - // So far at least wtih csc, its true. We check it with CheckBranch - // just in case. - int xTarget = xPos + 1 + (sbyte)xIL[xPos]; - CheckBranch(xTarget, xIL.Length); - switch (xOpCodeVal) - { - case OpCodeEnum.Beq_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Beq, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Bge_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Bge, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Bge_Un_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Bge_Un, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Bgt_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Bgt, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Bgt_Un_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Bgt_Un, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Ble_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Ble, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Ble_Un_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Ble_Un, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Blt_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Blt, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Blt_Un_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Blt_Un, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Bne_Un_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Bne_Un, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Br_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Br, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Brfalse_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Brfalse, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Brtrue_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Brtrue, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - case OpCodeEnum.Leave_S: - xBranch = new Cil.InstructionBranch(EcmaCil.IL.InstructionKindEnum.Leave, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - default: - xBranch = new Cil.InstructionBranch((EcmaCil.IL.InstructionKindEnum)xOpCodeVal, xInstructionIndex); - xILOpCode = xBranch; - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - break; - } - xPos = xPos + 1; - break; - #endregion - } - case OperandType.InlineBrTarget: - { - int xTarget = xPos + 4 + (Int32)ReadInt32(xIL, xPos); - CheckBranch(xTarget, xIL.Length); - xILOpCode = xBranch = new Cil.InstructionBranch((EcmaCil.IL.InstructionKindEnum)xOpCodeVal, xInstructionIndex); - xInitSecondStage.Add(delegate - { - xBranch.Target = xResult[aILOffsetToInstructionIndex[xTarget]]; - }); - xPos = xPos + 4; - break; - } - - case OperandType.ShortInlineI: - switch (xOpCodeVal) - { - case OpCodeEnum.Ldc_I4_S: - xILOpCode = new Cil.InstructionInt32(EcmaCil.IL.InstructionKindEnum.Ldc_I4, xInstructionIndex, xIL[xPos]); - break; - default: - xILOpCode = new Cil.InstructionInt32((EcmaCil.IL.InstructionKindEnum)xOpCodeVal, xInstructionIndex, xIL[xPos]); - break; - } - xPos = xPos + 1; - break; - case OperandType.InlineI: - xILOpCode = new Cil.InstructionInt32((Cil.InstructionKindEnum)xOpCodeVal, xInstructionIndex, ReadInt32(xIL, xPos)); - xPos = xPos + 4; - break; - case OperandType.InlineI8: - xILOpCode = new Cil.InstructionInt64((Cil.InstructionKindEnum)xOpCodeVal, xInstructionIndex, ReadInt64(xIL, xPos)); - xPos = xPos + 8; - break; - - case OperandType.ShortInlineR: - // this is not correct: - //xILOpCode = new Cil.InstructionSingle( - //xILOpCode = new ILOpCodes.OpSingle(xOpCodeVal, xOpPos, xPos + 4, BitConverter.ToSingle(xIL, xPos), xCurrentHandler); - //xPos = xPos + 4; - //break; - throw new NotImplementedException(); - case OperandType.InlineR: - // this is not correct - //xILOpCode = new ILOpCodes.OpDouble(xOpCodeVal, xOpPos, xPos + 8, BitConverter.ToDouble(xIL, xPos), xCurrentHandler); - //xPos = xPos + 8; - //break; - throw new NotImplementedException(); - - // The operand is a 32-bit metadata token. - case OperandType.InlineField: - throw new NotImplementedException(); - //{ - // var xValue = aMethod.Module.ResolveField((int)ReadInt32(xIL, xPos), xTypeGenArgs, xMethodGenArgs); - - // xILOpCode = new ILOpCodes.OpField(xOpCodeVal, xOpPos, xPos + 4, xValue, xCurrentHandler); - // xPos = xPos + 4; - // break; - //} - - // The operand is a 32-bit metadata token. - case OperandType.InlineMethod: - var xTargetMethod = EnqueueMethod(aMethod.DeclaringType.Module.ResolveMethod(ReadInt32(xIL, xPos)), aMethod, "Method Call"); - xILOpCode = new Cil.InstructionMethod((Cil.InstructionKindEnum)xOpCodeVal, xInstructionIndex, xTargetMethod); - xPos = xPos + 4; - break; - //{ - // var xValue = aMethod.Module.ResolveMethod((int)ReadInt32(xIL, xPos), xTypeGenArgs, xMethodGenArgs); - // xILOpCode = new ILOpCodes.OpMethod(xOpCodeVal, xOpPos, xPos + 4, xValue, xCurrentHandler); - // xPos = xPos + 4; - // break; - //} - - // 32-bit metadata signature token. - case OperandType.InlineSig: - throw new NotImplementedException(); - - case OperandType.InlineString: - xILOpCode = new Cil.InstructionString(Cil.InstructionKindEnum.Ldstr, xInstructionIndex, aMethod.Module.ResolveString(ReadInt32(xIL, xPos))); - xPos = xPos + 4; - break; - - case OperandType.InlineSwitch: - throw new NotImplementedException(); - //{ - // int xCount = (int)ReadInt32(xIL, xPos); - // xPos = xPos + 4; - // int xNextOpPos = xPos + xCount * 4; - // int[] xBranchLocations = new int[xCount]; - // for (int i = 0; i < xCount; i++) - // { - // xBranchLocations[i] = xNextOpPos + (int)ReadInt32(xIL, xPos + i * 4); - // CheckBranch(xBranchLocations[i], xIL.Length); - // } - // xILOpCode = new ILOpCodes.OpSwitch(xOpCodeVal, xOpPos, xPos, xBranchLocations, xCurrentHandler); - // xPos = xNextOpPos; - // break; - //} - - // The operand is a FieldRef, MethodRef, or TypeRef token. - case OperandType.InlineTok: - throw new NotImplementedException(); - //xILOpCode = new ILOpCodes.OpToken(xOpCodeVal, xOpPos, xPos + 4, ReadInt32(xIL, xPos), aMethod.Module, xTypeGenArgs, xMethodGenArgs, xCurrentHandler); - // xPos = xPos + 4; - // break; - - // 32-bit metadata token. - case OperandType.InlineType: - throw new NotImplementedException(); - //{ - // var xValue = aMethod.Module.ResolveType((int)ReadInt32(xIL, xPos), xTypeGenArgs, xMethodGenArgs); - // xILOpCode = new ILOpCodes.OpType(xOpCodeVal, xOpPos, xPos + 4, xValue, xCurrentHandler); - // xPos = xPos + 4; - // break; - //} - - case OperandType.ShortInlineVar: - switch (xOpCodeVal) - { - case OpCodeEnum.Ldloc_S: - xILOpCode = new Cil.InstructionLocal(Cil.InstructionKindEnum.Ldloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[xIL[xPos]]); - break; - case OpCodeEnum.Ldloca_S: - xILOpCode = new Cil.InstructionLocal(Cil.InstructionKindEnum.Ldloca, xInstructionIndex, aMethodMeta.Body.LocalVariables[xIL[xPos]]); - break; - case OpCodeEnum.Ldarg_S: - xILOpCode = new Cil.InstructionArgument(Cil.InstructionKindEnum.Ldarg, xInstructionIndex, aMethodMeta.Parameters[xIL[xPos]]); - break; - case OpCodeEnum.Ldarga_S: - xILOpCode = new Cil.InstructionArgument(Cil.InstructionKindEnum.Ldarga, xInstructionIndex, aMethodMeta.Parameters[xIL[xPos]]); - break; - case OpCodeEnum.Starg_S: - xILOpCode = new Cil.InstructionArgument(Cil.InstructionKindEnum.Starg, xInstructionIndex, aMethodMeta.Parameters[xIL[xPos]]); - break; - case OpCodeEnum.Stloc_S: - xILOpCode = new Cil.InstructionLocal(Cil.InstructionKindEnum.Stloc, xInstructionIndex, aMethodMeta.Body.LocalVariables[xIL[xPos]]); - break; - default: - throw new NotImplementedException(); - //xILOpCode = new ILOpCodes.OpVar(xOpCodeVal, xOpPos, xPos + 1, xIL[xPos], xCurrentHandler); - //break; - } - xPos = xPos + 1; - break; - case OperandType.InlineVar: - //xILOpCode = new ILOpCodes.OpVar(xOpCodeVal, xOpPos, xPos + 2, ReadUInt16(xIL, xPos), xCurrentHandler); - //xPos = xPos + 2; - throw new NotImplementedException(); - break; - - default: - throw new Exception("Unknown OperandType"); - } - #endregion switch(xOpCode.OperandType) - xResult.Add(xILOpCode); - xInstructionIndex++; - } - foreach (var xAction in xInitSecondStage) - { - xAction(); - } - return xResult; - } - - // We could use BitConvertor, unfortuantely they "hardcoded" endianness. Its fine for reading IL now... - // but they essentially do the same as we do, just a bit slower. - private static UInt16 ReadUInt16(byte[] aBytes, int aPos) - { - return (UInt16)(aBytes[aPos + 1] << 8 | aBytes[aPos]); - } - - private static Int32 ReadInt32(byte[] aBytes, int aPos) - { - return (Int32)(aBytes[aPos + 3] << 24 | aBytes[aPos + 2] << 16 | aBytes[aPos + 1] << 8 | aBytes[aPos]); - } - - private static Int64 ReadInt64(byte[] aBytes, int aPos) - { - //return (UInt64)( - // aBytes[aPos + 7] << 56 | aBytes[aPos + 6] << 48 | aBytes[aPos + 5] << 40 | aBytes[aPos + 4] << 32 - // | aBytes[aPos + 3] << 24 | aBytes[aPos + 2] << 16 | aBytes[aPos + 1] << 8 | aBytes[aPos]); - - return BitConverter.ToInt64(aBytes, aPos); - } - - private void ScanArrayType(QueuedArrayType aArrayType, EcmaCil.ArrayTypeMeta aArrayMeta) - { - aArrayMeta.Dimensions = aArrayType.ArrayType.GetArrayRank(); - // todo: fix? - // foreach (ArrayDimension xDimension in aType.ArrayType.Dimensions) - //{ - // if (xDimension.LowerBound != 0 || xDimension.UpperBound != 0) - // { - // throw new Exception("Arrays with limited dimensions not supported"); - // } - //} - if (aArrayType.ArrayType.GetArrayRank() != 1) - { - throw new Exception("Multidimensional arrays not yet supported!"); - } - -#if DEBUG - var xSB = new StringBuilder(); - xSB.Append(aArrayMeta.ElementType.ToString()); - xSB.Append("["); - xSB.Append(new String(',', aArrayMeta.Dimensions - 1)); - xSB.Append("]"); - aArrayMeta.Data[EcmaCil.DataIds.DebugMetaId] = xSB.ToString(); -#endif - } - - - private void ScanVMT() - { - - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.cs deleted file mode 100644 index 53622c5860..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/Reader.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; - -namespace ReflectionToEcmaCil -{ - public partial class Reader: IDisposable - { - private Dictionary mMethods = new Dictionary(); - private Dictionary mTypes = new Dictionary(); - private Dictionary mArrayTypes = new Dictionary(); - private Dictionary mPointerTypes = new Dictionary(); - private Dictionary mVirtuals = new Dictionary(); - - private Dictionary mTypeMetaToType = new Dictionary(); - private Dictionary mMethodMetaToMethod = new Dictionary(); - - - public void Dispose() - { - if (mMethods != null) - { - Clear(); - mMethods = null; - mTypes = null; - mArrayTypes = null; - mPointerTypes = null; - mVirtuals = null; - } - GC.SuppressFinalize(this); - } - - public void Clear() - { - mMethods.Clear(); - mTypes.Clear(); - mArrayTypes.Clear(); - mPointerTypes.Clear(); - mVirtuals.Clear(); - } - - public IEnumerable Execute(string assembly) - { - var xAssemblyDef = Assembly.LoadFile(assembly); - if (xAssemblyDef.EntryPoint == null) - { - throw new ArgumentException("Main assembly should have entry point!"); - } - EnqueueMethod(xAssemblyDef.EntryPoint, null, "entry point"); - - // handle queue - do - { - while (mQueue.Count > 0) - { - var xItem = mQueue.Dequeue(); - if (xItem is QueuedMethod) - { - var xMethod = (QueuedMethod)xItem; - ScanMethod(xMethod, mMethods[xMethod]); - continue; - } - if (xItem is QueuedArrayType) - { - var xType = (QueuedArrayType)xItem; - ScanArrayType(xType, mArrayTypes[xType]); - continue; - } - if (xItem is QueuedType) - { - var xType = (QueuedType)xItem; - ScanType(xType, mTypes[xType]); - continue; - } - throw new Exception("Queue item not supported: '" + xItem.GetType().FullName + "'!"); - } - DoVMTScan(); - } while (mQueue.Count > 0); - - return mTypes.Values.Cast() - .Union(mArrayTypes.Values.Cast()) - .Union(mPointerTypes.Values.Cast()).ToArray(); - } - - private void DoVMTScan() - { - var xAllTypes = mTypes.ToArray(); - foreach(var xTypePair in xAllTypes){ - var xQueuedType = xTypePair.Key; - var xTypeMeta = xTypePair.Value; - - foreach (var xMethod in xTypeMeta.Methods) - { - if (!xMethod.IsVirtual) - { - continue; - } - - MethodBase xBaseMethod; - if (!mMethodMetaToMethod.TryGetValue(xMethod, out xBaseMethod)) - { - throw new Exception("Couldn't find method!"); - } - - foreach (var xSubTypeMeta in xTypeMeta.Descendants) - { - if((from method in xSubTypeMeta.Methods - where method.Overrides == xMethod - select method).Any()){ - continue; - } - - Type xSubType; - if (!mTypeMetaToType.TryGetValue(xSubTypeMeta, out xSubType)) - { - throw new Exception("Couldn't find type!"); - } - var xBindFlags = BindingFlags.Instance; - if (xMethod.IsPublic) - { - xBindFlags |= BindingFlags.Public; - } - else - { - xBindFlags |= BindingFlags.NonPublic; - } - - var xFoundMethod = xSubType.GetMethod(xBaseMethod.Name, - xBindFlags, null, (from item in xBaseMethod.GetParameters() - select item.ParameterType).ToArray(), null); - if (xFoundMethod != null) - { - EnqueueMethod(xFoundMethod, xMethod, "Overridden method"); - } - else - { - // apparantly, this type doesn't override the method. to speed up scanning, - // we add a dummy method, just calling base - - } - - } - } - - } - } - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/ReflectionToEcmaCil.csproj b/Users/Matthijs/Testing/ReflectionToEcmaCil/ReflectionToEcmaCil.csproj deleted file mode 100644 index a7bf121246..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/ReflectionToEcmaCil.csproj +++ /dev/null @@ -1,114 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {FD4B2006-B518-4884-B196-C2EF2B83FD6F} - Library - Properties - ReflectionToEcmaCil - ReflectionToEcmaCil - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - EcmaCil - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedArrayType.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedArrayType.cs deleted file mode 100644 index 17592665a1..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedArrayType.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ReflectionToEcmaCil -{ - public struct QueuedArrayType : IEquatable - { - public readonly Type ArrayType; - - public QueuedArrayType(Type arrayType) - { - ArrayType = arrayType; - } - - public override int GetHashCode() - { - return ArrayType.GetHashCode(); - } - public bool Equals(QueuedArrayType qm) - { - if (!qm.ArrayType.Equals(ArrayType)) - { - return false; - } - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedArrayType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedMethod.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedMethod.cs deleted file mode 100644 index c2cb11494a..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedMethod.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; - -namespace ReflectionToEcmaCil -{ - public struct QueuedMethod : IEquatable - { - private readonly Type type; - private readonly MethodBase method; - private readonly Type[] args; - private readonly Type returnType; - - private readonly static Type[] empty = new Type[0]; - private readonly static Type SystemVoid = typeof(void); - - - public Type Type { get { return type; } } - public MethodBase Method { get { return method; } } - public Type[] Args { get { return args; } } - public Type ReturnType { get { return returnType; } } - - public QueuedMethod(Type type, MethodBase method, Type[] args, Type returnType) - { - this.type = type; - this.method = method; - this.args = args; - if(args == null){ - args=empty; - } - this.returnType = returnType; - if (returnType == null) - { - returnType = SystemVoid; - } - } - - public override int GetHashCode() - { - unchecked - { - uint n = (uint)(type.GetHashCode() ^ method.GetHashCode() ^ Args.Length ^ returnType.GetHashCode()); - - for (int i = Args.Length - 1; i >= 0; i--) - { - n = (n << 1) | (n >> 31); - n ^= (uint)args[i].GetHashCode(); - } - return (int)n; - } - } - public bool Equals(QueuedMethod qm) - { - if (!qm.type.Equals(type) || !qm.method.Equals(method) || qm.Args.Length != Args.Length || !qm.returnType.Equals(returnType)) - return false; - for (int i = Args.Length - 1; i >= 0; i--) - { - if (!args[i].Equals(qm.args[i])) - return false; - } - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedMethod)obj); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedPointerType.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedPointerType.cs deleted file mode 100644 index 7fb1637c77..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedPointerType.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ReflectionToEcmaCil -{ - public struct QueuedPointerType : IEquatable - { - public readonly Type PointerType; - - public QueuedPointerType(Type pointerType) - { - PointerType = pointerType; - } - - public override int GetHashCode() - { - return PointerType.GetHashCode(); - } - public bool Equals(QueuedPointerType qm) - { - if (!qm.PointerType.Equals(PointerType)) - return false; - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedPointerType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedType.cs b/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedType.cs deleted file mode 100644 index 4b5b4904cf..0000000000 --- a/Users/Matthijs/Testing/ReflectionToEcmaCil/_QueueItems/QueuedType.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ReflectionToEcmaCil -{ - public struct QueuedType : IEquatable - { - public readonly Type Type; - public readonly Type[] Args; - - private readonly static Type[] empty = new Type[0]; - - public QueuedType(Type type, Type[] args) - { - Type = type; - if (args == null) - { - Args = empty; - } - else - { - Args = args; - } - } - - public override int GetHashCode() - { - unchecked - { - uint n = (uint)(Type.GetHashCode()); - if (Args != null) - { - n ^= (uint)Args.Length; - for (int i = Args.Length - 1; i >= 0; i--) - { - n = (n << 1) | (n >> 31); - n ^= (uint)Args[i].GetHashCode(); - } - } - return (int)n; - } - } - public bool Equals(QueuedType qm) - { - if (!qm.Type.Equals(Type) || qm.Args.Length != Args.Length) - return false; - for (int i = Args.Length - 1; i >= 0; i--) - { - if (!Args[i].Equals(qm.Args[i])) - return false; - } - return true; - } - - public override bool Equals(object obj) - { - return Equals((QueuedType)obj); - } - } -} diff --git a/Users/Matthijs/Testing/TestApp/Program.cs b/Users/Matthijs/Testing/TestApp/Program.cs deleted file mode 100644 index 93d5c1028d..0000000000 --- a/Users/Matthijs/Testing/TestApp/Program.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using EcmaCil; -using System.Xml; -using System.Diagnostics; -using System.IO; - -namespace TestApp -{ - class Program - { - public static void Main(string[] args) - { - using (var xReader = new ReflectionToEcmaCil.Reader()) - { - try - { - var xTestClass= typeof(SimpleClassTest.Program); - xReader.EnableLogging(Path.ChangeExtension(xTestClass.Assembly.Location, "html")); - var xResult = xReader.Execute(xTestClass.Assembly.Location); - using (var xXmlOut = XmlWriter.Create(Path.ChangeExtension(xTestClass.Assembly.Location, "out.xml"), new XmlWriterSettings { Indent = true, IndentChars=" " })) - { - Dump.DumpTypes(xResult, xXmlOut); - xXmlOut.Flush(); - } - } - catch (Exception E) - { - Console.WriteLine("Error: " + E.ToString()); - xReader.WriteScanMap(); - } - } - //using (var xReader = new MonoCecilToEcmaCil1.ReaderWithPlugSupport()) - //{ - // var xSW = new Stopwatch(); - // xSW.Start(); - // // for (int i = 0; i < 16; i++) - // // { - // // xSW.Start(); - // // var xResults = xReader.Execute(typeof(SimpleMethodsTest.Program).Assembly.Location); - // // xSW.Stop(); - // // Console.WriteLine("{0} {1}", i.ToString("X"), xSW.Elapsed); - // // xSW.Reset(); - // // xReader.Clear(); - // // } - // //Console.WriteLine("Number of types: {0}", xResults.Length); - // var xResults = xReader.Execute(typeof(SimpleMethodsTest.Program).Assembly.Location); - // //using (var xOut = XmlWriter.Create(@"e:\types1.xml", new XmlWriterSettings { Encoding = Encoding.Unicode })) - // //{ - // // Dump.DumpTypes(xResults, xOut); - // //} - // xReader.Clear(); - // xResults = xReader.Execute(typeof(SimpleClassTest.Program).Assembly.Location); - // //using (var xOut = XmlWriter.Create(@"e:\types2.xml")) - // //{ - // // Dump.DumpTypes(xResults, xOut); - // //} - // xReader.Clear(); - // //xReader.AddPlugAssembly(typeof(ObjectImpl).Assembly.Location); - // //xResults = xReader.Execute(typeof(SimpleClass2Test.Program).Assembly.Location); - // //using (var xOut = XmlWriter.Create(@"e:\types3.xml")) - // //{ - // // Dump.DumpTypes(xResults, xOut); - // //} - // xSW.Stop(); - // Console.WriteLine("Took: " + xSW.Elapsed); - //} - } - } -} diff --git a/Users/Matthijs/Testing/TestApp/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/TestApp/Properties/AssemblyInfo.cs deleted file mode 100644 index 9686a40f46..0000000000 --- a/Users/Matthijs/Testing/TestApp/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("TestApp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("TestApp")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("b1521f93-ecdb-44d6-b719-079ad6219293")] - -// 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/Users/Matthijs/Testing/TestApp/TestApp.csproj b/Users/Matthijs/Testing/TestApp/TestApp.csproj deleted file mode 100644 index c9f8a7e6a9..0000000000 --- a/Users/Matthijs/Testing/TestApp/TestApp.csproj +++ /dev/null @@ -1,121 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {47B9E5D3-A800-4402-AD6A-315FAF4E82F4} - Exe - Properties - TestApp - TestApp - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - - - - - - - - {7A24BC15-49A3-43AF-AF2B-3681D9A06C62} - SimpleClassTest - - - {B47ED632-1ACE-4516-9576-81E38BA092F1} - SimpleMethodsTest - - - {AE684C98-F100-47AE-9C8C-E71BF8C9F8AA} - EcmaCil - - - {8612AC0F-6C80-4F14-AFFA-7A96AFF18A6D} - SimpleClass2Test - - - {FD4B2006-B518-4884-B196-C2EF2B83FD6F} - ReflectionToEcmaCil - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - diff --git a/Users/Matthijs/Testing/TestApp/app.config b/Users/Matthijs/Testing/TestApp/app.config deleted file mode 100644 index e365603337..0000000000 --- a/Users/Matthijs/Testing/TestApp/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Users/Matthijs/Testing/UtilityClasses/HashSetUsingEquatable.cs b/Users/Matthijs/Testing/UtilityClasses/HashSetUsingEquatable.cs deleted file mode 100644 index dcec52111e..0000000000 --- a/Users/Matthijs/Testing/UtilityClasses/HashSetUsingEquatable.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace UtilityClasses -{ - public class HashSetUsingEquatable where T: IEquatable - { - private Dictionary mBackend = new Dictionary(); - } -} \ No newline at end of file diff --git a/Users/Matthijs/Testing/UtilityClasses/Properties/AssemblyInfo.cs b/Users/Matthijs/Testing/UtilityClasses/Properties/AssemblyInfo.cs deleted file mode 100644 index a2dcc97469..0000000000 --- a/Users/Matthijs/Testing/UtilityClasses/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("UtilityClasses")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("UtilityClasses")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("917c5ff7-bc4d-48ab-97bb-ce6f29238dc1")] - -// 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/Users/Matthijs/Testing/UtilityClasses/SimpleHashSetOld.cs b/Users/Matthijs/Testing/UtilityClasses/SimpleHashSetOld.cs deleted file mode 100644 index 1657365b6a..0000000000 --- a/Users/Matthijs/Testing/UtilityClasses/SimpleHashSetOld.cs +++ /dev/null @@ -1,114 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using System.Collections; - -//namespace UtilityClasses -//{ -// public class SimpleHashSet : IEnumerable -// { -// private class DefaultHashcodeProvider : IEqualityComparer -// { -// public bool Equals(T x, T y) -// { -// throw new NotImplementedException(); -// } - -// public int GetHashCode(T obj) -// { -// return obj.GetHashCode(); -// } - -// public static readonly DefaultHashcodeProvider Instance = new DefaultHashcodeProvider(); -// } - -// private Dictionary mItems = new Dictionary(); -// private IEqualityComparer mHashCodeProvider; - -// public SimpleHashSet() -// : this(DefaultHashcodeProvider.Instance) -// { -// } - -// public SimpleHashSet(IEqualityComparer aHashCodeProvider) -// { -// mHashCodeProvider = aHashCodeProvider; -// } - -// public bool Contains(T aItem) -// { -// if (aItem == null) -// { -// throw new ArgumentNullException("aItem"); -// } -// return mItems.ContainsKey(mHashCodeProvider.GetHashCode(aItem)); -// } - -// public void Add(int aHashCode, T aItem) -// { -// if (aItem == null) -// { -// throw new ArgumentNullException("aItem"); -// } -// mItems.Add(aHashCode, aItem); -// } - -// public void Add(T aItem) -// { -// if (aItem == null) -// { -// throw new ArgumentNullException("aItem"); -// } -// mItems.Add(mHashCodeProvider.GetHashCode(aItem), aItem); -// } - -// public int Count -// { -// get -// { -// return mItems.Count; -// } -// } - -// public IEnumerator GetEnumerator() -// { -// return (from item in mItems -// select item.Value).GetEnumerator(); -// } - -// public T GetItemInList(T aItem) -// { -// if (aItem == null) -// { -// throw new ArgumentNullException("aItem"); -// } -// T xResult; -// if (mItems.TryGetValue(mHashCodeProvider.GetHashCode(aItem), out xResult)) -// { -// return xResult; -// } -// else -// { -// return aItem; -// } -// } - -// IEnumerator IEnumerable.GetEnumerator() -// { -// return (from item in mItems -// select item.Value).GetEnumerator(); -// } - -// public void Clear() -// { -// mItems.Clear(); -// } - -// public bool TryGetValue(int aHashValue, out T aResult) -// { -// return mItems.TryGetValue(aHashValue, out aResult); - -// } -// } -//} \ No newline at end of file diff --git a/Users/Matthijs/Testing/UtilityClasses/UtilityClasses.csproj b/Users/Matthijs/Testing/UtilityClasses/UtilityClasses.csproj deleted file mode 100644 index 0fea763848..0000000000 --- a/Users/Matthijs/Testing/UtilityClasses/UtilityClasses.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {54795C40-B3E8-4DBB-A3DE-FACBADD20ADB} - Library - Properties - UtilityClasses - UtilityClasses - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - 3.5 - - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - diff --git a/Users/Orvid/Cosmos.Plugs.7z b/Users/Orvid/Cosmos.Plugs.7z deleted file mode 100644 index b9b8b750d1..0000000000 Binary files a/Users/Orvid/Cosmos.Plugs.7z and /dev/null differ diff --git a/Users/Orvid/IL2CPU Tester/CsTests/CsTests.csproj b/Users/Orvid/IL2CPU Tester/CsTests/CsTests.csproj deleted file mode 100644 index 5476c8b1b1..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/CsTests.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {7CEE0541-0107-47F3-B422-70C55E81CE42} - Library - Properties - CsTests - CsTests - v4.7.1 - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/arrays.cs b/Users/Orvid/IL2CPU Tester/CsTests/arrays.cs deleted file mode 100644 index 03c5ca6e1f..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/arrays.cs +++ /dev/null @@ -1,840 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - - public static int test_10_create() - { - int[] a = new int[10]; - return a.Length; - } - - public static int test_0_unset_value() - { - int[] a = new int[10]; - return a[5]; - } - - public static int test_3_set_value() - { - int[] a = new int[10]; - a[5] = 3; - return a[5]; - } - - public static int test_0_char_array_1() - { - int value = -30; - char[] tmp = new char[20]; - char[] digitLowerTable = new char[16]; - tmp[0] = digitLowerTable[-(value % 10)]; - return 0; - } - - public static int test_0_char_array_2() - { - int value = 5; - char[] tmp = new char[20]; - char[] digitLowerTable = new char[16]; - tmp[0] = digitLowerTable[value % 10]; - return 0; - } - - public static int test_0_char_array_3() - { - int value = -1; - char[] tmp = new char[20]; - char[] digitLowerTable = new char[16]; - tmp[0] = digitLowerTable[value & 15]; - return 0; - } - - public unsafe static int test_0_byte_array() - { - byte[] src = new byte[8]; - double ret; - byte* dst = (byte*)&ret; - int start = 0; - - dst[0] = src[4 + start]; - - return 0; - } - - public static int test_0_set_after_shift() - { - int[] n = new int[1]; - int b = 16; - - n[0] = 100 + (1 << (16 - b)); - - if (n[0] != 101) - return 1; - - return 0; - } - - /* Regression test for #30073 */ - public static int test_0_newarr_emulation() - { - double d = 500; - checked - { - double[] arr = new double[(int)d]; - } - return 0; - } - - private Int32[] m_array = new int[10]; - - void setBit(int bitIndex, bool value) - { - int index = bitIndex / 32; - int shift = bitIndex % 32; - - Int32 theBit = 1 << shift; - if (value) - m_array[index] |= theBit; - else - m_array[index] &= ~theBit; - } - - bool getBit(int bitIndex) - { - int index = bitIndex / 32; - int shift = bitIndex % 32; - - Int32 theBit = m_array[index] & (1 << shift); - return (theBit == 0) ? false : true; - - } - - public static int test_1_bit_index() - { - Tests t = new Tests(); - t.setBit(0, true); - t.setBit(3, true); - if (t.getBit(1)) - return 4; - if (!t.getBit(0)) - return 5; - if (!t.getBit(3)) - return 6; - return 1; - } - - class helper1 - { - - int[] ma = new int[56]; - const int MBIG = int.MaxValue; - - public helper1() - { - for (int k = 1; k < 5; k++) - { - for (int i = 1; i < 56; i++) - { - ma[i] -= ma[1 + (i + 30) % 55]; - if (ma[i] < 0) - ma[i] += MBIG; - } - } - } - } - - public static int test_2_regalloc() - { - helper1 h = new helper1(); - return 2; - } - - public static int test_0_stelemref_1() - { - object[] o = new object[1]; - o[0] = null; - - return 0; - } - - public static int test_0_stelemref_2() - { - object[] o = new object[1]; - o[0] = 1; - - return 0; - } - - interface IFace { } - class Face : IFace { } - - public static int test_0_stelemref_3() - { - object[] o = new IFace[1]; - o[0] = new Face(); - - return 0; - } - - public static int test_0_stelemref_4() - { - object[][] o = new object[5][]; - o[0] = new object[5]; - - return 0; - } - - struct FooStruct - { - public int i; - - public FooStruct(int i) - { - this.i = i; - } - } - - public static int test_0_arrays() - { - - int sum; - - byte[] a1 = new byte[10]; - for (int i = 0; i < 10; ++i) - a1[i] = (byte)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a1[i]; - if (sum != 45) - return 1; - - sbyte[] a2 = new sbyte[10]; - for (int i = 0; i < 10; ++i) - a2[i] = (sbyte)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a2[i]; - if (sum != 45) - return 2; - - short[] a3 = new short[10]; - for (int i = 0; i < 10; ++i) - a3[i] = (short)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a3[i]; - if (sum != 45) - return 3; - - ushort[] a4 = new ushort[10]; - for (int i = 0; i < 10; ++i) - a4[i] = (ushort)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a4[i]; - if (sum != 45) - return 4; - - int[] a5 = new int[10]; - for (int i = 0; i < 10; ++i) - a5[i] = (int)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a5[i]; - if (sum != 45) - return 5; - - uint[] a6 = new uint[10]; - for (int i = 0; i < 10; ++i) - a6[i] = (uint)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a6[i]; - if (sum != 45) - return 6; - - long[] a7 = new long[10]; - for (int i = 0; i < 10; ++i) - a7[i] = i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a7[i]; - if (sum != 45) - return 7; - - ulong[] a8 = new ulong[10]; - for (int i = 0; i < 10; ++i) - a8[i] = (ulong)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a8[i]; - if (sum != 45) - return 8; - - float[] a9 = new float[10]; - for (int i = 0; i < 10; ++i) - a9[i] = (float)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a9[i]; - if (sum != 45) - return 9; - - double[] a10 = new double[10]; - for (int i = 0; i < 10; ++i) - a10[i] = i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a10[i]; - if (sum != 45) - return 10; - - object[] a11 = new object[10]; - object o = new Object(); - for (int i = 0; i < 10; ++i) - a11[i] = o; - for (int i = 0; i < 10; ++i) - if (a11[i] != o) - return 11; - - FooStruct[] a12 = new FooStruct[10]; - for (int i = 0; i < 10; ++i) - a12[i] = new FooStruct(i); - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a12[i].i; - if (sum != 45) - return 12; - - return 0; - } - - public static int test_0_multi_dimension_arrays() - { - int sum; - - byte[,] a1 = new byte[10, 10]; - for (int i = 0; i < 10; ++i) - a1[i, i] = (byte)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a1[i, i]; - if (sum != 45) - return 1; - - sbyte[,] a2 = new sbyte[10, 10]; - for (int i = 0; i < 10; ++i) - a2[i, i] = (sbyte)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a2[i, i]; - if (sum != 45) - return 2; - - short[,] a3 = new short[10, 10]; - for (int i = 0; i < 10; ++i) - a3[i, i] = (short)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a3[i, i]; - if (sum != 45) - return 3; - - ushort[,] a4 = new ushort[10, 10]; - for (int i = 0; i < 10; ++i) - a4[i, i] = (ushort)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a4[i, i]; - if (sum != 45) - return 4; - - int[,] a5 = new int[10, 10]; - for (int i = 0; i < 10; ++i) - a5[i, i] = (int)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += a5[i, i]; - if (sum != 45) - return 5; - - uint[,] a6 = new uint[10, 10]; - for (int i = 0; i < 10; ++i) - a6[i, i] = (uint)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a6[i, i]; - if (sum != 45) - return 6; - - long[,] a7 = new long[10, 10]; - for (int i = 0; i < 10; ++i) - a7[i, i] = i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a7[i, i]; - if (sum != 45) - return 7; - - ulong[,] a8 = new ulong[10, 10]; - for (int i = 0; i < 10; ++i) - a8[i, i] = (ulong)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a8[i, i]; - if (sum != 45) - return 8; - - float[,] a9 = new float[10, 10]; - for (int i = 0; i < 10; ++i) - a9[i, i] = (float)i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a9[i, i]; - if (sum != 45) - return 9; - - double[,] a10 = new double[10, 10]; - for (int i = 0; i < 10; ++i) - a10[i, i] = i; - sum = 0; - for (int i = 0; i < 10; ++i) - sum += (int)a10[i, i]; - if (sum != 45) - return 10; - - object[,] a11 = new object[10, 10]; - object o = new Object(); - for (int i = 0; i < 10; ++i) - a11[i, i] = o; - for (int i = 0; i < 10; ++i) - if (a11[i, i] != o) - return 11; - - FooStruct[,] a12 = new FooStruct[10, 10]; - for (int i = 0; i < 10; ++i) - for (int j = 0; j < 10; ++j) - { - /* This one calls Address */ - a12[i, j] = new FooStruct(i + j); - - /* Test Set as well */ - FooStruct s = new FooStruct(i + j); - a12[i, j] = s; - } - sum = 0; - for (int i = 0; i < 10; ++i) - for (int j = 0; j < 10; ++j) - { - /* This one calls Address */ - sum += a12[i, j].i; - - /* Test Get as well */ - FooStruct s = a12[i, j]; - sum += s.i; - } - if (sum != 1800) - return 12; - - /* Null check */ - object[,] a13 = null; - try - { - a13[0, 0] = new Object(); - return 13; - } - catch (NullReferenceException) - { - } - - return 0; - } - - public static int test_100_3_dimensional_arrays() - { - int[, ,] test = new int[10, 10, 10]; - - test[1, 1, 1] = 100; - return test[1, 1, 1]; - } - - public static int test_0_bug_71454() - { - int[,] a = new int[4, 4]; - int[,] b = new int[4, 4]; - for (int i = 0; i < 4; ++i) - { - b[0, 0] = a[0, i % 4]; - } - return 0; - } - - public static int test_0_interface_array_cast() - { - try - { - object[] a = new ICloneable[2]; - ICloneable[] b = (ICloneable[])a; - } - catch - { - return 1; - } - return 0; - } - - class Foo - { - public static Foo[][] foo; - } - - public static int test_0_regress_74549() - { - new Foo(); - return 0; - } - - public static int test_0_regress_75832() - { - int[] table = new int[] { 0, 0 }; - - int x = 0; - - int temp = -1 ^ x; - temp = 2 + temp; - int y = table[temp]; - - return y; - } - - public static int test_0_stelem_ref_null_opt() - { - object[] arr = new Tests[1]; - - arr[0] = new Tests(); - arr[0] = null; - - return arr[0] == null ? 0 : 1; - } - - public static int test_0_invalid_new_array_size() - { - int size; - object res = null; - size = -1; - try - { - res = new float[size]; - } - catch (OverflowException e) - { - - } - catch (Exception) - { - return 1; - } - if (res != null) - return 2; - - size = -2147483648; - try - { - res = new float[size]; - } - catch (OverflowException e) - { - - } - catch (Exception) - { - return 3; - } - - if (res != null) - return 4; - - return 0; - } - - public static int test_0_multidym_array_with_negative_lower_bound() - { - int[,] x = (int[,])Array.CreateInstance(typeof(int), new int[] { 2, 2 }, new int[] { -2, -3 }); - - if (x.GetLowerBound(0) != -2) - return 1; - if (x.GetLowerBound(1) != -3) - return 2; - - x.SetValue(10, new int[] { -2, -3 }); - x.SetValue(20, new int[] { -2, -2 }); - x.SetValue(30, new int[] { -1, -3 }); - x.SetValue(40, new int[] { -1, -2 }); - - try - { - x.SetValue(10, new int[] { -3, -3 }); - return 3; - } - catch (IndexOutOfRangeException) { } - - try - { - x.SetValue(10, new int[] { -2, -4 }); - return 4; - } - catch (IndexOutOfRangeException) { } - - try - { - x.SetValue(10, new int[] { 0, -3 }); - return 5; - } - catch (IndexOutOfRangeException) { } - - try - { - x.SetValue(10, new int[] { -1, -1 }); - return 6; - } - catch (IndexOutOfRangeException) { } - - if ((int)x.GetValue(new int[] { -2, -3 }) != 10) - return 7; - if ((int)x.GetValue(new int[] { -2, -2 }) != 20) - return 8; - if ((int)x.GetValue(new int[] { -1, -3 }) != 30) - return 9; - if ((int)x.GetValue(new int[] { -1, -2 }) != 40) - return 10; - - try - { - x.GetValue(new int[] { -3, -3 }); - return 11; - } - catch (IndexOutOfRangeException) { } - - try - { - x.GetValue(new int[] { -2, -4 }); - return 12; - } - catch (IndexOutOfRangeException) { } - - try - { - x.GetValue(new int[] { 0, -3 }); - return 13; - } - catch (IndexOutOfRangeException) { } - - try - { - x.GetValue(new int[] { -1, -1 }); - return 14; - } - catch (IndexOutOfRangeException) { } - return 0; - } - - - public static int test_0_invalid_new_multi_dym_array_size() - { - int dym_size = 1; - int size; - object res = null; - size = -1; - try - { - res = new float[dym_size, size]; - } - catch (OverflowException e) - { - - } - catch (Exception) - { - return 1; - } - if (res != null) - return 2; - - size = -2147483648; - try - { - res = new float[size, dym_size]; - } - catch (OverflowException e) - { - - } - catch (Exception) - { - return 3; - } - - if (res != null) - return 4; - - return 0; - } - - public enum IntEnum - { - A, B, C - } - - public enum UintEnum : uint - { - A, B, C - } - - static bool TryCast(object o) - { - return o is T[]; - } - - public static int test_0_primitive_array_cast() - { - object a = new int[1]; - object b = new uint[1]; - object c = new IntEnum[1]; - object d = new UintEnum[1]; - - object[] arr = new object[] { a, b, c, d }; - int err = 1; - - foreach (var v in arr) - { - if (!TryCast(v)) - return err; - if (!TryCast(v)) - return err + 1; - if (!TryCast(v)) - return err + 2; - if (!TryCast(v)) - return err + 3; - err += 4; - } - - foreach (var v in arr) - { - if (!(v is int[])) - return err; - if (!(v is uint[])) - return err; - if (!(v is IntEnum[])) - return err; - if (!(v is UintEnum[])) - return err; - err += 4; - } - return 0; - } - - public static int test_0_intptr_array_cast() - { - object[] a = new object[] { new int[1], new uint[1] }; - object[] b = new object[] { new long[1], new ulong[1] }; - object[] c = new object[] { new IntPtr[1], new UIntPtr[1] }; - - int err = 1; - if (IntPtr.Size == 4) - { - foreach (var v in a) - { - if (!(v is IntPtr[])) - return err; - if (!(v is IntPtr[])) - return err; - err += 2; - } - foreach (var v in b) - { - if (v is IntPtr[]) - return err; - if (v is IntPtr[]) - return err; - err += 2; - } - - foreach (var v in c) - { - if (!(v is int[])) - return err; - if (!(v is uint[])) - return err; - err += 2; - } - } - else - { - foreach (var v in a) - { - if (v is IntPtr[]) - return err; - if (v is IntPtr[]) - return err; - err += 2; - } - foreach (var v in b) - { - if (!(v is IntPtr[])) - return err; - if (!(v is IntPtr[])) - return err; - err += 2; - } - foreach (var v in c) - { - if (!(v is long[])) - return err; - if (!(v is ulong[])) - return err; - err += 2; - } - } - return 0; - } - - public static int long_indices() - { - int[] arr = new int[10]; - int[,] arr2 = new int[10, 10]; - long index = 1; - arr[index] = 5; - if (arr[index] != 5) - return 1; - arr2[index, index] = 5; - if (arr2[index, index] != 5) - return 2; - return 0; - } -} - - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/basic-calls.cs b/Users/Orvid/IL2CPU Tester/CsTests/basic-calls.cs deleted file mode 100644 index 84fe6d19cd..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/basic-calls.cs +++ /dev/null @@ -1,362 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * public static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - static void dummy() - { - } - - public static int test_0_return() - { - dummy(); - return 0; - } - - static int dummy1() - { - return 1; - } - - public static int test_2_int_return() - { - int r = dummy1(); - if (r == 1) - return 2; - return 0; - } - - static int add1(int val) - { - return val + 1; - } - - public static int test_1_int_pass() - { - int r = add1(5); - if (r == 6) - return 1; - return 0; - } - - static int add_many(int val, short t, byte b, int da) - { - return val + t + b + da; - } - - public static int test_1_int_pass_many() - { - byte b = 6; - int r = add_many(5, 2, b, 1); - if (r == 14) - return 1; - return 0; - } - - unsafe static float GetFloat(byte* ptr) - { - return *(float*)ptr; - } - - unsafe public static float GetFloat(float value) - { - return GetFloat((byte*)&value); - } - - /* bug #42134 */ - public static int test_2_inline_saved_arg_type() - { - float f = 100.0f; - return GetFloat(f) == f ? 2 : 1; - } - - static int pass_many_types(int a, long b, int c, long d) - { - return a + (int)b + c + (int)d; - } - - public static int test_5_pass_longs() - { - return pass_many_types(1, 2, -5, 7); - } - - static int overflow_registers(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) - { - return a + b + c + d + e + f + g + h + i + j; - } - - public static int test_55_pass_even_more() - { - return overflow_registers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - } - - static int pass_ints_longs(int a, long b, long c, long d, long e, int f, long g) - { - return (int)(a + b + c + d + e + f + g); - } - - public static int test_1_sparc_argument_passing() - { - // The 4. argument tests split reg/mem argument passing - // The 5. argument tests mem argument passing - // The 7. argument tests passing longs in misaligned memory - // The MaxValues are needed so the MS word of the long is not 0 - return pass_ints_longs(1, 2, System.Int64.MaxValue, System.Int64.MinValue, System.Int64.MaxValue, 0, System.Int64.MinValue); - } - - static int pass_bytes(byte a, byte b, byte c, byte d, byte e, byte f, byte g) - { - return (int)(a + b + c + d + e + f + g); - } - - public static int test_21_sparc_byte_argument_passing() - { - return pass_bytes(0, 1, 2, 3, 4, 5, 6); - } - - static int pass_sbytes(sbyte a, sbyte b, sbyte c, sbyte d, sbyte e, sbyte f, sbyte g) - { - return (int)(a + b + c + d + e + f + g); - } - - public static int test_21_sparc_sbyte_argument_passing() - { - return pass_sbytes(0, 1, 2, 3, 4, 5, 6); - } - - static int pass_shorts(short a, short b, short c, short d, short e, short f, short g) - { - return (int)(a + b + c + d + e + f + g); - } - - public static int test_21_sparc_short_argument_passing() - { - return pass_shorts(0, 1, 2, 3, 4, 5, 6); - } - - static int pass_floats_doubles(float a, double b, double c, double d, double e, float f, double g) - { - return (int)(a + b + c + d + e + f + g); - } - - public static int test_721_sparc_float_argument_passing() - { - return pass_floats_doubles(100.0f, 101.0, 102.0, 103.0, 104.0, 105.0f, 106.0); - } - - static float pass_floats(float a, float b, float c, float d, float e, float f, float g, float h, float i, float j) - { - return a + b + c + d + e + f + g + h + i + j; - } - - public static int test_55_sparc_float_argument_passing2() - { - return (int)pass_floats(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f); - } - - public static bool is_small(float value) - { - double d = (double)value; - double d2 = 7.183757E-41; - return d - d2 < 0.000001; - } - - public static int test_0_float_argument_passing_precision() - { - float f = 7.183757E-41f; - return is_small(f) ? 0 : 1; - } - - // The first argument must be passed on a dword aligned stack location - static int pass_byref_ints_longs(ref long a, ref int b, ref byte c, ref short d, ref long e, ref int f, ref long g) - { - return (int)(a + b + c + d + e + f + g); - } - - static int pass_takeaddr_ints_longs(long a, int b, byte c, short d, long e, int f, long g) - { - return pass_byref_ints_longs(ref a, ref b, ref c, ref d, ref e, ref f, ref g); - } - - // Test that arguments are moved to the stack from incoming registers - // when the argument must reside in the stack because its address is taken - public static int test_2_sparc_takeaddr_argument_passing() - { - return pass_takeaddr_ints_longs(1, 2, 253, -253, System.Int64.MaxValue, 0, System.Int64.MinValue); - } - - static int pass_byref_floats_doubles(ref float a, ref double b, ref double c, ref double d, ref double e, ref float f, ref double g) - { - return (int)(a + b + c + d + e + f + g); - } - - static int pass_takeaddr_floats_doubles(float a, double b, double c, double d, double e, float f, double g) - { - return pass_byref_floats_doubles(ref a, ref b, ref c, ref d, ref e, ref f, ref g); - } - - public static int test_721_sparc_takeaddr_argument_passing2() - { - return pass_takeaddr_floats_doubles(100.0f, 101.0, 102.0, 103.0, 104.0, 105.0f, 106.0); - } - - static void pass_byref_double(out double d) - { - d = 5.0; - } - - // Test byref double argument passing - public static int test_0_sparc_byref_double_argument_passing() - { - double d; - pass_byref_double(out d); - return (d == 5.0) ? 0 : 1; - } - - static void shift_un_arg(ulong value) - { - do - { - value = value >> 4; - } while (value != 0); - } - - // Test that assignment to long arguments work - public static int test_0_long_arg_assign() - { - ulong c = 0x800000ff00000000; - - shift_un_arg(c >> 4); - - return 0; - } - - static unsafe void* ptr_return(void* ptr) - { - return ptr; - } - - public static unsafe int test_0_ptr_return() - { - void* ptr = new IntPtr(55).ToPointer(); - - if (ptr_return(ptr) == ptr) - return 0; - else - return 1; - } - - static bool isnan(float f) - { - return (f != f); - } - - public static int test_0_isnan() - { - float f = 1.0f; - return isnan(f) ? 1 : 0; - } - - static int first_is_zero(int v1, int v2) - { - if (v1 != 0) - return -1; - return v2; - } - public static int test_1_handle_dup_stloc() - { - int index = 0; - int val = first_is_zero(index, ++index); - if (val != 1) - return 2; - return 1; - } - - static long return_5low() - { - return 5; - } - - static long return_5high() - { - return 0x500000000; - } - - public static int test_3_long_ret() - { - long val = return_5low(); - return (int)(val - 2); - } - - public static int test_1_long_ret2() - { - long val = return_5high(); - if (val > 0xffffffff) - return 1; - return 0; - } - - public static void use_long_arg(ulong l) - { - for (int i = 0; i < 10; ++i) - l++; - } - - public static ulong return_long_arg(object o, ulong perm) - { - use_long_arg(perm); - - perm = 0x8000000000000FFF; - - use_long_arg(perm); - - return perm; - } - - public static int test_0_sparc_long_ret_regress_541577() - { - ulong perm = 0x8000000000000FFF; - - ulong work = return_long_arg(null, perm); - - return work == perm ? 0 : 1; - } - - static void doit(double value, out long m) - { - m = (long)value; - } - - public static int test_0_ftol_clobber() - { - long m; - doit(1.3, out m); - if (m != 1) - return 2; - return 0; - } -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/basic-float.cs b/Users/Orvid/IL2CPU Tester/CsTests/basic-float.cs deleted file mode 100644 index ddcb807a1d..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/basic-float.cs +++ /dev/null @@ -1,672 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * public static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -/* A comparison made to same variable. */ -#pragma warning disable 1718 - -public partial class Tests -{ - - public static int test_0_beq() - { - double a = 2.0; - if (a != 2.0) - return 1; - return 0; - } - - public static int test_0_bne_un() - { - double a = 2.0; - if (a == 1.0) - return 1; - return 0; - } - - public static int test_0_conv_r8() - { - double a = 2; - if (a != 2.0) - return 1; - return 0; - } - - public static int test_0_conv_i() - { - double a = 2.0; - int i = (int)a; - if (i != 2) - return 1; - uint ui = (uint)a; - if (ui != 2) - return 2; - short s = (short)a; - if (s != 2) - return 3; - ushort us = (ushort)a; - if (us != 2) - return 4; - byte b = (byte)a; - if (b != 2) - return 5; - sbyte sb = (sbyte)a; - if (sb != 2) - return 6; - return 0; - } - - public static int test_5_conv_r4() - { - int i = 5; - float f = (float)i; - return (int)f; - } - - public static int test_0_conv_r4_m1() - { - int i = -1; - float f = (float)i; - return (int)f + 1; - } - - public static int test_5_double_conv_r4() - { - double d = 5.0; - float f = (float)d; - return (int)f; - } - - public static int test_5_float_conv_r8() - { - float f = 5.0F; - double d = (double)f; - return (int)d; - } - - public static int test_5_conv_r8() - { - int i = 5; - double f = (double)i; - return (int)f; - } - - public static int test_5_add() - { - double a = 2.0; - double b = 3.0; - return (int)(a + b); - } - - public static int test_5_sub() - { - double a = 8.0; - double b = 3.0; - return (int)(a - b); - } - - public static int test_24_mul() - { - double a = 8.0; - double b = 3.0; - return (int)(a * b); - } - - public static int test_4_div() - { - double a = 8.0; - double b = 2.0; - return (int)(a / b); - } - - public static int test_2_rem() - { - double a = 8.0; - double b = 3.0; - return (int)(a % b); - } - - public static int test_2_neg() - { - double a = -2.0; - return (int)(-a); - } - - public static int test_46_float_add_spill() - { - // we overflow the FP stack - double a = 1; - double b = 2; - double c = 3; - double d = 4; - double e = 5; - double f = 6; - double g = 7; - double h = 8; - double i = 9; - - return (int)(1.0 + (a + (b + (c + (d + (e + (f + (g + (h + i))))))))); - } - - public static int test_4_float_sub_spill() - { - // we overflow the FP stack - double a = 1; - double b = 2; - double c = 3; - double d = 4; - double e = 5; - double f = 6; - double g = 7; - double h = 8; - double i = 9; - - return -(int)(1.0 - (a - (b - (c - (d - (e - (f - (g - (h - i))))))))); - ////// -(int)(1.0 - (1 - (2 - (3 - (4 - (5 - (6 - (7 - (8 - 9))))))))); - } - - public static int test_362880_float_mul_spill() - { - // we overflow the FP stack - double a = 1; - double b = 2; - double c = 3; - double d = 4; - double e = 5; - double f = 6; - double g = 7; - double h = 8; - double i = 9; - - return (int)(1.0 * (a * (b * (c * (d * (e * (f * (g * (h * i))))))))); - } - - public static int test_4_long_cast() - { - long a = 1000; - double d = (double)a; - long b = (long)d; - if (b != 1000) - return 0; - a = -1; - d = (double)a; - b = (long)d; - if (b != -1) - return 1; - return 4; - } - - public static int test_4_ulong_cast() - { - ulong a = 1000; - double d = (double)a; - ulong b = (ulong)d; - if (b != 1000) - return 0; - return 4; - } - - public static int test_4_single_long_cast() - { - long a = 1000; - float d = (float)a; - long b = (long)d; - if (b != 1000) - return 0; - a = -1; - d = (float)a; - b = (long)d; - if (b != -1) - return 1; - return 4; - } - - public static int test_0_lconv_to_r8() - { - long a = 150; - double b = (double)a; - - if (b != 150.0) - return 1; - return 0; - } - - public static int test_0_lconv_to_r4() - { - long a = 3000; - float b = (float)a; - - if (b != 3000.0F) - return 1; - return 0; - } - - static void FloatDoIt(double value, out long m) - { - m = (long)value; - } - - public static int test_0_ftol_clobber_Float() - { - long m; - FloatDoIt(1.3, out m); - if (m != 1) - return 2; - return 0; - } - - public static int test_0_rounding() - { - long ticks = 631502475130080000L; - long ticksperday = 864000000000L; - - double days = (double)ticks / ticksperday; - - if ((int)days != 730905) - return 1; - - return 0; - } - - /* FIXME: This only works on little-endian machines */ - /* - static unsafe int test_2_negative_zero () { - int result = 0; - double d = -0.0; - float f = -0.0f; - - byte *ptr = (byte*)&d; - if (ptr [7] == 0) - return result; - result ++; - - ptr = (byte*)&f; - if (ptr [3] == 0) - return result; - result ++; - - return result; - } - */ - - public static int test_16_float_cmp() - { - double a = 2.0; - double b = 1.0; - int result = 0; - bool val; - - val = a == a; - if (!val) - return result; - result++; - - val = (a != a); - if (val) - return result; - result++; - - val = a < a; - if (val) - return result; - result++; - - val = a > a; - if (val) - return result; - result++; - - val = a <= a; - if (!val) - return result; - result++; - - val = a >= a; - if (!val) - return result; - result++; - - val = b == a; - if (val) - return result; - result++; - - val = b < a; - if (!val) - return result; - result++; - - val = b > a; - if (val) - return result; - result++; - - val = b <= a; - if (!val) - return result; - result++; - - val = b >= a; - if (val) - return result; - result++; - - val = a == b; - if (val) - return result; - result++; - - val = a < b; - if (val) - return result; - result++; - - val = a > b; - if (!val) - return result; - result++; - - val = a <= b; - if (val) - return result; - result++; - - val = a >= b; - if (!val) - return result; - result++; - - return result; - } - - public static int test_15_float_cmp_un() - { - double a = Double.NaN; - double b = 1.0; - int result = 0; - bool val; - - val = a == a; - if (val) - return result; - result++; - - val = a < a; - if (val) - return result; - result++; - - val = a > a; - if (val) - return result; - result++; - - val = a <= a; - if (val) - return result; - result++; - - val = a >= a; - if (val) - return result; - result++; - - val = b == a; - if (val) - return result; - result++; - - val = b < a; - if (val) - return result; - result++; - - val = b > a; - if (val) - return result; - result++; - - val = b <= a; - if (val) - return result; - result++; - - val = b >= a; - if (val) - return result; - result++; - - val = a == b; - if (val) - return result; - result++; - - val = a < b; - if (val) - return result; - result++; - - val = a > b; - if (val) - return result; - result++; - - val = a <= b; - if (val) - return result; - result++; - - val = a >= b; - if (val) - return result; - result++; - - return result; - } - - public static int test_15_float_branch() - { - double a = 2.0; - double b = 1.0; - int result = 0; - - if (!(a == a)) - return result; - result++; - - if (a < a) - return result; - result++; - - if (a > a) - return result; - result++; - - if (!(a <= a)) - return result; - result++; - - if (!(a >= a)) - return result; - result++; - - if (b == a) - return result; - result++; - - if (!(b < a)) - return result; - result++; - - if (b > a) - return result; - result++; - - if (!(b <= a)) - return result; - result++; - - if (b >= a) - return result; - result++; - - if (a == b) - return result; - result++; - - if (a < b) - return result; - result++; - - if (!(a > b)) - return result; - result++; - - if (a <= b) - return result; - result++; - - if (!(a >= b)) - return result; - result++; - - return result; - } - - public static int test_15_float_branch_un() - { - double a = Double.NaN; - double b = 1.0; - int result = 0; - - if (a == a) - return result; - result++; - - if (a < a) - return result; - result++; - - if (a > a) - return result; - result++; - - if (a <= a) - return result; - result++; - - if (a >= a) - return result; - result++; - - if (b == a) - return result; - result++; - - if (b < a) - return result; - result++; - - if (b > a) - return result; - result++; - - if (b <= a) - return result; - result++; - - if (b >= a) - return result; - result++; - - if (a == b) - return result; - result++; - - if (a < b) - return result; - result++; - - if (a > b) - return result; - result++; - - if (a <= b) - return result; - result++; - - if (a >= b) - return result; - result++; - - return result; - } - - public static int test_0_float_precision() - { - float f1 = 3.40282346638528859E+38f; - float f2 = 3.40282346638528859E+38f; - float PositiveInfinity = 1.0f / 0.0f; - float f = f1 + f2; - - return f == PositiveInfinity ? 0 : 1; - } - - /* - Disabled until they can be fixed to run on amd64 - - static double VALUE = 0.19975845134874831D; - - public static int test_0_float_conversion_reduces_double_precision () { - double d = (float)VALUE; - if (d != 0.19975845515727997d) - return 1; - - return 0; - } - - - public static int test_0_long_to_double_conversion () - { - long l = 9223372036854775807L; - long conv = (long)((double)l); - if (conv != -9223372036854775808L) - return 1; - - return 0; - } - - public static int INT_VAL = 0x13456799; - - public static int test_0_int4_to_float_convertion () - { - double d = (double)(float)INT_VAL; - - if (d != 323315616) - return 1; - return 0; - } - */ -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/basic-long.cs b/Users/Orvid/IL2CPU Tester/CsTests/basic-long.cs deleted file mode 100644 index 5cd7540574..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/basic-long.cs +++ /dev/null @@ -1,1316 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * public static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - public static int test_10_simple_cast() - { - long a = 10; - return (int)a; - } - - public static int test_1_bigmul1() - { - int a; - int b; - long c; - a = 10; - b = 10; - c = (long)a * (long)b; - if (c == 100) - return 1; - return 0; - } - - public static int test_1_bigmul2() - { - int a = System.Int32.MaxValue, b = System.Int32.MaxValue; - long s = System.Int64.MinValue; - long c; - c = s + (long)a * (long)b; - if (c == -4611686022722355199) - return 1; - return 0; - } - - public static int test_1_bigmul3() - { - int a = 10, b = 10; - ulong c; - c = (ulong)a * (ulong)b; - if (c == 100) - return 1; - return 0; - } - - public static int test_1_bigmul4() - { - int a = System.Int32.MaxValue, b = System.Int32.MaxValue; - ulong c; - c = (ulong)a * (ulong)b; - if (c == 4611686014132420609) - return 1; - return 0; - } - - public static int test_1_bigmul5() - { - int a = System.Int32.MaxValue, b = System.Int32.MinValue; - long c; - c = (long)a * (long)b; - if (c == -4611686016279904256) - return 1; - return 0; - } - - public static int test_1_bigmul6() - { - uint a = System.UInt32.MaxValue, b = System.UInt32.MaxValue / (uint)2; - ulong c; - c = (ulong)a * (ulong)b; - if (c == 9223372030412324865) - return 1; - return 0; - } - - public static int test_0_beq_Long() - { - long a = 0xffffffffff; - if (a != 0xffffffffff) - return 1; - return 0; - } - - public static int test_0_bne_un_Long() - { - long a = 0xffffffffff; - if (a == 0xfffffffffe) - return 1; - if (a == 0xfeffffffff) - return 2; - return 0; - } - - public static int test_0_ble() - { - long a = 0xffffffffff; - if (a > 0xffffffffff) - return 1; - - if (a > 0x1ffffffffff) - return 2; - - if (a > 0xff00000000) { } - else - return 3; - - if (a > 0xfeffffffff) { } - else - return 4; - - a = 0xff00000000; - if (a > 0xffffffffff) - return 5; - - return 0; - } - - public static int test_0_ble_un() - { - ulong a = 0xffffffffff; - if (a > 0xffffffffff) - return 1; - - if (a > 0x1ffffffffff) - return 2; - - if (a > 0xff00000000) { } - else - return 3; - - if (a > 0xfeffffffff) { } - else - return 4; - - a = 0xff00000000; - if (a > 0xffffffffff) - return 5; - - return 0; - } - - public static int test_0_bge() - { - long a = 0xffffffffff; - if (a < 0xffffffffff) - return 1; - - if (a < 0x1ffffffffff) { } - else - return 2; - - if (a < 0xff00000000) - return 3; - - if (a < 0xfeffffffff) - return 4; - - a = 0xff00000000; - if (a < 0xffffffffff) { } - else - return 5; - - return 0; - } - - public static int test_0_bge_un() - { - ulong a = 0xffffffffff; - if (a < 0xffffffffff) - return 1; - - if (a < 0x1ffffffffff) { } - else - return 2; - - if (a < 0xff00000000) - return 3; - - if (a < 0xfeffffffff) - return 4; - - a = 0xff00000000; - if (a < 0xffffffffff) { } - else - return 5; - - return 0; - } - - public static int test_0_blt() - { - long a = 0xfffffffffe; - if (a >= 0xffffffffff) - return 1; - - if (a >= 0x1fffffffffe) - return 2; - - if (a >= 0xff00000000) { } - else - return 3; - - if (a >= 0xfefffffffe) { } - else - return 4; - - a = 0xff00000000; - if (a >= 0xffffffffff) - return 5; - - return 0; - } - - public static int test_0_blt_un() - { - ulong a = 0xfffffffffe; - if (a >= 0xffffffffff) - return 1; - - if (a >= 0x1fffffffffe) - return 2; - - if (a >= 0xff00000000) { } - else - return 3; - - if (a >= 0xfefffffffe) { } - else - return 4; - - a = 0xff00000000; - if (a >= 0xffffffffff) - return 5; - - return 0; - } - - public static int test_0_bgt() - { - long a = 0xffffffffff; - if (a <= 0xfffffffffe) - return 1; - - if (a <= 0x1ffffffffff) { } - else - return 2; - - if (a <= 0xff00000000) - return 3; - - if (a <= 0xfeffffffff) - return 4; - - a = 0xff00000000; - if (a <= 0xffffffffff) { } - else - return 5; - - return 0; - } - - public static int test_0_bgt_un() - { - ulong a = 0xffffffffff; - if (a <= 0xfffffffffe) - return 1; - - if (a <= 0x1ffffffffff) { } - else - return 2; - - if (a <= 0xff00000000) - return 3; - - if (a <= 0xfeffffffff) - return 4; - - a = 0xff00000000; - if (a <= 0xffffffffff) { } - else - return 5; - - return 0; - } - - public static int test_0_conv_to_i4() - { - long a = 0; - - return (int)a; - } - - public static int test_32_conv_to_u4() - { - long a = 32; - - return (int)(uint)a; - } - - public static int test_15_conv_to_u4_2() - { - long a = 0x10000000f; - - return (int)(uint)a; - } - - public static int test_0_conv_from_i4() - { - long a = 2; - if (a != 2) - return 1; - - int b = 2; - - if (a != b) - return 2; - return 0; - } - - public static int test_0_conv_from_i4_negative() - { - long a = -2; - if (a != -2) - return 1; - - int b = -2; - - if (a != b) - return 2; - return 0; - } - - /* - public static int test_0_conv_from_r8 () { - double b = 2.0; - long a = (long)b; - - if (a != 2) - return 1; - return 0; - } - - public static int test_0_conv_from_r4 () { - float b = 2.0F; - long a = (long)b; - - if (a != 2) - return 1; - return 0; - } - */ - - public static int test_8_and() - { - long a = 0xffffffffff; - long b = 8; - return (int)(a & b); - } - - public static int test_8_and_imm() - { - long a = 0xffffffffff; - return (int)(a & 8); - } - - public static int get_high_bit(ulong a) - { - if ((a & 0x8000000000000000) != 0) - return 1; - return 0; - } - - public static int test_1_and() - { - ulong a = 0xabcd1234deadbeef; - return get_high_bit(a); - } - - public static int test_10_or() - { - long a = 8; - long b = 2; - return (int)(a | b); - } - - public static int test_10_or_imm() - { - long a = 8; - return (int)(a | 2); - } - - public static int test_5_xor() - { - long a = 7; - long b = 2; - return (int)(a ^ b); - } - - public static int test_5_xor_imm() - { - long a = 7; - return (int)(a ^ 2); - } - - public static int test_5_add_Long() - { - long a = 2; - long b = 3; - return (int)(a + b); - } - - public static int test_5_add_imm() - { - long a = 2; - return (int)(a + 3); - } - - public static int test_0_add_imm_carry() - { - long a = -1; - return (int)(a + 1); - } - - public static int test_0_add_imm_no_inc() - { - // we can't blindly convert an add x, 1 to an inc x - long a = 0x1ffffffff; - long c; - c = a + 2; - if (c == ((a + 1) + 1)) - return 0; - return 1; - } - - public static int test_4_addcc_imm() - { - long a = 3; - long b = 0; - return (int)(a - b + 1); - } - - public static int test_5_sub_Long() - { - long a = 8; - long b = 3; - return (int)(a - b); - } - - public static int test_5_sub_imm() - { - long a = 8; - return (int)(a - 3); - } - - public static int test_0_sub_imm_carry() - { - long a = 0; - return (int)((a - 1) + 1); - } - - public static int test_0_add_ovf() - { - long i, j, k; - - checked - { - i = System.Int64.MinValue; - j = 0; - k = i + j; - } - - if (k != System.Int64.MinValue) - return 1; - - checked - { - i = System.Int64.MaxValue; - j = 0; - k = i + j; - } - - if (k != System.Int64.MaxValue) - return 2; - - checked - { - i = System.Int64.MinValue; - j = System.Int64.MaxValue; - k = i + j; - } - - if (k != -1) - return 3; - - checked - { - i = System.Int64.MaxValue; - j = System.Int64.MinValue; - k = i + j; - } - - if (k != -1) - return 4; - - checked - { - i = System.Int64.MinValue + 1234; - j = -1234; - k = i + j; - } - - if (k != System.Int64.MinValue) - return 5; - - checked - { - i = System.Int64.MaxValue - 1234; - j = 1234; - k = i + j; - } - - if (k != System.Int64.MaxValue) - return 6; - - return 0; - } - - public static int test_0_add_un_ovf() - { - ulong n = (ulong)134217728 * 16; - ulong number = checked(n + (uint)0); - - return number == n ? 0 : 1; - } - - public static int test_0_sub_ovf() - { - long i, j, k; - - checked - { - i = System.Int64.MinValue; - j = 0; - k = i - j; - } - - if (k != System.Int64.MinValue) - return 1; - - checked - { - i = System.Int64.MaxValue; - j = 0; - k = i - j; - } - - if (k != System.Int64.MaxValue) - return 2; - - checked - { - i = System.Int64.MinValue; - j = System.Int64.MinValue + 1234; - k = i - j; - } - - if (k != -1234) - return 3; - - checked - { - i = System.Int64.MaxValue; - j = 1234; - k = i - j; - } - - if (k != System.Int64.MaxValue - 1234) - return 4; - - checked - { - i = System.Int64.MaxValue - 1234; - j = -1234; - k = i - j; - } - - if (k != System.Int64.MaxValue) - return 5; - - checked - { - i = System.Int64.MinValue + 1234; - j = 1234; - k = i - j; - } - - if (k != System.Int64.MinValue) - return 6; - - return 0; - } - - public static int test_0_sub_ovf_un() - { - ulong i, j, k; - - checked - { - i = System.UInt64.MaxValue; - j = 0; - k = i - j; - } - - if (k != System.UInt64.MaxValue) - return 1; - - checked - { - i = System.UInt64.MaxValue; - j = System.UInt64.MaxValue; - k = i - j; - } - - if (k != 0) - return 2; - - return 0; - } - - public static int test_2_neg_Long() - { - long a = -2; - return (int)(-a); - } - - public static int test_0_neg_large() - { - long min = -9223372036854775808; - unchecked - { - ulong ul = (ulong)min; - return (min == -(long)ul) ? 0 : 1; - } - } - - public static int test_5_shift() - { - long a = 9; - int b = 1; - int count = 0; - - if ((a >> b) != 4) - return count; - count++; - - if ((a >> 63) != 0) - return count; - count++; - - if ((a << 1) != 18) - return count; - count++; - - if ((a << b) != 18) - return count; - count++; - - a = -9; - if ((a >> b) != -5) - return count; - count++; - - return count; - } - - public static int test_1_shift_u() - { - ulong a; - int count = 0; - - // The JIT optimizes this - a = 8589934592UL; - if ((a >> 32) != 2) - return 0; - count++; - - return count; - } - - public static int test_1_shift_u_32() - { - ulong a; - int count = 0; - - a = UInt64.MaxValue; - // Avoid constant folding - for (int i = 0; i < 32; ++i) - count++; - - if ((a >> count) != 0xFFFFFFFFUL) - return 0; - else - return 1; - } - - public static int test_1_simple_neg() - { - long a = 9; - - if (-a != -9) - return 0; - return 1; - } - - public static int test_2_compare() - { - long a = 1; - long b = 1; - - if (a != b) - return 0; - return 2; - } - - public static int test_9_alu() - { - long a = 9, b = 6; - int count = 0; - - if ((a + b) != 15) - return count; - count++; - - if ((a - b) != 3) - return count; - count++; - - if ((a & 8) != 8) - return count; - count++; - - if ((a | 2) != 11) - return count; - count++; - - if ((a * b) != 54) - return count; - count++; - - if ((a / 4) != 2) - return count; - count++; - - if ((a % 4) != 1) - return count; - count++; - - if (-a != -9) - return count; - count++; - - b = -1; - if (~b != 0) - return count; - count++; - - return count; - } - - public static int test_24_mul_Long() - { - long a = 8; - long b = 3; - return (int)(a * b); - } - - public static int test_24_mul_ovf() - { - long a = 8; - long b = 3; - long res; - - checked - { - res = a * b; - } - return (int)res; - } - - public static int test_24_mul_un() - { - ulong a = 8; - ulong b = 3; - return (int)(a * b); - } - - public static int test_24_mul_ovf_un() - { - ulong a = 8; - ulong b = 3; - ulong res; - - checked - { - res = a * b; - } - return (int)res; - } - - public static int test_0_mul_imm() - { - long i = 4; - - if ((i * 0) != 0) - return 1; - if ((i * 1) != 4) - return 2; - if ((i * 2) != 8) - return 3; - if ((i * 3) != 12) - return 4; - if ((i * 1234) != 4936) - return 5; - if ((i * -1) != -4) - return 6; - if ((i * -2) != -8) - return 7; - if ((i * -3) != -12) - return 8; - if ((i * -1234) != -4936) - return 9; - - return 0; - } - - public static int test_0_mul_imm_opt() - { - long i; - - i = 1; - if ((i * 2) != 2) - return 1; - i = -1; - if ((i * 2) != -2) - return 2; - i = 1; - if ((i * 3) != 3) - return 3; - i = -1; - if ((i * 3) != -3) - return 4; - i = 1; - if ((i * 5) != 5) - return 5; - i = -1; - if ((i * 5) != -5) - return 6; - i = 1; - if ((i * 6) != 6) - return 7; - i = -1; - if ((i * 6) != -6) - return 8; - i = 1; - if ((i * 9) != 9) - return 9; - i = -1; - if ((i * 9) != -9) - return 10; - i = 1; - if ((i * 10) != 10) - return 11; - i = -1; - if ((i * 10) != -10) - return 12; - i = 1; - if ((i * 12) != 12) - return 13; - i = -1; - if ((i * 12) != -12) - return 14; - i = 1; - if ((i * 25) != 25) - return 15; - i = -1; - if ((i * 25) != -25) - return 16; - i = 1; - if ((i * 100) != 100) - return 17; - i = -1; - if ((i * 100) != -100) - return 18; - - return 0; - } - - public static int test_4_divun() - { - uint b = 12; - int a = 3; - return (int)(b / a); - } - - public static int test_1431655764_bigdivun_imm() - { - unchecked - { - uint b = (uint)-2; - return (int)(b / 3); - } - } - - public static int test_1431655764_bigdivun() - { - unchecked - { - uint b = (uint)-2; - int a = 3; - return (int)(b / a); - } - } - - public static int test_1_remun() - { - uint b = 13; - int a = 3; - return (int)(b % a); - } - - public static int test_2_bigremun() - { - unchecked - { - uint b = (uint)-2; - int a = 3; - return (int)(b % a); - } - } - - public static int test_0_ceq() - { - long a = 2; - long b = 2; - long c = 3; - long d = 0xff00000002; - - bool val = (a == b); // this should produce a ceq - if (!val) - return 1; - - val = (a == c); // this should produce a ceq - if (val) - return 2; - - val = (a == d); // this should produce a ceq - if (val) - return 3; - - return 0; - } - - public static int test_0_ceq_complex() - { - long l = 1, ll = 2; - - if (l < 0 != ll < 0) - return 1; - - return 0; - } - - public static int test_0_clt() - { - long a = 2; - long b = 2; - long c = 3; - long d = 0xff00000002L; - long e = -1; - - bool val = (a < b); // this should produce a clt - if (val) - return 1; - - val = (a < c); // this should produce a clt - if (!val) - return 2; - - val = (c < a); // this should produce a clt - if (val) - return 3; - - val = (e < d); // this should produce a clt - if (!val) - return 4; - - val = (d < e); // this should produce a clt - if (val) - return 5; - - return 0; - } - - public static int test_0_clt_un() - { - ulong a = 2; - ulong b = 2; - ulong c = 3; - ulong d = 0xff00000002; - ulong e = 0xffffffffffffffff; - - bool val = (a < b); // this should produce a clt_un - if (val) - return 1; - - val = (a < c); // this should produce a clt_un - if (!val) - return 1; - - val = (d < e); // this should produce a clt_un - if (!val) - return 1; - - val = (e < d); // this should produce a clt_un - if (val) - return 1; - - return 0; - } - - public static int test_0_cgt() - { - long a = 2; - long b = 2; - long c = 3; - long d = 0xff00000002L; - long e = -1; - - bool val = (a > b); // this should produce a cgt - if (val) - return 1; - - val = (a > c); // this should produce a cgt - if (val) - return 2; - - val = (c > a); // this should produce a cgt - if (!val) - return 3; - - val = (e > d); // this should produce a cgt - if (val) - return 4; - - val = (d > e); // this should produce a cgt - if (!val) - return 5; - - return 0; - } - - public static int test_0_cgt_un() - { - ulong a = 2; - ulong b = 2; - ulong c = 3; - ulong d = 0xff00000002; - ulong e = 0xffffffffffffffff; - - bool val = (a > b); // this should produce a cgt_un - if (val) - return 1; - - val = (a > c); // this should produce a cgt_un - if (val) - return 1; - - val = (d > e); // this should produce a cgt_un - if (val) - return 1; - - val = (e > d); // this should produce a cgt_un - if (!val) - return 1; - - return 0; - } - - public static int test_3_byte_cast() - { - ulong val = 0xff00ff00f0f0f0f0; - byte b; - b = (byte)(val & 0xFF); - if (b != 0xf0) - return 1; - - return 3; - } - - public static int test_4_ushort_cast() - { - ulong val = 0xff00ff00f0f0f0f0; - ushort b; - b = (ushort)(val & 0xFFFF); - if (b != 0xf0f0) - return 1; - return 4; - } - - public static int test_500_mul_div() - { - long val = 1000; - long exp = 10; - long maxexp = 20; - long res = val * exp / maxexp; - - return (int)res; - } - - public static int test_3_checked_cast_un() - { - ulong i = 2; - long j; - - checked { j = (long)i; } - - if (j != 2) - return 0; - return 3; - } - - public static int test_4_checked_cast() - { - long i = 3; - ulong j; - - checked { j = (ulong)i; } - - if (j != 3) - return 0; - return 4; - } - - public static int test_12_checked_i1_cast() - { - long l = 12; - - checked - { - return (sbyte)l; - } - } - - public static int test_127_checked_i1_cast_un() - { - ulong l = 127; - - checked - { - return (sbyte)l; - } - } - - public static int test_1234_checked_i2_cast() - { - long l = 1234; - - checked - { - return (short)l; - } - } - - public static int test_32767_checked_i2_cast_un() - { - ulong l = 32767; - - checked - { - return (ushort)l; - } - } - - public static int test_1234_checked_i4_cast() - { - ulong ul = 1234; - - checked - { - return (int)ul; - } - } - - public static int test_10_int_uint_compare() - { - uint size = 10; - int j = 0; - for (int i = 0; i < size; ++i) - { - j++; - } - return j; - } - - public static int test_0_ulong_regress() - { - ulong u = 4257145737; - u--; - return (u == 4257145736) ? 0 : 1; - } - - public static int test_0_ulong_regress2() - { - int p2 = 31; - ulong sum_p = 2897079476 + (ulong)(1 << p2); - return (sum_p == 749595828) ? 0 : 1; - } - - public static int test_0_assemble_long() - { - uint a = 5; - ulong x = 0x12345678; - ulong y = 1; - - - ulong z = ((x - y) << 32) | a; - - if (z != 0x1234567700000005) - return 1; - - return 0; - } - - public static int test_0_hash() - { - ulong x = 0x1234567887654321; - int h = (int)(x & 0xffffffff) ^ (int)(x >> 32); - if (h != unchecked((int)(0x87654321 ^ 0x12345678))) - return h; - return 0; - - } - - public static int test_0_shift_regress() - { - long a = 0; - int b = 6; - UInt16 c = 3; - - return ((a >> (b - c)) == 0) ? 0 : 1; - } - - public static int test_1234_conv_ovf_u8() - { - int i = 1234; - - checked - { - ulong l = (ulong)i; - return (int)l; - } - } - - public static int test_0_regress_cprop_80738() - { - int hours = Int32.MinValue; - int hrssec = (hours * 3600); - long t = ((long)(hrssec) * 1000L); - - return t == 0 ? 0 : 1; - } - - public static int test_0_conv_u() - { - unsafe - { - int** dead = (int**)0xdeadbeaf; - long i = (long)dead; - return (i == 0xdeadbeaf) ? 0 : 1; - } - } - - public static int test_0_lconv_to_u2() - { - unchecked - { - ulong value = (ulong)(short)-10; - value = (ushort)value; - return (value == 65526) ? 0 : 1; - } - } -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/basic-math.cs b/Users/Orvid/IL2CPU Tester/CsTests/basic-math.cs deleted file mode 100644 index 5b05a96b9c..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/basic-math.cs +++ /dev/null @@ -1,323 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * public static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - - public static int test_0_sin_precision() - { - double d1 = Math.Sin(1); - double d2 = Math.Sin(1) - d1; - return (d2 == 0) ? 0 : 1; - } - - public static int test_0_cos_precision() - { - double d1 = Math.Cos(1); - double d2 = Math.Cos(1) - d1; - return (d2 == 0) ? 0 : 1; - } - - public static int test_0_tan_precision() - { - double d1 = Math.Tan(1); - double d2 = Math.Tan(1) - d1; - return (d2 == 0) ? 0 : 1; - } - - public static int test_0_atan_precision() - { - double d1 = Math.Atan(double.NegativeInfinity); - double d2 = Math.Atan(double.NegativeInfinity) - d1; - return (d2 == 0) ? 0 : 1; - } - - public static int test_0_sqrt_precision() - { - double d1 = Math.Sqrt(2); - double d2 = Math.Sqrt(2) - d1; - return (d2 == 0) ? 0 : 1; - } - - public static int test_2_sqrt() - { - return (int)Math.Sqrt(4); - } - public static int test_0_sqrt_precision_and_not_spill() - { - double expected = 0; - double[] operands = new double[3]; - double[] temporaries = new double[3]; - for (int i = 0; i < 3; i++) - { - operands[i] = (i + 1) * (i + 1) * (i + 1); - if (i == 0) - { - expected = operands[0]; - } - else - { - temporaries[i] = operands[i] / expected; - temporaries[i] = Math.Sqrt(temporaries[i]); - expected = temporaries[i]; - } - - //Console.Write( "{0}: {1}\n", i, temporaries [i] ); - } - expected = temporaries[2]; - - double result = Math.Sqrt(operands[2] / Math.Sqrt(operands[1] / operands[0])); - - //Console.Write( "result: {0,20:G}\n", result ); - - return (result == expected) ? 0 : 1; - } - - public static int test_0_sqrt_precision_and_spill() - { - double expected = 0; - double[] operands = new double[9]; - double[] temporaries = new double[9]; - for (int i = 0; i < 9; i++) - { - operands[i] = (i + 1) * (i + 1) * (i + 1); - if (i == 0) - { - expected = operands[0]; - } - else - { - temporaries[i] = operands[i] / expected; - temporaries[i] = Math.Sqrt(temporaries[i]); - expected = temporaries[i]; - } - - //Console.Write( "{0}: {1}\n", i, temporaries [i] ); - } - expected = temporaries[8]; - - double result = Math.Sqrt(operands[8] / Math.Sqrt(operands[7] / Math.Sqrt(operands[6] / Math.Sqrt(operands[5] / Math.Sqrt(operands[4] / Math.Sqrt(operands[3] / Math.Sqrt(operands[2] / Math.Sqrt(operands[1] / operands[0])))))))); - - //Console.Write( "result: {0,20:G}\n", result ); - - return (result == expected) ? 0 : 1; - } - - public static int test_0_div_precision_and_spill() - { - double expected = 0; - double[] operands = new double[9]; - double[] temporaries = new double[9]; - for (int i = 0; i < 9; i++) - { - operands[i] = (i + 1) * (i + 1); - if (i == 0) - { - expected = operands[0]; - } - else - { - temporaries[i] = operands[i] / expected; - expected = temporaries[i]; - } - - //Console.Write( "{0}: {1}\n", i, temporaries [i] ); - } - expected = temporaries[8]; - - double result = (operands[8] / (operands[7] / (operands[6] / (operands[5] / (operands[4] / (operands[3] / (operands[2] / (operands[1] / operands[0])))))))); - - //Console.Write( "result: {0,20:G}\n", result ); - - return (result == expected) ? 0 : 1; - } - - public static int test_0_sqrt_nan() - { - return Double.IsNaN(Math.Sqrt(Double.NaN)) ? 0 : 1; - } - - public static int test_0_sin_nan() - { - return Double.IsNaN(Math.Sin(Double.NaN)) ? 0 : 1; - } - - public static int test_0_cos_nan() - { - return Double.IsNaN(Math.Cos(Double.NaN)) ? 0 : 1; - } - - public static int test_0_tan_nan() - { - return Double.IsNaN(Math.Tan(Double.NaN)) ? 0 : 1; - } - - public static int test_0_atan_nan() - { - return Double.IsNaN(Math.Atan(Double.NaN)) ? 0 : 1; - } - - public static int test_0_min() - { - if (Math.Min(5, 6) != 5) - return 1; - if (Math.Min(6, 5) != 5) - return 2; - if (Math.Min(-100, -101) != -101) - return 3; - if (Math.Min((long)5, (long)6) != 5) - return 4; - if (Math.Min((long)6, (long)5) != 5) - return 5; - if (Math.Min((long)-100, (long)-101) != -101) - return 6; - return 0; - } - - public static int test_0_max() - { - if (Math.Max(5, 6) != 6) - return 1; - if (Math.Max(6, 5) != 6) - return 2; - if (Math.Max(-100, -101) != -100) - return 3; - if (Math.Max((long)5, (long)6) != 6) - return 4; - if (Math.Max((long)6, (long)5) != 6) - return 5; - if (Math.Max((long)-100, (long)-101) != -100) - return 6; - return 0; - } - - public static int test_0_min_un() - { - uint a = (uint)int.MaxValue + 10; - - for (uint b = 7; b <= 10; ++b) - { - if (Math.Min(a, b) != b) - return (int)b; - if (Math.Min(b, a) != b) - return (int)b; - } - - if (Math.Min((ulong)5, (ulong)6) != 5) - return 4; - if (Math.Min((ulong)6, (ulong)5) != 5) - return 5; - - ulong la = (ulong)long.MaxValue + 10; - - for (ulong b = 7; b <= 10; ++b) - { - if (Math.Min(la, b) != b) - return (int)b; - if (Math.Min(b, la) != b) - return (int)b; - } - - return 0; - } - - public static int test_0_max_un() - { - uint a = (uint)int.MaxValue + 10; - - for (uint b = 7; b <= 10; ++b) - { - if (Math.Max(a, b) != a) - return (int)b; - if (Math.Max(b, a) != a) - return (int)b; - } - - if (Math.Max((ulong)5, (ulong)6) != 6) - return 4; - if (Math.Max((ulong)6, (ulong)5) != 6) - return 5; - - ulong la = (ulong)long.MaxValue + 10; - - for (ulong b = 7; b <= 10; ++b) - { - if (Math.Max(la, b) != la) - return (int)b; - if (Math.Max(b, la) != la) - return (int)b; - } - - return 0; - } - - public static int test_0_abs() - { - double d = -5.0; - - if (Math.Abs(d) != 5.0) - return 1; - return 0; - } - - public static int test_0_round() - { - if (Math.Round(5.0) != 5.0) - return 1; - - if (Math.Round(5.000000000000001) != 5.0) - return 2; - - if (Math.Round(5.499999999999999) != 5.0) - return 3; - - if (Math.Round(5.5) != 6.0) - return 4; - - if (Math.Round(5.999999999999999) != 6.0) - return 5; - - if (Math.Round(Double.Epsilon) != 0) - return 6; - - if (!Double.IsNaN(Math.Round(Double.NaN))) - return 7; - - if (!Double.IsPositiveInfinity(Math.Round(Double.PositiveInfinity))) - return 8; - - if (!Double.IsNegativeInfinity(Math.Round(Double.NegativeInfinity))) - return 9; - - if (Math.Round(Double.MinValue) != Double.MinValue) - return 10; - - if (Math.Round(Double.MaxValue) != Double.MaxValue) - return 11; - - return 0; - } -} diff --git a/Users/Orvid/IL2CPU Tester/CsTests/basic.cs b/Users/Orvid/IL2CPU Tester/CsTests/basic.cs deleted file mode 100644 index e86c2724ea..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/basic.cs +++ /dev/null @@ -1,1528 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - public static int test_0_return_Basic() - { - return 0; - } - - public static int test_100000_return_large() - { - return 100000; - } - - public static int test_1_load_bool() - { - bool a = true; - return a ? 1 : 0; - } - - public static int test_0_load_bool_false() - { - bool a = false; - return a ? 1 : 0; - } - - public static int test_200_load_byte() - { - byte a = 200; - return a; - } - - public static int test_100_load_sbyte() - { - sbyte a = 100; - return a; - } - - public static int test_200_load_short() - { - short a = 200; - return a; - } - - public static int test_100_load_ushort() - { - ushort a = 100; - return a; - } - - public static int test_3_add_simple() - { - int a = 1; - int b = 2; - return a + b; - } - - public static int test_3_add_imm() - { - int a = 1; - return a + 2; - } - - public static int test_13407573_add_largeimm() - { - int a = 1; - return a + 13407572; - } - - public static int test_1_sub_simple() - { - int a = 1; - int b = 2; - return b - a; - } - - public static int test_1_sub_simple_un() - { - uint a = 1; - uint b = 2; - return (int)(b - a); - } - - public static int test_1_sub_imm() - { - int b = 2; - return b - 1; - } - - public static int test_2_sub_large_imm() - { - int b = 0xff0f0f; - return b - 0xff0f0d; - } - - public static int test_0_sub_inv_imm() - { - int b = 2; - return 2 - b; - } - - public static int test_2_and() - { - int b = 2; - int a = 3; - return b & a; - } - - public static int test_0_and_imm() - { - int b = 2; - return b & 0x10; - } - - public static int test_0_and_large_imm() - { - int b = 2; - return b & 0x10000000; - } - - public static int test_0_and_large_imm2() - { - int b = 2; - return b & 0x100000f0; - } - - public static int test_2_div() - { - int b = 6; - int a = 3; - return b / a; - } - - public static int test_4_div_imm() - { - int b = 12; - return b / 3; - } - - public static int test_4_divun_imm() - { - uint b = 12; - return (int)(b / 3); - } - - public static int test_0_div_fold() - { - int b = -1; - return b / 2; - } - - public static int test_2_div_fold4() - { - int b = -8; - return -(b / 4); - } - - public static int test_2_div_fold16() - { - int b = 32; - return b / 16; - } - - public static int test_719177_div_destreg() - { - int year = 1970; - return ((365 * (year - 1)) + ((year - 1) / 4)); - } - - public static int test_1_remun_imm() - { - uint b = 13; - return (int)(b % 3); - } - - public static int test_2_bigremun_imm() - { - unchecked - { - uint b = (uint)-2; - return (int)(b % 3); - } - } - - public static int test_2_rem_Basic() - { - int b = 5; - int a = 3; - return b % a; - } - - public static int test_4_rem_imm() - { - int b = 12; - return b % 8; - } - - public static int test_0_rem_imm_0() - { - int b = 12; - return b % 1; - } - - public static int test_0_rem_imm_0_neg() - { - int b = -2; - return b % 1; - } - - public static int test_4_rem_big_imm() - { - int b = 10004; - return b % 10000; - } - - public static int test_9_mul() - { - int b = 3; - int a = 3; - return b * a; - } - - public static int test_15_mul_imm() - { - int b = 3; - return b * 5; - } - - public static int test_24_mul_Basic() - { - int a = 3; - int b = 8; - int res; - - res = a * b; - - return res; - } - - public static int test_24_mul_ovf_Basic() - { - int a = 3; - int b = 8; - int res; - - checked - { - res = a * b; - } - - return res; - } - - public static int test_24_mul_un_Basic() - { - uint a = 3; - uint b = 8; - uint res; - - res = a * b; - - return (int)res; - } - - public static int test_24_mul_ovf_un_Basic() - { - uint a = 3; - uint b = 8; - uint res; - - checked - { - res = a * b; - } - - return (int)res; - } - - public static int test_0_add_ovf1() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue; - j = 0; - k = i + j; - } - - if (k != System.Int32.MinValue) - return 1; - return 0; - } - - public static int test_0_add_ovf2() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue; - j = 0; - k = i + j; - } - - if (k != System.Int32.MaxValue) - return 2; - return 0; - } - - public static int test_0_add_ovf3() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue; - j = System.Int32.MaxValue; - k = i + j; - } - - if (k != -1) - return 3; - return 0; - } - - public static int test_0_add_ovf4() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue; - j = System.Int32.MinValue; - k = i + j; - } - - if (k != -1) - return 4; - return 0; - } - - public static int test_0_add_ovf5() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue + 1234; - j = -1234; - k = i + j; - } - - if (k != System.Int32.MinValue) - return 5; - return 0; - } - - public static int test_0_add_ovf6() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue - 1234; - j = 1234; - k = i + j; - } - - if (k != System.Int32.MaxValue) - return 6; - - return 0; - } - - public static int test_0_add_un_ovf_Basic() - { - uint n = (uint)134217728 * 16; - uint number = checked(n + (uint)0); - - return number == n ? 0 : 1; - } - - public static int test_0_sub_ovf1() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue; - j = 0; - k = i - j; - } - - if (k != System.Int32.MinValue) - return 1; - - return 0; - } - - public static int test_0_sub_ovf2() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue; - j = 0; - k = i - j; - } - - if (k != System.Int32.MaxValue) - return 2; - - return 0; - } - - public static int test_0_sub_ovf3() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue; - j = System.Int32.MinValue + 1234; - k = i - j; - } - - if (k != -1234) - return 3; - - return 0; - } - - public static int test_0_sub_ovf4() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue; - j = 1234; - k = i - j; - } - - if (k != System.Int32.MaxValue - 1234) - return 4; - - return 0; - } - - public static int test_0_sub_ovf5() - { - int i, j, k; - - checked - { - i = System.Int32.MaxValue - 1234; - j = -1234; - k = i - j; - } - - if (k != System.Int32.MaxValue) - return 5; - - return 0; - } - - public static int test_0_sub_ovf6() - { - int i, j, k; - - checked - { - i = System.Int32.MinValue + 1234; - j = 1234; - k = i - j; - } - - if (k != System.Int32.MinValue) - return 6; - - return 0; - } - - public static int test_0_sub_ovf_un_Basic() - { - uint i, j, k; - - checked - { - i = System.UInt32.MaxValue; - j = 0; - k = i - j; - } - - if (k != System.UInt32.MaxValue) - return 1; - - checked - { - i = System.UInt32.MaxValue; - j = System.UInt32.MaxValue; - k = i - j; - } - - if (k != 0) - return 2; - - return 0; - } - - public static int test_3_or() - { - int b = 2; - int a = 3; - return b | a; - } - - public static int test_3_or_un() - { - uint b = 2; - uint a = 3; - return (int)(b | a); - } - - public static int test_3_or_short_un() - { - ushort b = 2; - ushort a = 3; - return (int)(b | a); - } - - public static int test_18_or_imm() - { - int b = 2; - return b | 0x10; - } - - public static int test_268435458_or_large_imm() - { - int b = 2; - return b | 0x10000000; - } - - public static int test_268435459_or_large_imm2() - { - int b = 2; - return b | 0x10000001; - } - - public static int test_1_xor() - { - int b = 2; - int a = 3; - return b ^ a; - } - - public static int test_1_xor_imm() - { - int b = 2; - return b ^ 3; - } - - public static int test_983041_xor_imm_large() - { - int b = 2; - return b ^ 0xf0003; - } - - public static int test_1_neg() - { - int b = -2; - b++; - return -b; - } - - public static int test_2_not() - { - int b = ~2; - b = ~b; - return b; - } - - public static int test_16_shift() - { - int b = 2; - int a = 3; - return b << a; - } - - public static int test_16_shift_add() - { - int b = 2; - int a = 3; - int c = 0; - return b << (a + c); - } - - public static int test_16_shift_add2() - { - int b = 2; - int a = 3; - int c = 0; - return (b + c) << a; - } - - public static int test_16_shift_imm() - { - int b = 2; - return b << 3; - } - - public static int test_524288_shift_imm_large() - { - int b = 2; - return b << 18; - } - - public static int test_12_shift_imm_inv() - { - int b = 2; - return 3 << 2; - } - - public static int test_12_shift_imm_inv_sbyte() - { - sbyte b = 2; - return 3 << 2; - } - - public static int test_1_rshift_imm() - { - int b = 8; - return b >> 3; - } - - public static int test_2_unrshift_imm() - { - uint b = 16; - return (int)(b >> 3); - } - - public static int test_0_bigunrshift_imm() - { - unchecked - { - uint b = (uint)-1; - b = b >> 1; - if (b != 0x7fffffff) - return 1; - return 0; - } - } - - public static int test_0_bigrshift_imm() - { - int b = -1; - b = b >> 1; - if (b != -1) - return 1; - return 0; - } - - public static int test_1_rshift() - { - int b = 8; - int a = 3; - return b >> a; - } - - public static int test_2_unrshift() - { - uint b = 16; - int a = 3; - return (int)(b >> a); - } - - public static int test_0_bigunrshift() - { - unchecked - { - uint b = (uint)-1; - int a = 1; - b = b >> a; - if (b != 0x7fffffff) - return 1; - return 0; - } - } - - public static int test_0_bigrshift() - { - int b = -1; - int a = 1; - b = b >> a; - if (b != -1) - return 1; - return 0; - } - - public static int test_2_cond() - { - int b = 2, a = 3, c; - if (a == b) - return 0; - return 2; - } - - public static int test_2_cond_short() - { - short b = 2, a = 3, c; - if (a == b) - return 0; - return 2; - } - - public static int test_2_cond_sbyte() - { - sbyte b = 2, a = 3, c; - if (a == b) - return 0; - return 2; - } - - public static int test_6_cascade_cond() - { - int b = 2, a = 3, c; - if (a == b) - return 0; - else if (b > a) - return 1; - else if (b != b) - return 2; - else - { - c = 1; - } - return a + b + c; - } - - public static int test_6_cascade_short() - { - short b = 2, a = 3, c; - if (a == b) - return 0; - else if (b > a) - return 1; - else if (b != b) - return 2; - else - { - c = 1; - } - return a + b + c; - } - - public static int test_0_short_sign_extend() - { - int t1 = 0xffeedd; - short s1 = (short)t1; - int t2 = s1; - - if ((uint)t2 != 0xffffeedd) - return 1; - else - return 0; - } - - public static int test_127_iconv_to_i1() - { - int i = 0x100017f; - sbyte s = (sbyte)i; - - return s; - } - - public static int test_384_iconv_to_i2() - { - int i = 0x1000180; - short s = (short)i; - - return s; - } - - public static int test_15_for_loop() - { - int i; - for (i = 0; i < 15; ++i) - { - } - return i; - } - - public static int test_11_nested_for_loop() - { - int i, j = 0; /* mcs bug here if j not set */ - for (i = 0; i < 15; ++i) - { - for (j = 200; j >= 5; --j) ; - } - return i - j; - } - - public static int test_11_several_nested_for_loops() - { - int i, j = 0; /* mcs bug here if j not set */ - for (i = 0; i < 15; ++i) - { - for (j = 200; j >= 5; --j) ; - } - i = j = 0; - for (i = 0; i < 15; ++i) - { - for (j = 200; j >= 5; --j) ; - } - return i - j; - } - - public static int test_0_conv_ovf_i1() - { - int c; - - //for (int j = 0; j < 10000000; j++) - checked - { - c = 127; - sbyte b = (sbyte)c; - c = -128; - b = (sbyte)c; - } - - return 0; - } - - public static int test_0_conv_ovf_i1_un() - { - uint c; - - checked - { - c = 127; - sbyte b = (sbyte)c; - } - - return 0; - } - - public static int test_0_conv_ovf_i2() - { - int c; - - checked - { - c = 32767; - Int16 b = (Int16)c; - c = -32768; - b = (Int16)c; - unchecked - { - uint u = 0xfffffffd; - c = (int)u; - } - b = (Int16)c; - } - - return 0; - } - - public static int test_0_conv_ovf_i2_un() - { - uint c; - - checked - { - c = 32767; - Int16 b = (Int16)c; - } - - return 0; - } - - public static int test_0_conv_ovf_u2() - { - int c; - - checked - { - c = 65535; - UInt16 b = (UInt16)c; - } - - return 0; - } - - public static int test_0_conv_ovf_u2_un() - { - uint c; - - checked - { - c = 65535; - UInt16 b = (UInt16)c; - } - - return 0; - } - - public static int test_0_conv_ovf_u4() - { - int c; - - checked - { - c = 0x7fffffff; - uint b = (uint)c; - } - - return 0; - } - - public static int test_0_conv_ovf_i4_un() - { - uint c; - - checked - { - c = 0x7fffffff; - int b = (int)c; - } - - return 0; - } - - public static int test_0_bool() - { - bool val = true; - if (val) - return 0; - return 1; - } - - public static int test_1_bool_inverted() - { - bool val = true; - if (!val) - return 0; - return 1; - } - - public static int test_1_bool_assign() - { - bool val = true; - val = !val; // this should produce a ceq - if (val) - return 0; - return 1; - } - - public static int test_1_bool_multi() - { - bool val = true; - bool val2 = true; - val = !val; - if ((val && !val2) && (!val2 && val)) - return 0; - return 1; - } - - public static int test_16_spill() - { - int a = 1; - int b = 2; - int c = 3; - int d = 4; - int e = 5; - - return (1 + (a + (b + (c + (d + e))))); - } - - public static int test_1_switch() - { - int n = 0; - - switch (n) - { - case 0: return 1; - case 1: return 2; - case -1: return 3; - default: - return 4; - } - return 1; - } - - public static int test_0_switch_constprop() - { - int n = -1; - - switch (n) - { - case 0: return 2; - case 1: return 3; - case 2: return 3; - default: - return 0; - } - return 3; - } - - public static int test_0_switch_constprop2() - { - int n = 3; - - switch (n) - { - case 0: return 2; - case 1: return 3; - case 2: return 3; - default: - return 0; - } - return 3; - } - - public static int test_0_while_loop_1() - { - - int value = 255; - - do - { - value = value >> 4; - } while (value != 0); - - return 0; - } - - public static int test_0_while_loop_2() - { - int value = 255; - int position = 5; - - do - { - value = value >> 4; - } while (value != 0 && position > 1); - - return 0; - } - - public static int test_0_char_conv() - { - int i = 1; - - char tc = (char)('0' + i); - - if (tc != '1') - return 1; - - return 0; - } - - public static int test_3_shift_regalloc() - { - int shift = 8; - int orig = 1; - byte value = 0xfe; - - orig &= ~(0xff << shift); - orig |= value << shift; - - if (orig == 0xfe01) - return 3; - return 0; - } - - enum E { A, B }; - - public static int test_2_optimize_branches() - { - switch (E.A) - { - case E.A: - if (E.A == E.B) - { - } - break; - } - return 2; - } - - public static int test_0_checked_byte_cast() - { - int v = 250; - int b = checked((byte)(v)); - - if (b != 250) - return 1; - return 0; - } - - public static int test_0_checked_byte_cast_un() - { - uint v = 250; - uint b = checked((byte)(v)); - - if (b != 250) - return 1; - return 0; - } - - public static int test_0_checked_short_cast() - { - int v = 250; - int b = checked((ushort)(v)); - - if (b != 250) - return 1; - return 0; - } - - public static int test_0_checked_short_cast_un() - { - uint v = 250; - uint b = checked((ushort)(v)); - - if (b != 250) - return 1; - return 0; - } - - public static int test_1_a_eq_b_plus_a() - { - int a = 0, b = 1; - a = b + a; - return a; - } - - public static int test_0_comp() - { - int a = 0; - int b = -1; - int error = 1; - bool val; - - val = a < b; - if (val) - return error; - error++; - - val = a > b; - if (!val) - return error; - error++; - - val = a == b; - if (val) - return error; - error++; - - val = a == a; - if (!val) - return error; - error++; - - return 0; - } - - public static int test_0_comp_unsigned() - { - uint a = 1; - uint b = 0xffffffff; - int error = 1; - bool val; - - val = a < b; - if (!val) - return error; - error++; - - val = a <= b; - if (!val) - return error; - error++; - - val = a == b; - if (val) - return error; - error++; - - val = a >= b; - if (val) - return error; - error++; - - val = a > b; - if (val) - return error; - error++; - - val = b < a; - if (val) - return error; - error++; - - val = b <= a; - if (val) - return error; - error++; - - val = b == a; - if (val) - return error; - error++; - - val = b > a; - if (!val) - return error; - error++; - - val = b >= a; - if (!val) - return error; - error++; - - return 0; - } - - public static int test_16_cmov() - { - int n = 0; - if (n == 0) - n = 16; - - return n; - } - - public static int test_0_and_cmp() - { - /* test esi, imm */ - int local = 0x01020304; - - if ((local & 0x01020304) == 0) - return 7; - - if ((local & 0x00000304) == 0) - return 8; - - if ((local & 0x00000004) == 0) - return 9; - - if ((local & 0x00000300) == 0) - return 10; - - if ((local & 0x00020000) == 0) - return 11; - - if ((local & 0x01000000) == 0) - return 12; - - return 0; - } - - public static int test_0_mul_imm_opt_Basic() - { - int i; - - i = 1; - if ((i * 2) != 2) - return 1; - i = -1; - if ((i * 2) != -2) - return 2; - i = 1; - if ((i * 3) != 3) - return 3; - i = -1; - if ((i * 3) != -3) - return 4; - i = 1; - if ((i * 5) != 5) - return 5; - i = -1; - if ((i * 5) != -5) - return 6; - i = 1; - if ((i * 6) != 6) - return 7; - i = -1; - if ((i * 6) != -6) - return 8; - i = 1; - if ((i * 9) != 9) - return 9; - i = -1; - if ((i * 9) != -9) - return 10; - i = 1; - if ((i * 10) != 10) - return 11; - i = -1; - if ((i * 10) != -10) - return 12; - i = 1; - if ((i * 12) != 12) - return 13; - i = -1; - if ((i * 12) != -12) - return 14; - i = 1; - if ((i * 25) != 25) - return 15; - i = -1; - if ((i * 25) != -25) - return 16; - i = 1; - if ((i * 100) != 100) - return 17; - i = -1; - if ((i * 100) != -100) - return 18; - - return 0; - } - - public static int test_0_cne() - { - int x = 0; - int y = 1; - - bool b = x != y; - bool bb = x != x; - - if (!b) - return 1; - if (bb) - return 2; - - return 0; - } - - public static int test_0_cmp_regvar_zero() - { - int n = 10; - - if (!(n > 0 && n >= 0 && n != 0)) - return 1; - if (n < 0 || n <= 0 || n == 0) - return 1; - - return 0; - } - - public static int test_5_div_un_cfold() - { - uint i = 10; - uint j = 2; - - return (int)(i / j); - } - - public static int test_1_rem_un_cfold() - { - uint i = 11; - uint j = 2; - - return (int)(i % j); - } - - public static int test_0_div_opt() - { - int i; - - // Avoid cfolding this - i = 0; - for (int j = 0; j < 567; ++j) - i++; - i += 1234000; - if ((i / 2) != 617283) - return 1; - if ((i / 4) != 308641) - return 2; - if ((i / 8) != 154320) - return 3; - if ((i / 16) != 77160) - return 4; - - // Avoid cfolding this - i = 0; - for (int j = 0; j < 567; ++j) - i--; - i -= 1234000; - if ((i / 2) != -617283) - return 5; - if ((i / 4) != -308641) - return 6; - if ((i / 8) != -154320) - return 7; - if ((i / 16) != -77160) - return 8; - - return 0; - } - - public static int test_0_rem_opt() - { - int i; - - // Avoid cfolding this - i = 0; - for (int j = 0; j < 29; ++j) - i++; - if ((i % 2) != 1) - return 1; - if ((i % 4) != 1) - return 2; - if ((i % 8) != 5) - return 3; - if ((i % 16) != 13) - return 4; - - // Avoid cfolding this - i = 0; - for (int j = 0; j < 29; ++j) - i--; - if ((i % 2) != -1) - return 5; - if ((i % 4) != -1) - return 6; - if ((i % 8) != -5) - return 7; - if ((i % 16) != -13) - return 8; - - return 0; - } - - public static int cmov(int i) - { - int j = 0; - - if (i > 0) - j = 1; - - return j; - } - - public static int cmov2(int i) - { - int j = 0; - - if (i <= 0) - ; - else - j = 1; - - return j; - } - - public static int test_0_branch_to_cmov_opt() - { - if (cmov(0) != 0) - return 1; - if (cmov(1) != 1) - return 2; - if (cmov2(0) != 0) - return 1; - if (cmov2(1) != 1) - return 2; - return 0; - } - - public static unsafe int test_0_ishr_sign_extend() - { - // Check that ishr does sign extension from bit 31 on 64 bit platforms - uint val = 0xF0000000u; - - uint* a = &val; - uint ui = (uint)((int)(*a) >> 2); - - if (ui != 0xfc000000) - return 1; - - // Same with non-immediates - int amount = 2; - - ui = (uint)((int)(*a) >> amount); - - if (ui != 0xfc000000) - return 2; - - return 0; - } - - public static unsafe int test_0_ishr_sign_extend_cfold() - { - int i = 32768; - int j = i << 16; - int k = j >> 16; - - return k == -32768 ? 0 : 1; - } -} \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/CsTests/bench.cs b/Users/Orvid/IL2CPU Tester/CsTests/bench.cs deleted file mode 100644 index 5f59bc17f1..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/bench.cs +++ /dev/null @@ -1,268 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - - static public int test_0_many_nested_loops() - { - // we do the loop a few times otherwise it's too fast - for (int i = 0; i < 5; ++i) - { - int n = 16; - int x = 0; - int a = n; - while (a-- != 0) - { - int b = n; - while (b-- != 0) - { - int c = n; - while (c-- != 0) - { - int d = n; - while (d-- != 0) - { - int e = n; - while (e-- != 0) - { - int f = n; - while (f-- != 0) - { - x++; - } - } - } - } - } - } - if (x != 16777216) - return 1; - } - return 0; - } - - public static int test_0_logic_run() - { - // GPL: Copyright (C) 2001 Southern Storm Software, Pty Ltd. - int iter, i = 0; - - while (i++ < 10) - { - // Initialize. - bool flag1 = true; - bool flag2 = true; - bool flag3 = true; - bool flag4 = true; - bool flag5 = true; - bool flag6 = true; - bool flag7 = true; - bool flag8 = true; - bool flag9 = true; - bool flag10 = true; - bool flag11 = true; - bool flag12 = true; - bool flag13 = true; - - // First set of tests. - for (iter = 0; iter < 2000000; ++iter) - { - if ((flag1 || flag2) && (flag3 || flag4) && - (flag5 || flag6 || flag7)) - { - flag8 = !flag8; - flag9 = !flag9; - flag10 = !flag10; - flag11 = !flag11; - flag12 = !flag12; - flag13 = !flag13; - flag1 = !flag1; - flag2 = !flag2; - flag3 = !flag3; - flag4 = !flag4; - flag5 = !flag5; - flag6 = !flag6; - flag1 = !flag1; - flag2 = !flag2; - flag3 = !flag3; - flag4 = !flag4; - flag5 = !flag5; - flag6 = !flag6; - } - } - } - return 0; - } - static public int test_1028_sieve() - { - //int NUM = ((argc == 2) ? atoi(argv[1]) : 1); - int NUM = 2000; - byte[] flags = new byte[8192 + 1]; - int i, k; - int count = 0; - - while (NUM-- != 0) - { - count = 0; - for (i = 2; i <= 8192; i++) - { - flags[i] = 1; - } - for (i = 2; i <= 8192; i++) - { - if (flags[i] != 0) - { - // remove all multiples of prime: i - for (k = i + i; k <= 8192; k += i) - { - flags[k] = 0; - } - count++; - } - } - } - //printf("Count: %d\n", count); - return (count); - } - - public static int fib(int n) - { - if (n < 2) - return 1; - return fib(n - 2) + fib(n - 1); - } - - public static int test_3524578_fib() - { - for (int i = 0; i < 10; i++) - fib(32); - - return fib(32); - } - - private static ulong numMoves; - - static void movetower(int disc, int from, int to, int use) - { - if (disc > 0) - { - numMoves++; - movetower(disc - 1, from, use, to); - movetower(disc - 1, use, to, from); - } - } - - public static int test_0_hanoi() - { - int iterations = 5000; - int numdiscs = 12; - - numMoves = 0; - while (iterations > 0) - { - iterations--; - movetower(numdiscs, 1, 3, 2); - } - if (numMoves != 20475000) - return 1; - return 0; - } - - public static int test_0_castclass() - { - object a = "a"; - - for (int i = 0; i < 100000000; i++) - { - string b = (string)a; - if ((object)a != (object)b) - return 1; - } - return 0; - } - - public static int test_23005000_float() - { - double a, b, c, d; - bool val; - int loops = 0; - a = 0.0; - b = 0.0001; - c = 2300.5; - d = 1000.0; - - while (a < c) - { - if (a == d) - b *= 2; - a += b; - val = b >= c; - if (val) break; - loops++; - } - return loops; - } - - /* - /// Gaussian blur of a generated grayscale picture - private int test_0_blur(int size) { - const int num = 5; // Number of time to blur - byte[,] arr1 = new byte[size, size]; - byte[,] arr2 = new byte[size, size]; - - int iterations = 1; - - while(iterations-- > 0) { - - // Draw fake picture - for(int i = 0; i < size; i++) { - for(int j = 0; j < size; j++) { - arr1[i, j] = (byte) (i%255); - } - } - - for(int n = 0; n < num; n++) { // num rounds of blurring - for(int i = 3; i < size-3; i++) // vertical blur arr1 -> arr2 - for(int j = 0; j < size; j++) - arr2[i, j] = (byte)((arr1[i-3, j] + arr1[i+3, j] - + 6*(arr1[i-2, j]+arr1[i+2, j]) - + 15*(arr1[i-1, j]+arr1[i+1, j]) - + 20*arr1[i, j] + 32)>>6); - - for(int j = 3; j < size-3; j++) // horizontal blur arr1 -> arr2 - for(int i = 0; i < size; i++) - arr1[i, j] = (byte)((arr2[i, j-3] + arr2[i, j+3] - + 6*(arr2[i, j-2]+arr2[i, j+2]) - + 15*(arr2[i, j-1]+arr2[i, j+1]) - + 20*arr2[i, j] + 32)>>6); - } - } - - return 0; - } - */ -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/devirtualization.cs b/Users/Orvid/IL2CPU Tester/CsTests/devirtualization.cs deleted file mode 100644 index 0dcb124076..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/devirtualization.cs +++ /dev/null @@ -1,231 +0,0 @@ -using System; -using System.Reflection; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -delegate int IntNoArgs(); - -public class Base -{ - - public virtual int method1() - { - return 1; - } - - public virtual int method2() - { - return 1; - } - - public virtual int method3() - { - return 1; - } - - public virtual int method4() - { - return 1; - } - - public virtual int method5() - { - return 1; - } - -} - -public class Middle : Base -{ - public override int method2() - { - return 2; - } - - public override int method4() - { - return 2; - } - - public override sealed int method5() - { - return 2; - } -} - - -public class OpenFinal : Middle -{ - public override sealed int method4() - { - return 3; - } - - static public int staticMethod() - { - return 3; - } - -} - -sealed public class SealedFinal : Middle -{ - public override int method1() - { - return 4; - } - - static public int staticMethod() - { - return 4; - } -} - - -public partial class Tests -{ - - - static public int test_0_sealed_class_devirt_right_method() - { - SealedFinal x = new SealedFinal(); - if (x.method1() != 4) - return 1; - if (x.method2() != 2) - return 2; - if (x.method3() != 1) - return 1; - return 0; - } - - static public int test_0_sealed_method_devirt_right_method() - { - OpenFinal x = new OpenFinal(); - if (x.method4() != 3) - return 1; - if (x.method5() != 2) - return 2; - return 0; - } - - static public int test_0_sealed_class_devirt_right_method_using_delegates() - { - SealedFinal x = new SealedFinal(); - IntNoArgs d1 = new IntNoArgs(x.method1); - IntNoArgs d2 = new IntNoArgs(x.method2); - IntNoArgs d3 = new IntNoArgs(x.method3); - - if (d1() != 4) - return 1; - if (d2() != 2) - return 2; - if (d3() != 1) - return 1; - return 0; - } - - static public int test_0_sealed_method_devirt_right_method_using_delegates() - { - OpenFinal x = new OpenFinal(); - IntNoArgs d1 = new IntNoArgs(x.method4); - IntNoArgs d2 = new IntNoArgs(x.method5); - - if (d1() != 3) - return 1; - if (d2() != 2) - return 2; - return 0; - } - - - static public int test_0_delegate_over_static_method_devirtualize_ok() - { - IntNoArgs d1 = new IntNoArgs(OpenFinal.staticMethod); - IntNoArgs d2 = new IntNoArgs(SealedFinal.staticMethod); - - if (d1() != 3) - return 1; - if (d2() != 4) - return 2; - - return 0; - } - - static public int test_0_npe_still_happens() - { - OpenFinal x = null; - SealedFinal y = null; - - try - { - y.method1(); - return 1; - } - catch (NullReferenceException e) - { - ;//ok - } - - try - { - y.method2(); - return 2; - } - catch (NullReferenceException e) - { - ;//ok - } - - try - { - y.method3(); - return 3; - } - catch (NullReferenceException e) - { - ;//ok - } - - try - { - x.method4(); - return 4; - } - catch (NullReferenceException e) - { - ;//ok - } - - try - { - x.method5(); - return 5; - } - catch (NullReferenceException e) - { - ;//ok - } - - return 0; - } -} \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/CsTests/exceptions.cs b/Users/Orvid/IL2CPU Tester/CsTests/exceptions.cs deleted file mode 100644 index bfd9aaaecd..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/exceptions.cs +++ /dev/null @@ -1,3382 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * public static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - - public static int test_0_catch() - { - Exception x = new Exception(); - - try - { - throw x; - } - catch (Exception e) - { - if (e == x) - return 0; - } - return 1; - } - - public static int test_0_finally_without_exc() - { - int x; - - try - { - x = 1; - } - catch (Exception e) - { - x = 2; - } - finally - { - x = 0; - } - - return x; - } - - public static int test_0_finally() - { - int x = 1; - - try - { - throw new Exception(); - } - catch (Exception e) - { - x = 2; - } - finally - { - x = 0; - } - return x; - } - - public static int test_0_nested_finally() - { - int a; - - try - { - a = 1; - } - finally - { - try - { - a = 2; - } - finally - { - a = 0; - } - } - return a; - } - - public static int test_0_byte_cast() - { - int a; - long l; - ulong ul; - byte b = 0; - bool failed; - - try - { - a = 255; - failed = false; - checked - { - b = (byte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 1; - if (b != 255) - return -1; - - try - { - a = 0; - failed = false; - checked - { - b = (byte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 2; - if (b != 0) - return -2; - - - try - { - a = 256; - failed = true; - checked - { - b = (byte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 3; - if (b != 0) - return -3; - - try - { - a = -1; - failed = true; - checked - { - b = (byte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - if (b != 0) - return -4; - - try - { - double d = 0; - failed = false; - checked - { - b = (byte)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 5; - if (b != 0) - return -5; - - try - { - double d = -1; - failed = true; - checked - { - b = (byte)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 6; - if (b != 0) - return -6; - - try - { - double d = 255; - failed = false; - checked - { - b = (byte)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 7; - if (b != 255) - return -7; - - try - { - double d = 256; - failed = true; - checked - { - b = (byte)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - if (b != 255) - return -8; - - try - { - l = 255; - failed = false; - checked - { - b = (byte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 9; - if (b != 255) - return -9; - - try - { - l = 0; - failed = false; - checked - { - b = (byte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 10; - if (b != 0) - return -10; - - try - { - l = 256; - failed = true; - checked - { - b = (byte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 11; - if (b != 0) - return -11; - - try - { - l = -1; - failed = true; - checked - { - b = (byte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 12; - if (b != 0) - return -12; - - try - { - ul = 256; - failed = true; - checked - { - b = (byte)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 13; - if (b != 0) - return -13; - - return 0; - } - - public static int test_0_sbyte_cast() - { - int a; - long l; - sbyte b = 0; - bool failed; - - try - { - a = 255; - failed = true; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 1; - if (b != 0) - return -1; - - try - { - a = 0; - failed = false; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 2; - if (b != 0) - return -2; - - try - { - a = 256; - failed = true; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 3; - if (b != 0) - return -3; - - try - { - a = -129; - failed = true; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - if (b != 0) - return -4; - - try - { - a = -1; - failed = false; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 5; - if (b != -1) - return -5; - - try - { - a = -128; - failed = false; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 6; - if (b != -128) - return -6; - - try - { - a = 127; - failed = false; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 7; - if (b != 127) - return -7; - - try - { - a = 128; - failed = true; - checked - { - b = (sbyte)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - if (b != 127) - return -8; - - try - { - double d = 127; - failed = false; - checked - { - b = (sbyte)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 9; - if (b != 127) - return -9; - - try - { - double d = -128; - failed = false; - checked - { - b = (sbyte)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 10; - if (b != -128) - return -10; - - try - { - double d = 128; - failed = true; - checked - { - b = (sbyte)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 11; - if (b != -128) - return -11; - - try - { - double d = -129; - failed = true; - checked - { - b = (sbyte)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 12; - if (b != -128) - return -12; - - try - { - l = 255; - failed = true; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 13; - if (b != -128) - return -13; - - try - { - l = 0; - failed = false; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 14; - if (b != 0) - return -14; - - try - { - l = 256; - failed = true; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 15; - if (b != 0) - return -15; - - try - { - l = -129; - failed = true; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 16; - if (b != 0) - return -16; - - try - { - l = -1; - failed = false; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 17; - if (b != -1) - return -17; - - try - { - l = -128; - failed = false; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 18; - if (b != -128) - return -18; - - try - { - l = 127; - failed = false; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 19; - if (b != 127) - return -19; - - try - { - l = 128; - failed = true; - checked - { - b = (sbyte)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 20; - if (b != 127) - return -20; - - try - { - ulong ul = 128; - failed = true; - checked - { - b = (sbyte)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 21; - if (b != 127) - return -21; - - return 0; - } - - public static int test_0_ushort_cast() - { - int a; - long l; - ulong ul; - ushort b; - bool failed; - - try - { - a = System.UInt16.MaxValue; - failed = false; - checked - { - b = (ushort)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 1; - - try - { - a = 0; - failed = false; - checked - { - b = (ushort)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 2; - - try - { - a = System.UInt16.MaxValue + 1; - failed = true; - checked - { - b = (ushort)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 3; - - try - { - a = -1; - failed = true; - checked - { - b = (ushort)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - try - { - double d = 0; - failed = false; - checked - { - b = (ushort)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 5; - - try - { - double d = System.UInt16.MaxValue; - failed = false; - checked - { - b = (ushort)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 6; - - try - { - double d = -1; - failed = true; - checked - { - b = (ushort)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 7; - - try - { - double d = System.UInt16.MaxValue + 1.0; - failed = true; - checked - { - b = (ushort)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - - try - { - l = System.UInt16.MaxValue; - failed = false; - checked - { - b = (ushort)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 9; - - try - { - l = 0; - failed = false; - checked - { - b = (ushort)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 10; - - try - { - l = System.UInt16.MaxValue + 1; - failed = true; - checked - { - b = (ushort)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 11; - - try - { - l = -1; - failed = true; - checked - { - b = (ushort)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 12; - - try - { - ul = 0xfffff; - failed = true; - checked - { - b = (ushort)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 13; - - return 0; - } - - public static int test_0_short_cast() - { - int a; - long l; - short b; - bool failed; - - try - { - a = System.UInt16.MaxValue; - failed = true; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 1; - - try - { - a = 0; - failed = false; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 2; - - try - { - a = System.Int16.MaxValue + 1; - failed = true; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 3; - - try - { - a = System.Int16.MinValue - 1; - failed = true; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - try - { - a = -1; - failed = false; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 5; - - try - { - a = System.Int16.MinValue; - failed = false; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 6; - - try - { - a = System.Int16.MaxValue; - failed = false; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 7; - - try - { - a = System.Int16.MaxValue + 1; - failed = true; - checked - { - b = (short)a; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - - try - { - double d = System.Int16.MaxValue; - failed = false; - checked - { - b = (short)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 9; - - try - { - double d = System.Int16.MinValue; - failed = false; - checked - { - b = (short)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 10; - - try - { - double d = System.Int16.MaxValue + 1.0; - failed = true; - checked - { - b = (short)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 11; - - try - { - double d = System.Int16.MinValue - 1.0; - failed = true; - checked - { - b = (short)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 12; - - try - { - l = System.Int16.MaxValue + 1; - failed = true; - checked - { - b = (short)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 13; - - try - { - l = System.Int16.MaxValue; - failed = false; - checked - { - b = (short)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 14; - - try - { - l = System.Int16.MinValue - 1; - failed = true; - checked - { - b = (short)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 15; - - - try - { - l = System.Int16.MinValue; - failed = false; - checked - { - b = (short)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 16; - - try - { - l = 0x00000000ffffffff; - failed = true; - checked - { - b = (short)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 17; - - try - { - ulong ul = 32768; - failed = true; - checked - { - b = (short)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 18; - - return 0; - } - - public static int test_0_int_cast() - { - int a; - long l; - bool failed; - - try - { - double d = System.Int32.MaxValue + 1.0; - failed = true; - checked - { - a = (int)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 1; - - try - { - double d = System.Int32.MaxValue; - failed = false; - checked - { - a = (int)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 2; - - - try - { - double d = System.Int32.MinValue; - failed = false; - checked - { - a = (int)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 3; - - - try - { - double d = System.Int32.MinValue - 1.0; - failed = true; - checked - { - a = (int)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - try - { - l = System.Int32.MaxValue + (long)1; - failed = true; - checked - { - a = (int)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 5; - - try - { - l = System.Int32.MaxValue; - failed = false; - checked - { - a = (int)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 6; - - - try - { - l = System.Int32.MinValue; - failed = false; - checked - { - a = (int)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 7; - - - try - { - l = System.Int32.MinValue - (long)1; - failed = true; - checked - { - a = (int)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - - try - { - uint ui = System.UInt32.MaxValue; - failed = true; - checked - { - a = (int)ui; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 9; - - try - { - ulong ul = (long)(System.Int32.MaxValue) + 1; - failed = true; - checked - { - a = (int)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 10; - - try - { - ulong ul = UInt64.MaxValue; - failed = true; - checked - { - a = (int)ul; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 11; - - { - int i; - float f = 1.1f; - checked - { - i = (int)f; - } - } - - return 0; - } - - public static int test_0_uint_cast() - { - uint a; - long l; - bool failed; - - try - { - double d = System.UInt32.MaxValue; - failed = false; - checked - { - a = (uint)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 1; - - try - { - double d = System.UInt32.MaxValue + 1.0; - failed = true; - checked - { - a = (uint)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 2; - - try - { - double d = System.UInt32.MinValue; - failed = false; - checked - { - a = (uint)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 3; - - try - { - double d = System.UInt32.MinValue - 1.0; - failed = true; - checked - { - a = (uint)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - try - { - l = System.UInt32.MaxValue; - failed = false; - checked - { - a = (uint)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 5; - - try - { - l = System.UInt32.MaxValue + (long)1; - failed = true; - checked - { - a = (uint)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 6; - - try - { - l = System.UInt32.MinValue; - failed = false; - checked - { - a = (uint)l; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 7; - - try - { - l = System.UInt32.MinValue - (long)1; - failed = true; - checked - { - a = (uint)l; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 8; - - try - { - int i = -1; - failed = true; - checked - { - a = (uint)i; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 9; - - { - uint i; - float f = 1.1f; - checked - { - i = (uint)f; - } - } - - return 0; - } - - public static int test_0_long_cast() - { - - /* - * These tests depend on properties of x86 fp arithmetic so they won't work - * on other platforms. - */ - /* - long a; - bool failed; - - try { - double d = System.Int64.MaxValue - 512.0; - failed = true; - checked { - a = (long)d; - } - } catch (OverflowException) { - failed = false; - } - if (failed) - return 1; - - try { - double d = System.Int64.MaxValue - 513.0; - failed = false; - checked { - a = (long)d; - } - } catch (OverflowException) { - failed = true; - } - if (failed) - return 2; - - try { - double d = System.Int64.MinValue - 1024.0; - failed = false; - checked { - a = (long)d; - } - } catch (OverflowException) { - failed = true; - } - if (failed) - return 3; - - try { - double d = System.Int64.MinValue - 1025.0; - failed = true; - checked { - a = (long)d; - } - } catch (OverflowException) { - failed = false; - } - if (failed) - return 4; - */ - - { - long i; - float f = 1.1f; - checked - { - i = (long)f; - } - } - - return 0; - } - - public static int test_0_ulong_cast() - { - ulong a; - bool failed; - - /* - * These tests depend on properties of x86 fp arithmetic so they won't work - * on other platforms. - */ - - /* - try { - double d = System.UInt64.MaxValue - 1024.0; - failed = true; - checked { - a = (ulong)d; - } - } catch (OverflowException) { - failed = false; - } - if (failed) - return 1; - - try { - double d = System.UInt64.MaxValue - 1025.0; - failed = false; - checked { - a = (ulong)d; - } - } catch (OverflowException) { - failed = true; - } - if (failed) - return 2; - */ - - try - { - double d = 0; - failed = false; - checked - { - a = (ulong)d; - } - } - catch (OverflowException) - { - failed = true; - } - if (failed) - return 3; - - try - { - double d = -1; - failed = true; - checked - { - a = (ulong)d; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - { - ulong i; - float f = 1.1f; - checked - { - i = (ulong)f; - } - } - - try - { - int i = -1; - failed = true; - checked - { - a = (ulong)i; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 5; - - try - { - int i = Int32.MinValue; - failed = true; - checked - { - a = (ulong)i; - } - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 6; - - return 0; - } - - public static int test_0_simple_double_casts() - { - - double d = 0xffffffff; - - if ((uint)d != 4294967295) - return 1; - - /* - * These tests depend on properties of x86 fp arithmetic so they won't work - * on other platforms. - */ - /* - d = 0xffffffffffffffff; - - if ((ulong)d != 0) - return 2; - - if ((ushort)d != 0) - return 3; - - if ((byte)d != 0) - return 4; - */ - - d = 0xffff; - - if ((ushort)d != 0xffff) - return 5; - - if ((byte)d != 0xff) - return 6; - - return 0; - } - - public static int test_0_div_zero() - { - int d = 1; - int q = 0; - int val; - bool failed; - - try - { - failed = true; - val = d / q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 1; - - try - { - failed = true; - val = d % q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 2; - - try - { - failed = true; - q = -1; - d = Int32.MinValue; - val = d / q; - } - catch (DivideByZeroException) - { - /* wrong exception */ - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 3; - - try - { - failed = true; - q = -1; - d = Int32.MinValue; - val = d % q; - } - catch (DivideByZeroException) - { - /* wrong exception */ - } - catch (OverflowException) - { - failed = false; - } - if (failed) - return 4; - - return 0; - } - - public static int return_55() - { - return 55; - } - - public static int test_0_cfold_div_zero() - { - // Test that constant folding doesn't cause division by zero exceptions - if (return_55() != return_55()) - { - int d = 1; - int q = 0; - int val; - - val = d / q; - val = d % q; - - q = -1; - d = Int32.MinValue; - val = d / q; - - q = -1; - val = d % q; - } - - return 0; - } - - public static int test_0_udiv_zero() - { - uint d = 1; - uint q = 0; - uint val; - bool failed; - - try - { - failed = true; - val = d / q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 1; - - try - { - failed = true; - val = d % q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 2; - - return 0; - } - - public static int test_0_long_div_zero() - { - long d = 1; - long q = 0; - long val; - bool failed; - - try - { - failed = true; - val = d / q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 1; - - try - { - failed = true; - val = d % q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 2; - - try - { - failed = true; - q = -1; - d = Int64.MinValue; - val = d / q; - } - catch (DivideByZeroException) - { - /* wrong exception */ - } - catch (ArithmeticException) - { - failed = false; - } - if (failed) - return 3; - - try - { - failed = true; - q = -1; - d = Int64.MinValue; - val = d % q; - } - catch (DivideByZeroException) - { - /* wrong exception */ - } - catch (ArithmeticException) - { - failed = false; - } - if (failed) - return 4; - - return 0; - } - - public static int test_0_ulong_div_zero() - { - ulong d = 1; - ulong q = 0; - ulong val; - bool failed; - - try - { - failed = true; - val = d / q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 1; - - try - { - failed = true; - val = d % q; - } - catch (DivideByZeroException) - { - failed = false; - } - if (failed) - return 2; - - return 0; - } - - public static int test_0_float_div_zero() - { - double d = 1; - double q = 0; - double val; - bool failed; - - try - { - failed = false; - val = d / q; - } - catch (DivideByZeroException) - { - failed = true; - } - if (failed) - return 1; - - try - { - failed = false; - val = d % q; - } - catch (DivideByZeroException) - { - failed = true; - } - if (failed) - return 2; - - return 0; - } - - public static int test_0_invalid_unbox() - { - - int i = 123; - object o = "Some string"; - int res = 1; - - try - { - // Illegal conversion; o contains a string not an int - i = (int)o; - } - catch (Exception e) - { - if (i == 123) - res = 0; - } - - return res; - } - - // Test that double[] can't be cast to double (bug #46027) - public static int test_0_invalid_unbox_arrays() - { - double[] d1 = { 1.0 }; - double[][] d2 = { d1 }; - Array a = d2; - - try - { - foreach (double d in a) - { - } - return 1; - } - catch (InvalidCastException e) - { - return 0; - } - } - - /* bug# 42190, at least mcs generates a leave for the return that - * jumps out of multiple exception clauses: we used to execute just - * one enclosing finally block. - */ - public static int finally_level; - static void do_something() - { - int a = 0; - try - { - try - { - return; - } - finally - { - a = 1; - } - } - finally - { - finally_level++; - } - } - - public static int test_2_multiple_finally_clauses() - { - finally_level = 0; - do_something(); - if (finally_level == 1) - return 2; - return 0; - } - - public static int test_3_checked_cast_un_Exceptions() - { - ulong i = 0x8000000034000000; - long j; - - try - { - checked { j = (long)i; } - } - catch (OverflowException) - { - j = 2; - } - - if (j != 2) - return 0; - return 3; - } - - public static int test_4_checked_cast_Exceptions() - { - long i; - ulong j; - - unchecked { i = (long)0x8000000034000000; }; - try - { - checked { j = (ulong)i; } - } - catch (OverflowException) - { - j = 3; - } - - if (j != 3) - return 0; - return 4; - } - - static readonly int[] mul_dim_results = new int[] { - 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, - 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, - 2, 0, 2, 1, 2, 8, - 3, 0, 3, 1, 3, 8, - 4, 0, 4, 1, 4, 8, - 5, 0, 5, 1, 5, 2, 5, 3, 5, 4, 5, 5, 5, 6, 5, 7, 5, 8, - 6, 0, 6, 1, 6, 2, 6, 3, 6, 4, 6, 5, 6, 6, 6, 7, 6, 8, - 7, 0, 7, 1, 7, 2, 7, 3, 7, 4, 7, 5, 7, 6, 7, 7, 7, 8, - }; - - public static int test_0_multi_dim_array_access() - { - int[,] a = System.Array.CreateInstance(typeof(int), - new int[] { 3, 6 }, new int[] { 2, 2 }) as int[,]; - int x, y; - int result_idx = 0; - for (x = 0; x < 8; ++x) - { - for (y = 0; y < 9; ++y) - { - bool got_ex = false; - try - { - a[x, y] = 1; - } - catch - { - got_ex = true; - } - if (got_ex) - { - if (result_idx >= mul_dim_results.Length) - return -1; - if (mul_dim_results[result_idx] != x || mul_dim_results[result_idx + 1] != y) - { - return result_idx + 1; - } - result_idx += 2; - } - } - } - if (result_idx == mul_dim_results.Length) - return 0; - return 200; - } - - static void helper_out_obj(out object o) - { - o = (object)"buddy"; - } - - static void helper_out_string(out string o) - { - o = "buddy"; - } - - public static int test_2_array_mismatch() - { - string[] a = { "hello", "world" }; - object[] b = a; - bool passed = false; - - try - { - helper_out_obj(out b[1]); - } - catch (ArrayTypeMismatchException) - { - passed = true; - } - if (!passed) - return 0; - helper_out_string(out a[1]); - if (a[1] != "buddy") - return 1; - return 2; - } - - public static int test_0_ovf1() - { - int exception = 0; - - checked - { - try - { - ulong a = UInt64.MaxValue - 1; - ulong t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf2() - { - int exception = 0; - - checked - { - try - { - ulong a = UInt64.MaxValue; - ulong t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf3() - { - int exception = 0; - - long a = Int64.MaxValue - 1; - checked - { - try - { - long t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf4() - { - int exception = 0; - - long a = Int64.MaxValue; - checked - { - try - { - long t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf5() - { - int exception = 0; - - ulong a = UInt64.MaxValue - 1; - checked - { - try - { - ulong t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf6() - { - int exception = 0; - - ulong a = UInt64.MaxValue; - checked - { - try - { - ulong t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf7() - { - int exception = 0; - - long a = Int64.MinValue + 1; - checked - { - try - { - long t = a--; - } - catch - { - exception = 1; - } - } - return 0; - } - - public static int test_1_ovf8() - { - int exception = 0; - - long a = Int64.MinValue; - checked - { - try - { - long t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf9() - { - int exception = 0; - - ulong a = UInt64.MinValue + 1; - checked - { - try - { - ulong t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf10() - { - int exception = 0; - - ulong a = UInt64.MinValue; - checked - { - try - { - ulong t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf11() - { - int exception = 0; - - int a = Int32.MinValue + 1; - checked - { - try - { - int t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf12() - { - int exception = 0; - - int a = Int32.MinValue; - checked - { - try - { - int t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf13() - { - int exception = 0; - - uint a = 1; - checked - { - try - { - uint t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf14() - { - int exception = 0; - - uint a = 0; - checked - { - try - { - uint t = a--; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf15() - { - int exception = 0; - - sbyte a = 126; - checked - { - try - { - sbyte t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf16() - { - int exception = 0; - - sbyte a = 127; - checked - { - try - { - sbyte t = a++; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf17() - { - int exception = 0; - - checked - { - try - { - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf18() - { - int exception = 0; - - int a = 1 << 29; - checked - { - try - { - int t = a * 2; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf19() - { - int exception = 0; - - int a = 1 << 30; - checked - { - try - { - int t = a * 2; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_0_ovf20() - { - int exception = 0; - - checked - { - try - { - ulong a = 0xffffffffff; - ulong t = a * 0x0ffffff; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf21() - { - int exception = 0; - - ulong a = 0xffffffffff; - checked - { - try - { - ulong t = a * 0x0fffffff; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf22() - { - int exception = 0; - - long a = Int64.MinValue; - long b = 10; - checked - { - try - { - long v = a * b; - } - catch - { - exception = 1; - } - } - return exception; - } - - public static int test_1_ovf23() - { - int exception = 0; - - long a = 10; - long b = Int64.MinValue; - checked - { - try - { - long v = a * b; - } - catch - { - exception = 1; - } - } - return exception; - } - - class Broken - { - public static int i; - - static Broken() - { - throw new Exception("Ugh!"); - } - - public static int DoSomething() - { - return i; - } - } - - public static int test_0_exception_in_cctor() - { - try - { - Broken.DoSomething(); - } - catch (TypeInitializationException) - { - // This will only happen once even if --regression is used - } - return 0; - } - - public static int test_5_regalloc() - { - int i = 0; - - try - { - for (i = 0; i < 10; ++i) - { - if (i == 5) - throw new Exception(); - } - } - catch (Exception) - { - if (i != 5) - return i; - } - - // Check that variables written in catch clauses are volatile - int j = 0; - try - { - throw new Exception(); - } - catch (Exception) - { - j = 5; - } - if (j != 5) - return 6; - - int k = 0; - try - { - try - { - throw new Exception(); - } - finally - { - k = 5; - } - } - catch (Exception) - { - } - if (k != 5) - return 7; - - return i; - } - - public static void rethrow() - { - try - { - throw new ApplicationException(); - } - catch (ApplicationException) - { - try - { - throw new OverflowException(); - } - catch (Exception) - { - throw; - } - } - } - - // Test that a rethrow rethrows the correct exception - public static int test_0_rethrow_nested() - { - try - { - rethrow(); - } - catch (OverflowException) - { - return 0; - } - catch (Exception) - { - return 1; - } - return 2; - } - - /* MarshalByRefObject prevents the methods from being inlined */ - class ThrowClass : MarshalByRefObject - { - public static void rethrow1() - { - throw new Exception(); - } - - public static void rethrow2() - { - rethrow1(); - /* This disables tailcall opts */ - Console.WriteLine(); - } - } - - public static int test_0_rethrow_stacktrace() - { - // Check that rethrowing an exception preserves the original stack trace - try - { - try - { - ThrowClass.rethrow2(); - } - catch (Exception ex) - { - // Check that each catch clause has its own exception variable - // If not, the throw below will overwrite the exception used - // by the rethrow - try - { - throw new DivideByZeroException(); - } - catch (Exception foo) - { - } - - throw; - } - } - catch (Exception ex) - { - if (ex.StackTrace.IndexOf("rethrow2") != -1) - return 0; - } - - return 1; - } - - interface ExceptionIFace { } - class ExceptionFace : ExceptionIFace { } - - public static int test_1_array_mismatch_2() - { - try - { - object[] o = new ExceptionFace[1]; - o[0] = 1; - return 0; - } - catch (ArrayTypeMismatchException) - { - return 1; - } - } - - public static int test_1_array_mismatch_3() - { - try - { - object[] o = new ExceptionIFace[1]; - o[0] = 1; - return 0; - } - catch (ArrayTypeMismatchException) - { - return 1; - } - } - - public static int test_1_array_mismatch_4() - { - try - { - object[][] o = new ExceptionFace[5][]; - o[0] = new object[5]; - - return 0; - } - catch (ArrayTypeMismatchException) - { - return 1; - } - } - - public static int test_0_array_size() - { - bool failed; - - try - { - failed = true; - int[] mem1 = new int[Int32.MaxValue]; - } - catch (OutOfMemoryException e) - { - failed = false; - } - if (failed) - return 1; - - try - { - failed = true; - int[,] mem2 = new int[Int32.MaxValue, Int32.MaxValue]; - } - catch (OutOfMemoryException e) - { - failed = false; - } - if (failed) - return 2; - - return 0; - } - - struct S - { - int i, j, k, l, m, n; - } - - static IntPtr[] addr; - - static unsafe void throw_func(int i, S s) - { - addr[i] = new IntPtr(&i); - throw new Exception(); - } - - /* Test that arguments are correctly popped off the stack during unwinding */ - public static int test_0_stack_unwind() - { - addr = new IntPtr[1000]; - S s = new S(); - for (int j = 0; j < 1000; j++) - { - try - { - throw_func(j, s); - } - catch (Exception) - { - } - } - return (addr[0].ToInt64() - addr[100].ToInt64() < 100) ? 0 : 1; - } - - static unsafe void get_sp(int i) - { - addr[i] = new IntPtr(&i); - } - - /* Test that the arguments to the throw trampoline are correctly popped off the stack */ - public static int test_0_throw_unwind() - { - addr = new IntPtr[1000]; - S s = new S(); - for (int j = 0; j < 1000; j++) - { - try - { - get_sp(j); - throw new Exception(); - } - catch (Exception) - { - } - } - return (addr[0].ToInt64() - addr[100].ToInt64() < 100) ? 0 : 1; - } - - public static int test_0_regress_73242() - { - int[] arr = new int[10]; - for (int i = 0; i < 10; ++i) - arr[i] = 0; - try - { - throw new Exception(); - } - catch - { - } - return 0; - } - - public static int test_0_nullref() - { - try - { - Array foo = null; - foo.Clone(); - } - catch (NullReferenceException e) - { - return 0; - } - return 1; - } - - public int amethod() - { - return 1; - } - - public static int test_0_nonvirt_nullref_at_clause_start() - { - Tests t = null; - try - { - t.amethod(); - } - catch (NullReferenceException) - { - return 0; - } - - return 1; - } - - public static int throw_only() - { - throw new Exception(); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - public static int throw_only2() - { - return throw_only(); - } - - public static int test_0_inline_throw_only() - { - try - { - return throw_only2(); - } - catch (Exception ex) - { - return 0; - } - } - - public static string GetText(string s) - { - return s; - } - - public static int throw_only_gettext() - { - throw new Exception(GetText("FOO")); - } - - public static int test_0_inline_throw_only_gettext() - { - object o = null; - try - { - o = throw_only_gettext(); - } - catch (Exception ex) - { - return 0; - } - - return o != null ? 0 : 1; - } - - // bug #78633 - public static int test_0_throw_to_branch_opt_outer_clause() - { - int i = 0; - - try - { - try - { - string[] files = new string[1]; - - string s = files[2]; - } - finally - { - i++; - } - } - catch - { - } - - return (i == 1) ? 0 : 1; - } - - // bug #485721 - public static int test_0_try_inside_finally_cmov_opt() - { - bool Reconect = false; - - object o = new object(); - - try - { - } - catch (Exception ExCon) - { - if (o != null) - Reconect = true; - - try - { - } - catch (Exception Last) - { - } - } - finally - { - if (Reconect == true) - { - try - { - } - catch (Exception ex) - { - } - } - } - - return 0; - } - - public static int test_0_inline_throw() - { - try - { - inline_throw1(5); - return 1; - } - catch - { - return 0; - } - } - - // for llvm, the end bblock is unreachable - public static int inline_throw1(int i) - { - if (i == 0) - throw new Exception(); - else - return inline_throw2(i); - } - - public static int inline_throw2(int i) - { - throw new Exception(); - } - - // bug #539550 - public static int test_0_lmf_filter() - { - try - { - // The invoke calls a runtime-invoke wrapper which has a filter clause - typeof(Tests).GetMethod("lmf_filter").Invoke(null, new object[] { }); - } - catch (TargetInvocationException) - { - } - return 0; - } - - public static void lmf_filter() - { - try - { - Connect(); - } - catch - { - throw new NotImplementedException(); - } - } - - public static void Connect() - { - Stop(); - throw new Exception(); - } - - public static void Stop() - { - try - { - lock (null) { } - } - catch - { - } - } - - private static void do_raise() - { - throw new System.Exception(); - } - - private static int int_func(int i) - { - return i; - } - - // #559876 - public static int test_8_local_deadce_causes() - { - int myb = 4; - - try - { - myb = int_func(8); - do_raise(); - myb = int_func(2); - } - catch (System.Exception) - { - return myb; - } - return 0; - } - - public static int test_0_except_opt_two_clauses() - { - int size; - size = -1; - uint ui = (uint)size; - try - { - checked - { - uint v = ui * (uint)4; - } - } - catch (OverflowException e) - { - return 0; - } - catch (Exception) - { - return 1; - } - - return 2; - } - - class Child - { - public virtual long Method() - { - throw new Exception(); - } - } - - /* #612206 */ - public static int test_100_long_vars_in_clauses_initlocals_opt() - { - Child c = new Child(); - long value = 100; - try - { - value = c.Method(); - } - catch { } - return (int)value; - } - - class A - { - public object AnObj; - } - - public static void DoSomething(ref object o) - { - } - - public static int test_0_ldflda_null() - { - A a = null; - - try - { - DoSomething(ref a.AnObj); - } - catch (NullReferenceException) - { - return 0; - } - - return 1; - } - - unsafe struct ExceptionsFoo - { - public int i; - - public static ExceptionsFoo* pFoo; - } - - /* MS.NET doesn't seem to throw in this case */ - public unsafe static int test_0_ldflda_null_pointer() - { - int* pi = &ExceptionsFoo.pFoo->i; - - return 0; - } -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/gc-test.cs b/Users/Orvid/IL2CPU Tester/CsTests/gc-test.cs deleted file mode 100644 index c64b04e01c..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/gc-test.cs +++ /dev/null @@ -1,610 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Collections; - -/* - * Regression tests for the GC support in the JIT - */ - -public partial class Tests -{ - - - public static int test_36_simple() - { - // Overflow the registers - object o1 = (1); - object o2 = (2); - object o3 = (3); - object o4 = (4); - object o5 = (5); - object o6 = (6); - object o7 = (7); - object o8 = (8); - - /* Prevent the variables from being local to a bb */ - bool b = o1 != null; - GC.Collect(0); - - if (b) - return (int)o1 + (int)o2 + (int)o3 + (int)o4 + (int)o5 + (int)o6 + (int)o7 + (int)o8; - else - return 0; - } - - public static int test_36_liveness() - { - object o = 5; - object o1, o2, o3, o4, o5, o6, o7, o8; - - bool b = o != null; - - GC.Collect(1); - - o1 = (1); - o2 = (2); - o3 = (3); - o4 = (4); - o5 = (5); - o6 = (6); - o7 = (7); - o8 = (8); - - if (b) - return (int)o1 + (int)o2 + (int)o3 + (int)o4 + (int)o5 + (int)o6 + (int)o7 + (int)o8; - else - return 0; - } - - struct GcFooStruct - { - public object o1; - public int i; - public object o2; - - public GcFooStruct(int i1, int i, int i2) - { - this.o1 = i1; - this.i = i; - this.o2 = i2; - } - } - - public static int test_4_vtype() - { - GcFooStruct s = new GcFooStruct(1, 2, 3); - - GC.Collect(1); - - return (int)s.o1 + (int)s.o2; - } - - class BigClass - { - public object o1, o2, o3, o4, o5, o6, o7, o8, o9, o10; - public object o11, o12, o13, o14, o15, o16, o17, o18, o19, o20; - public object o21, o22, o23, o24, o25, o26, o27, o28, o29, o30; - public object o31, o32; - } - - static void set_fields(BigClass b) - { - b.o31 = 31; - b.o32 = 32; - - b.o1 = 1; - b.o2 = 2; - b.o3 = 3; - b.o4 = 4; - b.o5 = 5; - b.o6 = 6; - b.o7 = 7; - b.o8 = 8; - b.o9 = 9; - b.o10 = 10; - b.o11 = 11; - b.o12 = 12; - b.o13 = 13; - b.o14 = 14; - b.o15 = 15; - b.o16 = 16; - b.o17 = 17; - b.o18 = 18; - b.o19 = 19; - b.o20 = 20; - b.o21 = 21; - b.o22 = 22; - b.o23 = 23; - b.o24 = 24; - b.o25 = 25; - b.o26 = 26; - b.o27 = 27; - b.o28 = 28; - b.o29 = 29; - b.o30 = 30; - } - - // Test marking of objects with > 32 fields - public static int test_528_mark_runlength_large() - { - BigClass b = new BigClass(); - - /* - * Do the initialization in a separate method so no object refs remain in - * spill slots. - */ - set_fields(b); - - GC.Collect(1); - - return - (int)b.o1 + (int)b.o2 + (int)b.o3 + (int)b.o4 + (int)b.o5 + - (int)b.o6 + (int)b.o7 + (int)b.o8 + (int)b.o9 + (int)b.o10 + - (int)b.o11 + (int)b.o12 + (int)b.o13 + (int)b.o14 + (int)b.o15 + - (int)b.o16 + (int)b.o17 + (int)b.o18 + (int)b.o19 + (int)b.o20 + - (int)b.o21 + (int)b.o22 + (int)b.o23 + (int)b.o24 + (int)b.o25 + - (int)b.o26 + (int)b.o27 + (int)b.o28 + (int)b.o29 + (int)b.o30 + - (int)b.o31 + (int)b.o32; - } - - /* - * Test liveness and loops. - */ - public static int test_0_liveness_2() - { - object o = new object(); - for (int n = 0; n < 10; ++n) - { - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - - if (o != null) - o.ToString(); - - GC.Collect(1); - - if (o != null) - o.ToString(); - - sum += i + j + k; - - GC.Collect(1); - } - - return 0; - } - - /* - * Test liveness and stack slot sharing - * This doesn't work yet, its hard to make the JIT share the stack slots of the - * two 'o' variables. - */ - public static int test_0_liveness_3() - { - bool b = false; - bool b2 = true; - - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - if (b) - { - object o = new object(); - - /* Make sure o is global */ - if (b2) - Console.WriteLine(); - - o.ToString(); - } - - GC.Collect(1); - - if (b) - { - object o = new object(); - - /* Make sure o is global */ - if (b2) - Console.WriteLine(); - - o.ToString(); - } - - sum += i + j + k + l + m + n + s; - - return 0; - } - - /* - * Test liveness of variables used to handle items on the IL stack. - */ - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static string call1() - { - return "A"; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static string call2() - { - GC.Collect(1); - return "A"; - } - - public static int test_0_liveness_4() - { - bool b = false; - bool b2 = true; - - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - string o = b ? call1() : call2(); - - GC.Collect(1); - - sum += i + j + k + l + m + n + s; - - return 0; - } - - - /* - * Test liveness of volatile variables - */ - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static void liveness_5_1(out object o) - { - o = new object(); - } - - public static int test_0_liveness_5() - { - bool b = false; - bool b2 = true; - - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - object o; - - liveness_5_1(out o); - - for (int x = 0; x < 10; ++x) - { - - o.ToString(); - - GC.Collect(1); - } - - sum += i + j + k + l + m + n + s; - - return 0; - } - - /* - * Test the case when a stack slot becomes dead, then live again due to a backward - * branch. - */ - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static object alloc_obj() - { - return new object(); - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static bool return_true() - { - return true; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static bool return_false() - { - return false; - } - - public static int test_0_liveness_6() - { - bool b = false; - bool b2 = true; - - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - for (int x = 0; x < 10; ++x) - { - - GC.Collect(1); - - object o = alloc_obj(); - - o.ToString(); - - GC.Collect(1); - } - - sum += i + j + k + l + m + n + s; - - return 0; - } - - public static int test_0_multi_dim_ref_array_wbarrier() - { - string[,] arr = new string[256, 256]; - for (int i = 0; i < 256; ++i) - { - for (int j = 0; j < 100; ++j) - arr[i, j] = "" + i + " " + j; - } - GC.Collect(); - - return 0; - } - - /* - * Liveness + out of line bblocks - */ - public static int test_0_liveness_7() - { - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - // o is dead here - GC.Collect(1); - - if (return_false()) - { - // This bblock is in-line - object o = alloc_obj(); - // o is live here - if (return_false()) - { - // This bblock is out-of-line, and o is live here - throw new Exception(o.ToString()); - } - } - - // o is dead here too - GC.Collect(1); - - return 0; - } - - // Liveness + finally clauses - public static int test_0_liveness_8() - { - /* Exhaust all registers so 'o' is stack allocated */ - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - - object o = null; - try - { - o = alloc_obj(); - } - finally - { - GC.Collect(1); - } - - o.GetHashCode(); - return 0; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static object alloc_string() - { - return "A"; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static object alloc_obj_and_gc() - { - GC.Collect(1); - return new object(); - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static void clobber_regs_and_gc() - { - int sum = 0, i, j, k, l, m, n, s; - for (i = 0; i < 100; ++i) - sum++; - for (j = 0; j < 100; ++j) - sum++; - for (k = 0; k < 100; ++k) - sum++; - for (l = 0; l < 100; ++l) - sum++; - for (m = 0; m < 100; ++m) - sum++; - for (n = 0; n < 100; ++n) - sum++; - for (s = 0; s < 100; ++s) - sum++; - GC.Collect(1); - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static void liveness_9_call1(object o1, object o2, object o3) - { - o1.GetHashCode(); - o2.GetHashCode(); - o3.GetHashCode(); - } - - // Liveness + JIT temporaries - public static int test_0_liveness_9() - { - // the result of alloc_obj () goes into a vreg, which gets converted to a - // JIT temporary because of the branching introduced by the cast - // FIXME: This doesn't crash if MONO_TYPE_I is not treated as a GC ref - liveness_9_call1(alloc_obj(), (string)alloc_string(), alloc_obj_and_gc()); - return 0; - } - - // Liveness for registers - public static int test_0_liveness_10() - { - // Make sure this goes into a register - object o = alloc_obj(); - o.GetHashCode(); - o.GetHashCode(); - o.GetHashCode(); - o.GetHashCode(); - o.GetHashCode(); - o.GetHashCode(); - // Break the bblock so o doesn't become a local vreg - if (return_true()) - // Clobber it with a call and run a GC - clobber_regs_and_gc(); - // Access it again - o.GetHashCode(); - return 0; - } - - // Liveness for spill slots holding managed pointers - public static int test_0_liveness_11() - { - Tests[] arr = new Tests[10]; - // This uses an ldelema internally - // FIXME: This doesn't crash if mp-s are not correctly tracked, just writes to - // an old object. - arr[0] >>= 1; - - return 0; - } - - public static Tests operator >>(Tests bi1, int shiftVal) - { - clobber_regs_and_gc(); - return bi1; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - public static void liveness_12_inner(int a, int b, int c, int d, int e, int f, object o) - { - GC.Collect(1); - o.GetHashCode(); - } - - // Liveness for param area - public static int test_0_liveness_12() - { - // The ref argument should be passed on the stack - liveness_12_inner(1, 2, 3, 4, 5, 6, new object()); - return 0; - } - - public static void liveness_13_inner(ref ArrayList arr) - { - // The value of arr will be stored in a spill slot - arr.Add(alloc_obj_and_gc()); - } - - // Liveness for byref arguments in spill slots - public static int test_0_liveness_13() - { - var arr = new ArrayList(); - liveness_13_inner(ref arr); - return 0; - } -} \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/CsTests/generics.cs b/Users/Orvid/IL2CPU Tester/CsTests/generics.cs deleted file mode 100644 index a5cff1d228..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/generics.cs +++ /dev/null @@ -1,943 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; - -public partial class Tests -{ - - struct TestStruct - { - public int i; - public int j; - - public TestStruct(int i, int j) - { - this.i = i; - this.j = j; - } - } - - public static int test_1_nullable_unbox() - { - return Unbox(1).Value; - } - - public static int test_1_nullable_unbox_null() - { - return Unbox(null).HasValue ? 0 : 1; - } - - public static int test_1_nullable_box() - { - return (int)Box(1); - } - - public static int test_1_nullable_box_null() - { - return Box(null) == null ? 1 : 0; - } - - public static int test_1_isinst_nullable() - { - object o = 1; - return (o is int?) ? 1 : 0; - } - - public static int test_1_nullable_unbox_vtype() - { - return Unbox(new TestStruct(1, 2)).Value.i; - } - - public static int test_1_nullable_unbox_null_vtype() - { - return Unbox(null).HasValue ? 0 : 1; - } - - public static int test_1_nullable_box_vtype() - { - return ((TestStruct)(Box(new TestStruct(1, 2)))).i; - } - - public static int test_1_nullable_box_null_vtype() - { - return Box(null) == null ? 1 : 0; - } - - public static int test_1_isinst_nullable_vtype() - { - object o = new TestStruct(1, 2); - return (o is TestStruct?) ? 1 : 0; - } - - public static int test_0_nullable_normal_unbox() - { - int? i = 5; - - object o = i; - // This uses unbox instead of unbox_any - int? j = (int?)o; - - if (j != 5) - return 1; - - return 0; - } - - public static void stelem_any(T[] arr, T elem) - { - arr[0] = elem; - } - - public static T ldelem_any(T[] arr) - { - return arr[0]; - } - - public static int test_1_ldelem_stelem_any_int() - { - int[] arr = new int[3]; - stelem_any(arr, 1); - - return ldelem_any(arr); - } - - public static T return_ref(ref T t) - { - return t; - } - - public static T ldelema_any(T[] arr) - { - return return_ref(ref arr[0]); - } - - public static int test_0_ldelema() - { - string[] arr = new string[1]; - - arr[0] = "Hello"; - - if (ldelema_any(arr) == "Hello") - return 0; - else - return 1; - } - - public static T[,] newarr_multi() - { - return new T[1, 1]; - } - - public static int test_0_newarr_multi_dim() - { - return newarr_multi().GetType() == typeof(string[,]) ? 0 : 1; - } - - interface ITest - { - void Foo(); - } - - public static int test_0_iface_call_null_bug_77442() - { - ITest test = null; - - try - { - test.Foo(); - } - catch (NullReferenceException) - { - return 0; - } - - return 1; - } - - public static int test_18_ldobj_stobj_generics() - { - GenericClass t = new GenericClass(); - int i = 5; - int j = 6; - return t.ldobj_stobj(ref i, ref j) + i + j; - } - - public static int test_5_ldelem_stelem_generics() - { - GenericClass t = new GenericClass(); - - TestStruct s = new TestStruct(5, 5); - return t.ldelem_stelem(s).i; - } - - public static int test_0_constrained_vtype_box() - { - GenericClass t = new GenericClass(); - - return t.toString(new TestStruct()) == "Tests+TestStruct" ? 0 : 1; - } - - public static int test_0_constrained_vtype() - { - GenericClass t = new GenericClass(); - - return t.toString(1234) == "1234" ? 0 : 1; - } - - public static int test_0_constrained_reftype() - { - GenericClass t = new GenericClass(); - - return t.toString("1234") == "1234" ? 0 : 1; - } - - public static int test_0_box_brtrue_optimizations() - { - if (IsNull(5)) - return 1; - - if (!IsNull(null)) - return 1; - - return 0; - } - - public static int test_0_generic_get_value_optimization_int() - { - int[] x = new int[] { 100, 200 }; - - if (GenericClass.Z(x, 0) != 100) - return 2; - - if (GenericClass.Z(x, 1) != 200) - return 3; - - return 0; - } - - public static int test_0_generic_get_value_optimization_vtype() - { - TestStruct[] arr = new TestStruct[] { new TestStruct(100, 200), new TestStruct(300, 400) }; - IEnumerator enumerator = GenericClass.Y(arr); - TestStruct s; - int sum = 0; - while (enumerator.MoveNext()) - { - s = enumerator.Current; - sum += s.i + s.j; - } - - if (sum != 1000) - return 1; - - s = GenericClass.Z(arr, 0); - if (s.i != 100 || s.j != 200) - return 2; - - s = GenericClass.Z(arr, 1); - if (s.i != 300 || s.j != 400) - return 3; - - return 0; - } - - public static int test_0_nullable_ldflda() - { - return GenericClass.BIsAClazz == false ? 0 : 1; - } - - public struct GenericStruct - { - public T t; - - public GenericStruct(T t) - { - this.t = t; - } - } - - public class GenericClass - { - public T t; - - public GenericClass(T t) - { - this.t = t; - } - - public GenericClass() - { - } - - public T ldobj_stobj(ref T t1, ref T t2) - { - t1 = t2; - T t = t1; - - return t; - } - - public T ldelem_stelem(T t) - { - T[] arr = new T[10]; - arr[0] = t; - - return arr[0]; - } - - public String toString(T t) - { - return t.ToString(); - } - - public static IEnumerator Y(IEnumerable x) - { - return x.GetEnumerator(); - } - - public static T Z(IList x, int index) - { - return x[index]; - } - - protected static T NullB = default(T); - private static Nullable _BIsA = null; - public static bool BIsAClazz - { - get - { - _BIsA = false; - return _BIsA.Value; - } - } - } - - public class MRO : MarshalByRefObject - { - public GenericStruct struct_field; - public GenericClass class_field; - } - - public static int test_0_ldfld_stfld_mro() - { - MRO m = new MRO(); - GenericStruct s = new GenericStruct(5); - // This generates stfld - m.struct_field = s; - - // This generates ldflda - if (m.struct_field.t != 5) - return 1; - - // This generates ldfld - GenericStruct s2 = m.struct_field; - if (s2.t != 5) - return 2; - - if (m.struct_field.t != 5) - return 3; - - m.class_field = new GenericClass(5); - if (m.class_field.t != 5) - return 4; - - return 0; - } - - // FIXME: - public static int test_0_generic_virtual_call_on_vtype_unbox() - { - object o = new Object(); - IFoo h = new Handler(o); - - if (h.Bar() != o) - return 1; - else - return 0; - } - - public static int test_0_box_brtrue_opt() - { - Foo f = new Foo(5); - - f[123] = 5; - - return 0; - } - - public static int test_0_box_brtrue_opt_regress_81102() - { - if (new Foo(5).ToString() == "null") - return 0; - else - return 1; - } - - struct GenericsS - { - public int i; - } - - public static int test_0_ldloca_initobj_opt() - { - if (new Foo(new GenericsS()).get_default().i != 0) - return 1; - if (new Foo(null).get_default() != null) - return 2; - return 0; - } - - - public static int test_0_ldvirtftn_generic_method() - { - new Tests().ldvirtftn(); - - return the_type == typeof(string) ? 0 : 1; - } - - public static int test_0_throw_dead_this() - { - new Foo("").throw_dead_this(); - return 0; - } - - struct GenericsS { } - - public static int test_0_inline_infinite_polymorphic_recursion() - { - f(0); - - return 0; - } - - private static void f(int i) - { - if (i == 42) f>(i); - } - - // This cannot be made to work with full-aot, since there it is impossible to - // statically determine that Foo.Bar is needed, the code only - // references IFoo.Bar - public static int test_0_generic_virtual_on_interfaces() - { - Foo.count1 = 0; - Foo.count2 = 0; - Foo.count3 = 0; - - IFoo f = new Foo(""); - for (int i = 0; i < 1000; ++i) - { - f.Bar(); - f.Bar(); - f.NonGeneric(); - } - - if (Foo.count1 != 1000) - return 1; - if (Foo.count2 != 1000) - return 2; - if (Foo.count3 != 1000) - return 3; - - VirtualInterfaceCallFromGenericMethod(f); - - return 0; - } - - public static int test_0_generic_virtual_on_interfaces_ref() - { - Foo.count1 = 0; - Foo.count2 = 0; - Foo.count3 = 0; - Foo.count4 = 0; - - IFoo f = new Foo(""); - for (int i = 0; i < 1000; ++i) - { - f.Bar(); - f.Bar(); - f.NonGeneric(); - } - - if (Foo.count2 != 1000) - return 2; - if (Foo.count3 != 1000) - return 3; - if (Foo.count4 != 1000) - return 4; - - return 0; - } - - //repro for #505375 - public static int test_2_cprop_bug() - { - int idx = 0; - int a = 1; - var cmp = System.Collections.Generic.Comparer.Default; - if (cmp.Compare(a, 0) > 0) - a = 0; - do { idx++; } while (cmp.Compare(idx - 1, a) == 0); - return idx; - } - - enum MyEnumUlong : ulong - { - Value_2 = 2 - } - - public static int test_0_regress_550964_constrained_enum_long() - { - MyEnumUlong a = MyEnumUlong.Value_2; - MyEnumUlong b = MyEnumUlong.Value_2; - - return Pan(a, b) ? 0 : 1; - } - - static bool Pan(T a, T b) - { - return a.Equals(b); - } - - public class XElement - { - public string Value - { - get; - set; - } - } - - public static int test_0_fullaot_linq() - { - var allWords = new XElement[] { new XElement { Value = "one" } }; - var filteredWords = allWords.Where(kw => kw.Value.StartsWith("T")); - return filteredWords.Count(); - } - - public static int test_0_fullaot_comparer_t() - { - var l = new SortedList(); - return l.Count; - } - - public static int test_0_fullaot_comparer_t_2() - { - var l = new Dictionary(); - return l.Count; - } - - static void enumerate(IEnumerable arr) - { - foreach (var o in arr) - ; - int c = ((ICollection)arr).Count; - } - - /* Test that treating arrays as generic collections works with full-aot */ - public static int test_0_fullaot_array_wrappers() - { - Tests[] arr = new Tests[10]; - enumerate(arr); - return 0; - } - - static int cctor_count = 0; - - public abstract class Beta - { - static Beta() - { - cctor_count++; - } - } - - public class Gamma : Beta - { - static Gamma() - { - } - } - - // #519336 - public static int test_2_generic_class_init_gshared_ctor() - { - new Gamma(); - new Gamma(); - - return cctor_count; - } - - static int cctor_count2 = 0; - - class ServiceController - { - static ServiceController() - { - cctor_count2++; - } - - public ServiceController() - { - } - } - - static ServiceController Create() - { - return new ServiceController(); - } - - // #631409 - public static int test_2_generic_class_init_gshared_ctor_from_gshared() - { - Create(); - Create(); - - return cctor_count2; - } - - public static Type get_type() - { - return typeof(T); - } - - public static int test_0_gshared_delegate_rgctx() - { - Func t = new Func(get_type); - - if (t() == typeof(string)) - return 0; - else - return 1; - } - - // Creating a delegate from a generic method from gshared code - public static int test_0_gshared_delegate_from_gshared() - { - if (gshared_delegate_from_gshared() != 0) - return 1; - if (gshared_delegate_from_gshared() != 0) - return 2; - return 0; - } - - public static int gshared_delegate_from_gshared() - { - Func t = new Func(get_type); - - return t() == typeof(T) ? 0 : 1; - } - - public static int test_0_marshalbyref_call_from_gshared_virt_elim() - { - /* Calling a virtual method from gshared code which is changed to a nonvirt call */ - Class1 o = new Class1(); - o.Do(new Class2()); - return 0; - } - - class Pair - { - public static KeyValuePair make_pair(TKey key, TValue value) - { - return new KeyValuePair(key, value); - } - - public delegate TRet Transform(TKey key, TValue value); - } - - public static int test_0_bug_620864() - { - var d = new Pair.Transform>(Pair.make_pair); - - var p = d("FOO", typeof(int)); - if (p.Key != "FOO" || p.Value != typeof(int)) - return 1; - - return 0; - } - - - struct RecStruct - { - public void foo(RecStruct> baz) - { - } - } - - public static int test_0_infinite_generic_recursion() - { - // Check that the AOT compile can deal with infinite generic recursion through - // parameter types - RecStruct bla; - - return 0; - } - - struct GenericsFooStruct - { - } - - bool IsNull2(object value) where T : struct - { - T? item = (T?)value; - - if (item.HasValue) - return false; - - return true; - } - - public static int test_0_full_aot_nullable_unbox_from_gshared_code() - { - if (!new Tests().IsNull2(null)) - return 1; - if (new Tests().IsNull2(new GenericsFooStruct())) - return 2; - return 0; - } - - public static int test_0_partial_sharing() - { - if (PartialShared1(new List(), 1) != typeof(string)) - return 1; - if (PartialShared1(new List(), 1) != typeof(Tests)) - return 2; - if (PartialShared2(new List(), 1) != typeof(int)) - return 3; - if (PartialShared2(new List(), 1) != typeof(int)) - return 4; - return 0; - } - - public static int test_6_partial_sharing_linq() - { - var messages = new List(); - - messages.Add(new Message() { MessageID = 5 }); - messages.Add(new Message() { MessageID = 6 }); - - return messages.Max(i => i.MessageID); - } - - public static int test_0_partial_shared_method_in_nonshared_class() - { - var c = new Class1(); - return (c.Foo(5).GetType() == typeof(Class1)) ? 0 : 1; - } - - class Message - { - public int MessageID - { - get; - set; - } - } - - public static Type PartialShared1(List list, K k) - { - return typeof(T); - } - - public static Type PartialShared2(List list, K k) - { - return typeof(K); - } - - public class Class1 - { - public virtual void Do(Class2 t) - { - t.Foo(); - } - - public virtual object Foo(T t) - { - return new Class1(); - } - } - - public interface IFace1 - { - void Foo(); - } - - public class Class2 : MarshalByRefObject, IFace1 - { - public void Foo() - { - } - } - - - - public static void VirtualInterfaceCallFromGenericMethod(IFoo f) - { - f.Bar(); - } - - public static Type the_type; - - public void ldvirtftn() - { - Foo binding = new Foo(default(T)); - - binding.GenericEvent += event_handler; - binding.fire(); - } - - public virtual void event_handler(Foo sender) - { - the_type = typeof(T); - } - - public interface IFoo - { - void NonGeneric(); - object Bar(); - } - - public class Foo : IFoo - { - public Foo(T1 t1) - { - m_t1 = t1; - } - - public override string ToString() - { - return Bar(m_t1 == null ? "null" : "null"); - } - - public String Bar(String s) - { - return s; - } - - public int this[T1 key] - { - set - { - if (key == null) - throw new ArgumentNullException("key"); - } - } - - public void throw_dead_this() - { - try - { - new SomeClass().ThrowAnException(); - } - catch - { - } - } - - public T1 get_default() - { - return default(T1); - } - - readonly T1 m_t1; - - public delegate void GenericEventHandler(Foo sender); - - public event GenericEventHandler GenericEvent; - - public void fire() - { - GenericEvent(this); - } - - public static int count1, count2, count3, count4; - - public void NonGeneric() - { - count3++; - } - - public object Bar() - { - if (typeof(T) == typeof(int)) - count1++; - else if (typeof(T) == typeof(string)) - count2++; - else if (typeof(T) == typeof(object)) - count4++; - return null; - } - } - - public class SomeClass - { - public void ThrowAnException() - { - throw new Exception("Something went wrong"); - } - } - - struct Handler : IFoo - { - object o; - - public Handler(object o) - { - this.o = o; - } - - public void NonGeneric() - { - } - - public object Bar() - { - return o; - } - } - - static bool IsNull(T t) - { - if (t == null) - return true; - else - return false; - } - - static object Box(T t) - { - return t; - } - - static T Unbox(object o) - { - return (T)o; - } - - interface IDefaultRetriever - { - T GetDefault(); - } - - class DefaultRetriever : IDefaultRetriever - { - [MethodImpl(MethodImplOptions.Synchronized)] - public T GetDefault() - { - return default(T); - } - } - - public static int test_0_regress_668095_synchronized_gshared() - { - return DoSomething(new DefaultRetriever()); - } - - static int DoSomething(IDefaultRetriever foo) - { - int result = foo.GetDefault(); - return result; - } -} diff --git a/Users/Orvid/IL2CPU Tester/CsTests/objects.cs b/Users/Orvid/IL2CPU Tester/CsTests/objects.cs deleted file mode 100644 index 4df2988d51..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/objects.cs +++ /dev/null @@ -1,1724 +0,0 @@ -using System; -using System.Text; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.CompilerServices; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -internal struct Simple -{ - public int a; - public byte b; - public short c; - public long d; -} - -struct Small -{ - public byte b1; - public byte b2; -} - -// Size=2, Align=1 -struct Foo -{ - bool b1; - bool b2; -} - -struct Large -{ - int one; - int two; - long three; - long four; - int five; - long six; - int seven; - long eight; - long nine; - long ten; - - public void populate() - { - one = 1; two = 2; - three = 3; four = 4; - five = 5; six = 6; - seven = 7; eight = 8; - nine = 9; ten = 10; - } - public bool check() - { - return one == 1 && two == 2 && - three == 3 && four == 4 && - five == 5 && six == 6 && - seven == 7 && eight == 8 && - nine == 9 && ten == 10; - } -} - -class Sample -{ - public int a; - public Sample(int v) - { - a = v; - } -} - -[StructLayout(LayoutKind.Explicit)] -struct StructWithBigOffsets -{ - [FieldOffset(10000)] - public byte b; - [FieldOffset(10001)] - public sbyte sb; - [FieldOffset(11000)] - public short s; - [FieldOffset(11002)] - public ushort us; - [FieldOffset(12000)] - public uint i; - [FieldOffset(12004)] - public int si; - [FieldOffset(13000)] - public long l; - [FieldOffset(14000)] - public float f; - [FieldOffset(15000)] - public double d; -} - -enum SampleEnum -{ - A, - B, - C -} - -struct Alpha -{ - public long a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v; -} - -struct Beta -{ - public Alpha a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v; -} - -struct Gamma -{ - public Beta a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v; -} - -public partial class Tests -{ - - - public static int test_0_return_Objects() - { - Simple s; - s.a = 1; - s.b = 2; - s.c = (short)(s.a + s.b); - s.d = 4; - return s.a - 1; - } - - public static int test_0_string_access() - { - string s = "Hello"; - if (s[1] != 'e') - return 1; - return 0; - } - - public static int test_0_string_virtual_call() - { - string s = "Hello"; - string s2 = s.ToString(); - if (s2[1] != 'e') - return 1; - return 0; - } - - public static int test_0_iface_call() - { - string s = "Hello"; - object o = ((ICloneable)s).Clone(); - return 0; - } - - public static int test_5_newobj() - { - Sample s = new Sample(5); - return s.a; - } - - public static int test_4_box() - { - object obj = 4; - return (int)obj; - } - - public static int test_0_enum_unbox() - { - SampleEnum x = SampleEnum.A; - object o = x; - - int res = 1; - - res = (int)o; - - return res; - } - - static Simple get_simple(int v) - { - Simple r = new Simple(); - r.a = v; - r.b = (byte)(v + 1); - r.c = (short)(v + 2); - r.d = v + 3; - - return r; - } - - public static int test_3_return_struct() - { - Simple v = get_simple(1); - - if (v.a != 1) - return 0; - if (v.b != 2) - return 0; - if (v.c != 3) - return 0; - if (v.d != 4) - return 0; - return 3; - } - - internal virtual Simple v_get_simple(int v) - { - return get_simple(v); - } - - public static int test_2_return_struct_virtual() - { - Tests t = new Tests(); - Simple v = t.v_get_simple(2); - - if (v.a != 2) - return 0; - if (v.b != 3) - return 0; - if (v.c != 4) - return 0; - if (v.d != 5) - return 0; - return 2; - } - - static int receive_simple(int a, Simple v, int b) - { - if (v.a != 1) - return 1; - if (v.b != 2) - return 2; - if (v.c != 3) - return 3; - if (v.d != 4) - return 4; - if (a != 7) - return 5; - if (b != 9) - return 6; - return 0; - } - - public static int test_5_pass_struct() - { - Simple v = get_simple(1); - if (receive_simple(7, v, 9) != 0) - return 0; - if (receive_simple(7, get_simple(1), 9) != 0) - return 1; - return 5; - } - - static Simple s_v; - public static int test_5_pass_static_struct() - { - s_v = get_simple(1); - if (receive_simple(7, s_v, 9) != 0) - return 0; - return 5; - } - - // Test alignment of small structs - - static Small get_small(byte v) - { - Small r = new Small(); - - r.b1 = v; - r.b2 = (byte)(v + 1); - - return r; - } - - static Small return_small(Small s) - { - return s; - } - - static int receive_small(int a, Small v, int b) - { - if (v.b1 != 1) - return 1; - if (v.b2 != 2) - return 2; - return 0; - } - - static int receive_small_sparc_many_args(int a, int a2, int a3, int a4, int a5, int a6, Small v, int b) - { - if (v.b1 != 1) - return 1; - if (v.b2 != 2) - return 2; - return 0; - } - - public static int test_5_pass_small_struct() - { - Small v = get_small(1); - if (receive_small(7, v, 9) != 0) - return 0; - if (receive_small(7, get_small(1), 9) != 0) - return 1; - if (receive_small_sparc_many_args(1, 2, 3, 4, 5, 6, v, 9) != 0) - return 2; - v = return_small(v); - if (v.b1 != 1) - return 3; - if (v.b2 != 2) - return 4; - return 5; - } - - // 64-bits, 32-bit aligned - struct struct1 - { - public int a; - public int b; - }; - - static int check_struct1(struct1 x) - { - if (x.a != 1) - return 1; - if (x.b != 2) - return 2; - return 0; - } - - static int pass_struct1(int a, int b, struct1 x) - { - if (a != 3) - return 3; - if (b != 4) - return 4; - return check_struct1(x); - } - - static int pass_struct1(int a, struct1 x) - { - if (a != 3) - return 3; - return check_struct1(x); - } - - static int pass_struct1(struct1 x) - { - return check_struct1(x); - } - - public static int test_0_struct1_args() - { - int r; - struct1 x; - - x.a = 1; - x.b = 2; - if ((r = check_struct1(x)) != 0) - return r; - if ((r = pass_struct1(x)) != 0) - return r + 10; - if ((r = pass_struct1(3, x)) != 0) - return r + 20; - if ((r = pass_struct1(3, 4, x)) != 0) - return r + 30; - return 0; - } - - // 64-bits, 64-bit aligned - struct struct2 - { - public long a; - }; - - static int check_struct2(struct2 x) - { - if (x.a != 1) - return 1; - return 0; - } - - static int pass_struct2(int a, int b, int c, struct2 x) - { - if (a != 3) - return 3; - if (b != 4) - return 4; - if (c != 5) - return 5; - return check_struct2(x); - } - - static int pass_struct2(int a, int b, struct2 x) - { - if (a != 3) - return 3; - if (b != 4) - return 4; - return check_struct2(x); - } - - static int pass_struct2(int a, struct2 x) - { - if (a != 3) - return 3; - return check_struct2(x); - } - - static int pass_struct2(struct2 x) - { - return check_struct2(x); - } - - public static int test_0_struct2_args() - { - int r; - struct2 x; - - x.a = 1; - if ((r = check_struct2(x)) != 0) - return r; - if ((r = pass_struct2(x)) != 0) - return r + 10; - if ((r = pass_struct2(3, x)) != 0) - return r + 20; - if ((r = pass_struct2(3, 4, x)) != 0) - return r + 30; - if ((r = pass_struct2(3, 4, 5, x)) != 0) - return r + 40; - return 0; - } - - // 128 bits - struct Struct3 - { - public long i, j, k, l; - } - - static int pass_struct3(int i, int j, int k, int l, int m, int n, int o, int p, Struct3 s, int q) - { - if (s.i + s.j + s.k + s.l != 10) - return 1; - else - return 0; - } - - public static int test_0_struct3_args() - { - Struct3 s = new Struct3(); - s.i = 1; - s.j = 2; - s.k = 3; - s.l = 4; - - return pass_struct3(1, 2, 3, 4, 5, 6, 7, 8, s, 9); - } - - // Struct with unaligned size on 64 bit machines - struct Struct4 - { - public int i, j, k, l, m; - public int i1, i2, i3, i4, i5, i6; - } - - static int pass_struct4(Struct4 s) - { - if (s.i + s.j + s.k + s.l + s.m != 15) - return 1; - else - return 0; - } - - public static int test_0_struct4_args() - { - Struct4 s = new Struct4(); - s.i = 1; - s.j = 2; - s.k = 3; - s.l = 4; - s.m = 5; - - return pass_struct4(s); - } - - - - struct AStruct - { - public int i; - - public AStruct(int i) - { - this.i = i; - } - - public override int GetHashCode() - { - return i; - } - } - - // Test that vtypes are unboxed during a virtual call - public static int test_44_unbox_trampoline() - { - AStruct s = new AStruct(44); - object o = s; - return o.GetHashCode(); - } - - public static int test_0_unbox_trampoline2() - { - int i = 12; - object o = i; - - if (i.ToString() != "12") - return 1; - if (((Int32)o).ToString() != "12") - return 2; - if (o.ToString() != "12") - return 3; - return 0; - } - - // Test fields with big offsets - public static int test_0_fields_with_big_offsets() - { - StructWithBigOffsets s = new StructWithBigOffsets(); - StructWithBigOffsets s2 = new StructWithBigOffsets(); - - s.b = 0xde; - s.sb = 0xe; - s.s = 0x12de; - s.us = 0x12da; - s.i = 0xdeadbeef; - s.si = 0xcafe; - s.l = 0xcafebabe; - s.f = 3.14F; - s.d = 3.14; - - s2.b = s.b; - s2.sb = s.sb; - s2.s = s.s; - s2.us = s.us; - s2.i = s.i; - s2.si = s.si; - s2.l = s.l; - s2.f = s.f; - s2.d = s.d; - - if (s2.b != 0xde) - return 1; - if (s2.s != 0x12de) - return 2; - if (s2.i != 0xdeadbeef) - return 3; - if (s2.l != 0xcafebabe) - return 4; - if (s2.f != 3.14F) - return 5; - if (s2.d != 3.14) - return 6; - if (s2.sb != 0xe) - return 7; - if (s2.us != 0x12da) - return 9; - if (s2.si != 0xcafe) - return 10; - - return 0; - } - - class TestRegA - { - - long buf_start; - int buf_length, buf_offset; - - public TestRegA() - { - buf_start = 0; - buf_length = 0; - buf_offset = 0; - } - - public long Seek(long position) - { - long pos = position; - /* interaction between the register allocator and - * allocating arguments to registers */ - if (pos >= buf_start && pos <= buf_start + buf_length) - { - buf_offset = (int)(pos - buf_start); - return pos; - } - return buf_start; - } - - } - - public static int test_0_seektest() - { - TestRegA t = new TestRegA(); - return (int)t.Seek(0); - } - - class Super : ICloneable - { - public virtual object Clone() - { - return null; - } - } - class Duper : Super - { - } - - public static int test_0_null_cast() - { - object o = null; - - Super s = (Super)o; - - return 0; - } - - public static int test_0_super_cast() - { - Duper d = new Duper(); - Super sup = d; - Object o = d; - - if (!(o is Super)) - return 1; - try - { - d = (Duper)sup; - } - catch - { - return 2; - } - if (!(d is Object)) - return 3; - try - { - d = (Duper)(object)sup; - } - catch - { - return 4; - } - return 0; - } - - public static int test_0_super_cast_array() - { - Duper[] d = new Duper[0]; - Super[] sup = d; - Object[] o = d; - - if (!(o is Super[])) - return 1; - try - { - d = (Duper[])sup; - } - catch - { - return 2; - } - if (!(d is Object[])) - return 3; - try - { - d = (Duper[])(object[])sup; - } - catch - { - return 4; - } - return 0; - } - - public static int test_0_multi_array_cast() - { - Duper[,] d = new Duper[1, 1]; - object[,] o = d; - - try - { - o[0, 0] = new Super(); - return 1; - } - catch (ArrayTypeMismatchException) - { - } - - return 0; - } - - public static int test_0_vector_array_cast() - { - Array arr1 = Array.CreateInstance(typeof(int), new int[] { 1 }, new int[] { 0 }); - Array arr2 = Array.CreateInstance(typeof(int), new int[] { 1 }, new int[] { 10 }); - - if (arr1.GetType() != typeof(int[])) - return 1; - - if (arr2.GetType() == typeof(int[])) - return 2; - - int[] b; - - b = (int[])arr1; - - try - { - b = (int[])arr2; - return 3; - } - catch (InvalidCastException) - { - } - - if (arr2 is int[]) - return 4; - - int[,][] arr3 = new int[1, 1][]; - object o = arr3; - int[,][] arr4 = (int[,][])o; - - return 0; - } - - public static int test_0_enum_array_cast() - { - TypeCode[] tc = new TypeCode[0]; - object[] oa; - ValueType[] vta; - int[] inta; - Array a = tc; - bool ok; - - if (a is object[]) - return 1; - if (a is ValueType[]) - return 2; - if (a is Enum[]) - return 3; - try - { - ok = false; - oa = (object[])a; - } - catch - { - ok = true; - } - if (!ok) - return 4; - try - { - ok = false; - vta = (ValueType[])a; - } - catch - { - ok = true; - } - if (!ok) - return 5; - try - { - ok = true; - inta = (int[])a; - } - catch - { - ok = false; - } - if (!ok) - return 6; - return 0; - } - - public static int test_0_more_cast_corner_cases() - { - ValueType[] vta = new ValueType[0]; - Enum[] ea = new Enum[0]; - Array a = vta; - object[] oa; - bool ok; - - if (!(a is object[])) - return 1; - if (!(a is ValueType[])) - return 2; - if (a is Enum[]) - return 3; - a = ea; - if (!(a is object[])) - return 4; - if (!(a is ValueType[])) - return 5; - if (!(a is Enum[])) - return 6; - - try - { - ok = true; - oa = (object[])a; - } - catch - { - ok = false; - } - if (!ok) - return 7; - - try - { - ok = true; - oa = (Enum[])a; - } - catch - { - ok = false; - } - if (!ok) - return 8; - - try - { - ok = true; - oa = (ValueType[])a; - } - catch - { - ok = false; - } - if (!ok) - return 9; - - a = vta; - try - { - ok = true; - oa = (object[])a; - } - catch - { - ok = false; - } - if (!ok) - return 10; - - try - { - ok = true; - oa = (ValueType[])a; - } - catch - { - ok = false; - } - if (!ok) - return 11; - - try - { - ok = false; - vta = (Enum[])a; - } - catch - { - ok = true; - } - if (!ok) - return 12; - return 0; - } - - public static int test_0_cast_iface_array() - { - object o = new ICloneable[0]; - object o2 = new Duper[0]; - object t; - bool ok; - - if (!(o is object[])) - return 1; - if (!(o2 is ICloneable[])) - return 2; - - try - { - ok = true; - t = (object[])o; - } - catch - { - ok = false; - } - if (!ok) - return 3; - - try - { - ok = true; - t = (ICloneable[])o2; - } - catch - { - ok = false; - } - if (!ok) - return 4; - - try - { - ok = true; - t = (ICloneable[])o; - } - catch - { - ok = false; - } - if (!ok) - return 5; - - if (!(o is ICloneable[])) - return 6; - - /* add tests for interfaces that 'inherit' interfaces */ - return 0; - } - - private static int[] daysmonthleap = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - - private static int AbsoluteDays(int year, int month, int day) - { - int temp = 0, m = 1; - int[] days = daysmonthleap; - while (m < month) - temp += days[m++]; - return ((day - 1) + temp + (365 * (year - 1)) + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400)); - } - - public static int test_719162_complex_div() - { - int adays = AbsoluteDays(1970, 1, 1); - return adays; - } - - delegate int GetIntDel(); - - static int return4() - { - return 4; - } - - int return5() - { - return 5; - } - - public static int test_2_static_delegate() - { - GetIntDel del = new GetIntDel(return4); - int v = del(); - if (v != 4) - return 0; - return 2; - } - - public static int test_2_instance_delegate() - { - Tests t = new Tests(); - GetIntDel del = new GetIntDel(t.return5); - int v = del(); - if (v != 5) - return 0; - return 2; - } - - public static int test_1_store_decimal() - { - decimal[,] a = { { 1 } }; - - if (a[0, 0] != 1m) - return 0; - return 1; - } - - public static int test_2_intptr_stobj() - { - System.IntPtr[] arr = { new System.IntPtr() }; - - if (arr[0] != (System.IntPtr)0) - return 1; - return 2; - } - - static int llmult(int a, int b, int c, int d) - { - return a + b + c + d; - } - - /* - * Test that evaluation of complex arguments does not overwrite the - * arguments already in outgoing registers. - */ - public static int test_155_regalloc() - { - int a = 10; - int b = 10; - - int c = 0; - int d = 0; - int[] arr = new int[5]; - - return llmult(arr[c + d], 150, 5, 0); - } - - static bool large_struct_test(Large a, Large b, Large c, Large d) - { - if (!a.check()) return false; - if (!b.check()) return false; - if (!c.check()) return false; - if (!d.check()) return false; - return true; - } - - public static int test_2_large_struct_pass() - { - Large a, b, c, d; - a = new Large(); - b = new Large(); - c = new Large(); - d = new Large(); - a.populate(); - b.populate(); - c.populate(); - d.populate(); - if (large_struct_test(a, b, c, d)) - return 2; - return 0; - } - - public static unsafe int test_0_pin_string() - { - string x = "xxx"; - fixed (char* c = x) - { - if (*c != 'x') - return 1; - } - return 0; - } - - public static int my_flags; - public static int test_0_and_cmp_static() - { - - /* various forms of test [mem], imm */ - - my_flags = 0x01020304; - - if ((my_flags & 0x01020304) == 0) - return 1; - - if ((my_flags & 0x00000304) == 0) - return 2; - - if ((my_flags & 0x00000004) == 0) - return 3; - - if ((my_flags & 0x00000300) == 0) - return 4; - - if ((my_flags & 0x00020000) == 0) - return 5; - - if ((my_flags & 0x01000000) == 0) - return 6; - - return 0; - } - - static byte b; - public static int test_0_byte_compares() - { - b = 0xff; - if (b == -1) - return 1; - b = 0; - if (!(b < System.Byte.MaxValue)) - return 2; - - if (!(b <= System.Byte.MaxValue)) - return 3; - - return 0; - } - - public static int test_71_long_shift_right() - { - ulong value = 38654838087; - int x = 0; - byte[] buffer = new byte[1]; - buffer[x] = ((byte)(value >> x)); - return buffer[x]; - } - - static long x; - public static int test_0_addsub_mem() - { - x = 0; - x += 5; - - if (x != 5) - return 1; - - x -= 10; - - if (x != -5) - return 2; - - return 0; - } - - static ulong y; - public static int test_0_sh32_mem() - { - y = 0x0102130405060708; - y >>= 32; - - if (y != 0x01021304) - return 1; - - y = 0x0102130405060708; - y <<= 32; - - if (y != 0x0506070800000000) - return 2; - - x = 0x0102130405060708; - x <<= 32; - - if (x != 0x0506070800000000) - return 2; - - return 0; - } - - - static uint dum_de_dum = 1; - public static int test_0_long_arg_opt() - { - return ObjectsFoo(0x1234567887654321, dum_de_dum); - } - - static int ObjectsFoo(ulong x, ulong y) - { - if (x != 0x1234567887654321) - return 1; - - if (y != 1) - return 2; - - return 0; - } - - public static int test_0_long_ret_opt() - { - ulong x = X(); - if (x != 0x1234567887654321) - return 1; - ulong y = Y(); - if (y != 1) - return 2; - - return 0; - } - - static ulong X() - { - return 0x1234567887654321; - } - - static ulong Y() - { - return dum_de_dum; - } - - /* from bug# 71515 */ - static int counter = 0; - static bool WriteStuff() - { - counter = 10; - return true; - } - public static int test_0_cond_branch_side_effects() - { - counter = 5; - if (WriteStuff()) ; - if (counter == 10) - return 0; - return 1; - } - - // bug #74992 - public static int arg_only_written(string file_name, int[] -ncells) - { - if (file_name == null) - return 1; - - ncells = foo(); - bar(ncells[0]); - - return 0; - } - - public static int[] foo() - { - return new int[3]; - } - - public static void bar(int i) - { - } - - - public static int test_0_arg_only_written() - { - return arg_only_written("md.in", null); - } - - static long position = 0; - - public static int test_4_static_inc_long() - { - - int count = 4; - - position = 0; - - position += count; - - return (int)position; - } - - struct ObjectsFooStruct - { - - public ObjectsFooStruct(long l) - { - } - } - - public static int test_0_calls_opcode_emulation() - { - // Test that emulated opcodes do not clobber arguments already in - // out registers - checked - { - long val = 10000; - new ObjectsFooStruct(val * 10000); - } - return 0; - } - - public static int test_0_intrins_string_length() - { - string s = "ABC"; - - return (s.Length == 3) ? 0 : 1; - } - - public static int test_0_intrins_string_chars() - { - string s = "ABC"; - - return (s[0] == 'A' && s[1] == 'B' && s[2] == 'C') ? 0 : 1; - } - - public static int test_0_intrins_object_gettype() - { - object o = 1; - - return (o.GetType() == typeof(int)) ? 0 : 1; - } - - public static int test_0_intrins_object_gethashcode() - { - object o = new Object(); - - return (o.GetHashCode() == o.GetHashCode()) ? 0 : 1; - } - - class FooClass - { - } - - public static int test_0_intrins_object_ctor() - { - object o = new FooClass(); - - return (o != null) ? 0 : 1; - } - - public static int test_0_intrins_array_rank() - { - int[,] a = new int[10, 10]; - - return (a.Rank == 2) ? 0 : 1; - } - - public static int test_0_intrins_array_length() - { - int[,] a = new int[10, 10]; - Array a2 = a; - - return (a2.Length == 100) ? 0 : 1; - } - - public static int test_0_intrins_runtimehelpers_offset_to_string_data() - { - int i = RuntimeHelpers.OffsetToStringData; - - return i - i; - } - - public static int test_0_intrins_string_setchar() - { - StringBuilder sb = new StringBuilder("ABC"); - - sb[1] = 'D'; - - return sb.ToString() == "ADC" ? 0 : 1; - } - - public class Bar - { - bool allowLocation = true; - Foo f = new Foo(); - } - - public static int test_0_regress_78990_unaligned_structs() - { - new Bar(); - - return 0; - } - - public static unsafe int test_97_negative_index() - { - char[] arr = new char[] { 'a', 'b' }; - fixed (char* p = arr) - { - char* i = p + 2; - char a = i[-2]; - return a; - } - } - - /* bug #82281 */ - public static int test_0_unsigned_right_shift_imm0() - { - uint temp = 0; - byte[] data = new byte[256]; - for (int i = 0; i < 1; i++) - temp = (uint)(data[temp >> 24] | data[temp >> 0]); - return 0; - } - - class Foo2 - { - public virtual int foo() - { - return 0; - } - } - - sealed class Bar2 : Foo2 - { - public override int foo() - { - return 0; - } - } - - public static int test_0_abcrem_check_this_removal() - { - Bar2 b = new Bar2(); - - // The check_this generated here by the JIT should be removed - b.foo(); - - return 0; - } - - static int invoke_twice(Bar2 b) - { - b.foo(); - // The check_this generated here by the JIT should be removed - b.foo(); - - return 0; - } - - public static int test_0_abcrem_check_this_removal2() - { - Bar2 b = new Bar2(); - - invoke_twice(b); - - return 0; - } - - /* #346563 */ - public static int test_0_array_access_64_bit() - { - int[] arr2 = new int[10]; - for (int i = 0; i < 10; ++i) - arr2[i] = i; - string s = "ABCDEFGH"; - - byte[] arr = new byte[4]; - arr[0] = 252; - arr[1] = 255; - arr[2] = 255; - arr[3] = 255; - - int len = arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24); - int len2 = -(len + 2); - - // Test array and string access with a 32 bit value whose upper 32 bits are - // undefined - // len2 = 3 - if (arr2[len2] != 2) - return 1; - if (s[len2] != 'C') - return 2; - return 0; - } - - public static float return_float() - { - return 1.4e-45f; - } - - public static int test_0_float_return_spill() - { - // The return value of return_float () is spilled because of the - // boxing call - object o = return_float(); - float f = return_float(); - return (float)o == f ? 0 : 1; - } - - class R4Holder - { - public static float pi = 3.14f; - - public float float_field; - } - - public static int test_0_ldsfld_soft_float() - { - if (R4Holder.pi == 3.14f) - return 0; - else - return 1; - } - - public static int test_0_ldfld_stfld_soft_float() - { - R4Holder h = new R4Holder(); - h.float_field = 3.14f; - - if (h.float_field == 3.14f) - return 0; - else - return 1; - } - - class R4HolderRemote : MarshalByRefObject - { - public static float pi = 3.14f; - - public float float_field; - } - - public static int test_0_ldfld_stfld_soft_float_remote() - { - R4HolderRemote h = new R4HolderRemote(); - h.float_field = 3.14f; - - if (h.float_field == 3.14f) - return 0; - else - return 1; - } - - public static int test_0_locals_soft_float() - { - float f = 0.0f; - - f = 3.14f; - - if (f == 3.14f) - return 0; - else - return 1; - } - - struct AStruct2 - { - public int i; - public int j; - } - - static float pass_vtype_return_float(AStruct2 s) - { - return s.i + s.j == 6 ? 1.0f : -1.0f; - } - - public static int test_0_vtype_arg_soft_float() - { - return pass_vtype_return_float(new AStruct2() { i = 2, j = 4 }) > 0.0 ? 0 : 1; - } - - static int range_check_strlen(int i, string s) - { - if (i < 0 || i > s.Length) - return 1; - else - return 0; - } - - public static int test_0_range_check_opt() - { - if (range_check_strlen(0, "A") != 0) - return 1; - if (range_check_strlen(1, "A") != 0) - return 2; - if (range_check_strlen(2, "A") != 1) - return 3; - if (range_check_strlen(-100, "A") != 1) - return 4; - return 0; - } - - public static int test_0_array_get_set_soft_float() - { - float[,] arr = new float[2, 2]; - arr[0, 0] = 256f; - return arr[0, 0] == 256f ? 0 : 1; - } - - //repro for #506915 - struct Bug506915 { public int val; } - public static int test_2_ldobj_stobj_optization() - { - int i = 99; - var a = new Bug506915(); - var b = new Bug506915(); - if (i.GetHashCode() == 99) - i = 44; - var array = new Bug506915[2]; - array[0].val = 2; - array[1] = (i == 0) ? a : array[0]; - - return array[1].val; - } - - /* mcs can't compile this (#646744) */ -#if FALSE - static void InitMe (out Gamma noMercyWithTheStack) { - noMercyWithTheStack = new Gamma (); - } - - static int FunNoInline () { - int x = 99; - if (x > 344 && x < 22) - return 333; - return x; - } - - static float DoNothingButDontInline (float a, int b) { - if (b > 0) - return a; - else if (b < 0 && b > 10) - return 444.0f; - return a; - } - - /* - * The local register allocator emits loadr8_membase and storer8_membase - * to do spilling. This code is generated after mono_arch_lowering_pass so - * mono_arch_output_basic_block must know how to deal with big offsets. - * This only happens because the call in middle forces the temp for "(float)obj" - * to be spilled. - */ - public static int test_0_float_load_and_store_with_big_offset () - { - object obj = 1.0f; - Gamma noMercyWithTheStack; - float res; - - InitMe (out noMercyWithTheStack); - - res = DoNothingButDontInline ((float)obj, FunNoInline ()); - - if (!(res == 1.0f)) - return 1; - return 0; - } -#endif - - struct VTypePhi - { - public int i; - } - - static int vtype_phi(VTypePhi v1, VTypePhi v2, bool first) - { - VTypePhi v = first ? v1 : v2; - - return v.i; - } - - public static int test_0_vtype_phi() - { - VTypePhi v1 = new VTypePhi() { i = 1 }; - VTypePhi v2 = new VTypePhi() { i = 2 }; - - if (vtype_phi(v1, v2, true) != 1) - return 1; - if (vtype_phi(v1, v2, false) != 2) - return 2; - - return 0; - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static void UseValue(int index) - { - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static bool IsFalse() - { - return false; - } - - public static int test_0_llvm_moving_faulting_loads() - { - int[] indexes = null; - - if (IsFalse()) - { - indexes = new int[0]; - } - - while (IsFalse()) - { - UseValue(indexes[0]); - UseValue(indexes[0]); - } - - return 0; - } - - public static bool flag; - - class B - { - - internal static B[] d; - - static B() - { - flag = true; - } - } - - [MethodImplAttribute(MethodImplOptions.NoInlining)] - static int regress_679467_inner() - { - if (flag == true) - return 1; - var o = B.d; - var o2 = B.d; - return 0; - } - - public static int test_0_multiple_cctor_calls_regress_679467() - { - flag = false; - return regress_679467_inner(); - } -} - diff --git a/Users/Orvid/IL2CPU Tester/CsTests/ratests.cs b/Users/Orvid/IL2CPU Tester/CsTests/ratests.cs deleted file mode 100644 index 50ef5e22b6..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/ratests.cs +++ /dev/null @@ -1,434 +0,0 @@ -using System; - -/* - * Register allocator tests. - */ - -public partial class Tests -{ - - - static void call_clobber_inner() - { - } - - public static int test_15_clobber_1() - { - int a = 0; - int b = 0; - for (int i = 0; i < 10; ++i) - a++; - for (int i = 0; i < 5; ++i) - b++; - - // clob == '1' and dreg == sreg2 - a = b + a; - return a; - } - - public static int test_15_clobber_1_fp() - { - float a = 0; - float b = 0; - for (int i = 0; i < 10; ++i) - a++; - for (int i = 0; i < 5; ++i) - b++; - - // clob == '1' and dreg == sreg2 - a = b + a; - return (int)a; - } - - public static int test_5_call_clobber() - { - // A call clobbers some registers so variables in those registers need to be spilled - // and later reloaded to a register - int a = 2; - int b = 3; - - call_clobber_inner(); - - return a + b; - } - - static int call_clobber_inner2() - { - return 3; - } - - public static int test_7_call_clobber_dreg() - { - // A call doesn't clobber its dreg - int a = 3; - int b = 4; - - a = call_clobber_inner2(); - - return a + b; - } - - public static int test_9_spill_if_then_else() - { - // Spilling variables in one branch of an if-then-else - int a = 4; - int b = 5; - - if (a != b) - { - } - else - { - call_clobber_inner(); - } - - return a + b; - } - - public static int test_3_spill_reload_if_then_else() - { - // Spilling and reloading variables in one branch of an if-then-else - int a = 4; - int b = 5; - int c = 3; - - if (a != b) - { - } - else - { - call_clobber_inner(); - c = a + b; - } - - return c; - } - - public static int test_5_spill_loop() - { - int i; - - for (i = 0; i < 5; ++i) - call_clobber_inner(); - - return i; - } - - public unsafe static int test_0_volatile() - { - int i = 1; - int* p = &i; - - if (*p != 1) - return 1; - if (i != 1) - return 2; - *p = 5; - if (i != 5) - return 3; - i = 2; - if (i != 2) - return 4; - if (*p != 2) - return 5; - - return 0; - } - - public unsafe static int test_0_volatile_unused() - { - int i = 1; - int* p = &i; - - if (*p != 1) - return 1; - - return 0; - } - - public unsafe static int test_0_volatile_unused_2() - { - int i = 1; - int* p = &i; - - i = 2; - if (i != 2) - return 1; - - return 0; - } - - static int ref_int(int i, ref int b, int j) - { - int res = b; - b = 1; - return res; - } - - public static int test_0_volatile_unused_3() - { - // b's def has no use so its interval is split at a position not covered by the interval - int b = 42; - if (ref_int(99, ref b, 100) != 42) - return 1; - b = 43; - if (ref_int(99, ref b, 100) != 43) - return 2; - if (b != 1) - return 13; - return 0; - } - - static int ref_bool(int i, ref bool b1, ref bool b2, ref bool b3) - { - b1 = !b1; - b2 = !b2; - b3 = !b3; - - return 0; - } - - public static int test_0_volatile_regress_1() - { - // Spill stores should precede spill loads at a given position - for (int i = 0; i < 8; i++) - { - bool b1 = (i & 4) != 0; - bool b2 = (i & 2) != 0; - bool b3 = (i & 1) != 0; - bool orig_b1 = b1, orig_b2 = b2, orig_b3 = b3; - if (ref_bool(i, ref b1, ref b2, ref b3) != 0) - return 4 * i + 1; - if (b1 != !orig_b1) - return 4 * i + 2; - if (b2 != !orig_b2) - return 4 * i + 3; - if (b3 != !orig_b3) - return 4 * i + 4; - } - - return 0; - } - - static int decode_len(out int pos) - { - pos = 19; - return 10; - } - - static void clobber_all(int pos) - { - for (int i = 0; i < 10; ++i) - for (int j = 0; j < 10; ++j) - for (int k = 0; k < 10; ++k) - for (int l = 0; l < 10; ++l) - ; - } - - public static int test_29_volatile_regress_2() - { - int pos = 0; - - int len = decode_len(out pos); - call_clobber_inner(); - pos += len; - - clobber_all(pos); - return pos; - } - - public static int test_0_clobber_regress_1() - { - object[] a11 = new object[10]; - object o = new Object(); - // A spill load is inserted before the backward branch, clobbering one of the - // registers used in the comparison - for (int i = 0; i < 10; ++i) - a11[i] = null; - - return 0; - } - - static int return_arg(int i) - { - return i; - } - - public static int test_0_spill_regress_1() - { - int j = 5; - for (int i = 0; i < 3; i++) - { - // i is spilled by the call, then reloaded for the loop check - // make sure the move from its first reg to its second is inserted in the - // if body bblock, not the for body bblock - if (i == 0) - { - } - else - { - if (return_arg(j) != 5) - return 1; - } - } - - return 0; - } - - public static int test_0_spill_regress_2() - { - double[] temporaries = new double[3]; - for (int i = 0; i < 3; i++) - { - // i and temporaries are spilled by the call, then reloaded after the call - // make sure the two moves inserted in the if bblock are in the proper order - if (i == 0) - { - } - else - { - temporaries[i] = return_arg(i); - } - } - - return 0; - } - - static int many_args_unused(int i, int j, int k, int l, int m, int n, int p, int q) - { - return 0; - } - - public static int test_0_unused_args() - { - return many_args_unused(0, 1, 2, 3, 4, 5, 6, 7); - } - - public unsafe void ClearBuffer(byte* buffer, int i) - { - // Avoid inlining - byte* b = stackalloc byte[4]; - } - - public unsafe bool instance_method_1(string s, string target, int start, int length, int opt) - { - byte* alwaysMatchFlags = stackalloc byte[16]; - byte* neverMatchFlags = stackalloc byte[16]; - byte* targetSortKey = stackalloc byte[4]; - byte* sk1 = stackalloc byte[4]; - byte* sk2 = stackalloc byte[4]; - ClearBuffer(alwaysMatchFlags, 16); - ClearBuffer(neverMatchFlags, 16); - ClearBuffer(targetSortKey, 4); - ClearBuffer(sk1, 4); - ClearBuffer(sk2, 4); - - return this == null && s == target && start == length && length == opt && alwaysMatchFlags == neverMatchFlags && neverMatchFlags == targetSortKey && sk1 == sk2; - } - - public static int test_0_spill_regress_3() - { - new Tests().instance_method_1(null, null, 0, 0, 0); - return 0; - } - - unsafe bool MatchesBackward(string s, ref int idx, int end, int orgStart, int ti, byte* sortkey, bool noLv4, ref object ctx) - { - // Avoid inlining - byte* b = stackalloc byte[4]; - - if (ctx == null) - throw new Exception(); - - idx -= 1; - return false; - } - - unsafe int LastIndexOfSortKey(string s, int start, int orgStart, int length, byte* sortkey, int ti, bool noLv4, ref object ctx) - { - // ctx is initially allocated to the stack, when it is reloaded before the call, - // %rax is spilled to free up the register, then ctx is allocated to %rax for its - // whole lifetime, but %rax is not available for this since it is clobbered by the - // call - int end = start - length; - int idx = start; - while (idx > end) - { - int cur = idx; - if (MatchesBackward(s, ref idx, end, orgStart, - ti, sortkey, noLv4, ref ctx)) - return cur; - } - return -1; - } - - public unsafe static int test_0_spill_regress_4() - { - object o = new Object(); - new Tests().LastIndexOfSortKey("", 10, 0, 5, null, 0, false, ref o); - - return 0; - } - - public static bool IsEqual(Type type, Type base_type) - { - return (type.GetHashCode() == base_type.GetHashCode()); - } - - public static bool IsNestedFamilyAccessible(Type type, Type base_type) - { - do - { - if (IsEqual(type, base_type)) - return true; - - type = type.DeclaringType; - } while (type != null); - - return false; - } - - public static int test_0_do_while_critical_edges() - { - IsNestedFamilyAccessible(typeof(int), typeof(object)); - - return 0; - } - - public static string return_string(string s) - { - for (int i = 0; i < 1000; ++i) - ; - return s; - } - - public static int test_0_switch_critical_edges() - { - // A spill load is inserted at the end of the bblock containing the OP_BR_REG, - // overwriting the source reg of the OP_BR_REG. The edge is not really - // a critical edge, since its source bblock only has 1 exit, but it must - // be treated as such. - for (int i = 0; i < UInt16.MaxValue; i++) - { - Char c = Convert.ToChar(i); - switch (i) - { - case 0x0009: - case 0x000A: - case 0x000B: - case 0x2028: - case 0x2029: - case 0x202F: - case 0x205F: - case 0x3000: - //Console.WriteLine ((i.ToString () + (int)c)); - return_string((i.ToString() + (int)c)); - break; - default: - break; - } - } - - return 0; - } -} diff --git a/Users/Orvid/IL2CPU Tester/CsTests/s390-abi.cs b/Users/Orvid/IL2CPU Tester/CsTests/s390-abi.cs deleted file mode 100644 index 52da086085..0000000000 --- a/Users/Orvid/IL2CPU Tester/CsTests/s390-abi.cs +++ /dev/null @@ -1,367 +0,0 @@ -using System; - -/* - * Regression tests for the mono JIT. - * - * Each test needs to be of the form: - * - * static int test__ (); - * - * where is an integer (the value that needs to be returned by - * the method to make it pass. - * is a user-displayed name used to identify the test. - * - * The tests can be driven in two ways: - * *) running the program directly: Main() uses reflection to find and invoke - * the test methods (this is useful mostly to check that the tests are correct) - * *) with the --regression switch of the jit (this is the preferred way since - * all the tests will be run with optimizations on and off) - * - * The reflection logic could be moved to a .dll since we need at least another - * regression test file written in IL code to have better control on how - * the IL code looks. - */ - -public partial class Tests -{ - - public struct TestStruct1 - { - public int a; - } - - public struct TestStruct2 - { - public int a; - public int b; - } - - public struct TestStruct3 - { - public int a; - public int b; - public int c; - } - - static void reg_struct(TestStruct1 regStruct) - { - regStruct.a = 1; - } - - public static int test_0_regstruct() - { - TestStruct1 myStruct; - myStruct.a = 1; - reg_struct(myStruct); - if (myStruct.a == 1) - return 0; - else - return 1; - } - - static int reg_struct_ret(TestStruct2 regStruct) - { - return regStruct.b; - } - - public static int test_0_reg_return() - { - TestStruct2 myStruct; - myStruct.a = 0; - myStruct.b = 42; - if (reg_struct_ret(myStruct) == 42) - return 0; - return 2; - } - - static int spill_regs(int a, int b, int c, int d, int e, int f) - { - return f; - } - - public static int test_0_spill_regs() - { - if (spill_regs(1, 2, 3, 4, 5, 6) == 6) - return 0; - else - return 3; - } - - static TestStruct3 spill_struct(TestStruct3 regStruct, int value) - { - regStruct.c = value; - return (regStruct); - } - - static TestStruct3 ret_big_struct(int value_a, int value_c) - { - TestStruct3 regStruct = new TestStruct3(); - regStruct.a = value_a; - regStruct.c = value_c; - return (regStruct); - } - - static int spill_struct_void(TestStruct3 regStruct) - { - if (regStruct.c == 255) - return 0; - else - return 7; - } - - static int receive_spill_struct(TestStruct2 regStruct) - { - if (regStruct.b == 181) - return 0; - else - return 8; - } - - static int pass_spill_struct_big(int a, int b, int c, int d, int e, TestStruct3 regStruct) - { - int retVal; - retVal = receive_spill_struct_big(regStruct); - return retVal; - } - - static int receive_spill_struct_big(TestStruct3 regStruct) - { - if (regStruct.c == 999) - return 0; - else - return 9; - } - - static int receive_struct_spill(int a, int b, int c, int d, int e, TestStruct2 regStruct) - { - if (regStruct.b == 181) - return 0; - else - return 10; - } - - static int receive_struct_spill_big(int a, int b, int c, int d, int e, TestStruct3 regStruct) - { - if (regStruct.c == 999) - return 0; - else - return 11; - } - - static int pass_spill_struct(int a, int b, int c, int d, int e, TestStruct2 regStruct) - { - int retVal; - retVal = receive_spill_struct(regStruct); - return retVal; - } - - static int pass_struct_spill(TestStruct2 regStruct) - { - int retVal; - retVal = receive_struct_spill(1, 2, 3, 4, 5, regStruct); - return retVal; - } - - static int pass_struct_spill_big(TestStruct3 regStruct) - { - int retVal; - retVal = receive_struct_spill_big(1, 2, 3, 4, 5, regStruct); - return retVal; - } - - static int pass_spill_struct_spill(int a, int b, int c, int d, int e, TestStruct2 regStruct) - { - int retVal; - retVal = receive_struct_spill(a, b, c, d, e, regStruct); - return retVal; - } - - static int pass_spill_struct_spill_big(int a, int b, int c, int d, int e, TestStruct3 regStruct) - { - int retVal; - retVal = receive_struct_spill_big(a, b, c, d, e, regStruct); - return retVal; - } - - public static int test_0_spill() - { - TestStruct3 myStruct; - myStruct.a = 64; - myStruct.b = 255; - myStruct.c = 127; - myStruct = spill_struct(myStruct, 99); - if (myStruct.c == 99) - return 0; - return myStruct.c; - } - - public static int test_0_spill_void() - { - TestStruct3 myStruct; - myStruct.a = 0; - myStruct.b = 127; - myStruct.c = 255; - return (spill_struct_void(myStruct)); - } - - static int spill_struct_ret(TestStruct3 regStruct) - { - return (regStruct.c); - - } - - public static int test_0_spill_ret() - { - TestStruct3 myStruct; - myStruct.a = 0; - myStruct.b = 0; - myStruct.c = 69; - if (spill_struct_ret(myStruct) == 69) - return 0; - return 5; - } - - static TestStruct2 struct_ret(TestStruct2 regStruct) - { - regStruct.a = -1; - regStruct.b = 72; - return (regStruct); - } - - public static int test_0_struct_ret() - { - TestStruct2 myStruct; - myStruct.a = 99; - myStruct.b = 14; - myStruct = struct_ret(myStruct); - if (myStruct.b == 72) - return 0; - else - return myStruct.b; - } - - static float TestSingle(float a, float b, float c) - { - return b; - } - - public static int test_0_TestSingle() - { - float a = 3F; float b = 4.5F; float c = 900F; - if (TestSingle(a, b, c) == b) - return 0; - else - return 6; - } - - public static int test_0_pass_spill() - { - TestStruct2 myStruct; - myStruct.a = 32; - myStruct.b = 181; - return (pass_spill_struct(1, 2, 3, 4, 5, myStruct)); - } - - public static int test_0_pass_spill_big() - { - TestStruct3 myStruct; - myStruct.a = 32; - myStruct.b = 181; - myStruct.c = 999; - return (pass_spill_struct_big(1, 2, 3, 4, 5, myStruct)); - } - - public static int test_0_pass_struct_spill() - { - TestStruct2 myStruct; - myStruct.a = 32; - myStruct.b = 181; - return (pass_struct_spill(myStruct)); - } - - public static int test_0_pass_struct_spill_big() - { - TestStruct3 myStruct; - myStruct.a = 32; - myStruct.b = 181; - myStruct.c = 999; - return (pass_struct_spill_big(myStruct)); - } - - public static int test_0_pass_ret_big_struct() - { - TestStruct3 myStruct; - myStruct = ret_big_struct(10, 132); - if (myStruct.c == 132) - return 0; - else - return 1; - } - - public static int test_0_pass_spill_struct_spill() - { - TestStruct2 myStruct; - myStruct.a = 32; - myStruct.b = 181; - return (pass_spill_struct_spill(1, 2, 3, 4, 5, myStruct)); - } - - public static int test_0_pass_spill_struct_spill_big() - { - TestStruct3 myStruct; - myStruct.a = 32; - myStruct.b = 181; - myStruct.c = 999; - return (pass_spill_struct_spill_big(1, 2, 3, 4, 5, myStruct)); - } - - static long pass_long_odd(int a, long b) - { - return (b); - } - - public static int test_0_pass_long_odd() - { - int a = 5; - long b = 9000; - if (pass_long_odd(a, b) == 9000) - return 0; - else - return 9; - } - - static float pass_double_ret_float(double a) - { - float b; - b = (float)a; - return b; - } - - public static int test_0_pass_double_ret_float() - { - double a = 654.34; - float b = 654.34f; - if (pass_double_ret_float(a) == b) - return 0; - else - return 10; - } - - static double pass_float_ret_double(float a) - { - double b; - b = (double)a; - return b; - } - - public static int test_0_pass_float_ret_double() - { - float a = 654.34f; - double b = 654.34; - if (pass_float_ret_double(a) == b) - return 0; - else - return 11; - } - -} diff --git a/Users/Orvid/IL2CPU Tester/RawILTests/MSIL.targets b/Users/Orvid/IL2CPU Tester/RawILTests/MSIL.targets deleted file mode 100644 index ce8b5cfc00..0000000000 --- a/Users/Orvid/IL2CPU Tester/RawILTests/MSIL.targets +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - "$(FrameworkPath)\Ilasm.exe" /NOLOGO /DLL /OUTPUT:"@(IntermediateAssembly)" - - - $(IlAsmCommand) /DEBUG - - - $(IlAsmCommand) /OPTIMIZE - - - $(IlAsmCommand) /KEY:"$(AssemblyOriginatorKeyFile)" - - - - - \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/RawILTests/RawILTests.csproj b/Users/Orvid/IL2CPU Tester/RawILTests/RawILTests.csproj deleted file mode 100644 index 42cfd8aeee..0000000000 --- a/Users/Orvid/IL2CPU Tester/RawILTests/RawILTests.csproj +++ /dev/null @@ -1,79 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {59E2210F-3F41-42DF-8B26-9CAE87273562} - Library - Properties - RawILTests - RawILTests - v4.7.1 - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - diff --git a/Users/Orvid/IL2CPU Tester/RawILTests/iltests.il b/Users/Orvid/IL2CPU Tester/RawILTests/iltests.il deleted file mode 100644 index d3430e225d..0000000000 --- a/Users/Orvid/IL2CPU Tester/RawILTests/iltests.il +++ /dev/null @@ -1,2641 +0,0 @@ -.assembly extern mscorlib {} - -.assembly RawILTests { - .custom instance void class [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::'.ctor'() = ( - 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx - 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. -} - -// -// A Covariant interface -// -.class interface public abstract auto ansi beforefieldinit MyIEnumerator`1<+T> -{ - .method public hidebysig abstract virtual instance bool MoveNext() cil managed - { - } - - .method public hidebysig abstract virtual instance !T get_Current () cil managed - { - } - - .property !T Current() - { - .get instance !T MyIEnumerator`1::get_Current() - } -} - -// -// A Contravariant interface -// -.class interface public abstract auto ansi beforefieldinit IComparer`1<-T> -{ - .method public hidebysig abstract virtual instance bool Compare(!T x, !T y) cil managed - { - } -} - -.class interface public abstract auto ansi beforefieldinit IKeyComparer`1<-T> implements class IComparer`1 -{ -} - -.class public auto ansi sealed beforefieldinit Tests { - - // make sure the register allocator works when the return value of - // 'div' is discarded - .method static public int32 test_0_div_regalloc () il managed { - .locals init ( - int32 i - ) - - ldloc 0 - ldc.i4.s 0xa - div - pop - ldc.i4.0 - ret - } - - - .method static public int32 test_1_ceq_to_i4 () il managed { - .locals init ( - int32 foo - ) - ldc.i4 500 - stloc foo - ldloc foo - ldc.i4 500 - ceq - stloc foo - ldloc foo - ret - } - - .method static public int32 test_3_shl_regvars () il managed { - .locals init ( - int32 a, - int32 b, - int32 r1, - int32 r2, - int32 r3 - ) - - ldc.i4.2 - stloc a - ldc.i4.1 - stloc b - - ldloc a - ldloc b - shl - stloc r1 - - ldloc a - ldloc b - shl - stloc r2 - - ldloc a - ldloc b - shl - stloc r3 - - ldloc r1 - ldc.i4.4 - ceq - - ldloc r2 - ldc.i4.4 - ceq - - ldloc r3 - ldc.i4.4 - ceq - - add - add - - ret - } - - .method static public int32 test_1_fceq_to_i4 () il managed { - - .locals init ( - float64 foo, - int32 val - ) - - ldc.r8 2 - stloc foo - - ldloc foo - ldc.r8 2 - ceq - stloc val - - ldloc val - ret - } - - // - // This should be manually checked. Basically under -O=linears, - // you should not see tons of register spilling. - // - .method static public int32 test_1_bytedreg_free () il managed { - .locals init ( - int32 foo - ) - ldc.i4 500 - stloc foo - ldloc foo - ldc.i4 500 - ceq - stloc foo - - ldloc foo - ldc.i4 1 - ceq - stloc foo - - ldloc foo - ldc.i4 1 - ceq - stloc foo - - ldloc foo - ldc.i4 1 - ceq - stloc foo - - ldloc foo - ldc.i4 1 - ceq - stloc foo - - ldloc foo - ret - } - - // - // This should be manually checked. Basically under -O=linears, - // you should not see tons of register spilling. - // - .method static public int32 test_0_bytesreg1_free () il managed { - .locals init ( - unsigned int8 dest, - int32 src, - unsigned int8& pdest - ) - - ldloca dest - stloc pdest - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldloc src - stind.i1 - - ldloc pdest - ldind.i1 - ret - } - - .method static public int32 test_1_shift_regvar () il managed { - - .locals init ( - int32 v7FFFFFFF, - int32 v1 - ) - - ldc.i4 0x7FFFFFFF - stloc v7FFFFFFF - - ldc.i4.1 - stloc v1 - - ldloc v7FFFFFFF - ldloc v1 - shl - ldc.i4 0xFFFFFFFE - ceq - ret - } - - // this only happens with the managed pointer, not an unmanaged one. - .method static public int32 test_0_foo () il managed { - - .locals init ( - int32& buf - ) - - ldc.i4.5 - localloc - - stloc buf - ldloc buf - - ldind.i4 - - ret - } - - .method static public int32 test_0_localloc () cil managed { - .locals init (native int, native int, native int, native int, int32) - - ldc.i4 6 - localloc - conv.i - stloc.0 - - ldc.i4 6 - localloc - conv.i - stloc.1 - - ldc.i4 6 - localloc - conv.i - stloc.2 - - // Variable length - ldc.i4 128 - stloc.s 4 - ldloc.s 4 - localloc - conv.i - stloc.3 - - // Check zero initialized - ldloc.0 - ldind.i4 - ldc.i4.0 - beq OK1 - ldc.i4.1 - br FAIL - -OK1: - ldloc.3 - ldind.i4 - ldc.i4.0 - beq OK2 - ldc.i4.2 - br FAIL - -OK2: - ldloc.3 - ldc.i4.s 124 - add - ldind.i4 - ldc.i4.0 - beq OK3 - ldc.i4.3 - br FAIL - -OK3: - ldloc.1 - ldc.i4 999999 - stind.i4 - ldloc.1 - ldind.i4 - ldc.i4 999999 - beq OK4 - ldc.i4.4 - br FAIL - -OK4: - ldloc.0 - ldc.i4 999999 - stind.i4 - ldloc.0 - ldind.i4 - ldc.i4 999999 - beq OK5 - ldc.i4.5 - br FAIL - -OK5: - // Try allocations bigger than one page - ldc.i4 8196 - localloc - conv.i - stloc.3 - ldloc.3 - ldc.i4 8192 - add - ldc.i4 99 - stind.i4 - ldloc.3 - ldc.i4 8192 - add - ldind.i4 - ldc.i4 99 - beq PASS - ldc.i4.6 - br FAIL - -FAIL: - ret - -PASS: ldc.i4.0 - ret - } - - .method private static void do_localloc () cil managed { - .maxstack 3 - .locals init ( - unsigned int8* V_0) - IL_0000: ldc.i4.1 - IL_0001: ldc.i4 131072 - IL_0006: mul - IL_0007: localloc - IL_0009: stloc.0 - IL_000a: ret - } - - // Check that localloc can't be inlined - .method static public int32 test_0_localloc_inline () cil managed { - .maxstack 16 - .locals init ( - int32 i - ) - - ldc.i4.0 - stloc.0 - br COND - -START: call void class Tests::do_localloc() - ldloc.0 - ldc.i4.1 - add - stloc.0 -COND: ldloc.0 - ldc.i4 1000 - blt START - - ldc.i4.0 - ret - } - - .method static public int32 test_3_copy_used_bug () il managed { - - .locals init ( - int32 size, - int32 res - ) - - ldc.i4 0 - stloc res - - ldc.i4 1 - stloc size - - ldloc size - ldloc size - ldloc size - add - stloc size - ldloc size - add - stloc res - - ldloc res - ret - } - - // demonstrate that the copy_used_var is not a fix for the above bug - .method static public int32 test_3_copy_used_indir_bug () il managed { - - .locals init ( - int32 size, - int32 res - ) - - ldc.i4 0 - stloc res - - ldc.i4 1 - stloc size - - ldloc size - ldloca size - ldloc size - ldloc size - add - stind.i4 - ldloc size - add - stloc res - - ldloc res - ret - } - - .method static public void do_nothing (int32 a) il managed { - ret - } - - // demonstrate the block_split failure: needs -O=inline - // mini -O=inline --compile Tests:test_0_split_block_bug iltests.exe - .method static public int32 test_0_split_block_bug () il managed { - - .locals init ( - int32 i1 - ) - - ldc.i4 1 - stloc i1 - test_label: - ldloc i1 - call void class Tests::do_nothing (int32) - ldc.i4 0 - brtrue test_label - - ldc.i4 0 - ret - } - - .method public void inline_do_nothing () il managed { - ret - } - .method static public int32 test_1_checkthis_inlining () il managed { - ldnull - call instance void class Tests::inline_do_nothing () - ldc.i4 1 - ret - } - - .class nested private auto ansi sealed beforefieldinit TailCallStruct - extends [mscorlib]System.ValueType { - .field public int32 a - .field public int32 b - } - - .method static valuetype Tests/TailCallStruct tail1 (valuetype Tests/TailCallStruct arg) { - ldarga 0 - ldarga 0 - ldfld int32 Tests/TailCallStruct::a - ldc.i4.1 - add - stfld int32 Tests/TailCallStruct::a - ldarga 0 - ldarga 0 - ldfld int32 Tests/TailCallStruct::a - ldc.i4.2 - add - stfld int32 Tests/TailCallStruct::a - ldarg.0 - ret - } - - .method static valuetype Tests/TailCallStruct tail2 (valuetype Tests/TailCallStruct arg) { - ldarg.0 - tail. - call valuetype Tests/TailCallStruct Tests::tail1 (valuetype Tests/TailCallStruct) - ret - } - - .class nested private auto ansi sealed beforefieldinit TailCallStructBig - extends [mscorlib]System.ValueType { - .field public int32 a - .field public int32 b - .field public int32 c - .field public int32 d - .field public int32 e - } - - .method static valuetype Tests/TailCallStructBig tail_vret_by_addr_inner (valuetype Tests/TailCallStructBig arg) { - ldarga 0 - ldarga 0 - ldfld int32 Tests/TailCallStructBig::a - ldc.i4.1 - add - stfld int32 Tests/TailCallStructBig::a - ldarg.0 - ret - } - - .method static valuetype Tests/TailCallStructBig tail_vret_by_addr (valuetype Tests/TailCallStructBig arg) { - ldarg.0 - tail. - call valuetype Tests/TailCallStructBig Tests::tail_vret_by_addr_inner (valuetype Tests/TailCallStructBig) - ret - } - - .method static public int32 test_3_tail_call_vret_by_addr () il managed { - .maxstack 16 - .locals init ( - valuetype Tests/TailCallStructBig arg2 - ) - - ldloca 0 - ldc.i4.2 - stfld int32 Tests/TailCallStructBig::a - ldloc.0 - call valuetype Tests/TailCallStructBig Tests::tail_vret_by_addr (valuetype Tests/TailCallStructBig) - stloc.0 - - ldloca 0 - ldfld int32 Tests/TailCallStructBig::a - ret - } - - .method static public int32 test_9_tail_call_vret_by_val () il managed { - .maxstack 16 - .locals init ( - valuetype Tests/TailCallStruct arg - ) - ldloca 0 - ldc.i4.2 - stfld int32 Tests/TailCallStruct::a - ldloca 0 - ldc.i4.4 - stfld int32 Tests/TailCallStruct::b - ldloc.0 - call valuetype Tests/TailCallStruct Tests::tail2 (valuetype Tests/TailCallStruct) - stloc.0 - - ldloca 0 - ldfld int32 Tests/TailCallStruct::a - ldloca 0 - ldfld int32 Tests/TailCallStruct::b - add - ret - } - - .method static public int32 tail3 (int32 i, int32 j) il managed { - ldarg.0 - ldarg.1 - add - ret - } - - .method static public int32 tail4 (int32 i, int32 j) il managed { - .maxstack 16 - .locals init ( - int32 k) - - // Test arg0 allocated to a register - ldarg.0 - ldarg.0 - ldarg.0 - ldarg.0 - add - add - add - starg 0 - - // Test switched up argument variables as the actual arguments - ldarg.1 - ldarg.0 - tail. - call int32 Tests::tail3 (int32, int32) - ret - } - - .method static public int32 test_24_tail_calls2 () il managed { - // Some platforms might not be able to AOT tail calls - .maxstack 16 - .locals init ( - int32 i, - int32 j) - - ldc.i4.4 - stloc.0 - ldc.i4.8 - stloc.1 - - ldloc.0 - ldloc.1 - call int32 Tests::tail4 (int32, int32) - ret - } - - .method public static int32 test_5_jmp () cil managed { - // Some platforms might not be able to AOT tail calls - - ldc.i4.1 - ldc.i4.2 - call int32 Tests::jmp2 (int32, int32) - ret - } - - .method public static int32 jmp2 (int32, int32) cil managed { - ldarg.0 - ldc.i4.1 - add - starg.s 0 - ldarg.1 - ldc.i4.1 - add - starg.s 1 - jmp int32 Tests::jmp3 (int32, int32) - ldc.i4.0 - ret - } - - .method public static int32 jmp3 (int32 i, int32 j) cil managed { - ldarg.0 - ldarg.1 - add - ret - } - - .method static public int32 test_11_switch_with_nonempty_stack () il managed { - .maxstack 16 - - ldc.i4.5 - ldc.i4.6 - ldc.i4.1 - switch (L0, L1) - L0: - add - ret - L1: - add - ret - } - - .method public static int32 test_5_endfinally_with_nonempty_stack () il managed { - .maxstack 16 - - .try { - leave IL_0 - } - finally { - ldc.i4.0 - endfinally - } - IL_0: ldc.i4.5 - ret - } - - .method public static int32 test_0_conv_ovf_i8_neg () il managed { - .maxstack 16 - - ldc.i4.m1 - conv.ovf.i8 - conv.i4 - ldc.i4.m1 - beq L_OK - ldc.i4.1 - ret - L_OK: - ldc.i4.0 - ret - } - - .method public static int32 test_1234_conv_u4 () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.u4 - conv.i4 - ret - } - - .method public static int32 test_0_conv_ovf_i_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.ovf.i.un - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4 0x7fffffff - conv.ovf.i.un - conv.i4 - ldc.i4 0x7fffffff - beq L2 - ldc.i4.2 - ret - L2: - sizeof [mscorlib]System.IntPtr - ldc.i4 8 - beq L5 - .try { - ldc.i4 0x80000000 - conv.ovf.i.un - leave L4 - } catch [mscorlib]System.OverflowException { - pop - leave L5 - } - L4: - ldc.i4.3 - ret - L5: - ldc.i4.0 - ret - } - - .method public static int32 test_0_conv_ovf_u_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.ovf.u.un - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_conv_ovf_i () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.ovf.i - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_conv_ovf_u () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.ovf.u - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_1234_conv_ovf_i8_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.ovf.i8.un - conv.i4 - ret - } - - .method public static int32 test_0_lconv_ovf_i () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.i - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_lconv_ovf_u () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.u - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_lconv_ovf_i_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.i.un - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_lconv_ovf_u_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.u.un - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_lconv_to_ovf_i8 () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.i8 - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_lconv_to_ovf_u8_un () cil managed { - .maxstack 16 - - ldc.i4 1234 - conv.i8 - conv.ovf.u8.un - conv.i4 - ldc.i4 1234 - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_2_lconv_to_ovf_i4_un () cil managed { - .maxstack 16 - .locals init (int32 res) - - ldc.i4 0x7fffffff - conv.u8 - conv.ovf.i4.un - pop - - ldc.i4.2 - stloc res - - .try { - ldc.i8 0x80000000 - conv.ovf.i4.un - pop - ldc.i4.0 - stloc res - leave RET - } catch [mscorlib]System.OverflowException { - pop - leave IL_0 - } - - IL_0: - - .try { - ldc.i8 0xffffffff80000000 - conv.ovf.i4.un - pop - ldc.i4.1 - stloc res - leave RET - } catch [mscorlib]System.OverflowException { - pop - leave RET - } - - RET: - ldloc res - ret - } - - .method public static int32 test_1_lconv_to_ovf_i_un () cil managed { - .maxstack 16 - .locals init (int32 res) - - ldc.i4 0x7fffffff - conv.u8 - conv.ovf.i.un - conv.i4 - pop - - ldc.i4.1 - ret - } - - .method public static int32 test_32_lconv_to_u8 () cil managed - { - .maxstack 16 - - ldc.i4 32 - conv.i8 - conv.u8 - conv.i4 - ret - } - - .method public static int32 test_32_lconv_to_i8 () cil managed - { - .maxstack 16 - - ldc.i4 32 - conv.i8 - conv.i8 - conv.i4 - ret - } - - .method public static int32 test_15_lconv_to_u () cil managed - { - ldc.i8 0x10000000f - conv.u - conv.i4 - ret - } - - // PPC handles overflow by clipping, but this test assumes - // no overflow handling. According to ECMA the result of - // float->int conversion is undefined if overflow occurs, so - // both behaviours are valid. - .method public static int32 test_0_fconv_to_i () cil managed { - .maxstack 16 - - ldc.r8 2147483648.0 - conv.i - ldc.i8 2147483648 - conv.i - beq L1 - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_get_type_from_handle_on_bblock_boundary () cil managed - { - .maxstack 16 - - ldc.i4.1 - brfalse OBJECT - - ldtoken [mscorlib]System.String - br AFTER - OBJECT: - ldtoken [mscorlib]System.Object - AFTER: - call class [mscorlib]'System.Type' class [mscorlib]'System.Type'::'GetTypeFromHandle'(valuetype [mscorlib]'System.RuntimeTypeHandle') - callvirt instance string class [mscorlib]System.Type::get_FullName () - ldstr "System.String" - callvirt instance bool class [mscorlib]System.Object::Equals(object) - ldc.i4.0 - ceq - ret - } - - .method public static int32 test_0_bug59580 () - { - ldc.r4 float32(0x7FC00000) - ldc.r4 float32(0x7FC00000) - bge.un pass - br fail - pass: - ldc.i4.0 - ret - fail: - ldc.i4.1 - ret - } - - .method public static int32 test_1_bug60056 () { - .locals init (int32 m5) - - ldc.i4.m1 - stloc.0 - - ldc.i4.1 - conv.u8 - - ldloc.0 - conv.i8 - mul - - ldc.i4.m1 - conv.i8 - ceq - ret - } - - .method public static int32 test_1_conv_u8_cfold () { - ldc.i4.m1 - conv.u8 - - ldc.i8 0x00000000ffffffff - - ceq - ret - } - - .method public static int32 test_1_array_type_mismatch_ldelema () { - .locals init (int32 r) - - ldc.i4.1 - newarr string - ldc.i4.0 - ldelema string - pop - - .try { - ldc.i4.1 - newarr string - ldc.i4.0 - ldelema object - pop - - leave end - } catch [mscorlib]System.ArrayTypeMismatchException { - pop - ldc.i4.1 - stloc.0 - leave end - } - end: - ldloc.0 - ret - } - - .method public static int32 test_1_conv_ovf_i8_with_i4 () { - ldc.i4.m1 - conv.ovf.i8 - conv.ovf.i4 - neg - ret - } - - // bug #72148 - .method public static int32 test_0_initlocals_float_ptr () { - .maxstack 3 - .locals init ( - float32[] V_0, - float32& pinned V_1, - unsigned int32 V_2) - ldc.i4.s 0x0f - newarr [mscorlib]System.Single - stloc.0 - ldloc.0 - ldc.i4.0 - ldc.r4 1.13 - stelem.r4 - ldloc.0 - ldc.i4.0 - ldelema [mscorlib]System.Single - stloc.1 - ldloc.1 - conv.i - ldind.u4 - stloc.2 - ldc.i4.0 - ret - } - - .method public static int32 test_7_conv_ovf_u8_un () { - .maxstack 2 - .locals init (unsigned int64) - - ldc.i4.7 - conv.ovf.u8.un - stloc.0 - ldloc.0 - conv.i4 - ret - } - - .method public static int32 test_7_conv_ovf_u4_un () { - .maxstack 2 - .locals init (unsigned int32) - - ldc.i4.7 - conv.ovf.u4.un - stloc.0 - ldloc.0 - conv.i4 - ret - } - - .method public static int32 test_1_bug_74591 () { - .maxstack 16 - .locals init (int32) - - ldc.i4.m1 - stloc.0 - ldloc.0 - conv.ovf.i8 - ldc.i4.m1 - conv.ovf.i8 - mul.ovf - conv.i4 - ret - } - - .class nested public auto ansi Integer - extends [mscorlib]System.Object { - - .field public bool n - - .method public hidebysig specialname rtspecialname - instance default void .ctor (unsigned int64 i, bool n) cil managed - { - .maxstack 8 - ldarg.0 - call instance void class [mscorlib]System.Object::.ctor() - ldarg.0 - ldarg.2 - stfld bool Tests/Integer::n - ret - } - } - - .method public static int32 test_1_bug_74726 () { - .maxstack 16 - - ldc.i4.2 - conv.ovf.u8 - ldc.i4.1 - conv.ovf.u8 - mul.ovf.un - ldc.i4.1 - newobj instance void class Tests/Integer::.ctor(unsigned int64, bool) - ldfld bool Tests/Integer::n - ldc.i4.1 - ceq - ret - } - - .class nested private auto ansi sealed xxx - extends [mscorlib]System.ValueType - { - .field public object a - - .method public hidebysig specialname rtspecialname - instance default void .ctor () cil managed - { - .maxstack 8 - ret - } - } // end of class xxx - - .method public static int32 test_0_newobj_vtype () { - .maxstack 6 - .locals init ( - valuetype Tests/xxx V_0 - ) - - newobj instance void valuetype Tests/xxx::.ctor () - stloc.0 - ldloca.s 0 - ldfld object Tests/xxx::a - brfalse OK - ldc.i4.s 1 - ret - OK: - ldc.i4.s 0 - ret - } - - .method public static int32 test_0_newobj_vtype_primitive () { - .maxstack 6 - .locals init ( - native int V_0 - ) - - ldc.i4.s 10 - newobj instance void native int::'.ctor'(int32) - stloc.0 - ldloc.0 - ldc.i4.s 10 - beq OK - ldc.i4.s 1 - ret - OK: - ldc.i4.s 0 - ret - } - - .method public static int32 test_1_filters () { - .maxstack 16 - .locals init ( - int32 res - ) - - .try { // 0 - .try { - ldstr "OnErrorSub test Exception" - newobj instance void class [mscorlib]System.Exception::.ctor(string) - throw - leave.s IL_0033 - } - filter { - pop - ldc.i4.0 - endfilter - } { - pop - // Should not be called - ldc.i4.2 - stloc res - leave.s IL_0033 - } - } - filter { - pop - ldc.i4.1 - endfilter - } { - pop - ldc.i4.1 - stloc res - leave.s IL_0033 - - } - IL_0033: - ldloc res - ret - } - - .class nested private auto ansi sealed beforefieldinit TheStruct - extends [mscorlib]System.ValueType { - .field public int32 a - .field public int32 b - } - - .method public static int32 test_5_cpobj () { - .maxstack 8 - .locals init ( - valuetype Tests/TheStruct v_0, - valuetype Tests/TheStruct v_1 - ) - - ldloca v_0 - ldc.i4.2 - stfld int32 Tests/TheStruct::a - - ldloca v_0 - ldc.i4.3 - stfld int32 Tests/TheStruct::b - - ldloca v_1 - ldloca v_0 - cpobj Tests/TheStruct - - ldloca v_1 - ldfld int32 Tests/TheStruct::a - ldloca v_1 - ldfld int32 Tests/TheStruct::b - add - - ret - } - - .method public static int32 test_5_ldobj_stloc_optimization () { - .maxstack 8 - .locals init ( - valuetype Tests/TheStruct v_0, - valuetype Tests/TheStruct v_1 - ) - - ldloca v_0 - ldc.i4.2 - stfld int32 Tests/TheStruct::a - - ldloca v_0 - ldc.i4.3 - stfld int32 Tests/TheStruct::b - - ldloca v_0 - ldobj valuetype Tests/TheStruct - stloc.s v_1 - - ldloca v_1 - ldfld int32 Tests/TheStruct::a - ldloca v_1 - ldfld int32 Tests/TheStruct::b - add - - ret - } - - .method public static int32 test_1_cpobj_reference () { - .maxstack 8 - .locals init ( - object v_0, - object v_1 - ) - - newobj instance void object::.ctor() - stloc v_0 - - ldloca v_1 - ldloca v_0 - cpobj object - - ldloc v_0 - ldloc v_1 - ceq - ret - } - - .method public static int32 test_1_initobj_reference () { - .maxstack 8 - .locals init ( - object v_0 - ) - - newobj instance void object::.ctor() - stloc v_0 - - ldloca v_0 - initobj object - - ldloc v_0 - ldnull - ceq - ret - } - - .method public static int32 test_1_ldobj_reference () { - .maxstack 8 - .locals init ( - object v_0 - ) - - newobj instance void object::.ctor() - stloc v_0 - - ldloc v_0 - ldloca v_0 - ldobj object - ceq - ret - } - - .method public static int32 test_5_vtype_on_bb_boundary () { - .maxstack 8 - .locals init ( - valuetype Tests/TheStruct v_0, - valuetype Tests/TheStruct v_1 - ) - - ldloca v_0 - ldc.i4.2 - stfld int32 Tests/TheStruct::a - - ldloca v_0 - ldc.i4.3 - stfld int32 Tests/TheStruct::b - - ldloc v_0 - br L_0 - L_0: stloc v_1 - - ldloca v_1 - ldfld int32 Tests/TheStruct::a - ldloca v_1 - ldfld int32 Tests/TheStruct::b - add - ret - } - - .method public static int32 test_5_different_in_stacks () cil managed { - .maxstack 16 - - ldc.i4.1 - ldc.i4.1 - beq L_0 - - ldc.i4.3 - ldc.i4.3 - br L_1 - ldc.i4.3 - ldc.i4.3 - br L_2 - L_0: ldc.i4.2 - ldc.i4.3 - ldc.i4.1 - ldc.i4.1 - beq L_2 - L_1: add - ret - L_2: add - ret - } - - .method public static int32 test_3_larray_get_set () { - .locals init ( - int32[2] V_0) - - ldc.i4.2 - newobj instance void int32[0...]::.ctor(int32) - stloc.0 - ldloc.0 - ldc.i4.0 - ldc.i4 1 - call instance void int32[0...]::Set(int32, int32) - ldloc.0 - ldc.i4.1 - ldc.i4 2 - call instance void int32[0...]::Set(int32, int32) - - ldloc.0 - ldc.i4.0 - call instance int32 int32[0...]::Get(int32) - ldloc.0 - ldc.i4.1 - call instance int32 int32[0...]::Get(int32) - add - ret - } - - .method public static int32 test_0_pop_side_effects () { - .try { - ldc.r8 1 - ldc.r8 0 - div - ckfinite - pop - leave FAIL - } - catch [mscorlib]System.ArithmeticException { - pop - leave L_0 - } - L_0: - ldc.i4.0 - ret - FAIL: - ldc.i4.1 - ret - } - - .method public static void regalloc_regress_78314_helper (object o) cil managed - { - ret - } - - .method public static int32 test_1_regalloc_regress_78314 () cil managed - { - // Code size 68 (0x44) - .maxstack 6 - .locals init (int32 V_0, bool V_1) - IL_0000: ldc.i4.0 - IL_0001: stloc.0 - IL_0002: br.s IL_003b - - IL_0004: - IL_001e: ldc.i4.s 10 - IL_0020: ldloc.0 - IL_0021: shl - IL_0022: ldc.i4.s 10 - IL_0024: ldloc.0 - IL_0025: shl - IL_0026: ceq - IL_0028: box [mscorlib]System.Boolean - IL_0032: call void Tests::regalloc_regress_78314_helper(object) - IL_0037: ldloc.0 - IL_0038: ldc.i4.1 - IL_0039: add - IL_003a: stloc.0 - IL_003b: ldloc.0 - IL_003c: ldc.i4.8 - IL_003f: blt.s IL_0004 - - ldloc.0 - ldc.i4.8 - ceq - conv.i4 - ret - } - - .method public static void try_block_end_remove_if_useless () cil managed { - .maxstack 8 - - T_START: - ldstr "Start" - pop - leave.s COMPLETE - T1_END: - - COMPLETE: - ret - - F1_START: - ldstr "Finally1" - pop - endfinally - F1_END: - - .try T_START to T1_END finally handler F1_START to F1_END - } - - .method public static int32 test_0_try_block_end_remove_if_useless () cil managed { - call void class Tests::try_block_end_remove_if_useless () - ldc.i4.0 - ret - } - - .method public static int32 test_0_regress_78629_switch_next_ins_target () cil managed - { - ldc.i4.0 - switch (target) - target: ldstr "bar" - pop - ldc.i4.0 - ret - } - - // This belongs to basic-float.cs, but its hard to tell mcs/csc to - // generate the non .un version of the opcodes - .method public static hidebysig - default int32 test_4_float_branch_nan () cil managed - { - // Method begins at RVA 0x27a4 - // Code size 74 (0x4a) - .maxstack 2 - .locals init ( - float64 V_0, - float64 V_1, - int32 V_2) - IL_0000: ldc.r8 (00 00 00 00 00 00 f8 ff) - IL_0009: stloc.0 - IL_000a: ldc.r8 1. - IL_0013: stloc.1 - IL_0014: ldc.i4.0 - IL_0015: stloc.2 - IL_0016: ldloc.0 - IL_0017: ldloc.1 - IL_0018: bge.s IL_001a - - br L1 - IL_001a: ldloc.2 - IL_001b: ret - L1: - IL_001c: ldloc.2 - IL_001d: ldc.i4.1 - IL_001e: add - IL_001f: stloc.2 - IL_0020: ldloc.0 - IL_0021: ldloc.1 - IL_0022: ble.s IL_002e - br L2 - IL_002e: ldloc.2 - IL_002f: ret - L2: - IL_0030: ldloc.2 - IL_0031: ldc.i4.1 - IL_0032: add - IL_0033: stloc.2 - IL_0034: ldloc.0 - IL_0035: ldloc.1 - IL_0036: blt.s IL_0038 - br L3 - IL_0038: ldloc.2 - IL_0039: ret - L3: - IL_003a: ldloc.2 - IL_003b: ldc.i4.1 - IL_003c: add - IL_003d: stloc.2 - IL_003e: ldloc.0 - IL_003f: ldloc.1 - IL_0040: bgt.s IL_0042 - br L4 - IL_0042: ldloc.2 - IL_0043: ret - L4: - IL_0044: ldloc.2 - IL_0045: ldc.i4.1 - IL_0046: add - IL_0047: stloc.2 - IL_0048: ldloc.2 - IL_0049: ret - } // end of method Tests::test_5_float_branch_nan - - .method private static hidebysig - default void regress_80622_inner (object x) cil managed - { - .locals (unsigned int8 i) - // Method begins at RVA 0x2050 - // Code size 14 (0xe) - .maxstack 8 - IL_1000: ldarg.0 - IL_1001: unbox unsigned int8 - IL_1006: ldobj unsigned int8 - IL_000b: conv.ovf.i4.un - IL_000c: pop - IL_000d: ret - } - - // method line 2 - .method public static hidebysig - default int32 test_0_regress_80622 () cil managed - { - .maxstack 8 - IL_0000: ldc.i4 255 - IL_0005: box unsigned int8 - IL_000a: call void class Tests::regress_80622_inner (object) - ldc.i4.0 - IL_000f: ret - } - - .method public static default int32 test_0_regress_80190 () cil managed - { - .maxstack 2 - .locals init (int32 V_0, - int32* V_1) - IL_0000: nop - IL_0001: nop - IL_0002: ldloca.s V_0 - IL_0004: conv.u - IL_0005: stloc.1 - IL_0006: ldloc.1 - IL_0007: ldc.i4.3 - IL_0008: stind.i4 - IL_0009: nop - ldc.i4.0 - ret - } - - .class interface nested public auto ansi abstract IFaceWithStaticMethod - { - .method public static specialname - default void foo () cil managed noinlining - { - .maxstack 0 - IL_0000: ret - } - } - - .class nested public auto ansi AClass extends [mscorlib]System.Object implements Tests/IFaceWithStaticMethod - { - .method public hidebysig specialname rtspecialname - instance default void .ctor () cil managed - { - .maxstack 8 - ret - } - - } - - // Test that static methods in interfaces are ignored during vtable construction - .method public static default int32 test_0_ifaces_with_static_methods () cil managed - { - .maxstack 16 - - newobj instance void class Tests/AClass::.ctor() - pop - ldc.i4.0 - ret - } - - .method private static hidebysig default int32 Foo (!!T n) cil managed { - ldarg.0 - box !!0 - brtrue HAS_VALUE - ldc.i4.0 - ret -HAS_VALUE: ldc.i4.1 - ret - } - - // bug 78019 - .method static public int32 test_0_nullable_box_brtrue () cil managed { - - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - - ldloc.0 - call int32 class Tests::Foo> (!!0) - ret - } - - //Bug 372410 - .method static public int32 test_0_ldelema_type_check () cil managed { - .maxstack 16 - .locals init (object[] V_0, - object[,] V_1) - - ldc.i4.1 - newarr object - stloc.0 - - .try { - ldloc.0 - ldc.i4.0 - ldelema object - leave L1 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave ERROR1 - } - - L1: - ldc.i4.1 - newarr string - stloc.0 - - .try { - ldloc.0 - ldc.i4.0 - ldelema object - leave ERROR2 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave L2 - } - - L2: - ldc.i4.1 - newarr string - stloc.0 - - .try { - ldloc.0 - ldc.i4.0 - readonly. ldelema object - leave L3 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave ERROR3 - } - - L3: - ldc.i4.0 - ret - - - ERROR1: - ldc.i4.1 - ret - - ERROR2: - ldc.i4.2 - ret - - ERROR3: - ldc.i4.3 - ret - } - - - //Bug 372410 - .method static public int32 test_0_array_address_type_check () cil managed { - .maxstack 16 - .locals init (object[] V_0, - object[,] V_1) - - ldc.i4.1 - ldc.i4.1 - newobj instance void object[,]::.ctor(int32, int32) - stloc.1 - - .try { - ldloc.1 - ldc.i4.0 - ldc.i4.0 - call instance object& object[,]::Address(int32, int32) - leave L4 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave ERROR4 - } - - L4: - ldc.i4.1 - ldc.i4.1 - newobj instance void string[,]::.ctor(int32, int32) - stloc.1 - - .try { - ldloc.1 - ldc.i4.0 - ldc.i4.0 - call instance object& object[,]::Address(int32, int32) - leave ERROR5 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave L5 - } - - L5: - ldc.i4.1 - ldc.i4.1 - newobj instance void string[,]::.ctor(int32, int32) - stloc.1 - - .try { - ldloc.1 - ldc.i4.0 - ldc.i4.0 - readonly. call instance object& object[,]::Address(int32, int32) - leave L6 - } catch [mscorlib]System.ArrayTypeMismatchException { - leave ERROR6 - } - - L6: - ldc.i4.0 - ret - ERROR4: - ldc.i4.4 - ret - - ERROR5: - ldc.i4.5 - ret - - ERROR6: - ldc.i4.6 - ret - } - - .field public static unsigned int64 'ull' - - .field public static int32 'shift2' - - .method public static int32 test_0_long_shift_regalloc () cil managed - { - .locals (unsigned int32 'cilsimp.28', unsigned int64 'cilsimp.27', int32 'cilsimp.26') - - .maxstack 4 - - ldc.i8 81985529234382576 - stsfld unsigned int64 Tests::ull - ldc.i4 60 - stsfld int32 Tests::shift2 - - ldsfld unsigned int64 Tests::ull - stloc 'cilsimp.27' - ldsfld int32 Tests::shift2 - stloc 'cilsimp.28' - ldloc 'cilsimp.27' - ldloc 'cilsimp.28' - shr.un - ldloc 'cilsimp.27' - ldc.i4 64 - ldloc 'cilsimp.28' - sub - shl - or - ldc.i8 1311768467750121216 - ceq - ldc.i4.1 - xor - conv.u4 - ret - } - - // Test calling ldfld directly on a vtype instead of a vtype address - .method public static int32 test_5_call_ldfld_vtype () cil managed - { - .maxstack 16 - .locals init ( - valuetype Tests/TailCallStruct arg - ) - ldloca 0 - ldc.i4.2 - stfld int32 Tests/TailCallStruct::a - ldloca 0 - ldc.i4.4 - stfld int32 Tests/TailCallStruct::b - ldloc.0 - call valuetype Tests/TailCallStruct Tests::tail2 (valuetype Tests/TailCallStruct) - ldfld int32 Tests/TailCallStruct::a - ret - } - - .method public static int32 throw_ret () cil managed - { - ldstr "FOO" - newobj instance void class [mscorlib]System.OverflowException::.ctor(string) - throw - ldc.i4.4 - ret - } - - .method public static int32 throw2_ret () cil managed - { - // Disable inlining - ldc.i4.5 - localloc - pop - - call int32 Tests::throw_ret () - ret - } - - // Test inlining a method which contains just a throw - .method public static int32 test_0_inline_throw () cil managed - { - .maxstack 16 - .locals init ( - int32 v_0 - ) - - .try { - call int32 Tests::throw2_ret () - stloc.0 - leave L0 - } catch [mscorlib]System.OverflowException { - pop - leave L1 - } - - L0: - ldc.i4.1 - ret - L1: - ldc.i4.0 - ret - } - - .method public static int32 test_0_stelem_any_null_opt () cil managed - { - .maxstack 16 - .locals init ( - object[] V_0, - int32 V_1) - - ldc.i4.s 10 - newarr [mscorlib]System.Object - stloc.0 - - ldc.i4.0 - stloc.1 - br L0 - - L1: - ldloc.0 - ldloc.1 - ldnull - stelem.any [mscorlib]System.Object - ldloc.1 - ldc.i4.1 - add - stloc.1 - L0: - ldloc.1 - ldc.i4.s 10 - blt L1 - - ldc.i4.0 - ret - } - - // method line 2 - .method public static hidebysig - default int32 manyargs_callee (int32 a, int32 b, int32 c, int32 d, int32 e, int32 f, int32 g, int32 h, int32 i, int32 j, int32 k, int32 l, int32 m, int32 n, int32 o, int32 p) cil managed - { - // Method begins at RVA 0x20f4 - // Code size 44 (0x2c) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: add - IL_0003: ldarg.2 - IL_0004: add - IL_0005: ldarg.3 - IL_0006: add - IL_0007: ldarg.s 4 - IL_0009: add - IL_000a: ldarg.s 5 - IL_000c: add - IL_000d: ldarg.s 6 - IL_000f: add - IL_0010: ldarg.s 7 - IL_0012: add - IL_0013: ldarg.s 8 - IL_0015: add - IL_0016: ldarg.s 9 - IL_0018: add - IL_0019: ldarg.s 10 - IL_001b: add - IL_001c: ldarg.s 11 - IL_001e: add - IL_001f: ldarg.s 12 - IL_0021: add - IL_0022: ldarg.s 13 - IL_0024: add - IL_0025: ldarg.s 14 - IL_0027: add - IL_0028: ldarg.s 15 - IL_002a: add - IL_002b: ret - } // end of method main::callee - - // method line 3 - .method public static hidebysig - default int32 manyargs_tail_caller (int32 a, int32 b, int32 c, int32 d, int32 e, int32 f, int32 g, int32 h, int32 i, int32 j, int32 k, int32 l, int32 m, int32 n, int32 o, int32 p) cil managed - { - // Method begins at RVA 0x2124 - // Code size 34 (0x22) - .maxstack 17 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: ldarg.2 - IL_0003: ldarg.3 - IL_0004: ldarg.s 4 - IL_0006: ldarg.s 5 - IL_0008: ldarg.s 6 - IL_000a: ldarg.s 7 - IL_000c: ldarg.s 8 - IL_000e: ldarg.s 9 - IL_0010: ldarg.s 10 - IL_0012: ldarg.s 11 - IL_0014: ldarg.s 12 - IL_0016: ldarg.s 13 - IL_0018: ldarg.s 14 - IL_001a: ldarg.s 15 - tail. - IL_001c: call int32 class Tests::manyargs_callee(int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32) - IL_0021: ret - } // end of method main::caller - - // method line 4 - .method public static hidebysig - default int32 test_0_many_args_tail_call () cil managed - { - - // Method begins at RVA 0x2154 - // Code size 43 (0x2b) - .maxstack 17 - IL_0000: ldc.i4.1 - IL_0001: ldc.i4.2 - IL_0002: ldc.i4.3 - IL_0003: ldc.i4.4 - IL_0004: ldc.i4.5 - IL_0005: ldc.i4.6 - IL_0006: ldc.i4.7 - IL_0007: ldc.i4.8 - IL_0008: ldc.i4.s 0x09 - IL_000a: ldc.i4.s 0x0a - IL_000c: ldc.i4.s 0x0b - IL_000e: ldc.i4.s 0x0c - IL_0010: ldc.i4.s 0x0d - IL_0012: ldc.i4.s 0x0e - IL_0014: ldc.i4.s 0x0f - IL_0016: ldc.i4.s 0x10 - IL_0018: call int32 class Tests::manyargs_tail_caller(int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32, int32) - IL_001d: ldc.i4 136 - IL_0022: beq IL_0029 - - IL_0027: ldc.i4.1 - IL_0028: ret - IL_0029: ldc.i4.0 - IL_002a: ret - } // end of method main::Main - - .class nested private auto ansi beforefieldinit R1 - extends [mscorlib]System.MarshalByRefObject - { - .field public int32 test_field - - .method public hidebysig specialname rtspecialname - instance default void '.ctor' () cil managed - { - ret - } - } - - .method public static hidebysig - default int32 return_0 () cil managed - { - ldc.i4.0 - ret - } - - .method public static hidebysig - default int32 test_1_volatile_marshalbyref_bug_432673 () cil managed - { - .locals init ( - class Tests/R1 v_0 - ) - - newobj instance void class Tests/R1::.ctor () - stloc.0 - ldloc.0 - ldc.i4.0 - volatile. - stfld int32 Tests/R1::test_field - call int32 class Tests::return_0 () - ldc.i4.1 - add - ret - } - - .method public static default int32 return_2 () cil managed - { - // Prevent inlining - ldc.i4.s 16 - localloc - pop - ldc.i4.s 2 - ret - } - - .method public static hidebysig - default int32 test_1_cmov_opt_regress_463357 () cil managed - { - call int32 class Tests::return_2 () - ldc.i4.0 - ceq - brfalse L1 - ldc.i4.0 - ret - br L2 - L1: nop - L2: nop - ldc.i4.1 - ret - } - - .method public static hidebysig default int32 cmov_opt_regress_474718_inner (int32 A_1) cil managed - { - .maxstack 3 - .locals init (int32 V_0, bool V_1, bool V_2) - - ldc.i4.0 - IL_000b: stloc.1 - IL_000d: br IL_002f - - ldc.i4.1 - stloc.2 - IL_001e: ldloc.2 - IL_001f: brfalse IL_0036 - - IL_0024: - IL_002a: br IL_0041 - - IL_002f: ldloc.1 - IL_0030: stloc.2 - IL_0031: br IL_001e - - IL_0036: ldc.i4 0 - IL_003b: stloc.0 - IL_003c: br IL_0041 - - IL_0041: ldloc.0 - IL_0042: ret - } - - .method public static default int32 test_0_cmov_opt_regress_474718 () cil managed - { - .maxstack 16 - ldc.i4.1 - call int32 Tests::cmov_opt_regress_474718_inner (int32) - ret - } - - .method public static default int32 test_5_createarr_newobj () cil managed - { - .maxstack 16 - - ldc.i4 5 - newobj instance void char[]::.ctor(int32) - ldlen - ret - } - - .method public static default int32 test_0_initblk_3_regress_481458 () cil managed - { - .maxstack 16 - .locals init (native int) - - ldc.i4.s 10 - localloc - stloc.0 - - // Set the first value to 3 - ldloc.0 - ldc.i4.0 - add //addr - ldc.i4.3 //value - stind.i1 - - // Zero out the first 3 values - ldloc.0 //addr - ldc.i4.0 //value - ldc.i4.s 3 //size - initblk - - // Load the first value - ldloc.0 - ldc.i4.0 - add - ldind.u1 - conv.i4 - ret - } - - .method public static float32 GetFloat32() cil managed noinlining - { - .maxstack 8 - ldc.r8 0.19975845134874831 - ret - } - -/* Disabled until they can be fixed to run on amd64 - .method public static default int32 test_0_implicit_float_to_double_conversion () cil managed - { - .maxstack 16 - - call float32 Tests::GetFloat32() - ldc.r8 0.19975845134874831 - beq OK - - ldc.i4.1 - ret -OK: - ldc.i4.0 - ret - } -*/ - - .method public static default int32 test_0_long_to_r8_un_overflow () cil managed - { - .maxstack 16 - ldc.i8 0x00FFFFFFFFFFFFFF - conv.r.un - conv.i8 - ldc.i8 0x100000000000000 - beq OK_1 - - ldc.i4.1 - ret -OK_1: - ldc.i8 0x00FFFFFFFFFFFFFF - conv.r.un - conv.r8 - conv.i8 - ldc.i8 0x100000000000000 - beq OK_2 - - ldc.i4.2 - ret -OK_2: - ldc.i4.0 - ret - } - - .field public static int32 shift1 - - .method public static int32 regress_497271_helper (int32 i) cil managed - { - ldarg.0 - ret - } - - .method public static int32 test_0_regalloc_regress_497271 () cil managed - { - .locals (int32 var) - - ldc.i4 4 - stsfld int32 Tests::shift1 - ldsfld int32 Tests::shift1 - stloc var - ldc.i4 4660 - ldloc var - shr.un - ldc.i4 4660 - ldc.i4 32 - ldloc var - sub - shl - or - ldc.i4 1073742115 - beq ?L10 -?L9: - ldc.i4 1 - call int32 Tests::regress_497271_helper (int32) - ret -?L10: - ldc.i4 0 - call int32 Tests::regress_497271_helper (int32) - ret - } - - .field private static int32 Value - - .method public static hidebysig specialname - default int32 regress_513931_inner () cil managed - { - // Method begins at RVA 0x225c - // Code size 52 (0x34) - .maxstack 2 - .locals init ( - int32 V_0, - int32 V_1, - bool V_2) - - ldc.i4 999 - stsfld int32 Tests::Value - - IL_0000: nop - IL_0001: ldsfld int32 Tests::Value - IL_0006: stloc.0 - IL_0007: ldloc.0 - IL_0008: ldc.i4.0 - IL_0009: cgt - IL_000b: ldc.i4.0 - IL_000c: ceq - IL_000e: stloc.2 - IL_000f: ldloc.2 - IL_0010: brtrue.s IL_0027 - - IL_0012: nop - IL_0013: ldloc.0 - IL_0014: ldc.i4.s 0x7b - IL_0016: ceq - IL_0018: ldc.i4.0 - IL_0019: ceq - IL_001b: stloc.2 - IL_001c: ldloc.2 - IL_001d: brtrue.s IL_0023 - - IL_001f: ldc.i4.m1 - IL_0020: stloc.1 - IL_0021: br.s IL_0032 - - IL_0023: ldc.i4.1 - IL_0024: stloc.1 - IL_0025: br.s IL_0032 - - IL_0027: - IL_002c: newobj instance void class [mscorlib]System.Exception::'.ctor'() - IL_0031: throw - IL_0032: ldloc.1 - IL_0033: ret - } - - .method public static hidebysig specialname - default int32 test_0_regress_513931 () cil managed - { - call int32 Tests::regress_513931_inner () - pop - ldc.i4.0 - ret - } - - .method public static default int32 test_0_newarr_i8 () cil managed - { - ldc.i4 1000 - conv.i8 - newarr [mscorlib]System.Boolean - pop - ldc.i4 0 - ret - } - - .method public static specialname - default int32 return_1_noinline () cil managed noinlining - { - .maxstack 0 - - ldc.i4.1 - ret - } - - // Only happens with -O=-deadce,cmov - .method public static default int32 test_0_cmov_unused_582322 () cil managed - { - .maxstack 2 - .locals init ( - int32 V_0 - ) - call int32 Tests::return_1_noinline () - ldc.i4.1 - bne.un L0 - ldloc.s 0 - pop - L0: - ldc.i4.0 - ret - } - - .method public static hidebysig - default int32 test_0_regress_586664 () cil managed - { - // Method begins at RVA 0x20f4 - // Code size 76 (0x4c) - .maxstack 6 - .locals init ( - float64 V_0, - float64[] V_1) - IL_0000: ldc.r8 1. - IL_0009: ldc.r8 2. - IL_0012: ldc.r8 1. - IL_001b: call float64 class [mscorlib]System.Math::Pow(float64, float64) - IL_0020: div - IL_0021: stloc.0 - IL_0022: ldc.i4.2 - IL_0023: newarr [mscorlib]System.Double - IL_0028: dup - IL_0029: ldc.i4.0 - IL_002a: ldloc.0 - IL_002b: neg - IL_002c: stelem.r8 - IL_002d: dup - IL_002e: ldc.i4.1 - IL_002f: ldloc.0 - IL_0030: neg - IL_0031: stelem.r8 - IL_0032: stloc.1 - IL_0033: ldloc.1 - IL_0034: ldc.i4.0 - IL_0035: ldelem.r8 - IL_0036: ldc.r8 -0.5 - IL_003f: bne.un IL_004a - - IL_0044: ldc.i4.0 - IL_0045: br IL_004b - - IL_004a: ldc.i4.1 - IL_004b: ret - } - - .method public static int32 test_2_leave_multiple_blocks_from_end () - { - .locals init (int32 V_0) - - .try { - .try { - nop - nop - leave END - } finally { - ldloc.0 - ldc.i4.1 - add - stloc.0 - endfinally - } - nop - leave END - } finally { - ldloc.0 - ldc.i4.1 - add - stloc.0 - endfinally - } -END: - ldloc.0 - ret - } - - .method public static int32 test_3_leave_multiple_blocks_from_hole () - { - .locals init (int32 V_0) - - .try { - .try { - ldloc.0 - brtrue REST - leave BEFORE_END -REST: - nop - nop - leave END - } finally { - ldloc.0 - ldc.i4.1 - add - stloc.0 - endfinally - } - nop - leave END - } finally { - ldloc.0 - ldc.i4.1 - add - stloc.0 - endfinally - } -BEFORE_END: - ldloc.0 - ldc.i4.1 - add - stloc.0 -END: - ldloc.0 - ret - } - - .class nested private auto ansi sealed beforefieldinit Pair`2 - extends [mscorlib]System.ValueType - { - .field public !0 key - .field public !1 'value' - } - - .method private static hidebysig - default bool ContentEquals (valuetype Tests/Pair`2 v) cil managed - { - .maxstack 8 - IL_0000: ldarga.s 0 - IL_0006: ldnull - constrained. valuetype Tests/Pair`2 - IL_0007: callvirt instance bool class [mscorlib]System.Object::Equals(object) - ret - } - - .method public static hidebysig default int32 test_0_constrained_gshared_595863 () cil managed - { - .locals init ( - valuetype Tests/Pair`2 V_0, - valuetype Tests/Pair`2 V_1) - IL_0000: ldloca.s 0 - IL_0002: initobj valuetype Tests/Pair`2 - IL_0008: ldloc.0 - IL_0009: stloc.1 - IL_000a: ldloca.s 1 - IL_000c: ldstr "A" - IL_0011: stfld !0 valuetype Tests/Pair`2::key - IL_0016: ldloca.s 1 - IL_0018: ldstr "B" - IL_001d: stfld !1 valuetype Tests/Pair`2::'value' - IL_0022: ldloc.1 - IL_0023: stloc.0 - IL_0024: ldloc.0 - IL_0025: call bool class Tests::ContentEquals (valuetype Tests/Pair`2) - brfalse SUCCESS - ldc.i4.1 - ret - SUCCESS: - ldc.i4.0 - ret - } - - .method public static default int32 test_0_wrap_non_exception_throws () cil managed - { - .try { - newobj instance void class [mscorlib]System.Object::'.ctor'() - throw - leave IL_0 - } catch class [mscorlib]System.Runtime.CompilerServices.RuntimeWrappedException { - leave IL_0 - } - IL_0: - ldc.i4.0 - ret - } - - .method public static default int32 test_0_typespec_modopt () cil managed { - ldtoken class Tests modopt (Tests) - pop - ldc.i4.0 - ret - } - - .method public hidebysig static int32 SizeOfT() cil managed - { - .maxstack 8 - - sizeof !!0 - ret - } - - .method public static default int32 test_1_sizeof_gshared () cil managed { - call int32 Tests::SizeOfT() - ldc.i4.1 - ceq - ret - } -} diff --git a/Users/Orvid/IL2CPU Tester/TestDriverGenerator/GenMethodList.cs b/Users/Orvid/IL2CPU Tester/TestDriverGenerator/GenMethodList.cs deleted file mode 100644 index e7059272f6..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestDriverGenerator/GenMethodList.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Reflection; -using System.IO; -using System.Text.RegularExpressions; -using System.Collections.Generic; - -public class MyClass -{ - public static void RunSnippet() - { - Regex r = new Regex("test_\\d+_"); - StreamWriter s = new StreamWriter("Mthds.txt"); - Assembly a = Assembly.LoadFrom("CsTests.dll"); - foreach (Type t in a.GetTypes()) - { - foreach (MethodInfo m in t.GetMethods()) - { - if (r.IsMatch(m.Name)) - { - s.WriteLine("if (Tests." + m.Name + "() != " + r.Match(m.Name).Value.Substring(5, r.Match(m.Name).Value.Length - 6) + ")"); - s.WriteLine("{"); - s.WriteLine("\tConsole.WriteLine(\"Test '" + m.Name + "' didn't return expected value. Expected: '" + r.Match(m.Name).Value.Substring(5, r.Match(m.Name).Value.Length - 6) + "' Got: '\" + Tests." + m.Name + "().ToString() + \"'\");"); - s.WriteLine("}"); - } - } - } - s.Flush(); - s.Close(); - } - - #region Helper methods - - public static void Main() - { - try - { - RunSnippet(); - } - catch (Exception e) - { - string error = string.Format("---\nThe following error occurred while executing the snippet:\n{0}\n---", e.ToString()); - Console.WriteLine(error); - } - finally - { - Console.Write("Press any key to continue..."); - Console.ReadKey(); - } - } - - private static void WL(object text, params object[] args) - { - Console.WriteLine(text.ToString(), args); - } - - private static void RL() - { - Console.ReadLine(); - } - - private static void Break() - { - System.Diagnostics.Debugger.Break(); - } - - #endregion -} \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/Kernel.cs b/Users/Orvid/IL2CPU Tester/TestKernel/Kernel.cs deleted file mode 100644 index 5131796b70..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/Kernel.cs +++ /dev/null @@ -1,31 +0,0 @@ -#pragma warning disable 162 -// The compiler doesn't like the fact that true == true might not necessarily be true. -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace TestKernel -{ - public class Kernel : Sys.Kernel - { - public Kernel() : base() - { - this.ClearScreen = false; - } - protected override void BeforeRun() { } - - public void DoRun() - { - this.Run(); - } - - protected override void Run() - { - IL2CPUTester.TestDriver.RunTests(); - - //while (true) { } // Prevent the check from being run again, and display results. - } - } -} -#pragma warning restore 162 \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/Microsoft.NetLog.txt b/Users/Orvid/IL2CPU Tester/TestKernel/Microsoft.NetLog.txt deleted file mode 100644 index c634f98be2..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/Microsoft.NetLog.txt +++ /dev/null @@ -1,5 +0,0 @@ -Test 'test_0_pass_float_ret_double' didn't return expected value. Expected: '0' Got: '11' -Test 'test_0_float_precision' didn't return expected value. Expected: '0' Got: '1' -Test 'test_0_tan_precision' didn't return expected value. Expected: '0' Got: '1' -Test 'test_0_atan_precision' didn't return expected value. Expected: '0' Got: '1' -Test 'test_0_rethrow_stacktrace' didn't return expected value. Expected: '0' Got: '1' diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/MonoLog.txt b/Users/Orvid/IL2CPU Tester/TestKernel/MonoLog.txt deleted file mode 100644 index c22c98d8ba..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/MonoLog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Test 'test_0_pass_float_ret_double' didn't return expected value. Expected: '0' Got: '11' -Test 'test_0_multiple_cctor_calls_regress_679467' didn't return expected value. Expected: '0' Got: '0' diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/Program.cs b/Users/Orvid/IL2CPU Tester/TestKernel/Program.cs deleted file mode 100644 index 31543749c8..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using TestKernel; - -namespace StructTest -{ - public static class Program - { - public static void Main() - { - Kernel k = new Kernel(); - k.DoRun(); - } - - } -} diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/TestDriver.cs b/Users/Orvid/IL2CPU Tester/TestKernel/TestDriver.cs deleted file mode 100644 index 25a18b70d6..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/TestDriver.cs +++ /dev/null @@ -1,2371 +0,0 @@ -using System; - -namespace IL2CPUTester -{ - public class TestDriver - { - public static void RunTests() - { - #region Tests - if (Tests.test_0_multidym_array_with_negative_lower_bound() != 0) - { - Console.WriteLine("Test 'test_0_multidym_array_with_negative_lower_bound' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multidym_array_with_negative_lower_bound().ToString() + "'"); - } - if (Tests.test_0_invalid_new_multi_dym_array_size() != 0) - { - Console.WriteLine("Test 'test_0_invalid_new_multi_dym_array_size' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_invalid_new_multi_dym_array_size().ToString() + "'"); - } - if (Tests.test_0_primitive_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_primitive_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_primitive_array_cast().ToString() + "'"); - } - if (Tests.test_0_intptr_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_intptr_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intptr_array_cast().ToString() + "'"); - } - if (Tests.test_0_sqrt_precision_and_spill() != 0) - { - Console.WriteLine("Test 'test_0_sqrt_precision_and_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sqrt_precision_and_spill().ToString() + "'"); - } - if (Tests.test_0_div_precision_and_spill() != 0) - { - Console.WriteLine("Test 'test_0_div_precision_and_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_div_precision_and_spill().ToString() + "'"); - } - if (Tests.test_0_sqrt_nan() != 0) - { - Console.WriteLine("Test 'test_0_sqrt_nan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sqrt_nan().ToString() + "'"); - } - if (Tests.test_0_sin_nan() != 0) - { - Console.WriteLine("Test 'test_0_sin_nan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sin_nan().ToString() + "'"); - } - if (Tests.test_0_cos_nan() != 0) - { - Console.WriteLine("Test 'test_0_cos_nan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cos_nan().ToString() + "'"); - } - if (Tests.test_0_tan_nan() != 0) - { - Console.WriteLine("Test 'test_0_tan_nan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_tan_nan().ToString() + "'"); - } - if (Tests.test_0_atan_nan() != 0) - { - Console.WriteLine("Test 'test_0_atan_nan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_atan_nan().ToString() + "'"); - } - if (Tests.test_0_min() != 0) - { - Console.WriteLine("Test 'test_0_min' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_min().ToString() + "'"); - } - if (Tests.test_0_max() != 0) - { - Console.WriteLine("Test 'test_0_max' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_max().ToString() + "'"); - } - if (Tests.test_0_min_un() != 0) - { - Console.WriteLine("Test 'test_0_min_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_min_un().ToString() + "'"); - } - if (Tests.test_0_max_un() != 0) - { - Console.WriteLine("Test 'test_0_max_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_max_un().ToString() + "'"); - } - if (Tests.test_0_abs() != 0) - { - Console.WriteLine("Test 'test_0_abs' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_abs().ToString() + "'"); - } - if (Tests.test_0_round() != 0) - { - Console.WriteLine("Test 'test_0_round' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_round().ToString() + "'"); - } - if (Tests.test_0_regstruct() != 0) - { - Console.WriteLine("Test 'test_0_regstruct' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regstruct().ToString() + "'"); - } - if (Tests.test_0_reg_return() != 0) - { - Console.WriteLine("Test 'test_0_reg_return' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_reg_return().ToString() + "'"); - } - if (Tests.test_0_spill_regs() != 0) - { - Console.WriteLine("Test 'test_0_spill_regs' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_regs().ToString() + "'"); - } - if (Tests.test_0_spill() != 0) - { - Console.WriteLine("Test 'test_0_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill().ToString() + "'"); - } - if (Tests.test_0_spill_void() != 0) - { - Console.WriteLine("Test 'test_0_spill_void' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_void().ToString() + "'"); - } - if (Tests.test_0_spill_ret() != 0) - { - Console.WriteLine("Test 'test_0_spill_ret' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_ret().ToString() + "'"); - } - if (Tests.test_0_struct_ret() != 0) - { - Console.WriteLine("Test 'test_0_struct_ret' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_struct_ret().ToString() + "'"); - } - if (Tests.test_0_TestSingle() != 0) - { - Console.WriteLine("Test 'test_0_TestSingle' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_TestSingle().ToString() + "'"); - } - if (Tests.test_0_pass_spill() != 0) - { - Console.WriteLine("Test 'test_0_pass_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_spill().ToString() + "'"); - } - if (Tests.test_0_pass_spill_big() != 0) - { - Console.WriteLine("Test 'test_0_pass_spill_big' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_spill_big().ToString() + "'"); - } - if (Tests.test_0_pass_struct_spill() != 0) - { - Console.WriteLine("Test 'test_0_pass_struct_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_struct_spill().ToString() + "'"); - } - if (Tests.test_0_pass_struct_spill_big() != 0) - { - Console.WriteLine("Test 'test_0_pass_struct_spill_big' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_struct_spill_big().ToString() + "'"); - } - if (Tests.test_0_pass_ret_big_struct() != 0) - { - Console.WriteLine("Test 'test_0_pass_ret_big_struct' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_ret_big_struct().ToString() + "'"); - } - if (Tests.test_0_pass_spill_struct_spill() != 0) - { - Console.WriteLine("Test 'test_0_pass_spill_struct_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_spill_struct_spill().ToString() + "'"); - } - if (Tests.test_0_pass_spill_struct_spill_big() != 0) - { - Console.WriteLine("Test 'test_0_pass_spill_struct_spill_big' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_spill_struct_spill_big().ToString() + "'"); - } - if (Tests.test_0_pass_long_odd() != 0) - { - Console.WriteLine("Test 'test_0_pass_long_odd' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_long_odd().ToString() + "'"); - } - if (Tests.test_0_pass_double_ret_float() != 0) - { - Console.WriteLine("Test 'test_0_pass_double_ret_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_double_ret_float().ToString() + "'"); - } - if (Tests.test_0_pass_float_ret_double() != 0) - { - Console.WriteLine("Test 'test_0_pass_float_ret_double' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pass_float_ret_double().ToString() + "'"); - } - if (Tests.test_0_sealed_class_devirt_right_method() != 0) - { - Console.WriteLine("Test 'test_0_sealed_class_devirt_right_method' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sealed_class_devirt_right_method().ToString() + "'"); - } - if (Tests.test_0_sealed_method_devirt_right_method() != 0) - { - Console.WriteLine("Test 'test_0_sealed_method_devirt_right_method' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sealed_method_devirt_right_method().ToString() + "'"); - } - if (Tests.test_0_sealed_class_devirt_right_method_using_delegates() != 0) - { - Console.WriteLine("Test 'test_0_sealed_class_devirt_right_method_using_delegates' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sealed_class_devirt_right_method_using_delegates().ToString() + "'"); - } - if (Tests.test_0_sealed_method_devirt_right_method_using_delegates() != 0) - { - Console.WriteLine("Test 'test_0_sealed_method_devirt_right_method_using_delegates' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sealed_method_devirt_right_method_using_delegates().ToString() + "'"); - } - if (Tests.test_0_delegate_over_static_method_devirtualize_ok() != 0) - { - Console.WriteLine("Test 'test_0_delegate_over_static_method_devirtualize_ok' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_delegate_over_static_method_devirtualize_ok().ToString() + "'"); - } - if (Tests.test_0_npe_still_happens() != 0) - { - Console.WriteLine("Test 'test_0_npe_still_happens' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_npe_still_happens().ToString() + "'"); - } - if (Tests.test_10_create() != 10) - { - Console.WriteLine("Test 'test_10_create' didn't return expected value. Expected: '10' Got: '" + Tests.test_10_create().ToString() + "'"); - } - if (Tests.test_0_unset_value() != 0) - { - Console.WriteLine("Test 'test_0_unset_value' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_unset_value().ToString() + "'"); - } - if (Tests.test_3_set_value() != 3) - { - Console.WriteLine("Test 'test_3_set_value' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_set_value().ToString() + "'"); - } - if (Tests.test_0_char_array_1() != 0) - { - Console.WriteLine("Test 'test_0_char_array_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_char_array_1().ToString() + "'"); - } - if (Tests.test_0_char_array_2() != 0) - { - Console.WriteLine("Test 'test_0_char_array_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_char_array_2().ToString() + "'"); - } - if (Tests.test_0_char_array_3() != 0) - { - Console.WriteLine("Test 'test_0_char_array_3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_char_array_3().ToString() + "'"); - } - if (Tests.test_0_byte_array() != 0) - { - Console.WriteLine("Test 'test_0_byte_array' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_byte_array().ToString() + "'"); - } - if (Tests.test_0_set_after_shift() != 0) - { - Console.WriteLine("Test 'test_0_set_after_shift' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_set_after_shift().ToString() + "'"); - } - if (Tests.test_0_newarr_emulation() != 0) - { - Console.WriteLine("Test 'test_0_newarr_emulation' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_newarr_emulation().ToString() + "'"); - } - if (Tests.test_1_bit_index() != 1) - { - Console.WriteLine("Test 'test_1_bit_index' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bit_index().ToString() + "'"); - } - if (Tests.test_2_regalloc() != 2) - { - Console.WriteLine("Test 'test_2_regalloc' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_regalloc().ToString() + "'"); - } - if (Tests.test_0_stelemref_1() != 0) - { - Console.WriteLine("Test 'test_0_stelemref_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stelemref_1().ToString() + "'"); - } - if (Tests.test_0_stelemref_2() != 0) - { - Console.WriteLine("Test 'test_0_stelemref_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stelemref_2().ToString() + "'"); - } - if (Tests.test_0_stelemref_3() != 0) - { - Console.WriteLine("Test 'test_0_stelemref_3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stelemref_3().ToString() + "'"); - } - if (Tests.test_0_stelemref_4() != 0) - { - Console.WriteLine("Test 'test_0_stelemref_4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stelemref_4().ToString() + "'"); - } - if (Tests.test_0_arrays() != 0) - { - Console.WriteLine("Test 'test_0_arrays' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_arrays().ToString() + "'"); - } - if (Tests.test_0_multi_dimension_arrays() != 0) - { - Console.WriteLine("Test 'test_0_multi_dimension_arrays' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multi_dimension_arrays().ToString() + "'"); - } - if (Tests.test_100_3_dimensional_arrays() != 100) - { - Console.WriteLine("Test 'test_100_3_dimensional_arrays' didn't return expected value. Expected: '100' Got: '" + Tests.test_100_3_dimensional_arrays().ToString() + "'"); - } - if (Tests.test_0_bug_71454() != 0) - { - Console.WriteLine("Test 'test_0_bug_71454' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bug_71454().ToString() + "'"); - } - if (Tests.test_0_interface_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_interface_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_interface_array_cast().ToString() + "'"); - } - if (Tests.test_0_regress_74549() != 0) - { - Console.WriteLine("Test 'test_0_regress_74549' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_74549().ToString() + "'"); - } - if (Tests.test_0_regress_75832() != 0) - { - Console.WriteLine("Test 'test_0_regress_75832' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_75832().ToString() + "'"); - } - if (Tests.test_0_stelem_ref_null_opt() != 0) - { - Console.WriteLine("Test 'test_0_stelem_ref_null_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stelem_ref_null_opt().ToString() + "'"); - } - if (Tests.test_0_invalid_new_array_size() != 0) - { - Console.WriteLine("Test 'test_0_invalid_new_array_size' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_invalid_new_array_size().ToString() + "'"); - } - if (Tests.test_1234_checked_i4_cast() != 1234) - { - Console.WriteLine("Test 'test_1234_checked_i4_cast' didn't return expected value. Expected: '1234' Got: '" + Tests.test_1234_checked_i4_cast().ToString() + "'"); - } - if (Tests.test_10_int_uint_compare() != 10) - { - Console.WriteLine("Test 'test_10_int_uint_compare' didn't return expected value. Expected: '10' Got: '" + Tests.test_10_int_uint_compare().ToString() + "'"); - } - if (Tests.test_0_ulong_regress() != 0) - { - Console.WriteLine("Test 'test_0_ulong_regress' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ulong_regress().ToString() + "'"); - } - if (Tests.test_0_ulong_regress2() != 0) - { - Console.WriteLine("Test 'test_0_ulong_regress2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ulong_regress2().ToString() + "'"); - } - if (Tests.test_0_assemble_long() != 0) - { - Console.WriteLine("Test 'test_0_assemble_long' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_assemble_long().ToString() + "'"); - } - if (Tests.test_0_hash() != 0) - { - Console.WriteLine("Test 'test_0_hash' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_hash().ToString() + "'"); - } - if (Tests.test_0_shift_regress() != 0) - { - Console.WriteLine("Test 'test_0_shift_regress' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_shift_regress().ToString() + "'"); - } - if (Tests.test_1234_conv_ovf_u8() != 1234) - { - Console.WriteLine("Test 'test_1234_conv_ovf_u8' didn't return expected value. Expected: '1234' Got: '" + Tests.test_1234_conv_ovf_u8().ToString() + "'"); - } - if (Tests.test_0_regress_cprop_80738() != 0) - { - Console.WriteLine("Test 'test_0_regress_cprop_80738' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_cprop_80738().ToString() + "'"); - } - if (Tests.test_0_conv_u() != 0) - { - Console.WriteLine("Test 'test_0_conv_u' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_u().ToString() + "'"); - } - if (Tests.test_0_lconv_to_u2() != 0) - { - Console.WriteLine("Test 'test_0_lconv_to_u2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_lconv_to_u2().ToString() + "'"); - } - if (Tests.test_0_beq() != 0) - { - Console.WriteLine("Test 'test_0_beq' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_beq().ToString() + "'"); - } - if (Tests.test_0_bne_un() != 0) - { - Console.WriteLine("Test 'test_0_bne_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bne_un().ToString() + "'"); - } - if (Tests.test_0_conv_r8() != 0) - { - Console.WriteLine("Test 'test_0_conv_r8' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_r8().ToString() + "'"); - } - if (Tests.test_0_conv_i() != 0) - { - Console.WriteLine("Test 'test_0_conv_i' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_i().ToString() + "'"); - } - if (Tests.test_5_conv_r4() != 5) - { - Console.WriteLine("Test 'test_5_conv_r4' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_conv_r4().ToString() + "'"); - } - if (Tests.test_0_conv_r4_m1() != 0) - { - Console.WriteLine("Test 'test_0_conv_r4_m1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_r4_m1().ToString() + "'"); - } - if (Tests.test_5_double_conv_r4() != 5) - { - Console.WriteLine("Test 'test_5_double_conv_r4' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_double_conv_r4().ToString() + "'"); - } - if (Tests.test_5_float_conv_r8() != 5) - { - Console.WriteLine("Test 'test_5_float_conv_r8' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_float_conv_r8().ToString() + "'"); - } - if (Tests.test_5_conv_r8() != 5) - { - Console.WriteLine("Test 'test_5_conv_r8' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_conv_r8().ToString() + "'"); - } - if (Tests.test_5_add() != 5) - { - Console.WriteLine("Test 'test_5_add' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_add().ToString() + "'"); - } - if (Tests.test_5_sub() != 5) - { - Console.WriteLine("Test 'test_5_sub' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_sub().ToString() + "'"); - } - if (Tests.test_24_mul() != 24) - { - Console.WriteLine("Test 'test_24_mul' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul().ToString() + "'"); - } - if (Tests.test_4_div() != 4) - { - Console.WriteLine("Test 'test_4_div' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_div().ToString() + "'"); - } - if (Tests.test_2_rem() != 2) - { - Console.WriteLine("Test 'test_2_rem' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_rem().ToString() + "'"); - } - if (Tests.test_2_neg() != 2) - { - Console.WriteLine("Test 'test_2_neg' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_neg().ToString() + "'"); - } - if (Tests.test_46_float_add_spill() != 46) - { - Console.WriteLine("Test 'test_46_float_add_spill' didn't return expected value. Expected: '46' Got: '" + Tests.test_46_float_add_spill().ToString() + "'"); - } - if (Tests.test_4_float_sub_spill() != 4) - { - Console.WriteLine("Test 'test_4_float_sub_spill' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_float_sub_spill().ToString() + "'"); - } - if (Tests.test_362880_float_mul_spill() != 362880) - { - Console.WriteLine("Test 'test_362880_float_mul_spill' didn't return expected value. Expected: '362880' Got: '" + Tests.test_362880_float_mul_spill().ToString() + "'"); - } - if (Tests.test_4_long_cast() != 4) - { - Console.WriteLine("Test 'test_4_long_cast' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_long_cast().ToString() + "'"); - } - if (Tests.test_4_ulong_cast() != 4) - { - Console.WriteLine("Test 'test_4_ulong_cast' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_ulong_cast().ToString() + "'"); - } - if (Tests.test_4_single_long_cast() != 4) - { - Console.WriteLine("Test 'test_4_single_long_cast' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_single_long_cast().ToString() + "'"); - } - if (Tests.test_0_lconv_to_r8() != 0) - { - Console.WriteLine("Test 'test_0_lconv_to_r8' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_lconv_to_r8().ToString() + "'"); - } - if (Tests.test_0_lconv_to_r4() != 0) - { - Console.WriteLine("Test 'test_0_lconv_to_r4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_lconv_to_r4().ToString() + "'"); - } - if (Tests.test_0_ftol_clobber_Float() != 0) - { - Console.WriteLine("Test 'test_0_ftol_clobber_Float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ftol_clobber_Float().ToString() + "'"); - } - if (Tests.test_0_rounding() != 0) - { - Console.WriteLine("Test 'test_0_rounding' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rounding().ToString() + "'"); - } - if (Tests.test_16_float_cmp() != 16) - { - Console.WriteLine("Test 'test_16_float_cmp' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_float_cmp().ToString() + "'"); - } - if (Tests.test_15_float_cmp_un() != 15) - { - Console.WriteLine("Test 'test_15_float_cmp_un' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_float_cmp_un().ToString() + "'"); - } - if (Tests.test_15_float_branch() != 15) - { - Console.WriteLine("Test 'test_15_float_branch' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_float_branch().ToString() + "'"); - } - if (Tests.test_15_float_branch_un() != 15) - { - Console.WriteLine("Test 'test_15_float_branch_un' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_float_branch_un().ToString() + "'"); - } - if (Tests.test_0_float_precision() != 0) - { - Console.WriteLine("Test 'test_0_float_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_float_precision().ToString() + "'"); - } - if (Tests.test_15_clobber_1() != 15) - { - Console.WriteLine("Test 'test_15_clobber_1' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_clobber_1().ToString() + "'"); - } - if (Tests.test_15_clobber_1_fp() != 15) - { - Console.WriteLine("Test 'test_15_clobber_1_fp' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_clobber_1_fp().ToString() + "'"); - } - if (Tests.test_5_call_clobber() != 5) - { - Console.WriteLine("Test 'test_5_call_clobber' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_call_clobber().ToString() + "'"); - } - if (Tests.test_7_call_clobber_dreg() != 7) - { - Console.WriteLine("Test 'test_7_call_clobber_dreg' didn't return expected value. Expected: '7' Got: '" + Tests.test_7_call_clobber_dreg().ToString() + "'"); - } - if (Tests.test_9_spill_if_then_else() != 9) - { - Console.WriteLine("Test 'test_9_spill_if_then_else' didn't return expected value. Expected: '9' Got: '" + Tests.test_9_spill_if_then_else().ToString() + "'"); - } - if (Tests.test_3_spill_reload_if_then_else() != 3) - { - Console.WriteLine("Test 'test_3_spill_reload_if_then_else' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_spill_reload_if_then_else().ToString() + "'"); - } - if (Tests.test_5_spill_loop() != 5) - { - Console.WriteLine("Test 'test_5_spill_loop' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_spill_loop().ToString() + "'"); - } - if (Tests.test_0_volatile() != 0) - { - Console.WriteLine("Test 'test_0_volatile' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_volatile().ToString() + "'"); - } - if (Tests.test_0_volatile_unused() != 0) - { - Console.WriteLine("Test 'test_0_volatile_unused' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_volatile_unused().ToString() + "'"); - } - if (Tests.test_0_volatile_unused_2() != 0) - { - Console.WriteLine("Test 'test_0_volatile_unused_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_volatile_unused_2().ToString() + "'"); - } - if (Tests.test_0_volatile_unused_3() != 0) - { - Console.WriteLine("Test 'test_0_volatile_unused_3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_volatile_unused_3().ToString() + "'"); - } - if (Tests.test_0_volatile_regress_1() != 0) - { - Console.WriteLine("Test 'test_0_volatile_regress_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_volatile_regress_1().ToString() + "'"); - } - if (Tests.test_29_volatile_regress_2() != 29) - { - Console.WriteLine("Test 'test_29_volatile_regress_2' didn't return expected value. Expected: '29' Got: '" + Tests.test_29_volatile_regress_2().ToString() + "'"); - } - if (Tests.test_0_clobber_regress_1() != 0) - { - Console.WriteLine("Test 'test_0_clobber_regress_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_clobber_regress_1().ToString() + "'"); - } - if (Tests.test_0_spill_regress_1() != 0) - { - Console.WriteLine("Test 'test_0_spill_regress_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_regress_1().ToString() + "'"); - } - if (Tests.test_0_spill_regress_2() != 0) - { - Console.WriteLine("Test 'test_0_spill_regress_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_regress_2().ToString() + "'"); - } - if (Tests.test_0_unused_args() != 0) - { - Console.WriteLine("Test 'test_0_unused_args' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_unused_args().ToString() + "'"); - } - if (Tests.test_0_spill_regress_3() != 0) - { - Console.WriteLine("Test 'test_0_spill_regress_3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_regress_3().ToString() + "'"); - } - if (Tests.test_0_spill_regress_4() != 0) - { - Console.WriteLine("Test 'test_0_spill_regress_4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_spill_regress_4().ToString() + "'"); - } - if (Tests.test_0_do_while_critical_edges() != 0) - { - Console.WriteLine("Test 'test_0_do_while_critical_edges' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_do_while_critical_edges().ToString() + "'"); - } - if (Tests.test_0_switch_critical_edges() != 0) - { - Console.WriteLine("Test 'test_0_switch_critical_edges' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_switch_critical_edges().ToString() + "'"); - } - if (Tests.test_0_sin_precision() != 0) - { - Console.WriteLine("Test 'test_0_sin_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sin_precision().ToString() + "'"); - } - if (Tests.test_0_cos_precision() != 0) - { - Console.WriteLine("Test 'test_0_cos_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cos_precision().ToString() + "'"); - } - if (Tests.test_0_tan_precision() != 0) - { - Console.WriteLine("Test 'test_0_tan_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_tan_precision().ToString() + "'"); - } - if (Tests.test_0_atan_precision() != 0) - { - Console.WriteLine("Test 'test_0_atan_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_atan_precision().ToString() + "'"); - } - if (Tests.test_0_sqrt_precision() != 0) - { - Console.WriteLine("Test 'test_0_sqrt_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sqrt_precision().ToString() + "'"); - } - if (Tests.test_2_sqrt() != 2) - { - Console.WriteLine("Test 'test_2_sqrt' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_sqrt().ToString() + "'"); - } - if (Tests.test_0_sqrt_precision_and_not_spill() != 0) - { - Console.WriteLine("Test 'test_0_sqrt_precision_and_not_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sqrt_precision_and_not_spill().ToString() + "'"); - } - if (Tests.test_0_regress_668095_synchronized_gshared() != 0) - { - Console.WriteLine("Test 'test_0_regress_668095_synchronized_gshared' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_668095_synchronized_gshared().ToString() + "'"); - } - if (Tests.test_10_simple_cast() != 10) - { - Console.WriteLine("Test 'test_10_simple_cast' didn't return expected value. Expected: '10' Got: '" + Tests.test_10_simple_cast().ToString() + "'"); - } - if (Tests.test_1_bigmul1() != 1) - { - Console.WriteLine("Test 'test_1_bigmul1' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul1().ToString() + "'"); - } - if (Tests.test_1_bigmul2() != 1) - { - Console.WriteLine("Test 'test_1_bigmul2' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul2().ToString() + "'"); - } - if (Tests.test_1_bigmul3() != 1) - { - Console.WriteLine("Test 'test_1_bigmul3' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul3().ToString() + "'"); - } - if (Tests.test_1_bigmul4() != 1) - { - Console.WriteLine("Test 'test_1_bigmul4' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul4().ToString() + "'"); - } - if (Tests.test_1_bigmul5() != 1) - { - Console.WriteLine("Test 'test_1_bigmul5' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul5().ToString() + "'"); - } - if (Tests.test_1_bigmul6() != 1) - { - Console.WriteLine("Test 'test_1_bigmul6' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bigmul6().ToString() + "'"); - } - if (Tests.test_0_beq_Long() != 0) - { - Console.WriteLine("Test 'test_0_beq_Long' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_beq_Long().ToString() + "'"); - } - if (Tests.test_0_bne_un_Long() != 0) - { - Console.WriteLine("Test 'test_0_bne_un_Long' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bne_un_Long().ToString() + "'"); - } - if (Tests.test_0_ble() != 0) - { - Console.WriteLine("Test 'test_0_ble' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ble().ToString() + "'"); - } - if (Tests.test_0_ble_un() != 0) - { - Console.WriteLine("Test 'test_0_ble_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ble_un().ToString() + "'"); - } - if (Tests.test_0_bge() != 0) - { - Console.WriteLine("Test 'test_0_bge' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bge().ToString() + "'"); - } - if (Tests.test_0_bge_un() != 0) - { - Console.WriteLine("Test 'test_0_bge_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bge_un().ToString() + "'"); - } - if (Tests.test_0_blt() != 0) - { - Console.WriteLine("Test 'test_0_blt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_blt().ToString() + "'"); - } - if (Tests.test_0_blt_un() != 0) - { - Console.WriteLine("Test 'test_0_blt_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_blt_un().ToString() + "'"); - } - if (Tests.test_0_bgt() != 0) - { - Console.WriteLine("Test 'test_0_bgt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bgt().ToString() + "'"); - } - if (Tests.test_0_bgt_un() != 0) - { - Console.WriteLine("Test 'test_0_bgt_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bgt_un().ToString() + "'"); - } - if (Tests.test_0_conv_to_i4() != 0) - { - Console.WriteLine("Test 'test_0_conv_to_i4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_to_i4().ToString() + "'"); - } - if (Tests.test_32_conv_to_u4() != 32) - { - Console.WriteLine("Test 'test_32_conv_to_u4' didn't return expected value. Expected: '32' Got: '" + Tests.test_32_conv_to_u4().ToString() + "'"); - } - if (Tests.test_15_conv_to_u4_2() != 15) - { - Console.WriteLine("Test 'test_15_conv_to_u4_2' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_conv_to_u4_2().ToString() + "'"); - } - if (Tests.test_0_conv_from_i4() != 0) - { - Console.WriteLine("Test 'test_0_conv_from_i4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_from_i4().ToString() + "'"); - } - if (Tests.test_0_conv_from_i4_negative() != 0) - { - Console.WriteLine("Test 'test_0_conv_from_i4_negative' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_from_i4_negative().ToString() + "'"); - } - if (Tests.test_8_and() != 8) - { - Console.WriteLine("Test 'test_8_and' didn't return expected value. Expected: '8' Got: '" + Tests.test_8_and().ToString() + "'"); - } - if (Tests.test_8_and_imm() != 8) - { - Console.WriteLine("Test 'test_8_and_imm' didn't return expected value. Expected: '8' Got: '" + Tests.test_8_and_imm().ToString() + "'"); - } - if (Tests.test_1_and() != 1) - { - Console.WriteLine("Test 'test_1_and' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_and().ToString() + "'"); - } - if (Tests.test_10_or() != 10) - { - Console.WriteLine("Test 'test_10_or' didn't return expected value. Expected: '10' Got: '" + Tests.test_10_or().ToString() + "'"); - } - if (Tests.test_10_or_imm() != 10) - { - Console.WriteLine("Test 'test_10_or_imm' didn't return expected value. Expected: '10' Got: '" + Tests.test_10_or_imm().ToString() + "'"); - } - if (Tests.test_5_xor() != 5) - { - Console.WriteLine("Test 'test_5_xor' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_xor().ToString() + "'"); - } - if (Tests.test_5_xor_imm() != 5) - { - Console.WriteLine("Test 'test_5_xor_imm' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_xor_imm().ToString() + "'"); - } - if (Tests.test_5_add_Long() != 5) - { - Console.WriteLine("Test 'test_5_add_Long' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_add_Long().ToString() + "'"); - } - if (Tests.test_5_add_imm() != 5) - { - Console.WriteLine("Test 'test_5_add_imm' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_add_imm().ToString() + "'"); - } - if (Tests.test_0_add_imm_carry() != 0) - { - Console.WriteLine("Test 'test_0_add_imm_carry' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_imm_carry().ToString() + "'"); - } - if (Tests.test_0_add_imm_no_inc() != 0) - { - Console.WriteLine("Test 'test_0_add_imm_no_inc' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_imm_no_inc().ToString() + "'"); - } - if (Tests.test_4_addcc_imm() != 4) - { - Console.WriteLine("Test 'test_4_addcc_imm' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_addcc_imm().ToString() + "'"); - } - if (Tests.test_5_sub_Long() != 5) - { - Console.WriteLine("Test 'test_5_sub_Long' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_sub_Long().ToString() + "'"); - } - if (Tests.test_5_sub_imm() != 5) - { - Console.WriteLine("Test 'test_5_sub_imm' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_sub_imm().ToString() + "'"); - } - if (Tests.test_0_sub_imm_carry() != 0) - { - Console.WriteLine("Test 'test_0_sub_imm_carry' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_imm_carry().ToString() + "'"); - } - if (Tests.test_0_add_ovf() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf().ToString() + "'"); - } - if (Tests.test_0_add_un_ovf() != 0) - { - Console.WriteLine("Test 'test_0_add_un_ovf' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_un_ovf().ToString() + "'"); - } - if (Tests.test_0_sub_ovf() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf().ToString() + "'"); - } - if (Tests.test_0_sub_ovf_un() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf_un().ToString() + "'"); - } - if (Tests.test_2_neg_Long() != 2) - { - Console.WriteLine("Test 'test_2_neg_Long' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_neg_Long().ToString() + "'"); - } - if (Tests.test_0_neg_large() != 0) - { - Console.WriteLine("Test 'test_0_neg_large' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_neg_large().ToString() + "'"); - } - if (Tests.test_5_shift() != 5) - { - Console.WriteLine("Test 'test_5_shift' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_shift().ToString() + "'"); - } - if (Tests.test_1_shift_u() != 1) - { - Console.WriteLine("Test 'test_1_shift_u' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_shift_u().ToString() + "'"); - } - if (Tests.test_1_shift_u_32() != 1) - { - Console.WriteLine("Test 'test_1_shift_u_32' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_shift_u_32().ToString() + "'"); - } - if (Tests.test_1_simple_neg() != 1) - { - Console.WriteLine("Test 'test_1_simple_neg' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_simple_neg().ToString() + "'"); - } - if (Tests.test_2_compare() != 2) - { - Console.WriteLine("Test 'test_2_compare' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_compare().ToString() + "'"); - } - if (Tests.test_9_alu() != 9) - { - Console.WriteLine("Test 'test_9_alu' didn't return expected value. Expected: '9' Got: '" + Tests.test_9_alu().ToString() + "'"); - } - if (Tests.test_24_mul_Long() != 24) - { - Console.WriteLine("Test 'test_24_mul_Long' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_Long().ToString() + "'"); - } - if (Tests.test_24_mul_ovf() != 24) - { - Console.WriteLine("Test 'test_24_mul_ovf' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_ovf().ToString() + "'"); - } - if (Tests.test_24_mul_un() != 24) - { - Console.WriteLine("Test 'test_24_mul_un' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_un().ToString() + "'"); - } - if (Tests.test_24_mul_ovf_un() != 24) - { - Console.WriteLine("Test 'test_24_mul_ovf_un' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_ovf_un().ToString() + "'"); - } - if (Tests.test_0_mul_imm() != 0) - { - Console.WriteLine("Test 'test_0_mul_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_mul_imm().ToString() + "'"); - } - if (Tests.test_0_mul_imm_opt() != 0) - { - Console.WriteLine("Test 'test_0_mul_imm_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_mul_imm_opt().ToString() + "'"); - } - if (Tests.test_4_divun() != 4) - { - Console.WriteLine("Test 'test_4_divun' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_divun().ToString() + "'"); - } - if (Tests.test_1431655764_bigdivun_imm() != 1431655764) - { - Console.WriteLine("Test 'test_1431655764_bigdivun_imm' didn't return expected value. Expected: '1431655764' Got: '" + Tests.test_1431655764_bigdivun_imm().ToString() + "'"); - } - if (Tests.test_1431655764_bigdivun() != 1431655764) - { - Console.WriteLine("Test 'test_1431655764_bigdivun' didn't return expected value. Expected: '1431655764' Got: '" + Tests.test_1431655764_bigdivun().ToString() + "'"); - } - if (Tests.test_1_remun() != 1) - { - Console.WriteLine("Test 'test_1_remun' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_remun().ToString() + "'"); - } - if (Tests.test_2_bigremun() != 2) - { - Console.WriteLine("Test 'test_2_bigremun' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_bigremun().ToString() + "'"); - } - if (Tests.test_0_ceq() != 0) - { - Console.WriteLine("Test 'test_0_ceq' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ceq().ToString() + "'"); - } - if (Tests.test_0_ceq_complex() != 0) - { - Console.WriteLine("Test 'test_0_ceq_complex' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ceq_complex().ToString() + "'"); - } - if (Tests.test_0_clt() != 0) - { - Console.WriteLine("Test 'test_0_clt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_clt().ToString() + "'"); - } - if (Tests.test_0_clt_un() != 0) - { - Console.WriteLine("Test 'test_0_clt_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_clt_un().ToString() + "'"); - } - if (Tests.test_0_cgt() != 0) - { - Console.WriteLine("Test 'test_0_cgt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cgt().ToString() + "'"); - } - if (Tests.test_0_cgt_un() != 0) - { - Console.WriteLine("Test 'test_0_cgt_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cgt_un().ToString() + "'"); - } - if (Tests.test_3_byte_cast() != 3) - { - Console.WriteLine("Test 'test_3_byte_cast' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_byte_cast().ToString() + "'"); - } - if (Tests.test_4_ushort_cast() != 4) - { - Console.WriteLine("Test 'test_4_ushort_cast' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_ushort_cast().ToString() + "'"); - } - if (Tests.test_500_mul_div() != 500) - { - Console.WriteLine("Test 'test_500_mul_div' didn't return expected value. Expected: '500' Got: '" + Tests.test_500_mul_div().ToString() + "'"); - } - if (Tests.test_3_checked_cast_un() != 3) - { - Console.WriteLine("Test 'test_3_checked_cast_un' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_checked_cast_un().ToString() + "'"); - } - if (Tests.test_4_checked_cast() != 4) - { - Console.WriteLine("Test 'test_4_checked_cast' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_checked_cast().ToString() + "'"); - } - if (Tests.test_12_checked_i1_cast() != 12) - { - Console.WriteLine("Test 'test_12_checked_i1_cast' didn't return expected value. Expected: '12' Got: '" + Tests.test_12_checked_i1_cast().ToString() + "'"); - } - if (Tests.test_127_checked_i1_cast_un() != 127) - { - Console.WriteLine("Test 'test_127_checked_i1_cast_un' didn't return expected value. Expected: '127' Got: '" + Tests.test_127_checked_i1_cast_un().ToString() + "'"); - } - if (Tests.test_1234_checked_i2_cast() != 1234) - { - Console.WriteLine("Test 'test_1234_checked_i2_cast' didn't return expected value. Expected: '1234' Got: '" + Tests.test_1234_checked_i2_cast().ToString() + "'"); - } - if (Tests.test_32767_checked_i2_cast_un() != 32767) - { - Console.WriteLine("Test 'test_32767_checked_i2_cast_un' didn't return expected value. Expected: '32767' Got: '" + Tests.test_32767_checked_i2_cast_un().ToString() + "'"); - } - if (Tests.test_0_div_opt() != 0) - { - Console.WriteLine("Test 'test_0_div_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_div_opt().ToString() + "'"); - } - if (Tests.test_0_rem_opt() != 0) - { - Console.WriteLine("Test 'test_0_rem_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rem_opt().ToString() + "'"); - } - if (Tests.test_0_branch_to_cmov_opt() != 0) - { - Console.WriteLine("Test 'test_0_branch_to_cmov_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_branch_to_cmov_opt().ToString() + "'"); - } - if (Tests.test_0_ishr_sign_extend() != 0) - { - Console.WriteLine("Test 'test_0_ishr_sign_extend' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ishr_sign_extend().ToString() + "'"); - } - if (Tests.test_0_ishr_sign_extend_cfold() != 0) - { - Console.WriteLine("Test 'test_0_ishr_sign_extend_cfold' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ishr_sign_extend_cfold().ToString() + "'"); - } - if (Tests.test_1_nullable_unbox() != 1) - { - Console.WriteLine("Test 'test_1_nullable_unbox' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_unbox().ToString() + "'"); - } - if (Tests.test_1_nullable_unbox_null() != 1) - { - Console.WriteLine("Test 'test_1_nullable_unbox_null' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_unbox_null().ToString() + "'"); - } - if (Tests.test_1_nullable_box() != 1) - { - Console.WriteLine("Test 'test_1_nullable_box' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_box().ToString() + "'"); - } - if (Tests.test_1_nullable_box_null() != 1) - { - Console.WriteLine("Test 'test_1_nullable_box_null' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_box_null().ToString() + "'"); - } - if (Tests.test_1_isinst_nullable() != 1) - { - Console.WriteLine("Test 'test_1_isinst_nullable' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_isinst_nullable().ToString() + "'"); - } - if (Tests.test_1_nullable_unbox_vtype() != 1) - { - Console.WriteLine("Test 'test_1_nullable_unbox_vtype' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_unbox_vtype().ToString() + "'"); - } - if (Tests.test_1_nullable_unbox_null_vtype() != 1) - { - Console.WriteLine("Test 'test_1_nullable_unbox_null_vtype' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_unbox_null_vtype().ToString() + "'"); - } - if (Tests.test_1_nullable_box_vtype() != 1) - { - Console.WriteLine("Test 'test_1_nullable_box_vtype' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_box_vtype().ToString() + "'"); - } - if (Tests.test_1_nullable_box_null_vtype() != 1) - { - Console.WriteLine("Test 'test_1_nullable_box_null_vtype' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_nullable_box_null_vtype().ToString() + "'"); - } - if (Tests.test_1_isinst_nullable_vtype() != 1) - { - Console.WriteLine("Test 'test_1_isinst_nullable_vtype' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_isinst_nullable_vtype().ToString() + "'"); - } - if (Tests.test_0_nullable_normal_unbox() != 0) - { - Console.WriteLine("Test 'test_0_nullable_normal_unbox' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_nullable_normal_unbox().ToString() + "'"); - } - if (Tests.test_1_ldelem_stelem_any_int() != 1) - { - Console.WriteLine("Test 'test_1_ldelem_stelem_any_int' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ldelem_stelem_any_int().ToString() + "'"); - } - if (Tests.test_0_ldelema() != 0) - { - Console.WriteLine("Test 'test_0_ldelema' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldelema().ToString() + "'"); - } - if (Tests.test_0_newarr_multi_dim() != 0) - { - Console.WriteLine("Test 'test_0_newarr_multi_dim' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_newarr_multi_dim().ToString() + "'"); - } - if (Tests.test_0_iface_call_null_bug_77442() != 0) - { - Console.WriteLine("Test 'test_0_iface_call_null_bug_77442' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_iface_call_null_bug_77442().ToString() + "'"); - } - if (Tests.test_18_ldobj_stobj_generics() != 18) - { - Console.WriteLine("Test 'test_18_ldobj_stobj_generics' didn't return expected value. Expected: '18' Got: '" + Tests.test_18_ldobj_stobj_generics().ToString() + "'"); - } - if (Tests.test_5_ldelem_stelem_generics() != 5) - { - Console.WriteLine("Test 'test_5_ldelem_stelem_generics' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_ldelem_stelem_generics().ToString() + "'"); - } - if (Tests.test_0_constrained_vtype_box() != 0) - { - Console.WriteLine("Test 'test_0_constrained_vtype_box' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_constrained_vtype_box().ToString() + "'"); - } - if (Tests.test_0_constrained_vtype() != 0) - { - Console.WriteLine("Test 'test_0_constrained_vtype' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_constrained_vtype().ToString() + "'"); - } - if (Tests.test_0_constrained_reftype() != 0) - { - Console.WriteLine("Test 'test_0_constrained_reftype' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_constrained_reftype().ToString() + "'"); - } - if (Tests.test_0_box_brtrue_optimizations() != 0) - { - Console.WriteLine("Test 'test_0_box_brtrue_optimizations' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_box_brtrue_optimizations().ToString() + "'"); - } - if (Tests.test_0_generic_get_value_optimization_int() != 0) - { - Console.WriteLine("Test 'test_0_generic_get_value_optimization_int' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_generic_get_value_optimization_int().ToString() + "'"); - } - if (Tests.test_0_generic_get_value_optimization_vtype() != 0) - { - Console.WriteLine("Test 'test_0_generic_get_value_optimization_vtype' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_generic_get_value_optimization_vtype().ToString() + "'"); - } - if (Tests.test_0_nullable_ldflda() != 0) - { - Console.WriteLine("Test 'test_0_nullable_ldflda' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_nullable_ldflda().ToString() + "'"); - } - if (Tests.test_0_ldfld_stfld_mro() != 0) - { - Console.WriteLine("Test 'test_0_ldfld_stfld_mro' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldfld_stfld_mro().ToString() + "'"); - } - if (Tests.test_0_generic_virtual_call_on_vtype_unbox() != 0) - { - Console.WriteLine("Test 'test_0_generic_virtual_call_on_vtype_unbox' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_generic_virtual_call_on_vtype_unbox().ToString() + "'"); - } - if (Tests.test_0_box_brtrue_opt() != 0) - { - Console.WriteLine("Test 'test_0_box_brtrue_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_box_brtrue_opt().ToString() + "'"); - } - if (Tests.test_0_box_brtrue_opt_regress_81102() != 0) - { - Console.WriteLine("Test 'test_0_box_brtrue_opt_regress_81102' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_box_brtrue_opt_regress_81102().ToString() + "'"); - } - if (Tests.test_0_ldloca_initobj_opt() != 0) - { - Console.WriteLine("Test 'test_0_ldloca_initobj_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldloca_initobj_opt().ToString() + "'"); - } - if (Tests.test_0_ldvirtftn_generic_method() != 0) - { - Console.WriteLine("Test 'test_0_ldvirtftn_generic_method' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldvirtftn_generic_method().ToString() + "'"); - } - if (Tests.test_0_throw_dead_this() != 0) - { - Console.WriteLine("Test 'test_0_throw_dead_this' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_throw_dead_this().ToString() + "'"); - } - if (Tests.test_0_inline_infinite_polymorphic_recursion() != 0) - { - Console.WriteLine("Test 'test_0_inline_infinite_polymorphic_recursion' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_inline_infinite_polymorphic_recursion().ToString() + "'"); - } - if (Tests.test_0_generic_virtual_on_interfaces() != 0) - { - Console.WriteLine("Test 'test_0_generic_virtual_on_interfaces' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_generic_virtual_on_interfaces().ToString() + "'"); - } - if (Tests.test_0_generic_virtual_on_interfaces_ref() != 0) - { - Console.WriteLine("Test 'test_0_generic_virtual_on_interfaces_ref' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_generic_virtual_on_interfaces_ref().ToString() + "'"); - } - if (Tests.test_2_cprop_bug() != 2) - { - Console.WriteLine("Test 'test_2_cprop_bug' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_cprop_bug().ToString() + "'"); - } - if (Tests.test_0_regress_550964_constrained_enum_long() != 0) - { - Console.WriteLine("Test 'test_0_regress_550964_constrained_enum_long' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_550964_constrained_enum_long().ToString() + "'"); - } - if (Tests.test_0_fullaot_linq() != 0) - { - Console.WriteLine("Test 'test_0_fullaot_linq' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_fullaot_linq().ToString() + "'"); - } - if (Tests.test_0_fullaot_comparer_t() != 0) - { - Console.WriteLine("Test 'test_0_fullaot_comparer_t' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_fullaot_comparer_t().ToString() + "'"); - } - if (Tests.test_0_fullaot_comparer_t_2() != 0) - { - Console.WriteLine("Test 'test_0_fullaot_comparer_t_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_fullaot_comparer_t_2().ToString() + "'"); - } - if (Tests.test_0_fullaot_array_wrappers() != 0) - { - Console.WriteLine("Test 'test_0_fullaot_array_wrappers' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_fullaot_array_wrappers().ToString() + "'"); - } - if (Tests.test_2_generic_class_init_gshared_ctor() != 2) - { - Console.WriteLine("Test 'test_2_generic_class_init_gshared_ctor' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_generic_class_init_gshared_ctor().ToString() + "'"); - } - if (Tests.test_2_generic_class_init_gshared_ctor_from_gshared() != 2) - { - Console.WriteLine("Test 'test_2_generic_class_init_gshared_ctor_from_gshared' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_generic_class_init_gshared_ctor_from_gshared().ToString() + "'"); - } - if (Tests.test_0_gshared_delegate_rgctx() != 0) - { - Console.WriteLine("Test 'test_0_gshared_delegate_rgctx' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_gshared_delegate_rgctx().ToString() + "'"); - } - if (Tests.test_0_gshared_delegate_from_gshared() != 0) - { - Console.WriteLine("Test 'test_0_gshared_delegate_from_gshared' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_gshared_delegate_from_gshared().ToString() + "'"); - } - if (Tests.test_0_marshalbyref_call_from_gshared_virt_elim() != 0) - { - Console.WriteLine("Test 'test_0_marshalbyref_call_from_gshared_virt_elim' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_marshalbyref_call_from_gshared_virt_elim().ToString() + "'"); - } - if (Tests.test_0_bug_620864() != 0) - { - Console.WriteLine("Test 'test_0_bug_620864' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bug_620864().ToString() + "'"); - } - if (Tests.test_0_infinite_generic_recursion() != 0) - { - Console.WriteLine("Test 'test_0_infinite_generic_recursion' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_infinite_generic_recursion().ToString() + "'"); - } - if (Tests.test_0_full_aot_nullable_unbox_from_gshared_code() != 0) - { - Console.WriteLine("Test 'test_0_full_aot_nullable_unbox_from_gshared_code' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_full_aot_nullable_unbox_from_gshared_code().ToString() + "'"); - } - if (Tests.test_0_partial_sharing() != 0) - { - Console.WriteLine("Test 'test_0_partial_sharing' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_partial_sharing().ToString() + "'"); - } - if (Tests.test_6_partial_sharing_linq() != 6) - { - Console.WriteLine("Test 'test_6_partial_sharing_linq' didn't return expected value. Expected: '6' Got: '" + Tests.test_6_partial_sharing_linq().ToString() + "'"); - } - if (Tests.test_0_partial_shared_method_in_nonshared_class() != 0) - { - Console.WriteLine("Test 'test_0_partial_shared_method_in_nonshared_class' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_partial_shared_method_in_nonshared_class().ToString() + "'"); - } - if (Tests.test_0_add_ovf2() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf2().ToString() + "'"); - } - if (Tests.test_0_add_ovf3() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf3().ToString() + "'"); - } - if (Tests.test_0_add_ovf4() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf4().ToString() + "'"); - } - if (Tests.test_0_add_ovf5() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf5' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf5().ToString() + "'"); - } - if (Tests.test_0_add_ovf6() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf6' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf6().ToString() + "'"); - } - if (Tests.test_0_add_un_ovf_Basic() != 0) - { - Console.WriteLine("Test 'test_0_add_un_ovf_Basic' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_un_ovf_Basic().ToString() + "'"); - } - if (Tests.test_0_sub_ovf1() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf1().ToString() + "'"); - } - if (Tests.test_0_sub_ovf2() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf2().ToString() + "'"); - } - if (Tests.test_0_sub_ovf3() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf3().ToString() + "'"); - } - if (Tests.test_0_sub_ovf4() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf4().ToString() + "'"); - } - if (Tests.test_0_sub_ovf5() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf5' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf5().ToString() + "'"); - } - if (Tests.test_0_sub_ovf6() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf6' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf6().ToString() + "'"); - } - if (Tests.test_0_sub_ovf_un_Basic() != 0) - { - Console.WriteLine("Test 'test_0_sub_ovf_un_Basic' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_ovf_un_Basic().ToString() + "'"); - } - if (Tests.test_3_or() != 3) - { - Console.WriteLine("Test 'test_3_or' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_or().ToString() + "'"); - } - if (Tests.test_3_or_un() != 3) - { - Console.WriteLine("Test 'test_3_or_un' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_or_un().ToString() + "'"); - } - if (Tests.test_3_or_short_un() != 3) - { - Console.WriteLine("Test 'test_3_or_short_un' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_or_short_un().ToString() + "'"); - } - if (Tests.test_18_or_imm() != 18) - { - Console.WriteLine("Test 'test_18_or_imm' didn't return expected value. Expected: '18' Got: '" + Tests.test_18_or_imm().ToString() + "'"); - } - if (Tests.test_268435458_or_large_imm() != 268435458) - { - Console.WriteLine("Test 'test_268435458_or_large_imm' didn't return expected value. Expected: '268435458' Got: '" + Tests.test_268435458_or_large_imm().ToString() + "'"); - } - if (Tests.test_268435459_or_large_imm2() != 268435459) - { - Console.WriteLine("Test 'test_268435459_or_large_imm2' didn't return expected value. Expected: '268435459' Got: '" + Tests.test_268435459_or_large_imm2().ToString() + "'"); - } - if (Tests.test_1_xor() != 1) - { - Console.WriteLine("Test 'test_1_xor' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_xor().ToString() + "'"); - } - if (Tests.test_1_xor_imm() != 1) - { - Console.WriteLine("Test 'test_1_xor_imm' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_xor_imm().ToString() + "'"); - } - if (Tests.test_983041_xor_imm_large() != 983041) - { - Console.WriteLine("Test 'test_983041_xor_imm_large' didn't return expected value. Expected: '983041' Got: '" + Tests.test_983041_xor_imm_large().ToString() + "'"); - } - if (Tests.test_1_neg() != 1) - { - Console.WriteLine("Test 'test_1_neg' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_neg().ToString() + "'"); - } - if (Tests.test_2_not() != 2) - { - Console.WriteLine("Test 'test_2_not' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_not().ToString() + "'"); - } - if (Tests.test_16_shift() != 16) - { - Console.WriteLine("Test 'test_16_shift' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_shift().ToString() + "'"); - } - if (Tests.test_16_shift_add() != 16) - { - Console.WriteLine("Test 'test_16_shift_add' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_shift_add().ToString() + "'"); - } - if (Tests.test_16_shift_add2() != 16) - { - Console.WriteLine("Test 'test_16_shift_add2' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_shift_add2().ToString() + "'"); - } - if (Tests.test_16_shift_imm() != 16) - { - Console.WriteLine("Test 'test_16_shift_imm' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_shift_imm().ToString() + "'"); - } - if (Tests.test_524288_shift_imm_large() != 524288) - { - Console.WriteLine("Test 'test_524288_shift_imm_large' didn't return expected value. Expected: '524288' Got: '" + Tests.test_524288_shift_imm_large().ToString() + "'"); - } - if (Tests.test_12_shift_imm_inv() != 12) - { - Console.WriteLine("Test 'test_12_shift_imm_inv' didn't return expected value. Expected: '12' Got: '" + Tests.test_12_shift_imm_inv().ToString() + "'"); - } - if (Tests.test_12_shift_imm_inv_sbyte() != 12) - { - Console.WriteLine("Test 'test_12_shift_imm_inv_sbyte' didn't return expected value. Expected: '12' Got: '" + Tests.test_12_shift_imm_inv_sbyte().ToString() + "'"); - } - if (Tests.test_1_rshift_imm() != 1) - { - Console.WriteLine("Test 'test_1_rshift_imm' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_rshift_imm().ToString() + "'"); - } - if (Tests.test_2_unrshift_imm() != 2) - { - Console.WriteLine("Test 'test_2_unrshift_imm' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_unrshift_imm().ToString() + "'"); - } - if (Tests.test_0_bigunrshift_imm() != 0) - { - Console.WriteLine("Test 'test_0_bigunrshift_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bigunrshift_imm().ToString() + "'"); - } - if (Tests.test_0_bigrshift_imm() != 0) - { - Console.WriteLine("Test 'test_0_bigrshift_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bigrshift_imm().ToString() + "'"); - } - if (Tests.test_1_rshift() != 1) - { - Console.WriteLine("Test 'test_1_rshift' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_rshift().ToString() + "'"); - } - if (Tests.test_2_unrshift() != 2) - { - Console.WriteLine("Test 'test_2_unrshift' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_unrshift().ToString() + "'"); - } - if (Tests.test_0_bigunrshift() != 0) - { - Console.WriteLine("Test 'test_0_bigunrshift' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bigunrshift().ToString() + "'"); - } - if (Tests.test_0_bigrshift() != 0) - { - Console.WriteLine("Test 'test_0_bigrshift' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bigrshift().ToString() + "'"); - } - if (Tests.test_2_cond() != 2) - { - Console.WriteLine("Test 'test_2_cond' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_cond().ToString() + "'"); - } - if (Tests.test_2_cond_short() != 2) - { - Console.WriteLine("Test 'test_2_cond_short' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_cond_short().ToString() + "'"); - } - if (Tests.test_2_cond_sbyte() != 2) - { - Console.WriteLine("Test 'test_2_cond_sbyte' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_cond_sbyte().ToString() + "'"); - } - if (Tests.test_6_cascade_cond() != 6) - { - Console.WriteLine("Test 'test_6_cascade_cond' didn't return expected value. Expected: '6' Got: '" + Tests.test_6_cascade_cond().ToString() + "'"); - } - if (Tests.test_6_cascade_short() != 6) - { - Console.WriteLine("Test 'test_6_cascade_short' didn't return expected value. Expected: '6' Got: '" + Tests.test_6_cascade_short().ToString() + "'"); - } - if (Tests.test_0_short_sign_extend() != 0) - { - Console.WriteLine("Test 'test_0_short_sign_extend' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_short_sign_extend().ToString() + "'"); - } - if (Tests.test_127_iconv_to_i1() != 127) - { - Console.WriteLine("Test 'test_127_iconv_to_i1' didn't return expected value. Expected: '127' Got: '" + Tests.test_127_iconv_to_i1().ToString() + "'"); - } - if (Tests.test_384_iconv_to_i2() != 384) - { - Console.WriteLine("Test 'test_384_iconv_to_i2' didn't return expected value. Expected: '384' Got: '" + Tests.test_384_iconv_to_i2().ToString() + "'"); - } - if (Tests.test_15_for_loop() != 15) - { - Console.WriteLine("Test 'test_15_for_loop' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_for_loop().ToString() + "'"); - } - if (Tests.test_11_nested_for_loop() != 11) - { - Console.WriteLine("Test 'test_11_nested_for_loop' didn't return expected value. Expected: '11' Got: '" + Tests.test_11_nested_for_loop().ToString() + "'"); - } - if (Tests.test_11_several_nested_for_loops() != 11) - { - Console.WriteLine("Test 'test_11_several_nested_for_loops' didn't return expected value. Expected: '11' Got: '" + Tests.test_11_several_nested_for_loops().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_i1() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_i1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_i1().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_i1_un() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_i1_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_i1_un().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_i2() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_i2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_i2().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_i2_un() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_i2_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_i2_un().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_u2() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_u2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_u2().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_u2_un() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_u2_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_u2_un().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_u4() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_u4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_u4().ToString() + "'"); - } - if (Tests.test_0_conv_ovf_i4_un() != 0) - { - Console.WriteLine("Test 'test_0_conv_ovf_i4_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_conv_ovf_i4_un().ToString() + "'"); - } - if (Tests.test_0_bool() != 0) - { - Console.WriteLine("Test 'test_0_bool' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_bool().ToString() + "'"); - } - if (Tests.test_1_bool_inverted() != 1) - { - Console.WriteLine("Test 'test_1_bool_inverted' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bool_inverted().ToString() + "'"); - } - if (Tests.test_1_bool_assign() != 1) - { - Console.WriteLine("Test 'test_1_bool_assign' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bool_assign().ToString() + "'"); - } - if (Tests.test_1_bool_multi() != 1) - { - Console.WriteLine("Test 'test_1_bool_multi' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_bool_multi().ToString() + "'"); - } - if (Tests.test_16_spill() != 16) - { - Console.WriteLine("Test 'test_16_spill' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_spill().ToString() + "'"); - } - if (Tests.test_1_switch() != 1) - { - Console.WriteLine("Test 'test_1_switch' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_switch().ToString() + "'"); - } - if (Tests.test_0_switch_constprop() != 0) - { - Console.WriteLine("Test 'test_0_switch_constprop' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_switch_constprop().ToString() + "'"); - } - if (Tests.test_0_switch_constprop2() != 0) - { - Console.WriteLine("Test 'test_0_switch_constprop2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_switch_constprop2().ToString() + "'"); - } - if (Tests.test_0_while_loop_1() != 0) - { - Console.WriteLine("Test 'test_0_while_loop_1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_while_loop_1().ToString() + "'"); - } - if (Tests.test_0_while_loop_2() != 0) - { - Console.WriteLine("Test 'test_0_while_loop_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_while_loop_2().ToString() + "'"); - } - if (Tests.test_0_char_conv() != 0) - { - Console.WriteLine("Test 'test_0_char_conv' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_char_conv().ToString() + "'"); - } - if (Tests.test_3_shift_regalloc() != 3) - { - Console.WriteLine("Test 'test_3_shift_regalloc' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_shift_regalloc().ToString() + "'"); - } - if (Tests.test_2_optimize_branches() != 2) - { - Console.WriteLine("Test 'test_2_optimize_branches' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_optimize_branches().ToString() + "'"); - } - if (Tests.test_0_checked_byte_cast() != 0) - { - Console.WriteLine("Test 'test_0_checked_byte_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_checked_byte_cast().ToString() + "'"); - } - if (Tests.test_0_checked_byte_cast_un() != 0) - { - Console.WriteLine("Test 'test_0_checked_byte_cast_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_checked_byte_cast_un().ToString() + "'"); - } - if (Tests.test_0_checked_short_cast() != 0) - { - Console.WriteLine("Test 'test_0_checked_short_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_checked_short_cast().ToString() + "'"); - } - if (Tests.test_0_checked_short_cast_un() != 0) - { - Console.WriteLine("Test 'test_0_checked_short_cast_un' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_checked_short_cast_un().ToString() + "'"); - } - if (Tests.test_1_a_eq_b_plus_a() != 1) - { - Console.WriteLine("Test 'test_1_a_eq_b_plus_a' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_a_eq_b_plus_a().ToString() + "'"); - } - if (Tests.test_0_comp() != 0) - { - Console.WriteLine("Test 'test_0_comp' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_comp().ToString() + "'"); - } - if (Tests.test_0_comp_unsigned() != 0) - { - Console.WriteLine("Test 'test_0_comp_unsigned' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_comp_unsigned().ToString() + "'"); - } - if (Tests.test_16_cmov() != 16) - { - Console.WriteLine("Test 'test_16_cmov' didn't return expected value. Expected: '16' Got: '" + Tests.test_16_cmov().ToString() + "'"); - } - if (Tests.test_0_and_cmp() != 0) - { - Console.WriteLine("Test 'test_0_and_cmp' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_and_cmp().ToString() + "'"); - } - if (Tests.test_0_mul_imm_opt_Basic() != 0) - { - Console.WriteLine("Test 'test_0_mul_imm_opt_Basic' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_mul_imm_opt_Basic().ToString() + "'"); - } - if (Tests.test_0_cne() != 0) - { - Console.WriteLine("Test 'test_0_cne' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cne().ToString() + "'"); - } - if (Tests.test_0_cmp_regvar_zero() != 0) - { - Console.WriteLine("Test 'test_0_cmp_regvar_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cmp_regvar_zero().ToString() + "'"); - } - if (Tests.test_5_div_un_cfold() != 5) - { - Console.WriteLine("Test 'test_5_div_un_cfold' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_div_un_cfold().ToString() + "'"); - } - if (Tests.test_1_rem_un_cfold() != 1) - { - Console.WriteLine("Test 'test_1_rem_un_cfold' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_rem_un_cfold().ToString() + "'"); - } - if (Tests.test_1_array_mismatch_2() != 1) - { - Console.WriteLine("Test 'test_1_array_mismatch_2' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_array_mismatch_2().ToString() + "'"); - } - if (Tests.test_1_array_mismatch_3() != 1) - { - Console.WriteLine("Test 'test_1_array_mismatch_3' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_array_mismatch_3().ToString() + "'"); - } - if (Tests.test_1_array_mismatch_4() != 1) - { - Console.WriteLine("Test 'test_1_array_mismatch_4' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_array_mismatch_4().ToString() + "'"); - } - if (Tests.test_0_array_size() != 0) - { - Console.WriteLine("Test 'test_0_array_size' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_array_size().ToString() + "'"); - } - if (Tests.test_0_stack_unwind() != 0) - { - Console.WriteLine("Test 'test_0_stack_unwind' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_stack_unwind().ToString() + "'"); - } - if (Tests.test_0_throw_unwind() != 0) - { - Console.WriteLine("Test 'test_0_throw_unwind' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_throw_unwind().ToString() + "'"); - } - if (Tests.test_0_regress_73242() != 0) - { - Console.WriteLine("Test 'test_0_regress_73242' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_73242().ToString() + "'"); - } - if (Tests.test_0_nullref() != 0) - { - Console.WriteLine("Test 'test_0_nullref' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_nullref().ToString() + "'"); - } - if (Tests.test_0_nonvirt_nullref_at_clause_start() != 0) - { - Console.WriteLine("Test 'test_0_nonvirt_nullref_at_clause_start' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_nonvirt_nullref_at_clause_start().ToString() + "'"); - } - if (Tests.test_0_inline_throw_only() != 0) - { - Console.WriteLine("Test 'test_0_inline_throw_only' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_inline_throw_only().ToString() + "'"); - } - if (Tests.test_0_inline_throw_only_gettext() != 0) - { - Console.WriteLine("Test 'test_0_inline_throw_only_gettext' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_inline_throw_only_gettext().ToString() + "'"); - } - if (Tests.test_0_throw_to_branch_opt_outer_clause() != 0) - { - Console.WriteLine("Test 'test_0_throw_to_branch_opt_outer_clause' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_throw_to_branch_opt_outer_clause().ToString() + "'"); - } - if (Tests.test_0_try_inside_finally_cmov_opt() != 0) - { - Console.WriteLine("Test 'test_0_try_inside_finally_cmov_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_try_inside_finally_cmov_opt().ToString() + "'"); - } - if (Tests.test_0_inline_throw() != 0) - { - Console.WriteLine("Test 'test_0_inline_throw' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_inline_throw().ToString() + "'"); - } - if (Tests.test_0_lmf_filter() != 0) - { - Console.WriteLine("Test 'test_0_lmf_filter' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_lmf_filter().ToString() + "'"); - } - if (Tests.test_8_local_deadce_causes() != 8) - { - Console.WriteLine("Test 'test_8_local_deadce_causes' didn't return expected value. Expected: '8' Got: '" + Tests.test_8_local_deadce_causes().ToString() + "'"); - } - if (Tests.test_0_except_opt_two_clauses() != 0) - { - Console.WriteLine("Test 'test_0_except_opt_two_clauses' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_except_opt_two_clauses().ToString() + "'"); - } - if (Tests.test_100_long_vars_in_clauses_initlocals_opt() != 100) - { - Console.WriteLine("Test 'test_100_long_vars_in_clauses_initlocals_opt' didn't return expected value. Expected: '100' Got: '" + Tests.test_100_long_vars_in_clauses_initlocals_opt().ToString() + "'"); - } - if (Tests.test_0_ldflda_null() != 0) - { - Console.WriteLine("Test 'test_0_ldflda_null' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldflda_null().ToString() + "'"); - } - if (Tests.test_0_ldflda_null_pointer() != 0) - { - Console.WriteLine("Test 'test_0_ldflda_null_pointer' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldflda_null_pointer().ToString() + "'"); - } - if (Tests.test_0_many_nested_loops() != 0) - { - Console.WriteLine("Test 'test_0_many_nested_loops' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_many_nested_loops().ToString() + "'"); - } - if (Tests.test_0_logic_run() != 0) - { - Console.WriteLine("Test 'test_0_logic_run' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_logic_run().ToString() + "'"); - } - if (Tests.test_1028_sieve() != 1028) - { - Console.WriteLine("Test 'test_1028_sieve' didn't return expected value. Expected: '1028' Got: '" + Tests.test_1028_sieve().ToString() + "'"); - } - if (Tests.test_3524578_fib() != 3524578) - { - Console.WriteLine("Test 'test_3524578_fib' didn't return expected value. Expected: '3524578' Got: '" + Tests.test_3524578_fib().ToString() + "'"); - } - if (Tests.test_0_hanoi() != 0) - { - Console.WriteLine("Test 'test_0_hanoi' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_hanoi().ToString() + "'"); - } - if (Tests.test_0_castclass() != 0) - { - Console.WriteLine("Test 'test_0_castclass' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_castclass().ToString() + "'"); - } - if (Tests.test_23005000_float() != 23005000) - { - Console.WriteLine("Test 'test_23005000_float' didn't return expected value. Expected: '23005000' Got: '" + Tests.test_23005000_float().ToString() + "'"); - } - if (Tests.test_0_return_Basic() != 0) - { - Console.WriteLine("Test 'test_0_return_Basic' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_return_Basic().ToString() + "'"); - } - if (Tests.test_100000_return_large() != 100000) - { - Console.WriteLine("Test 'test_100000_return_large' didn't return expected value. Expected: '100000' Got: '" + Tests.test_100000_return_large().ToString() + "'"); - } - if (Tests.test_1_load_bool() != 1) - { - Console.WriteLine("Test 'test_1_load_bool' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_load_bool().ToString() + "'"); - } - if (Tests.test_0_load_bool_false() != 0) - { - Console.WriteLine("Test 'test_0_load_bool_false' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_load_bool_false().ToString() + "'"); - } - if (Tests.test_200_load_byte() != 200) - { - Console.WriteLine("Test 'test_200_load_byte' didn't return expected value. Expected: '200' Got: '" + Tests.test_200_load_byte().ToString() + "'"); - } - if (Tests.test_100_load_sbyte() != 100) - { - Console.WriteLine("Test 'test_100_load_sbyte' didn't return expected value. Expected: '100' Got: '" + Tests.test_100_load_sbyte().ToString() + "'"); - } - if (Tests.test_200_load_short() != 200) - { - Console.WriteLine("Test 'test_200_load_short' didn't return expected value. Expected: '200' Got: '" + Tests.test_200_load_short().ToString() + "'"); - } - if (Tests.test_100_load_ushort() != 100) - { - Console.WriteLine("Test 'test_100_load_ushort' didn't return expected value. Expected: '100' Got: '" + Tests.test_100_load_ushort().ToString() + "'"); - } - if (Tests.test_3_add_simple() != 3) - { - Console.WriteLine("Test 'test_3_add_simple' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_add_simple().ToString() + "'"); - } - if (Tests.test_3_add_imm() != 3) - { - Console.WriteLine("Test 'test_3_add_imm' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_add_imm().ToString() + "'"); - } - if (Tests.test_13407573_add_largeimm() != 13407573) - { - Console.WriteLine("Test 'test_13407573_add_largeimm' didn't return expected value. Expected: '13407573' Got: '" + Tests.test_13407573_add_largeimm().ToString() + "'"); - } - if (Tests.test_1_sub_simple() != 1) - { - Console.WriteLine("Test 'test_1_sub_simple' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_sub_simple().ToString() + "'"); - } - if (Tests.test_1_sub_simple_un() != 1) - { - Console.WriteLine("Test 'test_1_sub_simple_un' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_sub_simple_un().ToString() + "'"); - } - if (Tests.test_1_sub_imm() != 1) - { - Console.WriteLine("Test 'test_1_sub_imm' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_sub_imm().ToString() + "'"); - } - if (Tests.test_2_sub_large_imm() != 2) - { - Console.WriteLine("Test 'test_2_sub_large_imm' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_sub_large_imm().ToString() + "'"); - } - if (Tests.test_0_sub_inv_imm() != 0) - { - Console.WriteLine("Test 'test_0_sub_inv_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sub_inv_imm().ToString() + "'"); - } - if (Tests.test_2_and() != 2) - { - Console.WriteLine("Test 'test_2_and' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_and().ToString() + "'"); - } - if (Tests.test_0_and_imm() != 0) - { - Console.WriteLine("Test 'test_0_and_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_and_imm().ToString() + "'"); - } - if (Tests.test_0_and_large_imm() != 0) - { - Console.WriteLine("Test 'test_0_and_large_imm' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_and_large_imm().ToString() + "'"); - } - if (Tests.test_0_and_large_imm2() != 0) - { - Console.WriteLine("Test 'test_0_and_large_imm2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_and_large_imm2().ToString() + "'"); - } - if (Tests.test_2_div() != 2) - { - Console.WriteLine("Test 'test_2_div' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_div().ToString() + "'"); - } - if (Tests.test_4_div_imm() != 4) - { - Console.WriteLine("Test 'test_4_div_imm' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_div_imm().ToString() + "'"); - } - if (Tests.test_4_divun_imm() != 4) - { - Console.WriteLine("Test 'test_4_divun_imm' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_divun_imm().ToString() + "'"); - } - if (Tests.test_0_div_fold() != 0) - { - Console.WriteLine("Test 'test_0_div_fold' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_div_fold().ToString() + "'"); - } - if (Tests.test_2_div_fold4() != 2) - { - Console.WriteLine("Test 'test_2_div_fold4' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_div_fold4().ToString() + "'"); - } - if (Tests.test_2_div_fold16() != 2) - { - Console.WriteLine("Test 'test_2_div_fold16' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_div_fold16().ToString() + "'"); - } - if (Tests.test_719177_div_destreg() != 719177) - { - Console.WriteLine("Test 'test_719177_div_destreg' didn't return expected value. Expected: '719177' Got: '" + Tests.test_719177_div_destreg().ToString() + "'"); - } - if (Tests.test_1_remun_imm() != 1) - { - Console.WriteLine("Test 'test_1_remun_imm' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_remun_imm().ToString() + "'"); - } - if (Tests.test_2_bigremun_imm() != 2) - { - Console.WriteLine("Test 'test_2_bigremun_imm' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_bigremun_imm().ToString() + "'"); - } - if (Tests.test_2_rem_Basic() != 2) - { - Console.WriteLine("Test 'test_2_rem_Basic' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_rem_Basic().ToString() + "'"); - } - if (Tests.test_4_rem_imm() != 4) - { - Console.WriteLine("Test 'test_4_rem_imm' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_rem_imm().ToString() + "'"); - } - if (Tests.test_0_rem_imm_0() != 0) - { - Console.WriteLine("Test 'test_0_rem_imm_0' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rem_imm_0().ToString() + "'"); - } - if (Tests.test_0_rem_imm_0_neg() != 0) - { - Console.WriteLine("Test 'test_0_rem_imm_0_neg' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rem_imm_0_neg().ToString() + "'"); - } - if (Tests.test_4_rem_big_imm() != 4) - { - Console.WriteLine("Test 'test_4_rem_big_imm' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_rem_big_imm().ToString() + "'"); - } - if (Tests.test_9_mul() != 9) - { - Console.WriteLine("Test 'test_9_mul' didn't return expected value. Expected: '9' Got: '" + Tests.test_9_mul().ToString() + "'"); - } - if (Tests.test_15_mul_imm() != 15) - { - Console.WriteLine("Test 'test_15_mul_imm' didn't return expected value. Expected: '15' Got: '" + Tests.test_15_mul_imm().ToString() + "'"); - } - if (Tests.test_24_mul_Basic() != 24) - { - Console.WriteLine("Test 'test_24_mul_Basic' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_Basic().ToString() + "'"); - } - if (Tests.test_24_mul_ovf_Basic() != 24) - { - Console.WriteLine("Test 'test_24_mul_ovf_Basic' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_ovf_Basic().ToString() + "'"); - } - if (Tests.test_24_mul_un_Basic() != 24) - { - Console.WriteLine("Test 'test_24_mul_un_Basic' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_un_Basic().ToString() + "'"); - } - if (Tests.test_24_mul_ovf_un_Basic() != 24) - { - Console.WriteLine("Test 'test_24_mul_ovf_un_Basic' didn't return expected value. Expected: '24' Got: '" + Tests.test_24_mul_ovf_un_Basic().ToString() + "'"); - } - if (Tests.test_0_add_ovf1() != 0) - { - Console.WriteLine("Test 'test_0_add_ovf1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_add_ovf1().ToString() + "'"); - } - if (Tests.test_528_mark_runlength_large() != 528) - { - Console.WriteLine("Test 'test_528_mark_runlength_large' didn't return expected value. Expected: '528' Got: '" + Tests.test_528_mark_runlength_large().ToString() + "'"); - } - if (Tests.test_0_liveness_2() != 0) - { - Console.WriteLine("Test 'test_0_liveness_2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_2().ToString() + "'"); - } - if (Tests.test_0_liveness_3() != 0) - { - Console.WriteLine("Test 'test_0_liveness_3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_3().ToString() + "'"); - } - if (Tests.test_0_liveness_4() != 0) - { - Console.WriteLine("Test 'test_0_liveness_4' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_4().ToString() + "'"); - } - if (Tests.test_0_liveness_5() != 0) - { - Console.WriteLine("Test 'test_0_liveness_5' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_5().ToString() + "'"); - } - if (Tests.test_0_liveness_6() != 0) - { - Console.WriteLine("Test 'test_0_liveness_6' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_6().ToString() + "'"); - } - if (Tests.test_0_multi_dim_ref_array_wbarrier() != 0) - { - Console.WriteLine("Test 'test_0_multi_dim_ref_array_wbarrier' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multi_dim_ref_array_wbarrier().ToString() + "'"); - } - if (Tests.test_0_liveness_7() != 0) - { - Console.WriteLine("Test 'test_0_liveness_7' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_7().ToString() + "'"); - } - if (Tests.test_0_liveness_8() != 0) - { - Console.WriteLine("Test 'test_0_liveness_8' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_8().ToString() + "'"); - } - if (Tests.test_0_liveness_9() != 0) - { - Console.WriteLine("Test 'test_0_liveness_9' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_9().ToString() + "'"); - } - if (Tests.test_0_liveness_10() != 0) - { - Console.WriteLine("Test 'test_0_liveness_10' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_10().ToString() + "'"); - } - if (Tests.test_0_liveness_11() != 0) - { - Console.WriteLine("Test 'test_0_liveness_11' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_11().ToString() + "'"); - } - if (Tests.test_0_liveness_12() != 0) - { - Console.WriteLine("Test 'test_0_liveness_12' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_12().ToString() + "'"); - } - if (Tests.test_0_liveness_13() != 0) - { - Console.WriteLine("Test 'test_0_liveness_13' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_liveness_13().ToString() + "'"); - } - if (Tests.test_0_catch() != 0) - { - Console.WriteLine("Test 'test_0_catch' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_catch().ToString() + "'"); - } - if (Tests.test_0_finally_without_exc() != 0) - { - Console.WriteLine("Test 'test_0_finally_without_exc' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_finally_without_exc().ToString() + "'"); - } - if (Tests.test_0_finally() != 0) - { - Console.WriteLine("Test 'test_0_finally' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_finally().ToString() + "'"); - } - if (Tests.test_0_nested_finally() != 0) - { - Console.WriteLine("Test 'test_0_nested_finally' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_nested_finally().ToString() + "'"); - } - if (Tests.test_0_byte_cast() != 0) - { - Console.WriteLine("Test 'test_0_byte_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_byte_cast().ToString() + "'"); - } - if (Tests.test_0_sbyte_cast() != 0) - { - Console.WriteLine("Test 'test_0_sbyte_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sbyte_cast().ToString() + "'"); - } - if (Tests.test_0_ushort_cast() != 0) - { - Console.WriteLine("Test 'test_0_ushort_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ushort_cast().ToString() + "'"); - } - if (Tests.test_0_short_cast() != 0) - { - Console.WriteLine("Test 'test_0_short_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_short_cast().ToString() + "'"); - } - if (Tests.test_0_int_cast() != 0) - { - Console.WriteLine("Test 'test_0_int_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_int_cast().ToString() + "'"); - } - if (Tests.test_0_uint_cast() != 0) - { - Console.WriteLine("Test 'test_0_uint_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_uint_cast().ToString() + "'"); - } - if (Tests.test_0_long_cast() != 0) - { - Console.WriteLine("Test 'test_0_long_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_long_cast().ToString() + "'"); - } - if (Tests.test_0_ulong_cast() != 0) - { - Console.WriteLine("Test 'test_0_ulong_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ulong_cast().ToString() + "'"); - } - if (Tests.test_0_simple_double_casts() != 0) - { - Console.WriteLine("Test 'test_0_simple_double_casts' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_simple_double_casts().ToString() + "'"); - } - if (Tests.test_0_div_zero() != 0) - { - Console.WriteLine("Test 'test_0_div_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_div_zero().ToString() + "'"); - } - if (Tests.test_0_cfold_div_zero() != 0) - { - Console.WriteLine("Test 'test_0_cfold_div_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cfold_div_zero().ToString() + "'"); - } - if (Tests.test_0_udiv_zero() != 0) - { - Console.WriteLine("Test 'test_0_udiv_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_udiv_zero().ToString() + "'"); - } - if (Tests.test_0_long_div_zero() != 0) - { - Console.WriteLine("Test 'test_0_long_div_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_long_div_zero().ToString() + "'"); - } - if (Tests.test_0_ulong_div_zero() != 0) - { - Console.WriteLine("Test 'test_0_ulong_div_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ulong_div_zero().ToString() + "'"); - } - if (Tests.test_0_float_div_zero() != 0) - { - Console.WriteLine("Test 'test_0_float_div_zero' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_float_div_zero().ToString() + "'"); - } - if (Tests.test_0_invalid_unbox() != 0) - { - Console.WriteLine("Test 'test_0_invalid_unbox' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_invalid_unbox().ToString() + "'"); - } - if (Tests.test_0_invalid_unbox_arrays() != 0) - { - Console.WriteLine("Test 'test_0_invalid_unbox_arrays' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_invalid_unbox_arrays().ToString() + "'"); - } - if (Tests.test_2_multiple_finally_clauses() != 2) - { - Console.WriteLine("Test 'test_2_multiple_finally_clauses' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_multiple_finally_clauses().ToString() + "'"); - } - if (Tests.test_3_checked_cast_un_Exceptions() != 3) - { - Console.WriteLine("Test 'test_3_checked_cast_un_Exceptions' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_checked_cast_un_Exceptions().ToString() + "'"); - } - if (Tests.test_4_checked_cast_Exceptions() != 4) - { - Console.WriteLine("Test 'test_4_checked_cast_Exceptions' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_checked_cast_Exceptions().ToString() + "'"); - } - if (Tests.test_0_multi_dim_array_access() != 0) - { - Console.WriteLine("Test 'test_0_multi_dim_array_access' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multi_dim_array_access().ToString() + "'"); - } - if (Tests.test_2_array_mismatch() != 2) - { - Console.WriteLine("Test 'test_2_array_mismatch' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_array_mismatch().ToString() + "'"); - } - if (Tests.test_0_ovf1() != 0) - { - Console.WriteLine("Test 'test_0_ovf1' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf1().ToString() + "'"); - } - if (Tests.test_1_ovf2() != 1) - { - Console.WriteLine("Test 'test_1_ovf2' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf2().ToString() + "'"); - } - if (Tests.test_0_ovf3() != 0) - { - Console.WriteLine("Test 'test_0_ovf3' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf3().ToString() + "'"); - } - if (Tests.test_1_ovf4() != 1) - { - Console.WriteLine("Test 'test_1_ovf4' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf4().ToString() + "'"); - } - if (Tests.test_0_ovf5() != 0) - { - Console.WriteLine("Test 'test_0_ovf5' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf5().ToString() + "'"); - } - if (Tests.test_1_ovf6() != 1) - { - Console.WriteLine("Test 'test_1_ovf6' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf6().ToString() + "'"); - } - if (Tests.test_0_ovf7() != 0) - { - Console.WriteLine("Test 'test_0_ovf7' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf7().ToString() + "'"); - } - if (Tests.test_1_ovf8() != 1) - { - Console.WriteLine("Test 'test_1_ovf8' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf8().ToString() + "'"); - } - if (Tests.test_0_ovf9() != 0) - { - Console.WriteLine("Test 'test_0_ovf9' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf9().ToString() + "'"); - } - if (Tests.test_1_ovf10() != 1) - { - Console.WriteLine("Test 'test_1_ovf10' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf10().ToString() + "'"); - } - if (Tests.test_0_ovf11() != 0) - { - Console.WriteLine("Test 'test_0_ovf11' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf11().ToString() + "'"); - } - if (Tests.test_1_ovf12() != 1) - { - Console.WriteLine("Test 'test_1_ovf12' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf12().ToString() + "'"); - } - if (Tests.test_0_ovf13() != 0) - { - Console.WriteLine("Test 'test_0_ovf13' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf13().ToString() + "'"); - } - if (Tests.test_1_ovf14() != 1) - { - Console.WriteLine("Test 'test_1_ovf14' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf14().ToString() + "'"); - } - if (Tests.test_0_ovf15() != 0) - { - Console.WriteLine("Test 'test_0_ovf15' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf15().ToString() + "'"); - } - if (Tests.test_1_ovf16() != 1) - { - Console.WriteLine("Test 'test_1_ovf16' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf16().ToString() + "'"); - } - if (Tests.test_0_ovf17() != 0) - { - Console.WriteLine("Test 'test_0_ovf17' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf17().ToString() + "'"); - } - if (Tests.test_0_ovf18() != 0) - { - Console.WriteLine("Test 'test_0_ovf18' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf18().ToString() + "'"); - } - if (Tests.test_1_ovf19() != 1) - { - Console.WriteLine("Test 'test_1_ovf19' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf19().ToString() + "'"); - } - if (Tests.test_0_ovf20() != 0) - { - Console.WriteLine("Test 'test_0_ovf20' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ovf20().ToString() + "'"); - } - if (Tests.test_1_ovf21() != 1) - { - Console.WriteLine("Test 'test_1_ovf21' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf21().ToString() + "'"); - } - if (Tests.test_1_ovf22() != 1) - { - Console.WriteLine("Test 'test_1_ovf22' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf22().ToString() + "'"); - } - if (Tests.test_1_ovf23() != 1) - { - Console.WriteLine("Test 'test_1_ovf23' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_ovf23().ToString() + "'"); - } - if (Tests.test_0_exception_in_cctor() != 0) - { - Console.WriteLine("Test 'test_0_exception_in_cctor' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_exception_in_cctor().ToString() + "'"); - } - if (Tests.test_5_regalloc() != 5) - { - Console.WriteLine("Test 'test_5_regalloc' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_regalloc().ToString() + "'"); - } - if (Tests.test_0_rethrow_nested() != 0) - { - Console.WriteLine("Test 'test_0_rethrow_nested' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rethrow_nested().ToString() + "'"); - } - if (Tests.test_0_rethrow_stacktrace() != 0) - { - Console.WriteLine("Test 'test_0_rethrow_stacktrace' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_rethrow_stacktrace().ToString() + "'"); - } - if (Tests.test_0_struct3_args() != 0) - { - Console.WriteLine("Test 'test_0_struct3_args' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_struct3_args().ToString() + "'"); - } - if (Tests.test_0_struct4_args() != 0) - { - Console.WriteLine("Test 'test_0_struct4_args' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_struct4_args().ToString() + "'"); - } - if (Tests.test_44_unbox_trampoline() != 44) - { - Console.WriteLine("Test 'test_44_unbox_trampoline' didn't return expected value. Expected: '44' Got: '" + Tests.test_44_unbox_trampoline().ToString() + "'"); - } - if (Tests.test_0_unbox_trampoline2() != 0) - { - Console.WriteLine("Test 'test_0_unbox_trampoline2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_unbox_trampoline2().ToString() + "'"); - } - if (Tests.test_0_fields_with_big_offsets() != 0) - { - Console.WriteLine("Test 'test_0_fields_with_big_offsets' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_fields_with_big_offsets().ToString() + "'"); - } - if (Tests.test_0_seektest() != 0) - { - Console.WriteLine("Test 'test_0_seektest' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_seektest().ToString() + "'"); - } - if (Tests.test_0_null_cast() != 0) - { - Console.WriteLine("Test 'test_0_null_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_null_cast().ToString() + "'"); - } - if (Tests.test_0_super_cast() != 0) - { - Console.WriteLine("Test 'test_0_super_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_super_cast().ToString() + "'"); - } - if (Tests.test_0_super_cast_array() != 0) - { - Console.WriteLine("Test 'test_0_super_cast_array' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_super_cast_array().ToString() + "'"); - } - if (Tests.test_0_multi_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_multi_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multi_array_cast().ToString() + "'"); - } - if (Tests.test_0_vector_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_vector_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_vector_array_cast().ToString() + "'"); - } - if (Tests.test_0_enum_array_cast() != 0) - { - Console.WriteLine("Test 'test_0_enum_array_cast' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_enum_array_cast().ToString() + "'"); - } - if (Tests.test_0_more_cast_corner_cases() != 0) - { - Console.WriteLine("Test 'test_0_more_cast_corner_cases' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_more_cast_corner_cases().ToString() + "'"); - } - if (Tests.test_0_cast_iface_array() != 0) - { - Console.WriteLine("Test 'test_0_cast_iface_array' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cast_iface_array().ToString() + "'"); - } - if (Tests.test_719162_complex_div() != 719162) - { - Console.WriteLine("Test 'test_719162_complex_div' didn't return expected value. Expected: '719162' Got: '" + Tests.test_719162_complex_div().ToString() + "'"); - } - if (Tests.test_2_static_delegate() != 2) - { - Console.WriteLine("Test 'test_2_static_delegate' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_static_delegate().ToString() + "'"); - } - if (Tests.test_2_instance_delegate() != 2) - { - Console.WriteLine("Test 'test_2_instance_delegate' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_instance_delegate().ToString() + "'"); - } - if (Tests.test_1_store_decimal() != 1) - { - Console.WriteLine("Test 'test_1_store_decimal' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_store_decimal().ToString() + "'"); - } - if (Tests.test_2_intptr_stobj() != 2) - { - Console.WriteLine("Test 'test_2_intptr_stobj' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_intptr_stobj().ToString() + "'"); - } - if (Tests.test_155_regalloc() != 155) - { - Console.WriteLine("Test 'test_155_regalloc' didn't return expected value. Expected: '155' Got: '" + Tests.test_155_regalloc().ToString() + "'"); - } - if (Tests.test_2_large_struct_pass() != 2) - { - Console.WriteLine("Test 'test_2_large_struct_pass' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_large_struct_pass().ToString() + "'"); - } - if (Tests.test_0_pin_string() != 0) - { - Console.WriteLine("Test 'test_0_pin_string' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_pin_string().ToString() + "'"); - } - if (Tests.test_0_and_cmp_static() != 0) - { - Console.WriteLine("Test 'test_0_and_cmp_static' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_and_cmp_static().ToString() + "'"); - } - if (Tests.test_0_byte_compares() != 0) - { - Console.WriteLine("Test 'test_0_byte_compares' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_byte_compares().ToString() + "'"); - } - if (Tests.test_71_long_shift_right() != 71) - { - Console.WriteLine("Test 'test_71_long_shift_right' didn't return expected value. Expected: '71' Got: '" + Tests.test_71_long_shift_right().ToString() + "'"); - } - if (Tests.test_0_addsub_mem() != 0) - { - Console.WriteLine("Test 'test_0_addsub_mem' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_addsub_mem().ToString() + "'"); - } - if (Tests.test_0_sh32_mem() != 0) - { - Console.WriteLine("Test 'test_0_sh32_mem' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sh32_mem().ToString() + "'"); - } - if (Tests.test_0_long_arg_opt() != 0) - { - Console.WriteLine("Test 'test_0_long_arg_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_long_arg_opt().ToString() + "'"); - } - if (Tests.test_0_long_ret_opt() != 0) - { - Console.WriteLine("Test 'test_0_long_ret_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_long_ret_opt().ToString() + "'"); - } - if (Tests.test_0_cond_branch_side_effects() != 0) - { - Console.WriteLine("Test 'test_0_cond_branch_side_effects' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_cond_branch_side_effects().ToString() + "'"); - } - if (Tests.test_0_arg_only_written() != 0) - { - Console.WriteLine("Test 'test_0_arg_only_written' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_arg_only_written().ToString() + "'"); - } - if (Tests.test_4_static_inc_long() != 4) - { - Console.WriteLine("Test 'test_4_static_inc_long' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_static_inc_long().ToString() + "'"); - } - if (Tests.test_0_calls_opcode_emulation() != 0) - { - Console.WriteLine("Test 'test_0_calls_opcode_emulation' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_calls_opcode_emulation().ToString() + "'"); - } - if (Tests.test_0_intrins_string_length() != 0) - { - Console.WriteLine("Test 'test_0_intrins_string_length' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_string_length().ToString() + "'"); - } - if (Tests.test_0_intrins_string_chars() != 0) - { - Console.WriteLine("Test 'test_0_intrins_string_chars' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_string_chars().ToString() + "'"); - } - if (Tests.test_0_intrins_object_gettype() != 0) - { - Console.WriteLine("Test 'test_0_intrins_object_gettype' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_object_gettype().ToString() + "'"); - } - if (Tests.test_0_intrins_object_gethashcode() != 0) - { - Console.WriteLine("Test 'test_0_intrins_object_gethashcode' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_object_gethashcode().ToString() + "'"); - } - if (Tests.test_0_intrins_object_ctor() != 0) - { - Console.WriteLine("Test 'test_0_intrins_object_ctor' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_object_ctor().ToString() + "'"); - } - if (Tests.test_0_intrins_array_rank() != 0) - { - Console.WriteLine("Test 'test_0_intrins_array_rank' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_array_rank().ToString() + "'"); - } - if (Tests.test_0_intrins_array_length() != 0) - { - Console.WriteLine("Test 'test_0_intrins_array_length' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_array_length().ToString() + "'"); - } - if (Tests.test_0_intrins_runtimehelpers_offset_to_string_data() != 0) - { - Console.WriteLine("Test 'test_0_intrins_runtimehelpers_offset_to_string_data' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_runtimehelpers_offset_to_string_data().ToString() + "'"); - } - if (Tests.test_0_intrins_string_setchar() != 0) - { - Console.WriteLine("Test 'test_0_intrins_string_setchar' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_intrins_string_setchar().ToString() + "'"); - } - if (Tests.test_0_regress_78990_unaligned_structs() != 0) - { - Console.WriteLine("Test 'test_0_regress_78990_unaligned_structs' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_regress_78990_unaligned_structs().ToString() + "'"); - } - if (Tests.test_97_negative_index() != 97) - { - Console.WriteLine("Test 'test_97_negative_index' didn't return expected value. Expected: '97' Got: '" + Tests.test_97_negative_index().ToString() + "'"); - } - if (Tests.test_0_unsigned_right_shift_imm0() != 0) - { - Console.WriteLine("Test 'test_0_unsigned_right_shift_imm0' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_unsigned_right_shift_imm0().ToString() + "'"); - } - if (Tests.test_0_abcrem_check_this_removal() != 0) - { - Console.WriteLine("Test 'test_0_abcrem_check_this_removal' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_abcrem_check_this_removal().ToString() + "'"); - } - if (Tests.test_0_abcrem_check_this_removal2() != 0) - { - Console.WriteLine("Test 'test_0_abcrem_check_this_removal2' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_abcrem_check_this_removal2().ToString() + "'"); - } - if (Tests.test_0_array_access_64_bit() != 0) - { - Console.WriteLine("Test 'test_0_array_access_64_bit' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_array_access_64_bit().ToString() + "'"); - } - if (Tests.test_0_float_return_spill() != 0) - { - Console.WriteLine("Test 'test_0_float_return_spill' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_float_return_spill().ToString() + "'"); - } - if (Tests.test_0_ldsfld_soft_float() != 0) - { - Console.WriteLine("Test 'test_0_ldsfld_soft_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldsfld_soft_float().ToString() + "'"); - } - if (Tests.test_0_ldfld_stfld_soft_float() != 0) - { - Console.WriteLine("Test 'test_0_ldfld_stfld_soft_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldfld_stfld_soft_float().ToString() + "'"); - } - if (Tests.test_0_ldfld_stfld_soft_float_remote() != 0) - { - Console.WriteLine("Test 'test_0_ldfld_stfld_soft_float_remote' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ldfld_stfld_soft_float_remote().ToString() + "'"); - } - if (Tests.test_0_locals_soft_float() != 0) - { - Console.WriteLine("Test 'test_0_locals_soft_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_locals_soft_float().ToString() + "'"); - } - if (Tests.test_0_vtype_arg_soft_float() != 0) - { - Console.WriteLine("Test 'test_0_vtype_arg_soft_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_vtype_arg_soft_float().ToString() + "'"); - } - if (Tests.test_0_range_check_opt() != 0) - { - Console.WriteLine("Test 'test_0_range_check_opt' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_range_check_opt().ToString() + "'"); - } - if (Tests.test_0_array_get_set_soft_float() != 0) - { - Console.WriteLine("Test 'test_0_array_get_set_soft_float' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_array_get_set_soft_float().ToString() + "'"); - } - if (Tests.test_2_ldobj_stobj_optization() != 2) - { - Console.WriteLine("Test 'test_2_ldobj_stobj_optization' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_ldobj_stobj_optization().ToString() + "'"); - } - if (Tests.test_0_vtype_phi() != 0) - { - Console.WriteLine("Test 'test_0_vtype_phi' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_vtype_phi().ToString() + "'"); - } - if (Tests.test_0_llvm_moving_faulting_loads() != 0) - { - Console.WriteLine("Test 'test_0_llvm_moving_faulting_loads' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_llvm_moving_faulting_loads().ToString() + "'"); - } - if (Tests.test_0_multiple_cctor_calls_regress_679467() != 0) - { - Console.WriteLine("Test 'test_0_multiple_cctor_calls_regress_679467' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_multiple_cctor_calls_regress_679467().ToString() + "'"); - } - if (Tests.test_36_simple() != 36) - { - Console.WriteLine("Test 'test_36_simple' didn't return expected value. Expected: '36' Got: '" + Tests.test_36_simple().ToString() + "'"); - } - if (Tests.test_36_liveness() != 36) - { - Console.WriteLine("Test 'test_36_liveness' didn't return expected value. Expected: '36' Got: '" + Tests.test_36_liveness().ToString() + "'"); - } - if (Tests.test_4_vtype() != 4) - { - Console.WriteLine("Test 'test_4_vtype' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_vtype().ToString() + "'"); - } - if (Tests.test_0_return() != 0) - { - Console.WriteLine("Test 'test_0_return' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_return().ToString() + "'"); - } - if (Tests.test_2_int_return() != 2) - { - Console.WriteLine("Test 'test_2_int_return' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_int_return().ToString() + "'"); - } - if (Tests.test_1_int_pass() != 1) - { - Console.WriteLine("Test 'test_1_int_pass' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_int_pass().ToString() + "'"); - } - if (Tests.test_1_int_pass_many() != 1) - { - Console.WriteLine("Test 'test_1_int_pass_many' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_int_pass_many().ToString() + "'"); - } - if (Tests.test_2_inline_saved_arg_type() != 2) - { - Console.WriteLine("Test 'test_2_inline_saved_arg_type' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_inline_saved_arg_type().ToString() + "'"); - } - if (Tests.test_5_pass_longs() != 5) - { - Console.WriteLine("Test 'test_5_pass_longs' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_pass_longs().ToString() + "'"); - } - if (Tests.test_55_pass_even_more() != 55) - { - Console.WriteLine("Test 'test_55_pass_even_more' didn't return expected value. Expected: '55' Got: '" + Tests.test_55_pass_even_more().ToString() + "'"); - } - if (Tests.test_1_sparc_argument_passing() != 1) - { - Console.WriteLine("Test 'test_1_sparc_argument_passing' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_sparc_argument_passing().ToString() + "'"); - } - if (Tests.test_21_sparc_byte_argument_passing() != 21) - { - Console.WriteLine("Test 'test_21_sparc_byte_argument_passing' didn't return expected value. Expected: '21' Got: '" + Tests.test_21_sparc_byte_argument_passing().ToString() + "'"); - } - if (Tests.test_21_sparc_sbyte_argument_passing() != 21) - { - Console.WriteLine("Test 'test_21_sparc_sbyte_argument_passing' didn't return expected value. Expected: '21' Got: '" + Tests.test_21_sparc_sbyte_argument_passing().ToString() + "'"); - } - if (Tests.test_21_sparc_short_argument_passing() != 21) - { - Console.WriteLine("Test 'test_21_sparc_short_argument_passing' didn't return expected value. Expected: '21' Got: '" + Tests.test_21_sparc_short_argument_passing().ToString() + "'"); - } - if (Tests.test_721_sparc_float_argument_passing() != 721) - { - Console.WriteLine("Test 'test_721_sparc_float_argument_passing' didn't return expected value. Expected: '721' Got: '" + Tests.test_721_sparc_float_argument_passing().ToString() + "'"); - } - if (Tests.test_55_sparc_float_argument_passing2() != 55) - { - Console.WriteLine("Test 'test_55_sparc_float_argument_passing2' didn't return expected value. Expected: '55' Got: '" + Tests.test_55_sparc_float_argument_passing2().ToString() + "'"); - } - if (Tests.test_0_float_argument_passing_precision() != 0) - { - Console.WriteLine("Test 'test_0_float_argument_passing_precision' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_float_argument_passing_precision().ToString() + "'"); - } - if (Tests.test_2_sparc_takeaddr_argument_passing() != 2) - { - Console.WriteLine("Test 'test_2_sparc_takeaddr_argument_passing' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_sparc_takeaddr_argument_passing().ToString() + "'"); - } - if (Tests.test_721_sparc_takeaddr_argument_passing2() != 721) - { - Console.WriteLine("Test 'test_721_sparc_takeaddr_argument_passing2' didn't return expected value. Expected: '721' Got: '" + Tests.test_721_sparc_takeaddr_argument_passing2().ToString() + "'"); - } - if (Tests.test_0_sparc_byref_double_argument_passing() != 0) - { - Console.WriteLine("Test 'test_0_sparc_byref_double_argument_passing' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sparc_byref_double_argument_passing().ToString() + "'"); - } - if (Tests.test_0_long_arg_assign() != 0) - { - Console.WriteLine("Test 'test_0_long_arg_assign' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_long_arg_assign().ToString() + "'"); - } - if (Tests.test_0_ptr_return() != 0) - { - Console.WriteLine("Test 'test_0_ptr_return' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ptr_return().ToString() + "'"); - } - if (Tests.test_0_isnan() != 0) - { - Console.WriteLine("Test 'test_0_isnan' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_isnan().ToString() + "'"); - } - if (Tests.test_1_handle_dup_stloc() != 1) - { - Console.WriteLine("Test 'test_1_handle_dup_stloc' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_handle_dup_stloc().ToString() + "'"); - } - if (Tests.test_3_long_ret() != 3) - { - Console.WriteLine("Test 'test_3_long_ret' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_long_ret().ToString() + "'"); - } - if (Tests.test_1_long_ret2() != 1) - { - Console.WriteLine("Test 'test_1_long_ret2' didn't return expected value. Expected: '1' Got: '" + Tests.test_1_long_ret2().ToString() + "'"); - } - if (Tests.test_0_sparc_long_ret_regress_541577() != 0) - { - Console.WriteLine("Test 'test_0_sparc_long_ret_regress_541577' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_sparc_long_ret_regress_541577().ToString() + "'"); - } - if (Tests.test_0_ftol_clobber() != 0) - { - Console.WriteLine("Test 'test_0_ftol_clobber' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_ftol_clobber().ToString() + "'"); - } - if (Tests.test_0_return_Objects() != 0) - { - Console.WriteLine("Test 'test_0_return_Objects' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_return_Objects().ToString() + "'"); - } - if (Tests.test_0_string_access() != 0) - { - Console.WriteLine("Test 'test_0_string_access' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_string_access().ToString() + "'"); - } - if (Tests.test_0_string_virtual_call() != 0) - { - Console.WriteLine("Test 'test_0_string_virtual_call' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_string_virtual_call().ToString() + "'"); - } - if (Tests.test_0_iface_call() != 0) - { - Console.WriteLine("Test 'test_0_iface_call' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_iface_call().ToString() + "'"); - } - if (Tests.test_5_newobj() != 5) - { - Console.WriteLine("Test 'test_5_newobj' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_newobj().ToString() + "'"); - } - if (Tests.test_4_box() != 4) - { - Console.WriteLine("Test 'test_4_box' didn't return expected value. Expected: '4' Got: '" + Tests.test_4_box().ToString() + "'"); - } - if (Tests.test_0_enum_unbox() != 0) - { - Console.WriteLine("Test 'test_0_enum_unbox' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_enum_unbox().ToString() + "'"); - } - if (Tests.test_3_return_struct() != 3) - { - Console.WriteLine("Test 'test_3_return_struct' didn't return expected value. Expected: '3' Got: '" + Tests.test_3_return_struct().ToString() + "'"); - } - if (Tests.test_2_return_struct_virtual() != 2) - { - Console.WriteLine("Test 'test_2_return_struct_virtual' didn't return expected value. Expected: '2' Got: '" + Tests.test_2_return_struct_virtual().ToString() + "'"); - } - if (Tests.test_5_pass_struct() != 5) - { - Console.WriteLine("Test 'test_5_pass_struct' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_pass_struct().ToString() + "'"); - } - if (Tests.test_5_pass_static_struct() != 5) - { - Console.WriteLine("Test 'test_5_pass_static_struct' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_pass_static_struct().ToString() + "'"); - } - if (Tests.test_5_pass_small_struct() != 5) - { - Console.WriteLine("Test 'test_5_pass_small_struct' didn't return expected value. Expected: '5' Got: '" + Tests.test_5_pass_small_struct().ToString() + "'"); - } - if (Tests.test_0_struct1_args() != 0) - { - Console.WriteLine("Test 'test_0_struct1_args' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_struct1_args().ToString() + "'"); - } - if (Tests.test_0_struct2_args() != 0) - { - Console.WriteLine("Test 'test_0_struct2_args' didn't return expected value. Expected: '0' Got: '" + Tests.test_0_struct2_args().ToString() + "'"); - } - #endregion - } - - public static void WriteError(string s) - { - Console.WriteLine("Error: " + s); - } - } -} - diff --git a/Users/Orvid/IL2CPU Tester/TestKernel/TestKernel.csproj b/Users/Orvid/IL2CPU Tester/TestKernel/TestKernel.csproj deleted file mode 100644 index e9762c17f1..0000000000 --- a/Users/Orvid/IL2CPU Tester/TestKernel/TestKernel.csproj +++ /dev/null @@ -1,130 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {B75AE496-E7AC-4EC4-9904-43D6B84D9705} - Exe - Properties - TestKernel - TestKernel - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - StructTest.Program - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - prompt - true - true - - - bin\Release\ - TRACE - true - pdbonly - x86 - prompt - false - false - - - - - - - - - - - - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.HAL - - - {7CEE0541-0107-47F3-B422-70C55E81CE42} - CsTests - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - \ No newline at end of file diff --git a/Users/Orvid/IL2CPU Tester/Tester/Tester.Cosmos b/Users/Orvid/IL2CPU Tester/Tester/Tester.Cosmos deleted file mode 100644 index 63d98f6c16..0000000000 --- a/Users/Orvid/IL2CPU Tester/Tester/Tester.Cosmos +++ /dev/null @@ -1,59 +0,0 @@ - - - - Debug - 2.0 - {7f0794f7-4516-46bb-ae77-dba713dcd63c} - false - Tester - elf - Tester - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - false - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - Cosmos.Debug.Kernel.Plugs - {b97a2956-c363-47f2-a6aa-b4fccff4d315} - True - - - Cosmos.System_Plugs - {7c64b97f-516d-4a6d-b9e1-3fe48f561409} - True - - - Cosmos.Core_Plugs - {d9a87aad-fcc9-4517-b31d-e904dad00784} - True - - - TestKernel - {b75ae496-e7ac-4ec4-9904-43d6b84d9705} - True - - - - \ No newline at end of file diff --git a/Users/Orvid/IL2CPURunner/IL2CPURunner.csproj b/Users/Orvid/IL2CPURunner/IL2CPURunner.csproj deleted file mode 100644 index eb4e377aaa..0000000000 --- a/Users/Orvid/IL2CPURunner/IL2CPURunner.csproj +++ /dev/null @@ -1,154 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {56655226-BAC2-4192-9B9B-E9B81F93C244} - Exe - Properties - IL2CPURunner - IL2CPURunner - v4.7.1 - - - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - {0462E82B-8C29-41A9-8265-9C89038ADB29} - Cosmos.Build.Common - - - {94D079E4-3C66-486A-8407-EA6EC049FF53} - Cosmos.Compiler.Assembler.X86 - - - {1116130E-28E0-428A-A597-F4B3B676C0CA} - Cosmos.Compiler.Assembler - - - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB} - Cosmos.Core.DebugStub - - - {AB24E403-54F3-4F67-B5E0-119A7227AAC1} - Cosmos.Debug.Common - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - IL2CPU.API - - - {63F7BFB9-419E-4965-B580-304B9C9FA7D8} - Cosmos.IL2CPU.X86 - - - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} - Cosmos.IL2CPU - - - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315} - Cosmos.Debug.Kernel.Plugs - - - {61607F1E-58F9-41CF-972F-128384F3E115} - Cosmos.Debug.Kernel - - - {7C64B97F-516D-4A6D-B9E1-3FE48F561409} - Cosmos.System_Plugs - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {D9A87AAD-FCC9-4517-B31D-E904DAD00784} - Cosmos.Core_Plugs - - - {086FC210-C2E9-4536-8235-9285929F904A} - StructTestKernel - - - - - False - Microsoft .NET Framework 4 Client Profile %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - diff --git a/Users/Orvid/IL2CPURunner/Program.cs b/Users/Orvid/IL2CPURunner/Program.cs deleted file mode 100644 index ac5d314f72..0000000000 --- a/Users/Orvid/IL2CPURunner/Program.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Build.Common; -using Cosmos.IL2CPU.X86; -using Cosmos.Debug.Common; -using Cosmos.IL2CPU; -using System.IO; - -namespace IL2CPURunner -{ - class Program - { - static void Main(string[] args) - { - System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch(); - StreamWriter strw = new StreamWriter("log.txt"); - s.Start(); - System.Reflection.Assembly.Load("Cosmos.Build.Common"); - System.Reflection.Assembly.Load("Cosmos.Compiler.Assembler"); - System.Reflection.Assembly.Load("Cosmos.Compiler.Assembler.X86"); - System.Reflection.Assembly.Load("Cosmos.Core_Plugs"); - System.Reflection.Assembly.Load("Cosmos.Debug.Common"); - System.Reflection.Assembly.Load("Cosmos.Core.DebugStub"); - System.Reflection.Assembly.Load("Cosmos.Debug.Kernel"); - System.Reflection.Assembly.Load("Cosmos.Debug.Kernel.Plugs"); - System.Reflection.Assembly.Load("Cosmos.IL2CPU"); - System.Reflection.Assembly.Load("IL2CPU.API"); - System.Reflection.Assembly.Load("Cosmos.IL2CPU.X86"); - System.Reflection.Assembly.Load("Cosmos.System"); - System.Reflection.Assembly.Load("Cosmos.System_Plugs"); - var xInitMethod = typeof(StructTest.Kernel).GetConstructor(Type.EmptyTypes); - var xOutputFilename = System.Windows.Forms.Application.StartupPath + "\\" + "StructTest"; - var xAsm = new AppAssemblerNasm(0); - using (var xDebugInfo = new DebugInfo()) - { - xDebugInfo.CreateCPDB(xOutputFilename + ".cpdb"); - xAsm.DebugInfo = xDebugInfo; - xAsm.DebugMode = DebugMode.None; - xAsm.TraceAssemblies = TraceAssemblies.All; - xAsm.ShouldOptimize = true; - - var xNasmAsm = (AssemblerNasm)xAsm.Assembler; - xAsm.Assembler.Initialize(); - using (var xScanner = new ILScanner(xAsm)) - { - // TODO: shouldn't be here? - xScanner.QueueMethod(xInitMethod.DeclaringType.BaseType.GetMethod("Start")); - xScanner.Execute(xInitMethod); - - using (var xOut = new StreamWriter(xOutputFilename + ".asm", false)) - { - xAsm.Assembler.FlushText(xOut); - } - } - } - s.Stop(); - strw.Write("Total Time to Run: " + s.ElapsedMilliseconds.ToString() + "ms"); - strw.Close(); - } - } -} diff --git a/Users/Orvid/IL2CPURunner/Properties/AssemblyInfo.cs b/Users/Orvid/IL2CPURunner/Properties/AssemblyInfo.cs deleted file mode 100644 index 1e86ad3640..0000000000 --- a/Users/Orvid/IL2CPURunner/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("IL2CPURunner")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("IL2CPURunner")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("1f99e2c8-3dd8-4233-bb0d-b05c68206499")] - -// 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/Users/Orvid/ImageManipulatorTester/Form1.Designer.cs b/Users/Orvid/ImageManipulatorTester/Form1.Designer.cs deleted file mode 100644 index d6d10b5f30..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Form1.Designer.cs +++ /dev/null @@ -1,153 +0,0 @@ -namespace ImageManipulatorTester -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); - this.SuspendLayout(); - // - // flowLayoutPanel1 - // - this.flowLayoutPanel1.AutoScroll = true; - this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(421, 373); - this.flowLayoutPanel1.TabIndex = 0; - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.IsSplitterFixed = true; - this.splitContainer1.Location = new System.Drawing.Point(0, 20); - this.splitContainer1.Margin = new System.Windows.Forms.Padding(0); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.flowLayoutPanel1); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.flowLayoutPanel2); - this.splitContainer1.Size = new System.Drawing.Size(848, 373); - this.splitContainer1.SplitterDistance = 421; - this.splitContainer1.TabIndex = 0; - this.splitContainer1.TabStop = false; - // - // flowLayoutPanel2 - // - this.flowLayoutPanel2.AutoScroll = true; - this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; - this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 0); - this.flowLayoutPanel2.Name = "flowLayoutPanel2"; - this.flowLayoutPanel2.Size = new System.Drawing.Size(423, 373); - this.flowLayoutPanel2.TabIndex = 0; - this.flowLayoutPanel2.TabStop = true; - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.label2, 1, 0); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 1; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(848, 20); - this.tableLayoutPanel1.TabIndex = 1; - // - // label1 - // - this.label1.Dock = System.Windows.Forms.DockStyle.Fill; - this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label1.Location = new System.Drawing.Point(0, 0); - this.label1.Margin = new System.Windows.Forms.Padding(0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(424, 20); - this.label1.TabIndex = 0; - this.label1.Text = "Image Manipulator Tests"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // label2 - // - this.label2.Dock = System.Windows.Forms.DockStyle.Fill; - this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(424, 0); - this.label2.Margin = new System.Windows.Forms.Padding(0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(424, 20); - this.label2.TabIndex = 1; - this.label2.Text = "Image Format Loading Tests"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(848, 393); - this.Controls.Add(this.splitContainer1); - this.Controls.Add(this.tableLayoutPanel1); - this.Name = "Form1"; - this.Text = "Form1"; - this.Load += new System.EventHandler(this.Form1_Load); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - } -} - diff --git a/Users/Orvid/ImageManipulatorTester/Form1.cs b/Users/Orvid/ImageManipulatorTester/Form1.cs deleted file mode 100644 index 7e46088669..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Form1.cs +++ /dev/null @@ -1,1487 +0,0 @@ -//#define AnimateGif -#define DebugAllFormats - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.IO; -using System.Windows.Forms; - -namespace ImageManipulatorTester -{ - public partial class Form1 : System.Windows.Forms.Form - { - private StreamWriter st; - - public Form1() - { - InitializeComponent(); - } - - private void WriteToLog(String s) - { - st.WriteLine(s); - } - - private void Form1_Load(object sender, EventArgs e) - { - LabeledImage li = new LabeledImage(); - Orvid.Graphics.Image i; - st = new StreamWriter(Path.GetFullPath("Log.txt")); - System.Diagnostics.Stopwatch t = System.Diagnostics.Stopwatch.StartNew(); - t.Stop(); - t.Reset(); - - #region Load Original - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/png/Building.png"), FileMode.Open); - Orvid.Graphics.ImageFormats.PngImage p = new Orvid.Graphics.ImageFormats.PngImage(); - i = p.Load(s); - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)i; - li.BorderStyle = BorderStyle.FixedSingle; - li.Parent = flowLayoutPanel1; - li.Text = "Original Image"; - li.Height = b.Height; - li.Width = b.Width; - li.Image = b; - } - #endregion - - System.GC.Collect(); - -#if DebugAllFormats - - #region Nearest Neighbor Scaling - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(i.Width / 2, i.Height / 2), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.NearestNeighbor); - t.Stop(); - WriteToLog("Nearest Neighbor Scaling took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Nearest Neighbor Scaling 1/2"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region Bi-Linear Scaling - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(i.Width / 2, i.Height / 2), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.Bilinear); - t.Stop(); - WriteToLog("Bi-Linear Scaling took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Bi-Linear Scaling 1/2"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region Bi-Cubic Scaling - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.Resize(i, new Orvid.Graphics.Vec2(i.Width / 2, i.Height / 2), Orvid.Graphics.ImageManipulator.ScalingAlgorithm.Bicubic); - t.Stop(); - WriteToLog("Bi-Cubic Scaling took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Bi-Cubic Scaling 1/2"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region Convert To Greyscale - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.ConvertToGreyscale(i); - t.Stop(); - WriteToLog("Converting To Greyscale took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Convert To Greyscale"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region Invert Colors - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.InvertColors(i); - t.Stop(); - WriteToLog("Inverting Colors took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Invert Colors"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region AddNoise Additive - { - t.Start(); - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.AddNoise(i, new Orvid.Graphics.BoundingBox(0, i.Width, 0, i.Height), 200, Orvid.Graphics.ImageManipulator.NoiseGenerationMethod.Additive); - t.Stop(); - WriteToLog("Additive Add-Noise took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - Bitmap b2 = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel1; - l.Text = "Additive Add-Noise"; - l.Height = b2.Height; - l.Width = b2.Width; - l.Image = b2; - } - #endregion - - System.GC.Collect(); - - #region Load Jpeg - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/jpeg/Building.jpg"), FileMode.Open); - Orvid.Graphics.ImageFormats.JpegImage jp = new Orvid.Graphics.ImageFormats.JpegImage(); - - t.Start(); - Orvid.Graphics.Image I2 = jp.Load(s); - t.Stop(); - WriteToLog("Loading a Jpeg Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Jpeg Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Tga - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/tga/Building.tga"), FileMode.Open); - Orvid.Graphics.ImageFormats.TgaImage tg = new Orvid.Graphics.ImageFormats.TgaImage(); - - t.Start(); - Orvid.Graphics.Image I2 = tg.Load(s); - t.Stop(); - WriteToLog("Loading a Tga took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Tga Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Pbm - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/pnm/Building.pbm"), FileMode.Open); - Orvid.Graphics.ImageFormats.PnmFamilyImage pm = new Orvid.Graphics.ImageFormats.PnmFamilyImage(); - - t.Start(); - Orvid.Graphics.Image I2 = pm.Load(s); - t.Stop(); - WriteToLog("Loading a Pbm Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Pbm Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Pgm - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/pnm/Building.pgm"), FileMode.Open); - Orvid.Graphics.ImageFormats.PnmFamilyImage pm = new Orvid.Graphics.ImageFormats.PnmFamilyImage(); - - t.Start(); - Orvid.Graphics.Image I2 = pm.Load(s); - t.Stop(); - WriteToLog("Loading a Pgm Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Pgm Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Ppm - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/pnm/Building.ppm"), FileMode.Open); - Orvid.Graphics.ImageFormats.PnmFamilyImage pm = new Orvid.Graphics.ImageFormats.PnmFamilyImage(); - - t.Start(); -#warning TODO: Make it so this isn't needed. - Orvid.Graphics.Image I2 = Orvid.Graphics.ImageManipulator.ReverseRGB(pm.Load(s)); - t.Stop(); - WriteToLog("Loading a Ppm Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Ppm Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Tiff - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/tiff/Building.tiff"), FileMode.Open); - Orvid.Graphics.ImageFormats.TiffImage tf = new Orvid.Graphics.ImageFormats.TiffImage(); - - t.Start(); - Orvid.Graphics.Image I2 = tf.Load(s); - t.Stop(); - WriteToLog("Loading a Tiff Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Tiff Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Png - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/png/Building.png"), FileMode.Open); - Orvid.Graphics.ImageFormats.PngImage p = new Orvid.Graphics.ImageFormats.PngImage(); - - t.Start(); - Orvid.Graphics.Image I2 = p.Load(s); - t.Stop(); - WriteToLog("Loading a Png Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Png Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load 24-Bit Bmp - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/bmp/Building-24Bit.bmp"), FileMode.Open); - Orvid.Graphics.ImageFormats.BmpImage bm = new Orvid.Graphics.ImageFormats.BmpImage(); - - t.Start(); - Orvid.Graphics.Image I2 = bm.Load(s); - t.Stop(); - WriteToLog("Loading a 24-Bit Bmp took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded 24-Bit Bmp Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load 256-Color Bmp - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/bmp/Building-256Color.bmp"), FileMode.Open); - Orvid.Graphics.ImageFormats.BmpImage bm = new Orvid.Graphics.ImageFormats.BmpImage(); - - t.Start(); - Orvid.Graphics.Image I2 = bm.Load(s); - t.Stop(); - WriteToLog("Loading a 256-Color Bmp took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded 256-Color Bmp Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load 16-Color Bmp - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/bmp/Building-16Color.bmp"), FileMode.Open); - Orvid.Graphics.ImageFormats.BmpImage bm = new Orvid.Graphics.ImageFormats.BmpImage(); - - t.Start(); - Orvid.Graphics.Image I2 = bm.Load(s); - t.Stop(); - WriteToLog("Loading a 16-Color Bmp took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded 16-Color Bmp Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Monochrome Bmp - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/bmp/Building-Monochrome.bmp"), FileMode.Open); - Orvid.Graphics.ImageFormats.BmpImage bm = new Orvid.Graphics.ImageFormats.BmpImage(); - - t.Start(); - Orvid.Graphics.Image I2 = bm.Load(s); - t.Stop(); - WriteToLog("Loading a Monochrome Bmp took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Monochrome Bmp Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Load Gif - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/gif/Test.gif"), FileMode.Open); - - t.Start(); -#if AnimateGif - anim = Orvid.Graphics.ImageFormats.GifSupport.Load(s); -#else - Orvid.Graphics.AnimatedImage anim = Orvid.Graphics.ImageFormats.GifSupport.Load(s); -#endif - t.Stop(); - WriteToLog("Loading a Gif took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - - Bitmap b = (Bitmap)anim[0]; -#if !AnimateGif - anim.Dispose(); - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Gif Image"; - l.Height = b.Height * 2; - l.Width = b.Width * 2; - l.Image = b; -#else - GifPictureBox = new PictureBox(); - GifPictureBox.BorderStyle = BorderStyle.FixedSingle; - GifPictureBox.Parent = flowLayoutPanel2; - GifPictureBox.Height = b.Height; - GifPictureBox.Width = b.Width; - GifPictureBox.Image = b; - animpar = new Orvid.Graphics.Shapes.ShapedImage(anim.Width, anim.Height); - anim.Parent = animpar; - animpar.Shapes.Add(anim); - - time.Interval = anim.TimePerFrame * 4; - time.Tick += new EventHandler(time_Tick); - time.Start(); -#endif - } - #endregion - - System.GC.Collect(); - - #region Load Xpm - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/xpm/Building.xpm"), FileMode.Open); - Orvid.Graphics.ImageFormats.XpmImage x = new Orvid.Graphics.ImageFormats.XpmImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Xpm Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Xpm Image"; - l.Height = b.Height * 2; - l.Width = b.Width * 2; - l.Image = b; - } - #endregion - - System.GC.Collect(); - -#endif - - #region Dds Loading - - #region Dxt1 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Dxt1.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Dxt1 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Dxt1 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Dxt2 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Dxt2.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Dxt2 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Dxt2 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Dxt3 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Dxt3.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Dxt3 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Dxt3 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Dxt4 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Dxt4.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Dxt4 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Dxt4 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Dxt5 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Dxt5.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Dxt5 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Dxt5 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A1R5G5B5 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A1R5G5B5.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A1R5G5B5 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A1R5G5B5 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A4R4G4B4 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A4R4G4B4.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A4R4G4B4 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A4R4G4B4 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A8B8G8R8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A8B8G8R8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A8B8G8R8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A8B8G8R8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A8R8G8B8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A8R8G8B8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A8R8G8B8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A8R8G8B8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region R5G6B5 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-R5G6B5.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-R5G6B5 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-R5G6B5 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region R8G8B8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-R8G8B8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-R8G8B8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-R8G8B8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region X8B8G8R8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-X8B8G8R8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-X8B8G8R8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-X8B8G8R8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region X8R8G8B8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-X8R8G8B8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-X8R8G8B8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-X8R8G8B8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region L8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-L8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-L8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-L8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region L8A8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-L8A8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-L8A8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-L8A8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A2R10G10B10 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A2R10G10B10.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A2R10G10B10 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A2R10G10B10 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A2B10G10R10 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A2B10G10R10.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A2B10G10R10 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A2B10G10R10 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A2W10V10U10 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A2W10V10U10.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A2W10V10U10 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A2W10V10U10 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A4L4 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A4L4.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A4L4 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A4L4 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A8R3G3B2 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A8R3G3B2.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A8R3G3B2 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A8R3G3B2 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A16B16G16R16 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A16B16G16R16.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A16B16G16R16 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A16B16G16R16 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A16B16G16R16F - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A16B16G16R16F.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A16B16G16R16F Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A16B16G16R16F Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region A32B32G32R32F - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-A32B32G32R32F.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-A32B32G32R32F Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-A32B32G32R32F Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region G8R8_G8B8 - { - //FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-G8R8_G8B8.dds"), FileMode.Open); - //Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - -#warning TODO: Add support for this format. - //t.Start(); - //Orvid.Graphics.Image I2 = x.Load(s); - //t.Stop(); - //WriteToLog("Loading a Dds-G8R8_G8B8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - //t.Reset(); - - //s.Close(); - //s.Dispose(); - //Bitmap b = (Bitmap)I2; - //LabeledImage l = new LabeledImage(); - //l.BorderStyle = BorderStyle.FixedSingle; - //l.Parent = flowLayoutPanel2; - //l.Text = "Loaded Dds-G8R8_G8B8 Image"; - //l.Height = b.Height; - //l.Width = b.Width; - //l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Q8W8V8U8 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Q8W8V8U8.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Q8W8V8U8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Q8W8V8U8 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Q16W16V16U16 - { - //FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Q16W16V16U16.dds"), FileMode.Open); - //Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - -#warning TODO: Add support for this format. - //t.Start(); - //Orvid.Graphics.Image I2 = x.Load(s); - //t.Stop(); - //WriteToLog("Loading a Dds-Q16W16V16U16 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - //t.Reset(); - - //s.Close(); - //s.Dispose(); - //Bitmap b = (Bitmap)I2; - //LabeledImage l = new LabeledImage(); - //l.BorderStyle = BorderStyle.FixedSingle; - //l.Parent = flowLayoutPanel2; - //l.Text = "Loaded Dds-Q16W16V16U16 Image"; - //l.Height = b.Height; - //l.Width = b.Width; - //l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region R3G3B2 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-R3G3B2.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-R3G3B2 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-R3G3B2 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region R8G8_B8G8 - { - //FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-R8G8_B8G8.dds"), FileMode.Open); - //Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - -#warning TODO: Add support for this format. - //t.Start(); - //Orvid.Graphics.Image I2 = x.Load(s); - //t.Stop(); - //WriteToLog("Loading a Dds-R8G8_B8G8 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - //t.Reset(); - - //s.Close(); - //s.Dispose(); - //Bitmap b = (Bitmap)I2; - //LabeledImage l = new LabeledImage(); - //l.BorderStyle = BorderStyle.FixedSingle; - //l.Parent = flowLayoutPanel2; - //l.Text = "Loaded Dds-R8G8_B8G8 Image"; - //l.Height = b.Height; - //l.Width = b.Width; - //l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region UYVY - { - //FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-UYVY.dds"), FileMode.Open); - //Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - -#warning TODO: Add support for this format. - //t.Start(); - //Orvid.Graphics.Image I2 = x.Load(s); - //t.Stop(); - //WriteToLog("Loading a Dds-UYVY Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - //t.Reset(); - - //s.Close(); - //s.Dispose(); - //Bitmap b = (Bitmap)I2; - //LabeledImage l = new LabeledImage(); - //l.BorderStyle = BorderStyle.FixedSingle; - //l.Parent = flowLayoutPanel2; - //l.Text = "Loaded Dds-UYVY Image"; - //l.Height = b.Height; - //l.Width = b.Width; - //l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region X1R5G5B5 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-X1R5G5B5.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-X1R5G5B5 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-X1R5G5B5 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region X4R4G4B4 - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-X4R4G4B4.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-X4R4G4B4 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-X4R4G4B4 Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region 3Dc - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-3Dc.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-3Dc Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-3Dc Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region Ati1n - { - FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-Ati1n.dds"), FileMode.Open); - Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - - t.Start(); - Orvid.Graphics.Image I2 = x.Load(s); - t.Stop(); - WriteToLog("Loading a Dds-Ati1n Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - t.Reset(); - - s.Close(); - s.Dispose(); - Bitmap b = (Bitmap)I2; - LabeledImage l = new LabeledImage(); - l.BorderStyle = BorderStyle.FixedSingle; - l.Parent = flowLayoutPanel2; - l.Text = "Loaded Dds-Ati1n Image"; - l.Height = b.Height; - l.Width = b.Width; - l.Image = b; - } - #endregion - - System.GC.Collect(); - - #region YUY2 - { - //FileStream s = new FileStream(Path.GetFullPath("ImageFormats/dds/Building-YUY2.dds"), FileMode.Open); - //Orvid.Graphics.ImageFormats.DdsImage x = new Orvid.Graphics.ImageFormats.DdsImage(); - -#warning TODO: Add support for this format. - //t.Start(); - //Orvid.Graphics.Image I2 = x.Load(s); - //t.Stop(); - //WriteToLog("Loading a Dds-YUY2 Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - //t.Reset(); - - //s.Close(); - //s.Dispose(); - //Bitmap b = (Bitmap)I2; - //LabeledImage l = new LabeledImage(); - //l.BorderStyle = BorderStyle.FixedSingle; - //l.Parent = flowLayoutPanel2; - //l.Text = "Loaded Dds-YUY2 Image"; - //l.Height = b.Height; - //l.Width = b.Width; - //l.Image = b; - } - #endregion - - #endregion - - System.GC.Collect(); - - - //#region Load Pcx - //{ - // FileStream s = new FileStream(Path.GetFullPath("ImageFormats/pcx/Building.pcx"), FileMode.Open); - // Orvid.Graphics.ImageFormats.PcxImage px = new Orvid.Graphics.ImageFormats.PcxImage(); - - // t.Start(); - // Orvid.Graphics.Image I2 = px.Load(s); - // t.Stop(); - // WriteToLog("Loading a Pcx Image took '" + t.ElapsedMilliseconds.ToString() + " ms'"); - // t.Reset(); - - // s.Close(); - // s.Dispose(); - // Bitmap b = (Bitmap)I2; - // LabeledImage l = new LabeledImage(); - // l.BorderStyle = BorderStyle.FixedSingle; - // l.Parent = flowLayoutPanel2; - // l.Text = "Loaded Pcx Image"; - // l.Height = b.Height; - // l.Width = b.Width; - // l.Image = b; - //} - //#endregion - - //System.GC.Collect(); - - - st.Flush(); - st.Close(); - st.Dispose(); - - } - -#if AnimateGif - private PictureBox GifPictureBox; - private Orvid.Graphics.AnimatedImage anim; - private Orvid.Graphics.Shapes.ShapedImage animpar; - private Timer time = new Timer(); - private void time_Tick(object sender, EventArgs e) - { - animpar.Modified = true; - GifPictureBox.Image = (Bitmap)animpar.Render(); - GifPictureBox.Refresh(); - } -#endif - } -} diff --git a/Users/Orvid/ImageManipulatorTester/Form1.resx b/Users/Orvid/ImageManipulatorTester/Form1.resx deleted file mode 100644 index 1af7de150c..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-16Color.bmp b/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-16Color.bmp deleted file mode 100644 index 02ec84b164..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-16Color.bmp and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-24Bit.bmp b/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-24Bit.bmp deleted file mode 100644 index 7ccfaf9c68..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-24Bit.bmp and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-256Color.bmp b/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-256Color.bmp deleted file mode 100644 index 4818f9bb79..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-256Color.bmp and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-Monochrome.bmp b/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-Monochrome.bmp deleted file mode 100644 index 3b99100357..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/bmp/Building-Monochrome.bmp and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-3Dc.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-3Dc.dds deleted file mode 100644 index 02a41c53ce..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-3Dc.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16.dds deleted file mode 100644 index be825ce086..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16F.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16F.dds deleted file mode 100644 index e7b3c1aab2..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A16B16G16R16F.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A1R5G5B5.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A1R5G5B5.dds deleted file mode 100644 index ebc1ab113e..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A1R5G5B5.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2B10G10R10.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2B10G10R10.dds deleted file mode 100644 index 255be1374a..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2B10G10R10.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2R10G10B10.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2R10G10B10.dds deleted file mode 100644 index c186bcc348..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2R10G10B10.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2W10V10U10.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2W10V10U10.dds deleted file mode 100644 index 0f293ead0d..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A2W10V10U10.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A32B32G32R32F.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A32B32G32R32F.dds deleted file mode 100644 index 82967749d2..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A32B32G32R32F.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4L4.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4L4.dds deleted file mode 100644 index db98afb1f0..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4L4.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4R4G4B4.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4R4G4B4.dds deleted file mode 100644 index 58148fe0fd..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A4R4G4B4.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8B8G8R8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8B8G8R8.dds deleted file mode 100644 index b82f7e850c..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8B8G8R8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R3G3B2.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R3G3B2.dds deleted file mode 100644 index c165e642a1..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R3G3B2.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R8G8B8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R8G8B8.dds deleted file mode 100644 index 677c4346e9..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-A8R8G8B8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Ati1n.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Ati1n.dds deleted file mode 100644 index b94853c850..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Ati1n.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt1.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt1.dds deleted file mode 100644 index fa0db059a3..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt1.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt2.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt2.dds deleted file mode 100644 index 004dc1d2bc..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt2.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt3.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt3.dds deleted file mode 100644 index 1791723295..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt3.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt4.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt4.dds deleted file mode 100644 index 38eb3f23d9..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt4.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt5.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt5.dds deleted file mode 100644 index 985353d492..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Dxt5.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-G8R8_G8B8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-G8R8_G8B8.dds deleted file mode 100644 index ba5f2fef10..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-G8R8_G8B8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8.dds deleted file mode 100644 index 24f5d66437..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8A8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8A8.dds deleted file mode 100644 index 4c21ce322c..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-L8A8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q16W16V16U16.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q16W16V16U16.dds deleted file mode 100644 index 431a53af9b..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q16W16V16U16.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q8W8V8U8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q8W8V8U8.dds deleted file mode 100644 index 6b0c5f29b0..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-Q8W8V8U8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R3G3B2.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R3G3B2.dds deleted file mode 100644 index 9c0db9129f..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R3G3B2.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R5G6B5.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R5G6B5.dds deleted file mode 100644 index 92afae4286..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R5G6B5.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8B8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8B8.dds deleted file mode 100644 index 8980fb40fc..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8B8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8_B8G8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8_B8G8.dds deleted file mode 100644 index 28d4ad1e37..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-R8G8_B8G8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-UYVY.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-UYVY.dds deleted file mode 100644 index 0cdd3080fd..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-UYVY.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X1R5G5B5.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X1R5G5B5.dds deleted file mode 100644 index 40f3af0812..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X1R5G5B5.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X4R4G4B4.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X4R4G4B4.dds deleted file mode 100644 index df9804c0f1..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X4R4G4B4.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8B8G8R8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8B8G8R8.dds deleted file mode 100644 index 731a9c112e..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8B8G8R8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8R8G8B8.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8R8G8B8.dds deleted file mode 100644 index 379ca6173e..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-X8R8G8B8.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-YUY2.dds b/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-YUY2.dds deleted file mode 100644 index dba626cec1..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/dds/Building-YUY2.dds and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/gif/Test.gif b/Users/Orvid/ImageManipulatorTester/ImageFormats/gif/Test.gif deleted file mode 100644 index 2a97f6dbc3..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/gif/Test.gif and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/jpeg/Building.JPG b/Users/Orvid/ImageManipulatorTester/ImageFormats/jpeg/Building.JPG deleted file mode 100644 index 5112f01bb1..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/jpeg/Building.JPG and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/pcx/Building.pcx b/Users/Orvid/ImageManipulatorTester/ImageFormats/pcx/Building.pcx deleted file mode 100644 index 0459f9e0e7..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/pcx/Building.pcx and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/png/Building.png b/Users/Orvid/ImageManipulatorTester/ImageFormats/png/Building.png deleted file mode 100644 index 46b7f8ef23..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/png/Building.png and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pbm b/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pbm deleted file mode 100644 index 9499763bf3..0000000000 --- a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pbm +++ /dev/null @@ -1,3967 +0,0 @@ -P1 -400 337 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pgm b/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pgm deleted file mode 100644 index 23b99d35c6..0000000000 --- a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.pgm +++ /dev/null @@ -1,99 +0,0 @@ -P5 -400 337 -255 -^_`aaa``ba`````__`acddcbbaaaaaabbbaabcbbddddddeeeffddefffgghhgfffdbbeffeefeddfededccdddcabddba``bbba`_```aaa`abbba```aaabbbbbbbbb``aba````````aa`^^`baaab``aa__`___^]]`b`_^^_`_]^^_`````a_^__^^^]_^^```bzc`^`_a\^_^]]]^[\]\\\]^^^^]]__^]]\[[[[Z[\[YY[\\[[\\\\[\ZZ[[[ZYXYZZYXWYZXYYXWWXZYXXYZZXVWXXXXXXYWWXXXWWXVVWXXWWVTTUUUUUTUVWVUTSRTTSTSRRRSTTTRQQRRPPQRQPPOOOPPPOOOOPPOMLLKLLKLMLJLMMMMLKKMMLLKJJIIJKKJJJK````aaa`ba``aa``_`abbbbaaaabcbcdccbbbbccccddddddefffefggggghgggffedddeeefgfefffdddcdddcbbcddcbbbaaaa``aaabbaabbbaa`aaaaaabbccba````aaaaba```_`abba`abbaaa__ab``b`````_____````_^^_``_^__`___`___^`_^`__a|�k`a_[X__^^^^]]]^^^]\]^]]]\\]^]]\\\\\[[Z\\\\\]\[[Z[[[[Z[[[[[ZYXXY[ZYYZ[WXYYXXXYWXXYYXWVXWWWWXWWXWXXXWWWWWXXWWVVTUUVVVVVUVVVUTTTTTTUTRQRQQQRSSTSRPPQRQPQPPPPPPPPPPONMMLLNNNMMMLKMMMMLLLLLLLKJIIIJKKKIHHIca``abaabaaaaaaa``aabbbabbbccbbbddcbbbcdeeeeffeeegggfgggggggggggeffeedeffggfffeddddeeecbccccccccaaaaaaabcddcbaa`bbbcccbbabcdcb`_cbbb`_`bcbbaaabcdbabbaaab`_`a__`ba``aa_^_`bbb`___`aa_]^^_^^``___^``_`__b��sc_^``a_]]^_^\\]^^]^_`\]]\[\]]]]]]]]]\Y[\\\\\\\[ZZ[\[Z]\[[[ZYYXZ[[ZZZ[XYZZYXXXVXZZXWWWZYXXYYXWXXXYXWWWXXWVVVVVUUVVUUVVVVVVUUUUUUUVVTRRSQQQSTSQRPPQQQQQQQPPPPPQRQNMLLMMNNNMMMMKNNMLKKLMMLKJJIIIIJKJIHHHcb``aba`baaabbbbbbbbbbbccccddcbbdeddccdeeeffggggfghgghhggggghhhhefggeefgffffffdcddddddcbdcbbbccccccbbbbbcdedccbaccccddddcdeedba`edcba`abcccbbbbbcbaaa```ba```___ca__`aa``abcba__`aa`_^_`_^_``_]]^a````ad�ݣ`c`\``^\]^_^]\]]]]]^_\]^]\\]^^^^^^^]][\\[[[\]]\[[\\\[\\\[ZZZZ[[[[ZYYYZZZZYXWWWYZZYXXXZYYYYYYXXWXXXWWXXYWVUUVWUVVUUUUVVVVVUUVVVUVWWUTTTSRRSSQOQQQQRRQPSRQPPPQRRQNMMMNNMNNNNNNNNMLKKKLLMLKKKKKKIJKKJIIIbaaabba`baaabcccbcccbbcccbceeeeedeeedddeddefggggghihiiihhhhhhhhhffgggggggggggfeddcccccbbedbbbcccdddcccccacddddedccbbcddddeedccccecbbbccdbccbba``cbaaaabaa``aaaaab`_^`accbbbaaa__ba`__`ab`_```^]\_a``a`ad���m`a`\_^]]^^^^__^^\\\\]]^^]]]^^^^^]]]]^^^]\\]^]]]\\\\\\\]\ZZ[\\[[ZYXXYZZZYXXXYXYZZYYXXXXYXXXXYXWWXYXXXXXWVVVWXWWVVUUUUWWVUUUVVVUUVVUTTSSSSTTSRRRRSSRQOSSRQPPQRQPONNNOPNOOPPOOOMMMLLLLLMLLKLLLLKKKKKJJIaabbcba`bbabbcccbbcbbbbccccdeddedeffffeeeefghhhhijiiijjjiiihhhhhgggghhhgihhhhgffeeddcccceddcccddddccdeeecdedddddddcccddedddcbbcdecbcddddbcccbaaacccbbcccbbbbcbba```abccccbaaa``_ca_^_abca`aaa_]]`a`_```b���{_`cd``__^^^^___^]]\\^]]^^]]]^^^]\\]]]^__^\\]\\]]\\\\[\]\[Z\]\[ZYYYZZZYYYYYZ[YYXXYYXXXYYYXXXZXWWXYXXXWXXWWWWXXWWVWVVUWVVUUVVVVTSTUTTTSSTTTTSSRSTTSSQPSSSRQPQQPPPPOOPPOOOOONNNNNNNNMLLMLKKLMLLMMLKJJIIabcccbbabbabbccbbbcccbcddddddccdfffgghggghijjjiijjihijkjiiiiihgghhhhhhhhhggggfffefeeedddddeddddedcccdeeeeffdcddcedddddddccccbbdedccddccdccccbbcdcddccccbcccccba```abccbbbbbaaaaaba`_`abba``aa`_^aa_^```a���ga[c```__^^^^^^^_```^]\^^^]]^^^]\\]^\\^_][[\\\]]]][[\\\[[[[[\[ZZ[[[[YYYYZZZZZYXXXYYYYYZYXXYYYXXYYXWWWXYYXWXXXWVVXXVUVUUUVVVVVTTUUTSRUUUUTSRQSTTSSSRQRSTSRQPQPPQPPONPONOOOMMNONNNNNMLMLLLLMLKMMLJJIIHabddcbbcbbabbbbbbdeedddeedefffghggfghiiihhijjjihjjhggijjiijjihgghiihhghhgeeffededdeedccbbceedcdeedccdddccddddeffccccddcbbbccccdf`abddcdfcbbaabdecddbbbb`aabbccbaa``abba`abccaaabaaaa```a___aa````a^^abab���bbd^_^^___^^^^^^__``_]\^_^]]__^]]]_`]]^^\[\^\\\]^^\Z]\[[\\[Z\\\\]]\[ZZZZZZYXZZYXXYZZYYXXXXWWZYXYYXVVWXYZYXXXWVTVXYWTUUUUVVVVVUUVVURQUUUUUTRQTUTRRSTSQSTTRQPPPQQPONNPOOPQQPPQONMMMMMMNMLLMMKJLKJIIIIIabbcccccbcccbbcdcddeeeddcdffggggfhijiiiiijjiijjjjjiiiijjjkkkjihghhhhhhhiffffffdbddddeecbcefecbccdffcbceeccccccddedccdddccbbdddcbcbbddaabddcbabcdceedbabcbbbaabcdcbaaaaaaaaabba`___abb``acbb`___``aaa`ace~���g^^d`a```^^`a`_]^^__^\\__]]^__^]]^_`^_^]\]]]]]\]^_^\^][[\^][ZZ[[[[[[[[ZZYYZZZYZ\]ZXWWWXZ\\ZYZZZYXXXXYYYYXXWVWWWXXWVUWWVVVVVVVVVVVUSRSUVVSRRSTTTSQQRTSRRRRRRQRPPQQRSQNOPPONOPLLLLLLLLNNMKJLMLKKKKJJKLcccdddccddddccdeeefeddccddeffggffhiiiiijiiihiiighhijjjkkjjjjjihgjiihhgggeeeeeedbccddeeeecefdbcddeffdccddcdeeeeddecbbccb`cbbcdccccbbdcaabbbbbbcdeccdcbbbbdcbbbbbabaabbbaa`aaaaa`_aaabba``aaaa```aabcbaace���gbb``a`_`^]`__^]^^^_^^_``___^]]]^^^^^_^]]^^]^^]\\\]^^^]\\]]\ZZ[[[\\]]\[[ZYYYXXY[[YXWZZZZ[ZYWYYYYYYZZYYYYYYXWXYYYYYXWXWWVWWWVVVUUVVUTSTVVUTTUTTSSRRSSTSRQQRRRRPQQQRSQNOPQQPONMMMMMMNNNNNMMNONKKKKKKLLdccccbbbcccccccceefeddcdeedefgggghiiiijkiiiijjighijkkjihiiiiiihgjihgffffdedddddccdeeeeefdeedcdeeeffedddcabdeeeeefecdffecdccdcccddcceeccdbbccccdebbbcccccdcbccca_aabcccbaaabbbaa`caabba````aaaa``_`aaabce����eed^`a``a`^_^^^^____]^_^^___^^]^_`_]^^^]]^^^^__][[\^]__]\\]]]]\\\\\\\[[[[[\\YYZ[ZYXXYYXYZZZYZZZZZYYYZYYYYYXWXYYYXWXXYXVWXXWWVVUUVVVVSTUVVVUUUTSSTSSSTSRRRRRRQPQQOPQPPPOPPPONOONNOOOOMNMMMNNMLLKKKLLLddccbbbbcbabcccbddddeeeegfeeghhhhhiiiijkijjjklljiijjjihghhiihhhhggfeefffdeeddeeddeffdccdeffedeeedeffeddddddddddeccbceeedddddccdffeeffdddcdddccccbcccccddccbbccbabbcddcbabcccbbbbbaaaaa`aaaaaa```__`aabcd����gcabaa`aca_`_```a``_\__]\^____^____^^^^^^^^^]^`_]\]^\^^][[\]^^^]]\\\[[[[[\]]ZZ[[ZZZYXXXXZZZZYZ[[[YXWZYXXXYWVWXYXVVWXXWVVWWWWVVVVVVVVUUUUVUTSTTTTTTSSSSSTSSRQQPQQOOQPQQONNOPQPOOOOOOONNMLLLLLMLKKKLKJfeeddcccdcccdddcdcbceffegfffghhhiiiihiijikkjjkllhiiijjiighiihghiffeeeeffeeeddeeedfggeccceffeeeeddefffeeehhgedccccddeeeeeddcdcbdffedeedccddeedcbbbcddccdedccccccdccccccbaccccbbccbaaba`abbbaaaaaabbbbbbbb|��la_eaa`aca_````````_^``^]_``^__^]]^^^^^^^]]^\]^^]]]^]]]\[\\\[\]^_^^]]]]\\[[[\\\\ZZZZ[[[[[ZZYXYZ[[ZZZ\[YYYYXWXYZYWVWXXWWWVVWWVVWXWVVUVVTUUUSRTUUUTSSTSTTTTSRQRQRRPPQPQPQPOOQSQPOOOONNOONMMMMNNMLKLKJJeeeeddddddddeedddcccefeegffffghhiiihhhiiikkihijkjjjiiiiighiihghhgggffffeefeddeeedfggfedeeeeeeedceeeffeefefffedcbefggfeefdccccbcegfeeeedcddeedcccbdeecbceeeddccdeccbbbbaacccbbbbcbbbcbabdbbaabbbbbababbbbwy��obca`a``b`_`____^^_^_``_^_``__`_^]^`^^^_^]]]]\\[\]^^]]]\]^^]\]^^^^]]]]]]]\\[\]]\Z[[Z\\\\[[ZZ[ZZYYYZ[[ZYYXXXWXXZYWWWXXWXWVVWXVVXXWVUUVVTUVVUSSUVUTSTTUUSSRRSTTRSSRRRQPQSSQPQRQPONNNNMNNMNNNNONNMMLLKJddeeeeddccddddddddddeefffgggfghiihhhhiiiijjihhiijjjihhgggghhhhgfgggggfeeeffedeedefffeeffffeddffefeeffeegbcdeedddcdeedcccdcccccddfeeeefeeddeeddcccdeedddeeeddddddcccbccbbcccbabcdccbccbbcbbbbccbb``__bbccx|r�~ed_`a``a`_a__^^^^_```___^^_^_``__a``__`_^]^^]\\\]^^]^]]]__^^^^]]\\\\\\\\\[[[]]\[[[[[[ZZ[[\\\[[ZYYZ[YYYYWWXXXXXXXXWXXXXWWWXXVVWWWWWWWVUUUVUUTTUUTTTTUUTTRSTUURRSSSSPRQRRQQQQQPOOOONNMLMOONMNMNNMLLKKdeffffffcdeeedeecefeeegifghhgghihhhhhiiihiiiijihghhhhhggggfghhfdffgggfeeefgeeeedffeddeffhgeddghggfeeeeegffeeddddddeefeedfdcdeedeedccdeedeeeedcccddeeeeffccbceedccccdddcccddcbbcedbbbcbaacccddca`baa`abcc�wM͕h_c`aa`a`_b`_^^^_abb`_``^^_\]^_```_a``a`^^^^^_^^]]]]^]]]___^^]\\\]]\\\\[ZYX[]^][\]\ZZYYYZ[\YZ[\\[[[XYZYXXY[YXXXYYXXYWWWWWXXVVWVWWXYWWUUUUUUUTTTTTTTTTUUSSTTTRQSRSRORQPPPPPPRPOOPPONMMOPPNLLLMMMLKKLdffffhhhgeddeggfffffggffihhhhiiighiiihiijiiiihhhijjjjihgiiiiihgfggfffffedfghgfefhfdefghigfeefhgefedeeeddgedefeddeeddefffeffdcdeecddddddceeeeeeeeddddeeedbcddcbbbbcdcbcddedcccbbbfecbbbbbbaaccbbbbcddddcb~|R��fgbbaabbaab_`````abb`^_ab`__^^^^^_`^^^__``_`_]^``^\]__^]]]]]]]^^^^^[]]]^]\Z\[ZYZ[[\^\ZZ\]\[\ZXXZ[ZYYYYZ[[\\[ZYYYZYWZZYXXWWWXWVVUUVVVWXXXXYXWVUUVVVUSSTTUTSRRRSRRSRPRRRRRQQPOPPPPPPQPPQQPPONMNNNNNMKefgfefghgfeeffgfgggggggfffffhiijhhiiiiiiihhiiiiijjjiihhhgghhhhhgffffffedcehhfeeggedeffffhhgefgfdfeeeffedgeeffeddddddefffdeedegggdddeeeeeffeeeeffcddefedceeedccdecddccdddedccccbbcbaabbcccbbbbbabeca`cffd}{j��rf^baabbaabbbba__`aa`___``_`______``__`````______^]_``_^^^]__^]]]^^]^^\\\\[[ZYYZZ[[]\[[\]\\[ZYYZ[ZZ[[ZZ[Z[Z\[ZYYXXWYYZZZYWVVVWXXWVUUVWVVWVUVVWWWWUVUTTUUTSSSTUTSSSRRRRRRQQQQQPPPPONNNNNONNNNNNMMMLKfghfdeghhggggggghhhhhhgghhgghhiikjjiiihhihhjjiijkjihhhiihijihgggfffgggfebegfdceggffggfeegggffeedddddefedfeeffdddfeeeeeddffeefggfeeeeeeeeddddddeeeeffffedfffeddfgdddcdeedddcccccbbbaabcdddbabbbbcccbbcdba�~g�ځ_fbabbba`addca___`aa`_]^_```_`````______^^]_``_^^^```_^_^]__^]]^^__^]\[[\[[[Z[[\\\]]]]\\\\Z[[[[[[[\\[[[ZZZ[[ZZXXXWYYYYYXWVUVXYYXWUWWWVWXWVVWXXWVUUVUUUTTTSRTUTSRSSRRRRQQQRQPPPQPOMNNOOONNNNNMLLMMLgghgffghhhiihhhiiiiiiiihiiiiiiiilkjjjjjijiijjiijkjihhhhihiiihgggffggggfedegfeefhgffggfedefffeeefbcddefgfdeeeedddfeefffedggfffffeffeeddddccccddddfeedeeffcdeeeeffeeddefeddcccccccdccccddcbaabcccd`cedbabb|~U��fbbbbbba`acbbaaa```a`_^^_a`__`a```_^^^^^^]]^``_]^^__^^^_^\]]^^__^^_^]\[[\\[[[\]]\\]]^^\[\\YZ[[\[[Z[[Z[[[[[ZZZZXXYYZYXXXXXXVWWXXXXWXXXVWXXWVWWWVUTTUUTTTTTTSTUTSSSRSSRRQQRRRQPPQQPOPOPPPQPONNNMNOOMggghhhhhghhiiiiiiiijjjjjhhhiijjkjiiikllljjjkjiijjjiiiihhfffghhhgffffgffeggghhhhifedeeddddeffeeefdfgffghhddeeeeeeeeefggggefffeeefffeeedddeeeeffffedccdeeecddeeedeeeedeffdddcddddceedddddcbaabccbcbcdbacfi}{F��habccbaaaaaa`acca_`aa````a`__aba`aa``aaa`_^_```_______^_^]]]^__^^^^^]]]]]][[\]]]\[\]]]\[\\YYYZ[[ZYZZZZ[[[ZYYZYXXYZZYXXYYYYYYXXXXYYXXWVVWXWXWUUUUUUTTTSSSTTTUUTTTTSTSSRRRRRSSRQPQQQRQOOQQPNOOOOPPOMgggijjhhggghhiiiiijjjjjjijjjjjkkjjjjjkjjjjjkkjjkkjijjjhghhghiiihffffggffhggghhhgfeeefeefffffedeffhhgfggfeefefgggggfgggffffggeddeeffffffegfffffggddeffffeffedddddefeddeededddeddcddddeeddcbbcdbaaccbcdeeb�wLy�adcddbaabbaaabcca_aaaaaaaaa``abbaaaaaabbaa````aa``_```_`_^`__^^]]]^^^^^^^^\\]^]]\[]]]]\[\\\[[[\\\[[[[[[[ZZZ[[ZYXYYZZZZ[[ZYZZZZYYYYYYXWWXYXYXUUVVVVTTTTSTTUTTTTTUUTTTSSSSSRUTSRQQQQSQOOPQPNPPPOPPMKgggiiihihghhhiihiijjjjjjklllkkkkllllkjiikjjkkjjklkjjkkjikjjiihhghggghhhhggggggffgggggffghgfffefgfggefgfdggfefhhgighgfffehhggfdcdffghhggfffffeeeeeefghgfeffeeedddeeedddedeeeeeedcdddeeedceccddcbbcceffd]W�xha��g^cddbabccbbbccba`bbaaaaaab``aba`````abbbaaa```aaa_```_``_a``_^^^^^]]^^^^_^^^_^^]\]]]]]\]]^^\\\\\\\\[[\\[[[[[ZZYYY[[ZZZZZYZZZYYYXXYYXWXZYXWWVVVWVVUVVUUUUVSTTTTUUUSSTTTTTTUTSRRRQPSRQPPPOOPOONOONKhggihghjihhiijihijjjiiijijkkkkkljklmlllmllklkjijmlkkkkkjhiihggghhfffghhhhhhhggggggghhfffigffgfgiggfegjhehgfefhhhfefffhhhhffhhgfffghhhgfeffffeeeeeeeeffeecdeggfeddefdcdddffeffedceeeeeedcedccdcddcegfda\Y�rh��hgcedbabddabccbabbcba```abb```a`__aaaabbba````_``a_aa`__`__`aa`_^]^]\]]]]_^^^^]]\[]]]]]]^^]][ZYYZ[\\\\\]\\[ZZZZ[[[][XXXYYYYYXXWWXXWWWWXYYXUVWWWVVVWWWWVVVWTUVUUUWWSSTTUUUUTRQRTTRPSTSRPOPQOOMMOPONihhhhhgfghhihhiijiiiijjjljijkiikjkllkklmklljjlmllllkkjjjjjhggiiihghgggijhgffgggfhgfffggfggggfgghhgghhhhiggggfffghfggghhgeghhgfedfffhhgffjihggfffeefgfffgfeeeeeeeeeeeeeeeedegfdcedefedefeeddddeeegbjc^``]~�tmi�v`dddccccdcccbabcebbbbaaaabbbbaaa`caabcbabaaaaaa``````__^^^___^^_`__^]\]_a_^]\]]^_\]]]]^_^_^]\[[[[]\[[\\\\[[[[[[ZZ[ZZZ[[ZZ\[ZYZ\\ZYXXYYXVWVWXXXWVVWVVVWWVUVUUVVTTURSTUUUUURRSTSQRTRQPQQPPPPONOONNNffghiiiihiihhhiiiiihhijjljikkjjkllkjiiklkmmkjlljkkkjjjiiiihhhijihhihghijefhiihgghhhhhiiigggggghhggghhhhhhhhggfgghfgggggghhgggggggfghhgffhijjigffeefggeeeffffffffeeeeeefffeefecdfcddcccdcdddddeefcdfhedchk�rkhhgidcccbbbcaaaaaabbbbbbbbbbccbbbbaaba`bcbaa```aaaaaa````__^`_^^^_____^]]]^^^^^^_^^^]^]\\^__^^\\[[[[Z[[ZYYZ[\[[ZZ[[[ZZ[\\[ZZ\\\[Z[[ZXWXYXWWXXYYYXWVVWWWWVVVVWVVVVTTUTTUUUTTSSRRSSRRTRPPQRQQRPOOOONNOihhhhiiiiiiihhijiiiihhjkljjkkkklkkjjjkmnkmmlkkkjjjjjjihgfggghiihggiihhghghjjigffhhhhhhhihhhhgghhgfghihhhhhhhggghhhgggggghgffggiihhhiihggfhjjigggffghhgfgggfffgggefffeffggfeeedegdeedcdddcdddeeffgg`eaejd����nigabcccbbbbbbcdeedcbbbcddcbdcbbbbbba`abcbaaaa```aaaba``aba_ca^^_``_^^_^^^^^^_____^^^^]\\^``^^]]\\[[]^_^\\]_]\[ZZZ[\YZ\\[ZZZZ\\[YYZZXXYYWVWYZZYYWVVVWXXWUUVWWWVVUTTUUUUUTTSSTSRRSSSTRQPQRRQRPPPOONNPlkjiihhhiiiiiiiiijkjiijlkjikkkkkjjklmmmljlmlkklkjjjjjihgeffghihffgiihhggjjihgfgghiiiggggjjihhgghhggiiiijiihhgghiiihhgggggffgiihhhhhiiihghiihgghiffghhgghggffggffggffeffggfffeefhfggeeefeeddeefeehebg^flDFq��heedcccdccccaabccccccbcdedcabbccccbbaabcccbabb````aaa```bbbaca__`a`^^^___````__^____^^^\\^____^^^]\\\]_^\[]^]\[ZZ[[\YZ[[ZYYYXZ[YXY[\YZZZXWWWYYYYXWVVWXXWTTUWWVVUUUUUTTTTTTTSTSSRSSTTSQQQRQPQRQPOONOPlkjijjkkhhiiiiiiijllkjklkjjklkkkllmmmlkjkllkkkllkkkkkjihhhhhjkjhfghiihhhihgfghiiijjjihhhiiiihhijigghiijkiihhggijiihghhhiihhklkihggghhihgjigfffhhgffgfffhgggggggghhggggfgfffffefgeffeefffgeddffdcdcegenxBCd]Pcfhddddddddcabccbbcdcccddda``bdddcaaabbcccbacbba``aa``````bbbbabbb`_`___``aa``__^^__]^^]]^^]____^^]\[\\\[[\\]]\\[[[Z][ZYYYYYYZYXYZ[[YZ[[ZYWVWXYYYXWWWXWVUUUVVVUUUUUUUUUUTTTSSTTSRRTUSRQRRQQQSRPOPPONlkjjjkkkhiijjjjjjkllkkkkkkklllllnnnnmmmmmmlkkkkjlkkklkjiiihhjkjhghijjjiiihhhhihhiiiiiiijhhiiiikligfghiijiiihhhijjiihhhijjhhjjihigghhhiihjihhhhhhihhhgefghihhhhggihggggfgeefffeffefgfffggfeddffdbcggcil{TH=uei`jaddddddddcdddccdfddddccaaabdeedbabcccccbacccbaaaabbba`_aaabbbbaa`aa`_______```_^^]^_^^^^]^_^^^]]\]]]]]]]]\]]]\[[Z^\ZYZZZZ[[ZYZ[[[XY[[[[YWWXYZYYXXXXWWWWWWVVVUUVVVWVVUTTSSSUUSRRSTTRRSSSSSTSQPPQPNmlkjjjjjjjjjijklllkkkllmlllllmlklmnnnnnomllllljikkjjkkkjjiihijjhfghijjjikkkjjihghhhhhiiihhiijjkljhggiiijiiiihhjjiiihhhhiigghighighhhhiihhhiiiiiiiiijigggiijjihgghgggggggfgggffffghihghhhfffgggfecggfgfsQSd�ncedieddddeddcccbbbcddeedcccdbbcdccb`cddccccacccccbaacbaa````aa``````aabba`_^^_```_^^^___^^_^^_^^^]]\\\\\]]]\\\]]]\\[]\[ZZ[[[[\[[[\[YXZ[[ZZZXYYZYXXXYXXXXXWWWVWWVVWWVWWVUTTUTUVVUSSSSSRRSSSSSSSQPQRQOlkjjjjjjllkiijlmnmkkkmnnkkklllkjikmnmkjklkklmmkikjijkkjjkjhhikkiefghiiiikllkjijjjihhhiihiiiiiijkjhhijjiiiijjiiiiiihghhiihghjjhhjhihhhiihghihhhijggijjhggiijjhgffhhggghhhhihgffffghhgggggefhhhhhhfcfhco�`V[�|kfddeeddeeeefeefefffdeedccdfdbabcca`deedcccbccccccbbca``abbaba`__`aaaaabbb`_________```_^__^^^^^^^]]^^^___^^\\\\\\\\Z[[[ZZ[\Y[\\\\ZYX[\ZYYYX[ZYXWWWXWWXXWWWWWXXWWWWUVVVUUUUVVWVTSTSQTSRSSRRRQRRQQRRPmljijkllikmmkkkkmkjkllmnmllmljhhkklmnnmlkkklllkjkiijjhjlmkiijjihhhijkljikkjkkkjhhijjjjihijjjiiijhhjjkklljjiijjjjiihhhhhimljjkkjjiiihhhjkghhiiihhiiiihhhijjjjihhghhgfhijihhgghgfegggggghhggggfeeghffgo}�bhg��kgchefgfeefeedddfffdfdddddcbdccbbccbc`^_bcbaabccbbb`aa__ab`^``bba`_^`aba_^^_^_______b_^^_^_a_____^]]^aba````^]]]^]\[\\\ZZ[\\\[[[\\\[[[ZZ[[ZZYZZXVVXYXWWWYYYWZXWWXXXWWVVWWUTTUTUUSRSQRRSTTSSSPPPPQQRSmlkklllllmnmlkkkmlkkkkklnmmmmljjllkklmmmmmmmnmlkjjkkkjjklkjjjkjijjijklkjkjiiijjiiiiiiiiikkjjjjjihijkllllkkkjkkjjkkjjjjjjlkjjjjjjjjjiiijkiiiiiiiijjjjihhhijjjhhgghhihhiihihggggfeffffggfeefffffffbhkeo��S\p��gfcafggfeeffedcceedcdcdeffcbcccdddcbcb``bdcbbccbbccbaaaabba_`acca```aaaa`_``________b`___^^^__]^__^]]_`__``_^^^^^]]]\]]]\]]\\\\\\\[Z[ZZZZZZY[[[YXXXYYXXXYYYXXXXWWWWWWVVWWVVVVUVVTTUSTSTUTSSSRRRSRRPPlllmmmllmmmllkjjlkkllllmmllmnmllmllklmnnmmmmmmkjikllkkkjkkjjjjjklkjjklkkkjiijjjjjjjiijjkmlkjkkjiijkkkkkkkkkkkkjjjjjjjjjiiikkjjjjjjjjjjjjjjjiiiijjjkjjihhhhjjhgghhijiiiihiigggggfhggghhgffgghhgggkeeboy�Vjt��gfiggggfefgghfefeedcdcdeffddcccdddcbedccdeeedddbbcddabcbccb``abbaabbbba``aaa``_````_a`___^^^_^]]^_^]^__^^__^]^__^]^^]^_^]^^][\^^]\[Z[ZZZ[[ZZZZZYYXWWZYXXXYYYWYYXVVVWXWWWWWWWVUVVUUVUUUUUUTSTTSSSRQPOkkllmmlkmlkkllllmlklmmmnmllmmmlmmllmnnnnmmmmmlkkiklkklljjkkjjijklkkkkkkkkkklllkjkkkkkkllmlkkkkjjjkkkkjjjiiikllkjijjjjiihhikkjjjkjjjjjiiijjkjiijjjjjjiiiighjjhhhihjkjiiiijihhhhiijihhhiiihhiiihgfdejcmz�iOm��fdgbhhgfffggihfffedcfeddefffdcccdddedddddeeeeedccdddbccbbbbabaaabbbbbbaaaaaaba`baba`b`__`````_^^^^^]ba`___^]^^^^^^^^^_^]\]^^[]^^]\[[[[[[[[[[ZYYYYYXVYXXXYY[[XYYXWVWXYXWWVVVVVUVWUUVTWUTTTTTUUTRRRSSRlkkkllllmmllmnnnpnlllllmmllmmmlmlllmnnnnonmllmmmikljkmmkkllkjjkkjkkkkkkklllmmllkkkklllllkkkkkjkkkkllkjjjiijkllkjjjkkkjiihikkiiijjjjjjjiiiijkjjjjjjiihhijhhiiiijkijjihiiihhhhiijjiiihghiihhhihhgfkcgkv�s� Ni�kkjkhhgfffgghgffffddfeeeeffgeeccdeeecdeeeddddedccddcdedcbcdddbaabcbaba```bbbcbbaaaaabaa``abbaa`__^^_ca`````_^^]^^^^^^^^]\]^]\]^]]\\]\\\\\\\\[ZZ[[[ZYYYYYYYZ[YYXWWWXXXWVUUVVUUTVWVUUSVUTTTTUUVTSSTUUUllkkllmmmmmmmmnnomlllllmnmmnnmmmmlkklmnoonmllmmmklkklmmlmmmmlllmjklllkllmllkklllkkllllkkjkllkkklklllkkjjkkklmmkijkkkkjjiijkkjijkkkjjjkkkhijjkjkjiiihhhijhiiijjkkjjihhijjghhhiiijghjjihhhhhhiiihhfjmp}�F|;RE�rkcjiggggfgghgffggfeeegggffeeedeffedcdfffeeecdeddddceedcbdeeecbbcccbbbaa``aabbaa````bba``aa`_`a`__`aa```a``a_^]]^_^]\^_^]]]\]]]\\\]]\\\\[[[[[[Z[\\[[ZZZYYXYYZYWWWXXWWVUUUWWVVUWXVVVSWUUVUUUVTSSTUUTRllllmmmmmmmmllmnmllmnmmnmmmoonnnnmmlmmnnmmmmmmmmnllmmmmmnnnmmmnnlmnmllmnmmlllmmnlllkkkkkjkllmlllllmmllkklkklmmkijlllkjiikklkkjkklkjijkmmkkjkllkjiijjiiijjihijjjjkjihhjjighiiiiiihikkjihhiiiiijihjgep��U�fmY��khhhgfggfefhgfffgggeegggfeeeefgggedefffffffefeddedceedbcdedeedccbbbbbbbbaabbbcb````abba`a`^^_`a`````^_``^^_a``_____]^__^^]\^]\\\\\\]]]\[[[[[[ZZZZ[[ZZ[ZYXXYZYXXXXXWWWVUVXWVVUVWVVWUVTUWVVUUSRRSTTSQlllmmmmllnnnmmnonnnoomllmlmooonnnnoooomlnnnooonmommoomlmnmmmnnnoooonllnommnooooonmlkkkllkklmnnmkmmnnmlllkjjklmkjlmmmkkjjlllkkkkllkihijmmmkjjklkjijkkjjiikihhijjikjhhijjhhijjiiiiiijjiihgiihhhhggfhhkx�z��|{��eeihgfggfeegffeefffeeefffffgfffffeefeeddeffffeddeedddcbcddccdddbabcacccbabcbcdca`ab_abbbba^__`aa`_^__``_]]^aaa`___`___^]^^^^]\\]]\[^^^]\[[[\\[ZYZ[\XZZZYXYYZYYZZYXWYYWVWXWUWUUVUVXVUTTVWVTTUTSSUUUSlmmnmmmnlmnnoponoonnnnnnonmmnoppnllmnnnnqqppponmnnoqpmmnnmlmnnnmmlllllmnmnnnnnnmnlmomlnnknnkkmmkklmmmmlkmmlklmnmmmlkjkllmmlkkjkkkkjiikmomnmllljihijkkkkkjjjklkjkiiiihhhiijkjiijljhhijiijijjhhiihgihr���sa���jjggghhgfggeghgfgfefghfghiihihgfggfggggffeehgggfdceedccdeedbdeedcccaceccbdfcddb__acbaaaaa`_____`abbba_^^^^^`_^^_____``_^]]]^^]\[[\\__^]]\\\\[[ZZZZZY[[ZYYZZ[ZZYYYXXXWWWVVUVVVWWWWVVWWVVVVUTUUVVUTSSmmmnnnmmmnoooppoppoonnnnponmnoopmllnoonnooopppppnoppponooonopponnmmmmmmnmnnoonnnomnomlmmmoomlmnmmllmmmmmmmlklmnmonnmkkllnmmlkkjjmmlkjkmnkllllmkjijkkkjkkkkkllkkljjiiiiiiijkjiiijjiijjjjkijjiijjigjl����u~\���njhgggggggghiihhhhgfgghhhgggggffggghhhggfffggggfedefeeeefeeeedcbbcdacdccccccddcaabcabba``aa`aaaa```a`__``aaaaaaa``_^^__^^]^^]]\\\\]]]]]]]^^[\\]\[ZYZ[\[ZZ[[Z[[[ZZZZVWXWWWXYWWVVVVWXWWVVVVVVTTUUUUTTonnnoonmmoppppppppponnnoponnnnnonnnpqppoopppooppnopoopponnnopponmlmmmmmmnnoooonnomnnllnnnnnmmlmmnmlkklmnlmnmnonmnnmmllllnmllllkjkllkkkkkkllllmlkjkllkkkllkjkkjkllkjjjjjjjjkkjiijjihijiijjjjiijjjkln|�qwWINui��dghhhhhhhgfffggggghghjkjjjfggffggfhhggggffffggfefgeeffffeefedcabcdbbccddcabbbbbbbabbba``bcabbbba`_a```aaaa_``aaaa`^^__^^^^]]]]]]]]]]]]]]]][\]]]\ZZYZ[ZZZ[ZZ[[[ZZZZWZZYWXYYXWVVVVWXWWWVUVVWUUTTUUTTnnnnnoonnoppppppopponnoppponmmnnonnpqpooppqponnonppnnopnnnmmonnmlllnnmmnnooooonmnlmnlloonllmmllnnmlkjklmmmnnnomllllmmmllllklmmkjjjijkllklmmmlmkilmmmlklmllkjjjlmmkjjkkkjjjkkkkjjihhhiiiikjjjjjkkklkx���UT`j>��jiihhhiihhhghihghifghgghihghhggggegggfffffffgggfffeefffeeeeeffdccccccccdcabbabcccbbbbbaabcbbbbbbaaaaaa````__``````__`__^^^]^^^^^]]___^]\[[\\\\\\[[YZ[ZZ[[[Z[\[ZXYYX[[XXYZYWXXXWWVVVVVVUUVVXWUUUUTSmmnnnnooonnoppoooooonnopqponnnnnpnnnoononnoooopqoppnmoomponmnnnommnopooooonnnnmlnllmllnonllnnmmonmmlkkllmnnmnonlkllmmmllllllmmkjmkijlnmllmmlllkjmmmllllmmmlkjklmmkjjllkjjjjkkkkkkjjjkkkkkjjjjjkkipou��rXSadN��lkiihhiiihjjkjhgghgjkhfhhefgggfgfeggffffffggggffffeeeeedeedeeffecbeeeccccbddccddffcccbcccbccbbbbbbbbaa````cba`__^^````____^^__^^]\___^^]\[]]]\\\\\[\]\\]]\ZZ[ZZZZZXYXXY[[YXXXXWWVVVVVVVUUUYWVUUUUTlmmmmmoponnoppooppoonnnnpppoooooqonoppppnnnnoopqqqpoooonqponooopmmnppoopponnnnmmommnlkmmmllnnmmnnnnmmmllmnnmnonlmmmmmmllmmmmmmkjnlkkmnmllmmllmllllllllllklljjjkllkjjllkkijjkkkklklkkkllljjjkkkkkkhu{tgdO=Qt\u�kijjjjjjjigijihhhghkkiijigfgggghhggggfffgggggffggffffeeefeeedeedccfffdccddddddccefccbccdbadcbbaabbaaaa``aabba`_^^^__``````_____^^]^^^^^^^^]]^^^]\\[\]]]]]\ZZZZ[\\\ZYXXYZZYZYXWVVWWWWXXWVVUWWVVVVVWmmmmmnoopooppoopqpooooonoppoooopqoopqqqqrqooooonrpppqpopppoonoopnnnopooopommnnnnpnnomlmmmmmmnmmlnnnnnmmmmnmmmnnlnnnnmmmllmmnnmmlllllmmlkmmmllmnmmlklnonljklkjjkkllllllkkijllkklmklkkkllkjijklkjkoo^]os�����wi�mljkkkjjjjhkkijlkglifghgggfgggghihhhggggghgggffghggfeeffgfffedddcceffeddddddeeddddcbbbbcbbcbbbbbbbaaaa`abb_`aaa```__`````a`````___^^^^^___]]]^]]\\[\]\\\\Z\[ZZ\]]]\ZYZZYXYZYXWWWXXWXXWWVXXWWXXVVWWnnmmnooopppqpoprqpnopqponnonnnoonmnpqqpptrpopponrpoqqpopppqpppppqppqqpopqommnopponopnmnnnooooonlmmmmmnnnmmmmmnnmmmmmmnnnklmnnoopjlmnmlllnnmllmnmnllmppomkmnmlllllllmlkkljlnmkkmnkllkkmmkiijllkjkaRPkx|��Ǻ�����hijihhhiikjghjg`ynhijggjghigghhghhgggghhggfeehiggfeefggfgggffecbdefeeddcdefffedcccbbaabc`abcccccbba```ab`bcddbaa_````__````aaa````__^^^^^]\[[\]]\]]]]]\[^\ZZ\]\[\YY\\YY\XXXXXXXWWWWVVVWXWWYXUUVWoopppoooqqqpoopqqqpqqpnmlnonnnoqnoooooopsssqpoqrsrpopsroopqqqpppopqrrqppoppoopponpqqpoooonnmnnnnoonnooonmnnnnmnolmmlkmnnmmnnnnmmomlmmlklmnoonlmmkkllmnlinllmmlmnomlkkkllkmkqljmnlnklmkhmlhlnijoWDCH�}|��������}mhMmfkkkhljjhihj_�smlhhljjjjhgfghgghihghhffhhhhhheggggffghfeeggfecdeedcdedddeeeedabddddddbaacefedaa``_`abcaabddb_`````aaba``aaaa_`aba`^___]\]__^\\]^^][[[\\[[[ZZY\\\[ZYYYYYZYWWWXYXWVVWWVVVVVWXWVppqpppppqqqqppqqqppppponnooooopqopqqqpppqrsrqqqqssrpqrrqpqrrrqqqrqqqppqqpppooppoopqpooopponnnnnnmmnnoonnmnoonnnoopnmlmnmmlllmnnonmlmmmmmnmlkkkmnmmlklmlkomlllkkkmmmmklmnkphlmoponqo{osrfklnhknpJ5@Ospy���w����|`ZOjliiklkhjmn~y~�zimhfjiiihggggfiiiihfeegghhiihghhihgfeeggfffeeefffffeeeedcccccccddeeeeecbbccccbcccba``aaaabcca`bbaaaaaa_`aaaabbaaaa````_^]^__^]\]^]\\\\[[[[[ZZY[[[[ZYYZ[ZZYYYYZYYXWVVWXWWWVWXWUpppppppppqqqpppqppooppppppoooppppqqrqqqqqqqrrqqqqrrqpqrrpqrrrqqqrrqpppqqrrpoopqppqqpoopqqqpppooolmnooonnnooonnoppqonnnmmmmllmnppmnmnnmmonmkkkmoponmllmmlpnllmlkjlmmmmlmngpszwxxv�~qhr�ppmlnjoknFCDXkP]]QXZVZv��t_SnollijhoibT���������xijigghhgfhhiiiigfhggghigfgghihgffghiifffggffffffffeedefggedddeeddccccccbbcdddcbaaabcdccccaa``````_`ba```bba`___^]__^^^^^]\]^^]]]^[\\\\[[[ZZ[ZZYYZ[ZYYYZZZXYXWVVWYXXWWWXWUooonnooooppppoooponopppppoooppppppqppppqrqpppqrrqrrqpqrrqrrrqqqqqqqqqqqqssrqqqrqqrrqqpqqrqqppooomnoopoooooonnnoopppoonnmnnnnonnnnooomlmnllllnooonnnnnnmmpnlmnnmlmmnmmlmlopj}lfohmx`Zy�}ynjknnlpHJP\�nhxmmnvnr���}YlejkhigmZ9;�tw}������nihhiiihhffghjjihihhhhhgfgghhhhhhgijjgffgggffffffggffghhhfedddddcccdddddebcddcccbcddeddcd```````a`acba`_``````_^^^__^^]]]^^___^^^\\]]]]\\[[[[ZZZZZZYYZYYYXXXXWWWXWXXWWXXWnnnnnnnonopponmmpooopppopooopqqpqpponopqsrqpqqrrsrrrsssssttssrrrqqqqrrssrssrrrrqqrrrrqppqppponnnoooooooonoonnnnooooooonmooooonmloponmllmkklmnnnmnnnnnnnnonlmnoolmmmmmmlknsDsZY�m�eW��z�xuopipqIUZ������op�����~�fqppnponQ&$A�so|rt�onsnjjjkjiijighhijjiijjjihhhjihhhhiihhiihgffhiihhggghhgggfeegggfeedeccdeeeggbbccbccdddddddcaaabbbbbb`aabba`^]_abbaab^___^^^^^_```_^]\]^^]]]]]\\\[[[ZZ[[\[ZYXYYYZZYXWVXXXWXXXnnnnnooonopponnnpooopponqpopqrrqqqponopqrrsssssrsrqrsssstttssrrrtsrrrsuvrssrrrrqqrrrrqpoqqqqpoooopooooopnnoonnnnnnnoponnponnnnoonponmmmmnmmmnnooonmlmmnonnmmnnolmllmnpmllu2}ic���xtm��{w�������}������������������������R&.5C��}�|~�nmshlkjkkiijjhiiiiiiijjjihghjihhhijkhggghgfehhhhgggghggggfedfggfeddecdddeeffcccbbbccedccddcaccccbbaaa``bcca__`bba```_````_____``_^]\\]]]]\]^^]]\\\[[Z[\\[YXXZZZ[\[YWVXXWWXYYnnnooooonoooooooponoopooqppppqqqqqqppppqqrssssstsqqrssrsssssrrrsvutsttuvttsqqrrrrrrrqqppqrrrqpppopppppppnoopoonnonnoponoponnooppoponnnnmpoonnoqrpommmmnomnnmnnolmmmnoonmt[5|����������}xypu�~����{m}snu{qz���}��uqzw�F**9`���������ygnljkkiiijiiiiijjiiiihgghjihhijkkhhgghhgghggggggfggggghggfffeddeeddddffedddccbbcdfeddeedbbbbbbaaaca`bcdb`aaaa_^^^````aa`````_^^^]]^^]\\]^^]]]]]\\ZZZZZZYX[[[[[ZXXWXWVWYYXnnnooponmnooooppqonnopppppppppppqqrrqpppqqrqqrtusrrstsststttssttuuuuuuttuusqprssssrqqqqpppqqpoooopqrqqqqooppponnpnnppoooppppqqpppqonnonmnooonnpqppoponmnmnnnnopnnoooonnnqDh������{lfm���}}ib�zm�yk�jY�mY��do|it�v��lu�gsc63=M����������kqmjkljiijkjiihiikkjjjjiilkjiiiiijiiihhhhihghiihgihgfffffgffffgffedcdffedcdddddddeeddeedcbbcccccbecaabca`aa`_`````__`aaa`ba_^^^__^^^]\\^_]]\\]]]\][ZZ[\[Z[[[ZYXXXYXVVXYXVponnooppnnoponoqppppppqrnnooppqqrrrrqopsqttrqssqsrqrsttsvvusrsuuussstutstutrrttrsrqqrrrqqqqqqqppqqqqqqqqppppppppnqqqrqprpppqqponsrponopqoppnmmoorqnmmnopnmmnommnponnoponn2XeYX\a`cc^f�����jq��xxw}qk~m]�xn��l��v��{�nyq95*3rrqkm�lsx�qqnmkjkkmlkjjjjihljhhiihghijkjiiijiijigfgiiihhgggigfghhhifhiheddeeffffffgdggedddbeeeeeeddabbbbbbbbbbbcdddcb`````_`aa``aa___^_`a`_^^^]^``^_^^^^]\[[[\^][YYYYYYYYYYWXXWXYYYnnnnoppponoppppqppppqqppoooppqqqrpopqqrsqrsttttttsrrsttsuvutsttttsssstuustsqqssqrrsrqqqrqqppqqqqpppppqqqppqqpppqnppprqqrpppqqqporqooppqqqqpoopqqponnnoppponoonmnonnmmnnnq0'R^cjojihkcrt|��������������������������������f0&8y|z�|zpqbdxoijmmkikjjkllllkjhhhiiiiijjjjiijijkkiijjjjiiiiijihiiiijiiihfeddffeeggggceedegfegfffeeeeddddcbbbdcbccdddcbaaabba`aaaaaa__^^_````^__^_``^]]]^^^^]]\[\[ZZZZZZZZYYXZZZYYZZYnnnooonnpooppoooqqpqqqpoppppqqqqsqnopqqqsstuusstttssssssssssssrqtttssstutttrrtsrqrssqpqsrqpppqqqpppppppppqqqqqpqopooqpnoooopqqposqooooomqponoqrqoooooooopooooonopponmnopr5 Pdz��tw~rmumtxy������������������������������G&8}�������^hvnhjlkkkjjjkkkkkjjjjiiijiijjjjjjiiijjjijiiiiiiiijiijihhikigfggedfeffggggefeeegfdggffffggeeeedcccedccccdddcbbbba``aaaaaa`````````_``````^\\]]^^^^^]\\[[[[[[[[[[ZYZZYYYYXWmnnnnnnmponopoooqqppqqpopppppqqqsqooqqqpssstsrqqssssrqrrrrrrssrptuttsssstttsstsrqstsqprsrrqqqqqqrrqqqqqqpqrrqqpqqqpoqqooooppqqpprrppponmpponnprqqqppponnonnnooppppoooopps2 Ynxy����z~�~om{vnptniotnnhnmj����vts��mdbj�|( '9���������l`vnikljjljjkkkkkjkjjjjjjkjijjjkkkiiijiihhiiiiiiiihhijhgghjhffgggfgffffgggghgeefeceefgggggddeedddeedcbbcccdccbbba`aaaaaaaabbba`__`_`````_^______^]^^^^]]\\Z[[\\\[[XYYYXXWVlmmnnoppommopppprpopqrqppppppppppppqrsrqoqrqqssqqrssrqrstsrsttsrtttttsrqsssrsssrrsssrrrsssrrrrqqrrrrrrrrqqrrqqqqqqpqssstsrqqrrqqqrqrrrrqpqqooqssrrppooonnnnnoopponnoppooj,b{�x�wr�]����}�~}v�ststvupqyt}���}wyxxggoth'##"7�t�������fZzqjknljijjklllllkkjjkkllkjiijkkkjkkkkjjjjjjjjjjihiiihfffhgfffggfgghgggfhefgfefffcdefgfeddeeeeeeeedcbbcddbbbbcddccbaaaabcbba``_``__```__^a`````_^^^^^^^]][[[\\\\[YZ[ZYYYXnnnooopppooppoooqpoopqrrpppppppppqrrssrqpssppssoqrsssrsstsssssstssstttsrssssttsrssssssssttssssrqqqrrssttrrrrqqqrqrqqsrrtssqqqqppqrrsrrrrpqqppqssrrppopppppooopoopoopqqpnc%lfsU\\Ni8bo��������tw~wy{vu|xz{t���xrl�npwn~Y"!"-rJ}9~Rnyve\uplllkjkkkkklklkkkkkllllkkkjjjkkjkkkklkkjjjjjjiijjijiggghhhgffffghiihggiefffeefgdefggedcffffeeeeedcccddedcbcdedddcbaaabc```_``aa__`a`________^^]^^]\\]^^\\\\[[[ZY[[ZZZZYoppponnnqppponmnppppqqrrqqqqqqqrqttsssrpssrqqrqpqrrssssssrsssrrtssssssttttttuutttssstttsttssssrrqqqrrssssssrqrrsrsrqqqqrssqqqqpprsrrqqoooppppqrqqqppppqqpqpppppnrqqqqqpod$ xn_������~{x{qonnlnpomnnmlkllkkklllmmnlkkkjijkjjjkllmlkjiiijkkjiijkjjjjijihhhihghhhhiiihhhiihgggggggfhgffghgggghgffffeeddefffddeeedddfffecbbbabbbbcdda`aaaa``aba`___^__^^]^^^^^]\[ZZ[ppqrrrrrssssrrrrsrrrrqqqstuuuutrrrrsttssuutstuuustttttttttttssststuuttuvtuvvuttuttssrsttvtsttssutttssstututtsrstssrrstsrtsrqrrsssttsrrrrrrrrqqrssrqpqqqqqqqqqqqqrsqqrrqnuk,Gsp�n_�{��~�m����m�k�i�n��v�e�b�v����l�b�qz-n�����������}lar��kI=411EjsS/7r~������yf���S����Ѽ{xuuuutssruttsrrrsqrqpqrsrtsrrssrrppqrrqppppppqssrrrqpppppooonnmmnopppponmmnonnmnnnnmmmmnnnmmmmllmnmlkkkklllkkkkllllkkjjjjijkkjijjiiiiiiiihhhghhhhhhggggfeeffedcccedddeeeexyyxwvwxxxyzyxxyzxxyzyyyxzzyyz{zzzyyz{{{yyyz{|{{{zzz{|{z{{|||{|}{{{{zz{|z{||{{{{{z{{{z{}y{{zzzzzzz{{{{zzzz{{{zzzyz{zyyyz{zyyyyyyyz{zyyz{{zxxyzzzzyyyyyxwyzzyyzzzyyyyxwxwwv����(0�}� ���������xlx�rYenvunY=&5nb, Go������wn���N~fV|��}uwvvutsssttutrqqqtsqpqssqsrrrrrrqoprssrpoopqppppnqpooppppppppppnmnnoponmmnooppoooonnnmmmnmmmmlklmnmllmmmmmmmllllllkjjjjkkhjkkiiijjjjjhhikihhghhijggffffedgggfeccceddcddeeywwyzzyyyxxyyxxzzzyxxxxyyyzyyyzzzzzzz{||z{{zz{{{{z{||{{}{|||{{{|z{||{{{{z{|}}|{z{{{|}||}{|zy{{z|{{{{{{{{zz{{{{{zzzzz{{zzyz{{zyzzyz{{{zyyzyyzzyyzzyyzzyyyzyxwxzzyzyxxwxxwy{|���(7���#���������uy�wx������Զr5+ah*&_z�����gm���Z�u\���~yxwvvustuutsrrrsstttsrrqqrrrrqqrrrrrrrqqpppppoopqpppppppprrrqppoopppqqppooonnnoomnmlmnnmlnnmmmlklmnnmllmlnnmmllllkkkkkjjikkjjjjjjkkkkjihhhiigghggghhgedefffffecbcedddfeeeyxwxyyyyyxxyyxyz{zzyyyyz{{zyyz{|zzzz{{{{zz{zz{|{|||}}||~}}||{{||{{||{{{{{|}}}||{}||}}|||{|{z{{{|{{{{{{{{{{{{{{{{zzzzzzzzz{{{zzz{{|||{zyy{zzzzyyzzyyzzyxxzzxxxzzyyxxwxxxxxy{���(>�����������|{������������޲:'ha5~�����[o���m��s���{xvuuvvvwxvutssttsuutsssssrsrrqqrrrrssrqqqpppqqqqqrrrrrrrsqqqppooopppppponppponoonmmnooonmmmmnnmmnlmmmlmnmmmlllllklllkkkkklkkjjiiijkkjjiiiiiihhhhgfggggffffffgfeeeedcdfeddyxxyyxxyyyyyyxyzzzyyyzzz|{zzz{||zz{{{{{z{{{z{||{}|}}}|}~~}|{{||}|||||{{{{}}}|{|}}||}}{{||}|{||{}{{||||||{{{{{{{{zzzz{{zz{{|{zz{|||||{{zz{{{{{zz{zzz{{zyyzzyxyzzy{zyzzzzzwz|���-@��� ��������}���������������F4}8$n�����Tn���k��n���zywvvvvvvwutsttutsuutsstuussssrrrrqsttrqqrqqqrssqpsrqppqrsrqppppppppooppooqrrpooopmnooonmmnmmmmllllnnmmnnnmllmnnmllllllllklllkkjjjjjjjjjjkiijiiiihggfghhgeffgggffgfddeeddeyyzzzyyzyyyyyyyzzzzzz{{{{zz{{|{{{{zzz{{{|||{{{{{|||}||}}}|{{|||||}}}|||||}}|{{|}}||}|{{{|}|{}|{}{|||}}}||||{{{{{|{{{||{{||||{z{|z{{{{{||{z{{{z{|{{z{{zz{{{zyyzzy|{{{||}{w|}���/"?���"!�������������������������&Zc%Y�����Wh���e������zxwvvvuuutsstvvututtsttuustttssrrrrsssrrrrrrssrqprqppppqrqpppqqqqqqppppppqrqpopppnoooonnnpnnnnmllnoonnnnnmlmmnonnkklmmlkjllllllllijjjjjjkhiiiiiihihghihgfgggggeefgfeffeffyyz{{zzzyzzyyyzz{{z{{|||{{{{||{{|{zzz{|}|}|{{|||||}|||}}{{||}}}}}}}}|||}~}|||||}}||}}|{||~||}|{|||||}}}}||||||||||||||||}}}|{{|}zz{{{{|}{{{|{zz{|{zzzz{|{{{zzzzy{zzz{{{zx|~���*B�}�!!��������������������������i,�,Hv����ok���f�����πwvuuvvvuvuuuvwwvttttttttssttttsrrrrrsssrqrrssrrrrsrrrrrrrqqqqqqrqrqppppqqqqpopqqoonnoppqqonnopooonoonnnonllnnnnnomllllllklllllllljjklkkjjijjiijihjjihhhiihggggeefhffggfefyxy{{zzzz{{zzz{z{zzz{||{|||{{{|}||{z{|}}{||||}~}}}~}}}~~{|~~~~~~}}}}}}}~~}}}}}}}|}~~}}}|~}|}}{}|||||}}}||||||}}||||||||}}}}{{||||||{{{|}|||{zz{{zzzzz{}{{{zz{{z{{zzzzzyy{~���(B�y�$ ��������������������������&�?s����\RjU���kuo�؃tyyzyyyyzyxwwyzxwwxwwwxxwywuuwyzzvvuvwwwwwvuuuuuvwvuutttsstutsstvuuuuuttstttuuutsrrrssssttsqppqrsrstrqqrqpqqqqrrqpqqqqqqqppqpooopooonnnmmnnoppoonnnmlkkkkkklkjjijlkjkkjih||{{{{{{}}}}}}}}}||}}}~~~~~~�����������������������������������������~����������������~~~��~}~~~~~~~~~~}~~~~~~~}}}}}}}}~~~~}||~|}�o��msuer�g9������������������������׭�hwZh����~�������������������������ɫ��x�exZQ�����2&"8�������w�~}{zzzzyxyyzzyyyzvxyyyyxwwxyyxxz{xwwwwxxxxwwxwuuvuuuvvutsuutuuuuutuuvvvututtuusstuuttttttvussstttqstttttsrstsssrqrrssrqqrpqrrqppqqqqqqqppnnnnnoppnnopomlljklkjjkklkkkkjjk}||}~~~}~~~~~~}}����������������������������������������������������������������������������������������������������������~��~��~~~~~}~}}}~}}~~~|||~{y1rw��r~�������������������������������uxic����T,*:�������yw�}{zz{{zyzzyyyyyy{zzyyyyywxyyxxxxxvvwxwwxwwxwwvvwvvvuuttuwvvvwwvvwutuvvvvvvvusstutuuuuuuvsuwvtsturtvutuuttsttrpprttttssssrrrrrqqqooppppppqpponnpppqponmmlmmlllkkkklmljiij}}}}~~~}}~~~~}������������������������������������������������������������������������������������������������������������������~|~~}~~~~~�x/x��}|z��������������������������������RNi����m**-I��������y~|{{{{zzzyzzyxxyyzzzyyyyyyyzyxxxxxwvwxxxywwwwwwxxwwvvwwwvwwvvwwwvwuuuvuuvvuutttttuuvvuuuvuvvuttstsuutsssrssstsrrtttttssssrrrrrqqqrrrrqqrrppooooppoponmmmlmnnnmlkkkllljiij~}}}~~}}|}~~���������������������������������������������������������������������������������������������������������������������������������~~~�������{�Lrs]W[cmg����}�������������������������]\e�s~p/*%5op~|������|||||{{{z{|{zyz{yzzzyyyyzzzzyyyyxvvwwwwxwwwwwxyyyxwwxyxwxwwwwwwwvvvvvuvwwvvvvvvvvvvvuuvvwvuuuutstuutsssrttttsstuuuuttttsrrsssrrqssrrqqsrppooqqqpoponmmmlmmnonmkjkllkjjjj}}}}}}}}|}~���������������������������������������������������������������������������������������������������������������������������������������������������}�?Nhtrxy|�{m����������������������������`Vf����l(!"5wuuv�yh�y}}}}}|||z{|{zzz{yyzzzyyyyyyxxxyyxwwwwwxxwwwwwxyyyxxxxxwvxwwvwwwxvvwwvuvwwwwwwwwwwwvvuuvvwvutuuutttttttuuuuuttstuvvvuutttrsstttssrrrrqqrrqpppssrqpqpononmmnnonmlkkllkkjjk}}~~}}}}|}~�������������������������������������������������������������������������������������������������������������������������������������������������������|�y.Y~��������x���������������������������abz����V$C�������i��~}||~}|{zzzzzzyyyzz{zzzzxxwwwxxxyyyxxyyyxxxxxxxxxyyxxwwwxwwwwwxxwwxxwvwxwxxxwvwwxwvvvvvvwvvuuuuvttttuuuvuuuuttuuvvvutssssstttsssrsttttssrqqqttsrqqpoooonnnooonnmlllkkkkk~~~~~~}~������������������������������������������������������������������������������������������������������������������������������������������������������������j$c���{���������������������������������fPNotvm<%&B�������wz�}|{{}}|z{{zzzzzyz{{{zzzz{zzyyyxxyyyxxyyyyyyyyyxxwxyyxxxxxxxwwwxyxxxyyxwxxyzywwxyxwwwwwwwxxxwuuuvvuuuuutttuuuuvvvuvvutsssuutssrrrrsuuuttsrrrrttsrrrpoooonnnnmmnnnmmmlkkkk~~�����������������������������������������������������������������������������������������������������������������������������������������������������������r$Z���~r������������sxxz|yxzy}�{vwusrp~�=;Tz���Z()'K��������w|~|}||||{|||{{{{{{||{zzz{||{{{zzyyzzxxyyyzzzzzzzyxxxyyyxxxxyyxxyyzyyzzyxyyyyyyyzzxxxxxxxwxyyxvuuvwvvwwutttvvvvwwuuvvvuttsvuttssssttvvutssrrrrrrrrrrqooponnnnnmnnnonmllkkk}~~�������������������������������������������������������������������������������������������������������������������������������������������������������������6_��~�r��������������������������������MWf�����<.$E����������}}}}}||}|||{zy{||||{zzz{zyyzzzyxz|{zyz{{zzz{{{zxyxxxyywvxyzzyyzz{yyz{zyyyxxxxyzzyxxyyyyxwxyxwwwwxwwxxwuuvwxwwwvtvwwxwvutvutttuuvvvwvuttsrrrrqqqrssrppqpopppppoooponmlllk��~~��������������������������������������������������������������������������������������������������������������������������������������������������������������������8`��|����������������������������������^[_�����I+&D����������~}||~~}|~}|{{{{||}}}|{{|}}{zyyz{y{||{{|}zzz{{{yxzzzyxwwwxxyz{{{z|{zzyzz{zyxxxyz{yyyyyxxxwywvxyxxvwxwvuwxwxxyxxwvvvvvuuttuuvvvvwwwvvwwwurrsttsqqrqqpqqqpprpnoppomnoooonlk����������������������������������������������������������������������������������������������������������������������������������������������������������������������9k���������������������uaWNb����yf^He��rsY�����O-#K���������~~}|}~~~}}|||||}}|}}}|{{||||{zz{{|||zzz{{zzzzzzzy{{{{zyyyyyzzzz{{|{{{{zzzzzyxxyyzyyyyyyxxy{ywxxwwyyxxwwxxyyyyyxxwvvvvvuuuvvwwwxyyxwwvuuuutssssrrssrrrsrrqrqoopponnnnnnmll���������������������������������������������������������������������������������������������������������������������������������������������������������������������}��;_�����������������������~tAa�����}r;p�~~V�����B00D����������~~}~}}}}|||||}}}}}}}|{||||||{{{{~}{yyz{z{{{zzzz{{{{zzyyz{{{{zz{||||||{zz{{zzzyzzzzyyyyyyxzxwxyxxyyxwwxxwxxxxxwwvwwwwwwwwwwwxzzzyxyxwttuvutssssstrrrrrrrrsrrqqqpoooonmmmn���������������������������������������������������������������������������������������������������������������������������������������������������������������������������7U����������������������OwdH�����Hz`R�|y]�����>4/B���������}|||}}}}}|||}}}}|||}{{{{{{{{}}{zz{||{{|{{{{{zzzzyzzz{|}|{{|}||||{{{{zzzzzzyyzzzzzyyyy{yxzzzzzyxwwwwwxwwwwvvvwwxxyyyyxwwxz{zyxyyyvttutttsssttqqqrrrrrtttsrqqqopppnnop�������������������������������������������������������������������������������������������������������������������������������������������������������������������������~�;p�����������������������r�bV���j�[�qS�}zf�����-*?O�������������}||}~~~~}}}}~~}}|||}||{{{{||{|}|{|}}{|}}}||{||{{{{|}{|}}}}}}}||{{{||yyzzzzyy{{zzzzzz}}{||{{zzzyxxxyyyyxxxxxxxxyzzzyyxwxz{zyyyxwvuuustuutsttrrsstttttttsrrrropqqpoop���������������������������������������������������������������������������������������������������������������������������������������������������������������������������4t�xO0O���������������������a���}����]�jec����c-06E��]Ja�����~~~~~~~~~}}}}}~}|||}}}z|}}{{||||}}~}|{}}{{{|}~{|}}~}}|}}|{{|}}{{||||{{{{{{{{{{|~|{|}{|zzzyxxyyyyzzzzzyxxxyzzyyzyyy{{zyzyvuuvwwtvwvutttssttttuussssrrrropqqpooo���������������������������������������������������������������������������������������������������������������������������������������������������������������������������0o�s*{�cL�������������U�Y�c����T�N�b�VRk�����: @�j((_��������~~~~~~~}}}|~~}}}}}}{}}}|}}|}|{|}}|{~}{{{|}~~}}}~~~}}}}}}~~~}~~~~}}|||||||||z|{z|}{|{{zyyyyyyyz{{{{zzyyyzzzy{zzz{zzzyxutuvwxvwxvuuuuuuuttsstssssssrrqqqqpppp���������������������������������������������������������������������������������������������������������������������������������������������������������������������������8j��5x�2Jp������������T�lpj���z[�Y|]�e[\�����19�LE�������������~~}}}~~~~~~}}|~~~~~~|{|}}|}~~}|z{|}|{}|{|}~~�~~~}}~~~~~~~}|||||||||||~|{}}{|}|zz{|{{yz{|||||{{zz{{zyz{{zzzyzwwuuvwwxxyxvvwvuvwvutsssttsstttssrqppqqq���������������������������������������������������������������������������������������������������������������������������������������������������������������������������8f�l%XnbO�������������S�fmf����c�W}]�{xZ�����/8�X<�z�}�������~~~~�}~~~~}}~~~~~~}|}~~}}|}{{{|}}}|{||}}~}}~~~����~~��~}~~~~~~~~}|{{|}{{{{zzz{{|||{{||{z{|}|zyxxxy{{{{z{{yywwvwxxxwvvvvvwwwwvvwtstvutttuusqtttsrqpp���������������������������������������������������������������������������������������������������������������������������������������������������������������������������=RtIEZV[�������������X�gre����g�X�^�|zS�����8L�d6T���������������~~�~~~~~~~}}~~~~~~}}~~~||}~~~~}������������~~��~}~~}||~~~~~}}||}}||}}|{{{{{|}}|{{zz{{{{{zzzyz{zzzzzzxxxxyyzyyxwwvvvwwxxxxwustuuttttttsttssrrqq���������������������������������������������������������������������������������������������������������������������������������������������������������������������������=Ht2:_7~������������[�eug����g�[�e�xyX�����D!]�H<�v�����������������������~~~~~~�~~}}~}}~~~�����������~�~}||~~~~~~}}||||}}}{{{{{{|}~}|{{{{zz{z{|{zyzzzzyzzxxxyzzzyxwxxwwwxz{yyyywuvwvuuttttuuuvuuutt����������������������������������������������������������������������������������������������������������������������������������������������������������������������������}�-�������������K�hod���V�Y~_�cPQ�����Ye�v�c�y�{��������������������������������������������������������������������������������������������������������������������������������������������������������~~~}}|||������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>�w�"3�������������P�lod����_�X�c�ymP�����Sc�~�_�L�r�ԕ���������������������������������������������������������������������������������������������������������������������������������������������������������~�}}}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������C�w�)�������������]�qxf����g�[�`�vrJ�����Ve��^�J~l�ؖ�����������������������������������������������������������������������������������������������������������������������������������~~��������������������~���}}}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D�t�"-�������������b�pyj����k�_�X�wnQ�����Vb���Z�L}w�՚����������������������������������������������������������������������������������������������������������������������������������������������������������������~}}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������J�o�,�������������e�ptk����n�a[�vkM�����ai�~�]�Kx�͙��������������������������������������������������������������������������������������������������������������������������������������������������������������������~}}|������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@�}�$�������������o�rvg����s�_�Y�mgW�����bjxQ�\�L�}�֛��������������������������������������������������������������������������������������������������������������������������������������������������������������������~~||������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"F�y�(�������������u�r}e����x�_�Y�bKM�����]g}N�[�k�{�՘�������������������������������������������������������������������������������������������������������������������������������������������������������������������~}}�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������w G�{�.�������������r�w{f������d�W�kgL�����X]�\�e�����Ә��������������������������������������������������������������������������������������������������������������������������������������������������������������������~~}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������44L�r�#�������������s�xy_������a�S�okI�����f[�W�l�po|�י������������������������������������������������������������������������������������������������������������������������������������������������������������������~~}}|������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JLcMn�*&�������������r�zwb������g�V�qpP�����XNvR���~ew�ߘ�������������������������������������������������������������������������������������������������������������������������������������������������������������������~~}}������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lq}Yn�O3�������������x�yne������k�X�rlK�����\N`4xpu|yO�ƞ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cbegwf|v�}t�������������q��qh����}�n�Z�kfe�����b(%mvt~}{|�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8u��{rg]qv�{���ķ��´���{��xj����~�p�b�kv}�����/"'*�����}|s��������������������������������������������������������������������������������������������������������������������������������������������������������������������~~~���������������������������������������������������������������������������������������������������������������������������������������������������������������������������(ylotoa^zq�wr{��~|����Ҵ���������������rWPu~~�S'(3-�����fuv������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1vuxnxfb|xq�����������������W��������O{IYe�����24=1�����o~������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A���������z�����������������`��������]�flc�����69>J�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������C��������ܿ�����������������j��������b�ggl�����7?Ub������׫�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������N�Ǻ�������ٺ���͸����������i��������c�b_w�����NZ[b�������ϔ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������^��wtvtr�����������ҿ�������q��������r�y�������TM01�~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7dbsuzx|}�}����������������Ʀ�������˫֦������8(!,�������k�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������r����������������������}wz|~��}������������e"",-������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������w���st��������}y~~����~~��{y���}}~�������{x||W(+++�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0���oQz���k��������������������������������ad��1+&/����u��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;����Uw�������|q������}��zz��||��������Rs��B90����y��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;����_|�����h]�����p^��qY��o\��tb��r^��z_F^b~��?9-����x��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>����_v�����G,L�u���Y���[���]���h���l}��3/T_s��?>$'����v��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?����gz�����F!0�����Z���b���_���i}��o��|%G_ff��>9#/����|��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<����c������3;�����X���_���_���f���n��w$@i�t��><"+����w��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;����b�����~1-�����Z���Y���^���d���t~�R"3`}l��;?$(����x��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>����d�����|.!�����W���[���`���e���q��')PUbv�B<'����z��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������B����p�����}0&Kx����Y���X���]���f���n�r"Bej}�??'+�ƻ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������:�ǵ��������7>�Ķ���Y���\���_���d���m|� t����CA2.������̳�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A�vJb~������XU��ʲ��~�����ɪ�����������>)+�����EIDM�}o\e�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~I<(;n~�yut��@quvm����������������������O(eqvg^XPc``\Y`vqv����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F51;DPx������}O+qymvsxqpwllqpnzvrujdmulqd5 T}�e-foqudmpg����os�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������K>EJIW��������U7|������������������������~Og��r7lqu~v{z������z�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������eHG<BR����{���t8��������������x�����������b!p���F��~qNR��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������u{k!%\�����q��t3���������{����������}����kw���L�����Dt����y���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v}�2#Y��������p4�������uX:*Nq������wX;3Rx�o!s���K�����af~�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������w��?%\��������p6�������w{�j*8�����v}�h-5�m p���I�����]l~�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������s��C"Z��������q6�����������^.i�������x�S)pb!w���J�����^h|�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v��>![��������p6��������o|�`HW������nv�V=^c o���J�~���bey�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������z��8#[��������q6��������f��imO������a��rfQ_ q���F�|���biy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y��4$W��������s7��������e��ffY�����f}�cfS^n���G�}���`i{�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y��8$X��������q8��������js�_hU������csx[bOXk���J�����`g{�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������x�8#W��������u7��������k~acR������mz~_fLW o���J�����^j{�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������r��:$W��������s7��������p�}`dQ��|��mv}_cO\s���F�����_gy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t�9$W��������p6��������x�fgS����psz`dPZz���G�����^hz�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������u|�8$U��������l7��������}~ydeU������utzadNX{���E�~���_ew�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tx�:$T��������i9���������{yefX������xu~dcMXx���E�|��~^bv�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rv�=$W��������g<���������}geU�����{xgbMYy���H��}\d{�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rz�>#_��������i9���������~dfV���~��yyc_KYz���H�����^f�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v��>"f��������k8����������|bma������zy}b_M[z���F�����bf�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������z��=!i��������j6����������|aob������{{|ceS_{���E�����bf}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~��:!k��������i5����������~dra���~��yx�bbNX!|���I�����d`}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=$e��������g7�����������dm`���{��yz�ccR_x���I�����ffx������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ƣ��rHk��������m:�����������aob������uw�ddHT ���E�����ebt��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������^FR{v|p|�����������p:����������iuY������p�a`T_z���H�����egfqeOy���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F1;G�zyn�|i~��������m<���������y|cr]������}d�bdOT!z���R�����faI:B8s�x�~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?^Q}xvz�ml}��������t>�������������W����������uRY }���R�����g]JAUBn�|��x����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NXb����������������w@�������waW]l}\������cmryuUb"{���M�����j^SQUG�������}�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ots����������������mB��������tls\v[���y��skt[m_r }���M�����nkT\ih������Ư��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dTKAqsqsnz�����������n�������������y���������~�s�\����f���||srWWQ=Z|wz{�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PAJd�}|��{jw�����y�_���~�����}��������������~�}i�}wfjdikYJ))34C�}wz{��~z�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tOHf��������wk|�j�z�vb����n���|{w�p�rx�y�|�~~zy~o}���j^oiK6'#FG9�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������N\r���������������sad����x���~�~rwc~hs{v�v�u{pdnUj���aR?5!$ 'JJQ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[I`�~k���������ǻ���}������������������������������yO*#*%# -dP?|�xp�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������c/S�p(L�x@y�}yy����z���������������������������szc$ $'^6-m�E"w�Ze���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v1S��NC��Zm���������U��������������������y}�v~dMb$%n<#g�ua�nZ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������q(J��s>��ne���������W�������{�������������wy�|zwae#rC"q��o�zW���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������c*6u�l/y�{f���������j����������������������������{�#(sAN��R{�g���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n&4��o5��kiy��p�����m������������������}������|~�ur%l1`��4-�ik������������������ͳ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������HB���F��~|_�]?�b3�g����a4h�p0b��?X��=K�{;C��9<{wo �?i��Y6��g������������������˲��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������U>���K����XuK(�<^r����7=�@�V�Z�[�ovx�0  - �Hh��Y<��u����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������W@���L����b^7!,�B[t����5:�2�GiAyC cRlp�7  -�Gd��\9�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\>���G���y�}Q2T{/Pv���p87e{14an@.bU53_S8-_\Fir�7  qB!T��c0��v����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z?���J���g��`0k�9Wh����4Ptw+G�yAE�f@D�X59|eBkr�5pB(T��a-��k����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������T=���F���i��p?y�+Vw����:R��1J��AD�uBD�i7;�n? ww�2�B$W��[4��g���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vR<~��H}��c�x�N��0Ws����Ap�|4o��;c�y7h�b6W�mAv{�8�C"R��[2��f���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~P?{��E{��f�y�P�~7]x����F���8���4���B��r>q�s=|u�>�@U��Y/��b���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������zOD}��B{��f�p�S�|A_s����C���1���>���<��o;��wBpt�N �@$U��^)��a������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ľ�vN9y��E~��`�y�P��<`�����O���3���<���>��v@{�xBuy�^�A#Q��U/��]���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������vV;���;i��c�y�T��<as����K���8���B���A��pv�wEtz�\rE*E��V/��_�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ƽDRV���u���g�q�U��?cr����O���4Qb�8��F��h4HZm9xz�ZcA-Z��}o��e���������������������������������������������������������������������������������������������������������������������������������������������������������������������������e���������������������������������������������������������������������������������������������������������������������������������������������������������ƛGDSpmsp|������{��r_������x����r�r���v���|�{�vke����gecc`\YYG#F<4Vtohl�����T�����������������������������������������������������������������������������������������������������������������������������������������������������������������������t\~��y���������}z������������������������������������������������������������������������������������������������������������¾ü���������������Ƽ����ô���^ESywu��z�|qtv{{�|y���p|�sy~rwvpuvvz{y}|v||y}���x}|~x��}`MB-b�qfr�x���f����ߢ������������������������������������������������������������������������������������������������������������������������SK:=Dhpoomjnppvkushhifsyaj��������������›f|tw�}��}����w��|�vw�����|���{z~�~�wvxqyuxx{ux{vut|�vuswkowuzxsw{z}t}���|������������������������������suvxu|xuvvs||svsz{vz�����{����~�������������I!+rTQs~s��x��vvwwj~bd��s��i�opzln{bn�gm��~�n}�b|���lynavrb}|IZP4d�pjq�t������������������������������������������������~~�}z}���~��|}}y�~�������������}�~���y}v~zs��u|~�||ywwyroptwtwvssurqrrtsksm=&2<,Lpplqf^gbq�me~mqusro\et�������������Ɣc�}{�v��|��z��z����{y��~��������������������������������z��������������������������������������������������t|~��xz��zy�{��|����������������������s�e,$eSf{}z�~�}���}�wtZd{�~|~g|vsyjlz^i�lt�{v|lv�]zv���u�p^qrYxjAWOAc�~}{�|���y|�������{��~�������{������{~�~�������w��|��p��x��y����y��x�r��x��w����{t����z�����z��y��v��v�yx�|�r�~o�}z�vs}qq��j~�q�Y AD,Gonmtedlcbuigolkhhfb]fy���������������m���������������������������������������u��w�������������}������������������������������������������������s|����z|��x�����������������������x~�j|{ixtX!,h|w���������|w}|�s��x{}y~}v|yqu}|�z}�|�����v�����}{��{�}d&^af�������������������z�����������������}w�������������������|�����������������������|���~�����������|��w��z�����~�y}�x��~�qztz�}�}��t�c&8:=K|y���~~~~�����yuv~��������������kW}������������������w��������������������������������������������������z�����������������������������������������z}�|�������������������~���x��z��~yyu.:bIEggfel�����������������������������������������������������8WM;Lymot��������������������������������zy�����������~~����~�����������}y�~����~|y�����������}���{�y��z~�}���|||z��������y�w}�y�~�~�|~P KP[a������������������������������������yA_tqvnlonpqqjpqqehlfgmrrqxz�����������������������������������������������������������������������������������������������������������������������������F#;2Boqu|��zxpqrky{ys~unpqpjmph`ejhnklknppnlifkkdkkjnlouqpngjpH:;2Fmgn`{nk��������������������������������������������������������������������������������������������������������������������������������d!=809\gkmhhhgedfkmlmfeceggr�������������ŵWp�����}��������{�|��pjlkjkdcjhhklnlkegbjchhgjghjjpomhfqoiohefhhegiddkhwtovxunqrsloihdnrx{qjjzoovq{}vgfkimhllpvmpiiffnnkmmkktkornsutssqutqswypqwvvxx1!EGOw�������zq|puyrttrqvkolfchecrkkijimhfdgkefgfjiedfhjfeijkgDDHEL~��v���y��|}����{������������������~�����~z{|yz{|{}z|�zzz��������}|�{|zzyxvvuyuy{}z}xwuv|urwunrtvwxrnmpqlntotqtvljtmmloolnoikqno`1)44Cnvwyxsptyvvxyzyttu{z����������������Xz}�}y{�|�����������������z~��w|����~�����~~zz�������~���������������y}x}srwxrz����~z}��~|||��s����wut{�{��z{}{vw���vz}{{}}svvu|urvrtw~��~wrwwpteiW����������x{�������������s|x�z|��}}y}�|uxz��uwx|u~�����p%]eYO���y���|oqpwwwrpxtrosxxz��x{�z�w|xv|ysr}vvrlsjnvnxrrswt{z}tvzw{~||vv~y|tzxvruu�yxnrqvuzxy||{xvtrzwx}wv|�{y{uvvyv}{pxwxr{zu|yr|}}�xP5DPM�������������������������������������Qimib`h\f^cobp^nhfkfvjeyv������������������������������������������������������������������������������������������������������������������������������!jm]���������wnq������������~}�������������y~}��|�~��������x(doWQ���������������������������������������������������������������������������������������������������������������������������������������j8>E=lhcs^smem^pafjXmYhiYt����������������Z\llajedfZfafecr]nhevjo�zqrTkZec]oUm]kb^zYubtpbva~^|enl[q`wnqpm�h�azlrxh}c~ftgkwswm�o�mo}f�kxn��vzdxb~u�yv�l�m�q�{u�v�u�u�|��~�}�|�ww{x�w�|�z����z��}�{Geq]���������sv�z��my��������������������������������}�������*^hYP���y����{�yz�}�~�x�|����|������������~����xx�x�v~x~t�{�wy~�x~xx}w�x�}�|�~xu�s~v||z�q�o�yx{n~j�p{rpwlxgwmstizi�nxomwfr`okdr_v\oeicE7.<,TO=Y4PN>W9S=>L3U3WIAZ����������������oPxkdg_jf\pap`doateksj|��fjWfYnYfk[sYyUmhZtXxbjblrZ�Wt[]oTwUr^fjYtQpNk[\iNmMxRmd^cVzRyLi_StFxXmbegYkPjIqM\^KrGzIqY^eYkLiFnP_\QlIsExInQYePoKpBnTd[UkKoGkQKiq_���������tr�~��ky�������������������������|�������}������~&_gYP���{���t?gFQQGc?o=lEfTQiCp=kE\QZ[EdGH3V,O7BC7R1T1IJ3W+U4@@2E'$45:omobM_[QbS`YUaQc\�sns�����������������Xquy~txqvyrvury{vz�u{���������������������������������������������{�y����y�p�q��{�{�u�o�z{�r�m�q�ux}t�a�`yon�f]�a{lgqV�T{TsffqRxN�QvYffV|O|JyOde^mNgL1^[U}��������|��������������������������������|��������������y'QVIQ�|zy���w8g:_NT`?i6i8qEa[Ff?s;cLRXJb:m0k=WLL^:`2_=\GCX@a6f5dJGS>b9`�sv�r����f��rP]�u��v���l��pnDwt}}z���v��7q}�y���m�qw6{w�RU9v�������`��jPX��d��y�����������������˃�����������a����������������ӒZ�dj���������^T�ll����������i�i^����������t�xS�������������`x}��������yn]����������������_|����y�|ki~���yo�|ikp���zsr�lyX�����s�s�C,bnYU������������cb�of{d�������|mjzcuV��������hd�hW|r��������k�v�gJ��������nV�qlJ��������z_�zrYX�������vhv}oqA}��������t���1��������}v��}2��!OT9w�������d��nQU��c��y�����������������ʂ��������ɭěn�����������������݄�ac��������Ɯj�mt����������z�fl������������rV���������Ħo|Vte��������@B�"����������[�k\y���������\V�nyd��������wt�ui9yn]����������������`���|uzxggy���vg{wglr����uv�jxa�����s�p�A-amUV������������{w�{lb��������vr�oyX���������z�rc�r��������}���oN��������~_��qF���������p��{X[�����{��y��m=|��������z��3���������o��{0���$RV<|�������b��pPR��\��s�����������������ɋ�������³������������Ĭ�������ޥ�gd��������ƶ~�zx����������v�qi���������nj�pY�v�������˰lzUxb��������>8�#����������b�h^x���������_X�mxf���������i�}h>������ɼ˼���������c|���~{�{mm{���wo�~kjk����|{�n{[�����x�t�=&l{ir����º������xr�vuym��������wn�o}P��������}x�r^�m��������~���kP��������|[��wD���������h��}][��������w��{oC���������w��}1���������o��2z�� UbP��������b��j[i��|�������������������ѪS�����|~��������������������ĸ������������Ʒ������������˿�������������˯���x������Ǻ�����m������ɽ��[x�IB���¾�����u��ly���������qp�sq���������x��x@# {{v���������˶�����}���ʦ��������Ȥ��������Ω��������͌|���z8q{v������˲����}w�o~c��������wy�u�P���������}��`�s��������}���nO���������m��xH���������k��zaa��������y��zL���������~���G�������������M���)oxd����·��������������������������������dtx|~tuyuzwwxzuuvw{vz��}�����������������������������������������������������������������������������������������Ų���������������������������ʵ����.-'"NGM���������������������������������������������������������,UHDW���}���������������������›������������ů���������������������������¤������������˴�������������œ�����������ŵ������������������������4 =;7btpuvspnqqmspssgQljn�����������������k�����x|}�{~�}�������~|vx}y{����z|{~~�{{�|z��{��~�{z�v{w{w�z{{{||~�zw�~{~}w~{|~z|{��{}}|}~�~wxu{v~zy{|{�{}xwxxvv{|~xy�ywzzvqy{z{u|{����|zz~|x!YQX���������������}}~�z|�x|y|z|t~yzyz~}{x~�y��y��z{cSTNU���|������������������������������������������}��������}{z}|}���������{yxw{x����{~}rsrqtqqvurv~{uptrnnmprsvsqsqortktqwrpomponnsknpijjlY315cjkosorlpwxqpokfVutjzɹ��������������υ�����q~�}~��������������������������������������������������������������������������������������|�����{}~{~}xzywy{y||~{|~|x{xx{y{z~|{vyyvw||{{��xr]`����������������������������������������������������������'ZeTT�������xux~{{wwxurvxvx}yw{yxzxwsxrzvpuvxyx{utyxrrqttqsqrurzrvxtytuwxrttvr}rt|w{vojxyxs|tzwxwvy|x~zxyu}tttvqrltx}y}�}}}~|{{vuzy|sy{wyu!@K7e}ry�go|xem}ngpxY��q�����������������Á������w}��~��{���������������������������������������������������������������������������������������������������������������������������������������pze_����������������������������������������������������������!ds_[����������������������������������������������������������������������������������������������������������������������������������������N\:q�{��_gtsVc�jWn�]��w�ij�����������ػ�t`���q`W|�����}���������������������������������������������������������������������������������������������������������������������������������������zg`���������������������������������������������{|����������w"gmY\��������������������������������������������������������������������������������������������������������������������������������������|`:Nr�������~ogYO8`��������fcW@Lhvd_����������������������������~q}zd\_L0(;e������v����������t$in^`������������vtN6Wt���������kUIHd��������zqWH3Mr��������f`T@@]��������}oaE1Dn�������snhM72I}�������tucG-Hs������yx~oN#)e������|x�{f)$[o ?-l�~utiQ*1Zt~a��t�Ʒ��������윍��ͯgu���wz`k���èh�������������z���p��>�����y���M��?������t���~�o4x�����u������4e�����xy���{�1W������q�����>E|�����|�����U.j������u�����3M������}}����L*ub]���������������������������{�nZC,**3@;(-G�����z�����z����q#kn\^���������������90q�����������J&K�������x���h"2d������v����X#C������y����c)*r�����y�����I!U����������U%Ax����������A"*i��������i~L" YWfF4Gg>��yv�ͱk(ms�]��t�Ɖ��������ࡋ���n������q���sX�}������������y�������aZ���������R��^R����|����w��YM����{�����q�^?�����u����d�c5m����|��p�4�}*S����|z���\b�-*�����{����f�Y,i���������{�~,zg`����������������������������X( ;o���|����������p#pt`b��������������P�V1/t��������wQ�.#S���������E�\!*}����z���^a|4 X��������fVu/7z������|uB�T=#W������u�Y�S5O������]�Y�g58������`�k�x8,_y!8'N�Tz�p�ɝl�AXs�^��u�͊��������򛒥�O9b���B=H���W]}�ws��������������ur����^�������������Y����������Ô�[������Ϛ�����T}�����¶���™b]����������īn?������¤���|Di����xĠ�����T>������������9 ~md���������������������������J">��������������p#syei������������l�V�n;$T������v�xl�[(.����|����c��7\������q�j��[):����������k4"c���v�������X7���~�������i!4�����������r'y����������j)GX *8.=Q@n~}ŵ��}�Tnb[uvfȩ�������cbQ�qj37':��{'D��U^u�}���������o�����vm��xhV�u�����y���|io�x�����r~��}kZ������oi��km[u�����Ίt��nmbe�����˅xe�}\N@�������qp��mof[�����Ȟt���p?�������}p��h='~oe��������������������������f $W�������������t$swcj����������������}<<�����Žr���ig ����������x|4=�������f��{eR*r����Ŏb���\n"V�����dp��`q<1~|�{��o[��kYF%~��|���M��{E\ww|r���M���NT -*9+ fty˽��y�"Jqq]��o}ȫ������fSM�gN3-#9���'$A��[`|�{���������������yc��ndT�������wm��tnX�������o~��slO����~��uq��upKo�����’z��kv\`������f�b�Sk>5�������i���uoZV�~������c�u�lS�{������q��lo,}lb��������������������������uI02~������������x&uual�����������sZA�u[KE=�t����kan�rrN)w{q����tb��{f?������qqc|roC2v�����kq^�oth@9�����kvd�}q�K+l�����hnn�ktO'R�����x�Z���Z:6���z�tsY���j=&|��v���T���^_p��x�t�_��}XA;C%3#-2,o�ū�|t�'Kl�[��n�ʢɸ�������g�r�UQEA���45"K��i`j������������{����ɒzg\������͆p�~y^S����v��qf��]A>~���~��PS��_LGk�����֍x��hwQW������7[>�.X()������lX:�bLDY������n|g�g�jR~����Ƴzr��io8vh_������������g8)U����������������o7'$"  "y������r4%I�z!pj_q�����������gTA�k[n7B������tb\}^iK)t�����xxf�piZ76�����jiS�yvyD)q�����jjq�qwL(M������sS�~�a65���x�xrR��~\@"~��y���c���ZYo��u�|�]���[D%82 ��}Ȳ��r�%Gi�Y��k�˦ķ��������834k��9!)+s������������������Ι���jVm������҈��vkDZ������|iO��\CD�������YX��XICm������rq��kwWV������QWF�f\*(������qX:�fFDV������rxk�j�fO~����ί}t��kq5wle�������������z<'a�����������wf^o���9$%(,.'"x�������v;#H{#pk]q�����������^M9�S]N>B������nmirofG1q�����pin�uy`>7�����asc��~gG'm�����obfwnX+L����|xG�u|`54���|�yhB�r�aX&}��u���_���_]o��y���S���ZD - #4" �vĦ��~�#Hi�\��l�ɦ˿��Z$�|�g���c8Gh���O=8h����©~��������������Ԩ���iVc������ˆt�~zC[�������w:��i�����|iid�_kC+m�����cdj�n�hD?���|�dqW�ynhH'k����uf`�\v_)N����q~I�zqS07���~�tsD�hyUK)z��r���X���Tf"s��o�muX���\E  -9 �{������%Eg�]��l�ʧι��L�`QM�\cnt|������������֫��������������̏l��fWe������ˋE�aVIW��������X�|`BC�������YR}�@@Bm������iu���nOW������dih�Ha2*������wd@��w?BY������lo�mub]�����ϰ~r��ao3ypj���������������,Q��������������������������#&l���������.)�#pkar�����������gWH�phMK;�����xhdf}mkK+k�����epY�fu`:D���}�e}e�tsgO#j�����gmq�wfU#N�����gtX�k�c-:���w�j�E�X�pF&}��y�m�]���\[r��x��O���]@6<66:O5|�x���˩� Eg�^��m�˩̼��J�dSY�bVO_r������������˦��������������Šc��sYh�������p4�eG:V������\��I==�������Kaw�?9Fm������ONk��]JZ�����ɧ�n�Dl5(������xd=�zY:GZ������jtt�_q^Z�����̳�t��Zl3znf���������������3R��������������������������*!o���������3+�"lh_p�����������eME��FJ<�����thebynnI-o�����cbQ�rxd8D�����^bS�rwfQ'o�����cnp�xpQ'P�����~sG�h�`38���u�h�D�a�rL*���z�z�[���_P#t��y��I���\8Xj# $2,Zuau}w��þ��%Kj{]��n�ɪȼ��5���������j{����������Ϋ}��������������õ����v�������������c�����������W�������v���fmQr������me{��qWW�����ʊ�t���C1�������vM��^DO[������}�k�^za\�����̱�y��\n2{la���������������5Q��������������������������'$n���������5-�"kg\n�����������XRJ���\E<�����tqib}jnI,u�����pah�riV7B���{�bue�nhsI*n�����rxh��Q(P���~�~Y�}�d93���y�qhD�gmZE%u��w��Y���gM$m��w���f���w;!k�&67d�jz|t������#FdqTy|f}͡Ƒ��S�hQ^�h``cn������������߷w���������n}���������~s����������ʃ~��������̿Ѕ~���������²��r�������������^�������������L�������������v[�����ǵ��˧��P�����������wE&�l_���������������6R������}�������������������),o���������0+�!jhZk�����������vwY���jB9���}����f��O)l�������~���p>>���������{uX*q�������r���k+N���~���s���{B7���}���u����T%v��v��������_$kz|t��������X!ef!02eebcmz����Β"Ab^Tut]xП�O6&~��Q�XZXis������������ݱ��������������Ņ�����������Ҙ��ț��������ѹ��իĘ|���������ۻѮjt�����ſ���Ƿazy�����������f}���������ͫO�{���¼������P}��������DZ9'}i^���������������6T������y�������������������(-r���������2.� fcTg������������������i9�z�}���������2j}y~���������\:{pz}�������Ô'k~vz���������!T}j�}�ѯ��ѻ�E��{���p���z^&c�����nxo���U,U���{�������_E1���y�������RR%u��y���J���hWr��s���F�xv@=l}1"j������@c{W}�fuBJz#' -��p^�]QM^t����������i[{�y�����������}��̥C�aMAT�����ŋN6�OQ8c�������A:�`�lc�������ND�v:Mn������2EM�-D8>�������k7�&])5o������h9�dK:@Z������c�\_D@�����þ����m1'~i`���������������5]������p�������������������'$t���������6.�$fhYg����������^VH�{rNL2�����vbbg~qz?,n�����i^L�}u\3<���w�PKD���oM)i�����lRk��fQ)T����VY��yoZ<;��sė���{xCP$z��w�utA���PTr��z�v�@�wzO@"j� *���fm�?axX{}ev:Gl" ��鞈|pmpw������y���Yq}�y��������������ơ@�dL@Y�������K7�ZO4c�������R@�h}��}������SM���DNk������@Vf�5FT6����j��v9�3f/.�w�����v;�cR:GS�����ޗ�k�ceGB�����������v8)|f\���������������3^������u�������������������&(v���������6.�#fhWd���������|�aX:�xfFO8�����rpj�d?,j�����YaT�u}\>7���}�K\5��~jP'd�����kc^��xI+S�����RP��|kM?=���y�{��˓{IM&z��w�olD���JQ"q��v�lv@�swP<l� !6d���}t�&Jey\|ey1@s �����yyy~t���������Obe�v�����������~������fP�,^1)��x����q?�fPAFO�����ږxT�wj[:�����������c?(zdZ���������������2\������u�������������������&+v���������5-�#fgU`�����������jL3�rYGR;���}�p^ef{cf?+m�����\\N�jrW7;���x�ITF�qhTS"L�����olZƿ�P-I���}�gHm���SF1���{�g��ҜxIR%y��r�sm8���TKu��v�qi6�ktI: g�+&0aqxÛ�Qn�"Ni|Vw�hu'=s"�����\KMUq������|���Yfv�t��������������Ʈ��iSDW�������VE�ZTE^�������|n�cwb��������ML|�|DEc������CN\�9JYUK��t���w?�.\**���{���o<�aM�`o=3h�4*1y~��yKj�$FdzW�fv':x$ ��������ɀ�����z���gFV�q��������������������px�������pa�rcWq�������hd�t}n��������NK��}?He������AOW�5HYZL�vM���xC�4`4+}��s���qI�pZF>R�����ݤ~b�soM4�����������mL+veY���������������3\������z������������������� u���������<-~"feQa���{�������P@-��n:R.���v�vO\_sQTC&i���}B:@�eaJ:7���r�]�VNogWX��x��jlb^Z�̹V)J�zr~Sb���lO@=���z�c����xJR$���x�\WB��TSu��{�|L1�meA8p�A Cv�V^Bk} G`|Y�ez$7{$��ʣ�����|�������׀S^�k�����������~��ĚiSOTQQTWW\]]X[]aa__ficfdvuvtpzx~����P����QB���ALd������00R�5IY�Y{j���nQ7|oj0,���w���l-�\C;Y6���}�MUalKLI/j����z>DB�VbJD<���f�U��knZb[@/Jy]?:FZ���d7Shw}ohEc����bB=���v�f���XR$w��p�\g@�v�XR"q��{�\e0�aW>7q}=&i�v�hoIe�$NktQz�bl'6|#T`\hjowzxrwx�v�|���pU_�xz�vqz��������ɳ\!, '%##&'')*)++,**(+,+++*.)))&%'!?S3f��տ���}EEq����~I,&M�?R��hd�����{H���B+���p���l>�oVJ@W�����ׁ_J�:bN>������Ļ���{m/}kY���������������6X�������������������������I$"r���������7.�"dfWd�����������QB+�p�AX6�����gIH_e<j.�]^;:jx ;/&V.lty���Ao�H`\Vkg\p%6~ NNMOPQQMRNQRTUW^_z^����������������������p """#!#!$ #3^'b��������JFt�����k+&8�5R��FO���z�UC���=/�չ}���c*�\B:AV������jK:�)WAA������Ž����k&{m]���������������4M������s3*&$'&%$'+$$%%$#!!k���������2*�"mfQ_���������~�TL*�tnIU.�����eNI^k7?C'n���tW$5A�`HGB<���t\Mt*,?@E78/?;tTQZKhN`���NB9z|xm�Zs��KU"qswq�XY<�^�W9qhoj�AL&t71& hW$ENF#;�z����js�Zmzns|�z8<�4  PLQRMJMNNMPNNNJR]cew|p���������Ϛ�������=>=751(+,,&"&%%,''&,*+&)(,//e=n��������Ѫ�������ZQOqV\��HL�����N[���UK�ڦ����{P�zZS]_�~����yU@�;]GL�{����������l+�x���Ŀ�����ß������������mt����������z�,~��������ξ�|��LT+�_rLS5zv��rLSSfBN=0yul{w=(D�`MB@>ApAb������������ū�����u5F~�?Z{����i�������ܗ���������������������������������������t]_bi������������������¤����vprrsrttuyyvtuuxv�x,v���ɿ����ò�1dnf���������{��ywl�z���w���������|�yw�����{ttyw�B<9�����w�,7=C;;5+;I�E2;HLK_�qh_�����������ß������珁S!  -  F:S��������������̻��{l,X��c?��[JWa�qP(91Z��l3JXYJI((;@J[TWC>Dl��r���}�������⭆�|}����u�y����}�x���u{U*q~so��J46�w~t~{~~�������l����c  -GF@IKAFHKHH?8GKM^��o����}�u���{����������눉|Q   (?[���������������ɤ��s,g��Z5WnP/7Q_ZZ$M���Ԙ���������������������������ª�����������h#abk������������������������|y{����q��xyz����qo�����������_Z^]m�����������������������������������aus�����hl$ p������|�^P'({]��L1QpO081)5>:EYR;L9~��{w}��������ߟ������dž������������������7Ht������LIDFl���������������������v I<8BC9CGHHJ@;GLMcp}tcxv{~����������s{uy��ᚊ�y=  "a���������������Ϯ��|7o������B&?^���0w�Ùó���������y��n����x���������Ӳ�����������~2nt{�������������������������������������������"o�����������u*_gt�����������������������æ�����������v�������uu)/���������H.�8%G ;Z|�eZqP=7,.DWEDchOJ:TS|dh`��������������������������������������[`z�����w05&f:aZfbrmhbdchba^Wgb[iceZ2  B22:71IKN;/+>?8AVvvyvut|rv���wqossrwlxrxupoiisxww{~�x��{U:y�yplsL>f6s,b�_|uywhdVY_cf[idq�hlM  -0*06,.2264621BIKRVMOaC6Sgga�xg�`��}�|hQ7A������p, ?���������������ƂtS;0yz�}��zy/I�yc'4w{z�~{y�}~}}y}�nz���j�Ô��y|}{�w{wu}{wy|zxyj6PS]������������������������������������������ n�|���������ZITNh�������~���~z�~u{}������~�w|i��kY��yk��lg0Ewttxusuv�ni::� Z_M?B143 /24&"/=EH<5..2?PV~{y�|�|��|wqpy�yw��}z�}phabglnot���t]K3TN^rgm[M}n{%~�u�\B0%%).GUh_r�aeI - *+55)10./02:0GEL^sZQkZ"NVi]l[]ielz_HWlyz̘�����_0 V��������������չV3%7Iw��u�~F>C2!Okz�|��p]I>:Es�i����r���RFLVjmw{~���tdVSV[hw~;YWZz�����������������������������������������| n�����������}"S[_q�����������yshekx�}�������rfg_d�k|^���v��SINo{xvplw�uRE7_# vcEMCA.*82  51)/$09<@FM^dwxzvt^W8&#6@VcwusZI2#&>Rmhwv]H9)6Ea_Pl�~'z�l�scdS>*Sgp{dR/ 1093*356-06?3CCLXTFOvVU%BfgB;MDVcv|�ylbXÝ������]'  !U���������������ƋS*DR2fOrxhYL_nB6"(>|tykZYjoi[CIg?`njnTm�t\N4#"6VhysqZQQLB5'")H:MWa{�����������������������������������������zo�����������zP[`q����������hU>8+"#-=Xy����dPA8!C�P^j��yr�s%"AYpqvwnY.dr=?D=!!4,5=,%(.0=@:7>2kr|u]kMD*"0un~znZP>(alvwi]N8!ST=Yue GtC%)=M-)<]_  51=3/25;/-64.6@K^~�i�s{C>ux85U������~za[��������P% c����������������x4!N@C2X(�u��gb_*$,C<dyy���vc`WJJ>*(`Yl�{kk^]QAFrx�~�xeVQG0NT`������������������������������qj_`dy������l�����������| Q]Zv�����������~tlYJ.2u��}�ynWQ6-*;dzp>,!67!`tzzdlD<;4;{q?K:/#"'+")/=/%),'-*/<6.N~�|jNJF<4!�yu_NK;6(u�z`PC62s� Q+$" %^Y;  22.-*/1<-*6)-5EKa}|uuQ/gy�[=w������||�i�{X]adr{z�L&%>I=0!  $W����������������_44a5K8Q(����dW=!e394"`x��}aU[?7><$"@Aht~WMFA6V'A����uLC]4:8SVc}����������������������������nhRaXTHBHQ���|o�����������tU[Tq����������tVRE9=."���hOI6/1$0np]-$(-6"`�{hPJ?15. 9�h(6.#$"!=$'!-+7(4+,+-1,8=+X��kFCMEB4%��b@A?D:."sztED>9?(%m� b; - - # -  4'%/*,/9'*+,.>DKU`iaxzp\45AaZO}��NGs�t]ib�{MPPNFHMPV0NYH6'26J����������������qL]~G]NZ#��}�kay7~EWQ1lu�����x|[KNP&G>v��`OVSEc>#@xw��xOTaCMITWc����������������������������cZTe�����v$1~�xo�����������pVYYt�������®�kLC<8>-#e}I -90E9#`y�dE?H9=8.9���*;..'$"3)-%2+"$&*S27>-88I{�dCIOIRJ.!dkeGIBFGC5TchKJ@CC,2@Z*;P6 - -  - - 1 )1-)./",599CJQN���wjQQz~~j\���ex��vKJZ��b[VVQOEDG<$ -9NI8/6K  H��������������пlH[^XWN^*AJu�b[X?dS[R8e=S��x}kgUQQX*?Ho��ZWWPRWI''Za��wW[\SUM!VZc����������������������������STPa�����sC"}�xs�����������uUX[y����������hQOPQWI4,���IHKGDJ@#6�H=4LDJC-LW�bDIGDBK5)i{�4H4;,&!#-0-(("%&$63-88941Z`MIQFHC8 4VwgSHEGB@>'-?XsfdDH=@/5/?O0>U'k~E  F6;1603()/CI@GJSZ����^U6Bmt�j^��z����YbZ���|rlg_k]cT( - 6=D7*1X` @����������������sFPmPGFfcu���c[d^z���jg`cMTX0T_^~~�UWSWOUG6-E^y��sNOTQJG ]_e����������������������������SQU^zycQNPC$u�tr�����������rW^Xv�������r��gPLIFJE<*4Rr�xSGHBED@$.@K��[JN@@F@575bq�]8SHEE@9k��HO>:-(.%/-6,9H.#"30.4;?_U���cIDMCF9/Nu���c=><4=<5Op|��a;A:>8"*?cn"9N`6Uw9     RQJ4349<91IM=IFLT��v|Y"'+(Oyl`���y��wn�V�����������sw[. --11//$��  B�����������������FCs;TJYs����\b�(}JMC/>g����{�syfNGQ,{�f��{\@Vl?f5.Qy���~uAA]CBU!bch����������������������������VLOeyuXQSN=#{�to�����������tQ]aw����������jHBDBD;3ht���uF5B4;9.#2q�S��N9=?5J1-wh���d.9A2@<.���k?:3)&,,"*024172(&KF38<;ob���e8FRHN'2Bin 9Id3S4 - -  - - - BKA:7CIbC4UNEAGI]��ebR%"&?n`��|jxz�im�<��������������d&')%!�� C��������������к�`Jm0UF[p����f]�3}CA=36i����{���JCBZ4v�i��}t=JT3o3)O�����s@<^;@[!bch���������������������������~Va\p�|mUTOA"u�vj�����������8QXex����������d@B?;Sr� h~�upl:/G1;@(7s�O��S0?<6K4/�l���e+2J2@:/���_1(-#'07# 5#.'+1F,JQ35=Ea\���_;>OFM?5Ty���_5@AAJ?9Fx|��];DE7>!0Fo{#&6Vo4S  - -  -VSBCFIEZTI\SK;FH\y^>P^Hk[���ki`gIYyQ��������������R")%('8SS��D<;#C��������������ӽ�\Dw6NA_n����gc�Bɣ��''`����y����PG`4x�\��~s@LK3b.&R~����p?7T0=R^`j����������}}���������������~Nnw�z�QRQ9,w�ud�����������PZp~����������b7=?;9C1,wj���]"5I.S@0��zQ1&)$#+;(+'09S,E8:44;9A$4Dfy$F`ifSYA@=FM^D.MgBJ*"Vof��~n{pwVG6e�è�������������ZK[LI%��������C70))+R��������������жQO328TKbn����fg�U�Ϲ�FU1W��w���ԨHc3y�]��~t@MR/i,'I�����x;9W+?V[`n���������||{|������������G�fe}i�[LJ:$p�ve���Y�������Uizz�������\��a2873C3!abgr]T'!!43!EDEfeS0:94J4)yi���_*2E=Ĵ����~B;-,. "*)+52.-4FI+,.7496LGu��d<>E-222Eo���b;FE@KE<Mt}��`BHCG?)3Cfw#>Rj0TZ  -   VEI=FBDWeZP]==e�㮜�������ɽ����f{uVP���������TF,%0*O��������������ϾQ^+B\Sfm����kb�O����B!V*0O�y���ƯQh7}�^���lMV\>`?:J�����wCAP>JPc`l����������������������������H�gh}n~\OM7%w�qd���z�������S`my�������@2Gk?:=:IH.Scw]PH')4*#NKSF<:FVZI8Mo,%Zv�ǡk�������q^ZS�䳕��}�����ų��׊CbcE�����������w??B\��������������ξTS<%?]`w������v������q�ut������ؼYfC~�\���ZPVTNWPCI�����xJQYJQO[er���������������������������xH�dl�kwZLL=%q�nl�����������_�hz�������@%RFLMDQM/]a�R44(*  -  M2UX8P=>=L]\FKFHJ_[INq'#���Ĭq�Ƽ�����fcV�ϧ�pmG�����˹���K�s)����������Ł7.(J����������������dQH*Lvv�����ݰ������������蒢˸�ҹkfA��`���dOT[NUREN�����MOKIMA"dfn���������������������������~I�ld}myUKF8&q�m h�����������3__f~�������I$#IGADEUO6#Qd{]+#' :A;8GF>;QD7 wl���X/NFR���^OQ:&,$($'!+_�JR513"&(&5���pZRe[LMK������y|��xM�o{��%"3_f�;l`,> +" A3Q[:W�noy�TEE6%t�q%H�к��������˒'����������԰A-p�����tcCy���eL512/* "(%>U�`qhS`|��f���;�5�B?����<�y7@4-#.(,-019XvS==%HX_�D;dk"1���£m��Ԥ}mR_ZDK�כ�vM6|����ŷ���aRu|?_����������U $$K����������������t@E%N��������������������������������g���������������ǽ��������+%)�����������������������������|E��}w�PCD/t�^5��ڴ��������ܔ'������������mfz����������Ǯ�n�h9146/$33078Rzi0NKj�Ŀ���к�%pSa�k:B0&�x;B75!5144,-3Cw�nh8FPci54/BO{�>��lt5)Xk�G*N����I19?.)$9;8FLehnz��q����e"Lh~=gK' - - -5"<9VYIZLGKhIJ>CIRO�H@_l04���Ʀf����QuYO438�֡��~?wȘ���˻��t@Z`w�����þ���k,&(J���������������ց@;x����������������������������������^���Ż������þ������������@ I������S�������������������Ȟ��uF��l}�vMBA8 @cF>��Ş��������̔L����������㔍��¿�����������ibICEMFCH6;,<>:Fm>)(61:@D'+=?3M����ÛJ.'�U//"@VcYG% ?��{zYuFty^^H:8O@,1ECLk{`ETf{�x[=t�����t*)1%.-*'*)36GAAq�bE( Rs�E}9 - 48cM^eT?PaA;BB9@Pjy��{r�����ջ��bDLLLJM=S�å���cu�0a�϶�ԄB%&�����������},D���������������ݗK?;Nh����������������������݄V������پl����ն�����������������ҹ*'S������O-XҦ�ǻ����������צ��yHmo]gifEr�D=�8JĕPk��������_Suw~������������������д�kGS��_w4:456[9)$+%6:F9J'0Gq��ȑa$#!wH,&>O��3'BJGFJK���qN  "*%+'*.(&0-0/$!l�Am1 -62aGabN6MlH4OC::N^V[�rv������粨>?�XP^f1@�è������0l�ü�͎F?%�����������/A�����������������NEALQW����������������������ن����շ��j�����}�����˞������Ď��ג%#R������)5���������������٥��~MGNHTfRCv�i R�?L�fq���������aY}�~��������Ɩ��̼Ҡ��˨�|HU��[P>3-.,3%#0-$0U0Koz��Sn0 *rI0+LB��UFGBD!*>@P!4=:./' -.&031AM=��u-06@MH1z?5@9" *"")'.&( % MU.Z7 67OGXXB3QjgWU?A9X`OSTrith��Yr�ˉDcrac�L6;�Ƥ������apq�ȼ�ՇE7b��pneb_���I#D�����������������u^MBOV������cj����������ݹ��դ����况mV����ƀ���̝�����êp�w����#(f������Vlʫ���»�����������Ɯied]_mdft�u?]i�ypn�����������aa�����������͞vΝ��нU�\]��a5A7"O?6(.6$>0$&;E^F��`o-!$c<,;><{�J- $1!,*$38!"?DTi��J8;.3@)q# *(EJFKYC@' '" DXFc 6;JLNG7AMdlfR@A@VXBA]�mpdhqTY��0If�������IJ�������bu�����҆E(s�ǭ�����Ժy$E����������������ҏgb][W������gs������������Ē�������x�i[���Gno�q��um���\LL8E;Md�t+'h������Q�ϰ�ʶuacWEIMJE@M[������t�����̸�hN9@EM����x�����Xc����������븘Ⱦsd������A��Z�{N&8%!:7<"'<-'I]+��kj0 '''i?*4 - 2BYO" "$#%,!?0$$kqV��Џ�N7449+v26( -  -:eSJ9R�GS& !  )5P# 89MB;8R^bB;>Om`7=Y|jko��d���<7[}yd����Ʀ�xx~�����������U9,���������Ӽm-#H���������������Ҿ78WTNQ������gg���������п���K�v�c��|�c\�ʈ4D^UEPJeef039Wm672-D`N._����ݳNE*c����_JTWC-;fd4)olQGg����{������谥vCGOE{�¡g�����QYuqx�������츊��;ML_5O�>��\azv  /$40.[+D�%��B?8$)#X4*( )95:"%$#(%+.*&-$*6.4v�??:��h��5' "w+26/ (+,Fa��vpx�–r###"   9;PG5:067?IU;>DMfc82a\_TZ:_rye 4^eJ\s���š�z{v��~V%#'..w�g1?�����������9H���������������ƴ,"C<9D������ij��������ײ�cʿ5f��_��p�bV�ɃIAaXLI<1%$'&$&*%'.,13F70U������3?_����\A65:,2=;,GHJ.0B_~tYt׸���ݾ���o|Qb���^�����}y����������ڮ���}ROLc8P�@��TkN>  -L*SL' )f, &()$( m=3& '3472) */-1+09L^zA"#!3��}p��d]|z|��Q"))"v4.+"#+B�������������<($! "#!" -  `E7A.)*3=87:?=?>HN/:r�685.)6;NL@OTu�|����������tdVPSSFUnfRVCDr�����{���{w8&E�¶������������Ɯ*4~n������Rg����ƍ��Ħ{��pAN��\�ꏉoZ��z\Zzzfs*"! " #'$)'IdsYd88JQh~zb+ $/d޻����ʔ����6Uht�v�����������������������qqavbc�`��^~QRPQ1$"!#()!.)37,(+o0-+ - $5#0Y88:@DMd^Lj�d+��ik��t{lghy�0)%&4'B�ך�����������JI 2.%    !-7'   - - - �X+7702@>FA;H?AILI`^t�__WSWZd]\VOP[\[3?>B>==CEJLHOOPO[[Z_[^[cd\fdbeiehlforn|������������������� #dS5:9>1*#"&*SXZ`gZ.{4'$ &wuM*-*.+-.-g�`$'��X/[Xu�ʅ^A8��1( # 1���ܙ�����������W(#" #)7+# �SA=KEDOTZ^_c]c^aRMIT�qnrsopttsprxrud48+:\ #   *4@;Fa����������sgZGFF:�-+/*('#)]- 1Ac?  - -.�����ˬkfTPK�����mzJNIHLMSQUYY^]bZacdghgilpsvywuuttwssusyvxsv|y{�vq77K>;0($!9pfdaicQ|4 - - 0ξ."��TB��)*Ky�B)&F{QL=6" 1��E2),**+(#-v�A/oilll  -# JMYlorqrvsrpla\SRQrggtqoqqsttuvvvvwz���EVo  - -  - -R��8,PhY>4NRD /X\:�rpojgda^i_UX`c^XGFABCJm�n�kThie�u��wa[YZYNHFCADG;0.��~# D��2&0HqhN/24QLg\*TH - -%9y^y��{368/7�����r�,43/-..-,.//.-..00000147:=>?@ACFJMOPNQOKJLNNPFRDAL!IHC<=<:9;;::=>B8( &]Y+)+/38:58Qm>73435BO52/012126>GIHIC;7145/.2229=9678883664<5,1//, +mi{tlpkb^SJFAIJTkqytvtvuvxvuvww{urx��k��yf%0#    uw��TJtQE]PzmAJ=@QRchkXb��}}}}}�~~|}}�}vtvndb\__[VSRQMRNLQKB?=75640-*/++/&++&*+,*))))'+??+.0131&!%!1.5.1+''0,(#!$"##$!""!(+$#/tFAacP0+)+8�۪�כ�;('))))'&'((*)*)('&&&&&'''&&$###$$$# ""% #!$!#"#$ ##$#""!##!"!$!%"##"$'! !#! % !# "04%$&%###$%!#%$)$#!!! -   - - - -Mfn[^``bfdle]aon��ysquztsvz}ztni^VPF_t�ߨFG#"#$)  -    - ��|�R-,;|�sd2eb^\cdf^b�~~~}~��~���������~}��||z{�}|~}|{wusla[RF:2-,,,)*($++)((*---,*)+,*'-).&))#,)&$',),,%+))+))**(&&*()+((*())55+N{O#+'&4�ب����@,''('&'''''''(('&%%$$&&&&%'%$$##"!$#""!"!!! " "! #! !!  &(  - - X�qmivdL;(U�����mnja][UM?4-)&""$&&U���N)./(    - -  ���|1(_dh~pa9#g`giihmf�}|}~}}}}}||��||}~��|�z|�|����zsqlf`WOH@;53/1&)/+)'&%&))(&,'$+&+)*&*'-),)/%+'(*'$&(('((')&)+*(+*-!50$Z_=.'*-+�ח�����O((%&&%%&'''(*+++)*+++*(''&$""""!!! !   !$$ -  -  - c��}�z+*30OqlTw�52.1%!#" !"!!!#(c��i5( ###     - - y���K0YfjquhX2fdcdc`k��t|{{}|||}}}}}}}{||z{}z|~�~~~}}{~z{~}|{zwurnhd`[WOJC>=<322223457:===55..-.-+).+*)+,*+/),+--*)+,,../.-...++=*`D-%&&*,�ΥŪ���N*('((((()*******)(('&%$"! #""! #! "" !!" # $!#"! $$$$%%$$$#""""#"#$"!!!! !! (' -   - - -  -[����T-13<45D@IQOn@2% " !2GD;:* "$ "*'"' %W[��F-/8;Qkn�s;Y^SM>;M��}�~���������������������������������������||~|{ztprkdZQKKNRULLFA>;632444200/..*+00411/.,,.----*,./--/8,0e4*+0'$>���̉���g.-****)('(&&'(&&%&$#$######$$#####$"""#! !$%#%"$*&'"$$$$$$"" !  -     -#`����G;.7?KDD[rjlhj`I1  !7UaWQB%@BJJH@>@W_|�;>.<'FXUSVWfjmi�y++-17/)6Ug�}|||}}|������������~�������������������~���������}~~~~{wtsnmk\]WMVTVX]`acc_b[ZQFB:9531-+)(--**++++*'!(W63,$+)7���ƌ���p%*('&&%#!"####""##$$##"!  "!##$"#"#"!!!## #&% ""$""! " ! -  - `����_[M9DulWahnnomnkk^N:/# $(+)2/8+!('%'(+"@@GD.0 -'*4>FHP; #6�m'7=+37xv|{{|{{zzz|~~~~~��~����������~������|}�~}��~�}}�}}{yy||~x�zzzy~z|xxuouvtxtvutmf^VK@7211-+*(%%%##W9$'"%%1UZK�|57+#/&&%%%$"!"!!!  !! !###"""!####"""!!# !"   - - -  - d����vth:N��f[fiijihgijji`K<% - - $!*$**3'!<75*3=�Z!(##'+8sxzz{|}|{z|}|}}|}}����������������~}~}{||y|{y{|{{yxyxxxxxyyyxzywxsmidhnxvxrme^KCEGNXbmsrrmfeca_]\[UQF8%93&### $)))�a&$'***--,0,+%$    """"#" "!!!     -    \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.ppm b/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.ppm deleted file mode 100644 index 83c5b6f886..0000000000 --- a/Users/Orvid/ImageManipulatorTester/ImageFormats/pnm/Building.ppm +++ /dev/null @@ -1,505 +0,0 @@ -P6 -400 337 -255 -+j�,k�-l�.m�.m�.m�-l�-l�1m�0l�/k�/k�/k�/k�/k�,k�,j�,l�-m�/o�0p�0p�-p�,o�,o�+n�+n�+n�+n�+n�-m�.n�.n�.n�-m�-m�,o�-p�,o�,o�.q�.q�0p�0p�0p�0p�2p�2p�2q�3r�3r�1p�1p�2q�3r�3r�3r�4s�4s�5t�5t�4s�3r�2r�2r�.p�,n�,n�1q�2r�3q�2p�2q�3r�1q�0p�.q�0s�.s�-r�/r�.q�-p�-p�.q�.q�-q�,p�*n�+o�,r�,r�*p�)o�(n�(n�+o�+o�*o�)n�&n�%m�&n�&n�&n�'o�)n�)n�)m�*n�,n�,n�+o�*n�(n�(n�(n�)o�)o�)o�*p�*p�(p�(p�(p�(p�(p�(p�*p�(n�)m�*n�+o�*n�)l�)l�)m�)m�)m�)m�)m�)m�*n�*n�)m�'k�'k�)m�+o�*n�*n�*n�+o�)m�(n�)o�'o�%m�$n�%o�%m�%m�%m�$l�#k�#k�&n�(p�&n�%m�&l�&l�'m�(n�'m�%k�$l�$l�%m�&n�&n�&n�&n�&n�)n�'l�'k�(l�)k�(j�(j�'k�%k�'m�*k�(k�(n�&o�,l�:j�ky�v|�Nd�>e�/h�*l�)l�*n�$j�$l�%m�$l�#k�#k�#k�$l�!i�"j�#k�"j�"j�"j�#l�$m�&k�&k�&l�%k�#k�%m�%n�$m�"m�"m�"j�!i�!i�!i�#i�"h�!i�"j�!i�g�g�!i�$j�$j�#i�#i�$j�$j�$i�$i�#h�$i� h� h�!i�!i�#i�"h�!g� f�!f�"g�"g�!f�f�e�g� h�g�h�g�f�e�e� f�"h�!g� f�f�g� h� h�g�e�e�f�f�f�f�f�f�g�e�e�f�f�f�e�e�f�d�d�e�f�f�e�d�c�a�a�c�c�c�c�c�c�d�f�g�f�c�b�a�`�b�b�a�b�a�`�a�a�a�b�b�b�`�_�_�`�`�^�_�`�b�a�`�`�_�_�^�_�_�_�]�]�]�]�^�^�]�[�Z�[�[�\�\�[�[�\�Z�X�Z�[�[�[�[�Z�X�Y�[�\�[�[�Z�Y�Y�X�X�Y�Z�Z�Y�Y�Y�Z�-l�-l�-l�-l�.m�.m�.m�-l�1m�0l�/k�/k�0l�0l�/k�-l�,j�,l�-m�.n�.n�.n�,o�+n�+n�+n�+n�,o�-p�,o�/o�0p�/o�/o�.n�.n�,o�,o�-p�-p�-p�-p�0p�0p�0p�0p�1o�1o�2q�3r�3r�3r�2q�3r�4s�4s�4s�4s�4s�5t�4s�4s�4s�2r�2r�/q�.p�.p�0p�1q�2p�2p�3r�4s�2r�1q�0s�0s�/t�-r�.q�.q�-p�.q�.q�.q�,p�+o�+o�,p�,r�,r�+q�*p�*p�*p�*n�*n�)n�)n�&n�&n�'o�'o�'o�(p�*o�)n�*n�+o�,n�,n�*n�*n�(n�)o�)o�)o�)o�)o�)o�*p�(p�)q�)q�(p�'o�&n�(n�(n�)m�*n�*n�*n�*m�+n�*n�)m�)m�)m�(l�)m�*n�+o�+o�*n�)m�*n�+o�+o�*n�*n�*n�(l�'m�)o�(p�&n�%o�'q�&n�&n�&n�&n�&n�%m�%m�%m�%m�%m�(n�(n�(n�(n�'m�&l�$l�%m�&n�&n�%m�$l�%m�%m�(m�'l�(l�(l�*l�)k�)k�(l�&l�(n�+l�(k�&o�%n�)l�9j�l}����Wl�?e�2k�)k�%h�!e�'m�%m�$l�$l�$l�$l�#k�#k�#k�$l�$l�$l�#k�"j�#l�$l�%j�%j�%k�$j�"j�#k�$m�#l�"m�!l�"j�"j�"j�"j�#i�#i� h�"j�"j�"j�"j�"j�%k�$j�#i�#i�"h�#i�#h�#h�#h�"g�!i�!i�!i�!i�#i�"h�!g� f� e�!f�#h�"g�g�g� h�!i�f�g�g�g�f�f� f�!g�e� f�f�g�g�f�f�e�f�e�e�e�e�f�e�e�f�e�f�f�f�e�e�e�e�e�f�f�e�e�c�c�a�b�c�d�d�d�d�e�d�f�f�e�c�b�b�b�b�b�b�c�b�`�`�a�_�_�_�`�a�a�b�a�`�^�_�`�b�a�`�a�`�`�_�_�_�_�^�^�^�^�]�\�[�[�Z�[�^�^�^�]�\�\�Z�Y�[�[�[�[�Z�Z�Y�Z�Z�[�[�Z�Y�X�X�X�Y�Z�Z�Z�X�W�W�X�0o�.m�-l�-l�.m�/n�.m�.m�/n�.m�.m�.m�.m�.m�.m�.m�-k�-k�-m�-m�.n�.n�,o�+n�,o�,o�,o�-p�/o�.n�.n�.n�0p�0p�/o�.n�,o�,o�-p�.q�1q�1q�1q�1q�3q�3q�2p�2p�1q�3s�3s�3s�3r�4s�4s�4s�4s�4s�4s�4s�4s�4s�4s�3s�1q�0s�2r�1q�2p�1o�2p�3q�3r�4s�3s�2r�0s�0s�.s�-r�.q�.q�.q�/r�/r�/r�,p�+o�,p�,p�,p�,p�+q�+q�+q�+q�*n�*n�)n�)n�)n�)n�'o�(p�)q�*r�,q�+p�+o�*n�+m�*l�+o�+o�+o�,p�+q�+q�*p�*p�)n�*o�+p�,q�+p�*o�&n�%m�+q�*p�*o�*o�(m�'l�(m�*o�,p�+o�+o�*n�*n�*n�+o�,p�-q�+o�*n�+o�+o�*n�*n�*n�+o�)m�'m�(n�'o�%m�$n�%o�(p�'o�&n�&n�'o�'o�%m�$l�%m�&n�*p�*p�*p�(n�'m�'m�%m�&n�'o�'o�%m�#k�$l�$l�'m�&l�&l�(n�)m�(l�)k�(l�$l�&o�*m�)l�&o�%n�)l�:k�q�����_u�Bi�0i�'k�)m�(n�'o�%m�#k�#k�$l�%m�$l�"j�"j�#k�$l�$l�#k�$l�%m�&n�$i�%j�#k�"j�!i�"j�#l�#l�#l�#l�#l�#l�%k�%k�%k�$j�!f�#h�$i�$i�$j�$j�$j�$j�$j�#i�"h�"h�#h�$i�#h�"g�#k�"j�!i�!i�!i� h�!g�!g� e�"g�!i�!i� h� h� h�!i�g�h� h� h�g�f� f� f�d� f� h� h�f�e�f�f� h�g�f�f�g�g�f�e�f�f�f�g�f�e�e�e�f�f�f�e�d�d�d�d�c�c�d�d�c�c�d�e�e�f�e�e�c�c�c�c�c�c�c�d�e�c�a�a�a�_�_�_�a�b�a�_�`�^�_�`�`�a�a�a�`�`�_�_�^�^�^�_�`�_�\�[�Z�Z�\�\�^�^�]�\�\�\�[�Y�\�\�[�Z�Y�Y�Y�[�[�[�Z�Y�Y�X�X�X�X�Y�Z�Y�X�W�W�W�0o�/n�-l�-l�.m�/n�.m�-l�/n�.m�.m�.m�/n�/n�/n�/n�/m�/m�.n�.n�.n�.n�,o�-p�-p�-p�-p�.q�0p�/o�.n�.n�0p�1q�0p�0p�-p�-p�.q�/r�1q�1q�2r�2r�4r�4r�4r�4r�2r�3s�4t�3s�4s�5t�5t�4s�4s�4s�4s�4s�5t�5t�5t�5t�1q�0s�3s�3s�2p�2p�3q�4r�3r�2r�2r�0s�0s�0s�-r�,q�.q�.q�.q�.q�.q�.q�,p�+o�-q�,p�+o�+o�*p�+q�+q�+q�,p�,p�+p�*o�*o�*o�(p�(p�)q�*r�-r�,q�,p�,p�,n�+m�,p�,p�,p�,p�,r�,r�,r�,r�+p�,q�-r�-r�,q�*o�'o�&n�-s�,r�+p�*o�)n�(m�)n�*o�,p�,p�,p�+o�+o�+o�+o�+o�,p�+o�*n�*n�*n�)m�)m�)m�+o�*n�(n�(n�&n�%m�$n�$n�)q�'o�%m�%m�&n�'o�'o�&n�&n�'o�*p�+q�*p�)o�'m�'m�&n�'o�'o�&n�%m�$l�%m�&n�'m�&l�'m�(n�)m�(l�'i�&j�$l�'p�*m�)n�%p�&o�+n�;n�p��������Af�4n�)m�$j�(n�&n�$l�"j�#k�$l�%m�$l�#k�"j�#k�#k�#k�#k�#k�$l�%m�$i�%j�$l�#k�"j�"j�#l�$m�$m�$m�$m�$m�&l�&l�%k�%k�#h�$i�$i�#h�#i�#i�$j�%k�%k�$j�#i�#i�$i�$i�$i�#h�"j�"j�"j�!i� h� h�"h�"h�#h�#h�!i�!i� h�g�g�g�i�i� h� h�g�f�e�e�e�!g� h� h�g�f�g�g� h�g�g�g�g�g�g�f�f�e�f�f�f�e�e�f�g�g�f�e�c�c�d�e�c�d�d�c�c�c�c�d�e�f�e�e�c�c�d�d�d�c�d�e�f�d�c�c�b�a�`�`�a�a�_�]�_�_�`�`�a�a�`�`�b�a�`�_�^�^�_�`�`�_�\�[�[�[�]�]�]�^�]�]�]�]�\�\�\�[�Z�Y�Y�Y�Y�Y�[�[�Z�Z�Z�Z�Z�Z�X�Y�Z�Z�Y�X�X�X�.n�-m�-m�-m�.n�.n�-m�,l�.n�-m�-m�-m�.n�/o�/o�/o�/m�0n�/o�/o�.n�.n�/o�/o�/o�.n�/o�1q�1q�1q�2p�2p�0p�1q�1q�1q�0p�0p�0p�1q�0p�0p�2q�3r�4s�4s�6r�4s�3s�4t�5u�4t�5u�5u�6u�5t�5t�5t�5t�5t�5t�5t�5t�5t�2r�2r�3s�3s�4s�4s�4s�4s�3s�3s�3s�1t�1t�/s�.r�-q�-q�,p�,p�,p�,p�,p�+o�+o�.r�-q�+o�+o�+o�,p�,p�,p�-q�-q�-q�,p�+p�+p�+p�+p�)n�+p�-q�-q�-q�-q�/r�.q�,p�,p�+o�+o�,p�-q�-q�-q�,q�-r�-r�,q�+p�+p�+p�+p�-s�+q�*o�*o�*o�+p�+p�,q�*o�+p�+p�*o�*o�)n�(n�(n�,p�+o�*n�*n�*n�*n�+o�*n�)o�(n�(n�)o�'o�'o�'o�'o�(p�&n�%m�$l�&n�'o�+p�+p�*o�*o�*o�)n�)n�)n�'l�'m�*p�)o�&o�%n�%n�&o�'o�(p�&n�%m�(n�(n�(n�&l�&j�$j�%m�'o�)n�)n�&p�&o�+n�e�3o�*r�*r�)q�)q�)q�)q�*r�)q�)q�)q�(p�'o�(p�)q�+s�&p�&p�&p�&p�%o�%o�%o�%o�&p�&p�&p�&p�%o�%o�%o�$n�'q�%o�%o�&p�'q�&p�%o�&p�&p�&p�&p�&p�&p�&p�%o�%o�#o�#o�#o�#o�"n�"n�!m�!m�!n�"o�"o�"o�!n�!n�"o�#p�!o�!o�!m� l�l� m�"o�$q�$n�#m�"l�!k�!k�!k�"l�#m�k� l� l� l� l�!m�#m�"l�#m�"l� l�k�j�j�j�j�m�l�k�k�l�l�l�l�k�k�k�k�k�k�j�j�j�i�i�i�j�j�i�i�k�j�h�g�h� j� j�h�h�h�h�i�i�h�f�g�f�g�h�h�h�g�f�f�f�e�e�e�f�f�e�d�e�d�d�e�e�c�c�d�a�b�d�e�e�e�e�e�b�b�b�c�b�`�a�c�a�`�_�`�`�_�_�_�`�_�^�_�^�]�]�]�3q�3q�3s�4t�3v�3v�5u�5u�5s�6t�6t�5s�5s�4t�5u�5u�3u�3u�3v�2u�2u�3v�4w�4w�6y�4w�3v�5x�5w�4v�4v�5w�5y�5y�4x�3w�3u�3u�5w�6x�5w�7y�7y�5w�3w�5y�5y�3w�3y�3y�3x�2w�2w�2w�1v�1v�1v�1v�0u�0u�0u�1v�2w�/w�,v�+w�-w�,v�+u�,v�-w�.x�+s�,t�.v�/w�/w�.v�/t�/t�.v�.v�.v�.v�.v�/w�/w�/w�-u�-u�-u�-u�-t�-t�.u�.u�-u�-u�-u�.v�.v�.v�0u�0u�0u�0u�.v�-u�-u�,t�-u�-u�,v�)u�+u�+u�-u�-u�/t�/t�0u�0u�/t�/t�-u�-u�-u�-u�,v�+u�,v�-w�-w�,v�+u�+u�,v�-w�.x�.x�-w�+u�*t�*t�+s�+s�,t�-u�-u�+s�+s�+s�,t�,t�+u�+u�+u�+u�+u�+u�*t�*t�*t�*t�+s�+s�,t�,t�,t�+s�+s�,t�+s�)q�*r�,t�)q�*r�*r�)q�)q�)q�*r�)q�*r�*r�*r�*r�*r�+s�+s�,t�'q�*r�0s�6s�9n�>l�Cj�Pn�_o~���|j��]~�S|�U�``�Jl�2n�)q�)q�)q�(p�(p�(p�)q�'o�'o�'o�'o�'o�'o�(p�(p�&p�&p�&p�&p�&p�&p�&p�&p�'q�'q�&p�&p�&p�&p�%o�%o�&p�%o�$n�&p�'q�&p�%o�%o�%o�%o�%o�&p�&p�&p�&p�&p�$p�#o�#o�#o�#o�"n�"n�!m�#p�"o�!n�!n�!n�"o�"o�"o�!o�!o�!m� l� m� m�!n�!n�#m�#m�#m�#m�#m�"l�"l�"l� l�!m� l�k�k�!m�#m�#m�"l�"l�k�k�j�j�j�j�j�k�k�j�i�i�j�k�l�k�k�j�j�k�k�k�i�i�j�k�k�j�i�i�k�k� j�i�h�i�i�h�g�g�h�i�h�g�g�h�h�i�i�i�h�g�f�f�f�f�f�f�e�e�e�e�f�e�e�e�e�c�c�d�c�c�e�e�e�d�d�c�c�b�a�b�b�a�a�c�a�_�_�`�a�`�`�a�`�_�_�_�^�]�]�^�6t�5s�4t�4t�2u�3v�3v�5u�6t�6t�6t�6t�4t�4t�5u�4w�3u�3u�3v�3v�2u�2u�6v�7w�6y�4w�4w�5x�5w�5w�4x�5y�4x�4x�3w�3w�3w�4x�7y�8z�5w�7y�6z�5y�4x�4x�4x�3w�2w�2w�2w�2w�2w�1v�.v�-u�,t�-u�-u�-u�.v�/w�/w�.v�,u�,u�-w�-w�,v�,v�-u�.v�-u�.v�0x�0x�/w�-u�,s�,t�.v�.v�.v�.v�.v�.v�.v�/w�.v�.v�.u�.u�-t�-t�.u�.u�-t�,s�-u�.v�/w�.v�0u�0u�0u�0u�.v�.v�-u�-u�-u�.v�,v�,v�+u�+u�-u�-u�-u�-u�.v�-u�,t�,t�-u�-u�-w�-w�,v�,v�,v�-w�-w�,v�+u�+u�*t�,v�.x�.x�-w�+u�+u�+u�,t�,t�-u�.v�.v�-u�,t�-u�+u�+u�+u�+u�+u�,v�,v�,v�*t�*t�*t�*t�+s�,t�,t�-u�-u�,t�+s�+s�+s�*r�*t�,v�*r�+s�+s�*r�)q�*r�*r�*r�)q�*r�*r�*r�+s�+s�,t�,t�,u�-t�*l�5p�9h�Ck�Nq�Pj�����������y�|b�n_�Wd�?e�1l�)q�)q�)q�(p�(p�(p�(p�(p�(p�)q�*r�+s�+s�*r�)q�&p�&p�&p�'q�(r�(r�'q�&p�(r�'q�&p�&p�&p�&p�&p�&p�%o�$n�%o�&p�'q�&p�%o�%o�%o�%o�%o�%o�%o�&p�&p�&p�&p�%o�$n�$n�%o�&p�%o�#m�'q�%o�!m�!m�"o�#p�#p�"o�!m�!m�"n�!m�!n�!n�#m�#m�#m�$n�$n�$n�#m�#m�"l�"l�!m� n� l�k�k�!m�$n�$n�"l�"l� l� l�k�k�k�k� l�!m�"n�!m�k�k� l�"n� l�k�j�i�i�i�j�k�h�i�k�k�j�i�i�i�i�k�k�j�h�h�h�h�g�g�h�h�g�f�g�i�j�j�i�i�f�e�e�e�f�g�g�f�e�e�f�g�f�f�e�e�d�c�c�d�d�d�e�e�d�d�c�c�d�c�b�b�c�c�c�d�a�`�_�`�a�a�a�b�`�`�`�_�^�]�]�_�9w�7w�6v�3v�3v�2u�2u�2u�5u�6t�6t�6t�5u�5u�3v�3v�3u�4v�5x�4w�3v�3v�6v�8x�5x�4w�3v�5x�5w�4x�4x�4x�3w�3w�4x�5y�6z�6z�7y�6x�4v�6x�6z�5y�4x�4x�5y�4x�2w�2w�2w�2w�2w�1v�.v�-u�+s�,t�,t�-u�.v�/w�.v�,t�+t�,u�-w�-w�,v�,v�-u�-u�0x�0x�/w�.v�-u�,t�-t�-t�.v�/w�/w�/w�-u�-u�-u�-u�0x�0x�/v�.u�.u�-t�-t�.u�.u�-t�-u�/w�/w�/w�1v�2w�1v�1v�.v�.v�-u�-u�.v�/w�-w�-w�,v�,v�-u�-u�-u�-u�-u�,t�,t�-u�/w�/w�,v�,v�,v�,v�,v�-w�-w�-w�,v�+u�,v�-w�-w�,v�+u�+u�,v�-w�,t�,t�-u�.v�.v�-u�-u�.v�+u�+u�+u�+u�,v�,v�+u�+u�+u�+u�*t�*t�+s�,t�,t�-u�-u�,t�,t�,t�+s�+s�+u�-w�,t�-u�-u�+s�+s�+s�,t�+s�+s�*r�*r�+s�+s�,t�+s�+s�.u�-r�+n�5q�5f�Dl�Qs�1J`=JRls{��}��^f�Td�Ig�;k�/n�)q�)q�*r�)q�)q�)q�)q�'o�'o�(p�)q�)q�)q�)q�)q�'q�&p�'q�(r�)s�(r�'q�%o�&p�&p�'q�'q�'q�'q�&p�&p�%o�%o�&p�'q�'q�'q�&p�%o�&p�&p�%o�%o�%o�%o�&p�&p�%o�$n�$n�$n�&p�&p�&p�%o�'q�%o�"n�"n�#p�$q�#p�!n�!m�!m�"n�"n�"o�#p�%o�%o�%o�$n�$n�#m�#m�#m�#m�"n� n� n�!m�k�k�!m�#m�#m�#m�#m�!m�!m�!m� l�l�l�k� l�"n�!m�k�j� l�!m� l�k�j�i�i�j�j�k�h�i�j�j�i�h�h�h�g�i�j�h�g�h�i� j�h�i�i�i�h�g�g�g�i�i�i�i�g�f�e�e�f�g�g�f�d�d�e�g�f�e�e�d�d�d�d�d�c�c�d�d�d�d�d�c�d�c�c�b�c�c�d�d�b�`�`�`�a�`�`�a�b�a�`�_�^�]�^�_�8x�7w�6v�3v�4w�3w�5x�5x�4t�4t�6t�6t�5u�5u�3v�3v�5u�6v�8x�8x�7w�6v�7w�8x�5x�4w�3w�4x�5y�4x�4x�3x�4y�4y�6z�6z�6z�5y�4x�3w�4x�5y�5y�4x�4x�4x�4y�4y�3x�3x�3x�3x�3x�2w�/w�.v�.v�.v�.v�.v�.x�/y�.x�,v�,s�-t�.u�/v�/w�.v�.v�.v�/w�.v�-u�,t�-t�.u�/v�/v�1v�2w�2w�2w�/w�.v�.v�.v�/w�/w�/w�/w�.v�.v�-w�.x�.w�,u�-t�.u�/w�/w�0x�1y�/w�/w�.v�.v�-u�-u�-w�.x�/w�/w�.v�-u�,v�,v�,v�-w�-w�,v�,v�/y�0z�/y�-w�,v�-u�-u�-u�.v�.v�/w�.v�-u�0x�/w�-u�,t�,t�,t�.v�.v�-u�,t�,t�-u�,t�,t�,t�.v�+u�+u�,v�,v�,v�,v�,v�,v�,v�,v�+u�+u�+u�+u�,t�-u�,t�,t�,t�,t�+u�*t�+u�,v�+s�,t�,t�+s�+s�,t�,t�,t�-u�+s�*r�*r�,t�,t�*r�+p�-p�,o�-r�1t�6o�Gv�\�1G\;FL]fmP`y;T|Bj�=o�;q�1o�-q�*r�*r�*r�*r�*r�*r�)q�'o�(p�)q�)q�(p�(p�)q�*r�'q�'q�'q�(r�(r�(r�&p�%o�$n�&p�(r�(r�(r�'q�&o�&o�%o�&p�&p�'q�'q�'q�&p�%o�'q�&p�&p�%o�%o�%o�&p�&p�&n�&n�&n�&n�&n�&n�&p�&p�&p�&p�%o�&p�&p�&p�$n�#m�#o�"n�"n�"n�%o�%o�&p�&p�%o�%o�$n�$n�!m�!m�"n�"n�m� n�!m� l� l�!m�"l�!k�#m�#m�"n�"n�!m�!m�m�l�j�k�k�k�j�j�k�k� l� l�k�k�j�j�k�i�!k� i�i�h�h�h�h�h�h�i�h�g�h�i�j�j�h�i�j�j�j�i�g�f�g�h�i�i�h�g�f�f�f�g�f�e�e�e�e�f�f�f�d�d�d�d�d�d�e�e�d�d�d�d�d�c�c�d�d�c�b�b�c�d�b�a�a�b�b�a�a�a�c�b�`�_�_�_�^�]�8x�7w�4w�4w�3w�4x�5x�5x�4t�5u�6t�6v�6v�4w�4w�4w�6v�7w�8x�8x�7w�7w�7w�7w�5x�5x�4x�5y�5y�4z�4y�4y�6{�6{�7{�7{�6z�6z�6z�6z�6z�6z�5y�4x�4x�4x�3x�2w�4y�3x�3x�3x�4y�3x�0x�/w�/w�/w�.v�.v�.x�/y�.x�,v�-t�.u�/v�0w�0x�0x�/w�/w�/w�.v�.v�.v�.u�/v�.u�.u�1v�1v�1v�1v�/w�/w�/w�0x�.v�.v�/w�/w�/w�/w�/y�0z�.w�,u�,s�-t�.v�/w�/w�0x�/w�/w�/w�.v�.v�.v�-w�.x�0x�/w�/w�.v�,v�,v�-w�.x�.x�,v�,v�.x�.x�-w�,v�-w�-u�-u�.v�.v�.v�/w�/w�.v�0x�/w�.v�.v�.v�.v�.v�.v�/w�.v�.v�.v�-u�+s�,t�-u�,v�-w�-w�-w�-w�-w�,v�,v�-w�,v�+u�+u�+u�+u�,t�-u�+s�+s�,t�,t�+u�*t�+u�+u�+s�,t�-u�,t�,t�,t�-u�-u�,t�+s�*r�*r�,t�,t�*r�(p�,o�/t�+u�+q�9t�Fu�a��EWmAKM7@Ecy�Gl�v�7v�4x�0u�.v�-u�,t�,t�,t�+u�+u�,v�+u�*t�*t�*t�*t�)r�)r�+t�*s�)s�)s�)s�*t�*t�+u�)s�)s�)q�)q�*r�+s�+s�+s�'q�(r�)s�)s�)s�(r�(r�(r�*r�+s�*r�)q�)q�*r�*r�)q�(r�)s�(r�'q�&p�'q�(r�(r�*r�(p�'o�'o�(o�)p�(o�'n�(p�'o�&n�&n�&n�&p�&p�&p�'q�&p�&p�'o�'o�'o�'o�%o�&p�%o�%o�$n�$n�%o�&p�&p�%o�%o�%n�$m�$m�!m�#l�$m�'q�%o�$n�$n�$n�$n�$n�#m�!m�!m� l�!m�!m�!m�!m�!m�!m�!m�!m� l�k� l�!m� l�k� l�!m� l� l�k�k� l�k�k�k�k�k�k�k�k�j�i�i�j�j�j�i�h�h�h�h�h�h�h�i�j�h�h�g�f�f�f�g�g�h�g�f�e�e�f�e�d�d�c�e�f�e�d�d�b�d�c�b�b�b�b�c�c�d�c�b�b�c�e�e�e�8x�8x�7w�7w�8x�8x�9y�9y�7z�7z�7z�7z�7z�7z�8{�8{�9{�7y�6x�6x�6x�6x�6x�7y�8z�7y�6z�7{�7{�6z�5z�5z�5{�4z�3y�3y�4y�5z�6{�7|�7|�6{�3{�2z�2z�3{�3{�3{�1y�2z�1y�1y�2z�3{�5z�4y�5z�5z�3{�3{�2z�2z�2z�3{�0x�1y�2z�2z�2z�1y�2z�2z�3{�2z�2z�1y�1y�2z�2z�2z�1y�1x�2y�2y�2y�2y�1x�1x�0w�1x�2y�2y�1x�1x�1x�2y�1x�2y�2y�2y�1x�1x�0x�0x�1y�1y�1y�2z�5z�5z�3x�1v�0x�1y�1y�1y�1y�0x�0w�/v�/v�0w�1x�1x�0w�/v�0w�1x�1x�1x�0x�0x�0x�1y�1y�1y�.v�/w�0x�0x�1y�0x�/y�.x�/w�/w�/w�.v�.v�.v�/w�0x�.v�/w�/w�/w�0x�0x�1y�1y�0x�0x�/w�.v�.v�/w�0x�0x�-u�.v�.v�.v�1v�1v�1v�2w�-u�.v�0x�0x�/w�.v�.v�.v�.v�.v�.v�/w�/w�/w�.v�.v�/t�6w�>x�Ix�a�����?G\{{�@::VQNBFI���Tz�@u�1n�3w�1v�-u�-u�-u�-u�,t�+u�+u�,v�+u�*t�*t�+u�+u�+t�*s�*s�*s�+u�+u�+u�*t�*t�)s�)s�)s�*r�+s�,t�,t�+s�*r�'q�(r�*t�*t�*t�)s�)s�)s�)q�*r�+s�*r�*r�*r�*r�)q�)s�)s�(r�'q�&p�(r�)s�)s�+s�)q�(p�(p�)p�)p�)p�(o�(p�(p�'o�'o�&n�&n�%o�%o�&p�&p�'o�'o�&n�&n�&n�&n�&p�&p�%o�$n�$n�%o�%o�$n�#m�$n�&o�%n�$m�$m�%n�&o�%o�$n�$n�$n�%o�$n�$n�%o�"n�!m� l� l�!m�"n�!m� l�k�!m�"n�!m� l� l� l�k� l� l� l�k�k�k� l� l�k�k�k�k�j�j�j�j�j�j�i�j�k�k�j�j�i�i�i�h�h�g�h�h�i�h�f�f�f�g�g�f�g�f�e�e�e�g�f�e�e�d�f�g�e�e�e�b�e�c�c�d�c�c�c�d�b�a�b�c�d�d�d�b�8x�8x�8x�8x�9y�9y�7y�7y�7y�7y�7z�7z�6y�6y�7z�8{�6z�5y�5y�6z�7{�6z�6z�7{�6z�6z�6z�8|�8|�7{�7{�7{�7{�6z�6z�5y�5z�5z�6{�6{�5z�5z�5z�5z�3{�3{�3{�3{�3}�1{�1{�2|�3{�3{�3{�3{�4|�4|�4|�3{�3z�3z�3|�3|�2y�3z�4{�3z�2z�2z�3{�4|�3{�3{�2z�2z�2z�3{�3{�4|�2z�2z�2z�1y�1y�1y�1y�1y�0x�1y�2z�2z�3{�2z�2z�2z�4y�4y�3z�3z�2y�2y�1x�1x�2z�1y�1y�2z�5z�5z�3x�1v�0x�0z�0z�0z�1y�0x�/v�/v�1x�1x�2y�1x�3x�2w�3x�3x�2y�1x�0w�/v�0x�1y�1{�1{�/y�/y�.x�/y�0z�0z�/y�.x�/w�/w�0x�0x�/w�/w�/w�0x�2w�1v�0u�1v�2w�2w�2w�2w�3x�2w�/w�.v�.v�0x�0x�/w�-u�.v�/w�/w�1v�1v�1v�1v�.v�/w�1y�1y�0x�/w�.v�.v�/w�/w�/w�/w�/w�0x�/w�.v�3w�3t�8o�Kx�j�����OVi���jebpmhYZ\���h��Cu�6s�1t�0u�-t�,t�-u�-u�,t�*t�+u�-w�,v�,t�,t�,s�-t�-t�-t�+s�+s�+u�+u�+u�*t�)s�)s�)s�)s�*t�+u�+u�+u�+s�*r�)s�*t�*t�*t�*t�*t�*t�*t�)s�*t�+s�*r�*r�+s�*r�)q�)s�)s�(r�&p�'q�(r�)s�(r�)s�)s�*r�)q�)p�(o�(o�(o�(o�(o�(o�(o�&p�%o�%o�&p�&p�&p�'q�&p�&n�&n�&n�&n�%o�&p�&p�%o�#o�$p�#o�!m�#l�$m�%n�&o�&m�&m�&m�%n�$n�!m�"n�#o�#o�!m�!m�"n�%o�$n�$n�#m�#m�#m�#m�#m� l�!m�"n�"n�!m�!m� l�k�!m� l�k�k�k�k�k�k� l� l� l�k�j�j�j�j�j�j�i�i�i�i�j�j�j�j�j�i�h�g�g�h�i�h�g�g�g�g�g�f�g�g�f�e�f�h�f�e�e�d�e�f�e�e�f�d�e�c�c�e�e�e�d�d�b�a�a�b�d�d�c�a�8x�8x�8x�9y�9y�9y�7y�6x�6x�8z�8{�8{�7z�7z�8{�9|�7{�7{�7{�8|�8|�6z�5y�5y�6z�5y�6z�8|�8|�8|�7{�7{�7{�7{�8|�8|�8|�7|�5z�4y�6{�6{�6{�7|�7|�5}�4|�3{�4~�2|�2|�4~�5}�3{�2z�3{�4|�3{�3{�3{�4{�4{�3|�4}�5|�5|�5|�4{�2z�2z�4|�5}�3{�3{�4|�5}�5}�5}�5}�5}�4|�3{�2z�1y�1y�1y�2z�2z�1y�1y�2z�3{�4|�4|�3{�1y�5z�5z�4{�4{�3z�2y�2y�2y�1y�0x�0x�1y�4y�5z�3x�0x�0z�1{�1{�1{�1y�1y�0w�0w�2y�2y�2y�1x�3x�3x�3x�4y�2y�1x�/v�.u�/w�0x�1{�1{�1{�/y�.x�.x�/y�0z�/y�.x�/w�0x�1y�1y�0x�0x�/w�/w�3x�1v�0u�0u�1v�2w�2w�1v�3x�2w�.v�.v�/w�0x�0x�.v�.v�/w�0x�0x�1v�1v�1v�1v�/w�/w�0x�0x�/w�/w�.v�-u�/w�/w�.v�.v�.v�.v�-u�-u�.s�4u�>{�Fy�Bf�Lbwes|pux��������������{uwkil���Ru�Cx�:w�5y�5y�4y�2x�2x�0x�0x�.u�1x�1y�/w�0x�2{�3y�0u�6y�3v�0s�0t�0v�/u�-u�-u�+u�,v�,v�,v�-u�.v�/w�.v�,v�,v�+u�+u�+u�+u�+u�,v�+u�+u�+u�*t�*t�+u�,v�+u�-u�.s�+s�+s�,t�,t�+u�*t�*t�*t�(t�'s�&t�&t�%s�&r�)s�+u�+u�*t�)s�)s�'s�'s�'s�'s�)s�)s�(r�(r�(r�(r�)q�(p�(o�'p�'p�&r�%q�%q�%s�$r�%q�%q�'p�'p�'p�'p�$p�#q�$p�$p�#o�$p�%q�%q�$m�%n�&o�&o�&o�%n�&m�&m�$m�$m�%n�%n�%n�%n�%n�&o�#o�#o�#o�#o�"p�!o�!o�!o� n� n� n� n� n�!o�!o�!o�m�m�m� n�m�m�l�l�j�k�l�k�l�l�l�j�l�k�i�i� j�!k�!k�!k�!j�h�g�h�i�h�g�h�i�h�g�f�f�f�h�h�g�h�g�f�f�e�f�f�e�e�f�f�d�d�e�e�8z�8z�7y�7y�8z�9{�9{�9{�:|�:|�:|�;}�:|�8|�:|�;�:~�9}�6|�7}�8~�9�8~�7}�6|�6|�7|�6{�6{�6{�8{�7|�6{�5z�6{�8}�9~�9~�6~�6~�:��8��6~�5}�6~�6~�5}�4|�:�9|�8{�:}�:}�9|�8{�8}�8}�8}�7�6~�5�5�5�5�7�8}�8}�9~�9~�8}�7|�6~�9~�5}�5z�5z�6{�7|�8}�8}�5|�4{�5|�6}�4{�3z�4{�4{�4{�5|�5|�5|�5|�5|�4{�2y�3z�3z�2{�2{�2{�3|�1}�1}�0|�0|�0|�0|�0|�1}�1}�0|�2{�2{�2{�2{�2{�3|�3|�3|�0y�1z�0|�1}�1}�2~�2~�3�/x�1z�2{�3|�3{�2z�2z�2z�4|�4|�3{�2z�2y�3z�4{�3z�3|�1z�1z�2{�4~�4~�3}�1{�1y�3{�4|�3{�2z�2z�2y�2y�2y�2z�1z�1{�2z�1y�1y�1{�-y�/{�2|�3{�3x�3y�6z�7|�5x�6y�8x�5x�5x�6z�6z�3y�1v�1v�2x�4z�5y�3y�2x�5x�2l�,\�6Wv[qp{y~z��������ſ���������|���w��c��>s�8v�6x�3w�0v�0v�0u�1v�/w�1y�0x�/u�1v�6x�4t�0l�L��Ax�6s�5u�4w�0u�0t�3w�/t�.v�-w�,v�-u�.v�.v�-u�,v�,v�+u�+u�+u�+u�,v�,v�+u�+u�*t�)s�)s�,v�-w�-u�-u�,t�+s�+s�,t�-u�+u�*t�+u�+u�+u�)u�)u�(t�&r�%q�)s�*t�+u�*t�*t�)s�'s�&r�'s�(t�*t�*t�*t�)s�(r�'q�)q�)q�(o�'p�&o�&o�%q�&r�"p�#q�%q�&r�(q�(q�(q�&r�%q�$r�$p�#o�#o�#o�$p�%q�%n�'p�(q�)r�)r�'p�'n�&o�$m�%n�%n�%n�%n�$m�$m�%n�#o�#o�#o�$p�$p�#q�#o�"p�#o�"p�"n�!o�!m� n�!m� n�!m�m�k�k�j�l� l�m�k�l�l�l�m�m�l�k� n�l�i�i� j�!k� j�i�!j�h�g�k�k�h�h�k�g�g�g�g�g�g�h�g�g�g�f�e�e�e�f�g�e�f�g�f�c�c�d�e�8|�8|�9}�9}�9}�8|�8|�8|�:~�:~�:~�9}�8|�7|�9}�:~�:~�:~�9}�:~�:~�9}�7{�6z�5y�7{�7|�6{�6{�4|�7|�7�4|�5}�5}�5}�5}�5}�5}�6~�9��9��9��7�6~�5}�7�8��;��:�8}�7|�8}�;��:�5}�5}�6~�7�7�7�6~�6~�6~�7|�8}�9~�:�8��7�6~�4~�5|�5~�6}�5|�5|�6}�6}�5|�4|�6~�7�7�6~�5}�5|�5|�5|�4{�3|�2{�3|�3|�3|�3|�5|�5|�4{�4{�4}�4}�2~�1}�0|�1}�3|�3|�3|�2{�3|�4}�1z�2{�2{�1z�0y�2{�3|�3|�2{�2{�1}�1}�1}�1}�0|�0|�3}�2{�1z�2{�2{�1z�0y�0z�2{�3|�4}�4}�3|�1z�1{�1{�/y�.z�/{�/{�0|�1}�1z�.w�3|�1z�1z�2{�3z�2y�3{�4{�7|�5z�2y�1x�3x�3y�4z�1|�*|�,~�0y�9~�5y�4w�:z�>z�=x�?z�>v�=x�=y�8x�2v�6{�4z�0u�5y�7{�3u�3w�8|�$c�M�!K{/Ohr��v�}|t������������������������q��Wr�Gp�"W�;y�0t�3z�3y�4x�1u�4y�0x�2x�2v�9v�>s�Dt�>g����Tz�Dv�u�;w�TlR_h���sp]rhM�wZ}lN}lN}mL�uS{nNzsW��s��~��p��B_Ju�;p�:v�8x�7t�9u�:r�Ew�>a�,�rj�Z@�Q0�qS؅g�tR�c>�_7�X-�oC�p�kM�kW��~�������������������||��������������wĢ|��v��s��_��kʨ�˩�̩���Ʀ������~��}��������{��������KTc!(01-,C1%c:$�a�nM�gC�nC�g<�hB�oK�Z9�^F�ieifyPr�;w�3w�1y�1y�.x�*z�+{�.x�.v�-w�-w�-w�-w�-w�-w�-w�.x�.x�.x�-w�,v�-t�.u�.x�-w�,v�,v�,v�-w�.x�/y�,v�+u�+u�+u�,v�+u�,t�+s�,v�,v�,v�,v�+u�+u�+u�+u�,v�+u�+u�+u�+u�*t�)s�(r�*t�+u�+u�*t�)s�(r�)r�*s�(q�)r�)r�)r�*s�*s�*t�*t�&r�&r�&r�%q�%q�%q�&r�&r�)s�(r�'q�'q�(r�(r�'q�%o�&r�&r�&r�&r�'p�'p�&o�&o�&o�%n�#o�%q�&r�&r�$p�"n�"n�#o�%q�%q�$p�#o�#o�#o�"n�#o�#o�#o�#o�"n�"n�"n�$m�$m�%n�%n�"n�!m� l�k�k� l� l� l�m�l�m� n� n�m�m�l�l�l�j�j�i�j�k�k�j�h�g�g�j�j�j�k�l�k�i�g�f�h�h�g�f�g�h�h�6{�6{�6{�7|�8|�8|�8|�8|�7z�8{�7|�7|�7|�7|�7|�7|�8}�7|�6{�7|�7|�8}�7|�7|�9~�8}�8}�8}�8}�9~�7�7�9~�9~�9~�8}�8}�8}�8}�9~�9~�:�;��;��;��;��;��<��9��7�7�8��9��9��8��9��;��;��;��;��:�:�:�;��>��=��<��;��<��<��;��<��:��:��9��7�7�8��8��8��7��7��7��7��6�6�5~�5~�6�7��7��7��6�5~�5~�5~�4}�5~�5~�5~�5~�5~�5~�5~�3|�4}�4}�5~�4}�4}�3|�3|�2~�1}�1}�2~�3�2~�3|�4}�5~�4}�4{�4{�5|�5|�6}�6}�3}�4~�4}�3|�3|�3|�3|�2{�5~�4}�4}�3|�3|�4}�5�6��4~�3}�2{�2{�2{�2{�3|�4}�2{�3|�3|�2{�3|�3|�3}�1z�2z�0{�0}�1~�2�2~�0~�5{�E��Aa�=1;�rc�rU�pN�x\�}ccϏlѐjЍbǀRݕe�wI�nC�iF�lN�eO�kX�xb�v]�uY��l��e�vV�{X�pI�b:�rH�h>�d9�jB�pI�f?�nJ�sO�tP�xT�}Y�qO�yZ�}d�mW�iU�s^�p]�|nW@89&8&M3$~XA٦�处��{ߛvۑn҆f�tU�r[�nhkcrVr�@u�7u�4w�4w�1v�,x�,x�.x�/w�/w�/w�-w�-w�.x�.x�-w�-w�.w�.w�-v�,u�,u�-v�.x�-w�,v�,v�-w�.x�/y�/y�,v�,v�+u�+u�,v�,v�+u�+u�,v�+u�+u�+u�+u�+u�+u�*t�+u�+u�+u�+u�+u�,v�+u�+u�*t�*t�*t�)s�)r�)r�*s�*s�)r�)r�)r�)r�*t�*t�)s�(r�'s�'s�&r�&r�%q�%q�&r�'s�*t�)s�(r�(r�)s�)s�(r�&p�'p�'p�'p�'p�'p�&o�&o�&o�(q�&o�#o�%q�&r�'s�$r�"p�$p�$p�$p�$p�"n�!m�!m�!m�#o�#o�#o�#o�$p�$p�#o�#o�%n�%n�%n�$m�#l�#l�!m� l� l�!m� n�m�l�l�m� n� n�m�m�m�m�m�k�k�i�i�h�h�h�h�g�g�k�k�k�k�k�j�h�h�g�h�g�f�f�h�h�g�6{�6{�6{�7|�8|�9}�8|�7{�6y�7z�7|�7|�7|�7|�8}�8}�9~�7|�6{�6{�7|�8}�8}�8}�8}�8}�8}�8}�8}�8}�6~�6~�9~�9~�:�:�9~�8}�8}�8}�9~�9~�:�9~�9~�:�<��=��9��8��8��9��:��9��9��:��;��<��<��<��;��;��<��<��=��=��=��=��=��=��:��:��;��;��9��7�6~�8��9��9��8��8��7��6�6�6�6�5~�5~�5~�6�6�5~�4}�4}�4}�4}�5~�6�7��6�6�6�6�4}�4}�5~�5~�5~�4}�3|�3|�3�1}�1}�3�3�2~�4}�4}�5~�5~�6}�6}�7~�7~�6}�6}�4~�5�4}�3|�3|�4}�3|�2{�3|�4}�4}�4}�3|�3|�4~�5�4~�4~�4}�5~�4}�3|�2{�3|�2{�3|�3|�3|�3|�4}�4~�3|�1|�2~�2�2�2~�1}�1}�6|�D|�+Ioqdm���՜֕uόqĄi�xZ�mM�^9�X/�^1Ԍ\ՉW�xF�l=�lA�Y2�S-�qK�lE�_6�wL�kB�]4�wO�[3�J"�uM�^8�J$�yU�rN�U2�`<�mG�[2�f<�zO�f<�uLljb�_9�h@�vP�Z5�gH�YCO.I,U6$mC-�z`�tXŀ_Փp�z������쪐Ƙ�vfp\u�Cw�7u�4w�5x�2v�.w�,x�0w�1y�0x�/w�-w�,v�-w�-w�/y�/y�/x�/x�/x�/x�.w�.w�0z�/y�.x�-w�-w�-w�-w�-w�.x�-w�-w�-w�,v�,v�,v�,v�-w�,v�+u�,v�-w�-w�,v�+u�-w�,v�+u�*t�*t�*t�*t�*t�+u�*t�*t�*t�+t�,u�+t�+t�*s�)r�(q�)r�*t�*t�)s�(r�&r�'s�'s�'s�'s�'s�'s�'s�)s�)s�(r�(r�)s�)s�(r�'q�'p�'p�(q�(q�(q�(q�(q�'p�*s�(q�$p�$p�%q�&r�#q�"p�$p�$p�#o�"n�#o�#o�#o�#o�#o�"n�"n�#o�$p�$p�$p�#o�'p�&o�$m�#l�#l�#l�"n�"n�!m�!m� n�m�l�l� n�!o�m�m�l�l�m�m� l�k� l�j�h�h� i�!j� i�i�j�k�k�j�i�h�h�h�i�h�f�f�g�h�g�e�8}�7|�6{�6{�8{�8{�9|�9|�7z�7z�7|�8}�7|�6{�5}�7�8}�8}�8}�8}�8}�8}�9~�:�6{�6{�7|�7|�8}�8}�9~�9~�:�:�:�:�9~�7|�8}�;��9~�<��<��:�9~�;��;��9~�9��8�7~�8�9��:��:��9��<��<��=��;��:�;��=��=��;��9��9��9��:��;��:��9��:��;��:��8��8��:��:��8��8��7��6�6�7��7��7��6�6�6�6�6�6�6�5~�5~�4��4��4��4��4��4��6�6�5~�5~�5~�5~�5~�5~�5~�5~�1}�4��4��4��5��4��5~�7��5~�5~�6}�7~�7~�6}�5|�4{�7��6��5~�4}�3|�4}�5~�6�4}�5~�5~�3|�2{�2{�3}�3}�6��5�3|�2{�2{�3|�5|�6}�4{�3z�2{�3|�4}�2{�0|�2|�6~�5}�6|�6|�7|�6}�5|�8{�Dx�5_eQ]�XN�J1�H(�L0�Q5�P2�R1�Q.�L%�S,�pG�sJ׌d�wO�qH�Z3�b<�{U�rN�iF�pM�iF�gB�lJ�`@�X;�kN�Z=�J-�sX�fJ�]>�sQ�sP�]5�vJDŽY�f<�sL„_�nI�qJ�|X�_<�kM�fPY/R,G [&�aK�^G�[>�V1�Y0�vN�V0�^:�fH�xc�lk^v�Ey�9z�1y�0x�/y�.z�0|�2z�1y�0x�0x�.x�.x�-w�,v�0z�.x�-v�-v�.w�.w�-v�,u�,v�-w�.x�/y�.x�-w�-w�-w�.x�-w�-w�.x�-w�+u�*t�+u�-w�-w�-w�,v�,v�+u�+u�+u�-w�+u�*t�+u�,v�,v�,v�-w�*t�,v�-w�,v�*s�)r�)r�*s�*s�+t�+t�+t�*t�*t�*t�+u�'s�*v�*v�(t�'s�'s�'s�%q�)s�)s�)s�)s�)s�)s�(r�(r�$p�%q�'p�'p�'p�'p�'p�'p�'p�'p�%q�%q�%s�&t�&t�&t�&r�%q�#o�#o�#o�#o�#o�"n�#o�$p�$p�#o�#o�$p�$p�"n�$m�$m�#l�$m�%n�&o�#o�"n�!m�!m� n�m� n�"p�"p� n�!o� n� n� n� n�m�k�j�j�j�!j�#l�"k� i�g�h�h�i�i�i�i�i�i�i�g�h�h�g�g�h�h�h�6{�6{�6{�6{�8{�9|�9|�9|�8{�7z�7|�8}�8}�8}�6~�7�8}�8}�8}�8}�9~�9~�8}�8}�7|�7|�7|�8}�8}�9~�9~�9~�:�8}�7|�8}�9~�9~�:�;��9~�:�;��<��<��<��<��<��:��9��8�8�9��:��:��9��;��<��=��<��;��<��<��<��:��9��9��9��9��:��;��;��9��:��9��7�7�9��9��7�7��7��8��7��6�6�6�7��6�6�5~�5~�6�6�6�4��3�3�3�3�3�4��6�6�5~�5~�6�6�5~�5~�5~�6�1}�3�3�3�5��4��6�7��5~�5~�6}�7~�7~�7~�6}�5|�6��5�4}�4}�5~�5~�6�6�6�6�5~�4}�4}�5~�5�5�4~�3}�3|�3|�3|�4}�6}�6}�6}�5|�3|�4}�4}�3|�0|�2|�5}�6|�7{�6z�6y�6z�6{�:z�Hz�3\6 ,wE:�N3�R1�Y:�^?�X7�V4�T/�V1�M'�]6�_:�iCߕpʅ^�Xǃ\[€]Ȇdǃ`ǂ[ȀZЇdʁ`ˀaτe�y[�uW͂c�_�xW�{X�yS�rH��TDŽẆ]ƃYŇ^ɋbȉ^�|R�}W�`�YFQ%B=b)�mU�cH�dD�b8�i>�d9�c:�Z8�^?�T;u^Xf|�Fz�5w�/y�0|�0|�.z�.x�1y�0x�0x�1y�0z�0z�0z�0z�/y�.x�-v�-v�-v�.w�.w�.w�-w�-w�.x�.x�.x�.x�-w�-w�.x�-w�.x�/y�/y�-w�-w�.x�.x�.x�.x�-w�-w�-w�-w�-w�.x�-w�,v�-w�-w�-w�-w�.x�-w�-w�-w�,v�+t�*s�)r�)r�+t�+t�*s�*s�+u�+u�+u�+u�&r�(t�(t�'s�(t�*v�)u�(t�+u�*t�*t�*t�)s�)s�)s�)s�'s�'s�)r�)r�(q�'p�'p�'p�)r�(q�%q�&r�%s�&t�&t�&t�&r�%q�$p�$p�$p�%q�%q�$p�#o�$p�$p�$p�$p�$p�$p�"n�$m�#l�#l�$m�%n�%n�#o�#o�!m�"n�!o� n�!o�"p�"p� n�m�m�m� n� n� n�!m� l� l�k� i�!j� i�h�h�i�j�j�j�j�j�i�i�h�j�j�j�i�h�i�i�h�6{�6{�6{�7|�7|�7|�6{�6{�8}�7|�7|�8}�6}�5|�5|�5|�9~�9~�8}�9~�9~�9~�6~�5}�6~�6~�8}�8}�9~�9~�9~�9~�9��7~�4{�5|�6}�7~�7~�7~�9��9��:��;��;��9��9��:��:��:��9��9��9��9��9��9��9��9��9��9��9��9��8�7~�:��:��:��9��9��9��:��;��:��:��:��8�7��9��8��7��6�7��8��8��6�5~�6�8��7��6�3�3�3�4��4��4��3�2��3�3�3�3�5~�5~�5~�6�6�6�6�6�5~�6�4}�5~�4}�4}�6�5~�3|�4}�4}�4}�5|�6}�7~�7~�6}�5|�7��5�4}�4}�4}�4}�4}�2{�6�5~�4}�3|�4}�6�6��5�3}�3}�4}�4}�5|�5|�5|�5|�6}�5|�4}�4}�2~�2~�1}�2~�5�6~�5}�6{�5y�4{�4~�:~�G|�!9[/uD3�T4�iB�rK�oH�`;�b=�iB�]5�V-�^5�W-�`7�d<�g?�zT�|Ū^˃]֌e׎eݔg��k�u�r�uߘnޕl�p��q�w�xޟsБe��U��S͊]ݘn�sΑb؜j֙c֗bښn՚xj;); 8Eb)�kO�rN�zO�wK�Q�nD�nH�qP�lR�P:|`]fz�Ey�4u�-y�.|�-z�/y�1y�0x�2w�0x�1y�1y�1y�/y�/y�.x�.x�.x�.x�-w�-w�.w�/x�,x�,x�.x�.x�.x�.x�.x�.x�-w�-w�-w�.x�.x�.x�-w�.x�-w�-w�-w�-w�-w�-w�-w�-w�.x�-w�-w�.x�-w�,v�,v�-w�/y�-w�,u�+t�,u�,u�*s�)r�+t�*s�*t�*t�+u�+u�+u�+u�(t�)u�(t�(t�(t�*v�)u�'s�+u�+u�*t�*t�*t�*t�+u�+u�(t�(t�(t�(t�'s�&r�(q�(q�*s�)r�&r�&r�&r�&r�&t�&t�'s�&r�%q�%q�%q�%q�$p�#o�#o�$p�$p�$p�$p�$p�$p�#o�%n�%n�%n�%n�#o�#o�#o�#o�"n�#o�#o�#o�"p�"p�"p� n�l�l�m�m� n� n�!m�!m�!m� l�k�k�j�j�j�j�k�k�k�k�k�k�j�i�j�j�i�i�h�h�g�f�5z�6{�6{�6{�6{�6{�6{�5z�8}�7|�6{�7|�6}�5|�5|�5|�9~�9~�8}�8}�9~�9~�6~�5}�6~�6~�8}�8}�8}�9~�9~�9~�9��7~�5|�5|�7~�7~�7~�6}�9��9��9��:��9��8�7~�7~�9��9��9��9��8�7~�8�8�8�8�8�8�9��9��8�6}�:��;��:��:��9��9��9��9��:��:��:��8��8��9��8��7��6�8��9��8��6�5~�7��8��7��7��4��4��4��4��4��4��4��4��4��4��4��4��6�6�5~�6�7��7��6�6�5~�6�6�6�5~�4}�6�6�4}�4}�4}�4}�6}�6}�7~�7~�6}�6}�6��6��5~�5~�5~�4}�3|�2{�5~�5~�4}�3|�3|�5~�6��5�5�5�5~�5~�6}�5|�4{�4{�5|�4{�3|�3|�2~�2~�3�3�5�5�5}�5}�5|�5|�6~�:~�I~�7U.L9�^;�e<�e?�jE�vQ�rM�nI�sM�d:�g<�i=�g;�X/�X1�hC�c?�Z9�\7�_8�Z.�V'�],�c2�^-�^-�X'�],�],�Z(�tA�~M�xH�tD�g8�c8�b8�oE�oE�^/�U$�S�['Љ[�mJN -> ;Fc*�{]��`�[�V�wM�xN�qK�nP�oX�[IxVUix�Hw�6u�1y�.|�-y�0x�4y�2w�2w�1y�1y�1y�1y�/y�.x�/y�.x�.x�.x�.x�.x�/x�0y�-y�,x�.x�.x�.x�/y�/y�/y�-w�-w�-w�.x�-w�-w�,v�,v�-w�-w�-w�-w�-w�-w�-w�-w�,v�,v�-w�.x�,v�+u�+u�,v�.x�,v�+t�+t�,u�,u�,u�+t�,u�+t�*t�*t�*t�+u�+u�+u�*v�+w�*v�(t�(t�)u�(t�&r�)s�)s�*t�+u�+u�+u�+u�+u�'s�'s�(t�(t�'s�'s�)r�*s�*s�)r�&r�%q�%q�&r�%s�%s�'s�&r�&r�%q�%q�%q�$p�#o�$p�$p�$p�$p�$p�$p�$p�$p�'p�'p�'p�&o�#o�"n�"n�#o�"n�#o�#o�#o�"p�"p�!o� n�!o�!o�!o�!o�!o�!o�!m� l�!m�!m�!m�!m� l� l�k�k�j�k�k�l�l�l�k�k�h�i�i�i�g�g�f�e�4y�5z�5z�6{�6{�7|�8}�8}�7|�5z�5z�7|�6}�6}�6}�6}�:�8}�7|�8}�7�8��7~�6}�6}�6}�8}�8}�8}�8}�9|�8}�6~�6~�6~�7�8��9��8�7~�5|�7~�8�7~�7~�9��9��7~�6�7��8��8��7��6�7��8��9��8��7��8��9��9��8��7��9��9��9��9��9��8��8�7~�8��8��8��7��8��6��6��5��7��8��8��8��7��7��5��6��6��6��5��5��5��5��4��4��4��4��4��4��5��5��7��7��6�6�7��7��6�6�6�6�6�6�5~�6�8��8��7��8��7��6��6�6�7��7��6�6�5�6��6�7��7��7��7��6�5~�6�6�4}�4}�6�7��7��6��6��5~�5~�5|�5|�5|�4{�4{�4{�3|�3|�2~�2~�2��3�4}�4{�6{�7|�8}�9|�8|�={�Bt�/N*�TC�iI�nI�a?�iG�a@�];�lI�J%�lC�zM�vE�zJ�d7�lE�fF�eH�^C�iK�Y5�[1�[.�^-�a/�a.�\)�^,�e4�`/�i:�vE�p@�m=�xJ�kA�gB�`;�b=�b=�b<�Q)�Q%�Y-�^8�T6TG @C b)�sW�_<�tN�tP�e�yQ�Y�|_�u`�RAxNPsy�Pw�=s�5w�4|�2z�4v�5t�3v�2w�3x�4y�2z�2z�0z�0z�/y�/y�.x�.x�/y�/y�0z�0z�.z�-y�,x�,x�.x�/y�/y�/y�.x�/y�/y�/y�/y�.x�.x�.x�.x�.x�.x�.x�.x�.x�.x�-w�,v�-w�.w�.w�-v�+t�+t�+t�-v�,u�+t�+t�+t�,u�,u�+t�,u�,u�,v�+u�+u�+u�+u�,v�(t�)u�*v�)u�(t�)u�)u�)u�(q�)r�*s�+t�,u�+t�*s�)r�'s�'u�(t�(t�(t�(t�(t�(t�*s�)r�&r�%q�%q�&r�'s�'s�%q�%q�%q�%q�&r�'s�'s�&r�&r�%q�$p�$p�$p�$p�%q�&r�%q�%q�$p�#o�#o�"n�#o�#o�"n�"n�#o�#o�#o�"n�"n�!m�#q�"p�"p�"p�"p�"p�!o� n� n� n� n� n� n� n�m�m�k�k�k�l�l�l�l�k�i�j�k�j�h�h�h�g�6{�6{�6{�7|�7|�7|�8}�8}�8}�7|�7|�8}�6}�5|�5|�5|�9~�8}�7|�7|�6~�7�8�8�6}�6}�8}�8}�8}�8}�9|�8}�6~�7�8��8��9��9��8�7~�6}�9��9��6}�6}�9��9��5|�6�7��8��8��8��7��8��8��9��8��8��8��8��8��8��9��8��8��8��9��9��9��9��8�8��8��8��8��7��7��6��5��8��8��8��8��8��8��6��6��7��7��6��6��6��6��5��4��3��3��4��4��6��6��9��9��7��7��7��7��6�6�6�7��6�7��6�6�8��7��6��8��7��7��6�6�6�6�5~�5~�6�6��7��8��7��7��7��7��5~�6�6�5~�5~�6�7��7��6��6��5~�5~�5|�6}�6}�6}�6}�6}�4}�4}�2~�3�1�1�5~�4}�5}�8}�9~�:}�9}�=z�;m�"E3%�^P�U8�^>�="�D*�F*�9�U7t$�M&�X,�q@�q?�pB�[�uU�lN�{]�uU�Y2�\2�d7�_.�b0�e2�`-�^.�d7�`3�c5�e6�_/�n=�}O�j>�_8�X4�S,�mF�V0�X0�^4�f=�U2�hK�G6HA C W �`G�4�fG{!�gI�;�W2�aF�_K�P@{OPms�Ov�?v�6y�2z�1y�4v�7v�4w�3x�3x�3x�2z�1y�0z�/y�/y�/y�/y�/y�0z�0z�0z�0z�.z�.z�.z�-y�.x�.x�/y�/y�.x�/y�/y�/y�/y�0z�/y�/y�.x�.x�.x�.x�.x�.x�-w�-w�.x�.x�.w�/x�.w�,u�,u�,u�-v�-v�-v�,u�+t�+t�+t�+t�,u�-v�-w�-w�,v�+u�,v�-w�(t�)u�)u�)u�(t�(t�)u�*v�)r�*s�+t�,u�,u�*s�)r�&r�)u�(v�)u�)u�(t�(t�(t�(t�*s�)r�&r�&r�&r�'s�'s�(t�'s�&r�%q�&r�'s�(t�'s�'s�'s�&r�%q�$p�$p�$p�%q�&r�#o�#o�#o�"n�#o�#o�$p�$p�"n�"n�#o�$p�#o�"n�"n�"n�!o�!o�!o�!o�!o� n� n�m� n� n�m�l�l�m� n� n�l�l�l�l�k�k�k�j�i�k�k�j�i�i�i�h�5}�6~�8}�8}�7|�6{�6{�6{�9~�8}�8}�8}�5|�4{�3z�4{�8}�8}�8}�8}�7�7�8�8�7~�7~�9~�9~�9~�9~�:}�:�7�8��8��7��7��7��7��5~�8��8��7��6�6�7��6�5~�7~�8�7��8��8��8��8��8��8��7��6��6��6��5��5��7��6��6��8��8��8��8��9��9��9��9��9��9��8��8��7��7��9��8��8��8��9��9��7��6��7��7��6��6��6��6��5��5��3��3��3��4��5��6��8��8��8��8��8��7��6�7��7��8��8�9��8�7~�7~�7~�5�6��7��7��6�6�6�6�5~�5~�7��7��7��7��6�6�4}�4}�4}�5~�5~�5~�5~�6�6��5�5�5�5~�5~�6}�6}�7~�7~�6}�7~�5~�5~�3�3�2��0~�4��3��4��6��7�9~�9|�<{�;m�'U)*�le�_J�M1x'�6!�<'m�D)w"�?�I"�F�m=�uG�|O�xO�xP�zQ�{P�tG�j=�wJ�qC�vG�tE�tE�k?�lE�lF�rJ�zN�p>�r=�tA�zG�wG�xK�tD�xE�wF�j:�l9�pB�nD�nP�jWM EIO�]Hx" �?'` �P;j�>�2�C+�_KxRQ_n�Hw�;{�1|�,{�,z�4x�7z�4y�4y�3x�3x�1x�0w�/y�.x�/y�/y�0z�0z�0z�0z�0z�0z�.z�/{�/{�.z�,x�+w�.x�/y�.x�/y�/y�.x�/y�/y�/y�.x�+x�,y�,y�,y�,x�,x�,x�,x�,x�,x�+w�,x�,x�+w�*v�+w�-v�-v�-v�-v�,u�+t�+t�,u�+t�,u�,v�-w�-w�-w�,v�,v�*v�)u�)u�)u�(t�(t�(t�)u�+t�+t�,u�,u�,u�+t�*s�'s�)u�(v�(v�(v�(t�'s�'s�(t�*t�)s�)r�)r�'s�'s�'s�'s�(t�'s�&r�&r�'s�'s�'s�&r�(t�&r�&r�&r�%q�$p�$p�%q�%q�$p�#o�#o�#o�$p�$p�$p�#o�#o�#o�$p�#o�"n�"n�$p�!o� n� n� n� n� n�m�l� n� n� n�l�l� n� n� n� n�m�m�l�k�k�k�k�k�j�j�i�i�j�i�g�3{�4|�7|�8}�7|�6{�5z�5z�6{�6{�7|�5|�5|�4{�5|�7~�7|�8}�9~�9~�7�7�7~�7~�8�8�8�:�:�;��;��;��6}�6��7��6��7��8��8��7��8��6�5~�6�7��7��7��8��7~�7~�6�7��7��7��7��7��8��8��7��8��7��6��6��7��7��7��9��8��6�6�8��:��8��8��8��9��7��7��6��6��7��7��9��9��9��9��7��7��7��6��5��5��5��5��6��5��4��4��4��4��5��5��7��7��9��9��8��7��7��7��8��9��7��:��9��8�9��8�7��9��9��8��8��8��8��5��7��7��7��6��6�6�7��7��6�4}�5~�5~�5~�5~�6�7��6��4~�5�5�6�6�7~�7~�6}�6}�5|�6}�5~�5~�5~�4��3�1�3��3��4��5�4~�4|�7|�;z�E{�<\�)�lk��v�R8�8#�5!�K7p" �^F�.�R1�I#�@�F�qC݂U�pEՀW�rI؀X�rI�vL�vO�tM�}S�rH�wP�lE�lI�nK�uR�zQ�sF�xG�q@�P�zL�\�xF�}K�|L�yJ�vH�sG�|V�nN�mWO8AG -�`O�>(�hTb�\L`�P0�:�I2�XH�de_q�Ey�8|�/|�/}�1�4{�3w�4y�4y�3x�2y�2y�3z�1{�1{�.x�0z�1{�1{�0z�/y�0z�1{�.z�0|�0|�/{�,x�-w�.x�/y�/y�0z�0z�/y�/y�/y�/y�-w�.x�,y�/y�-y�-y�.z�.z�.z�,x�*v�*v�+w�+w�+w�*v�*v�,u�,u�-v�-v�-v�-v�-v�-v�*s�*s�+u�*v�-w�+w�,v�)u�*v�)u�(t�(t�)u�)u�)u�)u�+t�+t�+t�,u�,u�,u�,u�,u�'s�&t�'u�'u�(t�'s�(t�(t�*t�)s�)r�(q�'s�'s�'s�&r�'s�&r�'p�%q�&r�'s�'s�'s�(t�&r�&r�'s�&r�$p�$p�$p�'s�&r�$p�$p�$p�%q�$p�#o�#o�#o�#o�$p�$p�#o�#o�%q�#q�#q�"p�"p�"p�!o� n�m� n�!o�!o� n� n�!o� n�l� n�m�l�l�k�l�l�l�m�k�i�i�j�k�j�g�4{�5|�6}�6}�6}�6}�5|�4{�5|�6}�6}�5~�5�4~�5�5~�6}�6}�7~�7~�7~�8�8�8�6�8��8��7~�6}�8�8�7~�6�8��9��7��6�6�8��9��8��7��7��8��9��:��:��:��8��8��9��:��8��8��7��7��7��6��6��6��6��6��8��8��:��9��8��9��:��:��9��7��=��;��9��9��:��;��:��7��9��5��5��7��8��7��8��8��7��9��7��5��4��6��6��6��7��6��5��5��6��6��7��6�5~�7��6��5��4��3�3�5��4��6�7��8��6�4}�5~�7��8��8��6��7��7��6��6��6��6��5��4��3�7��8��7��5~�7��6�6�5~�3�3�3�4��4}�6�8��8��8��7�7�8��7�7�8��8��7�6��7��6��2�3��5��7��5�5}�5|�:}�>}�Iq�'bBCԝ��R5�W:z.�_Kw&�X?�6�I(�N,�K%�<�c:�[3�:�nJ0�oQ�; �J/�H+�C%�_A�6�lL�1�hH�:�\<�H&�J'�\9�=�mK�/ �gB�6�\7�D �G&�R1�;�cD~1�ZFL -; 5 @N@�F3�p_e �`Sh -�K2�P5�oZ�XN�kw]r�Ax�7|�4~�4|�6{�7{�5y�3x�2y�2y�3z�3z�1z�0y�/x�/{�.z�-y�.z�.z�/{�-y�,x�0y�/x�0y�1z�0y�.u�.u�0w�0w�0w�0w�1x�0z�0z�/y�-w�-w�.x�0w�0y�-y�,x�+y�+y�(v�)w�,x�,x�+w�*v�,u�,u�,x�+w�*v�+w�,x�,x�+w�*v�)u�'s�'s�'u�+w�*x�*v�*v�*v�+w�+w�)u�*v�+w�,x�+w�-v�+t�*s�+t�-v�.w�-v�,u�)u�)u�)u�(t�'s�'s�'s�'s�'s�'s�&r�'s�'s�'s�'s�&r�(q�*s�+r�(q�'p�(q�)s�)s�'s�'s�&r�%q�#o�#o�$p�%q�$r�%s�%s�%s�%s�$r�$p�$p�&r�'s�&r�$p�"n�#o�#o�"n�#o�#o�#o�#o�#o�#o�"n�!m� l�"n�"n�"n�!m�"n� l�k�"n�"n�!m� l�j�j�k� l�j�l� n�m�l�j�j�k�5|�5|�5|�5|�5|�5|�5|�5|�6}�7~�6�6�6��6��6��7��8�8�8�7~�7~�7~�7~�7~�5~�7��7��5~�6}�8�8�8�6�8��9��7��6�6�7��8��6�6�7��7��9��9��9��8�7��7��8��8��5��5��6��7��7��7��7��7��7��7��9��:��:��:��9��:��;��;��:��9��:��:��9��:��:��:��9��6��6��5��5��5��6��5��7��8��8��9��7��6��6��6��6��6��7��6��6��6��6��6��8��8��7��7��6��6��5��5��5��6��5��5��7��8��7��6�6�8��8��7��5��5��4��4��4��3��5��5��5��4��6�7��7��6�5~�5~�5~�6�5��5��5��5��5~�6�7�8��8��8��8��8��8��8��8��8��7�7�6��4��3��3��4��6��5�5}�6}�9~�?��Dq�4: #ɖ��W8�lJ�>�{d�M3΁e�yY�kH�c>�M)�P-�E#�N,v&τef�nUt#�2�6!x$ �L4l�T(�[G}/�yes&�}iy.眅�F/�Q:�YA�M6ׇpt$ �|dx$ �oW�-�M;�N>�5$�\K�.ۊwn%�i_B6 8W7,�VFϋv�|晅�쫏몊�}�xa�ic�r�]u�@z�7|�2|�2y�3z�4|�3{�2{�2{�2{�1z�0y�0y�0y�1z�0y�1z�/{�0|�0|�0|�0|�0|�1}�/{�/x�0y�0y�/x�0w�0w�1x�0w�/x�/x�/y�0z�/{�2|�1x�0w�.w�-v�+w�+w�+y�,z�,z�,z�,x�,x�/x�/x�/x�/x�,x�,x�,x�+w�+w�+w�+w�,x�,x�+w�*v�+w�+w�*v�+w�,x�+w�+w�+w�*v�*v�+w�,x�+w�+t�+t�,u�,u�,u�+t�+t�+t�+w�*v�)u�)u�)u�)u�)u�(t�*v�*v�+w�*v�*v�)u�)u�)u�)r�)r�)r�(q�)r�*s�*t�)s�&r�'s�'s�(t�'s�'s�(t�)u�&t�'u�'u�&t�&r�&r�&r�&r�$p�$p�%q�$p�$p�%q�%q�%q�#o�"n�#o�#o�$p�#o�#o�"n�#o�#o�#o�"n�!m�"n�!m� l�k�k� l�!m�"n�"n� n�m�l�m�m�l�j�i�j�j�4{�5|�6}�7~�8�8�8�7~�7~�7~�7~�7~�6�6�6�6�7~�7~�7~�7~�7~�8�8�8�8�9��:��9��7��8��8��7��7��8��8��8��8��9��8��7��9��9��8��9��9��:��:��:��9��:��:��9��6��7��8��9��6��7��7��7��6��6��9��9��6��7��8��8��8��7��8��9��6��7��9��9��9��8��7��7��6��7��7��6��6��5��8��:��:��8��7��8��8��6��6��7��6��7��7��7��6��6��9��:��9��8��6��6��5��6��6��7��7��7��6��7��9��9��9��9��;��9��6��5��5��6��5��5��5��6��7��5��6�6�7��7��7��8��8��8��5��4��4��4��7��6�5~�6�8�8�8�8�9��9��9��8��7��7��6��4��5��5��5��7��8��;��;~�;}�;}�Gy�>  sMB�iN�iH�`<�Z2�Z/�]0�b5�g;݋c�q�jI�6�nS�.�iP�A'�Q8�^Et2�[Hv+�dQp'�gT{4 �dP�O;�<&�aKr*�gRl �pY~0�[F�C/�I8�ZK|)�^Mz+�jZw/!�EN-&Ae1�z]�vW�sU�sS�rL�yQ�lH�iP�jf�t�Wv�?{�7|�3}�1z�3|�5~�4}�2{�3|�3|�2{�1z�0y�1z�1z�0y�0y�.z�/{�/{�/{�0|�0|�1}�/{�0y�0y�0y�/x�/v�0w�1x�0w�/x�/x�/y�0z�/{�0|�1z�1x�/x�.w�,x�,x�,z�-{�-{�,z�,x�,x�/x�0y�/x�/x�/x�-y�,x�-y�,x�+w�+w�+w�,x�+w�*v�+w�+w�+w�+w�,x�,x�,x�+w�+w�+w�,x�,x�+w�,u�,u�,u�,u�,u�,u�,u�+t�+w�*v�)u�)u�*v�+w�*v�*v�*v�*v�+w�*v�)u�)u�)u�)u�*s�*s�)r�)r�*s�+t�*t�*t�'s�'s�(t�(t�(t�'s�'s�'s�(v�(v�(v�'u�&r�%q�%q�%q�$p�%q�%q�%q�%q�&r�'s�'s�$p�#o�$p�$p�$p�$p�#o�#o�$p�%q�$p�#o�"n�"n�"n�!m�"n�"n�!m�!m� l�!m� n� n� n� n�m�l�k�j�j�k�6~�6~�7�8��8��8��8�8�9��9��9��9��8�8�7��7��9��8�8�8�8�7~�7~�7~�9��:��;��;��:��:��9��7��7��7��7��8��9��9��8��8��:��:��9��8��9��:��:��:��8��9��9��9��7��7��7��7��7��7��7��7��6��6��8��9��6��7��8��8��7��7��8��9��7��8��9��9��8��7��7��8��6��6��6��6��5��6��7��7��9��7��6��7��7��6��6��8��7��7��7��6��6��6��9��:��9��:��7��7��6��5��6��7��6��6��5��5��6��7��8��7��9��8��7��6�5��5��6��6��6��7��7��6��7��7��7��7��7��7��7��7��4��4��5��6��6��5��6�5~�6�6�6�6�6�6�6�6�6�6�4��4��6��7��6�6�8��:�:}�7z�>��?u�.Y (f;4�oT�`>�\2�qB�Z(�J�i:�o@�d9�~T��}�iG�t�Y=̅i�pU�qW��f�]DȄm�YCՎx�XAږ�]Fɇo�{c�eMƄl�T=ǃl�P:ړ}�dLІm�nW�kT�xb�XC˃m�P:Ʌp�`O�jbPX1,=B�A&�wP�d9�sH�[�}H�xF�mB�iO�llzt�Sx�=}�8~�5�2{�2{�3|�2|�1z�2{�3|�3|�2{�1z�1z�1z�0y�0y�0y�0y�1z�2{�1z�0y�.z�-y�.z�/{�0y�0y�0y�1z�/x�/x�0y�0y�.z�.z�.z�.z�0y�/x�/x�/x�-y�-y�-y�-y�-y�,x�,x�,x�0y�0y�0w�-v�.w�-v�-v�/x�0y�0y�/x�.w�-y�+w�+w�,x�-y�,x�,x�-y�,x�+w�+w�+w�,x�,x�+w�+w�,u�,u�+t�,u�-v�-v�,u�+t�+w�*v�)u�)u�*v�*v�*v�*v�)u�*v�*v�*v�)u�(t�(t�)u�+t�*s�)r�*s�*s�+t�+t�*s�'s�(t�(t�(t�(t�'s�&r�&r�%q�&r�&r�&r�%q�%q�&r�&r�$p�$p�$p�%q�%q�%q�%q�%q�$p�$p�$p�$p�$p�$p�#o�"n�"n�#o�#o�"n�"n�#o�$p�$p�#q�"p�!o� n�l�l�m�!o�!o�!o�m�l�k�k�k�l�9��9��8��7�6~�7�7~�7~�9��9��8�8�8�8�7��7��8�8�8�8�8�9��9��9��8�9��:��;��:��:��9��8��7��7��7��8��8��8��8��8��:��9��8��8��8��9��9��:��9��9��9��:��9��8��7��6��8��8��8��8��7��6��9��9��7��8��8��8��7��7��8��9��8��8��9��8��7��7��7��8��6��6��7��6��7��8��8��8��9��8��6��6��6��6��7��8��7��7��7��7��6��6��9��:��:��;��9��8��6��6��7��7��7��7��6��5��6��7��9��9��9��8��7��7��5��6��6��6��8��8��7��6��8��9��8��7��8��8��8��7��4��4��5��6��6��6��7��6�6�6�6�6�6�6�5~�6�6�6�4��6�7~�8�7�6�6�8��9~�6{�4y�J��*Et-k@:�gM�Y6�Q&�xH�]+�P �_0�a2�zL�rC�vI�h�w�v�}��tܓs�}ٔu�|�{����|�~�~ߚyޙxߚy餃ؑq����Ꟁ����}�����w碁ߝ{馉ݝ�ȍk6.EFG}8�{O�l<�b0�{F�p5�d.�i@�`L�wlr�Kx�9|�6�5�3|�2{�3}�2|�1z�2{�2{�3|�3|�2{�1z�0y�2{�1z�0y�1z�2{�2{�1z�0y�.z�/{�0|�0|�1z�0y�1z�2{�/x�0y�0y�0y�.z�-y�-y�-y�.w�.w�.w�/x�-y�-y�-y�,x�-y�,x�,x�,x�/x�0y�0w�.u�/x�-v�-v�0y�1z�0y�/x�.w�-y�+w�+w�,x�-y�,x�,x�,x�,x�+w�*v�+w�,x�+w�+w�+w�-v�,u�+t�+t�,u�-v�,u�,u�+w�+w�*v�*v�)u�)u�)u�)u�)u�*v�*v�*v�)u�)u�)u�)u�,u�+t�*s�+t�+t�+t�+t�+t�'s�(t�(t�(t�(t�'s�'s�'s�%q�%q�&r�&r�&r�&r�&r�'s�%q�%q�$p�%q�%q�$p�$p�$p�$p�$p�$p�$p�$p�#o�"n�!m�"n�#o�#o�"n�!m�"n�#o�#o� n�!o�"p�!o�m�l�m� n�!o� n�m�l�l�l�m�m�:��9��8��7�7�7�8�8�8�7~�7~�7~�8�8�8�8�7~�7~�8�8�9��:��;��;��9��8�9��:��:��:��9��9��9��8��8��9��9��8��8��9��:��9��9��9��:��:��9��9��9��:��;��;��9��9��8��8��8��9��9��9��7��7��9��:��8��8��8��8��8��8��8��9��8��8��8��8��8��8��8��8��8��8��8��7��8��9��9��8��9��9��7��6��7��8��8��7��7��8��8��7��6��6��:��<��:��:��8��8��7��7��7��7��6��7��8��7��7��8��9��8��9��9��9��9��9��9��8��8��8��8��7��6��9��:��:��8��8��9��9��8��5��5��5��6��6��6��6��5��7��6�7��7��8��8��7��7��6��6��5��7��:�;�9�6~�6�7��8�6~�8��@}�Fg�%%Ah?;�oV�[6�N$�yO�T(�N#�b5�i;�R�g4�r?�}J�n?�nA�kA�rJ�uM�hB�rI�l@�i;�j;�d5�c4�g8�b3�f7�c4�[,�f7�`1�k<�o@�d6�d5�e6�`0�^0�^/�b1�i7�xK�kG�gMa&@g7+P|7�yP�_/�h7�~I�g.�j8�nK�QF���ev�Ex�6|�6~�5�3|�3|�4~�4~�3}�2{�2{�3|�3|�3|�2{�1z�3|�2{�2{�2{�3|�3|�2{�1z�1}�1}�0|�/{�.z�.z�/{�/{�.z�.z�/{�/{�.z�-y�-y�-y�.z�.z�-y�-y�.z�.z�-y�-y�.z�-y�/x�/x�/x�/x�0w�0w�1z�.w�.w�0y�0y�/x�/x�0y�.w�-v�.w�/x�.w�-v�-v�-v�.w�,u�,u�.w�/x�.w�-v�-v�+w�+w�*v�)u�)u�*v�*v�+w�*v�+w�+w�*v�)u�)u�*v�+w�)u�)u�)u�)u�*v�*v�)u�)u�,u�+t�+t�,u�+t�*s�(t�*v�(t�(t�(t�(t�(t�'s�'s�'s�*t�*t�*s�*s�'s�&r�&r�&r�'s�&r�&r�'s�&t�$r�#q�#q�$p�$p�$p�$p�$p�$p�#o�"n�#o�$p�$p�#o�!m�!m�"n�"n� n�!o�"p�"p�!o� n� n� n�!o� n�l�l�m�m� n� n�8��8��9��9��9��9��9��9��8�8�7~�8�9��:��9��9��9��9��9��9��9��:��:��:��;��:��9��9��9��9��9��9��;��:��:��:��9��8��9��:��:��:��;��;��<��;��:��9��9��:��<��<��8��8��8��9��8��9��9��9��8��7��:��;��9��8��8��7��8��8��8��8��8��8��9��9��:��:��9��9��7��8��8��7��7��9��8��7��8��9��9��7��7��9��9��7��6��8��9��8��6��6��;��>��:��9��7��7��8��8��7��6��5��6��7��6��6��8��8��8��9��9��9��9��9��9��8��7��7��8��8��7��9��:��;��:��6�7��9��9��7��7��7��8��6��7��7��6��7��7��7��8��9��9��8��8��5��5��4��6�7~�9��7�3~�2~�6��8�7�4��<}�Ox�"(HiFD�gM�T0�J ��X�T-�P)�[1�b4�Q�r>�u>�[�uB�h6�i8�Y�h;�^0�uF�{H�n8�i5�J�{F�r=�}H�~I�h3�b-ہL�r=�c.�l7��N�g2�d/ցK�s=�d-�p4ތP�h0�h9�_�R=La- S -|: �vR�d9�j=�vF�g3�nA�vY�]Y{r�\w�B{�6~�6��6��3|�2|�2�1~�5�4}�2{�3|�4}�5~�4}�3|�3|�3|�3|�3|�3|�3|�3|�3|�1}�0|�.z�-y�.z�/{�0|�/{�/{�/{�/{�/{�.z�.z�.z�/{�1}�0|�/{�/{�/{�/{�/{�.z�/{�.z�/x�/x�/x�0y�1x�2y�/x�-v�-v�/x�0y�/x�0y�3|�/x�/x�0y�1z�/x�-v�-v�.w�/x�-v�-v�/x�0y�/x�.w�.w�,x�,x�,x�*v�)u�)u�*v�,x�(t�*v�+w�+w�*v�*v�,x�-y�)u�)u�)u�)u�*v�*v�*v�)u�-v�,u�,u�,u�+t�*s�(t�*v�)u�(t�(t�'s�'s�&r�&r�&r�*t�*t�+t�+t�'s�&r�%q�%q�(t�&r�&r�'s�&t�$r�#q�#q�%q�%q�%q�%q�%q�%q�$p�$p�#o�$p�%q�#o�"n�#o�#o�#o�"p�"p�"p�"p�"p�"p�!o�!o� n�m�l�l�m� n� n� n�9��9��8��9��:��;��:��9��9��8�7~�8�9��:��:��9��7��8��9��:��9��9��9��:��:��:��:��:��9��9��9��9��:��9��9��:��;��;��9��8��9��9��9��:��9��9��:��<��<��<��<��;��8��9��9��:��8��8��8��8��8��8��:��:��8��9��:��:��9��8��7��7��7��9��;��;��9��8��8��9��8��8��8��9��9��8��8��:��9��9��8��7��7��7��8��9��9��9��8��8��8��9��<��<��9��:��8��6��6��7��8��7��8��6��5��6��8��9��9��8��7��7��8��8��8��8��8��8��7��6��5��5��9��9��9��9��8��9��9��:��8��7��6��6��7��6��5��6��6��6��8��9��9��8��5��5��7��8��7��5��9��8��5��5��5��9��:��9��3�@��O��?Qu^FF�qY�W4�J"�}Z�hF�Z4�`6�oC�Q�uD�}I��]�tA�f3�])��V�e0�a,�o:�~J�i4�b/�T��\��b�S�P�h4�f2�R�s?�n:�\(�S�n<�^,�}J�v?�i.�k*��N�b$�c.�wOԇmP`.#I -v?+͈k�sR�hE�Z�mB�mI�wa�vxwz�Tx�A}�7��7�6��5~�2~�0~�0~�2~�5~�3|�4}�3|�2{�5~�4}�4}�3|�2{�2{�3|�4}�4}�4}�0|�/{�/{�/{�0|�0|�0|�0|�0|�0|�0|�0|�0|�/{�/{�/{�0|�/{�/{�/{�/{�.z�-y�.z�/{�.z�0y�0y�0y�/x�0w�1x�/x�/x�0y�0y�1z�1z�0y�/x�/x�.w�-v�.w�0y�0y�/x�-v�.w�,u�,u�-v�/x�0y�/x�.w�,x�,x�+w�+w�+w�+w�+w�*v�+w�,x�,x�,x�,x�,x�+w�*v�*v�*v�)u�)u�)u�*v�)u�(t�+w�*v�*v�*v�)u�'s�(t�)u�)u�)u�*v�)u�(t�'s�&r�&r�*t�*t�*s�*s�'s�'s�&r�&r�&r�'s�'s�&r�%s�%s�&t�(v�(t�'s�%q�%q�%q�%q�$p�$p�&r�%q�#o�"n�"n�"n�#o�$p�!o�"p�"p�!o�!o�!o�"p�"p� l� l� l�!m�!m�!m�!m� l�:��9��9��:��:��;��:��9��9��9��9��:��:��:��;��;��9��9��;��;��;��;��;��;��;��;��;��:��:��:��;��;��<��;��;��;��;��;��:��9��;��;��<��=��=��;��;��<��<��<��<��;��8��8��8��8��9��8��8��9��9��:��;��:��8��9��9��:��:��9��8��8��8��9��;��;��:��9��:��;��9��8��9��9��9��8��8��9��8��8��9��9��:��9��9��8��:��9��9��9��9��9��;��:��9��:��7��7��7��8��8��7��8��8��7��7��8��8��9��9��9��8��9��9��9��9��9��9��8��7��6��6��9��:��9��9��9��9��9��:��8��7��7��6��8��6��6��7��8��8��9��9��:��:��7��7��8��8��7��7��8��8��6��5��7��:��;��9��2~�=��I�>V|q]^��l�xU�wP�z�l؉b�i>ۇ[�^�i;�|L��[�sC�f5�c/�O�c-�_'�t?�{G�b0�_-�R��`�[�~N�]�a0�c2�T�m=�a1�`0�V�b3�]0�xH�uE�m6�l/��S�_#�e/�vP؈mW -X&Y+�]J멏������i؈eґ}���pz�Q{�>}�6��7�6~�4}�2~�0~�/}�2~�5~�2{�3|�3|�3|�6�5~�4}�4}�3|�3|�3|�3|�3|�3|�0|�0|�/{�0|�0|�0|�0|�0|�0|�0|�0|�0|�0|�0|�0|�0|�1}�/{�.z�/{�/{�/{�/{�/{�/{�.z�0y�1z�1z�0y�2y�2y�/x�0y�1z�2{�2{�1z�/x�.w�.w�.w�/x�/x�/x�/x�.w�.w�.w�-v�,u�-v�/x�0y�/x�/x�.z�-y�-y�-y�-y�-y�-y�-y�*v�+w�,x�+w�+w�,x�+w�*v�+w�+w�*v�*v�*v�+w�+w�)u�+w�*v�*v�*v�)u�(t�(t�*v�(t�(t�)u�*v�)u�)u�)u�)u�*t�*t�)r�)r�(t�(t�'s�&r�'s�'s�(t�'s�&t�%s�&t�'u�(t�(t�'s�&r�&r�%q�%q�&r�%q�%q�$p�#o�#o�#o�#o�#o�!o�"p�"p�"p�!o�!o�"p�"p�!m�!m�!m�!m�"n�"n�!m�!m�<��<��9��9��:��:��9��8�9��:��;��;��:��:��;��;��:��:��;��;��;��;��=��>��?��>��;��:��9��:��<��=��=��<��;��;��<��=��;��;��<��;��<��<��<��;��;��<��;��;��;��;��8��8��8��8��9��9��8��9��;��;��<��;��9��9��:��:��:��:��:��:��9��:��;��;��:��9��:��;��:��9��9��9��9��8��8��9��9��9��:��;��;��:��;��9��9��9��9��9��9��8��:��9��;��:��8��8��9��:��9��7��7��8��9��8��7��7��8��9��;��:��8��8��:��;��:��:��8��7��7��7��:��;��:��:��9��9��:��:��8��8��7��7��8��6��6��8��9��9��9��8��9��9��7��7��7��6��6��6��6��6��6��5��7��8��9��8��5��9~�Q��@X~{eg�u]�nK�d=�\7�O(�Q(�P%�k?�b�tJ�xM�f�tG�c5�e4܀O�d1�`-�wD�vF�V'�_0�U�[�Q�|K�Y�^-�`/�U�h8�X+�_2�T�Z.�c<�vO�rI�g:�d3�[�]+�a6�sS�{dZV%\-^'�fG�iD�mF�wM؇Z֋cϑx���m|�Kz�=~�6��7�7�5~�3�2~�2~�5~�4}�1z�2{�4}�4}�6�5~�4}�4}�3|�3|�3|�4}�3|�3|�3}�2|�2|�2|�1}�1}�1}�0|�0|�0|�1}�1}�3|�3|�3|�3|�1}�/{�.z�.z�0|�0|�/{�0|�.z�-y�0y�1z�1z�1z�1z�1z�0y�1z�3|�3|�2{�0y�/x�/x�.w�0y�1z�0y�/x�.w�.w�/x�0y�/x�/x�.w�/x�/x�/x�/x�-y�-y�,x�,x�,x�-y�-y�-y�*v�,x�,x�+w�+w�+w�,x�+w�,x�,x�+w�*v�*v�,x�+w�*v�+w�+w�+w�*v�*v�)u�*v�+w�)u�*v�*v�*v�*v�)u�)u�)u�)u�(t�(t�(t�(t�(t�(t�(t�'s�(t�)u�)u�(t�'s�'s�'s�&r�'s�(t�'s�%q�$p�%q�&r�%q�%q�%q�$p�$p�$p�#o�#o�!o�!o�"p�"p�"n�"n�"n�"n�!m�!m� l� l�#l�#l�#m�"l�<��;��9��9��:��:��9��8�:��;��<��<��;��;��;��<��;��:��;��;��;��;��>��>��?��>��;��:��9��:��;��<��<��<��<��<��=��>��=��=��<��;��:��:��:��:��<��=��;��;��;��;��9��9��:��:��9��9��9��:��;��;��<��<��;��;��:��:��;��;��;��;��;��<��<��;��:��9��:��:��:��:��:��9��9��9��9��:��<��;��:��:��:��:��;��:��9��9��9��9��9��9��;��;��<��<��9��9��:��:��9��8��7��9��:��:��9��8��8��9��;��:��8��8��;��;��;��:��9��8��8��8��:��:��:��:��9��9��:��:��8��8��8��7��8��7��7��8��9��8��:��9��8��8��6��6��6��6��6��6��6��5��6��6��7��8��:��8��8��A��R��>T{W=>�hO�eD�oH�X�~W�uMՂX�rJ�U*�g=�b�k�xL�j>�l@ފ\�m?�l=�|L�P�g9�e7�Z��i�~O�xI�b�l=�h9�]�pA�c7�e9߂V�g<�f@�wS�wR�lE�pF�d�k?�c=�vZɁkc)W&Bq8�v�n�m֎^ԆV�|S�nR�upkz�M|�>�7��6��6�6}�5~�5~�6�4}�5~�2{�3|�4}�3|�5~�3|�4}�3|�3|�3|�3|�4}�5~�5~�4~�3}�3}�3}�2~�2~�1}�1}�1}�1}�1}�1}�3|�3|�3|�3|�3|�/{�.z�/{�0|�0|�/{�/{�.z�.z�0y�1z�2{�1z�0y�1z�1z�2{�2{�1z�0y�/x�0y�1z�/x�1z�2{�1z�/x�.w�/x�0y�2{�2{�1z�0y�/x�/x�/x�/x�,x�,x�+w�+w�+w�,x�,x�,x�,x�-y�-y�,x�+w�+w�,x�,x�,x�+w�*v�)u�*v�+w�+w�*v�,x�,x�,x�+w�+w�*v�+w�,x�*v�*v�*v�*v�*v�)u�)u�)u�)u�)u�)u�)u�(t�(t�)u�)u�(t�(t�)u�)u�(t�'s�'s�'s�%q�'s�(t�'s�&r�%q�&r�'s�%q�%q�%q�$p�$p�#o�#o�#o�!o�!o�"p�"p�"n�"n�"n�"n�"n�!m� l� l�#l�#l�#m�#m�<��;��;��;��:��:��:��9��<��<��=��=��=��=��<��<��;��;��<��<��<��<��?��?��?��>��<��<��:��:��8��;��<��<��<��=��>��?��=��=��=��<��;��;��9��:��;��<��<��;��;��;��9��:��;��;��9��:��:��:��:��9��;��<��<��;��:��:��;��;��;��;��=��=��<��;��;��;��;��;��:��:��:��9��9��:��9��:��;��:��:��9��;��<��<��<��;��;��:��:��:��;��=��=��<��<��;��;��:��9��8��9��:��;��=��>��;��:��9��8��:��9��8��8��9��9��;��:��;��:��9��9��:��:��9��8��9��9��:��:��8��8��8��8��8��7��7��8��:��9��:��;��:��9��8��9��8��8��8��7��7��8��:��8��9��:��:��:��:��A��M}�5DkjKIʊq�zZ�qL�U.�lE�xSہ\�kځY�Y/�S�v��lߔj�k��}�i�i�q�u�h��e�t�s�g�q��r�iޑc�v�fێ`ߒd�r�h�f�s�r��h�m�y�nۍi蜂�q\QCb,�B#�j�_�xI�tBуS�s̍n�jas��N|�?�7��5~�4}�5|�6~�6~�7�5|�7~�5|�6}�6}�4{�4}�2{�5~�4}�3|�2{�3|�4}�5~�6�5}�5}�4~�4~�4}�4}�1}�0|�1}�1}�3|�3|�3|�2{�3z�2{�3|�2{�1z�2{�3|�2{�1z�0y�3|�2{�0|�0|�1}�0|�/{�/{�1z�1z�2{�1z�/x�/x�0y�2{�0y�1z�/{�/{�.z�-y�-y�-y�1z�2{�2{�0y�/x�0y�0y�0y�-y�-y�-y�-y�-y�-y�-y�.z�-y�.z�.z�,x�+w�+w�,x�,x�,x�+w�*v�)u�*v�,x�,x�+w�,x�,x�,x�+w�+w�+w�+w�,x�(t�)u�)u�*v�+w�+w�+w�+w�*v�*v�+w�*v�(t�(t�)u�*v�(t�(t�(t�(t�*s�*s�*t�*t�'s�(t�(t�(t�(t�(t�'s�'s�&r�&r�%q�$p�#o�#o�#o�$p�#o�#o�$p�#o�#o�"n�"n�"n�%n�$m�$m�#l�$m�$m�$n�$n�=��<��<��=��<��<��;��;��<��<��<��<��<��<��<��<��;��;��;��<��<��=��?��?��?��?��=��=��<��<��9��9��<��=��>��>��>��>��<��<��<��=��=��=��;��<��<��;��=��<��;��;��9��:��:��:��9��:��;��:��9��9��<��=��;��;��:��:��:��;��;��:��;��;��:��:��;��;��;��;��:��;��;��:��:��;��:��:��8��9��:��:��<��=��=��=��<��;��:��9��9��:��<��<��;��<��;��;��9��8��8��9��:��;��<��=��;��:��9��7��9��9��8��8��9��9��;��:��9��9��9��9��;��;��:��:��:��:��:��:��8��8��8��8��8��8��8��8��9��9��:��<��:��9��9��9��9��9��9��8��8��8��:��:��;��=��<��;��>��C��S��*OyWUȊq�uU�M-aj%�nO�|[�}Y�oI׈]�qB�b2�f7�b4�_3�_6�e9�e8�h:�g7�tC�j9�e4�g6�`/�c2�b1�g6�e4�d3�c2�_.�n=�k:�g8�f8�f9�f:�b7�i>�k@�vN�zU�\@p,PS Ty:܊e�uK�Hz9�E�zXГw�ic���U�B��8��6�5~�6}�6~�6�7��5|�7~�6}�7~�6}�4{�4}�3|�6�5~�4}�3|�2{�2{�4}�5~�5}�5}�4~�4~�4}�4}�1}�0|�1}�1}�3|�3|�3|�2{�3z�3z�3|�3|�3|�4}�4}�2{�1z�1z�4}�3|�0|�0|�0|�/{�/{�/{�0y�1z�1z�1z�1z�0y�0y�1z�1z�1z�.z�.z�.z�-y�-y�-y�/x�1z�1z�/x�/x�1z�1z�0y�.z�.z�.z�.z�-y�-y�.z�.z�-y�.z�-y�,x�+w�,x�,x�+w�,x�,x�+w�*v�+w�-y�,x�+w�+w�,x�,x�*v�*v�*v�+w�+w�*v�*v�*v�+w�+w�,x�+w�+w�*v�+w�+w�*v�)u�(t�)u�*v�)u�)u�)u�(t�*s�+t�+u�+u�)u�(t�'s�(t�(t�(t�(t�'s�'s�&r�%q�$p�$p�$p�$p�$p�$p�$p�%q�$p�$p�#o�#o�#o�%n�$m�$m�$m�$m�$m�#m�#m�>��>��=��>��>��?��<��;��<��<��<��<��;��;��<��=��:��:��;��<��=��=��?��?��?��?��=��>��=��=��:��:��=��>��>��>��>��=��<��<��<��<��=��<��;��<��;��9��=��=��<��=��;��;��;��:��;��;��;��:��:��:��=��>��=��<��<��<��=��>��=��=��<��<��<��<��=��=��=��=��:��;��<��;��:��;��:��:��8��9��;��;��=��=��=��=��:��:��9��9��9��:��<��<��<��<��;��;��;��9��9��:��<��<��;��;��9��9��8��7��8��9��:��:��9��9��9��9��8��8��9��:��<��<��<��<��;��;��;��;��9��9��9��:��9��8��8��9��;��:��:��;��:��:��:��:��8��8��8��7��7��7��9��:��;��<��<��=��>��E��Hv�-SmQNŒt�hK^!=A -�_Fӌp�T4�6�pB�l�h�i�b�]�\��h��g�d�f�_�_�f�c�Y�U�[�]�]�W�Y�W�c�^�[�\�X�^�Z�Z��R�[�`߉f�J-e(FHp6؎q�O2E E[�_J��u�lkz��S{�D~�<��9��8��8�7��4��4��5~�7~�5|�6}�6}�5|�7~�5|�6�6�5~�4}�1}�1}�2~�4}�6~�6~�6~�6~�5~�4}�3|�2{�3|�3|�3|�3|�4{�3z�3z�3z�3|�3|�3|�4}�4}�2{�2{�2{�4}�2{�/{�/{�0|�/{�/{�0|�1z�1z�1z�1z�1z�1z�/{�/{�/{�/{�/{�/{�.z�.z�.z�.z�/x�2y�1z�0y�0y�2{�2{�0y�.z�.z�.z�-y�-y�-y�,z�-{�-y�-y�,x�+w�,x�-y�-y�+w�,x�,x�+w�+w�,x�-y�-y�,x�,x�-y�,x�+w�*v�+w�+w�+w�,x�+w�+w�+w�+w�+w�+w�*v�*v�*v�*v�*v�*v�*v�)u�)u�)u�)u�,u�,u�,u�,u�,v�+u�)u�(t�'s�'s�(t�(t�(t�'s�'s�'s�&r�&r�%q�%q�$p�$p�%q�%q�%q�$p�$p�#o�&o�&o�%n�%n�%l�%l�&n�%m�%m�$l�?��>��>��>��>��>��;��:��=��>��?��>��<��<��=��?��;��:��<��=��>��?��>��>��>��=��=��=��=��=��;��>��<��<��=��<��=��=��=��>��=��=��<��;��9��;��;��<��<��<��=��?��>��>��<��;��<��;��;��;��;��<��=��?��=��=��<��=��>��?��?��>��?��>��>��>��>��?��>��=��:��<��<��;��:��;��:��9��9��;��<��<��<��<��<��>��9��9��:��:��;��<��>��=��<��<��:��<��<��;��:��;��>��?��=��<��9��9��9��9��9��;��<��;��:��9��9��9��;��;��;��;��<��;��;��:��<��<��<��<��:��:��:��:��9��8��8��:��<��<��;��;��:��;��;��;��8��8��8��9��8��9��:��:��:��<��;��<��=�H��R��0CkbNO��w�zbU'L"Z0 �dOĊr|;w3�e8�]��i��c��b��`��^��_��b��`��a��`��a�_��d��l��Z�]��b��`��`�`��a�_��`�]�[�V��]�W�Y�Z�Z�W�d�mKp4G5 -i:&ϗ~v>'4 ;G�\L��s�yzky�U}�B|�;�;��9��9��6�2�1~�6�7~�3z�5|�6}�6}�9��7~�6�6�7��7��4��3�3�5~�6��7�7�7�6�5~�4}�3|�3|�3|�3|�3|�4{�4{�4{�3|�2{�2{�3|�3|�2{�1z�2{�3|�4}�2{�/{�0|�1}�1}�1}�2~�3|�2{�1z�0y�1z�1z�0|�0|�/{�0|�0|�0|�/{�.z�/{�2{�1z�3|�2{�1z�1z�3|�2{�/x�.z�.z�.z�-y�-y�,x�-y�.z�-y�-y�,x�,x�-y�/{�.z�,x�,x�,x�,x�+w�,x�-y�-y�,x�-y�.z�-y�,x�+w�,x�,x�,x�*v�*v�)u�*v�+w�+w�+w�+w�+w�)u�)u�*v�+w�+w�*v�(t�)u�*v�-v�.w�.w�-v�,v�+u�*v�)u�(t�(t�(t�)u�(t�(t�'s�'s�'s�'s�'s�&r�%q�$p�%q�%q�$p�$p�#o�#o�#o�&o�'p�'p�'p�'p�(p�'q�'o�%o�=��=��=��=��=��=��?��@��@��?��<��=��>��>��=��=��<��>��>��<��<��=��=��=��@��=��=��=��>��=��<��=��=��;��>��;��=��;��;��<��=��<��;��;��=��>��>��>��<��<��=��=��=��>��>��>��;��;��;��=��=��<��;��;��:��:��:��:��<��<��<��;��>��=��<��;��<��<��;��;��9��:��;��;��;��=��<��;��;��9��:��<��<��;��=��=��;��;��;��:��:��;��;��;��:��:��;��;��;��;��:��:��<��<��;��<��<��=��<��;��>��;��9��9��:��;��:��9��9��9��:��:��;��:��9��8��:��9��8��8��8��:��:��:��9��9��:��9��9��8��:��:��;��;��;��;��;��<��<��<��:��;��;��:��:��9��;��<��=��E��Q��7NwTGN�{p~^QQ1$V:.P3#nE/|N4vD-\#�Q׌S��_��[��^��^��Z��\��a��Y��Y��]��a��_��g��j��`�Z�Z��[��a��a�_�^�Y�X�X�R�X�Q�R�X��^�S�Y�pFyA*:2Y:&�~hcC.20L"�aO�p�yzj~�Oy�B}�:}�9}�8�9��5��2��0�5~�7~�7~�7~�6}�5|�4}�5~�6�6�6�6�4}�2{�3|�4}�4}�5~�6�6�5~�4}�4}�4}�5~�4}�3|�3|�2{�2{�3|�3|�4}�3z�2{�3|�4}�3|�2{�1z�/{�0|�1}�2~�2~�2~�1�2~�3|�3|�2{�2{�2{�2{�2{�1z�1z�2{�3|�2{�0y�/x�0y�1z�2{�/{�/{�0|�1}�1}�0|�.z�/{�/{�0y�0y�0y�0y�0y�1z�0y�/x�,x�-y�.z�.z�-z�-z�+x�+x�,x�,x�,x�,x�/x�0y�-y�.z�-{�,z�+y�*x�+y�,z�,z�,z�,z�+y�+w�*v�+w�,x�+w�,x�,x�,x�+w�*v�*v�*v�-v�-v�,u�+t�+t�+t�+t�+t�)u�)u�)u�)u�(t�(t�'s�'s�'s�'s�'s�&r�%q�%q�%q�&r�%s�$r�"p�"p�#q�#q�#q�$p�#o�$p�%q�$p�&p�#o�%o�$p�=��=��<��<��<��<��>��>��@��?��<��=��=��=��;��<��<��=��=��<��<��=��=��=��>��=��=��>��>��=��=��>��;��;��;��;��;��;��;��<��>��=��=��<��=��=��>��>��=��=��>��>��>��>��>��>��=��<��;��<��;��;��;��<��;��;��;��;��;��<��<��<��;��;��:��;��;��<��<��<��;��<��=��<��;��<��;��;��<��:��;��<��<��;��=��=��=��=��<��<��<��;��;��;��=��<��<��<��;��:��:��:��=��=��=��=��=��=��=��=��=��=��:��:��:��:��:��:��:��:��;��;��:��:��;��;��9��9��:��:��;��;��;��:��:��:��:��9��9��9��;��<��;��<��<��<��<��<��;��:��=��>��<��;��8��7��9��<��A��A�X��4PxLEMv_WeMC5")Y9"}X>f=+j;!��XؑY�]��\��_��]��X��[��]��W��\��Q�V�a�_ބR�s?�i5�h3�d/�l9�sBۅT�^�\�Y�Y�S�O�N�V�~N�Y�U�X�qF�R=@ -1L1��o^G5',S-�oZ��x���g�O}�B~�:�9}�8�8�8��4��3��8��9��8�7~�6}�6}�6�6�5~�5~�5~�6�6�5~�5~�6�4}�5~�5~�6�5~�4}�4}�4}�5~�4}�4}�4}�3|�3|�1}�1}�6�5|�3|�4}�4}�3|�3|�3|�/{�0|�1}�1}�0|�0|�/}�1}�2~�3|�3|�3|�4}�4}�3|�2{�1z�2{�3|�2{�1z�1z�1z�2{�1}�1}�0|�1}�1}�1}�0|�/{�/{�/{�1z�0y�0y�0y�0y�0y�0y�/x�-y�.z�.z�-y�,y�-z�,y�,y�-y�-y�-y�-y�.w�.w�,x�,x�+y�+y�+y�+y�,z�-{�,z�,z�-{�,z�,x�+w�,x�-y�,x�,x�,x�,x�,x�+w�+w�*v�,u�-v�,u�,u�+t�+t�+t�,u�*v�*v�)u�(t�(t�(t�(t�(t�&r�&r�&r�%q�%q�%q�%q�&r�%s�$r�#q�#q�#q�#q�#q�#q�$p�%q�&r�%q�$p�#o�#o�$p�=��<��<��<��<��=��>��>��=��=��=��=��>��=��;��;��<��<��=��<��<��=��=��=��=��=��=��>��=��=��>��@��;��<��<��<��<��<��<��<��<��<��>��=��=��=��=��>��?��?��>��>��>��>��>��=��=��<��;��<��;��;��;��<��:��;��<��;��;��:��;��<��:��:��:��:��:��;��;��;��<��=��>��=��;��;��;��;��<��;��<��<��<��<��=��>��<��<��<��;��;��;��;��;��>��=��=��<��;��;��:��:��=��>��<��<��;��;��;��<��<��<��;��;��:��:��;��;��:��:��;��:��9��9��;��=��9��:��;��<��<��<��;��;��;��;��:��9��9��9��;��<��<��<��<��<��=��=��<��9��<��=��>��:��7��6��8��;��@��@~�L~�">f839t`UE/$%% )Q5�i@ H�xPȉT�^�c�a�_�X��^�[�X�T�S�|H�m>�j>�d8�U*�I�C�G#�I'�O-�]8�c:�qDփQ�_�W�N�F�M�S�UވW��_�mF�O9F 6 ^9&���P3#, F�V@�oX¦����j��Jy�A��9��8�8�9��9��8��5��9��8��8��7��7��7��7��7��6�5~�6�7��8��8��7��7��6�6�6�6�5~�5~�5~�5~�4}�4}�5~�5~�3�2~�2~�2~�4}�4}�4}�5~�4}�3|�4}�5~�0|�2~�3�2~�1}�0|�1}�2~�2~�1}�0|�1}�4}�4}�3|�1z�2{�2{�2{�2{�2{�2{�2{�2{�1}�1}�1}�1}�0|�/{�/{�/{�0|�/{�/{�.z�0y�0y�0y�0y�/x�/x�.z�.z�-y�,x�,y�.{�,z�,z�-y�.z�/{�.z�/x�-v�,x�,x�,x�,x�+y�,z�,z�-{�+y�,z�-y�-y�,x�,x�.w�/x�-y�,x�,x�+w�,x�,x�+w�+w�,u�-v�.w�-v�,u�+t�,u�-v�+w�*v�)u�(t�(t�(t�(t�)u�'s�'s�'s�'s�&r�'s�'s�(t�&t�%s�%q�%q�%q�%q�%q�%q�%q�&r�&r�&r�$p�#o�#o�#o�=��<��;��<��=��=��?��>��=��=��>��?��?��>��<��<��<��<��=��<��<��=��=��=��=��=��>��>��>��>��?��@��<��<��<��=��=��=��<��<��<��<��?��>��>��>��>��?��?��?��?��?��?��?��>��>��=��<��<��=��<��;��:��;��<��<��<��<��;��;��<��<��=��<��<��<��;��;��;��:��<��=��=��=��<��<��<��<��=��<��<��<��<��<��?��?��:��:��:��;��;��;��;��;��=��=��<��<��;��<��<��<��=��=��<��<��;��;��;��;��=��<��<��;��;��;��;��;��;��;��;��:��:��:��;��=��:��:��;��;��:��:��;��<��<��;��:��:��:��:��;��<��<��<��<��<��=��>��>��=��<��=��=��:��8��7��9��;��<��F��L~�;aOMR���8&&!- -mQ<޾�; <�U/�o=ߖa�b�a�a�V�]�Y�Q��N�r;�b1�V*�=~+w)m$h#`X^a}2�^:�e;�r@�X�K�J�N�P�VچXԇ[�^8�L4M -r@)�X@۸�]<)D �U?�qV�^C˫����i��N��?��9��9��9��;�;��9��7��8��8��8��9��9��8��7��5~�6�6�7��7��8��7��7��6�6�6�6�5~�5~�5~�5~�6�4}�4}�5~�5~�3�3�3�3�3|�4}�5~�6�5~�4}�3|�2{�0|�2~�3�3�2~�1}�2~�4��2~�1}�0|�0|�3|�4}�3|�2{�4}�3|�2{�2{�2{�3|�2{�2{�2~�3�3�2~�0|�/{�/{�0|�0|�/{�/{�.z�0y�0y�0y�0y�0y�/x�-y�.z�-y�-y�,y�-z�,z�,z�.z�/{�/{�/{�0y�/x�/{�.z�-y�,x�,z�,z�,z�,z�+y�+y�-y�-y�,x�+w�-v�.w�-y�,x�+w�+w�+w�,x�+w�+w�-v�.w�/x�.w�-v�-v�-v�-v�+w�*v�)u�)u�(t�(t�(t�)u�(t�(t�(t�(t�(t�(t�(t�)u�'u�&t�'s�&r�&r�&r�&r�&r�%q�%q�&r�&r�%q�#o�#o�#o�=��<��<��<��=��>��>��=��=��=��>��@��?��>��=��=��=��=��=��=��=��=��=��=��>��>��=��>��>��?��?��>��;��<��<��<��=��=��<��<��<��=��=��=��<��<��=��>��=��=��=��=��@��@��@��?��=��=��=��>��=��;��;��<��>��=��<��<��<��<��<��<��>��>��=��=��<��<��;��;��=��=��<��=��<��<��<��<��<��<��=��<��<��=��>��>��;��;��<��<��<��=��=��=��<��<��<��<��<��<��<��=��<��;��;��;��<��<��;��;��>��<��;��;��<��=��<��;��<��<��<��<��<��<��;��;��;��;��<��;��:��:��;��;��;��;��;��;��;��;��;��;��<��=��>��=��=��>��?��@��=��;��:��9��8��8��:��=��<��E��Q��<`uuw�ʻ>0#* 2 T>0�dN�į9 9�\7�yJݗc�_�b�d�T�]�W�|F�l7�e1�L�9 �:�D�G �D�H(�D*u2v3"^ M\�>�[4�a2އQ�M�N܁L�[ՁU֋a�qKc.k8njj�qO�īhB-e3�z`�oQ�pR�Ǭ���o��N��=��8��9��:��<��;��;��8��7��7��8��9��9��9��7��6�4��5��5��5��4��4��4��4��6�5~�5~�4}�4}�4}�5~�5~�5~�4}�2~�2~�2~�3�3�4��4��4��4��4��4��3�1}�/{�2{�4}�5~�4}�3|�3|�4}�5~�3�2~�1}�1}�1}�1}�4}�5~�5~�4}�3|�3|�3|�3|�3|�2{�3�4��4��3�1}�0|�1}�2~�0|�/{�/{�/{�/{�/{�1z�1z�0|�.z�.z�.z�/{�.z�.z�.z�.z�.z�/{�.z�.z�.z�/{�/{�0|�/{�-y�-y�-y�.z�-y�,x�-y�-y�-y�-y�.w�.w�-v�-v�/x�.w�-v�-v�.w�.w�,x�+w�,x�,x�,x�,x�,x�,x�,x�+w�*v�*v�*v�)u�)u�)u�)u�(t�)u�(t�(t�(t�(t�(t�(t�(t�'s�'s�'s�'s�'s�'s�'s�'s�%q�&r�&r�&r�%q�$p�&p�&p�=��=��=��=��>��>��>��>��=��=��>��@��?��=��=��>��>��=��=��=��=��=��<��=��?��>��>��>��>��?��?��>��;��;��;��<��<��<��<��<��=��>��>��=��=��=��=��=��=��=��=��=��@��A��@��@��?��>��=��=��<��;��=��>��>��=��<��<��=��=��=��<��=��=��=��=��=��<��<��<��?��=��<��=��<��<��;��;��;��<��=��=��=��=��>��>��=��=��=��=��=��=��<��<��=��=��=��<��<��<��<��<��=��<��<��<��=��=��<��;��>��<��;��;��=��=��<��;��<��;��;��<��<��;��:��:��;��<��=��=��<��;��;��:��;��;��;��;��<��;��;��:��<��>��@��?��>��>��>��>��<��;��9��9��:��:��;��=��A��C��L��+Lo����Ƿ?3%* O<-fR�rXݽ�71��^̖gݗc�]�e�h�X�XޅM�q;�g2�N�I�N#�M&�W2�d@�iI�jN�kV�iZ�^R�C7o-OM s.�W2�j;ڃN�Z�Z߄U݉[։_ń\�eAt>Ӓh�sL绞jB)�`E�~`�pP�tR�Ͱ���m��M�=��7��:��;��<��;��:�7�9��8��8��8��8��8��8��8��3�4��5��4��4��4��5��5��7��7��6�6�6�6�6�6�5~�5~�3�3�3�3�4��4��5��4��3�3�5��6��5��3�5~�6�6�5~�4}�3|�4}�5~�2~�2~�2~�1}�0|�0|�3|�5~�6�5~�5~�4}�5~�4}�3|�2{�2~�2~�3�2~�1}�0|�0|�1}�0|�0|�0|�/{�0|�0|�2{�2{�1}�0|�/{�0|�0|�0|�/{�/{�/{�/{�/{�.z�-y�-y�.z�/{�/{�.z�-y�-y�.z�.z�.z�.z�.z�.z�.z�.z�/x�/x�.w�.w�/x�/x�/x�/x�/x�/x�-y�-y�-y�,x�,x�,x�,x�,x�,x�+w�*v�*v�*v�*v�*v�*v�)u�)u�*v�*v�)u�)u�)u�)u�(t�'s�'s�'s�'s�'s�&r�&r�&r�&r�&r�&r�'s�&r�&r�&r�(r�(r�>��>��?��>��=��=��=��>��=��=��>��?��>��=��=��>��?��=��=��>��>��=��=��>��>��?��?��>��>��?��=��<��<��<��<��<��<��=��<��<��<��<��<��<��=��=��<��<��=��=��=��=��>��?��>��>��?��>��>��>��<��<��=��?��>��=��=��<��<��=��=��=��<��<��=��=��=��=��=��=��>��=��<��=��=��<��<��=��<��>��>��=��=��=��>��=��=��=��=��=��=��<��<��;��>��>��=��=��=��<��<��<��<��<��<��<��<��<��;��;��=��<��:��:��=��=��<��;��;��;��<��<��;��;��:��:��=��=��=��=��=��=��<��;��<��;��;��<��<��<��;��:��;��=��@��?��>��>��>��=��<��:��;��:��:��:��;��>��C��H��Q��Vw�����Ĵ7.( -P;&�iQ�|]ᾢ7:ǚs鱀۔^�^�e�d�V�N�w?�h/�V �L�[/�jB�kH�W9�6p,c$\![!p5-�ZO�cUD2] H h' �`;�k>�g�[�X�[�eŀV�lF�Y1ב`�vJ纛sJ.�}_�tR�uR�tQ�ɬĺ�f��O��?��8��;��;��<��;��;��8��:��7��7��6��5��5��5��6��4��5��4��3�4��5��6��5��9��8��7��7��8��8��7��7��3�3�4��5��5��4��3�3�3�3�3�3�4��6��6��5��7��7��6�5~�5~�5~�5~�5~�2~�2~�2~�1}�1}�0|�0|�1}�4}�5~�5~�5~�5~�4}�3|�2{�0|�1}�2~�1}�1}�0|�1}�1}�1}�1}�0|�0|�0|�0|�1}�1}�1}�0|�0|�0|�0|�/{�/{�0|�1}�0|�/{�.z�.z�.z�.z�/{�/{�/{�.z�.z�.z�.z�/{�/{�1z�1z�0y�0y�/x�/x�/x�/x�.w�/x�0y�0y�/x�.w�-y�-y�,x�,x�,x�,x�,x�,x�,x�,x�-v�-v�-v�,u�-v�-v�-v�-v�-v�-v�,u�,u�,u�,u�+t�*s�(t�)u�)u�(t�'s�&r�&r�&r�*s�)r�)r�)r�)s�)s�)s�)s�>��?��?��>��=��<��=��>��>��>��?��@��>��=��=��>��?��=��=��>��?��>��>��>��=��?��?��>��>��?��>��=��=��=��<��<��=��>��=��=��;��;��;��<��=��>��=��=��>��=��=��=��>��?��>��=��>��>��?��?��>��=��>��?��=��=��=��=��<��<��=��>��<��=��>��>��=��=��=��=��=��<��=��=��=��<��=��?��<��>��>��=��=��=��=��=��=��=��>��>��>��>��=��=��=��=��>��>��>��=��=��=��;��<��=��<��;��;��;��<��=��<��;��;��<��<��<��<��<��=��>��=��<��<��=��>��>��=��;��;��<��=��=��=��=��<��<��<��<��<��;��:��<��=��>��=��=��>��>��>��<��;��<��<��;��:��<��=��@��E��X��l������Ĵ0'$D,�{^�wT⿟;8Řq�t؏X�_�b�[�Q�zA�i0�a(�U �b/�wL�_:�G'�U9�_G�hT�gW�aS|L@_0&I Y(�aO�T@U -Ky7�^7܊[�b�\��Q݋\�T�iB�`7�h�|O�âpD)�pP�W4�F�nJ�ˮ���h��L�A��;��<��;��<��9��8��8��7��7��8��7��5��4��4��4��7��6��4��3�4��6��6��4��8��7��7��7��7��7��7��6�2~�3�5��6��6��5��3�2~�2~�3�4��3�3�3�3�1}�6�5~�4}�4}�5~�5~�5~�5~�3�3�3�3�3�3�1}�0|�3|�3|�4}�5~�4}�3|�2{�2{�1}�2~�2~�3�3�2~�2~�2~�2~�1}�1}�1}�0|�0|�0|�1}�0|�0|�0|�0|�/{�.z�/{�0|�1}�0|�/{�/{�0|�0|�0|�0|�0|�0|�0|�/{�/{�/{�/{�/{�1z�0y�/x�/x�/x�/x�0y�0y�-v�/x�0y�0y�.w�.w�,x�-y�-y�-y�-y�-y�+w�+w�,x�.z�.w�-v�-v�,u�-v�-v�.w�/x�,u�,u�+t�+t�+t�+t�*s�)r�*v�*v�*v�)u�(t�&r�&r�&r�*s�)r�)r�(q�(r�(r�)s�)s�?��=��=��?��@��@��?��?��?��>��>��?��>��=��=��?��?��?��>��=��=��=��=��>��>��>��=��<��<��<��=��=��=��=��<��<��<��=��>��>��<��=��=��<��<��=��=��=��=��<��=��>��?��>��>��@��>��?��>��>��=��=��=��>��<��=��>��>��=��=��=��=��<��=��>��?��?��>��=��<��=��=��=��>��?��>��>��?��>��?��=��<��>��>��=��?��=��=��=��=��=��=��=��=��<��<��=��=��=��=��=��<��<��<��<��<��=��=��<��<��;��<��=��=��=��<��=��=��<��=��>��>��>��=��<��<��=��<��<��=��=��<��<��=��=��<��<��=��=��<��<��<��=��<��;��:��;��=��?��>��=��<��=��;��:��;��<��?��C��I��S��u�����ǻ�0') L2Ϯ���\ܸ�><Ók�v֋T�X�[�Y�J�m4�g.�\%�a-�{L�e;�iEŒsڮ��δ����������͹ί��jYS,M�UA�\GSR�O*�h:�a�W�SߌZ�~T�X5�^8�oʆYᮏ~O5Ȑo�f@�L%�wR�ϱ���j��P��B��<��<��<��;��8��7��7��8��7��6��5��5��5��6��6��7��7��7��6��5��5��4��4��7��7��7��7��6�6�7��7��5��5��5��5��5��4��4��3�2��2��3�3�2~�2~�3�4��5~�5~�5~�5~�5~�5~�6}�5~�5��5��5��4��3�3�2~�2~�5~�5~�5~�6�6�5~�5~�4}�2~�2~�1}�1}�1}�2~�2~�0|�1}�0|�/{�0|�1}�1}�0|�/{�1}�1}�0|�0|�0|�/{�.z�/{�0|�1}�1}�0|�/{�/{�0|�/{�1}�1}�0|�0|�1z�1z�1z�1z�0y�0y�0y�0y�0y�/x�/x�.w�0y�0y�/x�/x�/x�/x�-y�-y�.z�.z�.z�.z�-y�,x�*x�+w�-v�.w�.w�,u�,u�-v�,u�,u�,u�-v�-v�,u�*s�)r�*s�+t�)u�)u�)u�)u�(t�&r�%q�&r�*s�)r�)r�)r�*t�)s�)s�)s�?��>��=��>��?��?��?��?��?��>��>��?��>��=��>��?��@��?��?��>��>��>��>��?��@��@��=��<��<��=��>��?��=��=��<��<��=��=��=��=��<��<��=��<��<��=��>��=��>��>��>��?��@��?��?��A��@��@��>��>��=��=��>��>��=��=��>��>��=��=��=��=��=��>��?��?��?��>��>��=��?��>��>��?��?��>��>��>��>��?��>��=��>��>��>��?��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��=��<��<��<��<��<��<��<��<��<��=��=��=��=��=��=��>��>��?��?��?��>��=��<��<��>��=��=��=��=��<��<��=��=��<��<��=��=��<��;��;��=��=��;��;��;��=��?��>��<��;��=��<��;��=��>��@��B��I��R��r�����Ǻ�2&'T:ͯ���b۸�8:��jޢp؋U�X�U�S�u>�i3�b,�b-�|J�vJ�yQܬ��ڻ����������ڽ�ݿ���������Ǭ�U2F �]F�U��=��>��?��?��>��>��?��?��?��?��?��>��=��>��?��?��?��>��>��>��?��?��?��?��>��=��=��=��>��?��?��<��<��=��=��=��=��=��<��=��=��=��<��=��>��>��=��?��>��?��?��?��>��@��A��A��@��>��=��=��>��>��?��>��>��>��>��>��=��=��=��=��?��?��?��>��=��>��?��?��>��>��?��?��=��>��?��?��@��?��>��>��>��=��?��=��=��>��>��>��>��>��>��=��=��=��=��=��=��=��=��<��<��<��<��=��=��<��<��=��=��?��>��=��=��>��?��?��?��?��?��>��>��=��=��>��>��>��>��>��=��=��>��=��=��=��>��>��=��<��<��=��=��<��;��<��=��=��<��?��>��>��?��?��?��@��B��A��J��S��p�����̿�7+, T<"ȫ���gۺ�8:��iәiӇS�U�Q�O�l8�k7�c/�r@܅Xχ_����������ڻ�׶�ۻ�����������������Ҹ�`?,T*�r[b*S�[9�lB�[�T؆V�sI�C"�_<��g�|K񷑔`;孈�{S�`7�{U�̰���f�Q��C��<��>��<��<��9��7��6��7��7��6��7��7��8��7��6��8��8��7��6��6��7��8��8��8��8��8��8��7��7��5��5��4��6��7��7��5��4��4��5��3��3��4��5��6��6��4��3�8��7��6�5~�5~�6�8�8��6��4��3�3�3�3�3�3�3�3�2~�2~�3�3�2~�2~�4��4��5��3�2~�2~�2~�3�0|�1}�2~�2~�2~�1}�0|�0|�1}�0|�0|�0|�0|�/{�/{�/{�/{�1}�1}�0|�0|�1}�1}�1}�0|�/{�/{�0|�3|�3|�2{�1z�1z�1z�1z�1z�1z�1z�1z�0y�/{�/{�/{�.z�.z�-y�-y�-y�-y�-y�-y�-y�-y�-y�-y�.z�,x�,x�-y�,x�,x�,x�,x�+w�*v�*v�)u�*v�+w�+w�*v�(t�)u�)u�*v�*v�*v�)u�)u�*v�)u�'s�'s�(t�(t�'s�(r�)s�>��>��@��@��@��?��?��@��?��?��?��?��>��>��>��?��?��?��?��?��?��@��@��@��>��=��=��>��>��?��>��>��=��=��<��<��<��=��=��=��>��>��>��=��=��=��=��=��>��>��>��?��>��>��@��@��@��?��=��=��>��>��>��>��>��?��?��?��>��>��>��>��>��?��?��>��=��=��>��?��?��>��>��?��>��=��>��>��?��@��?��>��?��>��=��?��=��>��>��>��?��?��?��>��>��>��>��=��=��=��=��=��>��=��=��=��>��>��=��=��>��>��?��?��>��=��>��?��=��>��>��>��>��>��?��?��>��=��>��>��>��=��>��?��>��>��=��>��>��=��=��>��>��>��=��<��<��=��=��<��@��?��@��@��A��A��A��C��A��K��T��n��������;- /Q��>��<��8��6��4��6��6��6��7��9��9��8��7��8��7��7��6��7��7��8��8��8��9��9��9��8��8��5��5��5��5��6��6��6��5��5��5��4��4��5��6��6��5��4��3�7��6�5~�5~�5~�5~�7~�7��5�3�3�3�4��4��4��4��4��4��3�3�3�3�3�3�3��4��4��3�2~�3�3�3�1}�2~�2~�2~�2~�1}�1}�1}�3�1}�1}�1}�1}�0|�/{�/{�1}�2~�2~�1}�1}�1}�1}�1}�0|�/{�0|�0|�3|�4}�3|�3|�0y�0y�1z�2{�2{�1z�0y�/x�/{�/{�/{�/{�/{�/{�/{�/{�,x�-y�-y�-y�-y�-y�-y�.z�+w�,x�,x�,x�,x�,x�,x�+w�,x�+w�*v�+w�,x�+w�*v�)u�*v�*v�*v�*v�*v�(t�(t�)u�*v�)u�(t�)u�)u�(t�*t�*t�>��>��@��A��A��@��@��@��?��@��?��>��>��>��?��?��@��@��?��@��@��A��A��A��>��>��>��>��?��?��>��>��>��=��<��<��<��=��?��@��?��@��?��>��>��?��?��>��>��=��>��=��>��>��?��?��=��=��>��>��?��?��?��?��?��?��?��?��>��>��>��?��@��?��>��>��>��>��>��?��>��=��>��?��?��>��>��?��?��A��?��?��?��>��=��>��>��>��>��>��?��?��?��?��>��>��>��>��>��>��>��>��>��>��>��>��>��>��>��>��@��@��@��?��>��>��A��B��=��=��>��>��>��>��?��@��>��>��>��?��>��=��=��>��?��>��=��=��=��=��>��?��>��>��>��=��=��=��=��<��?��@��?��?��>��>��?��@��A��K��U��j�����ξ�6(, T?$δ��xTˬ�8 :��n֜l֊V�Y�\�P�i4�i5�j7܄TБf�ز�����������������������������������������րcQL"�tfa -�4�b?݉[��WڄS�pB�^<�[6�iЉU氁�\1ɏg�vM�{SËf�β���j��N��B��;��=��>��<��:��7��7��8��:��:��;��<��<��9��7��7��7��7��7��7��7��7��6��8��9��9��9��7��6��5��5��5��5��5��6��6��6��5��4��5��5��6��6��5��5��5��5��8��7��7��7��7��7��7��7��5�5�5�5�6�6�5��4��5��4��3�3�2��2��3��3��3��3��2��1�3�4��4��2~�2~�1}�1}�2~�3�3�4��4��1~�0}�1}�2~�3�2~�4}�4}�3|�4}�2~�1}�1}�1}�1�0~�.|�.|�1}�1}�1}�1}�3|�4}�2{�1z�1z�1z�/{�/{�/{�.z�/{�/{�/{�/{�/{�/{�/{�/{�-y�-y�.z�/{�.z�.z�-y�-y�,x�-y�-y�,x�,x�-y�,x�+w�-y�-y�,x�+w�+w�+w�,x�,x�*x�)w�*v�*v�*v�(t�(t�)u�+w�)u�)u�*v�*v�)u�(t�)u�>��=��?��A��A��@��@��@��@��A��@��?��?��?��@��?��@��?��?��?��@��A��A��@��?��?��?��>��>��>��?��@��>��>��=��<��=��>��@��@��>��?��?��?��?��@��A��@��?��>��?��>��?��?��@��@��=��>��@��@��@��@��@��@��?��?��?��?��?��?��?��@��A��@��?��?��?��?��?��?��>��=��?��@��@��?��@��@��?��A��@��?��?��?��=��?��>��>��>��>��>��?��?��?��>��>��>��>��>��>��?��?��>��>��>��>��>��>��>��>��@��@��@��@��>��>��A��A��?��?��?��?��>��>��>��?��@��?��?��?��>��=��=��>��>��=��=��=��=��=��>��@��>��>��>��=��=��>��>��=��@��?��?��=��<��<��=��>��A��H��U��h��������4&, V>$Ӷ��sP̭�< ;��k՛kޑ[�Z��_�K�f1�g2�p<چWୂ���������������������������������������������î�C�zov*u(�];مV�\�X�qB�lI�^:ߑcЈV赈�U+ȍc�yO�qH�yT�˭���f��R��@��;��=��>��?��<��9��8��9��;��<��<��<��;��7��6��7��7��7��7��8��7��6��5��7��8��9��9��6��6��5��5��6��5��5��6��7��7��6��5��4��5��6��6��5��5��6��7��8��8��9��9��9��8��8��7��7��7��6��7��8��8��6��5��5��4��3�3�2��3��3��3��3��3��2��2��3�4��4��2~�3�2~�2~�1}�2~�2~�2~�2~�2�0}�1}�2~�2~�2~�3|�3|�2{�3|�2~�1}�1}�2~�1�1�/}�0~�3�3�2~�2~�4}�6�5~�3|�1z�0y�/{�0|�1}�1}�0|�0|�0|�/{�/{�/{�.z�.z�.z�.z�/{�/{�/{�.z�.z�.z�.z�.z�.z�-y�,x�-y�-y�,x�-y�,x�,x�+w�+w�,x�-y�.z�*x�)w�+w�+w�+w�*v�*v�+w�*v�)u�)u�*v�*v�)u�)u�)u�@��>��>��?��A��A��@��@��@��A��A��@��@��@��@��?��@��?��?��?��@��A��>��>��?��@��@��@��>��>��@��A��?��>��>��>��>��>��?��@��?��@��@��?��A��B��C��@��?��?��?��>��?��@��@��@��?��@��A��A��@��@��@��A��@��@��A��@��@��A��A��B��B��B��B��B��A��@��@��?��?��>��?��@��@��?��@��A��@��A��@��@��@��?��>��?��@��@��?��>��>��?��@��@��>��>��>��?��?��?��?��?��?��?��>��?��?��?��?��?��@��@��C��B��A��@��@��A��@��@��@��@��?��>��>��>��?��?��@��@��?��>��>��?��>��>��>��>��>��>��>��@��=��>��>��>��>��>��>��=��A��A��@��>��=��=��=��>��A��G��T��f������Ȼ6(.V<#Զ��yTڹ�A! @��fՙgޏW�T�X�I�e.�j3�vB؆V�ǜ������������������������������������������������X8)�k\�;'v' �h@�Z�Z�\�xJ�_:�Y8�k�zQը�{Q+Ȋc�xO�qI�vO�ť���n��P��C��>��@��A��A��?��;��9��:��;��<��<��;��:��9��9��:��9��7��7��8��8��7��6��8��9��7��7��7��6��6��6��6��6��6��7��8��8��7��6��6��6��6��6��6��7��7��7��8��8��8��9��8��8��7��7��:��9��8��8��8��9��6��6��5��5��3��3��3��3��3��3��2��3��3��3��3��3��3�2~�3�3�3�3�2~�1}�0|�0|�3��1~�1}�1}�2~�1}�2{�2{�3|�4}�2~�2~�2~�3�2��2��1�2��3�3�2~�2~�5~�6�6�5~�3|�2{�0|�1}�1}�1}�0~�0~�/}�/}�/{�/{�/{�/{�/{�/{�/{�/{�.z�.z�1z�1z�/{�/{�.z�-y�,x�-y�-y�-y�,x�,x�,x�,x�+w�,x�-y�.z�+y�*x�*x�+y�*x�)w�)w�+y�+w�*v�)u�*v�+w�*v�*v�*v�B��@��>��?��A��A��A��A��@��B��B��A��A��A��@��?��B��A��A��A��B��C��@��?��=��?��A��A��@��?��?��A��>��?��?��?��?��?��?��>��A��A��A��@��?��@��B��?��?��?��?��>��?��@��@��@��?��A��B��A��?��>��@��B��@��@��@��@��@��A��B��C��A��B��C��B��A��@��@��?��@��>��?��@��@��?��@��@��A��B��A��@��A��@��>��?��A��@��?��?��?��?��@��A��=��>��>��?��@��@��?��?��@��?��?��?��@��@��@��@��@��@��C��B��A��@��@��?��@��@��A��@��?��>��>��>��>��>��?��@��@��?��@��B��?��?��@��@��@��?��?��@��=��>��>��>��>��>��?��>��B��A��>��>��=��>��>��?��C��F��S��g������ʽ4&- [A(Զ���[�àA" E# -��iܞmهO�O�R�H�f,�m4�xDρQ�Ԫ����߼���������������������������������ػ�׽���pQ?�hW�C.z+ �b:�]�\�S�zL�[8�_@ܐlă]���~V2ؚs�{Q�wO��_�Ʀ���h��R��F��?��A��A��A��@��=��<��9��;��<��<��;��;��;��;��;��:��7��8��8��9��9��8��9��9��8��8��8��7��8��8��6��7��8��8��8��8��8��8��8��7��7��7��8��7��6��5��8��8��8��8��8��8��8��7��9��8��6�6��7��7��5��4��6��5��4��4��4��4��4��4��3�4��6��4��3��2��3�2~�0|�2~�5��6��5��4��4��4��3��1~�1}�3�4��3�3�3�5~�4��4��3�3�3�2��2��1�1�1}�1}�1}�1}�3|�3|�5~�4}�4}�2~�2~�2~�0|�/{�0~�0~�/}�/}�0|�1}�1}�2~�0|�0|�/{�.z�.z�.z�0|�1}�/{�/{�.z�,x�,x�,x�-y�-y�,x�,x�,x�,x�,x�,x�,x�,x�-{�,z�+y�+y�*x�(v�(v�)w�+w�*v�*v�+w�,x�+w�-w�+w�A��A��B��A��@��@��A��B��A��A��@��@��?��?��@��@��@��>��=��?��@��@��@��@��?��?��?��@��@��>��>��?��>��>��?��?��?��?��?��@��A��@��@��?��?��?��A��@��?��>��>��>��?��@��@��@��@��@��A��A��B��B��B��A��A��@��@��@��@��@��@��@��@��A��A��A��@��?��?��>��@��@��@��@��?��?��@��@��A��A��@��>��=��>��?��?��?��?��@��@��@��@��@��A��@��@��?��?��A��A��A��@��A��B��B��A��?��?��?��@��B��A��@��@��?��?��?��?��@��A��A��?��=��>��>��<��=��=��>��>��>��>��=��=��?��@��@��@��@��@��A��A��?��?��=��=��=��>��>��>��?��?��?��?��?��?��@��@��>��L��S��c�����÷�9)0ZB&Ȯ���\�Ţ49��qۛo܅P�L��W�}C�e*�j2�s?ЂT�ͦ������ݵ����޶�ɢ�հ��������������������������͂^H�kT�C+y,�e?�S�V�Y�{L�_>�^B�cD�jE�Ţ�Y2Жp�zQ�yR�~Y�ɨ���i��Q��G��?��<��<��=��>��?��;��:��9��:��:��<��;��;��:��:��:��:��8��8��9��8��7��;��:��:��:��:��;��:��;��9��9��8��8��8��8��8��8��6��8��8��7��7��7��7��6��:��9��7��7��7��8��8��9��9��8��7��7��5��6��6��6��6��5��5��4��4��5��6��6��8��5��6�3�4��6��6��4��3�4��3��3��3��3��3��3��1~�2�3��3��2��1�1�1�2~�2��2��2��3��3��4��2~�4��1}�0|�0|�0|�/{�0|�2~�2~�1}�1}�0}�0}�0}�0}�/|�2~�1}�1}�0|�1}�1}�1}�2~�/{�/{�.z�.z�-{�.|�.|�0|�0|�0|�/{�.z�.z�-y�-y�-y�,x�-y�,x�*v�*v�+w�,x�,x�-y�-y�,x�+w�+w�,x�,x�-y�,u�.w�/x�-v�,u�,u�.u�.w�@��@��A��@��@��@��A��A��A��A��@��@��?��?��?��?��?��>��>��?��@��@��@��@��@��?��@��A��@��?��?��@��?��@��@��@��@��@��@��A��A��A��@��?��?��?��?��@��@��@��@��@��A��A��@��@��@��@��A��B��B��C��B��B��@��@��@��@��@��A��A��A��?��@��A��A��A��A��A��A��@��@��@��@��?��?��@��@��A��A��@��?��?��@��@��?��B��B��B��B��@��@��@��@��@��?��?��@��A��B��A��A��B��B��B��A��@��@��@��@��A��A��@��@��?��@��@��@��?��A��@��?��?��@��?��=��>��>��>��?��?��?��>��>��?��@��@��@��@��@��B��A��@��@��>��>��?��?��@��@��?��?��?��?��?��?��B��A��B��E��[��b����ʽ�6%4 ZE(ͳ��~Xܻ�1;��qݜr�V�U��W�~F�\!�i/�n<ӅW嶌������ԧƹ�µ��ǡ�����������������������������ȁW>�iP�G0w+�cC�V�S�U�|M�kM�iQ�T6�X7�š�`<届čf�tN�xU�׵���r��N��G��>��<��:��;��=��=��;��;��:��;��:��<��<��<��<��<��<��<��;��:��;��9��8��8��9��;��<��<��;��9��9��:��9��8��8��7��7��7��7��6��7��7��6��6��7��7��7��8��8��8��8��8��9��9��9��:��:��8��7��5��5��5��5��4��4��6��6��7��7��:��:��8��8��7��6�4��5��5��3�5��5��4��4��3��3��2��2��4��4��2�1~�0~�1�2��3��2��2��2��1�2��3��3�1}�3�2~�2~�2~�2~�1}�1}�2~�2~�1}�0}�0}�1~�1~�0}�0}�3�2~�1}�1}�1}�1}�1}�1}�0|�0|�0|�/{�.|�.|�/}�/}�.z�.z�.z�-y�-y�.z�/{�/{�.z�/{�/{�.z�-y�.z�.z�.z�.z�-y�-y�,x�,x�,x�-y�-y�,u�-v�-v�,u�-t�.u�/v�0w�>��?��?��?��?��@��A��B��A��@��@��@��?��?��?��?��@��>��>��>��@��@��@��@��?��@��@��A��A��@��?��@��?��?��?��?��?��?��@��A��A��A��@��@��?��?��@��@��A��A��A��B��B��B��A��A��A��@��B��B��C��C��C��B��?��@��A��A��A��A��A��B��?��@��@��A��A��A��B��C��A��A��A��@��@��@��@��A��@��@��@��@��A��B��A��?��B��B��B��A��?��?��?��?��?��@��@��@��A��B��B��B��B��B��A��A��A��A��A��@��A��@��@��@��@��@��A��A��?��@��?��>��?��A��@��>��>��>��>��>��>��>��>��>��>��?��@��@��@��@��@��@��?��?��?��?��@��@��?��?��?��?��?��?��?��?��C��B��C��G��W��Ro����ƶ�A/7! -bJ.é��d?Ӳ�69Õtזl�]��\��_��W�f-�k3�m9܊Zۥy���֧�ʚ�ש�޴�������������������������ں����Ӵ�Y<�fP�B/u(�aG�\�T�S�~N�_B�W@�`E~U7⾞�bA޲�Р|֥���^�Ȩ���`�Q��F��@��>��;��;��;��=��<��:��:��:��9��;��;��<��=��=��>��>��=��<��<��:��9��9��:��<��=��:��9��8��8��:��9��8��8��8��8��8��7��6��7��7��6��7��8��8��8��7��7��9��9��:��9��9��8��:��:��7��6��5��4��5��6��5��6��6��7��9��8��8��7��7��7��5��5��6��6��6��5��5��5��5��5��4��4��3��3��4��4��4��4��3��2��2��2��5��5��3�3�3�4��3�0|�3�3�3�4��4��2~�2~�2~�2~�2~�1�1�2��2��1�1�3�3�2~�2~�1}�1}�3|�3|�2~�2~�1}�1}�0|�0|�0~�0~�0|�/{�/{�.z�0y�0y�1z�1z�1z�2{�2{�1z�.z�.z�.z�-y�.z�.z�.z�-y�-y�-y�-y�-y�.w�.w�-v�,u�,u�.w�/x�/x�>��>��?��?��@��A��B��C��A��A��A��A��?��?��?��?��?��>��>��>��@��@��@��@��?��?��@��A��A��@��@��?��@��@��@��?��?��@��@��A��A��@��@��@��@��@��A��A��C��B��A��A��A��A��B��C��B��B��C��C��C��C��C��C��@��A��C��C��B��A��B��C��@��A��A��@��@��@��A��B��A��A��A��A��@��@��A��B��A��@��@��A��B��B��A��@��A��A��A��A��?��?��@��A��@��A��A��A��A��A��B��B��A��A��A��A��A��A��A��A��A��A��A��@��A��A��B��B��?��?��?��>��>��@��@��?��?��>��>��>��>��>��>��>��?��?��@��@��@��A��A��A��A��A��@��@��?��?��>��>��@��@��@��?��?��?��B��B��?��J��V��d~����Ƕ�S=(F.`F-��z�kGش�@":ĔpߟsߌX�R�Y�P�h/�h/�o:�^Ϗa�ʝ����������������������������������߾���഑�cB�hR�>-{)�`I�]�R��O�|K�Y;�U<�nT�dG�ǥ�rN䷖�|[�a@�hH�˭���o��U��G��A��?��<��<��;��<��>��;��:��:��9��<��=��=��=��=��=��=��=��<��=��:��9��<��<��;��<��:��:��:��:��9��9��8��8��9��:��:��:��8��8��8��7��7��8��9��9��9��8��:��:��:��9��8��8��9��9��8��7��5��5��6��8��6��7��7��7��9��8��6��6��6�7��5��6��7��8��7��6��4��4��5��5��4��5��5��5��3��4��5��5��5��3��2��2��6��6��5��4��4��4��4��2~�3�3�4��4��4��4��3�3�3�3�2��2��2��3��2��2��4��3�3�2~�2~�1}�3|�3|�2~�2~�2~�1}�1}�1}�0~�0~�2~�1}�1}�1}�2{�2{�2{�2{�1z�2{�2{�1z�.z�-y�-y�-y�.z�.z�/{�.z�-y�-y�-y�-y�1z�0y�/x�.w�.w�/x�.w�.w�=��=��=��=��@��A��B��B��B��B��?��?��?��?��>��>��?��>��=��>��?��?��@��A��@��@��A��A��A��A��A��@��B��A��A��A��A��A��A��B��@��@��@��A��A��A��B��B��B��B��A��@��@��A��B��C��C��C��B��B��C��C��C��C��A��B��C��C��B��A��B��B��B��B��B��A��A��A��A��B��B��B��B��A��A��A��B��B��B��A��A��A��A��A��A��A��B��B��B��B��A��A��B��B��B��B��C��B��B��A��A��B��@��A��A��A��@��@��A��B��A��A��@��@��@��@��A��A��?��@��A��?��>��>��?��?��@��@��@��@��?��?��@��@��?��?��?��?��A��A��A��A��A��A��@��@��>��>��>��>��A��A��A��@��?��?��A��B��?��G��U��_y�����®hO9rV@�eM�hM�sS�ȥZ8@��dۛm��Z�X�Y�M�i,�m1�r7�X�yKҜn�����������޷�������������ݾ����������Эʌg�X5�bG�<)&�ZA�^�O�T�vD�O.sI0�dEpO,Ğw��^��j�`?�iI�eDԳ����n��L�H��B��@��<��<��;��<��=��<��;��:��:��<��=��=��<��<��=��<��<��<��=��;��:��=��;��8��8��:��<��=��=��9��9��8��9��:��:��:��:��9��8��7��7��8��8��8��9��:��9��8��8��7��7��7��6��6��7��8��7��6��6��7��9��8��8��8��8��:��9��9��8��7��7��7��8��8��8��7��6��5��5��5��6��6��6��6��7��7��6��4��3�3�4��5��6��5��6��7��5��4��4��5��4��3�4��4��4��4��5��5��4��3�4��4��4��3��3��3��3��3�3�4��3�2~�2~�4}�5~�4}�4}�2~�1}�1}�1}�0|�0|�1}�1}�2~�3�5~�4}�4}�3|�3|�3|�2{�1z�.z�.z�.z�.z�.z�.z�/{�.z�-y�-y�,x�-y�1z�0y�/x�0y�0y�/x�.w�-v�?��?��>��>��@��@��@��@��B��B��@��@��@��@��?��?��?��>��>��?��?��?��A��B��A��A��A��A��B��B��B��A��B��A��A��A��B��B��A��A��A��A��A��B��B��B��C��C��A��A��A��A��A��A��B��B��C��C��C��B��C��B��C��C��B��B��C��C��B��B��B��B��B��B��B��B��B��B��C��C��C��C��B��A��A��A��B��C��C��B��B��A��A��@��A��B��B��C��C��C��A��A��A��A��C��C��C��B��B��B��B��B��B��C��C��C��A��A��B��C��B��B��A��A��@��@��A��A��@��A��C��B��@��?��@��@��@��@��@��@��@��@��@��@��?��@��@��@��A��A��A��A��@��@��@��@��?��?��?��?��A��A��A��A��@��?��A��B��?��G��\��[s����ư��gO�lR�lS�[>�gD�}X�^;\0 ϚpݝmՊS�\�[�N�g-�t:�q9�R�zK�{N渆���������������ܼ����߿�������ϮסՋd�S/�aF�C/}$�[@�f�VߍS�{J�cDd:"wU9];�|U��^��a�iE�`>�[<�|^Ķ�s��V��H��B��?��<��<��<��<��<��;��:��9��:��<��<��=��;��<��<��<��<��<��=��<��;��>��=��9��:��;��;��;��:��:��:��9��9��9��9��9��9��9��8��8��8��8��7��7��8��9��8��7��7��8��8��8��8��7��8��8��8��7��6��7��8��9��9��8��8��9��9��8��8��7��7��7��8��9��8��7��7��7��7��7��6��6��6��6��6��6��6��5��5��5��6��6��6��4��6��7��6��4��4��5��6��4��4��4��4��4��5��6��5��4��4��5��5��4��3��4��4��3�3�4��4��3�3�5~�6�4}�4}�2~�2~�2~�1}�1}�1}�1}�2~�2~�3�5~�4}�3|�2{�4}�3|�2{�2{�/{�.z�.z�/{�-y�.z�.z�.z�-y�,x�-y�-y�/x�.w�/x�0y�1z�0y�/x�.w�?��>��>��>��>��>��>��>��@��@��@��@��@��@��@��@��@��?��?��@��@��@��@��A��A��B��A��A��A��C��C��B��A��A��A��B��B��B��A��@��B��B��B��C��C��C��C��C��B��B��B��B��B��A��B��B��B��B��B��B��B��B��B��C��B��B��B��B��B��B��C��C��B��B��C��C��C��B��C��C��C��C��C��B��A��B��C��D��D��B��B��B��B��A��A��B��A��B��C��C��B��A��A��@��B��B��B��B��C��C��C��C��C��C��D��C��B��B��B��C��C��B��B��A��A��A��A��A��A��B��C��C��B��A��A��A��@��@��@��@��@��@��?��?��@��@��@��A��A��@��A��A��@��@��?��?��?��?��@��@��@��A��B��A��@��?��B��B��C��F��X��F]e]Z�yb�w\�rU�yY�uR�tKԔh��U�h9ˑ_ߢl͈O؏XێZׁN�f1�o;�p?�X�d�xG�q>Рo�ԥ������������������������ɢĈd�\�o�R0�bD�C)t(�cAߑ`ڏVؑ]�zQ�ZEF C U,Βpʅ^˂Yτ\�uN�xU�qR���u��V��I��B��?��<��<��>��>��=��;��9��:��;��;��;��<��<��<��=��=��=��;��<��<��;��<��<��<��;��;��:��:��:��;��:��9��9��9��:��9��9��:��9��8��9��8��7��6��7��8��8��8��8��8��8��8��7��7��7��7��7��7��7��7��7��9��9��:��:��9��8��7��7��6��6��7��8��9��8��8��8��8��8��7��7��6��6��6��6��5��6��7��8��8��7��6��4��4��6��9��8��7��8��8��8��4��5��5��5��5��6��6��5��5��5��5��5��5��4��5��5��2��3��5��4��3�3�5~�6�5~�5~�5~�5~�3�3�2~�2~�4}�4}�4}�4}�4}�3|�2{�2{�3|�2{�2{�3|�2{�0y�0y�1z�-y�.z�.z�.z�-y�-y�-y�.z�-y�,x�/x�0y�0y�/x�/x�0y�>��>��>��>��?��@��@��@��A��A��A��A��@��@��A��A��A��@��@��A��A��@��@��A��A��B��A��@��A��C��C��B��B��B��B��C��C��C��B��A��C��C��C��C��C��C��B��B��E��D��C��B��A��A��C��D��A��B��B��B��A��B��C��D��B��B��B��B��B��C��C��C��B��B��C��C��B��B��B��B��D��C��C��B��A��B��C��D��E��B��A��C��D��C��B��B��A��B��D��D��C��C��B��B��B��A��A��B��D��E��D��D��D��C��C��C��C��C��B��B��C��B��B��A��A��A��A��B��A��B��C��D��C��B��A��A��A��A��A��A��A��A��@��@��@��@��A��A��A��A��A��@��A��A��@��?��?��?��?��?��@��A��B��B��A��@��B��C��>��I��a��-Abqfb�~f��d��_�xR�mBӆX�iʆULjU�|H�n�m�p�{�o܄T�vF�vF�^�b�rA�}K�{J��\٪��Ϧ�޸�����޷�ÛΣy��]ݕo�d?�k�Q0�gG�J*�@#ƀ\�m�k�u�vTX$E>[-ϊk�xQփWۇYׂY�|X�{]�pe{��Y��K��A��?��=��?��?��?��=��<��;��=��=��<��<��>��?��;��=��>��>��<��<��;��:��:��;��<��<��;��;��=��>��;��:��:��:��:��;��;��;��:��9��9��:��9��7��7��8��8��8��8��9��9��8��7��6��7��7��6��7��8��8��8��8��7��8��:��;��;��;��:��9��8��7��7��8��8��6��6��7��8��8��7��7��7��7��7��7��9��8��6��6��6��7��7��7��4��6��9��9��9��9��9��8��5��6��7��6��6��6��5��4��5��5��6��6��5��4��4��5��2��3��5��5��4��3�5~�6�6�6�6�6�4��4��3�3�3|�3|�3|�3|�3|�4}�5~�5~�3|�3|�4}�5~�4}�2{�1z�1z�-y�.z�/{�.z�-y�-y�.z�.z�/{�.z�0y�0y�0y�/x�/x�0y�?��>��>��?��A��A��A��@��A��A��A��A��@��@��?��?��A��B��B��B��B��B��B��B��B��C��D��D��D��E��D��C��C��B��A��A��B��C��C��B��C��C��B��A��B��D��D��B��D��C��C��B��B��C��D��D��D��D��C��C��C��C��D��D��B��B��C��C��C��C��C��C��C��C��C��C��D��C��C��B��D��B��B��D��D��D��C��C��D��D��D��D��D��D��C��C��E��D��B��B��C��C��D��C��D��C��B��B��B��B��D��C��D��C��B��B��C��C��C��B��B��B��B��B��B��A��B��B��@��A��A��A��A��C��C��A��@��A��B��B��A��A��@��@��@��@��@��A��A��A��B��B��@��A��A��?��?��?��@��?��@��A��A��A��?��?��A��B��B��E��T��!4T|oi�pV��a�zV�e9�p>͆R�e֊XًZ�~M�wG؇XфXш_َfۍ_�f�e��t�f��_�l�mُbܕiߠt֛oӝoԞpӚmٞrלpݜr�wݍh�p�b@�iF�[7�S3�}Yԋ`̈́WƁZ�D)GM!F!]/ϊk�}XقUڂTۂX�zU�{]�qflx�^��K��A��?��?��@��@��@��>��=��<��<��<��<��<��>��>��@��?��?��>��<��<��<��<��:��;��<��<��;��;��;��;��;��9��9��:��;��:��:��;��:��:��;��:��:��9��9��:��8��8��8��7��7��6��6��7��9��8��8��8��:��:��9��9��<��:��9��:��;��;��;��;��9��9��9��8��6��6��7��8��7��8��8��8��8��8��8��9��6��8��:��9��7��6��7��8��7��9��;��:��9��:��:��9��7��6��7��7��5��3�3�5��7��7��7��7��6��6��6��6��4��4��5��5��5��4��6�6�4}�4}�5~�5~�5~�5~�3�3�6�5~�5~�4}�3|�3|�4~�4~�4~�5�5~�4}�3|�2{�2{�1z�0|�0|�/{�/{�/{�.z�.z�.z�.z�/{�0|�/{�-y�,x�,x�-y�?��?��?��?��A��A��A��@��@��A��A��B��A��@��@��?��A��A��B��B��B��A��B��B��B��C��D��D��D��E��E��D��B��B��B��B��C��C��C��C��C��C��B��A��B��D��D��B��D��D��D��D��D��D��D��D��D��D��C��C��C��D��D��D��D��D��E��E��E��E��E��D��D��D��D��D��E��E��D��D��E��C��C��C��D��D��D��E��D��D��D��D��D��D��C��C��E��D��C��C��C��D��D��D��C��C��B��B��B��B��C��C��E��E��D��D��D��D��D��C��C��C��C��C��C��B��C��C��B��B��B��A��B��C��D��C��A��A��A��A��A��A��A��A��@��A��A��A��A��A��B��B��?��A��A��@��?��@��A��A��A��A��B��B��A��A��D��B��A��L��S��!1R�tm�~d�vU�qJ�pD�m<�sB�Nސ`ׅUۇX݉[�}RԆ_ڐiȀX�tڐa؏bٌ^ߍ^��\�`�c�e�k�fՍ]ڔa׏]�f�iߕf�l�p�j��h́Z�C ~?�X7˂_�ẂY͂b�\BS LI%m?%ӎo݋f�a܄V�`چbҐp��vpz�[��K��C��A��@��@��?��?��=��<��<��=��<��;��;��>��>��?��?��?��>��<��<��<��<��<��<��=��<��;��;��;��;��;��:��9��:��;��;��;��<��:��:��:��:��:��:��;��;��9��9��8��8��9��9��9��8��9��9��8��8��:��:��:��9��<��:��:��:��;��:��:��;��9��8��8��7��7��7��7��7��8��8��9��9��8��8��8��9��8��9��9��8��7��7��6��7��8��:��:��9��8��8��8��7��6��6��6��7��6��5��5��7��7��7��7��7��6��6��6��6��4��4��5��5��5��4��6�6�7��7��7��7��6�6�5��5��5~�5~�4}�4}�4}�4}�4~�4~�3}�4~�4}�3|�2{�2{�2{�1z�0|�1}�1}�1}�0|�/{�.z�.z�.z�/{�/{�/{�-y�,x�,x�-y�@��?��?��?��@��@��@��@��?��@��A��B��B��B��A��@��A��A��B��B��B��A��B��B��A��B��C��C��D��E��D��D��B��B��C��C��C��C��C��D��C��C��B��B��C��D��D��B��D��E��E��F��E��E��E��D��D��D��D��C��D��D��D��D��E��E��E��E��E��D��D��D��D��D��D��E��E��E��E��E��F��D��C��C��D��D��E��F��E��D��D��D��D��C��C��C��E��D��C��C��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��C��C��C��D��D��D��D��C��C��C��D��D��C��B��A��B��C��D��D��B��B��B��A��A��A��A��B��B��B��B��B��C��C��C��C��B��D��D��B��@��@��A��A��@��A��C��C��C��C��C��D��B��E��c��?Nm�mf�iL�Q-�J%�N&�U,�_5�W-�uJ΁Sۍ_�g�mCΉ`ԏf�zP�m܎^�i�b�{O�}O�zM�vJ�~R؁T�OՉX،Z�xG�O�P�N܆WրQ�|O�}R�W�L&�K)�R3�kL�qL�_:�jI�_BZ! L -AW, �`=�]7�lA�h<�vP�yTŃc�~p���_��L��D��B��B��@��>��>��=��<��=��?��>��=��<��=��>��>��?��=��=��<��<��<��<��=��=��=��=��<��<��<��<��;��9��9��:��:��:��9��:��:��:��:��:��:��;��<��<��<��;��:��:��:��;��:��9��:��9��:��:��:��:��:��:��;��;��;��;��;��:��9��:��:��9��9��9��9��9��9��9��;��;��;��;��:��:��;��;��:��9��8��8��8��8��7��6��7��8��:��9��8��8��8��7��7��7��7��7��6��6��7��8��8��8��8��7��8��8��8��6��4��4��6��6��6��5��7��6�8��8��7��7��6�6�7��7��3�3�2~�2~�5�5�5�4~�3}�4~�4}�3|�0|�0|�0|�/{�0|�0|�1}�2~�1}�0|�.z�-y�.z�/{�/{�.z�-y�-y�-y�-y�?��?��?��?��?��?��@��@��?��@��A��B��C��C��B��A��A��A��B��B��B��B��B��C��A��A��C��C��C��D��D��D��A��B��C��D��C��C��D��E��C��C��C��C��D��E��D��C��D��E��E��F��E��D��D��D��D��D��D��D��D��D��D��E��E��E��D��D��D��D��C��C��D��D��D��D��E��E��D��D��E��D��D��D��D��D��E��F��E��E��D��D��D��C��C��C��D��E��D��D��D��D��D��C��D��D��E��E��E��D��E��D��B��C��D��D��D��C��C��D��C��D��D��D��C��C��C��D��D��C��B��B��B��C��C��C��B��B��B��B��B��A��B��B��C��C��B��B��C��C��D��D��E��E��D��C��B��B��B��A��A��A��C��C��C��C��D��D��F��G��c��3A^_H@�^@�fB�c;�jA�k@�mE�zP�j?�\-�vHԋ^�|R̋aԑg�~R�k��`��x�a�{O�yL�sG�oB�sH�pD�wG��aގ[�q>�sC�uE�uD�|M�uF�tF�zM�yO�N+�D$�S6�vX�yV�qL�]�\?QDAY+ -�gD�b;�c8�c8�iC�nI�hG�_O���X��M��E��E��C��A��?��>��=��<��=��?��>��=��=��=��>��>��>��=��=��=��<��<��<��<��<��<��;��;��;��<��<��;��:��:��:��:��:��:��:��:��:��:��:��:��;��<��<��<��;��;��;��:��:��9��8��:��9��:��9��:��:��:��;��;��;��<��<��;��:��9��:��:��:��:��:��:��:��:��:��<��<��;��;��:��:��;��;��:��9��8��7��8��8��8��7��7��7��9��9��9��9��:��:��8��8��8��7��7��6��7��8��9��9��9��8��9��8��8��7��5��5��6��7��7��7��8��8��7��7��7��7��6�6�6��6��4��3�3�3�7��7��6��5�4~�5�5~�4}�1}�2~�1}�0|�0|�1}�1}�2~�1}�0|�/{�.z�.z�/{�/{�.z�.z�-y�-y�.z�?��?��@��@��?��?��@��@��?��@��A��B��C��C��C��C��A��B��B��B��B��B��C��C��A��A��B��B��D��D��D��D��B��C��D��D��D��D��D��E��D��C��C��D��E��E��D��D��F��F��E��E��E��E��D��D��E��E��E��E��E��E��E��E��F��F��F��E��E��E��D��D��D��D��D��D��E��E��D��C��D��D��D��E��E��D��D��E��E��E��E��D��D��D��D��D��C��D��D��D��D��D��C��B��B��C��D��D��D��D��C��C��B��D��E��E��E��E��E��F��C��D��E��D��C��C��C��D��D��C��C��C��C��C��C��B��B��C��C��C��C��B��B��B��C��C��D��D��D��D��D��D��D��C��B��B��D��F��D��B��B��B��C��C��C��C��C��D��>��J��U��$/MkSI�sT�}W�{Q̅WՏ^͆X˂UρQ�N�f5�sBߛn�vܗm�w��t�u�x�b�wL�sG�qE�pD�sF�oA�sAوSߌV�u@�s@�uE�rC�tE�rE�rF�xL�{T�O/�P6�iNݘyΈdЋdǃ`�G*EBHm5�v�fދ_ׅV�zPՀ[�|Z�_P���b��N��E��D��B��B��@��>��<��<��<��<��<��=��=��<��<��>��?��=��>��=��=��=��=��;��;��:��:��:��;��;��;��<��<��<��;��:��;��;��;��;��=��=��=��=��=��;��;��;��<��<��;��;��:��:��:��;��:��:��:��:��:��=��=��<��<��=��=��:��9��:��;��:��;��;��;��:��9��:��:��=��<��;��;��;��;��;��;��:��9��9��8��8��8��8��9��7��7��7��7��8��8��8��9��8��8��8��8��7��7��8��8��9��9��;��:��9��8��8��6��6��5��7��7��7��6��8��8��7��8��9��9��8��8��7��7��5��4��4��4��8��8��7��6��5�5�5~�4}�2~�2~�2~�1}�1}�1}�2~�2~�2~�1}�1}�0|�/{�/{�/{�.z�.z�.z�.z�.z�@��@��A��A��@��@��A��A��@��A��B��B��C��C��C��C��B��B��C��C��C��C��C��D��C��C��C��D��E��D��E��E��C��C��D��D��D��D��E��E��E��D��C��D��E��E��E��E��G��F��F��F��F��F��E��E��E��E��E��E��E��E��E��E��F��F��F��F��E��E��E��E��E��E��E��E��E��E��D��D��D��D��D��E��E��D��D��E��E��E��E��E��E��E��E��E��D��D��D��D��D��D��C��C��C��D��E��E��E��D��D��D��D��D��E��E��F��F��F��F��D��E��F��E��D��C��D��E��E��D��D��E��E��D��C��C��B��C��D��D��D��C��B��B��C��C��D��E��E��E��E��E��D��C��B��B��D��E��C��B��C��C��D��D��D��D��D��D��D��L��Hq�$Bw\S�~^�}U�wJ�j6�r<҉V�dۉWׄPԃN�q>�uE�zL�yH�rC�tD�rC�e��|��p��n�q�p��p��n�n��r��r�e�b��l�o�o��u�u�w�q�U7�?$�="�^=�d;�f<�\:l,GI Lq3����d�]�_�U݁Zٍk�l\uz�b��M��D��A��A��A��B��>��<��=��=��<��<��=��=��=��<��?��@��>��>��=��=��=��=��>��=��=��<��<��<��;��;��<��<��<��;��:��;��;��;��>��>��>��>��>��>��;��;��:��;��<��<��;��;��;��;��;��;��;��:��:��:��=��>��=��=��=��>��<��;��:��;��;��<��=��<��:��:��;��<��=��<��<��<��<��<��<��<��;��;��;��:��8��8��8��9��9��8��8��8��8��8��7��7��7��8��8��8��8��9��9��9��8��9��;��:��9��8��8��6��8��7��7��6��6��5��7��7��7��8��:��:��9��8��8��7��5��5��5��5��8��8��7��6��6��6��5~�4}�2~�2~�2~�1}�1}�1}�1}�0|�0|�1}�1}�1}�0|�0|�0|�/{�.z�.z�.z�.z�@��@��A��A��B��B��B��B��B��B��B��B��C��C��C��D��B��C��C��C��C��C��D��D��E��D��D��E��D��D��E��F��D��D��D��D��E��E��E��E��F��D��C��E��F��E��E��E��F��F��G��H��H��H��G��F��E��E��F��F��F��E��E��E��F��F��F��F��F��E��E��E��F��E��E��F��F��F��E��D��E��E��E��E��E��E��E��F��E��E��E��F��F��F��F��F��E��E��E��E��D��D��D��D��D��E��G��F��F��E��E��E��E��D��D��E��E��E��E��E��E��F��F��F��D��D��D��F��G��E��E��E��E��D��C��D��C��D��D��D��C��C��C��C��C��D��E��F��F��F��G��G��G��G��D��C��C��C��C��B��C��C��D��D��D��D��D��D��A��K��Py�$CoSH��fˆ]�sB�l5�`(܏Y�_܇PۅL߉P�|FЃO΂P�~JׇRփM�u?�_.�e3�f1�h5�j9�f7�c8�d:�c9�h;�pB�h8�c3�e4�e4�c2�`2�^3�m>�vJs, p) �B"�hD�zM�{O�qL�G-VSQy< ���c�O��[�~N�V�q�tfrw�[��L��B��A��A��B��A��A��>��>��>��>��=��>��>��>��>��>��?��?��>��=��=��=��>��?��?��>��>��>��=��=��<��<��=��<��:��:��;��;��;��?��?��?��?��?��?��>��=��;��;��;��<��<��<��;��;��;��;��<��<��=��=��>��>��?��>��<��=��=��<��:��;��<��<��<��<��<��<��=��=��=��=��=��=��=��=��=��<��;��;��<��;��9��8��8��9��:��9��9��:��:��8��7��7��7��9��9��9��9��:��:��8��8��9��;��;��:��9��9��6��9��7��6��6��6��6��8��8��9��9��:��:��9��8��7��7��5��5��5��5��5��5��5��5��5��5��4��2~�2~�3�2}�1}�1}�1}�1}�1}�0|�1}�1}�1}�2~�1}�0|�/{�/{�.z�.z�.z�?��@��A��A��B��A��B��B��C��C��B��A��B��B��C��C��B��C��C��C��C��D��D��E��F��D��D��E��D��C��D��E��E��E��D��D��E��E��E��E��F��D��C��E��F��E��E��F��E��F��G��I��I��I��G��G��F��F��F��F��F��F��E��E��F��F��F��G��F��F��F��F��E��E��E��F��F��F��E��E��F��E��E��E��E��E��F��H��D��E��F��F��G��F��F��E��F��F��F��E��E��E��E��E��D��E��F��F��E��E��E��E��F��E��E��E��E��F��E��E��E��F��G��F��D��D��E��F��H��F��D��D��D��C��C��D��D��D��D��D��C��C��C��D��B��C��E��F��F��F��H��G��E��G��E��D��C��D��D��E��D��D��D��D��D��D��D��C��G��K��\��*7WuXP��e�zQ�l<�v?�`(؉QوQ�~E�~D�_�_�d�b�f��g�W�M�xC݆PߍS݌TٌVڊY��`�b��_�_�\�Yߏ\،ZҌYӍ\ٌ`�f�e�j�;�D$�R/��f��q�m�r�wYm*\Ou6��r��c�D�H�i7�W�u�xo���^��J��B��B��B��B��A��B��B��?��>��?��>��=��<��>��?��?��?��?��>��=��=��=��>��=��<��<��=��=��=��<��;��=��?��=��<��;��<��=��=��=��=��?��@��@��@��?��=��<��;��;��;��<��<��:��9��;��<��=��=��>��>��?��?��@��>��>��=��@��=��<��<��<��;��;��;��;��<��=��=��>��=��=��>��>��>��>��;��:��:��<��;��:��:��:��:��;��:��:��;��;��:��8��8��9��:��;��:��:��:��9��7��9��:��<��=��<��;��:��7��8��7��6��6��7��8��:��;��;��;��;��:��9��8��8��8��5��5��5��5��4��4��4��5��6��6��5��3�3�4��3~�2~�3�3�3�3�3�2~�2~�2~�3�2~�1}�0|�/{�/{�/{�.z�E��C��@��@��A��B��B��A��B��B��C��C��D��C��B��A��D��D��D��C��D��E��E��E��F��F��E��E��E��E��E��D��C��D��E��E��E��F��G��H��G��G��G��H��F��D��E��G��F��G��G��G��G��G��G��G��H��H��G��G��G��F��F��G��F��F��F��F��G��F��F��E��G��F��F��G��G��G��F��E��D��D��E��F��F��F��F��F��E��G��G��F��D��B��D��B��F��E��D��D��E��E��E��D��F��F��F��F��E��D��F��F��F��F��F��E��E��F��E��D��F��F��F��D��D��E��E��D��D��D��F��G��D��B��D��E��D��C��C��C��C��C��C��C��D��E��F��F��E��E��D��E��E��E��D��E��E��E��D��C��F��G��F��F��D��D��D��E��F��L��`��(;\tYR��f�{U�j<�uD�xBލV�\܂MځI�Y��a�^�]��g��c�V�N�U��b��]�\ׂK�yJ�mA�vM�c�f��_��^�bۋV�tB�o@�|Q�h�k��q�I$�F"�J#�h��p��s�wΉby9YTu5�w�Z�T�G�yF�a�|������^��H��@��B��B��A��A��C��D��C��@��A��>��>��>��>��?��?��@��@��@��?��>��>��?��?��?��=��<��;��;��<��=��;��=��>��>��=��=��>��?��<��<��=��>��>��>��<��;��=��=��=��<��;��:��:��:��;��;��<��=��@��@��@��?��B��A��@��?��?��?��?��@��=��<��;��;��;��<��=��>��<��<��<��<��<��;��;��;��:��<��:��9��;��<��;��;��9��:��=��<��;��:��<��=��:��;��;��<��;��;��:��9��9��9��9��9��8��8��7��7��7��7��9��9��9��9��;��;��;��:��:��;��:��:��8��5��5��6��7��7��6��4��4��5��4��4��3�4��4��4��5~�3�5��2��1}�2~�3�3�4}�2{�3|�4}�4}�4}�4}�3|�1z�0y�C��C��A��A��A��A��B��B��B��B��B��C��C��C��B��A��C��D��D��C��D��E��F��E��F��F��E��F��F��F��E��E��D��D��D��D��F��F��H��H��H��G��G��H��G��F��G��H��I��I��H��H��H��H��G��G��G��F��E��E��E��E��E��E��G��G��F��G��G��G��G��F��F��F��F��F��F��F��F��E��E��E��E��E��F��F��G��G��F��G��F��E��C��D��C��B��D��C��E��E��F��F��F��E��F��G��G��F��F��E��G��G��F��F��F��E��E��F��F��D��F��F��F��E��E��F��F��E��F��E��G��H��E��D��F��F��D��D��D��D��D��D��D��D��E��E��E��E��E��D��E��E��G��F��E��E��E��E��E��D��F��H��F��E��C��D��E��E��K��K��V��(<_~e`��j�{U�nB�xIʁL��X�[�X߆N�O�\�\�X��[��[��Y��^��]�Y�RۂF�c.�O$�D�<�O(ҀP��[��\ڈN�h4�V)�N%7�S,�c��s�^5�^7�E�j��p�l�mʇ\�@ ]R;�r�`��X��Y�X�c휁Ɠ����\��H��@��B��B��@��@��D��E��C��A��A��A��?��?��@��@��?��@��@��@��?��>��>��?��>��>��>��=��<��<��=��=��>��>��>��<��<��<��=��=��<��<��<��<��=��=��=��<��>��>��>��>��=��<��<��<��<��<��=��=��?��?��@��@��B��A��A��A��A��@��@��?��=��=��<��;��;��<��<��=��<��<��<��<��<��<��;��;��<��>��<��:��;��;��:��:��<��<��=��=��<��<��=��=��<��<��<��<��<��;��;��:��9��9��9��9��9��8��8��8��9��8��:��:��:��;��=��=��<��;��;��:��8��8��8��8��7��6��6��6��6��5��5��6��6��5��5��5��6��5��7��6�5��3��2~�2~�3�3�4}�3|�3|�3|�3|�3|�3|�2{�1z�1z�B��C��C��C��A��A��B��C��B��C��C��C��D��D��C��B��C��D��D��D��D��E��F��E��G��G��F��F��F��F��E��F��F��E��E��F��G��G��H��H��H��G��F��F��G��G��H��I��G��G��F��G��H��H��H��G��G��G��E��F��F��G��F��F��G��G��G��G��H��H��H��G��G��F��F��F��G��G��F��F��F��E��F��F��F��G��H��I��H��G��E��E��G��H��D��B��E��E��F��F��F��F��F��E��G��G��G��G��F��F��G��G��F��G��F��F��F��G��G��F��F��G��G��F��F��G��G��F��G��E��F��H��F��E��F��E��E��E��E��E��E��E��E��E��E��F��F��E��E��E��E��F��H��G��E��E��F��F��F��F��E��F��F��D��D��E��E��E��C��M��^��+>_sXQ�sU�yR�yO�vHҌYݐ\ډR�[�V�a�Q�Y�Y��\��W��U��W��[��a�RЁI�{N�|Y�pR�gJp3�Q*�_�S�~J€P�yT�qO�eJj-�`6�o�lA�k@�C�j�h��m�kɂXt2b b{2�}M܁J�~C�R�\ކX܉i������a��K��C��C��B��?��?��B��C��A��A��A��A��?��@��@��@��@��@��@��@��?��>��?��?��>��>��>��>��=��=��=��=��@��?��=��;��;��<��=��<��=��=��=��<��=��=��=��>��>��>��>��=��=��<��<��=��>��>��>��>��?��?��@��A��B��B��B��B��A��@��?��?��>��>��=��=��=��<��=��=��=��=��<��<��<��<��<��<��;��=��;��:��;��<��<��<��>��>��=��<��<��=��=��<��=��=��=��=��=��<��<��;��<��<��<��<��<��<��<��:��:��:��:��;��>��>��>��=��<��=��<��;��7��7��8��9��8��7��6��6��6��6��6��7��5��5��5��5��7��7��7��7��6��5��5��4��4��4��3�2~�4}�4}�4}�3|�2{�2{�2{�3|�C��C��C��D��C��C��C��C��C��C��C��D��D��D��C��C��C��D��D��D��E��F��F��F��F��F��E��F��F��F��E��E��F��F��G��G��G��H��I��H��H��G��E��E��G��H��H��H��G��F��F��G��H��I��H��G��I��H��F��G��H��I��H��G��H��G��G��G��H��H��H��H��H��G��G��G��H��H��H��G��F��F��G��G��G��H��I��I��H��G��E��E��G��H��E��C��E��F��F��F��F��F��E��E��G��G��G��G��G��G��G��G��G��H��H��G��G��H��H��G��F��G��G��G��G��G��G��F��G��E��F��G��F��E��F��E��F��F��F��F��E��E��F��F��F��F��F��F��F��F��F��G��H��G��G��F��G��G��G��G��E��D��D��D��D��F��F��G��I��M��d��':ZiNG�rS�|W�yO�SёcщWЄRގ[ދW�d�X��^��a��b��Z��U��Z��[��a��RшUϔl��nqE,�mT�X=v:ޒa܏Y͉Z͒j�^j>#�qY�T9�C�q�kA�g;�K�l��k��p�q΃[q.e# `y0�c�a�^�T��QԀQЀ_‹����a��N��D��E��C��>��=��A��B��B��B��B��B��@��?��?��?��@��@��@��@��?��?��?��@��=��=��=��=��=��=��=��=��?��?��=��<��<��=��>��>��=��=��>��=��>��>��>��>��=��=��=��=��<��=��=��=��>��?��@��?��@��@��A��B��B��B��B��B��@��@��@��@��=��=��=��=��=��=��<��<��=��=��=��=��=��<��<��<��<��>��<��;��=��=��>��>��?��>��=��<��<��<��<��<��=��<��<��<��<��;��;��;��<��<��=��=��>��>��>��>��;��:��:��;��>��?��>��=��<��=��=��=��9��7��7��8��7��7��7��6��6��6��7��7��4��4��4��5��7��7��7��7��7��7��7��6��5��4��4��4��4}�5~�5~�5~�3|�3|�4}�5~�D��C��C��D��E��F��E��D��D��D��D��D��D��D��D��D��C��D��E��E��E��F��F��E��E��E��E��F��E��E��E��E��G��G��H��G��G��G��G��H��G��G��F��E��F��G��G��F��I��I��I��I��J��I��H��G��H��G��F��F��H��I��H��G��H��H��G��G��H��H��H��H��H��H��G��H��H��H��H��H��F��F��G��G��H��H��H��I��H��H��F��F��G��H��E��D��F��G��G��G��G��F��E��E��H��H��G��G��G��G��F��F��G��H��G��F��G��H��H��G��G��H��H��G��H��H��H��F��H��F��F��H��F��F��G��F��F��F��F��F��F��F��F��F��F��E��E��E��E��E��F��F��G��G��G��G��G��G��G��F��E��D��C��C��E��F��G��H��L��M��d��-=^�ib͘yϏk�|T�Zɏg͍a͉Z�m�j�`�Z�J�T��Y��V��V��`��]��b��Wړe�uN�~]�lP��v�Y=�J&ݔg׍\Ֆk�_:�z\xT:�~h�hOG$�w�mC�i<�T$ތZ�d�b�a�rK_Xm/�>!�t��r�lۉZ�c��t،l��{���c��O��E��E��B��>��=��A��C��C��C��A��A��@��@��?��?��@��@��@��@��?��?��?��@��>��>��=��=��=��=��>��>��=��>��?��>��=��>��?��?��=��>��?��?��@��?��?��>��?��?��>��>��>��>��?��@��>��?��B��B��B��B��B��B��B��A��A��@��@��@��A��A��<��<��=��=��=��=��<��<��>��>��=��=��=��=��=��=��A��C��A��?��@��@��?��?��?��?��?��>��=��=��=��>��>��>��>��=��=��=��=��=��=��=��=��>��?��?��?��>��>��=��<��=��>��?��>��=��=��=��;��:��9��8��8��8��6��7��8��8��7��6��7��7��5��5��8��8��9��9��9��9��7��7��7��6��5��5��5��5��2~�3�4��4��3�2~�2~�3�E��D��D��E��F��G��F��E��E��E��E��E��D��D��D��E��D��E��F��E��F��G��G��F��F��F��F��F��E��F��F��F��G��G��H��G��F��F��G��H��H��H��H��G��G��H��G��G��H��I��I��I��I��I��H��H��I��H��G��G��H��H��H��H��I��H��H��H��H��H��H��H��H��H��G��G��H��H��I��I��E��F��G��G��H��G��G��H��G��H��G��F��F��G��F��E��H��H��H��H��G��F��F��F��I��H��H��G��G��G��G��F��G��G��G��F��F��G��G��G��G��H��H��G��H��H��H��G��H��F��F��G��F��F��G��F��G��G��F��F��F��F��F��F��F��E��E��E��E��F��F��E��F��G��G��G��H��G��G��F��E��F��E��D��F��G��J��J��N��S��`��&6W�niu�kJ}B W%vD!�}VɋbܙoʁT�kގS�q6�v;�|B�K�K��P��R��k�_�t�yS��i��x����z]�U3��m��jԙq�sQ��j�����{��p�P1�}�Z0�S'�P!�tB�|G�|J�vG�P*]Y"_(r6�vَd�L(};�Q*ƅ_Ւu��~���^��L��B��C��B��?��@��D��E��C��C��A��A��B��B��A��A��@��@��A��@��@��@��@��@��@��?��>��>��>��?��?��?��<��>��?��?��=��=��>��>��>��>��?��?��A��@��?��>��@��@��>��>��>��?��@��A��>��?��B��B��C��B��B��A��B��B��A��@��@��A��B��B��>��>��?��?��?��?��>��>��>��>��>��>��>��>��>��>��@��B��@��?��@��A��?��@��?��?��?��>��=��=��>��>��>��>��?��?��?��?��?��>��=��=��=��>��?��?��>��>��?��>��>��>��?��?��>��=��>��=��9��8��8��9��:��:��7��9��:��9��8��7��7��7��6��6��9��9��9��9��:��:��6��6��6��6��5��5��5��5��2~�3�4��4��3�2~�2~�2~�F��E��E��E��F��F��F��E��D��E��E��E��E��E��E��E��F��F��F��F��F��G��G��G��G��G��G��G��F��F��F��F��H��H��H��H��G��G��G��H��H��I��H��G��G��H��H��G��G��H��H��H��H��H��I��J��I��I��H��H��H��H��H��H��J��I��H��H��H��I��I��I��I��H��H��H��H��I��I��I��F��G��H��G��G��G��G��H��H��H��G��G��G��H��I��H��I��I��J��I��H��H��H��H��H��G��G��G��G��G��G��F��G��H��G��F��E��F��H��H��G��H��H��G��H��J��J��I��H��F��F��G��F��F��G��G��G��G��G��G��F��F��F��F��F��F��F��F��G��G��G��F��G��G��G��G��G��G��G��G��F��G��F��F��F��F��J��J��O��U��Z�� 3Sjg��t�gLP4 -=�rQ��f�V1~=Ӌ[�l��j��_�W��Z��O�G�D��`�^�p�XnP,ĭ�pU7�z[�W3��j�mњs�xVmN2���eI1��m�U7�}�D�?�X)�`��h��l�k�vQd,A@e5Ҙs�\8PAN�S6Əz��~���^��I��A��A��A��A��C��F��H��D��B��A��A��A��B��A��A��@��@��@��@��@��@��@��?��@��@��?��?��?��?��?��?��=��?��?��?��>��?��?��>��?��>��=��>��@��@��?��>��A��@��>��>��>��?��@��A��C��B��B��B��C��C��C��B��B��B��B��B��@��A��A��A��@��A��A��A��A��@��@��?��?��?��?��?��?��?��?��?��>��@��?��>��@��A��@��A��@��@��?��>��>��>��>��>��>��>��?��@��@��@��@��?��?��>��>��>��?��?��?��>��A��@��@��@��?��>��>��>��=��<��8��7��8��9��:��;��9��:��;��9��8��8��8��8��9��9��:��9��9��8��8��9��8��8��8��8��6��6��5��5��4��4��4��4��3�3�3�3�E��E��F��E��E��E��F��F��D��E��E��F��E��E��E��F��F��G��G��F��F��G��H��G��G��G��G��G��F��F��E��E��J��I��H��H��I��I��H��H��H��I��I��H��G��H��H��H��J��K��J��I��G��G��I��K��H��I��H��H��G��G��H��H��K��J��I��I��I��I��I��I��I��I��H��H��I��J��J��J��H��I��I��H��G��G��H��J��I��I��H��G��H��I��J��I��I��I��I��H��H��G��H��H��H��H��G��G��H��H��H��G��G��H��H��G��F��G��J��J��G��H��H��G��I��K��K��K��I��G��H��I��G��G��H��I��H��H��G��G��G��G��G��G��G��G��G��H��H��H��H��G��G��G��F��F��F��F��G��H��F��G��H��F��E��E��G��J��K��U��b��%<\wec�����qU,2(�qW��qY& x=�b6�f�c��d��^�X�M�Q�R��i�aЎ^�}UjP/��p�hL�hK�^:�m�kΙq�sOrW:��jnT=�t\�P6䢀�R+�H�I�`��m��m�o�xVV&9. U1̞}oB#/ -18e<&��~�zz|��X��I��A��B��B��B��E��H��H��E��B��A��A��@��@��?��@��@��@��@��@��A��@��@��?��@��@��@��@��@��@��>��=��>��?��?��>��?��@��A��@��?��>��<��=��?��@��?��>��B��@��?��>��?��@��A��A��E��D��C��C��D��D��D��C��B��B��C��C��B��B��B��B��A��A��A��A��A��@��?��?��?��?��?��?��?��?��?��?��@��B��@��?��A��A��@��A��B��A��?��?��@��A��@��@��>��?��@��A��A��A��A��A��@��@��?��?��@��@��?��>��@��A��A��@��>��>��=��>��;��;��8��8��9��:��:��;��;��<��;��9��9��:��9��8��:��;��;��:��9��8��8��8��9��9��8��8��7��7��7��6��6��5��4��3�3�4��4��4��E��D��E��F��F��F��F��G��C��F��F��D��C��E��F��F��G��G��G��H��G��G��G��G��G��G��G��G��G��G��G��G��G��G��H��I��I��J��I��I��G��G��H��I��I��G��H��I��G��G��H��H��H��H��H��I��J��I��I��H��I��I��I��H��J��I��H��H��I��I��I��I��H��I��I��I��I��H��H��G��H��H��H��I��I��G��H��I��J��I��I��J��I��H��G��G��J��I��I��I��J��J��I��I��G��H��I��I��H��H��H��H��H��G��H��I��H��G��H��J��H��I��I��I��H��H��G��H��G��H��H��I��I��H��G��F��F��G��G��H��G��G��G��G��F��H��H��H��G��H��G��F��F��F��G��H��H��G��G��F��H��H��H��G��F��E��F��H��L��N��^��$<`occ��{�eS>,-oR@�gP�YAuD&�yTٕf�b�\�Z�Y�S��[��_��e�]ؘh��]eP3���xcN�eM�Z:�p�jբw�}Xw_C��thSB�vc�P8䢂�hA�e8�G�`�f�j�jŃaQ$1.M3��ssQ6,. 3V5"˦��uu~��T��G��?��B��B��C��F��H��E��D��A��A��B��A��@��@��B��?��@��@��A��@��@��@��@��@��@��@��@��A��@��@��?��>��?��@��@��?��?��>��?��=��=��=��>��@��@��@��?��>��?��?��@��@��A��@��@��C��C��B��B��C��D��D��D��E��C��B��C��B��A��B��C��C��A��@��A��B��B��A��A��A��A��A��A��A��@��?��>��@��A��B��@��@��@��@��?��?��?��@��@��A��A��A��@��@��A��A��@��?��@��A��B��A��?��>��=��=��=��>��@��A��A��A��@��?��?��>��>��:��:��9��:��;��;��;��:��9��9��9��9��9��:��:��:��;��:��:��;��9��8��9��;��:��9��9��9��8��8��6��4��7��7��7��6��5��4��5~�5~�F��F��F��G��G��F��E��F��D��G��G��E��E��G��H��G��H��H��H��H��H��H��H��G��G��G��G��G��H��H��G��G��I��I��I��I��I��J��I��I��H��G��H��I��J��I��H��I��I��I��I��I��I��I��I��I��J��J��J��J��K��K��J��I��H��H��H��H��H��I��H��H��H��H��I��I��I��I��I��I��I��H��I��I��H��G��H��I��J��I��I��J��J��I��I��I��J��J��I��J��J��J��J��J��I��I��I��I��I��I��I��I��H��H��H��I��H��G��H��J��H��I��I��J��I��I��I��J��J��I��I��H��H��H��H��I��H��H��G��G��G��H��H��I��G��G��F��E��F��G��G��F��F��F��F��G��G��H��H��H��F��F��G��G��G��G��G��I��K��Q��^��'AdXOR�na]C6% ! ' V@2oTCqN:}Q8��^Ғf�e�\�[�X�S��]��b��e�\ؚk��biU<���teR�kT�Z;ߛn��iؤ|��dydI��xgUG�zj�R9椄�jB�h:�@مV�b�j�q�}ZX.02`H0��ey_H(# M0 mM8Я����~��X��G��B��C��C��F��F��H��G��F��C��C��C��A��@��@��A��B��A��A��@��@��@��A��A��A��A��A��A��@��@��?��?��@��@��A��A��A��@��@��@��@��?��?��@��A��B��B��A��?��?��@��A��A��A��A��@��E��E��D��D��D��D��D��D��E��D��D��D��B��A��A��C��C��A��@��A��A��@��?��?��A��A��A��A��A��@��@��?��A��B��B��A��A��B��B��A��@��@��@��@��@��A��B��B��A��@��@��?��?��@��@��@��@��@��?��?��?��>��?��@��@��@��@��@��>��>��=��=��;��;��<��<��=��<��<��;��:��:��9��9��9��:��:��;��<��<��<��;��:��8��9��:��:��9��9��9��7��7��7��6��7��7��6��6��5��5��6�6�G��F��G��H��F��F��E��E��F��G��H��G��F��G��G��F��H��H��I��I��I��I��G��G��G��H��H��H��H��H��I��I��K��J��I��I��I��I��I��I��I��H��H��I��J��J��I��I��J��J��J��J��J��J��J��J��J��I��J��K��K��K��J��H��I��I��I��I��J��J��J��I��I��I��I��I��I��I��J��J��H��G��I��I��I��H��I��J��K��J��J��K��J��J��J��J��J��I��I��I��J��J��I��I��J��J��I��I��I��I��I��I��J��I��J��J��I��I��I��I��H��I��I��I��I��I��I��I��K��K��J��I��H��H��I��I��I��I��H��H��H��I��J��J��I��H��F��F��G��H��H��F��H��H��G��G��G��H��H��I��F��F��G��H��H��I��J��J��L��P��Z��'AdLFH�obA-$# " $ J6+qZJ6U/�sR��X��g�c�g�^�M�U��`��h�bٛl��mkYA���odP�pX�\;�p��jۣ~��s{cK��wfYI��n�Z>妃�h>�g;�Fލ^�i�l�k�wTd:$:, uW?��{\D,+U5&����nTά����}��\��I��D��E��E��F��F��G��H��C��C��C��D��B��A��A��B��B��B��B��A��A��A��B��B��@��@��@��@��@��@��A��A��A��A��B��A��@��@��?��?��A��@��?��?��A��A��B��B��A��B��B��B��C��B��B��B��C��C��B��B��D��D��D��C��D��E��E��F��C��B��A��B��C��B��A��B��B��@��?��?��A��A��A��A��A��A��@��@��?��?��?��?��@��@��@��>��@��@��@��@��@��A��B��C��B��A��@��@��@��@��?��?��@��?��@��A��@��?��>��?��@��@��@��?��>��>��=��=��;��<��=��=��?��>��=��<��;��;��:��:��:��;��>��?��=��=��=��=��<��:��;��<��<��;��:��9��9��9��7��8��8��8��:��9��9��9��:��:��F��F��G��H��H��G��G��G��F��G��G��G��G��H��G��F��H��H��I��J��J��I��H��G��H��I��I��I��I��I��J��J��J��J��I��I��I��I��J��J��I��I��I��I��J��J��I��I��I��J��J��J��J��J��J��K��J��J��K��K��K��K��J��I��J��J��K��K��K��K��K��J��J��J��J��J��J��I��I��I��I��H��I��J��I��H��J��K��L��J��J��K��J��J��J��J��J��I��I��I��J��J��J��I��K��J��I��I��I��I��I��I��J��J��J��J��J��I��I��J��I��J��I��I��I��H��H��H��K��K��K��J��J��I��I��I��I��I��I��J��J��J��J��I��I��I��I��I��J��J��I��H��J��J��I��I��H��H��H��H��H��H��I��J��I��H��I��J��K��S��`��'AbUOQ��w*%02R@4��|+J&�hH�vNۗfޓ\�b�`�N�S��^��d�dؚkß}sbH���qfP�pU�]9�q�lݣ~̣�~cN��zfYF��m�]>꬇�jA�_5�G؊Z�f�g�m�]:m?(F �cK~Y?���V<%B �hR֪���b��������`��L��E��F��E��G��F��D��C��C��C��D��D��B��B��B��B��A��B��B��C��C��C��C��B��?��@��@��@��@��@��A��A��B��C��B��A��@��?��?��?��@��@��@��?��A��A��A��A��C��C��C��C��C��C��C��C��B��B��B��B��E��E��E��E��E��F��G��G��D��B��B��B��B��A��A��B��C��B��A��A��A��A��A��A��A��A��A��A��?��?��>��>��@��@��?��>��@��A��A��A��A��A��B��C��C��A��A��A��A��@��@��@��?��?��@��A��@��?��>��?��A��A��A��@��?��?��>��>��<��=��>��=��>��=��=��=��:��:��;��<��<��=��?��@��<��=��=��=��=��<��<��=��=��=��<��;��:��:��8��9��9��9��;��;��;��;��=��=��E��F��G��H��H��H��H��G��F��F��G��G��G��H��G��F��H��I��I��I��I��I��H��H��I��I��I��I��I��I��K��K��I��I��I��I��I��I��G��H��G��H��J��J��I��I��K��K��J��J��J��J��J��J��J��J��L��K��L��L��L��L��L��L��J��J��J��K��J��J��I��I��J��J��K��K��K��J��J��I��H��G��I��I��I��I��J��L��L��K��J��K��K��K��J��J��J��I��I��I��J��J��J��I��L��K��J��J��J��J��K��K��J��J��J��J��J��K��K��J��I��I��I��I��I��I��H��H��K��K��J��J��J��I��I��I��I��I��I��J��J��K��J��I��I��I��J��J��J��J��I��I��J��J��J��J��I��H��H��G��H��I��K��J��H��G��H��J��P��S��[��-Fe�~~���.)^JCoYNaN?���+F" �hH��^֏aٌX�c�c��K�J�V�c�_Ҕeӯ�kP���|nT�mO�\6�o�kݡ}ݱ��gQ��|fW@��e�W5誅�g>�V-�M%ݏa�b�]ِc�sNP^.˕y�sUϯ�\>&d:!�}_�uT�c@߻�Ϳ����a��O��G��D��D��H��F��C��A��C��E��D��C��B��A��@��@��A��A��C��D��D��C��C��B��B��B��B��A��@��?��?��@��C��C��C��B��A��A��A��A��A��A��B��B��C��B��B��B��D��C��B��B��B��B��C��D��C��C��D��D��D��D��F��F��E��G��H��H��F��E��D��D��C��C��C��D��E��D��C��C��D��C��C��C��D��D��D��C��@��?��?��?��A��A��@��?��>��?��@��@��@��?��?��?��B��A��A��B��B��@��A��B��A��@��A��A��A��?��?��@��B��B��A��@��@��@��>��=��>��>��@��?��>��>��?��?��:��;��=��=��?��?��?��?��<��=��=��=��<��<��<��<��?��?��?��>��=��<��9��:��<��<��;��;��<��=��?��@��G��H��H��H��H��H��G��G��G��G��H��H��H��H��H��H��I��I��I��I��I��I��I��I��I��I��H��H��I��I��K��K��J��J��J��J��J��I��G��F��G��I��K��J��I��J��K��L��K��K��J��J��J��J��I��I��L��K��L��K��K��L��L��L��J��K��K��K��J��I��I��I��I��J��K��L��L��L��K��K��G��F��I��I��I��I��K��L��M��K��K��L��L��K��J��J��J��J��I��I��J��J��J��I��K��K��K��K��J��J��K��L��J��K��J��J��K��K��K��K��I��I��I��J��J��K��J��J��L��K��J��I��I��I��J��J��K��J��I��I��I��J��J��J��J��I��I��H��H��H��I��K��H��I��I��J��J��I��H��H��H��I��J��J��H��G��E��I��M��Y��e��E]y������& )jRH��su`M��}0F" -�yYϔlъ^ۍ\�h�g݄H�~@�P�bݐZʍ^ش��lQ����qZ�iL�_7�n�g؞x۲��dN��xfW@�d�Z6�|�W1�>�@ۍ_�b�_�k�xR\#n6̐n�yWԱ�cA&�X<��bʖq�rNڶ�˿�{��Z��N��G��D��E��I��H��C��A��C��D��D��C��B��B��A��A��D��C��D��C��B��B��B��C��C��C��C��C��B��A��A��B��A��B��B��B��B��B��C��C��B��C��C��D��D��C��C��C��E��E��D��D��D��D��E��F��D��D��F��E��D��D��E��E��F��G��H��G��F��E��E��E��F��E��E��F��F��D��D��D��D��D��C��C��D��D��D��D��A��?��?��@��A��@��@��@��?��@��B��B��A��@��?��?��A��A��B��C��B��@��A��C��B��B��B��C��B��A��A��B��B��B��A��A��A��@��>��>��>��>��?��?��>��>��@��@��>��=��>��>��@��>��>��>��?��@��@��?��>��>��>��>��@��A��A��A��?��>��;��;��>��>��>��=��?��?��A��A��G��H��H��G��G��H��G��F��G��H��H��H��H��G��F��I��J��J��J��J��I��I��J��J��J��I��I��I��I��J��L��L��J��J��K��K��I��H��G��G��I��J��L��K��L��L��M��L��K��I��K��K��K��K��K��J��J��J��K��K��K��K��K��K��L��L��L��L��K��K��K��K��J��J��K��L��L��L��L��L��H��H��H��I��K��J��K��M��M��L��L��M��M��L��K��K��H��H��J��J��J��K��J��J��I��K��L��K��J��J��L��M��L��L��L��K��K��L��L��J��J��J��J��K��I��J��I��K��K��K��J��J��I��J��J��K��L��K��J��I��J��J��J��J��K��I��H��H��I��I��I��K��I��I��J��J��J��J��I��I��H��I��I��I��I��H��F��I��M��U��h��j��������,.P6)�{hoYB��n/G! -��lӕnш]؈W�^�]�N�N�X�b֎Tď[ճ��jS����o^�fM�^8ڛf٘bҟtҮ�|dL��qhWE�~f�U3�|�hC�U/�Dߑc�]�Zۓa͌d�D'}@#ٕp�rMݸ�`>"�^@��_��g�zVέ��ķ{��b��O��F��E��F��I��F��A��B��B��D��C��C��C��D��D��C��D��C��C��B��C��C��C��D��B��C��D��D��C��C��C��D��A��A��B��B��B��B��C��D��C��D��D��D��D��D��D��D��E��E��F��F��G��G��G��G��D��D��E��D��D��C��E��E��G��H��G��F��E��F��F��E��H��G��G��G��G��F��F��F��E��E��D��D��D��D��D��D��A��?��?��@��@��?��?��@��@��A��B��B��B��A��A��A��A��?��@��A��A��@��@��A��A��A��A��B��A��@��@��@��A��A��A��A��A��A��?��>��=��=��?��?��@��A��A��@��@��?��B��A��@��@��@��@��B��C��B��A��A��A��A��A��B��B��B��B��@��@��?��?��A��A��A��A��C��C��D��D��F��H��H��G��G��I��H��G��G��H��I��H��G��G��H��J��J��J��J��J��I��J��K��K��K��J��J��J��J��K��M��M��I��J��K��L��J��I��I��H��J��K��L��K��M��N��N��K��I��H��K��L��M��M��M��M��J��K��M��M��M��L��L��L��L��L��L��L��K��K��K��L��L��L��L��K��K��K��L��L��L��J��J��K��M��K��M��N��L��L��L��M��N��M��K��L��K��K��J��J��K��K��K��J��J��K��M��M��L��K��M��O��L��M��L��K��K��L��L��J��K��K��K��K��J��J��I��H��I��I��K��K��K��K��J��J��L��K��K��K��L��K��J��I��K��I��I��J��K��K��J��J��L��K��K��J��J��J��J��J��L��J��H��I��I��J��I��H��N��R��i�Ȋ��������( &O5$��vgM��y3?��jӕnш[ڈXߌX�V��L�R�W�^ӋQŐ\ִ��pY����pa�bL�V2ғ^ԓ]ԤvҰ��iO��ojYG�|f�T4ߛt�c>�W1�=��b�Y�Wۑ`ʇ]�X7�I)��q�{R�ȤjG'�fE�|YƐj�pLѲ����v��X��O��I��H��H��I��D��@��A��D��E��E��C��C��D��C��C��A��B��C��E��E��E��E��D��C��D��E��E��C��C��C��C��C��D��D��C��C��C��D��E��E��E��E��D��E��D��E��F��C��D��F��G��G��G��F��E��D��E��E��E��F��E��G��G��H��H��G��E��E��F��G��E��G��G��F��G��G��F��F��G��F��E��D��D��D��D��D��B��B��A��B��B��B��A��A��B��A��B��C��C��B��A��B��C��B��@��@��B��C��A��@��A��@��@��A��C��B��@��?��@��B��B��B��B��B��A��?��?��>��>��@��@��C��C��B��A��A��@��C��B��B��B��C��D��B��B��B��A��A��B��C��C��B��B��A��A��@��A��A��A��A��A��B��B��D��C��C��C��I��I��H��I��I��I��H��H��F��G��H��H��H��H��I��I��H��H��I��J��J��I��J��K��J��J��K��K��K��K��K��K��I��H��I��J��K��K��K��K��M��M��L��L��L��L��L��J��I��I��I��J��K��K��N��N��M��M��N��M��K��K��L��N��M��N��O��N��N��N��O��N��J��K��L��L��L��L��L��L��K��K��K��K��K��K��K��L��L��L��K��L��L��M��L��K��J��L��L��L��L��L��L��L��K��K��L��L��L��L��K��K��K��L��L��L��M��L��K��K��J��J��J��K��I��I��I��I��I��I��K��K��J��J��J��J��K��K��K��K��K��K��J��J��J��J��J��K��L��L��J��I��K��J��K��M��L��J��H��I��J��J��K��J��J��I��I��J��N��Q��c�ʆ��������,) Q;&Ĭ��rW��v3=��iːhӉZ؅Q��T��OހJ�U�U�[ӆPˆXݻ�~jQ���n\�fO�R1ؔeыX֡uկ�yaE��njYE�wa�Q2ܘs�b;�U.�?ډZދW݊T܎]�T�M*�G$ۘm�wJ�ʣtQ+��`�vO�_6�g@�ΰ���w��^��Q��L��I��J��K��G��E��C��D��C��C��C��E��E��E��E��D��D��D��E��E��E��D��D��D��C��B��B��B��C��D��D��D��D��D��D��C��D��E��F��D��F��F��E��C��D��H��I��I��H��F��F��F��F��F��F��F��F��F��F��E��C��C��D��I��H��G��E��F��F��F��D��E��D��C��C��C��C��D��D��E��E��B��B��B��B��B��B��A��A��D��B��D��B��B��B��B��B��B��B��B��B��A��A��@��A��B��C��B��A��@��@��B��A��B��A��B��C��D��E��A��@��@��B��B��A��@��A��C��B��C��D��E��D��C��D��D��B��B��C��C��C��E��G��D��D��D��D��C��D��E��F��E��C��B��B��D��D��C��C��@��A��A��A��A��@��?��?��I��I��H��I��I��I��H��H��H��I��I��I��I��I��I��I��J��I��I��J��J��I��J��K��K��K��L��L��L��L��L��K��J��I��I��J��K��K��K��K��M��M��M��L��L��M��L��K��J��J��J��J��K��K��M��M��M��M��L��L��K��K��K��L��M��N��O��N��M��N��N��M��M��M��M��M��M��M��M��M��L��L��L��L��L��L��L��M��M��L��K��L��M��M��M��L��M��M��M��M��M��M��M��M��L��L��L��L��L��L��L��L��L��L��L��M��M��L��K��K��K��K��J��J��H��H��H��I��H��H��H��I��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��J��J��K��K��J��I��J��K��K��L��K��G��H��J��K��J��U��f��g��������'.T?*ʲ��kM��j1@! ��n̑gޑcߌX�R�P�N�T�U�YӃNɌ_㿛�mR���}lX�eO�Q2ҋ_ҊZڣzܶ�}dF��om[G�|g�R3ܘu�g@�Y/�Aۊ[�^�[�_�R�R/�J%ٖk�{M�ȞyS,Ȕl�~V�uK�iA�ί���~��b��R��L��K��I��H��G��F��F��E��D��D��D��E��E��E��E��E��E��F��F��F��E��E��D��E��D��D��D��D��E��F��F��F��G��G��F��F��E��F��F��F��G��G��E��E��F��I��I��I��I��G��G��G��F��F��F��H��G��G��G��G��F��F��G��G��G��F��E��F��G��G��F��C��B��C��B��C��C��E��E��E��E��C��C��C��C��B��B��D��D��D��D��D��D��B��A��B��C��C��C��C��C��B��B��B��B��B��B��B��A��A��A��C��B��C��B��B��C��D��D��B��A��A��B��B��B��B��C��G��E��D��D��B��B��C��E��D��D��D��F��F��F��G��G��F��G��H��I��H��G��I��H��G��E��D��D��D��C��B��B��B��C��C��C��C��B��@��?��J��J��I��I��I��I��H��H��J��J��J��J��J��J��J��J��K��J��J��K��K��J��J��L��L��L��L��L��L��L��M��L��L��J��J��J��L��L��L��L��L��M��M��L��M��M��M��L��K��K��K��K��K��K��M��M��N��M��L��L��L��L��K��K��M��N��N��M��M��M��M��L��N��M��M��M��M��M��M��K��L��M��M��M��M��M��M��M��M��L��K��K��L��L��L��L��N��N��M��M��M��M��M��M��M��M��M��M��L��L��M��N��M��M��M��M��M��L��K��K��L��L��K��J��I��J��J��K��H��H��I��I��L��L��L��L��L��K��L��K��K��K��K��K��L��L��K��K��K��K��L��M��L��K��J��K��K��J��K��L��L��L��M��K��G��I��K��M��J��T��g��\y�������',O:%ζ��qS��w2C# ��nϔhٍ\�Y�S�S߄K�K�S�\؈SɌ_ӭ��lR����t_�fN�P1֍bԋ^Ӝuװ��fK��mr]J�yd�N/ܚw�c<�U+�R'�h�`�\�cӉ\�gD�W2Ւg�tF�ś�^5˔k�|QƇ[�xP�ϯ���w��]��R��J��I��H��G��F��F��E��F��F��F��E��E��E��E��E��E��E��G��F��F��F��E��E��E��E��E��E��F��F��F��F��F��G��G��G��G��G��F��F��H��H��G��F��H��I��J��J��J��J��J��I��G��G��G��G��I��G��G��H��I��I��H��I��G��G��F��E��F��G��G��F��C��C��C��C��D��D��D��D��D��D��D��D��D��D��C��D��F��E��E��E��C��B��B��B��B��B��C��C��C��C��B��A��C��C��B��B��A��A��B��B��B��A��A��@��B��C��C��C��B��A��A��A��B��B��E��F��G��F��E��C��A��A��C��E��E��E��F��G��G��G��F��G��F��G��H��I��I��H��F��F��D��C��C��D��C��B��B��C��A��A��B��B��@��?��>��>��K��K��J��J��J��J��I��I��J��J��I��J��K��K��K��K��K��J��K��K��K��J��K��L��L��L��L��L��L��L��M��L��K��K��J��J��M��M��M��L��M��M��M��M��M��N��N��M��L��L��L��K��K��K��M��M��O��N��M��M��M��M��M��M��M��N��N��N��M��N��N��M��N��N��M��L��L��M��L��K��L��M��M��M��L��L��M��M��O��N��M��L��L��L��L��L��N��N��N��N��M��M��M��L��M��N��N��N��M��M��M��O��N��N��M��M��M��M��L��L��M��L��L��K��J��K��K��K��J��J��J��J��L��L��K��K��M��M��M��L��K��K��K��K��L��L��L��K��K��K��L��M��M��L��K��K��K��K��L��M��M��L��M��K��H��I��K��M��M��Q��f��n��������*) U?*Ȱ��jM��{,C# ��ȋeхTދU�U�R߄K�N�S�\܌Wˌ`۳��tV��~�oW�kQ�U4֍bۓcާ�๘�hM��mnXA��i�X9ޜz�T/�C�D�e�`�b�kՋ^�gD�Y6Ւg�pB����[3؝qDŽW͊]�}Q�Ƣ�ȼ|��`��Q��J��J��H��H��G��E��D��F��F��F��E��E��D��E��E��E��E��G��G��F��F��E��E��D��D��E��E��F��F��E��E��E��F��F��G��G��H��H��H��H��H��G��G��J��K��K��J��J��J��J��J��G��G��G��G��H��G��G��G��H��H��I��I��H��H��G��F��F��G��F��E��D��D��E��E��E��E��E��D��E��D��D��D��D��D��C��D��F��F��F��F��D��C��C��B��B��B��C��D��D��D��C��B��E��E��D��C��B��B��C��C��B��B��B��B��D��D��D��D��B��B��B��B��C��C��F��G��E��E��E��D��D��D��E��F��G��F��F��E��E��F��F��G��E��E��E��E��E��E��E��F��B��B��B��C��C��A��A��B��B��B��C��C��A��A��@��@��K��K��J��J��J��J��I��I��I��I��I��I��K��L��M��M��K��K��J��K��K��K��L��M��L��L��L��L��M��M��M��M��L��K��J��K��N��N��N��N��M��N��N��N��N��N��N��M��L��L��L��L��L��L��N��N��N��N��N��N��N��N��N��N��M��N��N��M��N��N��N��N��M��N��N��L��L��M��M��M��L��M��M��M��M��M��M��M��O��O��N��M��M��N��N��N��N��N��O��O��O��N��M��L��K��M��N��O��N��M��M��M��M��M��M��M��L��L��M��M��L��L��L��L��L��L��L��L��K��K��L��M��M��M��L��K��M��M��M��L��L��L��L��L��K��L��M��L��L��K��L��M��L��L��L��L��L��L��L��L��M��L��K��J��J��J��K��L��O��U��f��u��������*,T>)Ƭ��jM��t.B" ��dΑeӇVދU�W�P�O�Z�W�\يRޞnߵ��lJ����uX�lL�[6ܒcݕcעxԮ��lN��lsY>��i�Y9ݛy�e?�]6�B�e�c�]�dԊ]�eB�]:Ւg�i;鿕�b8�wЈXωX�uHۻ��˿���_��P��I��H��H��G��G��E��D��F��F��F��F��E��E��F��G��F��G��G��G��G��F��F��F��E��F��G��G��G��G��F��F��E��E��E��F��G��G��H��H��H��H��G��G��J��L��L��K��K��K��J��J��H��H��H��H��H��G��G��H��G��G��H��I��H��H��G��F��F��F��F��E��E��E��E��E��F��E��E��D��E��E��D��C��C��C��C��C��G��F��D��D��D��D��D��C��D��D��E��F��F��F��E��E��F��E��E��D��D��D��D��D��D��D��D��D��D��D��F��E��C��C��F��G��G��H��H��G��D��E��E��F��G��H��G��F��H��G��G��F��E��E��E��E��E��D��C��B��B��C��D��D��D��C��C��D��C��A��A��B��B��B��A��A��A��A��@��@��J��K��J��J��J��J��I��I��I��I��I��J��K��L��M��N��L��K��K��L��L��K��L��M��L��M��M��M��M��M��M��M��K��K��K��L��N��O��O��N��N��O��O��N��N��N��N��N��L��L��L��L��L��L��N��N��M��M��N��N��M��M��N��N��L��M��M��M��N��O��O��N��M��N��O��M��L��M��N��N��M��N��N��N��N��M��N��N��M��M��M��M��M��N��N��N��M��N��N��O��O��N��M��L��K��M��O��O��O��N��M��M��M��M��M��M��M��M��M��M��L��L��L��M��M��L��L��L��M��J��L��L��M��N��M��M��L��L��M��M��M��N��N��O��L��L��M��M��M��L��L��L��L��M��M��L��L��L��L��K��M��K��J��I��J��J��K��K��N��Y��e��m��������)-Q8$˰��oS��k6E" ��iӖi֊X�Y�[߉N�M�[�V�]�YؙfΣx��q�����Ęu�R*��eߘdɔhÝv��v����k��s�V6ښw�dA�a9�<ً]ߏ^�^�iчZ�W4�X4ݚo�tF����]5ݝqʀQӋ[�vH۹����}��^��R��I��F��F��F��G��F��F��G��G��H��G��F��F��H��H��G��H��H��H��G��G��G��H��G��G��H��H��H��G��G��G��F��F��F��F��G��G��G��G��H��H��H��H��K��M��M��L��L��L��L��K��I��I��I��I��H��H��H��I��H��G��H��J��G��H��G��F��F��G��G��F��E��E��E��E��E��E��E��D��F��E��D��C��C��C��B��C��E��F��D��D��E��E��D��D��D��E��E��F��F��F��F��F��D��D��C��C��C��C��C��B��D��D��D��C��C��C��D��D��B��D��G��H��H��H��G��E��E��E��D��E��F��H��G��E��G��G��H��G��G��F��E��D��E��D��D��C��C��B��B��A��C��B��B��C��C��B��B��B��A��A��@��@��@��?��?��?��J��J��J��J��K��K��J��J��J��K��K��K��J��J��L��M��M��L��M��M��M��M��L��N��M��M��M��N��N��N��N��N��K��L��L��L��N��N��N��N��N��P��P��O��N��O��O��N��L��L��M��M��M��M��O��O��N��M��N��N��N��N��N��N��L��L��L��L��M��N��M��L��K��M��L��J��J��L��M��K��N��N��O��O��N��N��N��O��M��M��M��M��M��M��M��M��K��K��K��K��K��K��K��K��J��K��L��M��M��L��L��K��K��K��N��N��N��N��N��N��M��M��N��N��N��N��N��M��N��M��L��L��M��N��N��N��L��L��L��M��M��M��O��O��L��L��L��L��M��M��M��M��N��N��N��M��L��M��M��L��M��L��L��K��K��J��L��K��N��W��g��k��������'.Y@,̱��hJ��h4D! Țv՘k׉X�[�X߉L߄K�U�U�]یSߠm��i��wɯ���xФ�Y/ْ^�iפw��u�������u��|�W7ܜy�a>�[4�@؊\܌[�a�ä́Y�Z7�U1ٖk�tF廓�_7�vІYّa�yM߽����}��d��Q��H��E��C��F��G��G��H��H��I��J��I��H��G��H��I��G��H��I��I��H��G��H��H��H��H��I��H��H��G��G��G��F��F��G��G��G��G��F��F��H��I��I��I��K��M��M��L��L��L��L��L��J��I��I��I��I��H��H��I��I��I��I��J��G��G��G��F��F��G��G��F��D��D��E��F��F��F��E��D��F��F��E��D��D��D��D��D��F��E��D��E��E��E��D��C��D��D��D��D��E��E��E��F��D��C��C��C��C��C��C��C��C��C��C��B��B��B��B��B��D��F��G��G��G��G��E��C��E��E��E��E��F��G��F��E��E��F��G��F��F��E��D��C��B��A��A��A��A��@��@��A��B��A��A��B��C��C��D��D��C��C��C��B��B��A��A��@��J��K��K��K��L��L��K��K��L��L��L��K��J��J��L��M��N��M��M��N��N��M��M��N��M��M��M��M��N��N��N��N��K��L��M��M��N��N��N��N��O��P��P��O��N��O��O��N��M��M��M��M��M��M��N��N��P��O��N��O��P��P��O��N��N��N��N��M��N��O��N��M��L��M��L��J��J��M��L��J��N��N��O��O��N��N��O��O��P��P��P��O��O��N��M��M��M��L��L��K��K��L��L��M��K��K��K��L��L��L��L��K��K��K��N��N��O��O��N��N��O��N��O��N��N��N��O��P��O��N��L��L��M��N��N��N��M��M��N��N��M��M��N��N��M��L��L��L��M��M��N��M��P��P��O��M��M��N��N��N��M��M��M��M��L��K��M��M��Q��U��l��r��������" 1T>)˰��nP���4BӣךmًZ�]�S��M�O�V�X�[ٌT�r�}SkM'ū�rT2��d�Z2ߗgݙh۪��Zt[<��saH*�~`�X9֕u�c?�]6�?ԅZ܌[ߏ^ސ`̈́Y�^;�S/חk�{M廓�b<�{ړiܕi�yO�����Ą��\��O��G��E��E��F��H��H��H��I��J��J��I��H��G��G��H��F��H��I��H��H��G��G��H��I��J��J��J��I��H��H��H��E��E��F��H��H��H��G��E��I��J��J��J��L��M��M��M��L��L��L��L��I��I��I��I��I��H��H��I��J��J��J��J��G��H��H��F��F��F��F��F��D��D��E��F��G��G��F��E��G��F��F��E��E��E��E��F��F��E��E��E��E��E��D��C��D��D��D��E��E��F��F��G��F��E��D��D��E��F��F��F��B��B��B��C��C��D��E��E��E��G��G��G��F��F��E��C��D��F��H��H��H��H��G��F��D��D��D��C��C��D��D��C��A��A��@��@��A��B��B��B��F��C��B��C��E��E��D��D��C��C��B��A��A��@��?��?��K��K��L��L��K��K��K��K��L��L��K��K��K��L��N��N��O��O��O��O��O��O��O��O��M��N��O��O��N��N��N��O��L��L��M��N��P��O��O��O��N��N��O��P��Q��O��O��O��M��N��N��O��O��N��O��N��N��O��O��P��P��O��O��O��M��M��L��M��N��N��N��N��N��M��M��M��M��M��M��M��N��N��O��O��N��N��O��P��Q��Q��O��N��M��O��O��O��M��L��K��K��K��L��M��M��L��L��L��L��L��L��L��L��L��L��L��L��N��N��N��N��O��N��O��P��O��N��O��P��P��P��O��N��N��O��N��L��P��N��M��M��M��M��M��L��N��L��L��M��M��M��M��M��L��M��N��O��O��N��M��L��N��N��M��L��K��K��M��M��Q��S��k��|�������~(0R<'����qS���5Aϟ{ܝqݏ^�`�SވK߄K܂F�O�]ֈWטm�zWlM.����bF�kN�S1��nڕk˙v�~_hP6��os[C�qW�P4ؗw�]9�U.�L%׈]ۋZݍ\ߑa˂Y�M,�V4ؗm�l?߸��X4֛yϋfӏh�xQӲ�������\��P��I��I��H��I��I��I��I��K��J��I��I��I��J��I��I��I��I��I��I��I��I��H��H��I��H��H��H��H��H��G��G��I��I��H��G��F��G��H��G��I��I��I��I��M��M��M��L��N��N��N��M��K��K��K��K��I��H��H��H��I��I��H��F��E��F��F��G��G��H��G��F��E��F��E��E��D��E��F��F��G��F��D��C��C��D��E��F��G��F��E��E��F��F��F��F��D��E��F��E��E��F��E��D��F��E��E��D��E��E��E��E��E��E��D��C��C��C��C��C��C��C��C��B��B��B��D��E��D��G��G��F��E��F��F��E��D��D��C��C��C��D��D��D��A��A��A��C��B��B��B��D��E��E��E��F��F��E��E��E��D��C��C��B��A��A��@��@��L��L��L��L��K��K��L��L��L��L��L��L��L��L��N��N��O��O��O��N��N��O��N��N��M��N��O��O��N��N��N��O��N��N��O��N��P��O��O��O��Q��P��P��Q��P��N��M��N��N��N��N��O��O��N��O��O��O��P��P��P��P��P��P��P��M��M��M��N��N��O��N��M��M��M��N��N��N��M��M��M��O��O��O��O��O��N��O��O��Q��Q��P��O��O��P��P��P��M��M��L��L��L��L��L��M��M��M��M��M��M��M��M��M��L��L��L��L��N��O��O��O��O��N��O��P��O��O��O��P��N��O��N��M��M��M��M��M��M��M��M��M��M��N��N��O��N��M��M��N��N��N��M��N��N��O��O��O��O��O��N��N��M��M��L��L��K��K��M��M��N��X��a�ˀ�������t,& P:%����xZŧ�0I%ե�ޟsߑ`�Z�Q�Q�T�L�M�XֈW�x�wUdF*����bJ�eL�W9�rݘoП~�x]jQ;��omT@�v`�S8ۚz�R0�?�>ڍa܌[ݍ\ً[�V�J)�W7֗l�j=佖�\:ȓs�kIВm�pK������~��`��O��H��I��I��J��J��L��M��L��K��J��J��J��J��J��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��H��H��G��H��H��G��E��F��G��G��J��J��J��K��N��N��N��M��L��L��L��L��J��J��J��J��I��H��H��H��I��H��G��F��H��H��H��F��F��G��F��E��E��F��E��E��E��F��F��F��F��F��F��E��E��E��G��G��G��F��E��E��F��F��F��F��E��F��E��D��D��E��F��F��F��E��E��E��E��E��E��E��D��C��C��B��B��B��B��B��C��D��D��C��C��C��E��F��E��G��G��E��E��F��G��F��F��E��D��D��E��E��E��E��C��C��C��D��D��C��C��D��F��E��E��F��F��E��D��E��D��C��C��B��B��A��A��A��M��M��L��L��K��L��M��M��M��M��M��M��M��M��M��M��O��O��N��M��M��M��N��N��M��N��O��P��O��O��O��O��O��O��O��N��P��O��P��P��Q��P��P��P��P��O��O��P��N��N��N��N��N��N��P��O��Q��Q��P��P��P��P��P��P��M��M��N��N��O��O��N��M��N��N��N��N��N��N��N��N��P��P��P��P��P��O��O��N��O��P��P��O��O��O��P��P��N��N��M��M��M��M��M��M��N��N��M��M��M��M��M��M��M��M��M��M��P��P��P��P��O��O��P��P��P��O��O��P��N��O��O��N��M��N��N��O��M��M��N��N��M��N��O��Q��P��N��N��O��O��N��N��N��O��O��O��O��O��O��P��P��M��N��M��M��L��L��N��N��N��S��o��y��������#P:%����rV��|:O+ե�ޟs�b�Z�U�P�V��]��Z�]؈W�}�{YiK/����gQ�fM�W9�s��r٧��y]q[D��pjT?�~g�W<ޝ}�hF�\5�=։]؇XڊYԆVȁW�E&�U5�x�sG⼗|Y9�w[u@!��^�hF��������`��P��J��I��I��J��J��M��M��K��J��J��J��I��I��H��G��H��H��I��I��H��H��H��I��I��I��I��I��H��H��H��H��G��H��I��H��G��G��G��H��J��J��K��K��L��M��L��L��K��K��K��J��J��J��I��I��I��I��I��I��I��H��H��G��J��J��H��F��F��F��G��F��F��G��F��E��E��E��F��E��E��F��G��H��G��G��H��H��G��F��E��E��F��F��F��E��F��F��F��D��D��E��D��D��D��E��F��F��E��D��E��E��D��D��C��C��C��C��C��C��D��E��E��E��D��D��D��D��D��E��D��B��B��D��E��E��F��E��E��E��E��F��F��E��F��F��D��D��C��B��B��C��H��F��F��F��E��D��C��C��D��C��C��C��B��B��B��B��M��M��M��M��L��L��M��M��M��M��N��N��N��N��M��M��P��O��N��N��M��N��N��N��N��O��P��Q��P��O��O��O��N��N��N��N��O��P��Q��Q��Q��Q��P��Q��Q��Q��Q��R��N��N��O��N��N��N��P��P��R��Q��Q��P��Q��Q��Q��Q��N��N��N��O��O��N��N��N��O��N��M��M��M��N��O��P��Q��P��P��P��Q��Q��O��N��N��P��Q��P��O��O��P��P��N��N��N��N��N��N��N��M��M��M��M��M��M��M��M��M��N��N��N��N��P��P��P��P��P��O��P��Q��P��O��P��Q��O��P��P��O��O��O��O��O��O��O��O��N��N��N��O��P��P��O��O��O��O��O��N��O��P��O��O��O��O��O��P��P��N��O��N��N��N��M��O��O��R��X��a�̅�â����� U@+����rV��z5E! ӣߠt�`�[�Z�L�Q��d��b�]ۋX�}��atY<����lU�oU�Y:�p�oݩ���d{cI��qmXC��i�T9Ӓr�eA�a:�7фXԃTӅU׊\�zP�H)�X:ڜu�tK�žyX9�bm@#�sR�cA�����р��a��T��M��K��J��J��J��M��M��K��K��J��J��I��I��H��G��G��H��I��I��I��H��I��J��I��I��I��I��H��H��H��I��I��I��J��I��H��H��H��H��I��I��J��K��L��L��L��L��M��L��K��J��I��I��H��H��I��I��J��I��H��G��G��G��I��I��H��F��F��G��G��G��G��H��G��F��E��E��E��D��E��F��G��H��H��G��H��H��G��G��F��F��F��F��F��E��F��G��G��F��E��D��B��A��D��E��G��F��E��D��E��F��E��E��E��D��D��D��E��E��E��E��E��E��E��E��E��D��D��D��C��A��A��C��D��D��E��D��D��D��E��E��E��E��F��F��D��D��C��B��B��E��H��G��F��F��E��D��C��D��D��D��C��C��B��B��B��B��L��L��M��N��M��M��M��L��M��N��N��O��O��N��N��M��O��O��N��N��N��O��O��P��P��Q��Q��Q��P��P��P��O��N��N��N��M��O��O��P��Q��R��R��Q��Q��P��Q��Q��Q��O��O��O��O��N��N��Q��Q��R��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��P��P��P��Q��Q��P��P��P��P��P��P��Q��Q��Q��P��P��P��R��R��P��O��O��Q��R��Q��P��Q��Q��Q��N��N��O��O��O��O��O��N��M��M��M��M��N��N��N��N��Q��P��P��P��P��P��O��O��P��P��Q��Q��Q��P��P��Q��P��O��O��P��P��O��O��N��Q��P��O��O��M��M��M��M��N��M��M��M��O��O��O��O��O��O��P��P��O��O��O��O��P��P��O��N��N��M��O��O��I��U��e��~��������U@-ͳ��oS���8I%Ștٚn�`�]��a�S�S��_��[�\�Y�{��ew_=����lR�rU�^:�k�hڥ{��nhI��op\D�|bL/Քt�fB�]6�>։]ӂSӅUфV�zQ�H*�U7�}�|R޺�rU5�ckD'�tQ�pLǯ���΄��d��U��N��L��K��J��J��K��K��K��K��K��J��J��J��I��H��G��H��G��H��G��G��H��H��H��H��H��H��H��H��I��I��K��J��J��J��J��J��I��H��H��H��I��J��K��K��L��L��M��L��I��H��G��G��H��H��H��I��I��H��G��F��F��G��G��H��G��F��F��G��G��F��G��H��H��F��F��F��F��E��H��G��G��G��H��H��H��H��H��G��F��F��G��G��F��E��F��G��G��F��E��E��D��B��D��E��F��F��E��D��E��F��D��D��D��D��C��C��D��E��C��C��D��D��D��D��C��C��C��C��B��B��B��C��C��C��E��E��E��E��E��F��E��E��G��H��H��G��F��F��F��G��I��G��F��F��D��D��D��E��D��D��C��C��B��A��A��A��L��L��N��O��N��N��M��L��N��N��N��O��O��O��N��N��O��O��O��O��O��P��P��Q��R��R��R��Q��Q��P��Q��O��Q��O��N��N��O��O��P��P��Q��Q��Q��P��P��Q��R��Q��O��P��P��O��O��O��Q��R��R��Q��Q��Q��R��R��R��Q��R��R��Q��Q��P��Q��R��S��P��P��Q��R��R��Q��Q��P��R��Q��P��Q��R��R��Q��P��P��Q��Q��Q��Q��Q��Q��Q��O��O��O��O��O��O��O��O��O��N��N��N��O��O��O��O��R��R��R��Q��Q��Q��P��P��Q��P��Q��R��Q��P��P��R��Q��P��P��Q��Q��Q��O��O��Q��P��O��O��N��N��N��N��N��M��L��M��P��O��O��O��O��P��Q��Q��P��P��P��O��R��Q��Q��O��N��N��O��Q��U��X��a��~��������YG3͵��kN��r-H$Ԥ�ݞrގ]�_��c�U�S��]��]��_�Y�z��nzb@����mR�mP�_;��h�f٣wĜx�jK��qr^F�ya�O2Ӓr�eA�Z3�:�~RӂS؊Z҅WƁX�S5�\=۟z�sK޺�tY;��nfE&�wT�rN�����ń��e��V��O��L��J��J��I��K��L��J��J��J��J��I��I��I��H��G��G��G��G��G��G��G��G��H��H��H��H��I��I��I��I��K��J��I��J��K��J��I��H��I��I��I��J��K��K��L��L��M��L��I��H��H��I��I��J��I��I��I��I��H��G��H��H��G��H��H��G��F��F��F��E��F��G��G��G��F��G��G��F��I��H��G��G��H��H��H��H��H��G��G��G��G��G��F��E��F��F��F��E��E��F��G��F��D��E��G��F��E��D��E��F��D��D��E��D��C��C��D��E��C��C��C��C��C��C��C��B��C��C��C��C��C��C��C��C��G��F��G��G��H��H��H��G��G��H��H��G��G��G��G��G��I��H��G��G��E��E��E��F��E��D��D��C��B��A��A��@��M��M��N��O��N��N��N��M��N��N��N��O��O��O��O��O��P��P��P��O��P��P��P��Q��R��R��R��R��R��R��R��Q��R��P��P��O��P��P��Q��Q��P��Q��Q��Q��Q��S��S��S��O��P��Q��P��O��O��R��S��R��R��Q��R��S��S��S��R��R��R��R��R��R��R��S��T��Q��R��R��S��R��R��Q��Q��R��Q��Q��Q��R��R��R��Q��Q��Q��P��P��P��Q��Q��P��Q��Q��Q��Q��Q��Q��Q��Q��R��R��Q��Q��Q��Q��Q��Q��S��S��R��R��R��Q��Q��Q��Q��Q��Q��Q��Q��P��Q��R��Q��P��Q��R��R��Q��P��Q��Q��P��N��N��N��N��O��O��N��M��M��N��P��P��P��P��P��P��Q��Q��P��P��P��P��R��Q��Q��O��L��O��P��R��N��U��b�ρ�������v" O=)����x]��}*?ݭ�Ֆj܌[�]�\�K�L�U�X��^�X�sɟy�kM����oW�nT�[9ݓdޔcޥz͢�oR��wo]G�|g�M0ȇg�\8�V/�D΁UډZӅUфV�rI�T6�]>�kFzF���qX9��mdG'�{U�wRϼ���̇��d��W��P��L��K��I��G��J��K��K��J��J��J��I��I��I��I��H��G��G��H��H��I��H��G��I��I��I��I��J��J��J��J��K��J��J��L��L��K��J��J��H��I��J��J��J��K��K��K��K��K��K��K��K��J��I��I��I��I��I��I��I��I��I��I��G��H��H��G��F��G��G��F��F��H��H��G��G��G��F��E��G��G��G��G��G��G��H��G��H��G��G��G��G��G��F��D��E��F��E��D��D��F��G��G��D��F��F��F��E��D��E��E��E��F��F��E��D��D��E��F��C��B��B��B��B��C��B��B��C��C��C��C��D��D��D��D��F��F��H��I��I��J��I��I��G��I��J��I��H��I��I��I��I��H��G��G��F��E��F��G��E��E��D��C��B��B��A��A��N��N��N��O��N��N��O��O��M��N��N��N��O��O��O��O��Q��P��P��P��O��P��P��P��R��Q��R��R��R��R��S��S��R��P��P��P��R��R��S��S��S��T��T��R��R��S��S��O��O��P��Q��Q��P��P��R��S��R��R��R��S��T��T��T��S��Q��R��S��S��S��S��S��T��U��T��R��Q��Q��R��S��T��R��R��R��Q��Q��R��R��R��S��R��Q��P��Q��Q��R��N��R��R��R��Q��Q��Q��Q��Q��R��R��Q��Q��P��P��P��P��Q��Q��Q��Q��Q��P��P��P��R��Q��Q��Q��Q��P��Q��Q��O��O��P��Q��Q��O��P��Q��Q��R��O��O��N��M��P��O��P��M��O��P��P��P��P��Q��Q��P��Q��P��P��P��P��P��Q��Q��O��M��K��N��P��R��R��X��d��{�������u'#UD0ů��u[��u/C -Ǚwݠt�d�\�T�M�O�L�M�\�\ښjˤ{�qR����nW�u]�Y9Ռa؎_�{̥~�tV��zp[H��m�L4ώp�R-�:�;�|QوYՅTЃU�{R�O1�[<�qKtD�àrW9����gF��b�wQ�¡��ɂ��d��X��Q��O��L��J��I��I��I��L��L��L��K��K��K��K��L��J��I��H��I��J��K��I��H��J��J��J��J��J��K��K��K��J��J��K��M��M��L��K��L��I��I��J��J��J��J��J��J��K��K��L��L��K��J��H��G��H��H��G��G��H��H��H��H��G��H��H��G��F��G��H��H��H��I��H��H��G��G��E��D��D��E��G��G��F��F��F��G��H��G��G��G��G��G��F��D��D��E��E��E��E��E��E��D��E��F��F��F��E��D��E��E��E��F��F��E��D��D��D��E��C��B��B��A��B��B��B��B��F��D��E��D��F��E��F��F��F��F��H��I��I��J��I��I��I��K��L��J��J��K��K��J��J��I��G��G��G��F��F��F��E��E��D��C��C��B��B��B��N��O��P��P��N��N��N��O��N��N��O��O��O��P��P��P��P��P��P��Q��N��N��N��N��O��O��Q��Q��Q��Q��R��R��S��R��Q��Q��R��R��S��R��T��S��Q��Q��P��Q��R��R��P��P��P��P��Q��Q��Q��P��Q��Q��S��S��S��S��S��S��Q��P��O��P��Q��Q��S��S��R��R��R��R��R��R��R��R��S��S��R��R��Q��Q��Q��Q��Q��Q��P��P��O��N��P��O��Q��Q��P��O��N��N��R��S��S��R��O��O��N��M��N��P��Q��P��O��O��O��O��O��O��O��P��P��O��O��P��R��Q��Q��R��Q��Q��Q��Q��Q��Q��T��S��Q��P��Q��Q��R��Q��Q��P��Q��P��P��P��P��P��N��P��Q��P��Q��Q��Q��Q��R��R��P��O��M��O��Q��S��Q��V��f�΂�Ĉ��zxl%!TE0����yc��o*G'��fԛpؒ^��V�S�I�J��^�[�`ݔa՛kҬ�oJ����r\�s[�Z=Ӌeӌ^�}ɤw�\��|w`N��t�I5Όr�\6�X-�;ӄY؄VچWԆX�}T�J,�R4�{Z{U1Ϭ�`Aê��}^��q�~]�ˬ��ȁ��c��W��P��P��P��P��O��O��N��M��K��J��K��K��J��J��J��J��I��I��J��I��I��J��L��K��L��K��J��I��K��L��M��K��M��M��L��K��L��M��M��J��J��J��I��J��K��K��K��M��L��L��L��J��I��I��J��G��F��F��G��I��H��H��H��J��J��J��J��I��I��I��H��I��J��J��J��G��F��F��G��F��E��F��G��H��G��F��E��G��F��G��G��G��F��F��E��F��F��E��E��E��F��F��F��E��E��E��E��F��E��E��D��D��E��F��F��E��D��D��D��C��D��F��F��F��E��E��D��G��E��G��F��I��F��I��K��I��J��J��J��J��K��L��L��L��J��I��J��I��I��I��J��H��H��H��H��G��F��E��D��C��C��C��B��A��A��@��@��N��O��O��O��N��O��O��O��O��O��P��P��Q��Q��Q��Q��R��Q��Q��Q��O��O��O��P��O��O��Q��Q��R��R��S��S��R��R��R��S��S��S��T��S��S��S��R��R��Q��Q��P��P��P��P��P��P��Q��Q��Q��P��Q��Q��S��S��S��S��S��Q��R��O��P��Q��R��Q��S��T��S��S��S��S��S��S��T��T��S��S��R��R��R��R��S��S��Q��P��P��P��O��O��P��P��P��P��Q��P��P��P��R��R��T��S��P��P��O��N��O��P��Q��P��P��P��Q��Q��Q��Q��P��Q��Q��P��O��P��P��O��Q��R��Q��R��R��R��R��Q��R��R��Q��Q��R��R��S��S��R��R��R��R��Q��Q��Q��Q��P��Q��Q��P��Q��R��R��Q��S��R��P��O��O��P��R��S��Q��Y��f�̂�������~:4$<4!YK1��n�pZ���2<Øx̗oя]�]�U�K�K��\��c�cُ^؞nְ��oGį��t\�qY�S6ّk؏b�~Ҭ}��[���u\H��q~E1ʇl�`8�\/�8 یa܈Z�~PՆ[�yR�Y;}Q6�}_pR0ྛ�fC��t�lM�kL�xY�ʬ��ˁ��a��U��P��P��S��Q��P��O��N��N��K��J��J��J��I��I��J��L��K��J��J��J��I��J��L��L��M��L��J��J��K��L��L��M��N��M��L��L��M��M��M��M��L��L��L��L��M��M��M��L��L��L��M��J��I��J��K��I��H��H��I��J��I��I��I��J��J��J��I��I��I��I��J��K��K��K��K��I��H��H��H��F��F��G��G��G��F��F��G��G��F��F��E��E��E��D��D��G��G��F��F��F��F��F��F��E��E��E��F��F��F��G��G��E��F��G��G��F��E��D��E��C��D��F��G��G��F��H��H��J��J��J��J��I��H��H��I��I��J��J��J��J��J��K��K��L��K��J��K��J��H��G��G��H��H��H��G��E��E��E��F��C��B��B��A��A��@��@��?��N��N��N��N��O��P��P��P��P��P��Q��Q��Q��R��R��R��S��R��R��Q��O��P��Q��Q��O��O��R��R��S��S��T��T��R��R��S��T��T��T��S��R��S��S��Q��R��R��R��P��O��Q��Q��Q��Q��R��R��Q��Q��Q��Q��Q��Q��S��T��T��R��R��P��Q��R��R��R��T��T��T��T��T��T��T��T��T��U��T��T��S��S��Q��R��R��R��Q��Q��P��Q��P��P��P��Q��Q��P��Q��R��S��R��S��R��T��S��P��P��P��P��P��R��P��P��P��P��Q��Q��Q��Q��Q��R��Q��P��P��P��P��P��R��R��R��R��R��R��Q��Q��Q��R��R��R��R��R��S��S��S��T��S��S��S��R��R��Q��R��R��Q��P��Q��S��T��S��Q��O��O��P��P��Q��U��U��R��]��h��~��������UJ4YK0sbD]L.kR���?%Aƙ|ИuЋbݏ_��T�S�Y�Z��e�a��]ߟoگ��nG­��v\�pT�V6�o�e�}۬��}Z���|bI��s�G-Έf�a3�`/�>و]ԁUۊ_σ_ăc}M6jF.�rSgO+ɩ��~W��a�zY{a@�sU�˰��ց��_��S��M��O��P��N��L��I��I��M��L��J��J��K��J��K��K��M��L��K��K��J��J��J��K��K��L��L��K��K��L��L��L��M��M��L��K��L��M��M��L��L��L��L��L��K��K��L��L��K��K��K��L��K��J��I��J��J��I��I��J��K��J��I��I��I��I��I��H��H��I��I��J��L��L��J��I��I��I��I��I��G��G��G��G��F��F��G��I��G��G��F��E��E��E��E��E��G��G��G��G��G��F��E��E��F��E��E��F��F��G��H��G��F��G��H��G��F��E��E��F��E��F��G��G��H��H��H��H��J��J��K��K��K��J��J��K��J��K��K��K��K��K��K��K��I��I��J��K��J��I��H��G��I��I��H��F��D��D��F��H��C��C��B��B��A��A��@��@��O��N��N��O��P��Q��P��P��P��Q��Q��Q��Q��Q��Q��Q��R��R��R��R��P��P��P��Q��O��P��S��S��T��T��U��T��R��S��S��T��T��T��S��S��S��S��R��S��S��R��P��P��R��R��R��R��R��R��R��R��R��R��R��R��T��T��U��U��S��Q��R��R��S��R��T��U��U��U��T��T��T��T��T��T��U��U��U��T��R��R��R��R��R��Q��Q��Q��Q��Q��Q��Q��Q��Q��R��R��R��R��S��R��S��S��P��P��P��Q��P��Q��R��Q��Q��Q��Q��P��P��P��R��R��Q��P��P��Q��Q��Q��S��R��R��R��S��S��R��R��R��S��S��S��S��R��R��R��S��T��S��T��T��S��R��R��S��S��R��R��R��S��T��R��O��N��O��Q��R��S��U��V��T��Y��k��l����~����hM�lN�xVrT2�iI��rjH,R+ʛ}ΘvЏi�r�i�Y�Y�^��k�`�hܜnگ��tO����v[�gK�Y7ޔm�j�~ޭ��}]����fM��o�K-͉f�b4�\+�: ΁Uԇ]΃\ҋk�y_~Q>hG4v\AK1�rH�h>�nE�uP�rNlH(��w�Ļ���a��T��M��N��N��M��K��J��I��M��L��K��K��K��L��M��M��M��L��L��K��K��K��K��K��J��K��L��K��M��N��N��M��M��M��L��K��L��M��M��L��K��K��L��K��J��J��J��J��K��K��J��K��L��K��I��I��J��I��I��I��K��J��J��I��I��I��I��I��I��I��I��I��L��K��H��H��I��I��H��H��H��G��H��G��G��G��H��J��G��G��F��F��G��G��G��G��G��G��H��H��G��G��E��E��H��G��F��F��F��F��G��F��G��G��H��G��G��F��F��G��H��I��I��I��I��I��I��I��I��J��K��L��L��L��M��M��K��K��L��L��L��L��L��L��I��I��J��K��K��J��I��H��I��H��G��F��E��E��G��I��D��D��C��C��B��B��B��B��P��P��O��P��Q��Q��Q��P��Q��Q��R��R��R��R��R��Q��R��R��R��R��P��P��P��P��P��P��S��T��T��U��T��T��T��R��T��T��S��S��S��S��T��T��S��S��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��S��U��U��S��R��R��S��R��R��T��U��U��T��T��T��T��T��R��R��S��S��S��S��R��R��R��R��S��R��R��R��R��R��R��Q��Q��R��R��R��Q��Q��Q��Q��P��Q��Q��Q��R��R��Q��Q��S��S��S��R��R��Q��Q��Q��Q��Q��Q��P��Q��Q��Q��R��Q��Q��Q��Q��Q��Q��R��R��P��Q��R��Q��R��R��R��R��R��R��S��S��T��S��Q��P��O��Q��S��S��R��S��S��R��O��O��R��R��S��T��U��U��X��U��u��Uf�o^W�\C�[>�jI�Z7�pL�kH�xT�sQ�jHե�Ԡ{қrޡu�x�m�fޕ`�e�hڔcڟuݷ��mN�����i�kO�^=ږq��p⨂٫��vZ����jR��u~O3іv�\4�W*�V+΋`юdύjЏs�~g�WGA 5B�a;�i=�g:�rF�qF�pI�rS������d��V��O��N��N��L��M��L��L��M��N��M��L��M��N��N��N��M��M��M��L��L��M��M��L��K��L��L��L��L��N��O��N��N��M��M��L��M��O��O��N��M��M��L��L��L��K��K��K��L��K��J��L��L��K��J��I��J��I��I��I��K��K��J��J��J��J��K��K��K��J��J��I��L��J��H��H��I��I��H��H��I��H��G��H��I��H��H��I��G��F��F��F��F��F��G��H��F��F��G��H��G��F��F��F��H��G��F��F��F��F��F��F��G��G��H��H��H��H��H��H��J��J��J��J��J��J��J��J��L��M��M��M��M��M��L��L��I��I��J��K��J��J��J��J��J��J��I��I��H��G��F��F��I��H��G��G��H��H��H��H��D��D��C��B��B��B��B��B��Q��P��P��P��Q��Q��Q��Q��R��R��S��S��S��S��R��R��R��R��S��S��Q��Q��Q��P��Q��Q��T��T��U��U��U��U��S��S��T��T��S��S��T��T��U��U��S��S��R��R��R��S��R��S��S��S��S��R��R��S��S��S��S��S��S��S��U��U��S��R��R��S��R��R��T��U��T��T��T��T��U��U��T��T��R��R��R��S��S��S��S��S��S��R��R��R��S��S��R��Q��R��R��R��Q��P��P��Q��R��Q��R��R��R��S��S��R��Q��R��R��R��Q��Q��Q��R��S��Q��Q��Q��Q��Q��Q��R��S��R��R��Q��Q��R��R��R��R��P��Q��Q��R��T��S��S��T��R��R��S��S��T��S��Q��Q��N��P��S��S��R��R��R��R��R��R��S��S��U��U��U��T��N��\��o��-9S�nj�t\�x[�iH�a=�W2�N(�d?�iC�xS�oH��c벇�����z�}������r�p֠tݵ��vXë��g�qV�`?ڜwݞu⬆٭��w[¤��kP��s�Y@Ɠv�^9�h?�oFךn�㥀榊��jQ#? C L ɉe΅ZӉZщWĀQ�oF�pN�mb���d��V��O��N��M��M��N��M��L��O��O��N��M��M��N��M��L��M��M��M��L��M��N��N��M��L��M��M��L��M��M��N��M��N��N��N��M��M��O��O��N��M��M��M��M��M��M��L��L��N��L��K��L��M��L��K��J��J��J��J��J��K��L��K��J��J��J��K��K��K��J��I��H��M��K��I��I��J��J��J��I��I��H��G��I��J��I��H��H��G��F��F��E��E��E��F��F��F��F��G��G��G��G��G��G��G��G��G��G��G��G��H��G��G��H��H��I��I��I��I��I��J��J��J��J��K��K��K��K��M��N��N��N��M��M��M��L��H��I��J��J��J��J��J��J��J��J��I��H��H��H��G��G��I��H��G��H��I��J��I��H��C��C��B��A��A��A��B��B��N��O��O��O��Q��Q��R��R��S��S��T��T��T��T��T��T��S��S��S��S��Q��Q��Q��Q��Q��R��R��R��T��U��U��U��R��S��S��S��S��R��R��R��S��T��T��T��S��S��S��S��R��S��S��S��S��R��R��S��T��T��S��S��S��S��S��S��S��S��S��S��S��R��T��U��U��U��R��S��S��S��T��T��R��R��S��S��S��S��S��R��S��R��R��R��S��S��T��S��S��S��S��R��R��R��R��S��S��S��S��R��R��T��S��R��R��R��Q��P��P��P��R��S��R��Q��Q��R��S��R��R��S��R��R��R��R��R��R��R��Q��Q��Q��Q��R��R��S��R��R��S��S��T��T��R��R��R��R��P��Q��Q��Q��S��S��S��S��R��T��T��U��T��S��S��R��S��\��f��)D�ql�^F�]=�a=�]8�P*�N'�jC�a:�sL�g>�b8�kA�tH�wI�o>�n:ȉT�u�Ǒ�Ǖ�șج���cܷ���p�x[��j�ʢ�ǚ�ę帏��hͩ���f��x��u껡�eF�J%~C�h<�pD�oG�sQ�D+M J S(S!Փsц^�f�N�}N�W-�gG�odw��l��V��O��P��O��O��O��N��M��O��P��O��O��O��O��O��M��M��N��M��M��M��O��N��M��L��M��L��L��M��N��O��N��N��O��O��M��M��N��O��N��L��L��L��M��L��L��L��K��L��K��K��L��L��L��L��L��K��K��K��J��K��L��L��J��J��J��J��J��J��J��J��J��K��K��J��J��K��K��I��H��I��H��H��I��I��H��I��I��G��G��G��G��F��F��G��G��F��G��G��H��G��H��H��H��H��H��H��I��I��I��J��I��H��I��J��J��K��J��J��J��J��J��J��J��K��L��K��K��J��L��N��M��M��N��N��N��I��I��J��J��I��I��I��J��H��I��I��H��H��H��H��G��H��H��H��I��I��I��H��G��D��C��B��B��B��B��B��C��N��O��O��O��Q��Q��R��S��R��R��S��T��T��T��T��T��S��S��R��R��P��Q��Q��R��R��R��R��R��T��T��U��U��R��S��T��T��T��S��S��S��S��T��U��U��T��S��R��R��R��S��S��S��S��R��R��S��T��T��T��S��S��S��S��S��T��S��S��T��S��R��T��U��V��V��S��S��R��R��R��S��S��T��T��T��S��S��R��R��R��R��R��R��S��T��U��T��T��S��S��S��T��T��S��R��T��T��S��Q��R��S��T��S��T��T��S��Q��P��P��R��S��S��R��R��S��S��R��R��S��R��R��R��R��R��R��Q��Q��S��R��R��R��S��S��R��Q��U��U��U��T��R��R��R��R��S��R��Q��Q��S��U��U��T��S��S��T��S��S��R��Q��Q��S��X��n��&2L�oh�iN�iI�^9�jA�X/�T+�mE�hA�`:�{T�|Q�U؎aۑb׏]ωVЍYƃO�yD�{Eɏ]ǎaǍgʏoŊj�xV�J"�tG†Tʐ^ҜmȓgМuďm��csD*�oVr=�L'�X0Lj\Ѝ`Ћaӎg�~_[$W(]2!T&җyԐkՎbӌ^ʇ\�a:�qS�|t��j��X��Q��S��R��P��Q��P��M��N��O��P��P��Q��R��Q��P��N��N��N��M��N��O��O��M��L��L��L��L��M��N��P��O��P��Q��Q��O��N��N��P��O��L��L��L��M��M��L��L��L��J��J��J��K��K��J��K��M��K��L��K��J��K��L��K��I��L��K��K��J��J��K��L��M��J��J��J��J��J��J��H��H��H��H��H��I��H��G��I��J��H��H��H��H��I��I��J��I��G��G��G��H��G��H��I��I��I��I��J��J��K��K��K��J��J��J��K��K��L��K��K��J��K��K��K��K��K��K��K��J��K��L��N��M��L��M��N��M��J��K��J��J��I��I��I��J��I��J��J��H��G��H��G��E��H��I��I��I��H��H��H��G��E��D��D��C��C��C��D��D��O��O��O��O��R��S��S��S��Q��R��T��U��V��V��U��T��R��R��S��S��T��T��S��S��T��S��S��S��S��S��T��T��R��S��T��T��S��S��S��S��S��T��T��T��T��T��T��U��T��T��T��T��S��S��S��S��V��U��T��T��U��U��T��S��T��U��U��T��S��R��S��T��S��S��S��S��S��S��R��R��U��U��T��T��S��S��R��Q��T��T��U��T��T��T��W��W��S��T��S��R��R��S��T��S��R��S��T��T��S��S��S��T��R��S��S��R��R��S��S��R��R��R��S��S��R��Q��R��T��T��S��R��S��R��Q��S��S��S��S��S��S��S��S��T��T��S��T��U��U��Q��Q��Q��R��T��T��S��S��T��T��T��T��T��T��R��R��R��R��R��S��V��W��o��1E^��{��{ǝwѤzͤxϦzŘo֥}��c�mH�|VÀVȁUԌ\ݑ`ڎ\�bՇV�j��aΆLщO�{G�pA�vN�qJ�nF�N#ܒa؏ZԉP΃J�uA�zI�qI�vT�O0čn�Y7�_7�U+ʆYԊ]҈[ԍcȈe^*Z/Z5#fB,�¢뽙涎䳋Ԥ~��m��n�����j��[��V��W��T��S��Q��O��N��P��O��O��P��O��N��N��P��O��O��O��O��O��O��N��N��O��N��M��L��M��N��Q��R��P��P��P��P��P��O��N��M��L��L��L��L��L��L��L��L��J��K��L��L��K��K��K��K��L��K��J��I��K��K��K��K��J��J��J��K��L��L��L��L��L��L��K��J��I��I��I��J��J��J��I��I��I��J��J��J��K��H��G��H��J��J��J��K��I��I��J��J��J��I��J��K��I��J��K��K��J��J��K��K��J��K��L��M��M��L��L��K��J��J��K��L��L��L��L��K��L��K��J��K��K��J��L��M��I��I��J��J��J��J��K��K��K��I��H��H��H��H��H��G��I��I��I��H��I��J��I��G��F��F��E��D��B��B��C��E��P��O��O��P��S��T��T��T��S��S��U��V��W��W��V��U��T��T��U��U��U��V��T��T��T��S��S��S��S��S��T��T��T��T��T��T��T��S��S��S��S��T��T��T��T��T��U��U��T��T��T��T��S��S��S��S��T��T��U��U��U��U��U��U��U��U��U��U��T��S��T��T��V��U��U��T��T��S��R��R��T��U��U��U��T��T��T��T��T��S��T��T��T��T��V��W��T��T��T��S��S��T��T��S��T��T��U��T��T��S��S��S��U��U��T��S��S��T��T��S��S��S��S��T��S��R��S��U��S��S��R��S��S��R��S��T��T��S��S��S��S��S��S��S��U��V��V��W��T��S��S��R��S��S��S��R��T��T��T��T��V��V��V��T��R��R��S��T��Q��\��q��0H`�Ⱦ�ع�Ҭ�Ϣ�Ϡ�ӥ�ɜ�ɟ�ԭ浍ȒlĊbŊ^ؚk�s�j׏_׊\�n�bԇO�bڃM�p=�W�l?�uI�V(�m��^�[�|@�u<��T�uI܎h�S0Šg�[8�Z4�^5��Uψ\ْfՔjÉd[-[7!mN�k;�l<�o@�sB�j8�f7�pE�wM�rH�kC�k?�l;�p?�uJ�wM�wH�uH�yS�mF�rE�n>�k>�oG�oM�J0J -K OW�n�d�vC�wD�uDۈ\ؐj�o}��w��a��W��X��X��U��S��S��S��T��T��S��R��S��T��T��R��R��R��R��R��R��R��S��S��S��S��S��T��S��S��Q��P��P��P��Q��Q��P��P��N��P��Q��Q��P��P��N��N��M��M��O��O��N��O��P��P��O��N��M��N��M��M��M��M��M��M��N��N��N��M��M��M��N��N��M��L��L��L��M��M��N��N��L��M��N��N��O��O��R��P��N��O��O��N��N��O��Q��Q��Q��Q��Q��Q��P��P��P��O��N��N��N��M��M��M��N��O��N��N��N��N��O��O��O��O��N��N��N��N��N��N��N��N��M��M��N��O��N��M��M��O��O��O��O��O��O��O��O��N��N��N��N��M��L��L��K��L��N��M��N��N��M��K��K��L��I��I��H��G��F��F��E��E��V��U��V��U��U��U��U��V��V��W��W��X��W��W��X��X��W��X��X��Y��Y��Y��V��V��S��T��U��U��U��U��V��W��W��V��U��U��V��V��V��V��V��V��W��W��W��W��Z��X��X��V��V��V��V��V��W��W��X��X��Y��X��W��W��W��X��X��X��W��W��W��W��W��X��X��X��W��W��V��T��V��V��[��[��Z��W��W��V��V��T��S��S��S��S��U��U��W��W��X��W��V��W��V��U��U��V��U��U��V��V��V��V��Z��Z��V��U��V��W��W��V��U��U��X��W��V��V��V��V��V��W��T��T��T��U��V��U��V��W��X��X��X��X��V��V��V��V��X��W��X��X��X��W��W��V��W��W��X��X��Z��Y��Y��X��U��V��X��Y��X��X��Y��Z��X��b��p��'2F��zѐj�~N�Z,�<�eCމ`�_�{C�W�YݍXΆV�sD�tEҌ[хT�}M�OނQ�S�YفQ؂S�M�~M܀Q�~Rڇ[ҁV�zN�wJ�zJ�zJ�|OۃUڄS�yJ�~WڂZσRȂQ�R%�U-��\�sUU%MJ -\ �c��`�O�i6�_0݉]ޓl��s���x��a��W��Y��X��U��R��Q��R��T��T��T��S��S��T��T��S��T��S��S��R��R��S��T��T��S��S��S��S��S��Q��Q��Q��P��P��Q��Q��P��O��L��N��Q��Q��Q��Q��P��P��P��P��O��N��O��O��P��Q��Q��P��L��M��N��N��N��M��M��M��N��N��N��O��O��O��O��N��N��M��M��N��O��O��O��N��N��N��N��O��P��P��O��O��O��P��P��N��N��O��P��P��R��Q��Q��Q��P��P��P��O��N��O��O��N��M��M��O��P��Q��P��O��N��N��N��N��N��N��N��N��M��M��N��N��O��O��O��O��O��N��N��N��P��O��N��M��N��O��O��O��N��M��O��P��O��M��K��K��L��O��N��N��N��M��K��K��L��I��I��H��H��H��F��E��D��U��T��V��U��U��V��V��U��W��W��W��X��V��U��U��U��U��U��V��V��W��W��W��W��W��W��W��V��U��U��V��W��W��W��V��V��V��W��W��W��U��V��W��X��W��W��X��Y��W��W��V��W��W��X��W��W��Y��X��X��W��W��X��X��X��U��U��V��V��V��W��W��X��W��W��W��W��X��W��W��W��X��X��W��V��W��W��W��W��X��W��W��W��W��W��X��X��W��V��U��U��W��W��W��W��Y��X��W��W��Z��[��Z��Z��W��V��V��V��V��V��V��V��W��W��W��W��V��U��U��T��U��U��W��Y��X��W��V��W��X��X��X��X��X��X��X��V��W��W��V��V��U��U��T��T��W��X��Y��Y��X��X��Y��Z��[��Y��X��U��V��W��V��W��[��`��s��0�aBߌd�dځI�t<ߍ]�u樃�oI�e7ϐ[ޕb�sA�m?�g:��f�s@�i8�g6�_�tC�c5�c5�e�zM�e9�f7�V�T�j;�i8�L�Q�f?�mG�zLГf�E �eA՗pȐme8!Y/@]!ߑ`�W�\�wB�e6׈]ݒj��s���w��_��U��V��V��U��U��U��U��T��S��T��T��U��V��V��V��U��U��U��T��T��S��T��T��S��R��R��R��R��S��S��R��R��Q��Q��R��Q��P��O��P��R��R��R��R��P��P��L��K��N��M��L��L��M��P��Q��P��P��Q��Q��P��N��M��L��N��O��O��N��N��P��P��O��N��O��N��N��N��O��O��O��N��P��O��N��N��O��P��O��N��P��O��N��M��M��N��O��P��R��P��O��O��P��P��P��O��N��N��N��O��O��N��M��K��L��N��O��N��M��M��M��L��N��M��M��M��L��M��M��N��P��P��Q��P��O��N��O��P��Q��Q��P��O��P��R��Q��P��P��O��M��M��M��L��J��I��L��L��J��J��J��J��J��J��I��I��H��G��F��F��F��G��T��U��U��T��V��W��W��V��V��V��W��W��U��U��U��U��T��V��W��W��W��V��W��W��W��X��X��X��W��W��W��W��X��W��V��V��V��W��X��X��W��W��X��X��X��X��X��Y��W��W��W��W��X��X��X��W��W��W��X��X��X��W��W��W��V��V��V��W��W��W��W��W��V��V��W��W��W��W��W��W��W��W��V��V��V��W��W��W��X��W��W��W��W��W��W��X��W��W��V��V��W��W��W��W��Y��X��W��W��Z��[��Z��Y��W��W��W��W��W��W��V��U��V��V��W��W��U��U��U��U��V��V��W��X��W��V��V��W��Y��Y��Y��Y��Y��Y��Y��Y��V��U��V��V��V��W��W��W��W��X��X��X��X��X��Y��Z��\��Z��X��U��U��X��V��X��Z��`��r��/=X��vՍe߇W�Z�I(�hGߍe�a�T�SӄY�Y6�Q2�xX��Y�~L׎[�uC�X+�E�a܁L�[(�C��c�R�X(�E�X�S�]-�K�qA�S�\)�H�k9�b�b<�J&w8 �S)�V4�rO��\čfb5Y/CZݏ_�Y��e�~H�e5ӄY�mŕ���s��^��U��T��T��U��U��U��T��T��T��T��T��T��U��V��V��U��U��T��T��S��T��T��U��R��R��R��R��R��S��R��S��R��R��R��R��R��Q��P��P��Q��Q��Q��Q��P��P��O��O��N��M��L��L��M��N��P��P��P��P��P��Q��O��N��N��O��P��O��N��O��Q��Q��P��O��Q��P��P��P��P��P��P��P��O��O��P��P��P��P��O��N��Q��P��P��O��N��N��O��P��P��P��Q��Q��R��R��P��O��N��N��N��N��O��N��M��L��L��M��N��M��M��N��M��L��N��N��N��N��M��N��N��O��P��P��Q��Q��Q��Q��Q��Q��P��Q��Q��P��P��Q��Q��Q��O��O��M��N��N��M��L��K��N��N��L��L��K��K��K��K��I��I��I��I��H��H��H��I��T��U��U��U��W��X��X��W��W��W��W��W��U��U��U��U��T��V��X��X��W��V��W��X��V��W��X��X��X��W��W��V��X��W��V��V��V��X��Y��Y��X��X��X��X��X��X��X��W��W��W��W��W��X��X��W��W��V��V��W��W��W��W��V��V��W��W��X��X��X��X��X��X��X��Y��Z��Y��X��X��X��Y��W��W��V��V��W��W��X��X��Y��Y��Y��X��X��X��X��X��Y��X��X��X��X��X��W��W��Y��X��X��X��X��X��X��W��W��W��X��Y��Y��X��W��V��V��W��W��W��U��U��V��W��W��W��W��W��W��V��V��W��Z��Z��Z��Y��Y��Z��Z��Z��V��V��V��V��W��W��W��W��Y��Y��Y��Y��Y��Y��Z��[��\��\��Z��W��W��V��X��Y��Y��b��t��2@]��ṫ`ۅV�`�L'�d@ي_�]�T�WȁUu:N"lC'�vQ�h<�}N�^�j=�@��g�_�o;�E��i��d�m;�F�[��d�p>�Q�l9��h�}I�V"�h5�k�qMj!Y#yK'�T4�gE��Zɏif3`2#I U׊`�_�a�{F�a1ԀR�jŒ���s��b��V��V��V��V��W��V��T��T��U��U��T��T��T��U��V��U��U��T��T��T��T��U��U��R��S��S��S��Q��Q��R��S��R��R��R��S��S��R��Q��Q��R��R��Q��P��P��P��P��Q��O��N��M��M��O��P��P��P��Q��P��P��Q��P��O��O��P��O��O��N��O��P��Q��P��P��P��P��P��O��O��O��P��P��N��O��Q��Q��P��O��O��P��Q��Q��Q��P��N��N��O��Q��P��P��P��Q��Q��Q��P��O��O��N��N��N��N��N��M��M��O��N��N��M��M��N��L��J��N��O��O��O��O��O��P��Q��S��R��Q��R��S��S��S��R��P��S��T��S��R��Q��Q��R��O��O��N��N��O��O��N��M��N��N��M��M��L��K��K��J��H��I��I��I��H��H��I��I��U��U��U��U��W��X��X��W��X��X��X��X��V��V��V��W��V��W��X��W��W��V��W��X��V��W��X��X��X��X��W��V��X��X��W��W��W��X��Y��Y��Z��Y��X��X��Y��Y��X��W��X��X��Y��Y��Y��Y��X��X��W��W��W��X��X��X��W��W��X��X��Y��Y��Y��Y��Y��Y��Z��[��[��[��Z��Y��Z��[��Y��X��W��W��W��X��X��X��Z��Z��Z��Z��Y��Y��X��X��Y��Y��Y��Y��Y��X��X��X��Y��X��X��X��Y��X��X��W��X��X��Y��Y��Y��Y��X��W��X��X��X��X��V��V��W��X��Y��Y��X��X��W��W��X��Y��Z��Z��Z��Z��Z��Z��Z��Z��W��W��X��W��W��W��V��V��Y��Y��Y��Y��Y��Z��Z��[��]��]��[��Y��X��Y��X��Y��\��d��v��3@`��t˅aقU�`�T0�hDև^�]�U�W�Uo:?L(��g��\�rEވW�m>�A��a�]�zD�L�[�]�xE�H�U��f�yF�R�f1��b�O�Y%�l9�n�jJSk=�W7�\>�Z8�{Rljdg0],I -Z ېh�b�d�G�g5ۇX�n‘����{��b��X��Y��Y��Y��W��W��U��U��V��V��U��T��T��V��W��U��U��U��U��U��U��U��U��T��U��U��T��Q��Q��R��S��R��R��R��S��S��R��R��R��S��S��R��Q��O��O��O��P��P��O��N��N��P��P��P��P��Q��P��O��P��P��P��P��P��O��N��N��N��P��P��P��P��O��P��P��P��O��N��P��P��O��O��O��O��N��N��Q��R��Q��Q��Q��P��O��O��P��R��Q��P��O��O��O��P��Q��Q��O��O��N��N��N��N��N��N��N��N��N��N��N��N��M��L��O��O��O��O��P��Q��Q��Q��S��S��S��S��T��T��T��S��S��U��V��U��R��Q��Q��R��Q��Q��O��O��O��O��N��N��M��M��L��L��K��J��J��I��H��H��H��H��H��H��H��H��U��U��U��V��X��X��X��X��Y��Y��Y��Y��W��W��W��X��X��X��W��V��W��W��X��X��Y��Y��Y��Y��Y��Y��Y��X��X��X��X��X��X��X��X��X��\��[��Z��Z��Z��Z��Y��X��X��Y��Y��Y��Y��Y��Y��Y��X��X��X��X��X��X��X��Y��Y��Y��Y��Y��Y��Y��Y��Y��Y��Z��[��Z��Y��Y��Z��[��[��Z��Y��X��X��Y��Y��Y��[��[��[��[��Z��Z��Y��Y��Y��Z��Z��Z��Z��Y��Y��Y��Y��Y��Y��Y��Y��Y��X��X��Y��Y��Y��Y��X��X��X��X��Y��Y��X��X��X��X��W��W��Z��Z��Y��X��W��X��X��Y��Y��Z��Z��[��[��Z��Z��Y��Z��Z��Z��Z��Y��Y��X��X��Y��Y��Y��Y��Y��Z��Z��Z��Y��Y��[��[��[��[��]��^��b��f��t��3<]�xψhۃ[�c�N.�pOۇb�`�T��[�pM['8V2"˟�Қuӌ^�_�q?�@��b��d�vC�H�]��b�wD�H�R��j�zF�O�p<��a�L�X"�m<�t�gJM_7�aF�vW�hFђi͍gl/c. HV ԏh�h�e�G�d.քT��m������u��a��X��Z��Z��W��W��W��W��U��V��V��V��T��S��T��U��U��U��U��V��W��W��V��T��U��T��T��S��R��Q��R��S��R��R��R��S��T��S��R��S��R��S��S��R��O��N��O��P��P��O��Q��P��P��Q��Q��Q��Q��O��N��O��P��P��P��P��O��O��P��P��P��Q��R��Q��P��Q��Q��P��O��O��O��P��N��N��O��O��O��P��R��S��P��Q��Q��O��N��N��N��P��Q��O��N��M��N��O��Q��R��P��O��N��N��N��O��O��O��L��M��M��N��N��N��O��P��P��O��O��P��Q��R��R��Q��S��T��T��U��T��T��T��T��U��U��U��T��S��R��P��Q��Q��Q��P��P��P��O��N��M��L��K��K��K��K��J��J��J��I��I��H��H��H��H��I��I��V��V��V��W��Y��Y��Y��Z��Y��Y��Y��Y��W��W��X��X��Y��X��W��V��W��X��Y��X��Y��Y��X��X��Y��Y��Y��Y��Y��Y��Y��Y��Y��X��X��X��[��[��Z��Z��Z��Y��Y��X��Y��Y��Y��X��X��X��X��Y��Y��X��X��W��X��X��Y��Y��Z��Z��Y��Y��X��X��X��X��Y��Z��Z��Z��Z��Z��Z��[��\��[��Y��Y��Y��Z��Z��Z��\��\��[��[��[��[��[��Z��Z��Z��[��Z��Z��Z��Z��Z��Y��Y��Y��Y��Z��Y��Y��Y��Y��Y��Y��Y��X��X��X��Y��Z��Y��X��Y��Y��Y��W��V��Y��Z��Y��X��W��X��Y��Y��Z��[��\��\��\��\��[��Z��Y��Y��Z��Z��Z��Y��Y��Y��Z��Z��Z��Z��[��[��\��Z��Y��Z��\��\��[��\��]��_��b��h��w��2;\�|vʇjԂ\ߊc�M/�rTӃ^��c�[�c�nNX%; -F%͡�Кt۔f�]�k8�B�^��d�r?�B�Z��b�yF�G�S��e�{G�M�r>��a��Z�^(�h9�wC)DO*{Y@�tV�a>ƈ_Ɔbg-f1#F O̎gݗf�iсL�e3ЂRݚp������v��_��X��Y��Y��W��V��W��V��U��U��V��U��T��T��T��T��U��U��V��V��X��W��V��S��T��S��T��S��R��R��S��T��S��R��S��S��S��S��S��S��R��S��S��S��Q��P��P��Q��P��P��Q��Q��Q��Q��R��R��Q��P��O��P��Q��P��P��P��Q��P��Q��Q��Q��Q��S��R��Q��P��P��P��O��O��O��P��N��N��P��Q��R��S��S��S��R��Q��Q��P��N��N��N��N��O��N��N��N��O��P��P��Q��P��O��N��N��N��O��O��O��N��N��O��O��N��N��N��P��P��P��O��P��R��S��R��Q��T��U��V��U��T��T��T��T��T��S��R��S��S��S��Q��R��S��R��Q��P��O��N��M��L��L��L��L��K��L��L��K��K��I��H��H��H��G��G��H��H��V��V��X��Y��Z��Y��Y��Z��Y��Y��Y��Y��Z��Z��X��X��Y��X��X��X��X��X��X��X��Y��X��X��X��Y��Y��Y��Y��Z��Z��Z��Z��Z��Y��Z��Z��Z��Z��Z��Z��Y��Y��Y��Y��Y��Y��Y��X��X��X��Y��Z��Y��Y��Y��Y��Y��Y��Y��Y��[��Z��Y��Y��X��X��Z��Z��[��[��[��[��[��[��\��\��[��Z��Y��Y��Y��Z��\��]��\��\��[��[��[��[��]��]��]��]��]��]��Z��Z��Z��[��Z��Z��Z��Z��Y��Y��Y��Y��Z��Z��[��[��Z��Z��Z��Z��Y��Y��Y��Z��Z��Y��X��W��Y��Z��Z��Y��X��Y��Y��Y��[��\��\��]��]��\��\��[��Z��Z��[��[��[��[��[��Z��Y��Y��Y��Z��Z��[��[��Z��Z��Z��]��]��\��\��]��_��_��h��x��2?_��yȏqЈb؍f�S3�sTdž`ԑfّa֏e�mQT!= 8�~ačdٕd�b�m:�? �_�a�vB�E�Z��a߀J�J�W��f�~I�O�p9��`��a�['�mB�oNN:A!jI6tM0�X4�jCnjji5^0!;FǓlȉ]�n΁U�g:҅[ܜy������t��`��X��X��W��V��S��S��T��S��T��V��V��U��U��U��T��V��V��U��V��W��X��W��U��U��T��T��T��T��T��T��U��U��S��S��T��T��S��S��T��S��S��Q��Q��Q��Q��Q��Q��P��P��R��Q��R��R��R��R��Q��P��P��Q��Q��Q��Q��Q��Q��Q��R��Q��Q��Q��S��R��Q��O��O��O��O��O��O��O��O��O��P��Q��R��S��R��Q��R��Q��P��O��O��O��N��N��N��N��O��O��P��O��O��O��P��O��O��N��O��O��P��P��Q��P��P��P��O��N��N��O��P��Q��Q��R��R��R��S��S��U��U��U��U��U��U��U��U��R��Q��Q��Q��R��Q��Q��R��S��R��Q��P��O��N��M��M��L��L��L��K��K��K��J��J��I��I��H��G��I��I��H��H��V��U��W��Y��Y��X��Y��Z��Y��Y��Z��Z��Z��Z��X��X��W��X��Y��Y��Y��X��X��X��Z��Y��Y��Z��Z��Z��Z��Y��Z��[��[��Z��Z��Z��[��\��[��\��\��\��[��Z��Z��[��[��[��Z��Y��X��Y��Z��[��Y��Y��Z��Z��Z��Z��Z��Z��Z��Z��Y��Y��Y��Z��\��]��[��[��[��[��\��\��\��\��[��Z��Y��Y��Y��[��]��^��\��\��[��[��[��[��]��^��^��^��^��]��Z��Z��Z��[��Z��Z��Z��Z��Y��Y��Z��Z��[��\��]��]��]��\��[��[��Y��Y��[��[��Z��Z��Y��X��Y��Z��[��Z��Z��Z��Z��Y��\��\��\��\��\��\��\��\��[��[��\��\��\��[��[��Z��X��X��X��Y��Z��Z��Z��Y��Y��[��]��\��\��[��]��_��_��e��q��3E]���ԧ�ԘsՔl�a>Βp곌籃ךkƋ_�qRT%CgB/�oM��[ۜg�c�yG�C��k�d�tA�D�h�hڂP�I�Y��m�J�R�}G��k�a�[)�rK�bEA:2 -[;,�]@�a=�rKΙyc4 ^4&@F$ ܯ��鮄Џg�sIږo孌������v��a��W��W��V��T��S��Q��R��U��T��V��V��W��V��V��U��W��V��U��U��W��X��X��V��W��V��U��U��U��U��U��U��V��T��T��T��T��S��T��U��T��S��P��P��Q��Q��Q��Q��P��P��R��R��S��S��S��S��Q��P��Q��Q��Q��Q��Q��S��R��Q��R��Q��Q��Q��R��R��R��P��O��P��P��Q��Q��P��P��P��P��P��Q��Q��R��R��P��P��O��O��P��Q��P��P��O��O��P��P��P��P��O��O��P��O��O��N��O��P��P��P��P��N��N��O��P��P��P��Q��P��R��S��S��R��R��S��T��V��U��U��U��V��V��V��U��S��R��S��S��S��Q��P��Q��R��Q��P��P��O��N��N��M��L��L��K��K��J��J��I��I��K��J��I��H��J��J��J��J��Y��Y��X��Y��Y��Z��[��Z��[��[��Z��Z��Z��Z��[��[��W��Y��Z��Y��Z��[��\��[��Y��Z��[��[��Z��Z��Z��Z��Z��[��\��\��\��\��\��]��]��\��[��[��\��]��]��]��Y��Z��[��[��Z��Z��Z��Z��[��Z��Z��[��[��[��[��Z��[��Z��[��]��]��]��\��\��[��[��[��\��\��]��\��[��]��[��Z��[��\��]��\��\��[��\��]��\��\��\��^��_��`��_��^��^��\��\��\��[��\��[��Z��Z��Z��[��\��\��\��\��[��\��\��\��\��[��^��]��[��Z��Z��Z��[��[��[��\��\��[��[��\��\��\��Y��[��\��[��[��[��[��[��]��\��\��]��^��^��\��Z��Y��Y��Y��Z��[��[��Z��Z��Z��\��_��_��]��]��]��^��^��c��x��*?Pƽ����ح�բuߪ�糋縊�‘鷄Óc��`V.Y6"ϭ�佔ܮ|ףjߢkɃP�I�t�uɅV�M�u�uωX�Pڒb�vՍ[�T"ȀN�n�k�]/�kI�e<32 �m^۴�ܰ�əu��rc8'^8+J+G( Ԫ�䷍�˜庐鶋��ġ¯����t��^��S��U��U��V��T��T��T��X��W��V��V��V��V��V��V��V��V��V��V��V��V��V��V��U��S��U��U��U��U��U��T��T��T��T��T��U��T��S��R��S��S��R��R��Q��Q��R��R��Q��P��R��R��S��R��R��T��Q��Q��Q��Q��P��P��O��O��P��Q��R��S��S��R��S��Q��R��R��Q��P��O��P��Q��Q��R��Q��Q��Q��Q��R��R��R��Q��Q��Q��Q��Q��Q��P��O��P��O��N��O��O��O��M��O��P��Q��Q��O��N��O��P��P��N��O��O��N��N��P��P��O��P��Q��R��R��R��R��S��S��R��Q��T��U��W��W��W��V��U��S��R��R��R��P��P��Q��P��P��O��O��N��M��L��L��J��I��J��K��K��I��I��I��J��J��J��I��I��J��K��L��Z��Z��Z��Z��[��[��\��[��]��]��\��[��[��[��Z��Z��X��Y��Y��Y��Y��Z��[��Z��Y��Z��Z��Z��[��[��[��[��]��]��^��^��]��]��\��\��\��\��[��[��[��\��]��]��Z��[��[��[��[��[��[��[��Z��Z��Z��Z��[��[��[��Z��[��Z��[��]��]��\��\��\��\��\��\��\��]��]��\��\��\��[��[��\��^��_��_��^��^��^��^��]��\��\��]��^��a��`��_��^��\��\��\��[��]��\��\��\��[��[��\��\��\��\��\��\��\��\��[��Z��\��\��\��\��[��[��Z��Z��]��]��]��\��\��\��]��]��[��\��\��Z��Z��Z��[��[��\��[��\��\��]��^��]��\��Z��Y��Y��Z��Z��[��[��Z��]��^��_��_��^��]��^��_��_��k�܁��7DM����qOmC�X+�rF�yK�|M��SӜf͗h֤�|N4uK5ɠ�뼐���ߨp�uҕf�qE櫁媀ϔh�{O����ڝp�sGՖj�uחi��R�r��z�tIۛw殓Z5"@"C#��p㵔䳋ץ�ǘzg:'i?/a;&lE(��\�tI�g=�T*�Z.��Vج�ɮ�������i��]��W��X��[��X��V��V��V��V��V��W��W��W��V��V��W��V��V��V��V��W��W��V��V��T��V��U��U��U��U��U��T��T��U��U��T��T��S��S��T��T��R��R��Q��Q��Q��R��Q��P��R��S��S��R��R��T��S��S��R��R��P��P��O��N��R��R��S��S��R��R��R��Q��O��P��Q��P��O��P��Q��Q��Q��P��P��P��Q��Q��Q��Q��P��P��P��P��P��P��P��O��P��P��O��O��O��P��M��M��P��Q��Q��O��O��P��P��P��N��O��O��O��P��Q��R��Q��Q��Q��R��Q��Q��Q��Q��R��R��Q��S��T��U��V��V��V��U��S��R��R��Q��P��P��P��N��N��M��M��N��M��M��K��J��J��J��J��K��J��J��K��K��K��J��J��K��K��K��K��Y��Y��Z��Z��\��\��[��[��^��]��\��\��[��[��Z��Y��Z��Z��Z��Y��Y��Z��Z��Y��[��Z��Z��Z��[��\��\��\��\��\��]��]��]��\��[��[��\��\��]��\��[��[��\��]��[��\��]��]��]��]��]��]��]��\��\��\��]��]��]��]��]��\��\��]��]��\��\��\��\��]��]��]��]��]��]��]��^��^��]��^��^��_��^��^��^��^��^��^��^��^��^��_��_��^��]��]��]��]��]��\��]��]��^��]��]��\��]��^��]��]��]��^��^��]��[��Z��\��\��\��\��[��[��Z��Y��^��^��^��]��]��]��^��^��]��]��\��[��Z��[��[��[��Z��[��[��[��[��\��\��\��^��]��\��\��]��]��]��]��]��_��_��_��_��_��_��c��l��r��n��LGMN7)G e/ �`6�l>�n?�g7�d2�b1�mA�sR�sWl2�cG�f>�g6�^-�zJ��X†a��`ˑiȎf͒j��\Ƌa��Yҕiȋ_ȋ_͎cєgˌ`�R��V��W�}T��b�|`kG1H �ZD�d>�j>�Z4�R0�K1xD,�V:�T1�R)�N"�J�Q$�d8�`3�f=��k������r��k��`��[��X��R��U��V��T��U��V��W��X��W��W��V��X��W��W��V��U��U��V��V��U��T��T��T��S��S��V��V��T��U��U��U��T��T��U��V��T��U��U��T��R��Q��Q��Q��Q��Q��T��T��S��R��S��U��T��S��S��S��R��R��O��O��R��R��R��R��S��S��S��S��P��R��R��Q��Q��R��S��R��Q��P��Q��Q��R��R��R��R��Q��Q��P��Q��Q��Q��P��O��Q��P��P��O��M��M��M��M��P��Q��Q��P��P��P��Q��Q��O��O��P��O��P��Q��Q��Q��P��P��P��P��O��O��Q��Q��R��Q��Q��Q��R��S��U��U��S��Q��Q��Q��Q��Q��Q��R��O��N��M��M��N��N��M��L��K��J��K��K��K��J��K��M��K��J��J��J��L��L��K��J��Y��Z��Z��[��\��\��\��[��^��]��\��\��]��]��\��[��[��[��[��Z��Z��[��[��Z��]��\��[��[��\��\��\��\��[��[��[��\��]��]��[��Z��]��^��^��^��]��\��\��\��\��\��]��]��\��\��\��]��_��^��^��^��^��_��_��_��]��]��]��]��]��]��\��\��\��]��^��^��]��]��^��_��_��^��^��^��^��^��^��]��^��^��]��]��^��^��_��_��^��^��]��]��]��^��^��^��]��]��^��^��^��^��^��^��]��]��]��^��^��^��]��]��]��\��[��[��Z��Z��[��[��_��_��^��^��^��^��^��^��^��^��^��\��\��\��]��\��\��]��]��]��\��\��\��]��_��^��^��^��^��^��^��^��]��\��\��^��_��`��`��f��V��*Ly34HC*-X2%l8 �A!�e>�vH�s@�vD�M�uB�mA�iH��g:�b6�f7�Z.�U(�]1�e7�\.�c8�Y6Y*I�E,�mC�q@�V,^�V8�`@�`>�d<�R*�[/�]0�S%�l?�oB�oA�oM�bV}mxj��i��d��^��_��Y��Z��W��V��V��W��X��X��W��W��V��X��X��W��V��V��V��W��V��S��T��T��T��S��S��W��X��U��V��W��V��U��U��V��W��U��U��U��U��R��R��Q��Q��Q��S��V��V��T��S��U��V��S��S��S��S��S��S��Q��P��R��Q��Q��Q��R��S��S��T��R��S��S��S��S��T��T��S��R��R��S��R��R��S��S��S��R��R��Q��R��R��R��Q��Q��Q��P��P��O��M��M��L��L��Q��Q��Q��P��P��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��P��P��P��P��O��P��R��R��R��Q��Q��R��S��S��V��U��S��R��R��R��R��R��R��R��R��Q��N��N��O��O��N��L��K��J��J��K��K��K��L��M��L��K��J��J��L��L��K��J��[��[��\��]��^��^��]��]��_��^��]��^��^��_��^��]��^��^��]��]��^��^��^��^��^��^��^��^��]��]��^��_��_��_��_��`��`��`��_��]��`��`��`��`��`��`��_��^��]��]��]��]��\��\��\��\��_��^��]��]��^��^��^��^��^��^��_��^��^��^��^��]��]��^��^��^��^��^��^��_��_��_��_��`��a��a��_��_��`��_��^��]��\��\��\��\��^��^��^��^��^��]��^��^��^��^��^��_��_��_��^��]��^��]��]��]��^��^��^��^��]��]��]��\��[��[��\��\��_��_��_��_��_��^��^��^��]��^��^��^��^��^��^��]��]��^��^��^��]��\��]��^��_��^��_��_��_��_��^��]��\��[��[��[��_��b��c��j��r��8NuJ8Fe96p�m<�yÌV�{S�{P�wH�xI�~N�wH�yJ�sD�yH�xG�xG�p@�o<�n>�n=�rB�{JрI�}J�oG@!J�T:�vI�vD�`5p%�Z6�^7�a8�h>�b9�f;�d5�o>�Z�R�Q�}Q�e�ro���x��c��X��Z��W��Y��Y��Z��Y��Y��Y��X��X��W��W��W��V��V��V��V��W��W��X��S��T��U��T��S��T��W��Y��W��W��W��W��W��W��W��X��W��W��V��V��U��U��R��Q��R��S��T��T��T��T��T��U��R��R��S��S��S��S��Q��Q��Q��Q��R��Q��Q��Q��R��R��R��S��S��R��R��S��T��S��U��U��T��T��S��S��S��S��S��S��R��R��S��S��S��R��Q��Q��P��P��O��O��M��M��Q��Q��Q��Q��Q��Q��Q��Q��R��R��R��R��R��R��R��R��P��P��P��P��O��P��Q��Q��Q��Q��S��T��T��U��T��S��V��U��T��S��R��R��P��O��Q��O��N��M��N��N��L��K��K��J��J��K��L��K��K��L��M��K��J��J��K��L��K��K��[��\��]��]��^��^��^��^��_��_��^��^��^��^��]��]��_��^��]��]��^��^��^��_��]��^��^��^��^��^��_��`��a��a��a��a��a��`��_��^��_��^��_��`��a��a��a��`��_��_��_��^��]��]��]��]��_��^��]��]��^��^��^��^��^��_��_��_��_��_��_��^��^��^��^��^��^��^��_��`��`��`��a��a��a��a��_��_��_��_��^��^��]��]��]��]��`��`��`��_��^��]��]��]��`��`��_��_��_��_��^��\��_��^��]��]��]��]��^��^��]��^��_��`��^��^��]��]��`��`��`��`��_��_��_��_��]��]��^��^��^��_��^��]��\��]��]��]��]��]��^��^��^��^��_��_��`��_��^��]��_��]��Z��Z��`��c��c��j��{��Wg�[@Gk90e-l+�@%�i�^��N�P߁K�yB�xF݃`�U:q �w[݄\݁P�S�~JׁR܅X݅W��V�W�}K݁P�~K�L�uB�P�O�zG�wD�{H�uC�xF�U߆NދW؍e�kKV�X>�^��V�uL�0 -�wO�mA�[-�]0�d<�iA�[/�g7�\�W�{F��T҆d�����s��b��^��^��X��X��\��\��[��Z��Y��X��X��W��W��Y��X��W��W��V��V��V��V��U��V��V��U��T��T��W��W��W��W��W��W��X��X��X��W��W��W��V��V��V��V��S��R��R��S��S��S��T��U��U��T��S��S��S��S��S��S��Q��Q��Q��Q��R��R��Q��R��S��S��R��S��S��R��R��S��T��S��U��U��U��T��S��S��S��S��T��S��R��R��S��S��R��R��R��R��Q��Q��P��P��N��P��Q��P��P��Q��Q��Q��Q��Q��P��P��Q��R��R��Q��Q��Q��Q��Q��Q��P��P��P��P��Q��Q��R��T��U��V��U��T��T��T��S��S��Q��Q��Q��O��N��O��N��M��M��M��M��M��L��K��K��K��L��L��K��K��K��M��L��K��J��K��K��L��L��[��\��]��]��]��]��^��^��`��`��_��_��^��^��^��]��`��^��]��^��_��_��_��`��_��_��`��`��a��a��a��a��b��b��b��a��`��`��_��_��_��_��`��`��a��a��a��a��`��`��_��_��^��^��^��_��_��^��^��^��_��`��`��`��^��_��`��_��_��_��_��_��_��_��^��_��_��`��`��`��b��b��b��b��b��a��_��^��^��_��^��^��^��^��_��a��_��_��`��_��_��_��_��_��`��`��`��`��b��a��a��a��_��_��^��^��^��^��^��^��^��_��`��a��_��^��^��^��a��a��a��a��`��`��`��`��]��^��^��]��^��_��_��^��[��\��]��^��^��^��^��^��_��_��_��_��`��`��a��`��a��`��Z��Z��_��a��a��h��z��`q�rXWd3"b2l4�A"ۇb��j��[�r?�e/�v?�~M��u�[Bx �d�]�O�W�I�q:�r?�}N�wH�m>�sB�qA�n>�k;�a/�P�R�wF�p?�wF�}N�tE�q?�|FڀN�wR�M2] -�XE�c�[�}X�2 �zR�R�f9�Y.�9�>�iA�l@�b�`�o<�{I�|WÕ����s��d��\��V��T��T��[��\��[��Z��Y��Y��Y��X��Y��Z��Z��Y��X��U��T��S��S��U��U��U��U��U��U��U��U��W��V��V��W��X��X��W��V��W��W��W��X��X��W��U��T��S��S��S��R��S��T��V��U��T��U��T��T��T��S��Q��R��P��P��R��R��S��S��T��T��T��U��T��T��T��V��V��U��T��T��T��T��S��S��S��T��U��U��T��S��R��R��R��R��R��R��R��Q��Q��P��Q��Q��Q��P��P��Q��R��Q��P��Q��P��O��P��Q��Q��P��P��P��P��Q��Q��Q��P��P��Q��R��S��T��U��U��U��T��T��T��P��Q��Q��P��P��Q��P��N��N��N��N��M��L��L��M��N��M��L��L��L��M��K��K��K��L��L��K��J��J��J��I��I��]��]��^��^��^��^��_��_��a��a��b��b��`��`��`��a��b��`��^��_��`��`��`��`��b��b��b��b��c��c��b��a��b��b��c��b��a��`��a��a��a��b��b��b��a��a��a��b��`��`��_��_��^��^��_��`��^��^��]��^��_��`��a��b��]��_��`��_��^��_��_��_��`��_��_��_��`��a��a��a��`��a��b��b��b��b��`��`��`��a��`��`��^��^��_��a��^��_��`��`��a��`��a��a��_��`��`��a��b��b��c��d��_��^��_��_��`��`��`��`��_��_��_��_��_��_��_��`��a��a��b��a��a��a��`��`��_��_��^��]��^��_��`��_��]��]��^��_��_��^��]��]��a��`��`��`��`��a��b��b��a��`��[��[��_��`��_��f��{��hx��sm�_HEL�L,؆`�c�U�U�Q�Z!�~L��m�[At�z_�]�O�O��X�R�S�uE�pD�kA�g=�pG�vJ�_�|O�P�\��_�\�|L�rF�h<�k?�qC�~S�p�U=Y�_L�g�]�\�8�W�tG�uE�xK�lI�/ �`8�l@އ\�g߁N�d2և^“����p��d��Y��V��_��[��X��[��Z��Z��Z��Z��Z��Y��Z��X��X��X��X��V��V��V��V��T��T��V��U��X��W��Y��Y��W��V��U��V��X��X��W��U��W��W��W��X��X��X��U��U��T��T��S��S��S��U��U��U��S��U��U��U��T��T��R��S��R��R��T��T��S��S��S��S��T��T��T��S��T��V��V��V��T��T��T��T��T��T��T��U��V��U��T��T��R��R��R��R��Q��R��R��Q��Q��P��Q��Q��Q��P��O��Q��R��Q��P��Q��R��Q��Q��R��R��P��P��P��P��Q��R��R��R��S��T��U��U��U��U��U��T��S��T��T��R��S��S��R��R��S��Q��O��M��N��N��M��K��K��L��M��O��M��L��L��L��K��K��K��J��K��K��J��I��H��G��G��Z��[��_��a��b��a��a��c��a��a��a��b��c��c��`��_��a��a��a��b��b��b��`��_��b��a��`��`��`��a��c��c��c��c��c��c��c��c��a��`��a��a��`��_��^��^��_��`��a��a��`��`��`��`��`��`��`��_��_��_��a��a��a��`��_��`��b��b��a��a��a��b��b��a��b��c��c��b��b��c��`��a��b��c��c��b��a��`��^��^��^��_��_��_��`��`��_��_��_��`��a��a��`��`��`��`��`��a��a��a��`��`��`��`��a��a��`��`��a��b��`��`��a��a��b��b��b��a��b��_��_��_��`��`��_��_��^��_��_��_��^��^��_��_��^��_��_��^��]��\��^��_��b��a��`��`��a��a��`��_��b��a��`��]��]��]��_��h�郮�ow��sk�v^Z&M�H)݋e�]��[��^��]�y>�|F�j�Z9o�}a�X�J�H�R��N�w@�_0�Dn*Z�=�]<�wT�xP�Q��U�T�zJ�a2�Er)g"�@ �dH�zb�YC[ -�]C�a�]ۃ_�6�uN�qE�P�xH�{S�L'�R)�j;��T��d��fہO�}S—����u��c��Z��Y��X��Z��\��\��\��[��[��Z��Y��X��X��Z��Y��W��X��Y��Y��U��T��W��X��Y��W��Y��Y��Z��X��[��Y��X��W��W��W��W��X��Y��Y��X��X��X��X��U��T��T��S��T��U��U��T��T��T��T��S��S��U��V��U��T��U��T��U��T��S��T��U��V��V��S��U��V��T��S��S��T��T��U��V��V��T��U��V��U��Q��U��U��U��T��T��T��T��S��S��T��T��U��U��T��Q��P��O��P��P��Q��Q��Q��Q��P��S��R��R��R��R��P��P��Q��S��T��U��S��R��S��T��U��S��T��U��U��S��Q��Q��Q��S��R��Q��Q��Q��Q��P��O��O��N��L��L��M��M��L��L��K��K��L��M��M��K��L��L��L��L��L��L��K��J��H��G��[��[��_��a��b��a��a��b��b��b��b��b��b��c��a��`��b��b��b��c��d��d��b��_��`��`��a��b��b��b��c��b��a��b��b��c��d��d��c��b��`��a��a��a��a��`��`��_��`��`��`��`��`��a��a��a��a��a��`��`��`��`��`��`��`��`��b��b��b��b��b��b��b��a��b��c��c��b��b��c��`��a��a��b��b��a��a��`��_��`��`��`��`��`��a��a��a��`��`��_��`��`��a��a��`��`��`��a��b��b��a��a��`��`��`��`��`��`��`��`��b��b��c��c��c��b��c��a��^��_��_��`��`��a��a��a��_��`��`��`��`��`��`��`��`��`��`��_��_��^��_��`��c��b��a��a��b��b��a��`��a��`��a��`��]��\��_��h�녮�rw��zr�~fh2O�J,݉d�[��Y��X��X�C߁K�g�[9o"�}`�Z�N��N�P�{@�k3�b5�jD�tT�_CTl& �gH�|V�}L�T�s?�h6�b3�mD�vU�[?Zg#�qZ�YCW �\>�]�Wڀ]�4�sN�mA�O�tB�tK�G!�X,�k9�P��_��g�\�~R������s��f��\��Y��X��Y��[��\��\��\��[��Z��Y��Y��Y��X��W��W��X��Y��Z��W��X��W��Y��Z��Y��Y��Z��Z��Y��[��Z��Y��X��X��Y��X��X��W��W��V��U��V��W��U��T��U��T��T��U��U��T��S��U��U��U��U��U��U��T��T��T��U��U��U��T��U��W��V��U��S��T��U��T��T��U��U��T��U��V��V��T��T��U��T��R��T��U��U��T��T��T��T��S��T��T��T��T��U��U��T��S��P��Q��R��R��R��R��Q��P��Q��P��Q��R��Q��P��P��Q��S��U��V��U��T��T��S��S��S��S��T��T��S��S��R��R��T��S��Q��Q��Q��P��O��N��N��N��L��L��L��L��L��L��L��L��L��L��K��J��L��M��K��L��L��L��L��K��J��I��]��]��_��a��c��b��b��b��d��c��b��b��b��c��a��a��d��d��d��e��f��d��c��a��a��b��c��d��e��d��d��c��b��b��b��c��d��d��d��d��`��`��`��a��a��a��`��_��`��`��`��`��`��a��a��b��a��a��a��a��`��`��a��a��a��a��`��a��a��a��a��a��`��`��`��a��b��a��a��b��b��a��a��b��c��c��b��a��c��c��b��b��b��b��b��b��b��b��a��a��a��a��a��a��a��a��a��a��b��b��a��a��a��a��`��a��a��a��`��_��a��a��a��a��c��c��c��c��_��`��a��a��a��a��a��b��`��`��a��a��a��a��a��a��a��`��`��`��`��`��`��a��c��b��a��b��c��c��b��a��^��_��a��a��^��]��`��i�섭�ns��zr�}el6L�H*چa�Z��\��Y��W�H�N�g�\:o# �{^�X�K��Q�O�r7�k6ۑdҘr�{X�~^�T;Y �T6�lD܀M�L�r:�n9�mȑj�oM�z^zF0X�]I�N9U �cG�a�Vڀ[�5�uP�k?�R�sA�sJ�H"�T+�h9�R��^��b�`�{Q������t��f��\��Z��X��Z��[��Z��[��[��[��Z��Y��Z��Z��X��X��X��Y��Z��Z��Z��Y��X��Y��Z��Y��X��X��Y��Y��Z��Y��Y��Y��Y��Y��X��W��W��U��T��S��S��U��V��U��U��U��U��U��U��T��T��U��V��U��T��T��U��U��U��U��U��U��U��U��V��X��V��T��S��T��T��T��U��U��U��T��U��V��V��T��S��T��T��S��R��S��T��S��S��T��S��R��R��R��R��R��S��S��R��R��Q��Q��S��S��S��R��Q��P��Q��P��P��Q��R��R��R��R��S��T��U��U��T��T��S��R��S��R��R��S��S��T��S��S��R��Q��P��P��P��P��P��O��N��N��M��L��L��L��L��M��N��M��M��M��L��K��L��M��K��L��K��L��L��K��K��J��^��^��a��b��c��c��c��c��e��d��c��d��d��d��b��c��e��e��f��f��f��e��c��b��d��c��c��d��d��e��f��f��e��e��d��d��d��d��d��d��a��`��`��`��a��a��a��a��`��`��`��`��a��a��b��b��a��a��a��a��a��a��b��c��b��a��a��a��b��c��b��b��a��a��a��b��c��b��c��c��c��b��b��b��c��d��c��c��d��d��c��b��b��b��b��b��b��c��c��d��d��c��b��a��c��b��b��a��b��a��a��a��b��b��b��b��c��b��b��a��`��a��b��b��c��c��d��e��a��b��b��b��a��a��a��a��a��a��a��b��a��a��`��`��a��`��`��`��a��a��a��a��c��c��b��b��c��c��c��b��_��`��c��`��_��_��a��k��qv��zr�yag1L�I+݋e�V��Y��Y�U��EۀI�d�[9n" -�|^�Y�~G�O�O�p6�u?ؗm�e?�vS��v}Y?n<#�E'�rM�L�T�p8�}J͐d�eA�pP��pxK6g/�M9�Qo# Յj�f�N�N�K�m5�yGʔn�^>�}`��i|`K�\H�I0�kJ؂Q�H�m9�|N��d�_A�x`��u|[L�\LyF3�O;K�^>چX߄U�{R�3 �pG�h<�Q�o=�oF�J&�U-�g;ہO�\��a߄U�xN������u��g��^��\��\��\��]��\��\��\��[��[��\��\��\��[��[��[��[��Z��Z��Z��Z��[��Y��W��X��[��[��Z��Y��Z��Z��Y��X��Y��Z��[��Z��X��X��Y��X��X��X��W��V��W��X��X��W��Y��Y��Y��Y��V��W��W��W��V��V��U��T��U��V��V��T��U��U��V��W��V��V��W��W��V��U��U��U��U��T��S��T��U��V��V��U��T��U��T��S��S��S��S��R��S��R��Q��Q��R��S��S��T��T��S��R��Q��Q��Q��R��S��S��R��Q��Q��R��S��T��S��S��U��V��U��U��T��S��Q��S��S��R��R��Q��Q��Q��R��Q��Q��P��P��P��P��O��O��N��N��N��N��M��M��N��N��O��M��L��M��N��M��M��M��K��K��K��L��L��L��K��K��d��e��g��f��f��g��h��h��i��h��g��g��g��g��e��d��i��h��g��g��h��h��f��f��f��f��h��h��i��i��h��g��e��f��f��f��e��e��e��f��c��d��f��e��d��c��d��d��b��c��d��d��c��b��b��c��d��d��c��c��d��d��c��c��b��c��d��d��d��c��c��c��c��b��c��d��f��e��e��f��f��f��g��g��d��c��d��d��f��e��e��e��d��d��d��d��e��d��c��b��c��c��d��d��c��c��c��d��d��d��d��c��b��b��b��b��b��b��b��b��a��a��b��b��c��d��f��f��e��e��e��e��e��e��e��e��f��f��f��f��f��f��f��e��f��f��f��f��f��f��e��e��f��e��e��d��d��d��c��c��a��a��c��`��`��`��b��n��vx��un�}fb*P�F*ۉd�]�U�U�S�G�{F�e�\�oE�K&�R-�g;��T�a�_�Z�wM������x��h��_��]��\��\��]��\��[��Y��Y��Z��Z��\��\��\��\��[��[��[��[��\��Z��[��Y��X��Y��Y��X��W��W��Y��Y��X��X��Y��Y��Z��Y��Y��X��Y��Y��X��Y��Y��X��Y��Z��Z��Y��Y��Z��Y��X��W��W��X��V��U��U��U��T��T��U��V��T��T��T��U��U��U��T��T��U��U��T��S��S��S��S��R��S��S��T��T��T��S��S��R��Q��Q��Q��Q��P��Q��P��O��O��P��P��Q��R��T��S��R��R��R��R��S��S��S��S��Q��P��Q��S��S��R��R��T��V��U��T��S��R��Q��S��R��R��Q��Q��Q��Q��P��Q��Q��P��P��P��P��P��P��O��N��N��N��N��O��O��N��N��M��M��M��M��L��L��N��L��L��L��M��M��M��M��M��f��g��h��g��g��h��i��h��j��i��g��g��g��g��f��f��j��i��g��g��i��j��h��g��g��g��h��h��h��h��h��g��d��e��e��e��e��d��e��e��e��f��g��e��c��c��e��g��b��c��e��e��d��c��c��c��c��d��d��e��e��e��e��e��b��c��d��d��d��c��e��c��f��d��f��g��g��f��f��g��e��f��g��f��c��b��b��c��f��f��f��f��e��e��e��e��d��d��d��d��e��e��d��d��e��e��e��e��e��d��c��b��d��d��c��c��c��c��c��b��d��d��d��d��e��e��g��f��e��f��f��f��e��e��e��f��f��f��e��e��f��g��g��f��f��f��g��g��f��f��e��e��f��e��d��d��c��c��b��b��a��a��c��a��a��a��c��n��uw��sl�|ec*N�E)܊e�\��Y�X�T�K�vB�`�`@o# сf�^�P�T��N�r=�}MΠ|�eI�yb�zfv[J�ZG�C*�oKނS�M�j8�zLk�gJ�tc�ymtYN�^Ro@0�I5K�^?܈ZބRՁU�6�sI�pC�P�q>�oD�I$�V0�g=݅U�a�`�h�xN������x��h��_��]��\��\��]��\��[��Y��Y��Z��[��\��\��^��]��]��]��]��\��]��[��Z��Y��Y��Z��Y��X��W��W��Y��Y��Z��Z��[��Z��[��Y��V��W��X��W��W��X��X��X��X��Y��Z��Y��Y��Y��Y��U��W��W��X��V��U��V��V��V��S��T��T��T��U��U��U��T��T��R��R��S��U��T��S��R��S��S��S��T��S��S��S��T��R��R��R��Q��Q��R��S��R��R��R��Q��Q��Q��Q��P��P��S��S��S��R��S��S��S��S��T��S��R��Q��R��T��U��S��R��T��U��T��R��R��S��S��T��R��Q��Q��R��R��Q��P��R��R��Q��Q��P��O��O��O��O��O��N��N��O��O��O��N��M��N��O��O��M��K��L��N��N��M��M��M��M��L��L��L��f��g��h��h��h��h��h��i��h��h��i��i��i��i��h��g��g��j��k��j��g��g��g��g��g��g��g��g��f��e��f��f��g��g��f��d��d��d��e��f��g��g��g��g��h��g��f��f��f��g��g��f��f��g��h��j��h��g��g��g��f��f��e��d��g��h��g��g��h��i��j��h��h��h��j��j��j��i��i��j��g��h��h��g��g��h��h��g��h��h��h��h��e��d��e��g��e��e��e��f��f��f��e��e��d��e��e��e��e��e��e��e��f��e��e��d��c��b��c��c��e��d��b��c��f��g��g��g��h��h��h��h��g��g��g��g��g��g��g��f��f��f��f��f��f��e��e��f��g��g��e��d��f��e��e��e��e��e��d��d��b��c��f��d��c��a��c��m��oq��un�xae,O�E)ڈc�[�X�T��Y�}C�zG�c�]>q# ևi�`�T�P�S�k7�}MȞx�lN��n�yhs\J\F}D'�nG�~R�P�e5�vH��k�iJ�ra�xosXQ|ZPsC5�M:L�bB؂S�SڃX�2 -�wO�qC݁N�n;�nC�J%�S.�e;݅U�_��c�^�{Q������x��l��c��^��\��]��^��\��\��\��[��[��\��^��]��]��]��[��[��\��\��[��X��Y��X��Y��Z��Z��Z��Y��X��\��\��\��[��Z��Z��[��\��X��Y��Z��Y��Y��Y��X��X��]��\��[��Z��Y��Y��Z��X��X��V��T��S��T��U��V��W��V��W��W��V��U��U��U��U��T��T��T��T��U��U��T��S��T��T��T��S��S��R��R��R��R��R��R��R��S��S��S��S��R��R��R��R��R��Q��Q��P��T��S��R��Q��Q��Q��R��R��Q��Q��Q��S��S��S��S��T��T��S��R��R��R��R��R��R��R��R��R��R��S��S��R��Q��Q��S��T��R��P��O��M��M��L��L��N��N��M��N��P��R��P��O��N��N��N��M��M��L��L��L��L��L��L��K��K��K��e��g��h��j��k��j��j��j��j��i��i��i��h��h��h��h��h��i��i��h��f��g��h��h��h��h��h��g��g��f��f��g��e��f��f��f��e��e��e��e��f��f��g��h��i��h��f��e��g��g��f��f��f��g��h��i��h��h��i��i��h��g��g��h��i��i��i��h��j��k��k��j��j��j��j��j��j��j��j��j��h��i��j��i��h��h��i��h��i��g��g��h��f��e��f��f��f��f��f��f��f��f��f��e��e��e��e��f��f��g��f��e��e��e��e��d��d��c��c��d��e��e��d��d��g��h��h��h��g��g��h��h��g��f��f��g��f��f��f��f��f��f��f��f��g��f��f��f��g��g��f��e��f��f��e��f��f��f��e��e��c��c��e��e��b��b��d��n�튰�qs��sl�u^c+O�E)ڈc�Z�V�U�Z�H�xE�b�Z;p" օh�]�T�S�V�l8�{KϨ�uU��n�|lwbQ�`I|G'�nG݂U�Q�h8�yHØm�mK�p_�votYRZRtC5�K9M�hH��Z�XقW�3 �vN�oC܂N�o;�lC�I$�T/�f<݅U�_��d�_�{R������z��k��b��]��]��`��a��]��]��]��\��\��]��_��^��`��^��\��[��\��^��]��\��Y��X��Y��Y��Z��Z��Y��Y��\��\��\��[��Z��Z��[��[��X��Z��Z��Y��Y��Y��Y��Y��Z��Z��Z��Z��[��[��\��Z��W��V��V��V��V��U��U��U��V��W��W��V��U��U��U��V��T��T��T��T��U��U��T��S��V��V��U��T��S��S��T��U��S��T��T��T��S��S��S��T��S��S��S��R��R��R��R��R��T��S��S��S��R��R��R��R��T��S��S��S��S��R��Q��R��T��S��S��R��R��R��S��S��S��S��S��T��U��T��R��P��R��S��S��Q��Q��Q��O��N��O��N��O��M��M��M��O��O��O��O��N��N��N��M��M��L��L��L��M��M��L��L��L��K��f��g��i��k��l��l��l��l��k��j��j��i��i��i��i��i��i��i��h��g��f��g��h��h��g��g��g��g��g��g��g��g��h��i��i��i��i��h��h��h��i��j��j��k��l��k��j��i��k��j��i��i��j��k��k��l��i��k��l��k��j��j��k��l��l��l��l��k��l��l��m��k��m��l��k��l��m��m��l��k��j��k��k��j��i��i��j��i��j��h��g��h��i��i��i��i��f��e��e��e��f��f��e��e��f��e��e��f��h��h��g��f��g��g��g��e��e��e��e��f��g��h��h��h��i��i��j��j��h��i��i��i��i��h��h��h��i��i��i��i��i��i��i��i��h��g��g��g��h��g��f��e��f��f��f��g��g��g��f��f��d��c��e��e��c��c��f��p��rt��pi�t]a+N�D'Յ`�X�V�W�Z�K�wG�a�W7p$ -ևh�Y�S�U�S�l9�xIخ��zX�|f�vfu`O~^G~I'�rI߄W�P�l9�yHǜo�rN�q_�vouZSZRt@3�H6M �iH�[�U�}R�0 �tN�j@ہO�n:�lC�J%�Q+�c9ۃS�^��b�`�|S—����z��k��c��]��]��`��`��\��]��\��\��]��^��_��^��_��^��]��\��]��^��^��]��[��[��[��[��\��\��\��\��^��]��]��\��\��\��\��\��Y��Z��Z��Y��[��\��\��\��[��[��[��[��[��[��[��Y��W��V��W��X��X��W��V��U��W��W��X��W��V��U��V��V��U��T��T��U��U��U��U��T��U��U��T��S��S��S��T��U��S��T��U��T��S��R��S��T��T��T��S��S��S��S��T��T��R��R��U��U��U��T��S��S��S��S��S��T��S��S��R��S��T��S��S��S��S��S��S��T��S��S��S��T��U��T��S��R��S��S��R��Q��O��P��O��M��P��N��L��K��M��M��N��M��N��N��N��N��M��M��M��M��M��M��M��M��M��L��L��L��g��h��h��i��j��k��l��m��j��k��k��k��k��j��i��h��j��i��h��h��h��h��i��j��h��g��g��g��i��j��k��j��k��k��k��k��j��j��k��l��m��l��l��l��l��m��n��n��m��l��k��k��l��m��m��m��k��l��l��l��l��l��m��n��m��n��m��m��m��m��m��k��n��m��l��l��m��m��m��l��l��k��j��i��i��j��j��i��j��i��i��i��i��i��i��i��g��f��f��f��f��f��f��f��f��f��f��g��h��h��h��g��h��i��i��i��h��f��g��g��h��h��i��i��k��k��j��j��j��j��k��k��k��j��j��j��l��k��k��j��j��j��i��i��i��h��h��h��h��g��g��f��f��g��g��g��g��g��g��f��d��f��f��f��f��f��g��q��qs��md�u^c-N�C&Ԅ_�W�X�X�[�L�zI�a�T4r& يk�Z�T�V�Q�m:�vH۰��~\�yc�vfvaP_H�L*�uM��U�N�j8�vE˟r�uR�ra�zpx]V~YPs?1�H5L �fE݅W��Q�yQ�1 �uP�h>فO�l:�jA�I$�N(�c8ڂP�_��a�]�yNÖ����z��l��e��_��^��_��^��[��\��\��\��]��^��_��^��]��]��^��]��^��_��^��\��]��]��\��]��]��^��^��^��a��_��^��^��_��_��^��^��[��[��[��Z��\��]��^��]��]��]��]��\��[��Z��Y��Y��W��V��W��W��X��X��X��X��W��X��X��X��W��V��W��X��U��U��T��U��V��V��U��T��S��T��T��T��T��T��T��T��T��T��U��U��T��T��U��V��U��T��T��T��T��T��U��U��T��T��V��W��V��V��U��U��T��S��T��U��U��T��T��U��T��S��S��S��S��T��T��T��U��T��S��R��S��T��U��T��T��T��S��R��O��O��N��M��N��M��L��L��N��N��O��O��N��O��O��O��N��M��M��M��M��M��M��M��M��L��L��K��i��h��h��h��i��j��k��l��k��k��l��l��l��k��j��i��k��k��l��l��l��k��k��l��l��k��k��k��m��m��n��m��l��l��l��k��l��l��m��m��o��n��n��m��n��o��p��p��n��m��l��l��m��m��m��m��m��m��m��m��m��n��n��n��m��n��n��m��m��m��l��j��l��l��l��l��k��k��l��l��l��k��j��i��j��k��i��h��j��j��j��j��i��i��i��j��k��j��i��i��j��j��j��i��h��i��j��j��j��i��j��j��k��k��k��j��j��i��j��j��k��k��k��l��n��n��m��l��l��l��m��m��l��l��l��l��l��k��k��j��j��j��i��i��j��i��i��i��h��h��g��f��g��g��g��g��g��g��e��e��f��f��g��h��g��g��g��q��oq��kb�w_f0N�G'׉b�W��\�[�\ހJڀN��b�S2s) ٍk�]��T�V�O�m;�vH۬��~\�{d�ziybR�\I�G)�oI�V�M�h5�sBϞs�vV�ta�{p{`W}YMs@/�K5N�gF߇Y�T�}V�3�yV�kCڂR�j8�g?�G"�P*�h=߇U��d��`�]�wL������|��o��g��a��`��_��_��^��_��_��_��`��a��`��_��[��\��]��]��]��]��]��[��_��^��^��^��_��`��`��`��a��`��^��^��_��`��_��^��^��^��]��\��\��^��^��^��\��\��]��]��\��[��[��Z��X��X��X��X��X��Y��Y��Y��W��X��X��X��W��W��Y��Z��V��U��U��U��V��W��V��U��T��U��V��V��V��V��V��V��X��X��X��X��X��Y��Y��Y��V��W��W��W��W��W��W��W��U��U��U��T��V��V��V��V��W��V��V��V��V��U��U��U��U��U��U��U��U��U��U��U��V��T��S��R��S��T��T��T��S��T��R��P��N��N��M��M��L��L��M��M��N��O��P��Q��O��O��P��O��O��N��L��K��K��K��M��M��M��M��L��L��j��i��j��j��k��k��k��k��m��m��m��l��l��l��m��m��n��o��p��o��o��n��n��n��o��n��n��n��o��o��o��n��m��m��n��n��n��n��n��n��p��p��p��p��q��q��p��p��p��o��n��n��n��n��n��n��o��o��n��n��n��n��n��n��m��m��m��m��m��m��l��k��k��k��l��l��k��j��k��l��k��k��i��i��j��k��j��h��i��j��k��i��h��i��j��j��j��j��j��j��j��j��j��i��i��j��k��k��j��i��j��k��k��k��l��l��j��j��j��j��m��m��l��m��p��p��o��m��m��m��m��m��m��l��l��m��l��k��k��k��l��l��l��k��k��j��j��j��i��i��h��h��h��h��h��h��g��g��e��e��e��g��i��i��g��f��h��r��oq��of�y_g1M�O/ސi�[��a�]��aރL܄R�g�U4o( -ڎl�b�V��Y�T�n=�wJ۪��}[�|d�{gv_O�]J�G.�oL�W�M�g4�qAӟw�tU�ub�{mv^RxWHo?+�K3K�hE�^�\�X�4�~Z�pH߇W�m;�jB�I$�R,�l?�Y��i��d�a�{Pƙ����}��o��f��`��`��`��`��_��`��`��_��`��a��`��_��]��]��]��\��\��]��]��]��_��_��_��_��`��`��`��_��`��_��^��]��^��_��^��]��_��_��^��]��]��^��^��^��\��\��]��]��]��\��[��[��X��Y��Z��Z��Z��Y��X��W��W��X��X��X��W��W��Y��Z��W��V��V��V��W��W��W��V��V��V��V��V��V��V��W��X��Y��X��X��X��X��X��X��X��W��W��X��X��X��W��W��V��U��U��T��T��V��V��W��W��W��V��W��X��X��W��W��W��V��V��V��V��V��V��V��V��V��U��T��T��T��T��R��Q��R��T��R��P��N��O��O��O��N��N��O��N��O��O��Q��R��P��P��P��P��P��P��M��L��M��M��O��O��O��N��N��M��k��j��j��k��l��l��m��l��n��n��n��n��n��n��o��p��q��r��r��s��s��r��q��p��q��o��q��q��q��q��q��r��p��p��q��q��p��p��p��q��s��s��s��t��t��t��s��p��q��q��q��p��p��p��p��p��p��p��o��o��n��n��n��n��m��l��l��k��k��l��l��k��k��k��k��k��k��k��k��k��k��l��k��j��j��l��l��l��i��j��j��i��j��k��k��k��j��j��j��j��j��j��j��i��j��k��l��l��k��j��j��k��k��m��l��m��l��l��l��l��n��n��o��o��r��r��r��o��o��o��n��m��m��l��m��m��m��l��k��l��m��n��m��m��l��l��l��l��k��k��k��k��k��j��j��i��f��f��f��g��f��i��k��j��g��f��i��v���su��yp�}ce2K�V6��k�a��c��a��c�PۅR�h�X6l'֌i�b�S��X�W�s@�zNே�~^�~c�zdt]M�dR�Q:�yX�W�O�i4�tEؤ}�tW�va�zjt]OxWFqA-�M4I �iE�a�`Ձ\�2�~]�uO�_�pA�pH�M(�S*�l?�Y��i��f�gтWΡ����}��n��f��a��a��a��a��`��`��`��_��`��a��`��_��]��^��^��]��]��]��^��^��a��b��a��a��b��b��a��a��`��_��^��^��^��_��^��^��a��`��^��]��]��^��^��]��]��]��[��[��[��Z��Y��Y��Y��Y��Z��Z��Z��X��X��W��W��X��[��Z��Z��Z��Z��[��Z��Y��Y��Y��Z��Z��Z��Y��Y��Y��Y��X��X��X��Y��Z��X��X��X��X��W��W��X��X��X��X��X��X��X��X��W��W��U��U��T��T��T��U��W��W��W��V��W��X��X��X��X��Y��W��W��W��W��W��W��V��V��V��U��U��U��U��U��S��R��S��T��R��P��O��O��P��P��P��P��P��O��Q��P��Q��Q��R��Q��P��Q��R��R��O��N��M��M��P��P��O��O��P��O��l��k��j��j��k��m��p��o��p��o��p��q��q��q��q��q��s��r��r��t��t��s��r��r��p��q��r��r��r��r��t��u��r��q��q��p��p��p��r��s��t��s��s��r��s��q��s��q��p��q��q��p��o��o��o��p��o��o��o��n��m��l��n��n��k��l��k��k��k��m��m��l��l��l��l��l��m��m��m��l��k��m��n��l��k��l��n��o��j��k��j��j��k��m��m��l��l��l��l��l��l��l��k��j��l��l��l��l��l��k��k��j��k��m��m��m��m��m��n��n��n��n��p��p��r��q��q��r��q��p��o��n��m��m��m��n��m��l��k��k��l��m��l��k��n��m��m��m��m��m��l��m��l��l��l��j��i��i��i��j��i��k��k��j��i��h��l��y���uz���|��ke1K�Y9ߑj�b�_��^��a�RԁMޏf�X5j%Ԋg�b�P��W��Z�uA�~O߮��|\�}b�zds\L�eV�R;�yV�W�O�k5�wHܨ��uX�xc�yiu^P~]LxH2�Q6I�lI�b�_׃^�1�[�xR�b�sD�sJ�N&�S,�k@�Z��k��h��hфXУ������q��h��e��f��e��c��b��b��b��a��a��b��b��a��^��`��a��a��`��`��_��`��b��b��b��b��b��b��a��a��a��a��`��`��_��`��`��`��`��`��_��]��]��^��^��\��\��\��[��[��[��[��[��Z��Y��Y��Y��Y��X��X��Y��Z��X��Y��\��\��[��[��[��\��[��Z��Y��Y��Z��[��Z��Z��X��Y��Z��Z��Z��Z��Y��Y��X��Y��Z��Z��Y��Y��Z��[��Z��Y��Y��X��X��X��X��X��W��U��W��V��X��X��X��X��Y��X��X��X��X��W��V��W��W��W��W��W��V��V��V��U��V��U��T��T��U��V��U��U��V��U��T��Q��Q��Q��Q��O��R��Q��P��P��R��R��Q��Q��R��Q��P��Q��S��T��S��O��O��O��O��O��O��O��O��O��n��n��n��o��o��p��r��r��r��r��r��r��q��q��q��r��r��r��r��r��r��r��r��r��q��q��q��p��p��p��q��r��r��q��q��r��r��q��q��r��r��r��q��q��r��q��q��p��m��n��o��o��n��m��m��n��n��m��m��l��l��m��m��n��n��n��m��k��j��l��l��l��k��k��l��m��m��k��k��l��l��k��j��k��k��j��k��l��k��j��k��k��l��k��k��l��n��m��m��m��m��m��l��l��k��k��l��l��j��i��i��k��m��m��l��m��n��p��o��m��m��n��p��q��t��t��s��r��o��p��p��q��q��q��q��q��n��n��o��o��o��n��n��n��m��n��o��o��o��o��n��m��o��n��o��m��l��k��l��k��j��n��j��j��l��h��u��u�玷�v������sa-L�Z9�k�f��`��a��b߆LԁM��j�W7j#΂`�a�S��[��X�u>�|J㶌�~]��j�yix^Q�iX�Q7�tO�W�N�h2�tC٨��tU�u]�}nu]Q}YKw@+�I/K�mJ�a�_Ӂ[�6�~Y�wP�c�|J�uG�R(�N*�jC�`��n��p�hу\Ο���Ă��t��o��i��d��j��d��b��b��c��c��b��a��b��c��e��d��b��b��c��c��c��b��d��d��c��c��b��b��a��b��a��a��^��^��^��^��^��_��]��]��]��]��`��`��`��`��^��^��^��^��^��^��]��\��Z��[��[��Z��Z��Y��\��\��\��\��[��[��\��\��[��[��\��[��[��\��]��]��[��Z��[��Z��Y��Y��Z��[��\��\��\��[��[��[��[��[��Z��Z��Y��Z��Z��Y��W��W��W��X��X��X��Z��Y��Z��Z��Z��Z��X��Y��Y��X��W��W��Y��Z��Y��V��U��V��Y��X��W��W��V��W��W��V��V��V��W��X��X��V��T��S��T��V��V��T��U��U��T��T��T��S��R��P��S��R��R��R��R��Q��S��T��R��R��Q��Q��P��P��P��P��o��o��p��q��s��s��r��r��s��r��q��q��r��r��q��q��q��q��r��r��s��s��s��s��r��r��q��q��q��q��q��r��r��q��q��q��q��p��p��q��r��q��p��p��o��p��p��p��n��o��o��n��n��m��m��m��m��m��m��m��m��m��m��n��l��m��l��k��j��l��m��m��l��l��m��n��n��l��l��m��l��k��l��m��m��k��k��k��l��k��j��k��k��k��l��m��n��m��m��m��m��m��m��l��k��k��l��l��j��j��j��l��m��m��m��m��n��p��o��n��p��p��q��q��s��s��r��r��p��p��p��q��q��q��q��q��p��p��p��p��p��p��p��p��n��o��o��p��o��o��n��n��p��o��o��o��n��m��o��m��m��l��o��m��s��|���ꈴۖ�Ă�������qf/O�U2�k�e��c��c��`�OنT�m�T6p$ -ֆc�b��Q��Z�W�u>сL㷊��^��p�|lx^Q�dQ�P2�xN��Z�R�e/�yHܭ��tR�w_��pv^R~ZL}D0�O6H�iH�a�aڈ`�5�{X�uM�b�zK�xJ�T,�S1�eA�g��r��p�l҄]Λ������ͅ��y��w��t��k��e��d��c��c��c��b��a��b��d��d��d��d��d��d��d��c��c��d��d��d��d��d��c��a��a��c��b��_��^��^��^��^��_��^��^��]��]��`��`��_��_��^��]��]��]��]��]��\��\��X��Y��Z��[��Z��Z��\��]��\��\��\��\��\��]��]��]��_��_��^��]��]��\��[��[��[��[��[��[��\��\��\��[��\��[��[��[��[��\��Z��Z��[��[��[��Z��Y��Y��Y��Z��Z��Z��[��Z��Z��Y��Y��Z��[��[��[��Z��Y��Y��Y��Z��Z��W��V��W��Y��X��X��X��X��X��X��W��X��X��X��Y��W��V��V��V��W��W��U��T��U��U��U��T��T��T��Q��P��S��R��R��R��S��R��S��U��S��S��R��Q��Q��Q��Q��Q��q��q��s��s��s��s��s��s��s��r��q��q��r��t��s��r��r��s��s��t��t��t��t��t��s��r��q��q��r��r��r��q��r��q��p��q��p��o��o��o��r��q��p��o��o��o��p��p��q��p��o��o��o��o��n��n��m��m��m��m��m��m��m��m��l��m��n��m��l��l��m��n��l��l��m��m��m��m��n��o��l��l��l��m��m��l��l��l��m��l��l��m��m��m��m��o��m��m��m��m��m��m��n��n��l��m��l��m��m��n��n��n��n��o��o��o��o��p��q��q��r��q��q��q��p��q��q��q��q��q��q��q��r��q��q��q��q��q��q��q��q��p��p��p��q��q��q��q��q��q��p��p��p��p��p��p��o��o��o��o��n��o��t��|������ˎ�ư����Ȱ��Ř�ϗ��eMt;�\9ْh�j�b��_��a�TփQ�l�Y;u% -܈d��b�Q��]��Y�v<ςL溉��Y�e�|gt]K�gO�T2�|O�V�O�k2�~LӢw�qK�tW��hx^O�[Kt:$�D*N�nQ�a�bڅ^�0�{Y�tO�^�tH�tM�R-�O/�aA�q��|�h�nߔl鰕й������Ġ�ɓ�˅��k��k��e��d��d��d��d��c��c��e��d��d��e��e��d��d��b��d��d��e��e��e��e��d��b��a��b��a��^��^��]��^��^��_��`��`��_��^��^��^��]��]��]��\��^��^��^��]��]��\��X��Y��[��[��\��[��[��[��]��]��^��]��]��]��_��`��c��b��a��_��^��]��]��]��\��[��[��[��\��\��[��[��]��\��\��\��]��]��[��[��Z��Z��[��Z��Y��Y��Z��Z��Z��[��\��[��Y��X��Y��Y��[��[��[��[��[��[��[��[��Z��Y��Y��Y��Y��Y��Z��[��[��Z��Z��Z��Z��Z��Z��Z��X��X��X��X��W��W��U��T��V��V��U��U��U��U��T��T��T��S��T��T��T��T��U��W��U��T��S��R��R��R��S��S��t��s��s��r��r��s��t��u��s��r��q��r��s��t��t��r��t��t��t��t��t��t��t��t��s��s��r��r��r��r��q��q��s��q��q��q��q��p��o��p��q��q��p��p��o��o��o��o��q��p��n��n��o��o��o��n��m��m��n��n��n��m��m��m��l��n��o��n��l��k��l��m��m��m��m��m��l��l��n��n��n��l��l��l��l��l��l��n��n��m��m��n��n��m��m��n��m��m��m��m��n��n��o��o��n��n��n��n��o��o��o��o��o��p��q��q��p��q��r��r��q��q��q��q��q��q��r��r��r��r��r��r��r��r��r��q��r��r��q��q��q��p��p��p��r��r��r��r��r��r��r��r��q��p��p��p��p��p��p��p��r��t��r��b��Jb�>F]TP^�ww�pc�t]�cG�nN��fƎm�|�q�c�b��a��d�VӁO�k�\;u&݉e�`�N��`��\�t:΁I巆��a�z_�{e}dP�nT�K'�|N�Z�R�s=�{JЛo�yT�mN��gv[J~WF�E0�N7O �hO�e�]څ`�3��e�|W�`�rJ�sP�Q0�T5�T4�^<�R,�<�f=�pK�rS�zh�{q��z��������́��k��h��f��f��f��e��d��e��f��d��e��e��d��c��c��a��d��e��e��e��e��e��d��b��a��b��a��_��^��_��_��`��a��b��a��`��_��_��^��^��]��^��^��_��_��_��^��^��]��[��[��\��\��]��\��\��\��^��^��_��^��]��^��_��a��c��b��b��a��`��`��_��_��^��]��[��Z��[��\��\��]��_��_��_��_��^��^��\��\��Y��Z��Z��Y��Y��Y��Z��[��[��\��\��\��[��Z��Z��[��Z��[��[��\��\��\��\��\��[��Y��Z��Z��[��[��\��]��]��\��[��[��\��\��[��Z��Z��Z��Z��Y��X��W��V��W��W��W��V��V��V��U��U��U��U��U��U��U��U��U��V��W��U��U��T��T��T��T��T��T��u��t��s��r��r��s��t��t��s��s��r��s��s��t��t��t��s��s��s��s��s��s��s��s��s��s��s��s��r��q��r��r��s��r��r��r��r��q��q��r��p��p��p��q��p��p��o��n��o��n��m��l��m��n��n��n��m��n��n��o��n��n��m��m��k��m��n��m��l��j��k��l��m��n��n��m��m��m��m��n��n��m��l��m��m��l��m��n��m��m��m��n��n��l��l��l��m��n��n��n��o��o��o��p��p��p��p��p��p��p��p��p��p��r��s��r��r��r��s��s��q��q��q��r��r��r��r��r��r��s��s��s��s��s��r��r��s��s��r��r��r��q��q��q��t��t��t��s��s��t��r��r��q��q��q��q��q��p��o��r��v��z��y��+Nl.1BH5;]><�ym�oX�lN�_<�qK�oJ�\4�qA�KԉR�e��k��i�\׋W�s�[8t) -ޏh�b�M��]��Z�r8ЀK資�zV�rY�vay]H�jP�N-�qF�\�T�i8�|NԚr�uR}_C�~g{[L�YL}>-�@/U �fO�i��m�k�=�s݈a�k�{S�zY�S4�P1}8r'~-v$�^:�rN�dC�sV�lQ�iN�u\�~m������z��n��g��g��g��g��f��e��f��f��f��e��d��b��b��c��d��f��e��e��e��d��d��d��d��d��d��c��c��a��b��c��d��b��a��`��`��_��_��^��^��_��^��^��^��^��]��]��]��]��]��]��]��]��^��^��^��`��`��`��_��_��_��`��a��c��b��b��c��d��d��c��a��a��`��]��\��\��]��^��^��`��a��a��`��_��_��^��^��\��\��[��[��[��[��\��]��^��]��]��]��^��^��]��]��]��^��_��_��]��\��\��]��]��\��]��]��^��]��^��_��^��]��\��\��]��]��\��[��\��\��\��[��Z��Y��Z��Z��Y��Y��X��W��V��V��V��V��W��W��W��W��W��V��W��X��V��V��V��V��V��U��V��U��t��t��t��t��t��t��t��s��t��t��t��u��t��t��t��u��t��t��t��t��u��u��u��u��s��s��t��s��r��r��r��s��q��p��p��q��q��p��p��q��p��p��p��q��p��p��o��n��p��o��n��n��n��o��o��o��o��o��o��p��p��o��o��n��l��m��n��n��m��l��m��n��n��o��o��n��n��n��o��o��n��n��n��o��o��n��n��n��n��m��n��o��n��m��l��l��n��n��o��o��p��p��p��p��q��q��q��q��q��q��p��p��p��r��s��r��r��r��s��s��r��r��s��s��s��r��r��q��s��s��s��t��t��t��s��s��t��s��s��r��r��r��r��r��t��t��t��s��s��s��r��r��r��r��r��q��q��q��p��r��v��}���w��E;FtUSqF=�p]�iO�gF�kG�sL�`;�`4�p=�uAڑ\��j��q��p�fەb��~�c?r- �o��n�X��f��^�t<ӂM��]��`��q��v��u�{a�I%�xO��i��d�sFփW��_�{Y��l��y��z�j]B0�G7Q�kS�p�k�o�?�r܉a�pт[�~^�U9�M3|: w/�B({0�[9�sS�iI�uT�lF�h?�a<�nQ�ys��׀��p��g��f��g��f��f��e��f��g��g��e��d��c��d��e��f��g��g��f��f��f��f��f��f��f��f��e��e��c��c��c��c��a��`��`��_��_��_��_��_��_��_��^��^��^��^��^��^��^��]��]��]��^��_��`��`��b��b��a��a��`��`��a��a��d��d��d��f��g��f��d��b��`��`��^��^��^��^��^��^��a��a��a��a��`��_��^��^��^��^��]��]��]��^��^��^��^��]��]��]��_��_��_��^��^��`��a��a��_��^��_��`��b��a��a��a��`��_��_��`��_��^��]��^��^��^��]��\��\��]��^��^��]��\��[��[��Z��Z��Y��Y��X��W��W��W��Z��Y��Y��Y��Y��X��W��X��W��W��W��W��W��V��W��W��s��t��u��u��u��u��u��t��u��u��v��v��u��u��u��u��u��u��u��v��v��v��v��v��u��u��s��s��s��s��s��s��q��p��p��p��p��p��p��q��q��q��q��r��q��q��p��p��r��r��r��q��q��q��q��r��q��q��q��q��q��q��p��p��p��o��p��q��p��o��q��r��o��p��p��o��o��p��p��p��n��n��n��p��p��o��n��o��p��o��o��o��o��o��o��p��o��o��p��p��p��p��q��r��s��s��s��s��s��r��r��q��r��s��s��r��s��s��s��s��s��s��s��s��s��s��s��s��s��s��t��t��t��t��t��t��t��t��t��s��s��s��t��t��v��v��u��u��t��t��t��t��u��u��r��r��q��q��p��q��w��}���~��TJUpNM�XN��}Ďtƍoċmϗv��a�xP�vGƄP�t�q�n�s�mۙi𯇪hEr0ߗq��q�_��o��i�{EׇT�m@~[3tQ1vW:�gI�vT�P)ǀT�o݅S�n?�j�}S�\5�gF�nQ�t^�lY|H3�T>M�kOԉa�d�k�;�hنZ�oЁX�}Z�Y>�N<�C4�?/�D0u9�sUј{ƍpʏmʉaЃY�tM�lM�un��у��p��h��g��g��g��f��f��g��h��h��e��e��e��f��f��g��h��g��g��g��g��h��g��f��e��e��e��e��e��d��d��d��a��a��`��`��`��`��`��`��`��_��_��_��_��_��_��_��_��^��^��^��_��`��a��a��c��b��a��a��b��b��a��`��c��e��f��h��h��g��f��e��b��a��a��`��`��`��`��`��`��a��b��b��a��`��_��_��`��_��_��_��`��`��`��a��`��_��_��`��a��b��a��a��a��b��c��c��c��b��c��d��e��e��e��e��d��b��`��a��a��`��`��`��`��`��^��]��^��^��^��^��^��]��\��[��[��[��\��[��[��Z��Z��Z��[��Z��Z��Z��Z��Y��Y��Y��Z��Y��Y��X��X��Y��Y��Y��u��u��u��u��u��v��v��w��v��v��v��v��v��v��u��u��u��u��u��u��u��u��u��t��t��t��r��r��s��s��r��r��s��r��r��s��r��r��r��s��s��s��s��s��r��r��r��r��s��s��s��s��r��q��r��s��r��r��r��r��r��r��r��q��r��q��p��q��q��p��q��r��n��p��p��o��o��q��q��q��o��n��n��n��n��n��o��p��p��o��n��n��o��o��p��r��p��p��p��p��p��p��q��r��s��s��s��s��s��r��r��r��s��t��t��s��t��u��t��s��s��s��s��s��t��u��u��v��s��s��t��t��u��u��u��u��v��v��v��u��u��u��v��v��x��x��w��w��v��u��u��t��u��u��s��s��q��q��q��r��t��{�����g��wjt�jf�iZ��w�}aߧ�Γs̑oٚw訂ߟqܚj��v�n�pߟoۜp﯉�^;s2דn�j�Z��m��oڂP،Z��U�nC�d@�kJyU3�mH�N$�wJ�]�L�e6ӉZ��S�kB�d=�mKwT8�dJ�R8�dIJ�oPԍaޑc�j�:�gۈ\�rˀV�}Z�^C�\K~E:�M@�[G�]?��m߬�ۨ�寋갈����ܡ�������}��q��i��g��h��h��g��g��h��h��g��e��e��f��g��g��g��h��h��h��h��h��h��f��e��e��e��e��e��e��e��e��e��e��b��a��a��a��a��a��a��a��`��_��`��`��a��a��a��a��`��`��`��a��a��`��`��c��b��a��a��b��b��a��_��c��d��f��h��g��g��g��g��g��e��c��b��b��c��d��e��`��a��b��b��b��a��a��a��a��a��a��a��a��b��b��b��c��c��d��d��d��d��d��e��f��f��f��f��e��e��e��e��d��d��e��e��e��d��b��c��a��a��a��a��a��`��_��^��`��_��^��]��]��\��\��\��[��\��]��]��\��\��[��\��\��[��[��[��[��Z��Y��Z��\��[��Y��X��X��Y��Z��[��v��u��u��u��u��v��v��w��w��v��v��u��u��u��v��w��v��u��u��u��u��t��t��t��u��u��r��r��s��s��r��r��s��r��r��r��t��t��s��r��s��s��s��t��r��s��s��t��t��t��t��s��s��s��s��s��t��s��s��s��r��r��r��r��q��r��r��r��q��q��q��r��q��q��q��q��q��q��q��q��r��q��q��q��q��q��q��q��s��o��m��o��q��p��p��q��o��p��r��r��q��q��r��s��r��s��s��t��s��s��t��t��r��s��s��t��t��t��u��u��u��u��u��u��u��u��u��u��u��u��u��u��v��v��v��v��v��v��w��w��x��x��x��w��z��z��z��z��z��y��x��w��v��u��s��r��q��q��q��r��t��{�����Oj�aNTiA7a8"�gH�fA�b<�d>�]9�hC҈a̅Y�yʋ_ٜoؘjԖg؞pڟs㥀džf�^B��v�h�m�sڐ_ܘgΖe��]��\��[�zT�}U�h=ՃT��V�U�xF܌[ύ]�S��Y�}X�rP�vT�cE�qQ�L.€]�j�k�s�R*�iڇ_�~U�kE�mM�eL�eVyK>yK;tF.a4�P*�nN�hG�lG�mD�vJčdܫ�Ҽ������q��i��j��j��i��h��g��h��f��h��i��j��i��h��h��i��g��h��i��i��j��i��h��g��g��g��f��e��d��d��e��e��f��e��e��e��e��e��e��d��e��d��d��d��b��b��a��`��b��b��c��d��d��b��b��c��a��a��a��a��`��`��a��b��f��f��f��f��g��g��h��h��g��f��e��e��f��f��e��c��c��b��a��a��a��b��a��`��c��d��d��c��c��e��e��c��d��e��f��f��f��g��g��g��f��g��g��f��d��c��c��d��d��e��e��e��d��d��a��a��`��a��a��`��_��^��_��_��]��]��]��]��\��[��\��\��^��]��\��]��_��_��^��\��]��\��[��[��\��]��]��\��]��[��Z��Z��Z��[��[��Z��t��u��v��v��w��w��w��w��w��v��v��v��w��w��x��w��w��w��v��w��w��v��u��v��v��u��r��r��s��s��r��r��s��s��s��s��t��t��s��s��s��s��t��t��r��s��s��t��s��s��r��r��r��r��r��r��r��r��r��r��r��r��r��r��q��r��r��r��r��q��r��r��r��q��q��q��q��q��q��r��r��r��r��q��q��q��r��r��r��p��n��p��q��p��p��r��p��q��r��r��r��r��s��s��t��t��t��t��t��s��s��s��t��t��t��t��t��t��u��u��u��u��u��u��u��u��u��u��v��u��u��v��v��v��v��v��v��v��x��x��y��z��z��z��|��|��{��{��z��z��z��z��w��v��v��s��s��r��r��s��v��{�����;UpP;@k?4�ZA��e�oF�oE�kB҄]�mG�lC�j?�[.�j>�vL��V�sF��Z�T�jG�{\�O3ώnЉ]�{K�oA�oBŁR̊Z�L�~K�uI�lC�yO�wK�o@�k:�p<�s=�s?�s>�vB�p>�vI�vL�xO�uN�kF�oJ�kG�W/�sC�j;�c;�R-�U1�O-�W4�[9�L/o?(HGS)W*g:�uN�nK�fD�iE�kDϐe�}W�sS�tl���~��q��j��j��k��j��i��i��j��i��i��i��i��j��j��j��j��i��i��i��i��i��i��i��i��i��i��i��g��f��e��e��e��g��e��f��f��f��g��f��f��e��e��e��e��f��d��d��c��d��d��d��d��e��d��d��d��b��b��b��b��b��b��b��d��g��g��g��g��h��h��i��i��f��f��f��e��e��e��d��d��d��c��b��b��c��d��c��c��c��d��e��c��b��b��c��b��d��e��f��f��e��d��e��f��d��d��d��c��b��b��b��c��d��d��c��c��c��b��`��`��^��_��`��`��`��_��^��^��]��\��\��\��[��[��[��[��^��]��]��]��_��_��^��\��^��^��]��]��]��]��]��]��\��\��Z��Z��Y��Y��Y��Y��w��w��v��w��x��x��x��x��x��w��w��x��y��y��x��v��x��x��x��y��x��w��v��w��x��w��v��v��t��t��t��t��s��s��t��t��t��t��t��t��t��t��t��t��r��r��s��t��s��s��s��s��s��s��s��s��q��r��r��s��s��s��r��r��r��r��r��r��r��r��r��r��r��r��q��q��q��r��s��t��s��s��r��r��r��r��r��r��r��q��p��q��q��p��q��r��r��q��r��r��s��s��t��t��t��t��u��u��t��t��t��t��u��u��u��u��u��t��u��u��u��u��u��u��u��u��v��v��v��v��v��v��v��v��w��w��y��x��y��y��z��{��{��{��}��}��|��|��|��{��{��{��x��v��u��s��s��s��r��r��p��q���^y�_HNk;/�ZCΖủ_؋_هa�lڂZ�uJ�|P�i=�]4�nE�rH�\1ԙo�mE�sN�gF�R6ۜ{�uޚk�tJ�_5āV̅W�s?�j3�k9�e4�b0�vC�X$�k6�Z �`&�l2�c)�m3�i0�s>�h5�g7�c3�`6�f;�Y-�i:݇V܊[�yT�U5�I+�\?�Y.o/�kKمa�b<�]8�wRڅ^ֆcΌtɫ����s��o��k��k��k��l��l��l��l��m��n��o��n��n��p��p��p��l��m��n��o��o��o��p��q��r��q��r��q��q��q��q��q��s��s��s��r��q��o��p��n��l��l��l��l��k��j��i��i��j��i��i��i��h��f��e��f��f��f��f��g��i��i��i��h��h��h��h��h��h��h��h��h��i��h��j��i��i��h��g��g��f��f��e��e��f��f��f��f��f��d��b��d��d��b��b��c��b��b��b��c��c��c��c��b��`��`��`��_��_��_��`��a��b��b��a��`��`��`��`��`��`��_��_��`��`��`��_��^��`��`��a��a��`��`��`��`��a��a��b��b��c��b��b��c��^��^��^��^��^��]��_��^��]��]��^��]��\��\��\��]��z��z��{��{��y��x��w��w��w��w��x��x��w��w��x��y��y��x��x��y��x��v��v��v��v��v��v��v��t��u��t��t��t��t��t��t��t��t��u��u��t��u��u��u��t��s��t��t��t��t��t��t��t��t��u��u��u��u��v��v��v��v��v��v��t��t��t��t��t��t��t��t��t��t��t��t��t��t��u��u��t��t��s��s��s��s��s��s��r��s��s��s��s��r��s��s��s��t��u��t��t��t��u��v��v��v��w��w��u��u��u��u��u��u��v��v��v��u��v��v��w��w��y��x��y��y��y��z��w��w��x��x��x��y��y��y��z��z��{��z��z��z��{��{��{��{��{��|��~����������}��|��z��x��w��u��u��w��x��{������t\\V!�C.�y_�^;_�7�|Z�c8�+�f4�uD�l?�h=�j;�rB��S͘fԜm��Y�oH��[��S��LΙmߪ�寃䮂ՠv䮂���yܤuלpܡwΕjΓiҔmיp֠r֠q֜lۡsۢuΕjȉfÄa�eA�nL�Y�wT�0Y�eD�|V�H%�VA������{��o��l��k��k��l��m��l��k��l��m��o��n��n��o��o��n��n��o��o��p��p��p��o��o��o��n��o��o��p��q��r��r��q��r��r��r��q��q��q��q��m��n��n��n��m��m��l��l��j��j��k��k��i��g��f��g��g��f��h��h��i��j��i��h��h��h��h��h��h��h��g��g��h��h��j��j��k��k��j��j��h��g��g��f��f��f��f��g��g��e��c��d��f��e��d��d��e��d��d��d��d��c��b��a��b��a��a��`��`��`��a��a��b��b��b��b��a��a��a��a��b��a��a��`��a��a��a��a��a��b��b��b��a��a��a��a��b��c��c��c��d��d��c��d��`��_��^��_��_��_��`��_��_��_��_��_��^��]��]��]��y��z��{��{��y��x��v��u��v��v��w��x��x��y��y��x��y��x��x��y��x��v��v��v��v��v��w��w��x��x��u��u��u��u��t��t��u��u��u��u��s��t��u��v��t��t��t��t��v��v��u��u��u��v��v��v��u��u��v��v��v��v��v��v��t��t��u��t��t��t��t��u��v��v��v��u��u��u��u��u��u��u��t��t��s��s��s��s��s��t��t��t��s��t��t��t��t��t��u��u��v��u��v��v��v��w��v��v��v��v��u��u��v��v��w��v��w��w��w��w��z��z��z��z��z��z��z��z��y��y��y��y��y��y��y��y��z��{��{��{��{��|��|��}��{��{��{��{��~�������������}��{��x��w��w��u��v��}��~�����{���qqS%|E1�w_�wU|@u2ǀd�oI�F�Y0�pG�T�uI�uI�tF�rC�tD�tG�rJ�D �pL�zL�vG�wO�{U�}T�~U�{Uƅ]�}UȃYˌ`��Sȉ^�yQ�sM�sM�nL�sO�zO�{N�k=�oC�sJ�qJ�fF�mN�S2|? �W=?,   %?�aRb0E�\<Ɓb�bGE�S;�vT�a@~N:������|��r��l��l��l��m��n��m��k��o��p��o��n��o��r��r��o��n��n��o��p��p��p��o��n��m��m��m��n��p��r��s��s��q��r��r��r��q��q��p��p��o��p��p��p��n��m��m��n��j��j��j��j��j��i��h��i��h��h��i��i��j��i��i��i��g��g��g��g��g��g��g��g��j��k��l��l��l��l��m��l��h��h��h��g��g��g��g��g��h��h��f��e��f��g��f��e��e��e��d��d��d��c��b��b��c��c��c��b��c��c��c��c��a��a��b��b��b��a��a��a��b��b��b��b��b��b��c��c��d��d��d��d��d��c��c��b��c��c��e��e��e��e��d��d��a��a��a��`��b��b��b��b��b��b��a��a��a��`��`��_��{��z��z��x��x��v��v��v��v��w��w��x��z��z��x��w��x��x��x��x��w��v��u��v��t��u��v��w��w��w��u��u��v��u��t��t��v��v��v��u��s��s��u��u��u��t��t��t��u��u��v��u��v��u��v��u��w��w��v��v��v��v��v��v��t��u��u��u��t��t��t��u��w��w��w��v��v��v��v��v��w��u��u��t��t��t��t��t��u��u��u��t��u��u��u��u��u��u��u��u��w��w��v��v��v��v��v��v��v��w��w��w��x��x��x��x��x��x��x��x��{��{��z��z��z��z��z��z��z��z��y��y��y��y��y��y��{��{��{��{��{��{��{��|��z��z��|��|��~���������������|��z��x��x��v��w��w��������~��wnsCo>-��h‡e�fAl0ńhӉd�[4�Q,�pK�aރW�_�R�wH�zK�~Q�V�C�|V�yMՄU�wJ�~T�wM�qG�jC�rK�rJ�yP�sFό_�yP�yR�wRȂ^�tQ�vR�vN�pF�f=�i?�oF�|W�jJ�gH�dB�P/�X@?("  $& 3 �hY`:%<�iJɌmādB �bL��h�oQuN=��������r��m��m��m��n��o��n��n��o��o��o��o��s��y��{��y��o��m��l��m��n��o��n��m��m��k��n��o��q��r��r��r��r��s��t��r��r��q��q��q��o��p��p��o��l��k��k��k��j��h��g��h��j��i��i��i��h��i��j��j��j��i��i��i��g��g��h��h��h��h��i��h��l��m��n��m��l��k��m��m��j��j��i��i��i��i��i��i��h��i��h��f��e��g��f��e��e��e��f��e��e��d��d��d��c��c��c��c��c��c��c��c��a��`��a��a��a��a��a��`��`��a��b��b��b��b��b��c��e��e��d��e��e��e��c��b��d��c��c��c��e��c��d��a��b��b��b��a��b��b��c��c��b��a��a��a��b��b��a��`��|��z��x��v��v��v��v��w��w��y��z��z��z��x��x��w��x��w��v��v��u��u��u��v��w��w��v��v��v��v��w��w��u��u��u��t��t��t��t��u��t��s��s��s��t��t��t��s��t��s��t��r��t��s��u��t��u��v��v��v��u��t��u��u��v��v��u��u��u��u��u��v��w��w��x��x��x��y��y��x��w��w��v��v��v��v��v��w��v��v��v��v��v��v��w��w��v��u��u��u��u��u��u��u��w��w��w��w��v��v��w��y��y��x��x��x��x��x��y��y��{��{��{��z��z��z��{��|��|��{��{��{��|��|��|��{��|��|��|��{��{��{��{��|��|��|��|��|��}��}��}��}��~��~��}��{��x��x��x��w��u��z�����{��aco=$V+�hM�wQ�]3]!�jI�yQ�iA�T3�qNׄZ�c�i�g�V�Z�]�g�V-�a�^܂PنRىV�xHЂT�QρS�xQ͂Z׎cߖkߒhӈ`ҍdҍd�X�zS؆^�~V�vR�yU�WԂ\�yX�zY�qJ�hB�tZC *!#""! %7#�lcV:.,kF+�yS�wQG {E)�oM�z]�_S������{��r��m��n��n��o��n��p��q��s��q��r��q��y�����������u��o��n��o��o��n��l��m��l��l��n��n��n��n��o��o��o��p��s��r��u��r��r��q��p��p��p��p��p��o��n��n��l��k��i��h��h��h��h��i��h��i��j��i��i��i��j��j��i��f��e��g��i��i��j��k��l��l��l��k��k��l��m��n��l��l��l��k��k��k��k��k��l��j��h��h��g��f��e��g��e��f��g��g��f��f��f��f��h��g��f��e��d��d��d��c��d��d��d��d��c��c��d��d��b��b��b��c��d��d��e��f��h��i��h��f��c��d��d��d��d��d��c��c��c��a��b��a��b��c��d��c��c��b��c��d��d��c��b��a��a��a��b��b��{��z��v��v��u��t��u��x��v��w��y��w��x��w��v��t��w��w��v��v��v��w��w��x��w��w��x��v��w��w��w��w��x��w��w��u��v��u��v��u��t��u��u��u��u��t��t��t��t��t��t��s��t��s��u��t��v��v��v��v��u��v��v��v��w��v��v��v��v��v��w��w��v��v��v��v��x��v��y��w��x��x��w��w��w��w��w��x��w��w��w��w��w��w��w��w��w��w��w��w��v��v��v��v��w��x��x��x��w��w��y��z��x��x��x��x��x��y��z��z��{��{��|��{��{��|��}��}��}��|��}��}��}��}��|��|��}��|��|��|��{��{��{��{��|��|��|��|�������������������}��|��y��y��w��w��v������fp|4"R+��d�qI�^4h&�tP�qH�Y1�Z7�jGІ_�}U�^;�tP܈Z��[نZ�j�Y/قW�Z�_�wD�q@�pG�nG΁ÚW�tN�rNԏhӎeˁ\ƁZ‚\Օo�zV�kF�~X�yT�nP�nP�vQֆc�iJ�kM�pK�b>�cJD + ! &{g`B,!' }X=Ŋ`�rGd%Y Îl�_B�cX������y��q��m��m��o��p��o��p��q��t��v��o��l��v�����������|��u��r��q��q��p��n��o��n��o��o��o��p��p��p��p��o��p��q��r��r��r��r��q��r��r��r��r��r��q��p��o��m��l��k��j��j��j��i��i��i��i��j��j��j��j��j��k��j��i��i��j��j��i��j��k��m��m��n��n��n��n��n��n��n��l��n��n��m��m��m��m��l��i��i��i��i��g��g��h��h��h��h��g��f��f��f��g��g��g��f��e��e��e��e��e��e��d��f��d��e��c��e��d��e��d��e��e��f��e��e��f��h��i��h��g��d��e��d��d��d��c��c��b��b��a��b��b��b��b��b��b��c��b��b��b��a��a��a��`��`��`��_��_��{��w��w��v��u��s��s��u��s��t��t��t��t��t��t��s��v��w��w��x��x��y��y��y��x��x��y��y��z��z��z��z��z��x��y��w��x��v��x��v��v��w��w��w��v��u��v��v��u��u��v��u��v��u��v��u��w��w��w��w��v��x��y��w��v��u��v��v��v��v��v��w��v��v��v��v��w��v��w��w��x��w��w��w��w��w��w��w��x��x��x��x��x��x��x��x��y��y��y��y��x��x��x��x��w��x��x��x��x��x��y��y��{��{��{��z��{��|��}��}��}��}��~��~��}��}��~��~��~��~��������~��~��~��}��}��~��~������������~��~��~�������������������������~��}��|��z��{��x��������RE?^9&��f҇_�sH}4΅bςV�m@�mG�Q-ʐj�P+>l0ٗw�Q0f#�uU�U.ۊ_�\܃WπU�P*h"�W=ϊk�`@` �S6Ŋj�^k2�K-Őp��eh0x<"Lji�kMk+u3�|_�wYf*k-�iI�eG�`L<'     �wT9.-�`G֘oъ^�I)d' -ަ��y_�_V������x��o��j��m��o��o��o��q��r��s��y��n��k��r����������z��t��r��r��r��o��p��q��p��p��p��p��q��q��q��r��t��t��t��u��u��t��t��t��s��s��s��s��s��s��r��o��n��n��n��n��n��m��k��j��l��l��l��l��l��m��m��n��k��l��m��n��n��m��o��p��n��n��o��o��n��n��m��l��l��l��m��m��m��m��m��m��l��k��l��m��m��j��i��j��i��i��i��h��h��h��h��i��h��h��g��g��g��g��g��h��f��f��h��f��g��e��g��e��i��f��h��h��h��g��g��h��g��h��f��e��d��e��e��e��d��d��c��c��b��b��d��d��c��b��b��b��b��b��_��_��^��^��_��_��_��^��\��[��y��w��v��v��t��t��s��t��t��s��t��t��t��t��t��u��w��w��x��w��y��x��y��x��z��z��z��{��{��{��{��{��y��v��x��v��x��v��y��w��y��w��z��w��w��w��w��w��w��w��w��v��w��u��v��u��w��w��w��w��w��w��y��x��v��u��u��u��v��v��v��w��w��w��w��x��x��x��w��w��x��x��x��w��w��w��x��x��y��y��y��y��y��y��y��y��x��x��x��x��x��x��w��w��w��w��x��x��x��y��y��y��}��|��|��|��|��}��~��~��}��}��~��~��~��~��~����~��������~��~��~����~��~����������������������������������������������������������~��}��|���������焒�]SJZ6 �vVЁV�vK�8҆bۊ]�~P�}T�L&�kEoA 3Lӟ�e/=�O6�`=݌aޅYފ^�Zi& <j,Ɖvl2>DȗyzK/4:��i}O71: ��r�O6< 7�y_�cK55�fM�hN�s`N&$  - -   -��~\B51�^Cґgڑf�H)l,ܤ���r�nf������s��o��m��o��p��p��n��p��s��t��|��r��r��x��w�������s��q��q��p��q��p��p��q��n��n��n��n��p��q��q��r��u��u��t��t��s��s��r��r��p��p��p��q��q��q��p��o��n��n��n��n��o��n��m��l��o��o��p��p��p��q��r��t��t��u��t��s��q��n��m��m��n��n��n��o��n��n��m��m��m��m��o��p��p��p��q��q��q��p��s��q��q��o��n��m��j��j��j��j��j��j��k��k��i��i��i��h��h��i��i��i��h��h��j��g��h��e��g��g��i��g��g��h��h��g��f��g��f��g��e��d��d��d��c��c��c��c��c��b��d��d��d��d��c��c��c��c��b��b��_��^��_��_��`��`��_��^��\��\��x��v��v��w��w��v��v��v��v��t��w��w��w��x��y��y��x��v��x��v��y��w��y��w��{��y��z��z��y��y��y��y��w��u��v��u��v��u��w��v��x��w��w��v��w��w��v��v��v��v��w��u��v��u��v��u��v��v��v��v��v��v��x��x��v��v��w��w��w��w��w��w��w��w��y��y��y��y��y��x��z��z��y��y��y��z��z��z��y��y��y��x��y��y��y��y��x��x��x��x��z��z��y��y��{��{��{��{��|��|��}��}��~��}��}��}��}��}��~��~��|��|��}��}��~����������������������������������������������������������������������������������������������������������}����������}��_UL\8"�~\ԁU�yL�8�{T؆V΀O�sG�W/�U0X/CN ”�d6&7�M9�b?�d�Z�^�|Ye% =c*#�rV%5?�{bf>%,7�`K^8%+. �p^_:''5�YCqH6&(�^J�`K�ziW,#'     ��u]A37�Z@Քjܓh�K*g* ס��y��z������y��t��s��t��t��q��n��o��r��r��{��r��u��x��s��v��v��s��p��p��q��q��o��n��n��m��m��m��m��n��o��o��p��r��r��q��q��q��p��p��p��o��o��p��p��q��q��p��p��n��n��m��n��n��n��n��n��o��p��p��q��s��t��v��v��u��t��s��r��q��q��q��p��p��p��p��p��p��p��p��q��t��t��v��v��w��x��x��y��y��x��y��x��v��r��s��o��m��k��l��l��l��l��k��k��j��i��i��i��h��h��h��i��h��g��h��f��e��d��d��e��f��e��d��e��e��e��d��d��d��e��e��d��c��c��b��a��e��e��d��d��e��e��e��f��d��e��e��e��b��a��a��a��b��b��b��a��a��`��a��a��w��v��v��x��y��x��x��y��v��t��t��u��w��x��{��y��y��x��x��y��{��|��|��|��|��|��{��{��{��z��z��x��x��w��w��v��v��v��v��v��x��w��v��w��w��w��w��v��w��w��w��v��v��v��v��v��u��v��w��w��w��w��w��x��w��w��y��x��y��x��y��x��x��x��x��x��x��x��x��x��z��z��z��z��z��z��z��z��y��x��x��x��x��y��y��y��x��y��y��y��{��{��{��z��|��{��{��|��|��}��}��}��}��}��}��}��}��}��}��}��~��~��~��~��������������������������������������������������������������������������������������������������������������������耎�fYQ[5 �tSچZ�yJ�3 �tL�\։U�k=�uM�sQuG-V&wH8�p_O$; yB.�dA�g�_�R�^=h(b'�VL�ndR&T)�WD�dM`7!I%}YMrL9S,L*!xWNkK>P1E&zWCyS>a>+$ *�]L�bO�zjY+( -   �l_X<.<xI/ؕk�m�R1` Кxƞ��qj������u��u��t��u��u��p��n��o��r��w��|��w��y��y��u��t��q��t��q��p��p��n��n��o��o��o��n��n��m��n��n��n��n��p��p��p��p��q��q��r��r��p��p��p��q��q��q��q��n��n��m��m��m��m��n��n��n��n��n��o��p��r��s��t��u��p��q��p��p��q��r��s��s��q��q��q��q��q��r��r��s��x��y��z��{��|��}��~����~��~��}��{��x��v��t��p��o��m��m��m��l��k��j��i��i��h��h��h��g��g��g��g��f��f��f��e��d��c��c��c��f��e��d��e��f��e��d��d��e��d��e��c��d��c��c��a��d��c��b��b��d��d��d��e��c��d��e��d��`��_��_��`��`��`��a��a��`��`��a��a��x��w��y��z��{��z��x��w��u��t��s��s��u��u��y��y��|��{��z��{��|��~��~��~��}��}��|��{��{��{��{��|��y��y��w��w��w��w��w��w��y��x��x��x��y��x��x��x��x��w��w��w��w��x��x��y��w��x��x��x��x��x��y��y��y��y��{��z��|��z��|��z��{��{��z��z��z��z��{��y��y��x��x��x��x��x��x��x��y��y��x��x��x��y��y��y��y��z��z��{��{��{��|��|��|��|��{��|��|��}��|��|��|��|��}��~��~��}��}��|����~�������������~��������������������������������������������������������������������������������������������������w��~�������}��fWP^5!�rQچZ�}N�6 �tI��[�L�X+��\��b�R9^! �\H�yc[.3�I5�V2�f�^�^�pMe$~@)�fU�k\L j;)�u_�mTd6g9*�wj�[H`5$b:0�}tqPAO.T1�tZ�[E^9'&% -�_K�cN�vaZ)+  - -   -  �k^Y<,D zH/ؓl�r�P0^ҙ{ʢ�xg`������u��q��p��q��q��o��l��k��p��y��~�������}��y��w��s��p��o��o��n��o��o��p��p��p��p��p��p��p��o��n��n��n��o��o��p��p��q��q��q��o��o��o��o��o��o��o��n��n��m��l��l��l��l��m��m��m��m��n��n��n��n��o��r��s��t��t��q��p��o��o��o��r��r��r��r��t��t��t��t��x��x��y��y��{��|��}��}��}��~��|��y��v��v��t��q��q��n��l��k��j��i��h��g��h��h��h��g��g��g��f��f��f��f��f��f��e��e��e��f��g��e��e��f��g��f��e��d��e��d��d��c��c��c��c��a��c��c��b��a��a��a��a��b��b��b��a��`��^��^��^��^��^��^��^��^��^��^��_��_��y��x��z��{��{��y��v��u��v��t��s��t��u��v��z��z��}��|��}��{��~��}����}����}��~��{��}��|��~��}��z��x��x��w��x��x��x��y��y��y��y��y��y��x��x��y��y��x��x��x��x��x��z��y��y��y��z��z��z��z��y��z��{��y��|��z��|��z��|��|��}��|��|��|��|��|��|��{��x��x��x��y��y��y��y��x��z��z��z��z��z��z��z��z��y��z��{��|��|��|��}��}��~��}��}��}��}��~��}��}��{��|��}��~����~��}��}��}��}������������������������������������������������������������������������������������������������������������������������������x��`QL\3!�tSփW�~N�3�pE��YЃO�Z-Ҕm�~_�`Gt-�hR�w_P -9 �G4�cB�^�_�^Ԋel* -�B$�rX�veT%s<'��m�{`j4n6%��y�iTf6"f8)ɟ��`NT.]1��l�bK^5#'�kW�hO�t[Y%0  -  -  ��t[;,B -�J2Ӎi�q�I)e$ЗyƜ�tb`������w��p��o��r��r��p��l��l��p��n��v�뀺쀺�{��w��p��m��o��o��p��q��q��p��p��o��p��p��q��q��q��q��p��o��o��p��p��p��q��q��q��p��p��p��p��p��p��p��o��n��m��m��l��l��l��l��m��l��n��n��n��n��m��m��n��o��n��q��s��r��r��s��t��t��s��s��t��t��u��u��t��t��u��u��w��w��x��y��z��z��{��z��y��v��t��r��s��p��o��m��k��i��i��h��h��h��h��h��h��h��g��g��g��g��f��f��i��f��h��f��i��g��i��f��g��g��i��f��g��d��f��e��d��c��d��d��d��b��c��c��b��a��a��`��a��b��a��a��`��_��^��^��^��^��^��^��]��]��^��]��]��]��v��z��{��z��|��z��v��x��y��w��x��x��y��z��~�����~��}��}��|��}��|��}��|��}��|��}��|��~��}��}��{��|��{��{��z��|��y��y��y��z��{��|��{��|��|��|��|��{��{��{��|��|��{��}��{��z��y��{��|��|��|��}��}��{��y��z��z��{��y��z��{��|��{��{��{��{��|��{��{��y��y��y��z��z��z��z��z��{��{��{��{��{��{��{��z��|��|��|��|��|��|��|��|��|��{��|��|��}��}��}��}��}��}��}��}��}��}��}��~��������������������������������������������������������������������������������������������������������������������������������������my�^OJ[2 �oP؅[�xJ�5 -�k?ډT҅Q�T'ܞw�hJ�pV�:#�r[�zbW$7�H7�aA�e�dߋ_Іau1�_=ʈh�oW['�_DՒu�x\k+�S:̎u�lR_+�[E٦��WC\*�I-͍q�^De6"( ( -�iT�kP�uYa+/ - - - -��x\;,C -}D0ِoސj�H+d!ДxƜ�sa_������y��o��s��v��s��o��r��s��t��y�������ꆾ���y��t��s��q��r��r��r��q��r��s��t��r��s��t��s��r��q��q��q��p��p��p��p��p��p��q��r��p��p��q��p��p��o��n��m��n��m��m��m��l��l��l��l��k��l��l��k��k��l��l��k��k��m��p��r��r��q��p��p��s��s��t��u��v��t��u��t��t��t��w��w��w��w��z��x��z��v��v��s��s��r��r��p��m��k��j��i��i��i��i��i��g��g��g��f��f��g��g��h��h��i��j��i��j��i��j��j��k��k��m��l��k��i��i��i��j��i��h��h��h��h��g��e��a��b��b��b��b��a��a��_��b��c��d��d��a��`��_��_��_��_��`��a��`��]��]��]��z��y��x��w��x��}��~��y��y��x��x��y��~���������������~��~��}��|��|��|��|��}��~��}��{��{��{��|��{��{��|��z��z��z��y��x��y��z��z��y��z��z��z��z��|��|��|��}��}��{��{��{��z��z��{��{��}��}��}��{��{��y��z��y��z��x��y��z��z��z��{��z��{��z��{��y��z��z��z��z��z��z��z��z��{��{��|��|��|��|��{��{��{��|��|��|��|��|��|��{��|��~��}��}��~��~��~��}��~�����������������������������������������������������������������������������������������������������������������������������������������������������s��[MJ]6%�mNՄY�~P�3�i=քR΁M�X,֛s�iI�oR�;#�zc�oV^*8�N?�fFދc�cދ_��n~4�|V́a�u[e)�sŨb�yYe$�rTʇj�uZi6��i鰕�eMk/�^C΃f�cId12&�nY�eI�x\e20 -   ��wY9*@~G3ڔrٍi�G)`Βvś�m^[��ʇ��x��v��u��x��v��s��q��r��y�������������{��p��j��k��q��r��r��r��s��s��t��t��t��t��t��t��s��s��s��s��s��q��p��p��p��p��o��o��p��p��p��o��o��o��o��o��o��n��n��n��m��m��m��m��m��m��m��l��k��k��k��j��i��j��m��n��o��p��s��u��u��u��v��v��w��u��t��u��q��r��t��u��w��v��u��u��v��u��t��t��r��r��r��r��o��m��k��j��j��i��i��i��h��i��h��g��g��h��h��h��j��j��j��j��j��i��j��j��j��k��k��j��j��j��j��k��l��k��k��k��g��e��e��f��e��d��d��c��d��c��b��b��d��d��c��c��b��b��b��`��`��a��a��`��`��`��c��d��z��v��y��}��x��v��w��x��z��|��~��|��{��}������~��~��~��~��}��|��{��{��|��{��y��z��{��|��{��z��z��z��{��z��z��y��y��x��x��y��y��x��y��y��y��y��{��{��z��y��y��y��y��y��y��z��z��z��z��z��z��z��z��w��y��w��y��v��x��y��y��y��z��y��z��y��y��y��z��{��{��{��{��{��{��{��{��|��}��}��}��|��{��{��}��~��~������~��}��|�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n~�XMI`;)�oQ܋`�wI�.�h?ׅUӇU�X-՛s�a=�qP�>!�w^�lSh48�PA�aA�i�b��_�o�/ -Հ[Ӏ^āfc!�`ݑq�|\p/�pNƄb�{\b1Ƌmޞ��`Gn*�lQوm�fLi5 1 - �cK�dH�vZtB)+ -  �|mU:'A |I4֗tԐi�O/W՞���j_[��������z��t��v��v��t��r��r��u��y��}��w��w��x��t��r��q��r��u��u��v��w��w��w��w��y��x��w��v��v��v��u��s��r��q��p��q��r��r��q��o��q��p��o��o��o��o��p��q��n��n��n��m��m��m��m��m��m��m��n��n��n��n��n��l��j��k��l��l��l��m��q��r��v��w��y��y��x��v��v��u��q��o��o��p��s��t��s��q��s��s��r��r��q��q��q��r��o��n��l��l��k��k��k��j��j��k��j��i��i��i��i��i��i��h��h��h��h��h��g��g��g��g��g��g��h��h��i��j��h��e��d��g��h��g��f��g��e��d��c��c��c��b��a��`��c��b��b��b��b��e��f��g��f��f��h��f��f��g��h��h��|��z��y��z��x��w��y��~��}��|��~��~����}��~��~����������������~��}��}�����~��~��~��~��}��|��{��}��}��|��|��z��z��z��x��y��z��z��y��z��z��z��y��z��z��{��z��z��x��y��x��x��y��z��z��z��y��z��y��z��z��z��z��z��z��z��z��{��{��|��|��|��|��{��z��|��~��}��}��}��}��}��}��~��~��~����~��~��~��}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������jz�WLHT0 �kMԃX�xI�2 �lBҀP̀O�R'Ԛr�kB�qJ�<�uZ�uZe.7�QC�nN��d݉Z�h�i�:�~\�wVȁee"�wX��w�al-Ȃ^�}�{\d3Ɖjޜ|�fLt.�fNهo�hNi6!0 -�gP�iMÆi�R9/  -  ��qU<(? -tF/՚xՖm�G#Z"Ιw�e[R��������~��z��|��|��{��x��v��y��|������~��v��s��r��v��v��v��w��z��z��z��y��{��x��v��u��u��u��t��s��s��p��r��q��t��s��t��q��s��p��q��o��q��o��r��q��o��n��o��m��n��m��n��m��n��o��o��o��q��o��r��o��m��m��o��n��n��m��p��p��t��u��w��x��x��w��w��u��r��o��p��o��p��q��s��s��r��r��r��r��q��p��p��o��o��n��n��m��m��m��m��m��l��m��l��k��k��l��l��i��i��h��h��h��h��h��g��f��f��f��f��f��g��g��f��f��f��h��i��h��f��e��f��h��f��f��e��d��d��d��b��b��b��b��c��c��e��f��h��j��k��j��i��j��i��h��g��g��~�����}��y��z��{��y��|�����������������������������������������}��}��~�����������~��}��~���������������~��~��{��{��|��|��|��{��{��{��{��{��|��|��~��|��|��{��|��{��z��{��|��|��|��{��}��}��|��}��}��}��}��}��}��}��}��~�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������my�aSPW2"�rTтWՁRv)�X.�~ḾP�T,ڟw�k@�tK�@�vX�|_e/@ �R@�aA�eچW�d�l�5�qO�~]ɂdj' �yZޛ~��fo4ˉf䤁�~_i6ƒdܚz�`Dn+�bIؐx�fNh9%3.�gN�dEňk�R92$    �zfX?)Cj<%ʒoԙo�L'[#��_��~i]Q�����܊�����������턼틽������}��u��v��v��x��x��x��y��|��|��{��z��{��x��v��u��u��u��t��t��u��u��v��u��v��t��t��r��t��s��t��r��s��r��s��r��s��q��r��p��r��p��r��p��r��r��r��r��r��q��q��q��q��q��r��r��r��r��r��r��t��t��u��u��v��u��u��t��r��q��q��p��p��p��t��u��s��s��r��r��s��q��r��o��p��o��o��n��o��o��n��n��m��n��m��l��l��m��m��l��j��i��i��i��i��i��h��h��g��g��g��h��h��g��f��e��d��e��e��c��e��g��g��e��f��f��e��e��h��h��g��g��f��f��h��i��k��k��l��l��m��i��h��j��j��h��f��g�������������~��}�������������������������������������������������������������������������������������������������������������������������������������~�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NVc\JHY2!�jLٌ`�|L}4 �R&ԆUԈW�H!Ԗq�_6�|T�C#�x[��fg48�S?�fEډ^ۉZ�c�r�5�zW�yXǂcf& -�y]Ԙ|��hi0�]驆�~`j3�|^ߝ}�cGl/�fKӗ}�kPg:%/ -�fN�jLNJk�P85'   ! -�oZ^?*J l9$ÉdҔk�I$]!��[ɝ�m[O�����ی�ߖ�ߗ�ۘ�ڗ�ט�֚�֜�Ԛ�џ�ؔ�׋�ݎ�����{��y��w��x��x��{��{��{��{��z��y��y��x��w��u��u��v��u��v��w��w��z��x��y��v��x��u��x��v��x��v��w��u��v��t��u��t��u��s��t��s��t��s��s��s��s��s��s��r��r��u��u��u��u��t��t��t��u��u��s��s��t��t��t��t��s��r��r��q��t��t��s��s��t��t��t��s��t��s��u��v��u��t��u��s��s��r��s��q��r��p��q��p��q��o��p��p��q��p��m��l��m��m��l��l��l��l��n��l��l��k��m��l��l��k��l��n��n��n��p��s��t��r��q��r��s��t��v��v��v��v��u��u��u��u��v��u��t��s��v��r��n��m��l��g��e��g�������������������������������ݮ�ٱ�۳�ݯ�ݬ�ڬ�ڬ�ڬ�ګ�ۭ�۫�۫�ݪ�ݮ�������ߧ�����ߟ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������BDQcKKvK;�sV΄W�xF�f9�tGܐ^ԆV�V0̊h�c>�tQ�B%�x[��ae48�U>�aAֈaي_و]�l�;�uS�}\�yX`' |D)�U;�{_d+�}]яo�pTt7�oRϊm�Z;^'n=}P3�cIY050�iO�jJÂd�L34 ) #    -*{\H^8#Q �K9ύkՐi�mJ�_<֒mЛ|z^R������r��������������������������~���������刽�}��x��x��y��|��}��}��|��{��z��z��z��y��x��x��u��v��u��w��y��y��z��z��|��{��|��{��|��{��|��z��{��y��z��x��x��v��x��v��w��u��w��u��v��u��u��w��w��w��w��y��x��x��w��v��u��u��u��u��u��v��u��t��t��u��t��r��s��t��u��v��v��v��v��u��w��v��w��v��v��w��w��w��v��u��u��t��u��s��t��r��s��s��t��r��r��r��s��s��s��v��w��w��u��t��t��u��w��u��u��t��v��t��t��t��z��}���灳恱��ރ�ވ����܈�ۉ�ۊ�܌�݋�܋�܍�܏�ߍ�܋�ڌ�ێ�ݍ�ފ�܅�݀��~��{��u��o��j��h��f�����������������������i��Yh}�����������������������������������������������������������������������Ҭ�ث�٩�ާ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OCM_:4}D1�_?�[*�a*�a-�l:�r=�n<�zR�zX�}ZƄb�iI͆h��`�fD�R7�w[�yWًeيa܍d��l�fBІc͇cƇd�rP�uV�eG‹l�dDȆdӎmȅh�fIɂdҋk�zW�pM�xX�qS�~]�kO�`K�YBńdɃ_Ҏk�yZ�[B�[E�[D|\Ev[FrWBrS>sR?a?3@ e<(a1^%�E-�a?�\5�U0�Y3�xPLJd—�������UQb��~��t��z��x��j�x^�w\�{e�|n�~|�����Ԝ�ؓ�������������퍽늽ꌼꊽꉼ늽쉼뇻놺ꆺꅺ솻튼퉻쉼늽쌿��������틽���퉽쉽쉽숼뉼뉼뉼뉻숺눺눼숼쇻뇹ꈺ뉷苷苷艷艷舸舸膹膸酹腹郹煹酻醺ꄸ脸脸胷煷腷舸艷舶牷苷芶牵扵懵扵戶熵ㆵᆵᆵᆵㆵㆵㅴ↵ㇶ䆵ㅳ䅳䅳䅳䅳䉳匴獵荵芲剱䉱䊲劲剱䉱䊲劲懰䃬⃩ڃ��|��{�������â�ß����������������������������������������������������������ӈ��z��r��p��n��i�����������������������dy�hXX�sg�se�oZ�vZ�jN�nX�}h�v^�w\Ĉn�x^�~d�zb�qY�{e�oY�lUŌx�xd�s_�{g…s�uf��y��}��������������������������������������������������������������������������������������������������������������������������������������������Ƶ�IJ�������������������������������������������������������������������¯�í�°�ū�ç����ƪ����Ů����ĭ����Ű����Ƴ�±����³�¶�ű�������Ʒ�ɰ�ı�Ų�ĺ�̵�Dz�Ľ�Ϲ�˾�ж�ǰ����÷�ȶ�Ǿ�Ͻ�ξ�п�Ѿ�Ӿ�һ�ѽ�ѽ�Ӽ�м�о�Գ�˵�϶�ӵ�ջ���ܞ�҅��������vTUp5'�@#�e<�i3�b%�a%�l2�y@�d0�k<�f<�^7�b;�c=�iB�jD�vO�lG�hD�mF�pI�wN�tK�]6�iB�sL�b;�iB�oI�c=�hB�gA�a9�e>�e?�f?�iC�iF�gD�mH�mI�hD�nJ�oJ�kF�nK�qK�pG�sI�nD�g>�nD�pJ�oG�qK�lI�tP�uQ�pR�R>D v?*m4_�O-�lF�Z1�O&�[2�}O�g=�qP٦�Ş��[X��~贜����ۿ�ֹΕwƅgɈl΍wÎ~ţ�˹���ɺ�ѷ�ֵ�ַ�ص�ֱ�ұ�ұ�ϰ�Ϸ�ձ�д�ӵ�Գ�Ү�ѵ�ح�Э�и�۶�۵�ڴ�ٴ�ٱ�ִ�׬�Ѱ�ӱ�֬�Ѳ�ճ�ֱ�Ԭ�ϲ�ծ�Ӯ�Ұ�Ԯ�Ѱ�Ӭ�Ϯ�ϵ�֯�Ы�̯�Э�Ϋ�Ϊ�Ϩ�ͬ�ӯ�԰�ϸ�ӵ�Ҳ�ѱ�Ӵ�׬�Ѯ�Ԩ�ϫ�Ӭ�զ�ϩ�ҭ�֪�Ӧ�Ϥ�ͫ�Ԭ�ұ�զ�ɰ�ϯ�ͮ�˯�̮�ɱ�̭�Ȳ�ͪ�ǵ�а�ɯ�ƫ�¯�Ű�ư�Ʋ�ȱ�ɰ�ȩ����������ä�������Ȫ�Dz�̴�̱�Ư�´�ȷ�˱�ɮ�ǩ�©��������������LRtGHfA5IK5BX;@�^^�da�bZ�b[�`V�]S�aW�cY�cY�i_�^T�h`�ga�[S�\S�]T�ZQ�f`�li~VT�a_�{}������}��v��o��q��o���������������������쐞�{_T�mU�`D�b@҃X�k@�lH�wU�jA�yM�zO�mB�V�pG�d=يc�nG�iBЁZ�c<�d?�Z؄`�pP�mO�u\�jW�rb�t��|�ol�ok�rl�tn�qj�uk�rf�k^�k^�ma�g]�od�ka�nd�le�oh�ic�lf�oj�je�id�hb�pj�vp�jg�jf�ic�ne�a[�e_�lg�je�oj�mi�hd�lg�pk�pj�uo�sm�if�so���yv����tn�zt��z��y����������|��v��y�����������������������|��y��}�zt�{w��~�{w�}y����~x�y��~��{�zu�le�ng�nh�ph�le�sl�oi�lf�mf�mh�kh�tq�sq�jh�nn�kk�rp�sq�nl�rp�xv�xv�}y�}y�ys�sm�y�xr�{u�{u�vr�xt�~y�yt��~���������������������������������GIU0 18$/�e_�B-�=�^2�h2�^!�l/�j/�w>�a.�yJ�j>�b6�c8�e:�e9�Y/�mC�Q'�S)�pF�qG�`7�mD�mD�W,�uL�^4�_4�j@�\2�_2�k?�R&�]2�tJ�V,�\2�~T�nF�mD�xP�^5�mD�{Q�R&�k>�mA�rD�m>�tE�Z)�g6�],�P!�f6�b5�R&�mC�lGz8"J �K3�@$i#�Q(�kA�Y-�S(�[/ԀQ�a2�pF�zV�sY�y`�wZ�sP�~\��\�}X�Z�{U�|Wс^�|_��l��w��z�������������������}��������|�~��������������������~�����������{��������}����{��}��w�w�v~�x��v~�u}�u}�{��x|�uz�rw�ty�z�y�z��v|�u{�x}�x}�t{�u|�u~�qx�x�tz�sz�w~�z��y��}���������������������������w{����xz�}��������pu�sx�mp�tx�pt�im�vz�x{�lo�sv�tu�yz�rs�qs�tv�np�lp�lp�nr�hl�dj�fk�kp�ns�ko�nr�ms�ip�hl�jl�hh�gf�ij�ik�kn�jm�be�in�dlN4A3/B*8W05Ov<1�^M�\D�X:�]?�R3�K-�T6�O1�^@�z\�Z;�R7�lP�[?�_C�dG�aG�`H�\F�K5�VC�kZ�����׀��u��o��m��m����������������������򈘥w\S�s\�jO�gD�xK�e8�nI�mH�j>�sB�p?�i8�vE�rA�h:̀R�pB�pA�{M�i;�g<�sH�yN�jB�nJ�xW�}_׏vԑ~NJx�}o�wi��rƇv�~lńpăo�|gňsǍy�tc�{m�}o�tf�~p�wi�tg�vi�yl�vi�vi�na�tg��t�rd�|n�yk�k\�xl�wk�qf�}r�zo�{p�t�vk�~s�t�yn�}q�{p�xk�s��xŽ���s�~m��s��y��xƖ���y��t��r��r��xȓ���vŒ}Ĕ}��v��t��p��o�j��t��w�{j��v�wd��o�i�}g�{gÎ~��q�ub�ua�fP�mU�oV�t[�|c�iP�jS�p[�yg�j[�i[�yk�k`�rg�wl�la�rg�wl�qc��v��s�pb�|n�qc�{j�~m�wf�p_�zg�vb�wb��m��l̘��w\�|a��o�uZ�d�w]�hR�ze�ta�\N>&$&(9�XJ�C*�T4�i?�k:�h1�q:�k7�l:�g8�}Q�mB�l>�l?�k=�xJ�f9�d7�J�T'�j=�sF�l@�j>�l@�U'�j>�e6�a3�h9�X*�[,�h:�M�W'�pA�Y*�a2�wH�h;�d6�j>�[.�e8�sF�K�h8�c4�yI�p>�vD�b0�n<�^+�L�_.�`0�H�f8�X3s/H �H0@!v1 -�R(�oC�k<�j?�i=�|M�k9�|I�wE�nC�e<�i>�S�}R�sGԊ[�sB�tB�n<�c4�k@�rN�kM�s]ān�l]�xl�ym�pd�xk�{n�i\�wg�}m�qa�scDŽt�m]�td�iY�l\�|n�l^�od�|q�pe�vk�}r�nc�vk�{p�f[�oe�wm�j`�vl�yo�^T�yn�vk�h]�wl�ti�h]�rg�rh�oe�xm�h]�sh�xm�h^�od�um�bX�pg�vk�e\�rh�|r�g\�vk�zm�|q�zn�ob�i\�vi�wj�q�}p�n`�~q�wj�se�r�wk�j\�tg�pd�g[�rf�th�eY�th�oc�eY�uh�h[�gZ�rf�j`�mc�xn�aV�sh�nc�_U�qf�nc�k`�th�g]�d\�ng�aV�oa�o`�aR�rd�qc�ZL�nb�pd�aX�wsyKM=^48j51Y{4 �[?�Y7�W1�^8�O'�O(�X0�O%�N$�b7�U-�T+�\5�Y4�W4�T3�U3�R3�O1�J-�W:�pW��������s��m��q��h����������������������v��~h]��o˄fρ[ΆVχWيc�Y֌_ЈXЈXԊ[ӆXٌ^Ԋ[ІWˁTُ`Ԋ]̓T΀RЂTލb�xO�yO�vN�qMЁbǀd�z`�v_�oX�xbχo�oV�|a�}a�nTˈmāg�cN�s^�q\�ePȄo�ua�p\�|h�o\�s_�zf�r\�s]�}f�qZ�zb�zd�lV�t_�va�q]�{g�{g�lX˂o�vcǀlʃo�|i�~k�|i�q^�xbĆoɍuȌt��h��mɏwƌtܣ���h��k��jɋrΑuАwˎrnjnӘxnjl��bnjl��d�|^Дx��kƊpƊp��j��j��iÊl��fהzΈn�sW�bB�jI�sM�uP�zS�vO�hD�iǴa�lO�tZ�eN�pY�t_�jˀk�t_�~i�j�v`֎vщs�{c�|d�}e�g�}dʂj�oVψl�y[�~_ˆgЎlʈe�iF�oI�uN�Z3�mE�lF�[6�jF�fF~L1: -* (C$�\L�mS�hḢ`ш[ՋZՉW܎]�i�b�Z�qC�i:�e7�l=�o?�m<�vG�c5�rD�oA�oB�sH�h;�j=�m@�i<�nA�n?�l=�e6�k<�i8�`/�c3�j;�i:�m>�g8�j;�n@�j<�pC�pC�}N�oA�sE�d4�sD�o?�o?�q@�tC�k:�j8�p?�vE�j9�zL�lF�S?Q�P<�S7�W4�pF�m�iޕl�q��z�p�_ՀJ�vC�wF�m=ւS�rхT�n�s?�r<�l5�b,�yG�pD�uMكbއk�x_�}d�e�sX�d؃f�rW�x[�jM�oP�kN�vY�iL�gJ�bD�sU�}a�vZ�x`�~g�xa�zc�w`�jS�zc�v_�t^Ҁj�q[�kU�|f�}g�jT�|e�v_�hQ�{d�|e�oX�xa�{d�v_�|e�u^�v_�{d�t]�t]�zf�pZ�{e�rZ�t^�|e�yb�oW�t[�sY�qX�mT�v\�uZ�|a�qV��h�x]�z_�e�z`�nU�w^�w^�s[�rX�qZ�gN�t]�z`�cL�qW�pY�fO�u]�s[�rZ�v^�lV�jS�pY�fO�jS�nV�eO�yc�u^�mU�{c�nX�aL�iU�cL�hO�qV�jO�lS�w^�jQ�t]�pZ�bO�sf�TMHZ*(c*!k,�9 �kL�gB�d9�nC�k>�qE�j>�k<�k<�l=�k<�vH�pB�sH�qJ�mF�qJ�lH�gC�c>�gD�tW������~��r��n��i��o����������������������]p~gSH�qY�sS�sL�N�~M�sK�vO�|S�zP�zQɀW�vN�wO�vN�vN�wPˀX�yR�yQ�lE�d=Ԃ\�l�s�rӄ]�|Y�}_�bDŽiɆkǁgǀdІiˁd˄fϊkłeʇlȅj�y_�{a�e�|b�{bǀd�z^�}b�|`�~`�yZ�|]Ɓ`ŀ_�|Z�zZ�yX�wW�tT�zZ€`�yZ�z[�|]�|]�y\�wZ�}`�}`�vY�xZ�kL�sTҗwЕwΕwʑsȏqŌnۢ�Êlĉi͒rҕvʼng͐qʼngȍmːnҗuЖqΓq‡e�~\��cЕwΓu†jˎqÆi��bʎlђq€^�sP�wR�oF�sI�wI�{N�tD�wH�tG�pE�iB�kF�tQ�jJ�pP�uX�sX�v[�uZ�uY�uY�tX�z\�y]�tV�vX�tV�tU�sR�oP�rQ�{[�vV�mL�uR�sN�zS�hA�qG�qG�k>�wJ�{O�qE�mA�lD�kGG'/ % L4*�XDp= r7�X4�W-�V&�U$�[)�uB�}HۈR؆Tڐ_ږgɇWҒbؘhיjښlښlחiЍ`ʇ\ό_Ҏa֓fԑdږiՐfЋa֒eۗjЌ_ْfړeڑdޔgܒeݐd�k�r�nݙlݙlڕk��o�p�r�t�s�r�p�t�t�x�x�vږi��oݛx�l^*{J;t@*h-=�hA�[3�^6�d;�sI�}Qߕd�a�m;�sA�tE�xJ҄V�yJՉX�uD�u?�u@�uA�tA�oB�sH�sM�]�wW�wW�|X�zU�oJ�|U�qL�jC�nG�qH�nF�vN�qI�f>�e=�nF�nI�lG�rP�yY�oO�kK�vV�oO�pP�nN�hI�hI�sT�pQ�jK�qR�hI�oO�pR�nO�lM�nO�rT�sU�rT�sU�rT�jL�jM�vX�iK�fH�w[�jL�jL�uW�kM�uU�vW�lL�jL�iI�uU�^��^�}[‡e�zW��aÇe�zW�vU�tS�lL�tT�tU�rS�hH�mO�fF�mO�uU�gI�lL�tU�kK�nN�mM�pP�nN�jJ�jJ�jJ�hG�oO�wV�~]�]ʊgąb�\ɍk�jM�qT�gG�lJ�oL�gC�mK�kI�nN�kL�mP�kQ�n\vB7@i@�qC�o?�i<�tE�uF�n?�pA�e6�l;�f5�h8�h8�f8�o>�l7�Z$�U �X&�W(�V(�W)�P"�N!�U'�R%�S%�V(�X*�Z.�X,�W+�Q%�S'�N"�V*�O#�T&�T&�T%�W(�T%�U&�W(�X'�^-�],�Z+�U&�S$�^/�\-�V'�\-�U&�Q#�R$�T&�T&�R#�T%�V'�Q"�R$�Y+�V*�e9�b8�]5�d=�f?�c<�\5�^7�_8�`7�Z/�]2�W,�V+�R$�\.�`2�f8�i;�`1�Y*�Y,�i<�]1�]1�d9�^1�h9�j;�d3�U$�T#�Y(�V&�Z*�T%�X)�X)�\-�b4�Y+�].�V'�V'�R&�R&�Z0�Z0�W-�Y/�Y/�W-�W-�a6�X-�\1�_4�[0�`5�b7�`8�^9�_:�]8�a<�`:�]5�`5�c7�f7�].�_.�e4�e4�e6�h;�jFM(2# % g9)s9!�>!�d@�zR�wI�p@�s@�~H݀G�u;�g.�]+�h9�\-�a2�e6�_/�`1�`1�^/�\.�`1�U&�Y(�V%�P�M�R%�P"�N �]-�V&�W%�T"�U"�S �W$�R�P�O�R �W%�P �R#�S$�R#�U'�T&�P"�O"�R#�T&�V'�R$�Q"�U&�V'�V(�S+}1Ls4"v8#v5�;�m@�rA�rA�d3�yH�o?�n=�d4�n@�k<�f0�g/�o;�q>�l;�m:�f1�m5�m5�n8�k8�o@�rE�pD�k?�m@�j:�k8�l;�o<�i8�m<�rA�k:�uD�n<�zH�j8�h9�l=�k<�oB�i=�l@�i@�h<�c:�d9�e<�b7�c:�d9�d<�d9�e=�c8�d<�i@�c:�d<�d<�nF�kC�iA�rK�pH�jB�jB�jB�jD�gA�g@�jD�iC�e?�f>�f=�f=�e;�d<�b:�b:�b;�f=�b;�f=�hA�jC�g@�jC�e>�d;�b9�b:�h@�a9�^6�c;�a9�Z2�^6�`8�b<�c=�d>�^6�Z0�Y-�\2�]3�X.�[0�a6�\1�b7�_4�b8�d8�[1�Z-�c8�\1�\5�Z3�\3�[1�X,�Y.�Y1�S+�U-�[5�Y4�[:�N5^!BN^%f$ -z1�[4�b9�b5�d9�c8�_6�\3�_7�c9�`4�`4�a8�b9�c:�b;�^:�_<�_=�dA�c<�mI�|e������z��l��j��o��n��}����������������������cUL�oW�kK�mE�i:�e4�e9�h=�j;�f7�m<�o>�o?�o?�k8�o<�tA�n:�uB�q>�q?�k:�qA�yE�xA�q:�k5�d0�i6�n:�l:�j7�`0�e3�i7�i7�i9�j9�h9�l<�m>�p@�n?�qA�h9�h9�d5�e3�k<�qA�j:�k;�n>�rA�o<�vC�i9�k;�n>�n>�n?�o@�n?�pA�k<�pA�m>�i:�j;�k<�m>�o@�k;�e4�i:�d5�h=�_3�^5�b;�c<�]6�e=�j?�oE�nB�n@�m?�i;�e7�h:�k:�m<�vD�k9�i7�i9�i9�uF�n?�_0�m=�tE�q?�n;�c0�a/�`.�e6�k<�d8�i=�j>�h<�c7�i:�e6�h6�e6�`1�a2�j;�uH�l?�`3�d7�g:�f8�f8�h:�h:�^0�a3�a3�`2�g;�^5�[4�`8�\4�^4�a7�h;�j;�j;�h9�c1�^-�c4�d5�]0�dA?, " ' -�YI�ZA�E%�lH�f��f��^�|H��h��^�T�I�j7�a1�d6�j9ނQ�tC�l<�l<�m<�vD�m<�g4�k9�f2�i5�h3�['�d0�`,�}I�b,�d,�f/�h.�m4�d,�d,�`'�e+�n3�d,�^'�`,�b.�k7�k9�]+�_-�`/�e3�h6�_,�g5�j7�m:�m9�k9�j>�Z;]�L5�U;�H)�>ՇVډR׆O�g/�Y�T�zG�f3�X(�Y(�X�_%�`)�`-�\)�Z'�a.�^(�\&�Y%�^,�b3�b5�c5�i:�j9�`/�d1�j7�c0�h5�k8�_.�e3�a/�_-�e3�c0�\,�[+�f6�_/�_1�[/�U)�\0�S'�W+�^3�V+�`5�Z/�Z/�[0�_4�\1�c8�b7�h<�e;�\2�_4�b:�`5�d;�g<�e<�e<�h?�_6�_6�g>�b;�f<�h?�_3�d:�b8�`6�\2�`5�`5�lD�d9�b:�Y.�\4�[3�`8�_7�e=�d8�e<�h<�f>�f;�c;�`8�_7�]5�e=�c:�d;�i@�b;�b9�g<�qF�f;�d9�f;�a5�a9�b6�e<�b6�i?�g;�]2�e8�d9�f;�_6�g?�f<�`5�f<�b9�[4�e>�hA�f?�gA�lJ�eH�?)A ['q4!�?%�:�qL�|T�yP�{T�~Y�xU�|Y�xV�tO�tN�wQ�sO�sO�yX�{Y�yZ�vV�nQ�lK�mH̀^��~������{��q��p��m��o������������������������WPJ�_K�\=�U-�O �L�R(�F�Q$�J�N �Y,�L�Z+�H�X)�R!�P�T$�P�_-�R!�M�a/�_,�k8�o<�m:�rA�uD�l=�tD�l?�sD�o@�pA�qD�vJ�vJ�oC�vH�qC�nA�uG�wJ�wJ�rE�wJ�wL�|P�yM�yM�|P�zN�vJ�|P�yM�wK��U�vJ�xM�|Q�|Q�T�yN�yN�|Q�wL�yN�~S�xM�zO�xJ�xJ�|P�}Q�vM�xO�xQ�~Wނ]܀[��\�V�|T�}S��U�uJ�yO�|Q�zN�S�SۀS�|O�yK�~R�{O�S݂V�R�|M��U�N�L�{H�|I�yF�p@�yI�vI�zM�xK�tG�|O�uF�yJ�P�yI�xH�|L�}M�U�Q�{K�zJ�}P�yK�wI�}O�yK�xJ�wI�vH�zL�{M�xK�wJ�zM�uH�|O�yI�xH�|J�P�~K�}K�L�|K܁RفS�mJE3 0* �]J�]A�K(�pI�e�^�Z�}L��g��j��c�W�`.�W%�Z*�h6�V�xF�o<�o=�o<�T�u@�l4�m6�n6�|D�p6�d)�c(�i.��J�s4�j)�l,�p1�A�}>�m.�n/�m.�A�r2�_ �d'�c(�z?�r7�b)�k2�e-�x?�s:�g-�m4�u;�|B�~C�r9�s?�b>`�R8�_B�F"�@ۋV݋QׅK�p7��Q�T�M�zD�o;�m6�m1�v:�s<�tA�qB�o@�l<�sC�p@�sC�rE�sE�tH�xM�xJ�}O�yJ�xI�P�zJ�{L�zJ�zM�~Q�xK�|O�U�{M�xK�{M�zM�{M�}P�zM�tG�tG�wJ�tG�uH�vI�pC�yL�sF�zM�{N�tG�|O�wJ�|O�|Q�vK�{O�{Q�{O�{Q��U�yO��X�}S�}R߂W߂W݀WރW߂W߄W݂V��Y�S߄X�zN�{OނY�~R�~U�zO�xO�{R�~V߂Y݁XۂVـV܃WۂXـTۂX�~T�~T܃YۂXۂXـVقW�}U�~V�|T�~VځY�WـXڂZ�|W�~Vف[ކ^ކ`݅]ۃ]�W؀Z�|U�{S�}U�|U�xR�}W�xR�|X�zX�zW�zV�zV�|Z�~a�ZAC ^*h/u4 s+�X:�S1�M,�]?�H+�]C�W=�N5�W<�G+�Y=�J/�P5�T8�C(�Z=�F,�S8�T7�D"�dG��u��������|��v��u��v�������������������������ZZZtUC�\A�Y3�O#�X*�Q'�P&�S(�H�S(�M!�R&�Q%�O#�^0�I�Z+�T%�Q"�a3�T'�Y*�j;�d5�[,�\-�>�V(�E�O#�L �E�X,�=�U+�F�T)�K"�H�c7�B�]0�K�\1�Y-�J�^4�I�f<�F�d<�M%�W.�U,�D�Z1�I �`7�W.�Y1�X0�U-�mE�P(�lD�I!�b:�T,�Z2�`8�P&�e;�L �g<�O&�]6�P)�T/�`;�[9�_=�U1�jF�W1�iA�U-�W/�d?�N(�pH�T+�a8�W.�j@�lB�a9�e=�N(�b<�L$�h>�_5�sG�b6�_3�nB�U)�mB�U*�qG�Y/�jA�c9�\3�lA�^3�tI�]2�nB�]2�oC�d9�j>�j?�g;�yO�e;�xN�d:�qG�_5�_5�c9�`8�tJ�_4�sH�d9�k@�b7�mB�m@�j=�i:�c3�wJ�h<�xL�g=�wO�iIk:+4 ) + -�YD�bC�L&�mC�_�[�V�xF��k��k��e�]�[,�^-�h9�b1�U�zG�U#�a-�q=��S�k5�n7�t=�p7�zA�s8�j-�m0�k.��B�v6�t1�|:�s/�}<�~;�o.�u2�m+��>�r/�d!�n/�e&�}@�t7�j/�y=�n2�{A�k0�c(�v;�}B�D��G�v:�}I�kFc�L3�W:�G$�>ԁOۄN��O�d-�X�Z�|J�sB�b2�g7�a-�b.�g9�d:�lF�d>�iB�^5�i@�b:�iC�g@�gC�lF�b;�pG�h@�pH�lF�jB�oI�xR�nH�g@�tP�jC�tP�e>�oH�hA�g@�g@�`:�hA�a:�kD�a:�mF�_8�g@�gA�`:�f@�\6�oI�c=�pJ�_9�gA�a;�fB�jE�a<�gB�a<�iD�b=�gB�hE�`=�nK�a>�sO�gC�vQ�fA�oJ�iC�hD�b>�_;�oK�]9�hD�`<�fB�fB�d@�jH�[7�oK�Y5�kG�c?�b>�fA�X4�iD�T2�mJ�Z8�fC�]:�[8�b?�W3�cA�R0�aB�X6�]>�_=�S4�eC�S4�lJ�X9�cA�Y;�X6�aC�Q/�];�K)�Z8�U6�O/�]?�J-�aD�F*�Z<�P2�V8�Q7s6!; -Z*V h-]�B)�:y( �D+n �<(�:%w*�C,q%�?(t)u*�:"g!�D*e"�E,~7x/�L1�|p������������x��w��x�������������������������irwaK>�kS�[8�T+�W+�N$�X0�V,�M"�`7�Q'�`6�P&�T*�_3�Q%�d8�U)�[.�c6�Y,�j>�oD�pD�R&�V*�C�R(�E�Y2�E�P*�U-�E�]7�D�d=�A�Y0�S'�E�^1�C�b6�M!�T(�L"�U,�\2�D�jB�A�^6�E �G!�[2�@�c:�A�^5�J!�R)�V-�E�`7�=�\3�:�W.�G�H�U,�:�X1�8�c>�=�Y4�P+�J%�O*�A�eA�=�d=�6�S/�I'�<�^<�1�c?�C�X6�M+�Q0�S2�E$�W6�<�W2�6�]8�8�G$�I&�6�\8�1 �d>�3 �[6�C�G$�O-�C!�T4�5�S2�0�Y6�:�J'�F$�<�V5�3�]<�/�bA�3�X7�;�C%�O.�:�Y5�5�Z6�, -�X6�>�N*�D!�>�U3�6�Z:�2�W9�A'k@0( -$ *�^G�cC�O*�sG�`�^�V�yE��j��i�`�]�\-�Y+�h<�e7�W�xG�R!�`-�r>��V�j4�r<�wA�m5�s;�q9�j1�q8�e,�y=�p4�t7�~?�o.�~@�?�p2�y9�f(�{<�n/�g*�p4�`#�z@�r8�k1�v>�n5�|F�i2�a*�x@�{D�~G��J�p:�yJ�gE^�L6�U=�F)�;�~R�T�S�c1�W�[�vL�[4�'�P0�1�<�;�0�L6�'�W>�% -�T9�.�O4�>#�; �R6�,�Y;% �S9�-�D*�9!�B*�C+�-�L7}% �[Ey! �O7�-�<$�@'�,�O7t" -�Q9t" -�C+z(�4�9!+�K3w# �O7v" -�O7})�C*�3)�P6t �H0p�C+u% ~.�3�1�=$o�Q8n�O9w%�?)�9"�2�F-p# �R8p$ -�F,p$ �9!�6u)�G.l �R;h�M4u% �4�=&u%�Q:r" �I2x(�>'�2}/�?(q%�G0e�F0u-�6!�?(l! �J3j �F/s&�6|.t(�@,k�E-i�B+3x-�A0e�D5h |4t,n*v9'S5 DKZ&Z�H2�A)~6�?&b{:&w6$e&�D/a#|?*g-g*�C.c" �C,_!�W>�A'~;�P9��~��Α�������w��x��|�����������������������������gVN��uLJdώdϋ^�}R̃Zȅ[ÂXЌe�U̇`�}TŀWόaāWʇ\DŽY֓hˆ\�|Rӊaц^�tJ�[2�_5�O%�_8�K$�^7�N'�Z4�K%�Q+�W1�I"�e>�=�i@�G�W(�Z-�J�j=�L�i>�A�g?�L$�S-�c=�A�e?�<�[4�P)�I"�jC�A�g@�E�c<�R+�W0�X1�Q*�a:�<�g@�?�`9�Z4�G!�]7�=�jF�E!�a?�H%�Z7�V3�M+�gE�B�pL�;�fC�E$�N0�[:�F%�gE�F$�qQ�H(�eF�S3�K+�X8�C#�fD�;�nM�;�`A�@!�N-�X4�?�gB�8�b=�:�_<�G&�Y;�W9�C(�]?�1�nN�4�eE�<�R2�P1�?!�bD�4�fH�8�mO�> �X:�M/�H'�Q0�:�cD�2�`A�3�\;�?!�J,�T5�:�`E{3�`Gx>(]8(( #' �eN�aA�M(�nD�[�W�R�}G��j��e�]�_�Y(�V(�\.�f8�S�yH�j9�q>�h4��M�m7�s=�t=�l5�r9�r9�m8�s;�f.�y?�j0�p3�s6�l/�{?�x<�j.�q5�_"�q4�l/�j-�o4�^%�w>�s:�l3�m7�q;��N�g1�d.�t?�vA�wC�}I�r?�vJ�bC]�M7�V@�A&�?�~U�}P�O�g6�W��e�xN�`>q�P:t(�E,�9%�6'�B4{)�VCp �V?p" �O7�5�?(�H0u( �Z@n�[Fx'�K6�/�@,�<)1�I8r$�XDj�WCo# �E/�@)w,�R*n-x5"y6#d!�D1^�=*k$v/w0k$�?-e -�B,f 6#~7#d!�E5[ �C3e"r.q.a"n6)I0 <R)#Z(d+�^J�[B�]D�P7~<$�N:�K6B-�S>�D/�R<�K7�G3�Q?�@,�R<�L3�v`�cJ�_C�iV�����׊����z��w��w��x������������������������𠴿bUM�fP�eC�j@�n@�b4�f:�`7�f<�hA�a8�d=�c;�`8�h=�jA�e:�i>�rG�d:�j@�yO΁W�W�wO΃Y�pφ]҉`ِgʁX؍f΃\΃\τ\τ\ԉ_�|Rߖk�Sψ\͆\ǀVْh̅[ْh�{QՎdȁWχ_Ј`�yRӋc�vNщa�{T�~W΄]�wP΄]�nĜ[�wP�|U�wO�tO�~X�iD˃]�gB̃`�rQ�yX�pN�hH�}]�_>Ɓ`�`?�}\�sR�jJ�tT�iIφf�bC�~]�]<�rP�iE�jF�vR�a=Ƀa�\;�vW�aA�rR�fF�hH�nK�eBĄ`�R/�uR�P-�iD�_8�^7�pG�W-�oF�N$�tM�Q,�jH�\9�V5�`?�F#�tN�D�lF�D�d>�V1�V3�a>�B�hE�>�vS�A�fC�I&�V3�V3�F#�kJ�>�kJ�9�hF�>�S3�T3�N.�^?|?"�Z=qA*J*) -" %�R>�K/�C �iA�l=�j7�i5�n7�P�Q�H�K�d0�o=�j8�k8�J�xC�u@�xA�m8�|E�w?�x@�v=�o6�t9�s;�r;�p9�m5�v=�l3�m2�n1�j.�w;�s7�j.�n2�e)�q5�q6�o4�l3�b)�n6�p8�n6�m6�xA�L�o9�v?�|G�zE�wD�{H�|L�{Q�bD`�?&�F*{9�@�rF�h6�d0�c-�zA��Q�|M�d?o% �T@n(�M4�;(�?/�K;w*�U>m#�X:l'�`Cy4�O5�J-{4�U7s-�aGo)�Q7�:!�A'�F-|9�Q:l)�\Bb�Z@n-�F+}< ~;!�N4l)�P6d!�O5o,�K1y6u2�F-r/�O6h% �T;i# -�R9~8{5�B(p-�Q9j(�P7l,|<#s3{;"w7m-�N6f$ �S;o+�H3y7v4�I0j*�S7i+�I0p2~B(s7i/}C+g+�O6k)�K4p.};#?&s1�J1v4�L4{9#�C+�?)�>&�D-u3�K0r5�Q5B&�E)�L0s6�S7y< �N2�@%�F*�F+�@$�N3>"�Z?�F)�J0�N4=%�XB�D.�YC�C+�L2�F,�G0�O=]1&- 0c81o;.s6$�nW�sX�wY�sV�dG�cJ�eL�eK�jO�kP�jN�iN�fM�oZ�kX�bJ�fN�wa�oY�yd��������؄��x��u��t��t��q���������������������������nc]�hQ�mJ�rG�p?�o?�m>�h9�pC�sF�oC�rF�qE�o@�n?�m>�m=�i9�m=�l=�pA�k=�oC�i<�`5�c5�f8�g;�e8�m@�k>�lB�mC�e;�f:�nB�n@�m=�o>�qB�rE�sF�pC�tI�zM�rE�oB�wJ�{N�uK�vL�rH�rH�sI�xN�wM�uL�pG�rI�sJ�vL�xO�yOςX�~T�xQ�}U�yQˀX�uM�|U�yU�~Y�~YȀZ�~X�wQ�~W�xQȃ\ǂ[�yS�|Vˁ\ˁ\�{Wʀ[ɁYъ`ɂXɂXԍcψ^ՍeЈbщcωeՏmҌjʄ`ˇbˇ`ҎgԑgޙpԏfՐf֏eՐfړiҍcאfϊ`ړiϊ`ڒjՐgّkגiӎeܙnԑfӐeՒgהiՐfҍcٔkՐgޖnّi�sܔl�uڒjܔlגiّkגkԌfݘqЈbޖpЈb֎hҌhґkёmƊfĉg��jG'.(- -rB.{:�6�b8�l;�i4�j3�j1�G�|D�q9�n5�h4�j7�p=�k8�k5�e/�e/�g2�i5�l6�l7�n7�m6�g0�j0�i2�n9�h3�j5�h0�i2�h.�k1�d*�g-�d*�a'�c)�d*�i0�g.�d*�e.�b+�b+�f/�j3�m6�r>�n9�j6�r>�q>�n=�k:�l=�pA�g>�[@`y3x7{7�?�rC�k9�h4�d-݂I�F�wCӂU�zZ�b�xWІc�|^Յj�dӄf�^�{TՌc̃Zُh�|W׋g�[Ѕ^Ѕ^Є`ۑn̓`֌i̓`׎k̈́cшg҉h΅dφc�~[ӊg�~Zщcʂ\̈́ã`�|Yʁ^�tQ�~[�sPɀ]�xU�}Ẑ_̓`�{X�}ZӉf�}Z҆d�zWԊg�vU�~]Њh�}]ьk͈gяmŀ_ǂaǂaˆeЉiъjъjȁa̅eɂbъj˄ḋfΊgŁ^ʆcˆeΉhƄbʈfƄd�~_�zZ�|Z�}\͇e˄dʅdȁa�^�yYʃcȁaʁa�_�}]�~^�}\�}[�}[�|Z�~\�}[�|Z�{Yǁ_ƀ^Ƀa�|Xƀ\�zV�~Z�}Y�}Zˁ^�zW�zX�vS�yX�yY�}]�xX�xV�|Z�nL�rR�w_�O>< 3\.!b-j*�S5�`?�[6�[6�V1�P-�R1�T1�S0�Y5�V2�V3�X8�R4�Z<�J)�M/�cG�cJ�iR�{r��ȋ��}��s��r��r��q��o���������������������������Ѕvo��j֊f�d݇T�^�_�[�\�Z�X�Y�X�_�_�]�\�I܅O�W�T�W�V�n<�a/�_-�f3�e4�l:�k<�i:�i:�j;�i:�g6�n=�q>�m8�k6�g5�m;�i7�g5�h8�l:�j8�e3�o=�o=�m9�o;�m9�j6�l8�q=�j9�j9�m<�d3�`/�c1�c2�i7�m>�k;�i:�i9�j:�n>�d4�f5�e6�i:�f7�m>�f4�`.�b-�a,�_*�e0�a/�c1�h9�^/�e6�e3�f4�[&�e0�d/�\(�d2�q?�yJ�~P�vH�nB�f:�nB�qD�xI�qB�qA�n>�m=�a2�e7�`4�^2�^2�_3�c7�\0�b3�]/�`1�^/�\,�`/�_.�d3�`/�h7�h7�_/�_/�c3�a1�].�].�\-�e6�g8�j;�d6�h9�c7�_3�a5�d8�`4�a5�g9�a2�c4�e7�f:�k@�d:�iH= & -# +�WC�X9�J"�pA�\�X�V��F��a��Z�M�yE�tC�l;�|K�~L�wD�s@�uE�wG�rB�yH�tC�yF�zH�zG�|I�~K�wF�vC�uB�wA�vA�t=�xA�s<�s<�t>�r<�r<�xB�yE�vB�t?�vC�uB�r=�vB�yE�{G�yH�zH�{J�~L�|L�~O�~R݀U�T�uQ�[C_�=#�C#�B�A�[�W�U�i8�O�V�K�d-�^/�f8�c0�d.�]-�_2�a4�a2�d0�f-�k2�n5�i3�f2�c2�g7�c3�e3�a1�a1�d4�c3�]/�c4�b3�b3�\+�],�_.�\+�]*�])�_,�a-�^,�`0�[+�`0�Y)�Z*�]-�[+�].�Z+�[,�[,�[,�b3�b3�_0�_0�Y*�].�a4�\.�e6�]0�i;�f8�h9�_1�j<�e7�d5�k<�f7�h;�f9�f9�g:�i<�h9�a3�]/�a3�a3�_3�b6�`4�a5�a8�_3�c5�a2�d6�c4�d7�d6�b5�`2�_2�b5�c6�b6�b4�_1�_2�c6�_4�^3�\1�]2�^2�`4�\/�`3�c6�c6�a4�c6�\/�d7�^1�b5�d7�f9�_3�e8�a4�c7�`4�[.�\.�a3�]1�]5�cD�J3>7i6!i2o- -�^6�vH�k;�o@�yJ�wJ�sF�uF�tC�uD�yG�vF�zL�vI�tH�a2�N �sK�zW�hI��t��È��y��q��o��p��p��p���������������������������֛��‰n�t�e�]��b��f��`��_��\��b��_��]��e��g��d��d�M��\�Y��J��a��a�L��L�T�R�]�]�[�a�a�a�`�c��d�]�]�[��_��b�]�[�]��X��_��^�W�Y��`��a��^��[��]�X�W�S�T�U��V�R�P�S�R�S�R�V�V�Z�S�W�Y�U�R�R�O�O�Q�O��M�N�R�U�X�V�T�X�T�R�O�P�R�Q�R�U�Y�X�[�X�S�VہL�S�R�V߁K�O�RނO��S߃R߃T�P�TނQ�T�Q݂KۂJكJׁH܆MׁH܂MہL�|G�J�~J�}G�vB�|H�yF�}G�wA�yC�|H�zF�zE�yD�~J�{G�{H�L�yD�wA�I�yB�xB�vD�uD�vP=- .&�hS�dC�K$�rC�b��b��`��I��p��g��\�R�l:�s@�vD�r?�uF�sD�pA�m?�m=�O�qA�qA�n?�rB�sC�tC�pB�uE�m;�|I�q=�n8�p;�q<�l7�r=�n;�m:�tA�wD�tA�uB�uC�tB�vD�|J�xG�vE�vC�S�P��Q�W��WۀT�S�{Q�xU�aKX �F-�T4�H#�?��j�\�Y�p@�X��\�O�o2�l5�i2�r5�s4�r8�s9�p6�u9�y9�w5�|9�{;�{>�}B�}E�zC�v=�y@�y?�u;�{D�{C�t>�~E�{C�u>�zC�{A�v?�x=�|A�w;�}A�x=�{A�w=�|E�x?�r9�y?�w@�v?�v=�x@�v@�wA�yC�xA�{D�{D�|E�xA�v?�}C�x>�}E��L�}I�{E�|F�}G�|E݀G�F��K�}G�~J�|H�L�|F�zE�yE�xD�}F�{D�xA�{G�zF�yG�xG�xH�zI�~K�I�}G�L�~I��K�L�L�L��K�{E�I�~I�{D�{D�|E�}I�{K�uE�{J�}M�{J�yH�yE�xD�|G�~J�|H�}I�K�~M�|K�Q�O�}K�~J�~J�M�|H�L�J�L�L�S�~Y�{_L -A�J3�G*m$�oD�W�l8�J�V�Y�O��X�V�R�T�P�P�Q��O�uB�QׁRߑj�kJ�����ʼn��v��r��q��p��l��j���������������������������כ��ʼno�t�f�]��h��c��]�T��c��_��Y��b��c��b��a��b�U��_�W�P��g��j�S�U�Z�^�]��d��b��d��`��]�\��a��i��a��\��^��b��e��^��a��[��\��]�X�P��W��i��g��`��_��\��\�X��[��^��]��Z��V��[��R��Y��[��[��]��c��`��[��\��\��e��_��a��W��\��b��c��[��_��l��l��i��i��j��e��e��g��b��g��a��c��]��^��_��`��e��d�Z��Z�R��]��[��_��^��c��a��]��c��a��f��e��f��i��c��b��`��a��c��a��\��_��a��d��d��d��d��[��`��a��]��Y��Z��\��]��[��Z��[��Z��`��[��e��`��`��`��]��^��c�c�pH521 �hR�dD�L%�l@�b�b��b�O��p��g��]�W�j2�g.�i1�d/�g9�l>�a5�e5�e2�~J�d2�Y(�T&�Z*�d1�b0�R&�P$�[*�uB�q9�p9�c/�i5�h1�p=�b5�e8�f4�p<�o=�k:�_2�^0�]-�c3�V*�Y+�_*�s9�o7�i6�f;�b8�l@�i;�g7�mE�XAV �H-�W7�E%�B�`�S�Q�r?�W��^��W�P�P�Q�W��\��`��V��[��U��R��R��Y��Y��Z��\��_��_��X��T��T��S��\��d��_��_��[��[��[��Z��\��[��[��Y��Y��Z��^��]��_��_��\��V��[�W��\��Y��[��`��W��`��`��e��c��`��b��\��^��c��c��f��f��b��c��c��\��^��b��c��d��a��a��c��]��]��a��]��\��U��]��[��b��d��^��f��i��g��`��b��_��^��i��e��a��^��]��]��\��b��U��Y��[��Y��]��d��c��a��^��Z��_�Y�X�U�U��\��\��]��a��`��\�Y�V�U�T�T�U��Y��U�Y�c҃ePB�E7�G1v' �oJ�Z�l7�L�S�P�R�W�U�V�R�Q�P�}P�Y�qF�N"ۃUێd�nO�����́��w��p��n��l��k��k���������������������������֘�~ˍt�p�j�_��j��f��[��h�\��b��^�[�_��k��d��b�T��`�Z�R��o��j�Q�T�_�a�\��h��f��\��c��e��b��f��d��g��Z��[��_��b��d��b��^��_��_�Z��Z��_��d��a��d��Z��[��Z��X��Z��]��Y��a��X�N��V��U��Z��Z��_��_��_��_��X��_��c��]�W��\��_��a��_��Z��e��h��j��i��f��b��g��e��b��g��a��i��f��Z��]��`��Y�^��b�U��S��X��W��`��\��_��[��a��[��S��\��W��^��`��[��a��\��X��X��_��[��[��Y��d��_��_��Y��T��R��[��_��\��]��Y��[��\��X��U��V��Y��S��^��]��c��]��^��[��c��b�b�rG851 �fP�cE�L(�mA�d�`�_�L��j��b��Z�W�n3�a'�q:�s@�mA�sI�oE�[,�n;�|E�j7�P�i<�wH�{H�|J�pE�S*�[.�zH�s=�j2�l:�p>�tA�vE�oF�lA�n=�o;�uE�g6�j<�k;�rB�sG�qK�`6�d0�zA�y?�e0�f:�i?�wJ�}N�rF�qL�XBS �L0�[;�D$�=�\�W�Q�p<�S��X��W��T��X��Y��`��V��d��`��[��_��[��\��\��]��^��`��a��\��X��X��W��Q��_��c��a��\��[��Y��X��^��]��[��X��Z��]��Z��a��b��b��Y��Y��\��_��_��X��Y��\��]��W��[��f��f��_��h��\��a��X��]��_��e��d��_��a��c��a��\��b��b��e��a��]��]��c��^��d��`��]��Z��]��a��b��a��g��Z��i��e��b��b��^��^��d��d��c��_��`�\��_��[��Z��Z��_��Z��Z��]��a��`��b�V�W�Y�T�O��Z��U�X��V��_��_��V�Q��T��T�P�P�S�Q�T�W�SֆeRC�E8�H3y( �lG�W�k6�L�R�P�T�T�\�U�V�Q�Q�X�}T�zS�U-ۂVև^�kM��������t��p��n��l��k��l���������������������������ٖ�|ˍt�q�k�b��m��n��h�ZلN�{G�~M؂Qފ[�l��f��c�V��b�^�U��p��i�Q��X�`�a�_��c��b��n�d�`�]�i��o��j��`��_��_��c��f��d��_��g�^�V�X��b��j��g��b��c��[��`��X��\��^��_��e��`��]��]��b��a��a��`��_��a��`��\��`�Z��c��g��_��i��e��c��]��f��d��e��e��b��e��g��g��g��g��k�d��h��a��[��_��[��f��`��Y��Z��Z��d��d��j��j��b��e��c��^��]��a��^��[��Y��f��_��^��f��f��`�W��`��c��e��\��Y��W��T��\��`��`��_��\��_��`��W��_��Y��S��\��Z��b��a��h��c��a��c��p�j�wD:6/ �fQ�aC�M)�oC�a�]�[�L��i��b�Y�Z�o5�yB�q:�e4�N%�H!�f?�rF�g5�J�p=�wH�sF�g:�W)�R%�|U�Z�b8�uF�p=�t@�p@�]0�X)�[/�pK�tN�e7�n=�tC�rB�q=�tB�Z,�W/�pO�uQ�mA�wC�}D�n7�|L�uH�_2�_5�mJ�z_�]MP �K.�Z9�B!�<�W�V�T�p;�P�T��V��W��]��`��X��`��\��c��d��_��b��\��[��Y��Y��]��_��Y��X��Z��N��S��^��b��d��^��[��U��W��Y��X��]��\��Y��]��_��[��e��d��a��a��X��b��^��[��X��]��\��\��a��g��d��g��b��`��_��\��^��d��d��a��a��_��a��Z��`��d��f��`��]��[��]��a��f��b��d��]��c��c��b��_��h�U��b��a��Z�\��^��]�^��b��g��c��_��i�]�^��`��V��V�S�V�Y��^��e�^��_�^�a�`�X�U�V�]�P�Z�\��`�U��W��[�V�W�Y�Y�Y��Y��W�[؈gS<�E6�H2t) �iCۅR�l5�N�R�P�V�xQ�xQ�yN�uJ�~W�Y�]�X�xS�P'�{OЁX�jJ��������t��p��n��m��l��m����������������������������ڔ}wÅl�u�d�^��j��m�U�}F�a/�M �J�R'�nDӅW�e��f�^��`�]�V��f��d�R�Y��e��e��c��n��i�Z؊Y�~L˅Rُ^�q��n��^��a��g��e��`��h��X�T�{I�K�wBہO�b��k��f��^��^��[��Y�U��`�Z�P�~M�zG�yG�`�]��e��b��c��c��Y��\��^��a�~K�N�}L�{L�b�a��c��a��f��f��c��a��l��a�WނQ�yL܃Wފ\�f��h��Z��]��^��f��f��Z�T��c�[��\׃U�]�d��k�_��b��_��_��`��`��b��_�]�Q߁N�[�^��c��d��f��b��_��[��X��T��X��d�[�\�T�U�]��a��_��Z��W��Y��a��a��f��i��c�W�\�_�n㡁B950 �iT�`B�N*�rF�b�\�]�M��j��c�X�V�m7�wA�}IĆWĆa�bAz8�h>�m<�}J�{I�~P�sI�zQȉ`�]7}6�a@�f>�wK�yH�zH�xLӆ\�V�Z3|3�S2�rH�n>�rB�}K�~K˅R��T�f@q1�X:�rL�uG�zEۉQ�|I��SÊ_�fCs3�J8�eVP�H,�T4�A"�@�V�R�S�p;�Q�W�U��V��\��]��]��W��`��e�]��\��b��_��Z��Y��X��Z��b��`��[��[��T��U�X�]��a��b��W��V��X��U��W��\��^��]��]��a��_�\�X��`��a��`��g��d��X��X��a��^��Z��_��^��a��]�_��e��_��X��`�_�^��c��`��g��e��b��]�^�Y��b��^�U��]��_��]��`�^��\��`�_�Z�[��S��_�]��a��^��[��^�^�^��c��e��c��a�U�W�\�b��d��Z��]��[��a��c��c�`�\�^�~W�X�zP�]�\�T�[��Z�Y�\�R�X�T�wN�rI�rI�uL�{O�[�U�VՂ`LC �F4�J2s* -�iB׆Q�l4��M�U�Q�T�mJ�iG�gB�iD�hF�jH�vR�^�sM�N%�SՆ[�iI����́��w��q��n��o��n��n����������������������������ݗ�zȊq��|�f�`��l��b�|D�m8�c6�}U��a�wR�X3�xN�`��n��b��c��d�R��c��e�N�Y�a�d��h�_�Y�e�nA�X,�g:�i=؎g�g��g��f��a��f��a��^�X݅U�pB�Z-�U)�\1�}Xކ^��g��b��]��\��]��]�NۅR�T�g<�_2�i<�|Tߋ_�f��d��f��b��\��]�X݆P�M�e8�V+�f<πYփY�a��d��f��f��`��e��f�YنT�{M�j@�hA�{UЅ[�`�\��]��]��a�\��a�W�zJ�yL�pK�lF�qM�xQ��b��s��g��_��b��X��Z��[��L�{F�pA�nB�nG�rI�N�c��g��e��]��a��W��Y�U�zE�g9�b6�d8�pB�zL�Y��c��Y��^��[��`��`��g��c�xG�yJ�oD�wN�|W��m> 621 �mX�`C�P,�wK�e�b�c�R��k��e�X�Q�o9�Kԗh��Z�sS�z_�Y:y=�tF�zI�zJӆZחq�}Y�wV�sT~E*t1�pK�{Q�j9�Pݖl��\�zV�zZ�M2r/�jD�xJ�sD�{Iޚi�zK��a�zW{M5f,�]�|P�{H΁KДb�f:��g�x\~M<`*�\PP�L0�U4�A"�C�X�T�S�s>�U��Z��V�T��W��W��Q��V�T�tJ�zO�}Q�|P�V��]��]��[��Y��`��b��`��X�Q�J�yL�uI�xM�vG�U��R�R�R��Z��U�W��`�X�Q�|M�wI�vL�lB�S��`��a��^��Z��V��\��Z��X�U�P�tJ�tK�}T�|R�^��\��\�]�`��c��b��b�`�~N�tE�qG�yN�tF��R��b�V��^��\�Y�[��_�W�{O�zP�lF�rK�oD�sD�Z��_��X�Z�^�^��d��_�Y�uJ�eB�lJ�tT�kG�Z��^��[��V��b��e��a��i�_�xS�dB�a@�jI�pL߆\�^�X�T�[�S�W�P�tJ�vR�[9�X7�jH�iD�qG�\�V�}[O<D2�F+n'�g@ՄO�i0�zF�R�|L�wL�lK�hH�aAw?m-�bD�nJ�zS�uN�I �QԃX�cB��y��̈́��x��r��o��o��n��n���������������������������Օ~vΎs�q�d�^��g�Q�u@�o?֜tƘv��qǜ|�vU�iCՅT��j�\�_��bވM��h��e�N�R�a�_�XއQ�yG�n@čd֩���g�~Y�lI�~V�i��b��d��b��b�T�}J�n@�}UՙtLJa�lF�aAӃ^�`��f��b��b��b�X�X҆U�xNǍgŋe�a<�gDхa�c��i��l��c��h��a�VԃL�k;�xN�X�jE�P-�uOۉY��j��d��f��a��i�V݊V�zJ�kA�{V�lJ�K*�vQՉX�a��d��`��a��k�`тJ�{M�nG�jH�jL�M.�b@�zT�c�f��b��\��a��[�E�I�n>�^5�dA�I)�S0�yOׇT��o��a��f��Z��]�W�~E�vD�X.�^7�G �<�\4�vJ�b��e��\��e��[��g�[�wI�e9�Y0�J"}C�T5�oX8 1-. �p^�`C�R.�zN�f��c��d�T��h��f�Y�T�s<�iƓf�}X��z�����hyH'�yN˃S�{Kאfƒm�yZ��x����s^zB)�Z:�vK�tEُbЖp�mK��qĠ��iTG0�c>�pA�}KσR֝p�iA��g����u]�V>�X8ׄ\ւS̄R̜n�vM��k����f[�ZSsC9L�R8�Z:�A#�A�\�Z�W�vA�Z��[��V��T��V��U��L�~E�mB�b<�J&�B�]8�yN�W��\��]��Y��Z��a��_�V�xE�o@�Q'�H!�E �mB�zF�R��R�O��W��V�V�Y�|L�vJ�Y/�D�=�Z6�lD�[��b��_��T��Y��[��Y�V�tD�j>�Q,�@�>�tQ�wO�U��[��^�]��`��]�Y�~P�h<�Z2�E"�7�g@�k?ۀK�W�U�U�Q�T�Y�N�sK�^9�H(�8�D!�jB�xH�R�U�V�]�_��`�[�uI�gA�Q3�;!~.�gF�rH�W�]�Z�\��a��a�Y�xS�sQ�`B�B(o)�W:�kF�S�Y�X�Y�]�M�yK�sM�iJ�aE�E*h#�J)�kE�h?�U�]P? -B/�A'o$�e?فO�f0�wD�P�}N�pH֛{ș}�oU�u[uH3b(�kJ�kF�{V�L"�yK�zM�a>��x��̆��y��s��p��p��n��n����������������������������ٔ}uʊo�c�^�]�V��K�l8Ջ^ɗt�pT��������f��aЃU�^�Z�X�Y��M��d��c�K�U�`�^�Y؁KӅU�w��pǤ��wX��r�fHŁ\ՁR��_��]�Y�X�}D́O͌bkת��jI˘y�cF�{XۇX�[��`��_��\�[ڊW�}MϞvʢ�oO��r�^B�qQ׈_��n��o��k��h�Y�VσOҗkǗo�wT��b�cD�[9̂U�e��c��c��a��gۉQؑ]��Z��bØv�rU�|_�T2Ɋ^܏[��h��d��l��l�[̅O�S��Z��b�cI��sxE(�uT�zR��q��e��b��]��]ڀD�zFАdʒo�z]�|a�V7�R-�tF�i��d��a��b��Z�N�s<�j;Βm��l�uR�oK�T/�nEׄR��l��`��c��b��c�~N�pE�Wˑl��a�}\vN4gF32.,, �p^�_D�Q.�yM�e�a�a�T��f��f�[�YՂL�o��W�pP��{��r�hRyR5�oF͉Z�zLӐf��c�fK��x�n{\J�ZE�^>�}U�pDהi��`{^@��p��l{^N�[F�a>�}O�xEؔe��_bD�y\��sp\D�kQ�V6ք^�xNӎdĝv�|\�u\��|{`U�sjY1'H�T;�]?�D&�A�]�^�[�wC�Y��Z��W��V��V��T�D�o9�VՓq�_�jI}B"�O*�}N�V��^��\��^��b�\܇Q�|Kʇ\Дo�}[�J)m)�wGՀJ�Z��T��V��\�Z�Q�{R΀Zˑl�\�_As1�V0�sI�\��[��Y��\��X�P�}IҊZ̋cÈf�x]�[D|6�}[�yJ�U�R�U��_�O܁R�{Pώh��i�~b�bIf*�a>�uF�Q��\�U�S�T�~H�rBԉbՔt�kQ�jQv>#{9�oA��M�Y�Y��\�_�V؂Sͅ]Ȑm�qX�hQ�L6h) -�oF�M�_�\�V�X�Y�{Mӏj��k��f�xa�W@]' �fD�rI�X�R�S�N�S�sGчd��e�}f�{duG/X�]:�nG݀WՂ`N@�C1�C*z$ �cA�Q�g4�vF�R�qBۜs��vƪ���}��z�reU$�Z=�kF�xR�U+�|N�xL�a=��t��͉��{��u��q��p��o��n���������������������������ԉqg�tX�tI�|G�J�k2�r;�l:ؑg��kmU;�����otT;��d�xK�sA�{I�n;�n5�r6�C�D�K�P�_�W�N�~Hܔd︑�}]�{_����zb�}cɊg�{L�S�S�N߅I�x@Ԏ]봋��h��f��~��m�zb��d�|O�T�Y�T�Y׀KԋX�}��r��i��|�����m�qV҇`�i�e��i�\�V�Z�u֥|��d���Ȱ���o�fH�V��Y��g��`��`��`ߐXژfޯ��|W��s�����t�|_�tMҊX��h��a��g��hӄLȅQƑi��c�}a�x_����qX�W8�tN�m��f��`��c�L�}DؖbΚr�x\�zd��z�|a�kI�oF؈U��b��b��T��T�y?�r=ݚo�oM��k��c��i�kL�\7�~P�\��k��f��c�S�n>�|UԚu�{Y�rP��w~eOU>0+/*( -�o^�]B�P-�uJ��f�`�`�S��e��c�X�X�|Fښj�_7u`C�zi{i[q\Iz[?�lFɆY�sFؙp�dCr`H�uf�pdr\OsN;�`@ʂZ�uHɌ`�a?p_Ezr_xqafTHzWD�iE̓T�tCښl�qT{gOwhS�~hocM�iO�M,Ӄ^�|Tǃ^�|\�x^j[F�}lp^R�qgT/&H �S;�]?�J,�F!�^�]��^�wE�W��Z��Y��W��U�P�w<݇TҒn��r�mS��i�bIt=�rF�P��Y��\��^��a�T�{Gܟs��]��k�tW�mT}J+�AҀP�Y��X��S��\�V�~LՆ]Ɋi��c�gM��l�mQk, �oH�vI��`��Z��X��X�WɁOߩ{��]�z^��r�o]K6�L.݂U�O��W��W��U�R�zKۗp��a��k�lW�p\�fQk.�tJހM�W�R�P�R�s?�gƇdÑx�xe��o�dPf0�e;�sB�Z�V�Y��_�}M�S͓n��h��s��s^Mm>$�K"�q?�^�V�[�^ނQ�|N䮊�{^��~����o^}WBy:�lF�Z�P�T�Z�{N�wOՙw�w^��~����q\iA'y4�e@�xQ�}[R@�C/�D+{$ �^=�xK�a0�oA�xK�tIᧂ��x~m[ƽ�����kesI=�F)�oK�a<�M%�rD�tE�a=��o��ϊ��}��v��r��q��o��n����������������������������ՒwnÀc�a�U�P�O�u>�o=ؓj��akYA��}�~nmS<�a�xN�V�O�M�I�w9�U�R��I�~F�p;�f.�p7�|Fݖj㱌kP3fV?���nXC�^Hĉi�vH�d/�o5�d(�t9�|Fؘh湐oT7eS;IJ�zaK�dN��b�tI�c/�n6�h.�p7�}GՏ\鶋�jJcS9���ydQ}^L�zc�\�oB�{H�wA�q6ڄK�_�����^t]>����~hkVC��l�{U�qC�}H�}C�t7ڄIޑ[�zЦ�qW6�v]���dO>��k�{W�R�{F�Y��JۂJՂLӌ^֢}{V9`J2���S>)]=&��f�yU݅W�M�L�F߁DوPٟo��ev\E�����~wbM�{`�wR�zJ�R�P�I�}C�wA�zIݢz�`D|jT����pW�pU�V6։_ނQ�W�V�P�P�qB�u��g|aC��u���wjZK=2(&(( -�kZ�_E�K(�uJ�d�`�`�S��c��a��Z�XׂLݝm��Z��k��z��~�p�cK�wṘ]�oAђi�uWr_�|r�|txg]|]I�cEʂZ�uHӕl�nOymWywj�}tpc[�cQ�[9�}N�{Jܝr�pZ�pa�ug��orgS�lT�O.�~Y�wR�|Y��m��oviX��vzn`�zoS2)H�ZB�`B�K-�?�b�[�Y�wE�U��[�U��X�K�P�zD��t��n�ya�������zg�`E�[1�xE��[��Z��_��\ރL΄Sب��nQ��r����xe��ok0�xM߁N�W�U�W�O�vE�}��e�jT�����w�oZ�[=�]9�uF�U�U��X��R�~M՗h̢z�oQ��|����j]�tdl3ۆ]�}I�O�N��Q�vB҄Vڢ}�rV��l�����w�k_j3�lG�xK�Q�S�O�K�vD�u��i�iTƬ�����nbxK6�N+�mA�S��R�O�X�zK܊b��o~cN�������k`�ZH};�uE܀M�J�|IހM�{I֏cҧ��sW��y���{oa�tdc*�lG�h;�sA�qA�sE�uJԄ_ҡ��q[��t����td�oZb%�lI�c>�mNO C |?*�C)u!�X6�rE�]+�g9�g:�rHӝ{��zfZN������q\[kC;�B(�lG�\7�C�oA�tH�eA�}k��Ί��{��v��r��p��o��q����������������������������ؘ}rƃf�e�Y�S�S�yB�wGܘq̫�dU>������oYD��iɀW�\�T�V�R�A��_��d�J�S�W߆N߁K�}Jڕk黙�qV[P<���gVD�]I‹m�T�T�P�J�HՀJԔfܲ�jV;aVB���raO�hS��k�}T�M�T�N��L�zD֒a䳊�sTg\F���i\LnTG�yẽb�S��O�J�~D�}Eݏ^�w�yVyhN��qmfVgWH��n�{X�yMބP�}C�|B݄Jގ[�~��pr]@vgR�}ldRD�iU�rS҉^�tB�M�}E�}GրMےe͘v`>#WG.��tPC0V;&��n�gF�c6�|E�u:�e(�u;׆Q̖h�lIgXE���oh^jZK�gR�{\�lA�uA�s=�i2�i2�t@ρS��_kQ:\SB���e]J{`K�^@�zT�Y+�u@�r9�b&�zC�o@�{�bE}lP{vY�~ge]R9.($%'& �iX�]C�K(�wL�e��a�_�P��a��`��[�Y�xB�~��`��h��|��z�zmcN�tR˄Z�j<ђi�y\�yh��{�{vxibxXI�bD�{R�yMٚq�sWul[~~v�{od^�cT�]<�{M�zGޝs�p]�tk�vm�uvjZ�mW�E&�|W�qL�\��q��u{n^��zzqb�~qR4,F�U?�`B�H*�A�^�Z�Z�wE�P�W�L�p8�^&�u>�xD�z�sY�kX����u�pb�lW�M&�tC�d-�m5�k1�n7�LՈZ��q�q\{k\���xnd�tdt? �iB�\,�_+�`,�_)�xC�uE֟x�qUweW����{qdQB�x_�Y6�g:�b-�r;�`*�h4�b3іj��t�v_������wk�k_p>'�rJ�U#�b.�e0�T�j9�xM��j�}e_XF������t[Tb1"�uT�[0�\/�k;�X(�k9�n?יr��ktcS�����{�ngnG6�K-�vM�\+�k7�e4�\,�yI׌e��i{i[������{li�fWr6�d5�^+�g3�f3�g4�f5ʊ^Ա����{xe�������zn`*�lH�Y,�c3�k<�`3�g=Ԉd��l�}islb���vrg�rbb(�gH�`=�jKL ->}C/�E+r% �`>�S�k9�wG�}Q�zRЙz���h^U������xegkF@�H-�sP�sO�O(�wJ�zN�hD��t��΋��|��v��q��p��o��o����������������������������ז~rÂd�d�X�O�S�xA�vGܛs�Ŧ�g�����s^I��n�{S߇WނO�R�M�|>��^��d�P�W�^�U�Q�~Lޛp�ʧ��waZHŽ�qaR�cPŒp�|R�X�W��X�M�yEӓe滘o[C[TB���wjZ�fU��lҀZ�Z�X��Z�T�zG͆X㲊���qiV���tg^qYM�}jцf�f�Y�X��[��Nڌ\���p�r[��}wl`OE��{�z]ۈ^�d�X��]�T݇V�uӯ���i��o��rl^S�rb�pUېi��m��a�Y�]߇Uَd��lW5QA*��t4(6 ��r�qQ�a��b��[��\�|E�|Jڥy��el`R���kfbqcZ�aQ��l�}U�a��b��X�P�r?фX��bu_Ja[O���aWK|bS�T=΀\�W�[��V��[�I�qEޟ|�dHvjR��k�lie\?74#%(' -�hW�]C�L)�zO��f��c�`�M��`��`��\�X�j5ߜo��s��{��������z�dO�mM΅\�oA֗n�x]xh����}|mh|\M�hK�zS�wLߛt�t[|pb��~|qfb�dU�a>�xL�wEߜr�q^�qj�sm��{vh_�n\�A%�|W�|Tэf��q��r}p`��|}sg��vS6.D�Q;�`B�F(�@�Z�Z�\�zG�U��\�R�|D�o7�}F�sC�z�lV|j^�{s�ohwb]�hY�D#�xJ�{E��S�J�L�L؅[��m�seqd\��{nkf�pdxB*�c>�sE��O�N�{F�}I�{L̜v�{bxg`���tliaPF�ta�_@�qD�L�M�K�{I�f9Ԗo����wg��}��{��wtYNp@*�wP�q@�P�~M�sB�}P�sM��q�xd^\O���wsjp\Ud6'�rQ�zP�~R�U�X�|P�qGʕs��noh^����|xpiuQA�L/�xP�U�P�L�U�sDٕp��r�vmywx}�rff�i^t;�l>��N�R�P�L�q?Бfϰ����wte�������}v]$�dC�zL�O�}N�{P�rKۏm��y��uphe���~yu�thc)�kM�tQ�{\T>y?+�D(j#�d>܆U�m8�yF܄V�wNՠ����od`������yjmgF?�C'�nJ�}X�N'�xK�|P�c?��s��̉��|��u��q��r��r��q���������������������������Ք~s�~`�c�X�P��W�|F�tFޞxڻ�sY�����~mXE��k�xQ܈YۄO�P�MڀB�]��a�N�T�]�Z�V؀Nڗm�ƥ���ZTD�Ƹ�|m�jX��lֈa�\�Z�O�K�zGӐc㸕q\Gyqd�·~pe�iZ��j�Y�Z�Q�U�O�xF˂U츑�׽sjY���naYt^S�wd́a�d�[��X��\�L�xJ䪄ճ���u���yofgVN��t�|_�c�e�Z��\�R�{L׏i��������x��zi\S��r�oV֌e��q��`�]�Z؀Nӊ_ƔsT5]K7���9-<"Ïw�uR�a��d�T��Z�O�{Lҝsֹ�ndX���vqnsd_�g[��hՂZ��j��_�T�R�p?Ԋ]��hydSokb���h^Ug[�ZF�yX�X��Z�L��X�M�h<䨆�lT}u`��{����zIDA#&() �jY�^D�N*�|P��i��g��d�O��a��`��[�V�n:ؕh�nNwhS�~pqmbrdYtUA�jKӆ\�pAғj�hOicU}xtulmj[XuSG�fG�X�rFݗs�dNk]TvrqqmnhZW}\K�_=�xL�wH��r�p\vh_}ol���n_X�l]�B&�zU�yPьc��b�yatgW��tuka�vnX;5F�Q;�`A�G(�@�U�W�T�q>�T�Y�M�M��K�}G�|M᥁��z��~����~{�ok�h[�M-�vH��[��S��P��T�{Gڅ^ę���{~tr���rrr�un}F1�pK�S��U��]�O�O�qAΤ~��r�sp���zvuuh`�wf�\>�tF�O�S��M�|J�vFŊb����~r���������|aVsC/�xR�}L�Q�P�Q�vJ�{W–}�}ollb�����~kgnC3�vS�S��_�V�|O�[�sJǖv��ytsn���}�uovVG�I-�}U�R��O�K�V�zKٙv��t�xv�������tv�h`n7�d:�V�L�S�Y�qBԖmΰ�����s��������}^%�cB�xI�N�P�zO�uNՋh��~��xvw�������xod'�gI�rO�rSL Ay?+�E*k& �d@ڈX�k5�s@րQ�rIנ����zom������ymocE=�E)�pLҀ[�O'�{NԃV�c?��q��ˉ��|��t��q��t��u��t����������������������������֓t�~b�d�Y�T��`�O�{Nכv��pyiO����yilWD��m�{Uތ]܉U�W�W�M�_�a�O�V�^�U�M�uCόb쿞���haQ���m]N{\J�dڌe�^��`�Y�K�r?ˈ[店u`Kd\O���xja�qd��iԂ\��_�Y�Y�R�uC։]��ֽ}qa���pf]p\Q�vbӊg�c��^�W�Y�~K�wLߣ�ĩ�����}sjiVO��q�}a�a�a��\��[�U�{MӉd�ʬ�����u��|obZ�}o�tZՋf��x��c��`�_ۈTϋ\ǛvR4cN;��u/!;!��p�rO�b��[��\��\�~M�}PΗn���znb���wqqvd`�pe�gԁW��d�U�P�L�sAӊ_��n�vgzv���h[U�ka�R@хc�[�V��S�P�K�sH⧇�yd��s��{��{vroHBB$'(+�l[�_E�N*�{O��m��l��h�O��b��^��Y�U�j6֒eΩ���y��w����{yXE�lMԅ\�o@Ֆm�qYwod��|stsdayYL�gG�}S�rF�x�jWsd]�z|{uwqc`�`O�a?�{O�vGޖp�s]zi_~sm���qb]�nb�D(�}W�wKӎd��b�}e{o_��|zpg�{t[>8F �U>�_@�I*�@�Q�R�W�t@�W��]�O�K��P�N�~Oߥ���v��x�����}�ur�ma�N+�wH��Z��R��T�R�}HՃ[��~��~vs���xvy�njH3�mH�T��N��Q��M�I�m=Ѧ���q�|y���}}{slb�sa�X:�yJ�O�Q�R�~I�uD˔k��|��u��������}y^Sr>)�|U�yI�M�T�V�}Q�{Y”}���jgb������mkl@3�zU�yH�T�T�yJ�_�rJ͚{��srn�������ystTE�J-�uK�L�Q�L�V�vK٘z��}�{z�������rv�e_p4�e>�W�K�O�T�j;ϑhɭ����~zo�������us\"�d@�zK�R�Q�~Q�{QՌi������~ux�������ysb$�hJ�{V�}[OAw8&�@'m!�^;ւS�h4�q>�zL�tMƍp��v`PP������rbbcC8�I-�vQ�}X�O'�zMՄY�cA��q��ω��|��u��q��t��u��t���������������������������֒~u��d�d�X�S�]ڀN�yPٟzΰ���n������{fS��s�|Xً]ڊU�]�\�L�Y�Z�I�R�^�Y�P�sDǂYᴓ���i`O���eSEwXD�rWу\�Z�\�[�L�{GDŽW֪�jU^TJ���pbY�ob��hׇb�^�\�Z��Z�zFфV������qeW���cZQn^Q�}eۖo�f��c��^��^�V�|Q᥁��rzkX��wkbYdSK��o�{]�d��f��d��b��Z�~NЈ`ͪ���qtn^xthdWO�la�oVԊe��{��g��e��h�[̌\ǝwY>!]H7�{nL>3E.��j�zS��i��f��b��e��_�{Nڣzͮ�\NC���jebn\X�h\�}eԁW��f��c��_�U�xEъ^��`jZK]ZU���i^Zf_�XHцf�Z�Y��X�O�~H�sH৉~cPxo`�n�rjig>:;$&*+�m\�_E�L(�yM��o��m��i܃K��a��[��Y�U�n9�p���p�����z�t{XE�qSڈ`�tEٚo�xb~vk��|stqc`x[M�nM�T�xKݙt�o\ufa~x|ztxmb\~_M�`<�S�yK��t�rZ�qb~un���xkc�sd�F*Ԃ\�xLגh��h��jzsa��}{pj��|Y>7F �V?�_@�J*�A��P�R�U�yD�S�V�T�M��L�N�yK⦂�t`�{o�����{{pl�rd�P-�yJ��X��T��T��W�Jٌb�{g�zrxso���vty�rn�M8�rL�L��M�I��U�H�wGΡ��sawlf���xzwqj`�o]�^@�qC�N�N�M�NڀLŐd��o�r���������|_Ws<(܃[�{I�N�H�K�Yʁ`��x��zieb������|llg?3�qL�Q�U�O�W�S�xM͖w��sgcb���~uptTE�L,�yM�N��R�S�Z�wNГv�ylvnk������~km�jfo5!�gC�W�O�M݁R�rCϑjç����trf��������`'�d@݅U�N�Q�wJ�zN֑j��h�~nwqs���}qu�rlf(�nM�yQ�|YN@ -|=+�E.p& �bAمW�o:�yF؀R�|TӚ}���k]\������ygekG;�F(�vQ�{V�L'�yMҁV�cB��w��щ��|��w��s��w��w��v���������������������������֏|u��h�h��]�W�\�}M�uNۡ|�������ѹ���zeR��r�{X֌_ٍY�b�^܆KއR�T��L�P�Y�U�R�uFʅ\黚Į��zi���kXJ�fR��hу\�\�W�W�H�q<��R缙��}lbX���se\�k]�~eц_�V�V�S�O�zF�|N﷒���xo^���g`Vl`R�|bώd�]�W�X�Y�S�zPܝz����}g��ysqdaUI��o�uU�_��`��Z��Z�O�zF͈^ԯ���oyrb~xlaSJ�l_�aI҆b��x��n��k�fڊUԔdśsX= ZC3�~t3&9$��m�qJ�f�Z�Q�[�Z�|M֠t��zbRE���fb_fYS�fZ�|cҁT��]�Z�T�T�xEΊ[��__RBWXR���XOJu^X�\L̆d�`�\�T��W߄M�vJ⫌~cRtj^�}m~|o]][@>?$')+�m\�^D�K'�yL�k��j�fׁH��_�W�U�V�sAܙnɡ���}��{����|zWD�lO؆^�vGٜp�{d�xm���{{tie}cT�sPƃV�wKՕq�q`ylf���{qha�fQ�c>ԆX�{N�w�r[�p`yrh���wja�r`�H*ҀX�~Pٔj��m��mysc��~}pj��~W<5G#�W=�`>�F$�A܂M�R�V�}G�R�R��T�O��M�}H�uI��|x]JhbV��ysofmd_�tf�T1�yK��]��W��T��[݀Gܓf�t\wk]llbx}wecf�pj~J2�{O�K�H��L�N�M�yJ̙|}bQnaY��}gjc_VM�sc�bF�uI�Q��R�S�I�Q˗g��brk[���vyn��v}`Xt;(ނY�}H��R�I�RބPΆ`�va}ibXVW���qqsuikf@5�oI�}G��S�G�I��U�}NΏn�sgf]^���zz|xpmoSE�I&�{K�Q�L�V�^�oGÊl�rcijbvwq�}xykj�iaj3�kH�W�R�O�X�~Pӓm������uwj��������}Z$ �nG�X�V�P�V�}Nԓi��r�~myuv����~��vm_# �lH�wOρ[M: xA,�E,k( �eBօV�o<�zG�P�|Sڥ����kb]������|icnH;�F)�vQс\�N)�~RՃ[�hI�����҈��|��x��u��w��x��z����������������������������ٌy��s�t�k�g�iֈZʂZۣ��à����������iS��r�yXԑgْd�i�d؋U؊ZوY�{J؅Q��]܏[݇V�sF�Y帗�����qɻ�r\O}\I��c˃[ߏ^ߒ\܍UߊT�wF�S轛���uiY���{i_�ma�}fȃ\ڊY�^ߐXߊT�zHĀS䲍ë��ze���oeYwjZ�}e†a��c�Z�V�UҀN�xMަ�׺���s��xwsg`TF��l�qO��`�a�U�Z݄L�zH͌bὝ���woZ�|jcSD�n\�X>͇e�u�d�[�a֍Zڝn��nW<T=-��y. +��q�~YֈX�Y�V��QڀL�zJڥ{Ѳ�hXI���nkdfYQ�qb�z`�~T�W�V�P�P�{FLJY��lf[IWXP���wlf�tk�[H��\ֆUߊS�S�P�~H�qG㮏�q^~rd��szvjijd;:6$&'( -�m]�_E�L,�{Q�j�h�eЁI�b�X�V��W�wC�x��s��s��}��x��ryYD�qR҉`�xHӚo�w[�sc�yr~vspe_|bQ�pL̍a�Qڞy�oZtc[�yz|vvoe\�gR�f@ҋ_�~Q�|�e�raui��wgX�q\�R1΀Y�zO΍e��h��kzsc��|mf�xW:2H$�V?�`C�D#�D҂O��WލV�xCލV�\�S�N��P�M�xL���va}wk����{utkd�xi�Q0�zN��[��U��U�TۂHؔe�~c~ufstl���pom�tm~L1�zO�}B�F�I��N�HҁRӝ��|l�wo���rsmlbX�{h�bF�rF�P�O�Q�M׀KМl��q�}l����������i^uA,ՀW�~H�K�Q�OڂP҉f��t�zp`_]������{mlb=-�sJ��L�P�J�P�NӁQՙu�owni������zvlRC�N)�|L�U�N�^�_�hAÎn��qy{p��|����|y�f^c0�lI݌W�O��Q�_πUЖqƮ����{}p�������{pW(�qJ߉Z�Q�U�W�~OӘn�����sol�������ujY# �sP̀VφcK<vF2}J/i.�mJՌa�uE҂QЃU�~Tў���j`W������lekG9}D)�pN˂a�J%�UʂZ�eF����Ԋ����{��x��w��w��x����������������������������ݏ���̹�̭�Ш�͡�ƛ������뷒ӫ�έ�ն������}Ϩ����������������������uݘnݞrٜmԔhȊaɓm⷗������˻�xbT�[H��fɏg۝lٝgԗa֒c�}V��d潟Ƶ��~eͼ��ti�nc�i��\Аbѕcѓ`ъV�{J�~V׳�Ѿ��v[���n\yfU�yd�c̋eӏ`ӍY֐]��N�{Mϣ|�¢��r��}xpcfVG��k�jHʇZٓ_ؒWאX̅Q�wHlj`�Ģ���vmN�|_`U9�uZ�Y=��c�vߒd��`۔^�yF�vJ—uW8H6 ��o2! 0��o�~]Ӊb܊[�[ߍUӆP�zGУ|۽�q_Q���mi^h\N�p_�uZ��XߕdݍXތTۄN�uAƍ`��jl\L\XO���xkb�se�^F�WԌZԇSۋV��_�O�zQ௏�jwfV�o�}plh_A>7!#$ ��s�u`�{_駄����������z����y�qГ\�~Jݪ}à���z����~��sy^C�sOƐd��RΛn�xU�x`��t�zpzj]�hS�rO��_�Sۤ{�nU�iZ�|u�{v{g\�eO�a?��]�|Nܥ|��j�yd�xi��x�jS�tW�N,�}Y�xT��b��r��n�vf����qc��rS7)A�`P�oZ�\A�eC��z�{�w����w��k�Z�S�P�~Vݤ��s_zqh���}turl�q`�]=�{P�[�W��U�UلKВc��d�vjpok���snj�xkvD+�zR܆I�G�O�Q�~G�{Mբ��wf�vp���vroi\S��k�a>�yM�W�T�R�Q҂Qўq��t�~n��������||gTqG.�}U܄R�S�T�]ւT̈e��r�zj\]U�����|�rid;%�wKօN�T�VބRىXƄT˛s��johX�����~�~unYF�Q,ȂQ�Z�W�aކ^�Wʙx��k{xi��{����uv�faf7%�sQՍ[یTގYڎ]ÂXʜz������zxk�����z�yhQ( �sNݐb�[�`݊`�RƕlǬ����unh�����~�yjU'�lL�YϓqD4 uK;�YAsG$��]ܠ{ؘrڛpܟs֛sϞ}�jp_OĻ����xf\sSF�\FГwߦ��pM㬃ܧƕt«���̎�������w��x��w��z�����������������������������STO�xc�|\�}U…X�U�}R�nE�sJ�zR�[��g��g��j��lǑmǏl†bȊcąZϒe䩁ﱊ���������︑ޮ�ğ������������z굕����’�ɕ�ʗ�ę������ݬ���t��|£������~㭕����Ė�ʜ������������෗�����z�����r�~gÛ��¦�ʩ�ȝ�Ț�Ô�Ė����ÙΧ���w�����x�r]��z屌����đ�Ɛ�Ï����~���ت������|��kJ�|^��r賓������������겁ӟwǙxxS8�s[���^D+[< ��rʕu�����{��u�oܤsڮ�ţ��o^�����q~iT�qZ��nۡ{��t�q��oٕdӠu��s�mX~l`����zj�mZ�iNɒk�tߛj�h�pԕiƏfݱ���s�t]�������vhG?4+"%!-�rd�pZ�fOˉgښjؗaٖa�r����Í�Ǐ��������yU��b�����v�z^�uV뺒�ɝ������̜v��q�����������p٩��Ǜ�ʝ���ʙx��zŦ������v��fԦ��Ɲ�ė�—ˠ���v���ƨ���y��o̒m�Ğ�Ţ�����`�vW�������ya��n�raT/�eV�n[�iO�sPߢv�p�w�j��~�������l�[��WǀV۩��x`�tg����zz�ia�vb�U6φ[�i�`�`�`ԇSЗj��c�td�wq���sg�{hvD+�Z܌W�Uߔ]ܓ`ۋZԍcџ���q�yo�����~o]O�~c�iC҅[�c��_ސ_�eܕiաy��o�zl��������v�iRoF(ΐi؎_�a�e�d׌dՖu��w�}ism]�����}�rdg?%��Sԑ]ߑa��b�lۖlʏeÕq��gzhT��|����xmv[H�W3ʌ]�l�h�n�qӔkТ~��m�wb��z����ws�pfqA*��eߟs�l�m�q؝uӥ��������{i�����y��ni= Šg�r�x�}�}ߤx֦~��|��r�t�����q�}isA&Зyߤ�઎I9 �fZ�o\�[9��d魋㣀謇�訂ޣ�ř~��n�����������xѓ~���媌��^ܧף|Ӣ�Ӽ���͒����~��~��}��v��v����������������������������ieY�kM�jA�m<�n;�d3�e5�j9�f7�k>�h>�fD�gE�jC�f<�f;�g:�h;�l;�g3�j5�p?�qC�k=�nA�qD�pC�vK�}S�yO�yN�~U��^��_��`��c��Z͈_ǃV†Tɍ[ƂU�yQ�wU�|Y�U��\��b��g��gƇf͌bɉ[ň\Ɉ^ʁX҈aˉg�a��g��i��f��oŔvɔtޟ|זpԓiޞrٚoݠt۠tњqŏio��q��rș{ɔt�~�z�x�}�}�~�y�uҏrЗ|Œu��rʟУ�Ӡ����������汉ᬌΝϠ�ʝ~Σ�Х�Ԩ�뻓�ț�“�Đ�ŏ������֨�Ǜ�خ�Ω�Ş�Ѡ�����Ş�ʟ�ͥ�Ȟ�ɝ�ƚ�ƞตĞ�ȣ�ٯ�ͣ�Ϧ�Ҧ��ß�̢�͡�Π�Ң�̞����Üѯ���α�ǭ�����|l:,!7*"2# 5nC3s9#�;"�kJ�xH�r=�m9�vB�{IсNډTݍXՉXʁTюdΎhɍhǍh��_LJaӎeҋ_҉^Ή_dž^ĈdʒqƑq˕sȐm֘sٚqԔhёȇeŎe��hŗvŔv��nϗvיtٖlЍbˍhËhœr��lŔlɔj֘oڙqٖlϐg��[˗oo��f��l��h�}hJ#xI7q;#t5�G�n>�q>�m9�h4�xH�Nٓb�u������Ⲋ��d�}h��������t��m��l筅�Ô�”���������뷏��r��l��w�����o��x�uZ䥆����������������Ҥ���y��q��������n��vĞy鲉����ŗ�ŗ�Ę���鵐ř|��v��������{��p�vV��“�ɚ�ȝ���쵖Ț���n��u��������w��f鼓�Ŗ�ś�›�Þ������৊đ|��v��������|��w��l譃�������������긓��w��u��~������Ó|Ïj����������������ᩆʗx��o��i��u��r��w��e⪉쪈��ꫂ�٤|��n��m�zf��n�f��d�wV̍lєwӡ�P*7W4.Z0"^+�S2�a?�\9�c?�d?�`:�^:�_9�b>�b?�[8�_>�[;�^@�^@�T4�?�\3�[5�`@�wh��˒�މ�����|��}����}���������������������������ujV�]Ԋ[ӂMՂL�J�f3�j9�k:�n=�h9�jB�nI�kA�l=�k:�p>�tCЃOӂJ�|C�J�yG�j8�i7�e4�g8�kA�g<�h;�qA�r@�vE�vF�k>�kA�h?�k@�l>�s@�l9�i;�sH�iB�i@�sB�tB�sH�kB�rK�qG�n>�p@�jA�iB�nE�c<�hD�eB�lI�hD�tQ�kE�mD�mC�kA�k@�k@�nB�oF�i@�f;�pE�nD�kB�oG�oF�h@�nE�mE�mC�j?�oA�m>�oA�l@�g@�hG�hI�pP�qN�lI�oJ�nH�lC�mC�n@�sB�p@�i;�j?�f@�lH�gC�pI�mE�lD�pD�qC�p?�zH�s?�o<�q>�k:�i>�jC�iF�hF�jE�nH�nE�pE�j>�k?�rG�kB�j>�nB�nA�jC�dF�lN�mI�lH�nM�hG�nG�mC�sG�wH�wF�vD�qB�oC�pG�vN�uL�uP�uW�s]2(& * ~M<�A(�C(�nK�uD�t?�wC�wD�W��N�yC�l8�l8�p=�n?�k<�k=�o@�o@�k=�l=�i:�i;�l=�k@�nC�lE�mE�i?�nD�kA�nB�f8�j<�i8�m<�k>�mB�e;�nG�h@�h@�g9�h:�l@�lB�kA�i>�qC�oB�pD�i<�qD�rC�i9�tC�qD�oE�iB�kI�V@>|E0�F*�>�C�p>�j4�o8�e0�uC�sC�sE�yL·YʆWÆW��T��Y��`�f��g��h��a�}U�S‡[Ɍ`ΊeҌh͉b��Z��\��Y�~^��e�~]�^�{\Ίg�}Tʇ]ljdˍhʇ\ņ[�|Z�{\�yZ��a�|]�wW�tQ�{U�{R��V��T��SÀU�~T�yR�pN�mR�lU�oY�nR�nM�sM�sI�}O�zG��O‚T�sK�rO�rR�oO�mM�jN�iM�nR�lJ�yN�vH�sG�yP�qJ�lH�mL�kM�aF�cG�dE�cD�dI�aE�b?�g<�f5�c0�f8�nD�lA�f>�b>�gE�eC�a?�`>�^8�c3�d2�c:�e?�b:�a8�c9�a8�_8�b;�d?�\6�eA�b<�hB�a=�^:�\5�\2�_4�`3�_4�]9�bB�Z<�\<�^;�W0�W0�X4�[>�J67 . P( U%d& �Q1�U2�U1�Z6�^9�Y4�\4�X/�\0�`7�`6�X,�W-�V1�S/�O,�A�b7�b:�Z:�qa��՘�ㇿ�����}��{���������������������������ʙ�iʉc�b�[�[߈S�l:�].�i9�pA�g8�h<�tJ�oA�j:�p>�|F�~L�]�UބH��^��`�s:�o7�t@�}M�zN�yM��VބR߈R�U؃L܇Q܄TކV��X�OՂPنT�~N�R�{O�QЇP˃IӃN�~L΀OЀO�yD�zI؀X�~X�}R�~Q׀S�zN�}R̀T�}OσR̃NцO�}H�~J�yJ�sF�{O�tI�|P�sG�zK�}J�|G�|G�uA�qA�qB�uI�oB�qB�q>�q>�p>�qB�qC�qB�qB�tE�tE�{K�yG�vC�wA�wA�t?�q<�k7�sB�p@�tE�n?�p@�i9�k:�m;�j6�n:�n7�l8�f3�h5�g6�d5�g7�j9�i8�l;�l9�n:�n6�i1�j2�k9�i7�f3�j4�g1�g3�i>�g<�i8�i7�l>�j<�i9�d3�g6�g4�d.�e/�j7�j9�i8�n:�i4�q=�zP�oN0+ .- �eO�M0�K-�wR�]�U�N�{D��g��_��S�J�L�y>�J�K�M�Q�K�N�zC�L�M��N�~K�~K�~P߀R�U߃P�~K�|I�V�WރT�\ۃU�~NہO܀M�|G�xA�|DـHރNރN׀KׄP܊XׅS؅S�Z��R�U��Q��Q��S�X�PՂZ�oVW�J/�U5�C�A܂N�O�S�xC�[�c�~O�e6�c2�f5�m;�k6�l6�g5�f9�h;�e5�b1�d/�d1�b3�d6�g?�d9�c4�h6�h4�g5�f<�d<�e=�b9�d<�^2�f5�c1�^-�d.�d(�g*�i2�g5�j6�c0�b1�f7�f:�a4�`5�_1�b1�a/�].�_0�]1�_4�a7�]8�eE�]9�j?�a3�d3�a-�g/�b(�a+�a2�b8�\4�`4�`4�a:�\6�i=�^/�`-�h5�c4�h9�c6�\1�V-�b:�d9�k<�e1�_,�f9�]4�d8�a2�c.�b-�`/�c4�f7�b3�h;�e7�d1�f2�b0�j4�a$�`$�^+�_1�[,�^-�X&�`.�c0�g4�c0�h5�k9�h4�h5�f4�f4�c2�c/�c/�_-�_.�c5�h<�a7�d9�\,�b2�d4�`5�cD�aLL: g2"y<'m&�Q.�hC�\6�d=�kC�O%�V,�d7�`3�J �R&�b3�S$�M �W+�`5�B�nA�uK�_>��p��ǚ����|��y��~��|�������������߶�߹��������Ĺ�zcǁ_�d�W�]܍b�oD�c:�h<�l=�j;�g<�tH�pC�f4�m9�}I߃P�b�V�z?�U�T�|?�EقM߉X܁T܀Q�a��b�[�U�U�Y�d�`��c�^�[�Z�R�\��g�e�^�Z�V�]�f�Z�W�^�_�`�Y�S�T�[�`�c�`�_�\�W�V�X�X�Y�[�Y��`��c��d�_�_�[�\�S�W��`�V�Z�\�[�\�^�Z�\�_�`�b�b�]�Y�Y��_�Z�Y�Z�c�\�\�_�`�c�^�]�[�[�\�Y�^�]�a�_�]�_�]�c�\�\�V�Q�S�Q�O��J�L�L�Q�\�Y�Y�S�S�W�U�R�R�Q�K�J߂I܁J߁KށH�H�G�P�dA82 ,+�mU�T5�J(�vM�V�R�E�z?��c��a�Q��W��G�J�B�~C�I�J�L�H�H��S�P�G�G�}E�O�O�{F�K�I�yA�K�T�O�T�}K�}I�N�G�D�H�G�|@�}B�H�H��G�P�R�O�Q�Q�K�J�I�I�H�P߀T�lNW �R8�bA�M(�HބR�U�S�xB��d��n�\�tA�o:�n9�uA�xC�{A�u;�t<�s=�m5�m4�n2�r7�w@�wE�wH�sB�w@�t;�q:�m8�p@�qD�o@�sC�s@�vC�q<�q;�q;�u:�p0�o,�x:�y<�x:�r5�n3�{D�xE�tD�uE�sC�tA�s>�p>�uC�q@�o=�p=�qB�tJ�wM�tB�u?�t@�~G�z>�y<�s9�t?�qB�tD�xD�n:�uD�wG�yD�v?�v<�r:�vA�tA�vE�vG�zL�xH�zG�{D�x;�w:�xE�uE�pC�p@�t>�r<�p?�rC�wE�sA�rA�q?�t=�zB�{G�w@�t6�n0�p:�sA�tB�{H�s>�zC�t=�p9�u>�yE�u@�|E�~E�~F�{B�v>�zB�q;�q@�wE�yF�zG�wE�r@�r>�m9�uB�vL�}b�lE 7uA,�M3n) -�^>�{]�fD�tO�nA�H�O�[-�Z-�;�H�l>�O�= �U$�n=�E�yI݆[�eB��}��В�ۄ����}���������������������������ᴽď��~qi{WG�{aݎoՋh�`?�R6�H+�jJ�qI�k@�j>�kA�qG�nB�j:�i7�{F݂S�a�Y�~E�V�P�z=߁D�}H��V�\�X�b�a��l�b�_�b�g��g�Y��^�S�R�O�Y��`��b�^�[��c��c�f��T�W��e�Z�\�S�V�N�M�a�^�c�d�Z�R�W�V�U�U�S�V�V�^�X�_��k��b��b��`��Z��]�S��U��W�W�[�\�Z�a��g��h��m��h��b�Z��^��`�\�\�[��b��_��c�[�c�Z�]��a�U��X�M��O��X��\��\��c��c��d�b��f��h��g��\��U��Z��\��X�U��T��V��X��_��a�_�V�[��]��Z�W�V�X��Y��X�X�S�T�U��\�Z�bÂb82 1 2�nS�V5�L'�tH�W�L�y<�w<��_��a�M��Q��L�~6��B�}A�r8�zB�|D�{=�A��N��M�{7�u5�p5�u>�uA�m8�u=�t;�}@�w:�|@�u<�~G�yD�|E�|G�zB�o6�z>�~B�F�p4�s5�p2�s7�d-�d.�v;��G��N�{=�~F�G�s9�w<�|H�{N�aCZ �V9�\=�G$�G"�Y�Z�\�uB��\��e�T�yA�A�H�U�R�L�I�H�J�H�}A�D�B�J�O��R��P��N�B�}G�yH��N�U�PރL�G�N�S�O�P�P�G�J�P�N�P�L�I��V�R��R�N�O�I�L�M��R�O�~K�zE�M�P�S�M�F�L��N�P�L�H�O�O�}J�G�G�P�K�Q��V�L�{B�T�T�T�U�R�S�P�|E�}C�O�S�}Q�{O�{L�|I�yE�}M�O�N�zI��R�}P�{M�xJ�V�vI�O�}F�zG�{J�{J�M�{G�I�{G�{G�R�Q�P�Q�Q�~G�G�I�{G�xF�{L�~N�}G�~G�N�M�|H�~J�yHށX�gP�OB: +Z1tB'g.�bI�ZJ�N8�b>�sD�H�X �^-�g8�Y,�]/�j=�P!�F�X#�r?�I�{H��\�b?��v��ʓ�ڊ���������r��R���������~���������a]\#,J&�ydՏuŅi]% -BF�P3�rN�nC�d8�iA�oG�mC�rB�o<�|H�X�\�T�}G�U�P�z=߁D݂K�W�R�T�a�}O�g:�f:�c7�sG�b�c�Z�V�P�Q�I�Q��^�\�xE�p=�sD�X�^�`�U�O�X�R�J�I�T�U؀N�zK�{Q�c�e�Y�T�V�Y�V�Q�N��`�^�\�`�`�b�d�a�^��[�N��P�N�N��Y�Y�\�^�`�h�m��o��g�W��b�U�V�Z�R�Z�Y�V�_�[�d�a�^��_�Q�K�I��J��X�U��_�a�`��i�i��j�d��\��T��R��X��W��R��R��R�O�W�d�b�_�]��]��Z��V�P�S��Z��\�W�U�W�[�]�_Ձ\��d:, -. 0�kP�X5�S.�tH�S�K�D�x>��[��Z�O��S��H�:�}9�v7�x:�w;�m1�u6�}<��K��H�w3�t3�x<�s9�r:�{C�|C�x;��B�w:�{?�zB�s>�p>�o>�sC�{K�vE�m9�o:�s=�v=�t8�g)�r5�Q�X �t5��?��H��C�~E�zB�m2�u;�c.�rG�[=\�S8�Z=�I)�F"�Z�X�U�v>��\��`��Q�H�G�E��T�S�K�P��W�U�T�I�H��G�D�E��R�M��J�D�|G�|K�|I�P�R�}F�M�J�L��O�W�T�}I�M�L��T�M�|E�N�R��Z��O��K��O��G��M�O��O�P�Q�}I�Q�W�S�P�K�~F�I��T��J�H�J�L�S�K�E߀H߀H�Q��O�~E�F�E�~E�~I�P�T�R�~KހM�|I�O�{R�Z�~Q�|L�}I�{G�Q�~N�~I�zF�|M�rG�wP�{V�|]�}Z�vI�|J�|H�~J�~K�}L�~J�{G�zI�O�wM�xQ�zU�{T�|O�O�~E�|B�{H�|N�|O�{M�~K�|G�xI�tG�wK�S�~T�~]o&;  7f9"`0{F4@AZ�\,�Y�j.�j:�h:�`5�c7�c:�h<�a.�a+�n=�I�vF�]�dB��u��ʖ�؊������2h�&U!P��stlWf[EtiS��uthX^RF0"+;�kT͐t��kq@";; p0�iF�^3�K�?�@�mA�xG�q=�zG�S�]�V�{C�P�O�}B��G߄O�R�UބO�p>�Z,�N%�>�?x3 �b;΃Y�`�T�P�M�E�J�vC�c1�O�G�6 �:�f?ӆ\��X�U�T�L�M�M�~D�k5�Q"�K#�9�>�nFֈZ�[�_�\�Y�V�S�V�zF�[.�U+�?�C�jCۉa�f�^�O�L��L�M��\�P�p;�`,�G�K%�pKߍg��p�_�[�S��V��X��W�W�tA�c3�X*�N$�iC�X�h��b�Y�P�L��J�T�[�U�rD�c5�]0�nF�Z�m�h�W��S��X��O�M�Q�Q�L�l>�c9�qE�}Rߊa�b��g��Z��P�T��W��[�X�Y�|K�pD�lB�wR�{\�t^4-./ �qV�Z9�O-�uJ�R�G�~F�v@��^��\��O��Q��H��@�<��@�|9��A�w5�l*�{<��M��P�@�k,�x9�w8�}>�B�x;�y:�x9�n2�X!�A�=�>�9�3�B!�b>�sM�pI�mA�l9�w>�s6�m2�_'�a'�w6�>��I��D�{?�}E�w<�}E�p<�b8�\AV�S;�[@�I+�G#�Y�\�V�|?�S��\��S�F��J��I��Q��O�xF�}N�vL�vP�yU�~V�Q�J�H�A��L�O��N��M�{J�wG�p>�wD�|K�}K�K��L��F�L�}L��U�|L�}M�P�xG�tG�oE�qL�sN�\�T�Q�~F�G�H�Q�P�U�zN�qE�sG�sI�xKۃS�P�K�G�J�H�F�K�M�zH�wF�q?�e5�g8�uI�}N�}F�|A�A�~@�K�L�P�~N�pA�b6�]4�e@�mK�qK�S�L�~F�}E�~I�L�G�}A�uB�g;�U0�P/�fK�nQ�yR�}L�I�H�~G�{F�}I�{J�rC�`6�F"�@"�Q5�gJ�wT�{N߄K��E�N�Q�W�yN�mA�Z.�;�2�D'�S7�vY�ybL 1 5 _8)X,?(4e#�e6�g-�k2�j<�\5�N(�L%�`<�c;�e4�f3�pC�E�uGޅ[�`?��u��Ι�א�������^��@e�Hg���l�����}gY?��ipaJcTARA/;%K(�bJ͑u˖t��ac4Me( �U3�_5�zM͓k��`F�]-�tB�}J�O�T�X�~F�G�H�~C�x>�O�S�R�i3�^*�f7іj⫄̕n��ap8�K%փW�[߅P�N�L�xA�`-�`.ʐ`՟sӗr�|Xs7�P+ՂV�]�S�U�Q�~F�c,�])�vJ��`��c�^@_#�P)ք\�^�c�Z�U�O�n;�`0�g=�tM�zW�fBq6�@΀\�m�S��R�K��P�|I�\-�a,�f4�pF�T1h'�=�X�l��_��W��Q�R�N�m:�Y'�`0�d9�^6s3v/�gF�d�^�W�N��T�O�xC�f6�\/�X.�Q*y7t- �^?�yT�^��Z��P��H�Q�J�i2�\*�W+�J$Ah*�P-�uN�`��V��W��T��V��^�F�m7�U&�T*�H"p1y> �]G0),+ �jR�S4�I(�qI�P�I�zE�vA��`��[��R��O��N��A�|9�u/��;��?�}7�m*�}>��O��Q�y>�p3�k,�z7�}:�{>�u8�n3�f.�[(�h;�fA�Q3�J2�M8|;'a ^w& �L0�sO�n@�m6�v;�i,�j/�]�t0�C��H��G�y;�i-�{?�{B�s>�kA�]EY�X@�]B�J+�I&�X��X�O�z9�S��]��R�zE�J��L�G�u?�^-�_3�;o#�B$�\:�}S�}H�E�E�O�L�O�xI�j:�W(�B�8 7�Q*�l?�O�H�I�P��U�Q�zK�c3�\/�E}7k �8�[<�vR�~P�{F�}G��L�R�V�tH�Q&�M$�Bx. w. �L&�mB�|K�J�K�E��H�H�wB�f6�]3�Q*w6e!}1�Y5�wI߀J�B�A�N��S�wD�_0�\.�W.�<j' -c"�7�i=�|J�}G�I�L�~F��D�r4�c/�e9�T1x7^5�^:�yJ�I�~C�I�N�|J�c4�f;�nG�_A~>%T]�Q5�wOقL�L�Q�O�xI�h<�f<�yR�kO�V?WU�H2�\JA/ 0 Z5,L!9 18�[:�tD�k2�c+�c8�Y7�B#Xa!�J'�a6�j<�f<�I�rF؀X�a?�}k��Ξ�׏�ㅿ燽������ꎁn�����թ����u��y����˴����aH�iNɎnʒm˓n�jI�lN�Q5�\?ɒk�Ȝ�Ϩབྷˡw�\/�rA�~K�P�W�X�J�N�M�v;�K�N�S�y@�g.�q:�{͞pܶ��i@��^��`i1�lF�_�[�R�J�o9�h6�yذ���lF!��f�x[i2�pJ�^�\�S�~H�m7�e1̗eΧ|�Þ�xX��c�gC])�gA�e�f�Z�O�uC�b2ĂRᬂ⸐��m�}Y��eX* �V7�o�a�S�NڀB�f3�l9Ϣkֲ~ҭ��sP�{\Z%�H%�T�]�R��T��N�l3�a)̏Yңoܶ���W��^d3s6�jJ�h�Y�M�Q�|@�l4�tAҜnӤzřr�|YyK*Z!�Z5܌[�U��R�L�I�t6�e+ɍWԥyװ���j�zYV) -{?�|L�Z��U�N��Y�L�k/�n7̒bة}Ěr��niE#D$ , -)-+ �gR�P4�F(�qL�P�N�{G�yF��d��]��T��M��L��@�x5�i%�|3��8�{3�k'�|<��Q��N�z=�r4�p.�z4�|8�q1�s9�c/�qE�Z9�I/p3!TNLS'b4'a.R]4�jA�|K�o6�o3�n0�` �o.�@��N��H�x9�^ �r5�s7�t;�l@�Y?[�Y@�\@�H'�H#�Q�M܂C�v4�R��]��R�yG�M�L�q6�k1̃PӘlĔn�zYc,e�Z3�yJ�I�~A�C�J�wF�j;�zM͏fКt��cn?%R�8�rH�Q�J�H�M߀J�l7�f5�~P֢}��j�]CLd!�P/�sH�~L�N�N�P�rC�d6ȉ]ՠtƖn�{`K5Jt3�kC�}N�J�J�G�w@�c2҃Z՚|ӥ��}d�XAS[�_=�vJ�I�~F�~H�yG�f4�~Oۢwק��x[�zcj@(H�D �lA�}Q�{L�P�~J�s8�~Cؠo޳��xV��jtK7Ks1�e:�}F�J��J�xD�m=�yMϕm٭��{^�ycb6)JZ�W7�zI�D߁D܂F�v>ɁOђfؤ�_F�ubjC2BG�J7I=�ZQ. " 2_=3V'm9.�YKk/�tQ�oB�i2�h4츐�Ĥѧ��`ODT�[6�_6�jC�F�rF�~U�b?��l���o�����{����s�Ё�Җ�ᖆv�����ͮ����t���������̼��iS�zc̓v㭋Őn�yZ�f�cL�w[�ß�ر�oMmU3�\�sK�o?�|J�yK�Z�S�|F�Y�J�D�}F�P�V�n8�g-̍Wܭy��X��p��cд�����V:�H(߇c�b�U�t?�o:ږe߯���Yǰ�iO,�����~�T:�A ݈_�[�W�wD�i7��O三��]˵��tU��j̲�yQ-}>Ѐ[�f�_�W�f3�vE��`ͯ���\�qMӼ�zW9h2�rT�f�S�Q�q3�f2ۥvšo��s��n|_Aҳ��ZA_( �]4�a�W�P�w:�j.džNݮz�l;��wI2 ��c�vZP�C%ׅ]�Z�U�O�j.�l5鳄��dͬ�vX2z^9��sO#V�rF�[�O��S�|>�i/ԕ_ް~��l��ozcA���sS:P!�Y/ۄO�S��Z�Q�u:�~D�uĚj޾��wP��c�{[>(* '+. �lX�T9�I+�uP�V�R�L�|H��f��^��T��M��F�?�w4�o+�r,�|6�w0�o+�{8��M��M�x9�u5�~<�w2�v2�w9�r>�oD�D%X:1 / %) ( ) -4 = -=A r)�Y/�xD�m2�|=�a �s1�F��N�D�z:�k*�f&�n/�u:�l<�Y;\�^E�aD�K+�L'�T�O�M�|;�T��\��W�~M�|K�u?�z@�f͗hЩ�iL*��orO3Z$j�[4�}K�F�D�G�q>ӆXƏfˡ{�rLiL.�jM$N�@ �{J�J��M�O�xB�u?�p��`��o^?"��sxT>EY�hC�yL�P�L�{K�g8�v�zP��ryY3~Z@�t^Q+F�D!�vL�T�I�y>�r;ݍ\Ɉ`��n_HoP;�n[M%Ai' �fA�~M�J�wF�p>ӉXΘi�vK�qK[=!��kjN9[5N�C"�uM�xL�vH�vD�G�q�nB��_mV7��ohM:R,E�>�xE�~F�Q�vC�n?��r�V,��kkW6��i}`RS+!Cl& �qE��L߂G�{>�x?יf�W,��f�eM��o�sbO2"9N �RF�ne9, -3O1'It@5�uc�F*�hD�sE�a.ܤs�›��|�fV���^8+A�H%�_7�qK�G �oE�U�d>�w`���p���������q��w�Ї�ٓ�p�����⪘���������ߑ�xWN?J4&�WG��r㵝�ya_9&Z4!i>+��i�մ���kS9pZB�y[��l�i=�`0�sB�o=�l9�wB�l6�m6�s:�{D�O�Y�m6�r9�rϥu�qG�pI̹�κ��~b�|a�N0�Z�_�R�zD�q;ߢsݲ���b��lи�Һ���o��q�K,�}W�d�_�xE�n<؛l෋��i��d­������s��d�O+ʂZ�p�eۄN�v>̎]�ƚ��n��k���Ĵ�ë���gzH/�mO�o�a�Z�r6�vDﶋخ���m������ؽ���}�X>�O-�k�b�S�w:�r:ޢnְ���^��y��b���å��dKl1Ն]�`��Z�H�s8ƄP븋Ýv��z�{Z��yԷ��t\j8!�Y6�h��b�W�n;�f6���p��s�����bʵ���{sJ6o/ рU�d�\�R�v>є^ް��dʶ���o������H5&.%), �p[�Z=�M-�xQ�\�T�Q�|G��c��b�S��N��A�z6�v3�x5�n+�y6�x4�t/�|8��E��L�w3�~;�|8�v3�r2�u<�xI�4V<1 & ! ! # # -&3Cs- �uI�o;�y:�k'�j'�?��N�?�}<�}:�l,�u6�@�xB�[6[�aC�gG�P0�R-�_��\��Z�z?�O��Y�U�|H�wA�l5ܐ\؛l�d=��ilR7��x�iRZ2U�> �wJ�|G�H�~D�wBݞr�nF��r�wO}kG���pV=G\�pD�{K�~Q�U�g2�d��X��W��qx^E����~iP1A�J*�vN�X�R�sE�Uӝw�kG��tgC��e��|tV:Kq(�jF�U�~G�w=�n6�y��^��o��d�{\���eVM,K�P1�T�~J�zH�`/ݚm×j��X��p��c����|isP7'8"[/"��qУ��s[45C b<%��p�ƨgR=m\H�rZɥ��pD�|K�yG�{H�}J�{F�xB�{D�~E�zC�X(�qB�k6�u?ަuӮ��sO|lKɺ���l�v]�bH�I+�sM�_0�r<�u<�xC鰃şz�uV��k͹���v�zadI�bC�yT�d6�m<�q?�o@֛oɣ|�oM�}`�������|bgK�O/�wR�l=�r>�y@�t=Ԟp得�kJyhJ���Ƹ�|hP�fO~P9�eI�yN�zE܂D�s7Ԏ]���c�oT�~gѼ�~kZ�hT�ZC�Y:ՌcۃS�G�w>�K�����W�vOzb>վ��zapX@jF.i4֋c�U�I�}C�u=ӕdҥ~�kJ�lQ���Ƴ�jM�iW�\I�K/ފe�W�T�m>�~Rヨ��u�pV��jɸ�����m\�xei2�yT�a�XۄO�zE�Ы�|W}pPĶ�ô�sfVI:32# $&) �q[�\?�N.�zS�[�S�R�zC��`��`�P��M��J�{7�~:��?�y:�}>��B�}:�~:��H��F�;�~8�t0�w4�w8�u;�P#X C0/  -   - (;O�C"�zM�p4��=�r.��A��K��@�}:��=�|=�~@�B�I�_8\�aC�eE�O.�S0��a��^��Z�x?�R��]�P�u>�w>�yB�nצ{�yW��dȰ�ư��|c�v_g-w'�rK�xG�~G�q7҉V츉��c�qM��~ο���o{fI�aLF�lB�p@�rE�uG�wA��xƝo�|T��dϷ�����u`�zdO-m.�pI�|J�xD�oAޓkէ���czcC��|ȴ��yZyaEoJ/\�[;�R�vA�t8�}C󹉱�]z^9��pһ���flYH�hZE�E*�nC�k8�{J�j:鬀��fvd6~rHô���tr\G�jX\1 `" �iB�e5�tB�h4�yǜo�iHqW<�����w}gRpSAf<,Q�iB�oA�j9�e5�m��]�}U]N%��x��v�ybW@2xRGF �bB�_5�d9�^0חk��i��k^J/��~�����s\K;eOD- ( %$ <$ M2+D!. %/�V3�c6�j9���ո��������tk���Dz;�_7�]5�G�m>�xH�_5�sX��Ɣ�ǘ�����������舁dpfM`P@[I=��~ofWTO<94 7,8 -_,�~f��o�|]?!1Aa8"Ϫ��ũjYEk^M�zd��~�nBքR�zG�M�O�{E�J�P�u<�M݁R؀P�o9�r=���h�vYqbK�����lynXx`F{I&�R�Q�P�q7�p:ᮃ��g�t[zkV����~i|u[�kNM,�zU�\�U�vG�m?њs��`�lQ�~f�����zsa|jTrD,�sR�~S�zH�y@�m9أ{ģ��rZ{p\��{����s`�jXo@,�_C�{P�~IބF�v<ьb跖��q�y_��o���skX�sauU@�T9Ɂ[�tH�wD�{F�N򼐁a;��`v^Bѽ�`Q�u>�p7�uCܣx�|[}eK�~j��~��x�tZ}l\rSA�H-�Z�f5�I�t@ɉYڳ���g���p`Pö�t`��u~hQvI*�zW�g?�k>�rB�xG㮄��_��m{qV������rkcumj2*'"$& �qX�[;�K)�xP�S�Q�M�wB��]��[��O��M��E�y7�|=�|>�x;�u8�x9�s4��>��K��D��C�w4�v4�u4�{<�u:�b.|;V%5'" !      ! -$ 0 ?g -�hC�u=�u0�|5��;��G��@�~8��>�B�}B�z;�~H�b>^�cE�cE�N.�W2�b�Z��R�t<��R��W�|E�i1�o4�u;ݣq�l@sU3X= ����qUkZ屉ط����cXD�����mrlVdP5�Q-ɀS�P�N�p8�vB踐�¤��jrgUȽ���k|wayhN�R2ˁZ�^�Z�k:�k?ԞzĢ�{kTqhW�����|wteveSk>)�oP�f�_�t>�l9աz¤�}nYysc������tj^�j\mD2�Y=��d�[�L�s?̍d޲��{cxq^��o���nk\{o_gJ8wE,Ջh�e�V�uB�}Q촏jK,wcJjT?ͺ�RF6viX\F1J!Ʉ]�_�UۀK�l=ܧ�lPsaKdXH�����utlY{ocgK=}E,܎h�_�V�zE�Pʨ��nS�vfocW���vo_{td{jVsK1�rQ�n�]�|L�rFݩ��z[�zcun[�����s]\W::8.*' "& �oV�X8�F$�uK�N��O�I�uA��Y��U��O��L��E��>��C�~D�wB�r<�o7�o2��@��E��F�~8�t0�x6�u6�z;�Q�cܢr�yR; N<(*#      "# + 7L�A$�yF�n+��6��9��D��@�}:��E�v@�xB�t9�yD�_;Z�`D�_?�L*�Y2�a�T��S�x@��T��W�M�|D�}B�u=ۣr��V��l�kL��o��h��g�lSe4#q*�wU�T�~J�o9ŃO��a��h��x~gE�����q��uZ>0S&�\2�s@�u>�E�z@ď]��m��u�t\��w��o��mu\H0g, �qG�I�}A�d2�w��s��kR��u�����u�wbuR>S�[A�W�}I�v=ЉQ͞t��m��j�oQ�����p��qhM:J �D+�uI�}I�vB�j;ۥ��g��kh^:�����n��qlUE\7'c+�h>�tA�{F�g3ܢt��a��xweM�����s��{~iVX8+L�mF�zJ�}J�i:̐l��m��vhM��m��{���hUDlOAD�[6�lA�pF�`8̐k��g��njdN��~�}i��xrfXI<6& - * Q6-@#& 1 -�|[�qC�l8���Ʈ��������ph���Nw5�]6�rJ�G�tB�M�[.�xZ��Ƙ����������������p��f��g��n��q�{l��u��s��u�|o��uő{͟}��m��i��p�ue��q�״�Ȣ_L+�oQ��lĝ~�qI�P�{J�Q�Q�xA�N�G�zD�}I�K�P�h7�h<䮈�ȩ��i{s^�����rsmWpZB�L,�~V�X�R�l7�rA����Ǩ��ppkX���~j|yhweQ�P2�X�^��]�p=�k@ܥ�έ�o`oi[�����ytq`n]Kk<(�mO�g�U�wC�o>ا|�ɧymWpm^������{wnvh]lH:�_Fیc�Z��Q�vGƊf�ϵ���xti��w���mmc�zoeG�~X���W9!hUDF0#ʶ�4*cZK9&C�~\�`�\�|G�uE᫅�cJ]J;E9-����ypnaXte^eI;�N3؊d�]�Z�tBƒX̪�xiT�~oof]���pia��y{j`yRA�vYލ`�U�|J�qD跖��h��qwqe�����vchbflh450#",�pX�W8�F"�tG�P�L��J�}E��^��\��P��N��K�}:�~B�{H�~V�wM�yF�o5�A��I��B�{1�u/�}:�}>�A�^�i��Z�\2fE&��mD/&#   " )+ @ g �yK�p1�{3��7��E�A�F�I�P�N�x@�~L�`@U �aD�Z:�J%�]1�W�Q��T�yA�N��V��O�x@�}B�xBϕg�[4t];VE'��p|hMuaIhL7c4"q)�}V�T�J�m7ˌY�tG~jGpeGxiL��i}iQy_N[>.O! -�]4�{H�~G�H�MĊb�oT�}kn\H��{sdM|pXfYFP2c&�rH�J�E�i5�w�pT�lVcS<��{�v^sdMmYkH5W�T9�]�{I�s@ԊY��]�oQ�sY�s^��uzj]�tdmRAG�@&�zP�~L�vC�k<̚u�zY�yZ_T8�����m�}mhN?b7'd& �qG�|I�u?�j8њq�iI�yabUD����we�xg{hYa?3I�^9�zI�~K�g7Əh�a�gZN6��oŸ���hdR>yXIF�]:�pD�qC�[/ʊf�{\�geZF��{��o��nbTK>8'U@;[G>)S;/D) Z<4yTKk;'�rK�qA�m9���Ʈ��������qj���O~9�Y4�oG�E�xH�|K�_4�z\��������������������~g�u]XQ7LD-��v_RBJ=-G7(M7*Q1&qE:“Ӧ�ęve;"W*Y*�]G�Ӱ�دwa:�jE�vVØv�pIԂS�yG߁M�O�t@�P�K�yB�zC�M�P�c2�j>㯊ػ���m��w�ð��x�zgs]F�P4�[�Y�V�n;�nA�Ş�˫�xb|wd�����s{wkfSB�S8�zU�]��X�l9�k>ީ��s_obR]ZK�����|kfSbO>d4�hH�h�Q�p<�o>Ӡq���l`Hb\N�����li`maUfF7�`F؉^�Y݁N�uFʐk�պ��{{ym��{���ijd}vnpTIM6Ն_�S�L�s?�xT���]C,l\LP<1ǵ�;1%_VG;)E -˅c�^�^׀J�q@汉�dKdSCE9-����}tsf^obYfK:�N1؊c�]�Y�sDƅ]ͭ�viX��wpla���kh_��}wi`uN?�sV݋[�O�|G�sF绘����rwtk�����|eogitn783%#,�kT�U6�F"�sF�K�J�H�}D��^��^��T��Q��B�x4�o3�_.�J'�S1�sE�xA�~C��H��C�}4�v/�{7�E�W�dޣk�[+�c9�b@�kO�v]E1'&  - &!'>T�qF�l.�w1�7��G�E�z?�m;�P$�\3�tD׃W�eHT�^B�X7�L&�^0�S�}I�I�u=��R��Y��P�|D�}F�s=җk�^8lX7XJ-��s�oSvaL�t`\-r,�xO�~L�}G�q<Ύ^�|Q�oL|qSocI�{d�o]�j\[;.V&�d=�~M�K߁K�|L��^�cK�mZk[K���woZ~s_ueUY9$i* �pF�O�L�q?�x�bF�r[rcL����}g|pZ��sfC/Y�V9�R�zF�o=҈[��^|dH{mSxm[��vwi^�qbfI9M �@(�{R�N�xF�pAəu�tU��leZD�����q���nTE\.f& �nE�{H�}G�g5ڥ}�oP�qYcXF�����p��pzgVX4&Q�g@�N�{F�c1͘p�~b��n`S@��v�����zn\FzVHG�\9�vJ�o@�c7Ύj�lN��uj_I��{��i�|hbVHK>8,N43T=7# 5!E-#7E$P(S -�_8�tC�p<��������{t�ph���N:�W5�oH�D�uE�zL�]2�z[�������������������i������nhR��{{qe��{`TD`M?\>3`6*�vdܯ���lU+U+DkB,࿜�Х�f;y\4�d>ɘp�oCԀQ�J��P�S�zG�Q�O�z@�zB�N�N�d4�mBݭ�Ӻ��������ɶ����{hydO�P8΃c�Z�Y�l;�vI�ĝ�ɪ��owp^�����mykoZIyG.�{[�g�T�n8�d3⮇��m}qYlgQ�����md]JR=*c3�lL�_�J�t9�n6џnݿ�]O5ZSA��r���c`QWJ9`@+�^?ֈX�U߁K�uBΕj�а��w{zh��o���gja|xmcL>{M3чZ�V�H�r6�|P���K3fZDL;)ȸ�6.`XE8%H ΅b�b�W�{C�o=鳇�fIgVBC:)����mkbQWK;Z?*�L.ݏh�`�X�qCƂ]¢�xm[�|lijZ���hj\��{th\pI8�oPދW�L�|D�tD澚±�~|mruj�����~cmdisk893%%- �hQ�U6�J%�rG�N��J�~F�zA��\��[��Q��N��G�x4�g+�H�x -�;�tC�|D��J��F�z2�z4��A��S�d�f��V��W��i��h��b��}�jOK26$/"+!'+' #)1 9P�b4�z;�u/��@��F�?�r7�V&�r�0�jM�gNT�\B�V7�K&�]1�S�zI�J�t<��T��Z�L�zB�}F�r?Зl�`>fQ4P@&��l|hOmW@�gSZ-u2�xK�|H�{E�r?͊_�X�rOmbDh\B�{fm[M{cYcB;P �_?�wI�zF�yE�zKɎf�qV�v`reR���wqYqiTgWHR/g& -�sN�R�N�o?�bEzfN]S:��w�z`�v]�w`]=&V�\:�U�L�xD̈́W�~[}hIwiNzr[��}{p^�tdcF6N �;#�xQ�{K�tC�nAΠ~��d�rX^S=����|k��pu[LX+e&�oC�K��I�f1أy�rO�oT]Q;�����r�}gnYD[8%L�jB�~K�~H�f4ϙs�{_�~jnaP��j��h��iWCtPBI�\7�rF�sE�a8��`�uX��le^D��v��v��ib[KMB>$# -& 5 L0-H*(#)@ �oO�sE�n:���ʭ������{ob���Jz7�V1�pF�B�p@�yK�[1�x[��ē�����������m�ύ�싀j�����ٞ����|�����ݥ��F5%I,S)�_K��m��m\/DM -L" -�mIݾ���[��]��fȓg�qAԁOއQ�R�V��M�P�T�|B�}B��J݂K�k:�pD٬��ʫ��}��vǿ����pkWhS>�aH΃c�]�\�s@�pC�ͯ��p��qº�}wasj[V?/�N6�yY�i�a�r>�q=ݪ�wSvhKWP4��{���g\FU?*k8#�qT�j�R�v9�p6֢sں�hX>`XC��p��x_XEVG2^;%�`?݌]�X�Q�vAіj⾚�qZvs`������kmb{wnjRFyK3׎a�Y�K�r6ȄU涐fM.dV;TD-���ngMf\C<'I�zU�b��Z�~G�wC쳆�lMeW=B:%��|�lnfSPE3Y?(�I(يa�\�W�oB˅a˩�|q_|yhkn]���im^��wpdVlF3�oN��Y�M�|D�qA�Ǣ����prxl������eofkum560"&/�iR�Y:�P+�vK��R�L�H�|B��\��[��P��L�=�x2�}@�xD�\3� o �H�K��K��H�|7��:��H��Y�qަwΡwĜx�qN`CwY=�iO��z��z��uF6&.".$2&8*;+3&+6M�b5�{@�s1��B��J�>�~A�yD�Y3�f�2�hRV�]C�W8�J%�]1�V�P�T�v>��V��\�K�u=�yB�s@Δl{X8_J/H8��teP5oYBgH3_5t3�wJ�|G�|E�o=ˈ^�xU�lMwnQsiP|q]zm]uaX_>7X#�\:�zM�|H�vB�|Kˑi�jNwhQvnY��r{v`�ydm]NY6#h' �pJ�Q�{I�k;�~�X>�q[kdJ��w��l�~eufO_A'R�Y6��N�{D�o<ш]��b�lOmbFngM�xaynX�|joR@Q �:"�wP�|K�qC�lAĖt�x\�w]RG1����sb�zjr[KW*d%�qE��N�~H�i7Ϛp�sPyfHNB(����qZ��}s]FtO=R�iA�yG�|F�b2˕o��i�}lj]L��j��p���n\HxTHF�\8�wK�nB�e=Ƌi�z]��k\T=��z��n��raZJMB>*  4J,*9()8�nP�qE�f3���z�����r�zg��{Jz8�V/�qG�E�qC�zM�[3�y^��Ē�����������6b�+\��j�|f���ngU��y��z���ldMH6 _@,�\L��sÒqŕovD!e2`,�\A濘�Ƙ�Ɠ���伉ԟm�n=րO؁L݃N�S�|F�P�RހC�~AބH݄L�o=�sFܯ��Ѯ�����kĹ����qjPhS8�W<Ջf�\�V�w@�wF����Ŧ��k�q_ȹ��~f�xgX=*�O2΄a��p�_�yD�uAܩz��^�vTF;��y���whQQ6#j5#�x_�i�Y�K�t<סu� �v^VI6�u`��oUM8K;$_;%�bD�e�\�Z�xFԗkӬ�~iVui���û����tpiLDxH4��n�e��]�{C̈́W�oR0fV5RC$���vmNujN9# N"̂]�e��]�~H�vA谁�oKi[>A<��v���~udOC3[?*�K-�j��f��d�qE�{Uϭ�xm[��rfh[���hnb~�vpdVsM:�wY�^�T܀M�vK�š���|~pmuj������agclrn43/#&/�kT�]>�U0�{P�U��P�K�F��`��_��T��P��E�:�}>�|D�yK�R+l �;�R��N��N��D��=��C�a����Ь�޿�Ūñ�μ�IJ�ñ��ɰ�˴��ȯ��������������������jZJ> K�Z2�~G�t7��H��E�;��C�E�xK�L+ah�lXX�_G�Y;�L)�^5�[�T�S�v>��Z��a��O�yA�yB�q>‹dyV8hP6N=#��n��g�hNpR8f=!n/ �wG�~F�~I�n<ϊa�sQxgKqkQjfM��nf_Mxh[X<1Q �Y3�|K�~H�v?�|Ley_DldOpkX��rtoY��kveU`;(q/�rH�{J�K�h6�x�\A�nZ^XB��~�zdxmYsgQ_C+Q�X6�~N�{F�m@Ҋd�vZ�rZrfLhaG��pf\C�t`wXDP �<$�vO�yH�oA�lA͟~�mQ�}cTI3����yf|o^fO=Q&g' �sK�Q�{K�j>ӛv�nN�pUQC)���vfM�w^iP:iB1U�e@�{K�}J�_0ōj�{c��reUF��s�f��zeP?�\SL�_>�tK�rG�[3ːn�eJ�s]bWC��q��z��vd[LQB=& +Q0+: */<�mM�nC�k6�zԲ�ë��������mSy4�T-�pE�F�pB�zM�\5�x_��ǔ��������퓿�.R�H��hl`H[P}J7ٍk��j��b�wC΅Z�Ü~`:zhDwgEȹ�TI)naAF.L ̂_�f��a�P�|G﵇�rLrcDIB%������wfJ=-Z;'�J-�m��h��a�xJȀZͩ�xkX��opqc���lpbvxkmaQ|SA�|^�[�PނQ�{P�Ǥ�����qpvj�����}^c_mqp540$%. �kT�]>�U0�S�V��Q�N�H��b��a��V��R��D��>��C��G�wE�qIt�7�U��R��Q��G��=��G�m�ٴ��������������������������������������������������쐂w8L -�W4�U�w?��I��L��@��C��D�}H�sMoa�p^U�\E�W9�M*�^5�W�~N�M�s>��[��^��Q�I�~G�s@��c�aAkS7ZE(��u�lN~cHfG+kB&k, �wF�J�J�o=ьc�oNwfJjfMkiP�hsnZviX_E6P �W/�wE�{E�vB�}L��cwbEwq[_ZF��wmgQ�u_p]LW1x3�xL�~I�E�h4�w�]B�zfmeP��z|t_}r^rfPdJ3L�W7߀R�vE�oCчd��k{cKzlR{qV��q�w_vdNnO:K�<#�tK�uD�n?�mBŗu}cH�rYdX@���xiT��su_HN#i+�rL�yM�xM�c9ڢ�cF�eSC*���gV<����kVf<,T�hD�{M�|J�f7Ȑm�eK�okZJ��{��l���nWGwQFC �^?�rI�l@�e8Ǎh�y\�{f\M:��~��y��rjZKO;4/O-#T4)& -/O-$U+_.y@-g% �iG�sE�h3�x�ʙپ��ǥơ��|jN{4�T-�lA�H�oC�xL�]8�za��Ȗ�����������2N~F�bscI`Q!K6g=%�]Aމ`�[�U�yJؙn׬�eJ5\K9yiR������h[JaD4O9َn�m�a�{OՐg𿗿�{��hmIǷ�SD#|kMJ0J�|_�j�e��P�zJ쯃�rOsbFI=#��v�zdeXEG7'`@+�K,�h��f��d�l<҉`ɤ�xiR|t_yvc�İbaOtsak\I{P=�vY�|P�|I�P�vL�Ğò���ktwd�����sZ[Vkmj730%$- �lU�[<�Q,�~R�T��Q��N�I��a��_��T��P��G�=��A��D�yA�|P|�8�U��S��O��E�9�K�t�ػ������������������������������������������������������>"!F �Y:�xK�xC��M��E��;��>��G�E�{Osc�q_T�XA�S8�K*�[4߀T�zJ�}L�p;��U��Y��R�L�}H�s@Əf�_:bJ(YB ��x��e�z\a?#jA%j. -�vI�L�}G�o=Љ]�kGyfHmgMidG�{^vpVznV]D.Q# �\3�wD�J�|F�~M��eua@jcIZR;��vzsY�x`u`MX/y3�vJ�}F�E�k6�v}V7s_G_S;���~rZ�v_teNhL6Q�\>�X�{J�xḾ]�cz^F}lR}oT��v�v]�nVjK6M�>%�tK�uC�p?�nAƖr�z]�pUTF,���wgM���t\DS)g)�oJ�yN�wM�a9۠��aD�}cSB(��~p_C��q�mWlA1X�mH�xH�s@�g5әs�rS�|fkYA��q��h���q[FmG:M�`?�oC�o?�e6ѓl�zZ�zc[F1��z��o��hoXFO1'9zL<�`M8 17K)Q �K3�dI�O/�a;�j;�h2�y༊���׹���|nR:�X0�g>�G�lA�rI�^;�yc��Ǚ��������훼�!8dA��g��d��m��n��n��m��e��c��\�a>�mN�wTޙp·Y�q?�yH�kC�~W����Ï�ʐ�Ň�̐Ѥm�m@�mB�uG�sA�u>�t9�w:�y=�r7�E�}E�{G�i;�l?ݨ~߼����˳�ٽ�ҷ�Ʊ�ί��j:΁M�O�M�q8�yE뵇س�Ȭ���}ȳ���s��u��l�Y.�}O�a�^�i:�qAۧwճ���l��e���¤���b�yX�J/�pQ�d�[�vC�tCݞsڮ��rT��b��b��|ufE�jKqH,�cDߋ_�_�P�vEԕiܰ��hJxcD�zV³���s�pRpQ5L-хa�e�^�zN�|T󿗥�Z��a�sK���ų���pY>#S' �{[�j��h�{K�xF�}��_�tS[L/��r�bm]CRB+jH/�L+ދc�`�]�l<΅Zʣ��{_��ltmPƿ�e`C�{cq_GR;�xX�{O�~K߃R�yJ�ęð���g{`��x��r`]Tpok61-$&. �mV�Z:�L'�{O�Q�O�M�H��a��^��S��P��E��@��I��B�D�yG�6�R��N��L��H�8�I٘p�Ӿ������������������������������������������������������;H �Y7�O�wB��H��G��>��;��@��C�yHue�paT�WC�S7�H'�Z2߀T�N�{J�l9�S��Y��U�J�u@�n;ĎbuR*hO'_H��o��f��mwV7e< k.�tH�~K�xD�n;ͅU�kA�mNtiKncC�~^ujL|mP^D-P!�b<�tG�{J�wE�{J͘l�mHnaAugJ��l}rVxhNhR=V.x1�tK�zD�x=�f1�q�Z:�qWtcG��v|mPvgJ�qWbB+V�Z<�wL�yH�l>Ո^�yX�lO�vWwgF��t�}a��kjK6O�?"�tH�uC�q>�k<ʘs�zZ�{^hW;����{]���{`CZ0a$�lF�S�wL�e;՚x�jJ}dFTC%��vxeEjMrT:g9)S�a9�{H�zB�e/Γg��i�{]jW7��g��h��|{cIkD3O�Z6�n?�uB�c0ʍ`��k��szbH��c��|����q\X2%E�]I�t^70 :Q-!`)�S6�pQ�U0�e:�i7�e-ϗ^ğk��t��y��{�vjNy6�R+�\5�>�b9�h@�V3�s]��ʑ�����s��j�����ET{E��ewfL`N:n[J��pvfOm_Bq_;]8�c@�rP�}Z�|S�zL�vA�L�mC�sJ�Ǚ�ܨ�ݤ�ܠ�ݣݰy�g:�l?�qC�wE�v?�n3�u8�o3�w>�p6�X �i5�f6�m@鳇�ƚ�Ǚ�Ο�Ǚ�Ô�ɛ�ѣ�qB�m:�^'�p8�k8�tD��̠�Ȟ�̠�̗�ӝ�ɛ�Ɯ�yL�nB�k=�oC�l:�o>ףq�Ƙ�ŝ���߿��Ǡֽ��̠�zS�mEրQ�vC�s@�q>Ԗg޳�Ը�ϼ�θ��—³�Ծ���f�c@ԀQ�M�{F�uBɉ[淋ִ�ֺ�Ѹ�ҽ�̺�ζ���r�S*рQ�V�P�xH�~T�{ױ�Ͳ�͵�ѻ�Ѽ�̵���|lD �Wߍ^�\�yB�x=�lӯ��}������Ŵ������y�pP�L(܉_�^�Y�n>ʁT���ȴ�ȹ���t�͠��|�����psF)�sP�NހJ�}H�yE߱}˴��������s���|yfGG=+& #'- �r[�Z:�J&�vK��U�M�G�D��a��\��T��M��G��A��B��A�|=�yC��8�J��L��F�{6�|4�O�nK۷�������������������������������������������������������="P �[3�~K�v>��D��E��<��B��E��H�{Nqd �paS�VB�T:�F%�W/�W�{M�yH�j7�P��X�P�xB�yD�m:Ɛa�qC�tGoW)��^��^�~X�cEc9 g*�rJ�}N�~J�g1ЉU��S��a��aye@��j��c�{_hH3P�X:�qJ�|Q�rE�zJЖh��^��`�}X��k��h��e�kV^4s,�lG�}L�zF�j6ܕg��^��i�Z��e��\�yV�sTuQ7Y�\>�sF�vA�j5҂Q��b��c��f�pK�����y���ePR -�= �tH�u@�s?�k;ϛs��o��u�qR��v��q��y�vVd8f) -�oD�yH�tD�j;Ԛt��j��p�tR��{��v��s�}_vI4U�b9�n8�p4�d(ˑ_��h��z��j��c��s��}��l}W@O�X1�d3�f0�b*ɍ[Ө~Ŧ���}��u¦����Ʀ�xM=J�S@�VD>5 8N&`" �Q3�O-�K"�M�Z#�l.�r�ʒ�ɘ�ş�ǭ��yFs1�O-�I$�>�_7�_:�L+�mX��̒�����5Wp9$9X&D,�}c�����aN=��rfV?gY>iV5�c?�hC�}ZхaԉaֈZ܉U�{F�k?�rF�̞�գ�ڤ�ܤ�ڣתs�sC�|M�N݇T��Q�|C�P�M�s9�yB�wA�~J�i9�l?���俓��V��g�جڽ���Vàv�qF�uF�|I�L�l<�oA�̠�ͣ��l��|�ڨ�ɗ��pֹ��vK�sG�rD�{L�o=�p?糃�̟ж�ѹ��ݷ�Щ��}�����e�mB�sA�n:�k8�xF�w�ҥپ��ś���گ˼��ϨΦ��\7�`1�j4�p;�q;͍]�̞忐ڼ��מ�֝�Ԣ�ėװ��U*�h7�c-�l7�j9΁U����̟�˜�ʛ�Ԥ�Ѣ�Ф�ɤ�_:�qH�k=�k9�q<�x=�m�͛�ˡ�ˣ�ө�֨�Ǚ�̧ǥ��@�oE�d4�l:�n=�R⻒к�ʷ�μ��͙�̛�ϥ�۶tF%�pM�j8�n7�zB�}Fޯw�ȑ�ƕ�ț�ɞ�Ǥ���<:-+'#&) �oX�W7�J%�vK�Q�J�F�~C��a��]��U��O��H��D��C��@�~;�zB��9�H��G��F��=��;�T�jK԰�������������������������������������������������������="S! -�^2�H�u8��B��E��=��D��F�I�|Otg �paR �R>�O5�@�S+�W�~P�zH�j6�S��[�I�g0�m7�q;՝l̨x��r��v¤pʪyå��{�`Hf*�jF�`3�l8�g/ՎXץrȧ|ʳ�Ů�ǰ�ŭ�§����Y%�V8�dA�_7�g;�{Kܟpش�˳�ɲ�Ȳ�dz�ʳ�ɭ�~Q>p(�dA�W)�b.�i4ߙhΡzв�ε�Ѻ�Ѻ�̶������qU�V8�f9�](�c,�}H�}ʨ{پ��œ�Ģ�Ȭ�Ĭ���G�C&�h<�S�l8�j8����̦Ĭ�����˩�ΪϹ��Բg;j. �d7�O�a-�c3����Ψ˳��ž�׳�ձ�ʩ�ϱ�`IX�c:�R�_#�b&�{�ث�Ĝ�Ɯ�ץ�Λ����ͫ�kUM�Z5�\+�^(�`(�t�̢Ǩ�˲��Ω�ɡ���ں��ZLG �\H�WGA -0W0!d&�T8�kN�S0�l@�i4�h-�z�ǐ׵�ͪ�ص���qM q/�T2�\8�A�b:�mH�X6�w`��Ś����晴� 7&?-5L"$;�i�����Փ�s��t����������ͭ�tR�~[ӉdԊc׊^ۈV�zG�j;�sH�˝�צ�ɘ�Μ�ĐԢm�n:�~LрKډR݈R�wA�S�T�w?�zA�~GۀK�h7�tF칎ʩ~��ffP)�Š��\cO,kJ'�a=�~X�\�T�tE�nC�ŝ��]eH*V?�›��XfR1hJ(�vN�rF�\ڀL�n=�o?汅ƣ{kS1jS4�ǥ��w��_pW/�sN�qH�a�X�qB�qB�{ܳ��jBta9Ϲ��ɟ�Xr\7��d�]9�{L��M�|G�vC֖h�ѧ��\�e=��y�گ�|Zw\>�{^�Y4ˁR܂M�H�j7͆Z�ƞġ{�xS��]�Ҭê��~[��qyT7�zZ�Z�a�m?�l8������c��f�ִ�͢��j��`��p�K&�}R�xG�L�n;Ӌ[�ժɲ���r�С��Կ���v�Ţo@"�qN�zK�u@�wB�yB�ō�ϙ��võ��֫�Ь��u?=./+"%&' �lX�T7�H#�uJ�P�I�H�}E��`��\��T��O��I��E��A��A�<�zB��<�E��D��C��<��:�O�dEά�������������������������������������������������������;!Q�a3�H�t5��A��D��>��G��J�H�{Nvj -�o`R�P<�L2�<�N&�W�R�~N�i5�Q��Y�}I�b.�h4�n:�П�Ξպ��Ң�ՠ�ОҴ��ӷ�nXe)�jH�\/�k7�g/ߘ`�Нڹ�˲��ܳ�ٱи����Դ�V#�X:�fA�`6�qE�zI�ʚ�ʝ��v�̣�ԫ�ȣ���Ը��S>x3�b>�`1�l7�h3�uⵎ̫�ũ��ҩ�ԫĬ������uW�T8�g=�f1�b+وS�ɚqӶ��ٴ���ª���oܽ�F�>!�rE�h2�e.�d2�ͭ͢��tSη��ִŭ���_ˮ�d8e( �mB�p=�vB�b2�ƞ˧��wU��j�ں¯��b��|�YFV�gB�sC�q<�_)첄ԭ��iFye@�˞į���g�jO�o_I�]=�tI�uB�g2ןpƠy�dlV>ֿ�����qVlP;�[NK�Q9�lX=/7 V2"\(�ZE�n[�P9�bB�vK�m;�|ܳϪ}��v��}��nHs2�Q/�fA�C�e;�qI�T1�v]��Ş����خ��$6 '!'7')8��n����Ͽ�~m��q����Ӽ�ӹ�å�xV�yTч`�{TЃY�b�{J�e6�oB�ɚ�̝�–�×Ọƒb�n:օPԅM��Y��Z�wD�U�W�zD�yB�}EہL�k9�yKޭ���g�qIo_;����mNtcEmN1�S6ڈc�_��\�p?�zN峎�oPv\CfP8¯��rTs_FuW;�^9ǃV�\�V�vC�sEܨ���rnV:hS8��t�pS�tVzeFX;�~[�l�`�wL�qF�{Ǣvv^:s`?��d��f�|[^G(sJ.�V7܉]�U�|I�vEѐfب�xU5sZ;t`=���U?'oT?��k�z[ܓf�_��G�r<̌\�����q�iGjS3ɲ�]D%y`BV<%qN8̔{��p�yR�oA쯂��vy`A]E+����~[o[8XE'sQ5�D"؆^�\�W�m9ыX�ˢ��i��[�{S�Ǟzd=zhDrW9l:�qO�zL�T�{I�zG���Ը�ʹ���aʸ�ɺ���r]^P0,#&%( -�nY�V8�J%�yM�V�M�L�~F��a��]��S��N��G��C��@��@�~<�wA��=�H��E��F��>��9�J�cDձ�������������������������������������������������������< O�`5�K�t5��@��F��@��I��K�I�|Mwi�o^U�Q=�M4�>�N'�W�Q�R�l8�T��X�O�p<�p<�l8򺋛vJqY-t_2�ɘ��v�vT�gK�p\c'�wU�}P�yE�m7ڗ`ʚi�oHlU3��|ͷ�vb?t]>�nVR$ �^=�rJ�zN�tG�vG𺌟~U�vOpX4����]��asWA}P;j%�nH�r@�zB�g0�w�zV�wXmP.ū���m�~\�nR�gQQ�R9�tJ�vE�n;ՅRМm�g=��\Ʈ�͵���u�s_�mZP -�@%�pC�xB�j4�e3ؤ|��]�xY�kL̵���k��z�kNqD-a% �rJ�{J�zG�e5ঀ��e��hbQ7ѽ������~x\G�WGV�a?�sH�uC�_-ܢz�{Z��s]J,��y���ͼ�fM7�[OM�\@�mG�qB�b1ћoʦ�ɮ�hSB���������oUFpE(�W4ȄW܋T�V�wC�zL߭��wXeO7ZH2��yiT}p`ZH:}YI�~fҊd�b�uJ�xQٟw��haI-cQ9��h��n�|cbL5lC-�\@؆^�S�|L�uFӒj��qqO4lT<}iN��}]H5lQ@iF2�cC�y�X�H�x<†R߶��lDlKjY;ij�dO2wbG_I4R1�bN埆����~Z΁W媀�zW�kNjV>��rnTsbHlZFeE0�K-�m�[�W�r>ыZ״���c�xZveI���r^E|kQgL1g5�|_�~R�MۅT�|Oڮ���l��p��j��n���lkYAC6+(!#$* �p[�Y;�N)�~R��^�Q�O�H��c��`��S��M��E��A��?��@�}@�vE��@!�L��H��I��A��;�J�`Bӯ�������������������������������������������������������= L�^8�P�t8��?��E��@��K��K�G�~Lzl�p_W�S<�Q6�C"�Q*�[�S�S�p<��Z��]�U�{G�wC�o=��sM��_gS.ĭ���|��g|aF}W@e,�qK�vF�{F�u@я]�yN�^��gwhI����z[�~bbJ2O& -�^7�~O�wG�vDǀR͙q��a��np\A��z�sU��nlQrF=S�`@�qG�uE�e9Ζs��l��nYH4���������zcSuLFG �]B�sN�wJ�a3��e��e��~UA:����ue�tgP<1Z3,C�\<�nN< ) ( O2 �X9�|R�b܃K�zE�|Kݫ�ȫ�Q?'G8#���o]O��|wifz[V�ueՓpډ\�zN�{Sҝuղ�_K2SB.�}j�{h�saM6$lC/�`D؆^߃R�zG�pAғj��pK,UC-ZL2���=*V?/Q2a4ޜl�f�X�F��Qٶ���xxkKC7���5$ -nZB:%N.�bQ�t_����}^�zS���rwfJG7 ��qrcLXI4G7'X9'�L1�p�c�^�r=ԐaῙ�~_�~dnbL���iZGm]F[?)f4�wZ׃WہOكTɅX廓м�������������mp_14)*' !$) �p[�X:�M(�~R��_�Q�P�H��d��b��T��O��D��A��@��@�}B�uF��A$�P�K��F��=��:�K�`@ϫ�������������������������������������������������������<N�];�W�x<��B��D��@��J��L��H�L~n�p]X�R<�S8�D$�R+�]�V�R�m;��Y��^��X�}H�vA�l<˓n{X8jS4XG)��o�xX�oTcI0hD,^%�uM�}L�xC�o;ƈY�oHu`AnbHsgM�~c{qX�ybQ;&K# �^5�sC�}J�xD�tF��aeJl]FZK4��k�|b�s[pWCS)p+ �rF�yF�F�e.�~oH)`F/V@)����z��h~lXdG5O �W>�}V�xI�vHɀU��e�gGeP1ziO������z`QlH:P �B)�tI�xD�o<�m?��fnQ3lV>���ñ��vd}lZmVD\1!h,�kF�{L�zG�`1񷒵�s��r���н��wi�tfX=2oD=R�eE�pD�vE�d7Ϙy�mW�oaN>/��������yaK>qJCG �^@�xQ�yN�h=Ëh�nT���N;7����ue�yo\KCZ71H�Z:�sP@( !2E# -��h�����|vcR�gV�oHs.�N*�d:�D�g4�j8�S'�hFU1#UABshp$!* -  -  ��������Ԫ����n�|a{pZ~jR�gK�jH�wMӆX�tG̀R�_�{G�d4�yJ�˜�ѨjW7�pV�x_Х��j?�~KсLۊUمV�vF�R�N�zJ�yJ�{H�Q�k7�xGޮ~�Ė��{JB���odFWL.W<�K,ւ]�Z�W�k8�|I᷇��^ZJ(C8���gY>\M:J/�X:�zU�a�U�q8�xCⳉƬ�_Q6K@*���tf[�||�}�����rgғpߑa�tD�sF٥}ӵ�dP8ZK8�}l��v��sU@-kE0�^A׉[܁L�zD�s?ђf��nT;%bUBngM���A4!TC1hO9S/�zN��xߍ[�zJ�`:ˮ�²�}w_@:"���A2ucO>+E'�sd�eR��x�{^�vQ⫄ŧ��uXF:$��rmcJ\R9E8'^A/~E*֊f�b�W�q?ˈ[�ص��{��krkX���lcRqdQ\B+h6�z[րQ�|G�Z�zM忘Ͽ�������������uyj6<0**""$( �nY�T6�I$�zN�[�N�M�~F��b��a��S��N��B��@��=��@�|F�rH��C'�T��R��I��>��:�O�eBү�������������������������������������������������������;Q -�^A�W�w>��F��C�@��I��L��I�L~n�n[W�R<�S8�B"�O(�\�U�~N�h6�V��]�W�{H�s@�i:Ďl~Z@jT=H8!����u\vdLXB+jH/b+ �pB�uA�}I�m=lj`�xT�oTzpWskT��qmdS�}mR:.M"�X3�yJ�vB�uB�vI��[nT;k`L_T>��r�u]�{dnWG]4"k% �pI�vF�q=�k8�yhC(nXCC3��x��y�|cwhSdK5K�T8�}R�tA�m=Ѝb��e�gHsbDk]B�������rcf@3R�A+�lD�tA�p@�qE��khM2bM8��}�ĵ�zmwi^^H;^4&j.�sK�sB�{G�f4Ԛr�tT��y����ǻ����wk^C8lA:R�g@�r>�yD�e5ɔr�hQ{hZNB4�����z��tYF7lH�x\9 -!  < -Y,�Z;ش��������{j�p_�ygO~9�R,�e9�I�i3�l8�S#�jGN'Q99}ns!" -  - -��������䴬���s�y^�ya�v^�vY�hE�}S�Q�{NԆVވU�wC�i:�pB�̜�խ\N1nbJyaGǞ~�h=�{I�LهUքT�xG�P�K�wE�uE�}LނO�g7�sCం�ǚ�›��i���qfH[P2Q8�K,́]�b�Y�sC�xH弎��gpb=riH¹�`W:XI4K1�Z>�zWيa��]�p>�vEХ{Ƭ���r^S=���h[Sytxf_f���Ǡ�ȏqӌ`�wE�vE̛rԶ�Q?'M>+�}l��n�xeI4!gC-�W:ڌ^��P�}E�s=Ɋ^��mG2JA0^VA���8-Q@,qVA[4�R,�}�{O�L%��{��p�yfxeE?)���7+l[K?-#>"��p䣏�dM�nP�rK鯇��zpSL=(��zpfM[P:L@0[@-zB'ݏk�[�V�q?Ȉ\�ն��|�xcZUB���}wgtiWoV@_/�oPڄUނO�~M�~S۸�Ǹ�������������_hW;C6,) ##& �nW�T2�G"�xL�T�I�M�}D��`��^��N��J��C��?��>��@�zD�pF��A(�{M�N��L��=��:�N�eBӮ�������������������������������������������������������;R �_A�S�s:��A��C��>��H��F�F�~J~n�l\W�R>�R9�A �J$�X�R�xH�h6��Y��[�S�{G�uB�l@ǐq�bL^H3B1����pWgW@YC,mK2d/ �tD�xA�y@�i7Еm�hIo[@peOnfS�{ijcSrdYQ9/M �Z6�vF�}I�t@�~S��_pX@f[IVN9��rrkQ~rZiRDW-o)�oK�wH�yE�f6鯉dB'cQ=SD1��wpYvgP`Tu@!�rH�vH�nBLj_�{Y�mOylLd[<�ƬϽ����nF:V}7�uL�wF�rC�lA��m|bIXF0zjZIJ�����~udNCf<,`" �qI�}J�r>�h8םw�_B��p�����Ũ���tj\D8oG?P�f=�{F�yB�_0Ϛx�mUzj[?8(�����r���eP?fB4G�b<�tG�wK�b8ɏj�hN|dXC2*���wjW{tdUG�V%�f@F O62}ns' (" ��������覣���vf\CYI0aI-rO/�fC�oKЂ[̂U�O�[�vG�f7�xI�͟�ѨcZ;pgJ�rTʞy�g:�{I�zLԆXЄS�wB�S�I�vB�wF�}JڂR�j>�rHᮃ�˜�����oʼ�vhN_S9VA&yM4��gӊg֌e�xP�{U۷���scU8MF*���b\B`T.��|�u\fV?R<%oM4`+ �sB�z@�r5�l3ϑh�eDcN3sgQmdS}tebYHgWHR:.N! �[5�vD�s=�s@�xR��dZA+YN\L3{jVй�Һ��{qkPEg9)f$ -�mH�zL�sA�f:ђs�gQ�|k�����Ѭ���|snVLlH!d@(�X;�k�S�tA�s@Ȋa��gQ?)ZN>dTG���@3"WE1uP>~N:x>&��d�nNfH,��������y�xeOB/���?2"l^S@1*>%�raљ���~�b<�sI�zʩ��oOXF2��~|o\dYGPD8S8'|E&ٌ^�Q��H�p<‰^�׻����}jjbO���wtcvo_^I8W*�tTއ\�VفQ�vIٳ�ɺ�������������fsbFQC0, $")�lS�W3�G�rE�yI�xG�xG�wB��_��^��J��F��C��E��B�|<�|@�q>�A%�}O��P��C��A�y6�P�jGڴ�������������������������������������������������������6F�a;�}G�k/��>��D��<��:��@�:�xE�" l�i\V�S=�R8�=�K%�Y�|O�{K�a/�Y��\�V�J�xF�oCŐphJ0Q=%;,�����t~lVP5 pJ3Z!�oB�yA�B�c*ϒf�nMaL1g[Ej^N{rc[P>aQAW=0J�V0�p>�yC�xE�nJ�sVT?*B:'J?-��sngJlaE]F4Z/k% �nI�o?�xE�`8֣�qYA��taUEWN=xo^ogT_WBcXB��o��~�pZ��g�pU�\C�fQlbIea>b\:�ª�Ƶӱ�tM�wK�wL�g?��`�t\XJ=70&���xk[qcVO=1Q0'; �_E�rW>. -4 W:20 !#$i8�qJ�h?lR7k\GQ?+�eT�scI{7�N$�hB�D�h<�n?�R#�lEAF4&~zy"%,%$)�Ż�ɾ��������������������Ǔ~a�uW��b�xU��iʒm�X�pH��]�š�Ա��d_S9uZ=Øv�`7�~S�wTυb˃]�wM�e�X�~H�~FՃKڇS�j;�rEݮ������xlmNWU>TQ>VWEURC[OCbPDhS@iS>oXFoXHpXLiSHjWPiZSi_Vi`Wh^Ti]QtbVzdVy]O}`Pz^P�qc�rc�tf}sgyoe�wq�vu�|�������������fI;��vʫ�ؿ����`P6NB(��i��i��dPA hE)�V8ߍg�X�vH�qBÌc��t=/80]QA���=5"UH5lUC�{hxO;�sY�eI��q������tn^WR>?9�}czm\vh[<.#='�m䮖쬐�fD�sM�yֽ�vmL6.��xc\JJC1E9+R6!�J%ՉW߅I�K�y@‰\�ٺ��|t^bZE���ID1bYJ]F6b4�lK�e�M�|G�yE⽐�Ě������������lwf]eV3,"$$+ -�iV�Z:�G �tI�{L�{J�xG�vC��_��_�O��O��H��E��?��?�<�v>��>�Q��R��E��B�:�C�d?֭�������������������������������������������������������=I�Y3�S�s8��G��K�?��G��F��B�{K|h�o^Z�R9�T6�=�K�W�U�|F�h0��Z��]�O�}F�t@�xJ��i{]ETD-91��{~rZ|jRV7#{M=f%�jF�uD�{D�h3יp�wX_J/`T>k`Nul[SK8YI9]C6R#�W3�n>�vB�wG�qJ�pSL<%JE2KB1��oaV:q`D`D/h9%r+ �qG�xB�}E�U*��`fR9��o��x pl`soc^[LhbTbZOL>3D(j@0�jY�P?T8-D8*NH.dZ?Dz���}��yz_JT/yI#�\(�j2�q?�f:e@RE#mdE����˻��ϡ�}|ZNg6%q+�lG�wJ�wH�e8Ȗq`C�~e�����溦����mQEqG9P�d=�zK�zM�Z2Ώp{S9weOK@*����t[���qQBtF9P�]8�pD�sK�fBÊlwT>ocU41(���i_V`UOL93O.'D�`I�lU@ -9 X3*D+/ -<�\?�uQ�gC빘cM}l\ZD6|^S�wmK�= �X4�_?�<�c@�nG�P)�`=B E3%�zw%#& ! H\QRh\KfWYqa`qahvenls�kv~fsv[x\�wZ�~]�~]�rQ�|Y�sP��_Ӳ�ι�xqW]V �dFًg݁Z�~S�rG�sIdD:+/'XK:���G?,\Q?����Ʒ~bTy^K��k�������������}jNJ1���������O?0<'�}jӡ�񴘦_?�~Z秃Ȱ�tnLF?%��|up]]VDWG7Y9"�J$ٍ\�R�S�wȂe�ѱ�~em^GUJ4���A:'m`PcI8b4�vSچW�S�}G�vB俒�ś������������{nnpb5/#%&' �p_�[?�G#�uJ�S�R�}K�{H�c��d�V��T��L�E��E��F�@�}B{�A�P�O��I��@�9�~B�rK��z���������������������������������������������������XCB=I�_8�J�r:�D��O�L�J��I�K�xGw h�m[V�R9�U5�F�R$ڈV�T��M�p4�Q�[��L߁K�u?�n?��iiK1O@+2,���|pV��hZ:#{L:f%�qP�xN�|J�n<ϑj�_>[F+SG1i^LodRF;'J9'Z@3N �]=�vK�q@�i:�jF�rUA/?8&MB0�{h\L3\H/`C1d7"u0�oF�zD�zC�S(o>^J1caL*'(&)&FCi:&e% �mH�uJ�yM�j@ʝv{^>}mS�����ᶟ����iIQ�hD�{M�vI�e>Ɍm|R9�t^hWC��~�mX�xgqPAoA1K�c=�qG�sO�]=��dY7wgW4-#��~c[Xe\]H64R1*B�YC�gQ?2 -; W1&N#EsLEN$�_A�eB�jF굓���Թ�X;+�fX�}pC{8�N+�H'�A�V4�S0�L'�dD?D3#�}v"  0_M._L-^K3_N:\L<]L9`K4\D=_G��u��m��p��r��p�{T��Y��b��gĊeԙqݝoיf֞mΒ`�vB�}J�PтWלtկ�®�yrU$    - %"!!!!!""$!&"(!&&"'$%"'$%'!%)%!!!!'";10hZY1$l`T����DZ�̴�ɳ�ɲ���������YI'a@�iH�yX�oL�xSʀYɒi�d=>) -4$ F5%���B2"]P@���Ÿ�SB:]KA���������~{r���[UGID1���������L9*A+��m�˴窎�jM҂aꨆͯ�pbE8(��ld\GLA-K6#]9!�H&Ђ[�~QކX�{N̈a�ˮ�dL]G0G8#���3(eTBX<&d7�wRۏ^ۈT�M�{N㼕�âÿ������������yol],&%& �o_�_C�N(˂U�h�\փMҁL�g�i�Z�V�O�D�P�K�G�w>q �9ڂT�X��S��F�x5�{B�`>[&?"0"". .$%.#'+"'+!).$,2'/+ (- '-!%."$-!!'+ .0;B�Y1�Z�u<�O�Z�L�T�Q�Q�zJl^�p]S�^E�X9�D�R%͎[ЍVΉN�w:ӍQ�_׊R�}H�yI�kBďomN2ZJ32+���tT�kLdB'xK4[�wX�xPۀQ�tCΔl�]<`K0VG2k\IxiVF5!P;(Z<1I �\@�sN�uI�rH�cB}K09 B2"N?,��xq\I[D2]A3a8&l,�rM�vE�zH�c<�P1aI1{td/+ /,%E=:F?9LC>=52;764..I<6L6+�k_U3)<+$A9.A=$VO5��|��qd^HLG)K=R> pQpNyV fG{h=[O)ic?��������ݵ��oC6b9#_.�iC�i@�fB�^;Μ{uT5�pW�����欗��~tcC6uJ:L�`>�a9�f=�a<̕vzN5rS>P7!��ptYD��vsNhXH���������lO=cE-��n�Ѹ֖z�pPچd�ۯ��vWkI-��o�vXqV9oL0�S5�P-�qL�kF�wO؇\׍f�Ǧ�oRqN2Y;��P6wW>f?"rB�xN�k;�xDӂS�UⰍԳ�Ų������ĩ���p{iU8)* ! !�}l�kP�~Y��������|��v��}�ő�œ�����}��zގS��k�e�f�mτ\ֈb��x��y��X�G�{8�H�Y4M:.,. -- * +/2., , -- *)+.); I�a:��Q�~H��e��y��k�[��k��n�mĂ_�kRNJwX �pY��a�tP��]�Ĕ����ċ����ɏ�Ì��{�sB�i<�uNōllC'lN4?' ��ht\8�lImD$xI+a( -�iE�c:�m>�n?Ȋa�hFgE)hN5jN8~`H\<#iG.Z4!W$�hI�b;�Z.�j?�hDf1:?# Y?&��k�yfvZLaG:X3!q5�iD�[-�f6�nF�wY^C(�yg92(:51H=;hZWgXUF88?6;:14E:6J70�j`Z>3D5.E=0?9!_V9���j^H656692J= kWnVhMbKWDREaW3��b������˙��]M|L5~I*�kD�`9�{X�yX˒t�uX�g������ϱ��}r�bR�_J�Q5�yU�sI�}S��]җw�~a�w^�dJ��o�y]��o�v\�tY�_A�tR�uN�xQ̆bÈf�vV�z`�dRE.('"!H#�W=�rQ�nO�pY�~nV5,pSM\@�mJ�dA�gB�\4�f=�^5�`8�d?�b=�G"�yR��z������rl  ]F"fO!eN#dN%^K)dPeMfK%fN!\F']F+[E.XD5_I1aI2X?_mVsnXznT�����q��f�mR�nP�lL�oOإ�֧�˚y�}XȏdӚo컐�ӍZۊU��QڂPۉaƄaϢ��عb\:37!$ "## !#   "..$1.%0,#1-$3/&40'70(<3.92*95,8:-=A3@F8?C5B?6G@:{mjL=:l_Y����о����������м�ѽ�з�ʹ�ɬ�ͱ�Ͱ绞ҠǍhȉ^ʋ_Ȏf�z[�hS['l9&�t`�v`£�Y7+sQG�rh�zp�����{����aR��q��w�����~�{d��v��s�ҵˆe�xSޅ]݈_Ή`„]�~XђiÊ_��X‡_Ć_ă[ꦁ�zщc�~P҅Wʇ\��Y��Y��`ől��^��a��\�~UɉY�qޒ^܊[օZדnːnŔsÕt��lɒs��c�yY�mQsWB0 8�SA�U8�[6Ќ]�_ޏV؉QݐZ�i�r�s�t�uԆX�t�u�q��z����s��������R�@�|5��O�~R�dD�cF�fM�gM�hN�gP�iR�iS�jT�mY�mX�jU�iR�jP�kQ�nS�lS�td�kaPK �b<�V�q?��q�����}�s��������ۦ�ϛ�X#�WA�aG�Y;�rMݚp�n�m�l�p�q�v�{O�jA�vPDžc�kM�kL�aA��f�pJ��Y�uM�uM�jBW�~R֌]̓V͈_�|W�sQ�{Z�uV�~^�pL�zV�lM�iI�{Q�~OljX͓c„[�nI�hH�jI�qK�oN�~h[:)Q6%T1�rTŁZ�|OؑcЉ_Ĉc�qN��5+>50L87T<2�|d‡i��q�ѳ�rO�pG�{O�}Q�~R�zNԀQփQҁL�zE�~M�|M·]���ꮌŅa�wH�~K̀ŃP�xGІW�{NˀV�vO΃[�}PȂO�Œ�g�}LۅVփWԇ[ҋaǀVЃYӆ\҉\dž\��f�dJ:= |H3�I,�U/�tG׆Q�H�G݊T�^�`ۋZсP�xH�zK�|S�}S�~ḾOӆ\�}V�zQ�|M�L�B�o'�y8�}M�lG�kE�rL�tN�qK�pM�sP�sP�pM�oM�yW�{X�|Y�{U�{T�|T�rP�x]�bOF P �W.�~K�k8�wGځUՂV�|K̀L�K̄RĄX�|Z�N9C�P:�S8�J+�b@�{Uڇ]ԀRԀQۊ[ߓbےe�xܕk�xQ׍h�\υbЈbȀŻ]ӏbҐ`Ԕd͎[̍ZҎ]���҈[̀Vц^щa�zSͅ_ʂ\�uL�~U֎hɁY�|N�}Mߪx�}�qF�{T�[�wR�wN�_9�aLE -?sI0ғrƁZАd�q�qȉ`��bȱ�D7'1$G.)A"@!A$&<'.*9&"�nd���]@28 F3"Q> r^=pY:RA#2- ))3/B;SJi]!�uBfP!dN^IYG�tS����Ŵ�r`̀i�y\�]�|R�zPڜu֚v�mL�{[��mܯ��ƽި��yh�hN�mL�kD�nE�yN�pFݚp�nE�qI�sJ�sF�tF�rB�wG�xG�o?�oD�jE�lE�}PȐ_�xJ�vK�d>�Y;�dUP Dj<,�b@�e:�f8�_4�oL�w`Z8/D,,( -?-��x�cC�fD�[6�d<�c;�_9�d=�Z2�]4�`7�b;�c:�^8�b@�bA�V5��b۰�ʫ�ɮ�r^W" - - -&\E0aL)R@1VE0UD*UB(^G"`GdH\B*YE*L;-I:5TD1\H4ZAUhJ��d��r�nNuhHn^=��c��v“w�~eϰ���u���ư���l��xٺ�店ϒfІU؇R݊Xׄ\ʁ^ϝ|�����j��^UY4#& -      -         JEA>96XRR�������������������������Ӽ�Թ�ָ�Ҹ�̳�Ū�Ĥ鮄Љ[̀R�iB�[D] �F0DŽiĉg�W3i2��i�zg{P?aD2mR=�WC�yd�eMwC.`0"h3#Àfād��k�ϱ�rO�h>�qC�wH�wI�uE�yD�{A�w<�u<�yC�vEфZǃ^�_A�qP�uH�xF�yF�r=�xE�wD�{I�xK�pI�qJ�vJЂR؏Zޑ[�|G܁L�~H݂KۂJـH�~J�KۀI؂OπW�_=B@�M5�K+�V1�rE�}I�I�yB�P�[�_�Y�}H�{@�H�P�P��K�P��T�P�{L�M�J�?�i$�o0�P�g>�jA�tI�zO�yN�l@�wK�l@�e9�sH�yN�pD�vJЁV�}QɀS�|R�|U�gGHN �[*�x=�h-�u>�Q�T݁N�Q�R�UڄSӅ^�T8H�L2�T5�N*�f?�{Q�\�}M�O�[�`�aߓb֊Y�~P�iۄY�Z�[�[�\�bߎY،R�^ޙ`ҌXߙh�~OۇY׀S܅X�}PڂZ�T�wI�|NځW�vJ�tG�~R�sK��^�sM�xS�wU�fD�pH�Z:�`OLL�T8σaπY�{R�yOؐhʉa��Vå�}lZ$ {_SY5)DS0*3C+)oSH��n��p�dLN+dD+sR/tT-eD!^F$3)/+C?JDUOi_$gU#kV'YAS<UD}kGԺ�լ��bK�uX�{X�|T�i=�yM[Ȅa�sR�vVɐr�־���֞��qY�hG�d<�f;�lB�uJ�rHӓg�f9�oB�tC�g6�yF�l:�uA�}H�p>�k=�mD�g@�uKћo�xM�mC�_7�eD�C0G4N �b<�l>�a3�_3�sM˟�bB7F.,)!E3��}�jO�mN�b?�mE�kA�kD�lE�iD�oI�rJ�rJ�tK�qJ�sQ�wW�^>��cตض�¥�t]U! -  /VA1R?3H9AOBCQD6H:5QB0WB)_E&[A3TA1H8/?29P@3YB7[?UhH��e��`�jJ��a��c��s��l�t[�}e�p_��v��r����yc�}f��h��j˓n�v�s�r�{憎綖��ǒ�a��d��[UV4   -        -         - *)$A@<][\�������������������������Ѻ�ҷ�Ѷ�ֽ�Լ�Ȱ�ȩ�֖jڏe�pK�aL\ -�T@ʄjѓn�M(c'�I-�aIrE2E)M2qG1�S<�N7O9Fs@-ӒvЎn��c�ǩ̈a�|O�N�|K�{N�|M�zG�v@�wA�xD�xFՃT̄\�sQ⯔��b�zS�wH�|M�yJ�|J�wD�}K�xI�uK�xO�vJ�wF����gփO݃N߄K݃GځEۂF�M߀J�~E�Kل[�V6FE�T:�T5�Y6�xP܁RރN�}J�V�]�]�S�zE�y?�{B�yE�}GځEكF݂M�|L�|M�~L�J�@�n*�s4�|I�d7�j:�f4�g8�m<�tD�sA�l:�[*�}L�xG�b3�d4�f7�tC�o?�wGāT�d?F N �[*�{?�o4�~D�R�T��O߁M�~K�}I�|IՄY�O3C �L1�O0�L*�Z3�vK�}Q�~P�|L�Y�]��a��c҆U�|NنZއZ�b�\�X�W�`�[ތR�^�bόWޚm�}R�~R�}NۃS�~P�tG�xK�rC�zK�tJ�zQ�sJ�Q*�jI�hG�qP�}[�qP�kJ�oK�T8�XLTN�`@�zU�|Ṫ`��yؓl̍d�rIͫ�oZG-fI;BE�rh/( -tWGɧ���pjE(N*lK,�kDjJ!J,L6<20,>9HBD?PIi[*dR"P: `KH: ��W�|[��n�_�lI�f=�k=�~P�zN�zߖu�}[�|[ňi�̴���ː~�{^�tO�h=�vJ�uO�wQΉ_����wHʄSӉX҆UݏaԃTքUۊ[ԈWυXԆ_҈cΐk찋֒kֈa�|Uـ`�r_a'l<.�gRݙvݒhَfьcŋfТ�dD7YD?*OB9PD6|iX�����r��mΑrĆa��Zыi֍lшgыiӏjՐiч`τ]�vTɀ_̌h��`��\��tǤ��of" -  =R?5B1=9.L?7O@9C6.IB8EK=;R>9R/?N;7Y@7\=ZmMvsR�xZ�lQ{]E�s]�nX�s]�u`��~�ymDZ������~����q���Ĩ��uX�cC�jD�c>�hF�rS��s�ݼ��u��g��e�|VAA    -    -    -       -   $#cab����������������������ֿ�ս�ػ�ո�һ����վ�˯�ȡأ{�zɇg�lZb'�]M覎ۜ{�|WɊg̏p�fd7"= T9&{UB•�ˢ���oK'�mY���﷔Ík����zݟn�u�o�v��{�tޗm�tזn�jBԘsΙy�dGʤ���xҠםx�kFՕoޛq�p�r�m�i�fޖfۗh�ș�v�m�i�h�bޗ_ޗa�g�g�e�lޔq�oV9K+�eO�hM�lOݗu�w�n�k�p��x��z�q�k�g�d�_�a�`�`�e�f�d�`�X�D�p.�x6�KۀKވU�}H�wDсLߎYنP݊T؃M�Y܉UنR�~I�}I�K�uB�~MЍ`�xULK �[1ۀK�n7߅Q�f�j�i�g�g�a�_ޕl�gOP �R<�Z>�fF��]�v�m�t�k��y�y�w�vِg֍dӊa֋a�c�d�gޏhߑj܏cߑ`�c�n֓f���ؗqړiӉ\҅WςTЇ\ҎaҎaʆYˁZӊgΌj�iJײ��~dЙ{͌lɂd҈kΈn�dP�e[S \ �rO݊bۈ^ڕn����竆��\۸�]C2?)���P0%=]@8$ R5#tT;�uY��l~`DqV8�oHaO'M=B84/ 51 KH_\/MKLIpf5wi:`O![JG<_W)`T.�zU�]6�]3�S&ÁQ�u�x�{����ؗ{ߢ�ܜ�礔靃�}�z�y�{�}�t�{ݚm��mږi�s�w�{�{�x��r֎hӉdُl̇hӎoɅ`֌eچa�uU�zi�J?�PG�j\�w^�wX�y[�tU�pS�jRH(C2(1$oeYC:)n_LoUD�^J�W@�eJ�^?�W8�O4�Q8�R8�W=�Q4�O/�J)�B �Q-�L&�G�W,�R*�W3O9J* HB4<0$F+$S0,R,)L&#U2.U:3K?1F?/TB6I5*E7*DG4:X>6[:OdCRQ2X:e=$�cP�o]�m[�ub�s_�|l�kaΰ���unWI��v�k]�������v\�tW�oN�pO�oO�z\��g�Ŧ�����j��c��hywP;<    - - -         -    GAC�������������������������ؽ�ֹ�չ�������θ�Ͳ����hD�bB�G+k3"F�G8�cN�sV�dA�c@�c?�`A�W�cE�dA�}X�d;�g8�`-�e1�Z+�Z4�cC�fD�hI�fG�Y;ēu�qT�hO��~�����u�fJ�lNϞ���a�wV�wS�zT�}T�~R�}L�xJ�uH�xL�xNʁX�zPʀQ͇Vʊ\Lj]ʆa˅a͈_Ћd͊m�t]81a;&p>%�F)�rP�|R�tG�qC�xHԃT؆V�O�~O�zN�vM�oF�qF�tC�uB�yK�{NޅY�X�V�H�{9�@�K�P�S�R�T�`�d�]�^�^�f�_�c�^�f�h�]�b؏b�{^#L -�W2�zI�[(�\�i�e݋[�~LЀO�~MӃR΅\�cNO -t@+t5 ;552861/ .,@>BDOOUN [P"J=<13/ECHCF9Y>vP�m<�j8�i=�c<�b>�`=�iB�`<�fIԒ|�ym�re�eM�`@�^<�aA�^C�]@�d@�[1�g:�a6�g?�eB�_D�^F�X@�Y?�cF�gH�eE�dE�hJ�kK�pM�g@�oH�oO�hT�D8c*!�i]�p]�gO�]D�ZA�aHv>'W7(sbX?5+zrg3,maQ�quYK�sb�jT�jN�eK�U?�Q?�F3�J6�O:�R8�R8�F(�R/�M$�Z.�j=�R*�Z:x?+1   -   M&HS#[(%SV\ [! Y($W'#[(%U%!J(MA1:T95Z9E]=X[>aI/kG1zYJY<.L0"jM=�`M�^LWK�|o�p_�_N�wiVD��t��t�nQ�vV�iG�V5�B!^+^: ɳ������o��j��d��`tuS//    - -      -   - -  "H;Bͽ��������������������ս�Լ�ֻ�ٿ�м�͹�Ѽ�˳����yW�gIE-c.W"�jY�kV�~e�nN�vR�oG�jC�kGR%j@(�xe�l[�WJHV(�jW�nS�kH�tM�k>�h9�f4�p>�j=�jI�kO�kQ�mV�mX�r_ԫ��eR�q^Ǧ������m�bH��j幠��r�x^�w[�iM�lJ�mF�pC�j@�nD�d=�hC�b?�`;�iC�iB�fE�iM�kT�hR�gJ�iI�Z?])20uE.�D'�K*�nF�{L�t@�u@�~J�Z�X߁K�~H�qA�tD�rB�sA�u=�v?�{H�}K�sA�u@�F�B�@��A�~<�z9�u:�t:�v=�w<�w@�vA�r?�tA�uB�zG�wD�zF�o;�s<�p9�zF�wI�lLP T �W5�S�d5�n>�{MނSބR�|J�O�O�~L�zO�I/Cx:!�D&�=�U.�vJ�uH�vF�yF߅QއR�{J�k9�l=�k<�m?�pD�k@�g@�lJ�rS�kN�bD�fD�hC�sK�jA�l@�k?�pD�mB�h@�kF�eA�mJ�rQ�^?ס��va�`LvP;��xȰ��sO�c@��v����aN�[KQ%8 k9�hG�`=�^:�c<�a5�`1�c9�eD�qW�`P�]P[.); -X0&�yr2&~O;�T5qC!_7^<H. C4 =5&#345779)* -%&24 BCMJPLF?=9 242569 -FD^R nU�wD�p>�h=�kF�fA�pI�f<�xP�mL�qX�hY�cV�_J�_E�fP�mV�dM�aE�mI�kA�h<�f=�mJ�jM�^H�WE�Q?�R@�VB�[D�\D�[?�iH�_:�uL�xN�vN�b?�L4w<,Y%xG9x@/�P:�cK�X?�_@�O4eE8�yrxkc�zq-%�}q����peã��tc�N7r2a S@ G M X w6$�B)�S1�I!�[-�k@�I%�P3v9'.  - -UV`$#`#"Vaec___c)'S#XB5=M3:Y9QiGryXjY;hL4�eTlUG3-dH3qN:�`OzTA�dPwS=�Q?�]I�[@�aA�kJ�N,6�G"�^<�oQ�sX�ɰ�����s��l��b��d��eebC53 - -   -        aRU˸��������������������־�վ�ֽ�ս�Ӿ�ӿ�м�ηֱ�xL/W(E@H]*r;'�iR�w[�oM�d;�pD�pFo:b3j6!X%;7 CsC/�_G�lM�qJ�g<�h=�j>�l<�\0�H&�6p-f,h9)�iZš��aT�{l�������~m�iQ��gڬ��ycyE/p8y=#�G+�\>�^=�eB�hD�kF�kG�oL�tQ�_:�R.�E*�C.�D6�J9�XA�iN�rZ[1/1 �L4�F'�G"�e8�zF�wA�v@�L��^��X�L�F�xD�O�O�L݄J�L�S�T�O�K��M��I��E��F��@��@�}?�D��N�F�O�O�O߀P�T�U�N�U�N�K�~F�|GނQ�hET R�V6�tI�h8�wE�Q�[�[�R�S�S�SޅY�jMR�B'�J*�M)�]3�wK�uD�rA�|F�X��`�Z�vC�s@�i8�pA�m@�e?�a>�V8�S9�Z@�fM�nT�hJ�kI�pF�g9�qC�wJ�uJ�mJ�]=�S4�W;�S8�YD����`W�rfwVE���̲��yU�nNĥ����qI=h>238nE/�cK�iO�cE�`;�Z-�X&�d5�tU�dN~C1m7+= -U-#zUL<)�jR�V5n:qE`=X>=/ +0:>67!$ "&!#;:85 -0-53 -%+088B=DGFVIhJ�V$�V,�d>�b:�c:�`4�`7�L+�G-i&TG Mb&n/ �E-�P1�a=�^5�h=�]8�E'�6b!L< : ? Oj/�A'�Y6�T*�e9�e:�M$z8e+O 6 2 0=Y*k9"�V7�U;hH=|gd��|�}w-&�yp���yge����k_�XC�WBzE7b0'H 0&- 4E �C(�U2�\4�fA�N3�>+U!*     _^g'%a [gl k!^]]&#b1,V&"Z<2FE1DT7Mc=O^5PH!^N-�t[bUB_T@3$ U?'}aI�`I\<#Q7fH,h9%}I3�Y8�lF�oJ�qJ�V�kD�`:�Y8qR5��������q��l��e��]��[��]c`=+*              ##]RP˹��������������������������������ӿ�ҽ�Ϲ�ε꼢��ftJ2H" `<&oI4R'>�YJxA,�cC�h?�X*�Jv@�S8�aLe6&7/Q->G -d2�mJ�a<�a?�R/�F�G�X1�_<�\:�P2b9%d@2~`UT8-wYN�f[�bV�dT{G1�_F�|f�gQ�O7wA']' IE\)�F/�W9�gD�`9�]4�F�?�@{>m4 ^&N GKd@*Q4$) -* v?+�E)�M(�f9�u@�u<�p:�{F��\�T�L�|D�vD�}L�I�F��F�H�N��O�}I�J�M�G�~A��A��A��B��E��J�L�~F��M܁RڃVچZڅ\܅Z�Y�V�T�J�N�N�[�f>OR�V5�xI�o<�w@�J�R��P�K�K�O�P�^�gIM �>$�J(�N'�]3�uF�uB�yE�}E�V�W�Q�u?�r?�j8�Q%�?w, i( XMLV i.�F1�dF�kD�i<�n=�j=�M&�;z.j' K=\:0���gGHuVScX�k��v�nN�fN����hj1 -@2 $ 1 -= i3'�G2�[8�[,�b-�e4�\>�I4F ; J#- , .+ 0�X=�fAf2 c7a>R:,#!!#' -59/0 -  9:CA20 )*)/-7.:�I3wC.[5"=#,' )2 A�R.�\.�f<�h@�Z9�O4sB1T.#6% $ #(7rJ0pL4S5-gST}srida&MEC|qwL?F/!!8%R8'dG5F%4,  % -D _2�P4�Q9L> " - - - - b""\h+*` _e h #l&(_X]&#W&!O"M/$DB-DS4QjBw�\��`tjG��hzt\�}dKD*L= �qU�y`�qVP3Q.{I0�x^�wV��b�X��X��W�qI�pH�Z6pW9˺���}��d��i��f��_��[��]��aVS2((! -#!#      !!ja\Ʒ�����Ѽ�Կ�տ�Ծ�Ծ�Ͼ�Ͼ�Ͽ����ϼ�ϻ�̶�Ӹ幠�nUO,8eI3W;%\=(M*tO?J �sY�gC�wK��T�[9�X;V@E"9 ?(Y>)R6!02 �X=�iI�cD�pL�tI�pB�f?�V0�W0vP,fB*bC1Q9-;%�nA�k;�pB�i?�X9yK3sE5g=-L(2&! $ -uA,�B&�L'�j>�q<�t;�o9�{F��\�S�L�yB�yH�}J�}E�}E�D�I�P��R�L�K�K�E�|?�~?��A��?��G��O�zC�K�wH�pF�`8�Z5�O-�O.�R/�f@�nFـT�T�[�]�lFNU�S0�|M�k5�x?�L�Q�M�L�I�K�I�Y�hJT �?#�K*�G!�b6�rC�p=�r;�v=�T�U�Q�vB�p@�m>�l?�kD�eE�_E|N6j@*M$7 2; -b" �a@�mA�n>�g:�pH�hK�_G�J2sF3L/!0='*)';%O6"]B�mQ�bN[31C#$;M/$H3"/ *? �M0�a6�h5�i:�U6�_Ih8$Z3"R4*F.$" - -& ^0�oM�g?c7gE"N791 #$"( ( (- -0"&+/ 44BB33(*)0+4$0*8'408BBC8 -C,mG �sG�sE�jC�Y7zA$l@'b=*S6&F.$*  &?�uQ�hB�c@�N.}?&r>(X2L15&  # + -�jI�wL�mE�T.vE'd:"Q.F,*" -  & -�nX��* /!ZMT6&0  -  -0"*. - 2!oYKpSCV2$+%   -U$ W$!VVTYZ e+*WVa$#PJ"E2!AK0=W4TnGu�a��auZ��f��hyy]UT6<.}cH�rX��d}R2a3�jL�~`��bÓm�}T��T��U�pE�tJ��xzfM����z_eX8j]=na?rcDrP�}V�}U��`QP1'*&) - C?3MJ9C>*42"$     -  '$]UR�������Ҿ�Ѿ�ӿ�Ϲ�θ�Ҿ�о����˻����˹�͸�ʹ���xZ>H0E1p_ED4ZI/J4eKf:yV8N.P4M3",  $ -yG0�F&�O,�g?�m;�j6�o;�|F��Y��R�P�xC�xH�N�|F�zB�J�K�K��T�O�L��J��H�>�x9��H�C��F�~E�yH�oC�]6�Y6{F&�VR3S8C)1' ->�uZӉd�xL�mA�X1vC&j@(R.F*>.(-!!'*B,�gL�dL�P=E%5<"A(D5-"# (�T?�vT�lB�Z/uG#fC%Y9 G,G2;,  R2�wW�zW�`=C!J28/('$) ( '!R: G7I>*/(+%"#{jX���    q]\K58#  - -%$   - -  - -    - - I-"@CO"JL K$T/)EKNI!@)B@)7O/8Z5Dc:WkFknQicI~za}dqtY`_CC3M/c7�U8�M.}B �nK��\�vRwCt;�e9�vJ�h=~W,~f@oaGĹ��z]\M,]P-_P/\M.TE&UH%XO(ZR-]Y654!!    -TMC_YINI5:8!*) 06(2:-  -   - PHF����������Ѿ�ӿ�к�л����Ѿ�ο����ο�ν�ι�и�¥�nO]I0k[B�~cQH+h]A\L3kVE9�yf�{a�qM��d�a?|Z>�y]=9 �~eRD*fU;`O5A.,�fT�lS�xQ�|N�}M�tH��k�rM�zQlZ4_H)aK3]N;1$. ^A1]4 �iO�yS�|T�U4kH*jR8dP7XB*t`HM<(3 *Z9&�nP�i@ԇY�|M�g?{C qM-v]>U@#^J2XF8* $ ,xI/�H'�O.�jB�qA�i5�p=�xB�U�P�L�t?�vE�O�K�|C�G�J�O��[�N�L��J��B�?�{:��E�y>�|C�}H�sG�R,�M,wJ-�]Bɪ�������������n_He �jEׅ_�dFQP�V/�K�j5�wC�P�Y��Z��W�R�O�}M�U�\>R -�C(�F(�E"�_8�xK߁N�r=�xA�P�[�]����p�U�^1rCa=S8P9YD'K75# "'7 ś�΅\�i?n4c:`B*S9 H6E?)1.!'9�]@�oXp=(6:+H6"@.QF&A;)$ ! -' �VC�mN�vQ�W1d>T;[E-I7J<"B82/ - - Q2�}^�wT�xVE# -N8 8/12), #* ) -/:&0*4$,28-1 $(&*(, ,0 SY30;3@:H*7<> @<* ^F"�rK�uP�Z<`<"\F.]M6VH.^Q>PI?6-&%-=�Y;�`A�[Ae?(_D/R@*VD,UE.P@0?3'! $/sL/�Z:�`@gD&^F,N?(LD-ID.1.63$ " / -O<-hVL*%1+ 7'I7+gHCM-.   -   -   -    - -72) 8%D, B'<$;+:.+"7+@3#B9(:=(9M12Z76c<;^4��u��z��qzzbmmU��kXR:eL6�q[�pY�nT�Z:�K'�tLŀV�rI�Y-�k:�{H�zM�j=jE^H#dZ?ſ���imc?f]4aX/cW1_Q.]O,SE"SD#TG%H=.% - >93SOCMK6<;&20#77/JMD    -  NFD�������ҿ�м�м�λ�л�ҿ�Ѿ�������̽�̻�̷�˳Ի�jKWF,iZCf_E`Z@_X<[M3sYHF!f6u=�g<��U�X3vU6eW=F@*ncO`Q8(1^5!s:&�^C�vO�yQ�O,rQ2hU7]O2_Q4dV;UI16%/G�N,�R'ՄW�zO�fE~K.tV:kZ>bR8cT=XK;,# +zL2�K*�Q.�mD�rA�n9�tC�{G�R�O�~H�s?�zH�~L�~I�|G�|H�L�Q�V�P��O�N��B��A��A��F�}C�u>�M�yQ}G#pM/fL1t^F�����������v��w�pb]<)O�kKք^�cER -T�\3�M�j5�vB�~M�[�V��O�Q�|K�O�V�cGO�D*�E(�G&�e=�xL�uG�uD�zI�Y�Y�^��v�oˇZ�^1pJ#fK-dL0eM1iT7ZF+F1&)E%ɜ}뫇ʂZ�oJt<dA%`F-YD)SC)SK4G@.)" *<W.�tS�z]q;!R8@4XK8OD.RK/KD*6-%2 -r@'�J(�xT�V3`=!\F.VD0RC,OA&SL296%  - I -�^?�oK�|XO.YF(=6>? -1%, -*,)5-8,4 (/).%'(*(,&*6=3:,57A 9@ A> C55T(�K%�pJ�T5jE+]D.`O;TD-TG4LB8C6-&6@]( �G$�hE�[-K;."�yG�r@�~Q�uLvS+sa=c[D�������f��Y�S}tKymGtgDl_?�������ҿ�ν�ϻ�λ�Ѽ�ҿ�н����ͽ����ʹ�л�͵ֽ��pSTD+[O9tnVVR9OI/TE.}`N�YF�gK�yT�{KŃS�X0xU5rcLC<*yp_f[IUI3]M6TC/R9%{U@�mQ�wO�qC�pC�qH�a>bBs^?rcBXN*^V2eW:B-rL5�S;�M5�kM�jB�qF}K&pR0aR3aX9YP1_V9QG.F4F&i: �O)�g;�P�wM�cEqC+cK3`T<[Q8UJ4PG6)!"+�R8�P/�S0�pG�uD�vA�vD�Q�U�V�M�uD�sA�uC�zF�|I�|L�N�R�S�R�O��P��F��=��B��G��E�yB�O�zQvJ'eN/bT9l]F�yf�xilbVZQ@VN;ZO=X=*M�cCԁY�_=OR �\4�Q�o9�zF�R��c�Y�~L�R�|I�|JׂY�aGH �G.�M.�F"�c8�|P�wI�zK�sB�[�]�}L�]-�sA�~M�]4lJ'`H.YG/WC([G,TC)N9$4E"W* ~F#�`=�vQ�hF{H)aA(YE,Q@&RD*ME.J?-77 L%c5u?�qN�rS�N0`E*XN3IA*IA*OG0J?+B2#/ V, \(�S0�b8�|U�O/U1eP;VE3RC.PE)HA%=:+"!�_H�qP�~X�tLcB^O.DA"KM%13 $)#(3:07 .65= -?B LB w],xM#�}VЁX�sL�V7fA'VA,YL9PA,RE2C7+<,.mD0�hK�rP�|U�uN�V4]4P;&F;'=5F>'G:)D2$(lF9�cI�kJ�}Z�oK�S3[2U<(G7(F=.>8(&#3)&[5,�UI�_RC +: X. w?0�QA`&F;�haY,)'      -    - -  -  - - - - MYCNVAOL9=4#;3 86!5?&2E)+D&#<-%;06/5/'%�����{   - H?BĹ��������п�о�Ѿ�ҽ�ҿ�н����˻����ȷ�Ϻ�εվ���oSE+LD-yt`?=(ZV=XI2qR>�gP�sU�}T�zG�zF�R'}\;��m.(�~rNK,T8#�\H�w]ւ^�uM�mE�lF��p�pQ�x[pgHVP.QH'`O3E' �pT�sV�S6�{V�sG�k>�R*W=cV6unQHA$pfK@5@*qH2�kM؋aڂR�yH�jA�fG`8Q?)d^HLD-IB/[UG)  $$ 0�V=�T4�U1�rG�}J�|H�vE�R�]�\�W�xG�tB�yG�O�S�~Q�~Q�V�W�U�K��K��D�v3�~;��C�z>�w=�|H�rFyM(]J)YP3ofI�y`t`bWC[Q6]S8ZN6T8 N�hHցX�_;NR�Y5�S�p;�|H�Z�a�\�S�Y��TփQ΃[�dKIB&�N+�Q'�e5�|J�yE�}J�|I�]�]�U�P�Q�zI�]7g@#V='QB-OA'QC(I:#F/6�[I�cFс^ڄa�rQ�eGi<J0O@+B3F;%A9$9,:S'�dR�rY�B!�}Z�oP{@"P5H=!I?$?5TJ1>/?(0 �iU�V8ډ\��]�wL�T2M% K5 P?+>2K@$F<#4. % - ��jφc�V�_3X;E;87+.(, +3'5,&2 -07688956;<57).%-JS(EN!3; -9ADBM<�j8�U)ЃY�R�rH�Y7Q2RE2XS@PH5VN;F:,>+0�P;�iK�pK��W�xL�Y5^2UC-IB0@;%RL6NB2D1#(m<+�fH�fA�|S�uN�W5d:![A0SC6E7,G=1.&?/". g5*�WI�\NB/ ;X/t;'�TB_$|D7X&3  - -  -  -  - - -  -   #tD-�pO��\�S�vC�qD�dC]8J:#e_IC;&G@.a[O' !$ /�W=�T4�T1�rH�M�}I�|K�M�]�T�V�xE�vE�wF�zL�|Q�|S�}U�X�W�T�H��F��B�r2�|:��C�u7�n3�|H�mByM(r_?c^@xqU��o�{gxmW_V9_T6\N4Y;#L�bB؃Z�a=OQ�T2�Q�k6�uA݅WւVޅY݅WكRׅUфV�zSd*@ {C*�J(�W-�h6сL�T�yE�vC��`��`�X�V�R�}O�U2a7T>)K>+E;"[T8zr]��w?�XF�jI܀[�]<�[=�]@[1A,QF491C;(G@.5%6 Z*�dR�pV�=�~]�nP�E)I+J?#G< @6VK5B1E)1�qW�Y4�V�K�mC�S2L" -D.UI3=2L@&E9#8."( +�z^�tM�qC�S#G/0+01$) '- /73?+'8:)'51 .*1/ 46FM$)4 FS(NZ,2; 5= CCVF�\*�O �uF�{K�yK�S0U5H=+SPALF6TM;G>/D2$/{H3�fH�iD�|O�uI�O*W+O=)GB/GB.QK5J>.J4'3o8$�dC�d:�wK�pF�O+Z2W@.QC6C5*H<0,@,!+o7(�\J�iYF -,AW-�G/�^Hb#|D7A% - -    -  - -  UYJSVEFD5FE3GI4EO6;N2MfFE`?U9)H)-V6/X8LiJn�gVeP8C5LSK\a[ #, 9m=&�]A�J+ʁ^�yQ�uK�\/�\,�S&�Z2m@pV3�x]URA��������v��t��f��e��b��d��b��b��X��b��a��c��d_R23D!@OQHQ0'`PAYT@�����|DH1<@)!�UA�qX�y]�yW�oL�kIط���z��}��wWP=SF3t[EQ,�kM�pN�I$�wM�uF�o>�jCV<YK0TL5=2o`M=*? |D-�kI�Y�M�K�n=�b=^7F5_T>��G�w;�n5�}K�lDrD"�}_vpV}y`��y�{h��u[Q8^R8_O8Q3W�dDՀW�`>NP�M.�}O�g4�o<�n@�}Q�V�T�yL�{M�~R�sP> 6uE/�N/�c;�p@�M�}I�zF�zH��d�`�[�qH�[�|W�T0V/N:"G?*D>$TS7UR?\O?8�M8�d?ނY�[8�J+�Z=[5>-E=01+A;/IB85'2J�SE�nX�= �kL�jMzA&B$ -L<#F;C9LD-=0>'4 �gK�V.�T�O�xO�K+BD3PI64/^R+=,"% ' -0�y[�qE�j7|GE/,))/ #*#")*1""#B>2*6, 1)73<>RZ3(4@O&3B6C1= 5< F@ |e1�W%�zG�K�qC�T2K'B2%HA7>:.KH9A>/90!({R<�`G�hF�}T�pG�P.Q# R=*F?-@:$NF1G:*C-/ w>+�fD�b8�wJ�vJ�V1Y6P;&F9)E7*K?1."C0"1 n6%�T>�gT?)Cb0�@(�\He#n6)M, -  - -    -  -  UWJOQCKL>EF6FK79E-9#\U;XJ0y]E�dI�qP�|T�}PąY�]:aG���\TI������ŷ����UB31qM7Z$ �D)�oQ�uU�jKٺ���w����ֽ���UE6w^JP+�lM�yV�J&�zR�qB�n@�kDV<\L2\R9:.vgR='B u;#�tP�N�N�M�n<�kAZ4L7dV;:)J=-_TN" .�P9�P2�Z7�}Q�S�yB�yH�S�`��r܇N�v@�h6�g9�e;�e>�gE�gE�jD�nC�m>�~J�I�~E�p5�x<��E�x<�q:�wG�nGl=��nlgShgS�plj]��rc[HWK5WH5R3P�]>ցZ�`AQQ�N/�S�l8�s@�F�vK�wM�|R�T�UɁY��b8 -0 wJ7�]B�mH�l@�~M�~L�{I߀P�^�h�xR�D#�iJ�oP�U2O+ G6?8:5IE*65!, 5�S;�O(�R&�]9�J-}G-B .&""84+83-,.5 i8*o5!u5�V8�U;zG,H*J8 F8>4SK4>3:%3 �jK�U-�X�Q�kF�M/H" ?0KF2C>*�±ð�������" -��c�S�p*�`H�vY�|W�zS�R0_1XC.ME0IA*UK2QD1M8'0t@+�a?�h<�yN�vM�T0]<XF.MB.QF2I>,1(B0"7i6#�V=�hS= * -Bd2�A+�XC^ |F:|ME/  - -   - - -  - - - -  - VYNEH=JL?<@1CL7;I0:M1M`D^mPTaEOU;\bH7D(1H+(K*/R1?Y6�r���XaLSUG��v}{n}zi_YCN@&S;�pR�lK�N,��b�}X�g>�V){Q!xO!�i>qQ*]I$I> leS�ͺ��ȷ����w��n��k��n����ֶ�ҭ�Ҭ�ʦʽ�������ƽ����a?�qV�hSzI;kF=�����������������������渳�XUDIG:,-'$&#.23*+-POM����������������ҿ�Ҿ�Ѿ�λ�ξ�ξ�ͼ�̺�˴�̱ͽ�[S/`d?+1%!JC)h\BbR8ycK�fK�xZ�xV��X��_�dGv^F��~XNB������������Q?1/ hR=E# -W$ {B%�|^�oRƨ���l�ո�ǭ���\O>zdMT0�rQ�uR�L+�|V�uJ�vL�b>gH)gT6g\>J?!o_EQ;&V1u="�qKكT�Q��R�r@�l@b<U?_O.O;"YH4YOC! & 0�VA�N4�W5�zN�L�}I�}P�[�^�_�S�r<�p:�r@�m>�oC�qL�nI�oF�pA�o;�yB�J�}C�u7�|=�}=�v:�m5�{J�oIk>!��rkhYij\}tnoj�za]QVO?XLMT�N-�U�p<�wA�h7�{N�~TՆ]ӂWҀX́_�{`4 5sH7�T=�_@�iB�~S�yK�tD�uE�Z�e�|Y|+jy7�`=[9K8G>!F;RK.NI59,7~F+�R)�d7�J(�@$k=&>!! ",)$841%$- E CsC,r?$zG,h<#T6UA)RB(L@&TI3MA+C.7�gG�S,ۃUށU�nI�L,H& I:#SM7QJ7ȸ�Ư��{���$/ -�wY�zN�t@qM?639/61;)2,5'- 0195NF"A3TF#9, 71 ?A7?#2 &7 1*: 8E.739 EAXC �h1�v?�uI�S4\6#G3*OFA# !$  0 b5"�R6�{X�xR�T4a8V@(MA'K@$NC%N@&TB,.nD,�d?�oE�zQ�vP�W4_@!RC&JC'OJ-@:"1,K>-1b9#�Y?�mW= %>\2|D-�[EW"�ZO�|sG&! 7:3 -    UXO;>3QTILPA;B0CL7;G/AN4BJ2AG-MM5Y[C;D)3F(*G(5T2Ka=TcBEO47<&OP>sp_2,-%fZB�uX��q�á��x�d@ṖҪ���p��Z�}O��[��a�nHm];d[>\SBü���ɽ����r��l��r�}b�ĭ����������ɨ�ƨ�������׶�ٵ��e]>�YA�ZGZ>2����������������������������ư�±yyo?@:>@?ACB]][�������������������ӿ����н�˻�Ͽ����н�̴�˰;�\W1SZ1;C+( K?%j\?n_B�u[ζ�ӯ�Ӫ�ԧ�۲���o�r_�����������������䛋~|o_��n�s[�nU�y_��o�x^�����qʼ��ؽƼ�gXAxcH]>�uT�uQ�M,Ā]�|U�WQ-iK)hT1bT1\N)fV4bM0^�rLʀQфPуR�xG�oAhEfO%jX2]H)`O5WO:%!# -P<�V:�`=�yNވU�|H�}QއZ�`�dوSҁLфNφQʂP΄U݌a��dڍ_ӇSևO��O�M�}B�z<�C��B�z;�u<�tC�gAj>!��tjdVoma���lkiyxt^[RRL>TK�jGЃY�}N�zH؀N�b�l˂_r/KMtI&_B_J+[L-SC"_P1WM4=-7�R3�S)�tJ�B"^&S*2 " -  "#%:"A$U5L(I$ -P,Z>(UA)SC)QE+YM5SE+O9!5�eC�W0тW�}R�sO�J*B%N@%SI0`UC���������ˮ�, �_BP&zR!Z?84+2:A "+ #, )%-$)86SN(XL&C7A8:5,,+2 )5 -<(8 ,9 *6*3-3CBYM|e/�xD�f:xL/@ ?.$:3+(%) 8I�zY�wR�a@c?eP3SE(UH&TG%YN0ZL10qT6�oF�tHɉcĈd�b?fI'^O.ZT2YS3KF);5OD02eC*�jO�yb:(C(eE.�ZA�waR+|XJY4++ - -     - - -  JPF06*UWLY[M:;+PS@B+?A+PO:a_H__GEK1ER69Q1;T4BS1ZgIXaFJM8PQ?ura.'/"���Ӿ�ȯ��������nL�ƥ�ġй���`��\��[��sŲ�sfFmcJ^UF¹��Ϸ�����bxrRymSSF3�������������˱�ɰĸ��Ư�����Ϙ�k^I*��l�lX;$��wѼ��ij����ô�˻�͸�ʰ�ʭ�̰�Ư��q99/./*))'JKF�������������������������Ѿ�������ͼ�˶�͵�Ӹ�˩kgAPY.GO&0- WL.�uX�uX������������������ū���{�����������������������������������̫�w����ǯǶ�����ӵƹ�zjIxdAY=��b��b�U5��kÇb��]�[8iK%iR)n[0bM iT'fP+^AnF"�~Vʏcӕfȉ]�zL�xLhIdM#]J ]F$\L+IC#'% #%}^I�]?�d<��V̏YLjS΋`͌bӖiՙgя]�}IKȋTʎZʎ\ϋ^ъ\ЎZɋR͋QԌR܇N�C�B�E��C�z8�q4�}G�nDk@��nslZkcX�|vqli}xtZVKQK;MF3L3P�_?�wU�Y;IP�Z0DŽO�~GՎXԒ`̌^ˋ]̌^Փč^È^��`P*0 |VA�T<�Z;�qL�~SƀM̈́O͆Pԑ]ҕfȒlm?E@dC _CU>VB!ZBjR0`M/L2BxF%�X-�nF�P5O < 8"$ - ! %( I8$R>&O7M3[B,WC+L<#H: ^P6UA(M3=�kI�^7͊`ˈ^��]~M,D+ [M0UE+aP<������������& 'wX1!l]HwcK�}eH9&yiZo[R"  *0$=@9 -  *,)##! - - =E817+RTG\]O><-[YJ?>,FH3?>*^]HfdO]]EAG-ER6AV7C[;ObBbqRAI1:?)RSAjiW+$;.л��ì�ƫֿ���~oN�ħ�¢�Ǥ����`pg<�xRj`<vU_X>]TE���ʼ���n�yU�}[��g�|i����ɾž�ø���������������������rziO��n�tbiRD��r��v��o��u��q��m��l��h��b��b��jskV)&IHF�������������������ӿ����Ѿ�Ͽ����ν�ι�ѹ�ֺ�ΫljC@IBK )&cZ;��y����§�������������Ͼ�����u����������������������������������ϼ��}�������ɯ�ȭ�Ĥɹ����DZ���zӵ�ڸ��eGෙ���軔̪�ũ�«��|��uǯ­���u��nخ�下���깎ת���n��n��k��m��t��r��j_\=! %"" ��y��l��l�ț�Ԡ�ԡ�Φ�Ү�ө�Ҩ�ԧ�Ξ�͛�Н�Н�͜�Ǚ�Ɨ�̗�͕�Η�Ζ�ȓ��������u��b�H�v:�xB�oC`5��sun\vnc�~wwt���ZTFKF3LE2H2L�cD�}]�^AUr:!أy�ǒ�~١p뵇�ř�ǘ�Ó�Ɣ�Ï�Ŗ�ĝ��t? ��m��k�zZث��̟�џ�Θ�ʓ�٥�ק�Φɫ�W`<�pN��f̢|˜�\JaE9C1'80%53'30'-*# "!"!$#,) *&E>._TB��to^J�nZwfR^S=k`J�ze��v��n�`Aҥ�Ǖp�ȡ�Þⴓ��zD3��rP@'N<(�������y|���J84$��u�wTI7JC79,3") --4%/ *4*5 /8 47 -?>`]0~zK[W*FACA(*>CU\2OV*Zb32828DEUV*XZ)��b��uM=��w���XO>@=.-.(&_WL�yq�vqN@75*RB(Ӻ�ʬ�æ����]N-B:SK$PK#D@B>D@xsM�vL�rG��w��k�yR��s��o��������jrdJ�����~������qVA.4)#1)g`NwlZ��uFC2qmaaTL$  -   - - -  $&# 6A04=,OSD[\LFC4^[LFE3MO:AC.bdNVZCTYB9A)8F,=R3KcCRjH��{=K28A,cgXln`'#;/!ֿ��į�ŭ־����{lO�ë�Ͱ�Ա��{��RsrBYV+fc:`^8JG(QL8����ظ��v��Z~yQYN.B6�|k�������ƻϽ����ƴ��������Ȳo`IdO:�o\�vfU9+vZD��|��tд�˱�Ʃ���~��p��d��y��hbT9' ($&%!NJI����������������ҿ�ѽ�о�Ͻ�ɹ�ѿ����Ҽ�Һ�չ�үzxQ@GDM ))VP0��{����Ƭ��������������俱���������������������������������������ⲥ��������ϵ�ֻ�ˬ�̧�Ɲ�Ǟ�̣�š�˨|cE����ͧ�ɠ�ҩ�Х�Ȝ�ʝ�ɚ�ș�͠�˞�ʟ�Ȝ�Ù�Ę���ܷ�ڽ�Ѻ�λ�ʷ�Ȱ�ð�������1,(&"/)��w�|a��m�Ѩ�צ�۬�Я�Ӷ������ӯ�ҫ�Ҫ�Ԩ�Ԩ�׫�ԩ�Х�֧�ܬ�ޭ�۫�֪�Ӧ�٦�͗��z��O�x>�|E�lCg;��{����~r{wn�~x���WP@JC1KD4?,=�eK�d�M2_'��y�ԫ�ԧԭ���]��a侗�ѥ�֦�٤�آ�ڨ�ذ��x<"��n�f�]϶��٬�ݭ���ݫ�������ģ{lOseH�zW���ʶ�ɱ�̮�в�β�ж�̯�Ͱ����Ţª���x}j\��ung];;122*55-77/10+$%34.34.11);8/=9.YQF�yjtgW;/TN@OL=si]������ջ��������Ǥ�ˬӳ����-%vq[]R>n^N���xg`E63M?<8.%.%����xXF<IE:<5;"'5;083;3;,3.479 -IH|O��jurGnlE==IK$QV.ejAjpD5=4< 08CKPX%~�T���H? ���ο�vkY{ta97"-,]ZGrk[���OF71+XO2ͼ�͸�ı���uSJ+94==CC13,. ')>>?@><MI$TO)oh>rk?xpI�{Wʻ���x~pV������������ucM'*!UKArfZ�~q@>2kh_TIE2#&  -   664##! 9B-6>)VYF][LOI;`ZLPM2$һ��ȶ�¬�¨���wcHʱ���������\UW&x|J^_3RT,7967<:%����ض��z��q��j��[J?#�wa�Ƿ�������������Ȼȹ��и�׽�r[R=(mVDu[J0�sV�ʝ��ɠ����ġབྷݸ�ڸ��ȗ�×zjI7,,&,'#MIH����������������Ѿ�м�о�Ͻ�ʺ�ѿ�о�к�ѹ�ո�ش��\AG;B~{Z����Ǩ�é���������������·����������������������������������������ƿ�ź��������ε�̮�Þ����ʡ�Ɲ�ʤ�ǥo\>̷��š�™�Ě̻�л�ؽ�ֵ�ں�й�ҽ����ֺ�ֻ�ټ�ݾ�ۼ�Һ�ʵ����Ǵ�Ҹ�и�Ƹ����GA+%!"NJ?��y��n����ز�گ�ܵgO5��l����Ի����ع�ȣ�Χ�ͣ�̢�ɠ�Ù�ǚ�ϟ�ק�ר�խ�ի�ݮ�ԡ���݌U�t:�zF�d>h)9;&a`L[UE[TDf_OXRDDA2NL=deS>A.;@*A9?-1 deC����ֹ�ɰ��������������������������������������������������������������ӽ������й�Ѷ�Ϯ�ձ�Ҭ�Ѭ�س�ѱwdF�¢�ͤ�ǝñ��ʡ�ɣҺ�ܾ��ţ�ɤ�ͤ�Ѩ�ɠ�̢�Ҧ�Ο�̝�͜����Ĝ����ãܿ�λ��ȣG?*+%"WPH�xk�s_����Դ�ձ�޾vaP|j^���aTC�κ���Ὕ�Ơռ�ɱ�ֱ�ڴ�ض�غ��͛�Ϡ�֬�֬�۬�բ�Ő�[�z@�r>�kFh8!��w���TUGuvhzthym_`MT'R%U,kH2�ҷ��Ī����vǬ�����ϴ�ͦ�ǜ�ʛ�Śٿ�t_DfT<�pT|lKmGǶ��Σ�ˠ�Ц�Τ�Ш�Ѭ�Ԯ͵�DZ��ʣӽ�־�ж�Լ��›ӿ�Ҿ�ѽ�ռ�Ϸ��h�{e��w���sfS]VDGD???===;@?;<;6IFAoni@?;+)**(+85<205::daBLK->=!:=OU3>H#(4 -; -AQAOLU krH{�b`dMGI3XWBkiP�a��px~Z[a??B#yw^ý�����é�Ҽ�ųsc1*+,/6$ - !$+ +5)5%3"1&4'33::;NI,IC)ED&utV��c��lqaGRC0,( "TUEzsa��rKE9�|sE61$ -   - 58#9;&gdSTM=e^NmeXZTFE?1VPBebQCD2$�iWwn_a^MjiWojWpeSWB-�n\���W>7,8 V5$��pQ0_D3������]KIyef�������ɹ�պ�Ӫ�ԧ�Ҫ�Ӳq\AbQ7�tV�uT�}W������޴���ڱ�������޵�ɠ�޸�Я�έ�Ա�ӯ�ƣ�Ƣ�Ұ�ήȰ����ziUTE2aP@�����f_Mzwr444:::553762873_[X:97,()%#(-*1&%+76;::CjjHXW9��h��q��v��z@? wvW\[<>=0177149@!,6+9 0 +8J.>5B >D IQ(FN%EM&KO.PO0��u������xqaTNB#!   !&$* $2. &5 -#0'1/3,+)( 2501639/." !%pm\��uGA5ulc=.)"  - 2;(26%ebSOG:gaSgcWTNB>6)VL@sl\MJ768"LU:tM<}ND��w�h]�ha��|�~w�|r�~o�~i�˰���ͪ����O:'I>,��rYZLORI\aZfhc12-BA<����í�����r��p��o��u��^�ԯ?/% tja����öļ��Ħ�ͬ��kWD&N>$.9��s™m��\��`��X��[��W��`��bǖk��g�|Z<.! #E@=�������ͼ�ʺ�ξ����ξ�˻�ξ�Ͻ�Ͻ�κ�κ�ѻ�ռ����ģOU'DN@KLURY%Z]2�������������������������������������������������ǯ��������������ʟ}tØ��ʺ�͵�Է�ԷŶ�;���gxhO����̳�Ǯ����ؿ�z_���϶�γ��έ�ƣ�Ȥ��y����ط�ڹ�׶�Գ�Ŧ�æ��s�Һ�Ϸ�Ի��{-$'"XRF�����w±���������ϕ�|"$3&F1 Ϋ�Ϙq鯁㷈ῑܽ�ػ��ǡ�Ƥ�ή�ʬ�ع����������ϴИwɀSƀO�sKlE$\B)\L5TG4\T?nfQ]R�z_�~]�}X�Ǟ���ޯ�������������ŝ��o�ϫ�̭�ȭѸ��ϰ����z�ŧ�ȭ������zcUF1cR@������dZNSPK???333---....,-333'%&###000---&$%21,VVN6/)TJ@yn\�y^������`R8yl\9/#& -, xs]MK425*0"LR.EH��`���^UDNF9MI0EE+GF2#$-+B@1BC3QS>#%48=IJV(EP&08|`BB*87#CB0:;-$$" %$ (0 (% (&. $-+4%* " - -(,"%(' OOCZVK4-'aXS?42$  0<(5<*SPAOG:]YM[YLEC693'ZPDriZmhTY[CR[>9H'4M&3CbZ3{Z9}>/�>7�D9�bX�SP�^^�UV�{xӧ�tP@�mV̴��ų��vS?6m`Xxqkcb^bdc���LLN867=<7����Ʊ�����r��t��Xүy��^ĩ~q`Bzo[yof����Ǽż��ɯ�Ե��eVC#F5/4 YDѤz��V�k4�j4�_.�[.�V+��\˜n��V^F"0"%"JB@�������ȶ�ȷ�˺�˻�˻�ȸ�ɹ�˹�˹�Ͻ�κ�Ϻ�Ͷ����ؽw{V^e9NU!DKRV#Y\1������������������fdXok`���������������������������������ɷ����پ���ʽ��Ɲ�����Ѽ�����ʓ�j´�zlRdT=����м�̸Ѽ��­�{eƮ�Ժ��Ѷ�Ǯ����l��x����Ѻ�ʵ�¬���zo[����udķ��ĵͽ���+!,'$nfY�����{������������_UK !{hZ�éנwڠr�Ř�Ø׿�ι�˳�Ǯ�ȭ�ê�������̷�з�մ�㺦�����q�dBzaCvaFm[Cm^GxmWodNsdQ�q_����peM;1kZPxe^����ujzmgomx������������ɾ‹������ֳ�У�׳�ַt^Fr^F�d��m��f�›�����������������Ͽ���x�ƨ�ʯ����sX�ˮ����~�ʯ�β̻�cS:��siZEj[Hµ����j`T850AAA779""$OOQ??A668((*...777%%#???000!$% &'!?:6MD=f]NQE/���õ�l`Hyn\5,$%#""(( hfMA?&.1:@$>D>D��R��kTH<6+%     ! *+8) %5#3'.+=0B$,.7J>O"O^5epP�����尲�JM:7>:B+7 /<X]IBG3@C8')$ -  &+#'  - -  EE=[XQJEAia^'  - - 4<$;?(OL9RL7/MD=C:3ULEmb\���}rn3)(/%#  pgX����������������ιUQH��|�ʵէ�Οu�ğʳ��t]l`PoaVbTKPB9TG>UM@RJ=ME8J>2\IBnUN�{o��x��u��i��m��k�|a�rX��t���º�¹������Ǿ�����sf]ZL?D7'I?5KBEUJN������������yw�����ħ�Ĝ�Š�ܻlT:u_H��f��n��l�Ƣ����޶�������������ɶ���x�Ūϻ��pWuaH�����k��oɸ������{N@&�����|fYF��v�zhVNA)&!888%%'!!#;:?87<;<@!"& '(* !;<@,-1"*'"OH@d\Q6*������vjTtiU80'! -(,*,*okRDB),/39 -28CI_]4WR2-    ##!!'$ *".$5+(7I#(:. -,' -ctTjyZP]C��{�����͏�����MS96=1<1<6A)3s}Z/93<%.  -  # 7?(bjSPXCHO=7=/PVH��}DK;QVO#($ # & -!    ,)$940TOK)!  - 9=":="QO8FD/?<+>?--4"*-!'QEG����ǽ�±�Ŷ�ȷ�Ƿ�ƶ�ó�ų�IJ�°����°�ȵ�ɶ�ҿǽ�?53@64aUI`S@\M6_P9������������������jg`kfb����������������������������пλ����Ѹ�ջ�[EG����qn���p`Q�����҇{e���ocKj[D����ǵ��tE0W@.sYHiP<[@+bK;XEAqabpadoce7-.:12=79ZVWplm956!:676021+-JADg^_WKK9+(j^N��s�����������ÿ��ROFAEP**2ia^ȵ���z̦�ȯ�n]IQI>XSP[UWGAE1+->:9fgbcf_45/+*%vmnsijYONPEAqeY��s��y��w��i�ye���ƿ���������������괰�����ueKC0NG7UMKKBE�yv�¿��ȡ��ahz���������д��άgM2kV;�qU�nO�tUϷ��Ӯ�ԯ�հ�ܷ���������ʵ���l�©�ӹ�}cJ9\K1[K1m^AD4^N4ɻ�K=#ĸ�ȼ�g\FlaK�yeve! -  ///$$$444002..0\[`,+0!ID>���.$��t��uNA.J?)B8' ,& 0*)% ^ZA97+.(- */;?;8B<"+!  ''$%"$# !&*)!(!'.&(3%#0#-' &5- #3/?'6-:(p|n��}:E4;C68=6������hhj������4:&- (!(&t~[(2/93<,5 %$',,/+0GJ5`eO������vziosewzq����ŷ���rto!%& ( ) (  - #& -==!??#US:KI297";=(-6!1=%4<%?C,NL3YY=8B9H@M"RS'ze:�Z7f(c �RD�ne�DE�DM�9E�AMl%+�OL�i]�udpcS( <20e\]iebMJEbZWyqn�����������������m�x\�xV�qJȩ}�}S�{UdU8/$,"0%6-$7-!�ue��ovdP@.N<(,2�xaծ�ج�ʝ|Σ�Ш�ڲ�Ԧ�֫�ڸ�׺���fK6!)$OFG����ɽ���˿��IJ�ñ���Ƚ�������Ƚ��ɴ����Dz�ȳ�Ƴ���3)**"O@;J8.H5'T@5������������������libpic��������������������������ϼ����v]X���Ѹ�@03oce������i]Q������zo[���nbJdU>����ǰ��kZF.R>&t^FjU:`H.ZE2H948./-"&"("&+&*'%*%$)'&,)*/$%*&',.-5,+3309818OCEC4/<.#aSF�v�����~���Ͽ����/3?>>Jd^^��v��zʭ���ze[QD@?65=53A;8I++703:8@B5?>&0/ FGLIHNJJR/.34/,KA7l\L�|iracWKzrp��۶�������������������������pup]}|zKR\Tfzw�����w��Kb���������z��}â��yZ�wT��e��_��[��}Ѹ��ƞ�ǟ�˦�ٵ�ܺ�׷�����aȵ��ʮ�|_`Q4]N1ZK.qbCE7]O2���M?$������`T8":0'0'"& *+&/02,-1.25)-..216<8HOHXbYtq9VMH[RM�ro����xx��������������y��u��k��k����|]�qVocM^UFXOHZQLYRJNE<^THzl_scV`NBcSFR@2U?1�l[��y��r�i�ye�ye�s]�~d�y\�}W�wR�sXI4!1#$ID@������������ǻ�ɽ�ƻ�ø�ƻ�Ĺ�������������ú��Ŷ���"#5&#A0)�yr~id���ͼ�Ƚ��������ÿWRLof_˽������������Ȕ���������½����um������~jlK�w\�w\xcF�qZ3("""! !""$""'%!(#!!+) +%"+/$(. 3&2%TFCoa^�okgVLqbOB7% 68DIISXOPudZ�yc�v^o_P1*$ )-01(  -% "$!*#3.+fcl��������������������ϝ�������������*:I;\}Fq�Q|�c��bz���������z��y��u��v��r��r��v��m��k��s��v������̵�Ȱ�Ű������t��������s�pV�pVp`F�uXoaDpbE��nm_D��t��lj^D�~d]Q9\R9XP;XQ>71!*$ '#&"$ '##,'#-(%&  ./)  1);5A96. -2) -5+!up\32/0 *.  !$&(97")#$4/,\YT:95894;;;@@BDEGMNPdeg^_aJNMglh���bg` -)/!�����ٸ��gjogkv������ruzx{�jlyegtggqyz|����q04*.%)&*59(,# - " ED2�����˝�����������������������������������LIPIHP! %23-.1 %) $       & 0,+:67)'(      -  -     -      ���^ZA2,>8 =9 3309:H' IN.>E$CF'OK.VL1YG1vZLtXJ�r]��mwXD}VEyK>vF:yKx`Hj\Ac]E\WAXO>ZN@hWMkXQiVPC.+R89P69Q<;L95K82L92P@3RB3YF7[H9WD6\KAYLFXNLVMN_Y[_ZW^YUe^XdYUhZYeWWo_`p`ajVWta]r`Vp^RraWwe[t`YybZ}gYzaM�jR�mR�iT�wg�u�|u�����Ż�������¶�ƺ�Ź����������������Ż�¸���������� "- q`Y`NLA06D4?@5CC;H?:@F@BLDAla[l]Xna[������qeg8,0H>?LBAZOI���ɲ�����~~A.0<02`ZZ���½�|ri�����ڡ���{j�u_�zb�}e��f�e��i�~e�{b��i�~d�{e)! -#,)$986((&$&% #$ &(! ()")+ $)2'%�����׿���pi�teuhW(#a^e?:@eYY|j`�|j��uN@5-%"%$( /)    -   'HEX������������������ĺś����u��w��y}~�HWj=a�=l�Fv�f��w�������y�|j�q�}n��n��l�}g�i�j�~i��m�~i�}h�{h��t��t��t�|m�wh�yj�r^�vb�ua�t]�}f}mV�v_�u^�t[�rX�s\yjSvgPsdMpaLaU?aV@YN8VN;WO071#0*% )"(! - (( 0+[U;_[6c^4id:ojDdZ?6.�}j67'(*#&   ,$"}twysuOMN++)..,+*(/.,-+,/-00.1/-0hfk���b`c&$'('%������XXX..8Y[hUXasv}�����Ӄ��\^k@@J78<������24*,!#%&  -51(��z���ļ���ؠ�����������������������������������ZU\ +)&%%$ - - - &"#,();6:-+.!"#' $��mYT>IA,F>'RL4IH,CJ+LV4TY;\_BbaEcbFdgL^aFffLcaHhbJ\Q=[J:WF6[U=��epS�kP�mV�nX�iT�kR�qV�sX~r\|o\~q^�ue�n`�pdx]TJ,$U-+F O2,mVN,   -! ,+    -    !/C"P+\7%V2$_=4vZO�����������������������������z|rhpf\bXOOEOD>C84���2.#/,6/3*2&2%-1%)eZ`3*/'9/-I@7lbXK=2F:.QG=I@7((`US}rl�xoƸ����«��up0SIGc[X|uo�����������Ϙ�{�ve�zg�v`�yc�|f�wa�ub�tc�zi�tc�xg|sd>7/-($&#��}��撒�""&3.4���¹�u~�{�3'+;-,������|sj-($0,-:48n``�oh�ti|h]$'"!/,=?^J?XD=WD=YH@XJA^PG^MEbQIfUMfUMkZRlYRo^WhUOn]Vq^Zr`\uc_ud]tcYvfYyi\}m`�pa�sd�vg�te�rb�rbrbrb�ue~qa~qa�sc~q`�xf�ue�wh|rf~vi�{pym�zo��t~ulwpf?6/ ?53QIF@@4==141(+(!'$%!=:+tr[liHjhBhd?qlLldMXQ?�}n66, -      4.0������/-2%!"������XR\ !E@F������))(6'*3HKTvy���@BO')6%%/EFJ{|wQSHMN@?@097*%# '8/0������MAK:.:0$24'82%61&42(1.%*) %4*3|r}���F?G4..sofnj^qmapmdolg - ! /-0##%    MM5SN8dYCwkUxpYxt[ttZtwZ{y`yu\xt[vrYrmWecL`^IWU>VU9YS9p[tePohN{vX~qQ}nO�oU�oU�pW�qX�qX�qZ�pa�pc�rc�rc�rb�tc��oЩ��tgk7*tM<�iV)! -  - -  -  -  -     - -  -    *sG:ҝ�՛�b(>RoF4�aOgUII<3?2)YLC[QGMC9  7-$bUMfYQD71��x{rayqZwpTslOpiLleIiaLg^MsgYi]O`TDbWEj_KmbNh]IbWEPG6NE6M?4O>6N@7UG>wk]���|k[��syg]_QHpf]qg^obZ�~u�rh�������tdm`MgZGdWFeXGcWIWMAQG=OD>LA=J?;LB@MEC@::3/01-.������~�""#' $#!"$DCK������40>*$.5.5OFGynlqfbTLI3.+510824ZNPXHItb`gXU2('"UR]IGR%     -   -  -   (&0% ?3I�s�bYn{v�������w�;/;=2:>5:3.287<��������������mg���:(@1*=//8,.6*,6+/6+/5)-4(,6*.7+/7+/8).6)08)07*1:+08,08,08,09--:..<1/?42B75E:8G<8H=9I>:J?;N@=QC@UGDXJGZLIZMGXKCYOFXMGRIDQHCRJGTLIRMIVOIKF@XPMHC@ H?@QKK $!MIFKGFECD><=?=>?;:=:3=;,?=(?=&><%?<)C=/C?4CC;894')(  )$*`[b[Xa+*2().+,.1/0431:89<:=649:7>UOYpjvA;G:4@60<71=71;93=E@GQNW64?11;//7008/29/2;/1=02>36??;897:2164467581/22-1615604707@6?C9D@5C<1A=2C>3D>3D?4B:09=3;=3;92:A9D:2?!$!0+'41*2/(3/,/+,     -0qpTuiQ�zct^smUvq[qlVicMf^KZS@QJ7MF3HA.OJ6PK5ZV9rmP|pZ�wbt^�v]�tZ�u[�s^�t_�va�t`�s_�rc�qg�qj�wm�qe�ma�pc��v֥��\NŐ~ܳ��t_reR)& !40-%$    -   -  -   -   �le�j\Ȋ}����A8x8/�dYtE3`=)lYJZN@�xjwk]I@1RI:E<-H?0ZPD[QElbVqg[ui]bVJm`W�����m�~g�c�~_�~]�]�~_�}a�e�}f�}f�}f�}c�|b�}d�}g��j�|i�sc�qc�se{k\obQnaNiZEm\Jl\LfYIbTG_QD`NB`M?\J<_O?[K;YJ7^O42;126-03*-.(,3.2/*..)/2-3'%*,+0,+1%&+)*/*+0+,0)*.)*,)*,)*,()-%(-++3?=KA=L+)7/-82/65049037.1*$&#!"%%%#!"7.36+1>186+/5/3-+.(',&',106,+3)'2"",'!!)#$)#"'$"'%#&&#*# '$!*"!)!*#*2&-7##/'.7*;|o�MBPD>Jb_jf`lUMZ6+;1&6+(1*+/999�����ߨ�������̭�����H7-1&"/$(0&..'/.'/.&1,$/+#.,$/-%0-%00&1.&10&10&//%..$--#,-#++$++$++$++%)+%)+%)*$(*$&("&'!#) #) #*!$*!$*!$) #') !("#" "!#"! ($%" !&"##!" '"($%&!'## +$!,&#,! %####$%%%%####%!$#!$$"!"$$# !"$"$!(# '&#,!,*"%." " ""$$#($#)"!)%"-(%0#-",#-$!,"*!'"(%$,&( (!(") #,+() ' % $""*008349&%+"!%!%"&'!-)#1("0(0' 0(0( /*"/&'(!(*#*(",,&2'!/!$#!"!#!$" %   -    -  - -    -  -      -   -MS-jjF{mRiY@i^Hh`Kg`MkbQpdVnbTtk\leSg\Jk`NvpZuoW��f��l�vf�pa|o_�sc�wj�pf�nh�rk�vo�zq�yo|sjulgogdb]Z^SQbIEb;6�PK�dYĎ�������WB1NG5%%##&#&% *+# ! -  -     - -   - -  -   -+����l]�}r�@6HO G$O6 �{d��o}r^ncO' -:2lfPicMe^Kc\IkcPldQpeSh]Km`O����ym�xk�zi�{e�}c�d�~d�e�|d�}e�g��i��k��j��k��j��g��j�|f�yf�~j�~j�|d�|d�~d�x_�zc�~i�{f�yg�yi�xh�xg�ye�ua�s_�q]yjUn_LfYH\PBOE;B92:0.3+)3*+3*+0*,,()-)*,'+(#'-+.++-*).)(-)(-+*/,-1,-1,-1+,0)*.()-*+/+,1*(5)%4-+8((2-.3'&++(/,'.%")+,0&*-#'*&#,*$0-*5+(1,+3+,1#&+),1().'*1(+4&)2&)2'*3'*3((0&&.'&,))3''1*(3**4%(1%)2'+4''1+(1-'1:3;839-+.PNQ~z{TMU)/0':%(/"((162�����ݥ�������������Ѯ��G>95(/.$-+%/*'0)&/(%.'&.'&.('-('-)&-('-)&-)',)',(&+'%*&$)%$,%#.%#.&%-&%-&%-&%-&%+'&.&%+%$*%$*%")%")$!(# '&#*%")$!*"!)" +!!+!!)")&"' %"""*!()""*# '#!+)!0!1#!/ ,& % !& !& %##"##(((()))'($&)'%%""!%(*''(&%#" "$####&(('$  ""!&"&1%)2&"%''&%##!"#  -   -  -   - - - - -    -  - - Y_3��_~qO{lOuiQ~vamdSTKxFG١����迹dF>8%""/0(00(**    - - - -    -       -  -    6�~x����˽�k`Z!.@ p[JqbMthP�~e{pZjbKA9$+#nhRg`MngTpiVqiVphSwlX�~jreR��p�vk�uk�wj�yi�{e�{c�{c�zb�yb�xa�xa�|d�g��j�g�|b�{`�|b�{c�}e�g�}d�{a�~c�~d�~d�y_�{a��h�}g�wc�|k�{h�i��k�h�}f�}f�xd�q^|o^vj\oe[h^U_VOWNGNG?F?9?:694072.3.*51.*&#,('0/--+,+)*)'(&&&%%%&&&))+***)))(&)/*1+%/%$**+/&')*+/+(/,)2'&,)*/$(+*.1))1-+6((2..8%%-),3%(-%),'+.%(-"%,"'-%(1%(1$'0%(1''1&&0&)2$&2')5)+7'*3%)2),3(+2--5"!'65:000$$$[ZXc_\A;?2*9+$4&+1'0/(-)�����ܔ��¾��ȿ���������XLL1$+/%.'$-&%-&%-%%-%%-&&.''/%(-''/&).)*/*+0*+0*+0*).)*/(+4'+6'+6&*5%)2$(1$'0#'0!$-#, #* #* #*")")") )'(*+)((*' )$(%)(" (!-!1 2.,)()* ,,**'('('()))(&() ,!-(+$&&%%'('(($"" # # $")!%. $/'#&$$%%&%$$&##"!"$$! !" !     -   -      - - -      fj8��n��]�}\��o�zd2+(4(=1#;/YN<{p\vlS`T<�u`��u@3*;0*6,*7/-($##!"%")"!) % $ !%#&")!*!,$!,!"4#+xZbҭ�š��]hK+65"($'"%($$!        -       - -    5�liק�������iA7( >-#bYHmfSrjU{p\}ubphUaXG92"mfVldWkcVkdTkbSk_OviY�������pa�vi�ti�ug�wh�xf�yd�yd�yb�yb�yb�yb�yb�zb�{a�z`�{`�~a�z^�w^�x_�{a�y_�{`�}c�e�{`�{`�}a�|b�{a�yb�vb�{f�xb�yc�|d�{c�zb�ya�x_�u^�s^~q^yl[rgUncQh`Mc[H^WEVO?RJ=KC6E=2D<1D;292*81+81+80-61-72.83/941;62=:5A<8C;9D;<952762//-...1,01,21,0++-(*)-/.++-+*/()-*+/+,0+*/++-//1))+,-/*+/*.1,-2**2))1**4),5),5--7+.7,/8+.7*-6+.7+/8*/5&-3&.1:?B(,+ a`^HDA0,-)#-'%0&&.'+.,,.�����ӟ�����������������ZIQ3&--&-)&/''1''1''1''1%(1&)2&+1'*3&+1(+2(+2(+2(+2))1&)0#*2")1!(0 '/&.$,"+"* $-$,#,"+!* )((#.!, ,".". ,+"+!+%#+#*#-!+$0 +!(#$)(!-!#0 ".!*!' %+ %+ $/%/!%0!%0 %+ %+ $/#."."."1"1#/".!#/"$0 ".!-!-!-!-!-#.#,"+!, +*(&&&##""! ##+$(3#'3'!"&%$%'&&'$#"  !! " " !!!    -       - - - - - - - - - - -    -`b0��h��n��n���^T93.53:3!D;,?3#@4$NC/K@*UI1_P9\M8yl[I?581)$! "&$"#&))*)%, ..(2*2(1)  -63AKCAG=>;,*.# "!$$%'!#$$/*$+'#%&*  !;!rLKxPH�{p��y[@5:)8.$?8(B;(YQ>ujVwn]��s{sfB:/`XMe]R[RITLAI<3E9-YK>��{��}�zh�|j�zi�yh�{f�|g�~f�~g�g�~e�f�g�~f�f��g��f��f�c��h��j��j��i��i��h��g��i�~d�c��c�~b��e��l��i�i�}e�~f��g�e�}c��f��h��h�g��k��j�~g�e�e�|b�{e�}i�{h�zf�xg~sa{n^|pbui]nbVeXOZPFTJ@TJ@WMCYQF[TJTKBUKAOE;G@6C?4>;496191/80.:2083074/43.30+30+10+0/+2.+-)(0**5//3/.54221/1111/2..0-,1-,2.-5--5,-2+.3).4'+4),5+.7,/8).4(/5(243;=*./002idh837+).,+1008''/$$,>>F������y����ʍ�����������r`p5+40+2+)4))3))3))3&)2%(1$(1%)2#'0#'0$(1$(3$&2$&2#%1"&1%/%-%/%-$.$.#.$.#.%/ $/$.#.$.#.$. $/#-".#/$0".!-"-".&/&0$.&0#/%1&*6#'0#(.#, $/!%.!%. %+ %+ %+#,#-!-!-",!) (+**)++(&)(& +'#((*'&'''(+(&'(&$#'''((('&'&%%%%%%%%&%#"  "$$###! " #"##! !"  -   - - -  -      -"$#ff2��l��r��x��zQH)?> /2;9"E@*UJ8NC/LD/f[E�p\xhQzjSsgQqjXf`ROI=62& !""'-. /#+,),%-&+#&&)"#978UVQ`cZWYNRTGAE7'' F>LJ;BC3?@2DA8_USg][~}x���?<3B?6  9),K65:!YA5eUF`TD\RF`TFdTDsdQviVwlXriX����yl2*1* 3,"90)?6-:-$3'B4'bRCudT��m�~d�|b�{a�z`�z`�{_�z_�{]�~b�}a�}c�}d��g��j��g��e��h�g�}e�|c�~e��i��h�|b�|d�~f�~c�~b��f��d�e�f��i��h�~f�~d�f��g��h�~e��i�}h�|g�}h�|d�}e��h��h��k�~j��m��l�~j�k��m�zh�{i�{i�{i�|i�yf�ub�r_~q`ym]xl\xhXiZGg\J^WESM?]UJ_RIaSJcULh[Ri_UiaTkbSjcQe`MhbRbZObXO\NKQC@K@(-3!&***4)(647H������|����ɏ�����������yi�(!3*(5(&3'%2%%1%%1"%. #,"+#,#.#.#.#/"1"1 "1 "1 $0 $/#/#.".!-, ,+ , -".!.#/!#0 $0 ".#. "/#/"1!0!0".#/$0 ,#/"&2"%4. /#1$/%1#/#-","*#-!++,.,,)'+*''*+**&&(% '"0)%$()'%%'&%%%'&(*'()'%%#"""%%%%!&%"!! "$%%%#!!##  #%$"  !"$! - -      hf3��g��p��q��_k`@a^?QQ5><#JE/t`wlV`XAlaKwfR~lV|lS{oUvnWun[rkXrkYb_NQOB;;310,### !'++* +*).(.'(! "(#')(&+,')*%14-.1(:943)(& ,(%,'!(&*(+)--#%"H>=G=>JFGHDA3.(41( *&'%3($'>2&B?0JG8PH;ZN@I8(. $+#A5%���tla#!$/&?6/E;26) ?1$D4%�uc�t]�{`�{[�z]�{^�z\�z\�y[�y[�y[�z^�{b�{b�{c�|d�{a�zb�{c�{d�}e�~e�|d�}d��g��f�g�{c�{b�}a�~b�b�d��f�|b�~d�~d�}d�~e�|a�|a�~f�|e�xa�yd�|g�{f�|d�|d�|d�zb�}e�~i�{c�~f�zb�zb�|d�~f�|d�{e�{c�ya�w_�w_�zc�zg�|i�v`�~e�yb�yf�~l�yi�wg�{l�vj�yj�uh�vf�s`{n[t`�uc�re�tl�pi�rn�rm~qivlboe[g]S]UJSJAF?9=5261.32.02/+/.)-.+*/)',(#)'%(%&(!%&%"+YUc87G!#2")/$*#%1"$3,1DOViR[lDLY���}|�?.@E.H5"B):/,A#%4%%1$$0$$0$$0!$-"+"+#,!,!,!- ,../-, - - -!-!- / /!0 "1 "1 "1!0!0!0!.!#0!#/!#0!#0"1"1"1!0!-+*#/*.. /"2,#0 +!,!*!++*,-./!. -,+,**++('("'( &*' *&%$'('%&'(*))**+)*,*&"!#$$"!! !$"! !"#"$$""$! !!"" ! !%!  -     - - - - -       - -  - li4��j��t��q��r�vU|uYnjQA:'VN;������pfMe[BtdMwgNvhMwiNuiOthPsgOuiQujTqjWoiYcaTMMC<=8%&(!$&&%$%&%)&'%&#  ! ! -   -  -    ("$     !#,+&($/+ "-+64(*(( F:,B5$?4"2);2#G;-���aZP% .'!+")"/&7)G5'�p\�u]�x^�x\�y]�z^�{_�z^�x]�w\�y^�za�ya�zb�zb�ya�zb�zb�|c�}d�}d�|c�}d�e��f��i��i�~d��k�d�~c�d�~c�~c�c�~b�{b�yb�{d�zb�y]�|_�|a�|c�x`�yd�yd�va�xa�w`�u^�x`�xa�x`�x`�v^�u]�v^�u\�u\�u]�u]�u]�v^�v^�v^�u]�w_�v^�u]�v_�q]zkXvfVqaQueU}k]�ue�se�ue�o_{jZrbSk[NXG?P?8SA=UC?\JFcULn`Uxl\}r`zr]zr_tmZmfTkeUhdXdbVaaW^^V_\U^[VXUPSRNHGC997"$%*99A13?"&1 $- $-#. ,%5"*=*@ +?���_am*"7*6,";-%=)(:(*7,,6,,6++5-09),5(+4!%0 $/ ,+**)),,,++ , ,!- ,+!-".".".".#/". ,".!-!-!- , , , , , ,+++++*-* + +!+ **!,**,, -!.!. -,+!- , , , ,++)'&') )('())(&')%&&'(((('&&((('%&'%$'&##$##" !!!""!     !!!                       \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/tga/Building.tga b/Users/Orvid/ImageManipulatorTester/ImageFormats/tga/Building.tga deleted file mode 100644 index b034808aa8..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/tga/Building.tga and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/tiff/Building.tiff b/Users/Orvid/ImageManipulatorTester/ImageFormats/tiff/Building.tiff deleted file mode 100644 index 129de1ba0d..0000000000 Binary files a/Users/Orvid/ImageManipulatorTester/ImageFormats/tiff/Building.tiff and /dev/null differ diff --git a/Users/Orvid/ImageManipulatorTester/ImageFormats/xpm/Building.xpm b/Users/Orvid/ImageManipulatorTester/ImageFormats/xpm/Building.xpm deleted file mode 100644 index 56916134b5..0000000000 --- a/Users/Orvid/ImageManipulatorTester/ImageFormats/xpm/Building.xpm +++ /dev/null @@ -1,67 +0,0 @@ -/* XPM */ -static char * pixmap[] = { -/* width height num_colors chars_per_pixel */ -"100 40 20 1", -/* colors */ -" c None", -"! c #ffffff", -"# c #fefefe", -"$ c #f9f6ef", -"% c #f9f2ef", -"& c #f98d5a", -"' c #f7f9ef", -"( c #f6ce74", -") c #eff9f5", -"* c #dbf5ea", -"+ c #d73601", -", c #c6eef4", -"- c #c6e9f4", -". c #8ff674", -"/ c #26fa00", -"0 c #1b0e07", -"1 c #111005", -"2 c #110605", -"3 c #090503", -"4 c #030904", -/* pixels */ -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!/%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+++!!!!!!!!!!!!!!!!!!", -"!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!", -"!!!!!!!/.%/.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!", -"!!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!!", -"!!!!!!!!/.%/.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'&+!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!/.%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!/)%.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!!!!!!!!!!!!!!!!!!!", -"!!!!!!!!!!!/.).!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!!!!!00000!!!!!!!!!", -"!!!!!!!!!!!!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!!0000000000!!!!!!!", -"!!!!!!!!!!!!/.).!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!!00000000000!!!!!!!", -"!!!!!!!!!!!!!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!0000000000000!!!!!!", -"!!!!!!!!!!!!!/.).!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!!0000000000000!!!!!!", -"!!!!!!!!!!!!!!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!000000000000000!!!!!", -"!!!!!!00000!!!/.).!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+&'+!!!000000000000000!!!!!", -"!!!!00(((((00!!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!!0000000000000000!!!!", -"!!!0(((((((((0!/.)/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!0000000000000000!!!!", -"!!0((((((((11(0!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!00000000000000000!!!", -"!0((((((((((11(0/.)/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'&+!!!!00000000000000000!!!", -"!0((((((((11(110!/)./!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!!$$$$0000000000000!!!", -"0(((((((((11((((0/.)/!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!!00$$$0000000000000!!", -"0(((((((((((((((0!/111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!!!00$0$$000000000000!!", -"0(((((((((((((((0!1((1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+'+!!!!!!00$00$000000000000!!", -"0(((((((((((((((01((111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!444!!!!!!$$$00$000000000000!!", -"0(((((((((((((((0((1,,1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4-44!!!!!00000$000000000000!!", -"!0(((((((2222220111!1111!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!44-444!!!!!0000$000000000000!!", -"!0((((((2#2#2#20!!!!!1,11!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4--44444!!!!033$0000000000000!", -"!!0(((((2#2#2#0!!!!!!11!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4-4!4444!333333$0000000000000!", -"!!!0(((((22#20!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!4444!!4444333330$00000000000000", -"!!!!00(((((00!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!444!!!!444333333*00000000000000", -"!!!!!!00000!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!333333$00000000000000" -}; diff --git a/Users/Orvid/ImageManipulatorTester/ImageManipulatorTester.csproj b/Users/Orvid/ImageManipulatorTester/ImageManipulatorTester.csproj deleted file mode 100644 index d2f08215b0..0000000000 --- a/Users/Orvid/ImageManipulatorTester/ImageManipulatorTester.csproj +++ /dev/null @@ -1,245 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7} - WinExe - Properties - ImageManipulatorTester - ImageManipulatorTester - v4.7.1 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - Form - - - Form1.cs - - - UserControl - - - LabeledImage.cs - - - - - Form1.cs - - - LabeledImage.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - diff --git a/Users/Orvid/ImageManipulatorTester/LabeledImage.Designer.cs b/Users/Orvid/ImageManipulatorTester/LabeledImage.Designer.cs deleted file mode 100644 index b7f8033564..0000000000 --- a/Users/Orvid/ImageManipulatorTester/LabeledImage.Designer.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace ImageManipulatorTester -{ - partial class LabeledImage - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // label1 - // - this.label1.BackColor = System.Drawing.Color.Transparent; - this.label1.Dock = System.Windows.Forms.DockStyle.Fill; - this.label1.Location = new System.Drawing.Point(0, 0); - this.label1.Margin = new System.Windows.Forms.Padding(0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(150, 150); - this.label1.TabIndex = 1; - this.label1.Text = "label1"; - // - // LabeledImage - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.label1); - this.Name = "LabeledImage"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Label label1; - } -} diff --git a/Users/Orvid/ImageManipulatorTester/LabeledImage.cs b/Users/Orvid/ImageManipulatorTester/LabeledImage.cs deleted file mode 100644 index 5ca80ef91c..0000000000 --- a/Users/Orvid/ImageManipulatorTester/LabeledImage.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - -namespace ImageManipulatorTester -{ - public partial class LabeledImage : UserControl - { - public LabeledImage() - { - InitializeComponent(); - } - - public Image Image - { - get - { - return label1.Image; - } - set - { - label1.Image = value; - } - } - - new public String Text - { - get - { - return label1.Text; - } - set - { - label1.Text = value; - } - } - } -} diff --git a/Users/Orvid/ImageManipulatorTester/LabeledImage.resx b/Users/Orvid/ImageManipulatorTester/LabeledImage.resx deleted file mode 100644 index 1af7de150c..0000000000 --- a/Users/Orvid/ImageManipulatorTester/LabeledImage.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/Program.cs b/Users/Orvid/ImageManipulatorTester/Program.cs deleted file mode 100644 index daef37f903..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace ImageManipulatorTester -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} diff --git a/Users/Orvid/ImageManipulatorTester/Properties/AssemblyInfo.cs b/Users/Orvid/ImageManipulatorTester/Properties/AssemblyInfo.cs deleted file mode 100644 index b2efd2ec47..0000000000 --- a/Users/Orvid/ImageManipulatorTester/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("ImageManipulatorTester")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("ImageManipulatorTester")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("cc87848e-8bf3-42a2-80e2-b80b65a91454")] - -// 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/Users/Orvid/ImageManipulatorTester/Properties/Resources.Designer.cs b/Users/Orvid/ImageManipulatorTester/Properties/Resources.Designer.cs deleted file mode 100644 index 5850c3b239..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ImageManipulatorTester.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ImageManipulatorTester.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/Users/Orvid/ImageManipulatorTester/Properties/Resources.resx b/Users/Orvid/ImageManipulatorTester/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Users/Orvid/ImageManipulatorTester/Properties/Settings.Designer.cs b/Users/Orvid/ImageManipulatorTester/Properties/Settings.Designer.cs deleted file mode 100644 index df2b5199f3..0000000000 --- a/Users/Orvid/ImageManipulatorTester/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.1 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ImageManipulatorTester.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Users/Orvid/ImageManipulatorTester/SupportedFormats.txt b/Users/Orvid/ImageManipulatorTester/SupportedFormats.txt deleted file mode 100644 index 39e1937707..0000000000 --- a/Users/Orvid/ImageManipulatorTester/SupportedFormats.txt +++ /dev/null @@ -1,44 +0,0 @@ -dds: - Dxt1 - Dxt2 - Dxt3 - Dxt4 - Dxt5 - A1R5G5B5 - A4R4G4B4 - A8B8G8R8 - A8R8G8B8 - R5G6B5 - R8G8B8 - X8B8G8R8 - X8R8G8B8 - L8 - L8A8 - A4L4 - A8R3G3B2 - R3G3B2 - X1R5G5B5 - X4R4G4B4 - A2R10G10B10 - A2B10G10R10 - A16B16G16R16 - R16F - G16R16F - A16B16G16R16F - R32F - G32R32F - A32B32G32R32F - 3Dc/Ati2 - Ati1n/Ati1 - -Formats with issues: - Q8W8V8U8 Difficult to describe. - A2W10V10U10 - RXGB - -Un-Recognized Formats: - G8R8_G8B8 - Q16W16V16U16 - R8G8_B8G8 - UYVY - YUY2 diff --git a/Users/Orvid/License.txt b/Users/Orvid/License.txt deleted file mode 100644 index 5df5b4b80c..0000000000 --- a/Users/Orvid/License.txt +++ /dev/null @@ -1,29 +0,0 @@ -Please note that everything in this folder and any sub-folder contained -there-in, is under a more restrictive license than the Cosmos project, -and the Cosmos Toolkit, which this folder may have been downloaded with. -It is licensed under the terms of The Orvid.Graphics License v1.0, a -copy of which can be found below. -This file was last modified on August 24, 2011. - - - - -The Orvid.Graphics License v1.0: -Copyright 2011, Orvid King - - -In this text, the word "folder" means everything in the folder containing -this license, as well as anything in any sub-folders or files contained there-in. -In this text, the term "Cosmos Toolkit" refers to the IL2CPU compiler, and -any libraries used by it. -In this text, the term "Cosmos" refers to the Cosmos project, and any future -OS which may be created by the development team of Cosmos. - - -Everything in this folder is for use ONLY in Cosmos, and products created -using the Cosmos Toolkit. Products based upon Cosmos or the Cosmos Toolkit -are NOT allowed to use anything in this folder. Files and folders in this -folder are NOT considered part of the Cosmos Toolkit, nor are they considered -part of the Cosmos project. Use of anything contained in this folder, in -any way and/or shape and/or form, which is not part of the Cosmos project, -or a product created using the Cosmos Toolkit, is PROHIBITED. diff --git a/Users/Orvid/OForms/Controls/Button.cs b/Users/Orvid/OForms/Controls/Button.cs deleted file mode 100644 index b2022df781..0000000000 --- a/Users/Orvid/OForms/Controls/Button.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System; -using Orvid.Graphics; - -namespace OForms.Controls -{ - /// - /// A button. - /// - internal class Button : Control - { - /// - /// The internal size of the button. This is slighly smaller - /// than the size that was specified, as the buffer has a base of 0, - /// where-as the size has a base of 1. - /// - private Vec2 iSize; - - /// - /// The default constructor for a button. - /// - /// The location of the button in the parent control. - /// The size of the button. - public Button(Vec2 loc, Vec2 size) - : base(loc, size) - { - if (size.X == 0 || size.Y == 0) - { - throw new Exception("No dimention of size can be zero!"); - } - this.X = loc.X; - this.Y = loc.Y; - this.Size = size; - this.iSize = new Vec2(size.X - 1, size.Y - 1); - this.Bounds = new BoundingBox(this.X, this.X + Size.X, this.Y + Size.Y, this.Y); - MouseEnter += new MouseEvent(this.ButtonEnter); - MouseLeave += new MouseEvent(this.ButtonLeave); - MouseDown += new MouseEvent(this.ButtonMouseDown); - MouseUp += new MouseEvent(this.ButtonMouseUp); - Buffer = new Image(size); - this.DrawDefault(); - } - - /// - /// Draws the button on the specified image. - /// - /// The image to draw the button on. - public override void Draw(Image i) - { - i.DrawImage(new Vec2(X, Y), Buffer); - } - - #region Event Methods - - private void ButtonMouseUp(Vec2 loc, MouseButtons buttons) - { - if (Bounds.IsInBounds(loc)) - { - this.DrawMouseOver(); - } - else - { - this.DrawDefault(); - } - } - - private void ButtonMouseDown(Vec2 loc, MouseButtons buttons) - { - this.DrawMouseDown(); - } - - private void ButtonEnter(Vec2 loc, MouseButtons buttons) - { - if (IsMouseDown) - { - this.DrawMouseDown(); - } - else - { - this.DrawMouseOver(); - } - } - - private void ButtonLeave(Vec2 loc, MouseButtons buttons) - { - this.DrawDefault(); - } - #endregion - - #region Draw Methods - /// - /// The outline of the button in the 'Over' state. - /// - public Pixel OverOutline = Colors.Aquamarine; - /// - /// The fill of the button in the 'Over' state. - /// - public Pixel OverFill = Colors.Crimson; - /// - /// The outline of the button in the 'Down' state. - /// - public Pixel DownOutline = Colors.Red; - /// - /// The fill of the button in the 'Down' state. - /// - public Pixel DownFill = Colors.Blue; - /// - /// The outline of the button in it's default state. - /// - public Pixel NormalOutline = Colors.Blue; - /// - /// The fill of the button in it's default state. - /// - public Pixel NormalFill = Colors.Red; - - /// - /// Draws the button in the 'Down' state. - /// - private void DrawMouseDown() - { - Buffer.DrawRectangle(Vec2.Zero, new Vec2(iSize.X, Size.Y), DownFill); - Buffer.DrawPolygonOutline(new Vec2[] { - Vec2.Zero, - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, DownOutline); - } - - /// - /// Draws the button in the 'Over' state. - /// - private void DrawMouseOver() - { - Buffer.DrawRectangle(new Vec2(0, 0), new Vec2(iSize.X, Size.Y), OverFill); - Buffer.DrawPolygonOutline(new Vec2[] { - new Vec2(0,0), - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, OverOutline); - } - - /// - /// Draws the button in it's default state. - /// - private void DrawDefault() - { - Buffer.DrawRectangle(new Vec2(0, 0), new Vec2(iSize.X, iSize.Y), NormalFill); - Buffer.DrawPolygonOutline(new Vec2[] { - new Vec2(0,0), - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, NormalOutline); - } - #endregion - - } -} diff --git a/Users/Orvid/OForms/Controls/Control.cs b/Users/Orvid/OForms/Controls/Control.cs deleted file mode 100644 index 89a7568e3e..0000000000 --- a/Users/Orvid/OForms/Controls/Control.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System; -using Orvid.Graphics; -using System.Collections.Generic; - -namespace OForms.Controls -{ - /// - /// An abstract class that represents a Control and it's Children. - /// - public abstract class Control : IDisposable - { - #region Events - /// - /// The event that occurs when the control is clicked. - /// - public event MouseEvent Click; - /// - /// The event that occurs when a mouse - /// enters the bounds of the control. - /// - public event MouseEvent MouseEnter; - /// - /// The event that occurs when a mouse - /// leaves the bounds of the control. - /// - public event MouseEvent MouseLeave; - /// - /// The event that occurs when a mouse - /// button is pressed down over the control. - /// - public event MouseEvent MouseDown; - /// - /// The event that occurs when a mouse - /// button is released, but only if - /// the MouseDown event was handled - /// by this control. - /// - public event MouseEvent MouseUp; - /// - /// The event that occurs just before this - /// control is disposed of. - /// - public event DisposingEvent BeforeDispose; - /// - /// The event that occurs directly after - /// this control is disposed of. - /// - public event DisposingEvent AfterDispose; - /// - /// This event occurs directly before the - /// window containing this control is closed. - /// - public event DisposingEvent Closing; - - /// - /// The dummy MouseEvent method. - /// - /// The location of the mouse. - /// The current state of the mouse buttons. - private void DummyMouseEvent(Vec2 loc, MouseButtons button) { } - /// - /// The dummy DisposingEvent method. - /// - private void DummyDisposingEvent() { } - /// - /// Invokes the Click event. - /// - /// Location of the mouse. - /// The current state of the mouse buttons. - internal void DoClick(Vec2 v, MouseButtons b) { Click.Invoke(v, b); } - /// - /// Invokes the MouseEnter event. - /// - /// Location of the mouse. - /// The current state of the mouse buttons. - internal void DoMouseEnter(Vec2 v, MouseButtons b) { MouseEnter.Invoke(v, b); } - /// - /// Invokes the MouseLeave event. - /// - /// Location of the mouse. - /// The current state of the mouse buttons. - internal void DoMouseLeave(Vec2 v, MouseButtons b) { MouseLeave.Invoke(v, b); } - /// - /// Invokes the MouseDown event. - /// - /// Location of the mouse. - /// The current state of the mouse buttons. - internal void DoMouseDown(Vec2 v, MouseButtons b) { MouseDown.Invoke(v, b); } - /// - /// Invokes the MouseUp event. - /// - /// Location of the mouse. - /// The current state of the mouse buttons. - internal void DoMouseUp(Vec2 v, MouseButtons b) { MouseUp.Invoke(v, b); } - /// - /// Invokes the BeforeDispose event. - /// - internal void DoBeforeDispose() { BeforeDispose.Invoke(); } - /// - /// Invokes the AfterDispose event. - /// - internal void DoAfterDispose() { AfterDispose.Invoke(); } - /// - /// Invokes the Closing event. - /// - internal void DoClosing() { Closing.Invoke(); } - #endregion - - - public object Parent; - - private Vec2 iSize; - /// - /// The size of the control. - /// - public Vec2 Size - { - get - { - return iSize; - } - set - { - iSize = value; - } - } - - private int iX; - /// - /// The X location of this control in it's parent container. - /// - public int X - { - get - { - return iX; - } - set - { - iX = value; - } - } - - private int iY; - /// - /// The Y location of this control in it's parent container. - /// - public int Y - { - get - { - return iY; - } - set - { - iY = value; - } - } - /// - /// The graphics buffer for this control. - /// - protected Image Buffer; - - private BoundingBox iBounds; - /// - /// The Bounds for this control. - /// - public BoundingBox Bounds - { - get - { - return iBounds; - } - set - { - iBounds = value; - } - } - - private bool iIsIn = false; - /// - /// True if the mouse is currently in the control. - /// - internal bool IsIn - { - get - { - return iIsIn; - } - set - { - iIsIn = value; - } - } - - private bool iIsMouseDown = false; - /// - /// True if the mouse pressed down on this control. - /// - internal bool IsMouseDown - { - get - { - return iIsMouseDown; - } - set - { - iIsMouseDown = value; - } - } - - /// - /// The child controls of this control. - /// - public List Children = new List(); - - /// - /// The default constructor. - /// - /// The location of the control in it's parent container. - /// The size of the control. - public Control(Vec2 loc, Vec2 size) - { - this.X = loc.X; - this.Y = loc.Y; - this.Size = size; - this.Closing = new DisposingEvent(DummyDisposingEvent); - this.BeforeDispose = new DisposingEvent(DummyDisposingEvent); - this.AfterDispose = new DisposingEvent(DummyDisposingEvent); - this.Click = new MouseEvent(DummyMouseEvent); - this.MouseEnter = new MouseEvent(DummyMouseEvent); - this.MouseLeave = new MouseEvent(DummyMouseEvent); - this.MouseDown = new MouseEvent(DummyMouseEvent); - this.MouseUp = new MouseEvent(DummyMouseEvent); - this.Bounds = new BoundingBox(this.X, this.X + Size.X, this.Y + Size.Y, this.Y); - } - - /// - /// Draws the control on the specified image. - /// - /// The image to draw this control on. - public abstract void Draw(Image i); - - /// - /// Disposes of the resources of this control, and all child controls. - /// - public virtual void Dispose() - { - this.Bounds = null; - this.Buffer = null; - foreach (Control c in Children) - { - c.DoBeforeDispose(); - c.Dispose(); - c.DoAfterDispose(); - } - this.Children = null; - } - } -} diff --git a/Users/Orvid/OForms/Controls/Delegates.cs b/Users/Orvid/OForms/Controls/Delegates.cs deleted file mode 100644 index 1c0e08a6e5..0000000000 --- a/Users/Orvid/OForms/Controls/Delegates.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using Orvid.Graphics; - -namespace OForms -{ - /// - /// A delegate that represents a mouse event. - /// - /// The location of the mouse. - /// The MouseButtons that are pressed. - public delegate void MouseEvent(Vec2 loc, MouseButtons buttons); - - /// - /// A delegate that represents an event - /// relating to the disposing of a control. - /// - public delegate void DisposingEvent(); - -} diff --git a/Users/Orvid/OForms/Controls/MouseButtons.cs b/Users/Orvid/OForms/Controls/MouseButtons.cs deleted file mode 100644 index 7f960c7bb0..0000000000 --- a/Users/Orvid/OForms/Controls/MouseButtons.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace OForms -{ - /// - /// Represents the pressed mouse buttons. - /// - [Flags] - public enum MouseButtons - { - None = 0, - Left = 1, - Right = 2, - Middle = 4, - XButton1 = 8, - XButton2 = 16, - } -} diff --git a/Users/Orvid/OForms/EmbeddedFiles/Fonts.cs b/Users/Orvid/OForms/EmbeddedFiles/Fonts.cs deleted file mode 100644 index 10a86ccaaf..0000000000 --- a/Users/Orvid/OForms/EmbeddedFiles/Fonts.cs +++ /dev/null @@ -1,6264 +0,0 @@ -using System; - -namespace OForms.EmbeddedFiles -{ - public static class Fonts - { - - #region Vera10_bdf - public static readonly byte[] Vera10_bdf = new byte[] - { - 0x53, 0x54, 0x41, 0x52, 0x54, 0x46, 0x4F, 0x4E, - 0x54, 0x20, 0x32, 0x2E, 0x31, 0x0A, 0x46, 0x4F, - 0x4E, 0x54, 0x20, 0x2D, 0x46, 0x6F, 0x6E, 0x74, - 0x46, 0x6F, 0x72, 0x67, 0x65, 0x2D, 0x42, 0x69, - 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x20, - 0x56, 0x65, 0x72, 0x61, 0x20, 0x53, 0x61, 0x6E, - 0x73, 0x2D, 0x42, 0x6F, 0x6F, 0x6B, 0x2D, 0x52, - 0x2D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x2D, - 0x53, 0x61, 0x6E, 0x73, 0x2D, 0x2D, 0x31, 0x30, - 0x2D, 0x31, 0x30, 0x30, 0x2D, 0x37, 0x32, 0x2D, - 0x37, 0x32, 0x2D, 0x50, 0x2D, 0x35, 0x39, 0x2D, - 0x49, 0x53, 0x4F, 0x31, 0x30, 0x36, 0x34, 0x36, - 0x2D, 0x31, 0x0A, 0x53, 0x49, 0x5A, 0x45, 0x20, - 0x31, 0x30, 0x20, 0x37, 0x32, 0x20, 0x37, 0x32, - 0x0A, 0x46, 0x4F, 0x4E, 0x54, 0x42, 0x4F, 0x55, - 0x4E, 0x44, 0x49, 0x4E, 0x47, 0x42, 0x4F, 0x58, - 0x20, 0x31, 0x33, 0x20, 0x39, 0x20, 0x2D, 0x31, - 0x20, 0x2D, 0x33, 0x0A, 0x43, 0x4F, 0x4D, 0x4D, - 0x45, 0x4E, 0x54, 0x20, 0x22, 0x47, 0x65, 0x6E, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, -0x79, 0x20, 0x66, 0x6F, 0x6E, 0x74, 0x66, 0x6F, -0x72, 0x67, 0x65, 0x2C, 0x20, 0x68, 0x74, 0x74, -0x70, 0x3A, 0x2F, 0x2F, 0x66, 0x6F, 0x6E, 0x74, -0x66, 0x6F, 0x72, 0x67, 0x65, 0x2E, 0x73, 0x6F, -0x75, 0x72, 0x63, 0x65, 0x66, 0x6F, 0x72, 0x67, -0x65, 0x2E, 0x6E, 0x65, 0x74, 0x22, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x50, 0x52, 0x4F, 0x50, -0x45, 0x52, 0x54, 0x49, 0x45, 0x53, 0x20, 0x32, -0x37, 0x0A, 0x46, 0x4F, 0x4E, 0x54, 0x5F, 0x4E, -0x41, 0x4D, 0x45, 0x20, 0x22, 0x42, 0x69, 0x74, -0x73, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x56, 0x65, -0x72, 0x61, 0x53, 0x61, 0x6E, 0x73, 0x2D, 0x52, -0x6F, 0x6D, 0x61, 0x6E, 0x22, 0x0A, 0x46, 0x4F, -0x4E, 0x54, 0x5F, 0x41, 0x53, 0x43, 0x45, 0x4E, -0x54, 0x20, 0x38, 0x0A, 0x46, 0x4F, 0x4E, 0x54, -0x5F, 0x44, 0x45, 0x53, 0x43, 0x45, 0x4E, 0x54, -0x20, 0x32, 0x0A, 0x55, 0x4E, 0x44, 0x45, 0x52, -0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x50, 0x4F, 0x53, -0x49, 0x54, 0x49, 0x4F, 0x4E, 0x20, 0x2D, 0x32, -0x31, 0x33, 0x0A, 0x55, 0x4E, 0x44, 0x45, 0x52, -0x4C, 0x49, 0x4E, 0x45, 0x5F, 0x54, 0x48, 0x49, -0x43, 0x4B, 0x4E, 0x45, 0x53, 0x53, 0x20, 0x31, -0x34, 0x33, 0x0A, 0x51, 0x55, 0x41, 0x44, 0x5F, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, -0x0A, 0x58, 0x5F, 0x48, 0x45, 0x49, 0x47, 0x48, -0x54, 0x20, 0x36, 0x0A, 0x43, 0x41, 0x50, 0x5F, -0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x20, 0x34, -0x0A, 0x46, 0x4F, 0x4E, 0x54, 0x4E, 0x41, 0x4D, -0x45, 0x5F, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, -0x52, 0x59, 0x20, 0x22, 0x22, 0x0A, 0x46, 0x41, -0x4D, 0x49, 0x4C, 0x59, 0x5F, 0x4E, 0x41, 0x4D, -0x45, 0x20, 0x22, 0x42, 0x69, 0x74, 0x73, 0x74, -0x72, 0x65, 0x61, 0x6D, 0x20, 0x56, 0x65, 0x72, -0x61, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x22, 0x0A, -0x46, 0x4F, 0x55, 0x4E, 0x44, 0x52, 0x59, 0x20, -0x22, 0x46, 0x6F, 0x6E, 0x74, 0x46, 0x6F, 0x72, -0x67, 0x65, 0x22, 0x0A, 0x57, 0x45, 0x49, 0x47, -0x48, 0x54, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x20, -0x22, 0x42, 0x6F, 0x6F, 0x6B, 0x22, 0x0A, 0x53, -0x45, 0x54, 0x57, 0x49, 0x44, 0x54, 0x48, 0x5F, -0x4E, 0x41, 0x4D, 0x45, 0x20, 0x22, 0x4E, 0x6F, -0x72, 0x6D, 0x61, 0x6C, 0x22, 0x0A, 0x53, 0x4C, -0x41, 0x4E, 0x54, 0x20, 0x22, 0x52, 0x22, 0x0A, -0x41, 0x44, 0x44, 0x5F, 0x53, 0x54, 0x59, 0x4C, -0x45, 0x5F, 0x4E, 0x41, 0x4D, 0x45, 0x20, 0x22, -0x53, 0x61, 0x6E, 0x73, 0x2D, 0x22, 0x0A, 0x50, -0x49, 0x58, 0x45, 0x4C, 0x5F, 0x53, 0x49, 0x5A, -0x45, 0x20, 0x31, 0x30, 0x0A, 0x50, 0x4F, 0x49, -0x4E, 0x54, 0x5F, 0x53, 0x49, 0x5A, 0x45, 0x20, -0x31, 0x30, 0x30, 0x0A, 0x52, 0x45, 0x53, 0x4F, -0x4C, 0x55, 0x54, 0x49, 0x4F, 0x4E, 0x5F, 0x58, -0x20, 0x37, 0x32, 0x0A, 0x52, 0x45, 0x53, 0x4F, -0x4C, 0x55, 0x54, 0x49, 0x4F, 0x4E, 0x5F, 0x59, -0x20, 0x37, 0x32, 0x0A, 0x52, 0x45, 0x53, 0x4F, -0x4C, 0x55, 0x54, 0x49, 0x4F, 0x4E, 0x20, 0x37, -0x32, 0x0A, 0x53, 0x50, 0x41, 0x43, 0x49, 0x4E, -0x47, 0x20, 0x22, 0x50, 0x22, 0x0A, 0x41, 0x56, -0x45, 0x52, 0x41, 0x47, 0x45, 0x5F, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x39, 0x0A, 0x43, -0x48, 0x41, 0x52, 0x53, 0x45, 0x54, 0x5F, 0x52, -0x45, 0x47, 0x49, 0x53, 0x54, 0x52, 0x59, 0x20, -0x22, 0x49, 0x53, 0x4F, 0x31, 0x30, 0x36, 0x34, -0x36, 0x22, 0x0A, 0x43, 0x48, 0x41, 0x52, 0x53, -0x45, 0x54, 0x5F, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x22, 0x2D, 0x31, 0x22, -0x0A, 0x43, 0x48, 0x41, 0x52, 0x53, 0x45, 0x54, -0x5F, 0x43, 0x4F, 0x4C, 0x4C, 0x45, 0x43, 0x54, -0x49, 0x4F, 0x4E, 0x53, 0x20, 0x22, 0x41, 0x53, -0x43, 0x49, 0x49, 0x20, 0x49, 0x53, 0x4F, 0x38, -0x38, 0x35, 0x39, 0x2D, 0x39, 0x20, 0x49, 0x53, -0x4F, 0x31, 0x30, 0x36, 0x34, 0x36, 0x2D, 0x31, -0x22, 0x0A, 0x46, 0x55, 0x4C, 0x4C, 0x5F, 0x4E, -0x41, 0x4D, 0x45, 0x20, 0x22, 0x42, 0x69, 0x74, -0x73, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x20, 0x56, -0x65, 0x72, 0x61, 0x20, 0x53, 0x61, 0x6E, 0x73, -0x22, 0x0A, 0x43, 0x4F, 0x50, 0x59, 0x52, 0x49, -0x47, 0x48, 0x54, 0x20, 0x22, 0x43, 0x6F, 0x70, -0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, -0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, -0x62, 0x79, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, -0x72, 0x65, 0x61, 0x6D, 0x2C, 0x20, 0x49, 0x6E, -0x63, 0x2E, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, -0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, -0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x22, -0x0A, 0x45, 0x4E, 0x44, 0x50, 0x52, 0x4F, 0x50, -0x45, 0x52, 0x54, 0x49, 0x45, 0x53, 0x0A, 0x43, -0x48, 0x41, 0x52, 0x53, 0x20, 0x32, 0x36, 0x38, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x33, 0x32, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x33, 0x31, 0x37, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x30, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x65, 0x78, 0x63, -0x6C, 0x61, 0x6D, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x33, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, -0x62, 0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x33, 0x34, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x35, -0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x33, 0x20, 0x31, -0x20, 0x34, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x41, 0x30, 0x0A, 0x41, 0x30, 0x0A, -0x41, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x6E, 0x75, 0x6D, -0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x33, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x33, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x38, 0x0A, 0x46, 0x43, 0x0A, -0x34, 0x38, 0x0A, 0x46, 0x43, 0x0A, 0x35, 0x30, -0x0A, 0x35, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x64, 0x6F, -0x6C, 0x6C, 0x61, 0x72, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x36, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x46, 0x30, 0x0A, 0x43, -0x30, 0x0A, 0x43, 0x30, 0x0A, 0x37, 0x30, 0x0A, -0x35, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x70, 0x65, 0x72, 0x63, 0x65, 0x6E, 0x74, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x33, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x39, 0x35, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x31, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x39, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x36, 0x32, 0x30, 0x30, 0x0A, 0x39, 0x34, 0x30, -0x30, 0x0A, 0x39, 0x34, 0x30, 0x30, 0x0A, 0x36, -0x38, 0x30, 0x30, 0x0A, 0x31, 0x37, 0x38, 0x30, -0x0A, 0x31, 0x34, 0x38, 0x30, 0x0A, 0x32, 0x33, -0x30, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x61, 0x6D, 0x70, -0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x33, 0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x37, 0x39, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, -0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, -0x34, 0x0A, 0x39, 0x34, 0x0A, 0x38, 0x38, 0x0A, -0x46, 0x34, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, -0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x33, 0x39, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x32, 0x37, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x31, 0x20, 0x33, 0x20, 0x31, 0x20, 0x34, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6E, -0x6C, 0x65, 0x66, 0x74, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x34, 0x30, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x39, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x32, 0x20, 0x38, -0x20, 0x31, 0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, -0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, -0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x34, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x39, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x32, 0x20, 0x38, 0x20, 0x31, 0x20, -0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x61, 0x73, 0x74, 0x65, -0x72, 0x69, 0x73, 0x6B, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x34, 0x32, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x35, -0x20, 0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x41, -0x38, 0x0A, 0x37, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x6C, 0x75, -0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x34, 0x33, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, 0x37, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x36, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x46, 0x43, 0x0A, 0x31, 0x30, 0x0A, -0x31, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x6F, 0x6D, -0x6D, 0x61, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x34, 0x34, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x31, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x31, 0x20, 0x32, 0x20, 0x31, -0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, -0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x34, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x36, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x33, 0x20, 0x31, 0x20, 0x30, 0x20, -0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x45, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x65, -0x72, 0x69, 0x6F, 0x64, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x34, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x31, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x34, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x33, 0x36, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, -0x20, 0x38, 0x20, 0x30, 0x20, 0x2D, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x7A, 0x65, 0x72, 0x6F, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x34, -0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x39, 0x30, 0x0A, 0x37, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x6F, 0x6E, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x34, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x34, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x74, 0x77, -0x6F, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x35, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x36, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x31, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x74, 0x68, 0x72, 0x65, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x35, -0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, 0x0A, -0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x36, 0x30, -0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x46, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x66, 0x6F, 0x75, 0x72, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x35, 0x32, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x31, 0x38, 0x0A, 0x32, 0x38, 0x0A, 0x32, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x37, -0x38, 0x0A, 0x30, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x66, -0x69, 0x76, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x35, 0x33, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x37, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x31, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x73, 0x69, 0x78, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x35, -0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, -0x43, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x37, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x73, 0x65, 0x76, 0x65, -0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x35, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x65, 0x69, 0x67, 0x68, 0x74, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x35, -0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x36, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x46, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x6E, 0x69, 0x6E, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x35, 0x37, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x36, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x39, 0x38, 0x0A, 0x37, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x45, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, -0x6F, 0x6C, 0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x35, 0x38, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x35, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x30, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x73, 0x65, 0x6D, -0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x35, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x33, 0x36, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, -0x20, 0x36, 0x20, 0x31, 0x20, 0x2D, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x30, 0x30, 0x0A, -0x30, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6C, 0x65, 0x73, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x36, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x33, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x34, 0x20, 0x31, 0x20, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, -0x43, 0x0A, 0x37, 0x30, 0x0A, 0x43, 0x30, 0x0A, -0x33, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x65, 0x71, 0x75, -0x61, 0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x36, 0x31, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x33, 0x20, 0x31, -0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x43, 0x0A, 0x30, 0x30, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x67, 0x72, 0x65, -0x61, 0x74, 0x65, 0x72, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x36, 0x32, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x34, -0x20, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x43, 0x30, 0x0A, 0x33, -0x38, 0x0A, 0x30, 0x43, 0x0A, 0x37, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, -0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x36, 0x33, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x33, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x32, 0x20, 0x37, 0x20, 0x32, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x43, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x30, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x61, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x36, 0x34, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, -0x30, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x39, 0x20, -0x38, 0x20, 0x30, 0x20, 0x2D, 0x32, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x46, -0x30, 0x30, 0x0A, 0x34, 0x30, 0x38, 0x30, 0x0A, -0x35, 0x45, 0x38, 0x30, 0x0A, 0x39, 0x32, 0x38, -0x30, 0x0A, 0x39, 0x32, 0x38, 0x30, 0x0A, 0x34, -0x46, 0x30, 0x30, 0x0A, 0x32, 0x31, 0x30, 0x30, -0x0A, 0x31, 0x45, 0x30, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x41, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x36, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x38, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x37, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x31, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x32, -0x38, 0x0A, 0x34, 0x38, 0x0A, 0x34, 0x34, 0x0A, -0x37, 0x43, 0x0A, 0x38, 0x34, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x42, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x36, 0x36, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x38, 0x36, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x43, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x36, 0x37, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x39, 0x38, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x43, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x44, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x36, 0x38, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x37, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, -0x38, 0x43, 0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x45, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x36, 0x39, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x31, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x46, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x37, 0x35, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x47, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x37, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x43, 0x43, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x43, 0x0A, -0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x48, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x32, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x35, 0x31, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x46, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x49, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x33, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x39, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x31, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4A, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x34, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x39, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x33, 0x20, 0x39, 0x20, 0x2D, 0x31, -0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x43, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4B, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x35, 0x35, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x38, 0x0A, 0x39, 0x30, 0x0A, 0x41, -0x30, 0x0A, 0x43, 0x30, 0x0A, 0x41, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x36, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x35, 0x37, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4D, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x37, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x36, 0x32, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x39, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x37, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x36, 0x0A, 0x43, 0x41, 0x0A, 0x43, -0x41, 0x0A, 0x41, 0x41, 0x0A, 0x42, 0x32, 0x0A, -0x39, 0x32, 0x0A, 0x38, 0x32, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x38, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x34, 0x38, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x38, 0x0A, 0x43, 0x38, 0x0A, 0x43, -0x38, 0x0A, 0x41, 0x38, 0x0A, 0x39, 0x38, 0x0A, -0x39, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4F, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x37, 0x39, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x38, 0x37, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, -0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x50, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x30, 0x33, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x45, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x38, -0x38, 0x0A, 0x39, 0x30, 0x0A, 0x45, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x51, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x38, 0x37, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x38, 0x20, 0x31, 0x20, -0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, 0x0A, -0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x30, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x52, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x39, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x46, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x53, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x33, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x31, 0x38, 0x0A, 0x30, 0x38, 0x0A, 0x46, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x54, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, 0x43, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x55, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x37, 0x33, 0x31, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x37, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x56, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x38, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x37, 0x20, -0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x32, 0x0A, -0x34, 0x34, 0x0A, 0x34, 0x34, 0x0A, 0x34, 0x38, -0x0A, 0x32, 0x38, 0x0A, 0x32, 0x38, 0x0A, 0x31, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x57, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x39, 0x38, 0x38, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x39, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x38, -0x38, 0x30, 0x0A, 0x34, 0x43, 0x38, 0x30, 0x0A, -0x34, 0x43, 0x38, 0x30, 0x0A, 0x35, 0x34, 0x38, -0x30, 0x0A, 0x35, 0x35, 0x30, 0x30, 0x0A, 0x33, -0x33, 0x30, 0x30, 0x0A, 0x32, 0x33, 0x30, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x58, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x38, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x38, 0x35, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x38, 0x0A, 0x39, -0x30, 0x0A, 0x35, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x35, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x38, 0x38, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x59, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x39, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x37, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x34, 0x0A, 0x34, -0x38, 0x0A, 0x33, 0x30, 0x0A, 0x33, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x5A, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x39, 0x30, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x38, 0x35, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x37, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x37, 0x43, 0x0A, 0x30, -0x34, 0x0A, 0x30, 0x38, 0x0A, 0x31, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x46, 0x43, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x62, 0x72, 0x61, 0x63, 0x6B, -0x65, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x39, 0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x39, 0x30, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x32, -0x20, 0x38, 0x20, 0x31, 0x20, 0x2D, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x43, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x62, 0x61, 0x63, 0x6B, 0x73, 0x6C, 0x61, -0x73, 0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x39, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x33, -0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x38, 0x20, 0x30, -0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x62, 0x72, 0x61, -0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, -0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x39, 0x33, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x39, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x32, 0x20, 0x38, 0x20, 0x31, 0x20, -0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x43, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x61, 0x73, 0x63, 0x69, -0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x39, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x33, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x33, 0x20, 0x31, 0x20, 0x34, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, -0x30, 0x0A, 0x36, 0x38, 0x0A, 0x38, 0x34, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, -0x63, 0x6F, 0x72, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x39, 0x35, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x31, -0x20, 0x31, 0x20, 0x2D, 0x33, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x39, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x31, 0x20, 0x33, 0x20, 0x35, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x61, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x39, -0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x31, 0x32, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x35, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, -0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x62, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x39, 0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x34, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x39, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x34, 0x39, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x35, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, -0x38, 0x0A, 0x34, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x64, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x30, 0x30, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x30, 0x38, 0x0A, 0x30, 0x38, 0x0A, -0x37, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x30, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x31, 0x35, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x35, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x46, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x46, 0x38, 0x0A, 0x38, 0x30, 0x0A, 0x37, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x66, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, -0x30, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x35, 0x32, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x45, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x67, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x30, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x34, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x37, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x30, -0x38, 0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x68, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x30, 0x34, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x33, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x69, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x30, 0x35, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x37, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x31, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x30, 0x0A, 0x30, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x6A, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x30, 0x36, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x32, -0x37, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x32, 0x20, 0x39, 0x20, -0x30, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x6B, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x30, 0x37, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x37, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x41, 0x30, 0x0A, 0x43, -0x30, 0x0A, 0x41, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x30, 0x38, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x32, 0x37, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x37, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6D, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x30, -0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x39, 0x37, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x38, -0x20, 0x35, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, 0x36, -0x0A, 0x39, 0x39, 0x0A, 0x39, 0x31, 0x0A, 0x39, -0x31, 0x0A, 0x39, 0x31, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6E, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x31, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x33, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x35, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x6F, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x31, 0x31, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x35, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x37, 0x38, 0x0A, 0x34, -0x38, 0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x31, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x34, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x46, 0x30, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x46, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x71, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x31, 0x33, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, -0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x37, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x37, 0x38, -0x0A, 0x30, 0x38, 0x0A, 0x30, 0x38, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x31, 0x34, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, -0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x35, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x45, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x73, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, -0x31, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x32, 0x30, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x35, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x37, 0x30, 0x0A, 0x30, -0x38, 0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x74, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x31, 0x36, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x39, 0x32, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x36, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x34, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x75, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x31, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x33, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x34, 0x20, 0x35, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x39, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x76, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x31, 0x38, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x39, -0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x35, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x33, 0x30, 0x0A, 0x33, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x77, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x31, -0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x38, 0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x35, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, -0x42, 0x34, 0x0A, 0x42, 0x34, 0x0A, 0x43, 0x43, -0x0A, 0x34, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x78, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x32, 0x30, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x39, 0x31, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x34, 0x20, 0x35, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x39, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x45, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x79, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x32, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x39, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, -0x31, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x41, 0x30, 0x0A, 0x36, 0x30, 0x0A, -0x36, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x43, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x7A, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x32, -0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x32, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x35, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x38, 0x0A, -0x31, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x62, 0x72, -0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x32, 0x33, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x34, 0x20, 0x38, 0x20, 0x31, 0x20, 0x2D, -0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x43, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x62, 0x61, 0x72, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x32, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x33, 0x36, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x62, 0x72, 0x61, -0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x32, 0x35, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x34, 0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, -0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x43, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x33, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x30, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x61, 0x73, -0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x32, 0x36, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, 0x37, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x32, 0x20, 0x31, 0x20, -0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x34, 0x30, 0x0A, 0x42, 0x43, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x6E, 0x6F, 0x6E, 0x62, 0x72, 0x65, 0x61, -0x6B, 0x69, 0x6E, 0x67, 0x73, 0x70, 0x61, 0x63, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x36, 0x30, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, -0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x31, 0x20, 0x31, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x30, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x65, -0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, -0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x36, 0x31, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x30, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x31, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x30, 0x0A, 0x30, 0x30, 0x0A, -0x30, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x63, 0x65, 0x6E, 0x74, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, -0x36, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, -0x20, 0x37, 0x20, 0x31, 0x20, 0x2D, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, -0x30, 0x0A, 0x37, 0x30, 0x0A, 0x41, 0x30, 0x0A, -0x41, 0x30, 0x0A, 0x41, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x73, 0x74, -0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x36, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x34, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x75, -0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x36, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x34, 0x20, 0x34, 0x20, 0x31, 0x20, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x46, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x79, 0x65, 0x6E, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x36, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x37, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x34, 0x0A, 0x34, 0x38, 0x0A, 0x32, -0x38, 0x0A, 0x37, 0x43, 0x0A, 0x37, 0x43, 0x0A, -0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x62, 0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, -0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x36, 0x36, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x33, -0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x31, 0x20, 0x38, 0x20, 0x31, -0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x73, 0x65, 0x63, -0x74, 0x69, 0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x36, -0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, -0x38, 0x20, 0x30, 0x20, 0x2D, 0x31, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x35, 0x30, 0x0A, 0x33, 0x30, 0x0A, -0x31, 0x30, 0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x36, 0x38, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x33, 0x20, 0x31, 0x20, 0x31, 0x20, -0x36, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x41, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x6F, -0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x36, 0x39, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x31, 0x30, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x37, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x31, 0x38, 0x0A, 0x36, 0x36, 0x0A, -0x42, 0x32, 0x0A, 0x41, 0x32, 0x0A, 0x41, 0x32, -0x0A, 0x35, 0x41, 0x0A, 0x33, 0x43, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, -0x6E, 0x69, 0x6E, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x37, -0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x34, 0x37, 0x31, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, -0x35, 0x20, 0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, -0x31, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x67, 0x75, -0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, -0x65, 0x66, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x37, 0x31, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x33, -0x20, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x35, 0x30, 0x0A, 0x41, -0x30, 0x0A, 0x35, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6C, -0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C, 0x6E, 0x6F, -0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x37, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x33, 0x20, 0x31, -0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x43, 0x0A, 0x30, 0x34, 0x0A, -0x30, 0x34, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x73, 0x66, 0x74, -0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x37, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x36, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x33, 0x20, 0x31, 0x20, 0x30, 0x20, 0x32, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x72, 0x65, 0x67, 0x69, -0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x37, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x30, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x37, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x31, 0x38, 0x0A, 0x36, 0x36, 0x0A, 0x42, -0x41, 0x0A, 0x42, 0x41, 0x0A, 0x41, 0x41, 0x0A, -0x34, 0x32, 0x0A, 0x33, 0x43, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x31, 0x37, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x33, 0x20, 0x31, 0x20, 0x31, 0x20, 0x36, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x64, 0x65, 0x67, 0x72, -0x65, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x37, 0x36, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x34, 0x20, -0x31, 0x20, 0x33, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, 0x41, 0x30, -0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, -0x75, 0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x37, 0x37, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x36, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, -0x0A, 0x46, 0x43, 0x0A, 0x31, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x46, 0x43, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x74, -0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, -0x6F, 0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x37, 0x38, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x35, 0x20, -0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x43, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x74, 0x68, 0x72, 0x65, -0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, -0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x37, 0x39, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x30, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x35, 0x20, 0x30, -0x20, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x36, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x61, 0x63, 0x75, 0x74, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x38, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x31, 0x20, 0x31, 0x20, 0x32, 0x20, -0x36, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6D, 0x75, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x38, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, -0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x45, 0x38, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, -0x70, 0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x38, 0x32, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x38, 0x20, -0x31, 0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, 0x46, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x33, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x33, 0x30, -0x0A, 0x33, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x65, -0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74, -0x65, 0x72, 0x65, 0x64, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x38, -0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x33, 0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, -0x31, 0x20, 0x31, 0x20, 0x33, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, -0x61, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x38, 0x34, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x32, 0x20, 0x31, 0x20, 0x31, -0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x43, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, -0x69, 0x6F, 0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x38, 0x35, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x34, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x33, -0x20, 0x31, 0x20, 0x34, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6F, -0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, -0x69, 0x6E, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x38, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x34, 0x37, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x35, -0x20, 0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x37, 0x30, 0x0A, -0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x67, 0x75, 0x69, -0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, -0x67, 0x68, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x38, 0x37, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x33, -0x20, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x41, 0x30, 0x0A, 0x35, -0x30, 0x0A, 0x41, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6F, -0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, -0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x38, 0x38, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x39, 0x36, -0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x38, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x38, 0x0A, 0x31, 0x31, 0x0A, 0x31, -0x37, 0x0A, 0x32, 0x35, 0x0A, 0x34, 0x33, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, -0x66, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x38, 0x39, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x39, 0x36, -0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x38, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x38, 0x0A, 0x31, 0x36, 0x0A, 0x31, -0x31, 0x0A, 0x32, 0x32, 0x0A, 0x34, 0x37, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, -0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x39, 0x30, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x39, 0x36, 0x39, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x39, 0x20, 0x37, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x36, 0x30, 0x30, 0x30, 0x0A, 0x32, 0x32, -0x30, 0x30, 0x0A, 0x32, 0x34, 0x30, 0x30, 0x0A, -0x41, 0x38, 0x38, 0x30, 0x0A, 0x34, 0x42, 0x38, -0x30, 0x0A, 0x31, 0x32, 0x38, 0x30, 0x0A, 0x32, -0x31, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x71, 0x75, -0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, -0x77, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x31, 0x39, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x33, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, 0x30, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x39, 0x32, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x38, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x38, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x33, -0x30, 0x0A, 0x32, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x34, 0x34, 0x0A, 0x37, 0x43, 0x0A, 0x38, 0x34, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x41, 0x61, 0x63, 0x75, 0x74, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x39, 0x33, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x38, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x38, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, -0x33, 0x30, 0x0A, 0x32, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x34, 0x34, 0x0A, 0x37, 0x43, 0x0A, 0x38, -0x34, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x41, 0x63, 0x69, 0x72, -0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x31, 0x39, 0x34, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x38, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x36, 0x20, 0x38, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x33, 0x38, 0x0A, 0x31, 0x30, 0x0A, 0x33, 0x30, -0x0A, 0x32, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x34, -0x34, 0x0A, 0x37, 0x43, 0x0A, 0x38, 0x34, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x39, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x38, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x36, 0x20, 0x38, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x33, -0x30, 0x0A, 0x32, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x34, 0x34, 0x0A, 0x37, 0x43, 0x0A, 0x38, 0x34, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x41, 0x64, 0x69, 0x65, 0x72, -0x65, 0x73, 0x69, 0x73, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x39, -0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x38, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x38, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, 0x38, 0x0A, -0x31, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x32, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x34, 0x34, 0x0A, 0x37, -0x43, 0x0A, 0x38, 0x34, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x41, -0x72, 0x69, 0x6E, 0x67, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x31, 0x39, -0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x38, 0x34, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x38, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x38, 0x0A, -0x33, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x32, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x34, 0x34, 0x0A, 0x37, -0x43, 0x0A, 0x38, 0x34, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x41, -0x45, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x31, 0x39, 0x38, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x39, 0x37, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x39, 0x20, 0x37, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x31, 0x46, 0x38, 0x30, 0x0A, -0x32, 0x38, 0x30, 0x30, 0x0A, 0x32, 0x38, 0x30, -0x30, 0x0A, 0x32, 0x46, 0x38, 0x30, 0x0A, 0x34, -0x38, 0x30, 0x30, 0x0A, 0x37, 0x38, 0x30, 0x30, -0x0A, 0x38, 0x46, 0x38, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x31, 0x39, 0x39, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x39, 0x38, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x39, 0x20, 0x31, 0x20, -0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x31, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x45, -0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x30, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x33, 0x31, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x30, 0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x33, 0x31, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x45, 0x63, -0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, -0x78, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x30, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, -0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x36, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x45, 0x64, 0x69, 0x65, -0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x30, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x33, 0x31, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x35, 0x30, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x46, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x30, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x32, 0x39, 0x34, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x30, 0x35, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x32, 0x39, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x31, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, -0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x30, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x32, 0x39, 0x34, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, -0x20, 0x38, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, -0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x30, 0x37, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x39, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x38, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x45, 0x74, 0x68, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x30, 0x38, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x37, 0x37, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x37, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x37, 0x38, 0x0A, 0x34, 0x34, 0x0A, 0x34, 0x32, -0x0A, 0x46, 0x32, 0x0A, 0x34, 0x32, 0x0A, 0x34, -0x36, 0x0A, 0x37, 0x43, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x4E, -0x74, 0x69, 0x6C, 0x64, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x30, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x34, 0x38, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, -0x0A, 0x38, 0x38, 0x0A, 0x43, 0x38, 0x0A, 0x43, -0x38, 0x0A, 0x41, 0x38, 0x0A, 0x39, 0x38, 0x0A, -0x39, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x31, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x38, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, 0x0A, -0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x31, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x37, 0x38, 0x37, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x36, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x32, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, -0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75, -0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x31, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x38, 0x37, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, -0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, -0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, -0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x31, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x38, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x38, 0x0A, -0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, -0x69, 0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x31, 0x34, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, -0x38, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x38, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x35, 0x30, 0x0A, 0x33, 0x30, -0x0A, 0x43, 0x38, 0x0A, 0x38, 0x34, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x6D, 0x75, 0x6C, -0x74, 0x69, 0x70, 0x6C, 0x79, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x31, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x38, 0x33, 0x37, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x35, 0x20, 0x32, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x39, 0x30, -0x0A, 0x36, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x30, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x4F, -0x73, 0x6C, 0x61, 0x73, 0x68, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x31, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x37, 0x38, 0x37, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, -0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x34, -0x0A, 0x43, 0x38, 0x0A, 0x39, 0x34, 0x0A, 0x41, -0x34, 0x0A, 0x45, 0x34, 0x0A, 0x43, 0x34, 0x0A, -0x46, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x55, 0x67, 0x72, -0x61, 0x76, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x31, 0x37, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x37, 0x33, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x38, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x38, -0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x55, 0x61, -0x63, 0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x31, -0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x37, 0x33, 0x31, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x55, -0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, -0x65, 0x78, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x31, 0x39, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, -0x33, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x55, 0x64, 0x69, -0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x32, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x33, 0x31, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x35, -0x30, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x37, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x32, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x36, 0x20, 0x38, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x32, 0x30, 0x0A, 0x38, 0x34, 0x0A, 0x34, 0x38, -0x0A, 0x33, 0x30, 0x0A, 0x33, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x32, 0x32, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x30, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x38, 0x38, 0x0A, 0x39, 0x30, 0x0A, 0x45, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x67, -0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C, -0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x32, 0x33, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x32, -0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x36, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x41, 0x30, 0x0A, 0x41, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x38, 0x38, 0x0A, 0x46, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x32, 0x34, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x32, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x32, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x61, -0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x32, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x31, 0x32, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, -0x0A, 0x30, 0x30, 0x0A, 0x37, 0x30, 0x0A, 0x30, -0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x61, 0x63, 0x69, -0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x32, 0x32, 0x36, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x32, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, -0x30, 0x0A, 0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x32, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x31, 0x32, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x30, 0x0A, -0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x61, 0x64, -0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x32, 0x38, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x32, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x35, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x61, -0x72, 0x69, 0x6E, 0x67, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x32, -0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x31, 0x32, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x38, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, -0x35, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x30, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x61, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x33, 0x30, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x39, 0x38, -0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x39, 0x20, 0x35, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x37, 0x37, 0x30, 0x30, 0x0A, -0x30, 0x38, 0x38, 0x30, 0x0A, 0x37, 0x46, 0x38, -0x30, 0x0A, 0x38, 0x38, 0x30, 0x30, 0x0A, 0x37, -0x37, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x63, -0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x33, 0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x34, 0x39, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x37, 0x38, 0x0A, 0x34, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x31, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x65, -0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x33, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x31, 0x35, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x34, 0x30, -0x0A, 0x30, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x46, 0x38, 0x0A, 0x38, 0x30, 0x0A, -0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x65, 0x61, 0x63, -0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x33, 0x33, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x35, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x46, 0x38, 0x0A, 0x38, 0x30, 0x0A, 0x37, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x65, 0x63, 0x69, 0x72, 0x63, -0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x33, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x31, 0x35, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x36, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x46, 0x38, 0x0A, 0x38, 0x30, -0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x65, 0x64, -0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x33, 0x35, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x35, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x35, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x46, 0x38, 0x0A, 0x38, -0x30, 0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x69, -0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x33, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x32, 0x37, 0x37, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x32, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, -0x0A, 0x30, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x69, 0x61, 0x63, -0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x33, 0x37, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x32, 0x37, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x37, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x69, 0x63, 0x69, 0x72, 0x63, -0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x33, 0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x32, 0x37, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x32, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x43, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x69, 0x64, -0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x33, 0x39, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x32, 0x37, 0x37, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x33, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x41, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x65, -0x74, 0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x34, 0x30, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x33, 0x38, 0x0A, 0x35, 0x30, -0x0A, 0x37, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x38, -0x38, 0x0A, 0x34, 0x38, 0x0A, 0x37, 0x38, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x32, 0x34, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x33, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x46, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x34, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x31, 0x31, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6F, 0x61, -0x63, 0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x34, -0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x31, 0x31, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, -0x30, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x37, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x6F, 0x63, 0x69, 0x72, -0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x34, 0x34, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x31, 0x31, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x33, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x34, -0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6F, -0x74, 0x69, 0x6C, 0x64, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x34, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x31, 0x31, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, -0x0A, 0x31, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x34, -0x38, 0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x6F, 0x64, 0x69, -0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x34, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x31, 0x31, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x64, 0x69, -0x76, 0x69, 0x64, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x34, -0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x38, 0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x34, 0x20, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, -0x30, 0x30, 0x0A, 0x46, 0x43, 0x0A, 0x31, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6F, 0x73, 0x6C, 0x61, 0x73, -0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x34, 0x38, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x31, -0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x34, 0x20, 0x35, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x46, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x75, 0x67, 0x72, 0x61, 0x76, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x34, 0x39, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, -0x33, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x34, 0x30, 0x0A, 0x30, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x35, 0x30, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x33, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x34, 0x20, 0x37, 0x20, 0x31, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x32, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x46, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x75, -0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, -0x65, 0x78, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x35, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x33, 0x33, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, 0x30, 0x30, -0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, -0x73, 0x69, 0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x35, 0x32, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x33, 0x33, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x37, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x79, 0x61, 0x63, 0x75, 0x74, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x35, 0x33, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x39, -0x31, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x34, 0x20, 0x39, 0x20, 0x31, -0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x30, 0x30, -0x0A, 0x31, 0x30, 0x0A, 0x39, 0x30, 0x0A, 0x41, -0x30, 0x0A, 0x36, 0x30, 0x0A, 0x36, 0x30, 0x0A, -0x34, 0x30, 0x0A, 0x43, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x74, 0x68, 0x6F, 0x72, 0x6E, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x35, 0x34, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x33, 0x34, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, 0x32, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x46, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x79, 0x64, 0x69, 0x65, -0x72, 0x65, 0x73, 0x69, 0x73, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, -0x35, 0x35, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x39, 0x31, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, -0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, 0x32, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x41, -0x30, 0x0A, 0x30, 0x30, 0x0A, 0x31, 0x30, 0x0A, -0x39, 0x30, 0x0A, 0x41, 0x30, 0x0A, 0x36, 0x30, -0x0A, 0x36, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x43, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x43, 0x61, 0x63, 0x75, -0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x36, 0x32, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x39, 0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x33, 0x30, -0x0A, 0x43, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x37, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x61, 0x63, -0x75, 0x74, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x32, 0x36, 0x33, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x34, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, 0x30, -0x30, 0x0A, 0x37, 0x38, 0x0A, 0x34, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x37, 0x38, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x43, 0x63, 0x61, 0x72, 0x6F, -0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x32, 0x36, 0x38, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x39, -0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x33, 0x30, 0x0A, 0x33, 0x30, 0x0A, -0x43, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x37, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x63, 0x63, 0x61, 0x72, -0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x32, 0x36, 0x39, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x34, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, 0x30, 0x30, -0x0A, 0x37, 0x38, 0x0A, 0x34, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x37, 0x38, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x64, 0x63, 0x72, 0x6F, 0x61, 0x74, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x32, 0x37, 0x33, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x37, 0x20, 0x30, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x30, 0x38, 0x0A, 0x30, 0x38, 0x0A, 0x37, -0x38, 0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x47, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x32, 0x38, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x37, 0x34, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x38, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x43, 0x43, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x43, -0x0A, 0x38, 0x34, 0x0A, 0x37, 0x38, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x67, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x32, 0x38, 0x37, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x34, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x35, 0x20, 0x39, 0x20, 0x30, 0x20, 0x2D, -0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x33, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x37, -0x38, 0x0A, 0x34, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x37, 0x38, 0x0A, 0x30, 0x38, -0x0A, 0x37, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x49, 0x64, -0x6F, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6E, 0x74, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x33, 0x30, 0x34, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x39, 0x34, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x31, 0x20, 0x38, 0x20, 0x31, 0x20, -0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x64, 0x6F, 0x74, 0x6C, 0x65, -0x73, 0x73, 0x69, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x30, 0x35, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x32, 0x37, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x35, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x4C, 0x73, 0x6C, -0x61, 0x73, 0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x32, 0x31, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x36, 0x32, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x35, 0x30, 0x0A, 0x36, 0x30, 0x0A, -0x43, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x37, 0x38, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6C, 0x73, 0x6C, 0x61, 0x73, -0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x33, 0x32, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x38, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x32, 0x20, 0x37, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x43, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x4F, 0x45, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x33, 0x38, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x31, 0x30, 0x36, 0x39, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x39, -0x20, 0x37, 0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x33, 0x46, -0x38, 0x30, 0x0A, 0x43, 0x38, 0x30, 0x30, 0x0A, -0x38, 0x38, 0x30, 0x30, 0x0A, 0x38, 0x46, 0x38, -0x30, 0x0A, 0x38, 0x38, 0x30, 0x30, 0x0A, 0x38, -0x38, 0x30, 0x30, 0x0A, 0x37, 0x46, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6F, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, -0x33, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x31, 0x30, 0x32, 0x32, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x31, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x39, 0x20, 0x35, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x37, 0x46, 0x38, 0x30, 0x0A, 0x34, 0x43, 0x38, -0x30, 0x0A, 0x38, 0x46, 0x38, 0x30, 0x0A, 0x34, -0x43, 0x30, 0x30, 0x0A, 0x37, 0x46, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x53, 0x63, 0x65, 0x64, 0x69, -0x6C, 0x6C, 0x61, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x35, 0x30, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x33, 0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x39, -0x20, 0x31, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x31, 0x38, 0x0A, 0x30, 0x38, 0x0A, 0x46, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x36, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6C, -0x6C, 0x61, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x33, 0x35, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x32, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, -0x30, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x37, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x37, 0x30, 0x0A, 0x30, 0x38, 0x0A, -0x37, 0x30, 0x0A, 0x30, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x53, 0x63, 0x61, 0x72, 0x6F, -0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x33, 0x35, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x33, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x36, 0x30, 0x0A, 0x37, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x46, 0x30, -0x0A, 0x31, 0x38, 0x0A, 0x30, 0x38, 0x0A, 0x46, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x73, 0x63, 0x61, 0x72, -0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x33, 0x35, 0x33, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x32, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x37, 0x30, 0x0A, 0x38, 0x30, 0x0A, 0x37, -0x30, 0x0A, 0x30, 0x38, 0x0A, 0x37, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, -0x73, 0x69, 0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x37, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x31, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x38, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, 0x38, -0x34, 0x0A, 0x34, 0x38, 0x0A, 0x33, 0x30, 0x0A, -0x33, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x5A, 0x63, -0x61, 0x72, 0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, 0x38, -0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x38, 0x35, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x38, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, -0x37, 0x43, 0x0A, 0x30, 0x34, 0x0A, 0x30, 0x38, -0x0A, 0x31, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x46, 0x43, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x7A, -0x63, 0x61, 0x72, 0x6F, 0x6E, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x33, -0x38, 0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x32, 0x34, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, -0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x37, 0x38, 0x0A, 0x31, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x46, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x66, 0x6C, 0x6F, -0x72, 0x69, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x34, 0x30, 0x32, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x33, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x39, -0x20, 0x30, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, 0x43, 0x0A, -0x31, 0x30, 0x0A, 0x31, 0x30, 0x0A, 0x33, 0x38, -0x0A, 0x31, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x32, 0x30, 0x0A, 0x43, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, -0x66, 0x6C, 0x65, 0x78, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x37, 0x31, -0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, -0x31, 0x20, 0x32, 0x20, 0x36, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x37, 0x31, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x32, 0x20, 0x32, 0x20, 0x31, 0x20, 0x35, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x62, 0x72, 0x65, 0x76, 0x65, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x37, -0x32, 0x38, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, -0x20, 0x31, 0x20, 0x31, 0x20, 0x36, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x64, 0x6F, 0x74, 0x61, 0x63, -0x63, 0x65, 0x6E, 0x74, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x37, 0x32, -0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, -0x31, 0x20, 0x32, 0x20, 0x36, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x72, 0x69, 0x6E, 0x67, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x37, 0x33, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x33, 0x20, 0x33, 0x20, 0x31, 0x20, 0x35, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, -0x30, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x6F, 0x67, 0x6F, 0x6E, 0x65, 0x6B, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x37, 0x33, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x31, 0x20, 0x31, 0x20, 0x32, 0x20, -0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x74, -0x69, 0x6C, 0x64, 0x65, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x37, 0x33, -0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, 0x20, -0x31, 0x20, 0x31, 0x20, 0x36, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x45, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x68, 0x75, 0x6E, 0x67, 0x61, 0x72, -0x75, 0x6D, 0x6C, 0x61, 0x75, 0x74, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x37, 0x33, 0x33, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x31, 0x20, 0x33, 0x20, 0x36, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x4F, 0x6D, 0x65, 0x67, -0x61, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x39, 0x33, 0x37, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x37, 0x36, -0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x37, 0x20, 0x37, 0x20, 0x30, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x31, 0x38, 0x0A, 0x36, 0x34, 0x0A, -0x34, 0x32, 0x0A, 0x38, 0x32, 0x0A, 0x34, 0x32, -0x0A, 0x34, 0x34, 0x0A, 0x45, 0x45, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x70, 0x69, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x39, 0x36, 0x30, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x38, 0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x35, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x46, 0x43, 0x0A, 0x43, -0x38, 0x0A, 0x35, 0x30, 0x0A, 0x35, 0x30, 0x0A, -0x31, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x65, 0x6E, 0x64, -0x61, 0x73, 0x68, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x32, 0x31, -0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, -0x31, 0x20, 0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, 0x38, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x32, 0x31, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x30, 0x20, -0x31, 0x20, 0x30, 0x20, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, 0x46, 0x43, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, 0x74, -0x65, 0x6C, 0x65, 0x66, 0x74, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x32, 0x31, 0x36, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x31, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x32, 0x20, 0x31, 0x20, 0x34, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x71, -0x75, 0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, -0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x32, 0x31, 0x37, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x32, 0x20, -0x31, 0x20, 0x35, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, 0x74, 0x65, -0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, -0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x32, 0x31, 0x38, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x32, 0x20, -0x31, 0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, 0x74, -0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x32, 0x32, 0x30, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x31, -0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x33, 0x20, 0x31, -0x20, 0x34, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x32, 0x30, 0x0A, 0x41, 0x30, 0x0A, -0x41, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, -0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, -0x68, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x32, 0x32, 0x31, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x31, 0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x32, -0x20, 0x31, 0x20, 0x35, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x41, 0x30, 0x0A, 0x41, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x71, 0x75, 0x6F, 0x74, -0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x32, 0x32, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x31, -0x38, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x32, 0x20, 0x31, -0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x41, 0x30, 0x0A, 0x41, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x64, 0x61, 0x67, 0x67, 0x65, -0x72, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x32, 0x32, 0x34, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x38, 0x20, -0x30, 0x20, 0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x46, 0x38, 0x0A, 0x32, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x32, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x64, 0x61, -0x67, 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x38, 0x32, 0x32, 0x35, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x38, 0x20, 0x30, 0x20, -0x2D, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x46, 0x38, 0x0A, 0x32, 0x30, 0x0A, 0x32, 0x30, -0x0A, 0x46, 0x38, 0x0A, 0x32, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x62, 0x75, 0x6C, 0x6C, -0x65, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x32, 0x32, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x38, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x33, -0x20, 0x31, 0x20, 0x32, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x36, 0x30, 0x0A, 0x45, -0x30, 0x0A, 0x36, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x65, -0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x38, 0x32, 0x33, 0x30, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, 0x30, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x38, 0x20, 0x31, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x39, 0x31, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x70, 0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, -0x61, 0x6E, 0x64, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x32, 0x34, -0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x31, 0x33, 0x34, 0x31, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, -0x33, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x33, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x36, 0x32, 0x30, 0x30, 0x0A, 0x39, 0x34, 0x30, -0x30, 0x0A, 0x39, 0x34, 0x30, 0x30, 0x0A, 0x36, -0x38, 0x30, 0x30, 0x0A, 0x31, 0x37, 0x46, 0x30, -0x0A, 0x31, 0x34, 0x43, 0x38, 0x0A, 0x32, 0x33, -0x33, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x67, 0x75, 0x69, -0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, -0x66, 0x74, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x32, 0x34, 0x39, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x39, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x34, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x32, 0x20, 0x33, -0x20, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x34, 0x30, 0x0A, 0x38, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x67, -0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, -0x72, 0x69, 0x67, 0x68, 0x74, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x32, 0x35, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x33, 0x39, 0x39, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x32, 0x20, 0x33, 0x20, 0x31, 0x20, 0x31, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x38, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x45, 0x75, 0x72, 0x6F, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x38, 0x33, 0x36, 0x34, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x33, 0x36, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x36, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x31, 0x38, 0x0A, 0x36, 0x34, 0x0A, 0x34, 0x30, -0x0A, 0x37, 0x30, 0x0A, 0x46, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x33, 0x38, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x74, -0x72, 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x34, 0x38, 0x32, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x31, 0x30, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x31, 0x30, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x37, 0x20, 0x33, -0x20, 0x31, 0x20, 0x34, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x46, 0x32, 0x0A, 0x35, -0x45, 0x0A, 0x35, 0x32, 0x0A, 0x45, 0x4E, 0x44, -0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, -0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, -0x61, 0x72, 0x74, 0x69, 0x61, 0x6C, 0x64, 0x69, -0x66, 0x66, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x37, 0x30, 0x36, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x36, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x33, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x32, 0x38, 0x0A, 0x35, 0x38, 0x0A, -0x39, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x44, 0x65, 0x6C, 0x74, 0x61, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x37, 0x31, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x36, 0x38, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, -0x30, 0x0A, 0x33, 0x30, 0x0A, 0x32, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x34, 0x34, 0x0A, 0x34, 0x34, -0x0A, 0x46, 0x43, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x72, -0x6F, 0x64, 0x75, 0x63, 0x74, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x37, 0x31, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x37, 0x35, 0x36, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x46, 0x43, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, -0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, -0x34, 0x0A, 0x38, 0x34, 0x0A, 0x38, 0x34, 0x0A, -0x38, 0x34, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x73, 0x75, 0x6D, -0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x38, 0x37, 0x32, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x37, 0x33, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x37, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x36, 0x20, 0x39, 0x20, 0x30, 0x20, 0x2D, -0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x46, 0x43, 0x0A, 0x34, 0x30, 0x0A, 0x32, -0x30, 0x0A, 0x31, 0x30, 0x0A, 0x30, 0x38, 0x0A, -0x31, 0x30, 0x0A, 0x32, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x46, 0x43, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x6D, 0x69, -0x6E, 0x75, 0x73, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x37, 0x32, -0x32, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x38, 0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x20, -0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x36, 0x20, -0x31, 0x20, 0x31, 0x20, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x46, 0x43, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, -0x6F, 0x6E, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x37, 0x32, 0x35, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x31, 0x36, 0x36, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x32, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x35, -0x20, 0x2D, 0x31, 0x20, 0x31, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, -0x32, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x70, 0x65, -0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74, -0x65, 0x72, 0x65, 0x64, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, 0x37, -0x32, 0x39, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x33, 0x31, 0x37, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x33, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, -0x20, 0x31, 0x20, 0x31, 0x20, 0x33, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x38, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x72, 0x61, 0x64, 0x69, 0x63, -0x61, 0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x38, 0x37, 0x33, 0x30, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x34, 0x20, 0x36, -0x20, 0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x31, 0x30, 0x0A, 0x31, -0x30, 0x0A, 0x41, 0x30, 0x0A, 0x41, 0x30, 0x0A, -0x36, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x69, 0x6E, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x79, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x37, 0x33, 0x34, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, -0x33, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x33, 0x20, 0x31, -0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x43, 0x0A, 0x32, 0x34, 0x0A, -0x46, 0x43, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x69, 0x6E, 0x74, -0x65, 0x67, 0x72, 0x61, 0x6C, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x37, 0x34, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x32, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x34, 0x20, 0x39, 0x20, 0x31, 0x20, 0x2D, 0x32, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x33, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, -0x30, 0x0A, 0x34, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x61, 0x70, 0x70, -0x72, 0x6F, 0x78, 0x65, 0x71, 0x75, 0x61, 0x6C, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x37, 0x37, 0x36, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x33, 0x20, 0x31, -0x20, 0x31, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x43, 0x0A, 0x36, 0x30, 0x0A, -0x31, 0x43, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x6E, 0x6F, 0x74, -0x65, 0x71, 0x75, 0x61, 0x6C, 0x0A, 0x45, 0x4E, -0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x38, -0x38, 0x30, 0x30, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x33, 0x37, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x38, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x36, 0x20, 0x35, 0x20, 0x31, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, -0x38, 0x0A, 0x46, 0x43, 0x0A, 0x32, 0x30, 0x0A, -0x35, 0x38, 0x0A, 0x34, 0x30, 0x0A, 0x45, 0x4E, -0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, -0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, 0x20, -0x6C, 0x65, 0x73, 0x73, 0x65, 0x71, 0x75, 0x61, -0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x38, 0x38, 0x30, 0x34, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, -0x33, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x36, 0x20, 0x35, 0x20, -0x31, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x31, 0x43, 0x0A, 0x45, 0x30, -0x0A, 0x33, 0x38, 0x0A, 0x30, 0x34, 0x0A, 0x46, -0x43, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x67, 0x72, 0x65, 0x61, -0x74, 0x65, 0x72, 0x65, 0x71, 0x75, 0x61, 0x6C, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x38, 0x38, 0x30, 0x35, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x38, 0x33, -0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x38, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x36, 0x20, 0x35, 0x20, 0x31, -0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x45, 0x30, 0x0A, 0x31, 0x43, 0x0A, -0x33, 0x38, 0x0A, 0x43, 0x30, 0x0A, 0x46, 0x43, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x6C, 0x6F, 0x7A, 0x65, 0x6E, -0x67, 0x65, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x39, 0x36, 0x37, 0x34, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x34, 0x39, 0x34, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x39, -0x20, 0x30, 0x20, 0x2D, 0x32, 0x0A, 0x42, 0x49, -0x54, 0x4D, 0x41, 0x50, 0x0A, 0x32, 0x30, 0x0A, -0x36, 0x30, 0x0A, 0x35, 0x30, 0x0A, 0x39, 0x30, -0x0A, 0x38, 0x38, 0x0A, 0x39, 0x30, 0x0A, 0x35, -0x30, 0x0A, 0x36, 0x30, 0x0A, 0x32, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x66, 0x69, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x36, 0x34, -0x32, 0x35, 0x37, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x36, 0x32, 0x39, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x35, 0x20, 0x37, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x37, -0x38, 0x0A, 0x34, 0x30, 0x0A, 0x46, 0x38, 0x0A, -0x34, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x34, 0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x66, 0x6C, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x36, 0x34, 0x32, 0x35, 0x38, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x36, -0x32, 0x39, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x35, 0x20, 0x37, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x37, 0x38, 0x0A, 0x34, 0x38, -0x0A, 0x45, 0x38, 0x0A, 0x34, 0x38, 0x0A, 0x34, -0x38, 0x0A, 0x34, 0x38, 0x0A, 0x34, 0x38, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, -0x66, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x36, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x36, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x35, 0x20, 0x38, 0x20, 0x30, 0x20, -0x2D, 0x32, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x46, 0x38, 0x0A, 0x38, 0x38, 0x0A, -0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, -0x0A, 0x38, 0x38, 0x0A, 0x38, 0x38, 0x0A, 0x46, -0x38, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x2E, 0x6E, 0x75, 0x6C, -0x6C, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x30, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x30, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x6E, 0x6F, 0x6E, 0x6D, -0x61, 0x72, 0x6B, 0x69, 0x6E, 0x67, 0x72, 0x65, -0x74, 0x75, 0x72, 0x6E, 0x0A, 0x45, 0x4E, 0x43, -0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, 0x2D, 0x31, -0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x33, 0x31, 0x37, 0x20, 0x30, 0x0A, 0x44, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x33, 0x20, 0x30, -0x0A, 0x42, 0x42, 0x58, 0x20, 0x31, 0x20, 0x31, -0x20, 0x30, 0x20, 0x30, 0x0A, 0x42, 0x49, 0x54, -0x4D, 0x41, 0x50, 0x0A, 0x30, 0x30, 0x0A, 0x45, -0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, 0x53, -0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, 0x52, -0x20, 0x63, 0x36, 0x34, 0x35, 0x39, 0x0A, 0x45, -0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, 0x20, -0x2D, 0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, 0x0A, -0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, 0x33, -0x20, 0x31, 0x20, 0x31, 0x20, 0x36, 0x0A, 0x42, -0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x41, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x63, 0x36, 0x34, 0x36, 0x30, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x31, 0x20, 0x31, 0x20, 0x32, 0x20, 0x36, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, -0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x36, 0x34, -0x36, 0x31, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, -0x49, 0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, -0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, -0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, -0x42, 0x58, 0x20, 0x33, 0x20, 0x32, 0x20, 0x31, -0x20, 0x35, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, -0x50, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, 0x0A, -0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, 0x0A, -0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, 0x41, -0x52, 0x20, 0x63, 0x36, 0x34, 0x36, 0x32, 0x0A, -0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, 0x47, -0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, 0x49, 0x44, -0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, 0x30, -0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, -0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, 0x20, -0x31, 0x20, 0x31, 0x20, 0x33, 0x20, 0x35, 0x0A, -0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, 0x30, -0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, -0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, -0x48, 0x41, 0x52, 0x20, 0x63, 0x36, 0x34, 0x36, -0x33, 0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, -0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, -0x49, 0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, -0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, -0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, -0x58, 0x20, 0x31, 0x20, 0x31, 0x20, 0x32, 0x20, -0x36, 0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, -0x0A, 0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x36, -0x34, 0x36, 0x36, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x32, 0x20, -0x31, 0x20, 0x35, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x63, 0x36, 0x34, 0x36, 0x37, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x34, 0x30, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x34, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x33, 0x20, 0x34, 0x20, 0x30, 0x20, 0x33, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x32, 0x30, 0x0A, 0x36, 0x30, 0x0A, 0x41, 0x30, -0x0A, 0x36, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, -0x48, 0x41, 0x52, 0x0A, 0x53, 0x54, 0x41, 0x52, -0x54, 0x43, 0x48, 0x41, 0x52, 0x20, 0x63, 0x36, -0x34, 0x36, 0x38, 0x0A, 0x45, 0x4E, 0x43, 0x4F, -0x44, 0x49, 0x4E, 0x47, 0x20, 0x2D, 0x31, 0x0A, -0x53, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x35, -0x30, 0x30, 0x20, 0x30, 0x0A, 0x44, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x20, 0x30, 0x0A, -0x42, 0x42, 0x58, 0x20, 0x33, 0x20, 0x32, 0x20, -0x31, 0x20, 0x35, 0x0A, 0x42, 0x49, 0x54, 0x4D, -0x41, 0x50, 0x0A, 0x41, 0x30, 0x0A, 0x34, 0x30, -0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, 0x41, 0x52, -0x0A, 0x53, 0x54, 0x41, 0x52, 0x54, 0x43, 0x48, -0x41, 0x52, 0x20, 0x63, 0x36, 0x34, 0x36, 0x39, -0x0A, 0x45, 0x4E, 0x43, 0x4F, 0x44, 0x49, 0x4E, -0x47, 0x20, 0x2D, 0x31, 0x0A, 0x53, 0x57, 0x49, -0x44, 0x54, 0x48, 0x20, 0x35, 0x30, 0x30, 0x20, -0x30, 0x0A, 0x44, 0x57, 0x49, 0x44, 0x54, 0x48, -0x20, 0x35, 0x20, 0x30, 0x0A, 0x42, 0x42, 0x58, -0x20, 0x31, 0x20, 0x31, 0x20, 0x32, 0x20, 0x36, -0x0A, 0x42, 0x49, 0x54, 0x4D, 0x41, 0x50, 0x0A, -0x38, 0x30, 0x0A, 0x45, 0x4E, 0x44, 0x43, 0x48, -0x41, 0x52, 0x0A, 0x45, 0x4E, 0x44, 0x46, 0x4F, -0x4E, 0x54, 0x0A -}; - #endregion - - #region MS-Sans-Serif-24_fnt - public static readonly byte[] MsSansSerif24_fnt = new byte[] - { - 0x00, 0x02, 0xB7, 0x57, 0x00, 0x00, 0x43, 0x6F, -0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, -0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x38, 0x35, -0x20, 0x58, 0x69, 0x70, 0x68, 0x69, 0x61, 0x73, -0x2C, 0x20, 0x4C, 0x6F, 0x73, 0x20, 0x41, 0x6E, -0x67, 0x65, 0x6C, 0x65, 0x73, 0x2C, 0x20, 0x43, -0x61, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, -0x60, 0x00, 0x1D, 0x00, 0x05, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, -0x25, 0x00, 0x21, 0x10, 0x00, 0x20, 0x00, 0x20, -0xFF, 0x61, 0x00, 0x43, 0x02, 0x00, 0x00, 0x00, -0x00, 0xA9, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0x09, 0x00, -0xFA, 0x03, 0x09, 0x00, 0x44, 0x04, 0x0B, 0x00, -0x8E, 0x04, 0x12, 0x00, 0xD8, 0x04, 0x12, 0x00, -0x47, 0x05, 0x1C, 0x00, 0xB6, 0x05, 0x16, 0x00, -0x4A, 0x06, 0x07, 0x00, 0xB9, 0x06, 0x0B, 0x00, -0xDE, 0x06, 0x0B, 0x00, 0x28, 0x07, 0x0C, 0x00, -0x72, 0x07, 0x13, 0x00, 0xBC, 0x07, 0x09, 0x00, -0x2B, 0x08, 0x0A, 0x00, 0x75, 0x08, 0x09, 0x00, -0xBF, 0x08, 0x09, 0x00, 0x09, 0x09, 0x12, 0x00, -0x53, 0x09, 0x10, 0x00, 0xC2, 0x09, 0x12, 0x00, -0x0C, 0x0A, 0x12, 0x00, 0x7B, 0x0A, 0x12, 0x00, -0xEA, 0x0A, 0x12, 0x00, 0x59, 0x0B, 0x12, 0x00, -0xC8, 0x0B, 0x12, 0x00, 0x37, 0x0C, 0x12, 0x00, -0xA6, 0x0C, 0x12, 0x00, 0x15, 0x0D, 0x09, 0x00, -0x84, 0x0D, 0x09, 0x00, 0xCE, 0x0D, 0x13, 0x00, -0x18, 0x0E, 0x13, 0x00, 0x87, 0x0E, 0x13, 0x00, -0xF6, 0x0E, 0x11, 0x00, 0x65, 0x0F, 0x1E, 0x00, -0xD4, 0x0F, 0x16, 0x00, 0x68, 0x10, 0x15, 0x00, -0xD7, 0x10, 0x17, 0x00, 0x46, 0x11, 0x17, 0x00, -0xB5, 0x11, 0x15, 0x00, 0x24, 0x12, 0x14, 0x00, -0x93, 0x12, 0x19, 0x00, 0x02, 0x13, 0x17, 0x00, -0x96, 0x13, 0x08, 0x00, 0x05, 0x14, 0x10, 0x00, -0x2A, 0x14, 0x15, 0x00, 0x74, 0x14, 0x12, 0x00, -0xE3, 0x14, 0x1A, 0x00, 0x52, 0x15, 0x18, 0x00, -0xE6, 0x15, 0x19, 0x00, 0x55, 0x16, 0x15, 0x00, -0xE9, 0x16, 0x19, 0x00, 0x58, 0x17, 0x16, 0x00, -0xEC, 0x17, 0x15, 0x00, 0x5B, 0x18, 0x14, 0x00, -0xCA, 0x18, 0x17, 0x00, 0x39, 0x19, 0x16, 0x00, -0xA8, 0x19, 0x1F, 0x00, 0x17, 0x1A, 0x15, 0x00, -0xAB, 0x1A, 0x16, 0x00, 0x1A, 0x1B, 0x14, 0x00, -0x89, 0x1B, 0x09, 0x00, 0xF8, 0x1B, 0x09, 0x00, -0x42, 0x1C, 0x09, 0x00, 0x8C, 0x1C, 0x0F, 0x00, -0xD6, 0x1C, 0x12, 0x00, 0x20, 0x1D, 0x0B, 0x00, -0x8F, 0x1D, 0x12, 0x00, 0xD9, 0x1D, 0x12, 0x00, -0x48, 0x1E, 0x10, 0x00, 0xB7, 0x1E, 0x12, 0x00, -0x01, 0x1F, 0x11, 0x00, 0x70, 0x1F, 0x09, 0x00, -0xDF, 0x1F, 0x12, 0x00, 0x29, 0x20, 0x12, 0x00, -0x98, 0x20, 0x07, 0x00, 0x07, 0x21, 0x07, 0x00, -0x2C, 0x21, 0x10, 0x00, 0x51, 0x21, 0x07, 0x00, -0x9B, 0x21, 0x1B, 0x00, 0xC0, 0x21, 0x12, 0x00, -0x54, 0x22, 0x12, 0x00, 0xC3, 0x22, 0x12, 0x00, -0x32, 0x23, 0x12, 0x00, 0xA1, 0x23, 0x0B, 0x00, -0x10, 0x24, 0x10, 0x00, 0x5A, 0x24, 0x09, 0x00, -0xA4, 0x24, 0x12, 0x00, 0xEE, 0x24, 0x0F, 0x00, -0x5D, 0x25, 0x17, 0x00, 0xA7, 0x25, 0x0F, 0x00, -0x16, 0x26, 0x0F, 0x00, 0x60, 0x26, 0x10, 0x00, -0xAA, 0x26, 0x0B, 0x00, 0xF4, 0x26, 0x07, 0x00, -0x3E, 0x27, 0x0B, 0x00, 0x63, 0x27, 0x13, 0x00, -0xAD, 0x27, 0x0B, 0x00, 0x1C, 0x28, 0x12, 0x00, -0x66, 0x28, 0x0B, 0x00, 0xD5, 0x28, 0x0B, 0x00, -0x1F, 0x29, 0x0B, 0x00, 0x69, 0x29, 0x0B, 0x00, -0xB3, 0x29, 0x0B, 0x00, 0xFD, 0x29, 0x0B, 0x00, -0x47, 0x2A, 0x0B, 0x00, 0x91, 0x2A, 0x0B, 0x00, -0xDB, 0x2A, 0x0B, 0x00, 0x25, 0x2B, 0x0B, 0x00, -0x6F, 0x2B, 0x0B, 0x00, 0xB9, 0x2B, 0x0B, 0x00, -0x03, 0x2C, 0x0B, 0x00, 0x4D, 0x2C, 0x0B, 0x00, -0x97, 0x2C, 0x0B, 0x00, 0xE1, 0x2C, 0x0B, 0x00, -0x2B, 0x2D, 0x09, 0x00, 0x75, 0x2D, 0x09, 0x00, -0xBF, 0x2D, 0x0B, 0x00, 0x09, 0x2E, 0x0B, 0x00, -0x53, 0x2E, 0x0B, 0x00, 0x9D, 0x2E, 0x0B, 0x00, -0xE7, 0x2E, 0x0B, 0x00, 0x31, 0x2F, 0x0B, 0x00, -0x7B, 0x2F, 0x0B, 0x00, 0xC5, 0x2F, 0x0B, 0x00, -0x0F, 0x30, 0x0B, 0x00, 0x59, 0x30, 0x0B, 0x00, -0xA3, 0x30, 0x0B, 0x00, 0xED, 0x30, 0x0B, 0x00, -0x37, 0x31, 0x0B, 0x00, 0x81, 0x31, 0x09, 0x00, -0xCB, 0x31, 0x09, 0x00, 0x15, 0x32, 0x12, 0x00, -0x5F, 0x32, 0x12, 0x00, 0xCE, 0x32, 0x12, 0x00, -0x3D, 0x33, 0x12, 0x00, 0xAC, 0x33, 0x07, 0x00, -0x1B, 0x34, 0x12, 0x00, 0x40, 0x34, 0x0B, 0x00, -0xAF, 0x34, 0x18, 0x00, 0xF9, 0x34, 0x0C, 0x00, -0x68, 0x35, 0x12, 0x00, 0xB2, 0x35, 0x13, 0x00, -0x21, 0x36, 0x0A, 0x00, 0x90, 0x36, 0x18, 0x00, -0xDA, 0x36, 0x10, 0x00, 0x49, 0x37, 0x0B, 0x00, -0x93, 0x37, 0x13, 0x00, 0xDD, 0x37, 0x09, 0x00, -0x4C, 0x38, 0x09, 0x00, 0x96, 0x38, 0x0B, 0x00, -0xE0, 0x38, 0x12, 0x00, 0x2A, 0x39, 0x11, 0x00, -0x99, 0x39, 0x09, 0x00, 0x08, 0x3A, 0x0B, 0x00, -0x52, 0x3A, 0x09, 0x00, 0x9C, 0x3A, 0x0C, 0x00, -0xE6, 0x3A, 0x12, 0x00, 0x30, 0x3B, 0x17, 0x00, -0x9F, 0x3B, 0x17, 0x00, 0x0E, 0x3C, 0x17, 0x00, -0x7D, 0x3C, 0x11, 0x00, 0xEC, 0x3C, 0x16, 0x00, -0x5B, 0x3D, 0x16, 0x00, 0xCA, 0x3D, 0x16, 0x00, -0x39, 0x3E, 0x16, 0x00, 0xA8, 0x3E, 0x16, 0x00, -0x17, 0x3F, 0x16, 0x00, 0x86, 0x3F, 0x20, 0x00, -0xF5, 0x3F, 0x17, 0x00, 0x89, 0x40, 0x15, 0x00, -0xF8, 0x40, 0x15, 0x00, 0x67, 0x41, 0x15, 0x00, -0xD6, 0x41, 0x15, 0x00, 0x45, 0x42, 0x08, 0x00, -0xB4, 0x42, 0x08, 0x00, 0xD9, 0x42, 0x08, 0x00, -0xFE, 0x42, 0x08, 0x00, 0x23, 0x43, 0x17, 0x00, -0x48, 0x43, 0x18, 0x00, 0xB7, 0x43, 0x19, 0x00, -0x26, 0x44, 0x19, 0x00, 0xBA, 0x44, 0x19, 0x00, -0x4E, 0x45, 0x19, 0x00, 0xE2, 0x45, 0x19, 0x00, -0x76, 0x46, 0x13, 0x00, 0x0A, 0x47, 0x19, 0x00, -0x79, 0x47, 0x17, 0x00, 0x0D, 0x48, 0x17, 0x00, -0x7C, 0x48, 0x17, 0x00, 0xEB, 0x48, 0x17, 0x00, -0x5A, 0x49, 0x16, 0x00, 0xC9, 0x49, 0x15, 0x00, -0x38, 0x4A, 0x13, 0x00, 0xA7, 0x4A, 0x12, 0x00, -0x16, 0x4B, 0x12, 0x00, 0x85, 0x4B, 0x12, 0x00, -0xF4, 0x4B, 0x12, 0x00, 0x63, 0x4C, 0x12, 0x00, -0xD2, 0x4C, 0x12, 0x00, 0x41, 0x4D, 0x1D, 0x00, -0xB0, 0x4D, 0x10, 0x00, 0x44, 0x4E, 0x11, 0x00, -0x8E, 0x4E, 0x11, 0x00, 0xFD, 0x4E, 0x11, 0x00, -0x6C, 0x4F, 0x11, 0x00, 0xDB, 0x4F, 0x07, 0x00, -0x4A, 0x50, 0x07, 0x00, 0x6F, 0x50, 0x07, 0x00, -0x94, 0x50, 0x07, 0x00, 0xB9, 0x50, 0x12, 0x00, -0xDE, 0x50, 0x12, 0x00, 0x4D, 0x51, 0x12, 0x00, -0xBC, 0x51, 0x12, 0x00, 0x2B, 0x52, 0x12, 0x00, -0x9A, 0x52, 0x12, 0x00, 0x09, 0x53, 0x12, 0x00, -0x78, 0x53, 0x13, 0x00, 0xE7, 0x53, 0x12, 0x00, -0x56, 0x54, 0x12, 0x00, 0xC5, 0x54, 0x12, 0x00, -0x34, 0x55, 0x12, 0x00, 0xA3, 0x55, 0x12, 0x00, -0x12, 0x56, 0x0F, 0x00, 0x81, 0x56, 0x12, 0x00, -0xCB, 0x56, 0x0F, 0x00, 0x3A, 0x57, 0x08, 0x00, -0x84, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x71, 0x71, 0x71, 0x71, -0x71, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x01, 0x03, 0x03, 0x3F, 0x3F, 0x03, 0x07, -0x06, 0x06, 0x06, 0x0E, 0x0C, 0x7F, 0x7F, 0x0C, -0x1C, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x86, 0x86, 0x86, 0x86, 0x8E, -0x0C, 0xFF, 0xFF, 0x0C, 0x1C, 0x18, 0x18, 0x18, -0x38, 0x30, 0xFF, 0xFF, 0x30, 0x70, 0x60, 0x60, -0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1E, -0x1C, 0x38, 0x38, 0x38, 0x1C, 0x1E, 0x0F, 0x07, -0x01, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, -0x38, 0x3C, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xC0, 0xF0, 0xFC, 0xDE, 0xCE, 0xC7, 0xC7, -0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0xFC, 0xFE, 0xCF, -0xC7, 0xC3, 0xC3, 0xC3, 0xC3, 0xC7, 0xCF, 0xFE, -0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x18, 0x30, -0x30, 0x30, 0x30, 0x18, 0x1F, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xE0, 0x60, 0x30, 0x30, 0x30, 0x31, -0x61, 0xE3, 0x83, 0x07, 0x06, 0x0E, 0x0C, 0x1C, -0x18, 0x38, 0x30, 0x70, 0x60, 0xE0, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, -0x70, 0x60, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x7F, 0x61, 0xC0, 0xC0, -0xC0, 0xC0, 0x61, 0x7F, 0x1E, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x03, 0x07, 0x07, 0x0E, 0x0E, 0x0E, 0x07, -0x07, 0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x3C, 0x38, -0x38, 0x38, 0x3C, 0x1E, 0x1F, 0x0F, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8, -0x38, 0x1C, 0x1C, 0x1C, 0x38, 0xF8, 0xF0, 0xE0, -0xF0, 0x78, 0x3C, 0x1F, 0x0F, 0x07, 0x03, 0x07, -0x0F, 0xFE, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, -0xC0, 0xC0, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0x78, -0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, -0x38, 0x38, 0x38, 0x38, 0x10, 0x10, 0x10, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x07, 0x0E, 0x0E, 0x0E, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x0E, 0x0E, 0x0E, 0x07, 0x07, 0x03, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, -0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x0E, 0x1C, -0x1C, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x06, 0x06, 0x36, 0x7F, 0x1F, 0x0F, 0x1F, 0x39, -0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xE0, 0x80, 0x00, 0x80, 0xC0, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, -0xE0, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, -0xE0, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, -0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -0x03, 0x03, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x0E, -0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x70, -0x70, 0x70, 0x70, 0xE0, 0xE0, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x07, 0x0F, 0x1E, 0x1C, 0x3C, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x3C, 0x1C, 0x1E, 0x0F, 0x07, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, -0xFC, 0x1E, 0x0E, 0x0F, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, -0x0E, 0x1E, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x03, 0x0F, 0x0F, 0x0F, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, -0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x07, 0x0F, 0x1E, 0x1C, 0x38, -0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x07, 0x0F, 0x1E, 0x1C, 0x38, 0x38, 0x7F, 0x7F, -0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFC, 0x1E, 0x0E, 0x07, 0x07, 0x07, 0x07, -0x0E, 0x1E, 0x7C, 0xF8, 0xE0, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x07, 0x0F, 0x1E, 0x1C, 0x38, 0x38, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x70, 0x70, 0x38, 0x3C, 0x1F, 0x0F, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, -0xFC, 0x1E, 0x0E, 0x07, 0x07, 0x07, 0x0E, 0xFE, -0xFC, 0xFE, 0x0F, 0x07, 0x03, 0x03, 0x03, 0x03, -0x07, 0x0F, 0xFE, 0xFC, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, -0x07, 0x0F, 0x1E, 0x1C, 0x3C, 0x38, 0x78, 0x7F, -0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7C, 0x7C, -0xFC, 0xFC, 0xDC, 0xDC, 0x9C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0xFF, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, -0x0F, 0x0F, 0x0E, 0x1C, 0x1C, 0x1C, 0x1D, 0x3F, -0x3F, 0x3C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x70, -0x70, 0x38, 0x3C, 0x1F, 0x0F, 0x03, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0xF8, 0xFE, 0xFF, 0x0F, 0x07, -0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x0F, -0xFE, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, -0x0F, 0x1F, 0x1C, 0x3C, 0x38, 0x38, 0x38, 0x3B, -0x3F, 0x3F, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x3C, -0x1C, 0x1F, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFE, 0x1E, 0x07, -0x07, 0x00, 0x00, 0xF0, 0xFC, 0xFE, 0x1F, 0x07, -0x07, 0x03, 0x03, 0x03, 0x07, 0x07, 0x1F, 0xFE, -0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, -0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x07, 0x0F, 0x1E, -0x1C, 0x3C, 0x38, 0x78, 0x70, 0xF0, 0xE0, 0xE0, -0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1E, -0x1C, 0x38, 0x38, 0x38, 0x1C, 0x1F, 0x0F, 0x1F, -0x3C, 0x38, 0x70, 0x70, 0x70, 0x70, 0x38, 0x3C, -0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xF8, 0xFC, 0x1E, 0x0E, 0x07, 0x07, -0x07, 0x0E, 0xFE, 0xFC, 0xFE, 0x0F, 0x07, 0x03, -0x03, 0x03, 0x03, 0x07, 0x0F, 0xFE, 0xFC, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3E, 0x38, -0x78, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, -0x0F, 0x03, 0x00, 0x00, 0x38, 0x38, 0x1E, 0x1F, -0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF8, 0xFC, 0x3E, 0x0E, 0x0F, 0x07, 0x07, -0x07, 0x0F, 0x0F, 0x3F, 0xFF, 0xF7, 0xC7, 0x07, -0x07, 0x0F, 0x0E, 0x3E, 0xFC, 0xF8, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1C, 0x1C, 0x1C, 0x04, 0x08, 0x10, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, -0x1F, 0x7E, 0x7E, 0x1F, 0x07, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x07, 0x1F, 0x7E, 0xF8, 0xE0, 0x80, 0x00, 0x00, -0x80, 0xE0, 0xF8, 0x7E, 0x1F, 0x07, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x30, 0x3C, 0x3F, 0x0F, 0x03, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x0F, 0x3F, 0x3C, 0x30, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xF0, 0xFC, 0x3F, 0x0F, 0x0F, 0x3F, 0xFC, -0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x3C, 0x38, -0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, -0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF8, 0xFC, 0x1E, 0x0E, 0x07, 0x07, 0x07, -0x07, 0x0E, 0x1E, 0x3C, 0x78, 0xF0, 0xE0, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E, -0x1C, 0x18, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, -0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x1C, 0x0E, -0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, -0x7F, 0xF0, 0x80, 0x00, 0x00, 0x03, 0x0F, 0x1C, -0x30, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0xC0, 0xC0, -0x61, 0x3F, 0x1F, 0x00, 0x00, 0x80, 0xE0, 0xFF, -0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xE0, 0xFC, 0x1F, 0x03, -0x01, 0x00, 0xC0, 0xEC, 0x3C, 0x18, 0x18, 0x18, -0x30, 0x30, 0x30, 0x60, 0xE0, 0xF0, 0xBF, 0x1F, -0x00, 0x00, 0x00, 0x1C, 0xF8, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x60, -0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, -0x30, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, -0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0F, 0x1F, 0x1F, -0x3C, 0x38, 0x38, 0x78, 0x70, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7C, 0x7C, 0xFE, 0xFE, 0xEE, -0xEF, 0xC7, 0xC7, 0xC7, 0x83, 0x83, 0x01, 0x01, -0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, -0xF0, 0xF0, 0x78, 0x38, 0x38, 0x3C, 0x1C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, -0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, -0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, -0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, -0xC0, 0x80, 0xC0, 0xE0, 0xE0, 0x70, 0x70, 0x70, -0x70, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x0F, 0x1E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x1C, 0x1C, 0x1E, 0x0F, 0x07, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x1E, -0x3C, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xFC, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x78, 0x38, 0x38, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x38, 0x78, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, -0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, -0x1C, 0x1E, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0x3C, 0x1E, -0x0E, 0x0E, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, -0x0E, 0x0E, 0x1E, 0x1E, 0x3E, 0xFE, 0xEE, 0xCE, -0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0xF8, -0xF8, 0xF8, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, -0x70, 0x70, 0x78, 0x3C, 0x3F, 0x1F, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C, -0x78, 0xF8, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x39, 0x3B, 0x3F, 0x3F, 0x3E, 0x3C, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x07, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xE0, -0xC0, 0xC0, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x0F, -0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, -0xF0, 0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1E, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1D, 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, -0xE0, 0xE0, 0xF1, 0x71, 0x71, 0x7B, 0x3B, 0x3B, -0x3F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0F, 0x1F, 0x1F, 0x1F, 0x3F, 0x3F, -0x3F, 0x7F, 0x77, 0x77, 0xF7, 0xE7, 0xE7, 0xE7, -0xC7, 0xC7, 0xC7, 0x87, 0x87, 0x87, 0x07, 0x07, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x1F, 0x1F, 0x1F, -0x1F, 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, -0xF0, 0x70, 0x78, 0x3C, 0x1C, 0x1E, 0x0F, 0x07, -0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x9C, 0xDC, 0xDC, -0xFC, 0xFC, 0x7C, 0x7C, 0x3C, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0F, -0x1E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x1C, 0x1C, 0x1E, 0x0F, 0x07, 0x03, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, -0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1E, 0x3C, -0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, -0x70, 0x70, 0xF0, 0xE0, 0xE0, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1C, 0x1E, -0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC0, 0xFF, -0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xC7, 0xEE, -0xFE, 0x7E, 0x3C, 0xFE, 0xFF, 0xE7, 0x02, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, -0x70, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, 0xC0, -0xE0, 0xE0, 0xF0, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x03, 0x0F, 0x1F, 0x1E, 0x3C, 0x38, 0x38, -0x3C, 0x1E, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, -0x00, 0x70, 0x78, 0x38, 0x3E, 0x1F, 0x0F, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, -0xFF, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xFF, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, -0xE0, 0xF0, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, -0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1E, 0x0E, 0x0F, 0x07, 0x03, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x78, 0x70, 0xF0, 0xE0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, -0x38, 0x38, 0x3C, 0x1C, 0x1E, 0x0E, 0x0E, 0x0F, -0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x83, -0x83, 0xC7, 0xC7, 0xC7, 0xEF, 0xEE, 0xFE, 0xFE, -0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x1C, 0x3C, 0x38, 0x38, 0x78, 0x70, 0xF0, 0xE0, -0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, -0x78, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x1E, 0x0E, -0x0E, 0x0F, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, -0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, -0x0F, 0x0E, 0x0E, 0x1E, 0x1C, 0x1C, 0x3C, 0x38, -0x38, 0xF8, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xE0, -0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0x70, 0x70, -0x78, 0x38, 0x38, 0x3C, 0x1C, 0x1C, 0x1F, 0x0F, -0x0F, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x1E, -0x1C, 0x1C, 0x3C, 0x38, 0x38, 0x78, 0x70, 0x70, -0xF0, 0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x80, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x3C, 0x1C, 0x1E, 0x0F, 0x07, 0x03, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x03, 0x07, 0x0F, 0x0E, 0x1E, 0x3C, 0x78, 0x70, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x03, 0x87, 0x87, 0xCF, 0xFE, 0xFC, -0x78, 0x78, 0xFC, 0xFE, 0xCE, 0xCF, 0x87, 0x03, -0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x70, 0xF0, 0xE0, 0xE0, 0xC0, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xE0, 0xF0, -0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x70, 0x78, 0x3C, 0x1E, 0x0E, 0x0F, 0x07, 0x03, -0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x83, 0xC7, 0xC7, 0xEF, 0xFE, -0x7C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1C, 0x3C, 0x78, 0xF0, 0xE0, 0xE0, -0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, -0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07, 0x0F, -0x1E, 0x3C, 0x78, 0x7F, 0x7F, 0x7F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, -0x03, 0x07, 0x0F, 0x1E, 0x3C, 0x38, 0x78, 0xF0, -0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, -0x3F, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xE0, 0xE0, 0x70, 0x70, 0x70, 0x70, 0x38, -0x38, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x0E, -0x0E, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x7E, 0x7E, 0x7E, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x1E, 0x38, -0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xE0, 0xF0, 0x38, 0x0C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x1C, 0x38, 0x00, 0x00, 0x07, 0x1F, 0x3C, 0x38, -0x70, 0x70, 0x70, 0x38, 0x3F, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF8, 0xFE, 0x0E, 0x07, 0x07, -0x0F, 0xFF, 0xF7, 0x07, 0x07, 0x07, 0x07, 0x0F, -0x1F, 0xFB, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x3F, 0x3F, -0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x3C, 0x3C, 0x3F, 0x3F, 0x39, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, 0x07, 0x03, -0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x1F, -0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x3E, 0x38, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x78, -0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF8, 0xFE, 0x1F, 0x07, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x1F, 0xFE, -0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0xE7, 0xFF, 0x3F, 0x0F, 0x0F, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, -0x3F, 0xFF, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x3E, -0x38, 0x78, 0x70, 0x7F, 0x7F, 0x70, 0x70, 0x70, -0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0xFC, 0x3E, 0x0E, 0x0F, 0x07, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0x0E, 0x3E, -0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0E, -0x1C, 0x1C, 0x1C, 0x1C, 0xFF, 0xFF, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, -0x38, 0x38, 0x1E, 0x0F, 0x03, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE7, 0xFF, 0x3F, 0x0F, 0x0F, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, -0x3F, 0xFF, 0xE7, 0x07, 0x07, 0x0E, 0x0E, 0x3C, -0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x3B, 0x3E, -0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF8, 0xFE, 0x1E, 0x0F, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, -0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0xF0, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x39, 0x3B, 0x3F, 0x3F, 0x3D, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x38, 0x70, 0xE0, 0xC0, -0x80, 0x80, 0xC0, 0xE0, 0xF0, 0x70, 0x78, 0x3C, -0x1E, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x3B, 0x3E, -0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0xFC, 0x3D, 0x1F, 0x0E, 0x0E, -0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, -0xFF, 0x8F, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, -0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x39, 0x3B, 0x3E, 0x3C, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, -0x1E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, -0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, -0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -0x07, 0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, -0x3F, 0x3F, 0x3C, 0x3C, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x3C, 0x3C, 0x3F, 0x3F, 0x39, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, -0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, -0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE7, 0xFF, 0x3F, 0x0F, 0x0F, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0F, -0x3F, 0xFF, 0xE7, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x3B, 0x3E, -0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, -0x3F, 0x38, 0x70, 0x70, 0x70, 0x38, 0x3F, 0x0F, -0x00, 0x00, 0x70, 0x70, 0x38, 0x3F, 0x0F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xE0, 0xF8, 0x38, 0x1C, -0x00, 0x00, 0x00, 0xF0, 0xFC, 0x1C, 0x0E, 0x0E, -0x0E, 0x1C, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0xFF, 0xFF, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x0E, 0x0F, -0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3C, -0x1E, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x0F, 0x1F, 0xF7, 0xE7, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xE0, 0xE0, 0xE0, 0x70, 0x70, 0x38, -0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0F, 0x07, 0x07, -0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, -0x0E, 0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x70, 0x70, -0xE0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0x70, -0x70, 0x38, 0x38, 0x38, 0x1D, 0x1D, 0x1D, 0x0F, -0x0F, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x7C, 0x7C, 0xEE, 0xEE, -0xEE, 0xC7, 0xC7, 0xC7, 0x83, 0x83, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, -0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x70, 0x70, -0x70, 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE0, 0xF0, 0x78, 0x3C, 0x1C, -0x1E, 0x0F, 0x07, 0x07, 0x0F, 0x1E, 0x1C, 0x3C, -0x78, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0E, 0x1E, 0x3C, 0x78, 0x70, 0xF0, 0xE0, 0xC0, -0xC0, 0xE0, 0xF0, 0x70, 0x78, 0x3C, 0x1E, 0x0E, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, -0x70, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, -0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0E, 0x0E, -0x1C, 0x3C, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x1C, 0x1C, 0x38, -0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0x7F, 0x7F, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, -0x07, 0x0F, 0x1E, 0x3C, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0x3C, -0x78, 0xF0, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, -0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x07, 0x07, 0x0F, 0x0E, 0x0E, 0x0E, -0x0E, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0x38, 0x1C, -0x0C, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x07, -0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x78, 0x7E, 0x1E, 0x0F, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, -0x07, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1E, 0x7E, -0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0xC0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3C, 0x38, 0x38, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x81, 0xC1, 0xF3, 0x3F, 0x1F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1E, 0x3C, -0x38, 0x38, 0x70, 0x70, 0xFF, 0xFF, 0x70, 0x70, -0x70, 0xFF, 0xFF, 0x70, 0x70, 0x38, 0x38, 0x3C, -0x1E, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0xF8, 0x1C, 0x0E, 0x0E, 0x07, 0x07, -0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1C, 0xF8, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x04, 0x08, 0x10, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, -0x04, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, -0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, -0x00, 0x08, 0x08, 0x08, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, 0x1C, -0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x3D, -0x1D, 0x1F, 0x0F, 0x03, 0x06, 0x06, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, -0x18, 0xF8, 0xFE, 0x3F, 0x67, 0x67, 0x60, 0xC0, -0xC0, 0xC0, 0xC0, 0x80, 0x87, 0x87, 0x1F, 0xFE, -0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0F, 0x1E, -0x1C, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1C, 0x7F, -0x7F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0E, 0x0D, -0x1F, 0x3F, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xF8, 0xFC, 0x1E, 0x0E, 0x07, 0x07, -0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0x3F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x08, 0x1D, 0x0F, 0x0E, -0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x0E, 0x0F, -0x1D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x04, 0xEE, 0xFC, 0x1C, 0x0C, 0x06, 0x06, -0x06, 0x06, 0x0C, 0x1C, 0xFC, 0xEE, 0x04, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x60, 0x70, 0x30, 0x38, 0x18, 0x1C, -0x0C, 0x0E, 0x06, 0x07, 0x03, 0x3F, 0x3F, 0x01, -0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, -0x38, 0x30, 0xFF, 0xFF, 0xE0, 0xC0, 0xC0, 0xFF, -0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -0x07, 0x0E, 0x0E, 0x0E, 0x0F, 0x07, 0x03, 0x07, -0x0E, 0x1C, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1E, -0x0F, 0x07, 0x01, 0x00, 0x00, 0x1C, 0x1C, 0x0C, -0x0E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE0, 0xF8, 0x1C, 0x0C, 0x0E, -0x0E, 0x00, 0x80, 0xE0, 0xF8, 0x7C, 0x1E, 0x0E, -0x07, 0x07, 0x07, 0x07, 0x0E, 0x9C, 0xF8, 0xF0, -0x78, 0x3C, 0x1C, 0x1C, 0x1C, 0x38, 0xF0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x39, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x07, 0x0E, 0x1C, 0x18, 0x30, 0x30, 0x20, -0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30, 0x30, -0x18, 0x1C, 0x0E, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x81, 0x00, -0x00, 0x00, 0x3E, 0x7F, 0xE3, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xE3, 0x7F, 0x3E, 0x00, 0x00, 0x00, -0x81, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0xE0, 0x70, 0x38, 0x18, 0x0C, -0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, -0x0C, 0x0C, 0x18, 0x38, 0x70, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, -0x38, 0x03, 0x1F, 0x3C, 0x30, 0x31, 0x3F, 0x1E, -0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x00, 0x00, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0x60, 0x70, -0x38, 0x1C, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0E, -0x1C, 0x38, 0x70, 0x60, 0x70, 0x38, 0x1C, 0x0E, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x3F, 0x3F, 0x3F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x07, 0x0E, 0x1C, 0x18, 0x30, 0x30, -0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x30, -0x30, 0x18, 0x1C, 0x0E, 0x07, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x81, -0x00, 0x00, 0x00, 0xFE, 0xFE, 0xC3, 0xC3, 0xC3, -0xFE, 0xFF, 0xC3, 0xC3, 0xC3, 0xC3, 0x00, 0x00, -0x00, 0x81, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0xE0, 0x70, 0x38, 0x18, -0x0C, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, -0x04, 0x0C, 0x0C, 0x18, 0x38, 0x70, 0xE0, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0E, 0x3F, 0x31, 0x60, 0x60, 0x60, 0x31, -0x3F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, -0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, -0xE0, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1E, 0x3F, 0x61, 0x01, 0x07, 0x1E, -0x38, 0x30, 0x60, 0x7F, 0x7F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x3F, 0x61, 0x01, -0x0F, 0x0F, 0x01, 0x01, 0x61, 0x3F, 0x1E, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1E, -0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x3C, 0x3E, 0x3F, 0x3F, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x0F, 0x1F, 0xF3, 0xE1, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, -0x1F, 0x1F, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0xCC, -0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, -0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, -0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, -0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, -0x0C, 0x18, 0x1F, 0x01, 0x01, 0x3F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0C, 0x3C, 0x3C, 0x0C, 0x0C, 0x0C, -0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x39, 0x30, -0x30, 0x30, 0x30, 0x39, 0x1F, 0x0F, 0x00, 0x00, -0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, -0xC0, 0x80, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, -0x1C, 0x0E, 0x07, 0x03, 0x01, 0x03, 0x07, 0x0E, -0x1C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x0E, 0x07, -0x83, 0x81, 0x83, 0x07, 0x0E, 0x1C, 0x38, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1E, 0x1E, -0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, -0x07, 0x06, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x03, 0x07, 0x06, 0x0E, 0x1C, 0x18, 0x38, 0x70, -0x60, 0xE0, 0xC0, 0x81, 0x83, 0x03, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, -0x70, 0x60, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0xD8, 0xD8, -0x98, 0x18, 0xFC, 0xFC, 0x18, 0x18, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x06, 0x1E, 0x1E, 0x06, -0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, -0x06, 0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, -0x07, 0x06, 0x0E, 0x1C, 0x18, 0x38, 0x71, 0x63, -0xE3, 0xC0, 0x80, 0x81, 0x01, 0x03, 0x03, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, -0x60, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0xF8, 0x0C, 0x0C, 0x38, 0xF0, -0xC0, 0x80, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0F, 0x1F, 0x30, 0x00, 0x07, -0x07, 0x00, 0x00, 0x30, 0x1F, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x07, 0x06, -0x0E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xC0, 0xC0, 0x81, 0x81, 0xC3, 0xC7, -0xC6, 0x8E, 0x1C, 0x18, 0x38, 0x70, 0x60, 0xE0, -0xC0, 0x81, 0x83, 0x03, 0x03, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x60, -0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 0x38, 0x78, 0xD8, 0xD8, 0x98, 0x18, -0xFC, 0xFC, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, -0x01, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x3C, 0x38, -0x70, 0x70, 0x70, 0x70, 0x38, 0x3C, 0x1F, 0x0F, -0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x07, 0x0E, 0x1E, 0xFC, 0xF8, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0E, -0x0F, 0x1F, 0x1F, 0x3C, 0x38, 0x38, 0x78, 0x70, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF0, 0x78, 0x1C, 0x04, 0x00, 0x00, 0x7C, 0x7C, -0xFE, 0xFE, 0xEE, 0xEF, 0xC7, 0xC7, 0xC7, 0x83, -0x83, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, -0xE0, 0xE0, 0xE0, 0xF0, 0xF0, 0x78, 0x38, 0x38, -0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x03, 0x03, 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0F, -0x1F, 0x1F, 0x3C, 0x38, 0x38, 0x78, 0x70, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, -0x3C, 0x70, 0x40, 0x00, 0x00, 0x7C, 0x7C, 0xFE, -0xFE, 0xEE, 0xEF, 0xC7, 0xC7, 0xC7, 0x83, 0x83, -0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, -0xE0, 0xE0, 0xF0, 0xF0, 0x78, 0x38, 0x38, 0x3C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, -0x03, 0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0F, 0x1F, -0x1F, 0x3C, 0x38, 0x38, 0x78, 0x70, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7C, -0xEE, 0x82, 0x00, 0x00, 0x7C, 0x7C, 0xFE, 0xFE, -0xEE, 0xEF, 0xC7, 0xC7, 0xC7, 0x83, 0x83, 0x01, -0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, -0xE0, 0xF0, 0xF0, 0x78, 0x38, 0x38, 0x3C, 0x1C, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, -0x07, 0x07, 0x07, 0x0F, 0x0E, 0x0F, 0x1F, 0x1F, -0x3C, 0x38, 0x38, 0x78, 0x70, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF9, 0x3F, -0x1F, 0x00, 0x00, 0x7C, 0x7C, 0xFE, 0xFE, 0xEE, -0xEF, 0xC7, 0xC7, 0xC7, 0x83, 0x83, 0x01, 0x01, -0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, -0xF0, 0xF0, 0x78, 0x38, 0x38, 0x3C, 0x1C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, -0x07, 0x07, 0x0F, 0x0E, 0x0F, 0x1F, 0x1F, 0x3C, -0x38, 0x38, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x83, 0x83, 0x83, 0x00, -0x00, 0x00, 0x7C, 0x7C, 0xFE, 0xFE, 0xEE, 0xEF, -0xC7, 0xC7, 0xC7, 0x83, 0x83, 0x01, 0x01, 0x01, -0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, -0xF0, 0x78, 0x38, 0x38, 0x3C, 0x1C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, -0x07, 0x0F, 0x0E, 0x0F, 0x1F, 0x1F, 0x3C, 0x38, -0x38, 0x78, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x7C, 0xC6, 0xC6, 0xC6, -0x7C, 0x7C, 0x7C, 0xFE, 0xFE, 0xEE, 0xEF, 0xC7, -0xC7, 0xC7, 0x83, 0x83, 0x01, 0x01, 0x01, 0x00, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xF0, 0xF0, -0x78, 0x38, 0x38, 0x3C, 0x1C, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, -0x07, 0x07, 0x0F, 0x0F, 0x1F, 0x1C, 0x38, 0x38, -0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x1F, 0x1F, 0x3F, 0x3F, 0x73, 0x73, 0xE3, -0xE3, 0xC3, 0xC3, 0x83, 0x83, 0x03, 0x03, 0xFF, -0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0xFF, -0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, -0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1C, -0x1E, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xFF, 0xFF, 0x3F, 0x0C, 0x0E, 0x0F, 0x03, 0x23, -0x3F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xE0, 0xF0, 0xF8, 0x3C, 0x1E, 0x0E, -0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0E, 0x0E, 0x1E, 0x3C, 0xF8, 0xF0, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, -0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, -0x1F, 0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x78, 0x1C, -0x04, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, -0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x38, 0x20, -0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, -0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, -0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE7, 0x81, 0x00, -0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, -0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, -0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, -0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xC3, 0xC3, 0xC3, 0x00, 0x00, 0x00, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0x80, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF8, 0x3C, 0x0E, 0x02, -0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0F, 0x1E, 0x38, 0x20, 0x00, 0x00, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x3E, -0x77, 0x41, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, -0x1F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x7F, 0x7F, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, -0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0xF0, 0x78, 0x38, 0x38, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, -0x38, 0x78, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x03, 0x00, 0x00, 0x1E, 0x1F, 0x1F, -0x1F, 0x1F, 0x1D, 0x1D, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x9F, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, -0xE0, 0xF0, 0x70, 0x78, 0x3C, 0x1C, 0x1E, 0x0F, -0x07, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x60, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x9C, 0xDC, -0xDC, 0xFC, 0xFC, 0x7C, 0x7C, 0x3C, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x0F, 0x1E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x1C, 0x1C, 0x1E, 0x0F, 0x07, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xF8, 0x3C, 0x0E, 0x02, 0x00, -0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1E, -0x3C, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, -0x1C, 0x1E, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1C, 0x10, 0x00, 0x00, 0x3F, 0xFF, 0xFF, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0x3C, 0x1E, -0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x0E, 0x0E, 0x1E, 0x3C, 0xF8, 0xF0, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x0F, 0x1E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x1C, 0x1C, 0x1E, 0x0F, 0x07, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1E, 0x3F, 0x73, 0x40, 0x00, -0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0xE0, -0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1E, -0x3C, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x00, 0x01, 0x03, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, -0x1C, 0x1E, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, -0xFC, 0xCF, 0x87, 0x00, 0x00, 0x3F, 0xFF, 0xFF, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x60, 0xE0, 0xC0, 0x80, -0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF8, 0x3C, 0x1E, -0x0E, 0x0E, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x0E, 0x0E, 0x1E, 0x3C, 0xF8, 0xF0, 0xE0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x0F, 0x1E, 0x1C, 0x1C, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x1C, 0x1C, 0x1E, 0x0F, 0x07, -0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, -0x00, 0x3F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF0, 0xF8, 0x3C, 0x1E, 0x0E, 0x0E, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x0E, 0x0E, 0x1E, -0x3C, 0xF8, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x60, 0x70, 0x78, 0x3C, 0x1E, 0x0F, -0x07, 0x03, 0x01, 0x01, 0x01, 0x03, 0x07, 0x0F, -0x1E, 0x3C, 0x78, 0x70, 0x60, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x07, 0x0F, 0x1E, 0xBC, 0xF8, 0xF0, -0xF0, 0xF0, 0xF8, 0xBC, 0x1E, 0x0F, 0x07, 0x03, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x07, 0x07, 0x0F, 0x1E, 0x1C, 0x1C, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x1C, 0x1D, -0x1F, 0x0F, 0x0F, 0x1F, 0x39, 0x70, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xC0, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x0E, 0x0C, -0x1C, 0x38, 0x70, 0xE0, 0xC0, 0x80, 0x00, 0xC0, -0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x03, 0xE7, 0xFE, 0xFC, 0x3C, 0x7E, 0xEE, -0xCE, 0x87, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x0E, 0x0E, 0x1E, 0x3C, 0xF8, 0xF0, 0xE0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x0E, 0x0F, 0x07, -0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF0, 0x78, 0x1C, 0x04, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, -0xF0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1E, 0x0E, 0x0F, 0x07, 0x03, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0F, 0x1E, 0x38, 0x20, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0xF0, -0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1E, 0x0E, 0x0F, 0x07, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x3C, 0x7E, 0xE7, 0x81, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0xF0, 0xE0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, -0x1C, 0x1E, 0x0E, 0x0F, 0x07, 0x03, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, -0xC3, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x81, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x78, 0x70, 0xF0, 0xE0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, -0x78, 0x3C, 0x1E, 0x0E, 0x0F, 0x07, 0x03, 0x01, -0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3C, -0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x83, 0xC7, 0xC7, 0xEF, 0xFE, 0x7C, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x3C, 0x78, 0xF0, 0xE0, 0xE0, 0xC0, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, 0x1C, 0x1C, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1F, 0x1F, 0x1F, -0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, -0xE0, 0xF0, 0x70, 0x70, 0x70, 0xF0, 0xE0, 0xE0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, -0x1C, 0x3C, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x39, 0x39, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, 0x07, 0x03, -0x03, 0x07, 0x07, 0x1F, 0xFE, 0xFF, 0x0F, 0x03, -0x03, 0x01, 0x01, 0x01, 0x03, 0x03, 0x0F, 0xFF, -0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, -0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x1F, 0x1C, 0x38, 0x00, -0x00, 0x07, 0x1F, 0x3C, 0x38, 0x70, 0x70, 0x70, -0x38, 0x3F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, -0xF8, 0xFE, 0x0E, 0x07, 0x07, 0x0F, 0xFF, 0xF7, -0x07, 0x07, 0x07, 0x07, 0x0F, 0x1F, 0xFB, 0xE1, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, -0x00, 0x00, 0x07, 0x1F, 0x1C, 0x38, 0x00, 0x00, -0x07, 0x1F, 0x3C, 0x38, 0x70, 0x70, 0x70, 0x38, -0x3F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x7C, 0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xF8, -0xFE, 0x0E, 0x07, 0x07, 0x0F, 0xFF, 0xF7, 0x07, -0x07, 0x07, 0x07, 0x0F, 0x1F, 0xFB, 0xE1, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x03, 0x07, 0x04, 0x00, 0x00, -0x00, 0x07, 0x1F, 0x1C, 0x38, 0x00, 0x00, 0x07, -0x1F, 0x3C, 0x38, 0x70, 0x70, 0x70, 0x38, 0x3F, -0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF0, 0x38, 0x08, 0x00, 0x00, 0x00, 0xF8, 0xFE, -0x0E, 0x07, 0x07, 0x0F, 0xFF, 0xF7, 0x07, 0x07, -0x07, 0x07, 0x0F, 0x1F, 0xFB, 0xE1, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x0F, 0x1C, 0x18, 0x00, 0x00, 0x00, -0x07, 0x1F, 0x1C, 0x38, 0x00, 0x00, 0x07, 0x1F, -0x3C, 0x38, 0x70, 0x70, 0x70, 0x38, 0x3F, 0x0F, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xCE, -0xFC, 0x78, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x0E, -0x07, 0x07, 0x0F, 0xFF, 0xF7, 0x07, 0x07, 0x07, -0x07, 0x0F, 0x1F, 0xFB, 0xE1, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x07, -0x1F, 0x1C, 0x38, 0x00, 0x00, 0x07, 0x1F, 0x3C, -0x38, 0x70, 0x70, 0x70, 0x38, 0x3F, 0x0F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x0E, 0x07, -0x07, 0x0F, 0xFF, 0xF7, 0x07, 0x07, 0x07, 0x07, -0x0F, 0x1F, 0xFB, 0xE1, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x1C, 0x38, 0x00, 0x00, 0x07, 0x1F, 0x3C, 0x38, -0x70, 0x70, 0x70, 0x38, 0x3F, 0x0F, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0xC0, 0xE0, 0x30, 0x30, 0xE0, -0xC0, 0x00, 0x00, 0xF8, 0xFE, 0x0E, 0x07, 0x07, -0x0F, 0xFF, 0xF7, 0x07, 0x07, 0x07, 0x07, 0x0F, -0x1F, 0xFB, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x1C, -0x38, 0x00, 0x00, 0x07, 0x1F, 0x3C, 0x38, 0x70, -0x70, 0x70, 0x38, 0x3F, 0x0F, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0xF8, 0xFE, 0x0F, 0x07, 0x07, 0x0F, -0xFF, 0xF7, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x1D, -0xF9, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0xFF, 0xE3, 0x80, 0x80, 0x00, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x80, 0x80, 0xE3, 0xFF, 0x7F, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, -0xF0, 0x70, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0xF0, -0xE0, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x70, -0x70, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, -0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x01, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, -0x1F, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x07, 0x1F, 0xFE, 0xF8, 0xC0, 0xE0, -0xF0, 0x38, 0x38, 0xF0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, -0x70, 0x7F, 0x7F, 0x70, 0x70, 0x70, 0x78, 0x38, -0x3E, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, -0xF0, 0xFC, 0x3E, 0x0E, 0x0F, 0x07, 0xFF, 0xFF, -0x00, 0x00, 0x00, 0x0F, 0x0E, 0x3E, 0xFC, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x00, -0x00, 0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, -0x7F, 0x7F, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, -0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, -0xFC, 0x3E, 0x0E, 0x0F, 0x07, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0x0F, 0x0E, 0x3E, 0xFC, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x01, 0x03, 0x07, 0x04, 0x00, 0x00, -0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x7F, -0x7F, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, -0xE0, 0x70, 0x10, 0x00, 0x00, 0x00, 0xF0, 0xFC, -0x3E, 0x0E, 0x0F, 0x07, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x0F, 0x0E, 0x3E, 0xFC, 0xF0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, -0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x7F, 0x7F, -0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC, 0x3E, -0x0E, 0x0F, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x00, -0x0F, 0x0E, 0x3E, 0xFC, 0xF0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF0, 0x78, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x70, -0x40, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x7C, 0xEE, 0x82, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, -0xEE, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0x07, 0x01, 0x03, -0x07, 0x00, 0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, -0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x78, 0x38, -0x3E, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0xF0, 0xE0, 0xF0, 0x38, 0x1C, 0x0E, -0xFE, 0xFF, 0x1F, 0x07, 0x07, 0x03, 0x03, 0x03, -0x03, 0x03, 0x03, 0x07, 0x07, 0x1F, 0xFE, 0xF8, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x0F, 0x1C, 0x18, 0x00, -0x00, 0x00, 0x39, 0x3B, 0x3E, 0x3C, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x86, 0xCE, 0xFC, 0x78, 0x00, 0x00, 0x00, 0xF8, -0xFE, 0x1E, 0x0F, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00, -0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x70, -0x70, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0xF8, 0xFE, -0x1F, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, -0x03, 0x07, 0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, -0x07, 0x1F, 0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, -0x70, 0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF0, -0xC0, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, -0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -0x07, 0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0x03, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, -0x1F, 0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, -0x70, 0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0x38, -0x08, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, -0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, -0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x1F, -0x3E, 0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x86, 0xCE, 0xFC, 0x78, -0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, 0x07, -0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, -0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0E, -0x0E, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1F, 0x3E, -0x38, 0x78, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, -0x78, 0x38, 0x3E, 0x1F, 0x07, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, -0x00, 0x00, 0xF8, 0xFE, 0x1F, 0x07, 0x07, 0x03, -0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x1F, -0xFE, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, -0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, -0xE0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, -0x00, 0x00, 0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x07, 0x1F, 0x3E, 0x38, 0x78, -0x70, 0x70, 0x70, 0x71, 0x73, 0x77, 0x7E, 0x3C, -0x3E, 0x7F, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF9, 0xFF, 0x1F, 0x0F, 0x1F, 0x3B, 0x73, 0xE3, -0xC3, 0x83, 0x03, 0x07, 0x07, 0x1F, 0xFE, 0xF8, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, -0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, -0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x3C, 0x1E, -0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x80, 0xC0, 0xE0, 0x20, 0x00, 0x00, 0x00, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x0F, 0x1F, 0xF7, 0xE7, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x3C, 0x1E, 0x1F, -0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, -0xF0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x0F, 0x1F, 0xF7, 0xE7, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x03, 0x07, 0x04, 0x00, 0x00, 0x00, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x38, 0x3C, 0x1E, 0x1F, 0x07, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, -0x38, 0x08, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x07, 0x0F, 0x1F, 0xF7, 0xE7, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x0E, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x38, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x3C, 0x1E, 0x1F, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, -0x1C, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -0x0F, 0x1F, 0xF7, 0xE7, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -0x03, 0x07, 0x04, 0x00, 0x00, 0x00, 0xE0, 0xE0, -0xE0, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x1C, 0x0E, -0x0E, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, 0x0E, -0x0E, 0x1C, 0x3C, 0xF8, 0xE0, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x1C, 0x1C, -0x38, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, 0xC0, -0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -0x39, 0x3F, 0x3F, 0x3C, 0x3C, 0x38, 0x38, 0x38, -0x38, 0x38, 0x38, 0x3C, 0x3C, 0x3F, 0x3F, 0x39, -0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFE, 0x1F, -0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, -0x07, 0x07, 0x1F, 0xFE, 0xF8, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0xE0, -0xE0, 0xE0, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x1C, -0x0E, 0x0E, 0x07, 0x07, 0x03, 0x03, 0x07, 0x07, -0x0E, 0x0E, 0x1C, 0x3C, 0xF8, 0xE0, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, -0x70, 0x00, 0x00, 0x00, 0x0E, 0x0E, 0x0E, 0x1C, -0x1C, 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE0, 0xC0, -0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x4D, 0x53, 0x20, 0x53, 0x61, 0x6E, 0x73, -0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x00 - }; - #endregion - - } -} diff --git a/Users/Orvid/OForms/OForms.csproj b/Users/Orvid/OForms/OForms.csproj deleted file mode 100644 index da07f72f21..0000000000 --- a/Users/Orvid/OForms/OForms.csproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {039E2C8F-E73C-48AF-B249-FC953072D9A0} - Library - Properties - OForms - OForms - v4.7.1 - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - diff --git a/Users/Orvid/OForms/Properties/AssemblyInfo.cs b/Users/Orvid/OForms/Properties/AssemblyInfo.cs deleted file mode 100644 index 6223cb76ed..0000000000 --- a/Users/Orvid/OForms/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +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("OForms")] -[assembly: AssemblyDescription("The OForms Framework.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("OForms")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: InternalsVisibleTo("TestBed")] - -// 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("ad4cd2f6-a32e-4c8d-b36d-424df42c7abe")] - -// 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/Users/Orvid/OForms/Windows/Taskbar.cs b/Users/Orvid/OForms/Windows/Taskbar.cs deleted file mode 100644 index a7cf7176f5..0000000000 --- a/Users/Orvid/OForms/Windows/Taskbar.cs +++ /dev/null @@ -1,521 +0,0 @@ -using System; -using Orvid.Graphics; - -namespace OForms.Windows -{ - /// - /// The class that represents the Taskbar. - /// - internal class Taskbar - { - /// - /// The internal buffer of the taskbar. - /// - private Image Buffer; - /// - /// All of the windows in the taskbar. - /// - public Window[] Windows; - /// - /// The parent window manager of the taskbar. - /// - private WindowManager Manager; - /// - /// The location of the taskbar on the window manager. - /// - private Vec2 TaskbarLocation; - /// - /// The bounds of the taskbar. - /// - public BoundingBox Bounds; - /// - /// The color to clear the back of the taskbar with. - /// - public Pixel TaskbarClearColor = Colors.Coral; - /// - /// The color to outline the taskbar with. - /// - public Pixel TaskbarOutlineColor = Colors.Crimson; - /// - /// The color to draw an inactive window's back in. - /// - public Pixel WindowInactiveBackColor = Colors.Brown; - /// - /// The color to draw an inactive window's outline in. - /// - public Pixel WindowInactiveLineColor = Colors.Blue; - /// - /// The color to draw the active window's back in. - /// - public Pixel WindowActiveBackColor = Colors.Green; - /// - /// The color to draw the active window's outline in. - /// - public Pixel WindowActiveLineColor = Colors.Black; - /// - /// The color to draw the back of an over active window's back in. - /// - public Pixel WindowActiveOverBackColor = Colors.CadetBlue; - /// - /// The color to draw the back of an over inactive window's back in. - /// - public Pixel WindowInactiveOverBackColor = Colors.Chocolate; - /// - /// The color to draw the text on the taskbar in. - /// - public Pixel TaskbarTextColor = Colors.Black; - /// - /// The default width of a button for a window. - /// - private const int WindowButtonWidth = 160; - /// - /// The margin around a window button. - /// - private const int WindowButtonMargin = 1; - /// - /// The height of the taskbar. - /// - public const int TaskBarHeight = 20; - /// - /// The maximum width for the text on a window button. - /// - public const int MaxTextWidth = WindowButtonWidth - 6; - /// - /// The bounds of all of the window buttons. - /// - internal BoundingBox[] WindowButtonBounds; - /// - /// The index of the button that the mouse is over. - /// - internal int overButtonIndx = 0; - /// - /// True if the over button has been drawn. - /// - private bool DrawnOverButton = false; - /// - /// True if the taskbar needs to be re-drawn. - /// - internal bool Modified = true; - /// - /// True if the mouse was over a window button. - /// - internal bool WasOverButton = false; - /// - /// True if the taskbar has been drawn since it was modified. - /// - private bool Drawn = false; - - - /// - /// The default constructor - /// - /// The parent window manager. - public Taskbar(WindowManager mangr) - { - this.Windows = new Window[0]; - this.Manager = mangr; - this.Bounds = new BoundingBox(0, mangr.Size.X, mangr.Size.Y, mangr.Size.Y - TaskBarHeight); - this.Buffer = new Image(mangr.Size.X, WindowManager.TaskBarHeight + 1); - this.Buffer.Clear(TaskbarClearColor); - this.WindowButtonBounds = new BoundingBox[0]; - this.TaskbarLocation = new Vec2(0, Manager.Size.Y - TaskBarHeight); - } - - /// - /// Adds the specified window to the taskbar. - /// - /// The window to add. - public void AddWindow(Window w) - { - Window[] tmp = new Window[Windows.Length + 1]; - Array.Copy(Windows, tmp, Windows.Length); - tmp[tmp.Length - 1] = w; - Windows = tmp; - Modified = true; - Drawn = false; - } - - /// - /// Removes the specified window from the taskbar. - /// - /// The window to remove. - public void RemoveWindow(Window w) - { - uint i; - for (i = 0; i < Windows.Length; i++) - { - if (Windows[i] == w) - { - break; - } - } - Window[] tmp = new Window[Windows.Length - 1]; - Array.Copy(Windows, tmp, i); - Array.Copy(Windows, i + 1, tmp, i, Windows.Length - i - 1); - Windows = tmp; - Modified = true; - Drawn = false; - } - - /// - /// Redraws the Buffer. - /// - private void RedrawBuffer() - { - WindowButtonBounds = new BoundingBox[Windows.Length]; - Buffer.Clear(TaskbarClearColor); - int loc = 20; - if (Windows.Length * (WindowButtonWidth + (2 * WindowButtonMargin)) < Manager.Size.X - 20) - { - #region No Dynamic Size - Vec2 tl; - Vec2 tr; - Vec2 br; - Vec2 bl; - Window w; - for (uint ind = 0; ind < Windows.Length; ind++) - { - w = Windows[ind]; - - tl = new Vec2( - loc + WindowButtonMargin, - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)) - ); - tr = new Vec2( - loc + WindowButtonMargin + WindowButtonWidth, - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)) - ); - br = new Vec2( - loc + WindowButtonMargin + WindowButtonWidth, - (TaskBarHeight - 2 - WindowButtonMargin) - ); - bl = new Vec2( - loc + WindowButtonMargin, - (TaskBarHeight - 2 - WindowButtonMargin) - ); - - WindowButtonBounds[ind] = new BoundingBox( - loc + WindowButtonMargin, - loc + WindowButtonMargin + WindowButtonWidth, - Manager.Size.Y - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)), - Manager.Size.Y - (TaskBarHeight - 2 - WindowButtonMargin) - ); - - if (w.IsActiveWindow && w.CurrentState != WindowState.Minimized) - { - Buffer.DrawRectangle(tl, br, WindowActiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowActiveLineColor); - } - else - { - Buffer.DrawRectangle(tl, br, WindowInactiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowInactiveLineColor); - } - - DrawWindowName(WindowButtonBounds[ind], w); - - loc += WindowButtonMargin + WindowButtonMargin + WindowButtonWidth; - } - #endregion - } - else - { - #region Dynamic Size - uint len = (uint)Manager.Size.X - 20; - int ButtonWidth = (int)Math.Floor((double)((len / Windows.Length) - 2)); - if (ButtonWidth > 5) - { - Vec2 tl; - Vec2 tr; - Vec2 br; - Vec2 bl; - Window w; - for (uint ind = 0; ind < Windows.Length; ind++) - { - w = Windows[ind]; - - tl = new Vec2( - loc + WindowButtonMargin, - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)) - ); - tr = new Vec2( - loc + WindowButtonMargin + ButtonWidth, - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)) - ); - br = new Vec2( - loc + WindowButtonMargin + ButtonWidth, - (TaskBarHeight - 2 - WindowButtonMargin) - ); - bl = new Vec2( - loc + WindowButtonMargin, - (TaskBarHeight - 2 - WindowButtonMargin) - ); - - WindowButtonBounds[ind] = new BoundingBox( - loc + WindowButtonMargin, - loc + WindowButtonMargin + ButtonWidth, - Manager.Size.Y - (TaskBarHeight - (TaskBarHeight - 2 - WindowButtonMargin)), - Manager.Size.Y - (TaskBarHeight - 2 - WindowButtonMargin) - ); - - if (w.IsActiveWindow && w.CurrentState != WindowState.Minimized) - { - Buffer.DrawRectangle(tl, br, WindowActiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowActiveLineColor); - } - else - { - Buffer.DrawRectangle(tl, br, WindowInactiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowInactiveLineColor); - } - - DrawWindowName(WindowButtonBounds[ind], w); - - loc += WindowButtonMargin + WindowButtonMargin + ButtonWidth; - } - } - else - { - Buffer.DrawRectangle(new Vec2(24, 4), new Vec2(Buffer.Width - 10, Buffer.Height - 4), Colors.Cyan); - } - #endregion - } - Modified = false; - Drawn = true; - } - - /// - /// Draws the window's name on the taskbar, - /// using the specified bounds. - /// - /// Bounds to use. - /// Window to draw. - private void DrawWindowName(BoundingBox bounds, Window w) - { - BoundingBox bnds = bounds - TaskbarLocation; - //throw new Exception(); - //if (WindowManager.WindowFont.GetFontMetrics().StringWidth(w.Name) > bnds.Width - 6) - //{ - // // Doesn't fit on the button, need to remove some characters. - // string s = w.Name.Substring(0, w.Name.Length - 3) + "..."; - // while (WindowManager.WindowFont.GetFontMetrics().StringWidth(s) > bnds.Width - 6) - // { - // if (s.Length == 3) - // { - // s = "."; // button is to small to have a name drawn. - // break; - // } - // else - // { - // // It's 4 to make up for the 3 extra characters we add. - // s = s.Substring(0, s.Length - 4) + "..."; - // } - // } - // //throw new Exception(); - // Buffer.DrawString(new Vec2(bnds.Left + 2, bnds.Bottom + 2), s, WindowManager.WindowFont, 10, Orvid.Graphics.FontSupport.FontStyle.Normal, TaskbarTextColor); - //} - //else // Fits on button. - //{ - // Buffer.DrawString(new Vec2(bnds.Left + 2, bnds.Bottom + 2), w.Name, WindowManager.WindowFont, 10, Orvid.Graphics.FontSupport.FontStyle.Normal, TaskbarTextColor); - //} - } - - /// - /// Draws the taskbar on the specified image. - /// - /// The image to draw on. - public void Draw(Image i) - { - if (Modified) - { - RedrawBuffer(); - } - i.DrawImage(TaskbarLocation, Buffer); - Drawn = true; - } - - /// - /// Undraws the over WindowButton. - /// - /// Bounds of the window to undraw. - /// The window to undraw. - internal void UndrawOverButton(BoundingBox bounds, Window w) - { - Vec2 tl = new Vec2(bounds.Left, bounds.Bottom) - TaskbarLocation; - Vec2 tr = new Vec2(bounds.Right, bounds.Bottom) - TaskbarLocation; - Vec2 br = new Vec2(bounds.Right, bounds.Top) - TaskbarLocation; - Vec2 bl = new Vec2(bounds.Left, bounds.Top) - TaskbarLocation; - - if (w.IsActiveWindow && w.CurrentState != WindowState.Minimized) - { - Buffer.DrawRectangle(tl, br, WindowActiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowActiveLineColor); - } - else - { - Buffer.DrawRectangle(tl, br, WindowInactiveBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowInactiveLineColor); - } - - DrawWindowName(bounds, w); - - WasOverButton = false; - } - - /// - /// Draws the over WindowButton. - /// - /// The bounds of the window to draw. - /// The window to draw. - private void DrawOverButton(BoundingBox bounds, Window w) - { - Vec2 tl = new Vec2(bounds.Left, bounds.Bottom) - TaskbarLocation; - Vec2 tr = new Vec2(bounds.Right, bounds.Bottom) - TaskbarLocation; - Vec2 br = new Vec2(bounds.Right, bounds.Top) - TaskbarLocation; - Vec2 bl = new Vec2(bounds.Left, bounds.Top) - TaskbarLocation; - - if (w.IsActiveWindow && w.CurrentState != WindowState.Minimized) - { - Buffer.DrawRectangle(tl, br, WindowActiveOverBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowActiveLineColor); - } - else - { - Buffer.DrawRectangle(tl, br, WindowInactiveOverBackColor); - Buffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, WindowInactiveLineColor); - } - - DrawWindowName(bounds, w); - - WasOverButton = true; - } - - /// - /// Processes the mouse move event. - /// - /// Location of the mouse. - internal void DoMouseMove(Vec2 loc) - { - if (!Drawn) - { - RedrawBuffer(); - } - if (!WasOverButton) - { - for (int i = 0; i < Windows.Length; i++) - { - if (WindowButtonBounds[i].IsInBounds(loc)) - { - DrawOverButton(WindowButtonBounds[i], Windows[i]); - overButtonIndx = i; - return; - } - } - } - else - { - if (!WindowButtonBounds[overButtonIndx].IsInBounds(loc) || !DrawnOverButton) - { - UndrawOverButton(WindowButtonBounds[overButtonIndx], Windows[overButtonIndx]); - for (int i = 0; i < Windows.Length; i++) - { - if (WindowButtonBounds[i].IsInBounds(loc)) - { - DrawOverButton(WindowButtonBounds[i], Windows[i]); - overButtonIndx = i; - return; - } - } - overButtonIndx = 0; - DrawnOverButton = true; - return; - } - } - } - - /// - /// Processes a click event. - /// - /// The location of the mouse. - /// The buttons that are pressed. - internal void DoClick(Vec2 loc, MouseButtons buttons) - { - if (!Drawn) - { - RedrawBuffer(); - } - if (WasOverButton) - { - if (WindowButtonBounds[overButtonIndx].IsInBounds(loc)) - { - if (Windows[overButtonIndx].IsActiveWindow) - { - Manager.MinimizeWindow(Windows[overButtonIndx]); - } - else if (Windows[overButtonIndx].CurrentState == WindowState.Minimized) - { - Manager.RestoreWindow(Windows[overButtonIndx]); - } - else - { - Manager.BringWindowToFront(Windows[overButtonIndx]); - } - DrawnOverButton = false; - DoMouseMove(loc); - } - else - { - for (int i = 0; i < Windows.Length; i++) - { - if (WindowButtonBounds[i].IsInBounds(loc)) - { - DrawOverButton(WindowButtonBounds[i], Windows[i]); - overButtonIndx = i; - DrawnOverButton = false; - if (Windows[i].IsActiveWindow) - { - Manager.MinimizeWindow(Windows[i]); - } - else if (Windows[i].CurrentState == WindowState.Minimized) - { - Manager.RestoreWindow(Windows[i]); - } - else - { - Manager.BringWindowToFront(Windows[i]); - } - DoMouseMove(loc); - return; - } - } - } - } - else - { - for (int i = 0; i < Windows.Length; i++) - { - if (WindowButtonBounds[i].IsInBounds(loc)) - { - DrawOverButton(WindowButtonBounds[i], Windows[i]); - overButtonIndx = i; - DrawnOverButton = false; - if (Windows[i].IsActiveWindow) - { - Manager.MinimizeWindow(Windows[i]); - } - else if (Windows[i].CurrentState == WindowState.Minimized) - { - Manager.RestoreWindow(Windows[i]); - } - else - { - Manager.BringWindowToFront(Windows[i]); - } - DoMouseMove(loc); - return; - } - } - } - } - } -} diff --git a/Users/Orvid/OForms/Windows/Window.cs b/Users/Orvid/OForms/Windows/Window.cs deleted file mode 100644 index a664d5c741..0000000000 --- a/Users/Orvid/OForms/Windows/Window.cs +++ /dev/null @@ -1,926 +0,0 @@ -using System; -using Orvid.Graphics; -using OForms.Controls; -using System.Collections.Generic; - -namespace OForms.Windows -{ - /// - /// The class that represents a single window. - /// - public class Window : IDisposable - { - /// - /// The name of the window. - /// - public string Name; - /// - /// The parent WindowManager of this window. - /// - public WindowManager Parent; - /// - /// The location of the window. Use this internally only - /// if you are reading the location. If you are changing - /// the location, use the public Location property instead, - /// so that the bounds, get properly reset. - /// - private Vec2 iLocation; - /// - /// The location of the window. - /// - public Vec2 Location - { - get - { - return iLocation; - } - set - { - Parent.NeedToRedrawAll = true; - iLocation = value; - ComputeBounds(); - // Doesn't change the physical size, - // so buffers don't get reset. - } - } - /// - /// The minimum allowable window size in the X direction. - /// - private const int MinXWindowSize = 50; - /// - /// The minimum allowable window size in the Y direction. - /// - private const int MinYWindowSize = 40; - /// - /// The size of the window. Use this internally only - /// if you are reading the size. If you are changing - /// the size, use the public Size property instead, - /// so that the bounds, and buffers get properly reset. - /// - private Vec2 iSize; - /// - /// The size of the window. - /// - public Vec2 Size - { - get - { - return iSize; - } - set - { - Parent.NeedToRedrawAll = true; - if (value.X < MinXWindowSize) - { - value.X = MinXWindowSize; - } - if (value.Y < MinYWindowSize) - { - value.Y = MinYWindowSize; - } - iSize = value; - ComputeBounds(); - ResetBuffers(); - } - } - /// - /// The Bounds of this window. - /// - public BoundingBox Bounds; - /// - /// The BoundingBox for the window's contents. - /// - private BoundingBox ContentBounds; - /// - /// The BoundingBox for the header of the window. - /// - private BoundingBox HeaderBounds; - /// - /// The BoundingBox for the Close button. - /// - private BoundingBox CloseButtonBounds; - /// - /// The BoundingBox for the Maximize/Restore button. - /// - private BoundingBox MaxButtonBounds; - /// - /// The BoundingBox for the Minimize button. - /// - private BoundingBox MinButtonBounds; - /// - /// The height of the header. (in pixels) - /// - private const int HeaderHeight = 15; - /// - /// The thickness of the window border. (in pixels) - /// - private const int WindowBorderSize = 1; - /// - /// The overall buffer for the window. - /// - private Image WindowBuffer; - /// - /// The buffer for the content of the window. - /// - private Image ContentBuffer; - /// - /// The buffer for the header of the window. - /// - private Image HeaderBuffer; - /// - /// True if this is the currently active window. - /// - private bool isActiveWindow = false; - /// - /// True if this is the currently active window. - /// - public bool IsActiveWindow - { - get - { - return isActiveWindow; - } - set - { - if (value != isActiveWindow) - { - if (value) - { - FadingIn = true; - } - isActiveWindow = value; - } - } - } - /// - /// True if the window is in the process of being dragged. - /// - private bool IsDragging = false; - /// - /// True if the window should fade in when selected. - /// - public bool ShouldFadeIn = true; - /// - /// True if we are fading in. - /// - private bool FadingIn = false; - /// - /// The current state of the window. - /// Don't use this field, use CurrentState - /// instead. - /// - private WindowState iCurrentState = WindowState.Normal; - /// - /// The current WindowState of the window. - /// - public WindowState CurrentState - { - get - { - return iCurrentState; - } - set - { - if (iCurrentState != value) - { - if (iCurrentState == WindowState.Maximized) - { - if (value == WindowState.Minimized) - { - WasMaximized = true; - iCurrentState = value; - } - else // It means window state is normal. - { - WasMaximized = false; - this.Location = PrevLoc; - this.Size = PrevSize; - iCurrentState = value; - } - } - // Should only be set to normal from the minimized state. - else if (iCurrentState == WindowState.Minimized) - { - if (WasMaximized) - { - iCurrentState = WindowState.Maximized; - } - else - { - iCurrentState = value; - } - } - else if (iCurrentState == WindowState.Normal) - { - if (value == WindowState.Maximized) - { - PrevLoc = iLocation; - this.Location = Vec2.Zero; - PrevSize = iSize; - this.Size = new Vec2(Parent.Size.X, Parent.Size.Y - WindowManager.TaskBarHeight); - iCurrentState = WindowState.Maximized; - } - else - { - iCurrentState = value; - } - } - else - { - throw new Exception("Unknown WindowState!"); - } - ResetBuffers(); - ComputeBounds(); - } - } - } - /// - /// Location of the window before it was maximized. - /// - private Vec2 PrevLoc; - /// - /// Size of the window before it was maximized. - /// - private Vec2 PrevSize; - /// - /// True if the window was Maximized when the window got Minimized. - /// - private bool WasMaximized = false; - /// - /// True if we're currently resizing. - /// - private bool IsResizing = false; - /// - /// The size of the window when resizing started. - /// - private Vec2 InitSizeOnResizeStart; - /// - /// The location of the mouse when resizing started. - /// - private Vec2 InitResizeLocation; - /// - /// The location of the window when window dragging started. - /// - private Vec2 InitWindowLocOnDragStart; - /// - /// The location of the mouse when window dragging started. - /// - private Vec2 InitDraggingLocation; - /// - /// True if the last mouse move event had the mouse in - /// the window header. - /// - private bool WasInHeader = false; - /// - /// True if the last mouse move event had the mouse - /// over the Close button. - /// - private bool WasOverClose = false; - /// - /// True if the last mouse move event had the mouse - /// over the Maximize/Restore button. - /// - private bool WasOverMax = false; - /// - /// True if the last mouse move event had the mouse - /// over the Minimize button. - /// - private bool WasOverMin = false; - /// - /// The color to clear the ContentBuffer with when the window is inactive. - /// - public Pixel ClearInactiveColor = Colors.Brown; - /// - /// The color to clear the ContentBuffer with when the window is active. - /// - public Pixel ClearColor = Colors.Brown; - /// - /// True if the header has been drawn. - /// - private bool DrawnHeader = false; - /// - /// The controls in the window. - /// - public List Controls = new List(); - - - #region Colors - /// - /// The current background color of the Close button. - /// - private Pixel CurCloseButtonColor = Colors.Red; - /// - /// The current background color of the Maximize/Restore button. - /// - private Pixel CurMaxButtonColor = Colors.Red; - /// - /// The current background color of the Minimize button. - /// - private Pixel CurMinButtonColor = Colors.Red; - - #region Default Colors - /// - /// The default background color of the Close button. - /// - private static Pixel DefaultCloseButtonColor = Colors.Red; - /// - /// The default background color of the Maximize/Restore button. - /// - private static Pixel DefaultMaxButtonColor = Colors.Red; - /// - /// The default background color of the Minimize button. - /// - private static Pixel DefaultMinButtonColor = Colors.Red; - #endregion - - #endregion - - - /// - /// The default constructor for a window. - /// - /// The initial location of the window. - /// The size of the window. - /// The name of the window. - public Window(Vec2 loc, Vec2 size, string name) - { - iLocation = loc; - iSize = size; - Name = name; - ResetBuffers(); - ComputeBounds(); - } - - /// - /// Gets a string representing this window. - /// - /// The window as a string. - public override string ToString() - { - return this.Name; - } - - /// - /// Closes this window. - /// - public void Close() - { - Parent.CloseWindow(this); - } - - /// - /// Does the actual closing of this window. - /// - internal void DoClose() - { - foreach (Control c in Controls) - { - c.DoClosing(); - } - this.Dispose(); - } - - /// - /// Disposes of all of the resources used by this window. - /// - public void Dispose() - { - this.Bounds = null; - this.CloseButtonBounds = null; - this.ContentBounds = null; - this.ContentBuffer = null; - foreach (Control c in Controls) - { - c.DoBeforeDispose(); - c.Dispose(); - c.DoAfterDispose(); - } - this.Controls = null; - this.HeaderBounds = null; - this.HeaderBuffer = null; - this.MaxButtonBounds = null; - this.MinButtonBounds = null; - this.Parent = null; - this.WindowBuffer = null; - this.Name = null; - } - - /// - /// Resets all of the buffers, and redraws the HeaderBuffer. - /// - private void ResetBuffers() - { - WindowBuffer = new Image(iSize); - WindowBuffer.Clear(Colors.BurlyWood); - DrawnHeader = false; - - RedrawHeader(); // Draw the header. - - ContentBuffer = new Image(new Vec2(iSize.X - WindowBorderSize - WindowBorderSize, iSize.Y - HeaderHeight)); - } - - /// - /// Redraws the header. - /// - private void RedrawHeader() - { - HeaderBuffer = new Image(new Vec2(iSize.X, HeaderHeight)); - HeaderBuffer.Clear(Colors.BlueViolet); - DrawnHeader = false; - - //HeaderBuffer.DrawString(new Vec2(3, 3), Name, WindowManager.WindowFont, 10, Orvid.Graphics.FontSupport.FontStyle.Normal, Colors.Black); - - RedrawCloseButton(); - RedrawMaxRestButton(); - RedrawMinButton(); - } - - #region Draw Close Button - /// - /// Re-Draws the Close button on the HeaderBuffer. - /// - private void RedrawCloseButton() - { - Vec2 tl = new Vec2(iSize.X - HeaderHeight + 2, WindowBorderSize + 1); - Vec2 tr = new Vec2(iSize.X - WindowBorderSize - 2, WindowBorderSize + 1); - Vec2 br = new Vec2(iSize.X - WindowBorderSize - 2, HeaderHeight - 2); - Vec2 bl = new Vec2(iSize.X - HeaderHeight + 2, HeaderHeight - 2); - HeaderBuffer.DrawRectangle(tl, br, CurCloseButtonColor); - HeaderBuffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, Colors.Green); - HeaderBuffer.DrawLine(new Vec2(iSize.X - WindowBorderSize - 4, WindowBorderSize + 3), new Vec2(iSize.X - HeaderHeight + 4, HeaderHeight - 4), Colors.Green); - HeaderBuffer.DrawLine(new Vec2(iSize.X - HeaderHeight + 4, WindowBorderSize + 3), new Vec2(iSize.X - WindowBorderSize - 4, HeaderHeight - 4), Colors.Green); - DrawnHeader = false; - } - #endregion - - #region Draw Maximize/Restore Button - /// - /// Re-Draws the Maximize/Restore button on the HeaderBuffer. - /// - private void RedrawMaxRestButton() - { - Vec2 tl = new Vec2(iSize.X - (HeaderHeight + HeaderHeight - 2), WindowBorderSize + 1); - Vec2 tr = new Vec2(iSize.X - (HeaderHeight + WindowBorderSize + 2), WindowBorderSize + 1); - Vec2 br = new Vec2(iSize.X - (HeaderHeight + WindowBorderSize + 2), HeaderHeight - 2); - Vec2 bl = new Vec2(iSize.X - (HeaderHeight + HeaderHeight - 2), HeaderHeight - 2); - if (CurrentState == WindowState.Maximized) // Draw Restore Button. - { - #region Draw Restore Button - HeaderBuffer.DrawRectangle(tl, br, CurMaxButtonColor); - HeaderBuffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, Colors.Green); - HeaderBuffer.DrawLines(new Vec2[] { - new Vec2(tl.X + 4, tl.Y + 2), - new Vec2(tr.X - 2, tr.Y + 2), - new Vec2(tr.X - 2, tr.Y + 3), - new Vec2(tl.X + 4, tl.Y + 3), - new Vec2(tl.X + 4, tl.Y + 5), - new Vec2(tl.X + 2, tl.Y + 5), - new Vec2(tl.X + 2, bl.Y - 2), - new Vec2(tr.X - 4, bl.Y - 2), - new Vec2(tr.X - 4, tl.Y + 5), - new Vec2(tl.X + 4, tl.Y + 5), - new Vec2(tl.X + 4, tl.Y + 6), - new Vec2(tl.X + 2, tl.Y + 6), - new Vec2(tr.X - 4, tl.Y + 6), - new Vec2(tr.X - 4, tl.Y + 7), - new Vec2(tr.X - 2, tl.Y + 7), - new Vec2(tr.X - 2, tl.Y + 2), - }, Colors.Green); - #endregion - } - else // Draw Maximize Button. - { - #region Draw Maximize Button - HeaderBuffer.DrawRectangle(tl, br, CurMaxButtonColor); - HeaderBuffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, Colors.Green); - HeaderBuffer.DrawLines(new Vec2[] { - new Vec2(tl.X + 2, tl.Y + 2), - new Vec2(tr.X - 2, tr.Y + 2), - new Vec2(br.X - 2, br.Y - 2), - new Vec2(bl.X + 2, bl.Y - 2), - new Vec2(tl.X + 2, tl.Y + 2), - }, Colors.Green); - HeaderBuffer.DrawLine(new Vec2(tl.X + 2, tl.Y + 3), new Vec2(tr.X - 2, tr.Y + 3), Colors.Green); - #endregion - } - DrawnHeader = false; - } - #endregion - - #region Redraw Minimize Button - /// - /// Re-Draws the Minimize button on the HeaderBuffer. - /// - private void RedrawMinButton() - { - Vec2 tl = new Vec2(iSize.X - (HeaderHeight + HeaderHeight + HeaderHeight - 2), WindowBorderSize + 1); - Vec2 tr = new Vec2(iSize.X - (HeaderHeight + HeaderHeight + WindowBorderSize + 2), WindowBorderSize + 1); - Vec2 br = new Vec2(iSize.X - (HeaderHeight + HeaderHeight + WindowBorderSize + 2), HeaderHeight - 2); - Vec2 bl = new Vec2(iSize.X - (HeaderHeight + HeaderHeight + HeaderHeight - 2), HeaderHeight - 2); - HeaderBuffer.DrawRectangle(tl, br, CurMinButtonColor); - HeaderBuffer.DrawLines(new Vec2[] { tl, tr, br, bl, tl }, Colors.Green); - HeaderBuffer.DrawLine(new Vec2(br.X - 3, br.Y - 2), new Vec2(bl.X + 3, bl.Y - 2), Colors.Green); - HeaderBuffer.DrawLine(new Vec2(br.X - 3, br.Y - 3), new Vec2(bl.X + 3, bl.Y - 3), Colors.Green); - DrawnHeader = false; - } - #endregion - - /// - /// Re-Computes all of the bounding boxes. - /// - private void ComputeBounds() - { - this.Bounds = new BoundingBox( - iLocation.X, - iLocation.X + iSize.X, - iLocation.Y + iSize.Y, - iLocation.Y - ); - this.HeaderBounds = new BoundingBox( - iLocation.X, - iLocation.X + iSize.X, - iLocation.Y + HeaderHeight, - iLocation.Y - ); - this.ContentBounds = new BoundingBox( - iLocation.X + WindowBorderSize, - iLocation.X + (iSize.X - WindowBorderSize - WindowBorderSize), - iLocation.Y + (iSize.Y - HeaderHeight), - iLocation.Y + HeaderHeight - ); - - this.CloseButtonBounds = new BoundingBox( - iLocation.X + (iSize.X - HeaderHeight + 2), - iLocation.X + (iSize.X - WindowBorderSize - 2), - iLocation.Y + (HeaderHeight - 2), - iLocation.Y + (WindowBorderSize + 1) - ); - this.MaxButtonBounds = new BoundingBox( - iLocation.X + (iSize.X - (HeaderHeight + HeaderHeight - 2)), - iLocation.X + (iSize.X - (HeaderHeight + WindowBorderSize + 2)), - iLocation.Y + (HeaderHeight - 2), - iLocation.Y + (WindowBorderSize + 1) - ); - this.MinButtonBounds = new BoundingBox( - iLocation.X + (iSize.X - (HeaderHeight + HeaderHeight + HeaderHeight - 2)), - iLocation.X + (iSize.X - (HeaderHeight + HeaderHeight + WindowBorderSize + 2)), - iLocation.Y + (HeaderHeight - 2), - iLocation.Y + (WindowBorderSize + 1) - ); - } - - /// - /// Draws this window on the specified image. - /// - /// The image to draw the window to. - internal void Draw(Image i) - { - if (!DrawnHeader) - { - WindowBuffer.DrawImage(Vec2.Zero, HeaderBuffer); - WindowBuffer.DrawLine(Vec2.Zero, new Vec2(iSize.X - WindowBorderSize, 0), Colors.Black); - WindowBuffer.DrawLine(new Vec2(iSize.X - WindowBorderSize, 0), iSize - WindowBorderSize, Colors.Black); - WindowBuffer.DrawLine(new Vec2(0, iSize.Y - WindowBorderSize), Vec2.Zero, Colors.Black); - DrawnHeader = true; - } - - if (IsActiveWindow) - { - if (FadingIn) - { - ContentBuffer.Clear(new Pixel(ClearColor.R, ClearColor.G, ClearColor.B, 128)); - FadingIn = false; - } - else - { - ContentBuffer.Clear(ClearColor); - } - } - else - { - ContentBuffer.Clear(ClearInactiveColor); - } - foreach (Control c in Controls) - { - c.Draw(ContentBuffer); - } - WindowBuffer.DrawImage(new Vec2(WindowBorderSize, HeaderHeight), ContentBuffer); - WindowBuffer.DrawLine(iSize - WindowBorderSize, new Vec2(0, iSize.Y - WindowBorderSize), Colors.Black); - WindowBuffer.DrawLine(new Vec2(WindowBorderSize, HeaderHeight), new Vec2(iSize.X - WindowBorderSize - 1, HeaderHeight), new Pixel(214, 211, 206, 255)); - - i.DrawImage(iLocation, WindowBuffer); - } - - - #region Do Events - /// - /// Processes a MouseClick event. - /// - /// The location of the mouse. - /// The buttons that are pressed. - internal void DoClick(Vec2 loc, MouseButtons button) - { - if (IsActiveWindow) - { - if (ContentBounds.IsInBounds(loc)) - { - Vec2 RelativeLoc; - foreach (Control c in Controls) - { - RelativeLoc = new Vec2(loc.X - Location.X - WindowBorderSize, loc.Y - Location.Y - HeaderHeight); - if (c.Bounds.IsInBounds(RelativeLoc)) - { - c.DoClick(RelativeLoc, button); - } - } - } - else - { - if (HeaderBounds.IsInBounds(loc)) - { - if (CloseButtonBounds.IsInBounds(loc)) - { - this.Close(); - } - else if (MaxButtonBounds.IsInBounds(loc)) - { - if (CurrentState == WindowState.Maximized) - { - Parent.RestoreWindow(this); - } - else - { - Parent.MaximizeWindow(this); - } - } - else if (MinButtonBounds.IsInBounds(loc)) - { - Parent.MinimizeWindow(this); - } - } - else // Window border was clicked, and we don't care about it. - { - //throw new Exception("Unknown part of the window clicked!"); - } - } - } - else - { - Parent.BringWindowToFront(this); - } - } - - /// - /// Processes a MouseUp event. - /// - /// The location of the mouse. - /// The buttons that are still pressed down. - internal void DoMouseUp(Vec2 loc, MouseButtons button) - { - if (IsDragging) - { - IsDragging = false; - InitDraggingLocation = null; - InitWindowLocOnDragStart = null; - } - else if (IsResizing) - { - IsResizing = false; - InitResizeLocation = null; - InitSizeOnResizeStart = null; - } - else - { - Vec2 RelativeLoc; - foreach (Control c in Controls) - { - if (c.IsMouseDown) - { - RelativeLoc = new Vec2(loc.X - Location.X - WindowBorderSize, loc.Y - Location.Y - HeaderHeight); - c.IsMouseDown = false; - c.DoMouseUp(RelativeLoc, button); - } - } - } - } - - /// - /// Processes a MouseDown event. - /// - /// The location of the mouse. - /// The buttons that are down. - internal void DoMouseDown(Vec2 loc, MouseButtons button) - { - if (ContentBounds.IsInBounds(loc)) - { - Vec2 RelativeLoc; - foreach (Control c in Controls) - { - RelativeLoc = new Vec2(loc.X - Location.X - WindowBorderSize, loc.Y - Location.Y - HeaderHeight); - if (c.Bounds.IsInBounds(RelativeLoc)) - { - c.IsMouseDown = true; - c.DoMouseDown(RelativeLoc, button); - } - } - } - else - { - if (HeaderBounds.IsInBounds(loc)) - { - IsDragging = true; - InitDraggingLocation = loc; - InitWindowLocOnDragStart = this.iLocation; - } - else // The border of the window was pressed, begin resize. - { - IsResizing = true; - InitSizeOnResizeStart = this.iSize; - InitResizeLocation = loc; - } - } - } - - - - /// - /// Checks if we were over buttons, - /// and reset their colors if needed. - /// - private void CheckOldButtons() - { - if (WasOverClose) - { - CurCloseButtonColor = DefaultCloseButtonColor; - WasOverClose = false; - RedrawCloseButton(); - } - else if (WasOverMax) - { - CurMaxButtonColor = DefaultMaxButtonColor; - WasOverMax = false; - RedrawMaxRestButton(); - } - else if (WasOverMin) - { - CurMinButtonColor = DefaultMinButtonColor; - WasOverMin = false; - RedrawMinButton(); - } - } - - /// - /// Processes a MouseMove event. - /// - /// The new location of the mouse. - /// The buttons on the mouse that are pressed. - internal void DoMouseMove(Vec2 newLoc, MouseButtons button) - { - if (IsDragging) - { - Vec2 Transform = newLoc - InitDraggingLocation; - this.Location = InitWindowLocOnDragStart + Transform; - } - else if (IsResizing) - { - Vec2 Transform = newLoc - InitResizeLocation; - this.Size = InitSizeOnResizeStart + Transform; - } - else - { - if (WasInHeader) - { - if (HeaderBounds.IsInBounds(newLoc)) - { - if (CloseButtonBounds.IsInBounds(newLoc)) - { - if (!WasOverClose) - { - CheckOldButtons(); - CurCloseButtonColor = Colors.Brown; - WasOverClose = true; - RedrawCloseButton(); - return; - } - // Otherwise we've already done whats - // needed for being over the close button. - return; - } - else if (MaxButtonBounds.IsInBounds(newLoc)) - { - if (!WasOverMax) - { - CheckOldButtons(); - CurMaxButtonColor = Colors.Brown; - WasOverMax = true; - RedrawMaxRestButton(); - return; - } - // Otherwise we've already done whats - // needed for being over the maximize/restore button. - return; - } - else if (MinButtonBounds.IsInBounds(newLoc)) - { - if (!WasOverMin) - { - CheckOldButtons(); - CurMinButtonColor = Colors.Brown; - WasOverMin = true; - RedrawMinButton(); - return; - } - // Otherwise we've already done whats - // needed for being over the minimize button. - return; - } - else - { - CheckOldButtons(); - } - } - else // It's not in the header anymore. - { - CheckOldButtons(); - WasInHeader = false; - } - } - if (ContentBounds.IsInBounds(newLoc)) - { - Vec2 RelativeLoc; - foreach (Control c in Controls) - { - RelativeLoc = new Vec2(newLoc.X - Location.X - WindowBorderSize, newLoc.Y - Location.Y - HeaderHeight); - if (!c.IsIn) - { - if (c.Bounds.IsInBounds(RelativeLoc)) - { - c.IsIn = true; - c.DoMouseEnter(RelativeLoc, button); - } - } - else - { - if (!c.Bounds.IsInBounds(RelativeLoc)) - { - c.IsIn = false; - c.DoMouseLeave(RelativeLoc, button); - } - } - } - } - else if (HeaderBounds.IsInBounds(newLoc)) - { - WasInHeader = true; - if (CloseButtonBounds.IsInBounds(newLoc)) - { - CurCloseButtonColor = Colors.Brown; - WasOverClose = true; - RedrawCloseButton(); - } - else if (MaxButtonBounds.IsInBounds(newLoc)) - { - CurMaxButtonColor = Colors.Brown; - WasOverMax = true; - RedrawMaxRestButton(); - } - else if (MinButtonBounds.IsInBounds(newLoc)) - { - CurMinButtonColor = Colors.Brown; - WasOverMin = true; - RedrawMinButton(); - } - } - else // the mouse was in the window border. - { - - } - } - } - #endregion - - public static bool operator ==(Window w, Window w2) - { - if (w.Name == w2.Name && w.Size == w2.Size && w.Location == w2.Location) - { - return true; - } - return false; - } - - public static bool operator !=(Window w, Window w2) - { - return ((w == w2) == false); - } - - public override bool Equals(object obj) - { - return (this == (Window)obj); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - } -} diff --git a/Users/Orvid/OForms/Windows/WindowManager.cs b/Users/Orvid/OForms/Windows/WindowManager.cs deleted file mode 100644 index 2587b81a99..0000000000 --- a/Users/Orvid/OForms/Windows/WindowManager.cs +++ /dev/null @@ -1,379 +0,0 @@ -using System; -using Orvid.Graphics; -using System.Collections.Generic; -using Orvid.Graphics.FontSupport; - -namespace OForms.Windows -{ - /// - /// The class that represents a WindowManager. - /// - public class WindowManager - { - /// - /// The height of the taskbar. - /// - internal const int TaskBarHeight = Taskbar.TaskBarHeight; - - //internal static Font WindowFont = FontManager.Instance.LoadFont(1, new System.IO.MemoryStream(EmbeddedFiles.Fonts.Vera10_bdf)); - /// - /// The taskbar. - /// - private Taskbar Taskbar; - /// - /// The location of the mouse. - /// - public Vec2 MouseLocation = Vec2.Zero; - /// - /// The X location of the mouse. - /// - public int MouseX - { - get { return MouseLocation.X; } - } - /// - /// The Y location of the mouse. - /// - public int MouseY - { - get { return MouseLocation.Y; } - } - /// - /// Is true when all the windows need to be re-drawn, - /// in other-words, is true if a window has been moved, - /// resized, added, or removed. - /// - internal bool NeedToRedrawAll = false; - /// - /// An array containing all of the active windows - /// in the current window manager instance. - /// - public Window[] ActiveWindows; - /// - /// The currently active window. Beware, - /// there is no array bounds check. - /// - public Window ActiveWindow - { - get - { - return ActiveWindows[0]; - } - set - { - BringWindowToFront(value); - } - } - /// - /// The size of the screen. - /// - public Vec2 Size; - - /// - /// The default constructor. - /// - public WindowManager(Vec2 size) - { - ActiveWindows = new Window[0]; - this.Size = size; - this.Taskbar = new Taskbar(this); - } - - /// - /// Draws all the windows on the specified image. - /// - /// The image to draw the windows on. - public void Draw(Image i) - { - if (NeedToRedrawAll) - { - i.Clear(Colors.White); - if (ActiveWindows.Length > 0 && ActiveWindows[0].CurrentState == WindowState.Maximized) - { - ActiveWindows[0].Draw(i); - } - else - { - for (int ind = ActiveWindows.Length - 1; ind >= 0; ind--) - { - if (ActiveWindows[ind].CurrentState != WindowState.Minimized) - { - ActiveWindows[ind].Draw(i); - } - } - } - NeedToRedrawAll = false; - } - else - { - if (ActiveWindows.Length > 0) - { - if (ActiveWindows[0].CurrentState != WindowState.Minimized) - { - ActiveWindows[0].Draw(i); - } - } - } - - Taskbar.Draw(i); - } - - /// - /// Adds a window at the front. - /// - /// The window to add. - public void AddWindow(Window w) - { - InternalAddWindow(w); - Taskbar.AddWindow(w); - } - - /// - /// Adds the specified window without modifying the taskbar. - /// - /// The window to add. - private void InternalAddWindow(Window w) - { - w.Parent = this; - w.IsActiveWindow = true; - if (ActiveWindows.Length > 0) - { - ActiveWindows[0].IsActiveWindow = false; - } - Window[] tmp = new Window[ActiveWindows.Length + 1]; - Array.Copy(ActiveWindows, 0, tmp, 1, ActiveWindows.Length); - tmp[0] = w; - ActiveWindows = tmp; - NeedToRedrawAll = true; - } - - /// - /// Maximize the specified window. - /// - /// The window to maximize. - public void MaximizeWindow(Window w) - { - w.CurrentState = WindowState.Maximized; - } - - /// - /// Restore a window to the Normal state. - /// - /// The window to restore. - public void RestoreWindow(Window w) - { - w.CurrentState = WindowState.Normal; - } - - /// - /// Minimizes the specified window. - /// - /// The window to minimize. - public void MinimizeWindow(Window w) - { - if (w.IsActiveWindow) - { - this.SendWindowToBack(w); - } - w.CurrentState = WindowState.Minimized; - } - - /// - /// Sends the specified window to the back. - /// - /// The window to send to the back. - public void SendWindowToBack(Window w) - { - if (w.IsActiveWindow) - { - w.IsActiveWindow = false; - } - for (int i = 0; i < ActiveWindows.Length; i++) - { - if (ActiveWindows[i] == w) - { - RemoveWindow(i); - NeedToRedrawAll = true; - - Window[] winds = new Window[ActiveWindows.Length + 1]; - Array.Copy(ActiveWindows, winds, ActiveWindows.Length); - winds[winds.Length - 1] = w; - ActiveWindows = winds; - ActiveWindows[0].IsActiveWindow = true; - Taskbar.Modified = true; - return; - } - } - throw new Exception("Unable to find the specified window."); - } - - /// - /// Bring the specified window to the front. - /// - /// The window to move to the front. - public void BringWindowToFront(Window w) - { - if (ActiveWindows.Length > 0) - { - ActiveWindows[0].IsActiveWindow = false; - } - w.IsActiveWindow = true; - for (int i = 0; i < ActiveWindows.Length; i++) - { - if (ActiveWindows[i] == w) - { - RemoveWindow(i); - InternalAddWindow(w); - NeedToRedrawAll = true; - Taskbar.Modified = true; - return; - } - } - throw new Exception("Specified Window not found!"); - } - - /// - /// Removes the window at the specified index. - /// - /// The index of the window to remove. - private void RemoveWindow(int indx) - { - Window[] tmp = new Window[ActiveWindows.Length - 1]; - Array.Copy(ActiveWindows, tmp, indx); - Array.Copy(ActiveWindows, indx + 1, tmp, indx, ActiveWindows.Length - indx - 1); - ActiveWindows = tmp; - if (ActiveWindows.Length > 0) - { - ActiveWindows[0].IsActiveWindow = true; - } - NeedToRedrawAll = true; - } - - /// - /// Closes the specified window. - /// - /// The window to close. - public void CloseWindow(Window w) - { - for (int i = 0; i < ActiveWindows.Length; i++) - { - if (ActiveWindows[i] == w) - { - RemoveWindow(i); - NeedToRedrawAll = true; - w.DoClose(); - Taskbar.RemoveWindow(w); - return; - } - } - } - - - #region Handle Events - - #region Mouse Click - /// - /// Handles a MouseClick event. - /// - /// The location of the mouse. - /// The MouseButtons that are pressed. - /// The image to draw to. - public void HandleMouseClick(Vec2 loc, MouseButtons buttons, Image i) - { - MouseLocation = loc; - if (Taskbar.Bounds.IsInBounds(loc)) - { - Taskbar.DoClick(loc, buttons); - } - else - { - if (Taskbar.WasOverButton) - { - Taskbar.UndrawOverButton(Taskbar.WindowButtonBounds[Taskbar.overButtonIndx], Taskbar.Windows[Taskbar.overButtonIndx]); - } - foreach (Window w in ActiveWindows) - { - if (w.Bounds.IsInBounds(loc)) - { - w.DoClick(loc, OForms.MouseButtons.Left); - break; - } - } - } - this.Draw(i); - } - #endregion - - #region Mouse Move - /// - /// Processes a MouseMove event. - /// - /// The location of the mouse. - /// The buttons of the mouse that are pressed. - /// The image to draw to. - public void HandleMouseMove(Vec2 loc, MouseButtons buttons, Image i) - { - MouseLocation = loc; - if (Taskbar.Bounds.IsInBounds(loc)) - { - Taskbar.DoMouseMove(loc); - } - else - { - if (Taskbar.WasOverButton) - { - Taskbar.UndrawOverButton(Taskbar.WindowButtonBounds[Taskbar.overButtonIndx], Taskbar.Windows[Taskbar.overButtonIndx]); - } - if (ActiveWindows.Length > 0) - { - ActiveWindow.DoMouseMove(loc, buttons); - } - } - this.Draw(i); - } - #endregion - - #region Mouse Down - /// - /// Processes a MouseDown event. - /// - /// The location of the mouse. - /// The MouseButtons that are pressed. - /// The Image to draw to. - public void HandleMouseDown(Vec2 loc, MouseButtons buttons, Image i) - { - MouseLocation = loc; - if (ActiveWindows.Length > 0) - { - if (ActiveWindow.Bounds.IsInBounds(loc)) - { - ActiveWindow.DoMouseDown(loc, buttons); - this.Draw(i); - } - } - } - #endregion - - #region Mouse Up - /// - /// Processes a MouseUp event. - /// - /// The location of the mouse. - /// The MouseButtons that are still pressed. - /// The Image to draw to. - public void HandleMouseUp(Vec2 loc, MouseButtons buttons, Image i) - { - MouseLocation = loc; - if (ActiveWindows.Length > 0) - { - ActiveWindow.DoMouseUp(loc, buttons); - this.Draw(i); - } - } - #endregion - - #endregion - - - } -} diff --git a/Users/Orvid/OForms/Windows/WindowState.cs b/Users/Orvid/OForms/Windows/WindowState.cs deleted file mode 100644 index 6140cb3292..0000000000 --- a/Users/Orvid/OForms/Windows/WindowState.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace OForms.Windows -{ - /// - /// The State of a window. - /// - public enum WindowState - { - /// - /// The window is Maximized. - /// - Maximized, - /// - /// The window is Minimized. - /// - Minimized, - /// - /// The window is neither Minimized, nor Maximized. - /// - Normal, - } -} diff --git a/Users/Orvid/Orvid.Compression/BZip2.cs b/Users/Orvid/Orvid.Compression/BZip2.cs deleted file mode 100644 index 76f1bfa1d7..0000000000 --- a/Users/Orvid/Orvid.Compression/BZip2.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.IO; -using Orvid.Compression.Streams; - -namespace Orvid.Compression -{ - public static class BZip2 - { - public static byte[] Decompress(byte[] data) - { - MemoryStream ot = new MemoryStream(); - BZip2InputStream CompInStream = new BZip2InputStream(new MemoryStream(data)); - int ch = CompInStream.ReadByte(); - while (ch != -1) - { - ot.WriteByte((byte)ch); - ch = CompInStream.ReadByte(); - } - return ot.GetBuffer(); - } - - public static byte[] Compress(byte[] data, int blockSize) - { - MemoryStream strm = new MemoryStream(data); - MemoryStream ostrm = new MemoryStream(); - BZip2OutputStream bzos = new BZip2OutputStream(ostrm, blockSize); - int ch = strm.ReadByte(); - while (ch != -1) - { - bzos.WriteByte((byte)ch); - ch = strm.ReadByte(); - } - return ostrm.GetBuffer(); - } - } -} diff --git a/Users/Orvid/Orvid.Compression/Checksums/Adler32.cs b/Users/Orvid/Orvid.Compression/Checksums/Adler32.cs deleted file mode 100644 index 2752a36379..0000000000 --- a/Users/Orvid/Orvid.Compression/Checksums/Adler32.cs +++ /dev/null @@ -1,237 +0,0 @@ -// Adler32.cs - Computes Adler32 data checksum of a data stream -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -namespace Orvid.Compression.Checksums -{ - - /// - /// Computes Adler32 checksum for a stream of data. An Adler32 - /// checksum is not as reliable as a CRC32 checksum, but a lot faster to - /// compute. - /// - /// The specification for Adler32 may be found in RFC 1950. - /// ZLIB Compressed Data Format Specification version 3.3) - /// - /// - /// From that document: - /// - /// "ADLER32 (Adler-32 checksum) - /// This contains a checksum value of the uncompressed data - /// (excluding any dictionary data) computed according to Adler-32 - /// algorithm. This algorithm is a 32-bit extension and improvement - /// of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 - /// standard. - /// - /// Adler-32 is composed of two sums accumulated per byte: s1 is - /// the sum of all bytes, s2 is the sum of all s1 values. Both sums - /// are done modulo 65521. s1 is initialized to 1, s2 to zero. The - /// Adler-32 checksum is stored as s2*65536 + s1 in most- - /// significant-byte first (network) order." - /// - /// "8.2. The Adler-32 algorithm - /// - /// The Adler-32 algorithm is much faster than the CRC32 algorithm yet - /// still provides an extremely low probability of undetected errors. - /// - /// The modulo on unsigned long accumulators can be delayed for 5552 - /// bytes, so the modulo operation time is negligible. If the bytes - /// are a, b, c, the second sum is 3a + 2b + c + 3, and so is position - /// and order sensitive, unlike the first sum, which is just a - /// checksum. That 65521 is prime is important to avoid a possible - /// large class of two-byte errors that leave the check unchanged. - /// (The Fletcher checksum uses 255, which is not prime and which also - /// makes the Fletcher check insensitive to single byte changes 0 - - /// 255.) - /// - /// The sum s1 is initialized to 1 instead of zero to make the length - /// of the sequence part of s2, so that the length does not have to be - /// checked separately. (Any sequence of zeroes has a Fletcher - /// checksum of zero.)" - /// - /// - /// - public sealed class Adler32 - { - /// - /// largest prime smaller than 65536 - /// - const uint BASE = 65521; - - /// - /// Returns the Adler32 data checksum computed so far. - /// - public long Value { - get { - return checksum; - } - } - - /// - /// Creates a new instance of the Adler32 class. - /// The checksum starts off with a value of 1. - /// - public Adler32() - { - Reset(); - } - - /// - /// Resets the Adler32 checksum to the initial value. - /// - public void Reset() - { - checksum = 1; - } - - /// - /// Updates the checksum with a byte value. - /// - /// - /// The data value to add. The high byte of the int is ignored. - /// - public void Update(int value) - { - // We could make a length 1 byte array and call update again, but I - // would rather not have that overhead - uint s1 = checksum & 0xFFFF; - uint s2 = checksum >> 16; - - s1 = (s1 + ((uint)value & 0xFF)) % BASE; - s2 = (s1 + s2) % BASE; - - checksum = (s2 << 16) + s1; - } - - /// - /// Updates the checksum with an array of bytes. - /// - /// - /// The source of the data to update with. - /// - public void Update(byte[] buffer) - { - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - Update(buffer, 0, buffer.Length); - } - - /// - /// Updates the checksum with the bytes taken from the array. - /// - /// - /// an array of bytes - /// - /// - /// the start of the data used for this update - /// - /// - /// the number of bytes to use for this update - /// - public void Update(byte[] buffer, int offset, int count) - { - if (buffer == null) { - throw new ArgumentNullException("buffer"); - } - - if (offset < 0) { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("offset"); -#else - throw new ArgumentOutOfRangeException("offset", "cannot be negative"); -#endif - } - - if ( count < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", "cannot be negative"); -#endif - } - - if (offset >= buffer.Length) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("offset"); -#else - throw new ArgumentOutOfRangeException("offset", "not a valid index into buffer"); -#endif - } - - if (offset + count > buffer.Length) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", "exceeds buffer size"); -#endif - } - - //(By Per Bothner) - uint s1 = checksum & 0xFFFF; - uint s2 = checksum >> 16; - - while (count > 0) { - // We can defer the modulo operation: - // s1 maximally grows from 65521 to 65521 + 255 * 3800 - // s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31 - int n = 3800; - if (n > count) { - n = count; - } - count -= n; - while (--n >= 0) { - s1 = s1 + (uint)(buffer[offset++] & 0xff); - s2 = s2 + s1; - } - s1 %= BASE; - s2 %= BASE; - } - - checksum = (s2 << 16) | s1; - } - - #region Instance Fields - uint checksum; - #endregion - } -} diff --git a/Users/Orvid/Orvid.Compression/Checksums/CRC32.cs b/Users/Orvid/Orvid.Compression/Checksums/CRC32.cs deleted file mode 100644 index c1d2d653c8..0000000000 --- a/Users/Orvid/Orvid.Compression/Checksums/CRC32.cs +++ /dev/null @@ -1,223 +0,0 @@ -// CRC32.cs - Computes CRC32 data checksum of a data stream -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -namespace Orvid.Compression.Checksums -{ - - /// - /// Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: - /// x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - /// - /// Polynomials over GF(2) are represented in binary, one bit per coefficient, - /// with the lowest powers in the most significant bit. Then adding polynomials - /// is just exclusive-or, and multiplying a polynomial by x is a right shift by - /// one. If we call the above polynomial p, and represent a byte as the - /// polynomial q, also with the lowest power in the most significant bit (so the - /// byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - /// where a mod b means the remainder after dividing a by b. - /// - /// This calculation is done using the shift-register method of multiplying and - /// taking the remainder. The register is initialized to zero, and for each - /// incoming bit, x^32 is added mod p to the register if the bit is a one (where - /// x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - /// x (which is shifting right by one and adding x^32 mod p if the bit shifted - /// out is a one). We start with the highest power (least significant bit) of - /// q and repeat for all eight bits of q. - /// - /// The table is simply the CRC of all possible eight bit values. This is all - /// the information needed to generate CRC's on data a byte at a time for all - /// combinations of CRC register values and incoming bytes. - /// - public sealed class Crc32 - { - const uint CrcSeed = 0xFFFFFFFF; - - readonly static uint[] CrcTable = new uint[] { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, - 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, - 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, - 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, - 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, - 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, - 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, - 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, - 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, - 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, - 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, - 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, - 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, - 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, - 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, - 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, - 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, - 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, - 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, - 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, - 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, - 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, - 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, - 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, - 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, - 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, - 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, - 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, - 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, - 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, - 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, - 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, - 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, - 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, - 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, - 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, - 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, - 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, - 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, - 0x2D02EF8D - }; - - internal static uint ComputeCrc32(uint oldCrc, byte value) - { - return (uint)(Crc32.CrcTable[(oldCrc ^ value) & 0xFF] ^ (oldCrc >> 8)); - } - - /// - /// The crc data checksum so far. - /// - uint crc; - - /// - /// Returns the CRC32 data checksum computed so far. - /// - public long Value { - get { - return (long)crc; - } - set { - crc = (uint)value; - } - } - - /// - /// Resets the CRC32 data checksum as if no update was ever called. - /// - public void Reset() - { - crc = 0; - } - - /// - /// Updates the checksum with the int bval. - /// - /// - /// the byte is taken as the lower 8 bits of value - /// - public void Update(int value) - { - crc ^= CrcSeed; - crc = CrcTable[(crc ^ value) & 0xFF] ^ (crc >> 8); - crc ^= CrcSeed; - } - - /// - /// Updates the checksum with the bytes taken from the array. - /// - /// - /// buffer an array of bytes - /// - public void Update(byte[] buffer) - { - if (buffer == null) { - throw new ArgumentNullException("buffer"); - } - - Update(buffer, 0, buffer.Length); - } - - /// - /// Adds the byte array to the data checksum. - /// - /// - /// The buffer which contains the data - /// - /// - /// The offset in the buffer where the data starts - /// - /// - /// The number of data bytes to update the CRC with. - /// - public void Update(byte[] buffer, int offset, int count) - { - if (buffer == null) { - throw new ArgumentNullException("buffer"); - } - - if ( count < 0 ) { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", "Count cannot be less than zero"); -#endif - } - - if (offset < 0 || offset + count > buffer.Length) { - throw new ArgumentOutOfRangeException("offset"); - } - - crc ^= CrcSeed; - - while (--count >= 0) { - crc = CrcTable[(crc ^ buffer[offset++]) & 0xFF] ^ (crc >> 8); - } - - crc ^= CrcSeed; - } - } -} diff --git a/Users/Orvid/Orvid.Compression/Checksums/StrangeCRC.cs b/Users/Orvid/Orvid.Compression/Checksums/StrangeCRC.cs deleted file mode 100644 index 1e92bf48a4..0000000000 --- a/Users/Orvid/Orvid.Compression/Checksums/StrangeCRC.cs +++ /dev/null @@ -1,208 +0,0 @@ -// StrangeCRC.cs - computes a crc used in the bziplib -// -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -namespace Orvid.Compression.Checksums -{ - /// - /// Bzip2 checksum algorithm - /// - public class StrangeCRC - { - readonly static uint[] crc32Table = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, - 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, - 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, - 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, - 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, - 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, - 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, - 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, - 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, - 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, - 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, - 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, - 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, - 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, - 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, - 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, - 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, - 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, - 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, - 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, - 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, - 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, - 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, - 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, - 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, - 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, - 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, - 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, - 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, - 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, - 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, - 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, - 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, - 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, - 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, - 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, - 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, - 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, - 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, - 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, - 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, - 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, - 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 - }; - - int globalCrc; - - /// - /// Initialise a default instance of - /// - public StrangeCRC() - { - Reset(); - } - - /// - /// Reset the state of Crc. - /// - public void Reset() - { - globalCrc = -1; - } - - /// - /// Get the current Crc value. - /// - public long Value { - get { - return ~globalCrc; - } - } - - /// - /// Update the Crc value. - /// - /// data update is based on - public void Update(int value) - { - int temp = (globalCrc >> 24) ^ value; - if (temp < 0) { - temp = 256 + temp; - } - globalCrc = unchecked((int)((globalCrc << 8) ^ crc32Table[temp])); - } - - /// - /// Update Crc based on a block of data - /// - /// The buffer containing data to update the crc with. - public void Update(byte[] buffer) - { - if (buffer == null) { - throw new ArgumentNullException("buffer"); - } - - Update(buffer, 0, buffer.Length); - } - - /// - /// Update Crc based on a portion of a block of data - /// - /// block of data - /// index of first byte to use - /// number of bytes to use - public void Update(byte[] buffer, int offset, int count) - { - if (buffer == null) { - throw new ArgumentNullException("buffer"); - } - - if ( offset < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("offset"); -#else - throw new ArgumentOutOfRangeException("offset", "cannot be less than zero"); -#endif - } - - if ( count < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", "cannot be less than zero"); -#endif - } - - if ( offset + count > buffer.Length ) - { - throw new ArgumentOutOfRangeException("count"); - } - - for (int i = 0; i < count; ++i) { - Update(buffer[offset++]); - } - } - } -} diff --git a/Users/Orvid/Orvid.Compression/LZMA.cs b/Users/Orvid/Orvid.Compression/LZMA.cs deleted file mode 100644 index 67f2005981..0000000000 --- a/Users/Orvid/Orvid.Compression/LZMA.cs +++ /dev/null @@ -1,3236 +0,0 @@ -using System; -using System.IO; - -namespace Orvid.Compression -{ - public static class LZMA - { - #region Properties - static int dictionary = 1 << 23; - static bool eos = false; - static CoderPropID[] propIDs = { - CoderPropID.DictionarySize, - CoderPropID.PosStateBits, - CoderPropID.LitContextBits, - CoderPropID.LitPosBits, - CoderPropID.Algorithm, - CoderPropID.NumFastBytes, - CoderPropID.MatchFinder, - CoderPropID.EndMarker - }; - - static object[] properties = { - (Int32)(dictionary), - (Int32)(2), - (Int32)(3), - (Int32)(0), - (Int32)(2), - (Int32)(128), - "bt4", - eos - }; - #endregion - - public static byte[] Compress(byte[] inputBytes) - { - - MemoryStream inStream = new MemoryStream(inputBytes); - MemoryStream outStream = new MemoryStream(); - LZMAEncoder encoder = new LZMAEncoder(); - encoder.SetCoderProperties(propIDs, properties); - encoder.WriteCoderProperties(outStream); - long fileSize = inStream.Length; - for (int i = 0; i < 8; i++) - outStream.WriteByte((Byte)(fileSize >> (8 * i))); - encoder.Code(inStream, outStream, -1, -1, null); - return outStream.ToArray(); - } - - public static byte[] Decompress(byte[] inputBytes) - { - MemoryStream newInStream = new MemoryStream(inputBytes); - LZMADecoder decoder = new LZMADecoder(); - - newInStream.Seek(0, 0); - MemoryStream newOutStream = new MemoryStream(); - - byte[] properties2 = new byte[5]; - if (newInStream.Read(properties2, 0, 5) != 5) - throw (new Exception("input .lzma is too short")); - long outSize = 0; - for (int i = 0; i < 8; i++) - { - int v = newInStream.ReadByte(); - if (v < 0) - throw (new Exception("Can't Read 1")); - outSize |= ((long)(byte)v) << (8 * i); - } - decoder.SetDecoderProperties(properties2); - - long compressedSize = newInStream.Length - newInStream.Position; - decoder.Code(newInStream, newOutStream, compressedSize, outSize, null); - - byte[] b = newOutStream.ToArray(); - - return b; - } - - - #region LZMA - - #region LZMABase - private abstract class LZMABase - { - public const uint kNumRepDistances = 4; - public const uint kNumStates = 12; - - public struct State - { - public uint Index; - public void Init() { Index = 0; } - public void UpdateChar() - { - if (Index < 4) Index = 0; - else if (Index < 10) Index -= 3; - else Index -= 6; - } - public void UpdateMatch() { Index = (uint)(Index < 7 ? 7 : 10); } - public void UpdateRep() { Index = (uint)(Index < 7 ? 8 : 11); } - public void UpdateShortRep() { Index = (uint)(Index < 7 ? 9 : 11); } - public bool IsCharState() { return Index < 7; } - } - - public const int kNumPosSlotBits = 6; - public const int kDicLogSizeMin = 0; - - public const int kNumLenToPosStatesBits = 2; - public const uint kNumLenToPosStates = 1 << kNumLenToPosStatesBits; - - public const uint kMatchMinLen = 2; - - public static uint GetLenToPosState(uint len) - { - len -= kMatchMinLen; - if (len < kNumLenToPosStates) - return len; - return (uint)(kNumLenToPosStates - 1); - } - - public const int kNumAlignBits = 4; - public const uint kAlignTableSize = 1 << kNumAlignBits; - public const uint kAlignMask = (kAlignTableSize - 1); - - public const uint kStartPosModelIndex = 4; - public const uint kEndPosModelIndex = 14; - public const uint kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; - - public const uint kNumFullDistances = 1 << ((int)kEndPosModelIndex / 2); - - public const uint kNumLitPosStatesBitsEncodingMax = 4; - public const uint kNumLitContextBitsMax = 8; - - public const int kNumPosStatesBitsMax = 4; - public const uint kNumPosStatesMax = (1 << kNumPosStatesBitsMax); - public const int kNumPosStatesBitsEncodingMax = 4; - public const uint kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); - - public const int kNumLowLenBits = 3; - public const int kNumMidLenBits = 3; - public const int kNumHighLenBits = 8; - public const uint kNumLowLenSymbols = 1 << kNumLowLenBits; - public const uint kNumMidLenSymbols = 1 << kNumMidLenBits; - public const uint kNumLenSymbols = kNumLowLenSymbols + kNumMidLenSymbols + (1 << kNumHighLenBits); - public const uint kMatchMaxLen = kMatchMinLen + kNumLenSymbols - 1; - } - #endregion - - #region LZMADecoder - private class LZMADecoder : ICoder - { - class LenDecoder - { - LZMARangeBitDecoder m_Choice = new LZMARangeBitDecoder(); - LZMARangeBitDecoder m_Choice2 = new LZMARangeBitDecoder(); - LZMARangeBitTreeDecoder[] m_LowCoder = new LZMARangeBitTreeDecoder[LZMABase.kNumPosStatesMax]; - LZMARangeBitTreeDecoder[] m_MidCoder = new LZMARangeBitTreeDecoder[LZMABase.kNumPosStatesMax]; - LZMARangeBitTreeDecoder m_HighCoder = new LZMARangeBitTreeDecoder(LZMABase.kNumHighLenBits); - uint m_NumPosStates = 0; - - public void Create(uint numPosStates) - { - for (uint posState = m_NumPosStates; posState < numPosStates; posState++) - { - m_LowCoder[posState] = new LZMARangeBitTreeDecoder(LZMABase.kNumLowLenBits); - m_MidCoder[posState] = new LZMARangeBitTreeDecoder(LZMABase.kNumMidLenBits); - } - m_NumPosStates = numPosStates; - } - - public void Init() - { - m_Choice.Init(); - for (uint posState = 0; posState < m_NumPosStates; posState++) - { - m_LowCoder[posState].Init(); - m_MidCoder[posState].Init(); - } - m_Choice2.Init(); - m_HighCoder.Init(); - } - - public uint Decode(LZMARangeDecoder rangeDecoder, uint posState) - { - if (m_Choice.Decode(rangeDecoder) == 0) - return m_LowCoder[posState].Decode(rangeDecoder); - else - { - uint symbol = LZMABase.kNumLowLenSymbols; - if (m_Choice2.Decode(rangeDecoder) == 0) - symbol += m_MidCoder[posState].Decode(rangeDecoder); - else - { - symbol += LZMABase.kNumMidLenSymbols; - symbol += m_HighCoder.Decode(rangeDecoder); - } - return symbol; - } - } - } - - class LiteralDecoder - { - struct Decoder2 - { - LZMARangeBitDecoder[] m_Decoders; - public void Create() { m_Decoders = new LZMARangeBitDecoder[0x300]; } - public void Init() { for (int i = 0; i < 0x300; i++) m_Decoders[i].Init(); } - - public byte DecodeNormal(LZMARangeDecoder rangeDecoder) - { - uint symbol = 1; - do - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - while (symbol < 0x100); - return (byte)symbol; - } - - public byte DecodeWithMatchByte(LZMARangeDecoder rangeDecoder, byte matchByte) - { - uint symbol = 1; - do - { - uint matchBit = (uint)(matchByte >> 7) & 1; - matchByte <<= 1; - uint bit = m_Decoders[((1 + matchBit) << 8) + symbol].Decode(rangeDecoder); - symbol = (symbol << 1) | bit; - if (matchBit != bit) - { - while (symbol < 0x100) - symbol = (symbol << 1) | m_Decoders[symbol].Decode(rangeDecoder); - break; - } - } - while (symbol < 0x100); - return (byte)symbol; - } - } - - Decoder2[] m_Coders; - int m_NumPrevBits; - int m_NumPosBits; - uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && - m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Decoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - - for (uint i = 0; i < numStates; i++) - { - - m_Coders[i].Init(); - - } - } - - uint GetState(uint pos, byte prevByte) - { return ((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits)); } - - public byte DecodeNormal(LZMARangeDecoder rangeDecoder, uint pos, byte prevByte) - { return m_Coders[GetState(pos, prevByte)].DecodeNormal(rangeDecoder); } - - public byte DecodeWithMatchByte(LZMARangeDecoder rangeDecoder, uint pos, byte prevByte, byte matchByte) - { return m_Coders[GetState(pos, prevByte)].DecodeWithMatchByte(rangeDecoder, matchByte); } - }; - - LZOutWindow m_OutWindow = new LZOutWindow(); - LZMARangeDecoder m_RangeDecoder = new LZMARangeDecoder(); - - LZMARangeBitDecoder[] m_IsMatchDecoders = new LZMARangeBitDecoder[LZMABase.kNumStates << LZMABase.kNumPosStatesBitsMax]; - LZMARangeBitDecoder[] m_IsRepDecoders = new LZMARangeBitDecoder[LZMABase.kNumStates]; - LZMARangeBitDecoder[] m_IsRepG0Decoders = new LZMARangeBitDecoder[LZMABase.kNumStates]; - LZMARangeBitDecoder[] m_IsRepG1Decoders = new LZMARangeBitDecoder[LZMABase.kNumStates]; - LZMARangeBitDecoder[] m_IsRepG2Decoders = new LZMARangeBitDecoder[LZMABase.kNumStates]; - LZMARangeBitDecoder[] m_IsRep0LongDecoders = new LZMARangeBitDecoder[LZMABase.kNumStates << LZMABase.kNumPosStatesBitsMax]; - - LZMARangeBitTreeDecoder[] m_PosSlotDecoder = new LZMARangeBitTreeDecoder[LZMABase.kNumLenToPosStates]; - LZMARangeBitDecoder[] m_PosDecoders = new LZMARangeBitDecoder[LZMABase.kNumFullDistances - LZMABase.kEndPosModelIndex]; - - LZMARangeBitTreeDecoder m_PosAlignDecoder = new LZMARangeBitTreeDecoder(LZMABase.kNumAlignBits); - - LenDecoder m_LenDecoder = new LenDecoder(); - LenDecoder m_RepLenDecoder = new LenDecoder(); - - LiteralDecoder m_LiteralDecoder = new LiteralDecoder(); - - uint m_DictionarySize; - uint m_DictionarySizeCheck; - - uint m_PosStateMask; - - public LZMADecoder() - { - m_DictionarySize = 0xFFFFFFFF; - for (int i = 0; i < LZMABase.kNumLenToPosStates; i++) - m_PosSlotDecoder[i] = new LZMARangeBitTreeDecoder(LZMABase.kNumPosSlotBits); - } - - void SetDictionarySize(uint dictionarySize) - { - if (m_DictionarySize != dictionarySize) - { - m_DictionarySize = dictionarySize; - m_DictionarySizeCheck = Math.Max(m_DictionarySize, 1); - uint blockSize = Math.Max(m_DictionarySizeCheck, (1 << 12)); - m_OutWindow.Create(blockSize); - } - } - - void SetLiteralProperties(int lp, int lc) - { - if (lp > 8) - throw new Exception(); - if (lc > 8) - throw new Exception(); - m_LiteralDecoder.Create(lp, lc); - } - - void SetPosBitsProperties(int pb) - { - if (pb > LZMABase.kNumPosStatesBitsMax) - throw new Exception(); - uint numPosStates = (uint)1 << pb; - m_LenDecoder.Create(numPosStates); - m_RepLenDecoder.Create(numPosStates); - m_PosStateMask = numPosStates - 1; - } - - void Init(System.IO.Stream inStream, System.IO.Stream outStream) - { - m_RangeDecoder.Init(inStream); - m_OutWindow.Init(outStream); - - uint i; - for (i = 0; i < LZMABase.kNumStates; i++) - { - for (uint j = 0; j <= m_PosStateMask; j++) - { - uint index = (i << LZMABase.kNumPosStatesBitsMax) + j; - m_IsMatchDecoders[index].Init(); - m_IsRep0LongDecoders[index].Init(); - } - m_IsRepDecoders[i].Init(); - m_IsRepG0Decoders[i].Init(); - m_IsRepG1Decoders[i].Init(); - m_IsRepG2Decoders[i].Init(); - } - - m_LiteralDecoder.Init(); - for (i = 0; i < LZMABase.kNumLenToPosStates; i++) - m_PosSlotDecoder[i].Init(); - // m_PosSpecDecoder.Init(); - for (i = 0; i < LZMABase.kNumFullDistances - LZMABase.kEndPosModelIndex; i++) - m_PosDecoders[i].Init(); - - m_LenDecoder.Init(); - m_RepLenDecoder.Init(); - m_PosAlignDecoder.Init(); - } - - public override void Code(System.IO.Stream inStream, System.IO.Stream outStream, Int64 inSize, Int64 outSize, ICodeProgress progress) - { - Init(inStream, outStream); - - LZMABase.State state = new LZMABase.State(); - state.Init(); - uint rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; - - UInt64 nowPos64 = 0; - UInt64 outSize64 = (UInt64)outSize; - if (nowPos64 < outSize64) - { - if (m_IsMatchDecoders[state.Index << LZMABase.kNumPosStatesBitsMax].Decode(m_RangeDecoder) != 0) - throw new Exception(); - state.UpdateChar(); - byte b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, 0, 0); - m_OutWindow.PutByte(b); - nowPos64++; - } - while (nowPos64 < outSize64) - { - // UInt64 next = Math.Min(nowPos64 + (1 << 18), outSize64); - // while(nowPos64 < next) - { - uint posState = (uint)nowPos64 & m_PosStateMask; - if (m_IsMatchDecoders[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - byte b; - byte prevByte = m_OutWindow.GetByte(0); - if (!state.IsCharState()) - b = m_LiteralDecoder.DecodeWithMatchByte(m_RangeDecoder, - (uint)nowPos64, prevByte, m_OutWindow.GetByte(rep0)); - else - b = m_LiteralDecoder.DecodeNormal(m_RangeDecoder, (uint)nowPos64, prevByte); - m_OutWindow.PutByte(b); - state.UpdateChar(); - nowPos64++; - } - else - { - uint len; - if (m_IsRepDecoders[state.Index].Decode(m_RangeDecoder) == 1) - { - if (m_IsRepG0Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - if (m_IsRep0LongDecoders[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].Decode(m_RangeDecoder) == 0) - { - state.UpdateShortRep(); - m_OutWindow.PutByte(m_OutWindow.GetByte(rep0)); - nowPos64++; - continue; - } - } - else - { - UInt32 distance; - if (m_IsRepG1Decoders[state.Index].Decode(m_RangeDecoder) == 0) - { - distance = rep1; - } - else - { - if (m_IsRepG2Decoders[state.Index].Decode(m_RangeDecoder) == 0) - distance = rep2; - else - { - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - len = m_RepLenDecoder.Decode(m_RangeDecoder, posState) + LZMABase.kMatchMinLen; - state.UpdateRep(); - } - else - { - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - len = LZMABase.kMatchMinLen + m_LenDecoder.Decode(m_RangeDecoder, posState); - state.UpdateMatch(); - uint posSlot = m_PosSlotDecoder[LZMABase.GetLenToPosState(len)].Decode(m_RangeDecoder); - if (posSlot >= LZMABase.kStartPosModelIndex) - { - int numDirectBits = (int)((posSlot >> 1) - 1); - rep0 = ((2 | (posSlot & 1)) << numDirectBits); - if (posSlot < LZMABase.kEndPosModelIndex) - rep0 += LZMARangeBitTreeDecoder.ReverseDecode(m_PosDecoders, - rep0 - posSlot - 1, m_RangeDecoder, numDirectBits); - else - { - rep0 += (m_RangeDecoder.DecodeDirectBits( - numDirectBits - LZMABase.kNumAlignBits) << LZMABase.kNumAlignBits); - rep0 += m_PosAlignDecoder.ReverseDecode(m_RangeDecoder); - } - } - else - rep0 = posSlot; - } - if (rep0 >= nowPos64 || rep0 >= m_DictionarySizeCheck) - { - if (rep0 == 0xFFFFFFFF) - break; - throw new Exception(); - } - m_OutWindow.CopyBlock(rep0, len); - nowPos64 += len; - } - } - } - m_OutWindow.Flush(); - m_OutWindow.ReleaseStream(); - m_RangeDecoder.ReleaseStream(); - } - - public void SetDecoderProperties(byte[] properties) - { - if (properties.Length < 5) - throw new Exception(); - int lc = properties[0] % 9; - int remainder = properties[0] / 9; - int lp = remainder % 5; - int pb = remainder / 5; - if (pb > LZMABase.kNumPosStatesBitsMax) - throw new Exception(); - UInt32 dictionarySize = 0; - for (int i = 0; i < 4; i++) - dictionarySize += ((UInt32)(properties[1 + i])) << (i * 8); - SetDictionarySize(dictionarySize); - SetLiteralProperties(lp, lc); - SetPosBitsProperties(pb); - } - } - #endregion - - #region LZMAEncoder - private class LZMAEncoder : ICoder - { - enum EMatchFinderType - { - BT2, - BT4, - }; - - const UInt32 kIfinityPrice = 0xFFFFFFF; - - static Byte[] g_FastPos = new Byte[1 << 11]; - - static LZMAEncoder() - { - const Byte kFastSlots = 22; - int c = 2; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - for (Byte slotFast = 2; slotFast < kFastSlots; slotFast++) - { - UInt32 k = ((UInt32)1 << ((slotFast >> 1) - 1)); - for (UInt32 j = 0; j < k; j++, c++) - g_FastPos[c] = slotFast; - } - } - - static UInt32 GetPosSlot(UInt32 pos) - { - if (pos < (1 << 11)) - return g_FastPos[pos]; - if (pos < (1 << 21)) - return (UInt32)(g_FastPos[pos >> 10] + 20); - return (UInt32)(g_FastPos[pos >> 20] + 40); - } - - static UInt32 GetPosSlot2(UInt32 pos) - { - if (pos < (1 << 17)) - return (UInt32)(g_FastPos[pos >> 6] + 12); - if (pos < (1 << 27)) - return (UInt32)(g_FastPos[pos >> 16] + 32); - return (UInt32)(g_FastPos[pos >> 26] + 52); - } - - LZMABase.State _state = new LZMABase.State(); - Byte _previousByte; - UInt32[] _repDistances = new UInt32[LZMABase.kNumRepDistances]; - - void BaseInit() - { - _state.Init(); - _previousByte = 0; - for (UInt32 i = 0; i < LZMABase.kNumRepDistances; i++) - _repDistances[i] = 0; - } - - const int kDefaultDictionaryLogSize = 22; - const UInt32 kNumFastBytesDefault = 0x20; - - class LiteralEncoder - { - public struct Encoder2 - { - LZMARangeBitEncoder[] m_Encoders; - - public void Create() { m_Encoders = new LZMARangeBitEncoder[0x300]; } - - public void Init() { for (int i = 0; i < 0x300; i++) m_Encoders[i].Init(); } - - public void Encode(LZMARangeEncoder rangeEncoder, byte symbol) - { - uint context = 1; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - m_Encoders[context].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public void EncodeMatched(LZMARangeEncoder rangeEncoder, byte matchByte, byte symbol) - { - uint context = 1; - bool same = true; - for (int i = 7; i >= 0; i--) - { - uint bit = (uint)((symbol >> i) & 1); - uint state = context; - if (same) - { - uint matchBit = (uint)((matchByte >> i) & 1); - state += ((1 + matchBit) << 8); - same = (matchBit == bit); - } - m_Encoders[state].Encode(rangeEncoder, bit); - context = (context << 1) | bit; - } - } - - public uint GetPrice(bool matchMode, byte matchByte, byte symbol) - { - uint price = 0; - uint context = 1; - int i = 7; - if (matchMode) - { - for (; i >= 0; i--) - { - uint matchBit = (uint)(matchByte >> i) & 1; - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[((1 + matchBit) << 8) + context].GetPrice(bit); - context = (context << 1) | bit; - if (matchBit != bit) - { - i--; - break; - } - } - } - for (; i >= 0; i--) - { - uint bit = (uint)(symbol >> i) & 1; - price += m_Encoders[context].GetPrice(bit); - context = (context << 1) | bit; - } - return price; - } - } - - Encoder2[] m_Coders; - int m_NumPrevBits; - int m_NumPosBits; - uint m_PosMask; - - public void Create(int numPosBits, int numPrevBits) - { - if (m_Coders != null && m_NumPrevBits == numPrevBits && m_NumPosBits == numPosBits) - return; - m_NumPosBits = numPosBits; - m_PosMask = ((uint)1 << numPosBits) - 1; - m_NumPrevBits = numPrevBits; - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new Encoder2[numStates]; - for (uint i = 0; i < numStates; i++) - m_Coders[i].Create(); - } - - public void Init() - { - uint numStates = (uint)1 << (m_NumPrevBits + m_NumPosBits); - for (uint i = 0; i < numStates; i++) - m_Coders[i].Init(); - } - - public Encoder2 GetSubCoder(UInt32 pos, Byte prevByte) - { return m_Coders[((pos & m_PosMask) << m_NumPrevBits) + (uint)(prevByte >> (8 - m_NumPrevBits))]; } - } - - class LenEncoder - { - LZMARangeBitEncoder _choice = new LZMARangeBitEncoder(); - LZMARangeBitEncoder _choice2 = new LZMARangeBitEncoder(); - LZMARangeBitTreeEncoder[] _lowCoder = new LZMARangeBitTreeEncoder[LZMABase.kNumPosStatesEncodingMax]; - LZMARangeBitTreeEncoder[] _midCoder = new LZMARangeBitTreeEncoder[LZMABase.kNumPosStatesEncodingMax]; - LZMARangeBitTreeEncoder _highCoder = new LZMARangeBitTreeEncoder(LZMABase.kNumHighLenBits); - - public LenEncoder() - { - for (UInt32 posState = 0; posState < LZMABase.kNumPosStatesEncodingMax; posState++) - { - _lowCoder[posState] = new LZMARangeBitTreeEncoder(LZMABase.kNumLowLenBits); - _midCoder[posState] = new LZMARangeBitTreeEncoder(LZMABase.kNumMidLenBits); - } - } - - public void Init(UInt32 numPosStates) - { - _choice.Init(); - _choice2.Init(); - for (UInt32 posState = 0; posState < numPosStates; posState++) - { - _lowCoder[posState].Init(); - _midCoder[posState].Init(); - } - _highCoder.Init(); - } - - public void Encode(LZMARangeEncoder rangeEncoder, UInt32 symbol, UInt32 posState) - { - if (symbol < LZMABase.kNumLowLenSymbols) - { - _choice.Encode(rangeEncoder, 0); - _lowCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - symbol -= LZMABase.kNumLowLenSymbols; - _choice.Encode(rangeEncoder, 1); - if (symbol < LZMABase.kNumMidLenSymbols) - { - _choice2.Encode(rangeEncoder, 0); - _midCoder[posState].Encode(rangeEncoder, symbol); - } - else - { - _choice2.Encode(rangeEncoder, 1); - _highCoder.Encode(rangeEncoder, symbol - LZMABase.kNumMidLenSymbols); - } - } - } - - public void SetPrices(UInt32 posState, UInt32 numSymbols, UInt32[] prices, UInt32 st) - { - UInt32 a0 = _choice.GetPrice0(); - UInt32 a1 = _choice.GetPrice1(); - UInt32 b0 = a1 + _choice2.GetPrice0(); - UInt32 b1 = a1 + _choice2.GetPrice1(); - UInt32 i = 0; - for (i = 0; i < LZMABase.kNumLowLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = a0 + _lowCoder[posState].GetPrice(i); - } - for (; i < LZMABase.kNumLowLenSymbols + LZMABase.kNumMidLenSymbols; i++) - { - if (i >= numSymbols) - return; - prices[st + i] = b0 + _midCoder[posState].GetPrice(i - LZMABase.kNumLowLenSymbols); - } - for (; i < numSymbols; i++) - prices[st + i] = b1 + _highCoder.GetPrice(i - LZMABase.kNumLowLenSymbols - LZMABase.kNumMidLenSymbols); - } - }; - - const UInt32 kNumLenSpecSymbols = LZMABase.kNumLowLenSymbols + LZMABase.kNumMidLenSymbols; - - class LenPriceTableEncoder : LenEncoder - { - UInt32[] _prices = new UInt32[LZMABase.kNumLenSymbols << LZMABase.kNumPosStatesBitsEncodingMax]; - UInt32 _tableSize; - UInt32[] _counters = new UInt32[LZMABase.kNumPosStatesEncodingMax]; - - public void SetTableSize(UInt32 tableSize) { _tableSize = tableSize; } - - public UInt32 GetPrice(UInt32 symbol, UInt32 posState) - { - return _prices[posState * LZMABase.kNumLenSymbols + symbol]; - } - - void UpdateTable(UInt32 posState) - { - SetPrices(posState, _tableSize, _prices, posState * LZMABase.kNumLenSymbols); - _counters[posState] = _tableSize; - } - - public void UpdateTables(UInt32 numPosStates) - { - for (UInt32 posState = 0; posState < numPosStates; posState++) - UpdateTable(posState); - } - - public new void Encode(LZMARangeEncoder rangeEncoder, UInt32 symbol, UInt32 posState) - { - base.Encode(rangeEncoder, symbol, posState); - if (--_counters[posState] == 0) - UpdateTable(posState); - } - } - - const UInt32 kNumOpts = 1 << 12; - class Optimal - { - public LZMABase.State State; - - public bool Prev1IsChar; - public bool Prev2; - - public UInt32 PosPrev2; - public UInt32 BackPrev2; - - public UInt32 Price; - public UInt32 PosPrev; - public UInt32 BackPrev; - - public UInt32 Backs0; - public UInt32 Backs1; - public UInt32 Backs2; - public UInt32 Backs3; - - public void MakeAsChar() { BackPrev = 0xFFFFFFFF; Prev1IsChar = false; } - public void MakeAsShortRep() { BackPrev = 0; ; Prev1IsChar = false; } - public bool IsShortRep() { return (BackPrev == 0); } - }; - Optimal[] _optimum = new Optimal[kNumOpts]; - LZBinTree _matchFinder = null; - LZMARangeEncoder _rangeEncoder = new LZMARangeEncoder(); - - LZMARangeBitEncoder[] _isMatch = new LZMARangeBitEncoder[LZMABase.kNumStates << LZMABase.kNumPosStatesBitsMax]; - LZMARangeBitEncoder[] _isRep = new LZMARangeBitEncoder[LZMABase.kNumStates]; - LZMARangeBitEncoder[] _isRepG0 = new LZMARangeBitEncoder[LZMABase.kNumStates]; - LZMARangeBitEncoder[] _isRepG1 = new LZMARangeBitEncoder[LZMABase.kNumStates]; - LZMARangeBitEncoder[] _isRepG2 = new LZMARangeBitEncoder[LZMABase.kNumStates]; - LZMARangeBitEncoder[] _isRep0Long = new LZMARangeBitEncoder[LZMABase.kNumStates << LZMABase.kNumPosStatesBitsMax]; - - LZMARangeBitTreeEncoder[] _posSlotEncoder = new LZMARangeBitTreeEncoder[LZMABase.kNumLenToPosStates]; - - LZMARangeBitEncoder[] _posEncoders = new LZMARangeBitEncoder[LZMABase.kNumFullDistances - LZMABase.kEndPosModelIndex]; - LZMARangeBitTreeEncoder _posAlignEncoder = new LZMARangeBitTreeEncoder(LZMABase.kNumAlignBits); - - LenPriceTableEncoder _lenEncoder = new LenPriceTableEncoder(); - LenPriceTableEncoder _repMatchLenEncoder = new LenPriceTableEncoder(); - - LiteralEncoder _literalEncoder = new LiteralEncoder(); - - UInt32[] _matchDistances = new UInt32[LZMABase.kMatchMaxLen * 2 + 2]; - - UInt32 _numFastBytes = kNumFastBytesDefault; - UInt32 _longestMatchLength; - UInt32 _numDistancePairs; - - UInt32 _additionalOffset; - - UInt32 _optimumEndIndex; - UInt32 _optimumCurrentIndex; - - bool _longestMatchWasFound; - - UInt32[] _posSlotPrices = new UInt32[1 << (LZMABase.kNumPosSlotBits + LZMABase.kNumLenToPosStatesBits)]; - UInt32[] _distancesPrices = new UInt32[LZMABase.kNumFullDistances << LZMABase.kNumLenToPosStatesBits]; - UInt32[] _alignPrices = new UInt32[LZMABase.kAlignTableSize]; - UInt32 _alignPriceCount; - - UInt32 _distTableSize = (kDefaultDictionaryLogSize * 2); - - int _posStateBits = 2; - UInt32 _posStateMask = (4 - 1); - int _numLiteralPosStateBits = 0; - int _numLiteralContextBits = 3; - - UInt32 _dictionarySize = (1 << kDefaultDictionaryLogSize); - UInt32 _dictionarySizePrev = 0xFFFFFFFF; - UInt32 _numFastBytesPrev = 0xFFFFFFFF; - - Int64 nowPos64; - bool _finished; - System.IO.Stream _inStream; - - EMatchFinderType _matchFinderType = EMatchFinderType.BT4; - bool _writeEndMark = false; - - bool _needReleaseMFStream; - - void Create() - { - if (_matchFinder == null) - { - LZBinTree bt = new LZBinTree(); - int numHashBytes = 4; - if (_matchFinderType == EMatchFinderType.BT2) - numHashBytes = 2; - bt.SetType(numHashBytes); - _matchFinder = bt; - } - _literalEncoder.Create(_numLiteralPosStateBits, _numLiteralContextBits); - - if (_dictionarySize == _dictionarySizePrev && _numFastBytesPrev == _numFastBytes) - return; - _matchFinder.Create(_dictionarySize, kNumOpts, _numFastBytes, LZMABase.kMatchMaxLen + 1); - _dictionarySizePrev = _dictionarySize; - _numFastBytesPrev = _numFastBytes; - } - - public LZMAEncoder() - { - for (int i = 0; i < kNumOpts; i++) - _optimum[i] = new Optimal(); - for (int i = 0; i < LZMABase.kNumLenToPosStates; i++) - _posSlotEncoder[i] = new LZMARangeBitTreeEncoder(LZMABase.kNumPosSlotBits); - } - - void SetWriteEndMarkerMode(bool writeEndMarker) - { - _writeEndMark = writeEndMarker; - } - - void Init() - { - BaseInit(); - _rangeEncoder.Init(); - - uint i; - for (i = 0; i < LZMABase.kNumStates; i++) - { - for (uint j = 0; j <= _posStateMask; j++) - { - uint complexState = (i << LZMABase.kNumPosStatesBitsMax) + j; - _isMatch[complexState].Init(); - _isRep0Long[complexState].Init(); - } - _isRep[i].Init(); - _isRepG0[i].Init(); - _isRepG1[i].Init(); - _isRepG2[i].Init(); - } - _literalEncoder.Init(); - for (i = 0; i < LZMABase.kNumLenToPosStates; i++) - _posSlotEncoder[i].Init(); - for (i = 0; i < LZMABase.kNumFullDistances - LZMABase.kEndPosModelIndex; i++) - _posEncoders[i].Init(); - - _lenEncoder.Init((UInt32)1 << _posStateBits); - _repMatchLenEncoder.Init((UInt32)1 << _posStateBits); - - _posAlignEncoder.Init(); - - _longestMatchWasFound = false; - _optimumEndIndex = 0; - _optimumCurrentIndex = 0; - _additionalOffset = 0; - } - - void ReadMatchDistances(out UInt32 lenRes, out UInt32 numDistancePairs) - { - lenRes = 0; - numDistancePairs = _matchFinder.GetMatches(_matchDistances); - if (numDistancePairs > 0) - { - lenRes = _matchDistances[numDistancePairs - 2]; - if (lenRes == _numFastBytes) - lenRes += _matchFinder.GetMatchLen((int)lenRes - 1, _matchDistances[numDistancePairs - 1], - LZMABase.kMatchMaxLen - lenRes); - } - _additionalOffset++; - } - - - void MovePos(UInt32 num) - { - if (num > 0) - { - _matchFinder.Skip(num); - _additionalOffset += num; - } - } - - UInt32 GetRepLen1Price(LZMABase.State state, UInt32 posState) - { - return _isRepG0[state.Index].GetPrice0() + - _isRep0Long[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice0(); - } - - UInt32 GetPureRepPrice(UInt32 repIndex, LZMABase.State state, UInt32 posState) - { - UInt32 price; - if (repIndex == 0) - { - price = _isRepG0[state.Index].GetPrice0(); - price += _isRep0Long[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice1(); - } - else - { - price = _isRepG0[state.Index].GetPrice1(); - if (repIndex == 1) - price += _isRepG1[state.Index].GetPrice0(); - else - { - price += _isRepG1[state.Index].GetPrice1(); - price += _isRepG2[state.Index].GetPrice(repIndex - 2); - } - } - return price; - } - - UInt32 GetRepPrice(UInt32 repIndex, UInt32 len, LZMABase.State state, UInt32 posState) - { - UInt32 price = _repMatchLenEncoder.GetPrice(len - LZMABase.kMatchMinLen, posState); - return price + GetPureRepPrice(repIndex, state, posState); - } - - UInt32 GetPosLenPrice(UInt32 pos, UInt32 len, UInt32 posState) - { - UInt32 price; - UInt32 lenToPosState = LZMABase.GetLenToPosState(len); - if (pos < LZMABase.kNumFullDistances) - price = _distancesPrices[(lenToPosState * LZMABase.kNumFullDistances) + pos]; - else - price = _posSlotPrices[(lenToPosState << LZMABase.kNumPosSlotBits) + GetPosSlot2(pos)] + - _alignPrices[pos & LZMABase.kAlignMask]; - return price + _lenEncoder.GetPrice(len - LZMABase.kMatchMinLen, posState); - } - - UInt32 Backward(out UInt32 backRes, UInt32 cur) - { - _optimumEndIndex = cur; - UInt32 posMem = _optimum[cur].PosPrev; - UInt32 backMem = _optimum[cur].BackPrev; - do - { - if (_optimum[cur].Prev1IsChar) - { - _optimum[posMem].MakeAsChar(); - _optimum[posMem].PosPrev = posMem - 1; - if (_optimum[cur].Prev2) - { - _optimum[posMem - 1].Prev1IsChar = false; - _optimum[posMem - 1].PosPrev = _optimum[cur].PosPrev2; - _optimum[posMem - 1].BackPrev = _optimum[cur].BackPrev2; - } - } - UInt32 posPrev = posMem; - UInt32 backCur = backMem; - - backMem = _optimum[posPrev].BackPrev; - posMem = _optimum[posPrev].PosPrev; - - _optimum[posPrev].BackPrev = backCur; - _optimum[posPrev].PosPrev = cur; - cur = posPrev; - } - while (cur > 0); - backRes = _optimum[0].BackPrev; - _optimumCurrentIndex = _optimum[0].PosPrev; - return _optimumCurrentIndex; - } - - UInt32[] reps = new UInt32[LZMABase.kNumRepDistances]; - UInt32[] repLens = new UInt32[LZMABase.kNumRepDistances]; - - - UInt32 GetOptimum(UInt32 position, out UInt32 backRes) - { - if (_optimumEndIndex != _optimumCurrentIndex) - { - UInt32 lenRes = _optimum[_optimumCurrentIndex].PosPrev - _optimumCurrentIndex; - backRes = _optimum[_optimumCurrentIndex].BackPrev; - _optimumCurrentIndex = _optimum[_optimumCurrentIndex].PosPrev; - return lenRes; - } - _optimumCurrentIndex = _optimumEndIndex = 0; - - UInt32 lenMain, numDistancePairs; - if (!_longestMatchWasFound) - { - ReadMatchDistances(out lenMain, out numDistancePairs); - } - else - { - lenMain = _longestMatchLength; - numDistancePairs = _numDistancePairs; - _longestMatchWasFound = false; - } - - UInt32 numAvailableBytes = _matchFinder.GetNumAvailableBytes() + 1; - if (numAvailableBytes < 2) - { - backRes = 0xFFFFFFFF; - return 1; - } - if (numAvailableBytes > LZMABase.kMatchMaxLen) - numAvailableBytes = LZMABase.kMatchMaxLen; - - UInt32 repMaxIndex = 0; - UInt32 i; - for (i = 0; i < LZMABase.kNumRepDistances; i++) - { - reps[i] = _repDistances[i]; - repLens[i] = _matchFinder.GetMatchLen(0 - 1, reps[i], LZMABase.kMatchMaxLen); - if (repLens[i] > repLens[repMaxIndex]) - repMaxIndex = i; - } - if (repLens[repMaxIndex] >= _numFastBytes) - { - backRes = repMaxIndex; - UInt32 lenRes = repLens[repMaxIndex]; - MovePos(lenRes - 1); - return lenRes; - } - - if (lenMain >= _numFastBytes) - { - backRes = _matchDistances[numDistancePairs - 1] + LZMABase.kNumRepDistances; - MovePos(lenMain - 1); - return lenMain; - } - - Byte currentByte = _matchFinder.GetIndexByte(0 - 1); - Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - 1)); - - if (lenMain < 2 && currentByte != matchByte && repLens[repMaxIndex] < 2) - { - backRes = (UInt32)0xFFFFFFFF; - return 1; - } - - _optimum[0].State = _state; - - UInt32 posState = (position & _posStateMask); - - _optimum[1].Price = _isMatch[(_state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _previousByte).GetPrice(!_state.IsCharState(), matchByte, currentByte); - _optimum[1].MakeAsChar(); - - UInt32 matchPrice = _isMatch[(_state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice1(); - UInt32 repMatchPrice = matchPrice + _isRep[_state.Index].GetPrice1(); - - if (matchByte == currentByte) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(_state, posState); - if (shortRepPrice < _optimum[1].Price) - { - _optimum[1].Price = shortRepPrice; - _optimum[1].MakeAsShortRep(); - } - } - - UInt32 lenEnd = ((lenMain >= repLens[repMaxIndex]) ? lenMain : repLens[repMaxIndex]); - - if (lenEnd < 2) - { - backRes = _optimum[1].BackPrev; - return 1; - } - - _optimum[1].PosPrev = 0; - - _optimum[0].Backs0 = reps[0]; - _optimum[0].Backs1 = reps[1]; - _optimum[0].Backs2 = reps[2]; - _optimum[0].Backs3 = reps[3]; - - UInt32 len = lenEnd; - do - _optimum[len--].Price = kIfinityPrice; - while (len >= 2); - - for (i = 0; i < LZMABase.kNumRepDistances; i++) - { - UInt32 repLen = repLens[i]; - if (repLen < 2) - continue; - UInt32 price = repMatchPrice + GetPureRepPrice(i, _state, posState); - do - { - UInt32 curAndLenPrice = price + _repMatchLenEncoder.GetPrice(repLen - 2, posState); - Optimal optimum = _optimum[repLen]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = i; - optimum.Prev1IsChar = false; - } - } - while (--repLen >= 2); - } - - UInt32 normalMatchPrice = matchPrice + _isRep[_state.Index].GetPrice0(); - - len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); - if (len <= lenMain) - { - UInt32 offs = 0; - while (len > _matchDistances[offs]) - offs += 2; - for (; ; len++) - { - UInt32 distance = _matchDistances[offs + 1]; - UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(distance, len, posState); - Optimal optimum = _optimum[len]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = distance + LZMABase.kNumRepDistances; - optimum.Prev1IsChar = false; - } - if (len == _matchDistances[offs]) - { - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - - UInt32 cur = 0; - - while (true) - { - cur++; - if (cur == lenEnd) - return Backward(out backRes, cur); - UInt32 newLen; - ReadMatchDistances(out newLen, out numDistancePairs); - if (newLen >= _numFastBytes) - { - _numDistancePairs = numDistancePairs; - _longestMatchLength = newLen; - _longestMatchWasFound = true; - return Backward(out backRes, cur); - } - position++; - UInt32 posPrev = _optimum[cur].PosPrev; - LZMABase.State state; - if (_optimum[cur].Prev1IsChar) - { - posPrev--; - if (_optimum[cur].Prev2) - { - state = _optimum[_optimum[cur].PosPrev2].State; - if (_optimum[cur].BackPrev2 < LZMABase.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - else - state = _optimum[posPrev].State; - state.UpdateChar(); - } - else - state = _optimum[posPrev].State; - if (posPrev == cur - 1) - { - if (_optimum[cur].IsShortRep()) - state.UpdateShortRep(); - else - state.UpdateChar(); - } - else - { - UInt32 pos; - if (_optimum[cur].Prev1IsChar && _optimum[cur].Prev2) - { - posPrev = _optimum[cur].PosPrev2; - pos = _optimum[cur].BackPrev2; - state.UpdateRep(); - } - else - { - pos = _optimum[cur].BackPrev; - if (pos < LZMABase.kNumRepDistances) - state.UpdateRep(); - else - state.UpdateMatch(); - } - Optimal opt = _optimum[posPrev]; - if (pos < LZMABase.kNumRepDistances) - { - if (pos == 0) - { - reps[0] = opt.Backs0; - reps[1] = opt.Backs1; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 1) - { - reps[0] = opt.Backs1; - reps[1] = opt.Backs0; - reps[2] = opt.Backs2; - reps[3] = opt.Backs3; - } - else if (pos == 2) - { - reps[0] = opt.Backs2; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs3; - } - else - { - reps[0] = opt.Backs3; - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - else - { - reps[0] = (pos - LZMABase.kNumRepDistances); - reps[1] = opt.Backs0; - reps[2] = opt.Backs1; - reps[3] = opt.Backs2; - } - } - _optimum[cur].State = state; - _optimum[cur].Backs0 = reps[0]; - _optimum[cur].Backs1 = reps[1]; - _optimum[cur].Backs2 = reps[2]; - _optimum[cur].Backs3 = reps[3]; - UInt32 curPrice = _optimum[cur].Price; - - currentByte = _matchFinder.GetIndexByte(0 - 1); - matchByte = _matchFinder.GetIndexByte((Int32)(0 - reps[0] - 1 - 1)); - - posState = (position & _posStateMask); - - UInt32 curAnd1Price = curPrice + - _isMatch[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice0() + - _literalEncoder.GetSubCoder(position, _matchFinder.GetIndexByte(0 - 2)). - GetPrice(!state.IsCharState(), matchByte, currentByte); - - Optimal nextOptimum = _optimum[cur + 1]; - - bool nextIsChar = false; - if (curAnd1Price < nextOptimum.Price) - { - nextOptimum.Price = curAnd1Price; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsChar(); - nextIsChar = true; - } - - matchPrice = curPrice + _isMatch[(state.Index << LZMABase.kNumPosStatesBitsMax) + posState].GetPrice1(); - repMatchPrice = matchPrice + _isRep[state.Index].GetPrice1(); - - if (matchByte == currentByte && - !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) - { - UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(state, posState); - if (shortRepPrice <= nextOptimum.Price) - { - nextOptimum.Price = shortRepPrice; - nextOptimum.PosPrev = cur; - nextOptimum.MakeAsShortRep(); - nextIsChar = true; - } - } - - UInt32 numAvailableBytesFull = _matchFinder.GetNumAvailableBytes() + 1; - numAvailableBytesFull = Math.Min(kNumOpts - 1 - cur, numAvailableBytesFull); - numAvailableBytes = numAvailableBytesFull; - - if (numAvailableBytes < 2) - continue; - if (numAvailableBytes > _numFastBytes) - numAvailableBytes = _numFastBytes; - if (!nextIsChar && matchByte != currentByte) - { - // try Literal + rep0 - UInt32 t = Math.Min(numAvailableBytesFull - 1, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen(0, reps[0], t); - if (lenTest2 >= 2) - { - LZMABase.State state2 = state; - state2.UpdateChar(); - UInt32 posStateNext = (position + 1) & _posStateMask; - UInt32 nextRepMatchPrice = curAnd1Price + - _isMatch[(state2.Index << LZMABase.kNumPosStatesBitsMax) + posStateNext].GetPrice1() + - _isRep[state2.Index].GetPrice1(); - { - UInt32 offset = cur + 1 + lenTest2; - while (lenEnd < offset) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice( - 0, lenTest2, state2, posStateNext); - Optimal optimum = _optimum[offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = false; - } - } - } - } - - UInt32 startLen = 2; // speed optimization - - for (UInt32 repIndex = 0; repIndex < LZMABase.kNumRepDistances; repIndex++) - { - UInt32 lenTest = _matchFinder.GetMatchLen(0 - 1, reps[repIndex], numAvailableBytes); - if (lenTest < 2) - continue; - UInt32 lenTestTemp = lenTest; - do - { - while (lenEnd < cur + lenTest) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState); - Optimal optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = repIndex; - optimum.Prev1IsChar = false; - } - } - while (--lenTest >= 2); - lenTest = lenTestTemp; - - if (repIndex == 0) - startLen = lenTest + 1; - - // if (_maxMode) - if (lenTest < numAvailableBytesFull) - { - UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, reps[repIndex], t); - if (lenTest2 >= 2) - { - LZMABase.State state2 = state; - state2.UpdateRep(); - UInt32 posStateNext = (position + lenTest) & _posStateMask; - UInt32 curAndLenCharPrice = - repMatchPrice + GetRepPrice(repIndex, lenTest, state, posState) + - _isMatch[(state2.Index << LZMABase.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)).GetPrice(true, - _matchFinder.GetIndexByte((Int32)((Int32)lenTest - 1 - (Int32)(reps[repIndex] + 1))), - _matchFinder.GetIndexByte((Int32)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << LZMABase.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - // for(; lenTest2 >= 2; lenTest2--) - { - UInt32 offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - UInt32 curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - Optimal optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = repIndex; - } - } - } - } - } - - if (newLen > numAvailableBytes) - { - newLen = numAvailableBytes; - for (numDistancePairs = 0; newLen > _matchDistances[numDistancePairs]; numDistancePairs += 2) ; - _matchDistances[numDistancePairs] = newLen; - numDistancePairs += 2; - } - if (newLen >= startLen) - { - normalMatchPrice = matchPrice + _isRep[state.Index].GetPrice0(); - while (lenEnd < cur + newLen) - _optimum[++lenEnd].Price = kIfinityPrice; - - UInt32 offs = 0; - while (startLen > _matchDistances[offs]) - offs += 2; - - for (UInt32 lenTest = startLen; ; lenTest++) - { - UInt32 curBack = _matchDistances[offs + 1]; - UInt32 curAndLenPrice = normalMatchPrice + GetPosLenPrice(curBack, lenTest, posState); - Optimal optimum = _optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = curBack + LZMABase.kNumRepDistances; - optimum.Prev1IsChar = false; - } - - if (lenTest == _matchDistances[offs]) - { - if (lenTest < numAvailableBytesFull) - { - UInt32 t = Math.Min(numAvailableBytesFull - 1 - lenTest, _numFastBytes); - UInt32 lenTest2 = _matchFinder.GetMatchLen((Int32)lenTest, curBack, t); - if (lenTest2 >= 2) - { - LZMABase.State state2 = state; - state2.UpdateMatch(); - UInt32 posStateNext = (position + lenTest) & _posStateMask; - UInt32 curAndLenCharPrice = curAndLenPrice + - _isMatch[(state2.Index << LZMABase.kNumPosStatesBitsMax) + posStateNext].GetPrice0() + - _literalEncoder.GetSubCoder(position + lenTest, - _matchFinder.GetIndexByte((Int32)lenTest - 1 - 1)). - GetPrice(true, - _matchFinder.GetIndexByte((Int32)lenTest - (Int32)(curBack + 1) - 1), - _matchFinder.GetIndexByte((Int32)lenTest - 1)); - state2.UpdateChar(); - posStateNext = (position + lenTest + 1) & _posStateMask; - UInt32 nextMatchPrice = curAndLenCharPrice + _isMatch[(state2.Index << LZMABase.kNumPosStatesBitsMax) + posStateNext].GetPrice1(); - UInt32 nextRepMatchPrice = nextMatchPrice + _isRep[state2.Index].GetPrice1(); - - UInt32 offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) - _optimum[++lenEnd].Price = kIfinityPrice; - curAndLenPrice = nextRepMatchPrice + GetRepPrice(0, lenTest2, state2, posStateNext); - optimum = _optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) - { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = curBack + LZMABase.kNumRepDistances; - } - } - } - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - } - } - - bool ChangePair(UInt32 smallDist, UInt32 bigDist) - { - const int kDif = 7; - return (smallDist < ((UInt32)(1) << (32 - kDif)) && bigDist >= (smallDist << kDif)); - } - - void WriteEndMarker(UInt32 posState) - { - if (!_writeEndMark) - return; - - _isMatch[(_state.Index << LZMABase.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 1); - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - UInt32 len = LZMABase.kMatchMinLen; - _lenEncoder.Encode(_rangeEncoder, len - LZMABase.kMatchMinLen, posState); - UInt32 posSlot = (1 << LZMABase.kNumPosSlotBits) - 1; - UInt32 lenToPosState = LZMABase.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - int footerBits = 30; - UInt32 posReduced = (((UInt32)1) << footerBits) - 1; - _rangeEncoder.EncodeDirectBits(posReduced >> LZMABase.kNumAlignBits, footerBits - LZMABase.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & LZMABase.kAlignMask); - } - - void Flush(UInt32 nowPos) - { - ReleaseMFStream(); - WriteEndMarker(nowPos & _posStateMask); - _rangeEncoder.FlushData(); - _rangeEncoder.FlushStream(); - } - - public void CodeOneBlock(out Int64 inSize, out Int64 outSize, out bool finished) - { - inSize = 0; - outSize = 0; - finished = true; - - if (_inStream != null) - { - _matchFinder.SetStream(_inStream); - _matchFinder.Init(); - _needReleaseMFStream = true; - _inStream = null; - } - - if (_finished) - return; - _finished = true; - - - Int64 progressPosValuePrev = nowPos64; - if (nowPos64 == 0) - { - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32)nowPos64); - return; - } - UInt32 len, numDistancePairs; // it's not used - ReadMatchDistances(out len, out numDistancePairs); - UInt32 posState = (UInt32)(nowPos64) & _posStateMask; - _isMatch[(_state.Index << LZMABase.kNumPosStatesBitsMax) + posState].Encode(_rangeEncoder, 0); - _state.UpdateChar(); - Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); - _literalEncoder.GetSubCoder((UInt32)(nowPos64), _previousByte).Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _additionalOffset--; - nowPos64++; - } - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32)nowPos64); - return; - } - while (true) - { - UInt32 pos; - UInt32 len = GetOptimum((UInt32)nowPos64, out pos); - - UInt32 posState = ((UInt32)nowPos64) & _posStateMask; - UInt32 complexState = (_state.Index << LZMABase.kNumPosStatesBitsMax) + posState; - if (len == 1 && pos == 0xFFFFFFFF) - { - _isMatch[complexState].Encode(_rangeEncoder, 0); - Byte curByte = _matchFinder.GetIndexByte((Int32)(0 - _additionalOffset)); - LiteralEncoder.Encoder2 subCoder = _literalEncoder.GetSubCoder((UInt32)nowPos64, _previousByte); - if (!_state.IsCharState()) - { - Byte matchByte = _matchFinder.GetIndexByte((Int32)(0 - _repDistances[0] - 1 - _additionalOffset)); - subCoder.EncodeMatched(_rangeEncoder, matchByte, curByte); - } - else - subCoder.Encode(_rangeEncoder, curByte); - _previousByte = curByte; - _state.UpdateChar(); - } - else - { - _isMatch[complexState].Encode(_rangeEncoder, 1); - if (pos < LZMABase.kNumRepDistances) - { - _isRep[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 0) - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 0); - if (len == 1) - _isRep0Long[complexState].Encode(_rangeEncoder, 0); - else - _isRep0Long[complexState].Encode(_rangeEncoder, 1); - } - else - { - _isRepG0[_state.Index].Encode(_rangeEncoder, 1); - if (pos == 1) - _isRepG1[_state.Index].Encode(_rangeEncoder, 0); - else - { - _isRepG1[_state.Index].Encode(_rangeEncoder, 1); - _isRepG2[_state.Index].Encode(_rangeEncoder, pos - 2); - } - } - if (len == 1) - _state.UpdateShortRep(); - else - { - _repMatchLenEncoder.Encode(_rangeEncoder, len - LZMABase.kMatchMinLen, posState); - _state.UpdateRep(); - } - UInt32 distance = _repDistances[pos]; - if (pos != 0) - { - for (UInt32 i = pos; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - } - } - else - { - _isRep[_state.Index].Encode(_rangeEncoder, 0); - _state.UpdateMatch(); - _lenEncoder.Encode(_rangeEncoder, len - LZMABase.kMatchMinLen, posState); - pos -= LZMABase.kNumRepDistances; - UInt32 posSlot = GetPosSlot(pos); - UInt32 lenToPosState = LZMABase.GetLenToPosState(len); - _posSlotEncoder[lenToPosState].Encode(_rangeEncoder, posSlot); - - if (posSlot >= LZMABase.kStartPosModelIndex) - { - int footerBits = (int)((posSlot >> 1) - 1); - UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); - UInt32 posReduced = pos - baseVal; - - if (posSlot < LZMABase.kEndPosModelIndex) - LZMARangeBitTreeEncoder.ReverseEncode(_posEncoders, baseVal - posSlot - 1, _rangeEncoder, footerBits, posReduced); - else - { - _rangeEncoder.EncodeDirectBits(posReduced >> LZMABase.kNumAlignBits, footerBits - LZMABase.kNumAlignBits); - _posAlignEncoder.ReverseEncode(_rangeEncoder, posReduced & LZMABase.kAlignMask); - _alignPriceCount++; - } - } - UInt32 distance = pos; - for (UInt32 i = LZMABase.kNumRepDistances - 1; i >= 1; i--) - _repDistances[i] = _repDistances[i - 1]; - _repDistances[0] = distance; - _matchPriceCount++; - } - _previousByte = _matchFinder.GetIndexByte((Int32)(len - 1 - _additionalOffset)); - } - _additionalOffset -= len; - nowPos64 += len; - if (_additionalOffset == 0) - { - // if (!_fastMode) - if (_matchPriceCount >= (1 << 7)) - FillDistancesPrices(); - if (_alignPriceCount >= LZMABase.kAlignTableSize) - FillAlignPrices(); - inSize = nowPos64; - outSize = _rangeEncoder.GetProcessedSizeAdd(); - if (_matchFinder.GetNumAvailableBytes() == 0) - { - Flush((UInt32)nowPos64); - return; - } - - if (nowPos64 - progressPosValuePrev >= (1 << 12)) - { - _finished = false; - finished = false; - return; - } - } - } - } - - void ReleaseMFStream() - { - if (_matchFinder != null && _needReleaseMFStream) - { - _matchFinder.ReleaseStream(); - _needReleaseMFStream = false; - } - } - - void SetOutStream(System.IO.Stream outStream) { _rangeEncoder.SetStream(outStream); } - void ReleaseOutStream() { _rangeEncoder.ReleaseStream(); } - - void ReleaseStreams() - { - ReleaseMFStream(); - ReleaseOutStream(); - } - - void SetStreams(System.IO.Stream inStream, System.IO.Stream outStream, - Int64 inSize, Int64 outSize) - { - _inStream = inStream; - _finished = false; - Create(); - SetOutStream(outStream); - Init(); - - // if (!_fastMode) - { - FillDistancesPrices(); - FillAlignPrices(); - } - - _lenEncoder.SetTableSize(_numFastBytes + 1 - LZMABase.kMatchMinLen); - _lenEncoder.UpdateTables((UInt32)1 << _posStateBits); - _repMatchLenEncoder.SetTableSize(_numFastBytes + 1 - LZMABase.kMatchMinLen); - _repMatchLenEncoder.UpdateTables((UInt32)1 << _posStateBits); - - nowPos64 = 0; - } - - - public override void Code(System.IO.Stream inStream, System.IO.Stream outStream, Int64 inSize, Int64 outSize, ICodeProgress progress) - { - _needReleaseMFStream = false; - try - { - SetStreams(inStream, outStream, inSize, outSize); - while (true) - { - Int64 processedInSize; - Int64 processedOutSize; - bool finished; - CodeOneBlock(out processedInSize, out processedOutSize, out finished); - if (finished) - return; - if (progress != null) - { - progress.SetProgress(processedInSize, processedOutSize); - } - } - } - finally - { - ReleaseStreams(); - } - } - - const int kPropSize = 5; - Byte[] properties = new Byte[kPropSize]; - - public void WriteCoderProperties(System.IO.Stream outStream) - { - properties[0] = (Byte)((_posStateBits * 5 + _numLiteralPosStateBits) * 9 + _numLiteralContextBits); - for (int i = 0; i < 4; i++) - properties[1 + i] = (Byte)(_dictionarySize >> (8 * i)); - outStream.Write(properties, 0, kPropSize); - } - - UInt32[] tempPrices = new UInt32[LZMABase.kNumFullDistances]; - UInt32 _matchPriceCount; - - void FillDistancesPrices() - { - for (UInt32 i = LZMABase.kStartPosModelIndex; i < LZMABase.kNumFullDistances; i++) - { - UInt32 posSlot = GetPosSlot(i); - int footerBits = (int)((posSlot >> 1) - 1); - UInt32 baseVal = ((2 | (posSlot & 1)) << footerBits); - tempPrices[i] = LZMARangeBitTreeEncoder.ReverseGetPrice(_posEncoders, baseVal - posSlot - 1, footerBits, i - baseVal); - } - - for (UInt32 lenToPosState = 0; lenToPosState < LZMABase.kNumLenToPosStates; lenToPosState++) - { - UInt32 posSlot; - LZMARangeBitTreeEncoder encoder = _posSlotEncoder[lenToPosState]; - - UInt32 st = (lenToPosState << LZMABase.kNumPosSlotBits); - for (posSlot = 0; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] = encoder.GetPrice(posSlot); - for (posSlot = LZMABase.kEndPosModelIndex; posSlot < _distTableSize; posSlot++) - _posSlotPrices[st + posSlot] += ((((posSlot >> 1) - 1) - LZMABase.kNumAlignBits) << LZMARangeBitEncoder.kNumBitPriceShiftBits); - - UInt32 st2 = lenToPosState * LZMABase.kNumFullDistances; - UInt32 i; - for (i = 0; i < LZMABase.kStartPosModelIndex; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + i]; - for (; i < LZMABase.kNumFullDistances; i++) - _distancesPrices[st2 + i] = _posSlotPrices[st + GetPosSlot(i)] + tempPrices[i]; - } - _matchPriceCount = 0; - } - - void FillAlignPrices() - { - for (UInt32 i = 0; i < LZMABase.kAlignTableSize; i++) - _alignPrices[i] = _posAlignEncoder.ReverseGetPrice(i); - _alignPriceCount = 0; - } - - - static string[] kMatchFinderIDs = - { - "BT2", - "BT4", - }; - - static int FindMatchFinder(string s) - { - for (int m = 0; m < kMatchFinderIDs.Length; m++) - if (s == kMatchFinderIDs[m]) - return m; - return -1; - } - - public void SetCoderProperties(CoderPropID[] propIDs, object[] properties) - { - for (UInt32 i = 0; i < properties.Length; i++) - { - object prop = properties[i]; - switch (propIDs[i]) - { - case CoderPropID.NumFastBytes: - { - if (!(prop is Int32)) - throw new Exception(); - Int32 numFastBytes = (Int32)prop; - if (numFastBytes < 5 || numFastBytes > LZMABase.kMatchMaxLen) - throw new Exception(); - _numFastBytes = (UInt32)numFastBytes; - break; - } - case CoderPropID.Algorithm: - { - break; - } - case CoderPropID.MatchFinder: - { - if (!(prop is String)) - throw new Exception(); - EMatchFinderType matchFinderIndexPrev = _matchFinderType; - int m = FindMatchFinder(((string)prop).ToUpper()); - if (m < 0) - throw new Exception(); - _matchFinderType = (EMatchFinderType)m; - if (_matchFinder != null && matchFinderIndexPrev != _matchFinderType) - { - _dictionarySizePrev = 0xFFFFFFFF; - _matchFinder = null; - } - break; - } - case CoderPropID.DictionarySize: - { - const int kDicLogSizeMaxCompress = 30; - if (!(prop is Int32)) - throw new Exception(); ; - Int32 dictionarySize = (Int32)prop; - if (dictionarySize < (UInt32)(1 << LZMABase.kDicLogSizeMin) || - dictionarySize > (UInt32)(1 << kDicLogSizeMaxCompress)) - throw new Exception(); - _dictionarySize = (UInt32)dictionarySize; - int dicLogSize; - for (dicLogSize = 0; dicLogSize < (UInt32)kDicLogSizeMaxCompress; dicLogSize++) - if (dictionarySize <= ((UInt32)(1) << dicLogSize)) - break; - _distTableSize = (UInt32)dicLogSize * 2; - break; - } - case CoderPropID.PosStateBits: - { - if (!(prop is Int32)) - throw new Exception(); - Int32 v = (Int32)prop; - if (v < 0 || v > (UInt32)LZMABase.kNumPosStatesBitsEncodingMax) - throw new Exception(); - _posStateBits = (int)v; - _posStateMask = (((UInt32)1) << (int)_posStateBits) - 1; - break; - } - case CoderPropID.LitPosBits: - { - if (!(prop is Int32)) - throw new Exception(); - Int32 v = (Int32)prop; - if (v < 0 || v > (UInt32)LZMABase.kNumLitPosStatesBitsEncodingMax) - throw new Exception(); - _numLiteralPosStateBits = (int)v; - break; - } - case CoderPropID.LitContextBits: - { - if (!(prop is Int32)) - throw new Exception(); - Int32 v = (Int32)prop; - if (v < 0 || v > (UInt32)LZMABase.kNumLitContextBitsMax) - throw new Exception(); ; - _numLiteralContextBits = (int)v; - break; - } - case CoderPropID.EndMarker: - { - if (!(prop is Boolean)) - throw new Exception(); - SetWriteEndMarkerMode((Boolean)prop); - break; - } - default: - throw new Exception(); - } - } - } - } - #endregion - - #endregion - - #region LZ - - #region IInWindowStream - private abstract class IInWindowStream - { - public abstract void SetStream(System.IO.Stream inStream); - public abstract void Init(); - public abstract void ReleaseStream(); - public abstract Byte GetIndexByte(Int32 index); - public abstract UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit); - public abstract UInt32 GetNumAvailableBytes(); - } - #endregion - - #region IMatchFinder - private abstract class IMatchFinder : IInWindowStream - { - public abstract void Create(UInt32 historySize, UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter); - public abstract UInt32 GetMatches(UInt32[] distances); - public abstract void Skip(UInt32 num); - } - #endregion - - #region LZBinTree - private class LZBinTree : LZInWindow - { - UInt32 _cyclicBufferPos; - UInt32 _cyclicBufferSize = 0; - UInt32 _matchMaxLen; - - UInt32[] _son; - UInt32[] _hash; - - UInt32 _cutValue = 0xFF; - UInt32 _hashMask; - UInt32 _hashSizeSum = 0; - - bool HASH_ARRAY = true; - - const UInt32 kHash2Size = 1 << 10; - const UInt32 kHash3Size = 1 << 16; - const UInt32 kBT2HashSize = 1 << 16; - const UInt32 kStartMaxLen = 1; - const UInt32 kHash3Offset = kHash2Size; - const UInt32 kEmptyHashValue = 0; - const UInt32 kMaxValForNormalize = ((UInt32)1 << 31) - 1; - - UInt32 kNumHashDirectBytes = 0; - UInt32 kMinMatchCheck = 4; - UInt32 kFixHashSize = kHash2Size + kHash3Size; - - public void SetType(int numHashBytes) - { - HASH_ARRAY = (numHashBytes > 2); - if (HASH_ARRAY) - { - kNumHashDirectBytes = 0; - kMinMatchCheck = 4; - kFixHashSize = kHash2Size + kHash3Size; - } - else - { - kNumHashDirectBytes = 2; - kMinMatchCheck = 2 + 1; - kFixHashSize = 0; - } - } - - public new void SetStream(System.IO.Stream stream) { base.SetStream(stream); } - public new void ReleaseStream() { base.ReleaseStream(); } - - public new void Init() - { - base.Init(); - for (UInt32 i = 0; i < _hashSizeSum; i++) - _hash[i] = kEmptyHashValue; - _cyclicBufferPos = 0; - ReduceOffsets(-1); - } - - public new void MovePos() - { - if (++_cyclicBufferPos >= _cyclicBufferSize) - _cyclicBufferPos = 0; - base.MovePos(); - if (_pos == kMaxValForNormalize) - Normalize(); - } - - public new Byte GetIndexByte(Int32 index) { return base.GetIndexByte(index); } - - public new UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) - { return base.GetMatchLen(index, distance, limit); } - - public new UInt32 GetNumAvailableBytes() { return base.GetNumAvailableBytes(); } - - public void Create(UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter) - { - if (historySize > kMaxValForNormalize - 256) - throw new Exception(); - _cutValue = 16 + (matchMaxLen >> 1); - - UInt32 windowReservSize = (historySize + keepAddBufferBefore + - matchMaxLen + keepAddBufferAfter) / 2 + 256; - - base.Create(historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); - - _matchMaxLen = matchMaxLen; - - UInt32 cyclicBufferSize = historySize + 1; - if (_cyclicBufferSize != cyclicBufferSize) - _son = new UInt32[(_cyclicBufferSize = cyclicBufferSize) * 2]; - - UInt32 hs = kBT2HashSize; - - if (HASH_ARRAY) - { - hs = historySize - 1; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - hs >>= 1; - hs |= 0xFFFF; - if (hs > (1 << 24)) - hs >>= 1; - _hashMask = hs; - hs++; - hs += kFixHashSize; - } - if (hs != _hashSizeSum) - _hash = new UInt32[_hashSizeSum = hs]; - } - - public UInt32 GetMatches(UInt32[] distances) - { - UInt32 lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - return 0; - } - } - - UInt32 offset = 0; - UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; - UInt32 cur = _bufferOffset + _pos; - UInt32 maxLen = kStartMaxLen; // to avoid items for len < hashSize; - UInt32 hashValue, hash2Value = 0, hash3Value = 0; - - if (HASH_ARRAY) - { - UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - hash2Value = temp & (kHash2Size - 1); - temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); - hash3Value = temp & (kHash3Size - 1); - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); - - UInt32 curMatch = _hash[kFixHashSize + hashValue]; - if (HASH_ARRAY) - { - UInt32 curMatch2 = _hash[hash2Value]; - UInt32 curMatch3 = _hash[kHash3Offset + hash3Value]; - _hash[hash2Value] = _pos; - _hash[kHash3Offset + hash3Value] = _pos; - if (curMatch2 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch2] == _bufferBase[cur]) - { - distances[offset++] = maxLen = 2; - distances[offset++] = _pos - curMatch2 - 1; - } - if (curMatch3 > matchMinPos) - if (_bufferBase[_bufferOffset + curMatch3] == _bufferBase[cur]) - { - if (curMatch3 == curMatch2) - offset -= 2; - distances[offset++] = maxLen = 3; - distances[offset++] = _pos - curMatch3 - 1; - curMatch2 = curMatch3; - } - if (offset != 0 && curMatch2 == curMatch) - { - offset -= 2; - maxLen = kStartMaxLen; - } - } - - _hash[kFixHashSize + hashValue] = _pos; - - UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; - UInt32 ptr1 = (_cyclicBufferPos << 1); - - UInt32 len0, len1; - len0 = len1 = kNumHashDirectBytes; - - if (kNumHashDirectBytes != 0) - { - if (curMatch > matchMinPos) - { - if (_bufferBase[_bufferOffset + curMatch + kNumHashDirectBytes] != - _bufferBase[cur + kNumHashDirectBytes]) - { - distances[offset++] = maxLen = kNumHashDirectBytes; - distances[offset++] = _pos - curMatch - 1; - } - } - } - - UInt32 count = _cutValue; - - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - UInt32 delta = _pos - curMatch; - UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? - (_cyclicBufferPos - delta) : - (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; - - UInt32 pby1 = _bufferOffset + curMatch; - UInt32 len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (maxLen < len) - { - distances[offset++] = maxLen = len; - distances[offset++] = delta - 1; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - return offset; - } - - public void Skip(UInt32 num) - { - do - { - UInt32 lenLimit; - if (_pos + _matchMaxLen <= _streamPos) - lenLimit = _matchMaxLen; - else - { - lenLimit = _streamPos - _pos; - if (lenLimit < kMinMatchCheck) - { - MovePos(); - continue; - } - } - - UInt32 matchMinPos = (_pos > _cyclicBufferSize) ? (_pos - _cyclicBufferSize) : 0; - UInt32 cur = _bufferOffset + _pos; - - UInt32 hashValue; - - if (HASH_ARRAY) - { - UInt32 temp = CRC.Table[_bufferBase[cur]] ^ _bufferBase[cur + 1]; - UInt32 hash2Value = temp & (kHash2Size - 1); - _hash[hash2Value] = _pos; - temp ^= ((UInt32)(_bufferBase[cur + 2]) << 8); - UInt32 hash3Value = temp & (kHash3Size - 1); - _hash[kHash3Offset + hash3Value] = _pos; - hashValue = (temp ^ (CRC.Table[_bufferBase[cur + 3]] << 5)) & _hashMask; - } - else - hashValue = _bufferBase[cur] ^ ((UInt32)(_bufferBase[cur + 1]) << 8); - - UInt32 curMatch = _hash[kFixHashSize + hashValue]; - _hash[kFixHashSize + hashValue] = _pos; - - UInt32 ptr0 = (_cyclicBufferPos << 1) + 1; - UInt32 ptr1 = (_cyclicBufferPos << 1); - - UInt32 len0, len1; - len0 = len1 = kNumHashDirectBytes; - - UInt32 count = _cutValue; - while (true) - { - if (curMatch <= matchMinPos || count-- == 0) - { - _son[ptr0] = _son[ptr1] = kEmptyHashValue; - break; - } - - UInt32 delta = _pos - curMatch; - UInt32 cyclicPos = ((delta <= _cyclicBufferPos) ? - (_cyclicBufferPos - delta) : - (_cyclicBufferPos - delta + _cyclicBufferSize)) << 1; - - UInt32 pby1 = _bufferOffset + curMatch; - UInt32 len = Math.Min(len0, len1); - if (_bufferBase[pby1 + len] == _bufferBase[cur + len]) - { - while (++len != lenLimit) - if (_bufferBase[pby1 + len] != _bufferBase[cur + len]) - break; - if (len == lenLimit) - { - _son[ptr1] = _son[cyclicPos]; - _son[ptr0] = _son[cyclicPos + 1]; - break; - } - } - if (_bufferBase[pby1 + len] < _bufferBase[cur + len]) - { - _son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = _son[ptr1]; - len1 = len; - } - else - { - _son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = _son[ptr0]; - len0 = len; - } - } - MovePos(); - } - while (--num != 0); - } - - void NormalizeLinks(UInt32[] items, UInt32 numItems, UInt32 subValue) - { - for (UInt32 i = 0; i < numItems; i++) - { - UInt32 value = items[i]; - if (value <= subValue) - value = kEmptyHashValue; - else - value -= subValue; - items[i] = value; - } - } - - void Normalize() - { - UInt32 subValue = _pos - _cyclicBufferSize; - NormalizeLinks(_son, _cyclicBufferSize * 2, subValue); - NormalizeLinks(_hash, _hashSizeSum, subValue); - ReduceOffsets((Int32)subValue); - } - - public void SetCutValue(UInt32 cutValue) { _cutValue = cutValue; } - } - #endregion - - #region LZInWindow - private class LZInWindow - { - public Byte[] _bufferBase = null; - System.IO.Stream _stream; - UInt32 _posLimit; - bool _streamEndWasReached; - - UInt32 _pointerToLastSafePosition; - - public UInt32 _bufferOffset; - - public UInt32 _blockSize; - public UInt32 _pos; - UInt32 _keepSizeBefore; - UInt32 _keepSizeAfter; - public UInt32 _streamPos; - - public void MoveBlock() - { - UInt32 offset = (UInt32)(_bufferOffset) + _pos - _keepSizeBefore; - if (offset > 0) - offset--; - - UInt32 numBytes = (UInt32)(_bufferOffset) + _streamPos - offset; - - for (UInt32 i = 0; i < numBytes; i++) - _bufferBase[i] = _bufferBase[offset + i]; - _bufferOffset -= offset; - } - - public virtual void ReadBlock() - { - if (_streamEndWasReached) - return; - while (true) - { - int size = (int)((0 - _bufferOffset) + _blockSize - _streamPos); - if (size == 0) - return; - int numReadBytes = _stream.Read(_bufferBase, (int)(_bufferOffset + _streamPos), size); - if (numReadBytes == 0) - { - _posLimit = _streamPos; - UInt32 pointerToPostion = _bufferOffset + _posLimit; - if (pointerToPostion > _pointerToLastSafePosition) - _posLimit = (UInt32)(_pointerToLastSafePosition - _bufferOffset); - - _streamEndWasReached = true; - return; - } - _streamPos += (UInt32)numReadBytes; - if (_streamPos >= _pos + _keepSizeAfter) - _posLimit = _streamPos - _keepSizeAfter; - } - } - - void Free() { _bufferBase = null; } - - public void Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv) - { - _keepSizeBefore = keepSizeBefore; - _keepSizeAfter = keepSizeAfter; - UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; - if (_bufferBase == null || _blockSize != blockSize) - { - Free(); - _blockSize = blockSize; - _bufferBase = new Byte[_blockSize]; - } - _pointerToLastSafePosition = _blockSize - keepSizeAfter; - } - - public void SetStream(System.IO.Stream stream) { _stream = stream; } - public void ReleaseStream() { _stream = null; } - - public void Init() - { - _bufferOffset = 0; - _pos = 0; - _streamPos = 0; - _streamEndWasReached = false; - ReadBlock(); - } - - public void MovePos() - { - _pos++; - if (_pos > _posLimit) - { - UInt32 pointerToPostion = _bufferOffset + _pos; - if (pointerToPostion > _pointerToLastSafePosition) - MoveBlock(); - ReadBlock(); - } - } - - public Byte GetIndexByte(Int32 index) { return _bufferBase[_bufferOffset + _pos + index]; } - - public UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) - { - if (_streamEndWasReached) - if ((_pos + index) + limit > _streamPos) - limit = _streamPos - (UInt32)(_pos + index); - distance++; - UInt32 pby = _bufferOffset + _pos + (UInt32)index; - - UInt32 i; - for (i = 0; i < limit && _bufferBase[pby + i] == _bufferBase[pby + i - distance]; i++) ; - return i; - } - - public UInt32 GetNumAvailableBytes() { return _streamPos - _pos; } - - public void ReduceOffsets(Int32 subValue) - { - _bufferOffset += (UInt32)subValue; - _posLimit -= (UInt32)subValue; - _pos -= (UInt32)subValue; - _streamPos -= (UInt32)subValue; - } - } - #endregion - - #region LZOutWindow - private class LZOutWindow - { - byte[] _buffer = null; - uint _pos; - uint _windowSize = 0; - uint _streamPos; - System.IO.Stream _stream; - - public void Create(uint windowSize) - { - if (_windowSize != windowSize) - { - // System.GC.Collect(); - _buffer = new byte[windowSize]; - } - _windowSize = windowSize; - _pos = 0; - _streamPos = 0; - } - - public void Init(System.IO.Stream stream, bool solid) - { - ReleaseStream(); - _stream = stream; - if (!solid) - { - _streamPos = 0; - _pos = 0; - } - } - - public void Init(System.IO.Stream stream) { Init(stream, false); } - - public void ReleaseStream() - { - Flush(); - _stream = null; - } - - public void Flush() - { - uint size = _pos - _streamPos; - if (size == 0) - return; - _stream.Write(_buffer, (int)_streamPos, (int)size); - if (_pos >= _windowSize) - _pos = 0; - _streamPos = _pos; - } - - public void CopyBlock(uint distance, uint len) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - for (; len > 0; len--) - { - if (pos >= _windowSize) - pos = 0; - _buffer[_pos++] = _buffer[pos++]; - if (_pos >= _windowSize) - Flush(); - } - } - - public void PutByte(byte b) - { - _buffer[_pos++] = b; - if (_pos >= _windowSize) - Flush(); - } - - public byte GetByte(uint distance) - { - uint pos = _pos - distance - 1; - if (pos >= _windowSize) - pos += _windowSize; - return _buffer[pos]; - } - } - #endregion - - #endregion - - #region CRC - private class CRC - { - public static readonly uint[] Table; - - static CRC() - { - Table = new uint[256]; - const uint kPoly = 0xEDB88320; - for (uint i = 0; i < 256; i++) - { - uint r = i; - for (int j = 0; j < 8; j++) - if ((r & 1) != 0) - r = (r >> 1) ^ kPoly; - else - r >>= 1; - Table[i] = r; - } - } - - uint _value = 0xFFFFFFFF; - - public void Init() { _value = 0xFFFFFFFF; } - - public void UpdateByte(byte b) - { - _value = Table[(((byte)(_value)) ^ b)] ^ (_value >> 8); - } - - public void Update(byte[] data, uint offset, uint size) - { - for (uint i = 0; i < size; i++) - _value = Table[(((byte)(_value)) ^ data[offset + i])] ^ (_value >> 8); - } - - public uint GetDigest() { return _value ^ 0xFFFFFFFF; } - - static uint CalculateDigest(byte[] data, uint offset, uint size) - { - CRC crc = new CRC(); - crc.Update(data, offset, size); - return crc.GetDigest(); - } - - static bool VerifyDigest(uint digest, byte[] data, uint offset, uint size) - { - return (CalculateDigest(data, offset, size) == digest); - } - } - #endregion - - #region RangeCoder - - #region LZMARangeEncoder - private class LZMARangeEncoder - { - public const uint kTopValue = (1 << 24); - System.IO.Stream Stream; - public UInt64 Low; - public uint Range; - uint _cacheSize; - byte _cache; - - long StartPosition; - - public void SetStream(System.IO.Stream stream) - { - Stream = stream; - } - - public void ReleaseStream() - { - Stream = null; - } - - public void Init() - { - StartPosition = Stream.Position; - - Low = 0; - Range = 0xFFFFFFFF; - _cacheSize = 1; - _cache = 0; - } - - public void FlushData() - { - for (int i = 0; i < 5; i++) - ShiftLow(); - } - - public void FlushStream() - { - Stream.Flush(); - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Encode(uint start, uint size, uint total) - { - Low += start * (Range /= total); - Range *= size; - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public void ShiftLow() - { - if ((uint)Low < (uint)0xFF000000 || (uint)(Low >> 32) == 1) - { - byte temp = _cache; - do - { - Stream.WriteByte((byte)(temp + (Low >> 32))); - temp = 0xFF; - } while (--_cacheSize != 0); - - _cache = (byte)(((uint)Low) >> 24); - } - _cacheSize++; - Low = ((uint)Low) << 8; - } - - public void EncodeDirectBits(uint v, int numTotalBits) - { - for (int i = numTotalBits - 1; i >= 0; i--) - { - Range >>= 1; - if (((v >> i) & 1) == 1) - Low += Range; - if (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - } - - public void EncodeBit(uint size0, int numTotalBits, uint symbol) - { - uint newBound = (Range >> numTotalBits) * size0; - if (symbol == 0) - Range = newBound; - else - { - Low += newBound; - Range -= newBound; - } - while (Range < kTopValue) - { - Range <<= 8; - ShiftLow(); - } - } - - public long GetProcessedSizeAdd() - { - return _cacheSize + Stream.Position - StartPosition + 4; - } - } - #endregion - - #region LZMARangeDecoder - private class LZMARangeDecoder - { - public const uint kTopValue = (1 << 24); - public uint Range; - public uint Code; - public System.IO.Stream Stream; - - public void Init(System.IO.Stream stream) - { - Stream = stream; - - Code = 0; - Range = 0xFFFFFFFF; - for (int i = 0; i < 5; i++) - Code = (Code << 8) | (byte)Stream.ReadByte(); - } - - public void ReleaseStream() - { - Stream = null; - } - - public void CloseStream() - { - Stream.Close(); - } - - public void Normalize() - { - while (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public void Normalize2() - { - if (Range < kTopValue) - { - Code = (Code << 8) | (byte)Stream.ReadByte(); - Range <<= 8; - } - } - - public uint GetThreshold(uint total) - { - return Code / (Range /= total); - } - - public void Decode(uint start, uint size, uint total) - { - Code -= start * Range; - Range *= size; - Normalize(); - } - - public uint DecodeDirectBits(int numTotalBits) - { - uint range = Range; - uint code = Code; - uint result = 0; - for (int i = numTotalBits; i > 0; i--) - { - range >>= 1; - uint t = (code - range) >> 31; - code -= range & (t - 1); - result = (result << 1) | (1 - t); - - if (range < kTopValue) - { - code = (code << 8) | (byte)Stream.ReadByte(); - range <<= 8; - } - } - Range = range; - Code = code; - return result; - } - - public uint DecodeBit(uint size0, int numTotalBits) - { - uint newBound = (Range >> numTotalBits) * size0; - uint symbol; - if (Code < newBound) - { - symbol = 0; - Range = newBound; - } - else - { - symbol = 1; - Code -= newBound; - Range -= newBound; - } - Normalize(); - return symbol; - } - } - #endregion - - #region LZMARangeBitEncoder - private struct LZMARangeBitEncoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); - const int kNumMoveBits = 5; - const int kNumMoveReducingBits = 2; - public const int kNumBitPriceShiftBits = 6; - - uint Prob; - - public void Init() { Prob = kBitModelTotal >> 1; } - - public void UpdateModel(uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - else - Prob -= (Prob) >> kNumMoveBits; - } - - public void Encode(LZMARangeEncoder encoder, uint symbol) - { - // encoder.EncodeBit(Prob, kNumBitModelTotalBits, symbol); - // UpdateModel(symbol); - uint newBound = (encoder.Range >> kNumBitModelTotalBits) * Prob; - if (symbol == 0) - { - encoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - } - else - { - encoder.Low += newBound; - encoder.Range -= newBound; - Prob -= (Prob) >> kNumMoveBits; - } - if (encoder.Range < LZMARangeEncoder.kTopValue) - { - encoder.Range <<= 8; - encoder.ShiftLow(); - } - } - - private static UInt32[] ProbPrices = new UInt32[kBitModelTotal >> kNumMoveReducingBits]; - - static LZMARangeBitEncoder() - { - const int kNumBits = (kNumBitModelTotalBits - kNumMoveReducingBits); - for (int i = kNumBits - 1; i >= 0; i--) - { - UInt32 start = (UInt32)1 << (kNumBits - i - 1); - UInt32 end = (UInt32)1 << (kNumBits - i); - for (UInt32 j = start; j < end; j++) - ProbPrices[j] = ((UInt32)i << kNumBitPriceShiftBits) + - (((end - j) << kNumBitPriceShiftBits) >> (kNumBits - i - 1)); - } - } - - public uint GetPrice(uint symbol) - { - return ProbPrices[(((Prob - symbol) ^ ((-(int)symbol))) & (kBitModelTotal - 1)) >> kNumMoveReducingBits]; - } - public uint GetPrice0() { return ProbPrices[Prob >> kNumMoveReducingBits]; } - public uint GetPrice1() { return ProbPrices[(kBitModelTotal - Prob) >> kNumMoveReducingBits]; } - } - #endregion - - #region LZMARangeBitDecoder - private struct LZMARangeBitDecoder - { - public const int kNumBitModelTotalBits = 11; - public const uint kBitModelTotal = (1 << kNumBitModelTotalBits); - const int kNumMoveBits = 5; - - uint Prob; - - public void UpdateModel(int numMoveBits, uint symbol) - { - if (symbol == 0) - Prob += (kBitModelTotal - Prob) >> numMoveBits; - else - Prob -= (Prob) >> numMoveBits; - } - - public void Init() { Prob = kBitModelTotal >> 1; } - - public uint Decode(LZMARangeDecoder rangeDecoder) - { - uint newBound = (uint)(rangeDecoder.Range >> kNumBitModelTotalBits) * (uint)Prob; - if (rangeDecoder.Code < newBound) - { - rangeDecoder.Range = newBound; - Prob += (kBitModelTotal - Prob) >> kNumMoveBits; - if (rangeDecoder.Range < LZMARangeDecoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 0; - } - else - { - rangeDecoder.Range -= newBound; - rangeDecoder.Code -= newBound; - Prob -= (Prob) >> kNumMoveBits; - if (rangeDecoder.Range < LZMARangeDecoder.kTopValue) - { - rangeDecoder.Code = (rangeDecoder.Code << 8) | (byte)rangeDecoder.Stream.ReadByte(); - rangeDecoder.Range <<= 8; - } - return 1; - } - } - } - #endregion - - #region LZMARangeBitTreeEncoder - private struct LZMARangeBitTreeEncoder - { - LZMARangeBitEncoder[] Models; - int NumBitLevels; - - public LZMARangeBitTreeEncoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new LZMARangeBitEncoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < (1 << NumBitLevels); i++) - Models[i].Init(); - } - - public void Encode(LZMARangeEncoder rangeEncoder, UInt32 symbol) - { - UInt32 m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; ) - { - bitIndex--; - UInt32 bit = (symbol >> bitIndex) & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - } - } - - public void ReverseEncode(LZMARangeEncoder rangeEncoder, UInt32 symbol) - { - UInt32 m = 1; - for (UInt32 i = 0; i < NumBitLevels; i++) - { - UInt32 bit = symbol & 1; - Models[m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - - public UInt32 GetPrice(UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; ) - { - bitIndex--; - UInt32 bit = (symbol >> bitIndex) & 1; - price += Models[m].GetPrice(bit); - m = (m << 1) + bit; - } - return price; - } - - public UInt32 ReverseGetPrice(UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += Models[m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static UInt32 ReverseGetPrice(LZMARangeBitEncoder[] Models, UInt32 startIndex, - int NumBitLevels, UInt32 symbol) - { - UInt32 price = 0; - UInt32 m = 1; - for (int i = NumBitLevels; i > 0; i--) - { - UInt32 bit = symbol & 1; - symbol >>= 1; - price += Models[startIndex + m].GetPrice(bit); - m = (m << 1) | bit; - } - return price; - } - - public static void ReverseEncode(LZMARangeBitEncoder[] Models, UInt32 startIndex, - LZMARangeEncoder rangeEncoder, int NumBitLevels, UInt32 symbol) - { - UInt32 m = 1; - for (int i = 0; i < NumBitLevels; i++) - { - UInt32 bit = symbol & 1; - Models[startIndex + m].Encode(rangeEncoder, bit); - m = (m << 1) | bit; - symbol >>= 1; - } - } - } - #endregion - - #region LZMARangeBitTreeDecoder - private struct LZMARangeBitTreeDecoder - { - LZMARangeBitDecoder[] Models; - int NumBitLevels; - - public LZMARangeBitTreeDecoder(int numBitLevels) - { - NumBitLevels = numBitLevels; - Models = new LZMARangeBitDecoder[1 << numBitLevels]; - } - - public void Init() - { - for (uint i = 1; i < (1 << NumBitLevels); i++) - Models[i].Init(); - } - - public uint Decode(LZMARangeDecoder rangeDecoder) - { - uint m = 1; - for (int bitIndex = NumBitLevels; bitIndex > 0; bitIndex--) - m = (m << 1) + Models[m].Decode(rangeDecoder); - return m - ((uint)1 << NumBitLevels); - } - - public uint ReverseDecode(LZMARangeDecoder rangeDecoder) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= (bit << bitIndex); - } - return symbol; - } - - public static uint ReverseDecode(LZMARangeBitDecoder[] Models, UInt32 startIndex, - LZMARangeDecoder rangeDecoder, int NumBitLevels) - { - uint m = 1; - uint symbol = 0; - for (int bitIndex = 0; bitIndex < NumBitLevels; bitIndex++) - { - uint bit = Models[startIndex + m].Decode(rangeDecoder); - m <<= 1; - m += bit; - symbol |= (bit << bitIndex); - } - return symbol; - } - } - #endregion - - #endregion - - #region ICoder - - #region ICodeProgress - private abstract class ICodeProgress - { - /// - /// Callback progress. - /// - /// - /// input size. -1 if unknown. - /// - /// - /// output size. -1 if unknown. - /// - public abstract void SetProgress(Int64 inSize, Int64 outSize); - } - #endregion - - #region ICoder - private abstract class ICoder - { - /// - /// Codes streams. - /// - /// - /// input Stream. - /// - /// - /// output Stream. - /// - /// - /// input Size. -1 if unknown. - /// - /// - /// output Size. -1 if unknown. - /// - /// - /// callback progress reference. - /// - /// - /// if input stream is not valid - /// - public abstract void Code(Stream inStream, Stream outStream, Int64 inSize, Int64 outSize, ICodeProgress progress); - } - #endregion - - #region CoderPropID - /// - /// Provides the fields that represent properties idenitifiers for compressing. - /// - private enum CoderPropID - { - /// - /// Specifies size of dictionary. - /// - DictionarySize = 0x400, - /// - /// Specifies size of memory for PPM*. - /// - UsedMemorySize, - /// - /// Specifies order for PPM methods. - /// - Order, - /// - /// Specifies number of postion state bits for LZMA (0 <= x <= 4). - /// - PosStateBits = 0x440, - /// - /// Specifies number of literal context bits for LZMA (0 <= x <= 8). - /// - LitContextBits, - /// - /// Specifies number of literal position bits for LZMA (0 <= x <= 4). - /// - LitPosBits, - /// - /// Specifies number of fast bytes for LZ*. - /// - NumFastBytes = 0x450, - /// - /// Specifies match finder. LZMA: "BT2", "BT4" or "BT4B". - /// - MatchFinder, - /// - /// Specifies number of passes. - /// - NumPasses = 0x460, - /// - /// Specifies number of algorithm. - /// - Algorithm = 0x470, - /// - /// Specifies multithread mode. - /// - MultiThread = 0x480, - /// - /// Specifies mode with end marker. - /// - EndMarker = 0x490 - } - #endregion - - #region ISetCoderProperties - private abstract class ISetCoderProperties - { - public abstract void SetCoderProperties(CoderPropID[] propIDs, object[] properties); - } - #endregion - - #region IWriteCoderProperties - private abstract class IWriteCoderProperties - { - public abstract void WriteCoderProperties(System.IO.Stream outStream); - } - #endregion - - #region ISetDecoderProperties - private abstract class ISetDecoderProperties - { - public abstract void SetDecoderProperties(byte[] properties); - } - #endregion - - #endregion - } -} \ No newline at end of file diff --git a/Users/Orvid/Orvid.Compression/Lzw.cs b/Users/Orvid/Orvid.Compression/Lzw.cs deleted file mode 100644 index fa58e340e7..0000000000 --- a/Users/Orvid/Orvid.Compression/Lzw.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using Orvid.Compression.Streams; -using System.IO; - -namespace Orvid.Compression -{ - public static class Lzw - { - public static byte[] Decompress(byte[] data) - { - MemoryStream ot = new MemoryStream(); - LzwInputStream CompInStream = new LzwInputStream(new MemoryStream(data)); - int ch = CompInStream.ReadByte(); - while (ch != -1) - { - ot.WriteByte((byte)ch); - ch = CompInStream.ReadByte(); - } - return ot.GetBuffer(); - } - - //public static byte[] Compress(byte[] data, int blockSize) - //{ - // MemoryStream strm = new MemoryStream(data); - // MemoryStream ostrm = new MemoryStream(); - // LzwOutputStream bzos = new LzwOutputStream(ostrm, blockSize); - // int ch = strm.ReadByte(); - // while (ch != -1) - // { - // bzos.WriteByte((byte)ch); - // ch = strm.ReadByte(); - // } - // return ostrm.GetBuffer(); - //} - } -} diff --git a/Users/Orvid/Orvid.Compression/Orvid.Compression.csproj b/Users/Orvid/Orvid.Compression/Orvid.Compression.csproj deleted file mode 100644 index 7e1276c31a..0000000000 --- a/Users/Orvid/Orvid.Compression/Orvid.Compression.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {931E9514-6750-4700-8B20-364DD1B78038} - Library - Properties - Orvid.Compression - Orvid.Compression - v4.7.1 - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Orvid/Orvid.Compression/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Compression/Properties/AssemblyInfo.cs deleted file mode 100644 index 28aacb497d..0000000000 --- a/Users/Orvid/Orvid.Compression/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("Orvid.Compression")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Orvid.Compression")] -[assembly: AssemblyCopyright("Copyright © 2011")] -[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("a0969a19-eff6-4dde-8ce1-97fdc29b15a1")] - -// 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/Users/Orvid/Orvid.Compression/Streams/BZip2.cs b/Users/Orvid/Orvid.Compression/Streams/BZip2.cs deleted file mode 100644 index e1b5738e6b..0000000000 --- a/Users/Orvid/Orvid.Compression/Streams/BZip2.cs +++ /dev/null @@ -1,3279 +0,0 @@ -// BZip2Constants.cs -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. -using System.IO; -using Orvid.Compression.Checksums; -using System; - -namespace Orvid.Compression.Streams -{ - - #region Constants - /// - /// Defines internal values for both compression and decompression - /// - internal sealed class BZip2Constants - { - /// - /// Random numbers used to randomise repetitive blocks - /// - public readonly static int[] RandomNumbers = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 - }; - - /// - /// When multiplied by compression parameter (1-9) gives the block size for compression - /// 9 gives the best compression but uses the most memory. - /// - public const int BaseBlockSize = 100000; - - /// - /// Backend constant - /// - public const int MaximumAlphaSize = 258; - - /// - /// Backend constant - /// - public const int MaximumCodeLength = 23; - - /// - /// Backend constant - /// - public const int RunA = 0; - - /// - /// Backend constant - /// - public const int RunB = 1; - - /// - /// Backend constant - /// - public const int GroupCount = 6; - - /// - /// Backend constant - /// - public const int GroupSize = 50; - - /// - /// Backend constant - /// - public const int NumberOfIterations = 4; - - /// - /// Backend constant - /// - public const int MaximumSelectors = (2 + (900000 / GroupSize)); - - /// - /// Backend constant - /// - public const int OvershootBytes = 20; - - private BZip2Constants() - { - } - } - #endregion - - #region InputStream - /// - /// An input stream that decompresses files in the BZip2 format - /// - public class BZip2InputStream : Stream - { - #region Constants - const int START_BLOCK_STATE = 1; - const int RAND_PART_A_STATE = 2; - const int RAND_PART_B_STATE = 3; - const int RAND_PART_C_STATE = 4; - const int NO_RAND_PART_A_STATE = 5; - const int NO_RAND_PART_B_STATE = 6; - const int NO_RAND_PART_C_STATE = 7; - #endregion - #region Constructors - /// - /// Construct instance for reading from stream - /// - /// Data source - public BZip2InputStream(Stream stream) - { - // init arrays - for (int i = 0; i < BZip2Constants.GroupCount; ++i) - { - limit[i] = new int[BZip2Constants.MaximumAlphaSize]; - baseArray[i] = new int[BZip2Constants.MaximumAlphaSize]; - perm[i] = new int[BZip2Constants.MaximumAlphaSize]; - } - - BsSetStream(stream); - Initialize(); - InitBlock(); - SetupBlock(); - } - - #endregion - - /// - /// Get/set flag indicating ownership of underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return isStreamOwner; } - set { isStreamOwner = value; } - } - - - #region Stream Overrides - /// - /// Gets a value indicating if the stream supports reading - /// - public override bool CanRead - { - get - { - return baseStream.CanRead; - } - } - - /// - /// Gets a value indicating whether the current stream supports seeking. - /// - public override bool CanSeek - { - get - { - return baseStream.CanSeek; - } - } - - /// - /// Gets a value indicating whether the current stream supports writing. - /// This property always returns false - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - /// Gets the length in bytes of the stream. - /// - public override long Length - { - get - { - return baseStream.Length; - } - } - - /// - /// Gets or sets the streams position. - /// Setting the position is not supported and will throw a NotSupportException - /// - /// Any attempt to set the position - public override long Position - { - get - { - return baseStream.Position; - } - set - { - throw new NotSupportedException("BZip2InputStream position cannot be set"); - } - } - - /// - /// Flushes the stream. - /// - public override void Flush() - { - if (baseStream != null) - { - baseStream.Flush(); - } - } - - /// - /// Set the streams position. This operation is not supported and will throw a NotSupportedException - /// - /// A byte offset relative to the parameter. - /// A value of type indicating the reference point used to obtain the new position. - /// The new position of the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("BZip2InputStream Seek not supported"); - } - - /// - /// Sets the length of this stream to the given value. - /// This operation is not supported and will throw a NotSupportedExceptionortedException - /// - /// The new length for the stream. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("BZip2InputStream SetLength not supported"); - } - - /// - /// Writes a block of bytes to this stream using data from a buffer. - /// This operation is not supported and will throw a NotSupportedException - /// - /// The buffer to source data from. - /// The offset to start obtaining data from. - /// The number of bytes of data to write. - /// Any access - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("BZip2InputStream Write not supported"); - } - - /// - /// Writes a byte to the current position in the file stream. - /// This operation is not supported and will throw a NotSupportedException - /// - /// The value to write. - /// Any access - public override void WriteByte(byte value) - { - throw new NotSupportedException("BZip2InputStream WriteByte not supported"); - } - - /// - /// Read a sequence of bytes and advances the read position by one byte. - /// - /// Array of bytes to store values in - /// Offset in array to begin storing data - /// The maximum number of bytes to read - /// The total number of bytes read into the buffer. This might be less - /// than the number of bytes requested if that number of bytes are not - /// currently available or zero if the end of the stream is reached. - /// - public override int Read(byte[] buffer, int offset, int count) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - for (int i = 0; i < count; ++i) - { - int rb = ReadByte(); - if (rb == -1) - { - return i; - } - buffer[offset + i] = (byte)rb; - } - return count; - } - - /// - /// Closes the stream, releasing any associated resources. - /// - public override void Close() - { - if (IsStreamOwner && (baseStream != null)) - { - baseStream.Close(); - } - } - /// - /// Read a byte from stream advancing position - /// - /// byte read or -1 on end of stream - public override int ReadByte() - { - if (streamEnd) - { - return -1; // ok - } - - int retChar = currentChar; - switch (currentState) - { - case RAND_PART_B_STATE: - SetupRandPartB(); - break; - case RAND_PART_C_STATE: - SetupRandPartC(); - break; - case NO_RAND_PART_B_STATE: - SetupNoRandPartB(); - break; - case NO_RAND_PART_C_STATE: - SetupNoRandPartC(); - break; - case START_BLOCK_STATE: - case NO_RAND_PART_A_STATE: - case RAND_PART_A_STATE: - break; - default: - break; - } - return retChar; - } - - #endregion - - void MakeMaps() - { - nInUse = 0; - for (int i = 0; i < 256; ++i) - { - if (inUse[i]) - { - seqToUnseq[nInUse] = (byte)i; - unseqToSeq[i] = (byte)nInUse; - nInUse++; - } - } - } - - void Initialize() - { - char magic1 = BsGetUChar(); - char magic2 = BsGetUChar(); - - char magic3 = BsGetUChar(); - char magic4 = BsGetUChar(); - - if (magic1 != 'B' || magic2 != 'Z' || magic3 != 'h' || magic4 < '1' || magic4 > '9') - { - streamEnd = true; - return; - } - - SetDecompressStructureSizes(magic4 - '0'); - computedCombinedCRC = 0; - } - - void InitBlock() - { - char magic1 = BsGetUChar(); - char magic2 = BsGetUChar(); - char magic3 = BsGetUChar(); - char magic4 = BsGetUChar(); - char magic5 = BsGetUChar(); - char magic6 = BsGetUChar(); - - if (magic1 == 0x17 && magic2 == 0x72 && magic3 == 0x45 && magic4 == 0x38 && magic5 == 0x50 && magic6 == 0x90) - { - Complete(); - return; - } - - if (magic1 != 0x31 || magic2 != 0x41 || magic3 != 0x59 || magic4 != 0x26 || magic5 != 0x53 || magic6 != 0x59) - { - BadBlockHeader(); - streamEnd = true; - return; - } - - storedBlockCRC = BsGetInt32(); - - blockRandomised = (BsR(1) == 1); - - GetAndMoveToFrontDecode(); - - mCrc.Reset(); - currentState = START_BLOCK_STATE; - } - - void EndBlock() - { - computedBlockCRC = (int)mCrc.Value; - - // -- A bad CRC is considered a fatal error. -- - if (storedBlockCRC != computedBlockCRC) - { - CrcError(); - } - - // 1528150659 - computedCombinedCRC = ((computedCombinedCRC << 1) & 0xFFFFFFFF) | (computedCombinedCRC >> 31); - computedCombinedCRC = computedCombinedCRC ^ (uint)computedBlockCRC; - } - - void Complete() - { - storedCombinedCRC = BsGetInt32(); - if (storedCombinedCRC != (int)computedCombinedCRC) - { - CrcError(); - } - - streamEnd = true; - } - - void BsSetStream(Stream stream) - { - baseStream = stream; - bsLive = 0; - bsBuff = 0; - } - - void FillBuffer() - { - int thech = 0; - - try - { - thech = baseStream.ReadByte(); - } - catch (Exception) - { - CompressedStreamEOF(); - } - - if (thech == -1) - { - CompressedStreamEOF(); - } - - bsBuff = (bsBuff << 8) | (thech & 0xFF); - bsLive += 8; - } - - int BsR(int n) - { - while (bsLive < n) - { - FillBuffer(); - } - - int v = (bsBuff >> (bsLive - n)) & ((1 << n) - 1); - bsLive -= n; - return v; - } - - char BsGetUChar() - { - return (char)BsR(8); - } - - int BsGetIntVS(int numBits) - { - return BsR(numBits); - } - - int BsGetInt32() - { - int result = BsR(8); - result = (result << 8) | BsR(8); - result = (result << 8) | BsR(8); - result = (result << 8) | BsR(8); - return result; - } - - void RecvDecodingTables() - { - char[][] len = new char[BZip2Constants.GroupCount][]; - for (int i = 0; i < BZip2Constants.GroupCount; ++i) - { - len[i] = new char[BZip2Constants.MaximumAlphaSize]; - } - - bool[] inUse16 = new bool[16]; - - //--- Receive the mapping table --- - for (int i = 0; i < 16; i++) - { - inUse16[i] = (BsR(1) == 1); - } - - for (int i = 0; i < 16; i++) - { - if (inUse16[i]) - { - for (int j = 0; j < 16; j++) - { - inUse[i * 16 + j] = (BsR(1) == 1); - } - } - else - { - for (int j = 0; j < 16; j++) - { - inUse[i * 16 + j] = false; - } - } - } - - MakeMaps(); - int alphaSize = nInUse + 2; - - //--- Now the selectors --- - int nGroups = BsR(3); - int nSelectors = BsR(15); - - for (int i = 0; i < nSelectors; i++) - { - int j = 0; - while (BsR(1) == 1) - { - j++; - } - selectorMtf[i] = (byte)j; - } - - //--- Undo the MTF values for the selectors. --- - byte[] pos = new byte[BZip2Constants.GroupCount]; - for (int v = 0; v < nGroups; v++) - { - pos[v] = (byte)v; - } - - for (int i = 0; i < nSelectors; i++) - { - int v = selectorMtf[i]; - byte tmp = pos[v]; - while (v > 0) - { - pos[v] = pos[v - 1]; - v--; - } - pos[0] = tmp; - selector[i] = tmp; - } - - //--- Now the coding tables --- - for (int t = 0; t < nGroups; t++) - { - int curr = BsR(5); - for (int i = 0; i < alphaSize; i++) - { - while (BsR(1) == 1) - { - if (BsR(1) == 0) - { - curr++; - } - else - { - curr--; - } - } - len[t][i] = (char)curr; - } - } - - //--- Create the Huffman decoding tables --- - for (int t = 0; t < nGroups; t++) - { - int minLen = 32; - int maxLen = 0; - for (int i = 0; i < alphaSize; i++) - { - maxLen = Math.Max(maxLen, len[t][i]); - minLen = Math.Min(minLen, len[t][i]); - } - HbCreateDecodeTables(limit[t], baseArray[t], perm[t], len[t], minLen, maxLen, alphaSize); - minLens[t] = minLen; - } - } - - void GetAndMoveToFrontDecode() - { - byte[] yy = new byte[256]; - int nextSym; - - int limitLast = BZip2Constants.BaseBlockSize * blockSize100k; - origPtr = BsGetIntVS(24); - - RecvDecodingTables(); - int EOB = nInUse + 1; - int groupNo = -1; - int groupPos = 0; - - /*-- - Setting up the unzftab entries here is not strictly - necessary, but it does save having to do it later - in a separate pass, and so saves a block's worth of - cache misses. - --*/ - for (int i = 0; i <= 255; i++) - { - unzftab[i] = 0; - } - - for (int i = 0; i <= 255; i++) - { - yy[i] = (byte)i; - } - - last = -1; - - if (groupPos == 0) - { - groupNo++; - groupPos = BZip2Constants.GroupSize; - } - - groupPos--; - int zt = selector[groupNo]; - int zn = minLens[zt]; - int zvec = BsR(zn); - int zj; - - while (zvec > limit[zt][zn]) - { - if (zn > 20) - { // the longest code - throw new Exception("Bzip data error"); - } - zn++; - while (bsLive < 1) - { - FillBuffer(); - } - zj = (bsBuff >> (bsLive - 1)) & 1; - bsLive--; - zvec = (zvec << 1) | zj; - } - if (zvec - baseArray[zt][zn] < 0 || zvec - baseArray[zt][zn] >= BZip2Constants.MaximumAlphaSize) - { - throw new Exception("Bzip data error"); - } - nextSym = perm[zt][zvec - baseArray[zt][zn]]; - - while (true) - { - if (nextSym == EOB) - { - break; - } - - if (nextSym == BZip2Constants.RunA || nextSym == BZip2Constants.RunB) - { - int s = -1; - int n = 1; - do - { - if (nextSym == BZip2Constants.RunA) - { - s += (0 + 1) * n; - } - else if (nextSym == BZip2Constants.RunB) - { - s += (1 + 1) * n; - } - - n <<= 1; - - if (groupPos == 0) - { - groupNo++; - groupPos = BZip2Constants.GroupSize; - } - - groupPos--; - - zt = selector[groupNo]; - zn = minLens[zt]; - zvec = BsR(zn); - - while (zvec > limit[zt][zn]) - { - zn++; - while (bsLive < 1) - { - FillBuffer(); - } - zj = (bsBuff >> (bsLive - 1)) & 1; - bsLive--; - zvec = (zvec << 1) | zj; - } - nextSym = perm[zt][zvec - baseArray[zt][zn]]; - } while (nextSym == BZip2Constants.RunA || nextSym == BZip2Constants.RunB); - - s++; - byte ch = seqToUnseq[yy[0]]; - unzftab[ch] += s; - - while (s > 0) - { - last++; - ll8[last] = ch; - s--; - } - - if (last >= limitLast) - { - BlockOverrun(); - } - continue; - } - else - { - last++; - if (last >= limitLast) - { - BlockOverrun(); - } - - byte tmp = yy[nextSym - 1]; - unzftab[seqToUnseq[tmp]]++; - ll8[last] = seqToUnseq[tmp]; - - for (int j = nextSym - 1; j > 0; --j) - { - yy[j] = yy[j - 1]; - } - yy[0] = tmp; - - if (groupPos == 0) - { - groupNo++; - groupPos = BZip2Constants.GroupSize; - } - - groupPos--; - zt = selector[groupNo]; - zn = minLens[zt]; - zvec = BsR(zn); - while (zvec > limit[zt][zn]) - { - zn++; - while (bsLive < 1) - { - FillBuffer(); - } - zj = (bsBuff >> (bsLive - 1)) & 1; - bsLive--; - zvec = (zvec << 1) | zj; - } - nextSym = perm[zt][zvec - baseArray[zt][zn]]; - continue; - } - } - } - - void SetupBlock() - { - int[] cftab = new int[257]; - - cftab[0] = 0; - Array.Copy(unzftab, 0, cftab, 1, 256); - - for (int i = 1; i <= 256; i++) - { - cftab[i] += cftab[i - 1]; - } - - for (int i = 0; i <= last; i++) - { - byte ch = ll8[i]; - tt[cftab[ch]] = i; - cftab[ch]++; - } - - cftab = null; - - tPos = tt[origPtr]; - - count = 0; - i2 = 0; - ch2 = 256; /*-- not a char and not EOF --*/ - - if (blockRandomised) - { - rNToGo = 0; - rTPos = 0; - SetupRandPartA(); - } - else - { - SetupNoRandPartA(); - } - } - - void SetupRandPartA() - { - if (i2 <= last) - { - chPrev = ch2; - ch2 = ll8[tPos]; - tPos = tt[tPos]; - if (rNToGo == 0) - { - rNToGo = BZip2Constants.RandomNumbers[rTPos]; - rTPos++; - if (rTPos == 512) - { - rTPos = 0; - } - } - rNToGo--; - ch2 ^= (int)((rNToGo == 1) ? 1 : 0); - i2++; - - currentChar = ch2; - currentState = RAND_PART_B_STATE; - mCrc.Update(ch2); - } - else - { - EndBlock(); - InitBlock(); - SetupBlock(); - } - } - - void SetupNoRandPartA() - { - if (i2 <= last) - { - chPrev = ch2; - ch2 = ll8[tPos]; - tPos = tt[tPos]; - i2++; - - currentChar = ch2; - currentState = NO_RAND_PART_B_STATE; - mCrc.Update(ch2); - } - else - { - EndBlock(); - InitBlock(); - SetupBlock(); - } - } - - void SetupRandPartB() - { - if (ch2 != chPrev) - { - currentState = RAND_PART_A_STATE; - count = 1; - SetupRandPartA(); - } - else - { - count++; - if (count >= 4) - { - z = ll8[tPos]; - tPos = tt[tPos]; - if (rNToGo == 0) - { - rNToGo = BZip2Constants.RandomNumbers[rTPos]; - rTPos++; - if (rTPos == 512) - { - rTPos = 0; - } - } - rNToGo--; - z ^= (byte)((rNToGo == 1) ? 1 : 0); - j2 = 0; - currentState = RAND_PART_C_STATE; - SetupRandPartC(); - } - else - { - currentState = RAND_PART_A_STATE; - SetupRandPartA(); - } - } - } - - void SetupRandPartC() - { - if (j2 < (int)z) - { - currentChar = ch2; - mCrc.Update(ch2); - j2++; - } - else - { - currentState = RAND_PART_A_STATE; - i2++; - count = 0; - SetupRandPartA(); - } - } - - void SetupNoRandPartB() - { - if (ch2 != chPrev) - { - currentState = NO_RAND_PART_A_STATE; - count = 1; - SetupNoRandPartA(); - } - else - { - count++; - if (count >= 4) - { - z = ll8[tPos]; - tPos = tt[tPos]; - currentState = NO_RAND_PART_C_STATE; - j2 = 0; - SetupNoRandPartC(); - } - else - { - currentState = NO_RAND_PART_A_STATE; - SetupNoRandPartA(); - } - } - } - - void SetupNoRandPartC() - { - if (j2 < (int)z) - { - currentChar = ch2; - mCrc.Update(ch2); - j2++; - } - else - { - currentState = NO_RAND_PART_A_STATE; - i2++; - count = 0; - SetupNoRandPartA(); - } - } - - void SetDecompressStructureSizes(int newSize100k) - { - if (!(0 <= newSize100k && newSize100k <= 9 && 0 <= blockSize100k && blockSize100k <= 9)) - { - throw new Exception("Invalid block size"); - } - - blockSize100k = newSize100k; - - if (newSize100k == 0) - { - return; - } - - int n = BZip2Constants.BaseBlockSize * newSize100k; - ll8 = new byte[n]; - tt = new int[n]; - } - - static void CompressedStreamEOF() - { - throw new EndOfStreamException("BZip2 input stream end of compressed stream"); - } - - static void BlockOverrun() - { - throw new Exception("BZip2 input stream block overrun"); - } - - static void BadBlockHeader() - { - throw new Exception("BZip2 input stream bad block header"); - } - - static void CrcError() - { - throw new Exception("BZip2 input stream crc error"); - } - - static void HbCreateDecodeTables(int[] limit, int[] baseArray, int[] perm, char[] length, int minLen, int maxLen, int alphaSize) - { - int pp = 0; - - for (int i = minLen; i <= maxLen; ++i) - { - for (int j = 0; j < alphaSize; ++j) - { - if (length[j] == i) - { - perm[pp] = j; - ++pp; - } - } - } - - for (int i = 0; i < BZip2Constants.MaximumCodeLength; i++) - { - baseArray[i] = 0; - } - - for (int i = 0; i < alphaSize; i++) - { - ++baseArray[length[i] + 1]; - } - - for (int i = 1; i < BZip2Constants.MaximumCodeLength; i++) - { - baseArray[i] += baseArray[i - 1]; - } - - for (int i = 0; i < BZip2Constants.MaximumCodeLength; i++) - { - limit[i] = 0; - } - - int vec = 0; - - for (int i = minLen; i <= maxLen; i++) - { - vec += (baseArray[i + 1] - baseArray[i]); - limit[i] = vec - 1; - vec <<= 1; - } - - for (int i = minLen + 1; i <= maxLen; i++) - { - baseArray[i] = ((limit[i - 1] + 1) << 1) - baseArray[i]; - } - } - - #region Instance Fields - /*-- - index of the last char in the block, so - the block size == last + 1. - --*/ - int last; - - /*-- - index in zptr[] of original string after sorting. - --*/ - int origPtr; - - /*-- - always: in the range 0 .. 9. - The current block size is 100000 * this number. - --*/ - int blockSize100k; - - bool blockRandomised; - - int bsBuff; - int bsLive; - StrangeCRC mCrc = new StrangeCRC(); - - bool[] inUse = new bool[256]; - int nInUse; - - byte[] seqToUnseq = new byte[256]; - byte[] unseqToSeq = new byte[256]; - - byte[] selector = new byte[BZip2Constants.MaximumSelectors]; - byte[] selectorMtf = new byte[BZip2Constants.MaximumSelectors]; - - int[] tt; - byte[] ll8; - - /*-- - freq table collected to save a pass over the data - during decompression. - --*/ - int[] unzftab = new int[256]; - - int[][] limit = new int[BZip2Constants.GroupCount][]; - int[][] baseArray = new int[BZip2Constants.GroupCount][]; - int[][] perm = new int[BZip2Constants.GroupCount][]; - int[] minLens = new int[BZip2Constants.GroupCount]; - - Stream baseStream; - bool streamEnd; - - int currentChar = -1; - - int currentState = START_BLOCK_STATE; - - int storedBlockCRC, storedCombinedCRC; - int computedBlockCRC; - uint computedCombinedCRC; - - int count, chPrev, ch2; - int tPos; - int rNToGo; - int rTPos; - int i2, j2; - byte z; - bool isStreamOwner = true; - #endregion - } - #endregion - - #region OutStream - // TODO: Update to BZip2 1.0.1, 1.0.2 - - /// - /// An output stream that compresses into the BZip2 format - /// including file header chars into another stream. - /// - public class BZip2OutputStream : Stream - { - #region Constants - const int SETMASK = (1 << 21); - const int CLEARMASK = (~SETMASK); - const int GREATER_ICOST = 15; - const int LESSER_ICOST = 0; - const int SMALL_THRESH = 20; - const int DEPTH_THRESH = 10; - - /*-- - If you are ever unlucky/improbable enough - to get a stack overflow whilst sorting, - increase the following constant and try - again. In practice I have never seen the - stack go above 27 elems, so the following - limit seems very generous. - --*/ - const int QSORT_STACK_SIZE = 1000; - - /*-- - Knuth's increments seem to work better - than Incerpi-Sedgewick here. Possibly - because the number of elems to sort is - usually small, typically <= 20. - --*/ - readonly int[] increments = new int[] { - 1, 4, 13, 40, 121, 364, 1093, 3280, - 9841, 29524, 88573, 265720, - 797161, 2391484 - }; - #endregion - - #region Constructors - /// - /// Construct a default output stream with maximum block size - /// - /// The stream to write BZip data onto. - public BZip2OutputStream(Stream stream) - : this(stream, 9) - { - } - - /// - /// Initialise a new instance of the - /// for the specified stream, using the given blocksize. - /// - /// The stream to write compressed data to. - /// The block size to use. - /// - /// Valid block sizes are in the range 1..9, with 1 giving - /// the lowest compression and 9 the highest. - /// - public BZip2OutputStream(Stream stream, int blockSize) - { - BsSetStream(stream); - - workFactor = 50; - if (blockSize > 9) - { - blockSize = 9; - } - - if (blockSize < 1) - { - blockSize = 1; - } - blockSize100k = blockSize; - AllocateCompressStructures(); - Initialize(); - InitBlock(); - } - #endregion - - #region Destructor - /// - /// Ensures that resources are freed and other cleanup operations - /// are performed when the garbage collector reclaims the BZip2OutputStream. - /// - ~BZip2OutputStream() - { - Dispose(false); - } - #endregion - - /// - /// Get/set flag indicating ownership of underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return isStreamOwner; } - set { isStreamOwner = value; } - } - - - #region Stream overrides - /// - /// Gets a value indicating whether the current stream supports reading - /// - public override bool CanRead - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether the current stream supports seeking - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether the current stream supports writing - /// - public override bool CanWrite - { - get - { - return baseStream.CanWrite; - } - } - - /// - /// Gets the length in bytes of the stream - /// - public override long Length - { - get - { - return baseStream.Length; - } - } - - /// - /// Gets or sets the current position of this stream. - /// - public override long Position - { - get - { - return baseStream.Position; - } - set - { - throw new NotSupportedException("BZip2OutputStream position cannot be set"); - } - } - - /// - /// Sets the current position of this stream to the given value. - /// - /// The point relative to the offset from which to being seeking. - /// The reference point from which to begin seeking. - /// The new position in the stream. - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("BZip2OutputStream Seek not supported"); - } - - /// - /// Sets the length of this stream to the given value. - /// - /// The new stream length. - public override void SetLength(long value) - { - throw new NotSupportedException("BZip2OutputStream SetLength not supported"); - } - - /// - /// Read a byte from the stream advancing the position. - /// - /// The byte read cast to an int; -1 if end of stream. - public override int ReadByte() - { - throw new NotSupportedException("BZip2OutputStream ReadByte not supported"); - } - - /// - /// Read a block of bytes - /// - /// The buffer to read into. - /// The offset in the buffer to start storing data at. - /// The maximum number of bytes to read. - /// The total number of bytes read. This might be less than the number of bytes - /// requested if that number of bytes are not currently available, or zero - /// if the end of the stream is reached. - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("BZip2OutputStream Read not supported"); - } - - /// - /// Write a block of bytes to the stream - /// - /// The buffer containing data to write. - /// The offset of the first byte to write. - /// The number of bytes to write. - public override void Write(byte[] buffer, int offset, int count) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - if (offset < 0) - { - throw new ArgumentOutOfRangeException("offset"); - } - - if (count < 0) - { - throw new ArgumentOutOfRangeException("count"); - } - - if (buffer.Length - offset < count) - { - throw new ArgumentException("Offset/count out of range"); - } - - for (int i = 0; i < count; ++i) - { - WriteByte(buffer[offset + i]); - } - } - - /// - /// Write a byte to the stream. - /// - /// The byte to write to the stream. - public override void WriteByte(byte value) - { - int b = (256 + value) % 256; - if (currentChar != -1) - { - if (currentChar == b) - { - runLength++; - if (runLength > 254) - { - WriteRun(); - currentChar = -1; - runLength = 0; - } - } - else - { - WriteRun(); - runLength = 1; - currentChar = b; - } - } - else - { - currentChar = b; - runLength++; - } - } - - /// - /// End the current block and end compression. - /// Close the stream and free any resources - /// - public override void Close() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - void MakeMaps() - { - nInUse = 0; - for (int i = 0; i < 256; i++) - { - if (inUse[i]) - { - seqToUnseq[nInUse] = (char)i; - unseqToSeq[i] = (char)nInUse; - nInUse++; - } - } - } - - /// - /// Get the number of bytes written to output. - /// - void WriteRun() - { - if (last < allowableBlockSize) - { - inUse[currentChar] = true; - for (int i = 0; i < runLength; i++) - { - mCrc.Update(currentChar); - } - - switch (runLength) - { - case 1: - last++; - block[last + 1] = (byte)currentChar; - break; - case 2: - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - break; - case 3: - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - break; - default: - inUse[runLength - 4] = true; - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)currentChar; - last++; - block[last + 1] = (byte)(runLength - 4); - break; - } - } - else - { - EndBlock(); - InitBlock(); - WriteRun(); - } - } - - /// - /// Get the number of bytes written to the output. - /// - public int BytesWritten - { - get { return bytesOut; } - } - - /// - /// Releases the unmanaged resources used by the and optionally releases the managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - override protected void Dispose(bool disposing) - { - try - { - base.Dispose(disposing); - if (!disposed_) - { - disposed_ = true; - - if (runLength > 0) - { - WriteRun(); - } - - currentChar = -1; - EndBlock(); - EndCompression(); - Flush(); - } - } - finally - { - if (disposing) - { - if (IsStreamOwner) - { - baseStream.Close(); - } - } - } - } - - /// - /// Flush output buffers - /// - public override void Flush() - { - baseStream.Flush(); - } - - void Initialize() - { - bytesOut = 0; - nBlocksRandomised = 0; - - /*--- Write header `magic' bytes indicating file-format == huffmanised, - followed by a digit indicating blockSize100k. - ---*/ - - BsPutUChar('B'); - BsPutUChar('Z'); - - BsPutUChar('h'); - BsPutUChar('0' + blockSize100k); - - combinedCRC = 0; - } - - void InitBlock() - { - mCrc.Reset(); - last = -1; - - for (int i = 0; i < 256; i++) - { - inUse[i] = false; - } - - /*--- 20 is just a paranoia constant ---*/ - allowableBlockSize = BZip2Constants.BaseBlockSize * blockSize100k - 20; - } - - void EndBlock() - { - if (last < 0) - { // dont do anything for empty files, (makes empty files compatible with original Bzip) - return; - } - - blockCRC = unchecked((uint)mCrc.Value); - combinedCRC = (combinedCRC << 1) | (combinedCRC >> 31); - combinedCRC ^= blockCRC; - - /*-- sort the block and establish position of original string --*/ - DoReversibleTransformation(); - - /*-- - A 6-byte block header, the value chosen arbitrarily - as 0x314159265359 :-). A 32 bit value does not really - give a strong enough guarantee that the value will not - appear by chance in the compressed datastream. Worst-case - probability of this event, for a 900k block, is about - 2.0e-3 for 32 bits, 1.0e-5 for 40 bits and 4.0e-8 for 48 bits. - For a compressed file of size 100Gb -- about 100000 blocks -- - only a 48-bit marker will do. NB: normal compression/ - decompression do *not* rely on these statistical properties. - They are only important when trying to recover blocks from - damaged files. - --*/ - BsPutUChar(0x31); - BsPutUChar(0x41); - BsPutUChar(0x59); - BsPutUChar(0x26); - BsPutUChar(0x53); - BsPutUChar(0x59); - - /*-- Now the block's CRC, so it is in a known place. --*/ - unchecked - { - BsPutint((int)blockCRC); - } - - /*-- Now a single bit indicating randomisation. --*/ - if (blockRandomised) - { - BsW(1, 1); - nBlocksRandomised++; - } - else - { - BsW(1, 0); - } - - /*-- Finally, block's contents proper. --*/ - MoveToFrontCodeAndSend(); - } - - void EndCompression() - { - /*-- - Now another magic 48-bit number, 0x177245385090, to - indicate the end of the last block. (sqrt(pi), if - you want to know. I did want to use e, but it contains - too much repetition -- 27 18 28 18 28 46 -- for me - to feel statistically comfortable. Call me paranoid.) - --*/ - BsPutUChar(0x17); - BsPutUChar(0x72); - BsPutUChar(0x45); - BsPutUChar(0x38); - BsPutUChar(0x50); - BsPutUChar(0x90); - - unchecked - { - BsPutint((int)combinedCRC); - } - - BsFinishedWithStream(); - } - - void BsSetStream(Stream stream) - { - baseStream = stream; - bsLive = 0; - bsBuff = 0; - bytesOut = 0; - } - - void BsFinishedWithStream() - { - while (bsLive > 0) - { - int ch = (bsBuff >> 24); - baseStream.WriteByte((byte)ch); // write 8-bit - bsBuff <<= 8; - bsLive -= 8; - bytesOut++; - } - } - - void BsW(int n, int v) - { - while (bsLive >= 8) - { - int ch = (bsBuff >> 24); - unchecked { baseStream.WriteByte((byte)ch); } // write 8-bit - bsBuff <<= 8; - bsLive -= 8; - ++bytesOut; - } - bsBuff |= (v << (32 - bsLive - n)); - bsLive += n; - } - - void BsPutUChar(int c) - { - BsW(8, c); - } - - void BsPutint(int u) - { - BsW(8, (u >> 24) & 0xFF); - BsW(8, (u >> 16) & 0xFF); - BsW(8, (u >> 8) & 0xFF); - BsW(8, u & 0xFF); - } - - void BsPutIntVS(int numBits, int c) - { - BsW(numBits, c); - } - - void SendMTFValues() - { - char[][] len = new char[BZip2Constants.GroupCount][]; - for (int i = 0; i < BZip2Constants.GroupCount; ++i) - { - len[i] = new char[BZip2Constants.MaximumAlphaSize]; - } - - int gs, ge, totc, bt, bc, iter; - int nSelectors = 0, alphaSize, minLen, maxLen, selCtr; - int nGroups; - - alphaSize = nInUse + 2; - for (int t = 0; t < BZip2Constants.GroupCount; t++) - { - for (int v = 0; v < alphaSize; v++) - { - len[t][v] = (char)GREATER_ICOST; - } - } - - /*--- Decide how many coding tables to use ---*/ - if (nMTF <= 0) - { - Panic(); - } - - if (nMTF < 200) - { - nGroups = 2; - } - else if (nMTF < 600) - { - nGroups = 3; - } - else if (nMTF < 1200) - { - nGroups = 4; - } - else if (nMTF < 2400) - { - nGroups = 5; - } - else - { - nGroups = 6; - } - - /*--- Generate an initial set of coding tables ---*/ - int nPart = nGroups; - int remF = nMTF; - gs = 0; - while (nPart > 0) - { - int tFreq = remF / nPart; - int aFreq = 0; - ge = gs - 1; - while (aFreq < tFreq && ge < alphaSize - 1) - { - ge++; - aFreq += mtfFreq[ge]; - } - - if (ge > gs && nPart != nGroups && nPart != 1 && ((nGroups - nPart) % 2 == 1)) - { - aFreq -= mtfFreq[ge]; - ge--; - } - - for (int v = 0; v < alphaSize; v++) - { - if (v >= gs && v <= ge) - { - len[nPart - 1][v] = (char)LESSER_ICOST; - } - else - { - len[nPart - 1][v] = (char)GREATER_ICOST; - } - } - - nPart--; - gs = ge + 1; - remF -= aFreq; - } - - int[][] rfreq = new int[BZip2Constants.GroupCount][]; - for (int i = 0; i < BZip2Constants.GroupCount; ++i) - { - rfreq[i] = new int[BZip2Constants.MaximumAlphaSize]; - } - - int[] fave = new int[BZip2Constants.GroupCount]; - short[] cost = new short[BZip2Constants.GroupCount]; - /*--- - Iterate up to N_ITERS times to improve the tables. - ---*/ - for (iter = 0; iter < BZip2Constants.NumberOfIterations; ++iter) - { - for (int t = 0; t < nGroups; ++t) - { - fave[t] = 0; - } - - for (int t = 0; t < nGroups; ++t) - { - for (int v = 0; v < alphaSize; ++v) - { - rfreq[t][v] = 0; - } - } - - nSelectors = 0; - totc = 0; - gs = 0; - while (true) - { - /*--- Set group start & end marks. --*/ - if (gs >= nMTF) - { - break; - } - ge = gs + BZip2Constants.GroupSize - 1; - if (ge >= nMTF) - { - ge = nMTF - 1; - } - - /*-- - Calculate the cost of this group as coded - by each of the coding tables. - --*/ - for (int t = 0; t < nGroups; t++) - { - cost[t] = 0; - } - - if (nGroups == 6) - { - short cost0, cost1, cost2, cost3, cost4, cost5; - cost0 = cost1 = cost2 = cost3 = cost4 = cost5 = 0; - for (int i = gs; i <= ge; ++i) - { - short icv = szptr[i]; - cost0 += (short)len[0][icv]; - cost1 += (short)len[1][icv]; - cost2 += (short)len[2][icv]; - cost3 += (short)len[3][icv]; - cost4 += (short)len[4][icv]; - cost5 += (short)len[5][icv]; - } - cost[0] = cost0; - cost[1] = cost1; - cost[2] = cost2; - cost[3] = cost3; - cost[4] = cost4; - cost[5] = cost5; - } - else - { - for (int i = gs; i <= ge; ++i) - { - short icv = szptr[i]; - for (int t = 0; t < nGroups; t++) - { - cost[t] += (short)len[t][icv]; - } - } - } - - /*-- - Find the coding table which is best for this group, - and record its identity in the selector table. - --*/ - bc = 999999999; - bt = -1; - for (int t = 0; t < nGroups; ++t) - { - if (cost[t] < bc) - { - bc = cost[t]; - bt = t; - } - } - totc += bc; - fave[bt]++; - selector[nSelectors] = (char)bt; - nSelectors++; - - /*-- - Increment the symbol frequencies for the selected table. - --*/ - for (int i = gs; i <= ge; ++i) - { - ++rfreq[bt][szptr[i]]; - } - - gs = ge + 1; - } - - /*-- - Recompute the tables based on the accumulated frequencies. - --*/ - for (int t = 0; t < nGroups; ++t) - { - HbMakeCodeLengths(len[t], rfreq[t], alphaSize, 20); - } - } - - rfreq = null; - fave = null; - cost = null; - - if (!(nGroups < 8)) - { - Panic(); - } - - if (!(nSelectors < 32768 && nSelectors <= (2 + (900000 / BZip2Constants.GroupSize)))) - { - Panic(); - } - - /*--- Compute MTF values for the selectors. ---*/ - char[] pos = new char[BZip2Constants.GroupCount]; - char ll_i, tmp2, tmp; - - for (int i = 0; i < nGroups; i++) - { - pos[i] = (char)i; - } - - for (int i = 0; i < nSelectors; i++) - { - ll_i = selector[i]; - int j = 0; - tmp = pos[j]; - while (ll_i != tmp) - { - j++; - tmp2 = tmp; - tmp = pos[j]; - pos[j] = tmp2; - } - pos[0] = tmp; - selectorMtf[i] = (char)j; - } - - int[][] code = new int[BZip2Constants.GroupCount][]; - - for (int i = 0; i < BZip2Constants.GroupCount; ++i) - { - code[i] = new int[BZip2Constants.MaximumAlphaSize]; - } - - /*--- Assign actual codes for the tables. --*/ - for (int t = 0; t < nGroups; t++) - { - minLen = 32; - maxLen = 0; - for (int i = 0; i < alphaSize; i++) - { - if (len[t][i] > maxLen) - { - maxLen = len[t][i]; - } - if (len[t][i] < minLen) - { - minLen = len[t][i]; - } - } - if (maxLen > 20) - { - Panic(); - } - if (minLen < 1) - { - Panic(); - } - HbAssignCodes(code[t], len[t], minLen, maxLen, alphaSize); - } - - /*--- Transmit the mapping table. ---*/ - bool[] inUse16 = new bool[16]; - for (int i = 0; i < 16; ++i) - { - inUse16[i] = false; - for (int j = 0; j < 16; ++j) - { - if (inUse[i * 16 + j]) - { - inUse16[i] = true; - } - } - } - - for (int i = 0; i < 16; ++i) - { - if (inUse16[i]) - { - BsW(1, 1); - } - else - { - BsW(1, 0); - } - } - - for (int i = 0; i < 16; ++i) - { - if (inUse16[i]) - { - for (int j = 0; j < 16; ++j) - { - if (inUse[i * 16 + j]) - { - BsW(1, 1); - } - else - { - BsW(1, 0); - } - } - } - } - - /*--- Now the selectors. ---*/ - BsW(3, nGroups); - BsW(15, nSelectors); - for (int i = 0; i < nSelectors; ++i) - { - for (int j = 0; j < selectorMtf[i]; ++j) - { - BsW(1, 1); - } - BsW(1, 0); - } - - /*--- Now the coding tables. ---*/ - for (int t = 0; t < nGroups; ++t) - { - int curr = len[t][0]; - BsW(5, curr); - for (int i = 0; i < alphaSize; ++i) - { - while (curr < len[t][i]) - { - BsW(2, 2); - curr++; /* 10 */ - } - while (curr > len[t][i]) - { - BsW(2, 3); - curr--; /* 11 */ - } - BsW(1, 0); - } - } - - /*--- And finally, the block data proper ---*/ - selCtr = 0; - gs = 0; - while (true) - { - if (gs >= nMTF) - { - break; - } - ge = gs + BZip2Constants.GroupSize - 1; - if (ge >= nMTF) - { - ge = nMTF - 1; - } - - for (int i = gs; i <= ge; i++) - { - BsW(len[selector[selCtr]][szptr[i]], code[selector[selCtr]][szptr[i]]); - } - - gs = ge + 1; - ++selCtr; - } - if (!(selCtr == nSelectors)) - { - Panic(); - } - } - - void MoveToFrontCodeAndSend() - { - BsPutIntVS(24, origPtr); - GenerateMTFValues(); - SendMTFValues(); - } - - void SimpleSort(int lo, int hi, int d) - { - int i, j, h, bigN, hp; - int v; - - bigN = hi - lo + 1; - if (bigN < 2) - { - return; - } - - hp = 0; - while (increments[hp] < bigN) - { - hp++; - } - hp--; - - for (; hp >= 0; hp--) - { - h = increments[hp]; - - i = lo + h; - while (true) - { - /*-- copy 1 --*/ - if (i > hi) - break; - v = zptr[i]; - j = i; - while (FullGtU(zptr[j - h] + d, v + d)) - { - zptr[j] = zptr[j - h]; - j = j - h; - if (j <= (lo + h - 1)) - break; - } - zptr[j] = v; - i++; - - /*-- copy 2 --*/ - if (i > hi) - { - break; - } - v = zptr[i]; - j = i; - while (FullGtU(zptr[j - h] + d, v + d)) - { - zptr[j] = zptr[j - h]; - j = j - h; - if (j <= (lo + h - 1)) - { - break; - } - } - zptr[j] = v; - i++; - - /*-- copy 3 --*/ - if (i > hi) - { - break; - } - v = zptr[i]; - j = i; - while (FullGtU(zptr[j - h] + d, v + d)) - { - zptr[j] = zptr[j - h]; - j = j - h; - if (j <= (lo + h - 1)) - { - break; - } - } - zptr[j] = v; - i++; - - if (workDone > workLimit && firstAttempt) - { - return; - } - } - } - } - - void Vswap(int p1, int p2, int n) - { - int temp = 0; - while (n > 0) - { - temp = zptr[p1]; - zptr[p1] = zptr[p2]; - zptr[p2] = temp; - p1++; - p2++; - n--; - } - } - - void QSort3(int loSt, int hiSt, int dSt) - { - int unLo, unHi, ltLo, gtHi, med, n, m; - int lo, hi, d; - - StackElement[] stack = new StackElement[QSORT_STACK_SIZE]; - - int sp = 0; - - stack[sp].ll = loSt; - stack[sp].hh = hiSt; - stack[sp].dd = dSt; - sp++; - - while (sp > 0) - { - if (sp >= QSORT_STACK_SIZE) - { - Panic(); - } - - sp--; - lo = stack[sp].ll; - hi = stack[sp].hh; - d = stack[sp].dd; - - if (hi - lo < SMALL_THRESH || d > DEPTH_THRESH) - { - SimpleSort(lo, hi, d); - if (workDone > workLimit && firstAttempt) - { - return; - } - continue; - } - - med = Med3(block[zptr[lo] + d + 1], - block[zptr[hi] + d + 1], - block[zptr[(lo + hi) >> 1] + d + 1]); - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (true) - { - while (true) - { - if (unLo > unHi) - { - break; - } - n = ((int)block[zptr[unLo] + d + 1]) - med; - if (n == 0) - { - int temp = zptr[unLo]; - zptr[unLo] = zptr[ltLo]; - zptr[ltLo] = temp; - ltLo++; - unLo++; - continue; - } - if (n > 0) - { - break; - } - unLo++; - } - - while (true) - { - if (unLo > unHi) - { - break; - } - n = ((int)block[zptr[unHi] + d + 1]) - med; - if (n == 0) - { - int temp = zptr[unHi]; - zptr[unHi] = zptr[gtHi]; - zptr[gtHi] = temp; - gtHi--; - unHi--; - continue; - } - if (n < 0) - { - break; - } - unHi--; - } - - if (unLo > unHi) - { - break; - } - - { - int temp = zptr[unLo]; - zptr[unLo] = zptr[unHi]; - zptr[unHi] = temp; - unLo++; - unHi--; - } - } - - if (gtHi < ltLo) - { - stack[sp].ll = lo; - stack[sp].hh = hi; - stack[sp].dd = d + 1; - sp++; - continue; - } - - n = ((ltLo - lo) < (unLo - ltLo)) ? (ltLo - lo) : (unLo - ltLo); - Vswap(lo, unLo - n, n); - m = ((hi - gtHi) < (gtHi - unHi)) ? (hi - gtHi) : (gtHi - unHi); - Vswap(unLo, hi - m + 1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - stack[sp].ll = lo; - stack[sp].hh = n; - stack[sp].dd = d; - sp++; - - stack[sp].ll = n + 1; - stack[sp].hh = m - 1; - stack[sp].dd = d + 1; - sp++; - - stack[sp].ll = m; - stack[sp].hh = hi; - stack[sp].dd = d; - sp++; - } - } - - void MainSort() - { - int i, j, ss, sb; - int[] runningOrder = new int[256]; - int[] copy = new int[256]; - bool[] bigDone = new bool[256]; - int c1, c2; - int numQSorted; - - /*-- - In the various block-sized structures, live data runs - from 0 to last+NUM_OVERSHOOT_BYTES inclusive. First, - set up the overshoot area for block. - --*/ - - // if (verbosity >= 4) fprintf ( stderr, " sort initialise ...\n" ); - for (i = 0; i < BZip2Constants.OvershootBytes; i++) - { - block[last + i + 2] = block[(i % (last + 1)) + 1]; - } - for (i = 0; i <= last + BZip2Constants.OvershootBytes; i++) - { - quadrant[i] = 0; - } - - block[0] = (byte)(block[last + 1]); - - if (last < 4000) - { - /*-- - Use simpleSort(), since the full sorting mechanism - has quite a large constant overhead. - --*/ - for (i = 0; i <= last; i++) - { - zptr[i] = i; - } - firstAttempt = false; - workDone = workLimit = 0; - SimpleSort(0, last, 0); - } - else - { - numQSorted = 0; - for (i = 0; i <= 255; i++) - { - bigDone[i] = false; - } - for (i = 0; i <= 65536; i++) - { - ftab[i] = 0; - } - - c1 = block[0]; - for (i = 0; i <= last; i++) - { - c2 = block[i + 1]; - ftab[(c1 << 8) + c2]++; - c1 = c2; - } - - for (i = 1; i <= 65536; i++) - { - ftab[i] += ftab[i - 1]; - } - - c1 = block[1]; - for (i = 0; i < last; i++) - { - c2 = block[i + 2]; - j = (c1 << 8) + c2; - c1 = c2; - ftab[j]--; - zptr[ftab[j]] = i; - } - - j = ((block[last + 1]) << 8) + (block[1]); - ftab[j]--; - zptr[ftab[j]] = last; - - /*-- - Now ftab contains the first loc of every small bucket. - Calculate the running order, from smallest to largest - big bucket. - --*/ - - for (i = 0; i <= 255; i++) - { - runningOrder[i] = i; - } - - int vv; - int h = 1; - do - { - h = 3 * h + 1; - } while (h <= 256); - do - { - h = h / 3; - for (i = h; i <= 255; i++) - { - vv = runningOrder[i]; - j = i; - while ((ftab[((runningOrder[j - h]) + 1) << 8] - ftab[(runningOrder[j - h]) << 8]) > (ftab[((vv) + 1) << 8] - ftab[(vv) << 8])) - { - runningOrder[j] = runningOrder[j - h]; - j = j - h; - if (j <= (h - 1)) - { - break; - } - } - runningOrder[j] = vv; - } - } while (h != 1); - - /*-- - The main sorting loop. - --*/ - for (i = 0; i <= 255; i++) - { - - /*-- - Process big buckets, starting with the least full. - --*/ - ss = runningOrder[i]; - - /*-- - Complete the big bucket [ss] by quicksorting - any unsorted small buckets [ss, j]. Hopefully - previous pointer-scanning phases have already - completed many of the small buckets [ss, j], so - we don't have to sort them at all. - --*/ - for (j = 0; j <= 255; j++) - { - sb = (ss << 8) + j; - if (!((ftab[sb] & SETMASK) == SETMASK)) - { - int lo = ftab[sb] & CLEARMASK; - int hi = (ftab[sb + 1] & CLEARMASK) - 1; - if (hi > lo) - { - QSort3(lo, hi, 2); - numQSorted += (hi - lo + 1); - if (workDone > workLimit && firstAttempt) - { - return; - } - } - ftab[sb] |= SETMASK; - } - } - - /*-- - The ss big bucket is now done. Record this fact, - and update the quadrant descriptors. Remember to - update quadrants in the overshoot area too, if - necessary. The "if (i < 255)" test merely skips - this updating for the last bucket processed, since - updating for the last bucket is pointless. - --*/ - bigDone[ss] = true; - - if (i < 255) - { - int bbStart = ftab[ss << 8] & CLEARMASK; - int bbSize = (ftab[(ss + 1) << 8] & CLEARMASK) - bbStart; - int shifts = 0; - - while ((bbSize >> shifts) > 65534) - { - shifts++; - } - - for (j = 0; j < bbSize; j++) - { - int a2update = zptr[bbStart + j]; - int qVal = (j >> shifts); - quadrant[a2update] = qVal; - if (a2update < BZip2Constants.OvershootBytes) - { - quadrant[a2update + last + 1] = qVal; - } - } - - if (!(((bbSize - 1) >> shifts) <= 65535)) - { - Panic(); - } - } - - /*-- - Now scan this big bucket so as to synthesise the - sorted order for small buckets [t, ss] for all t != ss. - --*/ - for (j = 0; j <= 255; j++) - { - copy[j] = ftab[(j << 8) + ss] & CLEARMASK; - } - - for (j = ftab[ss << 8] & CLEARMASK; j < (ftab[(ss + 1) << 8] & CLEARMASK); j++) - { - c1 = block[zptr[j]]; - if (!bigDone[c1]) - { - zptr[copy[c1]] = zptr[j] == 0 ? last : zptr[j] - 1; - copy[c1]++; - } - } - - for (j = 0; j <= 255; j++) - { - ftab[(j << 8) + ss] |= SETMASK; - } - } - } - } - - void RandomiseBlock() - { - int i; - int rNToGo = 0; - int rTPos = 0; - for (i = 0; i < 256; i++) - { - inUse[i] = false; - } - - for (i = 0; i <= last; i++) - { - if (rNToGo == 0) - { - rNToGo = (int)BZip2Constants.RandomNumbers[rTPos]; - rTPos++; - if (rTPos == 512) - { - rTPos = 0; - } - } - rNToGo--; - block[i + 1] ^= (byte)((rNToGo == 1) ? 1 : 0); - // handle 16 bit signed numbers - block[i + 1] &= 0xFF; - - inUse[block[i + 1]] = true; - } - } - - void DoReversibleTransformation() - { - workLimit = workFactor * last; - workDone = 0; - blockRandomised = false; - firstAttempt = true; - - MainSort(); - - if (workDone > workLimit && firstAttempt) - { - RandomiseBlock(); - workLimit = workDone = 0; - blockRandomised = true; - firstAttempt = false; - MainSort(); - } - - origPtr = -1; - for (int i = 0; i <= last; i++) - { - if (zptr[i] == 0) - { - origPtr = i; - break; - } - } - - if (origPtr == -1) - { - Panic(); - } - } - - bool FullGtU(int i1, int i2) - { - int k; - byte c1, c2; - int s1, s2; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - i1++; - i2++; - - k = last + 1; - - do - { - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - s1 = quadrant[i1]; - s2 = quadrant[i2]; - if (s1 != s2) - { - return s1 > s2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - s1 = quadrant[i1]; - s2 = quadrant[i2]; - if (s1 != s2) - { - return s1 > s2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - s1 = quadrant[i1]; - s2 = quadrant[i2]; - if (s1 != s2) - { - return s1 > s2; - } - i1++; - i2++; - - c1 = block[i1 + 1]; - c2 = block[i2 + 1]; - if (c1 != c2) - { - return c1 > c2; - } - s1 = quadrant[i1]; - s2 = quadrant[i2]; - if (s1 != s2) - { - return s1 > s2; - } - i1++; - i2++; - - if (i1 > last) - { - i1 -= last; - i1--; - } - if (i2 > last) - { - i2 -= last; - i2--; - } - - k -= 4; - ++workDone; - } while (k >= 0); - - return false; - } - - void AllocateCompressStructures() - { - int n = BZip2Constants.BaseBlockSize * blockSize100k; - block = new byte[(n + 1 + BZip2Constants.OvershootBytes)]; - quadrant = new int[(n + BZip2Constants.OvershootBytes)]; - zptr = new int[n]; - ftab = new int[65537]; - - if (block == null || quadrant == null || zptr == null || ftab == null) - { - // int totalDraw = (n + 1 + NUM_OVERSHOOT_BYTES) + (n + NUM_OVERSHOOT_BYTES) + n + 65537; - // compressOutOfMemory ( totalDraw, n ); - } - - /* - The back end needs a place to store the MTF values - whilst it calculates the coding tables. We could - put them in the zptr array. However, these values - will fit in a short, so we overlay szptr at the - start of zptr, in the hope of reducing the number - of cache misses induced by the multiple traversals - of the MTF values when calculating coding tables. - Seems to improve compression speed by about 1%. - */ - // szptr = zptr; - - - szptr = new short[2 * n]; - } - - void GenerateMTFValues() - { - char[] yy = new char[256]; - int i, j; - char tmp; - char tmp2; - int zPend; - int wr; - int EOB; - - MakeMaps(); - EOB = nInUse + 1; - - for (i = 0; i <= EOB; i++) - { - mtfFreq[i] = 0; - } - - wr = 0; - zPend = 0; - for (i = 0; i < nInUse; i++) - { - yy[i] = (char)i; - } - - - for (i = 0; i <= last; i++) - { - char ll_i; - - ll_i = unseqToSeq[block[zptr[i]]]; - - j = 0; - tmp = yy[j]; - while (ll_i != tmp) - { - j++; - tmp2 = tmp; - tmp = yy[j]; - yy[j] = tmp2; - } - yy[0] = tmp; - - if (j == 0) - { - zPend++; - } - else - { - if (zPend > 0) - { - zPend--; - while (true) - { - switch (zPend % 2) - { - case 0: - szptr[wr] = (short)BZip2Constants.RunA; - wr++; - mtfFreq[BZip2Constants.RunA]++; - break; - case 1: - szptr[wr] = (short)BZip2Constants.RunB; - wr++; - mtfFreq[BZip2Constants.RunB]++; - break; - } - if (zPend < 2) - { - break; - } - zPend = (zPend - 2) / 2; - } - zPend = 0; - } - szptr[wr] = (short)(j + 1); - wr++; - mtfFreq[j + 1]++; - } - } - - if (zPend > 0) - { - zPend--; - while (true) - { - switch (zPend % 2) - { - case 0: - szptr[wr] = (short)BZip2Constants.RunA; - wr++; - mtfFreq[BZip2Constants.RunA]++; - break; - case 1: - szptr[wr] = (short)BZip2Constants.RunB; - wr++; - mtfFreq[BZip2Constants.RunB]++; - break; - } - if (zPend < 2) - { - break; - } - zPend = (zPend - 2) / 2; - } - } - - szptr[wr] = (short)EOB; - wr++; - mtfFreq[EOB]++; - - nMTF = wr; - } - - static void Panic() - { - throw new Exception("BZip2 output stream panic"); - } - - static void HbMakeCodeLengths(char[] len, int[] freq, int alphaSize, int maxLen) - { - /*-- - Nodes and heap entries run from 1. Entry 0 - for both the heap and nodes is a sentinel. - --*/ - int nNodes, nHeap, n1, n2, j, k; - bool tooLong; - - int[] heap = new int[BZip2Constants.MaximumAlphaSize + 2]; - int[] weight = new int[BZip2Constants.MaximumAlphaSize * 2]; - int[] parent = new int[BZip2Constants.MaximumAlphaSize * 2]; - - for (int i = 0; i < alphaSize; ++i) - { - weight[i + 1] = (freq[i] == 0 ? 1 : freq[i]) << 8; - } - - while (true) - { - nNodes = alphaSize; - nHeap = 0; - - heap[0] = 0; - weight[0] = 0; - parent[0] = -2; - - for (int i = 1; i <= alphaSize; ++i) - { - parent[i] = -1; - nHeap++; - heap[nHeap] = i; - int zz = nHeap; - int tmp = heap[zz]; - while (weight[tmp] < weight[heap[zz >> 1]]) - { - heap[zz] = heap[zz >> 1]; - zz >>= 1; - } - heap[zz] = tmp; - } - if (!(nHeap < (BZip2Constants.MaximumAlphaSize + 2))) - { - Panic(); - } - - while (nHeap > 1) - { - n1 = heap[1]; - heap[1] = heap[nHeap]; - nHeap--; - int zz = 1; - int yy = 0; - int tmp = heap[zz]; - while (true) - { - yy = zz << 1; - if (yy > nHeap) - { - break; - } - if (yy < nHeap && weight[heap[yy + 1]] < weight[heap[yy]]) - { - yy++; - } - if (weight[tmp] < weight[heap[yy]]) - { - break; - } - - heap[zz] = heap[yy]; - zz = yy; - } - heap[zz] = tmp; - n2 = heap[1]; - heap[1] = heap[nHeap]; - nHeap--; - - zz = 1; - yy = 0; - tmp = heap[zz]; - while (true) - { - yy = zz << 1; - if (yy > nHeap) - { - break; - } - if (yy < nHeap && weight[heap[yy + 1]] < weight[heap[yy]]) - { - yy++; - } - if (weight[tmp] < weight[heap[yy]]) - { - break; - } - heap[zz] = heap[yy]; - zz = yy; - } - heap[zz] = tmp; - nNodes++; - parent[n1] = parent[n2] = nNodes; - - weight[nNodes] = (int)((weight[n1] & 0xffffff00) + (weight[n2] & 0xffffff00)) | - (int)(1 + (((weight[n1] & 0x000000ff) > (weight[n2] & 0x000000ff)) ? (weight[n1] & 0x000000ff) : (weight[n2] & 0x000000ff))); - - parent[nNodes] = -1; - nHeap++; - heap[nHeap] = nNodes; - - zz = nHeap; - tmp = heap[zz]; - while (weight[tmp] < weight[heap[zz >> 1]]) - { - heap[zz] = heap[zz >> 1]; - zz >>= 1; - } - heap[zz] = tmp; - } - if (!(nNodes < (BZip2Constants.MaximumAlphaSize * 2))) - { - Panic(); - } - - tooLong = false; - for (int i = 1; i <= alphaSize; ++i) - { - j = 0; - k = i; - while (parent[k] >= 0) - { - k = parent[k]; - j++; - } - len[i - 1] = (char)j; - if (j > maxLen) - { - tooLong = true; - } - } - - if (!tooLong) - { - break; - } - - for (int i = 1; i < alphaSize; ++i) - { - j = weight[i] >> 8; - j = 1 + (j / 2); - weight[i] = j << 8; - } - } - } - - static void HbAssignCodes(int[] code, char[] length, int minLen, int maxLen, int alphaSize) - { - int vec = 0; - for (int n = minLen; n <= maxLen; ++n) - { - for (int i = 0; i < alphaSize; ++i) - { - if (length[i] == n) - { - code[i] = vec; - ++vec; - } - } - vec <<= 1; - } - } - - static byte Med3(byte a, byte b, byte c) - { - byte t; - if (a > b) - { - t = a; - a = b; - b = t; - } - if (b > c) - { - t = b; - b = c; - c = t; - } - if (a > b) - { - b = a; - } - return b; - } - - struct StackElement - { - public int ll; - public int hh; - public int dd; - } - - #region Instance Fields - bool isStreamOwner = true; - - /*-- - index of the last char in the block, so - the block size == last + 1. - --*/ - int last; - - /*-- - index in zptr[] of original string after sorting. - --*/ - int origPtr; - - /*-- - always: in the range 0 .. 9. - The current block size is 100000 * this number. - --*/ - int blockSize100k; - - bool blockRandomised; - - int bytesOut; - int bsBuff; - int bsLive; - StrangeCRC mCrc = new StrangeCRC(); - - bool[] inUse = new bool[256]; - int nInUse; - - char[] seqToUnseq = new char[256]; - char[] unseqToSeq = new char[256]; - - char[] selector = new char[BZip2Constants.MaximumSelectors]; - char[] selectorMtf = new char[BZip2Constants.MaximumSelectors]; - - byte[] block; - int[] quadrant; - int[] zptr; - short[] szptr; - int[] ftab; - - int nMTF; - - int[] mtfFreq = new int[BZip2Constants.MaximumAlphaSize]; - - /* - * Used when sorting. If too many long comparisons - * happen, we stop sorting, randomise the block - * slightly, and try again. - */ - int workFactor; - int workDone; - int workLimit; - bool firstAttempt; - int nBlocksRandomised; - - int currentChar = -1; - int runLength; - uint blockCRC, combinedCRC; - int allowableBlockSize; - Stream baseStream; - bool disposed_; - #endregion - } - #endregion - -} - -/* This file was derived from a file containing this license: - * - * This file is a part of bzip2 and/or libbzip2, a program and - * library for lossless, block-sorting data compression. - * - * Copyright (C) 1996-1998 Julian R Seward. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. The origin of this software must not be misrepresented; you must - * not claim that you wrote the original software. If you use this - * software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 3. Altered source versions must be plainly marked as such, and must - * not be misrepresented as being the original software. - * - * 4. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - * Java version ported by Keiron Liddle, Aftex Software 1999-2001 - */ diff --git a/Users/Orvid/Orvid.Compression/Streams/Deflate.cs b/Users/Orvid/Orvid.Compression/Streams/Deflate.cs deleted file mode 100644 index f3d173c270..0000000000 --- a/Users/Orvid/Orvid.Compression/Streams/Deflate.cs +++ /dev/null @@ -1,5105 +0,0 @@ -// -// Copyright (C) 2001 Mike Krueger -// Copyright (C) 2004 John Reilly -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -// HISTORY -// 11-08-2009 GeoffHart T9121 Added Multi-member gzip support - -using System; -using System.IO; -using Orvid.Compression.Checksums; - -namespace Orvid.Compression.Streams -{ - - #region DeflaterInputStream - /// - /// This filter stream is used to decompress data compressed using the "deflate" - /// format. The "deflate" format is described in RFC 1951. - /// - /// This stream may form the basis for other decompression filters, such - /// as the GZipInputStream. - /// - /// Author of the original java version : John Leuner. - /// - public class DeflaterInputStream : Stream - { - #region Constructors - /// - /// Create an DeflaterInputStream with the default decompressor - /// and a default buffer size of 4KB. - /// - /// - /// The InputStream to read bytes from - /// - public DeflaterInputStream(Stream baseInputStream) - : this(baseInputStream, new Inflater(), 4096) - { - } - - /// - /// Create an DeflaterInputStream with the specified decompressor - /// and the specified buffer size. - /// - /// - /// The InputStream to read bytes from - /// - /// - /// The decompressor to use - /// - /// - /// Size of the buffer to use - /// - internal DeflaterInputStream(Stream baseInputStream, Inflater inflater, int bufferSize) - { - if (baseInputStream == null) - { - throw new ArgumentNullException("baseInputStream"); - } - - if (inflater == null) - { - throw new ArgumentNullException("inflater"); - } - - if (bufferSize <= 0) - { - throw new ArgumentOutOfRangeException("bufferSize"); - } - - this.baseInputStream = baseInputStream; - this.inf = inflater; - - inputBuffer = new InflaterInputBuffer(baseInputStream, bufferSize); - } - - #endregion - - /// - /// Get/set flag indicating ownership of underlying stream. - /// When the flag is true will close the underlying stream also. - /// - /// - /// The default value is true. - /// - public bool IsStreamOwner - { - get { return isStreamOwner; } - set { isStreamOwner = value; } - } - - /// - /// Skip specified number of bytes of uncompressed data - /// - /// - /// Number of bytes to skip - /// - /// - /// The number of bytes skipped, zero if the end of - /// stream has been reached - /// - /// - /// The number of bytes to skip is less than or equal to zero. - /// - public long Skip(long count) - { - if (count <= 0) - { - throw new ArgumentOutOfRangeException("count"); - } - - // v0.80 Skip by seeking if underlying stream supports it... - if (baseInputStream.CanSeek) - { - baseInputStream.Seek(count, SeekOrigin.Current); - return count; - } - else - { - int length = 2048; - if (count < length) - { - length = (int)count; - } - - byte[] tmp = new byte[length]; - int readCount = 1; - long toSkip = count; - - while ((toSkip > 0) && (readCount > 0)) - { - if (toSkip < length) - { - length = (int)toSkip; - } - - readCount = baseInputStream.Read(tmp, 0, length); - toSkip -= readCount; - } - - return count - toSkip; - } - } - - /// - /// Returns 0 once the end of the stream (EOF) has been reached. - /// Otherwise returns 1. - /// - public virtual int Available - { - get - { - return inf.IsFinished ? 0 : 1; - } - } - - /// - /// Fills the buffer with more data to decompress. - /// - /// - /// Stream ends early - /// - protected void Fill() - { - // Protect against redundant calls - if (inputBuffer.Available <= 0) - { - inputBuffer.Fill(); - if (inputBuffer.Available <= 0) - { - throw new Exception("Unexpected EOF"); - } - } - inputBuffer.SetInflaterInput(inf); - } - - #region Stream Overrides - /// - /// Gets a value indicating whether the current stream supports reading - /// - public override bool CanRead - { - get - { - return baseInputStream.CanRead; - } - } - - /// - /// Gets a value of false indicating seeking is not supported for this stream. - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value of false indicating that this stream is not writeable. - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - /// A value representing the length of the stream in bytes. - /// - public override long Length - { - get - { - return inputBuffer.RawLength; - } - } - - /// - /// The current position within the stream. - /// Throws a NotSupportedException when attempting to set the position - /// - /// Attempting to set the position - public override long Position - { - get - { - return baseInputStream.Position; - } - set - { - throw new NotSupportedException("InflaterInputStream Position not supported"); - } - } - - /// - /// Flushes the baseInputStream - /// - public override void Flush() - { - baseInputStream.Flush(); - } - - /// - /// Sets the position within the current stream - /// Always throws a NotSupportedException - /// - /// The relative offset to seek to. - /// The defining where to seek from. - /// The new position in the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("Seek not supported"); - } - - /// - /// Set the length of the current stream - /// Always throws a NotSupportedException - /// - /// The new length value for the stream. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("InflaterInputStream SetLength not supported"); - } - - /// - /// Writes a sequence of bytes to stream and advances the current position - /// This method always throws a NotSupportedException - /// - /// Thew buffer containing data to write. - /// The offset of the first byte to write. - /// The number of bytes to write. - /// Any access - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("InflaterInputStream Write not supported"); - } - - /// - /// Writes one byte to the current stream and advances the current position - /// Always throws a NotSupportedException - /// - /// The byte to write. - /// Any access - public override void WriteByte(byte value) - { - throw new NotSupportedException("InflaterInputStream WriteByte not supported"); - } - - /// - /// Entry point to begin an asynchronous write. Always throws a NotSupportedException. - /// - /// The buffer to write data from - /// Offset of first byte to write - /// The maximum number of bytes to write - /// The method to be called when the asynchronous write operation is completed - /// A user-provided object that distinguishes this particular asynchronous write request from other requests - /// An IAsyncResult that references the asynchronous write - /// Any access - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException("InflaterInputStream BeginWrite not supported"); - } - - /// - /// Closes the input stream. When - /// is true the underlying stream is also closed. - /// - public override void Close() - { - if (!isClosed) - { - isClosed = true; - if (isStreamOwner) - { - baseInputStream.Close(); - } - } - } - - /// - /// Reads decompressed data into the provided buffer byte array - /// - /// - /// The array to read and decompress data into - /// - /// - /// The offset indicating where the data should be placed - /// - /// - /// The number of bytes to decompress - /// - /// The number of bytes read. Zero signals the end of stream - /// - /// Inflater needs a dictionary - /// - public override int Read(byte[] buffer, int offset, int count) - { - if (inf.IsNeedingDictionary) - { - throw new Exception("Need a dictionary"); - } - - int remainingBytes = count; - while (true) - { - int bytesRead = inf.Inflate(buffer, offset, remainingBytes); - offset += bytesRead; - remainingBytes -= bytesRead; - - if (remainingBytes == 0 || inf.IsFinished) - { - break; - } - - if (inf.IsNeedingInput) - { - Fill(); - } - else if (bytesRead == 0) - { - throw new Exception("Dont know what to do"); - } - } - return count - remainingBytes; - } - #endregion - - #region Instance Fields - /// - /// Decompressor for this stream - /// - internal Inflater inf; - - /// - /// Input buffer for this stream. - /// - internal InflaterInputBuffer inputBuffer; - - /// - /// Base stream the inflater reads from. - /// - private Stream baseInputStream; - - /// - /// The compressed size - /// - protected long csize; - - /// - /// Flag indicating wether this instance has been closed or not. - /// - bool isClosed; - - /// - /// Flag indicating wether this instance is designated the stream owner. - /// When closing if this flag is true the underlying stream is closed. - /// - bool isStreamOwner = true; - #endregion - } - #endregion - - #region DeflaterOutputStream - /// - /// A special stream deflating or compressing the bytes that are - /// written to it. It uses a Deflater to perform actual deflating.
- /// Authors of the original java version : Tom Tromey, Jochen Hoenicke - ///
- public class DeflaterOutputStream : Stream - { - #region Constructors - /// - /// Creates a new DeflaterOutputStream with a default Deflater and default buffer size. - /// - /// - /// the output stream where deflated output should be written. - /// - public DeflaterOutputStream(Stream baseOutputStream) - : this(baseOutputStream, new Deflater(), 512) - { - } - - /// - /// Creates a new DeflaterOutputStream with the given Deflater and - /// buffer size. - /// - /// - /// The output stream where deflated output is written. - /// - /// - /// The underlying deflater to use - /// - /// - /// The buffer size in bytes to use when deflating (minimum value 512) - /// - /// - /// bufsize is less than or equal to zero. - /// - /// - /// baseOutputStream does not support writing - /// - /// - /// deflater instance is null - /// - internal DeflaterOutputStream(Stream baseOutputStream, Deflater deflater, int bufferSize) - { - if (baseOutputStream == null) - { - throw new ArgumentNullException("baseOutputStream"); - } - - if (baseOutputStream.CanWrite == false) - { - throw new ArgumentException("Must support writing", "baseOutputStream"); - } - - if (deflater == null) - { - throw new ArgumentNullException("deflater"); - } - - if (bufferSize < 512) - { - throw new ArgumentOutOfRangeException("bufferSize"); - } - - baseOutputStream_ = baseOutputStream; - buffer_ = new byte[bufferSize]; - deflater_ = deflater; - } - #endregion - - #region Public API - /// - /// Finishes the stream by calling finish() on the deflater. - /// - /// - /// Not all input is deflated - /// - public virtual void Finish() - { - deflater_.Finish(); - while (!deflater_.IsFinished) - { - int len = deflater_.Deflate(buffer_, 0, buffer_.Length); - if (len <= 0) - { - break; - } - baseOutputStream_.Write(buffer_, 0, len); - } - - if (!deflater_.IsFinished) - { - throw new Exception("Can't deflate all input?"); - } - - baseOutputStream_.Flush(); - - } - - /// - /// Get/set flag indicating ownership of the underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return isStreamOwner_; } - set { isStreamOwner_ = value; } - } - - /// - /// Allows client to determine if an entry can be patched after its added - /// - public bool CanPatchEntries - { - get - { - return baseOutputStream_.CanSeek; - } - } - - #endregion - - - #region Deflation Support - /// - /// Deflates everything in the input buffers. This will call - /// def.deflate() until all bytes from the input buffers - /// are processed. - /// - protected void Deflate() - { - while (!deflater_.IsNeedingInput) - { - int deflateCount = deflater_.Deflate(buffer_, 0, buffer_.Length); - - if (deflateCount <= 0) - { - break; - } - - baseOutputStream_.Write(buffer_, 0, deflateCount); - } - - if (!deflater_.IsNeedingInput) - { - throw new Exception("DeflaterOutputStream can't deflate all input?"); - } - } - #endregion - - #region Stream Overrides - /// - /// Gets value indicating stream can be read from - /// - public override bool CanRead - { - get - { - return false; - } - } - - /// - /// Gets a value indicating if seeking is supported for this stream - /// This property always returns false - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Get value indicating if this stream supports writing - /// - public override bool CanWrite - { - get - { - return baseOutputStream_.CanWrite; - } - } - - /// - /// Get current length of stream - /// - public override long Length - { - get - { - return baseOutputStream_.Length; - } - } - - /// - /// Gets the current position within the stream. - /// - /// Any attempt to set position - public override long Position - { - get - { - return baseOutputStream_.Position; - } - set - { - throw new NotSupportedException("Position property not supported"); - } - } - - /// - /// Sets the current position of this stream to the given value. Not supported by this class! - /// - /// The offset relative to the to seek. - /// The to seek from. - /// The new position in the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("DeflaterOutputStream Seek not supported"); - } - - /// - /// Sets the length of this stream to the given value. Not supported by this class! - /// - /// The new stream length. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("DeflaterOutputStream SetLength not supported"); - } - - /// - /// Read a byte from stream advancing position by one - /// - /// The byte read cast to an int. THe value is -1 if at the end of the stream. - /// Any access - public override int ReadByte() - { - throw new NotSupportedException("DeflaterOutputStream ReadByte not supported"); - } - - /// - /// Read a block of bytes from stream - /// - /// The buffer to store read data in. - /// The offset to start storing at. - /// The maximum number of bytes to read. - /// The actual number of bytes read. Zero if end of stream is detected. - /// Any access - public override int Read(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("DeflaterOutputStream Read not supported"); - } - - /// - /// Asynchronous reads are not supported a NotSupportedException is always thrown - /// - /// The buffer to read into. - /// The offset to start storing data at. - /// The number of bytes to read - /// The async callback to use. - /// The state to use. - /// Returns an - /// Any access - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException("DeflaterOutputStream BeginRead not currently supported"); - } - - /// - /// Asynchronous writes arent supported, a NotSupportedException is always thrown - /// - /// The buffer to write. - /// The offset to begin writing at. - /// The number of bytes to write. - /// The to use. - /// The state object. - /// Returns an IAsyncResult. - /// Any access - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException("BeginWrite is not supported"); - } - - /// - /// Flushes the stream by calling Flush on the deflater and then - /// on the underlying stream. This ensures that all bytes are flushed. - /// - public override void Flush() - { - deflater_.Flush(); - Deflate(); - baseOutputStream_.Flush(); - } - - /// - /// Calls and closes the underlying - /// stream when is true. - /// - public override void Close() - { - if (!isClosed_) - { - isClosed_ = true; - - try - { - Finish(); - } - finally - { - if (isStreamOwner_) - { - baseOutputStream_.Close(); - } - } - } - } - - /// - /// Writes a single byte to the compressed output stream. - /// - /// - /// The byte value. - /// - public override void WriteByte(byte value) - { - byte[] b = new byte[1]; - b[0] = value; - Write(b, 0, 1); - } - - /// - /// Writes bytes from an array to the compressed stream. - /// - /// - /// The byte array - /// - /// - /// The offset into the byte array where to start. - /// - /// - /// The number of bytes to write. - /// - public override void Write(byte[] buffer, int offset, int count) - { - deflater_.SetInput(buffer, offset, count); - Deflate(); - } - #endregion - - #region Instance Fields - /// - /// This buffer is used temporarily to retrieve the bytes from the - /// deflater and write them to the underlying output stream. - /// - byte[] buffer_; - - /// - /// The deflater which is used to deflate the stream. - /// - internal Deflater deflater_; - - /// - /// Base stream the deflater depends on. - /// - protected Stream baseOutputStream_; - - bool isClosed_; - - bool isStreamOwner_ = true; - #endregion - } - #endregion - - - - - #region InflaterHuffmanTree - internal class InflaterHuffmanTree - { - const int MAX_BITLEN = 15; - short[] tree; - public static InflaterHuffmanTree defLitLenTree; - public static InflaterHuffmanTree defDistTree; - - static InflaterHuffmanTree() - { - try - { - byte[] codeLengths = new byte[288]; - int i = 0; - while (i < 144) - { - codeLengths[i++] = 8; - } - while (i < 256) - { - codeLengths[i++] = 9; - } - while (i < 280) - { - codeLengths[i++] = 7; - } - while (i < 288) - { - codeLengths[i++] = 8; - } - defLitLenTree = new InflaterHuffmanTree(codeLengths); - - codeLengths = new byte[32]; - i = 0; - while (i < 32) - { - codeLengths[i++] = 5; - } - defDistTree = new InflaterHuffmanTree(codeLengths); - } - catch (Exception) - { - throw new Exception("InflaterHuffmanTree: static tree length illegal"); - } - } - - public InflaterHuffmanTree(byte[] codeLengths) - { - BuildTree(codeLengths); - } - - void BuildTree(byte[] codeLengths) - { - int[] blCount = new int[MAX_BITLEN + 1]; - int[] nextCode = new int[MAX_BITLEN + 1]; - - for (int i = 0; i < codeLengths.Length; i++) - { - int bits = codeLengths[i]; - if (bits > 0) - { - blCount[bits]++; - } - } - - int code = 0; - int treeSize = 512; - for (int bits = 1; bits <= MAX_BITLEN; bits++) - { - nextCode[bits] = code; - code += blCount[bits] << (16 - bits); - if (bits >= 10) - { - int start = nextCode[bits] & 0x1ff80; - int end = code & 0x1ff80; - treeSize += (end - start) >> (16 - bits); - } - } - - tree = new short[treeSize]; - int treePtr = 512; - for (int bits = MAX_BITLEN; bits >= 10; bits--) - { - int end = code & 0x1ff80; - code -= blCount[bits] << (16 - bits); - int start = code & 0x1ff80; - for (int i = start; i < end; i += 1 << 7) - { - tree[DeflaterHuffman.BitReverse(i)] = (short)((-treePtr << 4) | bits); - treePtr += 1 << (bits - 9); - } - } - - for (int i = 0; i < codeLengths.Length; i++) - { - int bits = codeLengths[i]; - if (bits == 0) - { - continue; - } - code = nextCode[bits]; - int revcode = DeflaterHuffman.BitReverse(code); - if (bits <= 9) - { - do - { - tree[revcode] = (short)((i << 4) | bits); - revcode += 1 << bits; - } while (revcode < 512); - } - else - { - int subTree = tree[revcode & 511]; - int treeLen = 1 << (subTree & 15); - subTree = -(subTree >> 4); - do - { - tree[subTree | (revcode >> 9)] = (short)((i << 4) | bits); - revcode += 1 << bits; - } while (revcode < treeLen); - } - nextCode[bits] = code + (1 << (16 - bits)); - } - - } - - public int GetSymbol(StreamManipulator input) - { - int lookahead, symbol; - if ((lookahead = input.PeekBits(9)) >= 0) - { - if ((symbol = tree[lookahead]) >= 0) - { - input.DropBits(symbol & 15); - return symbol >> 4; - } - int subtree = -(symbol >> 4); - int bitlen = symbol & 15; - if ((lookahead = input.PeekBits(bitlen)) >= 0) - { - symbol = tree[subtree | (lookahead >> 9)]; - input.DropBits(symbol & 15); - return symbol >> 4; - } - else - { - int bits = input.AvailableBits; - lookahead = input.PeekBits(bits); - symbol = tree[subtree | (lookahead >> 9)]; - if ((symbol & 15) <= bits) - { - input.DropBits(symbol & 15); - return symbol >> 4; - } - else - { - return -1; - } - } - } - else - { - int bits = input.AvailableBits; - lookahead = input.PeekBits(bits); - symbol = tree[lookahead]; - if (symbol >= 0 && (symbol & 15) <= bits) - { - input.DropBits(symbol & 15); - return symbol >> 4; - } - else - { - return -1; - } - } - } - } - #endregion - - #region InflaterDynHeader - internal class InflaterDynHeader - { - const int LNUM = 0; - const int DNUM = 1; - const int BLNUM = 2; - const int BLLENS = 3; - const int LENS = 4; - const int REPS = 5; - static readonly int[] repMin = { 3, 3, 11 }; - static readonly int[] repBits = { 2, 3, 7 }; - static readonly int[] BL_ORDER = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - - - public InflaterDynHeader() { } - - public bool Decode(StreamManipulator input) - { - decode_loop: - for (; ; ) - { - switch (mode) - { - case LNUM: - lnum = input.PeekBits(5); - if (lnum < 0) - { - return false; - } - lnum += 257; - input.DropBits(5); - mode = DNUM; - goto case DNUM; - case DNUM: - dnum = input.PeekBits(5); - if (dnum < 0) - { - return false; - } - dnum++; - input.DropBits(5); - num = lnum + dnum; - litdistLens = new byte[num]; - mode = BLNUM; - goto case BLNUM; - case BLNUM: - blnum = input.PeekBits(4); - if (blnum < 0) - { - return false; - } - blnum += 4; - input.DropBits(4); - blLens = new byte[19]; - ptr = 0; - mode = BLLENS; - goto case BLLENS; - case BLLENS: - while (ptr < blnum) - { - int len = input.PeekBits(3); - if (len < 0) - { - return false; - } - input.DropBits(3); - blLens[BL_ORDER[ptr]] = (byte)len; - ptr++; - } - blTree = new InflaterHuffmanTree(blLens); - blLens = null; - ptr = 0; - mode = LENS; - goto case LENS; - case LENS: - { - int symbol; - while (((symbol = blTree.GetSymbol(input)) & ~15) == 0) - { - litdistLens[ptr++] = lastLen = (byte)symbol; - - if (ptr == num) - { - return true; - } - } - - if (symbol < 0) - { - return false; - } - - if (symbol >= 17) - { - lastLen = 0; - } - else - { - if (ptr == 0) - { - throw new Exception(); - } - } - repSymbol = symbol - 16; - } - mode = REPS; - goto case REPS; - case REPS: - { - int bits = repBits[repSymbol]; - int count = input.PeekBits(bits); - if (count < 0) - { - return false; - } - input.DropBits(bits); - count += repMin[repSymbol]; - - if (ptr + count > num) - { - throw new Exception(); - } - while (count-- > 0) - { - litdistLens[ptr++] = lastLen; - } - - if (ptr == num) - { - return true; - } - } - mode = LENS; - goto decode_loop; - } - } - } - - public InflaterHuffmanTree BuildLitLenTree() - { - byte[] litlenLens = new byte[lnum]; - Array.Copy(litdistLens, 0, litlenLens, 0, lnum); - return new InflaterHuffmanTree(litlenLens); - } - - public InflaterHuffmanTree BuildDistTree() - { - byte[] distLens = new byte[dnum]; - Array.Copy(litdistLens, lnum, distLens, 0, dnum); - return new InflaterHuffmanTree(distLens); - } - - byte[] blLens; - byte[] litdistLens; - - InflaterHuffmanTree blTree; - - int mode; - int lnum, dnum, blnum, num; - int repSymbol; - byte lastLen; - int ptr; - - } - #endregion - - #region StreamManipulator - internal class StreamManipulator - { - public StreamManipulator() { } - - public int PeekBits(int bitCount) - { - if (bitsInBuffer_ < bitCount) - { - if (windowStart_ == windowEnd_) - { - return -1; - } - buffer_ |= (uint)((window_[windowStart_++] & 0xff | - (window_[windowStart_++] & 0xff) << 8) << bitsInBuffer_); - bitsInBuffer_ += 16; - } - return (int)(buffer_ & ((1 << bitCount) - 1)); - } - - public void DropBits(int bitCount) - { - buffer_ >>= bitCount; - bitsInBuffer_ -= bitCount; - } - - public int GetBits(int bitCount) - { - int bits = PeekBits(bitCount); - if (bits >= 0) - { - DropBits(bitCount); - } - return bits; - } - - public int AvailableBits - { - get - { - return bitsInBuffer_; - } - } - - public int AvailableBytes - { - get - { - return windowEnd_ - windowStart_ + (bitsInBuffer_ >> 3); - } - } - - public void SkipToByteBoundary() - { - buffer_ >>= (bitsInBuffer_ & 7); - bitsInBuffer_ &= ~7; - } - - public bool IsNeedingInput - { - get - { - return windowStart_ == windowEnd_; - } - } - - public int CopyBytes(byte[] output, int offset, int length) - { - if (length < 0) - { - throw new ArgumentOutOfRangeException("length"); - } - - if ((bitsInBuffer_ & 7) != 0) - { - throw new InvalidOperationException("Bit buffer is not byte aligned!"); - } - - int count = 0; - while ((bitsInBuffer_ > 0) && (length > 0)) - { - output[offset++] = (byte)buffer_; - buffer_ >>= 8; - bitsInBuffer_ -= 8; - length--; - count++; - } - - if (length == 0) - { - return count; - } - - int avail = windowEnd_ - windowStart_; - if (length > avail) - { - length = avail; - } - System.Array.Copy(window_, windowStart_, output, offset, length); - windowStart_ += length; - - if (((windowStart_ - windowEnd_) & 1) != 0) - { - buffer_ = (uint)(window_[windowStart_++] & 0xff); - bitsInBuffer_ = 8; - } - return count + length; - } - - public void Reset() - { - buffer_ = 0; - windowStart_ = windowEnd_ = bitsInBuffer_ = 0; - } - - public void SetInput(byte[] buffer, int offset, int count) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - if (offset < 0) - { - throw new ArgumentOutOfRangeException("offset", "Cannot be negative"); - } - - if (count < 0) - { - throw new ArgumentOutOfRangeException("count", "Cannot be negative"); - } - - if (windowStart_ < windowEnd_) - { - throw new InvalidOperationException("Old input was not completely processed"); - } - - int end = offset + count; - - if ((offset > end) || (end > buffer.Length)) - { - throw new ArgumentOutOfRangeException("count"); - } - - if ((count & 1) != 0) - { - buffer_ |= (uint)((buffer[offset++] & 0xff) << bitsInBuffer_); - bitsInBuffer_ += 8; - } - - window_ = buffer; - windowStart_ = offset; - windowEnd_ = end; - } - - private byte[] window_; - private int windowStart_; - private int windowEnd_; - private uint buffer_; - private int bitsInBuffer_; - } - #endregion - - #region PendingBuffer - internal class PendingBuffer - { - #region Instance Fields - byte[] buffer_; - int start; - int end; - uint bits; - int bitCount; - #endregion - - #region Constructors - public PendingBuffer() : this(4096) - { - } - - public PendingBuffer(int bufferSize) - { - buffer_ = new byte[bufferSize]; - } - #endregion - - public void Reset() - { - start = end = bitCount = 0; - } - - public void WriteByte(int value) - { - buffer_[end++] = unchecked((byte)value); - } - - public void WriteShort(int value) - { - buffer_[end++] = unchecked((byte)value); - buffer_[end++] = unchecked((byte)(value >> 8)); - } - - public void WriteInt(int value) - { - buffer_[end++] = unchecked((byte)value); - buffer_[end++] = unchecked((byte)(value >> 8)); - buffer_[end++] = unchecked((byte)(value >> 16)); - buffer_[end++] = unchecked((byte)(value >> 24)); - } - - public void WriteBlock(byte[] block, int offset, int length) - { - System.Array.Copy(block, offset, buffer_, end, length); - end += length; - } - - public int BitCount - { - get - { - return bitCount; - } - } - - public void AlignToByte() - { - if (bitCount > 0) - { - buffer_[end++] = unchecked((byte)bits); - if (bitCount > 8) - { - buffer_[end++] = unchecked((byte)(bits >> 8)); - } - } - bits = 0; - bitCount = 0; - } - - public void WriteBits(int b, int count) - { - bits |= (uint)(b << bitCount); - bitCount += count; - if (bitCount >= 16) - { - buffer_[end++] = unchecked((byte)bits); - buffer_[end++] = unchecked((byte)(bits >> 8)); - bits >>= 16; - bitCount -= 16; - } - } - - public void WriteShortMSB(int s) - { - buffer_[end++] = unchecked((byte)(s >> 8)); - buffer_[end++] = unchecked((byte)s); - } - - public bool IsFlushed - { - get - { - return end == 0; - } - } - - public int Flush(byte[] output, int offset, int length) - { - if (bitCount >= 8) - { - buffer_[end++] = unchecked((byte)bits); - bits >>= 8; - bitCount -= 8; - } - - if (length > end - start) - { - length = end - start; - System.Array.Copy(buffer_, start, output, offset, length); - start = 0; - end = 0; - } - else - { - System.Array.Copy(buffer_, start, output, offset, length); - start += length; - } - return length; - } - - public byte[] ToByteArray() - { - byte[] result = new byte[end - start]; - System.Array.Copy(buffer_, start, result, 0, result.Length); - start = 0; - end = 0; - return result; - } - } - #endregion - - #region DeflaterPending - internal class DeflaterPending : PendingBuffer - { - public DeflaterPending() : base(DeflaterConstants.PENDING_BUF_SIZE) - { - } - } - #endregion - - #region DeflaterHuffman - /// - /// This is the DeflaterHuffman class. - /// - /// This class is not thread safe. This is inherent in the API, due - /// to the split of Deflate and SetInput. - /// - /// author of the original java version : Jochen Hoenicke - /// - internal class DeflaterHuffman - { - const int BUFSIZE = 1 << (DeflaterConstants.DEFAULT_MEM_LEVEL + 6); - const int LITERAL_NUM = 286; - const int DIST_NUM = 30; - const int BITLEN_NUM = 19; - const int REP_3_6 = 16; - const int REP_3_10 = 17; - const int REP_11_138 = 18; - const int EOF_SYMBOL = 256; - static readonly int[] BL_ORDER = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - - static readonly byte[] bit4Reverse = { - 0, - 8, - 4, - 12, - 2, - 10, - 6, - 14, - 1, - 9, - 5, - 13, - 3, - 11, - 7, - 15 - }; - - static short[] staticLCodes; - static byte[] staticLLength; - static short[] staticDCodes; - static byte[] staticDLength; - - class Tree - { - #region Instance Fields - public short[] freqs; - - public byte[] length; - - public int minNumCodes; - - public int numCodes; - - short[] codes; - int[] bl_counts; - int maxLength; - DeflaterHuffman dh; - #endregion - - #region Constructors - public Tree(DeflaterHuffman dh, int elems, int minCodes, int maxLength) - { - this.dh = dh; - this.minNumCodes = minCodes; - this.maxLength = maxLength; - freqs = new short[elems]; - bl_counts = new int[maxLength]; - } - - #endregion - - /// - /// Resets the internal state of the tree - /// - public void Reset() - { - for (int i = 0; i < freqs.Length; i++) - { - freqs[i] = 0; - } - codes = null; - length = null; - } - - public void WriteSymbol(int code) - { - dh.pending.WriteBits(codes[code] & 0xffff, length[code]); - } - - /// - /// Check that all frequencies are zero - /// - /// - /// At least one frequency is non-zero - /// - public void CheckEmpty() - { - bool empty = true; - for (int i = 0; i < freqs.Length; i++) - { - if (freqs[i] != 0) - { - empty = false; - } - } - - if (!empty) - { - throw new Exception("!Empty"); - } - } - - /// - /// Set static codes and length - /// - /// new codes - /// length for new codes - public void SetStaticCodes(short[] staticCodes, byte[] staticLengths) - { - codes = staticCodes; - length = staticLengths; - } - - /// - /// Build dynamic codes and lengths - /// - public void BuildCodes() - { - int numSymbols = freqs.Length; - int[] nextCode = new int[maxLength]; - int code = 0; - - codes = new short[freqs.Length]; - - for (int bits = 0; bits < maxLength; bits++) - { - nextCode[bits] = code; - code += bl_counts[bits] << (15 - bits); - } - for (int i = 0; i < numCodes; i++) - { - int bits = length[i]; - if (bits > 0) - { - - codes[i] = BitReverse(nextCode[bits - 1]); - nextCode[bits - 1] += 1 << (16 - bits); - } - } - } - - public void BuildTree() - { - int numSymbols = freqs.Length; - - int[] heap = new int[numSymbols]; - int heapLen = 0; - int maxCode = 0; - for (int n = 0; n < numSymbols; n++) - { - int freq = freqs[n]; - if (freq != 0) - { - int pos = heapLen++; - int ppos; - while (pos > 0 && freqs[heap[ppos = (pos - 1) / 2]] > freq) - { - heap[pos] = heap[ppos]; - pos = ppos; - } - heap[pos] = n; - - maxCode = n; - } - } - - while (heapLen < 2) - { - int node = maxCode < 2 ? ++maxCode : 0; - heap[heapLen++] = node; - } - - numCodes = Math.Max(maxCode + 1, minNumCodes); - - int numLeafs = heapLen; - int[] childs = new int[4 * heapLen - 2]; - int[] values = new int[2 * heapLen - 1]; - int numNodes = numLeafs; - for (int i = 0; i < heapLen; i++) - { - int node = heap[i]; - childs[2 * i] = node; - childs[2 * i + 1] = -1; - values[i] = freqs[node] << 8; - heap[i] = i; - } - - do - { - int first = heap[0]; - int last = heap[--heapLen]; - - int ppos = 0; - int path = 1; - - while (path < heapLen) - { - if (path + 1 < heapLen && values[heap[path]] > values[heap[path + 1]]) - { - path++; - } - - heap[ppos] = heap[path]; - ppos = path; - path = path * 2 + 1; - } - - int lastVal = values[last]; - while ((path = ppos) > 0 && values[heap[ppos = (path - 1) / 2]] > lastVal) - { - heap[path] = heap[ppos]; - } - heap[path] = last; - - - int second = heap[0]; - - last = numNodes++; - childs[2 * last] = first; - childs[2 * last + 1] = second; - int mindepth = Math.Min(values[first] & 0xff, values[second] & 0xff); - values[last] = lastVal = values[first] + values[second] - mindepth + 1; - - ppos = 0; - path = 1; - - while (path < heapLen) - { - if (path + 1 < heapLen && values[heap[path]] > values[heap[path + 1]]) - { - path++; - } - - heap[ppos] = heap[path]; - ppos = path; - path = ppos * 2 + 1; - } - - while ((path = ppos) > 0 && values[heap[ppos = (path - 1) / 2]] > lastVal) - { - heap[path] = heap[ppos]; - } - heap[path] = last; - } while (heapLen > 1); - - if (heap[0] != childs.Length / 2 - 1) - { - throw new Exception("Heap invariant violated"); - } - - BuildLength(childs); - } - - /// - /// Get encoded length - /// - /// Encoded length, the sum of frequencies * lengths - public int GetEncodedLength() - { - int len = 0; - for (int i = 0; i < freqs.Length; i++) - { - len += freqs[i] * length[i]; - } - return len; - } - - /// - /// Scan a literal or distance tree to determine the frequencies of the codes - /// in the bit length tree. - /// - public void CalcBLFreq(Tree blTree) - { - int max_count; /* max repeat count */ - int min_count; /* min repeat count */ - int count; /* repeat count of the current code */ - int curlen = -1; /* length of current code */ - - int i = 0; - while (i < numCodes) - { - count = 1; - int nextlen = length[i]; - if (nextlen == 0) - { - max_count = 138; - min_count = 3; - } - else - { - max_count = 6; - min_count = 3; - if (curlen != nextlen) - { - blTree.freqs[nextlen]++; - count = 0; - } - } - curlen = nextlen; - i++; - - while (i < numCodes && curlen == length[i]) - { - i++; - if (++count >= max_count) - { - break; - } - } - - if (count < min_count) - { - blTree.freqs[curlen] += (short)count; - } - else if (curlen != 0) - { - blTree.freqs[REP_3_6]++; - } - else if (count <= 10) - { - blTree.freqs[REP_3_10]++; - } - else - { - blTree.freqs[REP_11_138]++; - } - } - } - - /// - /// Write tree values - /// - /// Tree to write - public void WriteTree(Tree blTree) - { - int max_count; // max repeat count - int min_count; // min repeat count - int count; // repeat count of the current code - int curlen = -1; // length of current code - - int i = 0; - while (i < numCodes) - { - count = 1; - int nextlen = length[i]; - if (nextlen == 0) - { - max_count = 138; - min_count = 3; - } - else - { - max_count = 6; - min_count = 3; - if (curlen != nextlen) - { - blTree.WriteSymbol(nextlen); - count = 0; - } - } - curlen = nextlen; - i++; - - while (i < numCodes && curlen == length[i]) - { - i++; - if (++count >= max_count) - { - break; - } - } - - if (count < min_count) - { - while (count-- > 0) - { - blTree.WriteSymbol(curlen); - } - } - else if (curlen != 0) - { - blTree.WriteSymbol(REP_3_6); - dh.pending.WriteBits(count - 3, 2); - } - else if (count <= 10) - { - blTree.WriteSymbol(REP_3_10); - dh.pending.WriteBits(count - 3, 3); - } - else - { - blTree.WriteSymbol(REP_11_138); - dh.pending.WriteBits(count - 11, 7); - } - } - } - - void BuildLength(int[] childs) - { - this.length = new byte[freqs.Length]; - int numNodes = childs.Length / 2; - int numLeafs = (numNodes + 1) / 2; - int overflow = 0; - - for (int i = 0; i < maxLength; i++) - { - bl_counts[i] = 0; - } - - int[] lengths = new int[numNodes]; - lengths[numNodes - 1] = 0; - - for (int i = numNodes - 1; i >= 0; i--) - { - if (childs[2 * i + 1] != -1) - { - int bitLength = lengths[i] + 1; - if (bitLength > maxLength) - { - bitLength = maxLength; - overflow++; - } - lengths[childs[2 * i]] = lengths[childs[2 * i + 1]] = bitLength; - } - else - { - int bitLength = lengths[i]; - bl_counts[bitLength - 1]++; - this.length[childs[2 * i]] = (byte)lengths[i]; - } - } - - if (overflow == 0) - { - return; - } - - int incrBitLen = maxLength - 1; - do - { - while (bl_counts[--incrBitLen] == 0) - ; - - do - { - bl_counts[incrBitLen]--; - bl_counts[++incrBitLen]++; - overflow -= 1 << (maxLength - 1 - incrBitLen); - } while (overflow > 0 && incrBitLen < maxLength - 1); - } while (overflow > 0); - - bl_counts[maxLength - 1] += overflow; - bl_counts[maxLength - 2] -= overflow; - - int nodePtr = 2 * numLeafs; - for (int bits = maxLength; bits != 0; bits--) - { - int n = bl_counts[bits - 1]; - while (n > 0) - { - int childPtr = 2 * childs[nodePtr++]; - if (childs[childPtr + 1] == -1) - { - length[childs[childPtr]] = (byte)bits; - n--; - } - } - } - } - - } - - #region Instance Fields - /// - /// Pending buffer to use - /// - public DeflaterPending pending; - - Tree literalTree; - Tree distTree; - Tree blTree; - - // Buffer for distances - short[] d_buf; - byte[] l_buf; - int last_lit; - int extra_bits; - #endregion - - static DeflaterHuffman() - { - staticLCodes = new short[LITERAL_NUM]; - staticLLength = new byte[LITERAL_NUM]; - - int i = 0; - while (i < 144) - { - staticLCodes[i] = BitReverse((0x030 + i) << 8); - staticLLength[i++] = 8; - } - - while (i < 256) - { - staticLCodes[i] = BitReverse((0x190 - 144 + i) << 7); - staticLLength[i++] = 9; - } - - while (i < 280) - { - staticLCodes[i] = BitReverse((0x000 - 256 + i) << 9); - staticLLength[i++] = 7; - } - - while (i < LITERAL_NUM) - { - staticLCodes[i] = BitReverse((0x0c0 - 280 + i) << 8); - staticLLength[i++] = 8; - } - - staticDCodes = new short[DIST_NUM]; - staticDLength = new byte[DIST_NUM]; - for (i = 0; i < DIST_NUM; i++) - { - staticDCodes[i] = BitReverse(i << 11); - staticDLength[i] = 5; - } - } - - /// - /// Construct instance with pending buffer - /// - /// Pending buffer to use - public DeflaterHuffman(DeflaterPending pending) - { - this.pending = pending; - - literalTree = new Tree(this, LITERAL_NUM, 257, 15); - distTree = new Tree(this, DIST_NUM, 1, 15); - blTree = new Tree(this, BITLEN_NUM, 4, 7); - - d_buf = new short[BUFSIZE]; - l_buf = new byte[BUFSIZE]; - } - - /// - /// Reset internal state - /// - public void Reset() - { - last_lit = 0; - extra_bits = 0; - literalTree.Reset(); - distTree.Reset(); - blTree.Reset(); - } - - /// - /// Write all trees to pending buffer - /// - /// The number/rank of treecodes to send. - public void SendAllTrees(int blTreeCodes) - { - blTree.BuildCodes(); - literalTree.BuildCodes(); - distTree.BuildCodes(); - pending.WriteBits(literalTree.numCodes - 257, 5); - pending.WriteBits(distTree.numCodes - 1, 5); - pending.WriteBits(blTreeCodes - 4, 4); - for (int rank = 0; rank < blTreeCodes; rank++) - { - pending.WriteBits(blTree.length[BL_ORDER[rank]], 3); - } - literalTree.WriteTree(blTree); - distTree.WriteTree(blTree); - - } - - /// - /// Compress current buffer writing data to pending buffer - /// - public void CompressBlock() - { - for (int i = 0; i < last_lit; i++) - { - int litlen = l_buf[i] & 0xff; - int dist = d_buf[i]; - if (dist-- != 0) - { - int lc = Lcode(litlen); - literalTree.WriteSymbol(lc); - - int bits = (lc - 261) / 4; - if (bits > 0 && bits <= 5) - { - pending.WriteBits(litlen & ((1 << bits) - 1), bits); - } - - int dc = Dcode(dist); - distTree.WriteSymbol(dc); - - bits = dc / 2 - 1; - if (bits > 0) - { - pending.WriteBits(dist & ((1 << bits) - 1), bits); - } - } - else - { - literalTree.WriteSymbol(litlen); - } - } - literalTree.WriteSymbol(EOF_SYMBOL); - - } - - /// - /// Flush block to output with no compression - /// - /// Data to write - /// Index of first byte to write - /// Count of bytes to write - /// True if this is the last block - public void FlushStoredBlock(byte[] stored, int storedOffset, int storedLength, bool lastBlock) - { - pending.WriteBits((DeflaterConstants.STORED_BLOCK << 1) + (lastBlock ? 1 : 0), 3); - pending.AlignToByte(); - pending.WriteShort(storedLength); - pending.WriteShort(~storedLength); - pending.WriteBlock(stored, storedOffset, storedLength); - Reset(); - } - - /// - /// Flush block to output with compression - /// - /// Data to flush - /// Index of first byte to flush - /// Count of bytes to flush - /// True if this is the last block - public void FlushBlock(byte[] stored, int storedOffset, int storedLength, bool lastBlock) - { - literalTree.freqs[EOF_SYMBOL]++; - - literalTree.BuildTree(); - distTree.BuildTree(); - - literalTree.CalcBLFreq(blTree); - distTree.CalcBLFreq(blTree); - - blTree.BuildTree(); - - int blTreeCodes = 4; - for (int i = 18; i > blTreeCodes; i--) - { - if (blTree.length[BL_ORDER[i]] > 0) - { - blTreeCodes = i + 1; - } - } - int opt_len = 14 + blTreeCodes * 3 + blTree.GetEncodedLength() + - literalTree.GetEncodedLength() + distTree.GetEncodedLength() + - extra_bits; - - int static_len = extra_bits; - for (int i = 0; i < LITERAL_NUM; i++) - { - static_len += literalTree.freqs[i] * staticLLength[i]; - } - for (int i = 0; i < DIST_NUM; i++) - { - static_len += distTree.freqs[i] * staticDLength[i]; - } - if (opt_len >= static_len) - { - opt_len = static_len; - } - - if (storedOffset >= 0 && storedLength + 4 < opt_len >> 3) - { - FlushStoredBlock(stored, storedOffset, storedLength, lastBlock); - } - else if (opt_len == static_len) - { - pending.WriteBits((DeflaterConstants.STATIC_TREES << 1) + (lastBlock ? 1 : 0), 3); - literalTree.SetStaticCodes(staticLCodes, staticLLength); - distTree.SetStaticCodes(staticDCodes, staticDLength); - CompressBlock(); - Reset(); - } - else - { - pending.WriteBits((DeflaterConstants.DYN_TREES << 1) + (lastBlock ? 1 : 0), 3); - SendAllTrees(blTreeCodes); - CompressBlock(); - Reset(); - } - } - - /// - /// Get value indicating if internal buffer is full - /// - /// true if buffer is full - public bool IsFull() - { - return last_lit >= BUFSIZE; - } - - /// - /// Add literal to buffer - /// - /// Literal value to add to buffer. - /// Value indicating internal buffer is full - public bool TallyLit(int literal) - { - d_buf[last_lit] = 0; - l_buf[last_lit++] = (byte)literal; - literalTree.freqs[literal]++; - return IsFull(); - } - - /// - /// Add distance code and length to literal and distance trees - /// - /// Distance code - /// Length - /// Value indicating if internal buffer is full - public bool TallyDist(int distance, int length) - { - d_buf[last_lit] = (short)distance; - l_buf[last_lit++] = (byte)(length - 3); - - int lc = Lcode(length - 3); - literalTree.freqs[lc]++; - if (lc >= 265 && lc < 285) - { - extra_bits += (lc - 261) / 4; - } - - int dc = Dcode(distance - 1); - distTree.freqs[dc]++; - if (dc >= 4) - { - extra_bits += dc / 2 - 1; - } - return IsFull(); - } - - - /// - /// Reverse the bits of a 16 bit value. - /// - /// Value to reverse bits - /// Value with bits reversed - public static short BitReverse(int toReverse) - { - return (short)(bit4Reverse[toReverse & 0xF] << 12 | - bit4Reverse[(toReverse >> 4) & 0xF] << 8 | - bit4Reverse[(toReverse >> 8) & 0xF] << 4 | - bit4Reverse[toReverse >> 12]); - } - - static int Lcode(int length) - { - if (length == 255) - { - return 285; - } - - int code = 257; - while (length >= 8) - { - code += 4; - length >>= 1; - } - return code + length; - } - - static int Dcode(int distance) - { - int code = 0; - while (distance >= 4) - { - code += 2; - distance >>= 1; - } - return code + distance; - } - } - #endregion - - #region DeflateStrategy - /// - /// Strategies for deflater - /// - internal enum DeflateStrategy - { - /// - /// The default strategy - /// - Default = 0, - - /// - /// This strategy will only allow longer string repetitions. It is - /// useful for random data with a small character set. - /// - Filtered = 1, - - - /// - /// This strategy will not look for string repetitions at all. It - /// only encodes with Huffman trees (which means, that more common - /// characters get a smaller encoding. - /// - HuffmanOnly = 2 - } - #endregion - - #region DeflaterEngine - /// - /// Low level compression engine for deflate algorithm which uses a 32K sliding window - /// with secondary compression from Huffman/Shannon-Fano codes. - /// - internal class DeflaterEngine : DeflaterConstants - { - #region Constants - const int TooFar = 4096; - #endregion - - #region Constructors - /// - /// Construct instance with pending buffer - /// - /// - /// Pending buffer to use - /// > - public DeflaterEngine(DeflaterPending pending) - { - this.pending = pending; - huffman = new DeflaterHuffman(pending); - adler = new Adler32(); - - window = new byte[2 * WSIZE]; - head = new short[HASH_SIZE]; - prev = new short[WSIZE]; - - // We start at index 1, to avoid an implementation deficiency, that - // we cannot build a repeat pattern at index 0. - blockStart = strstart = 1; - } - - #endregion - - /// - /// Deflate drives actual compression of data - /// - /// True to flush input buffers - /// Finish deflation with the current input. - /// Returns true if progress has been made. - public bool Deflate(bool flush, bool finish) - { - bool progress; - do - { - FillWindow(); - bool canFlush = flush && (inputOff == inputEnd); - - switch (compressionFunction) - { - case DEFLATE_STORED: - progress = DeflateStored(canFlush, finish); - break; - case DEFLATE_FAST: - progress = DeflateFast(canFlush, finish); - break; - case DEFLATE_SLOW: - progress = DeflateSlow(canFlush, finish); - break; - default: - throw new InvalidOperationException("unknown compressionFunction"); - } - } while (pending.IsFlushed && progress); // repeat while we have no pending output and progress was made - return progress; - } - - /// - /// Sets input data to be deflated. Should only be called when NeedsInput() - /// returns true - /// - /// The buffer containing input data. - /// The offset of the first byte of data. - /// The number of bytes of data to use as input. - public void SetInput(byte[] buffer, int offset, int count) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - if (offset < 0) - { - throw new ArgumentOutOfRangeException("offset"); - } - - if (count < 0) - { - throw new ArgumentOutOfRangeException("count"); - } - - if (inputOff < inputEnd) - { - throw new InvalidOperationException("Old input was not completely processed"); - } - - int end = offset + count; - - /* We want to throw an ArrayIndexOutOfBoundsException early. The - * check is very tricky: it also handles integer wrap around. - */ - if ((offset > end) || (end > buffer.Length)) - { - throw new ArgumentOutOfRangeException("count"); - } - - inputBuf = buffer; - inputOff = offset; - inputEnd = end; - } - - /// - /// Determines if more input is needed. - /// - /// Return true if input is needed via SetInput - public bool NeedsInput() - { - return (inputEnd == inputOff); - } - - /// - /// Set compression dictionary - /// - /// The buffer containing the dictionary data - /// The offset in the buffer for the first byte of data - /// The length of the dictionary data. - public void SetDictionary(byte[] buffer, int offset, int length) - { - adler.Update(buffer, offset, length); - if (length < MIN_MATCH) - { - return; - } - - if (length > MAX_DIST) - { - offset += length - MAX_DIST; - length = MAX_DIST; - } - - System.Array.Copy(buffer, offset, window, strstart, length); - - UpdateHash(); - --length; - while (--length > 0) - { - InsertString(); - strstart++; - } - strstart += 2; - blockStart = strstart; - } - - /// - /// Reset internal state - /// - public void Reset() - { - huffman.Reset(); - adler.Reset(); - blockStart = strstart = 1; - lookahead = 0; - totalIn = 0; - prevAvailable = false; - matchLen = MIN_MATCH - 1; - - for (int i = 0; i < HASH_SIZE; i++) - { - head[i] = 0; - } - - for (int i = 0; i < WSIZE; i++) - { - prev[i] = 0; - } - } - - /// - /// Reset Adler checksum - /// - public void ResetAdler() - { - adler.Reset(); - } - - /// - /// Get current value of Adler checksum - /// - public int Adler - { - get - { - return unchecked((int)adler.Value); - } - } - - /// - /// Total data processed - /// - public long TotalIn - { - get - { - return totalIn; - } - } - - /// - /// Get/set the deflate strategy - /// - public DeflateStrategy Strategy - { - get - { - return strategy; - } - set - { - strategy = value; - } - } - - /// - /// Set the deflate level (0-9) - /// - /// The value to set the level to. - public void SetLevel(int level) - { - if ((level < 0) || (level > 9)) - { - throw new ArgumentOutOfRangeException("level"); - } - - goodLength = DeflaterConstants.GOOD_LENGTH[level]; - max_lazy = DeflaterConstants.MAX_LAZY[level]; - niceLength = DeflaterConstants.NICE_LENGTH[level]; - max_chain = DeflaterConstants.MAX_CHAIN[level]; - - if (DeflaterConstants.COMPR_FUNC[level] != compressionFunction) - { - switch (compressionFunction) - { - case DEFLATE_STORED: - if (strstart > blockStart) - { - huffman.FlushStoredBlock(window, blockStart, - strstart - blockStart, false); - blockStart = strstart; - } - UpdateHash(); - break; - - case DEFLATE_FAST: - if (strstart > blockStart) - { - huffman.FlushBlock(window, blockStart, strstart - blockStart, - false); - blockStart = strstart; - } - break; - - case DEFLATE_SLOW: - if (prevAvailable) - { - huffman.TallyLit(window[strstart - 1] & 0xff); - } - if (strstart > blockStart) - { - huffman.FlushBlock(window, blockStart, strstart - blockStart, false); - blockStart = strstart; - } - prevAvailable = false; - matchLen = MIN_MATCH - 1; - break; - } - compressionFunction = COMPR_FUNC[level]; - } - } - - /// - /// Fill the window - /// - public void FillWindow() - { - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (strstart >= WSIZE + MAX_DIST) - { - SlideWindow(); - } - - /* If there is not enough lookahead, but still some input left, - * read in the input - */ - while (lookahead < DeflaterConstants.MIN_LOOKAHEAD && inputOff < inputEnd) - { - int more = 2 * WSIZE - lookahead - strstart; - - if (more > inputEnd - inputOff) - { - more = inputEnd - inputOff; - } - - System.Array.Copy(inputBuf, inputOff, window, strstart + lookahead, more); - adler.Update(inputBuf, inputOff, more); - - inputOff += more; - totalIn += more; - lookahead += more; - } - - if (lookahead >= MIN_MATCH) - { - UpdateHash(); - } - } - - void UpdateHash() - { - /* - if (DEBUGGING) { - Console.WriteLine("updateHash: "+strstart); - } - */ - ins_h = (window[strstart] << HASH_SHIFT) ^ window[strstart + 1]; - } - - /// - /// Inserts the current string in the head hash and returns the previous - /// value for this hash. - /// - /// The previous hash value - int InsertString() - { - short match; - int hash = ((ins_h << HASH_SHIFT) ^ window[strstart + (MIN_MATCH - 1)]) & HASH_MASK; - - prev[strstart & WMASK] = match = head[hash]; - head[hash] = unchecked((short)strstart); - ins_h = hash; - return match & 0xffff; - } - - void SlideWindow() - { - Array.Copy(window, WSIZE, window, 0, WSIZE); - matchStart -= WSIZE; - strstart -= WSIZE; - blockStart -= WSIZE; - - // Slide the hash table (could be avoided with 32 bit values - // at the expense of memory usage). - for (int i = 0; i < HASH_SIZE; ++i) - { - int m = head[i] & 0xffff; - head[i] = (short)(m >= WSIZE ? (m - WSIZE) : 0); - } - - // Slide the prev table. - for (int i = 0; i < WSIZE; i++) - { - int m = prev[i] & 0xffff; - prev[i] = (short)(m >= WSIZE ? (m - WSIZE) : 0); - } - } - - /// - /// Find the best (longest) string in the window matching the - /// string starting at strstart. - /// - /// Preconditions: - /// - /// strstart + MAX_MATCH <= window.length. - /// - /// - /// True if a match greater than the minimum length is found - bool FindLongestMatch(int curMatch) - { - int chainLength = this.max_chain; - int niceLength = this.niceLength; - short[] prev = this.prev; - int scan = this.strstart; - int match; - int best_end = this.strstart + matchLen; - int best_len = Math.Max(matchLen, MIN_MATCH - 1); - - int limit = Math.Max(strstart - MAX_DIST, 0); - - int strend = strstart + MAX_MATCH - 1; - byte scan_end1 = window[best_end - 1]; - byte scan_end = window[best_end]; - - // Do not waste too much time if we already have a good match: - if (best_len >= this.goodLength) - { - chainLength >>= 2; - } - - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if (niceLength > lookahead) - { - niceLength = lookahead; - } - - do - { - - if (window[curMatch + best_len] != scan_end || - window[curMatch + best_len - 1] != scan_end1 || - window[curMatch] != window[scan] || - window[curMatch + 1] != window[scan + 1]) - { - continue; - } - - match = curMatch + 2; - scan += 2; - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart + 258. - */ - while ( - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - window[++scan] == window[++match] && - (scan < strend)) - { - // Do nothing - } - - if (scan > best_end) - { - matchStart = curMatch; - best_end = scan; - best_len = scan - strstart; - - if (best_len >= niceLength) - { - break; - } - - scan_end1 = window[best_end - 1]; - scan_end = window[best_end]; - } - scan = strstart; - } while ((curMatch = (prev[curMatch & WMASK] & 0xffff)) > limit && --chainLength != 0); - - matchLen = Math.Min(best_len, lookahead); - return matchLen >= MIN_MATCH; - } - - bool DeflateStored(bool flush, bool finish) - { - if (!flush && (lookahead == 0)) - { - return false; - } - - strstart += lookahead; - lookahead = 0; - - int storedLength = strstart - blockStart; - - if ((storedLength >= DeflaterConstants.MAX_BLOCK_SIZE) || // Block is full - (blockStart < WSIZE && storedLength >= MAX_DIST) || // Block may move out of window - flush) - { - bool lastBlock = finish; - if (storedLength > DeflaterConstants.MAX_BLOCK_SIZE) - { - storedLength = DeflaterConstants.MAX_BLOCK_SIZE; - lastBlock = false; - } - - huffman.FlushStoredBlock(window, blockStart, storedLength, lastBlock); - blockStart += storedLength; - return !lastBlock; - } - return true; - } - - bool DeflateFast(bool flush, bool finish) - { - if (lookahead < MIN_LOOKAHEAD && !flush) - { - return false; - } - - while (lookahead >= MIN_LOOKAHEAD || flush) - { - if (lookahead == 0) - { - // We are flushing everything - huffman.FlushBlock(window, blockStart, strstart - blockStart, finish); - blockStart = strstart; - return false; - } - - if (strstart > 2 * WSIZE - MIN_LOOKAHEAD) - { - /* slide window, as FindLongestMatch needs this. - * This should only happen when flushing and the window - * is almost full. - */ - SlideWindow(); - } - - int hashHead; - if (lookahead >= MIN_MATCH && - (hashHead = InsertString()) != 0 && - strategy != DeflateStrategy.HuffmanOnly && - strstart - hashHead <= MAX_DIST && - FindLongestMatch(hashHead)) - { - // longestMatch sets matchStart and matchLen - - bool full = huffman.TallyDist(strstart - matchStart, matchLen); - - lookahead -= matchLen; - if (matchLen <= max_lazy && lookahead >= MIN_MATCH) - { - while (--matchLen > 0) - { - ++strstart; - InsertString(); - } - ++strstart; - } - else - { - strstart += matchLen; - if (lookahead >= MIN_MATCH - 1) - { - UpdateHash(); - } - } - matchLen = MIN_MATCH - 1; - if (!full) - { - continue; - } - } - else - { - // No match found - huffman.TallyLit(window[strstart] & 0xff); - ++strstart; - --lookahead; - } - - if (huffman.IsFull()) - { - bool lastBlock = finish && (lookahead == 0); - huffman.FlushBlock(window, blockStart, strstart - blockStart, lastBlock); - blockStart = strstart; - return !lastBlock; - } - } - return true; - } - - bool DeflateSlow(bool flush, bool finish) - { - if (lookahead < MIN_LOOKAHEAD && !flush) - { - return false; - } - - while (lookahead >= MIN_LOOKAHEAD || flush) - { - if (lookahead == 0) - { - if (prevAvailable) - { - huffman.TallyLit(window[strstart - 1] & 0xff); - } - prevAvailable = false; - - // We are flushing everything - huffman.FlushBlock(window, blockStart, strstart - blockStart, finish); - blockStart = strstart; - return false; - } - - if (strstart >= 2 * WSIZE - MIN_LOOKAHEAD) - { - /* slide window, as FindLongestMatch needs this. - * This should only happen when flushing and the window - * is almost full. - */ - SlideWindow(); - } - - int prevMatch = matchStart; - int prevLen = matchLen; - if (lookahead >= MIN_MATCH) - { - - int hashHead = InsertString(); - - if (strategy != DeflateStrategy.HuffmanOnly && - hashHead != 0 && - strstart - hashHead <= MAX_DIST && - FindLongestMatch(hashHead)) - { - - // longestMatch sets matchStart and matchLen - - // Discard match if too small and too far away - if (matchLen <= 5 && (strategy == DeflateStrategy.Filtered || (matchLen == MIN_MATCH && strstart - matchStart > TooFar))) - { - matchLen = MIN_MATCH - 1; - } - } - } - - // previous match was better - if ((prevLen >= MIN_MATCH) && (matchLen <= prevLen)) - { - huffman.TallyDist(strstart - 1 - prevMatch, prevLen); - prevLen -= 2; - do - { - strstart++; - lookahead--; - if (lookahead >= MIN_MATCH) - { - InsertString(); - } - } while (--prevLen > 0); - - strstart++; - lookahead--; - prevAvailable = false; - matchLen = MIN_MATCH - 1; - } - else - { - if (prevAvailable) - { - huffman.TallyLit(window[strstart - 1] & 0xff); - } - prevAvailable = true; - strstart++; - lookahead--; - } - - if (huffman.IsFull()) - { - int len = strstart - blockStart; - if (prevAvailable) - { - len--; - } - bool lastBlock = (finish && (lookahead == 0) && !prevAvailable); - huffman.FlushBlock(window, blockStart, len, lastBlock); - blockStart += len; - return !lastBlock; - } - } - return true; - } - - #region Instance Fields - - // Hash index of string to be inserted - int ins_h; - - /// - /// Hashtable, hashing three characters to an index for window, so - /// that window[index]..window[index+2] have this hash code. - /// Note that the array should really be unsigned short, so you need - /// to and the values with 0xffff. - /// - short[] head; - - /// - /// prev[index & WMASK] points to the previous index that has the - /// same hash code as the string starting at index. This way - /// entries with the same hash code are in a linked list. - /// Note that the array should really be unsigned short, so you need - /// to and the values with 0xffff. - /// - short[] prev; - - int matchStart; - // Length of best match - int matchLen; - // Set if previous match exists - bool prevAvailable; - int blockStart; - - /// - /// Points to the current character in the window. - /// - int strstart; - - /// - /// lookahead is the number of characters starting at strstart in - /// window that are valid. - /// So window[strstart] until window[strstart+lookahead-1] are valid - /// characters. - /// - int lookahead; - - /// - /// This array contains the part of the uncompressed stream that - /// is of relevance. The current character is indexed by strstart. - /// - byte[] window; - - DeflateStrategy strategy; - int max_chain, max_lazy, niceLength, goodLength; - - /// - /// The current compression function. - /// - int compressionFunction; - - /// - /// The input data for compression. - /// - byte[] inputBuf; - - /// - /// The total bytes of input read. - /// - long totalIn; - - /// - /// The offset into inputBuf, where input data starts. - /// - int inputOff; - - /// - /// The end offset of the input data. - /// - int inputEnd; - - DeflaterPending pending; - DeflaterHuffman huffman; - - /// - /// The adler checksum - /// - Adler32 adler; - #endregion - } - #endregion - - #region DeflaterConstants - /// - /// This class contains constants used for deflation. - /// - internal class DeflaterConstants - { - /// - /// Set to true to enable debugging - /// - public const bool DEBUGGING = false; - - /// - /// Written to Zip file to identify a stored block - /// - public const int STORED_BLOCK = 0; - - /// - /// Identifies static tree in Zip file - /// - public const int STATIC_TREES = 1; - - /// - /// Identifies dynamic tree in Zip file - /// - public const int DYN_TREES = 2; - - /// - /// Header flag indicating a preset dictionary for deflation - /// - public const int PRESET_DICT = 0x20; - - /// - /// Sets internal buffer sizes for Huffman encoding - /// - public const int DEFAULT_MEM_LEVEL = 8; - - /// - /// Internal compression engine constant - /// - public const int MAX_MATCH = 258; - - /// - /// Internal compression engine constant - /// - public const int MIN_MATCH = 3; - - /// - /// Internal compression engine constant - /// - public const int MAX_WBITS = 15; - - /// - /// Internal compression engine constant - /// - public const int WSIZE = 1 << MAX_WBITS; - - /// - /// Internal compression engine constant - /// - public const int WMASK = WSIZE - 1; - - /// - /// Internal compression engine constant - /// - public const int HASH_BITS = DEFAULT_MEM_LEVEL + 7; - - /// - /// Internal compression engine constant - /// - public const int HASH_SIZE = 1 << HASH_BITS; - - /// - /// Internal compression engine constant - /// - public const int HASH_MASK = HASH_SIZE - 1; - - /// - /// Internal compression engine constant - /// - public const int HASH_SHIFT = (HASH_BITS + MIN_MATCH - 1) / MIN_MATCH; - - /// - /// Internal compression engine constant - /// - public const int MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1; - - /// - /// Internal compression engine constant - /// - public const int MAX_DIST = WSIZE - MIN_LOOKAHEAD; - - /// - /// Internal compression engine constant - /// - public const int PENDING_BUF_SIZE = 1 << (DEFAULT_MEM_LEVEL + 8); - - /// - /// Internal compression engine constant - /// - public static int MAX_BLOCK_SIZE = Math.Min(65535, PENDING_BUF_SIZE - 5); - - /// - /// Internal compression engine constant - /// - public const int DEFLATE_STORED = 0; - - /// - /// Internal compression engine constant - /// - public const int DEFLATE_FAST = 1; - - /// - /// Internal compression engine constant - /// - public const int DEFLATE_SLOW = 2; - - /// - /// Internal compression engine constant - /// - public static int[] GOOD_LENGTH = { 0, 4, 4, 4, 4, 8, 8, 8, 32, 32 }; - - /// - /// Internal compression engine constant - /// - public static int[] MAX_LAZY = { 0, 4, 5, 6, 4, 16, 16, 32, 128, 258 }; - - /// - /// Internal compression engine constant - /// - public static int[] NICE_LENGTH = { 0, 8, 16, 32, 16, 32, 128, 128, 258, 258 }; - - /// - /// Internal compression engine constant - /// - public static int[] MAX_CHAIN = { 0, 4, 8, 32, 16, 32, 128, 256, 1024, 4096 }; - - /// - /// Internal compression engine constant - /// - public static int[] COMPR_FUNC = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; - - } - #endregion - - #region Deflater - /// - /// This is the Deflater class. The deflater class compresses input - /// with the deflate algorithm described in RFC 1951. It has several - /// compression levels and three different strategies described below. - /// - /// This class is not thread safe. This is inherent in the API, due - /// to the split of deflate and setInput. - /// - /// author of the original java version : Jochen Hoenicke - /// - internal class Deflater - { - #region Deflater Documentation - /* - * The Deflater can do the following state transitions: - * - * (1) -> INIT_STATE ----> INIT_FINISHING_STATE ---. - * / | (2) (5) | - * / v (5) | - * (3)| SETDICT_STATE ---> SETDICT_FINISHING_STATE |(3) - * \ | (3) | ,--------' - * | | | (3) / - * v v (5) v v - * (1) -> BUSY_STATE ----> FINISHING_STATE - * | (6) - * v - * FINISHED_STATE - * \_____________________________________/ - * | (7) - * v - * CLOSED_STATE - * - * (1) If we should produce a header we start in INIT_STATE, otherwise - * we start in BUSY_STATE. - * (2) A dictionary may be set only when we are in INIT_STATE, then - * we change the state as indicated. - * (3) Whether a dictionary is set or not, on the first call of deflate - * we change to BUSY_STATE. - * (4) -- intentionally left blank -- :) - * (5) FINISHING_STATE is entered, when flush() is called to indicate that - * there is no more INPUT. There are also states indicating, that - * the header wasn't written yet. - * (6) FINISHED_STATE is entered, when everything has been flushed to the - * internal pending output buffer. - * (7) At any time (7) - * - */ - #endregion - #region Public Constants - /// - /// The best and slowest compression level. This tries to find very - /// long and distant string repetitions. - /// - public const int BEST_COMPRESSION = 9; - - /// - /// The worst but fastest compression level. - /// - public const int BEST_SPEED = 1; - - /// - /// The default compression level. - /// - public const int DEFAULT_COMPRESSION = -1; - - /// - /// This level won't compress at all but output uncompressed blocks. - /// - public const int NO_COMPRESSION = 0; - - /// - /// The compression method. This is the only method supported so far. - /// There is no need to use this constant at all. - /// - public const int DEFLATED = 8; - #endregion - #region Local Constants - private const int IS_SETDICT = 0x01; - private const int IS_FLUSHING = 0x04; - private const int IS_FINISHING = 0x08; - - private const int INIT_STATE = 0x00; - private const int SETDICT_STATE = 0x01; - // private static int INIT_FINISHING_STATE = 0x08; - // private static int SETDICT_FINISHING_STATE = 0x09; - private const int BUSY_STATE = 0x10; - private const int FLUSHING_STATE = 0x14; - private const int FINISHING_STATE = 0x1c; - private const int FINISHED_STATE = 0x1e; - private const int CLOSED_STATE = 0x7f; - #endregion - #region Constructors - /// - /// Creates a new deflater with default compression level. - /// - public Deflater() - : this(DEFAULT_COMPRESSION, false) - { - - } - - /// - /// Creates a new deflater with given compression level. - /// - /// - /// the compression level, a value between NO_COMPRESSION - /// and BEST_COMPRESSION, or DEFAULT_COMPRESSION. - /// - /// if lvl is out of range. - public Deflater(int level) - : this(level, false) - { - - } - - /// - /// Creates a new deflater with given compression level. - /// - /// - /// the compression level, a value between NO_COMPRESSION - /// and BEST_COMPRESSION. - /// - /// - /// true, if we should suppress the Zlib/RFC1950 header at the - /// beginning and the adler checksum at the end of the output. This is - /// useful for the GZIP/PKZIP formats. - /// - /// if lvl is out of range. - public Deflater(int level, bool noZlibHeaderOrFooter) - { - if (level == DEFAULT_COMPRESSION) - { - level = 6; - } - else if (level < NO_COMPRESSION || level > BEST_COMPRESSION) - { - throw new ArgumentOutOfRangeException("level"); - } - - pending = new DeflaterPending(); - engine = new DeflaterEngine(pending); - this.noZlibHeaderOrFooter = noZlibHeaderOrFooter; - SetStrategy(DeflateStrategy.Default); - SetLevel(level); - Reset(); - } - #endregion - - /// - /// Resets the deflater. The deflater acts afterwards as if it was - /// just created with the same compression level and strategy as it - /// had before. - /// - public void Reset() - { - state = (noZlibHeaderOrFooter ? BUSY_STATE : INIT_STATE); - totalOut = 0; - pending.Reset(); - engine.Reset(); - } - - /// - /// Gets the current adler checksum of the data that was processed so far. - /// - public int Adler - { - get - { - return engine.Adler; - } - } - - /// - /// Gets the number of input bytes processed so far. - /// - public long TotalIn - { - get - { - return engine.TotalIn; - } - } - - /// - /// Gets the number of output bytes so far. - /// - public long TotalOut - { - get - { - return totalOut; - } - } - - /// - /// Flushes the current input block. Further calls to deflate() will - /// produce enough output to inflate everything in the current input - /// block. This is not part of Sun's JDK so I have made it package - /// private. It is used by DeflaterOutputStream to implement - /// flush(). - /// - public void Flush() - { - state |= IS_FLUSHING; - } - - /// - /// Finishes the deflater with the current input block. It is an error - /// to give more input after this method was called. This method must - /// be called to force all bytes to be flushed. - /// - public void Finish() - { - state |= (IS_FLUSHING | IS_FINISHING); - } - - /// - /// Returns true if the stream was finished and no more output bytes - /// are available. - /// - public bool IsFinished - { - get - { - return (state == FINISHED_STATE) && pending.IsFlushed; - } - } - - /// - /// Returns true, if the input buffer is empty. - /// You should then call setInput(). - /// NOTE: This method can also return true when the stream - /// was finished. - /// - public bool IsNeedingInput - { - get - { - return engine.NeedsInput(); - } - } - - /// - /// Sets the data which should be compressed next. This should be only - /// called when needsInput indicates that more input is needed. - /// If you call setInput when needsInput() returns false, the - /// previous input that is still pending will be thrown away. - /// The given byte array should not be changed, before needsInput() returns - /// true again. - /// This call is equivalent to setInput(input, 0, input.length). - /// - /// - /// the buffer containing the input data. - /// - /// - /// if the buffer was finished() or ended(). - /// - public void SetInput(byte[] input) - { - SetInput(input, 0, input.Length); - } - - /// - /// Sets the data which should be compressed next. This should be - /// only called when needsInput indicates that more input is needed. - /// The given byte array should not be changed, before needsInput() returns - /// true again. - /// - /// - /// the buffer containing the input data. - /// - /// - /// the start of the data. - /// - /// - /// the number of data bytes of input. - /// - /// - /// if the buffer was Finish()ed or if previous input is still pending. - /// - public void SetInput(byte[] input, int offset, int count) - { - if ((state & IS_FINISHING) != 0) - { - throw new InvalidOperationException("Finish() already called"); - } - engine.SetInput(input, offset, count); - } - - /// - /// Sets the compression level. There is no guarantee of the exact - /// position of the change, but if you call this when needsInput is - /// true the change of compression level will occur somewhere near - /// before the end of the so far given input. - /// - /// - /// the new compression level. - /// - public void SetLevel(int level) - { - if (level == DEFAULT_COMPRESSION) - { - level = 6; - } - else if (level < NO_COMPRESSION || level > BEST_COMPRESSION) - { - throw new ArgumentOutOfRangeException("level"); - } - - if (this.level != level) - { - this.level = level; - engine.SetLevel(level); - } - } - - /// - /// Get current compression level - /// - /// Returns the current compression level - public int GetLevel() - { - return level; - } - - /// - /// Sets the compression strategy. Strategy is one of - /// DEFAULT_STRATEGY, HUFFMAN_ONLY and FILTERED. For the exact - /// position where the strategy is changed, the same as for - /// SetLevel() applies. - /// - /// - /// The new compression strategy. - /// - public void SetStrategy(DeflateStrategy strategy) - { - engine.Strategy = strategy; - } - - /// - /// Deflates the current input block with to the given array. - /// - /// - /// The buffer where compressed data is stored - /// - /// - /// The number of compressed bytes added to the output, or 0 if either - /// IsNeedingInput() or IsFinished returns true or length is zero. - /// - public int Deflate(byte[] output) - { - return Deflate(output, 0, output.Length); - } - - /// - /// Deflates the current input block to the given array. - /// - /// - /// Buffer to store the compressed data. - /// - /// - /// Offset into the output array. - /// - /// - /// The maximum number of bytes that may be stored. - /// - /// - /// The number of compressed bytes added to the output, or 0 if either - /// needsInput() or finished() returns true or length is zero. - /// - /// - /// If Finish() was previously called. - /// - /// - /// If offset or length don't match the array length. - /// - public int Deflate(byte[] output, int offset, int length) - { - int origLength = length; - - if (state == CLOSED_STATE) - { - throw new InvalidOperationException("Deflater closed"); - } - - if (state < BUSY_STATE) - { - // output header - int header = (DEFLATED + - ((DeflaterConstants.MAX_WBITS - 8) << 4)) << 8; - int level_flags = (level - 1) >> 1; - if (level_flags < 0 || level_flags > 3) - { - level_flags = 3; - } - header |= level_flags << 6; - if ((state & IS_SETDICT) != 0) - { - // Dictionary was set - header |= DeflaterConstants.PRESET_DICT; - } - header += 31 - (header % 31); - - pending.WriteShortMSB(header); - if ((state & IS_SETDICT) != 0) - { - int chksum = engine.Adler; - engine.ResetAdler(); - pending.WriteShortMSB(chksum >> 16); - pending.WriteShortMSB(chksum & 0xffff); - } - - state = BUSY_STATE | (state & (IS_FLUSHING | IS_FINISHING)); - } - - for (; ; ) - { - int count = pending.Flush(output, offset, length); - offset += count; - totalOut += count; - length -= count; - - if (length == 0 || state == FINISHED_STATE) - { - break; - } - - if (!engine.Deflate((state & IS_FLUSHING) != 0, (state & IS_FINISHING) != 0)) - { - if (state == BUSY_STATE) - { - // We need more input now - return origLength - length; - } - else if (state == FLUSHING_STATE) - { - if (level != NO_COMPRESSION) - { - /* We have to supply some lookahead. 8 bit lookahead - * is needed by the zlib inflater, and we must fill - * the next byte, so that all bits are flushed. - */ - int neededbits = 8 + ((-pending.BitCount) & 7); - while (neededbits > 0) - { - /* write a static tree block consisting solely of - * an EOF: - */ - pending.WriteBits(2, 10); - neededbits -= 10; - } - } - state = BUSY_STATE; - } - else if (state == FINISHING_STATE) - { - pending.AlignToByte(); - - // Compressed data is complete. Write footer information if required. - if (!noZlibHeaderOrFooter) - { - int adler = engine.Adler; - pending.WriteShortMSB(adler >> 16); - pending.WriteShortMSB(adler & 0xffff); - } - state = FINISHED_STATE; - } - } - } - return origLength - length; - } - - /// - /// Sets the dictionary which should be used in the deflate process. - /// This call is equivalent to setDictionary(dict, 0, dict.Length). - /// - /// - /// the dictionary. - /// - /// - /// if SetInput () or Deflate () were already called or another dictionary was already set. - /// - public void SetDictionary(byte[] dictionary) - { - SetDictionary(dictionary, 0, dictionary.Length); - } - - /// - /// Sets the dictionary which should be used in the deflate process. - /// The dictionary is a byte array containing strings that are - /// likely to occur in the data which should be compressed. The - /// dictionary is not stored in the compressed output, only a - /// checksum. To decompress the output you need to supply the same - /// dictionary again. - /// - /// - /// The dictionary data - /// - /// - /// The index where dictionary information commences. - /// - /// - /// The number of bytes in the dictionary. - /// - /// - /// If SetInput () or Deflate() were already called or another dictionary was already set. - /// - public void SetDictionary(byte[] dictionary, int index, int count) - { - if (state != INIT_STATE) - { - throw new InvalidOperationException(); - } - - state = SETDICT_STATE; - engine.SetDictionary(dictionary, index, count); - } - - #region Instance Fields - /// - /// Compression level. - /// - int level; - - /// - /// If true no Zlib/RFC1950 headers or footers are generated - /// - bool noZlibHeaderOrFooter; - - /// - /// The current state. - /// - int state; - - /// - /// The total bytes of output written. - /// - long totalOut; - - /// - /// The pending output. - /// - DeflaterPending pending; - - /// - /// The deflater engine. - /// - DeflaterEngine engine; - #endregion - } - #endregion - - #region OutputWindow - /// - /// Contains the output from the Inflation process. - /// We need to have a window so that we can refer backwards into the output stream - /// to repeat stuff.
- /// Author of the original java version : John Leuner - ///
- internal class OutputWindow - { - #region Constants - const int WindowSize = 1 << 15; - const int WindowMask = WindowSize - 1; - #endregion - - #region Instance Fields - byte[] window = new byte[WindowSize]; //The window is 2^15 bytes - int windowEnd; - int windowFilled; - #endregion - - /// - /// Write a byte to this output window - /// - /// value to write - /// - /// if window is full - /// - public void Write(int value) - { - if (windowFilled++ == WindowSize) - { - throw new InvalidOperationException("Window full"); - } - window[windowEnd++] = (byte)value; - windowEnd &= WindowMask; - } - - - private void SlowRepeat(int repStart, int length, int distance) - { - while (length-- > 0) - { - window[windowEnd++] = window[repStart++]; - windowEnd &= WindowMask; - repStart &= WindowMask; - } - } - - /// - /// Append a byte pattern already in the window itself - /// - /// length of pattern to copy - /// distance from end of window pattern occurs - /// - /// If the repeated data overflows the window - /// - public void Repeat(int length, int distance) - { - if ((windowFilled += length) > WindowSize) - { - throw new InvalidOperationException("Window full"); - } - - int repStart = (windowEnd - distance) & WindowMask; - int border = WindowSize - length; - if ((repStart <= border) && (windowEnd < border)) - { - if (length <= distance) - { - System.Array.Copy(window, repStart, window, windowEnd, length); - windowEnd += length; - } - else - { - // We have to copy manually, since the repeat pattern overlaps. - while (length-- > 0) - { - window[windowEnd++] = window[repStart++]; - } - } - } - else - { - SlowRepeat(repStart, length, distance); - } - } - - /// - /// Copy from input manipulator to internal window - /// - /// source of data - /// length of data to copy - /// the number of bytes copied - public int CopyStored(StreamManipulator input, int length) - { - length = Math.Min(Math.Min(length, WindowSize - windowFilled), input.AvailableBytes); - int copied; - - int tailLen = WindowSize - windowEnd; - if (length > tailLen) - { - copied = input.CopyBytes(window, windowEnd, tailLen); - if (copied == tailLen) - { - copied += input.CopyBytes(window, 0, length - tailLen); - } - } - else - { - copied = input.CopyBytes(window, windowEnd, length); - } - - windowEnd = (windowEnd + copied) & WindowMask; - windowFilled += copied; - return copied; - } - - /// - /// Copy dictionary to window - /// - /// source dictionary - /// offset of start in source dictionary - /// length of dictionary - /// - /// If window isnt empty - /// - public void CopyDict(byte[] dictionary, int offset, int length) - { - if (dictionary == null) - { - throw new ArgumentNullException("dictionary"); - } - - if (windowFilled > 0) - { - throw new InvalidOperationException(); - } - - if (length > WindowSize) - { - offset += length - WindowSize; - length = WindowSize; - } - System.Array.Copy(dictionary, offset, window, 0, length); - windowEnd = length & WindowMask; - } - - /// - /// Get remaining unfilled space in window - /// - /// Number of bytes left in window - public int GetFreeSpace() - { - return WindowSize - windowFilled; - } - - /// - /// Get bytes available for output in window - /// - /// Number of bytes filled - public int GetAvailable() - { - return windowFilled; - } - - /// - /// Copy contents of window to output - /// - /// buffer to copy to - /// offset to start at - /// number of bytes to count - /// The number of bytes copied - /// - /// If a window underflow occurs - /// - public int CopyOutput(byte[] output, int offset, int len) - { - int copyEnd = windowEnd; - if (len > windowFilled) - { - len = windowFilled; - } - else - { - copyEnd = (windowEnd - windowFilled + len) & WindowMask; - } - - int copied = len; - int tailLen = len - copyEnd; - - if (tailLen > 0) - { - System.Array.Copy(window, WindowSize - tailLen, output, offset, tailLen); - offset += tailLen; - len = copyEnd; - } - System.Array.Copy(window, copyEnd - len, output, offset, len); - windowFilled -= copied; - if (windowFilled < 0) - { - throw new InvalidOperationException(); - } - return copied; - } - - /// - /// Reset by clearing window so GetAvailable returns 0 - /// - public void Reset() - { - windowFilled = windowEnd = 0; - } - } - #endregion - - #region Inflater - /// - /// Inflater is used to decompress data that has been compressed according - /// to the "deflate" standard described in rfc1951. - /// - /// By default Zlib (rfc1950) headers and footers are expected in the input. - /// You can use constructor public Inflater(bool noHeader) passing true - /// if there is no Zlib header information - /// - /// The usage is as following. First you have to set some input with - /// SetInput(), then Inflate() it. If inflate doesn't - /// inflate any bytes there may be three reasons: - ///
    - ///
  • IsNeedingInput() returns true because the input buffer is empty. - /// You have to provide more input with SetInput(). - /// NOTE: IsNeedingInput() also returns true when, the stream is finished. - ///
  • - ///
  • IsNeedingDictionary() returns true, you have to provide a preset - /// dictionary with SetDictionary().
  • - ///
  • IsFinished returns true, the inflater has finished.
  • - ///
- /// Once the first output byte is produced, a dictionary will not be - /// needed at a later stage. - /// - /// author of the original java version : John Leuner, Jochen Hoenicke - ///
- internal class Inflater - { - #region Constants/Readonly - /// - /// Copy lengths for literal codes 257..285 - /// - static readonly int[] CPLENS = { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 - }; - - /// - /// Extra bits for literal codes 257..285 - /// - static readonly int[] CPLEXT = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 - }; - - /// - /// Copy offsets for distance codes 0..29 - /// - static readonly int[] CPDIST = { - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577 - }; - - /// - /// Extra bits for distance codes - /// - static readonly int[] CPDEXT = { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13 - }; - - /// - /// These are the possible states for an inflater - /// - const int DECODE_HEADER = 0; - const int DECODE_DICT = 1; - const int DECODE_BLOCKS = 2; - const int DECODE_STORED_LEN1 = 3; - const int DECODE_STORED_LEN2 = 4; - const int DECODE_STORED = 5; - const int DECODE_DYN_HEADER = 6; - const int DECODE_HUFFMAN = 7; - const int DECODE_HUFFMAN_LENBITS = 8; - const int DECODE_HUFFMAN_DIST = 9; - const int DECODE_HUFFMAN_DISTBITS = 10; - const int DECODE_CHKSUM = 11; - const int FINISHED = 12; - #endregion - - #region Instance Fields - /// - /// This variable contains the current state. - /// - int mode; - - /// - /// The adler checksum of the dictionary or of the decompressed - /// stream, as it is written in the header resp. footer of the - /// compressed stream. - /// Only valid if mode is DECODE_DICT or DECODE_CHKSUM. - /// - int readAdler; - - /// - /// The number of bits needed to complete the current state. This - /// is valid, if mode is DECODE_DICT, DECODE_CHKSUM, - /// DECODE_HUFFMAN_LENBITS or DECODE_HUFFMAN_DISTBITS. - /// - int neededBits; - int repLength; - int repDist; - int uncomprLen; - - /// - /// True, if the last block flag was set in the last block of the - /// inflated stream. This means that the stream ends after the - /// current block. - /// - bool isLastBlock; - - /// - /// The total number of inflated bytes. - /// - long totalOut; - - /// - /// The total number of bytes set with setInput(). This is not the - /// value returned by the TotalIn property, since this also includes the - /// unprocessed input. - /// - long totalIn; - - /// - /// This variable stores the noHeader flag that was given to the constructor. - /// True means, that the inflated stream doesn't contain a Zlib header or - /// footer. - /// - bool noHeader; - - StreamManipulator input; - OutputWindow outputWindow; - InflaterDynHeader dynHeader; - InflaterHuffmanTree litlenTree, distTree; - //Adler32 adler; - #endregion - - #region Constructors - /// - /// Creates a new inflater or RFC1951 decompressor - /// RFC1950/Zlib headers and footers will be expected in the input data - /// - public Inflater() - : this(false) - { - } - - /// - /// Creates a new inflater. - /// - /// - /// True if no RFC1950/Zlib header and footer fields are expected in the input data - /// - /// This is used for GZIPed/Zipped input. - /// - /// For compatibility with - /// Sun JDK you should provide one byte of input more than needed in - /// this case. - /// - public Inflater(bool noHeader) - { - this.noHeader = noHeader; - //this.adler = new Adler32(); - input = new StreamManipulator(); - outputWindow = new OutputWindow(); - mode = noHeader ? DECODE_BLOCKS : DECODE_HEADER; - } - #endregion - - /// - /// Resets the inflater so that a new stream can be decompressed. All - /// pending input and output will be discarded. - /// - public void Reset() - { - mode = noHeader ? DECODE_BLOCKS : DECODE_HEADER; - totalIn = 0; - totalOut = 0; - input.Reset(); - outputWindow.Reset(); - dynHeader = null; - litlenTree = null; - distTree = null; - isLastBlock = false; - //adler.Reset(); - } - - /// - /// Decodes a zlib/RFC1950 header. - /// - /// - /// False if more input is needed. - /// - /// - /// The header is invalid. - /// - private bool DecodeHeader() - { - int header = input.PeekBits(16); - if (header < 0) - { - return false; - } - input.DropBits(16); - - // The header is written in "wrong" byte order - header = ((header << 8) | (header >> 8)) & 0xffff; - if (header % 31 != 0) - { - throw new Exception("Header checksum illegal"); - } - - if ((header & 0x0f00) != (Deflater.DEFLATED << 8)) - { - throw new Exception("Compression Method unknown"); - } - - /* Maximum size of the backwards window in bits. - * We currently ignore this, but we could use it to make the - * inflater window more space efficient. On the other hand the - * full window (15 bits) is needed most times, anyway. - int max_wbits = ((header & 0x7000) >> 12) + 8; - */ - - if ((header & 0x0020) == 0) - { // Dictionary flag? - mode = DECODE_BLOCKS; - } - else - { - mode = DECODE_DICT; - neededBits = 32; - } - return true; - } - - /// - /// Decodes the dictionary checksum after the deflate header. - /// - /// - /// False if more input is needed. - /// - private bool DecodeDict() - { - while (neededBits > 0) - { - int dictByte = input.PeekBits(8); - if (dictByte < 0) - { - return false; - } - input.DropBits(8); - readAdler = (readAdler << 8) | dictByte; - neededBits -= 8; - } - return false; - } - - /// - /// Decodes the huffman encoded symbols in the input stream. - /// - /// - /// false if more input is needed, true if output window is - /// full or the current block ends. - /// - /// - /// if deflated stream is invalid. - /// - private bool DecodeHuffman() - { - int free = outputWindow.GetFreeSpace(); - while (free >= 258) - { - int symbol; - switch (mode) - { - case DECODE_HUFFMAN: - // This is the inner loop so it is optimized a bit - while (((symbol = litlenTree.GetSymbol(input)) & ~0xff) == 0) - { - outputWindow.Write(symbol); - if (--free < 258) - { - return true; - } - } - - if (symbol < 257) - { - if (symbol < 0) - { - return false; - } - else - { - // symbol == 256: end of block - distTree = null; - litlenTree = null; - mode = DECODE_BLOCKS; - return true; - } - } - - try - { - repLength = CPLENS[symbol - 257]; - neededBits = CPLEXT[symbol - 257]; - } - catch (Exception) - { - throw new Exception("Illegal rep length code"); - } - goto case DECODE_HUFFMAN_LENBITS; // fall through - - case DECODE_HUFFMAN_LENBITS: - if (neededBits > 0) - { - mode = DECODE_HUFFMAN_LENBITS; - int i = input.PeekBits(neededBits); - if (i < 0) - { - return false; - } - input.DropBits(neededBits); - repLength += i; - } - mode = DECODE_HUFFMAN_DIST; - goto case DECODE_HUFFMAN_DIST; // fall through - - case DECODE_HUFFMAN_DIST: - symbol = distTree.GetSymbol(input); - if (symbol < 0) - { - return false; - } - - try - { - repDist = CPDIST[symbol]; - neededBits = CPDEXT[symbol]; - } - catch (Exception) - { - throw new Exception("Illegal rep dist code"); - } - - goto case DECODE_HUFFMAN_DISTBITS; // fall through - - case DECODE_HUFFMAN_DISTBITS: - if (neededBits > 0) - { - mode = DECODE_HUFFMAN_DISTBITS; - int i = input.PeekBits(neededBits); - if (i < 0) - { - return false; - } - input.DropBits(neededBits); - repDist += i; - } - - outputWindow.Repeat(repLength, repDist); - free -= repLength; - mode = DECODE_HUFFMAN; - break; - - default: - throw new Exception("Inflater unknown mode"); - } - } - return true; - } - - /// - /// Decodes the adler checksum after the deflate stream. - /// - /// - /// false if more input is needed. - /// - /// - /// If checksum doesn't match. - /// - private bool DecodeChksum() - { - while (neededBits > 0) - { - int chkByte = input.PeekBits(8); - if (chkByte < 0) - { - return false; - } - input.DropBits(8); - readAdler = (readAdler << 8) | chkByte; - neededBits -= 8; - } - - //if ((int)adler.Value != readAdler) - //{ - // throw new Exception("Adler chksum doesn't match: " + (int)adler.Value + " vs. " + readAdler); - //} - - mode = FINISHED; - return false; - } - - /// - /// Decodes the deflated stream. - /// - /// - /// false if more input is needed, or if finished. - /// - /// - /// if deflated stream is invalid. - /// - private bool Decode() - { - switch (mode) - { - case DECODE_HEADER: - return DecodeHeader(); - - case DECODE_DICT: - return DecodeDict(); - - case DECODE_CHKSUM: - return DecodeChksum(); - - case DECODE_BLOCKS: - if (isLastBlock) - { - if (noHeader) - { - mode = FINISHED; - return false; - } - else - { - input.SkipToByteBoundary(); - neededBits = 32; - mode = DECODE_CHKSUM; - return true; - } - } - - int type = input.PeekBits(3); - if (type < 0) - { - return false; - } - input.DropBits(3); - - if ((type & 1) != 0) - { - isLastBlock = true; - } - switch (type >> 1) - { - case DeflaterConstants.STORED_BLOCK: - input.SkipToByteBoundary(); - mode = DECODE_STORED_LEN1; - break; - case DeflaterConstants.STATIC_TREES: - litlenTree = InflaterHuffmanTree.defLitLenTree; - distTree = InflaterHuffmanTree.defDistTree; - mode = DECODE_HUFFMAN; - break; - case DeflaterConstants.DYN_TREES: - dynHeader = new InflaterDynHeader(); - mode = DECODE_DYN_HEADER; - break; - default: - throw new Exception("Unknown block type " + type); - } - return true; - - case DECODE_STORED_LEN1: - { - if ((uncomprLen = input.PeekBits(16)) < 0) - { - return false; - } - input.DropBits(16); - mode = DECODE_STORED_LEN2; - } - goto case DECODE_STORED_LEN2; // fall through - - case DECODE_STORED_LEN2: - { - int nlen = input.PeekBits(16); - if (nlen < 0) - { - return false; - } - input.DropBits(16); - if (nlen != (uncomprLen ^ 0xffff)) - { - throw new Exception("broken uncompressed block"); - } - mode = DECODE_STORED; - } - goto case DECODE_STORED; // fall through - - case DECODE_STORED: - { - int more = outputWindow.CopyStored(input, uncomprLen); - uncomprLen -= more; - if (uncomprLen == 0) - { - mode = DECODE_BLOCKS; - return true; - } - return !input.IsNeedingInput; - } - - case DECODE_DYN_HEADER: - if (!dynHeader.Decode(input)) - { - return false; - } - - litlenTree = dynHeader.BuildLitLenTree(); - distTree = dynHeader.BuildDistTree(); - mode = DECODE_HUFFMAN; - goto case DECODE_HUFFMAN; // fall through - - case DECODE_HUFFMAN: - case DECODE_HUFFMAN_LENBITS: - case DECODE_HUFFMAN_DIST: - case DECODE_HUFFMAN_DISTBITS: - return DecodeHuffman(); - - case FINISHED: - return false; - - default: - throw new Exception("Inflater.Decode unknown mode"); - } - } - - /// - /// Sets the preset dictionary. This should only be called, if - /// needsDictionary() returns true and it should set the same - /// dictionary, that was used for deflating. The getAdler() - /// function returns the checksum of the dictionary needed. - /// - /// - /// The dictionary. - /// - public void SetDictionary(byte[] buffer) - { - SetDictionary(buffer, 0, buffer.Length); - } - - /// - /// Sets the preset dictionary. This should only be called, if - /// needsDictionary() returns true and it should set the same - /// dictionary, that was used for deflating. The getAdler() - /// function returns the checksum of the dictionary needed. - /// - /// - /// The dictionary. - /// - /// - /// The index into buffer where the dictionary starts. - /// - /// - /// The number of bytes in the dictionary. - /// - /// - /// No dictionary is needed. - /// - /// - /// The adler checksum for the buffer is invalid - /// - public void SetDictionary(byte[] buffer, int index, int count) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - if (index < 0) - { - throw new ArgumentOutOfRangeException("index"); - } - - if (count < 0) - { - throw new ArgumentOutOfRangeException("count"); - } - - if (!IsNeedingDictionary) - { - throw new InvalidOperationException("Dictionary is not needed"); - } - - //adler.Update(buffer, index, count); - - //if ((int)adler.Value != readAdler) - //{ - // throw new Exception("Wrong adler checksum"); - //} - //adler.Reset(); - outputWindow.CopyDict(buffer, index, count); - mode = DECODE_BLOCKS; - } - - /// - /// Sets the input. This should only be called, if needsInput() - /// returns true. - /// - /// - /// the input. - /// - public void SetInput(byte[] buffer) - { - SetInput(buffer, 0, buffer.Length); - } - - /// - /// Sets the input. This should only be called, if needsInput() - /// returns true. - /// - /// - /// The source of input data - /// - /// - /// The index into buffer where the input starts. - /// - /// - /// The number of bytes of input to use. - /// - /// - /// No input is needed. - /// - /// - /// The index and/or count are wrong. - /// - public void SetInput(byte[] buffer, int index, int count) - { - input.SetInput(buffer, index, count); - totalIn += (long)count; - } - - /// - /// Inflates the compressed stream to the output buffer. If this - /// returns 0, you should check, whether IsNeedingDictionary(), - /// IsNeedingInput() or IsFinished() returns true, to determine why no - /// further output is produced. - /// - /// - /// the output buffer. - /// - /// - /// The number of bytes written to the buffer, 0 if no further - /// output can be produced. - /// - /// - /// if buffer has length 0. - /// - /// - /// if deflated stream is invalid. - /// - public int Inflate(byte[] buffer) - { - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - return Inflate(buffer, 0, buffer.Length); - } - - /// - /// Inflates the compressed stream to the output buffer. If this - /// returns 0, you should check, whether needsDictionary(), - /// needsInput() or finished() returns true, to determine why no - /// further output is produced. - /// - /// - /// the output buffer. - /// - /// - /// the offset in buffer where storing starts. - /// - /// - /// the maximum number of bytes to output. - /// - /// - /// the number of bytes written to the buffer, 0 if no further output can be produced. - /// - /// - /// if count is less than 0. - /// - /// - /// if the index and / or count are wrong. - /// - /// - /// if deflated stream is invalid. - /// - public int Inflate(byte[] buffer, int offset, int count) - { - //if (buffer == null) - //{ - // throw new ArgumentNullException("buffer"); - //} - - //if (count < 0) - //{ - // throw new ArgumentOutOfRangeException("count", "count cannot be negative"); - //} - - //if (offset < 0) - //{ - // throw new ArgumentOutOfRangeException("offset", "offset cannot be negative"); - //} - - //if (offset + count > buffer.Length) - //{ - // throw new ArgumentException("count exceeds buffer bounds"); - //} - - // Special case: count may be zero - if (count == 0) - { - if (!IsFinished) - { // -jr- 08-Nov-2003 INFLATE_BUG fix.. - Decode(); - } - return 0; - } - - int bytesCopied = 0; - - do - { - if (mode != DECODE_CHKSUM) - { - /* Don't give away any output, if we are waiting for the - * checksum in the input stream. - * - * With this trick we have always: - * IsNeedingInput() and not IsFinished() - * implies more output can be produced. - */ - int more = outputWindow.CopyOutput(buffer, offset, count); - if (more > 0) - { - //adler.Update(buffer, offset, more); - offset += more; - bytesCopied += more; - totalOut += (long)more; - count -= more; - if (count == 0) - { - return bytesCopied; - } - } - } - } while (Decode() || ((outputWindow.GetAvailable() > 0) && (mode != DECODE_CHKSUM))); - return bytesCopied; - } - - /// - /// Returns true, if the input buffer is empty. - /// You should then call setInput(). - /// NOTE: This method also returns true when the stream is finished. - /// - public bool IsNeedingInput - { - get - { - return input.IsNeedingInput; - } - } - - /// - /// Returns true, if a preset dictionary is needed to inflate the input. - /// - public bool IsNeedingDictionary - { - get - { - return mode == DECODE_DICT && neededBits == 0; - } - } - - /// - /// Returns true, if the inflater has finished. This means, that no - /// input is needed and no output can be produced. - /// - public bool IsFinished - { - get - { - return mode == FINISHED && outputWindow.GetAvailable() == 0; - } - } - - ///// - ///// Gets the adler checksum. This is either the checksum of all - ///// uncompressed bytes returned by inflate(), or if needsDictionary() - ///// returns true (and thus no output was yet produced) this is the - ///// adler checksum of the expected dictionary. - ///// - ///// - ///// the adler checksum. - ///// - //public int Adler - //{ - // get - // { - // return IsNeedingDictionary ? readAdler : (int)adler.Value; - // } - //} - - /// - /// Gets the total number of output bytes returned by Inflate(). - /// - /// - /// the total number of output bytes. - /// - public long TotalOut - { - get - { - return totalOut; - } - } - - /// - /// Gets the total number of processed compressed input bytes. - /// - /// - /// The total number of bytes of processed input bytes. - /// - public long TotalIn - { - get - { - return totalIn - (long)RemainingInput; - } - } - - /// - /// Gets the number of unprocessed input bytes. Useful, if the end of the - /// stream is reached and you want to further process the bytes after - /// the deflate stream. - /// - /// - /// The number of bytes of the input which have not been processed. - /// - public int RemainingInput - { - // TODO: This should be a long? - get - { - return input.AvailableBytes; - } - } - } - #endregion - - #region InflaterInputBuffer - /// - /// An input buffer customised for use by - /// - /// - /// The buffer supports decryption of incoming data. - /// - internal class InflaterInputBuffer - { - /// - /// Initialise a new instance of with a default buffer size - /// - /// The stream to buffer. - public InflaterInputBuffer(Stream stream) - : this(stream, 4096) - { - } - - /// - /// Initialise a new instance of - /// - /// The stream to buffer. - /// The size to use for the buffer - /// A minimum buffer size of 1KB is permitted. Lower sizes are treated as 1KB. - public InflaterInputBuffer(Stream stream, int bufferSize) - { - inputStream = stream; - if (bufferSize < 1024) - { - bufferSize = 1024; - } - rawData = new byte[bufferSize]; - clearText = rawData; - } - - /// - /// Get the length of bytes bytes in the - /// - public int RawLength - { - get - { - return rawLength; - } - } - - /// - /// Get the contents of the raw data buffer. - /// - /// This may contain encrypted data. - public byte[] RawData - { - get - { - return rawData; - } - } - - /// - /// Get the number of useable bytes in - /// - public int ClearTextLength - { - get - { - return clearTextLength; - } - } - - /// - /// Get the contents of the clear text buffer. - /// - public byte[] ClearText - { - get - { - return clearText; - } - } - - /// - /// Get/set the number of bytes available - /// - public int Available - { - get { return available; } - set { available = value; } - } - - /// - /// Call passing the current clear text buffer contents. - /// - /// The inflater to set input for. - public void SetInflaterInput(Inflater inflater) - { - if (available > 0) - { - inflater.SetInput(clearText, clearTextLength - available, available); - available = 0; - } - } - - /// - /// Fill the buffer from the underlying input stream. - /// - public void Fill() - { - rawLength = 0; - int toRead = rawData.Length; - - while (toRead > 0) - { - int count = inputStream.Read(rawData, rawLength, toRead); - if (count <= 0) - { - break; - } - rawLength += count; - toRead -= count; - } - clearTextLength = rawLength; - - available = clearTextLength; - } - - /// - /// Read a buffer directly from the input stream - /// - /// The buffer to fill - /// Returns the number of bytes read. - public int ReadRawBuffer(byte[] buffer) - { - return ReadRawBuffer(buffer, 0, buffer.Length); - } - - /// - /// Read a buffer directly from the input stream - /// - /// The buffer to read into - /// The offset to start reading data into. - /// The number of bytes to read. - /// Returns the number of bytes read. - public int ReadRawBuffer(byte[] outBuffer, int offset, int length) - { - if (length < 0) - { - throw new ArgumentOutOfRangeException("length"); - } - - int currentOffset = offset; - int currentLength = length; - - while (currentLength > 0) - { - if (available <= 0) - { - Fill(); - if (available <= 0) - { - return 0; - } - } - int toCopy = Math.Min(currentLength, available); - System.Array.Copy(rawData, rawLength - (int)available, outBuffer, currentOffset, toCopy); - currentOffset += toCopy; - currentLength -= toCopy; - available -= toCopy; - } - return length; - } - - /// - /// Read clear text data from the input stream. - /// - /// The buffer to add data to. - /// The offset to start adding data at. - /// The number of bytes to read. - /// Returns the number of bytes actually read. - public int ReadClearTextBuffer(byte[] outBuffer, int offset, int length) - { - if (length < 0) - { - throw new ArgumentOutOfRangeException("length"); - } - - int currentOffset = offset; - int currentLength = length; - - while (currentLength > 0) - { - if (available <= 0) - { - Fill(); - if (available <= 0) - { - return 0; - } - } - - int toCopy = Math.Min(currentLength, available); - Array.Copy(clearText, clearTextLength - (int)available, outBuffer, currentOffset, toCopy); - currentOffset += toCopy; - currentLength -= toCopy; - available -= toCopy; - } - return length; - } - - /// - /// Read a from the input stream. - /// - /// Returns the byte read. - public int ReadLeByte() - { - if (available <= 0) - { - Fill(); - if (available <= 0) - { - throw new Exception("EOF in header"); - } - } - byte result = rawData[rawLength - available]; - available -= 1; - return result; - } - - /// - /// Read an in little endian byte order. - /// - /// The short value read case to an int. - public int ReadLeShort() - { - return ReadLeByte() | (ReadLeByte() << 8); - } - - /// - /// Read an in little endian byte order. - /// - /// The int value read. - public int ReadLeInt() - { - return ReadLeShort() | (ReadLeShort() << 16); - } - - /// - /// Read a in little endian byte order. - /// - /// The long value read. - public long ReadLeLong() - { - return (uint)ReadLeInt() | ((long)ReadLeInt() << 32); - } - - #region Instance Fields - int rawLength; - byte[] rawData; - int clearTextLength; - byte[] clearText; - int available; - Stream inputStream; - #endregion - } - #endregion - -} diff --git a/Users/Orvid/Orvid.Compression/Streams/Gzip.cs b/Users/Orvid/Orvid.Compression/Streams/Gzip.cs deleted file mode 100644 index d777cd52c0..0000000000 --- a/Users/Orvid/Orvid.Compression/Streams/Gzip.cs +++ /dev/null @@ -1,595 +0,0 @@ -// GzipInputStream.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -// HISTORY -// 11-08-2009 GeoffHart T9121 Added Multi-member gzip support - -using System; -using System.IO; -using Orvid.Compression.Checksums; - -namespace Orvid.Compression.Streams -{ - - #region GZipOutputStream - /// - /// This filter stream is used to compress a stream into a "GZIP" stream. - /// The "GZIP" format is described in RFC 1952. - /// - /// author of the original java version : John Leuner - /// - /// This sample shows how to gzip a file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.GZip; - /// using ICSharpCode.SharpZipLib.Core; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream s = new GZipOutputStream(File.Create(args[0] + ".gz"))) - /// using (FileStream fs = File.OpenRead(args[0])) { - /// byte[] writeData = new byte[4096]; - /// Streamutils.Copy(s, fs, writeData); - /// } - /// } - /// } - /// } - /// - /// - public class GZipOutputStream : DeflaterOutputStream - { - enum OutputState - { - Header, - Footer, - Finished, - Closed, - }; - - /// - /// CRC-32 value for uncompressed data - /// - protected Crc32 crc = new Crc32(); - OutputState state_ = OutputState.Header; - - /// - /// Creates a GzipOutputStream with the default buffer size - /// - /// - /// The stream to read data (to be compressed) from - /// - public GZipOutputStream(Stream baseOutputStream) - : this(baseOutputStream, 4096) - { - } - - /// - /// Creates a GZipOutputStream with the specified buffer size - /// - /// - /// The stream to read data (to be compressed) from - /// - /// - /// Size of the buffer to use - /// - public GZipOutputStream(Stream baseOutputStream, int size) - : base(baseOutputStream, new Deflater(Deflater.DEFAULT_COMPRESSION, true), size) - { - } - - /// - /// Sets the active compression level (1-9). The new level will be activated - /// immediately. - /// - /// The compression level to set. - /// - /// Level specified is not supported. - /// - /// - public void SetLevel(int level) - { - if (level < Deflater.BEST_SPEED) - { - throw new ArgumentOutOfRangeException("level"); - } - deflater_.SetLevel(level); - } - - /// - /// Get the current compression level. - /// - /// The current compression level. - public int GetLevel() - { - return deflater_.GetLevel(); - } - - /// - /// Write given buffer to output updating crc - /// - /// Buffer to write - /// Offset of first byte in buf to write - /// Number of bytes to write - public override void Write(byte[] buffer, int offset, int count) - { - if (state_ == OutputState.Header) - { - WriteHeader(); - } - - if (state_ != OutputState.Footer) - { - throw new InvalidOperationException("Write not permitted in current state"); - } - - crc.Update(buffer, offset, count); - base.Write(buffer, offset, count); - } - - /// - /// Writes remaining compressed output data to the output stream - /// and closes it. - /// - public override void Close() - { - try - { - Finish(); - } - finally - { - if (state_ != OutputState.Closed) - { - state_ = OutputState.Closed; - if (IsStreamOwner) - { - baseOutputStream_.Close(); - } - } - } - } - - /// - /// Finish compression and write any footer information required to stream - /// - public override void Finish() - { - if (state_ == OutputState.Header) - { - WriteHeader(); - } - - if (state_ == OutputState.Footer) - { - state_ = OutputState.Finished; - base.Finish(); - - uint totalin = (uint)(deflater_.TotalIn & 0xffffffff); - uint crcval = (uint)(crc.Value & 0xffffffff); - - byte[] gzipFooter; - - unchecked - { - gzipFooter = new byte[] { - (byte) crcval, (byte) (crcval >> 8), - (byte) (crcval >> 16), (byte) (crcval >> 24), - - (byte) totalin, (byte) (totalin >> 8), - (byte) (totalin >> 16), (byte) (totalin >> 24) - }; - } - - baseOutputStream_.Write(gzipFooter, 0, gzipFooter.Length); - } - } - - void WriteHeader() - { - if (state_ == OutputState.Header) - { - state_ = OutputState.Footer; - int mod_time = (int)((DateTime.Now.Ticks - new DateTime(1970, 1, 1).Ticks) / 10000000L); - byte[] gzipHeader = { - (byte) (0x1F8B >> 8), (byte) (0x1F8B & 0xff), - (byte) Deflater.DEFLATED, - 0, - (byte) mod_time, (byte) (mod_time >> 8), - (byte) (mod_time >> 16), (byte) (mod_time >> 24), - 0, - (byte) 255 - }; - baseOutputStream_.Write(gzipHeader, 0, gzipHeader.Length); - } - } - } - #endregion - - #region GZipInputStream - /// - /// This filter stream is used to decompress a "GZIP" format stream. - /// The "GZIP" format is described baseInputStream RFC 1952. - /// - /// author of the original java version : John Leuner - /// - /// This sample shows how to unzip a gzipped file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.Core; - /// using ICSharpCode.SharpZipLib.GZip; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream inStream = new GZipInputStream(File.OpenRead(args[0]))) - /// using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - /// byte[] buffer = new byte[4096]; - /// StreamUtils.Copy(inStream, outStream, buffer); - /// } - /// } - /// } - /// - /// - public class GZipInputStream : DeflaterInputStream - { - #region Instance Fields - /// - /// CRC-32 value for uncompressed data - /// - protected Crc32 crc; - - /// - /// Flag to indicate if we've read the GZIP header yet for the current member (block of compressed data). - /// This is tracked per-block as the file is parsed. - /// - bool readGZIPHeader; - #endregion - - #region Constructors - /// - /// Creates a GZipInputStream with the default buffer size - /// - /// - /// The stream to read compressed data from (baseInputStream GZIP format) - /// - public GZipInputStream(Stream baseInputStream) - : this(baseInputStream, 4096) - { - } - - /// - /// Creates a GZIPInputStream with the specified buffer size - /// - /// - /// The stream to read compressed data from (baseInputStream GZIP format) - /// - /// - /// Size of the buffer to use - /// - public GZipInputStream(Stream baseInputStream, int size) - : base(baseInputStream, new Inflater(true), size) - { - } - #endregion - - #region Stream overrides - /// - /// Reads uncompressed data into an array of bytes - /// - /// - /// The buffer to read uncompressed data into - /// - /// - /// The offset indicating where the data should be placed - /// - /// - /// The number of uncompressed bytes to be read - /// - /// Returns the number of bytes actually read. - public override int Read(byte[] buffer, int offset, int count) - { - // A GZIP file can contain multiple blocks of compressed data, although this is quite rare. - // A compressed block could potentially be empty, so we need to loop until we reach EOF or - // we find data. - while (true) - { - - // If we haven't read the header for this block, read it - if (!readGZIPHeader) - { - - // Try to read header. If there is no header (0 bytes available), this is EOF. If there is - // an incomplete header, this will throw an exception. - if (!ReadHeader()) - { - return 0; - } - } - - // Try to read compressed data - int bytesRead = base.Read(buffer, offset, count); - if (bytesRead > 0) - { - crc.Update(buffer, offset, bytesRead); - } - - // If this is the end of stream, read the footer - if (inf.IsFinished) - { - ReadFooter(); - } - - if (bytesRead > 0) - { - return bytesRead; - } - } - } - #endregion - - #region Support routines - bool ReadHeader() - { - // Initialize CRC for this block - crc = new Crc32(); - - // Make sure there is data in file. We can't rely on ReadLeByte() to fill the buffer, as this could be EOF, - // which is fine, but ReadLeByte() throws an exception if it doesn't find data, so we do this part ourselves. - if (inputBuffer.Available <= 0) - { - inputBuffer.Fill(); - if (inputBuffer.Available <= 0) - { - // No header, EOF. - return false; - } - } - - // 1. Check the two magic bytes - Crc32 headCRC = new Crc32(); - int magic = inputBuffer.ReadLeByte(); - - if (magic < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - headCRC.Update(magic); - if (magic != (0x1F8B >> 8)) - { - throw new Exception("Error GZIP header, first magic byte doesn't match"); - } - - //magic = baseInputStream.ReadByte(); - magic = inputBuffer.ReadLeByte(); - - if (magic < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - if (magic != (0x1F8B & 0xFF)) - { - throw new Exception("Error GZIP header, second magic byte doesn't match"); - } - - headCRC.Update(magic); - - // 2. Check the compression type (must be 8) - int compressionType = inputBuffer.ReadLeByte(); - - if (compressionType < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - if (compressionType != 8) - { - throw new Exception("Error GZIP header, data not in deflate format"); - } - headCRC.Update(compressionType); - - // 3. Check the flags - int flags = inputBuffer.ReadLeByte(); - if (flags < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(flags); - - if ((flags & 0xE0) != 0) - { - throw new Exception("Reserved flag bits in GZIP header != 0"); - } - - for (int i = 0; i < 6; i++) - { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - if ((flags & 0x4) != 0) - { - for (int i = 0; i < 2; i++) - { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - if (inputBuffer.ReadLeByte() < 0 || inputBuffer.ReadLeByte() < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - int len1, len2; - len1 = inputBuffer.ReadLeByte(); - len2 = inputBuffer.ReadLeByte(); - if ((len1 < 0) || (len2 < 0)) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(len1); - headCRC.Update(len2); - - int extraLen = (len1 << 8) | len2; - for (int i = 0; i < extraLen; i++) - { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - } - - if ((flags & 0x8) != 0) - { - int readByte; - while ((readByte = inputBuffer.ReadLeByte()) > 0) - { - headCRC.Update(readByte); - } - - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - if ((flags & 0x10) != 0) - { - int readByte; - while ((readByte = inputBuffer.ReadLeByte()) > 0) - { - headCRC.Update(readByte); - } - - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - headCRC.Update(readByte); - } - - if ((flags & 0x2) != 0) - { - int tempByte; - int crcval = inputBuffer.ReadLeByte(); - if (crcval < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - tempByte = inputBuffer.ReadLeByte(); - if (tempByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - crcval = (crcval << 8) | tempByte; - if (crcval != ((int)headCRC.Value & 0xffff)) - { - throw new Exception("Header CRC value mismatch"); - } - } - - readGZIPHeader = true; - return true; - } - - void ReadFooter() - { - byte[] footer = new byte[8]; - - long bytesRead = inf.TotalOut & 0xffffffff; - inputBuffer.Available += inf.RemainingInput; - inf.Reset(); - - int needed = 8; - while (needed > 0) - { - int count = inputBuffer.ReadClearTextBuffer(footer, 8 - needed, needed); - if (count <= 0) - { - throw new EndOfStreamException("EOS reading GZIP footer"); - } - needed -= count; - } - - int crcval = (footer[0] & 0xff) | ((footer[1] & 0xff) << 8) | ((footer[2] & 0xff) << 16) | (footer[3] << 24); - if (crcval != (int)crc.Value) - { - throw new Exception("GZIP crc sum mismatch, theirs \"" + crcval + "\" and ours \"" + (int)crc.Value); - } - - uint total = - (uint)((uint)footer[4] & 0xff) | - (uint)(((uint)footer[5] & 0xff) << 8) | - (uint)(((uint)footer[6] & 0xff) << 16) | - (uint)((uint)footer[7] << 24); - - if (bytesRead != total) - { - throw new Exception("Number of bytes mismatch in footer"); - } - - readGZIPHeader = false; - } - #endregion - } - #endregion - -} diff --git a/Users/Orvid/Orvid.Compression/Streams/Lzw.cs b/Users/Orvid/Orvid.Compression/Streams/Lzw.cs deleted file mode 100644 index 95297a4bfa..0000000000 --- a/Users/Orvid/Orvid.Compression/Streams/Lzw.cs +++ /dev/null @@ -1,682 +0,0 @@ -// Lzw.cs -// -// Copyright (C) 2009 Gabriel Burca -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -namespace Orvid.Compression.Streams -{ - - #region LzwConstants - /// - /// This class contains constants used for LZW - /// - sealed internal class LzwConstants - { - /// - /// Magic number found at start of LZW header: 0x1f 0x9d - /// - public const int MAGIC = 0x1f9d; - - /// - /// Maximum number of bits per code - /// - public const int MAX_BITS = 16; - - /* 3rd header byte: - * bit 0..4 Number of compression bits - * bit 5 Extended header - * bit 6 Free - * bit 7 Block mode - */ - - /// - /// Mask for 'number of compression bits' - /// - public const int BIT_MASK = 0x1f; - - /// - /// Indicates the presence of a fourth header byte - /// - public const int EXTENDED_MASK = 0x20; - //public const int FREE_MASK = 0x40; - - /// - /// Reserved bits - /// - public const int RESERVED_MASK = 0x60; - - /// - /// Block compression: if table is full and compression rate is dropping, - /// clear the dictionary. - /// - public const int BLOCK_MODE_MASK = 0x80; - - /// - /// LZW file header size (in bytes) - /// - public const int HDR_SIZE = 3; - - /// - /// Initial number of bits per code - /// - public const int INIT_BITS = 9; - - LzwConstants() - { - } - } - #endregion - - #region LzwInputStream - /// - /// This filter stream is used to decompress a LZW format stream. - /// Specifically, a stream that uses the LZC compression method. - /// This file format is usually associated with the .Z file extension. - /// - /// See http://en.wikipedia.org/wiki/Compress - /// See http://wiki.wxwidgets.org/Development:_Z_File_Format - /// - /// The file header consists of 3 (or optionally 4) bytes. The first two bytes - /// contain the magic marker "0x1f 0x9d", followed by a byte of flags. - /// - /// Based on Java code by Ronald Tschalar, which in turn was based on the unlzw.c - /// code in the gzip package. - /// - /// This sample shows how to unzip a compressed file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.Core; - /// using ICSharpCode.SharpZipLib.LZW; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream inStream = new LzwInputStream(File.OpenRead(args[0]))) - /// using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - /// byte[] buffer = new byte[4096]; - /// StreamUtils.Copy(inStream, outStream, buffer); - /// // OR - /// inStream.Read(buffer, 0, buffer.Length); - /// // now do something with the buffer - /// } - /// } - /// } - /// - /// - public class LzwInputStream : Stream - { - /// - /// Get/set flag indicating ownership of underlying stream. - /// When the flag is true will close the underlying stream also. - /// - /// - /// The default value is true. - /// - public bool IsStreamOwner - { - get { return isStreamOwner; } - set { isStreamOwner = value; } - } - - /// - /// Creates a LzwInputStream - /// - /// - /// The stream to read compressed data from (baseInputStream LZW format) - /// - public LzwInputStream(Stream baseInputStream) - { - this.baseInputStream = baseInputStream; - } - - /// - /// See - /// - /// - public override int ReadByte() - { - int b = Read(one, 0, 1); - if (b == 1) - return (one[0] & 0xff); - return -1; - } - - /// - /// Reads decompressed data into the provided buffer byte array - /// - /// - /// The array to read and decompress data into - /// - /// - /// The offset indicating where the data should be placed - /// - /// - /// The number of bytes to decompress - /// - /// The number of bytes read. Zero signals the end of stream - public override int Read(byte[] buffer, int offset, int count) - { - if (!headerParsed) ParseHeader(); - - if (eof) return -1; - int start = offset; - - /* Using local copies of various variables speeds things up by as - * much as 30% in Java! Performance not tested in C#. - */ - int[] lTabPrefix = tabPrefix; - byte[] lTabSuffix = tabSuffix; - byte[] lStack = stack; - int lNBits = nBits; - int lMaxCode = maxCode; - int lMaxMaxCode = maxMaxCode; - int lBitMask = bitMask; - int lOldCode = oldCode; - byte lFinChar = finChar; - int lStackP = stackP; - int lFreeEnt = freeEnt; - byte[] lData = data; - int lBitPos = bitPos; - - - // empty stack if stuff still left - int sSize = lStack.Length - lStackP; - if (sSize > 0) - { - int num = (sSize >= count) ? count : sSize; - Array.Copy(lStack, lStackP, buffer, offset, num); - offset += num; - count -= num; - lStackP += num; - } - - if (count == 0) - { - stackP = lStackP; - return offset - start; - } - - - // loop, filling local buffer until enough data has been decompressed - MainLoop: do - { - if (end < EXTRA) - { - Fill(); - } - - int bitIn = (got > 0) ? (end - end % lNBits) << 3 : - (end << 3) - (lNBits - 1); - - while (lBitPos < bitIn) - { - #region A - // handle 1-byte reads correctly - if (count == 0) - { - nBits = lNBits; - maxCode = lMaxCode; - maxMaxCode = lMaxMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - return offset - start; - } - - // check for code-width expansion - if (lFreeEnt > lMaxCode) - { - int nBytes = lNBits << 3; - lBitPos = (lBitPos - 1) + - nBytes - (lBitPos - 1 + nBytes) % nBytes; - - lNBits++; - lMaxCode = (lNBits == maxBits) ? lMaxMaxCode : - (1 << lNBits) - 1; - - lBitMask = (1 << lNBits) - 1; - lBitPos = ResetBuf(lBitPos); - goto MainLoop; - } - #endregion - - #region B - // read next code - int pos = lBitPos >> 3; - int code = (((lData[pos] & 0xFF) | - ((lData[pos + 1] & 0xFF) << 8) | - ((lData[pos + 2] & 0xFF) << 16)) >> - (lBitPos & 0x7)) & lBitMask; - - lBitPos += lNBits; - - // handle first iteration - if (lOldCode == -1) - { - if (code >= 256) - throw new Exception("corrupt input: " + code + " > 255"); - - lFinChar = (byte)(lOldCode = code); - buffer[offset++] = lFinChar; - count--; - continue; - } - - // handle CLEAR code - if (code == TBL_CLEAR && blockMode) - { - Array.Copy(zeros, 0, lTabPrefix, 0, zeros.Length); - lFreeEnt = TBL_FIRST - 1; - - int nBytes = lNBits << 3; - lBitPos = (lBitPos - 1) + nBytes - (lBitPos - 1 + nBytes) % nBytes; - lNBits = LzwConstants.INIT_BITS; - lMaxCode = (1 << lNBits) - 1; - lBitMask = lMaxCode; - - // Code tables reset - - lBitPos = ResetBuf(lBitPos); - goto MainLoop; - } - #endregion - - #region C - // setup - int inCode = code; - lStackP = lStack.Length; - - // Handle KwK case - if (code >= lFreeEnt) - { - if (code > lFreeEnt) - { - throw new Exception("corrupt input: code=" + code + ", freeEnt=" + lFreeEnt); - } - - lStack[--lStackP] = lFinChar; - code = lOldCode; - } - - // Generate output characters in reverse order - while (code >= 256) - { - lStack[--lStackP] = lTabSuffix[code]; - code = lTabPrefix[code]; - } - - lFinChar = lTabSuffix[code]; - buffer[offset++] = lFinChar; - count--; - - // And put them out in forward order - sSize = lStack.Length - lStackP; - int num = (sSize >= count) ? count : sSize; - Array.Copy(lStack, lStackP, buffer, offset, num); - offset += num; - count -= num; - lStackP += num; - #endregion - - #region D - // generate new entry in table - if (lFreeEnt < lMaxMaxCode) - { - lTabPrefix[lFreeEnt] = lOldCode; - lTabSuffix[lFreeEnt] = lFinChar; - lFreeEnt++; - } - - // Remember previous code - lOldCode = inCode; - - // if output buffer full, then return - if (count == 0) - { - nBits = lNBits; - maxCode = lMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - return offset - start; - } - #endregion - } // while - - lBitPos = ResetBuf(lBitPos); - - } while (got > 0); // do..while - - nBits = lNBits; - maxCode = lMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - eof = true; - return offset - start; - } - - /// - /// Moves the unread data in the buffer to the beginning and resets - /// the pointers. - /// - /// - /// - private int ResetBuf(int bitPosition) - { - int pos = bitPosition >> 3; - Array.Copy(data, pos, data, 0, end - pos); - end -= pos; - return 0; - } - - - private void Fill() - { - got = baseInputStream.Read(data, end, data.Length - 1 - end); - if (got > 0) - { - end += got; - } - } - - - private void ParseHeader() - { - headerParsed = true; - - byte[] hdr = new byte[LzwConstants.HDR_SIZE]; - - int result = baseInputStream.Read(hdr, 0, hdr.Length); - - // Check the magic marker - if (result < 0) - throw new Exception("Failed to read LZW header"); - - if (hdr[0] != (LzwConstants.MAGIC >> 8) || hdr[1] != (LzwConstants.MAGIC & 0xff)) - { - throw new Exception(String.Format("Wrong LZW header. Magic bytes don't match. 0x{0:x2} 0x{1:x2}", hdr[0], hdr[1])); - } - - // Check the 3rd header byte - blockMode = (hdr[2] & LzwConstants.BLOCK_MODE_MASK) > 0; - maxBits = hdr[2] & LzwConstants.BIT_MASK; - - if (maxBits > LzwConstants.MAX_BITS) - { - throw new Exception("Stream compressed with " + maxBits + " bits, but decompression can only handle " + LzwConstants.MAX_BITS + " bits."); - } - - if ((hdr[2] & LzwConstants.RESERVED_MASK) > 0) - { - throw new Exception("Unsupported bits set in the header."); - } - - // Initialize variables - maxMaxCode = 1 << maxBits; - nBits = LzwConstants.INIT_BITS; - maxCode = (1 << nBits) - 1; - bitMask = maxCode; - oldCode = -1; - finChar = 0; - freeEnt = blockMode ? TBL_FIRST : 256; - - tabPrefix = new int[1 << maxBits]; - tabSuffix = new byte[1 << maxBits]; - stack = new byte[1 << maxBits]; - stackP = stack.Length; - - for (int idx = 255; idx >= 0; idx--) - tabSuffix[idx] = (byte)idx; - } - - #region Stream Overrides - /// - /// Gets a value indicating whether the current stream supports reading - /// - public override bool CanRead - { - get - { - return baseInputStream.CanRead; - } - } - - /// - /// Gets a value of false indicating seeking is not supported for this stream. - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value of false indicating that this stream is not writeable. - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - /// A value representing the length of the stream in bytes. - /// - public override long Length - { - get - { - return got; - } - } - - /// - /// The current position within the stream. - /// Throws a NotSupportedException when attempting to set the position - /// - /// Attempting to set the position - public override long Position - { - get - { - return baseInputStream.Position; - } - set - { - throw new NotSupportedException("InflaterInputStream Position not supported"); - } - } - - /// - /// Flushes the baseInputStream - /// - public override void Flush() - { - baseInputStream.Flush(); - } - - /// - /// Sets the position within the current stream - /// Always throws a NotSupportedException - /// - /// The relative offset to seek to. - /// The defining where to seek from. - /// The new position in the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("Seek not supported"); - } - - /// - /// Set the length of the current stream - /// Always throws a NotSupportedException - /// - /// The new length value for the stream. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("InflaterInputStream SetLength not supported"); - } - - /// - /// Writes a sequence of bytes to stream and advances the current position - /// This method always throws a NotSupportedException - /// - /// Thew buffer containing data to write. - /// The offset of the first byte to write. - /// The number of bytes to write. - /// Any access - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("InflaterInputStream Write not supported"); - } - - /// - /// Writes one byte to the current stream and advances the current position - /// Always throws a NotSupportedException - /// - /// The byte to write. - /// Any access - public override void WriteByte(byte value) - { - throw new NotSupportedException("InflaterInputStream WriteByte not supported"); - } - - /// - /// Entry point to begin an asynchronous write. Always throws a NotSupportedException. - /// - /// The buffer to write data from - /// Offset of first byte to write - /// The maximum number of bytes to write - /// The method to be called when the asynchronous write operation is completed - /// A user-provided object that distinguishes this particular asynchronous write request from other requests - /// An IAsyncResult that references the asynchronous write - /// Any access - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException("InflaterInputStream BeginWrite not supported"); - } - - /// - /// Closes the input stream. When - /// is true the underlying stream is also closed. - /// - public override void Close() - { - if (!isClosed) - { - isClosed = true; - if (isStreamOwner) - { - baseInputStream.Close(); - } - } - } - - #endregion - - #region Instance Fields - - Stream baseInputStream; - - /// - /// Flag indicating wether this instance is designated the stream owner. - /// When closing if this flag is true the underlying stream is closed. - /// - bool isStreamOwner = true; - - /// - /// Flag indicating wether this instance has been closed or not. - /// - bool isClosed; - - readonly byte[] one = new byte[1]; - bool headerParsed; - - // string table stuff - private const int TBL_CLEAR = 0x100; - private const int TBL_FIRST = TBL_CLEAR + 1; - - private int[] tabPrefix; - private byte[] tabSuffix; - private readonly int[] zeros = new int[256]; - private byte[] stack; - - // various state - private bool blockMode; - private int nBits; - private int maxBits; - private int maxMaxCode; - private int maxCode; - private int bitMask; - private int oldCode; - private byte finChar; - private int stackP; - private int freeEnt; - - // input buffer - private readonly byte[] data = new byte[1024 * 8]; - private int bitPos; - private int end; - int got; - private bool eof; - private const int EXTRA = 64; - #endregion - } - #endregion - -} diff --git a/Users/Orvid/Orvid.Compression/TODO/GZip/GZIPConstants.cs b/Users/Orvid/Orvid.Compression/TODO/GZip/GZIPConstants.cs deleted file mode 100644 index 1c0e389ab1..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/GZip/GZIPConstants.cs +++ /dev/null @@ -1,97 +0,0 @@ -// GZipConstants.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -namespace ICSharpCode.SharpZipLib.GZip -{ - - /// - /// This class contains constants used for gzip. - /// - sealed public class GZipConstants - { - /// - /// Magic number found at start of GZIP header - /// - public const int GZIP_MAGIC = 0x1F8B; - - /* The flag byte is divided into individual bits as follows: - - bit 0 FTEXT - bit 1 FHCRC - bit 2 FEXTRA - bit 3 FNAME - bit 4 FCOMMENT - bit 5 reserved - bit 6 reserved - bit 7 reserved - */ - - /// - /// Flag bit mask for text - /// - public const int FTEXT = 0x1; - - /// - /// Flag bitmask for Crc - /// - public const int FHCRC = 0x2; - - /// - /// Flag bit mask for extra - /// - public const int FEXTRA = 0x4; - - /// - /// flag bitmask for name - /// - public const int FNAME = 0x8; - - /// - /// flag bit mask indicating comment is present - /// - public const int FCOMMENT = 0x10; - - /// - /// Initialise default instance. - /// - /// Constructor is private to prevent instances being created. - GZipConstants() - { - } - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/GZip/GZipException.cs b/Users/Orvid/Orvid.Compression/TODO/GZip/GZipException.cs deleted file mode 100644 index 7f42931e82..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/GZip/GZipException.cs +++ /dev/null @@ -1,91 +0,0 @@ -// GZipException.cs -// -// Copyright 2004 John Reilly -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -#if !NETCF_1_0 && !NETCF_2_0 -using System.Runtime.Serialization; -#endif - -namespace ICSharpCode.SharpZipLib.GZip -{ - /// - /// GZipException represents a Gzip specific exception - /// -#if !NETCF_1_0 && !NETCF_2_0 - [Serializable] -#endif - public class GZipException : SharpZipBaseException - { -#if !NETCF_1_0 && !NETCF_2_0 - /// - /// Deserialization constructor - /// - /// for this constructor - /// for this constructor - protected GZipException(SerializationInfo info, StreamingContext context) - : base(info, context) - - { - } -#endif - - /// - /// Initialise a new instance of GZipException - /// - public GZipException() - { - } - - /// - /// Initialise a new instance of GZipException with its message string. - /// - /// A that describes the error. - public GZipException(string message) - : base(message) - { - } - - /// - /// Initialise a new instance of . - /// - /// A that describes the error. - /// The that caused this exception. - public GZipException(string message, Exception innerException) - : base (message, innerException) - { - } - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/GZip/GzipInputStream.cs b/Users/Orvid/Orvid.Compression/TODO/GZip/GzipInputStream.cs deleted file mode 100644 index 4cbad945a4..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/GZip/GzipInputStream.cs +++ /dev/null @@ -1,384 +0,0 @@ -// GzipInputStream.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -// HISTORY -// 11-08-2009 GeoffHart T9121 Added Multi-member gzip support - -using System; -using System.IO; - -using ICSharpCode.SharpZipLib.Checksums; -using ICSharpCode.SharpZipLib.Zip.Compression; -using ICSharpCode.SharpZipLib.Zip.Compression.Streams; - -namespace ICSharpCode.SharpZipLib.GZip -{ - - /// - /// This filter stream is used to decompress a "GZIP" format stream. - /// The "GZIP" format is described baseInputStream RFC 1952. - /// - /// author of the original java version : John Leuner - /// - /// This sample shows how to unzip a gzipped file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.Core; - /// using ICSharpCode.SharpZipLib.GZip; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream inStream = new GZipInputStream(File.OpenRead(args[0]))) - /// using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - /// byte[] buffer = new byte[4096]; - /// StreamUtils.Copy(inStream, outStream, buffer); - /// } - /// } - /// } - /// - /// - public class GZipInputStream : InflaterInputStream - { - #region Instance Fields - /// - /// CRC-32 value for uncompressed data - /// - protected Crc32 crc; - - /// - /// Flag to indicate if we've read the GZIP header yet for the current member (block of compressed data). - /// This is tracked per-block as the file is parsed. - /// - bool readGZIPHeader; - #endregion - - #region Constructors - /// - /// Creates a GZipInputStream with the default buffer size - /// - /// - /// The stream to read compressed data from (baseInputStream GZIP format) - /// - public GZipInputStream(Stream baseInputStream) - : this(baseInputStream, 4096) - { - } - - /// - /// Creates a GZIPInputStream with the specified buffer size - /// - /// - /// The stream to read compressed data from (baseInputStream GZIP format) - /// - /// - /// Size of the buffer to use - /// - public GZipInputStream(Stream baseInputStream, int size) - : base(baseInputStream, new Inflater(true), size) - { - } - #endregion - - #region Stream overrides - /// - /// Reads uncompressed data into an array of bytes - /// - /// - /// The buffer to read uncompressed data into - /// - /// - /// The offset indicating where the data should be placed - /// - /// - /// The number of uncompressed bytes to be read - /// - /// Returns the number of bytes actually read. - public override int Read(byte[] buffer, int offset, int count) - { - // A GZIP file can contain multiple blocks of compressed data, although this is quite rare. - // A compressed block could potentially be empty, so we need to loop until we reach EOF or - // we find data. - while (true) { - - // If we haven't read the header for this block, read it - if (! readGZIPHeader) { - - // Try to read header. If there is no header (0 bytes available), this is EOF. If there is - // an incomplete header, this will throw an exception. - if (! ReadHeader()) { - return 0; - } - } - - // Try to read compressed data - int bytesRead = base.Read(buffer, offset, count); - if (bytesRead > 0) { - crc.Update(buffer, offset, bytesRead); - } - - // If this is the end of stream, read the footer - if (inf.IsFinished) { - ReadFooter(); - } - - if (bytesRead > 0) { - return bytesRead; - } - } - } - #endregion - - #region Support routines - bool ReadHeader() - { - // Initialize CRC for this block - crc = new Crc32(); - - // Make sure there is data in file. We can't rely on ReadLeByte() to fill the buffer, as this could be EOF, - // which is fine, but ReadLeByte() throws an exception if it doesn't find data, so we do this part ourselves. - if (inputBuffer.Available <= 0) { - inputBuffer.Fill(); - if (inputBuffer.Available <= 0) { - // No header, EOF. - return false; - } - } - - // 1. Check the two magic bytes - Crc32 headCRC = new Crc32(); - int magic = inputBuffer.ReadLeByte(); - - if (magic < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - headCRC.Update(magic); - if (magic != (GZipConstants.GZIP_MAGIC >> 8)) { - throw new GZipException("Error GZIP header, first magic byte doesn't match"); - } - - //magic = baseInputStream.ReadByte(); - magic = inputBuffer.ReadLeByte(); - - if (magic < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - if (magic != (GZipConstants.GZIP_MAGIC & 0xFF)) { - throw new GZipException("Error GZIP header, second magic byte doesn't match"); - } - - headCRC.Update(magic); - - // 2. Check the compression type (must be 8) - int compressionType = inputBuffer.ReadLeByte(); - - if ( compressionType < 0 ) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - if ( compressionType != 8 ) { - throw new GZipException("Error GZIP header, data not in deflate format"); - } - headCRC.Update(compressionType); - - // 3. Check the flags - int flags = inputBuffer.ReadLeByte(); - if (flags < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(flags); - - /* This flag byte is divided into individual bits as follows: - - bit 0 FTEXT - bit 1 FHCRC - bit 2 FEXTRA - bit 3 FNAME - bit 4 FCOMMENT - bit 5 reserved - bit 6 reserved - bit 7 reserved - */ - - // 3.1 Check the reserved bits are zero - - if ((flags & 0xE0) != 0) { - throw new GZipException("Reserved flag bits in GZIP header != 0"); - } - - // 4.-6. Skip the modification time, extra flags, and OS type - for (int i=0; i< 6; i++) { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - // 7. Read extra field - if ((flags & GZipConstants.FEXTRA) != 0) { - // Skip subfield id - for (int i=0; i< 2; i++) { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - if (inputBuffer.ReadLeByte() < 0 || inputBuffer.ReadLeByte() < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - int len1, len2; - len1 = inputBuffer.ReadLeByte(); - len2 = inputBuffer.ReadLeByte(); - if ((len1 < 0) || (len2 < 0)) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(len1); - headCRC.Update(len2); - - int extraLen = (len1 << 8) | len2; - for (int i = 0; i < extraLen;i++) { - int readByte = inputBuffer.ReadLeByte(); - if (readByte < 0) - { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - } - - // 8. Read file name - if ((flags & GZipConstants.FNAME) != 0) { - int readByte; - while ( (readByte = inputBuffer.ReadLeByte()) > 0) { - headCRC.Update(readByte); - } - - if (readByte < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - headCRC.Update(readByte); - } - - // 9. Read comment - if ((flags & GZipConstants.FCOMMENT) != 0) { - int readByte; - while ( (readByte = inputBuffer.ReadLeByte()) > 0) { - headCRC.Update(readByte); - } - - if (readByte < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - headCRC.Update(readByte); - } - - // 10. Read header CRC - if ((flags & GZipConstants.FHCRC) != 0) { - int tempByte; - int crcval = inputBuffer.ReadLeByte(); - if (crcval < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - tempByte = inputBuffer.ReadLeByte(); - if (tempByte < 0) { - throw new EndOfStreamException("EOS reading GZIP header"); - } - - crcval = (crcval << 8) | tempByte; - if (crcval != ((int) headCRC.Value & 0xffff)) { - throw new GZipException("Header CRC value mismatch"); - } - } - - readGZIPHeader = true; - return true; - } - - void ReadFooter() - { - byte[] footer = new byte[8]; - - // End of stream; reclaim all bytes from inf, read the final byte count, and reset the inflator - long bytesRead = inf.TotalOut & 0xffffffff; - inputBuffer.Available += inf.RemainingInput; - inf.Reset(); - - // Read footer from inputBuffer - int needed = 8; - while (needed > 0) { - int count = inputBuffer.ReadClearTextBuffer(footer, 8 - needed, needed); - if (count <= 0) { - throw new EndOfStreamException("EOS reading GZIP footer"); - } - needed -= count; // Jewel Jan 16 - } - - // Calculate CRC - int crcval = (footer[0] & 0xff) | ((footer[1] & 0xff) << 8) | ((footer[2] & 0xff) << 16) | (footer[3] << 24); - if (crcval != (int) crc.Value) { - throw new GZipException("GZIP crc sum mismatch, theirs \"" + crcval + "\" and ours \"" + (int) crc.Value); - } - - // NOTE The total here is the original total modulo 2 ^ 32. - uint total = - (uint)((uint)footer[4] & 0xff) | - (uint)(((uint)footer[5] & 0xff) << 8) | - (uint)(((uint)footer[6] & 0xff) << 16) | - (uint)((uint)footer[7] << 24); - - if (bytesRead != total) { - throw new GZipException("Number of bytes mismatch in footer"); - } - - // Mark header read as false so if another header exists, we'll continue reading through the file - readGZIPHeader = false; - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/GZip/GzipOutputStream.cs b/Users/Orvid/Orvid.Compression/TODO/GZip/GzipOutputStream.cs deleted file mode 100644 index 0db2e4b384..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/GZip/GzipOutputStream.cs +++ /dev/null @@ -1,261 +0,0 @@ -// GZipOutputStream.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This file was translated from java, it was part of the GNU Classpath -// Copyright (C) 2001 Free Software Foundation, Inc. -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -using ICSharpCode.SharpZipLib.Checksums; -using ICSharpCode.SharpZipLib.Zip.Compression; -using ICSharpCode.SharpZipLib.Zip.Compression.Streams; - -namespace ICSharpCode.SharpZipLib.GZip -{ - - /// - /// This filter stream is used to compress a stream into a "GZIP" stream. - /// The "GZIP" format is described in RFC 1952. - /// - /// author of the original java version : John Leuner - /// - /// This sample shows how to gzip a file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.GZip; - /// using ICSharpCode.SharpZipLib.Core; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream s = new GZipOutputStream(File.Create(args[0] + ".gz"))) - /// using (FileStream fs = File.OpenRead(args[0])) { - /// byte[] writeData = new byte[4096]; - /// Streamutils.Copy(s, fs, writeData); - /// } - /// } - /// } - /// } - /// - /// - public class GZipOutputStream : DeflaterOutputStream - { - enum OutputState - { - Header, - Footer, - Finished, - Closed, - }; - - #region Instance Fields - /// - /// CRC-32 value for uncompressed data - /// - protected Crc32 crc = new Crc32(); - OutputState state_ = OutputState.Header; - #endregion - - #region Constructors - /// - /// Creates a GzipOutputStream with the default buffer size - /// - /// - /// The stream to read data (to be compressed) from - /// - public GZipOutputStream(Stream baseOutputStream) - : this(baseOutputStream, 4096) - { - } - - /// - /// Creates a GZipOutputStream with the specified buffer size - /// - /// - /// The stream to read data (to be compressed) from - /// - /// - /// Size of the buffer to use - /// - public GZipOutputStream(Stream baseOutputStream, int size) : base(baseOutputStream, new Deflater(Deflater.DEFAULT_COMPRESSION, true), size) - { - } - #endregion - - #region Public API - /// - /// Sets the active compression level (1-9). The new level will be activated - /// immediately. - /// - /// The compression level to set. - /// - /// Level specified is not supported. - /// - /// - public void SetLevel(int level) - { - if (level < Deflater.BEST_SPEED) { - throw new ArgumentOutOfRangeException("level"); - } - deflater_.SetLevel(level); - } - - /// - /// Get the current compression level. - /// - /// The current compression level. - public int GetLevel() - { - return deflater_.GetLevel(); - } - #endregion - - #region Stream overrides - /// - /// Write given buffer to output updating crc - /// - /// Buffer to write - /// Offset of first byte in buf to write - /// Number of bytes to write - public override void Write(byte[] buffer, int offset, int count) - { - if ( state_ == OutputState.Header ) { - WriteHeader(); - } - - if( state_!=OutputState.Footer ) - { - throw new InvalidOperationException("Write not permitted in current state"); - } - - crc.Update(buffer, offset, count); - base.Write(buffer, offset, count); - } - - /// - /// Writes remaining compressed output data to the output stream - /// and closes it. - /// - public override void Close() - { - try { - Finish(); - } - finally { - if ( state_ != OutputState.Closed ) { - state_ = OutputState.Closed; - if( IsStreamOwner ) { - baseOutputStream_.Close(); - } - } - } - } - #endregion - - #region DeflaterOutputStream overrides - /// - /// Finish compression and write any footer information required to stream - /// - public override void Finish() - { - // If no data has been written a header should be added. - if ( state_ == OutputState.Header ) { - WriteHeader(); - } - - if( state_ == OutputState.Footer) - { - state_=OutputState.Finished; - base.Finish(); - - uint totalin=(uint)(deflater_.TotalIn&0xffffffff); - uint crcval=(uint)(crc.Value&0xffffffff); - - byte[] gzipFooter; - - unchecked - { - gzipFooter=new byte[] { - (byte) crcval, (byte) (crcval >> 8), - (byte) (crcval >> 16), (byte) (crcval >> 24), - - (byte) totalin, (byte) (totalin >> 8), - (byte) (totalin >> 16), (byte) (totalin >> 24) - }; - } - - baseOutputStream_.Write(gzipFooter, 0, gzipFooter.Length); - } - } - #endregion - - #region Support Routines - void WriteHeader() - { - if ( state_ == OutputState.Header ) - { - state_=OutputState.Footer; - - int mod_time = (int)((DateTime.Now.Ticks - new DateTime(1970, 1, 1).Ticks) / 10000000L); // Ticks give back 100ns intervals - byte[] gzipHeader = { - // The two magic bytes - (byte) (GZipConstants.GZIP_MAGIC >> 8), (byte) (GZipConstants.GZIP_MAGIC & 0xff), - - // The compression type - (byte) Deflater.DEFLATED, - - // The flags (not set) - 0, - - // The modification time - (byte) mod_time, (byte) (mod_time >> 8), - (byte) (mod_time >> 16), (byte) (mod_time >> 24), - - // The extra flags - 0, - - // The OS type (unknown) - (byte) 255 - }; - baseOutputStream_.Write(gzipHeader, 0, gzipHeader.Length); - } - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/LZHAM.7z b/Users/Orvid/Orvid.Compression/TODO/LZHAM.7z deleted file mode 100644 index 7395cf7e5c..0000000000 Binary files a/Users/Orvid/Orvid.Compression/TODO/LZHAM.7z and /dev/null differ diff --git a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwConstants.cs b/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwConstants.cs deleted file mode 100644 index 699ed0987d..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwConstants.cs +++ /dev/null @@ -1,94 +0,0 @@ -// LzwConstants.cs -// -// Copyright (C) 2009 Gabriel Burca -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -namespace ICSharpCode.SharpZipLib.LZW { - - /// - /// This class contains constants used for LZW - /// - sealed public class LzwConstants { - /// - /// Magic number found at start of LZW header: 0x1f 0x9d - /// - public const int MAGIC = 0x1f9d; - - /// - /// Maximum number of bits per code - /// - public const int MAX_BITS = 16; - - /* 3rd header byte: - * bit 0..4 Number of compression bits - * bit 5 Extended header - * bit 6 Free - * bit 7 Block mode - */ - - /// - /// Mask for 'number of compression bits' - /// - public const int BIT_MASK = 0x1f; - - /// - /// Indicates the presence of a fourth header byte - /// - public const int EXTENDED_MASK = 0x20; - //public const int FREE_MASK = 0x40; - - /// - /// Reserved bits - /// - public const int RESERVED_MASK = 0x60; - - /// - /// Block compression: if table is full and compression rate is dropping, - /// clear the dictionary. - /// - public const int BLOCK_MODE_MASK = 0x80; - - /// - /// LZW file header size (in bytes) - /// - public const int HDR_SIZE = 3; - - /// - /// Initial number of bits per code - /// - public const int INIT_BITS = 9; - - LzwConstants() { - } - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwException.cs b/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwException.cs deleted file mode 100644 index 10a9547198..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwException.cs +++ /dev/null @@ -1,88 +0,0 @@ -// LzwException.cs -// -// Copyright (C) 2009 Gabriel Burca -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -#if !NETCF_1_0 && !NETCF_2_0 -using System.Runtime.Serialization; -#endif - -namespace ICSharpCode.SharpZipLib.LZW -{ - - /// - /// LzwException represents a LZW specific exception - /// -#if !NETCF_1_0 && !NETCF_2_0 - [Serializable] -#endif - public class LzwException : SharpZipBaseException - { - -#if !NETCF_1_0 && !NETCF_2_0 - /// - /// Deserialization constructor - /// - /// for this constructor - /// for this constructor - protected LzwException(SerializationInfo info, StreamingContext context) - : base(info, context) { - } -#endif - - /// - /// Initialise a new instance of LzwException - /// - public LzwException() { - } - - /// - /// Initialise a new instance of LzwException with its message string. - /// - /// A that describes the error. - public LzwException(string message) - : base(message) { - } - - /// - /// Initialise a new instance of . - /// - /// A that describes the error. - /// The that caused this exception. - public LzwException(string message, Exception innerException) - : base(message, innerException) { - } - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwInputStream.cs b/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwInputStream.cs deleted file mode 100644 index 94b8b66e25..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Lzw/LzwInputStream.cs +++ /dev/null @@ -1,598 +0,0 @@ -// LzwInputStream.cs -// -// Copyright (C) 2009 Gabriel Burca -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -namespace ICSharpCode.SharpZipLib.LZW -{ - - /// - /// This filter stream is used to decompress a LZW format stream. - /// Specifically, a stream that uses the LZC compression method. - /// This file format is usually associated with the .Z file extension. - /// - /// See http://en.wikipedia.org/wiki/Compress - /// See http://wiki.wxwidgets.org/Development:_Z_File_Format - /// - /// The file header consists of 3 (or optionally 4) bytes. The first two bytes - /// contain the magic marker "0x1f 0x9d", followed by a byte of flags. - /// - /// Based on Java code by Ronald Tschalar, which in turn was based on the unlzw.c - /// code in the gzip package. - /// - /// This sample shows how to unzip a compressed file - /// - /// using System; - /// using System.IO; - /// - /// using ICSharpCode.SharpZipLib.Core; - /// using ICSharpCode.SharpZipLib.LZW; - /// - /// class MainClass - /// { - /// public static void Main(string[] args) - /// { - /// using (Stream inStream = new LzwInputStream(File.OpenRead(args[0]))) - /// using (FileStream outStream = File.Create(Path.GetFileNameWithoutExtension(args[0]))) { - /// byte[] buffer = new byte[4096]; - /// StreamUtils.Copy(inStream, outStream, buffer); - /// // OR - /// inStream.Read(buffer, 0, buffer.Length); - /// // now do something with the buffer - /// } - /// } - /// } - /// - /// - public class LzwInputStream : Stream - { - /// - /// Get/set flag indicating ownership of underlying stream. - /// When the flag is true will close the underlying stream also. - /// - /// - /// The default value is true. - /// - public bool IsStreamOwner - { - get { return isStreamOwner; } - set { isStreamOwner = value; } - } - - /// - /// Creates a LzwInputStream - /// - /// - /// The stream to read compressed data from (baseInputStream LZW format) - /// - public LzwInputStream(Stream baseInputStream) { - this.baseInputStream = baseInputStream; - } - - /// - /// See - /// - /// - public override int ReadByte() { - int b = Read(one, 0, 1); - if (b == 1) - return (one[0] & 0xff); - return -1; - } - - /// - /// Reads decompressed data into the provided buffer byte array - /// - /// - /// The array to read and decompress data into - /// - /// - /// The offset indicating where the data should be placed - /// - /// - /// The number of bytes to decompress - /// - /// The number of bytes read. Zero signals the end of stream - public override int Read(byte[] buffer, int offset, int count) { - if (!headerParsed) ParseHeader(); - - if (eof) return -1; - int start = offset; - - /* Using local copies of various variables speeds things up by as - * much as 30% in Java! Performance not tested in C#. - */ - int[] lTabPrefix = tabPrefix; - byte[] lTabSuffix = tabSuffix; - byte[] lStack = stack; - int lNBits = nBits; - int lMaxCode = maxCode; - int lMaxMaxCode = maxMaxCode; - int lBitMask = bitMask; - int lOldCode = oldCode; - byte lFinChar = finChar; - int lStackP = stackP; - int lFreeEnt = freeEnt; - byte[] lData = data; - int lBitPos = bitPos; - - - // empty stack if stuff still left - int sSize = lStack.Length - lStackP; - if (sSize > 0) { - int num = (sSize >= count) ? count : sSize; - Array.Copy(lStack, lStackP, buffer, offset, num); - offset += num; - count -= num; - lStackP += num; - } - - if (count == 0) { - stackP = lStackP; - return offset - start; - } - - - // loop, filling local buffer until enough data has been decompressed - MainLoop: do { - if (end < EXTRA) { - Fill(); - } - - int bitIn = (got > 0) ? (end - end % lNBits) << 3 : - (end << 3) - (lNBits - 1); - - while (lBitPos < bitIn) { - #region A - // handle 1-byte reads correctly - if (count == 0) { - nBits = lNBits; - maxCode = lMaxCode; - maxMaxCode = lMaxMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - return offset - start; - } - - // check for code-width expansion - if (lFreeEnt > lMaxCode) { - int nBytes = lNBits << 3; - lBitPos = (lBitPos - 1) + - nBytes - (lBitPos - 1 + nBytes) % nBytes; - - lNBits++; - lMaxCode = (lNBits == maxBits) ? lMaxMaxCode : - (1 << lNBits) - 1; - - lBitMask = (1 << lNBits) - 1; - lBitPos = ResetBuf(lBitPos); - goto MainLoop; - } - #endregion - - #region B - // read next code - int pos = lBitPos >> 3; - int code = (((lData[pos] & 0xFF) | - ((lData[pos + 1] & 0xFF) << 8) | - ((lData[pos + 2] & 0xFF) << 16)) >> - (lBitPos & 0x7)) & lBitMask; - - lBitPos += lNBits; - - // handle first iteration - if (lOldCode == -1) { - if (code >= 256) throw new LzwException("corrupt input: " + code + " > 255"); - - lFinChar = (byte) (lOldCode = code); - buffer[offset++] = lFinChar; - count--; - continue; - } - - // handle CLEAR code - if (code == TBL_CLEAR && blockMode) { - Array.Copy(zeros, 0, lTabPrefix, 0, zeros.Length); - lFreeEnt = TBL_FIRST - 1; - - int nBytes = lNBits << 3; - lBitPos = (lBitPos - 1) + nBytes - (lBitPos - 1 + nBytes) % nBytes; - lNBits = LzwConstants.INIT_BITS; - lMaxCode = (1 << lNBits) - 1; - lBitMask = lMaxCode; - - // Code tables reset - - lBitPos = ResetBuf(lBitPos); - goto MainLoop; - } - #endregion - - #region C - // setup - int inCode = code; - lStackP = lStack.Length; - - // Handle KwK case - if (code >= lFreeEnt) { - if (code > lFreeEnt) { - throw new LzwException("corrupt input: code=" + code + - ", freeEnt=" + lFreeEnt); - } - - lStack[--lStackP] = lFinChar; - code = lOldCode; - } - - // Generate output characters in reverse order - while (code >= 256) { - lStack[--lStackP] = lTabSuffix[code]; - code = lTabPrefix[code]; - } - - lFinChar = lTabSuffix[code]; - buffer[offset++] = lFinChar; - count--; - - // And put them out in forward order - sSize = lStack.Length - lStackP; - int num = (sSize >= count) ? count : sSize; - Array.Copy(lStack, lStackP, buffer, offset, num); - offset += num; - count -= num; - lStackP += num; - #endregion - - #region D - // generate new entry in table - if (lFreeEnt < lMaxMaxCode) { - lTabPrefix[lFreeEnt] = lOldCode; - lTabSuffix[lFreeEnt] = lFinChar; - lFreeEnt++; - } - - // Remember previous code - lOldCode = inCode; - - // if output buffer full, then return - if (count == 0) { - nBits = lNBits; - maxCode = lMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - return offset - start; - } - #endregion - } // while - - lBitPos = ResetBuf(lBitPos); - - } while (got > 0); // do..while - - nBits = lNBits; - maxCode = lMaxCode; - bitMask = lBitMask; - oldCode = lOldCode; - finChar = lFinChar; - stackP = lStackP; - freeEnt = lFreeEnt; - bitPos = lBitPos; - - eof = true; - return offset - start; - } - - /// - /// Moves the unread data in the buffer to the beginning and resets - /// the pointers. - /// - /// - /// - private int ResetBuf(int bitPosition) { - int pos = bitPosition >> 3; - Array.Copy(data, pos, data, 0, end - pos); - end -= pos; - return 0; - } - - - private void Fill() { - got = baseInputStream.Read(data, end, data.Length - 1 - end); - if (got > 0) { - end += got; - } - } - - - private void ParseHeader() { - headerParsed = true; - - byte[] hdr = new byte[LzwConstants.HDR_SIZE]; - - int result = baseInputStream.Read(hdr, 0, hdr.Length); - - // Check the magic marker - if (result < 0) - throw new LzwException("Failed to read LZW header"); - - if (hdr[0] != (LzwConstants.MAGIC >> 8) || hdr[1] != (LzwConstants.MAGIC & 0xff)) { - throw new LzwException(String.Format( - "Wrong LZW header. Magic bytes don't match. 0x{0:x2} 0x{1:x2}", - hdr[0], hdr[1])); - } - - // Check the 3rd header byte - blockMode = (hdr[2] & LzwConstants.BLOCK_MODE_MASK) > 0; - maxBits = hdr[2] & LzwConstants.BIT_MASK; - - if (maxBits > LzwConstants.MAX_BITS) { - throw new LzwException("Stream compressed with " + maxBits + - " bits, but decompression can only handle " + - LzwConstants.MAX_BITS + " bits."); - } - - if ((hdr[2] & LzwConstants.RESERVED_MASK) > 0) { - throw new LzwException("Unsupported bits set in the header."); - } - - // Initialize variables - maxMaxCode = 1 << maxBits; - nBits = LzwConstants.INIT_BITS; - maxCode = (1 << nBits) - 1; - bitMask = maxCode; - oldCode = -1; - finChar = 0; - freeEnt = blockMode ? TBL_FIRST : 256; - - tabPrefix = new int[1 << maxBits]; - tabSuffix = new byte[1 << maxBits]; - stack = new byte[1 << maxBits]; - stackP = stack.Length; - - for (int idx = 255; idx >= 0; idx--) - tabSuffix[idx] = (byte)idx; - } - - #region Stream Overrides - /// - /// Gets a value indicating whether the current stream supports reading - /// - public override bool CanRead - { - get - { - return baseInputStream.CanRead; - } - } - - /// - /// Gets a value of false indicating seeking is not supported for this stream. - /// - public override bool CanSeek - { - get - { - return false; - } - } - - /// - /// Gets a value of false indicating that this stream is not writeable. - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - /// A value representing the length of the stream in bytes. - /// - public override long Length - { - get - { - return got; - } - } - - /// - /// The current position within the stream. - /// Throws a NotSupportedException when attempting to set the position - /// - /// Attempting to set the position - public override long Position - { - get - { - return baseInputStream.Position; - } - set - { - throw new NotSupportedException("InflaterInputStream Position not supported"); - } - } - - /// - /// Flushes the baseInputStream - /// - public override void Flush() - { - baseInputStream.Flush(); - } - - /// - /// Sets the position within the current stream - /// Always throws a NotSupportedException - /// - /// The relative offset to seek to. - /// The defining where to seek from. - /// The new position in the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("Seek not supported"); - } - - /// - /// Set the length of the current stream - /// Always throws a NotSupportedException - /// - /// The new length value for the stream. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("InflaterInputStream SetLength not supported"); - } - - /// - /// Writes a sequence of bytes to stream and advances the current position - /// This method always throws a NotSupportedException - /// - /// Thew buffer containing data to write. - /// The offset of the first byte to write. - /// The number of bytes to write. - /// Any access - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("InflaterInputStream Write not supported"); - } - - /// - /// Writes one byte to the current stream and advances the current position - /// Always throws a NotSupportedException - /// - /// The byte to write. - /// Any access - public override void WriteByte(byte value) - { - throw new NotSupportedException("InflaterInputStream WriteByte not supported"); - } - - /// - /// Entry point to begin an asynchronous write. Always throws a NotSupportedException. - /// - /// The buffer to write data from - /// Offset of first byte to write - /// The maximum number of bytes to write - /// The method to be called when the asynchronous write operation is completed - /// A user-provided object that distinguishes this particular asynchronous write request from other requests - /// An IAsyncResult that references the asynchronous write - /// Any access - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException("InflaterInputStream BeginWrite not supported"); - } - - /// - /// Closes the input stream. When - /// is true the underlying stream is also closed. - /// - public override void Close() - { - if (!isClosed) - { - isClosed = true; - if (isStreamOwner) - { - baseInputStream.Close(); - } - } - } - - #endregion - - #region Instance Fields - - Stream baseInputStream; - - /// - /// Flag indicating wether this instance is designated the stream owner. - /// When closing if this flag is true the underlying stream is closed. - /// - bool isStreamOwner = true; - - /// - /// Flag indicating wether this instance has been closed or not. - /// - bool isClosed; - - readonly byte[] one = new byte[1]; - bool headerParsed; - - // string table stuff - private const int TBL_CLEAR = 0x100; - private const int TBL_FIRST = TBL_CLEAR + 1; - - private int[] tabPrefix; - private byte[] tabSuffix; - private readonly int[] zeros = new int[256]; - private byte[] stack; - - // various state - private bool blockMode; - private int nBits; - private int maxBits; - private int maxMaxCode; - private int maxCode; - private int bitMask; - private int oldCode; - private byte finChar; - private int stackP; - private int freeEnt; - - // input buffer - private readonly byte[] data = new byte[1024 * 8]; - private int bitPos; - private int end; - int got; - private bool eof; - private const int EXTRA = 64; - #endregion - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/InvalidHeaderException.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/InvalidHeaderException.cs deleted file mode 100644 index bac9343afd..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/InvalidHeaderException.cs +++ /dev/null @@ -1,109 +0,0 @@ -// InvalidHeaderException.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -#if !NETCF_1_0 && !NETCF_2_0 -using System.Runtime.Serialization; -#endif - -namespace ICSharpCode.SharpZipLib.Tar { - - /// - /// This exception is used to indicate that there is a problem - /// with a TAR archive header. - /// -#if !NETCF_1_0 && !NETCF_2_0 - [Serializable] -#endif - public class InvalidHeaderException : TarException - { - -#if !NETCF_1_0 && !NETCF_2_0 - /// - /// Deserialization constructor - /// - /// for this constructor - /// for this constructor - protected InvalidHeaderException(SerializationInfo information, StreamingContext context) - : base(information, context) - - { - } -#endif - - /// - /// Initialise a new instance of the InvalidHeaderException class. - /// - public InvalidHeaderException() - { - } - - /// - /// Initialises a new instance of the InvalidHeaderException class with a specified message. - /// - /// Message describing the exception cause. - public InvalidHeaderException(string message) - : base(message) - { - } - - /// - /// Initialise a new instance of InvalidHeaderException - /// - /// Message describing the problem. - /// The exception that is the cause of the current exception. - public InvalidHeaderException(string message, Exception exception) - : base(message, exception) - { - } - } -} - -/* The original Java file had this header: -** Authored by Timothy Gerard Endres -** -** -** This work has been placed into the public domain. -** You may use this work in any way and for any purpose you wish. -** -** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, -** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR -** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY -** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR -** REDISTRIBUTION OF THIS SOFTWARE. -** -*/ - diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarArchive.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarArchive.cs deleted file mode 100644 index 5a5510b063..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarArchive.cs +++ /dev/null @@ -1,894 +0,0 @@ -// TarArchive.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -// HISTORY -// 28-01-2010 DavidPierson Added IsStreamOwner - -using System; -using System.IO; -using System.Text; - -namespace ICSharpCode.SharpZipLib.Tar -{ - /// - /// Used to advise clients of 'events' while processing archives - /// - public delegate void ProgressMessageHandler(TarArchive archive, TarEntry entry, string message); - - /// - /// The TarArchive class implements the concept of a - /// 'Tape Archive'. A tar archive is a series of entries, each of - /// which represents a file system object. Each entry in - /// the archive consists of a header block followed by 0 or more data blocks. - /// Directory entries consist only of the header block, and are followed by entries - /// for the directory's contents. File entries consist of a - /// header followed by the number of blocks needed to - /// contain the file's contents. All entries are written on - /// block boundaries. Blocks are 512 bytes long. - /// - /// TarArchives are instantiated in either read or write mode, - /// based upon whether they are instantiated with an InputStream - /// or an OutputStream. Once instantiated TarArchives read/write - /// mode can not be changed. - /// - /// There is currently no support for random access to tar archives. - /// However, it seems that subclassing TarArchive, and using the - /// TarBuffer.CurrentRecord and TarBuffer.CurrentBlock - /// properties, this would be rather trivial. - /// - public class TarArchive : IDisposable - { - /// - /// Client hook allowing detailed information to be reported during processing - /// - public event ProgressMessageHandler ProgressMessageEvent; - - /// - /// Raises the ProgressMessage event - /// - /// The TarEntry for this event - /// message for this event. Null is no message - protected virtual void OnProgressMessageEvent(TarEntry entry, string message) - { - ProgressMessageHandler handler = ProgressMessageEvent; - if (handler != null) { - handler(this, entry, message); - } - } - - #region Constructors - /// - /// Constructor for a default . - /// - protected TarArchive() - { - } - - /// - /// Initalise a TarArchive for input. - /// - /// The to use for input. - protected TarArchive(TarInputStream stream) - { - if ( stream == null ) { - throw new ArgumentNullException("stream"); - } - - tarIn = stream; - } - - /// - /// Initialise a TarArchive for output. - /// - /// The to use for output. - protected TarArchive(TarOutputStream stream) - { - if ( stream == null ) { - throw new ArgumentNullException("stream"); - } - - tarOut = stream; - } - #endregion - - #region Static factory methods - /// - /// The InputStream based constructors create a TarArchive for the - /// purposes of extracting or listing a tar archive. Thus, use - /// these constructors when you wish to extract files from or list - /// the contents of an existing tar archive. - /// - /// The stream to retrieve archive data from. - /// Returns a new suitable for reading from. - public static TarArchive CreateInputTarArchive(Stream inputStream) - { - if ( inputStream == null ) { - throw new ArgumentNullException("inputStream"); - } - - TarInputStream tarStream = inputStream as TarInputStream; - - TarArchive result; - if ( tarStream != null ) { - result = new TarArchive(tarStream); - } - else { - result = CreateInputTarArchive(inputStream, TarBuffer.DefaultBlockFactor); - } - return result; - } - - /// - /// Create TarArchive for reading setting block factor - /// - /// A stream containing the tar archive contents - /// The blocking factor to apply - /// Returns a suitable for reading. - public static TarArchive CreateInputTarArchive(Stream inputStream, int blockFactor) - { - if ( inputStream == null ) { - throw new ArgumentNullException("inputStream"); - } - - if ( inputStream is TarInputStream ) { - throw new ArgumentException("TarInputStream not valid"); - } - - return new TarArchive(new TarInputStream(inputStream, blockFactor)); - } - - /// - /// Create a TarArchive for writing to, using the default blocking factor - /// - /// The to write to - /// Returns a suitable for writing. - public static TarArchive CreateOutputTarArchive(Stream outputStream) - { - if ( outputStream == null ) { - throw new ArgumentNullException("outputStream"); - } - - TarOutputStream tarStream = outputStream as TarOutputStream; - - TarArchive result; - if ( tarStream != null ) { - result = new TarArchive(tarStream); - } - else { - result = CreateOutputTarArchive(outputStream, TarBuffer.DefaultBlockFactor); - } - return result; - } - - /// - /// Create a tar archive for writing. - /// - /// The stream to write to - /// The blocking factor to use for buffering. - /// Returns a suitable for writing. - public static TarArchive CreateOutputTarArchive(Stream outputStream, int blockFactor) - { - if ( outputStream == null ) { - throw new ArgumentNullException("outputStream"); - } - - if ( outputStream is TarOutputStream ) { - throw new ArgumentException("TarOutputStream is not valid"); - } - - return new TarArchive(new TarOutputStream(outputStream, blockFactor)); - } - #endregion - - /// - /// Set the flag that determines whether existing files are - /// kept, or overwritten during extraction. - /// - /// - /// If true, do not overwrite existing files. - /// - public void SetKeepOldFiles(bool keepExistingFiles) - { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - keepOldFiles = keepExistingFiles; - } - - /// - /// Get/set the ascii file translation flag. If ascii file translation - /// is true, then the file is checked to see if it a binary file or not. - /// If the flag is true and the test indicates it is ascii text - /// file, it will be translated. The translation converts the local - /// operating system's concept of line ends into the UNIX line end, - /// '\n', which is the defacto standard for a TAR archive. This makes - /// text files compatible with UNIX. - /// - public bool AsciiTranslate - { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return asciiTranslate; - } - - set { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - asciiTranslate = value; - } - - } - - /// - /// Set the ascii file translation flag. - /// - /// - /// If true, translate ascii text files. - /// - [Obsolete("Use the AsciiTranslate property")] - public void SetAsciiTranslation(bool translateAsciiFiles) - { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - asciiTranslate = translateAsciiFiles; - } - - /// - /// PathPrefix is added to entry names as they are written if the value is not null. - /// A slash character is appended after PathPrefix - /// - public string PathPrefix - { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return pathPrefix; - } - - set { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - pathPrefix = value; - } - - } - - /// - /// RootPath is removed from entry names if it is found at the - /// beginning of the name. - /// - public string RootPath - { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return rootPath; - } - - set { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - rootPath = value; - } - } - - /// - /// Set user and group information that will be used to fill in the - /// tar archive's entry headers. This information is based on that available - /// for the linux operating system, which is not always available on other - /// operating systems. TarArchive allows the programmer to specify values - /// to be used in their place. - /// is set to true by this call. - /// - /// - /// The user id to use in the headers. - /// - /// - /// The user name to use in the headers. - /// - /// - /// The group id to use in the headers. - /// - /// - /// The group name to use in the headers. - /// - public void SetUserInfo(int userId, string userName, int groupId, string groupName) - { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - this.userId = userId; - this.userName = userName; - this.groupId = groupId; - this.groupName = groupName; - applyUserInfoOverrides = true; - } - - /// - /// Get or set a value indicating if overrides defined by SetUserInfo should be applied. - /// - /// If overrides are not applied then the values as set in each header will be used. - public bool ApplyUserInfoOverrides - { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return applyUserInfoOverrides; - } - - set { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - applyUserInfoOverrides = value; - } - } - - /// - /// Get the archive user id. - /// See ApplyUserInfoOverrides for detail - /// on how to allow setting values on a per entry basis. - /// - /// - /// The current user id. - /// - public int UserId { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return userId; - } - } - - /// - /// Get the archive user name. - /// See ApplyUserInfoOverrides for detail - /// on how to allow setting values on a per entry basis. - /// - /// - /// The current user name. - /// - public string UserName { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return userName; - } - } - - /// - /// Get the archive group id. - /// See ApplyUserInfoOverrides for detail - /// on how to allow setting values on a per entry basis. - /// - /// - /// The current group id. - /// - public int GroupId { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return groupId; - } - } - - /// - /// Get the archive group name. - /// See ApplyUserInfoOverrides for detail - /// on how to allow setting values on a per entry basis. - /// - /// - /// The current group name. - /// - public string GroupName { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - return groupName; - } - } - - /// - /// Get the archive's record size. Tar archives are composed of - /// a series of RECORDS each containing a number of BLOCKS. - /// This allowed tar archives to match the IO characteristics of - /// the physical device being used. Archives are expected - /// to be properly "blocked". - /// - /// - /// The record size this archive is using. - /// - public int RecordSize { - get { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - if (tarIn != null) { - return tarIn.RecordSize; - } else if (tarOut != null) { - return tarOut.RecordSize; - } - return TarBuffer.DefaultRecordSize; - } - } - - /// - /// Sets the IsStreamOwner property on the underlying stream. - /// Set this to false to prevent the Close of the TarArchive from closing the stream. - /// - public bool IsStreamOwner { - set { - if (tarIn != null) { - tarIn.IsStreamOwner = value; - } else { - tarOut.IsStreamOwner = value; - } - } - } - - /// - /// Close the archive. - /// - [Obsolete("Use Close instead")] - public void CloseArchive() - { - Close(); - } - - /// - /// Perform the "list" command for the archive contents. - /// - /// NOTE That this method uses the progress event to actually list - /// the contents. If the progress display event is not set, nothing will be listed! - /// - public void ListContents() - { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - while (true) { - TarEntry entry = tarIn.GetNextEntry(); - - if (entry == null) { - break; - } - OnProgressMessageEvent(entry, null); - } - } - - /// - /// Perform the "extract" command and extract the contents of the archive. - /// - /// - /// The destination directory into which to extract. - /// - public void ExtractContents(string destinationDirectory) - { - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - while (true) { - TarEntry entry = tarIn.GetNextEntry(); - - if (entry == null) { - break; - } - - ExtractEntry(destinationDirectory, entry); - } - } - - /// - /// Extract an entry from the archive. This method assumes that the - /// tarIn stream has been properly set with a call to GetNextEntry(). - /// - /// - /// The destination directory into which to extract. - /// - /// - /// The TarEntry returned by tarIn.GetNextEntry(). - /// - void ExtractEntry(string destDir, TarEntry entry) - { - OnProgressMessageEvent(entry, null); - - string name = entry.Name; - - if (Path.IsPathRooted(name)) { - // NOTE: - // for UNC names... \\machine\share\zoom\beet.txt gives \zoom\beet.txt - name = name.Substring(Path.GetPathRoot(name).Length); - } - - name = name.Replace('/', Path.DirectorySeparatorChar); - - string destFile = Path.Combine(destDir, name); - - if (entry.IsDirectory) { - EnsureDirectoryExists(destFile); - } else { - string parentDirectory = Path.GetDirectoryName(destFile); - EnsureDirectoryExists(parentDirectory); - - bool process = true; - FileInfo fileInfo = new FileInfo(destFile); - if (fileInfo.Exists) { - if (keepOldFiles) { - OnProgressMessageEvent(entry, "Destination file already exists"); - process = false; - } else if ((fileInfo.Attributes & FileAttributes.ReadOnly) != 0) { - OnProgressMessageEvent(entry, "Destination file already exists, and is read-only"); - process = false; - } - } - - if (process) { - bool asciiTrans = false; - - Stream outputStream = File.Create(destFile); - if (this.asciiTranslate) { - asciiTrans = !IsBinary(destFile); - } - - StreamWriter outw = null; - if (asciiTrans) { - outw = new StreamWriter(outputStream); - } - - byte[] rdbuf = new byte[32 * 1024]; - - while (true) { - int numRead = tarIn.Read(rdbuf, 0, rdbuf.Length); - - if (numRead <= 0) { - break; - } - - if (asciiTrans) { - for (int off = 0, b = 0; b < numRead; ++b) { - if (rdbuf[b] == 10) { - string s = Encoding.ASCII.GetString(rdbuf, off, (b - off)); - outw.WriteLine(s); - off = b + 1; - } - } - } else { - outputStream.Write(rdbuf, 0, numRead); - } - } - - if (asciiTrans) { - outw.Close(); - } else { - outputStream.Close(); - } - } - } - } - - /// - /// Write an entry to the archive. This method will call the putNextEntry - /// and then write the contents of the entry, and finally call closeEntry() - /// for entries that are files. For directories, it will call putNextEntry(), - /// and then, if the recurse flag is true, process each entry that is a - /// child of the directory. - /// - /// - /// The TarEntry representing the entry to write to the archive. - /// - /// - /// If true, process the children of directory entries. - /// - public void WriteEntry(TarEntry sourceEntry, bool recurse) - { - if ( sourceEntry == null ) { - throw new ArgumentNullException("sourceEntry"); - } - - if ( isDisposed ) { - throw new ObjectDisposedException("TarArchive"); - } - - try - { - if ( recurse ) { - TarHeader.SetValueDefaults(sourceEntry.UserId, sourceEntry.UserName, - sourceEntry.GroupId, sourceEntry.GroupName); - } - WriteEntryCore(sourceEntry, recurse); - } - finally - { - if ( recurse ) { - TarHeader.RestoreSetValues(); - } - } - } - - /// - /// Write an entry to the archive. This method will call the putNextEntry - /// and then write the contents of the entry, and finally call closeEntry() - /// for entries that are files. For directories, it will call putNextEntry(), - /// and then, if the recurse flag is true, process each entry that is a - /// child of the directory. - /// - /// - /// The TarEntry representing the entry to write to the archive. - /// - /// - /// If true, process the children of directory entries. - /// - void WriteEntryCore(TarEntry sourceEntry, bool recurse) - { - string tempFileName = null; - string entryFilename = sourceEntry.File; - - TarEntry entry = (TarEntry)sourceEntry.Clone(); - - if ( applyUserInfoOverrides ) { - entry.GroupId = groupId; - entry.GroupName = groupName; - entry.UserId = userId; - entry.UserName = userName; - } - - OnProgressMessageEvent(entry, null); - - if (asciiTranslate && !entry.IsDirectory) { - - if (!IsBinary(entryFilename)) { - tempFileName = Path.GetTempFileName(); - - using (StreamReader inStream = File.OpenText(entryFilename)) { - using (Stream outStream = File.Create(tempFileName)) { - - while (true) { - string line = inStream.ReadLine(); - if (line == null) { - break; - } - byte[] data = Encoding.ASCII.GetBytes(line); - outStream.Write(data, 0, data.Length); - outStream.WriteByte((byte)'\n'); - } - - outStream.Flush(); - } - } - - entry.Size = new FileInfo(tempFileName).Length; - entryFilename = tempFileName; - } - } - - string newName = null; - - if (rootPath != null) { - if (entry.Name.StartsWith(rootPath)) { - newName = entry.Name.Substring(rootPath.Length + 1 ); - } - } - - if (pathPrefix != null) { - newName = (newName == null) ? pathPrefix + "/" + entry.Name : pathPrefix + "/" + newName; - } - - if (newName != null) { - entry.Name = newName; - } - - tarOut.PutNextEntry(entry); - - if (entry.IsDirectory) { - if (recurse) { - TarEntry[] list = entry.GetDirectoryEntries(); - for (int i = 0; i < list.Length; ++i) { - WriteEntryCore(list[i], recurse); - } - } - } - else { - using (Stream inputStream = File.OpenRead(entryFilename)) { - byte[] localBuffer = new byte[32 * 1024]; - while (true) { - int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length); - - if (numRead <=0) { - break; - } - - tarOut.Write(localBuffer, 0, numRead); - } - } - - if ( (tempFileName != null) && (tempFileName.Length > 0) ) { - File.Delete(tempFileName); - } - - tarOut.CloseEntry(); - } - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Releases the unmanaged resources used by the FileStream and optionally releases the managed resources. - /// - /// true to release both managed and unmanaged resources; - /// false to release only unmanaged resources. - protected virtual void Dispose(bool disposing) - { - if ( !isDisposed ) { - isDisposed = true; - if ( disposing ) { - if ( tarOut != null ) { - tarOut.Flush(); - tarOut.Close(); - } - - if ( tarIn != null ) { - tarIn.Close(); - } - } - } - } - - /// - /// Closes the archive and releases any associated resources. - /// - public virtual void Close() - { - Dispose(true); - } - - /// - /// Ensures that resources are freed and other cleanup operations are performed - /// when the garbage collector reclaims the . - /// - ~TarArchive() - { - Dispose(false); - } - - static void EnsureDirectoryExists(string directoryName) - { - if (!Directory.Exists(directoryName)) { - try { - Directory.CreateDirectory(directoryName); - } - catch (Exception e) { - throw new TarException("Exception creating directory '" + directoryName + "', " + e.Message, e); - } - } - } - - // TODO: TarArchive - Is there a better way to test for a text file? - // It no longer reads entire files into memory but is still a weak test! - // This assumes that byte values 0-7, 14-31 or 255 are binary - // and that all non text files contain one of these values - static bool IsBinary(string filename) - { - using (FileStream fs = File.OpenRead(filename)) - { - int sampleSize = Math.Min(4096, (int)fs.Length); - byte[] content = new byte[sampleSize]; - - int bytesRead = fs.Read(content, 0, sampleSize); - - for (int i = 0; i < bytesRead; ++i) { - byte b = content[i]; - if ( (b < 8) || ((b > 13) && (b < 32)) || (b == 255) ) { - return true; - } - } - } - return false; - } - - #region Instance Fields - bool keepOldFiles; - bool asciiTranslate; - - int userId; - string userName = string.Empty; - int groupId; - string groupName = string.Empty; - - string rootPath; - string pathPrefix; - - bool applyUserInfoOverrides; - - TarInputStream tarIn; - TarOutputStream tarOut; - bool isDisposed; - #endregion - } -} - - -/* The original Java file had this header: - ** Authored by Timothy Gerard Endres - ** - ** - ** This work has been placed into the public domain. - ** You may use this work in any way and for any purpose you wish. - ** - ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, - ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR - ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY - ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR - ** REDISTRIBUTION OF THIS SOFTWARE. - ** - */ - diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarBuffer.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarBuffer.cs deleted file mode 100644 index 40b8d93182..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarBuffer.cs +++ /dev/null @@ -1,624 +0,0 @@ -// TarBuffer.cs -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -namespace ICSharpCode.SharpZipLib.Tar -{ - - /// - /// The TarBuffer class implements the tar archive concept - /// of a buffered input stream. This concept goes back to the - /// days of blocked tape drives and special io devices. In the - /// C# universe, the only real function that this class - /// performs is to ensure that files have the correct "record" - /// size, or other tars will complain. - ///

- /// You should never have a need to access this class directly. - /// TarBuffers are created by Tar IO Streams. - ///

- ///
- public class TarBuffer - { - -/* A quote from GNU tar man file on blocking and records - A `tar' archive file contains a series of blocks. Each block -contains `BLOCKSIZE' bytes. Although this format may be thought of as -being on magnetic tape, other media are often used. - - Each file archived is represented by a header block which describes -the file, followed by zero or more blocks which give the contents of -the file. At the end of the archive file there may be a block filled -with binary zeros as an end-of-file marker. A reasonable system should -write a block of zeros at the end, but must not assume that such a -block exists when reading an archive. - - The blocks may be "blocked" for physical I/O operations. Each -record of N blocks is written with a single 'write ()' -operation. On magnetic tapes, the result of such a write is a single -record. When writing an archive, the last record of blocks should be -written at the full size, with blocks after the zero block containing -all zeros. When reading an archive, a reasonable system should -properly handle an archive whose last record is shorter than the rest, -or which contains garbage records after a zero block. -*/ - - #region Constants - /// - /// The size of a block in a tar archive in bytes. - /// - /// This is 512 bytes. - public const int BlockSize = 512; - - /// - /// The number of blocks in a default record. - /// - /// - /// The default value is 20 blocks per record. - /// - public const int DefaultBlockFactor = 20; - - /// - /// The size in bytes of a default record. - /// - /// - /// The default size is 10KB. - /// - public const int DefaultRecordSize = BlockSize * DefaultBlockFactor; - #endregion - - /// - /// Get the record size for this buffer - /// - /// The record size in bytes. - /// This is equal to the multiplied by the - public int RecordSize - { - get { - return recordSize; - } - } - - /// - /// Get the TAR Buffer's record size. - /// - /// The record size in bytes. - /// This is equal to the multiplied by the - [Obsolete("Use RecordSize property instead")] - public int GetRecordSize() - { - return recordSize; - } - - /// - /// Get the Blocking factor for the buffer - /// - /// This is the number of blocks in each record. - public int BlockFactor { - get { - return blockFactor; - } - } - - /// - /// Get the TAR Buffer's block factor - /// - /// The block factor; the number of blocks per record. - [Obsolete("Use BlockFactor property instead")] - public int GetBlockFactor() - { - return blockFactor; - } - - /// - /// Construct a default TarBuffer - /// - protected TarBuffer() - { - } - - /// - /// Create TarBuffer for reading with default BlockFactor - /// - /// Stream to buffer - /// A new suitable for input. - public static TarBuffer CreateInputTarBuffer(Stream inputStream) - { - if ( inputStream == null ) - { - throw new ArgumentNullException("inputStream"); - } - - return CreateInputTarBuffer(inputStream, DefaultBlockFactor); - } - - /// - /// Construct TarBuffer for reading inputStream setting BlockFactor - /// - /// Stream to buffer - /// Blocking factor to apply - /// A new suitable for input. - public static TarBuffer CreateInputTarBuffer(Stream inputStream, int blockFactor) - { - if ( inputStream == null ) - { - throw new ArgumentNullException("inputStream"); - } - - if ( blockFactor <= 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("blockFactor"); -#else - throw new ArgumentOutOfRangeException("blockFactor", "Factor cannot be negative"); -#endif - } - - TarBuffer tarBuffer = new TarBuffer(); - tarBuffer.inputStream = inputStream; - tarBuffer.outputStream = null; - tarBuffer.Initialize(blockFactor); - - return tarBuffer; - } - - /// - /// Construct TarBuffer for writing with default BlockFactor - /// - /// output stream for buffer - /// A new suitable for output. - public static TarBuffer CreateOutputTarBuffer(Stream outputStream) - { - if ( outputStream == null ) - { - throw new ArgumentNullException("outputStream"); - } - - return CreateOutputTarBuffer(outputStream, DefaultBlockFactor); - } - - /// - /// Construct TarBuffer for writing Tar output to streams. - /// - /// Output stream to write to. - /// Blocking factor to apply - /// A new suitable for output. - public static TarBuffer CreateOutputTarBuffer(Stream outputStream, int blockFactor) - { - if ( outputStream == null ) - { - throw new ArgumentNullException("outputStream"); - } - - if ( blockFactor <= 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("blockFactor"); -#else - throw new ArgumentOutOfRangeException("blockFactor", "Factor cannot be negative"); -#endif - } - - TarBuffer tarBuffer = new TarBuffer(); - tarBuffer.inputStream = null; - tarBuffer.outputStream = outputStream; - tarBuffer.Initialize(blockFactor); - - return tarBuffer; - } - - /// - /// Initialization common to all constructors. - /// - void Initialize(int archiveBlockFactor) - { - blockFactor = archiveBlockFactor; - recordSize = archiveBlockFactor * BlockSize; - recordBuffer = new byte[RecordSize]; - - if (inputStream != null) { - currentRecordIndex = -1; - currentBlockIndex = BlockFactor; - } - else { - currentRecordIndex = 0; - currentBlockIndex = 0; - } - } - - /// - /// Determine if an archive block indicates End of Archive. End of - /// archive is indicated by a block that consists entirely of null bytes. - /// All remaining blocks for the record should also be null's - /// However some older tars only do a couple of null blocks (Old GNU tar for one) - /// and also partial records - /// - /// The data block to check. - /// Returns true if the block is an EOF block; false otherwise. - [Obsolete("Use IsEndOfArchiveBlock instead")] - public bool IsEOFBlock(byte[] block) - { - if ( block == null ) { - throw new ArgumentNullException("block"); - } - - if ( block.Length != BlockSize ) - { - throw new ArgumentException("block length is invalid"); - } - - for (int i = 0; i < BlockSize; ++i) { - if (block[i] != 0) { - return false; - } - } - - return true; - } - - - /// - /// Determine if an archive block indicates the End of an Archive has been reached. - /// End of archive is indicated by a block that consists entirely of null bytes. - /// All remaining blocks for the record should also be null's - /// However some older tars only do a couple of null blocks (Old GNU tar for one) - /// and also partial records - /// - /// The data block to check. - /// Returns true if the block is an EOF block; false otherwise. - public static bool IsEndOfArchiveBlock(byte[] block) - { - if ( block == null ) { - throw new ArgumentNullException("block"); - } - - if ( block.Length != BlockSize ) { - throw new ArgumentException("block length is invalid"); - } - - for ( int i = 0; i < BlockSize; ++i ) { - if ( block[i] != 0 ) { - return false; - } - } - - return true; - } - - /// - /// Skip over a block on the input stream. - /// - public void SkipBlock() - { - if (inputStream == null) { - throw new TarException("no input stream defined"); - } - - if (currentBlockIndex >= BlockFactor) { - if (!ReadRecord()) { - throw new TarException("Failed to read a record"); - } - } - - currentBlockIndex++; - } - - /// - /// Read a block from the input stream. - /// - /// - /// The block of data read. - /// - public byte[] ReadBlock() - { - if (inputStream == null) { - throw new TarException("TarBuffer.ReadBlock - no input stream defined"); - } - - if (currentBlockIndex >= BlockFactor) { - if (!ReadRecord()) { - throw new TarException("Failed to read a record"); - } - } - - byte[] result = new byte[BlockSize]; - - Array.Copy(recordBuffer, (currentBlockIndex * BlockSize), result, 0, BlockSize ); - currentBlockIndex++; - return result; - } - - /// - /// Read a record from data stream. - /// - /// - /// false if End-Of-File, else true. - /// - bool ReadRecord() - { - if (inputStream == null) { - throw new TarException("no input stream stream defined"); - } - - currentBlockIndex = 0; - - int offset = 0; - int bytesNeeded = RecordSize; - - while (bytesNeeded > 0) { - long numBytes = inputStream.Read(recordBuffer, offset, bytesNeeded); - - // - // NOTE - // We have found EOF, and the record is not full! - // - // This is a broken archive. It does not follow the standard - // blocking algorithm. However, because we are generous, and - // it requires little effort, we will simply ignore the error - // and continue as if the entire record were read. This does - // not appear to break anything upstream. We used to return - // false in this case. - // - // Thanks to 'Yohann.Roussel@alcatel.fr' for this fix. - // - if (numBytes <= 0) { - break; - } - - offset += (int)numBytes; - bytesNeeded -= (int)numBytes; - } - - currentRecordIndex++; - return true; - } - - /// - /// Get the current block number, within the current record, zero based. - /// - /// Block numbers are zero based values - /// - public int CurrentBlock - { - get { return currentBlockIndex; } - } - - /// - /// Get/set flag indicating ownership of the underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return isStreamOwner_; } - set { isStreamOwner_ = value; } - } - - /// - /// Get the current block number, within the current record, zero based. - /// - /// - /// The current zero based block number. - /// - /// - /// The absolute block number = (record number * block factor) + block number. - /// - [Obsolete("Use CurrentBlock property instead")] - public int GetCurrentBlockNum() - { - return currentBlockIndex; - } - - /// - /// Get the current record number. - /// - /// - /// The current zero based record number. - /// - public int CurrentRecord - { - get { return currentRecordIndex; } - } - - /// - /// Get the current record number. - /// - /// - /// The current zero based record number. - /// - [Obsolete("Use CurrentRecord property instead")] - public int GetCurrentRecordNum() - { - return currentRecordIndex; - } - - /// - /// Write a block of data to the archive. - /// - /// - /// The data to write to the archive. - /// - public void WriteBlock(byte[] block) - { - if ( block == null ) { - throw new ArgumentNullException("block"); - } - - if (outputStream == null) { - throw new TarException("TarBuffer.WriteBlock - no output stream defined"); - } - - if (block.Length != BlockSize) { - string errorText = string.Format("TarBuffer.WriteBlock - block to write has length '{0}' which is not the block size of '{1}'", - block.Length, BlockSize ); - throw new TarException(errorText); - } - - if (currentBlockIndex >= BlockFactor) { - WriteRecord(); - } - - Array.Copy(block, 0, recordBuffer, (currentBlockIndex * BlockSize), BlockSize); - currentBlockIndex++; - } - - /// - /// Write an archive record to the archive, where the record may be - /// inside of a larger array buffer. The buffer must be "offset plus - /// record size" long. - /// - /// - /// The buffer containing the record data to write. - /// - /// - /// The offset of the record data within buffer. - /// - public void WriteBlock(byte[] buffer, int offset) - { - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - if (outputStream == null) { - throw new TarException("TarBuffer.WriteBlock - no output stream stream defined"); - } - - if ( (offset < 0) || (offset >= buffer.Length) ) - { - throw new ArgumentOutOfRangeException("offset"); - } - - if ((offset + BlockSize) > buffer.Length) { - string errorText = string.Format("TarBuffer.WriteBlock - record has length '{0}' with offset '{1}' which is less than the record size of '{2}'", - buffer.Length, offset, recordSize); - throw new TarException(errorText); - } - - if (currentBlockIndex >= BlockFactor) { - WriteRecord(); - } - - Array.Copy(buffer, offset, recordBuffer, (currentBlockIndex * BlockSize), BlockSize); - - currentBlockIndex++; - } - - /// - /// Write a TarBuffer record to the archive. - /// - void WriteRecord() - { - if (outputStream == null) { - throw new TarException("TarBuffer.WriteRecord no output stream defined"); - } - - outputStream.Write(recordBuffer, 0, RecordSize); - outputStream.Flush(); - - currentBlockIndex = 0; - currentRecordIndex++; - } - - /// - /// WriteFinalRecord writes the current record buffer to output any unwritten data is present. - /// - /// Any trailing bytes are set to zero which is by definition correct behaviour - /// for the end of a tar stream. - void WriteFinalRecord() - { - if (outputStream == null) { - throw new TarException("TarBuffer.WriteFinalRecord no output stream defined"); - } - - if (currentBlockIndex > 0) { - int dataBytes = currentBlockIndex * BlockSize; - Array.Clear(recordBuffer, dataBytes, RecordSize - dataBytes); - WriteRecord(); - } - - outputStream.Flush(); - } - - /// - /// Close the TarBuffer. If this is an output buffer, also flush the - /// current block before closing. - /// - public void Close() - { - if (outputStream != null) { - WriteFinalRecord(); - - if (isStreamOwner_) { - outputStream.Close(); - } - outputStream = null; - } - else if (inputStream != null) { - if (isStreamOwner_) { - inputStream.Close(); - } - inputStream = null; - } - } - - #region Instance Fields - Stream inputStream; - Stream outputStream; - - byte[] recordBuffer; - int currentBlockIndex; - int currentRecordIndex; - - int recordSize = DefaultRecordSize; - int blockFactor = DefaultBlockFactor; - bool isStreamOwner_ = true; - #endregion - } -} - -/* The original Java file had this header: - * - ** Authored by Timothy Gerard Endres - ** - ** - ** This work has been placed into the public domain. - ** You may use this work in any way and for any purpose you wish. - ** - ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, - ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR - ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY - ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR - ** REDISTRIBUTION OF THIS SOFTWARE. - ** - */ diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarEntry.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarEntry.cs deleted file mode 100644 index a733e32b1d..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarEntry.cs +++ /dev/null @@ -1,559 +0,0 @@ -// TarEntry.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -namespace ICSharpCode.SharpZipLib.Tar -{ - /// - /// This class represents an entry in a Tar archive. It consists - /// of the entry's header, as well as the entry's File. Entries - /// can be instantiated in one of three ways, depending on how - /// they are to be used. - ///

- /// TarEntries that are created from the header bytes read from - /// an archive are instantiated with the TarEntry( byte[] ) - /// constructor. These entries will be used when extracting from - /// or listing the contents of an archive. These entries have their - /// header filled in using the header bytes. They also set the File - /// to null, since they reference an archive entry not a file.

- ///

- /// TarEntries that are created from files that are to be written - /// into an archive are instantiated with the CreateEntryFromFile(string) - /// pseudo constructor. These entries have their header filled in using - /// the File's information. They also keep a reference to the File - /// for convenience when writing entries.

- ///

- /// Finally, TarEntries can be constructed from nothing but a name. - /// This allows the programmer to construct the entry by hand, for - /// instance when only an InputStream is available for writing to - /// the archive, and the header information is constructed from - /// other information. In this case the header fields are set to - /// defaults and the File is set to null.

- /// - ///
- public class TarEntry : ICloneable - { - #region Constructors - /// - /// Initialise a default instance of . - /// - private TarEntry() - { - header = new TarHeader(); - } - - /// - /// Construct an entry from an archive's header bytes. File is set - /// to null. - /// - /// - /// The header bytes from a tar archive entry. - /// - public TarEntry(byte[] headerBuffer) - { - header = new TarHeader(); - header.ParseBuffer(headerBuffer); - } - - /// - /// Construct a TarEntry using the header provided - /// - /// Header details for entry - public TarEntry(TarHeader header) - { - if ( header == null ) - { - throw new ArgumentNullException("header"); - } - - this.header = (TarHeader)header.Clone(); - } - #endregion - - #region ICloneable Members - /// - /// Clone this tar entry. - /// - /// Returns a clone of this entry. - public object Clone() - { - TarEntry entry = new TarEntry(); - entry.file = file; - entry.header = (TarHeader)header.Clone(); - entry.Name = Name; - return entry; - } - #endregion - - /// - /// Construct an entry with only a name. - /// This allows the programmer to construct the entry's header "by hand". - /// - /// The name to use for the entry - /// Returns the newly created - public static TarEntry CreateTarEntry(string name) - { - TarEntry entry = new TarEntry(); - TarEntry.NameTarHeader(entry.header, name); - return entry; - } - - /// - /// Construct an entry for a file. File is set to file, and the - /// header is constructed from information from the file. - /// - /// The file name that the entry represents. - /// Returns the newly created - public static TarEntry CreateEntryFromFile(string fileName) - { - TarEntry entry = new TarEntry(); - entry.GetFileTarHeader(entry.header, fileName); - return entry; - } - - /// - /// Determine if the two entries are equal. Equality is determined - /// by the header names being equal. - /// - /// The to compare with the current Object. - /// - /// True if the entries are equal; false if not. - /// - public override bool Equals(object obj) - { - TarEntry localEntry = obj as TarEntry; - - if ( localEntry != null ) - { - return Name.Equals(localEntry.Name); - } - return false; - } - - /// - /// Derive a Hash value for the current - /// - /// A Hash code for the current - public override int GetHashCode() - { - return Name.GetHashCode(); - } - - /// - /// Determine if the given entry is a descendant of this entry. - /// Descendancy is determined by the name of the descendant - /// starting with this entry's name. - /// - /// - /// Entry to be checked as a descendent of this. - /// - /// - /// True if entry is a descendant of this. - /// - public bool IsDescendent(TarEntry toTest) - { - if ( toTest == null ) { - throw new ArgumentNullException("toTest"); - } - - return toTest.Name.StartsWith(Name); - } - - /// - /// Get this entry's header. - /// - /// - /// This entry's TarHeader. - /// - public TarHeader TarHeader - { - get { - return header; - } - } - - /// - /// Get/Set this entry's name. - /// - public string Name - { - get { - return header.Name; - } - set { - header.Name = value; - } - } - - /// - /// Get/set this entry's user id. - /// - public int UserId - { - get { - return header.UserId; - } - set { - header.UserId = value; - } - } - - /// - /// Get/set this entry's group id. - /// - public int GroupId - { - get { - return header.GroupId; - } - set { - header.GroupId = value; - } - } - - /// - /// Get/set this entry's user name. - /// - public string UserName - { - get { - return header.UserName; - } - set { - header.UserName = value; - } - } - - /// - /// Get/set this entry's group name. - /// - public string GroupName - { - get { - return header.GroupName; - } - set { - header.GroupName = value; - } - } - - /// - /// Convenience method to set this entry's group and user ids. - /// - /// - /// This entry's new user id. - /// - /// - /// This entry's new group id. - /// - public void SetIds(int userId, int groupId) - { - UserId = userId; - GroupId = groupId; - } - - /// - /// Convenience method to set this entry's group and user names. - /// - /// - /// This entry's new user name. - /// - /// - /// This entry's new group name. - /// - public void SetNames(string userName, string groupName) - { - UserName = userName; - GroupName = groupName; - } - - /// - /// Get/Set the modification time for this entry - /// - public DateTime ModTime { - get { - return header.ModTime; - } - set { - header.ModTime = value; - } - } - - /// - /// Get this entry's file. - /// - /// - /// This entry's file. - /// - public string File { - get { - return file; - } - } - - /// - /// Get/set this entry's recorded file size. - /// - public long Size { - get { - return header.Size; - } - set { - header.Size = value; - } - } - - /// - /// Return true if this entry represents a directory, false otherwise - /// - /// - /// True if this entry is a directory. - /// - public bool IsDirectory { - get { - if (file != null) { - return Directory.Exists(file); - } - - if (header != null) { - if ((header.TypeFlag == TarHeader.LF_DIR) || Name.EndsWith( "/" )) { - return true; - } - } - return false; - } - } - - /// - /// Fill in a TarHeader with information from a File. - /// - /// - /// The TarHeader to fill in. - /// - /// - /// The file from which to get the header information. - /// - public void GetFileTarHeader(TarHeader header, string file) - { - if ( header == null ) { - throw new ArgumentNullException("header"); - } - - if ( file == null ) { - throw new ArgumentNullException("file"); - } - - this.file = file; - - // bugfix from torhovl from #D forum: - string name = file; - -#if !NETCF_1_0 && !NETCF_2_0 - // 23-Jan-2004 GnuTar allows device names in path where the name is not local to the current directory - if (name.IndexOf(Environment.CurrentDirectory) == 0) { - name = name.Substring(Environment.CurrentDirectory.Length); - } -#endif - -/* - if (Path.DirectorySeparatorChar == '\\') - { - // check if the OS is Windows - // Strip off drive letters! - if (name.Length > 2) - { - char ch1 = name[0]; - char ch2 = name[1]; - - if (ch2 == ':' && Char.IsLetter(ch1)) - { - name = name.Substring(2); - } - } - } -*/ - - name = name.Replace(Path.DirectorySeparatorChar, '/'); - - // No absolute pathnames - // Windows (and Posix?) paths can start with UNC style "\\NetworkDrive\", - // so we loop on starting /'s. - while (name.StartsWith("/")) { - name = name.Substring(1); - } - - header.LinkName = String.Empty; - header.Name = name; - - if (Directory.Exists(file)) { - header.Mode = 1003; // Magic number for security access for a UNIX filesystem - header.TypeFlag = TarHeader.LF_DIR; - if ( (header.Name.Length == 0) || header.Name[header.Name.Length - 1] != '/') { - header.Name = header.Name + "/"; - } - - header.Size = 0; - } else { - header.Mode = 33216; // Magic number for security access for a UNIX filesystem - header.TypeFlag = TarHeader.LF_NORMAL; - header.Size = new FileInfo(file.Replace('/', Path.DirectorySeparatorChar)).Length; - } - - header.ModTime = System.IO.File.GetLastWriteTime(file.Replace('/', Path.DirectorySeparatorChar)).ToUniversalTime(); - header.DevMajor = 0; - header.DevMinor = 0; - } - - /// - /// Get entries for all files present in this entries directory. - /// If this entry doesnt represent a directory zero entries are returned. - /// - /// - /// An array of TarEntry's for this entry's children. - /// - public TarEntry[] GetDirectoryEntries() - { - if ( (file == null) || !Directory.Exists(file)) { - return new TarEntry[0]; - } - - string[] list = Directory.GetFileSystemEntries(file); - TarEntry[] result = new TarEntry[list.Length]; - - for (int i = 0; i < list.Length; ++i) { - result[i] = TarEntry.CreateEntryFromFile(list[i]); - } - - return result; - } - - /// - /// Write an entry's header information to a header buffer. - /// - /// - /// The tar entry header buffer to fill in. - /// - public void WriteEntryHeader(byte[] outBuffer) - { - header.WriteHeader(outBuffer); - } - - /// - /// Convenience method that will modify an entry's name directly - /// in place in an entry header buffer byte array. - /// - /// - /// The buffer containing the entry header to modify. - /// - /// - /// The new name to place into the header buffer. - /// - static public void AdjustEntryName(byte[] buffer, string newName) - { - TarHeader.GetNameBytes(newName, buffer, 0, TarHeader.NAMELEN); - } - - /// - /// Fill in a TarHeader given only the entry's name. - /// - /// - /// The TarHeader to fill in. - /// - /// - /// The tar entry name. - /// - static public void NameTarHeader(TarHeader header, string name) - { - if ( header == null ) { - throw new ArgumentNullException("header"); - } - - if ( name == null ) { - throw new ArgumentNullException("name"); - } - - bool isDir = name.EndsWith("/"); - - header.Name = name; - header.Mode = isDir ? 1003 : 33216; - header.UserId = 0; - header.GroupId = 0; - header.Size = 0; - - header.ModTime = DateTime.UtcNow; - - header.TypeFlag = isDir ? TarHeader.LF_DIR : TarHeader.LF_NORMAL; - - header.LinkName = String.Empty; - header.UserName = String.Empty; - header.GroupName = String.Empty; - - header.DevMajor = 0; - header.DevMinor = 0; - } - - #region Instance Fields - /// - /// The name of the file this entry represents or null if the entry is not based on a file. - /// - string file; - - /// - /// The entry's header information. - /// - TarHeader header; - #endregion - } -} - - - -/* The original Java file had this header: - * - ** Authored by Timothy Gerard Endres - ** - ** - ** This work has been placed into the public domain. - ** You may use this work in any way and for any purpose you wish. - ** - ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, - ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR - ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY - ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR - ** REDISTRIBUTION OF THIS SOFTWARE. - ** - */ diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarException.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarException.cs deleted file mode 100644 index 84a6ebab4b..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarException.cs +++ /dev/null @@ -1,91 +0,0 @@ -// TarException.cs -// -// Copyright 2004 John Reilly -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; - -#if !NETCF_1_0 && !NETCF_2_0 -using System.Runtime.Serialization; -#endif - -namespace ICSharpCode.SharpZipLib.Tar { - - /// - /// TarExceptions are used for exceptions specific to tar classes and code. - /// -#if !NETCF_1_0 && !NETCF_2_0 - [Serializable] -#endif - public class TarException : SharpZipBaseException - { -#if !NETCF_1_0 && !NETCF_2_0 - /// - /// Deserialization constructor - /// - /// for this constructor - /// for this constructor - protected TarException(SerializationInfo info, StreamingContext context) - : base(info, context) - - { - } -#endif - - /// - /// Initialises a new instance of the TarException class. - /// - public TarException() - { - } - - /// - /// Initialises a new instance of the TarException class with a specified message. - /// - /// The message that describes the error. - public TarException(string message) - : base(message) - { - } - - /// - /// - /// - /// A message describing the error. - /// The exception that is the cause of the current exception. - public TarException(string message, Exception exception) - : base(message, exception) - { - } - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarHeader.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarHeader.cs deleted file mode 100644 index fc49f16c09..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarHeader.cs +++ /dev/null @@ -1,1156 +0,0 @@ -// TarHeader.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - - -/* The tar format and its POSIX successor PAX have a long history which makes for compatability - issues when creating and reading files. - - This is further complicated by a large number of programs with variations on formats - One common issue is the handling of names longer than 100 characters. - GNU style long names are currently supported. - -This is the ustar (Posix 1003.1) header. - -struct header -{ - char t_name[100]; // 0 Filename - char t_mode[8]; // 100 Permissions - char t_uid[8]; // 108 Numerical User ID - char t_gid[8]; // 116 Numerical Group ID - char t_size[12]; // 124 Filesize - char t_mtime[12]; // 136 st_mtime - char t_chksum[8]; // 148 Checksum - char t_typeflag; // 156 Type of File - char t_linkname[100]; // 157 Target of Links - char t_magic[6]; // 257 "ustar" or other... - char t_version[2]; // 263 Version fixed to 00 - char t_uname[32]; // 265 User Name - char t_gname[32]; // 297 Group Name - char t_devmajor[8]; // 329 Major for devices - char t_devminor[8]; // 337 Minor for devices - char t_prefix[155]; // 345 Prefix for t_name - char t_mfill[12]; // 500 Filler up to 512 -}; - -*/ - -using System; -using System.Text; - -namespace ICSharpCode.SharpZipLib.Tar -{ - - - /// - /// This class encapsulates the Tar Entry Header used in Tar Archives. - /// The class also holds a number of tar constants, used mostly in headers. - /// - public class TarHeader : ICloneable - { - #region Constants - /// - /// The length of the name field in a header buffer. - /// - public const int NAMELEN = 100; - - /// - /// The length of the mode field in a header buffer. - /// - public const int MODELEN = 8; - - /// - /// The length of the user id field in a header buffer. - /// - public const int UIDLEN = 8; - - /// - /// The length of the group id field in a header buffer. - /// - public const int GIDLEN = 8; - - /// - /// The length of the checksum field in a header buffer. - /// - public const int CHKSUMLEN = 8; - - /// - /// Offset of checksum in a header buffer. - /// - public const int CHKSUMOFS = 148; - - /// - /// The length of the size field in a header buffer. - /// - public const int SIZELEN = 12; - - /// - /// The length of the magic field in a header buffer. - /// - public const int MAGICLEN = 6; - - /// - /// The length of the version field in a header buffer. - /// - public const int VERSIONLEN = 2; - - /// - /// The length of the modification time field in a header buffer. - /// - public const int MODTIMELEN = 12; - - /// - /// The length of the user name field in a header buffer. - /// - public const int UNAMELEN = 32; - - /// - /// The length of the group name field in a header buffer. - /// - public const int GNAMELEN = 32; - - /// - /// The length of the devices field in a header buffer. - /// - public const int DEVLEN = 8; - - // - // LF_ constants represent the "type" of an entry - // - - /// - /// The "old way" of indicating a normal file. - /// - public const byte LF_OLDNORM = 0; - - /// - /// Normal file type. - /// - public const byte LF_NORMAL = (byte) '0'; - - /// - /// Link file type. - /// - public const byte LF_LINK = (byte) '1'; - - /// - /// Symbolic link file type. - /// - public const byte LF_SYMLINK = (byte) '2'; - - /// - /// Character device file type. - /// - public const byte LF_CHR = (byte) '3'; - - /// - /// Block device file type. - /// - public const byte LF_BLK = (byte) '4'; - - /// - /// Directory file type. - /// - public const byte LF_DIR = (byte) '5'; - - /// - /// FIFO (pipe) file type. - /// - public const byte LF_FIFO = (byte) '6'; - - /// - /// Contiguous file type. - /// - public const byte LF_CONTIG = (byte) '7'; - - /// - /// Posix.1 2001 global extended header - /// - public const byte LF_GHDR = (byte) 'g'; - - /// - /// Posix.1 2001 extended header - /// - public const byte LF_XHDR = (byte) 'x'; - - // POSIX allows for upper case ascii type as extensions - - /// - /// Solaris access control list file type - /// - public const byte LF_ACL = (byte) 'A'; - - /// - /// GNU dir dump file type - /// This is a dir entry that contains the names of files that were in the - /// dir at the time the dump was made - /// - public const byte LF_GNU_DUMPDIR = (byte) 'D'; - - /// - /// Solaris Extended Attribute File - /// - public const byte LF_EXTATTR = (byte) 'E' ; - - /// - /// Inode (metadata only) no file content - /// - public const byte LF_META = (byte) 'I'; - - /// - /// Identifies the next file on the tape as having a long link name - /// - public const byte LF_GNU_LONGLINK = (byte) 'K'; - - /// - /// Identifies the next file on the tape as having a long name - /// - public const byte LF_GNU_LONGNAME = (byte) 'L'; - - /// - /// Continuation of a file that began on another volume - /// - public const byte LF_GNU_MULTIVOL = (byte) 'M'; - - /// - /// For storing filenames that dont fit in the main header (old GNU) - /// - public const byte LF_GNU_NAMES = (byte) 'N'; - - /// - /// GNU Sparse file - /// - public const byte LF_GNU_SPARSE = (byte) 'S'; - - /// - /// GNU Tape/volume header ignore on extraction - /// - public const byte LF_GNU_VOLHDR = (byte) 'V'; - - /// - /// The magic tag representing a POSIX tar archive. (includes trailing NULL) - /// - public const string TMAGIC = "ustar "; - - /// - /// The magic tag representing an old GNU tar archive where version is included in magic and overwrites it - /// - public const string GNU_TMAGIC = "ustar "; - - const long timeConversionFactor = 10000000L; // 1 tick == 100 nanoseconds - readonly static DateTime dateTime1970 = new DateTime(1970, 1, 1, 0, 0, 0, 0); - #endregion - - #region Constructors - - /// - /// Initialise a default TarHeader instance - /// - public TarHeader() - { - Magic = TMAGIC; - Version = " "; - - Name = ""; - LinkName = ""; - - UserId = defaultUserId; - GroupId = defaultGroupId; - UserName = defaultUser; - GroupName = defaultGroupName; - Size = 0; - } - - #endregion - - #region Properties - /// - /// Get/set the name for this tar entry. - /// - /// Thrown when attempting to set the property to null. - public string Name - { - get { return name; } - set { - if ( value == null ) { - throw new ArgumentNullException("value"); - } - name = value; - } - } - - /// - /// Get the name of this entry. - /// - /// The entry's name. - [Obsolete("Use the Name property instead", true)] - public string GetName() - { - return name; - } - - /// - /// Get/set the entry's Unix style permission mode. - /// - public int Mode - { - get { return mode; } - set { mode = value; } - } - - - /// - /// The entry's user id. - /// - /// - /// This is only directly relevant to unix systems. - /// The default is zero. - /// - public int UserId - { - get { return userId; } - set { userId = value; } - } - - - /// - /// Get/set the entry's group id. - /// - /// - /// This is only directly relevant to linux/unix systems. - /// The default value is zero. - /// - public int GroupId - { - get { return groupId; } - set { groupId = value; } - } - - - /// - /// Get/set the entry's size. - /// - /// Thrown when setting the size to less than zero. - public long Size - { - get { return size; } - set { - if ( value < 0 ) { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("value"); -#else - throw new ArgumentOutOfRangeException("value", "Cannot be less than zero"); -#endif - } - size = value; - } - } - - - /// - /// Get/set the entry's modification time. - /// - /// - /// The modification time is only accurate to within a second. - /// - /// Thrown when setting the date time to less than 1/1/1970. - public DateTime ModTime - { - get { return modTime; } - set { - if ( value < dateTime1970 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("value"); -#else - throw new ArgumentOutOfRangeException("value", "ModTime cannot be before Jan 1st 1970"); -#endif - } - modTime = new DateTime(value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second); - } - } - - - /// - /// Get the entry's checksum. This is only valid/updated after writing or reading an entry. - /// - public int Checksum - { - get { return checksum; } - } - - - /// - /// Get value of true if the header checksum is valid, false otherwise. - /// - public bool IsChecksumValid - { - get { return isChecksumValid; } - } - - - /// - /// Get/set the entry's type flag. - /// - public byte TypeFlag - { - get { return typeFlag; } - set { typeFlag = value; } - } - - - /// - /// The entry's link name. - /// - /// Thrown when attempting to set LinkName to null. - public string LinkName - { - get { return linkName; } - set { - if ( value == null ) { - throw new ArgumentNullException("value"); - } - linkName = value; - } - } - - - /// - /// Get/set the entry's magic tag. - /// - /// Thrown when attempting to set Magic to null. - public string Magic - { - get { return magic; } - set { - if ( value == null ) { - throw new ArgumentNullException("value"); - } - magic = value; - } - } - - - /// - /// The entry's version. - /// - /// Thrown when attempting to set Version to null. - public string Version - { - get { - return version; - } - - set { - if ( value == null ) { - throw new ArgumentNullException("value"); - } - version = value; - } - } - - - /// - /// The entry's user name. - /// - public string UserName - { - get { return userName; } - set { - if (value != null) { - userName = value.Substring(0, Math.Min(UNAMELEN, value.Length)); - } - else { -#if NETCF_1_0 || NETCF_2_0 - string currentUser = "PocketPC"; -#else - string currentUser = Environment.UserName; -#endif - if (currentUser.Length > UNAMELEN) { - currentUser = currentUser.Substring(0, UNAMELEN); - } - userName = currentUser; - } - } - } - - - /// - /// Get/set the entry's group name. - /// - /// - /// This is only directly relevant to unix systems. - /// - public string GroupName - { - get { return groupName; } - set { - if ( value == null ) { - groupName = "None"; - } - else { - groupName = value; - } - } - } - - - /// - /// Get/set the entry's major device number. - /// - public int DevMajor - { - get { return devMajor; } - set { devMajor = value; } - } - - - /// - /// Get/set the entry's minor device number. - /// - public int DevMinor - { - get { return devMinor; } - set { devMinor = value; } - } - - #endregion - - #region ICloneable Members - /// - /// Create a new that is a copy of the current instance. - /// - /// A new that is a copy of the current instance. - public object Clone() - { - return MemberwiseClone(); - } - #endregion - - /// - /// Parse TarHeader information from a header buffer. - /// - /// - /// The tar entry header buffer to get information from. - /// - public void ParseBuffer(byte[] header) - { - if ( header == null ) - { - throw new ArgumentNullException("header"); - } - - int offset = 0; - - name = TarHeader.ParseName(header, offset, TarHeader.NAMELEN).ToString(); - offset += TarHeader.NAMELEN; - - mode = (int)TarHeader.ParseOctal(header, offset, TarHeader.MODELEN); - offset += TarHeader.MODELEN; - - UserId = (int)TarHeader.ParseOctal(header, offset, TarHeader.UIDLEN); - offset += TarHeader.UIDLEN; - - GroupId = (int)TarHeader.ParseOctal(header, offset, TarHeader.GIDLEN); - offset += TarHeader.GIDLEN; - - Size = TarHeader.ParseOctal(header, offset, TarHeader.SIZELEN); - offset += TarHeader.SIZELEN; - - ModTime = GetDateTimeFromCTime(TarHeader.ParseOctal(header, offset, TarHeader.MODTIMELEN)); - offset += TarHeader.MODTIMELEN; - - checksum = (int)TarHeader.ParseOctal(header, offset, TarHeader.CHKSUMLEN); - offset += TarHeader.CHKSUMLEN; - - TypeFlag = header[ offset++ ]; - - LinkName = TarHeader.ParseName(header, offset, TarHeader.NAMELEN).ToString(); - offset += TarHeader.NAMELEN; - - Magic = TarHeader.ParseName(header, offset, TarHeader.MAGICLEN).ToString(); - offset += TarHeader.MAGICLEN; - - Version = TarHeader.ParseName(header, offset, TarHeader.VERSIONLEN).ToString(); - offset += TarHeader.VERSIONLEN; - - UserName = TarHeader.ParseName(header, offset, TarHeader.UNAMELEN).ToString(); - offset += TarHeader.UNAMELEN; - - GroupName = TarHeader.ParseName(header, offset, TarHeader.GNAMELEN).ToString(); - offset += TarHeader.GNAMELEN; - - DevMajor = (int)TarHeader.ParseOctal(header, offset, TarHeader.DEVLEN); - offset += TarHeader.DEVLEN; - - DevMinor = (int)TarHeader.ParseOctal(header, offset, TarHeader.DEVLEN); - - // Fields past this point not currently parsed or used... - - isChecksumValid = Checksum == TarHeader.MakeCheckSum(header); - } - - /// - /// 'Write' header information to buffer provided, updating the check sum. - /// - /// output buffer for header information - public void WriteHeader(byte[] outBuffer) - { - if ( outBuffer == null ) - { - throw new ArgumentNullException("outBuffer"); - } - - int offset = 0; - - offset = GetNameBytes(Name, outBuffer, offset, NAMELEN); - offset = GetOctalBytes(mode, outBuffer, offset, MODELEN); - offset = GetOctalBytes(UserId, outBuffer, offset, UIDLEN); - offset = GetOctalBytes(GroupId, outBuffer, offset, GIDLEN); - - offset = GetLongOctalBytes(Size, outBuffer, offset, SIZELEN); - offset = GetLongOctalBytes(GetCTime(ModTime), outBuffer, offset, MODTIMELEN); - - int csOffset = offset; - for (int c = 0; c < CHKSUMLEN; ++c) - { - outBuffer[offset++] = (byte)' '; - } - - outBuffer[offset++] = TypeFlag; - - offset = GetNameBytes(LinkName, outBuffer, offset, NAMELEN); - offset = GetAsciiBytes(Magic, 0, outBuffer, offset, MAGICLEN); - offset = GetNameBytes(Version, outBuffer, offset, VERSIONLEN); - offset = GetNameBytes(UserName, outBuffer, offset, UNAMELEN); - offset = GetNameBytes(GroupName, outBuffer, offset, GNAMELEN); - - if ((TypeFlag == LF_CHR) || (TypeFlag == LF_BLK)) - { - offset = GetOctalBytes(DevMajor, outBuffer, offset, DEVLEN); - offset = GetOctalBytes(DevMinor, outBuffer, offset, DEVLEN); - } - - for ( ; offset < outBuffer.Length; ) - { - outBuffer[offset++] = 0; - } - - checksum = ComputeCheckSum(outBuffer); - - GetCheckSumOctalBytes(checksum, outBuffer, csOffset, CHKSUMLEN); - isChecksumValid = true; - } - - /// - /// Get a hash code for the current object. - /// - /// A hash code for the current object. - public override int GetHashCode() - { - return Name.GetHashCode(); - } - - /// - /// Determines if this instance is equal to the specified object. - /// - /// The object to compare with. - /// true if the objects are equal, false otherwise. - public override bool Equals(object obj) - { - TarHeader localHeader = obj as TarHeader; - - bool result; - if ( localHeader != null ) - { - result = (name == localHeader.name) - && (mode == localHeader.mode) - && (UserId == localHeader.UserId) - && (GroupId == localHeader.GroupId) - && (Size == localHeader.Size) - && (ModTime == localHeader.ModTime) - && (Checksum == localHeader.Checksum) - && (TypeFlag == localHeader.TypeFlag) - && (LinkName == localHeader.LinkName) - && (Magic == localHeader.Magic) - && (Version == localHeader.Version) - && (UserName == localHeader.UserName) - && (GroupName == localHeader.GroupName) - && (DevMajor == localHeader.DevMajor) - && (DevMinor == localHeader.DevMinor); - } - else - { - result = false; - } - return result; - } - - /// - /// Set defaults for values used when constructing a TarHeader instance. - /// - /// Value to apply as a default for userId. - /// Value to apply as a default for userName. - /// Value to apply as a default for groupId. - /// Value to apply as a default for groupName. - static internal void SetValueDefaults(int userId, string userName, int groupId, string groupName) - { - defaultUserId = userIdAsSet = userId; - defaultUser = userNameAsSet = userName; - defaultGroupId = groupIdAsSet = groupId; - defaultGroupName = groupNameAsSet = groupName; - } - - static internal void RestoreSetValues() - { - defaultUserId = userIdAsSet; - defaultUser = userNameAsSet; - defaultGroupId = groupIdAsSet; - defaultGroupName = groupNameAsSet; - } - - /// - /// Parse an octal string from a header buffer. - /// - /// The header buffer from which to parse. - /// The offset into the buffer from which to parse. - /// The number of header bytes to parse. - /// The long equivalent of the octal string. - static public long ParseOctal(byte[] header, int offset, int length) - { - if ( header == null ) { - throw new ArgumentNullException("header"); - } - - long result = 0; - bool stillPadding = true; - - int end = offset + length; - for (int i = offset; i < end ; ++i) { - if (header[i] == 0) { - break; - } - - if (header[i] == (byte)' ' || header[i] == '0') { - if (stillPadding) { - continue; - } - - if (header[i] == (byte)' ') { - break; - } - } - - stillPadding = false; - - result = (result << 3) + (header[i] - '0'); - } - - return result; - } - - /// - /// Parse a name from a header buffer. - /// - /// - /// The header buffer from which to parse. - /// - /// - /// The offset into the buffer from which to parse. - /// - /// - /// The number of header bytes to parse. - /// - /// - /// The name parsed. - /// - static public StringBuilder ParseName(byte[] header, int offset, int length) - { - if ( header == null ) { - throw new ArgumentNullException("header"); - } - - if ( offset < 0 ) { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("offset"); -#else - throw new ArgumentOutOfRangeException("offset", "Cannot be less than zero"); -#endif - } - - if ( length < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("length"); -#else - throw new ArgumentOutOfRangeException("length", "Cannot be less than zero"); -#endif - } - - if ( offset + length > header.Length ) - { - throw new ArgumentException("Exceeds header size", "length"); - } - - StringBuilder result = new StringBuilder(length); - - for (int i = offset; i < offset + length; ++i) { - if (header[i] == 0) { - break; - } - result.Append((char)header[i]); - } - - return result; - } - - /// - /// Add name to the buffer as a collection of bytes - /// - /// The name to add - /// The offset of the first character - /// The buffer to add to - /// The index of the first byte to add - /// The number of characters/bytes to add - /// The next free index in the - public static int GetNameBytes(StringBuilder name, int nameOffset, byte[] buffer, int bufferOffset, int length) - { - if ( name == null ) { - throw new ArgumentNullException("name"); - } - - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - return GetNameBytes(name.ToString(), nameOffset, buffer, bufferOffset, length); - } - - /// - /// Add name to the buffer as a collection of bytes - /// - /// The name to add - /// The offset of the first character - /// The buffer to add to - /// The index of the first byte to add - /// The number of characters/bytes to add - /// The next free index in the - public static int GetNameBytes(string name, int nameOffset, byte[] buffer, int bufferOffset, int length) - { - if ( name == null ) - { - throw new ArgumentNullException("name"); - } - - if ( buffer == null ) - { - throw new ArgumentNullException("buffer"); - } - - int i; - - for (i = 0 ; i < length - 1 && nameOffset + i < name.Length; ++i) { - buffer[bufferOffset + i] = (byte)name[nameOffset + i]; - } - - for (; i < length ; ++i) { - buffer[bufferOffset + i] = 0; - } - - return bufferOffset + length; - } - - /// - /// Add an entry name to the buffer - /// - /// - /// The name to add - /// - /// - /// The buffer to add to - /// - /// - /// The offset into the buffer from which to start adding - /// - /// - /// The number of header bytes to add - /// - /// - /// The index of the next free byte in the buffer - /// - public static int GetNameBytes(StringBuilder name, byte[] buffer, int offset, int length) - { - - if ( name == null ) { - throw new ArgumentNullException("name"); - } - - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - return GetNameBytes(name.ToString(), 0, buffer, offset, length); - } - - /// - /// Add an entry name to the buffer - /// - /// The name to add - /// The buffer to add to - /// The offset into the buffer from which to start adding - /// The number of header bytes to add - /// The index of the next free byte in the buffer - public static int GetNameBytes(string name, byte[] buffer, int offset, int length) - { - - if ( name == null ) { - throw new ArgumentNullException("name"); - } - - if ( buffer == null ) - { - throw new ArgumentNullException("buffer"); - } - - return GetNameBytes(name, 0, buffer, offset, length); - } - - /// - /// Add a string to a buffer as a collection of ascii bytes. - /// - /// The string to add - /// The offset of the first character to add. - /// The buffer to add to. - /// The offset to start adding at. - /// The number of ascii characters to add. - /// The next free index in the buffer. - public static int GetAsciiBytes(string toAdd, int nameOffset, byte[] buffer, int bufferOffset, int length ) - { - if ( toAdd == null ) { - throw new ArgumentNullException("toAdd"); - } - - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - for (int i = 0 ; i < length && nameOffset + i < toAdd.Length; ++i) - { - buffer[bufferOffset + i] = (byte)toAdd[nameOffset + i]; - } - return bufferOffset + length; - } - - /// - /// Put an octal representation of a value into a buffer - /// - /// - /// the value to be converted to octal - /// - /// - /// buffer to store the octal string - /// - /// - /// The offset into the buffer where the value starts - /// - /// - /// The length of the octal string to create - /// - /// - /// The offset of the character next byte after the octal string - /// - public static int GetOctalBytes(long value, byte[] buffer, int offset, int length) - { - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - int localIndex = length - 1; - - // Either a space or null is valid here. We use NULL as per GNUTar - buffer[offset + localIndex] = 0; - --localIndex; - - if (value > 0) { - for ( long v = value; (localIndex >= 0) && (v > 0); --localIndex ) { - buffer[offset + localIndex] = (byte)((byte)'0' + (byte)(v & 7)); - v >>= 3; - } - } - - for ( ; localIndex >= 0; --localIndex ) { - buffer[offset + localIndex] = (byte)'0'; - } - - return offset + length; - } - - /// - /// Put an octal representation of a value into a buffer - /// - /// Value to be convert to octal - /// The buffer to update - /// The offset into the buffer to store the value - /// The length of the octal string - /// Index of next byte - public static int GetLongOctalBytes(long value, byte[] buffer, int offset, int length) - { - return GetOctalBytes(value, buffer, offset, length); - } - - /// - /// Add the checksum integer to header buffer. - /// - /// - /// The header buffer to set the checksum for - /// The offset into the buffer for the checksum - /// The number of header bytes to update. - /// It's formatted differently from the other fields: it has 6 digits, a - /// null, then a space -- rather than digits, a space, then a null. - /// The final space is already there, from checksumming - /// - /// The modified buffer offset - static int GetCheckSumOctalBytes(long value, byte[] buffer, int offset, int length) - { - TarHeader.GetOctalBytes(value, buffer, offset, length - 1); - return offset + length; - } - - /// - /// Compute the checksum for a tar entry header. - /// The checksum field must be all spaces prior to this happening - /// - /// The tar entry's header buffer. - /// The computed checksum. - static int ComputeCheckSum(byte[] buffer) - { - int sum = 0; - for (int i = 0; i < buffer.Length; ++i) { - sum += buffer[i]; - } - return sum; - } - - /// - /// Make a checksum for a tar entry ignoring the checksum contents. - /// - /// The tar entry's header buffer. - /// The checksum for the buffer - static int MakeCheckSum(byte[] buffer) - { - int sum = 0; - for ( int i = 0; i < CHKSUMOFS; ++i ) - { - sum += buffer[i]; - } - - for ( int i = 0; i < TarHeader.CHKSUMLEN; ++i) - { - sum += (byte)' '; - } - - for (int i = CHKSUMOFS + CHKSUMLEN; i < buffer.Length; ++i) - { - sum += buffer[i]; - } - return sum; - } - - static int GetCTime(System.DateTime dateTime) - { - return unchecked((int)((dateTime.Ticks - dateTime1970.Ticks) / timeConversionFactor)); - } - - static DateTime GetDateTimeFromCTime(long ticks) - { - DateTime result; - - try { - result = new DateTime(dateTime1970.Ticks + ticks * timeConversionFactor); - } - catch(ArgumentOutOfRangeException) { - result = dateTime1970; - } - return result; - } - - #region Instance Fields - string name; - int mode; - int userId; - int groupId; - long size; - DateTime modTime; - int checksum; - bool isChecksumValid; - byte typeFlag; - string linkName; - string magic; - string version; - string userName; - string groupName; - int devMajor; - int devMinor; - #endregion - - #region Class Fields - // Values used during recursive operations. - static internal int userIdAsSet; - static internal int groupIdAsSet; - static internal string userNameAsSet; - static internal string groupNameAsSet = "None"; - - static internal int defaultUserId; - static internal int defaultGroupId; - static internal string defaultGroupName = "None"; - static internal string defaultUser; - #endregion - } -} - -/* The original Java file had this header: - * -** Authored by Timothy Gerard Endres -** -** -** This work has been placed into the public domain. -** You may use this work in any way and for any purpose you wish. -** -** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, -** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR -** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY -** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR -** REDISTRIBUTION OF THIS SOFTWARE. -** -*/ diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarInputStream.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarInputStream.cs deleted file mode 100644 index 436b0027aa..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarInputStream.cs +++ /dev/null @@ -1,695 +0,0 @@ -// TarInputStream.cs -// -// Copyright (C) 2001 Mike Krueger -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; -using System.Text; - -namespace ICSharpCode.SharpZipLib.Tar -{ - - /// - /// The TarInputStream reads a UNIX tar archive as an InputStream. - /// methods are provided to position at each successive entry in - /// the archive, and the read each entry as a normal input stream - /// using read(). - /// - public class TarInputStream : Stream - { - #region Constructors - /// - /// Construct a TarInputStream with default block factor - /// - /// stream to source data from - public TarInputStream(Stream inputStream) - : this(inputStream, TarBuffer.DefaultBlockFactor) - { - } - - /// - /// Construct a TarInputStream with user specified block factor - /// - /// stream to source data from - /// block factor to apply to archive - public TarInputStream(Stream inputStream, int blockFactor) - { - this.inputStream = inputStream; - tarBuffer = TarBuffer.CreateInputTarBuffer(inputStream, blockFactor); - } - - #endregion - - /// - /// Get/set flag indicating ownership of the underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return tarBuffer.IsStreamOwner; } - set { tarBuffer.IsStreamOwner = value; } - } - - #region Stream Overrides - /// - /// Gets a value indicating whether the current stream supports reading - /// - public override bool CanRead - { - get { - return inputStream.CanRead; - } - } - - /// - /// Gets a value indicating whether the current stream supports seeking - /// This property always returns false. - /// - public override bool CanSeek { - get { - return false; - } - } - - /// - /// Gets a value indicating if the stream supports writing. - /// This property always returns false. - /// - public override bool CanWrite { - get { - return false; - } - } - - /// - /// The length in bytes of the stream - /// - public override long Length { - get { - return inputStream.Length; - } - } - - /// - /// Gets or sets the position within the stream. - /// Setting the Position is not supported and throws a NotSupportedExceptionNotSupportedException - /// - /// Any attempt to set position - public override long Position { - get { - return inputStream.Position; - } - set { - throw new NotSupportedException("TarInputStream Seek not supported"); - } - } - - /// - /// Flushes the baseInputStream - /// - public override void Flush() - { - inputStream.Flush(); - } - - /// - /// Set the streams position. This operation is not supported and will throw a NotSupportedException - /// - /// The offset relative to the origin to seek to. - /// The to start seeking from. - /// The new position in the stream. - /// Any access - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("TarInputStream Seek not supported"); - } - - /// - /// Sets the length of the stream - /// This operation is not supported and will throw a NotSupportedException - /// - /// The new stream length. - /// Any access - public override void SetLength(long value) - { - throw new NotSupportedException("TarInputStream SetLength not supported"); - } - - /// - /// Writes a block of bytes to this stream using data from a buffer. - /// This operation is not supported and will throw a NotSupportedException - /// - /// The buffer containing bytes to write. - /// The offset in the buffer of the frist byte to write. - /// The number of bytes to write. - /// Any access - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException("TarInputStream Write not supported"); - } - - /// - /// Writes a byte to the current position in the file stream. - /// This operation is not supported and will throw a NotSupportedException - /// - /// The byte value to write. - /// Any access - public override void WriteByte(byte value) - { - throw new NotSupportedException("TarInputStream WriteByte not supported"); - } - /// - /// Reads a byte from the current tar archive entry. - /// - /// A byte cast to an int; -1 if the at the end of the stream. - public override int ReadByte() - { - byte[] oneByteBuffer = new byte[1]; - int num = Read(oneByteBuffer, 0, 1); - if (num <= 0) - { - // return -1 to indicate that no byte was read. - return -1; - } - return oneByteBuffer[0]; - } - - /// - /// Reads bytes from the current tar archive entry. - /// - /// This method is aware of the boundaries of the current - /// entry in the archive and will deal with them appropriately - /// - /// - /// The buffer into which to place bytes read. - /// - /// - /// The offset at which to place bytes read. - /// - /// - /// The number of bytes to read. - /// - /// - /// The number of bytes read, or 0 at end of stream/EOF. - /// - public override int Read(byte[] buffer, int offset, int count) - { - if ( buffer == null ) - { - throw new ArgumentNullException("buffer"); - } - - int totalRead = 0; - - if (entryOffset >= entrySize) - { - return 0; - } - - long numToRead = count; - - if ((numToRead + entryOffset) > entrySize) - { - numToRead = entrySize - entryOffset; - } - - if (readBuffer != null) - { - int sz = (numToRead > readBuffer.Length) ? readBuffer.Length : (int)numToRead; - - Array.Copy(readBuffer, 0, buffer, offset, sz); - - if (sz >= readBuffer.Length) - { - readBuffer = null; - } - else - { - int newLen = readBuffer.Length - sz; - byte[] newBuf = new byte[newLen]; - Array.Copy(readBuffer, sz, newBuf, 0, newLen); - readBuffer = newBuf; - } - - totalRead += sz; - numToRead -= sz; - offset += sz; - } - - while (numToRead > 0) - { - byte[] rec = tarBuffer.ReadBlock(); - if (rec == null) - { - // Unexpected EOF! - throw new TarException("unexpected EOF with " + numToRead + " bytes unread"); - } - - int sz = (int)numToRead; - int recLen = rec.Length; - - if (recLen > sz) - { - Array.Copy(rec, 0, buffer, offset, sz); - readBuffer = new byte[recLen - sz]; - Array.Copy(rec, sz, readBuffer, 0, recLen - sz); - } - else - { - sz = recLen; - Array.Copy(rec, 0, buffer, offset, recLen); - } - - totalRead += sz; - numToRead -= sz; - offset += sz; - } - - entryOffset += totalRead; - - return totalRead; - } - - /// - /// Closes this stream. Calls the TarBuffer's close() method. - /// The underlying stream is closed by the TarBuffer. - /// - public override void Close() - { - tarBuffer.Close(); - } - - #endregion - - /// - /// Set the entry factory for this instance. - /// - /// The factory for creating new entries - public void SetEntryFactory(IEntryFactory factory) - { - entryFactory = factory; - } - - /// - /// Get the record size being used by this stream's TarBuffer. - /// - public int RecordSize - { - get { return tarBuffer.RecordSize; } - } - - /// - /// Get the record size being used by this stream's TarBuffer. - /// - /// - /// TarBuffer record size. - /// - [Obsolete("Use RecordSize property instead")] - public int GetRecordSize() - { - return tarBuffer.RecordSize; - } - - /// - /// Get the available data that can be read from the current - /// entry in the archive. This does not indicate how much data - /// is left in the entire archive, only in the current entry. - /// This value is determined from the entry's size header field - /// and the amount of data already read from the current entry. - /// - /// - /// The number of available bytes for the current entry. - /// - public long Available { - get { - return entrySize - entryOffset; - } - } - - /// - /// Skip bytes in the input buffer. This skips bytes in the - /// current entry's data, not the entire archive, and will - /// stop at the end of the current entry's data if the number - /// to skip extends beyond that point. - /// - /// - /// The number of bytes to skip. - /// - public void Skip(long skipCount) - { - // TODO: REVIEW efficiency of TarInputStream.Skip - // This is horribly inefficient, but it ensures that we - // properly skip over bytes via the TarBuffer... - // - byte[] skipBuf = new byte[8 * 1024]; - - for (long num = skipCount; num > 0;) { - int toRead = num > skipBuf.Length ? skipBuf.Length : (int)num; - int numRead = Read(skipBuf, 0, toRead); - - if (numRead == -1) { - break; - } - - num -= numRead; - } - } - - /// - /// Return a value of true if marking is supported; false otherwise. - /// - /// Currently marking is not supported, the return value is always false. - public bool IsMarkSupported { - get { - return false; - } - } - - /// - /// Since we do not support marking just yet, we do nothing. - /// - /// - /// The limit to mark. - /// - public void Mark(int markLimit) - { - } - - /// - /// Since we do not support marking just yet, we do nothing. - /// - public void Reset() - { - } - - /// - /// Get the next entry in this tar archive. This will skip - /// over any remaining data in the current entry, if there - /// is one, and place the input stream at the header of the - /// next entry, and read the header and instantiate a new - /// TarEntry from the header bytes and return that entry. - /// If there are no more entries in the archive, null will - /// be returned to indicate that the end of the archive has - /// been reached. - /// - /// - /// The next TarEntry in the archive, or null. - /// - public TarEntry GetNextEntry() - { - if (hasHitEOF) { - return null; - } - - if (currentEntry != null) { - SkipToNextEntry(); - } - - byte[] headerBuf = tarBuffer.ReadBlock(); - - if (headerBuf == null) { - hasHitEOF = true; - } else if (TarBuffer.IsEndOfArchiveBlock(headerBuf)) { - hasHitEOF = true; - } - - if (hasHitEOF) { - currentEntry = null; - } else { - try { - TarHeader header = new TarHeader(); - header.ParseBuffer(headerBuf); - if ( !header.IsChecksumValid ) - { - throw new TarException("Header checksum is invalid"); - } - this.entryOffset = 0; - this.entrySize = header.Size; - - StringBuilder longName = null; - - if (header.TypeFlag == TarHeader.LF_GNU_LONGNAME) { - - byte[] nameBuffer = new byte[TarBuffer.BlockSize]; - long numToRead = this.entrySize; - - longName = new StringBuilder(); - - while (numToRead > 0) { - int numRead = this.Read(nameBuffer, 0, (numToRead > nameBuffer.Length ? nameBuffer.Length : (int)numToRead)); - - if (numRead == -1) { - throw new InvalidHeaderException("Failed to read long name entry"); - } - - longName.Append(TarHeader.ParseName(nameBuffer, 0, numRead).ToString()); - numToRead -= numRead; - } - - SkipToNextEntry(); - headerBuf = this.tarBuffer.ReadBlock(); - } else if (header.TypeFlag == TarHeader.LF_GHDR) { // POSIX global extended header - // Ignore things we dont understand completely for now - SkipToNextEntry(); - headerBuf = this.tarBuffer.ReadBlock(); - } else if (header.TypeFlag == TarHeader.LF_XHDR) { // POSIX extended header - // Ignore things we dont understand completely for now - SkipToNextEntry(); - headerBuf = this.tarBuffer.ReadBlock(); - } else if (header.TypeFlag == TarHeader.LF_GNU_VOLHDR) { - // TODO: could show volume name when verbose - SkipToNextEntry(); - headerBuf = this.tarBuffer.ReadBlock(); - } else if (header.TypeFlag != TarHeader.LF_NORMAL && - header.TypeFlag != TarHeader.LF_OLDNORM && - header.TypeFlag != TarHeader.LF_DIR) { - // Ignore things we dont understand completely for now - SkipToNextEntry(); - headerBuf = tarBuffer.ReadBlock(); - } - - if (entryFactory == null) { - currentEntry = new TarEntry(headerBuf); - if (longName != null) { - currentEntry.Name = longName.ToString(); - } - } else { - currentEntry = entryFactory.CreateEntry(headerBuf); - } - - // Magic was checked here for 'ustar' but there are multiple valid possibilities - // so this is not done anymore. - - entryOffset = 0; - - // TODO: Review How do we resolve this discrepancy?! - entrySize = this.currentEntry.Size; - } catch (InvalidHeaderException ex) { - entrySize = 0; - entryOffset = 0; - currentEntry = null; - string errorText = string.Format("Bad header in record {0} block {1} {2}", - tarBuffer.CurrentRecord, tarBuffer.CurrentBlock, ex.Message); - throw new InvalidHeaderException(errorText); - } - } - return currentEntry; - } - - /// - /// Copies the contents of the current tar archive entry directly into - /// an output stream. - /// - /// - /// The OutputStream into which to write the entry's data. - /// - public void CopyEntryContents(Stream outputStream) - { - byte[] tempBuffer = new byte[32 * 1024]; - - while (true) { - int numRead = Read(tempBuffer, 0, tempBuffer.Length); - if (numRead <= 0) { - break; - } - outputStream.Write(tempBuffer, 0, numRead); - } - } - - void SkipToNextEntry() - { - long numToSkip = entrySize - entryOffset; - - if (numToSkip > 0) - { - Skip(numToSkip); - } - - readBuffer = null; - } - - /// - /// This interface is provided, along with the method , to allow - /// the programmer to have their own subclass instantiated for the - /// entries return from . - /// - public interface IEntryFactory - { - /// - /// Create an entry based on name alone - /// - /// - /// Name of the new EntryPointNotFoundException to create - /// - /// created TarEntry or descendant class - TarEntry CreateEntry(string name); - - /// - /// Create an instance based on an actual file - /// - /// - /// Name of file to represent in the entry - /// - /// - /// Created TarEntry or descendant class - /// - TarEntry CreateEntryFromFile(string fileName); - - /// - /// Create a tar entry based on the header information passed - /// - /// - /// Buffer containing header information to create an an entry from. - /// - /// - /// Created TarEntry or descendant class - /// - TarEntry CreateEntry(byte[] headerBuffer); - } - - /// - /// Standard entry factory class creating instances of the class TarEntry - /// - public class EntryFactoryAdapter : IEntryFactory - { - /// - /// Create a based on named - /// - /// The name to use for the entry - /// A new - public TarEntry CreateEntry(string name) - { - return TarEntry.CreateTarEntry(name); - } - - /// - /// Create a tar entry with details obtained from file - /// - /// The name of the file to retrieve details from. - /// A new - public TarEntry CreateEntryFromFile(string fileName) - { - return TarEntry.CreateEntryFromFile(fileName); - } - - /// - /// Create an entry based on details in header - /// - /// The buffer containing entry details. - /// A new - public TarEntry CreateEntry(byte[] headerBuffer) - { - return new TarEntry(headerBuffer); - } - } - - #region Instance Fields - /// - /// Flag set when last block has been read - /// - protected bool hasHitEOF; - - /// - /// Size of this entry as recorded in header - /// - protected long entrySize; - - /// - /// Number of bytes read for this entry so far - /// - protected long entryOffset; - - /// - /// Buffer used with calls to Read() - /// - protected byte[] readBuffer; - - /// - /// Working buffer - /// - protected TarBuffer tarBuffer; - - /// - /// Current entry being read - /// - TarEntry currentEntry; - - /// - /// Factory used to create TarEntry or descendant class instance - /// - protected IEntryFactory entryFactory; - - /// - /// Stream used as the source of input data. - /// - readonly Stream inputStream; - #endregion - } -} - -/* The original Java file had this header: - ** Authored by Timothy Gerard Endres - ** - ** - ** This work has been placed into the public domain. - ** You may use this work in any way and for any purpose you wish. - ** - ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, - ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR - ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY - ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR - ** REDISTRIBUTION OF THIS SOFTWARE. - ** - */ - diff --git a/Users/Orvid/Orvid.Compression/TODO/Tar/TarOutputStream.cs b/Users/Orvid/Orvid.Compression/TODO/Tar/TarOutputStream.cs deleted file mode 100644 index fcac26fa6b..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Tar/TarOutputStream.cs +++ /dev/null @@ -1,525 +0,0 @@ -// TarOutputStream.cs -// -// Copyright (C) 2001 Mike Krueger -// Copyright 2005 John Reilly -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// -// Linking this library statically or dynamically with other modules is -// making a combined work based on this library. Thus, the terms and -// conditions of the GNU General Public License cover the whole -// combination. -// -// As a special exception, the copyright holders of this library give you -// permission to link this library with independent modules to produce an -// executable, regardless of the license terms of these independent -// modules, and to copy and distribute the resulting executable under -// terms of your choice, provided that you also meet, for each linked -// independent module, the terms and conditions of the license of that -// module. An independent module is a module which is not derived from -// or based on this library. If you modify this library, you may extend -// this exception to your version of the library, but you are not -// obligated to do so. If you do not wish to do so, delete this -// exception statement from your version. - -using System; -using System.IO; - -namespace ICSharpCode.SharpZipLib.Tar -{ - - /// - /// The TarOutputStream writes a UNIX tar archive as an OutputStream. - /// Methods are provided to put entries, and then write their contents - /// by writing to this stream using write(). - /// - /// public - public class TarOutputStream : Stream - { - #region Constructors - /// - /// Construct TarOutputStream using default block factor - /// - /// stream to write to - public TarOutputStream(Stream outputStream) - : this(outputStream, TarBuffer.DefaultBlockFactor) - { - } - - /// - /// Construct TarOutputStream with user specified block factor - /// - /// stream to write to - /// blocking factor - public TarOutputStream(Stream outputStream, int blockFactor) - { - if ( outputStream == null ) - { - throw new ArgumentNullException("outputStream"); - } - - this.outputStream = outputStream; - buffer = TarBuffer.CreateOutputTarBuffer(outputStream, blockFactor); - - assemblyBuffer = new byte[TarBuffer.BlockSize]; - blockBuffer = new byte[TarBuffer.BlockSize]; - } - #endregion - - /// - /// Get/set flag indicating ownership of the underlying stream. - /// When the flag is true will close the underlying stream also. - /// - public bool IsStreamOwner - { - get { return buffer.IsStreamOwner; } - set { buffer.IsStreamOwner = value; } - } - - /// - /// true if the stream supports reading; otherwise, false. - /// - public override bool CanRead - { - get - { - return outputStream.CanRead; - } - } - - /// - /// true if the stream supports seeking; otherwise, false. - /// - public override bool CanSeek - { - get - { - return outputStream.CanSeek; - } - } - - /// - /// true if stream supports writing; otherwise, false. - /// - public override bool CanWrite - { - get - { - return outputStream.CanWrite; - } - } - - /// - /// length of stream in bytes - /// - public override long Length - { - get - { - return outputStream.Length; - } - } - - /// - /// gets or sets the position within the current stream. - /// - public override long Position - { - get - { - return outputStream.Position; - } - set - { - outputStream.Position = value; - } - } - - /// - /// set the position within the current stream - /// - /// The offset relative to the to seek to - /// The to seek from. - /// The new position in the stream. - public override long Seek(long offset, SeekOrigin origin) - { - return outputStream.Seek(offset, origin); - } - - /// - /// Set the length of the current stream - /// - /// The new stream length. - public override void SetLength(long value) - { - outputStream.SetLength(value); - } - - /// - /// Read a byte from the stream and advance the position within the stream - /// by one byte or returns -1 if at the end of the stream. - /// - /// The byte value or -1 if at end of stream - public override int ReadByte() - { - return outputStream.ReadByte(); - } - - /// - /// read bytes from the current stream and advance the position within the - /// stream by the number of bytes read. - /// - /// The buffer to store read bytes in. - /// The index into the buffer to being storing bytes at. - /// The desired number of bytes to read. - /// The total number of bytes read, or zero if at the end of the stream. - /// The number of bytes may be less than the count - /// requested if data is not avialable. - public override int Read(byte[] buffer, int offset, int count) - { - return outputStream.Read(buffer, offset, count); - } - - /// - /// All buffered data is written to destination - /// - public override void Flush() - { - outputStream.Flush(); - } - - /// - /// Ends the TAR archive without closing the underlying OutputStream. - /// The result is that the EOF block of nulls is written. - /// - public void Finish() - { - if ( IsEntryOpen ) - { - CloseEntry(); - } - WriteEofBlock(); - } - - /// - /// Ends the TAR archive and closes the underlying OutputStream. - /// - /// This means that Finish() is called followed by calling the - /// TarBuffer's Close(). - public override void Close() - { - if ( !isClosed ) - { - isClosed = true; - Finish(); - buffer.Close(); - } - } - - /// - /// Get the record size being used by this stream's TarBuffer. - /// - public int RecordSize - { - get { return buffer.RecordSize; } - } - - /// - /// Get the record size being used by this stream's TarBuffer. - /// - /// - /// The TarBuffer record size. - /// - [Obsolete("Use RecordSize property instead")] - public int GetRecordSize() - { - return buffer.RecordSize; - } - - /// - /// Get a value indicating wether an entry is open, requiring more data to be written. - /// - bool IsEntryOpen - { - get { return (currBytes < currSize); } - - } - - /// - /// Put an entry on the output stream. This writes the entry's - /// header and positions the output stream for writing - /// the contents of the entry. Once this method is called, the - /// stream is ready for calls to write() to write the entry's - /// contents. Once the contents are written, closeEntry() - /// MUST be called to ensure that all buffered data - /// is completely written to the output stream. - /// - /// - /// The TarEntry to be written to the archive. - /// - public void PutNextEntry(TarEntry entry) - { - if ( entry == null ) { - throw new ArgumentNullException("entry"); - } - - if (entry.TarHeader.Name.Length >= TarHeader.NAMELEN) { - TarHeader longHeader = new TarHeader(); - longHeader.TypeFlag = TarHeader.LF_GNU_LONGNAME; - longHeader.Name = longHeader.Name + "././@LongLink"; - longHeader.UserId = 0; - longHeader.GroupId = 0; - longHeader.GroupName = ""; - longHeader.UserName = ""; - longHeader.LinkName = ""; - longHeader.Size = entry.TarHeader.Name.Length; - - longHeader.WriteHeader(blockBuffer); - buffer.WriteBlock(blockBuffer); // Add special long filename header block - - int nameCharIndex = 0; - - while (nameCharIndex < entry.TarHeader.Name.Length) { - Array.Clear(blockBuffer, 0, blockBuffer.Length); - TarHeader.GetAsciiBytes(entry.TarHeader.Name, nameCharIndex, this.blockBuffer, 0, TarBuffer.BlockSize); - nameCharIndex += TarBuffer.BlockSize; - buffer.WriteBlock(blockBuffer); - } - } - - entry.WriteEntryHeader(blockBuffer); - buffer.WriteBlock(blockBuffer); - - currBytes = 0; - - currSize = entry.IsDirectory ? 0 : entry.Size; - } - - /// - /// Close an entry. This method MUST be called for all file - /// entries that contain data. The reason is that we must - /// buffer data written to the stream in order to satisfy - /// the buffer's block based writes. Thus, there may be - /// data fragments still being assembled that must be written - /// to the output stream before this entry is closed and the - /// next entry written. - /// - public void CloseEntry() - { - if (assemblyBufferLength > 0) { - Array.Clear(assemblyBuffer, assemblyBufferLength, assemblyBuffer.Length - assemblyBufferLength); - - buffer.WriteBlock(assemblyBuffer); - - currBytes += assemblyBufferLength; - assemblyBufferLength = 0; - } - - if (currBytes < currSize) { - string errorText = string.Format( - "Entry closed at '{0}' before the '{1}' bytes specified in the header were written", - currBytes, currSize); - throw new TarException(errorText); - } - } - - /// - /// Writes a byte to the current tar archive entry. - /// This method simply calls Write(byte[], int, int). - /// - /// - /// The byte to be written. - /// - public override void WriteByte(byte value) - { - Write(new byte[] { value }, 0, 1); - } - - /// - /// Writes bytes to the current tar archive entry. This method - /// is aware of the current entry and will throw an exception if - /// you attempt to write bytes past the length specified for the - /// current entry. The method is also (painfully) aware of the - /// record buffering required by TarBuffer, and manages buffers - /// that are not a multiple of recordsize in length, including - /// assembling records from small buffers. - /// - /// - /// The buffer to write to the archive. - /// - /// - /// The offset in the buffer from which to get bytes. - /// - /// - /// The number of bytes to write. - /// - public override void Write(byte[] buffer, int offset, int count) - { - if ( buffer == null ) { - throw new ArgumentNullException("buffer"); - } - - if ( offset < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("offset"); -#else - throw new ArgumentOutOfRangeException("offset", "Cannot be negative"); -#endif - } - - if ( buffer.Length - offset < count ) - { - throw new ArgumentException("offset and count combination is invalid"); - } - - if ( count < 0 ) - { -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", "Cannot be negative"); -#endif - } - - if ( (currBytes + count) > currSize ) { - string errorText = string.Format("request to write '{0}' bytes exceeds size in header of '{1}' bytes", - count, this.currSize); -#if NETCF_1_0 - throw new ArgumentOutOfRangeException("count"); -#else - throw new ArgumentOutOfRangeException("count", errorText); -#endif - } - - // - // We have to deal with assembly!!! - // The programmer can be writing little 32 byte chunks for all - // we know, and we must assemble complete blocks for writing. - // TODO REVIEW Maybe this should be in TarBuffer? Could that help to - // eliminate some of the buffer copying. - // - if (assemblyBufferLength > 0) { - if ((assemblyBufferLength + count ) >= blockBuffer.Length) { - int aLen = blockBuffer.Length - assemblyBufferLength; - - Array.Copy(assemblyBuffer, 0, blockBuffer, 0, assemblyBufferLength); - Array.Copy(buffer, offset, blockBuffer, assemblyBufferLength, aLen); - - this.buffer.WriteBlock(blockBuffer); - - currBytes += blockBuffer.Length; - - offset += aLen; - count -= aLen; - - assemblyBufferLength = 0; - } else { - Array.Copy(buffer, offset, assemblyBuffer, assemblyBufferLength, count); - offset += count; - assemblyBufferLength += count; - count -= count; - } - } - - // - // When we get here we have EITHER: - // o An empty "assembly" buffer. - // o No bytes to write (count == 0) - // - while (count > 0) { - if (count < blockBuffer.Length) { - Array.Copy(buffer, offset, assemblyBuffer, assemblyBufferLength, count); - assemblyBufferLength += count; - break; - } - - this.buffer.WriteBlock(buffer, offset); - - int bufferLength = blockBuffer.Length; - currBytes += bufferLength; - count -= bufferLength; - offset += bufferLength; - } - } - - /// - /// Write an EOF (end of archive) block to the tar archive. - /// An EOF block consists of all zeros. - /// - void WriteEofBlock() - { - Array.Clear(blockBuffer, 0, blockBuffer.Length); - buffer.WriteBlock(blockBuffer); - } - - #region Instance Fields - /// - /// bytes written for this entry so far - /// - long currBytes; - - /// - /// current 'Assembly' buffer length - /// - int assemblyBufferLength; - - /// - /// Flag indicating wether this instance has been closed or not. - /// - bool isClosed; - - /// - /// Size for the current entry - /// - protected long currSize; - - /// - /// single block working buffer - /// - protected byte[] blockBuffer; - - /// - /// 'Assembly' buffer used to assemble data before writing - /// - protected byte[] assemblyBuffer; - - /// - /// TarBuffer used to provide correct blocking factor - /// - protected TarBuffer buffer; - - /// - /// the destination stream for the archive contents - /// - protected Stream outputStream; - #endregion - } -} - -/* The original Java file had this header: - ** Authored by Timothy Gerard Endres - ** - ** - ** This work has been placed into the public domain. - ** You may use this work in any way and for any purpose you wish. - ** - ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, - ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR - ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY - ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR - ** REDISTRIBUTION OF THIS SOFTWARE. - ** - */ diff --git a/Users/Orvid/Orvid.Compression/TODO/Wilt/Wilt.cs b/Users/Orvid/Orvid.Compression/TODO/Wilt/Wilt.cs deleted file mode 100644 index 7b8b61f82d..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Wilt/Wilt.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.IO; - -namespace Orvid.Compression -{ - internal struct WiltRangeDecoder - { - public UInt32 Range; - public UInt32 Code; - public Stream Strm; - } - - internal class Wilt - { - static void InitRangeDecoder(WiltRangeDecoder self, Stream fh) - { - self.Range = 0xffffffff; - self.Code = 0; - self.Strm = fh; - - for (int i = 0; i < 4; i++) - self.Code = (UInt32)((self.Code << 8) | (uint)fh.ReadByte()); - } - - static void NormalizeRangeDecoder(WiltRangeDecoder self) - { - while (self.Range < 0x1000000) - { - self.Code = (UInt32)((self.Code << 8) | (uint)self.Strm.ReadByte()); - self.Range <<= 8; - } - } - - static uint ReadBitAndUpdateWeight(WiltRangeDecoder self, UInt16 weight, uint shift) - { - NormalizeRangeDecoder(self); - - uint threshold = (self.Range >> 12) * weight; - - if (self.Code < threshold) - { - self.Range = threshold; - weight += (ushort)((0x1000 - weight) >> (int)shift); - return 0; - } - else - { - self.Range -= threshold; - self.Code -= threshold; - weight -= (ushort)(weight >> (int)shift); - return 1; - } - } - - static uint ReadUniversalCode(WiltRangeDecoder self, ushort[] weights1, uint shift1, ushort[] weights2, uint shift2) - { - int numbits = 0; - while (ReadBitAndUpdateWeight(self, weights1[numbits], shift1) == 1) - { - numbits++; - } - if (numbits == 0) - { - return 0; - } - uint val = 1; - for (int i = 0; i < numbits - 1; i++) - { - val = (val << 1) | ReadBitAndUpdateWeight(self, weights2[numbits - 1 - i], shift2); - } - - return val; - } - - static void CopyMemory(byte[] dest, int destindx, byte[] src, int srcindx, int length) - { - for (int i = 0; i < length; i++) - { - dest[destindx + i] = src[srcindx + i]; - } - } - - void DecompressData(Stream fh, byte[] buf, uint size, int typeshift, int literalshift, uint lengthshift1, uint lengthshift2, uint offsetshift1, uint offsetshift2) - { - WiltRangeDecoder dec = new WiltRangeDecoder(); - InitRangeDecoder(dec, fh); - - ushort typeweight = 0x800; - - ushort[] lengthweights1 = new ushort[32]; - ushort[] lengthweights2 = new ushort[32]; - ushort[] offsetweights1 = new ushort[32]; - ushort[] offsetweights2 = new ushort[32]; - for (int i = 0; i < 32; i++) - { - lengthweights1[i] = lengthweights2[i] = offsetweights1[i] = offsetweights2[i] = 0x800; - } - - ushort[] literalbitweights = new ushort[256]; - for (int i = 0; i < 256; i++) - { - literalbitweights[i] = 0x800; - } - - int pos = 0; - while (pos < size) - { - if (ReadBitAndUpdateWeight(dec, typeweight, (uint)typeshift) == 1) - { - int length = (int)(ReadUniversalCode(dec, lengthweights1, lengthshift1, lengthweights2, lengthshift2) + 3); - int offs = (int)(ReadUniversalCode(dec, offsetweights1, offsetshift1, offsetweights2, offsetshift2) + 1); - - CopyMemory(buf, pos, buf, pos - offs, length); - pos += length; - } - else - { - int val = 1; - for (int i = 0; i < 8; i++) - { - int bit = (int)ReadBitAndUpdateWeight(dec, literalbitweights[val], (uint)literalshift); - val = (val << 1) | bit; - } - buf[pos++] = (byte)val; - } - } - } - - } -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress.c b/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress.c deleted file mode 100644 index 4e9561c314..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress.c +++ /dev/null @@ -1,266 +0,0 @@ -#include -#include -#include -#include -#include - - - - -typedef struct RangeEncoder -{ - uint32_t range; - uint64_t low; - uint8_t cache; - uint32_t cachesize; - - FILE *fh; -} RangeEncoder; - -static void InitRangeEncoder(RangeEncoder *self,FILE *fh) -{ - self->range=0xffffffff; - self->low=0; - self->cache=0xff; // TODO: Is this right? Original has cache=0 and cachesize=1, - self->cachesize=0; // and output a useless 0 byte at the start. - - self->fh=fh; -} - -static void ShiftOutputFromRangeEncoder(RangeEncoder *self) -{ - if((self->low&0xffffffff)<0xff000000||(self->low>>32)!=0) - { - uint8_t temp=self->cache; - for(int i=0;icachesize;i++) - { - fputc((temp+(self->low>>32))&0xff,self->fh); - temp=0xff; - } - self->cachesize=0; - self->cache=(self->low>>24)&0xff; - } - self->cachesize++; - self->low=(self->low<<8)&0xffffffff; -} - -static void WriteBitAndUpdateWeight(RangeEncoder *self,int bit,uint16_t *weight,int shift) -{ - uint32_t threshold=(self->range>>12)*(*weight); - - if(bit==0) - { - self->range=threshold; - *weight+=(0x1000-*weight)>>shift; - } - else - { - self->range-=threshold; - self->low+=threshold; - *weight-=*weight>>shift; - } - - while(self->range<0x1000000) - { - self->range<<=8; - ShiftOutputFromRangeEncoder(self); - } -} - -static void WriteUniversalCode(RangeEncoder *self,uint32_t value,uint16_t *weights1,int shift1,uint16_t *weights2,int shift2) -{ - int maxbit=31; - while(maxbit>=0 && (value>>maxbit&1)==0) maxbit--; - - for(int i=0;i<=maxbit;i++) WriteBitAndUpdateWeight(self,1,&weights1[i],shift1); - WriteBitAndUpdateWeight(self,0,&weights1[maxbit+1],shift1); - - for(int i=maxbit-1;i>=0;i--) WriteBitAndUpdateWeight(self,(value>>i)&1,&weights2[i],shift2); -} - -static void FinishRangeEncoder(RangeEncoder *self) -{ - for(int i=0;i<5;i++) - { - ShiftOutputFromRangeEncoder(self); - } -} - - - - -typedef struct DictionaryEntry -{ - uint32_t dataoffset,nextoffset; -} DictionaryEntry; - -typedef struct DictionaryLookup -{ - uint8_t *buf; - uint32_t size; - DictionaryEntry *entries; - uint32_t offsets[65536]; -} DictionaryLookup; - -static inline uint16_t GetUInt16LE(uint8_t *ptr) -{ - return ptr[0]+(ptr[1]<<8); -} - -static void InitDictionaryLookup(DictionaryLookup *self,uint8_t *buf,uint32_t size) -{ - self->buf=buf; - self->size=size; - self->entries=malloc(size*sizeof(DictionaryEntry)); - memset(self->offsets,0xff,sizeof(self->offsets)); - - for(int i=size-3;i>=0;i--) - { - uint16_t val=GetUInt16LE(&buf[i]); - - DictionaryEntry *entry=&self->entries[i]; - entry->dataoffset=i; - entry->nextoffset=self->offsets[val]; - self->offsets[val]=i; - } -} - -static bool FindDictionaryMatch(DictionaryLookup *self,int start,int *length,int *offs) -{ - int maxlength=0,maxpos=-1; - - uint16_t first=GetUInt16LE(&self->buf[start]); - uint32_t entryoffset=self->offsets[first]; - - while(entryoffset!=0xffffffff && self->entries[entryoffset].dataoffsetentries[entryoffset].dataoffset; - int matchlen=2; - while(pos+matchlen+2<=self->size && start+matchlen+1<=self->size - && self->buf[pos+matchlen]==self->buf[start+matchlen]) matchlen+=1; - - if(matchlen>=maxlength) // Use >= to capture the *last* hit for multiples. - { - maxlength=matchlen; - maxpos=pos; - } - - entryoffset=self->entries[entryoffset].nextoffset; - } - - if(maxlength>=3) - { - *length=maxlength; - *offs=maxpos; - return true; - } - else return false; -} - - - - -void CompressData(FILE *fh,uint8_t *buf,uint32_t size, -int typeshift,int literalshift,int lengthshift1,int lengthshift2,int offsetshift1,int offsetshift2) -{ - RangeEncoder comp; - InitRangeEncoder(&comp,fh); - - DictionaryLookup dict; - InitDictionaryLookup(&dict,buf,size); - - uint16_t typeweight=0x800; - - uint16_t lengthweights1[32],lengthweights2[32]; - uint16_t offsetweights1[32],offsetweights2[32]; - for(int i=0;i<32;i++) - lengthweights1[i]=lengthweights2[i]=offsetweights1[i]=offsetweights2[i]=0x800; - - uint16_t literalbitweights[256]; - for(int i=0;i<256;i++) - literalbitweights[i]=0x800; - - int pos=0; - while(pos=0;i--) - { - WriteBitAndUpdateWeight(&comp,(val>>i)&1,&literalbitweights[(val|0x100)>>(i+1)],literalshift); - } - - pos+=1; - } - } - - FinishRangeEncoder(&comp); -} - - - - -uint8_t *AllocAndReadFile(FILE *fh,uint32_t *size) -{ - const int blocksize=4096; - uint8_t *buf=malloc(blocksize); - uint32_t total=0; - for(;;) - { - uint32_t actual=fread(buf+total,1,blocksize,fh); - total+=actual; - if(actualoutputfile [typeshift literalshift lengthshift1 lengthshift2 offsetshift1 offsetshift2]\n",argv[0]); - exit(1); - } - - uint32_t size; - uint8_t *file=AllocAndReadFile(stdin,&size); - - int typeshift=4,literalshift=2,lengthshift1=4,lengthshift2=4,offsetshift1=4,offsetshift2=4; - if(argc==7) - { - typeshift=atoi(argv[1]); - literalshift=atoi(argv[2]); - lengthshift1=atoi(argv[3]); - lengthshift2=atoi(argv[4]); - offsetshift1=atoi(argv[5]); - offsetshift2=atoi(argv[6]); - } - - fputc(size&0xff,stdout); - fputc((size>>8)&0xff,stdout); - fputc((size>>16)&0xff,stdout); - fputc((size>>24)&0xff,stdout); - - fputc((offsetshift1<<4)|offsetshift2,stdout); - fputc((lengthshift1<<4)|lengthshift2,stdout); - fputc((typeshift<<4)|literalshift,stdout); - - CompressData(stdout,file,size,typeshift,literalshift,lengthshift1,lengthshift2,offsetshift1,offsetshift2); -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress16.c b/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress16.c deleted file mode 100644 index 24d8f8fe32..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltCompress16.c +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include -#include -#include -#include - - - - -typedef struct RangeEncoder -{ - uint32_t range; - uint64_t low; - uint8_t cache; - uint32_t cachesize; - - FILE *fh; -} RangeEncoder; - -static void InitRangeEncoder(RangeEncoder *self,FILE *fh) -{ - self->range=0xffffffff; - self->low=0; - self->cache=0xff; // TODO: Is this right? Original has cache=0 and cachesize=1, - self->cachesize=0; // and output a useless 0 byte at the start. - - self->fh=fh; -} - -static void ShiftOutputFromRangeEncoder(RangeEncoder *self) -{ - if((self->low&0xffffffff)<0xff000000||(self->low>>32)!=0) - { - uint8_t temp=self->cache; - for(int i=0;icachesize;i++) - { - fputc((temp+(self->low>>32))&0xff,self->fh); - temp=0xff; - } - self->cachesize=0; - self->cache=(self->low>>24)&0xff; - } - self->cachesize++; - self->low=(self->low<<8)&0xffffffff; -} - -static void WriteBitAndUpdateWeight(RangeEncoder *self,int bit,uint16_t *weight,int shift) -{ - uint32_t threshold=(self->range>>12)*(*weight); - - if(bit==0) - { - self->range=threshold; - *weight+=(0x1000-*weight)>>shift; - } - else - { - self->range-=threshold; - self->low+=threshold; - *weight-=*weight>>shift; - } - - while(self->range<0x1000000) - { - self->range<<=8; - ShiftOutputFromRangeEncoder(self); - } -} - -static void WriteUniversalCode(RangeEncoder *self,uint32_t value,uint16_t *weights1,int shift1,uint16_t *weights2,int shift2) -{ - int maxbit=31; - while(maxbit>=0 && (value>>maxbit&1)==0) maxbit--; - - for(int i=0;i<=maxbit;i++) WriteBitAndUpdateWeight(self,1,&weights1[i],shift1); - WriteBitAndUpdateWeight(self,0,&weights1[maxbit+1],shift1); - - for(int i=maxbit-1;i>=0;i--) WriteBitAndUpdateWeight(self,(value>>i)&1,&weights2[i],shift2); -} - -static void FinishRangeEncoder(RangeEncoder *self) -{ - for(int i=0;i<5;i++) - { - ShiftOutputFromRangeEncoder(self); - } -} - - - - -typedef struct DictionaryEntry -{ - uint32_t dataoffset,nextoffset; -} DictionaryEntry; - -typedef struct DictionaryLookup -{ - uint8_t *buf; - uint32_t size; - DictionaryEntry *entries; - uint32_t offsets[65536]; -} DictionaryLookup; - -static inline uint16_t GetUInt16LE(uint8_t *ptr) -{ - return ptr[0]+(ptr[1]<<8); -} - -static void InitDictionaryLookup(DictionaryLookup *self,uint8_t *buf,uint32_t size) -{ - self->buf=buf; - self->size=size; - self->entries=malloc((size/2)*sizeof(DictionaryEntry)); - memset(self->offsets,0xff,sizeof(self->offsets)); - - for(int i=size/2-2;i>=0;i--) - { - uint16_t val=GetUInt16LE(&buf[i*2]); - - DictionaryEntry *entry=&self->entries[i]; - entry->dataoffset=i*2; - entry->nextoffset=self->offsets[val]; - self->offsets[val]=i; - } -} - -static bool FindDictionaryMatch(DictionaryLookup *self,int start,int *length,int *offs) -{ - int maxlength=0,maxpos=-1; - - uint16_t first=GetUInt16LE(&self->buf[start]); - uint32_t entryoffset=self->offsets[first]; - - while(entryoffset!=0xffffffff && self->entries[entryoffset].dataoffsetentries[entryoffset].dataoffset; - int matchlen=2; - while(pos+matchlen+2<=self->size && start+matchlen+2<=self->size - && self->buf[pos+matchlen]==self->buf[start+matchlen] - && self->buf[pos+matchlen+1]==self->buf[start+matchlen+1]) matchlen+=2; - - if(matchlen>=maxlength) // Use >= to capture the *last* hit for multiples. - { - maxlength=matchlen; - maxpos=pos; - } - - entryoffset=self->entries[entryoffset].nextoffset; - } - - if(maxlength>=4) - { - *length=maxlength; - *offs=maxpos; - return true; - } - else return false; -} - - - - -void CompressData(FILE *fh,uint8_t *buf,uint32_t size, -int typeshift,int literalshift,int lengthshift1,int lengthshift2,int offsetshift1,int offsetshift2) -{ - RangeEncoder comp; - InitRangeEncoder(&comp,fh); - - DictionaryLookup dict; - InitDictionaryLookup(&dict,buf,size); - - uint16_t typeweight=0x800; - - uint16_t lengthweights1[32],lengthweights2[32]; - uint16_t offsetweights1[32],offsetweights2[32]; - for(int i=0;i<32;i++) - lengthweights1[i]=lengthweights2[i]=offsetweights1[i]=offsetweights2[i]=0x800; - - uint16_t literalbitweights[16][16]; - for(int i=0;i<16;i++) - for(int j=0;j<16;j++) - literalbitweights[i][j]=0x800; - - int pos=0; - while(pos=0;i--) - { - WriteBitAndUpdateWeight(&comp,(val>>i)&1,&literalbitweights[i][(val>>(i+1))&15],literalshift); - } - - pos+=2; - } - } - - FinishRangeEncoder(&comp); -} - - - - -uint8_t *AllocAndReadFile(FILE *fh,uint32_t *size) -{ - const int blocksize=4096; - uint8_t *buf=malloc(blocksize); - uint32_t total=0; - for(;;) - { - uint32_t actual=fread(buf+total,1,blocksize,fh); - total+=actual; - if(actualoutputfile [typeshift literalshift lengthshift1 lengthshift2 offsetshift1 offsetshift2]\n",argv[0]); - exit(1); - } - - uint32_t size; - uint8_t *file=AllocAndReadFile(stdin,&size); - - int typeshift=4,literalshift=2,lengthshift1=4,lengthshift2=4,offsetshift1=4,offsetshift2=4; - if(argc==7) - { - typeshift=atoi(argv[1]); - literalshift=atoi(argv[2]); - lengthshift1=atoi(argv[3]); - lengthshift2=atoi(argv[4]); - offsetshift1=atoi(argv[5]); - offsetshift2=atoi(argv[6]); - } - - fputc(size&0xff,stdout); - fputc((size>>8)&0xff,stdout); - fputc((size>>16)&0xff,stdout); - fputc((size>>24)&0xff,stdout); - - fputc((offsetshift1<<4)|offsetshift2,stdout); - fputc((lengthshift1<<4)|lengthshift2,stdout); - fputc((typeshift<<4)|literalshift,stdout); - - CompressData(stdout,file,size,typeshift,literalshift,lengthshift1,lengthshift2,offsetshift1,offsetshift2); -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress.c b/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress.c deleted file mode 100644 index 2030e83469..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress.c +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include -#include -#include - - - - -typedef struct RangeDecoder -{ - uint32_t range,code; - FILE *fh; -} RangeDecoder; - -static void InitRangeDecoder(RangeDecoder *self,FILE *fh) -{ - self->range=0xffffffff; - self->code=0; - self->fh=fh; - - for(int i=0;i<4;i++) self->code=(self->code<<8)|fgetc(fh); -} - -static void NormalizeRangeDecoder(RangeDecoder *self) -{ - while(self->range<0x1000000) - { - self->code=(self->code<<8)|fgetc(self->fh); - self->range<<=8; - } -} - -static int ReadBitAndUpdateWeight(RangeDecoder *self,uint16_t *weight,int shift) -{ - NormalizeRangeDecoder(self); - - uint32_t threshold=(self->range>>12)*(*weight); - - if(self->coderange=threshold; - *weight+=(0x1000-*weight)>>shift; - return 0; - } - else - { - self->range-=threshold; - self->code-=threshold; - *weight-=*weight>>shift; - return 1; - } -} - -static uint32_t ReadUniversalCode(RangeDecoder *self,uint16_t *weights1,int shift1,uint16_t *weights2,int shift2) -{ - int numbits=0; - - while(ReadBitAndUpdateWeight(self,&weights1[numbits],shift1)==1) numbits++; - if(!numbits) return 0; - - uint32_t val=1; - - for(int i=0;i>20,(shifts>>16)&0xf,(shifts>>12)&0xf,(shifts>>8)&0xf,(shifts>>4)&0xf,shifts&0xf); - - fwrite(buf,size,1,stdout); -} diff --git a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress16.c b/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress16.c deleted file mode 100644 index 754078897a..0000000000 --- a/Users/Orvid/Orvid.Compression/TODO/Wilt/WiltDecompress16.c +++ /dev/null @@ -1,148 +0,0 @@ -#include -#include -#include -#include - - - - -typedef struct RangeDecoder -{ - uint32_t range,code; - FILE *fh; -} RangeDecoder; - -static void InitRangeDecoder(RangeDecoder *self,FILE *fh) -{ - self->range=0xffffffff; - self->code=0; - self->fh=fh; - - for(int i=0;i<4;i++) self->code=(self->code<<8)|fgetc(fh); -} - -static void NormalizeRangeDecoder(RangeDecoder *self) -{ - while(self->range<0x1000000) - { - self->code=(self->code<<8)|fgetc(self->fh); - self->range<<=8; - } -} - -static int ReadBitAndUpdateWeight(RangeDecoder *self,uint16_t *weight,int shift) -{ - NormalizeRangeDecoder(self); - - uint32_t threshold=(self->range>>12)*(*weight); - - if(self->coderange=threshold; - *weight+=(0x1000-*weight)>>shift; - return 0; - } - else - { - self->range-=threshold; - self->code-=threshold; - *weight-=*weight>>shift; - return 1; - } -} - -static uint32_t ReadUniversalCode(RangeDecoder *self,uint16_t *weights1,int shift1,uint16_t *weights2,int shift2) -{ - int numbits=0; - - while(ReadBitAndUpdateWeight(self,&weights1[numbits],shift1)==1) numbits++; - if(!numbits) return 0; - - uint32_t val=1; - for(int i=0;i>8; - - pos+=2; - } - } -} - - - - -int main(int argc,char **argv) -{ - uint32_t size; - size=fgetc(stdin); - size|=fgetc(stdin)<<8; - size|=fgetc(stdin)<<16; - size|=fgetc(stdin)<<24; - - uint32_t shifts; - shifts=fgetc(stdin); - shifts|=fgetc(stdin)<<8; - shifts|=fgetc(stdin)<<16; - - uint8_t *buf=malloc(size); - - DecompressData(stdin,buf,size,shifts>>20,(shifts>>16)&0xf,(shifts>>12)&0xf,(shifts>>8)&0xf,(shifts>>4)&0xf,shifts&0xf); - - fwrite(buf,size,1,stdout); -} diff --git a/Users/Orvid/Orvid.Concurrent/Cache.cs b/Users/Orvid/Orvid.Concurrent/Cache.cs deleted file mode 100644 index 2da1639fa9..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Cache.cs +++ /dev/null @@ -1,220 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.Serialization; -using System.Collections; -using System.Security; - -#if !SILVERLIGHT -using System.Collections.Concurrent; -#endif - - -namespace Orvid.Concurrent.Collections -{ - class Slot - { - public object _Item; - public int _GC2WhenLastUsed; - } - - sealed class Level1CacheClass : ConcurrentDictionary, IMaintainable - { - public Level1CacheClass(IEqualityComparer keyComparer) - : base(keyComparer) - { - _GC2Count = GC.CollectionCount(2); - MaintenanceWorker.Register(this); - } - - int _GC2Count; - - /// - /// Table maintenance, removes all items marked as Garbage. - /// - /// - /// A boolean value indicating if the maintenance run could be performed without delay; false if there was a lock on the SyncRoot object - /// and the maintenance run could not be performed. - /// - /// - /// This method is called regularly in sync with the garbage collector on a high-priority thread. - /// - /// This override keeps track of GC.CollectionCount(2) to assess which items have been accessed recently. - /// - void IMaintainable.DoMaintenance() - { - int newCount = GC.CollectionCount(2); - if (newCount != _GC2Count) - { - _GC2Count = newCount; - - Slot dummy; - - foreach (var kvp in this) - if (kvp.Value._GC2WhenLastUsed - _GC2Count < -1) - this.TryRemove(kvp.Key, out dummy); - } - } - - public bool TryGetItem(TKey key, out object item) - { - Slot slot; - - if (base.TryGetValue(key, out slot)) - { - item = slot._Item; - slot._GC2WhenLastUsed = _GC2Count; - return true; - } - - item = null; - return false; - } - - public bool GetOldestItem(TKey key, ref object item) - { - var newSlot = new Slot() { _Item = item, _GC2WhenLastUsed = _GC2Count }; - var slot = base.GetOrAdd(key, newSlot); - - item = slot._Item; - slot._GC2WhenLastUsed = _GC2Count; - - return object.ReferenceEquals(newSlot, slot); - } - } - - class ObjectComparerClass : IEqualityComparer - { - public IEqualityComparer _KeyComparer; - - public new bool Equals(object x, object y) - { - return x == null ? y == null : (y != null && _KeyComparer.Equals((TKey)x, (TKey)y)); - } - - public int GetHashCode(object obj) - { - return _KeyComparer.GetHashCode((TKey)obj); - } - } - - /// - /// Cache; Retains values longer than WeakDictionary - /// - /// Type of key - /// Type of value - /// - /// Use only for expensive values. - /// - [Serializable] - public sealed class Cache : ISerializable - { - IEqualityComparer _keyComparer; - Level1CacheClass _Level1Cache; - WeakDictionary _Level2Cache; - - /// - /// Constructs a new instance of using an explicit of TKey to comparer keys. - /// - /// The of TKey to compare keys with. - public Cache(IEqualityComparer keyComparer) - { - _keyComparer = keyComparer; - _Level1Cache = new Level1CacheClass(keyComparer); - _Level2Cache = new WeakDictionary(new ObjectComparerClass { _KeyComparer = keyComparer }, EqualityComparer.Default); - } - - /// - /// Constructs a new instance of with the default key comparer. - /// - public Cache() : this(EqualityComparer.Default) { } - - Cache(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - _keyComparer = (IEqualityComparer)serializationInfo.GetValue("Comparer", typeof(IEqualityComparer)); - _Level1Cache = new Level1CacheClass(_keyComparer); - _Level2Cache = new WeakDictionary(new ObjectComparerClass { _KeyComparer = _keyComparer }, EqualityComparer.Default); - - foreach (var kvp in (IEnumerable>)serializationInfo.GetValue("Items", typeof(List>))) - this.GetOldest(kvp.Key, kvp.Value); - } - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", this._keyComparer); - info.AddValue("Level2", _Level1Cache.Select(kvp => new KeyValuePair( kvp.Key, (TValue)kvp.Value._Item ) ).ToList() ); - } - - /// - /// Try to retrieve an item from the cache - /// - /// Key to find the item with. - /// Out parameter that will receive the found item. - /// A boolean value indicating if an item has been found. - public bool TryGetItem(TKey key, out TValue item) - { - object storedItem; - - bool found = _Level1Cache.TryGetItem(key, out storedItem); - - if (!found) - { - var keyAsObject = (object)key; - if (keyAsObject != null && _Level2Cache.TryGetValue(keyAsObject, false, out storedItem)) - { - found = true; - _Level1Cache.GetOldestItem(key, ref storedItem); - } - } - - if (found) - { - item = (TValue)storedItem; - return true; - } - - item = default(TValue); - return false; - } - - /// - /// Tries to find an item in the cache but if it can not be found a new given item will be inserted and returned. - /// - /// The key to find an existing item or insert a new item with. - /// The new item to insert if an existing item can not be found. - /// The found item or the newly inserted item. - public TValue GetOldest(TKey key, TValue newItem) - { - object item = (object)newItem; - - var keyAsObject = (object)key; - if (keyAsObject != null) - item = _Level2Cache.GetOrAdd(keyAsObject,false, item); - - _Level1Cache.GetOldestItem(key, ref item); - - - return (TValue)item; - } - - /// - /// Clears all entries from the cache. - /// - public void Clear() - { - ((ICollection,object>>)_Level2Cache).Clear(); - _Level1Cache.Clear(); - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/ConcurrentDictionary.cs b/Users/Orvid/Orvid.Concurrent/ConcurrentDictionary.cs deleted file mode 100644 index 9e48fab19e..0000000000 --- a/Users/Orvid/Orvid.Concurrent/ConcurrentDictionary.cs +++ /dev/null @@ -1,625 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.Serialization; -using System.Security.Permissions; -using System.Collections; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Search key structure for - /// - /// Type of the key. - /// Type of the value. - public struct ConcurrentDictionaryKey - { - internal TKey _Key; - internal TValue _Value; - internal bool _IgnoreValue; - - internal ConcurrentDictionaryKey(TKey key) - { - _Key = key; - _IgnoreValue = true; - _Value = default(TValue); - } - - internal ConcurrentDictionaryKey(TKey key, TValue value) - { - _Key = key; - _IgnoreValue = false ; - _Value = value; - } - } - - /// - /// A Concurrent implementation. - /// - /// Type of the keys. - /// Type of the values. - /// - /// This class is threadsafe and highly concurrent. This means that multiple threads can do lookup and insert operations - /// on this dictionary simultaneously. - /// It is not guaranteed that collisions will not occur. The dictionary is partitioned in segments. A segment contains - /// a set of items based on a hash of those items. The more segments there are and the beter the hash, the fewer collisions will occur. - /// This means that a nearly empty ConcurrentDictionary is not as concurrent as one containing many items. - /// - [Serializable] - public class ConcurrentDictionary : ConcurrentHashtable?, ConcurrentDictionaryKey>, IDictionary, IDictionary, ISerializable - { - - /// - /// Constructs a instance using the default to compare keys. - /// - public ConcurrentDictionary() - : this(EqualityComparer.Default) - { } - - /// - /// Constructs a instance using the specified to compare keys. - /// - /// The tp compare keys with. - /// is null. - public ConcurrentDictionary(IEqualityComparer comparer) - : base() - { - if (comparer == null) - throw new ArgumentNullException("comparer"); - - _Comparer = comparer; - - Initialize(); - } - - ConcurrentDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - _Comparer = (IEqualityComparer)serializationInfo.GetValue("Comparer", typeof(IEqualityComparer)); - - var items = (List>)serializationInfo.GetValue("Items", typeof(List>)); - - if (_Comparer == null || items == null) - throw new SerializationException(); - - Initialize(); - - foreach (var kvp in items) - this.Add(kvp); - } - - #region Traits - - readonly IEqualityComparer _Comparer; - - /// - /// Gives the of TKey that is used to compare keys. - /// - public IEqualityComparer Comparer { get { return _Comparer; } } - - /// - /// Get a hashcode for given storeable item. - /// - /// Reference to the item to get a hash value for. - /// The hash value as an . - /// - /// The hash returned should be properly randomized hash. The standard GetItemHashCode methods are usually not good enough. - /// A storeable item and a matching search key should return the same hash code. - /// So the statement ItemEqualsItem(storeableItem, searchKey) ? GetItemHashCode(storeableItem) == GetItemHashCode(searchKey) : true should always be true; - /// - internal protected override UInt32 GetItemHashCode(ref KeyValuePair? item) - { return item.HasValue ? Hasher.Rehash(_Comparer.GetHashCode(item.Value.Key)) : 0; } - - /// - /// Get a hashcode for given search key. - /// - /// Reference to the key to get a hash value for. - /// The hash value as an . - /// - /// The hash returned should be properly randomized hash. The standard GetItemHashCode methods are usually not good enough. - /// A storeable item and a matching search key should return the same hash code. - /// So the statement ItemEqualsItem(storeableItem, searchKey) ? GetItemHashCode(storeableItem) == GetItemHashCode(searchKey) : true should always be true; - /// - internal protected override UInt32 GetKeyHashCode(ref ConcurrentDictionaryKey key) - { return Hasher.Rehash(_Comparer.GetHashCode(key._Key)); } - - /// - /// Compares a storeable item to a search key. Should return true if they match. - /// - /// Reference to the storeable item to compare. - /// Reference to the search key to compare. - /// True if the storeable item and search key match; false otherwise. - internal protected override bool ItemEqualsKey(ref KeyValuePair? item, ref ConcurrentDictionaryKey key) - { return item.HasValue && _Comparer.Equals(item.Value.Key, key._Key) && (key._IgnoreValue || EqualityComparer.Default.Equals(item.Value.Value, key._Value)); } - - /// - /// Compares two storeable items for equality. - /// - /// Reference to the first storeable item to compare. - /// Reference to the second storeable item to compare. - /// True if the two soreable items should be regarded as equal. - internal protected override bool ItemEqualsItem(ref KeyValuePair? item1, ref KeyValuePair? item2) - { return item1.HasValue && item2.HasValue && _Comparer.Equals(item1.Value.Key, item2.Value.Key); } - - /// - /// Indicates if a specific item reference contains a valid item. - /// - /// The storeable item reference to check. - /// True if the reference doesn't refer to a valid item; false otherwise. - /// The statement IsEmpty(default(TStoredI)) should always be true. - internal protected override bool IsEmpty(ref KeyValuePair? item) - { return !item.HasValue; } - - protected internal override Type GetKeyType(ref KeyValuePair? item) - { return !item.HasValue || item.Value.Key == null ? null : item.Value.Key.GetType(); } - - #endregion - - #region IDictionary Members - - /// - /// Adds an element with the provided key and value to the dictionary. - /// - /// The object to use as the key of the element to add. - /// The object to use as the value of the element to add. - /// An element with the same key already exists in the dictionary. - void IDictionary.Add(TKey key, TValue value) - { ((ICollection>)this).Add( new KeyValuePair(key,value) ); } - - /// - /// Determines whether the dictionary - /// contains an element with the specified key. - /// - /// The key to locate in the dictionary. - /// true if the dictionary contains - /// an element with the key; otherwise, false. - public bool ContainsKey(TKey key) - { - KeyValuePair? presentItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(key); - return FindItem(ref searchKey, out presentItem); - } - - /// - /// Gets an containing the keys of - /// the dictionary. - /// - /// An containing the keys of the dictionary. - /// This property takes a snapshot of the current keys collection of the dictionary at the moment of invocation. - public ICollection Keys - { - get - { - lock (SyncRoot) - return base.Items.Select(kvp => kvp.Value.Key).ToList(); - } - } - - /// - /// Removes the element with the specified key from the dictionary. - /// - /// The key of the element to remove. - /// true if the element is successfully removed; otherwise, false. This method - /// also returns false if key was not found in the original dictionary. - bool IDictionary.Remove(TKey key) - { - KeyValuePair? oldItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(key); - return base.RemoveItem(ref searchKey, out oldItem); - } - - /// - /// Gets the value associated with the specified key. - /// - /// The key whose value to get. - /// - /// When this method returns, the value associated with the specified key, if - /// the key is found; otherwise, the default value for the type of the value - /// parameter. This parameter is passed uninitialized. - /// - /// - /// true if the dictionary contains an element with the specified key; otherwise, false. - /// - public bool TryGetValue(TKey key, out TValue value) - { - KeyValuePair? presentItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(key); - - var res = FindItem(ref searchKey, out presentItem); - - if (res) - { - value = presentItem.Value.Value; - return true; - } - else - { - value = default(TValue); - return false; - } - } - - /// - /// Gets an containing the values in - /// the dictionary. - /// - /// - /// An containing the values in the dictionary. - /// - /// This property takes a snapshot of the current keys collection of the dictionary at the moment of invocation. - public ICollection Values - { - get - { - lock (SyncRoot) - return base.Items.Select(kvp => kvp.Value.Value).ToList(); - } - } - - /// - /// Gets or sets the value associated with the specified key. - /// - /// The key of the value to get or set. - /// The value associated with the specified key. If the specified key is not found, a get operation throws a KeyNotFoundException, and a set operation creates a new element with the specified key. - /// - /// When working with multiple threads, that can each potentialy remove the searched for item, a can always be expected. - /// - public TValue this[TKey key] - { - get - { - KeyValuePair? presentItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(key); - - if (!FindItem(ref searchKey, out presentItem)) - throw new KeyNotFoundException("The property is retrieved and key is not found."); - return presentItem.Value.Value; - } - set - { - KeyValuePair? newItem = new KeyValuePair(key, value); - KeyValuePair? presentItem; - InsertItem(ref newItem, out presentItem); - } - } - - #endregion - - #region IDictionary Members - - void IDictionary.Add(object key, object value) - { ((IDictionary)this).Add((TKey)key, (TValue)value); } - - void IDictionary.Clear() - { ((IDictionary)this).Clear(); } - - bool IDictionary.Contains(object key) - { return ((IDictionary)this).ContainsKey((TKey)key); } - - class DictionaryEnumerator : IDictionaryEnumerator - { - public IEnumerator> _source; - - #region IDictionaryEnumerator Members - - DictionaryEntry IDictionaryEnumerator.Entry - { - get - { - var current = _source.Current; - return new DictionaryEntry(current.Key, current.Value); - } - } - - object IDictionaryEnumerator.Key - { get { return _source.Current.Key; } } - - object IDictionaryEnumerator.Value - { get { return _source.Current.Value; } } - - #endregion - - #region IEnumerator Members - - object IEnumerator.Current - { get { return ((IDictionaryEnumerator)this).Entry; } } - - bool IEnumerator.MoveNext() - { return _source.MoveNext(); } - - void IEnumerator.Reset() - { _source.Reset(); } - - #endregion - } - - IDictionaryEnumerator IDictionary.GetEnumerator() - { return new DictionaryEnumerator { _source = ((IDictionary)this).GetEnumerator() }; } - - bool IDictionary.IsFixedSize - { get { return false; } } - - bool IDictionary.IsReadOnly - { get { return false; } } - - ICollection IDictionary.Keys - { get { return (ICollection)((IDictionary)this).Keys; } } - - void IDictionary.Remove(object key) - { ((IDictionary)this).Remove((TKey)key); } - - ICollection IDictionary.Values - { get { return (ICollection)((IDictionary)this).Values; } } - - object IDictionary.this[object key] - { - get { return ((IDictionary)this)[(TKey)key]; } - set { ((IDictionary)this)[(TKey)key] = (TValue)value; } - } - - #endregion - - #region ICollection> Members - - /// - /// Adds an association to the dictionary. - /// - /// A that represents the association to add. - /// An association with an equal key already exists in the dicitonary. - void ICollection>.Add(KeyValuePair item) - { - KeyValuePair? newItem = item; - KeyValuePair? presentItem; - - if (GetOldestItem(ref newItem, out presentItem)) - throw new ArgumentException("An element with the same key already exists."); - } - - /// - /// Removes all items from the dictionary. - /// - /// WHen working with multiple threads, that each can add items to this dictionary, it is not guaranteed that the dictionary will be empty when this method returns. - public new void Clear() - { base.Clear(); } - - /// - /// Determines whether the specified association exists in the dictionary. - /// - /// The key-value association to search fo in the dicionary. - /// True if item is found in the dictionary; otherwise, false. - /// - /// This method compares both key and value. It uses the default equality comparer to compare values. - /// - bool ICollection>.Contains(KeyValuePair item) - { - KeyValuePair? presentItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(item.Key,item.Value); - - return - FindItem(ref searchKey, out presentItem); - } - - /// - /// Copies all associations of the dictionary to an - /// , starting at a particular index. - /// - /// The one-dimensional that is the destination of the associations - /// copied from . The must - /// have zero-based indexing. - /// The zero-based index in at which copying begins. - /// is null. - /// is less than 0. - /// is equal to or greater than the length of . - /// The number of associations to be copied - /// is greater than the available space from to the end of the destination - /// . - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { - lock (SyncRoot) - Items.Select(nkvp => nkvp.Value).ToList().CopyTo(array, arrayIndex); - } - - /// - /// Gets the number of elements contained in the . - /// - public new int Count - { get { return base.Count; } } - - /// - /// Gets a value indicating whether the is read-only, which is always false. - /// - bool ICollection>.IsReadOnly - { get { return false; } } - - /// - /// Removes the specified association from the , comparing both key and value. - /// - /// A representing the association to remove. - /// true if the association was successfully removed from the ; - /// otherwise, false. This method also returns false if the association is not found in - /// the original . - /// - bool ICollection>.Remove(KeyValuePair item) - { - KeyValuePair? oldItem; - ConcurrentDictionaryKey searchKey = new ConcurrentDictionaryKey(item.Key,item.Value); - return base.RemoveItem(ref searchKey, out oldItem); - } - - #endregion - - #region ICollection Members - - void ICollection.CopyTo(Array array, int index) - { ((ICollection>)this).CopyTo((KeyValuePair[])array, index); } - - int ICollection.Count - { get { return ((ICollection>)this).Count; } } - - bool ICollection.IsSynchronized - { get { return true; } } - - object ICollection.SyncRoot - { get { return this; } } - - #endregion - - #region IEnumerable> Members - - /// - /// Returns an enumerator that iterates through all associations in the at the moment of invocation. - /// - /// A that can be used to iterate through the associations. - public IEnumerator> GetEnumerator() - { - lock (SyncRoot) - return Items.Select(nkvp => nkvp.Value).ToList().GetEnumerator(); - } - - #endregion - - #region IEnumerable Members - - /// - /// Returns an enumerator that iterates through all associations in the at the moment of invocation. - /// - /// A that can be used to iterate through the associations. - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { return GetEnumerator(); } - - #endregion - - #region ISerializable Members - - [SecurityPermission(SecurityAction.Demand, SerializationFormatter=true)] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Items", (object)Items.Select(item => item.Value).ToList()); - info.AddValue("Comparer", _Comparer); - } - #endregion - - public TValue AddOrUpdate(TKey key, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - var searchKey = new ConcurrentDictionaryKey(key); - KeyValuePair? latestItem; - - while (true) - { - if (this.FindItem(ref searchKey, out latestItem)) - { - TValue storedValue = latestItem.Value.Value; - TValue newValue = updateValueFactory(key, storedValue); - - if (TryUpdate(key, newValue, storedValue)) - { - return newValue; - } - } - else - { - return AddOrUpdate(key, addValueFactory(key), updateValueFactory); - } - } - } - - public TValue AddOrUpdate(TKey key, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - { - throw new ArgumentNullException("updateValueFactory"); - } - - KeyValuePair? latestItem; - KeyValuePair? addItem = new KeyValuePair(key, addValue); - - while(true) - { - if (this.GetOldestItem(ref addItem, out latestItem)) - { - TValue storedValue = latestItem.Value.Value; - TValue newValue = updateValueFactory(key, storedValue); - - if (TryUpdate(key, newValue, storedValue)) - { - return newValue; - } - } - else - { - return latestItem.Value.Value; - } - } - } - - public bool TryAdd(TKey key, TValue value) - { - KeyValuePair? addKey = new KeyValuePair(key, value); - KeyValuePair? oldItem; - - return !this.GetOldestItem(ref addKey, out oldItem); - } - - public bool TryRemove(TKey key, out TValue value) - { - var searchKey = new ConcurrentDictionaryKey(key); - KeyValuePair? oldItem; - - var res = base.RemoveItem(ref searchKey, out oldItem); - - value = res ? oldItem.Value.Value : default(TValue); - - return res; - } - - public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue) - { - var searchKey = new ConcurrentDictionaryKey(key); - KeyValuePair? newItem = new KeyValuePair(key, newValue); - KeyValuePair? dummy; - - return base.ReplaceItem(ref searchKey, ref newItem, out dummy, item => EqualityComparer.Default.Equals(item.Value.Value, comparisonValue)); - } - - public TValue GetOrAdd(TKey key, TValue value) - { - KeyValuePair? newItem = new KeyValuePair(key, value); - KeyValuePair? oldItem; - - return base.GetOldestItem(ref newItem, out oldItem) ? oldItem.Value.Value : value; - } - - public TValue GetOrAdd(TKey key, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - var searchKey = new ConcurrentDictionaryKey(key); - KeyValuePair? oldItem; - - if (base.FindItem(ref searchKey, out oldItem)) - return oldItem.Value.Value; - - KeyValuePair? newItem = new KeyValuePair(key, valueFactory(key)); - - base.GetOldestItem(ref newItem, out oldItem); - - return oldItem.Value.Value; - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/ConcurrentHashtable.cs b/Users/Orvid/Orvid.Concurrent/ConcurrentHashtable.cs deleted file mode 100644 index a1d55ee339..0000000000 --- a/Users/Orvid/Orvid.Concurrent/ConcurrentHashtable.cs +++ /dev/null @@ -1,716 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Diagnostics; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Base class for concurrent hashtable implementations - /// - /// Type of the items stored in the hashtable. - /// Type of the key to search with. - public abstract class ConcurrentHashtable - { - /// - /// Constructor (protected) - /// - /// Use Initialize method after construction. - protected ConcurrentHashtable() - {} - - /// - /// Initialize the newly created ConcurrentHashtable. Invoke in final (sealed) constructor - /// or Create method. - /// - protected virtual void Initialize() - { - var minSegments = MinSegments; - var segmentAllocatedSpace = MinSegmentAllocatedSpace; - - _CurrentRange = CreateSegmentRange(minSegments, segmentAllocatedSpace); - _NewRange = _CurrentRange; - _SwitchPoint = 0; - _AllocatedSpace = minSegments * segmentAllocatedSpace; - } - - /// - /// Create a segment range - /// - /// Number of segments in range. - /// Number of slots allocated initialy in each segment. - /// The created instance. - internal virtual Segmentrange CreateSegmentRange(int segmentCount, int initialSegmentSize) - { return Segmentrange.Create(segmentCount, initialSegmentSize); } - - /// - /// While adjusting the segmentation, _NewRange will hold a reference to the new range of segments. - /// when the adjustment is complete this reference will be copied to _CurrentRange. - /// - internal Segmentrange _NewRange; - - /// - /// Will hold the most current reange of segments. When busy adjusting the segmentation, this - /// field will hold a reference to the old range. - /// - internal Segmentrange _CurrentRange; - - /// - /// While adjusting the segmentation this field will hold a boundary. - /// Clients accessing items with a key hash value below this boundary (unsigned compared) - /// will access _NewRange. The others will access _CurrentRange - /// - Int32 _SwitchPoint; - - #region Traits - - //Methods used by Segment objects that tell them how to treat stored items and search keys. - - /// - /// Get a hashcode for given storeable item. - /// - /// Reference to the item to get a hash value for. - /// The hash value as an . - /// - /// The hash returned should be properly randomized hash. The standard GetItemHashCode methods are usually not good enough. - /// A storeable item and a matching search key should return the same hash code. - /// So the statement ItemEqualsItem(storeableItem, searchKey) ? GetItemHashCode(storeableItem) == GetItemHashCode(searchKey) : true should always be true; - /// - internal protected abstract UInt32 GetItemHashCode(ref TStored item); - - /// - /// Get a hashcode for given search key. - /// - /// Reference to the key to get a hash value for. - /// The hash value as an . - /// - /// The hash returned should be properly randomized hash. The standard GetItemHashCode methods are usually not good enough. - /// A storeable item and a matching search key should return the same hash code. - /// So the statement ItemEqualsItem(storeableItem, searchKey) ? GetItemHashCode(storeableItem) == GetItemHashCode(searchKey) : true should always be true; - /// - internal protected abstract UInt32 GetKeyHashCode(ref TSearch key); - - /// - /// Compares a storeable item to a search key. Should return true if they match. - /// - /// Reference to the storeable item to compare. - /// Reference to the search key to compare. - /// True if the storeable item and search key match; false otherwise. - internal protected abstract bool ItemEqualsKey(ref TStored item, ref TSearch key); - - /// - /// Compares two storeable items for equality. - /// - /// Reference to the first storeable item to compare. - /// Reference to the second storeable item to compare. - /// True if the two soreable items should be regarded as equal. - internal protected abstract bool ItemEqualsItem(ref TStored item1, ref TStored item2); - - /// - /// Indicates if a specific item reference contains a valid item. - /// - /// The storeable item reference to check. - /// True if the reference doesn't refer to a valid item; false otherwise. - /// The statement IsEmpty(default(TStoredI)) should always be true. - internal protected abstract bool IsEmpty(ref TStored item); - - /// - /// Returns the type of the key value or object. - /// - /// The stored item to get the type of the key for. - /// The actual type of the key or null if it can not be determined. - /// - /// Used for diagnostics purposes. - /// - internal protected virtual Type GetKeyType(ref TStored item) - { return item == null ? null : item.GetType(); } - - #endregion - - #region SyncRoot - - readonly object _SyncRoot = new object(); - - /// - /// Returns an object that serves as a lock for range operations - /// - /// - /// Clients use this primarily for enumerating over the Tables contents. - /// Locking doesn't guarantee that the contents don't change, but prevents operations that would - /// disrupt the enumeration process. - /// Operations that use this lock: - /// Count, Clear, DisposeGarbage and AssessSegmentation. - /// Keeping this lock will prevent the table from re-segmenting. - /// - protected object SyncRoot { get { return _SyncRoot; } } - - #endregion - - #region Per segment accessors - - /// - /// Gets a segment out of either _NewRange or _CurrentRange based on the hash value. - /// - /// - /// - internal Segment GetSegment(UInt32 hash) - { return ((UInt32)hash < (UInt32)_SwitchPoint ? _NewRange : _CurrentRange).GetSegment(hash); } - - /// - /// Gets a LOCKED segment out of either _NewRange or _CurrentRange based on the hash value. - /// Unlock needs to be called on this segment before it can be used by other clients. - /// - /// - /// - internal Segment GetSegmentLockedForWriting(UInt32 hash) - { - while (true) - { - var segment = GetSegment(hash); - - segment.LockForWriting(); - - if (segment.IsAlive) - return segment; - - segment.ReleaseForWriting(); - } - } - - /// - /// Gets a LOCKED segment out of either _NewRange or _CurrentRange based on the hash value. - /// Unlock needs to be called on this segment before it can be used by other clients. - /// - /// - /// - internal Segment GetSegmentLockedForReading(UInt32 hash) - { - while (true) - { - var segment = GetSegment(hash); - - segment.LockForReading(); - - if (segment.IsAlive) - return segment; - - segment.ReleaseForReading(); - } - } - - /// - /// Finds an item in the table collection that maches the given searchKey - /// - /// The key to the item. - /// Out reference to a field that will receive the found item. - /// A boolean that will be true if an item has been found and false otherwise. - protected bool FindItem(ref TSearch searchKey, out TStored item) - { - var segment = GetSegmentLockedForReading(this.GetKeyHashCode(ref searchKey)); - - try - { - return segment.FindItem(ref searchKey, out item, this); - } - finally - { segment.ReleaseForReading(); } - } - - /// - /// Looks for an existing item in the table contents using an alternative copy. If it can be found it will be returned. - /// If not then the alternative copy will be added to the table contents and the alternative copy will be returned. - /// - /// A copy to search an already existing instance with - /// Out reference to receive the found item or the alternative copy - /// A boolean that will be true if an existing copy was found and false otherwise. - protected virtual bool GetOldestItem(ref TStored searchKey, out TStored item) - { - var segment = GetSegmentLockedForWriting(this.GetItemHashCode(ref searchKey)); - - try - { - return segment.GetOldestItem(ref searchKey, out item, this); - } - finally - { segment.ReleaseForWriting(); } - } - - /// - /// Replaces and existing item - /// - /// - /// - /// - /// true is the existing item was successfully replaced. - protected bool ReplaceItem(ref TSearch searchKey, ref TStored newItem, out TStored oldItem, Func sanction) - { - var segment = GetSegmentLockedForWriting(this.GetItemHashCode(ref newItem)); - - try - { - TStored dummy; - - if (!segment.InsertItem(ref newItem, out oldItem, this)) - { - segment.RemoveItem(ref searchKey, out dummy, this); - return false; - } - - if (sanction(oldItem)) - return true; - - segment.InsertItem(ref oldItem, out dummy, this); - return false; - } - finally - { segment.ReleaseForWriting(); } - } - - - /// - /// Inserts an item in the table contents possibly replacing an existing item. - /// - /// The item to insert in the table - /// Out reference to a field that will receive any possibly replaced item. - /// A boolean that will be true if an existing copy was found and replaced and false otherwise. - protected bool InsertItem(ref TStored searchKey, out TStored replacedItem) - { - var segment = GetSegmentLockedForWriting(this.GetItemHashCode(ref searchKey)); - - try - { - return segment.InsertItem(ref searchKey, out replacedItem, this); - } - finally - { segment.ReleaseForWriting(); } - } - - /// - /// Removes an item from the table contents. - /// - /// The key to find the item with. - /// Out reference to a field that will receive the found and removed item. - /// A boolean that will be rue if an item was found and removed and false otherwise. - protected bool RemoveItem(ref TSearch searchKey, out TStored removedItem) - { - var segment = GetSegmentLockedForWriting(this.GetKeyHashCode(ref searchKey)); - - try - { - return segment.RemoveItem(ref searchKey, out removedItem, this); - } - finally - { segment.ReleaseForWriting(); } - } - - #endregion - - #region Collection wide accessors - - //These methods require a lock on SyncRoot. They will not block regular per segment accessors (for long) - - /// - /// Enumerates all segments in _CurrentRange and locking them before yielding them and resleasing the lock afterwards - /// The order in which the segments are returned is undefined. - /// Lock SyncRoot before using this enumerable. - /// - /// - internal IEnumerable> EnumerateAmorphLockedSegments(bool forReading) - { - //if segments are locked a queue will be created to try them later - //this is so that we can continue with other not locked segments. - Queue> lockedSegmentIxs = null; - - for (int i = 0, end = _CurrentRange.Count; i != end; ++i) - { - var segment = _CurrentRange.GetSegmentByIndex(i); - - if (segment.Lock(forReading)) - { - try { yield return segment; } - finally { segment.Release(forReading); } - } - else - { - if (lockedSegmentIxs == null) - lockedSegmentIxs = new Queue>(); - - lockedSegmentIxs.Enqueue(segment); - } - } - - if (lockedSegmentIxs != null) - { - var ctr = lockedSegmentIxs.Count; - - while (lockedSegmentIxs.Count != 0) - { - //once we retried them all and we are still not done.. wait a bit. - if (ctr-- == 0) - { - Thread.Sleep(0); - ctr = lockedSegmentIxs.Count; - } - - var segment = lockedSegmentIxs.Dequeue(); - - if (segment.Lock(forReading)) - { - try { yield return segment; } - finally { segment.Release(forReading); } - } - else - lockedSegmentIxs.Enqueue(segment); - } - } - } - - /// - /// Gets an IEnumerable to iterate over all items in all segments. - /// - /// - /// - /// A lock should be aquired and held on SyncRoot while this IEnumerable is being used. - /// The order in which the items are returned is undetermined. - /// - protected IEnumerable Items - { - get - { - foreach (var segment in EnumerateAmorphLockedSegments(true)) - { - int j = -1; - TStored foundItem; - - while ((j = segment.GetNextItem(j, out foundItem, this)) >= 0) - yield return foundItem; - } - } - } - - /// - /// Removes all items from the collection. - /// Aquires a lock on SyncRoot before it does it's thing. - /// When this method returns and multiple threads have access to this table it - /// is not guaranteed that the table is actually empty. - /// - protected void Clear() - { - lock(SyncRoot) - foreach(var segment in EnumerateAmorphLockedSegments(false)) - segment.Clear(this); - } - - /// - /// Returns a count of all items in teh collection. This may not be - /// aqurate when multiple threads are accessing this table. - /// Aquires a lock on SyncRoot before it does it's thing. - /// - protected int Count - { - get - { - lock (SyncRoot) - { - Int32 count = 0; - - //Don't need to lock a segment to get the count. - for (int i = 0, end = _CurrentRange.Count; i != end; ++i) - count += _CurrentRange.GetSegmentByIndex(i)._Count; - - return count; - } - } - } - - #endregion - - #region Table Maintenance methods - - /// - /// Gives the minimum number of segments a hashtable can contain. This should be 1 or more and always a power of 2. - /// - protected virtual Int32 MinSegments { get { return 4; } } - - /// - /// Gives the minimum number of allocated item slots per segment. This should be 1 or more, always a power of 2 - /// and less than 1/2 of MeanSegmentAllocatedSpace. - /// - protected virtual Int32 MinSegmentAllocatedSpace { get { return 4; } } - - /// - /// Gives the prefered number of allocated item slots per segment. This should be 4 or more and always a power of 2. - /// - protected virtual Int32 MeanSegmentAllocatedSpace { get { return 16; } } - - /// - /// Determines if a segmentation adjustment is needed. - /// - /// True - bool SegmentationAdjustmentNeeded() - { - var minSegments = MinSegments; - var meanSegmentAllocatedSpace = MeanSegmentAllocatedSpace; - - var newSpace = Math.Max(_AllocatedSpace, minSegments * meanSegmentAllocatedSpace); - var meanSpace = _CurrentRange.Count * meanSegmentAllocatedSpace; - - return newSpace > (meanSpace << 1) || newSpace <= (meanSpace >> 1); - } - - /// - /// Bool as int (for interlocked functions) that is true if a Segmentation assesment is pending. - /// - Int32 _AssessSegmentationPending; - - /// - /// The total allocated number of item slots. Filled with nonempty items or not. - /// - Int32 _AllocatedSpace; - - /// - /// When a segment resizes it uses this method to inform the hashtable of the change in allocated space. - /// - /// - internal void EffectTotalAllocatedSpace(Int32 effect) - { - //this might be a point of contention. But resizing of segments should happen (far) less often - //than inserts and removals and therefore this should not pose a problem. - Interlocked.Add(ref _AllocatedSpace, effect); - - if ( SegmentationAdjustmentNeeded() && Interlocked.Exchange(ref _AssessSegmentationPending, 1) == 0 ) - ThreadPool.QueueUserWorkItem(AssessSegmentation); - } - - /// - /// Schedule a call to the AssessSegmentation() method. - /// - protected void ScheduleMaintenance() - { - if (Interlocked.Exchange(ref _AssessSegmentationPending, 1) == 0) - ThreadPool.QueueUserWorkItem(AssessSegmentation); - } - - - /// - /// Checks if segmentation needs to be adjusted and if so performs the adjustment. - /// - /// - void AssessSegmentation(object dummy) - { - try - { - AssessSegmentation(); - } - finally - { - Interlocked.Exchange(ref _AssessSegmentationPending, 0); - EffectTotalAllocatedSpace(0); - } - } - - /// - /// This method is called when a re-segmentation is expected to be needed. It checks if it actually is needed and, if so, performs the re-segementation. - /// - protected virtual void AssessSegmentation() - { - //in case of a sudden loss of almost all content we - //may need to do this multiple times. - while (SegmentationAdjustmentNeeded()) - { - var meanSegmentAllocatedSpace = MeanSegmentAllocatedSpace; - - int allocatedSpace = _AllocatedSpace; - int atleastSegments = allocatedSpace / meanSegmentAllocatedSpace; - - Int32 segments = MinSegments; - - while (atleastSegments > segments) - segments <<= 1; - - SetSegmentation(segments, meanSegmentAllocatedSpace); - } - } - - /// - /// Adjusts the segmentation to the new segment count - /// - /// The new number of segments to use. This must be a power of 2. - /// The number of item slots to reserve in each segment. - void SetSegmentation(Int32 newSegmentCount, Int32 segmentSize) - { - //Variables to detect a bad hash. - var totalNewSegmentSize = 0; - var largestSegmentSize = 0; - Segment largestSegment = null; - - lock (SyncRoot) - { -#if DEBUG - //<<<<<<<<<<<<<<<<<<<< debug <<<<<<<<<<<<<<<<<<<<<<<< - //{ - // int minSize = _CurrentRange.GetSegmentByIndex(0)._List.Length; - // int maxSize = minSize; - - // for (int i = 1, end = _CurrentRange.Count; i < end; ++i) - // { - // int currentSize = _CurrentRange.GetSegmentByIndex(i)._List.Length; - - // if (currentSize < minSize) - // minSize = currentSize; - - // if (currentSize > maxSize) - // maxSize = currentSize; - // } - - // System.Diagnostics.Debug.Assert(maxSize <= 8 * minSize, "Probably a bad hash"); - //} - //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -#endif - unchecked - { - //create the new range - Segmentrange newRange = CreateSegmentRange(newSegmentCount, segmentSize); - - //increase total allocated space now. We can do this safely - //because at this point _AssessSegmentationPending flag will be true, - //preventing an immediate reassesment. - Interlocked.Add(ref _AllocatedSpace, newSegmentCount * segmentSize); - - //lock all new segments - //we are going to release these locks while we migrate the items from the - //old (current) range to the new range. - for (int i = 0, end = newRange.Count; i != end; ++i) - newRange.GetSegmentByIndex(i).LockForWriting(); - - //set new (completely locked) range - Interlocked.Exchange(ref _NewRange, newRange); - - - //calculate the step sizes for our switch points - var currentSwitchPointStep = (UInt32)(1 << _CurrentRange.Shift); - var newSwitchPointStep = (UInt32)(1 << newRange.Shift); - - //position in new range up from where the new segments are locked - var newLockedPoint = (UInt32)0; - - //At this moment _SwitchPoint should be 0 - var switchPoint = (UInt32)_SwitchPoint; - - do - { - Segment currentSegment; - - do - { - //aquire segment to migrate - currentSegment = _CurrentRange.GetSegment(switchPoint); - - //lock segment - currentSegment.LockForWriting(); - - if (currentSegment.IsAlive) - break; - - currentSegment.ReleaseForWriting(); - } - while (true); - - //migrate all items in the segment to the new range - TStored currentKey; - - int it = -1; - - while ((it = currentSegment.GetNextItem(it, out currentKey, this)) >= 0) - { - var currentKeyHash = this.GetItemHashCode(ref currentKey); - - //get the new segment. this is already locked. - var newSegment = _NewRange.GetSegment(currentKeyHash); - - TStored dummyKey; - newSegment.InsertItem(ref currentKey, out dummyKey, this); - } - - //substract allocated space from allocated space count and trash segment. - currentSegment.Bye(this); - currentSegment.ReleaseForWriting(); - - if (switchPoint == 0 - currentSwitchPointStep) - { - //we are about to wrap _SwitchPoint arround. - //We have migrated all items from the entire table to the - //new range. - //replace current with new before advancing, otherwise - //we would create a completely blocked table. - Interlocked.Exchange(ref _CurrentRange, newRange); - } - - //advance _SwitchPoint - switchPoint = (UInt32)Interlocked.Add(ref _SwitchPoint, (Int32)currentSwitchPointStep); - - //release lock of new segments upto the point where we can still add new items - //during this migration. - while (true) - { - var nextNewLockedPoint = newLockedPoint + newSwitchPointStep; - - if (nextNewLockedPoint > switchPoint || nextNewLockedPoint == 0) - break; - - var newSegment = newRange.GetSegment(newLockedPoint); - newSegment.Trim(this); - - var newSegmentSize = newSegment._Count; - - totalNewSegmentSize += newSegmentSize; - - if( newSegmentSize > largestSegmentSize ) - { - largestSegmentSize = newSegmentSize; - largestSegment = newSegment; - } - - newSegment.ReleaseForWriting(); - newLockedPoint = nextNewLockedPoint; - } - } - while (switchPoint != 0); - - //unlock any remaining new segments - while (newLockedPoint != 0) - { - var newSegment = newRange.GetSegment(newLockedPoint); - newSegment.Trim(this); - - var newSegmentSize = newSegment._Count; - - totalNewSegmentSize += newSegmentSize; - - if( newSegmentSize > largestSegmentSize ) - { - largestSegmentSize = newSegmentSize; - largestSegment = newSegment; - } - - newSegment.ReleaseForWriting(); - newLockedPoint += newSwitchPointStep; - } - } - } - } - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Concurrent/DictionaryBase.cs b/Users/Orvid/Orvid.Concurrent/DictionaryBase.cs deleted file mode 100644 index 8f276f2ef7..0000000000 --- a/Users/Orvid/Orvid.Concurrent/DictionaryBase.cs +++ /dev/null @@ -1,181 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; - -namespace Orvid.Concurrent.Collections -{ - public abstract class DictionaryBase : IDictionary, ICollection>, IEnumerable>, IDictionary, ICollection, IEnumerable - { - internal DictionaryBase() - { } - - protected abstract IDictionary InternalDictionary { get; } - - #region IDictionary Members - - void IDictionary.Add(object key, object value) - { ((IDictionary)this).Add((EK)key, (EV)value); } - - void IDictionary.Clear() - { ((IDictionary)this).Clear(); } - - bool IDictionary.Contains(object key) - { return ((IDictionary)this).ContainsKey((EK)key); } - - class DictionaryEnumerator : IDictionaryEnumerator - { - public IEnumerator> _source; - - #region IDictionaryEnumerator Members - - DictionaryEntry IDictionaryEnumerator.Entry - { - get - { - var current = _source.Current; - return new DictionaryEntry( current.Key, current.Value ); - } - } - - object IDictionaryEnumerator.Key - { get { return _source.Current.Key; } } - - object IDictionaryEnumerator.Value - { get { return _source.Current.Value; } } - - #endregion - - #region IEnumerator Members - - object IEnumerator.Current - { get { return ((IDictionaryEnumerator)this).Entry; } } - - bool IEnumerator.MoveNext() - { return _source.MoveNext(); } - - void IEnumerator.Reset() - { _source.Reset(); } - - #endregion - } - - IDictionaryEnumerator IDictionary.GetEnumerator() - { return new DictionaryEnumerator { _source = ((IEnumerable>)this).GetEnumerator() }; } - - bool IDictionary.IsFixedSize - { get { return false; } } - - bool IDictionary.IsReadOnly - { get { return false; } } - - ICollection IDictionary.Keys - { get { return (ICollection)((IDictionary)this).Keys; } } - - void IDictionary.Remove(object key) - { ((IDictionary)this).Remove((EK)key); } - - ICollection IDictionary.Values - { get { return (ICollection)((IDictionary)this).Values; } } - - object IDictionary.this[object key] - { - get { return ((IDictionary)this)[(EK)key]; } - set { ((IDictionary)this)[(EK)key] = (EV)value; } - } - - #endregion - - #region ICollection Members - - void ICollection.CopyTo(Array array, int index) - { ((ICollection>)this).CopyTo((KeyValuePair[])array, index); } - - int ICollection.Count - { get { return ((ICollection>)this).Count; } } - - bool ICollection.IsSynchronized - { get { return true; } } - - object ICollection.SyncRoot - { get { return this; } } - - #endregion - - #region IEnumerable Members - - IEnumerator IEnumerable.GetEnumerator() - { return ((IEnumerable>)this).GetEnumerator(); } - - #endregion - - #region IDictionary Members - - void IDictionary.Add(EK key, EV value) - { InternalDictionary.Add(key, value); } - - bool IDictionary.ContainsKey(EK key) - { return InternalDictionary.ContainsKey(key); } - - ICollection IDictionary.Keys - { get { return InternalDictionary.Keys; } } - - bool IDictionary.Remove(EK key) - { return InternalDictionary.Remove(key); } - - bool IDictionary.TryGetValue(EK key, out EV value) - { return InternalDictionary.TryGetValue(key, out value); } - - ICollection IDictionary.Values - { get { return InternalDictionary.Values; } } - - EV IDictionary.this[EK key] - { - get { return InternalDictionary[key]; } - set { InternalDictionary[key] = value; } - } - - #endregion - - #region ICollection> Members - - void ICollection>.Add(KeyValuePair item) - { InternalDictionary.Add(item); } - - void ICollection>.Clear() - { InternalDictionary.Clear(); } - - bool ICollection>.Contains(KeyValuePair item) - { return InternalDictionary.Contains(item); } - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { InternalDictionary.CopyTo(array, arrayIndex); } - - int ICollection>.Count - { get { return InternalDictionary.Count; } } - - bool ICollection>.IsReadOnly - { get { return InternalDictionary.IsReadOnly; } } - - bool ICollection>.Remove(KeyValuePair item) - { return InternalDictionary.Remove(item); } - - #endregion - - #region IEnumerable> Members - - IEnumerator> IEnumerable>.GetEnumerator() - { return ((IEnumerable>)InternalDictionary).GetEnumerator(); } - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Concurrent/Hasher.cs b/Users/Orvid/Orvid.Concurrent/Hasher.cs deleted file mode 100644 index 935e5689b3..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Hasher.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - static class Hasher - { - public static UInt32 Rehash(Int32 hash) - { - unchecked - { - Int64 prod = ((Int64)hash ^ 0x00000000691ac2e9L) * 0x00000000a931b975L; - return (UInt32)(prod ^ (prod >> 32)); - } - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/IMaintainable.cs b/Users/Orvid/Orvid.Concurrent/IMaintainable.cs deleted file mode 100644 index 67e06964d3..0000000000 --- a/Users/Orvid/Orvid.Concurrent/IMaintainable.cs +++ /dev/null @@ -1,27 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - /// - /// An interface for objects that need regular maintenance executed on a background worker thread. - /// - public interface IMaintainable - { - /// - /// Method called by a background worker thread to do maintenance deeded by the object. - /// - void DoMaintenance(); - } -} diff --git a/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryStrongValueBase.cs b/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryStrongValueBase.cs deleted file mode 100644 index ebd88c6c4a..0000000000 --- a/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryStrongValueBase.cs +++ /dev/null @@ -1,256 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections.Concurrent; - -namespace Orvid.Concurrent.Collections -{ - internal abstract class InternalWeakDictionaryStrongValueBase : System.Collections.Concurrent.ConcurrentDictionary, IMaintainable, IDictionary, ICollection>, IEnumerable> - where IK : ITrashable - where SK : struct - { - protected InternalWeakDictionaryStrongValueBase(int concurrencyLevel, int capacity, IEqualityComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { } - - protected InternalWeakDictionaryStrongValueBase(IEqualityComparer keyComparer) - : base(keyComparer) - { } - - protected abstract IK FromExternalKeyToSearchKey(EK externalKey); - protected abstract IK FromExternalKeyToStorageKey(EK externalKey); - protected abstract IK FromStackKeyToSearchKey(SK externalKey); - protected abstract IK FromStackKeyToStorageKey(SK externalKey); - protected abstract bool FromInternalKeyToExternalKey(IK internalKey, out EK externalKey); - protected abstract bool FromInternalKeyToStackKey(IK internalKey, out SK externalKey); - - #region IMaintainable Members - - void IMaintainable.DoMaintenance() - { - foreach (var kvp in (IEnumerable>)this) - if (kvp.Key.IsGarbage) - { - EV value; - base.TryRemove(kvp.Key, out value); - } - } - - #endregion - - #region IDictionary,TValue> Members - - void IDictionary.Add(EK key, EV value) - { ((IDictionary)this).Add(FromExternalKeyToStorageKey(key), value); } - - bool IDictionary.ContainsKey(EK key) - { return ((IDictionary)this).ContainsKey(FromExternalKeyToSearchKey(key)); } - - ICollection IDictionary.Keys - { get { return new TransformedCollection { _source = ((IEnumerable>)this).Select(kvp => kvp.Key) }; } } - - bool IDictionary.Remove(EK key) - { return ((IDictionary)this).Remove(FromExternalKeyToSearchKey(key)); } - - bool IDictionary.TryGetValue(EK key, out EV value) - { return base.TryGetValue(FromExternalKeyToSearchKey(key), out value); } - - ICollection IDictionary.Values - { get { return new TransformedCollection { _source = ((IEnumerable>)this).Select(kvp => kvp.Value) }; } } - - EV IDictionary.this[EK key] - { - get { return ((IDictionary)this)[FromExternalKeyToSearchKey(key)]; } - set { ((IDictionary)this)[FromExternalKeyToStorageKey(key)] = value; } - } - - #endregion - - #region ICollection,TValue>> Members - - void ICollection>.Add(KeyValuePair item) - { ((IDictionary)this).Add(item.Key, item.Value); } - - void ICollection>.Clear() - { base.Clear(); } - - bool ICollection>.Contains(KeyValuePair item) - { return ((IDictionary)this).Contains(new KeyValuePair(FromExternalKeyToSearchKey(item.Key), item.Value)); } - - //HIERO: - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (array == null) - throw new ArgumentNullException("array"); - - if (arrayIndex < 0 || arrayIndex > array.Length) - throw new IndexOutOfRangeException(); - - int i = 0; - int end = array.Length - arrayIndex; - var buffer = new KeyValuePair[end]; - - using (var it = ((IEnumerable>)this).GetEnumerator()) - while (it.MoveNext()) - { - if (i == end) - throw new ArgumentException(); - - buffer[i++] = it.Current; - } - - buffer.CopyTo(array, arrayIndex); - } - - int ICollection>.Count - { - get - { - int ct = 0; - - using (var it = ((IEnumerable>)this).GetEnumerator()) - while (it.MoveNext()) - ++ct; - - return ct; - } - } - - bool ICollection>.IsReadOnly - { get { return false; } } - - bool ICollection>.Remove(KeyValuePair item) - { return RemoveIKVP(FromExternalKeyToSearchKey(item.Key), item.Value) ; } - - #endregion - - #region IEnumerable> Members - - public new IEnumerator> GetEnumerator() - { - foreach (var kvp in (IEnumerable>)this) - { - EK externalKey; - - if ( - FromInternalKeyToExternalKey(kvp.Key, out externalKey) - ) - yield return new KeyValuePair(externalKey, kvp.Value); - else - //boyscout - ((ICollection>)this).Remove(kvp); - } - } - - #endregion - - public bool ContainsKey(SK key) - { return ((IDictionary)this).ContainsKey(FromStackKeyToSearchKey(key)); } - - public bool TryGetValue(SK key, out EV value) - { return ((IDictionary)this).TryGetValue(FromStackKeyToSearchKey(key), out value); } - - public EV GetItem(SK key) - { return ((IDictionary)this)[FromStackKeyToStorageKey(key)]; } - - public void SetItem(SK key, EV value) - { ((IDictionary)this)[FromStackKeyToStorageKey(key)] = value; } - - public new bool IsEmpty - { get { return !((ICollection>)this).GetEnumerator().MoveNext(); } } - - public EV AddOrUpdate(SK key, Func addValueFactory, Func updateValueFactory) - { - return - base.AddOrUpdate( - FromStackKeyToStorageKey(key), - sKey => addValueFactory(key), - (sKey, oldValue) => - { - SK oldKey; - - if (FromInternalKeyToStackKey(sKey, out oldKey)) - return updateValueFactory(oldKey, oldValue); - else - { - //boyscout - RemoveIKVP(sKey, oldValue); - return addValueFactory(key); - } - } - ) - ; - } - - private bool RemoveIKVP(IK sKey, EV oldValue) - { - return ((ICollection>)this).Remove(new KeyValuePair(sKey, oldValue)); - } - - public EV AddOrUpdate(SK key, EV addValue, Func updateValueFactory) - { - return - AddOrUpdate( - FromStackKeyToStorageKey(key), - addValue, - (sKey, oldValue) => - { - SK oldKey; - - if (FromInternalKeyToStackKey(sKey, out oldKey)) - return updateValueFactory(oldKey, oldValue); - else - { - //boyscout - RemoveIKVP(sKey, oldValue); - return addValue; - } - } - ) - ; - } - - public EV GetOrAdd(SK key, EV value) - { return base.GetOrAdd(FromStackKeyToStorageKey(key), value); } - - public EV GetOrAdd(SK key, Func valueFactory) - { - EV hold; - return this.TryGetValue(key, out hold) ? hold : GetOrAdd(key, valueFactory(key)); - } - - public new KeyValuePair[] ToArray() - { return ((IEnumerable>)this).ToArray(); } - - public bool TryAdd(SK key, EV value) - { return base.TryAdd(FromStackKeyToStorageKey(key), value); } - - public bool TryRemove(SK key, out EV value) - { return base.TryRemove(FromStackKeyToSearchKey(key), out value); } - - public bool TryUpdate(SK key, EV newValue, EV comparisonValue) - { return base.TryUpdate(FromStackKeyToSearchKey(key), newValue, comparisonValue); } - - public List> GetContents() - { return ((IEnumerable>)this).ToList(); } - - public void InsertContents(IEnumerable> collection) - { - if (null == collection) - throw new ArgumentNullException("collection"); - - foreach (var kvp in collection) - ((IDictionary)this).Add(kvp); - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryWeakValueBase.cs b/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryWeakValueBase.cs deleted file mode 100644 index c4f92b56ab..0000000000 --- a/Users/Orvid/Orvid.Concurrent/InternalWeakDictionaryWeakValueBase.cs +++ /dev/null @@ -1,477 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -#if !SILVERLIGHT -using System.Collections.Concurrent; -#endif - -namespace Orvid.Concurrent.Collections -{ - internal abstract class InternalWeakDictionaryWeakValueBase : ConcurrentDictionary, IMaintainable, IDictionary, ICollection>, IEnumerable> - where IK : ITrashable - //For IV we do not use the WeakValueRef struct directly in order to support unittesting. - where IV : IWeakValueRef, IEquatable - where EV : class - where SK : struct - { - protected InternalWeakDictionaryWeakValueBase(int concurrencyLevel, int capacity, IEqualityComparer keyComparer) -#if SILVERLIGHT - : base(keyComparer) -#else - : base(concurrencyLevel, capacity, keyComparer) -#endif - { } - - protected InternalWeakDictionaryWeakValueBase(IEqualityComparer keyComparer) - : base(keyComparer) - { } - - protected abstract IK FromExternalKeyToSearchKey(EK externalKey); - protected abstract IK FromExternalKeyToStorageKey(EK externalKey); - protected abstract IK FromStackKeyToSearchKey(SK externalKey); - protected abstract IK FromStackKeyToStorageKey(SK externalKey); - protected abstract bool FromInternalKeyToExternalKey(IK internalKey, out EK externalKey); - protected abstract bool FromInternalKeyToStackKey(IK internalKey, out SK externalKey); - protected abstract IV FromExternalValueToInternalValue(EV externalValue); - - bool FromInternalValueToExternalValue(IV internalValue, out EV externalValue) - { return internalValue.GetValue(out externalValue); } - - #region IMaintainable Members - - void IMaintainable.DoMaintenance() - { - foreach (var kvp in (IEnumerable>)this) - if (kvp.Key.IsGarbage || kvp.Value.IsGarbage) - ((ICollection>)this).Remove(kvp); - } - - #endregion - - #region IDictionary,TValue> Members - - void IDictionary.Add(EK key, EV value) - { - var newItm = FromExternalValueToInternalValue(value); - - var storedItm = - base.AddOrUpdate( - FromExternalKeyToStorageKey(key), - newItm, - (sKey, oldItm) => - { - if (!sKey.IsGarbage && !oldItm.IsGarbage) - return oldItm; - else - { - //boyscout - RemoveIKVP(sKey, oldItm); - return newItm; - } - } - ) - ; - - if (!object.ReferenceEquals(newItm.Reference, storedItm.Reference)) - throw new ArgumentException(); - } - - bool IDictionary.ContainsKey(EK key) - { - EV dummy; - return ((IDictionary)this).TryGetValue(key, out dummy); - } - - ICollection IDictionary.Keys - { get { return new TransformedCollection { _source = ((IEnumerable>)this).Select(kvp => kvp.Key) }; } } - - bool IDictionary.Remove(EK key) - { - IV itm; - bool res = this.TryRemove(FromExternalKeyToSearchKey(key), out itm); - return res && !itm.IsGarbage; - } - - bool IDictionary.TryGetValue(EK key, out EV value) - { - IV internalValue; - IK searchKey = FromExternalKeyToSearchKey(key); - if (((IDictionary)this).TryGetValue(searchKey, out internalValue)) - { - if (FromInternalValueToExternalValue(internalValue, out value)) - return true; - - //boyscout - RemoveIKVP(searchKey, internalValue); - } - - value = default(EV); - return false; - } - - ICollection IDictionary.Values - { get { return new TransformedCollection { _source = ((IEnumerable>)this).Select(kvp => kvp.Value) }; } } - - EV IDictionary.this[EK key] - { - get - { - EV externalValue; - if (!((IDictionary)this).TryGetValue(key, out externalValue)) - throw new KeyNotFoundException(); - return externalValue; - } - set - { - ((IDictionary)this)[FromExternalKeyToStorageKey(key)] - = FromExternalValueToInternalValue(value); - } - } - - #endregion - - #region ICollection,TValue>> Members - - void ICollection>.Add(KeyValuePair item) - { ((IDictionary)this).Add(item.Key, item.Value); } - - void ICollection>.Clear() - { Clear(); } - - bool ICollection>.Contains(KeyValuePair item) - { - EV value; - - if (((IDictionary)this).TryGetValue(item.Key, out value)) - return EqualityComparer.Default.Equals(value, item.Value); - - return false; - } - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (array == null) - throw new ArgumentNullException("array"); - - if (arrayIndex < 0 || arrayIndex > array.Length) - throw new IndexOutOfRangeException(); - - int i = 0; - int end = array.Length - arrayIndex; - var buffer = new KeyValuePair[end]; - - using (var it = ((IEnumerable>)this).GetEnumerator()) - while (it.MoveNext()) - { - if (i == end) - throw new ArgumentException(); - - buffer[i++] = it.Current; - } - - buffer.CopyTo(array, arrayIndex); - } - - int ICollection>.Count - { - get - { - int ct = 0; - - using (var it = ((IEnumerable>)this).GetEnumerator()) - while (it.MoveNext()) - ++ct; - - return ct; - } - } - - bool ICollection>.IsReadOnly - { get { return false; } } - - bool ICollection>.Remove(KeyValuePair item) - { - return - RemoveIKVP(FromExternalKeyToSearchKey(item.Key),FromExternalValueToInternalValue(item.Value)) - ; - } - - #endregion - - #region IEnumerable> Members - - public new IEnumerator> GetEnumerator() - { - foreach (var kvp in (IEnumerable>)this) - { - EK externalKey; - EV externalValue; - - if ( - FromInternalKeyToExternalKey(kvp.Key, out externalKey) - && FromInternalValueToExternalValue(kvp.Value, out externalValue) - ) - yield return new KeyValuePair(externalKey, externalValue); - else - //boyscout - ((ICollection>)this).Remove(kvp); - } - } - - #endregion - - public bool ContainsKey(SK key) - { - IV itm; - return ((IDictionary)this).TryGetValue(FromStackKeyToSearchKey(key), out itm) && !itm.IsGarbage; - } - - public bool TryGetValue(SK key, out EV value) - { - IV itm; - IK internalKey = FromStackKeyToSearchKey(key); - - if (((IDictionary)this).TryGetValue(FromStackKeyToSearchKey(key), out itm)) - { - if (FromInternalValueToExternalValue(itm, out value)) - return true; - - //boyscout - RemoveIKVP(internalKey, itm); - } - - value = default(EV); - return false; - } - - public EV GetItem(SK key) - { - EV externalValue; - if (!TryGetValue(key, out externalValue)) - throw new KeyNotFoundException(); - return externalValue; - } - - public void SetItem(SK key, EV value) - { - ((IDictionary)this)[FromStackKeyToStorageKey(key)] - = FromExternalValueToInternalValue(value); - } - - public new bool IsEmpty - { get { return !((ICollection>)this).GetEnumerator().MoveNext(); } } - - public EV AddOrUpdate(SK key, Func addValueFactory, Func updateValueFactory) - { - while (true) - { - //variables to hold references to newly created values so they will remain alive - EV hold1; - EV hold2; - - if ( - FromInternalValueToExternalValue( - base.AddOrUpdate( - FromStackKeyToStorageKey(key), - sKey => FromExternalValueToInternalValue(hold1 = addValueFactory(key)), - (sKey, oldItm) => - { - EV oldValue; - SK oldKey; - EV newValue; - - if ( - FromInternalKeyToStackKey(sKey, out oldKey) - && FromInternalValueToExternalValue(oldItm, out oldValue) - ) - newValue = updateValueFactory(oldKey, oldValue); - else - { - //boyscout - RemoveIKVP(sKey, oldItm); - newValue = addValueFactory(key); - } - - return FromExternalValueToInternalValue(hold2 = newValue); - } - ), - out hold1 - ) - ) - return hold1; - } - } - - public EV AddOrUpdate(SK key, EV addValue, Func updateValueFactory) - { - while (true) - { - //this inside loop to prevent optimizer from optimizing away our reference to addValue. - var newItm = FromExternalValueToInternalValue(addValue); - var internalKey = FromStackKeyToStorageKey(key); - - if (base.TryAdd(internalKey, newItm)) - return addValue; - - EV hold = default(EV); - - if( - FromInternalValueToExternalValue( - base.AddOrUpdate( - FromStackKeyToStorageKey(key), - newItm, - (sKey, oldItm) => - { - EV oldValue; - SK oldKey; - - if ( - FromInternalKeyToStackKey(sKey, out oldKey) - && FromInternalValueToExternalValue(oldItm, out oldValue) - ) - return FromExternalValueToInternalValue(hold = updateValueFactory(oldKey, oldValue)); - else - { - //boyscout - RemoveIKVP(sKey, oldItm); - return newItm; - } - } - ), - out hold - ) - ) - return hold; - } - } - - public EV GetOrAdd(SK key, EV value) - { - while (true) - { - //this inside loop to prevent optimizer from optimizing away our reference to value. - var newItm = FromExternalValueToInternalValue(value); - var internalKey = FromStackKeyToStorageKey(key); - - EV hold; - - IV item = base.GetOrAdd(internalKey, newItm); - - if (FromInternalValueToExternalValue(item, out hold)) - return hold; - - //boyscout - RemoveIKVP(internalKey, item); - } - } - - private bool RemoveIKVP(IK internalKey, IV item) - { - return ((ICollection>)this).Remove(new KeyValuePair(internalKey, item)); - } - - public EV GetOrAdd(SK key, Func valueFactory) - { - EV hold; - - return this.TryGetValue(key, out hold) ? hold : GetOrAdd(key, valueFactory(key)); - } - - public new KeyValuePair[] ToArray() - { return ((IEnumerable>)this).ToArray(); } - - public bool TryAdd(SK key, EV value) - { - var newItm = FromExternalValueToInternalValue(value); - var internalKey = FromStackKeyToStorageKey(key); - - if (base.TryAdd(internalKey, newItm)) - return true; - - var storedItm = - base.AddOrUpdate( - internalKey, - newItm, - (k, itm) => - { - if (k.IsGarbage || itm.IsGarbage) - { - //boyscout - RemoveIKVP(k, itm); - return newItm; - } - else - return itm; - } - ) - ; - - return object.ReferenceEquals(storedItm.Reference, newItm.Reference); - } - - public bool TryRemove(SK key, out EV value) - { - IV hold; - - if (base.TryRemove(FromStackKeyToSearchKey(key), out hold)) - return FromInternalValueToExternalValue(hold, out value); - - value = default(EV); - return false; - } - - public bool TryUpdate(SK key, EV newValue, EV comparisonValue) - { - return - base.TryUpdate( - FromStackKeyToSearchKey(key), - FromExternalValueToInternalValue(newValue), - FromExternalValueToInternalValue(comparisonValue) - ) - ; - } - - public List> GetContents() - { return ((IEnumerable>)this).ToList(); } - - public void InsertContents(IEnumerable> collection) - { - if (null == collection) - throw new ArgumentNullException("collection"); - - foreach (var kvp in collection) - ((IDictionary)this).Add(kvp); - } - } - - internal abstract class InternalWeakDictionaryWeakValueBase : InternalWeakDictionaryWeakValueBase, EK, EV, SK> - where IK : ITrashable - where EV : class - where SK : struct - { - protected InternalWeakDictionaryWeakValueBase(int concurrencyLevel, int capacity, IEqualityComparer keyComparer) -#if SILVERLIGHT - : base(keyComparer) -#else - : base(concurrencyLevel, capacity, keyComparer) -#endif - { } - - protected InternalWeakDictionaryWeakValueBase(IEqualityComparer keyComparer) - : base(keyComparer) - { } - - protected override WeakValueRef FromExternalValueToInternalValue(EV externalValue) - { return WeakValueRef.Create( externalValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/Key.cs b/Users/Orvid/Orvid.Concurrent/Key.cs deleted file mode 100644 index 7d82061b21..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Key.cs +++ /dev/null @@ -1,302 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - internal interface ITrashable - { - bool IsGarbage { get; } - }; - - internal struct WeakKey : ITrashable - where E : class - { - public static object NullValue = new object(); - - public object _elementReference; - - #region ITrashable Members - - public bool IsGarbage - { get { return ((WeakReference)_elementReference).Target == null; } } - - public bool GetValue(out E value, bool isWeak) - { - object obj = isWeak ? ((WeakReference)_elementReference).Target : _elementReference; - - if (obj == null) - { - value = default(E); - return false; - } - - value = (E)( object.ReferenceEquals(NullValue,obj) ? null : obj ); - - return true; - } - - public void SetValue(E value, bool isWeak) - { - var obj = (object)value ?? NullValue; - _elementReference = isWeak ? (object)(new WeakReference(obj)) : obj; - } - - #endregion - } - - internal struct StrongKey : ITrashable - { - public StrongKey(E value) - { _element = value; } - - public E _element; - - #region ITrashable Members - - public bool IsGarbage - { get { return false; } } - - #endregion - } - - internal struct KeySegment : ITrashable - where E : class - where T : ITrashable - { - public WeakKey _elementReference; - public T _tail; - - #region ITrashable Members - - public bool IsGarbage - { get { return _elementReference.IsGarbage || _tail.IsGarbage; } } - - public bool GetValue(out E value, bool isWeak) - { return _elementReference.GetValue(out value, isWeak); } - - public void SetValue(E value, bool isWeak) - { _elementReference.SetValue(value, isWeak); } - - #endregion - } - - - internal abstract class KeyBase : ITrashable - where V : ITrashable - { - public V _values; - public S _strongValue; - public int _hash; - public abstract bool IsWeak { get; } - - #region ITrashable Members - - bool ITrashable.IsGarbage - { get { return _values.IsGarbage; } } - - #endregion - } - - - internal abstract class Key : KeyBase, S> - where W1 : class - { - public Key Set(Stacktype h, KeyComparer comparer) - { - bool isWeak = IsWeak; - _values.SetValue(h.Item1, isWeak); - _strongValue = h.Item2; - _hash = comparer.CalculateHashCode(this); - return this; - } - - public Key Set(Tuple t, KeyComparer comparer) - { return Set(t.AsStacktype(), comparer); } - - public bool Get(out Stacktype t) - { - t = new Stacktype { Item2 = _strongValue }; - bool res = _values.GetValue(out t.Item1, IsWeak); - return res; - } - - public bool Get(out Tuple t) - { - Stacktype h; - bool res = Get(out h); - t = h.AsTuple(); - return res; - } - } - - internal abstract class Key : KeyBase>, S> - where W1 : class - where W2 : class - { - public Key Set(Stacktype h, KeyComparer comparer) - { - bool isWeak = IsWeak; - _values.SetValue(h.Item1, isWeak); - _values._tail.SetValue(h.Item2, isWeak); - _strongValue = h.Item3; - _hash = comparer.CalculateHashCode(this); - return this; - } - - public Key Set(Tuple t, KeyComparer comparer) - { return Set(t.AsStacktype(), comparer); } - - public bool Get(out Stacktype t) - { - t = new Stacktype() { Item3 = _strongValue }; - bool isWeak = IsWeak; - bool res = _values.GetValue(out t.Item1, isWeak); - res = _values._tail.GetValue(out t.Item2, isWeak) && res; - return res; - } - - public bool Get(out Tuple t) - { - Stacktype h; - bool res = Get(out h); - t = h.AsTuple(); - return res; - } - } - - internal abstract class Key : KeyBase>>, S> - where W1 : class - where W2 : class - where W3 : class - { - public Key Set(Stacktype h, KeyComparer comparer) - { - bool isWeak = IsWeak; - _values.SetValue(h.Item1, isWeak); - _values._tail.SetValue(h.Item2, isWeak); - _values._tail._tail.SetValue(h.Item3, isWeak); - _strongValue = h.Item4; - _hash = comparer.CalculateHashCode(this); - return this; - } - - public Key Set(Tuple t, KeyComparer comparer) - { return Set(t.AsStacktype(), comparer); } - - public bool Get(out Stacktype t) - { - t = new Stacktype { Item4 = _strongValue }; - bool isWeak = IsWeak; - bool res = _values.GetValue(out t.Item1, isWeak); - res = _values._tail.GetValue(out t.Item2, isWeak) && res; - res = _values._tail._tail.GetValue(out t.Item3, isWeak) && res; - return res; - } - - public bool Get(out Tuple t) - { - Stacktype h; - bool res = Get(out h); - t = h.AsTuple(); - return res; - } - } - - internal abstract class Key : KeyBase>>>, S> - where W1 : class - where W2 : class - where W3 : class - where W4 : class - { - public Key Set(Stacktype h, KeyComparer comparer) - { - bool isWeak = IsWeak; - _values.SetValue(h.Item1, isWeak); - _values._tail.SetValue(h.Item2, isWeak); - _values._tail._tail.SetValue(h.Item3, isWeak); - _values._tail._tail._tail.SetValue(h.Item4, isWeak); - _strongValue = h.Item5; - _hash = comparer.CalculateHashCode(this); - return this; - } - - public Key Set(Tuple t, KeyComparer comparer) - { return Set(t.AsStacktype(), comparer); } - - public bool Get(out Stacktype t) - { - t = new Stacktype { Item5 = _strongValue }; - bool isWeak = IsWeak; - bool res = _values.GetValue(out t.Item1, isWeak); - res = _values._tail.GetValue(out t.Item2, isWeak) && res; - res = _values._tail._tail.GetValue(out t.Item3, isWeak) && res; - res = _values._tail._tail._tail.GetValue(out t.Item4, isWeak) && res; - return res; - } - - public bool Get(out Tuple t) - { - Stacktype h; - bool res = Get(out h); - t = h.AsTuple(); - return res; - } - } - - - internal class StorageKey : Key - where W1 : class - { public override bool IsWeak { get { return true; } } } - - internal class StorageKey : Key - where W1 : class - where W2 : class - { public override bool IsWeak { get { return true; } } } - - internal class StorageKey : Key - where W1 : class - where W2 : class - where W3 : class - { public override bool IsWeak { get { return true; } } } - - internal class StorageKey : Key - where W1 : class - where W2 : class - where W3 : class - where W4 : class - { public override bool IsWeak { get { return true; } } } - - - internal class SearchKey : Key - where W1 : class - { public override bool IsWeak { get { return false; } } } - - internal class SearchKey : Key - where W1 : class - where W2 : class - { public override bool IsWeak { get { return false; } } } - - internal class SearchKey : Key - where W1 : class - where W2 : class - where W3 : class - { public override bool IsWeak { get { return false; } } } - - internal class SearchKey : Key - where W1 : class - where W2 : class - where W3 : class - where W4 : class - { public override bool IsWeak { get { return false; } } } - -} diff --git a/Users/Orvid/Orvid.Concurrent/KeyComparer.cs b/Users/Orvid/Orvid.Concurrent/KeyComparer.cs deleted file mode 100644 index 0cc2d6333b..0000000000 --- a/Users/Orvid/Orvid.Concurrent/KeyComparer.cs +++ /dev/null @@ -1,276 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - internal interface IKeyComparer - { - bool Equals(ref T x, bool xIsWeak, ref T y, bool yIsWeak); - int GetHashCode(ref T obj, bool objIsWeak); - } - -#if !SILVERLIGHT - [Serializable] -#endif - internal struct WeakKeyComparer : IKeyComparer> - where E : class - { - public IEqualityComparer _equalityComparer; - - #region IKeyComparer> Members - - public bool Equals(ref WeakKey key1, bool key1IsWeak, ref WeakKey key2, bool key2IsWeak) - { - var obj1 = key1IsWeak ? ((WeakReference)key1._elementReference).Target : key1._elementReference; - var obj2 = key2IsWeak ? ((WeakReference)key2._elementReference).Target : key2._elementReference; - - return - obj1 == null ? obj2 == null && object.ReferenceEquals(key1._elementReference, key2._elementReference) : - obj2 == null ? false : - object.ReferenceEquals(obj1, obj2) ? true : - _equalityComparer.Equals((E)obj1, (E)obj2); - } - - public int GetHashCode(ref WeakKey obj, bool objIsWeak) - { - return _equalityComparer.GetHashCode((E)(objIsWeak ? ((WeakReference)obj._elementReference).Target : obj._elementReference)); - } - - #endregion - } - - [Serializable] - internal class StrongKeyComparer : IKeyComparer> - { - public IEqualityComparer _equalityComparer = null; - - public bool Equals(ref StrongKey x, bool xIsWeak, ref StrongKey y, bool yIsWeak) - { - return _equalityComparer.Equals(x._element, y._element); - } - - public int GetHashCode(ref StrongKey obj, bool objIsWeak) - { - return _equalityComparer.GetHashCode(obj._element); - } - } - - [Serializable] - internal class KeySegmentComparer : IKeyComparer> - where E : class - where T : ITrashable - { - public WeakKeyComparer _elementComparer; - public IKeyComparer _tail; - - #region IKeyComparer> Members - - public bool Equals(ref KeySegment x, bool xIsWeak, ref KeySegment y, bool yIsWeak) - { - return - _elementComparer.Equals(ref x._elementReference, xIsWeak, ref y._elementReference, yIsWeak) - && _tail.Equals(ref x._tail, xIsWeak, ref y._tail, yIsWeak) - ; - } - - public int GetHashCode(ref KeySegment obj, bool objIsWeak) - { - return (int)Hasher.Rehash(_elementComparer.GetHashCode(ref obj._elementReference, objIsWeak)) ^ _tail.GetHashCode(ref obj._tail, objIsWeak); - } - - #endregion - } - - - internal abstract class KeyComparerBase : IEqualityComparer - where K : KeyBase - where V : ITrashable - { - public IKeyComparer _comparers; - public IEqualityComparer _strongValueComparer; - - #region IEqualityComparer> Members - - public bool Equals(K x, K y) - { return _comparers.Equals(ref x._values, x.IsWeak, ref y._values, y.IsWeak) && _strongValueComparer.Equals(x._strongValue, y._strongValue); } - - public int GetHashCode(K obj) - { return obj._hash; } - - public int CalculateHashCode(K obj) - { return (int)Hasher.Rehash(_comparers.GetHashCode(ref obj._values, obj.IsWeak)) ^ _strongValueComparer.GetHashCode(obj._strongValue); } - - #endregion - } - - -#if !SILVERLIGHT - [Serializable] -#endif - internal class KeyComparer : IEqualityComparer> - { - IEqualityComparer _strongValueComparer; - - public KeyComparer(IEqualityComparer strongKeyComparer) - { - if (null == strongKeyComparer) - throw new ArgumentNullException("strongKeyComparer"); - - _strongValueComparer = strongKeyComparer; - } - - #region IEqualityComparer> Members - - public bool Equals(StrongKey x, StrongKey y) - { return _strongValueComparer.Equals(x._element, y._element); } - - public int GetHashCode(StrongKey obj) - { return _strongValueComparer.GetHashCode(obj._element); } - - #endregion - } - - -#if !SILVERLIGHT - [Serializable] -#endif - internal class KeyComparer : KeyComparerBase, WeakKey, S> - where W1 : class - { - public KeyComparer(IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - if (null == weakKeyComparer) - throw new ArgumentNullException("weakKeyComparer"); - - if (null == strongKeyComparer) - throw new ArgumentNullException("strongKeyComparer"); - - _comparers = new WeakKeyComparer { _equalityComparer = weakKeyComparer }; - _strongValueComparer = strongKeyComparer; - } - } - -#if !SILVERLIGHT - [Serializable] -#endif - internal class KeyComparer : KeyComparerBase, KeySegment>, S> - where W1 : class - where W2 : class - { - public KeyComparer(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - if (null == weakKey1Comparer) - throw new ArgumentNullException("weakKey1Comparer"); - - if (null == weakKey2Comparer) - throw new ArgumentNullException("weakKey2Comparer"); - - if (null == strongKeyComparer) - throw new ArgumentNullException("strongKeyComparer"); - - _comparers = - new KeySegmentComparer> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey1Comparer }, - _tail = new WeakKeyComparer { _equalityComparer = weakKey2Comparer } - } - ; - - _strongValueComparer = strongKeyComparer; - } - } - -#if !SILVERLIGHT - [Serializable] -#endif - internal class KeyComparer : KeyComparerBase, KeySegment>>, S> - where W1 : class - where W2 : class - where W3 : class - { - public KeyComparer(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - if (null == weakKey1Comparer) - throw new ArgumentNullException("weakKey1Comparer"); - - if (null == weakKey2Comparer) - throw new ArgumentNullException("weakKey2Comparer"); - - if (null == weakKey3Comparer) - throw new ArgumentNullException("weakKey3Comparer"); - - if (null == strongKeyComparer) - throw new ArgumentNullException("strongKeyComparer"); - - _comparers = - new KeySegmentComparer>> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey1Comparer }, - _tail = new KeySegmentComparer> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey2Comparer }, - _tail = new WeakKeyComparer { _equalityComparer = weakKey3Comparer } - } - } - ; - - _strongValueComparer = strongKeyComparer; - } - } - -#if !SILVERLIGHT - [Serializable] -#endif - internal class KeyComparer : KeyComparerBase, KeySegment>>>, S> - where W1 : class - where W2 : class - where W3 : class - where W4 : class - { - public KeyComparer(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - if (null == weakKey1Comparer) - throw new ArgumentNullException("weakKey1Comparer"); - - if (null == weakKey2Comparer) - throw new ArgumentNullException("weakKey2Comparer"); - - if (null == weakKey3Comparer) - throw new ArgumentNullException("weakKey3Comparer"); - - if (null == weakKey4Comparer) - throw new ArgumentNullException("weakKey4Comparer"); - - if (null == strongKeyComparer) - throw new ArgumentNullException("strongKeyComparer"); - - _comparers = - new KeySegmentComparer>>> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey1Comparer }, - _tail = new KeySegmentComparer>> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey2Comparer }, - _tail = new KeySegmentComparer> - { - _elementComparer = new WeakKeyComparer { _equalityComparer = weakKey3Comparer }, - _tail = new WeakKeyComparer { _equalityComparer = weakKey4Comparer } - } - } - } - ; - - _strongValueComparer = strongKeyComparer; - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/MaintenanceWorker.cs b/Users/Orvid/Orvid.Concurrent/MaintenanceWorker.cs deleted file mode 100644 index e18c90e6d4..0000000000 --- a/Users/Orvid/Orvid.Concurrent/MaintenanceWorker.cs +++ /dev/null @@ -1,160 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Helper class for ConcurrentWeakHashtable. Makes sure that its DoMaintenance method - /// gets called when the GarbageCollector has collected garbage. - /// - internal static class MaintenanceWorker - { - #region Garbage Collection tracking - - /// - /// Check all table registrations for continued existence. Removes the entries for - /// tables that have been GC'd - /// - private static void RemoveVoidTables() - { - //empty head may remain.. not bad. - var pos = _TableList; - - if (pos != null) - while (true) - { - var next = pos.Next; - - if (next == null) - break; - - if (next.Target == null) - pos.Next = next.Next; //safe, only 1 thread doing this - else - pos = next; - } - } - - /// - /// true if a table maintenance session is scheduled or ongoing. - /// - static int _TableMaintenanceIsPending = 0; - -#if !SILVERLIGHT - /// - /// Small timer that will - /// check every 1/10 second if second level GC count increased. - /// - static Timer _Timer = new Timer(CheckGCCount, null, 100, 100); - - static int _Level2GCCount; -#else - /// - /// Small timer that will start a garbage sweep every 10 seconds. - /// In growing hashtables the garbage will get swept regularly but they - /// can not shrink without a sweep. - /// - static Timer _Timer = new Timer(CheckGCCount, null, 10000, 10000); -#endif - - - /// - /// Checks if a garbage collection has indeed taken place and schedules - /// a table maintenance session. - /// - /// - static internal void CheckGCCount(object dummy) - { -#if !SILVERLIGHT - if (_Level2GCCount != GC.CollectionCount(2) && Interlocked.CompareExchange(ref _TableMaintenanceIsPending, 1, 0) == 0) - { - _Level2GCCount = GC.CollectionCount(2); -#else - if (Interlocked.CompareExchange(ref _TableMaintenanceIsPending, 1, 0) == 0) - { -#endif - RemoveVoidTables(); - - var thread = new System.Threading.Thread( - new ThreadStart( - delegate - { - try - { - var pos = _TableList; - - while (pos != null) - { - var target = (IMaintainable)pos.Target; - - if (target != null) - target.DoMaintenance(); - - pos = pos.Next; - } - } - finally - { - _TableMaintenanceIsPending = 0; - } - } - ) - ); - -#if !SILVERLIGHT - thread.Priority = ThreadPriority.Highest; -#endif - thread.Start(); - - } - } - - #endregion - - #region maintaining Tables list - - sealed class ListNode - { - public ListNode(object target) - { _Reference = new WeakReference(target); } - - WeakReference _Reference; - - public object Target { get { return _Reference.Target; } } - - public ListNode Next; - } - - /// - /// a list of all WeakHashtables - /// - static ListNode _TableList; - - /// - /// this is to be called from the constructor or initializer of a ConcurrentWeakHashtable instance - /// - internal static void Register(IMaintainable table) - { - var node = new ListNode(table); - - //Next may not be assigned correct value yet when garbage sweep starts - //but this is not a very big deal. - node.Next = _TableList; - node.Next = Interlocked.Exchange(ref _TableList, node); - } - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Concurrent/Orvid.Concurrent.csproj b/Users/Orvid/Orvid.Concurrent/Orvid.Concurrent.csproj deleted file mode 100644 index 49aa2cfb56..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Orvid.Concurrent.csproj +++ /dev/null @@ -1,125 +0,0 @@ - - - - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3} - Debug - x86 - Library - Orvid.Concurrent - Orvid.Concurrent - v4.7.1 - Properties - False - False - 4 - false - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - x86 - False - Auto - 4194304 - 4096 - - - bin\Debug\ - true - Full - False - False - DEBUG;TRACE; - - - bin\Release\ - False - None - True - False - TRACE - - - - - - 3.5 - - - - 3.5 - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - diff --git a/Users/Orvid/Orvid.Concurrent/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Concurrent/Properties/AssemblyInfo.cs deleted file mode 100644 index 465f9fce1f..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region Using directives - -using System; -using System.Reflection; -using System.Runtime.InteropServices; - -#endregion - -// 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("Orvid.Concurrent")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Orvid.Concurrent")] -[assembly: AssemblyCopyright("Copyright 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. -[assembly: ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.*")] diff --git a/Users/Orvid/Orvid.Concurrent/Segment.cs b/Users/Orvid/Orvid.Concurrent/Segment.cs deleted file mode 100644 index d28f0781d2..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Segment.cs +++ /dev/null @@ -1,481 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using Orvid.Concurrent.Threading; - - -namespace Orvid.Concurrent.Collections -{ - /// - /// A 'single writer - multi reader' threaded segment in a hashtable. - /// - /// - /// - /// - /// Though each segment can be accessed by 1 writer thread simultaneously, the hashtable becomes concurrent - /// for writing by containing many segments so that collisions are rare. The table will be fully concurrent - /// for read operations as far as they are not colliding with write operations. - /// Each segment is itself a small hashtable that can grow and shrink individualy. This prevents blocking of - /// the entire hashtable when growing or shrinking is needed. Because each segment is relatively small (depending on - /// the quality of the hash) resizing of the individual segments should not take much time. - /// - internal class Segment - { - #region Construction - - protected Segment( ) - {} - - public static Segment Create(Int32 initialSize) - { - var instance = new Segment(); - instance.Initialize(initialSize); - return instance; - } - - /// - /// Initialize the segment. - /// - /// - protected virtual void Initialize(Int32 initialSize) - { _List = new TStored[Math.Max(4, initialSize)]; } - - /// - /// When segment gets introduced into hashtable then its allocated space should be added to the - /// total allocated space. - /// Single threaded access or locking is needed - /// - /// - public void Welcome(ConcurrentHashtable traits) - { traits.EffectTotalAllocatedSpace(_List.Length); } - - /// - /// When segment gets removed from hashtable then its allocated space should be subtracted to the - /// total allocated space. - /// Single threaded access or locking is needed - /// - /// - public void Bye(ConcurrentHashtable traits) - { - traits.EffectTotalAllocatedSpace(-_List.Length); - _List = null; - } - - - #endregion - - #region Locking - - TinyReaderWriterLock _Lock; - - internal void LockForWriting() - { _Lock.LockForWriting(); } - - internal void LockForReading() - { _Lock.LockForReading(); } - - internal bool Lock(bool forReading) - { - return forReading ? _Lock.LockForReading(false) : _Lock.LockForWriting(false); - } - - internal void ReleaseForWriting() - { _Lock.ReleaseForWriting(); } - - internal void ReleaseForReading() - { _Lock.ReleaseForReading(); } - - internal void Release(bool forReading) - { - if (forReading) - _Lock.ReleaseForReading(); - else - _Lock.ReleaseForWriting(); - } - - #endregion - - /// - /// Array with 'slots'. Each slot can be filled or empty. - /// - internal TStored[] _List; - - /// - /// Boolean value indicating if this segment has not been trashed yet. - /// - internal bool IsAlive { get { return _List != null; } } - - - #region Item Manipulation methods - - /// - /// Inserts an item into a *not empty* spot given by position i. It moves items forward until an empty spot is found. - /// - /// - /// - /// - /// - private void InsertItemAtIndex(UInt32 mask, UInt32 i, TStored itemCopy, ConcurrentHashtable traits) - { - do - { - //swap - TStored temp = _List[i]; - _List[i] = itemCopy; - itemCopy = temp; - - i = (i + 1) & mask; - } - while(!traits.IsEmpty(ref _List[i])); - - _List[i] = itemCopy; - } - - /// - /// Find item in segment. - /// - /// Reference to the search key to use. - /// Out reference to store the found item in. - /// Object that tells this segment how to treat items and keys. - /// True if an item could be found, otherwise false. - public bool FindItem(ref TSearch key, out TStored item, ConcurrentHashtable traits) - { - var searchHash = traits.GetKeyHashCode(ref key); - var mask = (UInt32)(_List.Length - 1); - var i = searchHash & mask; - - if (!traits.IsEmpty(ref _List[i])) - { - var firstHash = traits.GetItemHashCode(ref _List[i]); - var storedItemHash = firstHash; - var searchHashDiff = (searchHash - firstHash) & mask; - - do - { - if (storedItemHash == searchHash && traits.ItemEqualsKey(ref _List[i], ref key)) - { - item = _List[i]; - return true; - } - - i = (i + 1) & mask; - - if(traits.IsEmpty(ref _List[i])) - break; - - storedItemHash = traits.GetItemHashCode(ref _List[i]); - } - while (((storedItemHash - firstHash) & mask) <= searchHashDiff); - } - - item = default(TStored); - return false; - } - - /// - /// Find an existing item or, if it can't be found, insert a new item. - /// - /// Reference to the item that will be inserted if an existing item can't be found. It will also be used to search with. - /// Out reference to store the found item or, if it can not be found, the new inserted item. - /// Object that tells this segment how to treat items and keys. - /// True if an existing item could be found, otherwise false. - public bool GetOldestItem(ref TStored key, out TStored item, ConcurrentHashtable traits) - { - var searchHash = traits.GetItemHashCode(ref key); - var mask = (UInt32)(_List.Length - 1); - var i = searchHash & mask; - - if (!traits.IsEmpty(ref _List[i])) - { - var firstHash = traits.GetItemHashCode(ref _List[i]); - var storedItemHash = firstHash; - var searchHashDiff = (searchHash - firstHash) & mask; - - while (true) - { - if (storedItemHash == searchHash && traits.ItemEqualsItem(ref _List[i], ref key)) - { - item = _List[i]; - return true; - } - - i = (i + 1) & mask; - - if (traits.IsEmpty(ref _List[i])) - break; - - storedItemHash = traits.GetItemHashCode(ref _List[i]); - - if (((storedItemHash - firstHash) & mask) > searchHashDiff) - { - //insert - InsertItemAtIndex(mask, i, key, traits); - IncrementCount(traits); - item = key; - return false; - } - } - } - - item = _List[i] = key; - IncrementCount(traits); - return false; - } - - /// - /// Inserts an item in the segment, possibly replacing an equal existing item. - /// - /// A reference to the item to insert. - /// An out reference where any replaced item will be written to, if no item was replaced the new item will be written to this reference. - /// Object that tells this segment how to treat items and keys. - /// True if an existing item could be found and is replaced, otherwise false. - public bool InsertItem(ref TStored key, out TStored item, ConcurrentHashtable traits) - { - var searchHash = traits.GetItemHashCode(ref key); - var mask = (UInt32)(_List.Length - 1); - var i = searchHash & mask; - - if (!traits.IsEmpty(ref _List[i])) - { - var firstHash = traits.GetItemHashCode(ref _List[i]); - var storedItemHash = firstHash; - var searchHashDiff = (searchHash - firstHash) & mask; - - while (true) - { - if (storedItemHash == searchHash && traits.ItemEqualsItem(ref _List[i], ref key)) - { - item = _List[i]; - _List[i] = key; - return true; - } - - i = (i + 1) & mask; - - if (traits.IsEmpty(ref _List[i])) - break; - - storedItemHash = traits.GetItemHashCode(ref _List[i]); - - if (((storedItemHash - firstHash) & mask) > searchHashDiff) - { - //insert - InsertItemAtIndex(mask, i, key, traits); - IncrementCount(traits); - item = key; - return false; - } - } - } - - item = _List[i] = key; - IncrementCount(traits); - return false; - } - - /// - /// Removes an item from the segment. - /// - /// A reference to the key to search with. - /// An out reference where the removed item will be stored or default() if no item to remove can be found. - /// Object that tells this segment how to treat items and keys. - /// True if an item could be found and is removed, false otherwise. - public bool RemoveItem(ref TSearch key, out TStored item, ConcurrentHashtable traits) - { - var searchHash = traits.GetKeyHashCode(ref key); - var mask = (UInt32)(_List.Length - 1); - var i = searchHash & mask; - - if (!traits.IsEmpty(ref _List[i])) - { - var firstHash = traits.GetItemHashCode(ref _List[i]); - var storedItemHash = firstHash; - var searchHashDiff = (searchHash - firstHash) & mask; - - do - { - if (storedItemHash == searchHash && traits.ItemEqualsKey(ref _List[i], ref key)) - { - item = _List[i]; - RemoveAtIndex(i, traits); - DecrementCount(traits); - return true; - } - - i = (i + 1) & mask; - - if (traits.IsEmpty(ref _List[i])) - break; - - storedItemHash = traits.GetItemHashCode(ref _List[i]); - } - while (((storedItemHash - firstHash) & mask) <= searchHashDiff); - } - - item = default(TStored); - return false; - } - - protected void RemoveAtIndex(UInt32 index, ConcurrentHashtable traits) - { - var mask = (UInt32)(_List.Length - 1); - var i = index; - var j = (index + 1) & mask; - - while(!traits.IsEmpty(ref _List[j]) && (traits.GetItemHashCode(ref _List[j]) & mask) != j) - { - _List[i] = _List[j]; - - i = j; - j = (j + 1) & mask; - } - - _List[i] = default(TStored); - } - - public void Clear(ConcurrentHashtable traits) - { - var oldList = _List; - _List = new TStored[4]; - - var effect = _List.Length - oldList.Length; - - if (effect != 0) - traits.EffectTotalAllocatedSpace(effect); - - _Count = 0; - } - - /// - /// Iterate over items in the segment. - /// - /// Position beyond which the next filled slot will be found and the item in that slot returned. (Starting with -1) - /// Out reference where the next item will be stored or default if the end of the segment is reached. - /// Object that tells this segment how to treat items and keys. - /// The index position the next item has been found or -1 otherwise. - public int GetNextItem(int beyond, out TStored item, ConcurrentHashtable traits) - { - for (int end = _List.Length; ++beyond < end; ) - { - if (!traits.IsEmpty(ref _List[beyond])) - { - item = _List[beyond]; - return beyond; - } - } - - item = default(TStored); - return -1; - } - - #endregion - - #region Resizing - - protected virtual void ResizeList(ConcurrentHashtable traits) - { - var oldList = _List; - var oldListLength = oldList.Length; - - var newListLength = 2; - - while (newListLength < _Count) - newListLength <<= 1; - - newListLength <<= 1; - - if (newListLength != oldListLength) - { - _List = new TStored[newListLength]; - - var mask = (UInt32)(newListLength - 1); - - for (int i = 0; i != oldListLength; ++i) - if (!traits.IsEmpty(ref oldList[i])) - { - var searchHash = traits.GetItemHashCode(ref oldList[i]); - - //j is prefered insertion pos in new list. - var j = searchHash & mask; - - if (traits.IsEmpty(ref _List[j])) - _List[j] = oldList[i]; - else - { - var firstHash = traits.GetItemHashCode(ref _List[j]); - var storedItemHash = firstHash; - var searchHashDiff = (searchHash - firstHash) & mask; - - while (true) - { - j = (j + 1) & mask; - - if (traits.IsEmpty(ref _List[j])) - { - _List[j] = oldList[i]; - break; - } - - storedItemHash = traits.GetItemHashCode(ref _List[j]); - - if (((storedItemHash - firstHash) & mask) > searchHashDiff) - { - InsertItemAtIndex(mask, j, oldList[i], traits); - break; - } - } - } - } - - traits.EffectTotalAllocatedSpace(newListLength - oldListLength); - } - } - - /// - /// Total numer of filled slots in _List. - /// - internal Int32 _Count; - - protected void DecrementCount(ConcurrentHashtable traits, int amount) - { - var oldListLength = _List.Length; - _Count -= amount; - - if (oldListLength > 4 && _Count < (oldListLength >> 2)) - //Shrink - ResizeList(traits); - } - - protected void DecrementCount(ConcurrentHashtable traits) - { DecrementCount(traits, 1); } - - private void IncrementCount(ConcurrentHashtable traits) - { - var oldListLength = _List.Length; - - if (++_Count >= (oldListLength - (oldListLength >> 2))) - //Grow - ResizeList(traits); - } - - /// - /// Remove any excess allocated space - /// - /// - internal void Trim(ConcurrentHashtable traits) - { DecrementCount(traits, 0); } - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Concurrent/Segmentrange.cs b/Users/Orvid/Orvid.Concurrent/Segmentrange.cs deleted file mode 100644 index f4151efad9..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Segmentrange.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - internal class Segmentrange - { - protected Segmentrange() - {} - - public static Segmentrange Create(int segmentCount, int initialSegmentSize) - { - var instance = new Segmentrange(); - instance.Initialize(segmentCount, initialSegmentSize); - return instance; - } - - protected virtual void Initialize(int segmentCount, int initialSegmentSize) - { - _Segments = new Segment[segmentCount]; - - for (int i = 0, end = _Segments.Length; i != end; ++i) - _Segments[i] = CreateSegment(initialSegmentSize); - - for (int w = segmentCount; w != 0; w <<= 1) - ++_Shift; - } - - protected virtual Segment CreateSegment(int initialSegmentSize) - { return Segment.Create(initialSegmentSize); } - - Segment[] _Segments; - Int32 _Shift; - - public Segment GetSegment(UInt32 hash) - { return _Segments[hash >> _Shift]; } - - public Segment GetSegmentByIndex(Int32 index) - { return _Segments[index]; } - - public Int32 Count { get { return _Segments.Length; } } - - public Int32 Shift { get { return _Shift; } } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/Stacktype.cs b/Users/Orvid/Orvid.Concurrent/Stacktype.cs deleted file mode 100644 index 808dfbfdc6..0000000000 --- a/Users/Orvid/Orvid.Concurrent/Stacktype.cs +++ /dev/null @@ -1,116 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - internal struct Stacktype - { - public T1 Item1; - - public Tuple AsTuple() - { return Tuple.Create(Item1); } - } - internal struct Stacktype - { - public T1 Item1; - public T2 Item2; - - public Tuple AsTuple() - { return Tuple.Create(Item1, Item2); } - } - - internal struct Stacktype - { - public T1 Item1; - public T2 Item2; - public T3 Item3; - - public Tuple AsTuple() - { return Tuple.Create(Item1, Item2, Item3); } - } - - internal struct Stacktype - { - public T1 Item1; - public T2 Item2; - public T3 Item3; - public T4 Item4; - - public Tuple AsTuple() - { return Tuple.Create(Item1, Item2, Item3, Item4); } - } - - internal struct Stacktype - { - public T1 Item1; - public T2 Item2; - public T3 Item3; - public T4 Item4; - public T5 Item5; - - public Tuple AsTuple() - { return Tuple.Create(Item1, Item2, Item3, Item4, Item5); } - } - - internal static class Stacktype - { - public static Stacktype AsStacktype(this Tuple key) - { - if (null == key) - throw new ArgumentNullException("key"); - - return new Stacktype { Item1 = key.Item1, Item2 = key.Item2 }; - } - - public static Stacktype AsStacktype(this Tuple key) - { - if (null == key) - throw new ArgumentNullException("key"); - - return new Stacktype { Item1 = key.Item1, Item2 = key.Item2, Item3 = key.Item3 }; - } - - public static Stacktype AsStacktype(this Tuple key) - { - if (null == key) - throw new ArgumentNullException("key"); - - return new Stacktype { Item1 = key.Item1, Item2 = key.Item2, Item3 = key.Item3, Item4 = key.Item4 }; - } - - public static Stacktype AsStacktype(this Tuple key) - { - if (null == key) - throw new ArgumentNullException("key"); - - return new Stacktype { Item1 = key.Item1, Item2 = key.Item2, Item3 = key.Item3, Item4 = key.Item4, Item5 = key.Item5 }; - } - - public static Stacktype Create(T1 t1) - { return new Stacktype { Item1 = t1 }; } - - public static Stacktype Create(T1 t1, T2 t2) - { return new Stacktype { Item1 = t1, Item2 = t2 }; } - - public static Stacktype Create(T1 t1, T2 t2, T3 t3) - { return new Stacktype { Item1 = t1, Item2 = t2, Item3 = t3 }; } - - public static Stacktype Create(T1 t1, T2 t2, T3 t3, T4 t4) - { return new Stacktype { Item1 = t1, Item2 = t2, Item3 = t3, Item4 = t4 }; } - - public static Stacktype Create(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) - { return new Stacktype { Item1 = t1, Item2 = t2, Item3 = t3, Item4 = t4, Item5 = t5 }; } - } - - -} diff --git a/Users/Orvid/Orvid.Concurrent/TinyReaderWriterLock.cs b/Users/Orvid/Orvid.Concurrent/TinyReaderWriterLock.cs deleted file mode 100644 index 227a31eac2..0000000000 --- a/Users/Orvid/Orvid.Concurrent/TinyReaderWriterLock.cs +++ /dev/null @@ -1,348 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Diagnostics; - -namespace Orvid.Concurrent.Threading -{ - /// - /// Tiny spin lock that allows multiple readers simultanously and 1 writer exclusively - /// -#if !SILVERLIGHT - [Serializable] -#endif - public struct TinyReaderWriterLock - { -#if !SILVERLIGHT - [NonSerialized] -#endif - Int32 _Bits; - - const int ReadersInRegionOffset = 0; - const int ReadersInRegionsMask = 255; - const int ReadersWaitingOffset = 8; - const int ReadersWaitingMask = 255; - const int WriterInRegionOffset = 16; - const int WritersWaitingOffset = 17; - const int WritersWaitingMask = 15; - const int BiasOffset = 21; - const int BiasMask = 3; - - enum Bias { None = 0, Readers = 1, Writers = 2 }; - - struct Data - { - public int _ReadersInRegion; - public int _ReadersWaiting; - public bool _WriterInRegion; - public int _WritersWaiting; - public Bias _Bias; - public Int32 _OldBits; - } - - void GetData(out Data data) - { - Int32 bits = _Bits; - - data._ReadersInRegion = bits & ReadersInRegionsMask ; - data._ReadersWaiting = (bits >> ReadersWaitingOffset) & ReadersWaitingMask; - data._WriterInRegion = ((bits >> WriterInRegionOffset) & 1) != 0; - data._WritersWaiting = (bits >> WritersWaitingOffset) & WritersWaitingMask; - data._Bias = (Bias)((bits >> BiasOffset) & BiasMask); - data._OldBits = bits; - } - - bool SetData(ref Data data) - { - Int32 bits ; - - bits = - data._ReadersInRegion - | (data._ReadersWaiting << ReadersWaitingOffset) - | ((data._WriterInRegion ? 1 : 0) << WriterInRegionOffset) - | (data._WritersWaiting << WritersWaitingOffset) - | ((int)data._Bias << BiasOffset); - - return Interlocked.CompareExchange(ref _Bits, bits, data._OldBits) == data._OldBits; - } - - /// - /// Release a reader lock - /// - public void ReleaseForReading() - { - //try shortcut first. - if (Interlocked.CompareExchange(ref _Bits, 0, 1) == 1) - return; - - Data data; - - do - { - GetData(out data); - -#if DEBUG - if (data._ReadersInRegion == 0) - throw new InvalidOperationException("Mismatching Lock/Release for reading."); - - //if (data._WriterInRegion) - // throw new InvalidOperationException("Unexpected writer in region."); -#endif - - --data._ReadersInRegion; - - if (data._ReadersInRegion == 0 && data._ReadersWaiting == 0) - data._Bias = data._WritersWaiting != 0 ? Bias.Writers : Bias.None; - } - while (!SetData(ref data)); - } - - /// - /// Release a writer lock - /// - public void ReleaseForWriting() - { - //try shortcut first. - if (Interlocked.CompareExchange(ref _Bits, 0, 1 << WriterInRegionOffset) == 1 << WriterInRegionOffset) - return; - - Data data; - - do - { - GetData(out data); - -#if DEBUG - if (!data._WriterInRegion) - throw new InvalidOperationException("Mismatching Lock/Release for writing."); - - //if (data._ReadersInRegion != 0) - // throw new InvalidOperationException("Unexpected reader in region."); -#endif - - data._WriterInRegion = false; - - if (data._WritersWaiting == 0) - data._Bias = data._ReadersWaiting != 0 ? Bias.Readers : Bias.None; - } - while (!SetData(ref data)); - } - - /// - /// Aquire a reader lock. Wait until lock is aquired. - /// - public void LockForReading() - { LockForReading(true); } - - /// - /// Aquire a reader lock. - /// - /// True if to wait until lock aquired, False to return immediately. - /// Boolean indicating if lock was successfuly aquired. - public bool LockForReading(bool wait) - { - //try shortcut first. - if (Interlocked.CompareExchange(ref _Bits, 1, 0) == 0) - return true; - - bool waitingRegistered = false; - - try - { - while (true) - { - bool retry = false; - Data data; - GetData(out data); - - if (data._Bias != Bias.Writers) - { - if (data._ReadersInRegion < ReadersInRegionsMask && !data._WriterInRegion) - { - if (waitingRegistered) - { - data._Bias = Bias.Readers; - --data._ReadersWaiting; - ++data._ReadersInRegion; - if (SetData(ref data)) - { - waitingRegistered = false; - return true; - } - else - retry = true; - } - else if (data._WritersWaiting == 0) - { - data._Bias = Bias.Readers; - ++data._ReadersInRegion; - if (SetData(ref data)) - return true; - else - retry = true; - } - } - - //sleep - } - else - { - if (!waitingRegistered && data._ReadersWaiting < ReadersWaitingMask && wait) - { - ++data._ReadersWaiting; - if (SetData(ref data)) - { - waitingRegistered = true; - //sleep - } - else - retry = true; - } - - //sleep - } - - if (!retry) - { - if (!wait) - return false; - - System.Threading.Thread.Sleep(0); - } - } - } - finally - { - if (waitingRegistered) - { - //Thread aborted? - Data data; - - do - { - GetData(out data); - --data._ReadersWaiting; - - if (data._ReadersInRegion == 0 && data._ReadersWaiting == 0) - data._Bias = data._WritersWaiting != 0 ? Bias.Writers : Bias.None; - } - while (!SetData(ref data)); - } - } - } - - /// - /// Aquire a writer lock. Wait until lock is aquired. - /// - public void LockForWriting() - { LockForWriting(true); } - - /// - /// Aquire a writer lock. - /// - /// True if to wait until lock aquired, False to return immediately. - /// Boolean indicating if lock was successfuly aquired. - public bool LockForWriting(bool wait) - { - //try shortcut first. - if (Interlocked.CompareExchange(ref _Bits, 1 << WriterInRegionOffset, 0) == 0) - return true; - - bool waitingRegistered = false; - - try - { - while (true) - { - bool retry = false; - Data data; - GetData(out data); - - if (data._Bias != Bias.Readers) - { - if (data._ReadersInRegion == 0 && !data._WriterInRegion) - { - if (waitingRegistered) - { - data._Bias = Bias.Writers; - --data._WritersWaiting; - data._WriterInRegion = true; - if (SetData(ref data)) - { - waitingRegistered = false; - return true; - } - else - retry = true; - } - else if (data._ReadersWaiting == 0) - { - data._Bias = Bias.Writers; - data._WriterInRegion = true; - if (SetData(ref data)) - return true; - else - retry = true; - } - } - - //sleep - } - else - { - if (!waitingRegistered && data._WritersWaiting < WritersWaitingMask && wait) - { - ++data._WritersWaiting; - if (SetData(ref data)) - { - waitingRegistered = true; - //sleep - } - else - retry = true; - } - - //sleep - } - - if (!retry) - { - if (!wait) - return false; - - System.Threading.Thread.Sleep(0); - } - } - } - finally - { - if (waitingRegistered) - { - //Thread aborted? - Data data; - - do - { - GetData(out data); - --data._WritersWaiting; - - if (!data._WriterInRegion && data._WritersWaiting == 0) - data._Bias = data._ReadersWaiting != 0 ? Bias.Readers : Bias.None; - } - while (!SetData(ref data)); - } - } - } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/TransformedCollection.cs b/Users/Orvid/Orvid.Concurrent/TransformedCollection.cs deleted file mode 100644 index 4925f30084..0000000000 --- a/Users/Orvid/Orvid.Concurrent/TransformedCollection.cs +++ /dev/null @@ -1,79 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; - -namespace Orvid.Concurrent.Collections -{ - class TransformedCollection : ICollection, ICollection - { - public IEnumerable _source; - - #region ICollection Members - - public void Add(TOut item) - { throw new NotImplementedException(); } - - public void Clear() - { throw new NotImplementedException(); } - - public bool Contains(TOut item) - { return _source.Contains(item); } - - public void CopyTo(TOut[] array, int arrayIndex) - { - foreach (var item in _source) - array[arrayIndex++] = item; - } - - public int Count - { get { return _source.Count(); } } - - public bool IsReadOnly - { get { return true; } } - - public bool Remove(TOut item) - { throw new NotImplementedException(); } - - #endregion - - #region IEnumerable Members - - public IEnumerator GetEnumerator() - { return _source.GetEnumerator(); } - - #endregion - - #region IEnumerable Members - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { return this.GetEnumerator(); } - - #endregion - - #region ICollection Members - - void ICollection.CopyTo(Array array, int index) - { this.CopyTo((TOut[])array, index); } - - int ICollection.Count - { get { return this.Count; } } - - bool ICollection.IsSynchronized - { get { return true; } } - - object ICollection.SyncRoot - { get { return this; } } - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakDictionary.0.cs b/Users/Orvid/Orvid.Concurrent/WeakDictionary.0.cs deleted file mode 100644 index eb8279f368..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakDictionary.0.cs +++ /dev/null @@ -1,232 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Represents a thread-safe collection of key-value pairs that can be accessed - /// by multiple threads concurrently and has weak references to the values. - /// - /// The type of the keys in this dictionary. - /// The type of the values in this dictionary. This must be a reference type. - /// - /// Whenever any of the values held by this dictionary is garbage collected the key-value pair holding the value will be removed from the dictionary. - /// -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakDictionary : DictionaryBase -#if !SILVERLIGHT - , ISerializable -#endif - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - StrongKey, - TStrongKey, - TValue, - StrongKey - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override StrongKey FromExternalKeyToSearchKey(TStrongKey externalKey) - { return new StrongKey(externalKey); } - - protected override StrongKey FromExternalKeyToStorageKey(TStrongKey externalKey) - { return new StrongKey(externalKey); } - - protected override StrongKey FromStackKeyToSearchKey(StrongKey externalKey) - { return externalKey; } - - protected override StrongKey FromStackKeyToStorageKey(StrongKey externalKey) - { return externalKey; } - - protected override bool FromInternalKeyToExternalKey(StrongKey internalKey, out TStrongKey externalKey) - { - externalKey = internalKey._element; - return true; - } - - protected override bool FromInternalKeyToStackKey(StrongKey internalKey, out StrongKey externalKey) - { - externalKey = internalKey; - return true; - } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List>)serializationInfo.GetValue("Items", typeof(List>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakDictionary() - : this(EqualityComparer.Default) - {} - - public WeakDictionary(IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty>(), strongKeyComparer) - {} - - public WeakDictionary(IEnumerable> collection) - : this(collection, EqualityComparer.Default) - {} - - public WeakDictionary(IEnumerable> collection, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default) - {} - - public WeakDictionary(int concurrencyLevel, IEnumerable> collection, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakDictionary(int concurrencyLevel, int capacity, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TStrongKey strongKey) - { return _internalDictionary.ContainsKey( new StrongKey(strongKey) ); } - - public bool TryGetValue(TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(new StrongKey(strongKey), out value); } - - public TValue this[TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(new StrongKey(strongKey)); } - set { _internalDictionary.SetItem(new StrongKey(strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - new StrongKey(strongKey), - hr => addValueFactory(hr._element), - (hr, v) => updateValueFactory(hr._element, v) - ) - ; - } - - public TValue AddOrUpdate(TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - new StrongKey(strongKey), - addValue, - (hr, v) => updateValueFactory(hr._element, v) - ) - ; - } - - public TValue GetOrAdd(TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(new StrongKey(strongKey), value); } - - public TValue GetOrAdd(TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(new StrongKey(strongKey), hr => valueFactory(hr._element)); - } - - public KeyValuePair[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(new StrongKey(strongKey), value); } - - public bool TryRemove(TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(new StrongKey(strongKey), out value); } - - public bool TryUpdate(TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(new StrongKey(strongKey), newValue, comparisonValue); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakDictionary.1.cs b/Users/Orvid/Orvid.Concurrent/WeakDictionary.1.cs deleted file mode 100644 index 452357fecf..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakDictionary.1.cs +++ /dev/null @@ -1,233 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Represents a thread-safe collection of composite key-value pairs that can be accessed - /// by multiple threads concurrently and has weak references to the values and part of the key. - /// - /// The type of the part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the part of the keys in this dictionary that can be a value type or a strongly referenced reference type. - /// The type of the values in this dictionary. This must be a reference type. - /// - /// The keys consist of two parts. The first part is the weakly referenced part and it can always be garbage collected. - /// The second part is the strong part and it can be a value type or reference type that will never be garbage collected - /// as long as the key-value pair is held by this dictionary and the dictionary itself is not garbage collected. - /// - /// Whenever any of the values or weak part of the keys held by this dictionary are garbage collected the key-value pair - /// holding the value or key part will be removed from the dictionary. - /// -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty,TValue>>(), weakKeyComparer, strongKeyComparer) - {} - - public WeakDictionary(IEnumerable,TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey, strongKey), hr => valueFactory(hr.Item1, hr.Item2)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakDictionary.2.cs b/Users/Orvid/Orvid.Concurrent/WeakDictionary.2.cs deleted file mode 100644 index 1d77c6d0cc..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakDictionary.2.cs +++ /dev/null @@ -1,235 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Represents a thread-safe collection of composite key-value pairs that can be accessed - /// by multiple threads concurrently and has weak references to the values and parts of the key. - /// - /// The type of the first part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the second part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the part of the keys in this dictionary that can be a value type or a strongly referenced reference type. - /// The type of the values in this dictionary. This must be a reference type. - /// - /// The keys consist of three parts. The first two parts are weakly referenced and can always be garbage collected. - /// The third part is the strong part and it can be a value type or reference type that will never be garbage collected - /// as long as the key-value pair is held by this dictionary and the dictionary itself is not garbage collected. - /// - /// Whenever any of the values or weak parts of the keys held by this dictionary are garbage collected the key-value pair - /// holding the value or key part or parts will be removed from the dictionary. - /// -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - {} - - public WeakDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakDictionary.3.cs b/Users/Orvid/Orvid.Concurrent/WeakDictionary.3.cs deleted file mode 100644 index 7b03798ced..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakDictionary.3.cs +++ /dev/null @@ -1,237 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Represents a thread-safe collection of composite key-value pairs that can be accessed - /// by multiple threads concurrently and has weak references to the values and parts of the key. - /// - /// The type of the first part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the second part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the third part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the part of the keys in this dictionary that can be a value type or a strongly referenced reference type. - /// The type of the values in this dictionary. This must be a reference type. - /// - /// The keys consist of four parts. The first three parts are weakly referenced and can always be garbage collected. - /// The fourth part is the strong part and it can be a value type or reference type that will never be garbage collected - /// as long as the key-value pair is held by this dictionary and the dictionary itself is not garbage collected. - /// - /// Whenever any of the values or weak parts of the keys held by this dictionary are garbage collected the key-value pair - /// holding the value or key part or parts will be removed from the dictionary. - /// -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TWeakKey3 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - {} - - public WeakDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakDictionary.4.cs b/Users/Orvid/Orvid.Concurrent/WeakDictionary.4.cs deleted file mode 100644 index 456d1c13f1..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakDictionary.4.cs +++ /dev/null @@ -1,239 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ - /// - /// Represents a thread-safe collection of composite key-value pairs that can be accessed - /// by multiple threads concurrently and has weak references to the values and parts of the key. - /// - /// The type of the first part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the second part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the third part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the fourth part of the keys in this dictionary that will be weakly referenced. This must be a reference type. - /// The type of the part of the keys in this dictionary that can be a value type or a strongly referenced reference type. - /// The type of the values in this dictionary. This must be a reference type. - /// - /// The keys consist of five parts. The first four parts are weakly referenced and can always be garbage collected. - /// The fifth part is the strong part and it can be a value type or reference type that will never be garbage collected - /// as long as the key-value pair is held by this dictionary and the dictionary itself is not garbage collected. - /// - /// Whenever any of the values or weak parts of the keys held by this dictionary are garbage collected the key-value pair - /// holding the value or key part or parts will be removed from the dictionary. - /// -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TWeakKey3 : class - where TWeakKey4 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - {} - - public WeakDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.1.cs b/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.1.cs deleted file mode 100644 index ee0ed6b4d3..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.1.cs +++ /dev/null @@ -1,217 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakKeyDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - { - sealed class InternalWeakKeyDictionary : - InternalWeakDictionaryStrongValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakKeyDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakKeyDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakKeyDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakKeyDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakKeyDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakKeyDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty,TValue>>(), weakKeyComparer, strongKeyComparer) - {} - - public WeakKeyDictionary(IEnumerable,TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakKeyDictionary( - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakKeyDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKeyComparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakKeyDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKeyComparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey, strongKey), hr => valueFactory(hr.Item1, hr.Item2)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.2.cs b/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.2.cs deleted file mode 100644 index ff6441467d..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.2.cs +++ /dev/null @@ -1,219 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakKeyDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryStrongValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakKeyDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakKeyDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.3.cs b/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.3.cs deleted file mode 100644 index 13091cdf79..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.3.cs +++ /dev/null @@ -1,220 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakKeyDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TWeakKey3 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryStrongValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakKeyDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakKeyDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, weakKey3, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.4.cs b/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.4.cs deleted file mode 100644 index 2985ec6fae..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakKeyDictionary.4.cs +++ /dev/null @@ -1,221 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakKeyDictionary : DictionaryBase, TValue> -#if !SILVERLIGHT - , ISerializable -#endif - where TWeakKey1 : class - where TWeakKey2 : class - where TWeakKey3 : class - where TWeakKey4 : class - where TValue : class - { - sealed class InternalWeakDictionary : - InternalWeakDictionaryStrongValueBase< - Key, - Tuple, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { - _comparer = keyComparer; - MaintenanceWorker.Register(this); - } - - public KeyComparer _comparer; - - protected override Key FromExternalKeyToSearchKey(Tuple externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromExternalKeyToStorageKey(Tuple externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToSearchKey(Stacktype externalKey) - { return new SearchKey().Set(externalKey, _comparer); } - - protected override Key FromStackKeyToStorageKey(Stacktype externalKey) - { return new StorageKey().Set(externalKey, _comparer); } - - protected override bool FromInternalKeyToExternalKey(Key internalKey, out Tuple externalKey) - { return internalKey.Get(out externalKey); } - - protected override bool FromInternalKeyToStackKey(Key internalKey, out Stacktype externalKey) - { return internalKey.Get(out externalKey); } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary, TValue> InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakKeyDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List, TValue>>)serializationInfo.GetValue("Items", typeof(List, TValue>>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakKeyDictionary() - : this(EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty, TValue>>(), weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection) - : this(collection, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default, EqualityComparer.Default) - {} - - public WeakKeyDictionary(int concurrencyLevel, IEnumerable, TValue>> collection, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakKeyDictionary(int concurrencyLevel, int capacity, IEqualityComparer weakKey1Comparer, IEqualityComparer weakKey2Comparer, IEqualityComparer weakKey3Comparer, IEqualityComparer weakKey4Comparer, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(weakKey1Comparer, weakKey2Comparer, weakKey3Comparer, weakKey4Comparer, strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey)); } - - public bool TryGetValue(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), out value); } - - public TValue this[TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - if (null == addValueFactory) - throw new ArgumentNullException("addValueFactory"); - - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), - hr => addValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5), - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5, v) - ) - ; - } - - public TValue AddOrUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - if (null == updateValueFactory) - throw new ArgumentNullException("updateValueFactory"); - - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), - addValue, - (hr, v) => updateValueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5, v) - ) - ; - } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - - public TValue GetOrAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), hr => valueFactory(hr.Item1, hr.Item2, hr.Item3, hr.Item4, hr.Item5)); - } - - public KeyValuePair, TValue>[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), value); } - - public bool TryRemove(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), out value); } - - public bool TryUpdate(TWeakKey1 weakKey1, TWeakKey2 weakKey2, TWeakKey3 weakKey3, TWeakKey4 weakKey4, TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(weakKey1, weakKey2, weakKey3, weakKey4, strongKey), newValue, comparisonValue ); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakValueDictionary.cs b/Users/Orvid/Orvid.Concurrent/WeakValueDictionary.cs deleted file mode 100644 index b49ca8fed6..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakValueDictionary.cs +++ /dev/null @@ -1,208 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Collections; -using System.Runtime.Serialization; -using System.Security; - -namespace Orvid.Concurrent.Collections -{ -#if !SILVERLIGHT - [Serializable] -#endif - public class WeakValueDictionary : DictionaryBase -#if !SILVERLIGHT - , ISerializable -#endif - where TValue : class - { - class InternalWeakDictionary : - InternalWeakDictionaryWeakValueBase< - StrongKey, - TStrongKey, - TValue, - Stacktype - > - { - public InternalWeakDictionary(int concurrencyLevel, int capacity, KeyComparer keyComparer) - : base(concurrencyLevel, capacity, keyComparer) - { _comparer = keyComparer; } - - public InternalWeakDictionary(KeyComparer keyComparer) - : base(keyComparer) - { _comparer = keyComparer; } - - public KeyComparer _comparer; - - protected override StrongKey FromExternalKeyToSearchKey(TStrongKey externalKey) - { return new StrongKey() { _element = externalKey }; } - - protected override StrongKey FromExternalKeyToStorageKey(TStrongKey externalKey) - { return new StrongKey() { _element = externalKey }; } - - protected override StrongKey FromStackKeyToSearchKey(Stacktype externalKey) - { return new StrongKey() { _element = externalKey.Item1 }; } - - protected override StrongKey FromStackKeyToStorageKey(Stacktype externalKey) - { return new StrongKey() { _element = externalKey.Item1 }; } - - protected override bool FromInternalKeyToExternalKey(StrongKey internalKey, out TStrongKey externalKey) - { - externalKey = internalKey._element; - return true; - } - - protected override bool FromInternalKeyToStackKey(StrongKey internalKey, out Stacktype externalKey) - { - externalKey = Stacktype.Create(internalKey._element); - return true; - } - } - - readonly InternalWeakDictionary _internalDictionary; - - protected override IDictionary InternalDictionary - { get { return _internalDictionary; } } - -#if !SILVERLIGHT - WeakValueDictionary(SerializationInfo serializationInfo, StreamingContext streamingContext) - { - var comparer = (KeyComparer)serializationInfo.GetValue("Comparer", typeof(KeyComparer)); - var items = (List>)serializationInfo.GetValue("Items", typeof(List>)); - _internalDictionary = new InternalWeakDictionary(comparer); - _internalDictionary.InsertContents(items); - } - - #region ISerializable Members - - [SecurityCritical] - void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) - { - info.AddValue("Comparer", _internalDictionary._comparer); - info.AddValue("Items", _internalDictionary.GetContents()); - } - #endregion -#endif - - public WeakValueDictionary() - : this(EqualityComparer.Default) - {} - - public WeakValueDictionary(IEqualityComparer strongKeyComparer) - : this(Enumerable.Empty>(), strongKeyComparer) - {} - - public WeakValueDictionary(IEnumerable> collection) - : this(collection, EqualityComparer.Default) - {} - - public WeakValueDictionary(IEnumerable> collection, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - new KeyComparer(strongKeyComparer) - ) - ; - - _internalDictionary.InsertContents(collection); - } - - public WeakValueDictionary(int concurrencyLevel, int capacity) - : this(concurrencyLevel, capacity, EqualityComparer.Default) - {} - - public WeakValueDictionary(int concurrencyLevel, IEnumerable> collection, IEqualityComparer strongKeyComparer) - { - var contentsList = collection.ToList(); - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - contentsList.Count, - new KeyComparer(strongKeyComparer) - ) - ; - _internalDictionary.InsertContents(contentsList); - } - - public WeakValueDictionary(int concurrencyLevel, int capacity, IEqualityComparer strongKeyComparer) - { - _internalDictionary = - new InternalWeakDictionary( - concurrencyLevel, - capacity, - new KeyComparer(strongKeyComparer) - ) - ; - } - - - public bool ContainsKey(TStrongKey strongKey) - { return _internalDictionary.ContainsKey(Stacktype.Create(strongKey)); } - - public bool TryGetValue(TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryGetValue(Stacktype.Create(strongKey), out value); } - - public TValue this[TStrongKey strongKey] - { - get { return _internalDictionary.GetItem(Stacktype.Create(strongKey)); } - set { _internalDictionary.SetItem(Stacktype.Create(strongKey), value); } - } - - public bool IsEmpty - { get { return _internalDictionary.IsEmpty; } } - - public TValue AddOrUpdate(TStrongKey strongKey, Func addValueFactory, Func updateValueFactory) - { - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(strongKey), - ht => addValueFactory(ht.Item1), - (ht, v) => updateValueFactory(ht.Item1, v) - ) - ; - } - - public TValue AddOrUpdate(TStrongKey strongKey, TValue addValue, Func updateValueFactory) - { - return - _internalDictionary.AddOrUpdate( - Stacktype.Create(strongKey), - addValue, - (ht, v) => updateValueFactory(ht.Item1, v) - ) - ; - } - - public TValue GetOrAdd(TStrongKey strongKey, TValue value) - { return _internalDictionary.GetOrAdd(Stacktype.Create(strongKey), value); } - - public TValue GetOrAdd(TStrongKey strongKey, Func valueFactory) - { - if (null == valueFactory) - throw new ArgumentNullException("valueFactory"); - - return _internalDictionary.GetOrAdd(Stacktype.Create(strongKey), ht => valueFactory(ht.Item1)); - } - - public KeyValuePair[] ToArray() - { return _internalDictionary.ToArray(); } - - public bool TryAdd(TStrongKey strongKey, TValue value) - { return _internalDictionary.TryAdd(Stacktype.Create(strongKey), value); } - - public bool TryRemove(TStrongKey strongKey, out TValue value) - { return _internalDictionary.TryRemove(Stacktype.Create(strongKey), out value); } - - public bool TryUpdate(TStrongKey strongKey, TValue newValue, TValue comparisonValue) - { return _internalDictionary.TryUpdate(Stacktype.Create(strongKey), newValue, comparisonValue); } - } -} diff --git a/Users/Orvid/Orvid.Concurrent/WeakValueRef.cs b/Users/Orvid/Orvid.Concurrent/WeakValueRef.cs deleted file mode 100644 index 7e90b8ed16..0000000000 --- a/Users/Orvid/Orvid.Concurrent/WeakValueRef.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright 2008 The 'A Concurrent Hashtable' development team - (http://www.codeplex.com/CH/People/ProjectPeople.aspx) - - This library is licensed under the GNU Library General Public License (LGPL). You should - have received a copy of the license along with the source code. If not, an online copy - of the license can be found at http://www.codeplex.com/CH/license. -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Concurrent.Collections -{ - internal interface IWeakValueRef - { - object Reference{ get; } - bool IsGarbage { get; } - bool GetValue(out V value); - } - - internal struct WeakValueRef : IWeakValueRef, IEquatable> - where V : class - { - public static WeakValueRef Create(V value) - { return new WeakValueRef { _valueReference = new WeakReference(value == null ? NullValue : value) }; } - - static object NullValue = new object(); - - WeakReference _valueReference; - - public object Reference { get{ return _valueReference; } } - - public bool IsGarbage - { get { return _valueReference.Target == null; } } - - public bool GetValue(out V value) - { - object vObj = _valueReference.Target; - - if (null == vObj) - { - value = default(V); - return false; - } - - value = (V)(object.ReferenceEquals(NullValue, vObj) ? null : vObj); - return true; - } - - #region IEquatable> Members - - public bool Equals(WeakValueRef other) - { - //assume weak - if (object.ReferenceEquals(_valueReference, other._valueReference)) - return true; - - var thisObj = _valueReference.Target; - var otherObj = other._valueReference.Target; - - if (thisObj == null || otherObj == null) - return false; - - return EqualityComparer.Default.Equals((V)thisObj, (V)otherObj); - } - - public override bool Equals(object obj) - { - return obj is WeakValueRef && this.Equals((WeakValueRef)obj); - } - - //no relyable hashcode. - - #endregion - } -} diff --git a/Users/Orvid/Orvid.Extensions/Orvid.Extensions.csproj b/Users/Orvid/Orvid.Extensions/Orvid.Extensions.csproj deleted file mode 100644 index 275003562e..0000000000 --- a/Users/Orvid/Orvid.Extensions/Orvid.Extensions.csproj +++ /dev/null @@ -1,98 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {70BC12ED-553D-4EE0-B350-D2FACF3EA90A} - Library - Properties - Orvid.Extensions - Orvid.Extensions - v4.7.1 - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - - - diff --git a/Users/Orvid/Orvid.Extensions/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Extensions/Properties/AssemblyInfo.cs deleted file mode 100644 index 618c684468..0000000000 --- a/Users/Orvid/Orvid.Extensions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Resources; -using System; - -// 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("Orvid.Extensions")] -[assembly: AssemblyDescription("Various extension methods and useful classes, which I've compiled into a single assembly.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("Orvid.Extensions")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("en-us")] - -// 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("f5805620-67ec-4a8d-bb02-75679574b48f")] - -// 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/Users/Orvid/Orvid.Extensions/System/Half.cs b/Users/Orvid/Orvid.Extensions/System/Half.cs deleted file mode 100644 index 1327d9d5b3..0000000000 --- a/Users/Orvid/Orvid.Extensions/System/Half.cs +++ /dev/null @@ -1,1018 +0,0 @@ -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; - -namespace System -{ - /// - /// Represents a half-precision floating point number. - /// - /// - /// Note: - /// Half is not fast enought and precision is also very bad, - /// so is should not be used for matemathical computation (use Single instead). - /// The main advantage of Half type is lower memory cost: two bytes per number. - /// Half is typically used in graphical applications. - /// - /// Note: - /// All functions, where is used conversion half->float/float->half, - /// are approx. ten times slower than float->double/double->float, i.e. ~3ns on 2GHz CPU. - /// - /// References: - /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - /// - IEEE 754 revision, link: http://grouper.ieee.org/groups/754/ - /// - [Serializable] - public struct Half : IComparable, IFormattable, IConvertible, IComparable, IEquatable - { - /// - /// Internal representation of the half-precision floating-point number. - /// - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - internal ushort value; - - #region Constants - /// - /// Represents the smallest positive System.Half value greater than zero. This field is constant. - /// - public static readonly Half Epsilon = Half.ToHalf(0x0001); - /// - /// Represents the largest possible value of System.Half. This field is constant. - /// - public static readonly Half MaxValue = Half.ToHalf(0x7bff); - /// - /// Represents the smallest possible value of System.Half. This field is constant. - /// - public static readonly Half MinValue = Half.ToHalf(0xfbff); - /// - /// Represents not a number (NaN). This field is constant. - /// - public static readonly Half NaN = Half.ToHalf(0xfe00); - /// - /// Represents negative infinity. This field is constant. - /// - public static readonly Half NegativeInfinity = Half.ToHalf(0xfc00); - /// - /// Represents positive infinity. This field is constant. - /// - public static readonly Half PositiveInfinity = Half.ToHalf(0x7c00); - #endregion - - #region Constructors - /// - /// Initializes a new instance of System.Half to the value of the specified single-precision floating-point number. - /// - /// The value to represent as a System.Half. - public Half(float value) { this = HalfHelper.SingleToHalf(value); } - /// - /// Initializes a new instance of System.Half to the value of the specified 32-bit signed integer. - /// - /// The value to represent as a System.Half. - public Half(int value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 64-bit signed integer. - /// - /// The value to represent as a System.Half. - public Half(long value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified double-precision floating-point number. - /// - /// The value to represent as a System.Half. - public Half(double value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified decimal number. - /// - /// The value to represent as a System.Half. - public Half(decimal value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 32-bit unsigned integer. - /// - /// The value to represent as a System.Half. - public Half(uint value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 64-bit unsigned integer. - /// - /// The value to represent as a System.Half. - public Half(ulong value) : this((float)value) { } - #endregion - - #region Numeric operators - - /// - /// Returns the result of multiplying the specified System.Half value by negative one. - /// - /// A System.Half. - /// A System.Half with the value of half, but the opposite sign. -or- Zero, if half is zero. - public static Half Negate(Half half) { return -half; } - /// - /// Adds two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// A System.Half value that is the sum of half1 and half2. - public static Half Add(Half half1, Half half2) { return half1 + half2; } - /// - /// Subtracts one specified System.Half value from another. - /// - /// A System.Half (the minuend). - /// A System.Half (the subtrahend). - /// The System.Half result of subtracting half2 from half1. - public static Half Subtract(Half half1, Half half2) { return half1 - half2; } - /// - /// Multiplies two specified System.Half values. - /// - /// A System.Half (the multiplicand). - /// A System.Half (the multiplier). - /// A System.Half that is the result of multiplying half1 and half2. - public static Half Multiply(Half half1, Half half2) { return half1 * half2; } - /// - /// Divides two specified System.Half values. - /// - /// A System.Half (the dividend). - /// A System.Half (the divisor). - /// The System.Half that is the result of dividing half1 by half2. - /// half2 is zero. - public static Half Divide(Half half1, Half half2) { return half1 / half2; } - - /// - /// Returns the value of the System.Half operand (the sign of the operand is unchanged). - /// - /// The System.Half operand. - /// The value of the operand, half. - public static Half operator +(Half half) { return half; } - /// - /// Negates the value of the specified System.Half operand. - /// - /// The System.Half operand. - /// The result of half multiplied by negative one (-1). - public static Half operator -(Half half) { return HalfHelper.Negate(half); } - /// - /// Increments the System.Half operand by 1. - /// - /// The System.Half operand. - /// The value of half incremented by 1. - public static Half operator ++(Half half) { return (Half)(half + 1f); } - /// - /// Decrements the System.Half operand by one. - /// - /// The System.Half operand. - /// The value of half decremented by 1. - public static Half operator --(Half half) { return (Half)(half - 1f); } - /// - /// Adds two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of adding half1 and half2. - public static Half operator +(Half half1, Half half2) { return (Half)((float)half1 + (float)half2); } - /// - /// Subtracts two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of subtracting half1 and half2. - public static Half operator -(Half half1, Half half2) { return (Half)((float)half1 - (float)half2); } - /// - /// Multiplies two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of multiplying half1 by half2. - public static Half operator *(Half half1, Half half2) { return (Half)((float)half1 * (float)half2); } - /// - /// Divides two specified System.Half values. - /// - /// A System.Half (the dividend). - /// A System.Half (the divisor). - /// The System.Half result of half1 by half2. - public static Half operator /(Half half1, Half half2) { return (Half)((float)half1 / (float)half2); } - /// - /// Returns a value indicating whether two instances of System.Half are equal. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 and half2 are equal; otherwise, false. - public static bool operator ==(Half half1, Half half2) { return (!IsNaN(half1) && (half1.value == half2.value)); } - /// - /// Returns a value indicating whether two instances of System.Half are not equal. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 and half2 are not equal; otherwise, false. - public static bool operator !=(Half half1, Half half2) { return !(half1.value == half2.value); } - /// - /// Returns a value indicating whether a specified System.Half is less than another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is less than half1; otherwise, false. - public static bool operator <(Half half1, Half half2) { return (float)half1 < (float)half2; } - /// - /// Returns a value indicating whether a specified System.Half is greater than another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is greater than half2; otherwise, false. - public static bool operator >(Half half1, Half half2) { return (float)half1 > (float)half2; } - /// - /// Returns a value indicating whether a specified System.Half is less than or equal to another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is less than or equal to half2; otherwise, false. - public static bool operator <=(Half half1, Half half2) { return (half1 == half2) || (half1 < half2); } - /// - /// Returns a value indicating whether a specified System.Half is greater than or equal to another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is greater than or equal to half2; otherwise, false. - public static bool operator >=(Half half1, Half half2) { return (half1 == half2) || (half1 > half2); } - #endregion - - #region Type casting operators - /// - /// Converts an 8-bit unsigned integer to a System.Half. - /// - /// An 8-bit unsigned integer. - /// A System.Half that represents the converted 8-bit unsigned integer. - public static implicit operator Half(byte value) { return new Half((float)value); } - /// - /// Converts a 16-bit signed integer to a System.Half. - /// - /// A 16-bit signed integer. - /// A System.Half that represents the converted 16-bit signed integer. - public static implicit operator Half(short value) { return new Half((float)value); } - /// - /// Converts a Unicode character to a System.Half. - /// - /// A Unicode character. - /// A System.Half that represents the converted Unicode character. - public static implicit operator Half(char value) { return new Half((float)value); } - /// - /// Converts a 32-bit signed integer to a System.Half. - /// - /// A 32-bit signed integer. - /// A System.Half that represents the converted 32-bit signed integer. - public static implicit operator Half(int value) { return new Half((float)value); } - /// - /// Converts a 64-bit signed integer to a System.Half. - /// - /// A 64-bit signed integer. - /// A System.Half that represents the converted 64-bit signed integer. - public static implicit operator Half(long value) { return new Half((float)value); } - /// - /// Converts a single-precision floating-point number to a System.Half. - /// - /// A single-precision floating-point number. - /// A System.Half that represents the converted single-precision floating point number. - public static explicit operator Half(float value) { return new Half((float)value); } - /// - /// Converts a double-precision floating-point number to a System.Half. - /// - /// A double-precision floating-point number. - /// A System.Half that represents the converted double-precision floating point number. - public static explicit operator Half(double value) { return new Half((float)value); } - /// - /// Converts a decimal number to a System.Half. - /// - /// decimal number - /// A System.Half that represents the converted decimal number. - public static explicit operator Half(decimal value) { return new Half((float)value); } - /// - /// Converts a System.Half to an 8-bit unsigned integer. - /// - /// A System.Half to convert. - /// An 8-bit unsigned integer that represents the converted System.Half. - public static explicit operator byte(Half value) { return (byte)(float)value; } - /// - /// Converts a System.Half to a Unicode character. - /// - /// A System.Half to convert. - /// A Unicode character that represents the converted System.Half. - public static explicit operator char(Half value) { return (char)(float)value; } - /// - /// Converts a System.Half to a 16-bit signed integer. - /// - /// A System.Half to convert. - /// A 16-bit signed integer that represents the converted System.Half. - public static explicit operator short(Half value) { return (short)(float)value; } - /// - /// Converts a System.Half to a 32-bit signed integer. - /// - /// A System.Half to convert. - /// A 32-bit signed integer that represents the converted System.Half. - public static explicit operator int(Half value) { return (int)(float)value; } - /// - /// Converts a System.Half to a 64-bit signed integer. - /// - /// A System.Half to convert. - /// A 64-bit signed integer that represents the converted System.Half. - public static explicit operator long(Half value) { return (long)(float)value; } - /// - /// Converts a System.Half to a single-precision floating-point number. - /// - /// A System.Half to convert. - /// A single-precision floating-point number that represents the converted System.Half. - public static implicit operator float(Half value) { return (float)HalfHelper.HalfToSingle(value); } - /// - /// Converts a System.Half to a double-precision floating-point number. - /// - /// A System.Half to convert. - /// A double-precision floating-point number that represents the converted System.Half. - public static implicit operator double(Half value) { return (double)(float)value; } - /// - /// Converts a System.Half to a decimal number. - /// - /// A System.Half to convert. - /// A decimal number that represents the converted System.Half. - public static explicit operator decimal(Half value) { return (decimal)(float)value; } - /// - /// Converts an 8-bit signed integer to a System.Half. - /// - /// An 8-bit signed integer. - /// A System.Half that represents the converted 8-bit signed integer. - public static implicit operator Half(sbyte value) { return new Half((float)value); } - /// - /// Converts a 16-bit unsigned integer to a System.Half. - /// - /// A 16-bit unsigned integer. - /// A System.Half that represents the converted 16-bit unsigned integer. - public static implicit operator Half(ushort value) { return new Half((float)value); } - /// - /// Converts a 32-bit unsigned integer to a System.Half. - /// - /// A 32-bit unsigned integer. - /// A System.Half that represents the converted 32-bit unsigned integer. - public static implicit operator Half(uint value) { return new Half((float)value); } - /// - /// Converts a 64-bit unsigned integer to a System.Half. - /// - /// A 64-bit unsigned integer. - /// A System.Half that represents the converted 64-bit unsigned integer. - public static implicit operator Half(ulong value) { return new Half((float)value); } - /// - /// Converts a System.Half to an 8-bit signed integer. - /// - /// A System.Half to convert. - /// An 8-bit signed integer that represents the converted System.Half. - public static explicit operator sbyte(Half value) { return (sbyte)(float)value; } - /// - /// Converts a System.Half to a 16-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 16-bit unsigned integer that represents the converted System.Half. - public static explicit operator ushort(Half value) { return (ushort)(float)value; } - /// - /// Converts a System.Half to a 32-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 32-bit unsigned integer that represents the converted System.Half. - public static explicit operator uint(Half value) { return (uint)(float)value; } - /// - /// Converts a System.Half to a 64-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 64-bit unsigned integer that represents the converted System.Half. - public static explicit operator ulong(Half value) { return (ulong)(float)value; } - #endregion - - /// - /// Compares this instance to a specified System.Half object. - /// - /// A System.Half object. - /// - /// A signed number indicating the relative values of this instance and value. - /// Return Value Meaning Less than zero This instance is less than value. Zero - /// This instance is equal to value. Greater than zero This instance is greater than value. - /// - public int CompareTo(Half other) - { - int result = 0; - if (this < other) - { - result = -1; - } - else if (this > other) - { - result = 1; - } - else if (this != other) - { - if (!IsNaN(this)) - { - result = 1; - } - else if (!IsNaN(other)) - { - result = -1; - } - } - - return result; - } - /// - /// Compares this instance to a specified System.Object. - /// - /// An System.Object or null. - /// - /// A signed number indicating the relative values of this instance and value. - /// Return Value Meaning Less than zero This instance is less than value. Zero - /// This instance is equal to value. Greater than zero This instance is greater - /// than value. -or- value is null. - /// - /// value is not a System.Half - public int CompareTo(object obj) - { - int result = 0; - if (obj == null) - { - result = 1; - } - else - { - if (obj is Half) - { - result = CompareTo((Half)obj); - } - else - { - throw new ArgumentException("Object must be of type Half."); - } - } - - return result; - } - /// - /// Returns a value indicating whether this instance and a specified System.Half object represent the same value. - /// - /// A System.Half object to compare to this instance. - /// true if value is equal to this instance; otherwise, false. - public bool Equals(Half other) - { - return ((other == this) || (IsNaN(other) && IsNaN(this))); - } - /// - /// Returns a value indicating whether this instance and a specified System.Object - /// represent the same type and value. - /// - /// An System.Object. - /// true if value is a System.Half and equal to this instance; otherwise, false. - public override bool Equals(object obj) - { - bool result = false; - if (obj is Half) - { - Half half = (Half)obj; - if ((half == this) || (IsNaN(half) && IsNaN(this))) - { - result = true; - } - } - - return result; - } - /// - /// Returns the hash code for this instance. - /// - /// A 32-bit signed integer hash code. - public override int GetHashCode() - { - return value.GetHashCode(); - } - /// - /// Returns the System.TypeCode for value type System.Half. - /// - /// The enumerated constant (TypeCode)255. - public TypeCode GetTypeCode() - { - return (TypeCode)255; - } - - #region BitConverter & Math methods for Half - /// - /// Returns the specified half-precision floating point value as an array of bytes. - /// - /// The number to convert. - /// An array of bytes with length 2. - public static byte[] GetBytes(Half value) - { - return BitConverter.GetBytes(value.value); - } - /// - /// Converts the value of a specified instance of System.Half to its equivalent binary representation. - /// - /// A System.Half value. - /// A 16-bit unsigned integer that contain the binary representation of value. - public static ushort GetBits(Half value) - { - return value.value; - } - /// - /// Returns a half-precision floating point number converted from two bytes - /// at a specified position in a byte array. - /// - /// An array of bytes. - /// The starting position within value. - /// A half-precision floating point number formed by two bytes beginning at startIndex. - /// - /// startIndex is greater than or equal to the length of value minus 1, and is - /// less than or equal to the length of value minus 1. - /// - /// value is null. - /// startIndex is less than zero or greater than the length of value minus 1. - public static Half ToHalf(byte[] value, int startIndex) - { - return Half.ToHalf((ushort)BitConverter.ToInt16(value, startIndex)); - } - /// - /// Returns a half-precision floating point number converted from its binary representation. - /// - /// Binary representation of System.Half value - /// A half-precision floating point number formed by its binary representation. - public static Half ToHalf(ushort bits) - { - return new Half { value = bits }; - } - #endregion - - /// - /// Returns a value indicating whether the specified number evaluates to not a number (System.Half.NaN). - /// - /// A half-precision floating-point number. - /// true if value evaluates to not a number (System.Half.NaN); otherwise, false. - public static bool IsNaN(Half half) - { - return HalfHelper.IsNaN(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to negative or positive infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.PositiveInfinity or System.Half.NegativeInfinity; otherwise, false. - public static bool IsInfinity(Half half) - { - return HalfHelper.IsInfinity(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to negative infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.NegativeInfinity; otherwise, false. - public static bool IsNegativeInfinity(Half half) - { - return HalfHelper.IsNegativeInfinity(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to positive infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.PositiveInfinity; otherwise, false. - public static bool IsPositiveInfinity(Half half) - { - return HalfHelper.IsPositiveInfinity(half); - } - - #region String operations (Parse and ToString) - /// - /// Converts the string representation of a number to its System.Half equivalent. - /// - /// The string representation of the number to convert. - /// The System.Half number equivalent to the number contained in value. - /// value is null. - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value) - { - return (Half)float.Parse(value, CultureInfo.InvariantCulture); - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified culture-specific format information. - /// - /// The string representation of the number to convert. - /// An System.IFormatProvider that supplies culture-specific parsing information about value. - /// The System.Half number equivalent to the number contained in s as specified by provider. - /// value is null. - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, IFormatProvider provider) - { - return (Half)float.Parse(value, provider); - } - /// - /// Converts the string representation of a number in a specified style to its System.Half equivalent. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the style elements that can be present in value. A typical value to specify is - /// System.Globalization.NumberStyles.Number. - /// - /// The System.Half number equivalent to the number contained in s as specified by style. - /// value is null. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style is the - /// System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, NumberStyles style) - { - return (Half)float.Parse(value, style, CultureInfo.InvariantCulture); - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified style and culture-specific format. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the style elements that can be present in value. A typical value to specify is - /// System.Globalization.NumberStyles.Number. - /// - /// An System.IFormatProvider object that supplies culture-specific information about the format of value. - /// The System.Half number equivalent to the number contained in s as specified by style and provider. - /// value is null. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style is the - /// System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, NumberStyles style, IFormatProvider provider) - { - return (Half)float.Parse(value, style, provider); - } - /// - /// Converts the string representation of a number to its System.Half equivalent. - /// A return value indicates whether the conversion succeeded or failed. - /// - /// The string representation of the number to convert. - /// - /// When this method returns, contains the System.Half number that is equivalent - /// to the numeric value contained in value, if the conversion succeeded, or is zero - /// if the conversion failed. The conversion fails if the s parameter is null, - /// is not a number in a valid format, or represents a number less than System.Half.MinValue - /// or greater than System.Half.MaxValue. This parameter is passed uninitialized. - /// - /// true if s was converted successfully; otherwise, false. - public static bool TryParse(string value, out Half result) - { - float f; - if (float.TryParse(value, out f)) - { - result = (Half)f; - return true; - } - - result = new Half(); - return false; - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified style and culture-specific format. A return value indicates - /// whether the conversion succeeded or failed. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the permitted format of value. A typical value to specify is System.Globalization.NumberStyles.Number. - /// - /// An System.IFormatProvider object that supplies culture-specific parsing information about value. - /// - /// When this method returns, contains the System.Half number that is equivalent - /// to the numeric value contained in value, if the conversion succeeded, or is zero - /// if the conversion failed. The conversion fails if the s parameter is null, - /// is not in a format compliant with style, or represents a number less than - /// System.Half.MinValue or greater than System.Half.MaxValue. This parameter is passed uninitialized. - /// - /// true if s was converted successfully; otherwise, false. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style - /// is the System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out Half result) - { - bool parseResult = false; - float f; - if (float.TryParse(value, style, provider, out f)) - { - result = (Half)f; - parseResult = true; - } - else - { - result = new Half(); - } - - return parseResult; - } - /// - /// Converts the numeric value of this instance to its equivalent string representation. - /// - /// A string that represents the value of this instance. - public override string ToString() - { - return ((float)this).ToString(CultureInfo.InvariantCulture); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation - /// using the specified culture-specific format information. - /// - /// An System.IFormatProvider that supplies culture-specific formatting information. - /// The string representation of the value of this instance as specified by provider. - public string ToString(IFormatProvider formatProvider) - { - return ((float)this).ToString(formatProvider); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation, using the specified format. - /// - /// A numeric format string. - /// The string representation of the value of this instance as specified by format. - public string ToString(string format) - { - return ((float)this).ToString(format, CultureInfo.InvariantCulture); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation - /// using the specified format and culture-specific format information. - /// - /// A numeric format string. - /// An System.IFormatProvider that supplies culture-specific formatting information. - /// The string representation of the value of this instance as specified by format and provider. - /// format is invalid. - public string ToString(string format, IFormatProvider formatProvider) - { - return ((float)this).ToString(format, formatProvider); - } - #endregion - - #region IConvertible Members - float IConvertible.ToSingle(IFormatProvider provider) - { - return (float)this; - } - TypeCode IConvertible.GetTypeCode() - { - return GetTypeCode(); - } - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return Convert.ToBoolean((float)this); - } - byte IConvertible.ToByte(IFormatProvider provider) - { - return Convert.ToByte((float)this); - } - char IConvertible.ToChar(IFormatProvider provider) - { - throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "Char")); - } - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "DateTime")); - } - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - return Convert.ToDecimal((float)this); - } - double IConvertible.ToDouble(IFormatProvider provider) - { - return Convert.ToDouble((float)this); - } - short IConvertible.ToInt16(IFormatProvider provider) - { - return Convert.ToInt16((float)this); - } - int IConvertible.ToInt32(IFormatProvider provider) - { - return Convert.ToInt32((float)this); - } - long IConvertible.ToInt64(IFormatProvider provider) - { - return Convert.ToInt64((float)this); - } - sbyte IConvertible.ToSByte(IFormatProvider provider) - { - return Convert.ToSByte((float)this); - } - string IConvertible.ToString(IFormatProvider provider) - { - return Convert.ToString((float)this, CultureInfo.InvariantCulture); - } - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - return (((float)this) as IConvertible).ToType(conversionType, provider); - } - ushort IConvertible.ToUInt16(IFormatProvider provider) - { - return Convert.ToUInt16((float)this); - } - uint IConvertible.ToUInt32(IFormatProvider provider) - { - return Convert.ToUInt32((float)this); - } - ulong IConvertible.ToUInt64(IFormatProvider provider) - { - return Convert.ToUInt64((float)this); - } - #endregion - - #region HalfHelper - /// - /// Helper class for Half conversions and some low level operations. - /// This class is internally used in the Half class. - /// - /// - /// References: - /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - /// - private static class HalfHelper - { - private static uint[] mantissaTable = GenerateMantissaTable(); - private static uint[] exponentTable = GenerateExponentTable(); - private static ushort[] offsetTable = GenerateOffsetTable(); - private static ushort[] baseTable = GenerateBaseTable(); - private static sbyte[] shiftTable = GenerateShiftTable(); - - // Transforms the subnormal representation to a normalized one. - private static uint ConvertMantissa(int i) - { - uint m = (uint)(i << 13); // Zero pad mantissa bits - uint e = 0; // Zero exponent - - // While not normalized - while ((m & 0x00800000) == 0) - { - e -= 0x00800000; // Decrement exponent (1<<23) - m <<= 1; // Shift mantissa - } - m &= unchecked((uint)~0x00800000); // Clear leading 1 bit - e += 0x38800000; // Adjust bias ((127-14)<<23) - return m | e; // Return combined number - } - - private static uint[] GenerateMantissaTable() - { - uint[] mantissaTable = new uint[2048]; - mantissaTable[0] = 0; - for (int i = 1; i < 1024; i++) - { - mantissaTable[i] = ConvertMantissa(i); - } - for (int i = 1024; i < 2048; i++) - { - mantissaTable[i] = (uint)(0x38000000 + ((i - 1024) << 13)); - } - - return mantissaTable; - } - private static uint[] GenerateExponentTable() - { - uint[] exponentTable = new uint[64]; - exponentTable[0] = 0; - for (int i = 1; i < 31; i++) - { - exponentTable[i] = (uint)(i << 23); - } - exponentTable[31] = 0x47800000; - exponentTable[32] = 0x80000000; - for (int i = 33; i < 63; i++) - { - exponentTable[i] = (uint)(0x80000000 + ((i - 32) << 23)); - } - exponentTable[63] = 0xc7800000; - - return exponentTable; - } - private static ushort[] GenerateOffsetTable() - { - ushort[] offsetTable = new ushort[64]; - offsetTable[0] = 0; - for (int i = 1; i < 32; i++) - { - offsetTable[i] = 1024; - } - offsetTable[32] = 0; - for (int i = 33; i < 64; i++) - { - offsetTable[i] = 1024; - } - - return offsetTable; - } - private static ushort[] GenerateBaseTable() - { - ushort[] baseTable = new ushort[512]; - for (int i = 0; i < 256; ++i) - { - sbyte e = (sbyte)(127 - i); - if (e > 24) - { // Very small numbers map to zero - baseTable[i | 0x000] = 0x0000; - baseTable[i | 0x100] = 0x8000; - } - else if (e > 14) - { // Small numbers map to denorms - baseTable[i | 0x000] = (ushort)(0x0400 >> (18 + e)); - baseTable[i | 0x100] = (ushort)((0x0400 >> (18 + e)) | 0x8000); - } - else if (e >= -15) - { // Normal numbers just lose precision - baseTable[i | 0x000] = (ushort)((15 - e) << 10); - baseTable[i | 0x100] = (ushort)(((15 - e) << 10) | 0x8000); - } - else if (e > -128) - { // Large numbers map to Infinity - baseTable[i | 0x000] = 0x7c00; - baseTable[i | 0x100] = 0xfc00; - } - else - { // Infinity and NaN's stay Infinity and NaN's - baseTable[i | 0x000] = 0x7c00; - baseTable[i | 0x100] = 0xfc00; - } - } - - return baseTable; - } - private static sbyte[] GenerateShiftTable() - { - sbyte[] shiftTable = new sbyte[512]; - for (int i = 0; i < 256; ++i) - { - sbyte e = (sbyte)(127 - i); - if (e > 24) - { // Very small numbers map to zero - shiftTable[i | 0x000] = 24; - shiftTable[i | 0x100] = 24; - } - else if (e > 14) - { // Small numbers map to denorms - shiftTable[i | 0x000] = (sbyte)(e - 1); - shiftTable[i | 0x100] = (sbyte)(e - 1); - } - else if (e >= -15) - { // Normal numbers just lose precision - shiftTable[i | 0x000] = 13; - shiftTable[i | 0x100] = 13; - } - else if (e > -128) - { // Large numbers map to Infinity - shiftTable[i | 0x000] = 24; - shiftTable[i | 0x100] = 24; - } - else - { // Infinity and NaN's stay Infinity and NaN's - shiftTable[i | 0x000] = 13; - shiftTable[i | 0x100] = 13; - } - } - - return shiftTable; - } - - public static unsafe float HalfToSingle(Half half) - { - uint result = mantissaTable[offsetTable[half.value >> 10] + (half.value & 0x3ff)] + exponentTable[half.value >> 10]; - return *((float*)&result); - } - public static unsafe Half SingleToHalf(float single) - { - uint value = *((uint*)&single); - - ushort result = (ushort)(baseTable[(value >> 23) & 0x1ff] + ((value & 0x007fffff) >> shiftTable[value >> 23])); - return Half.ToHalf(result); - } - - public static Half Negate(Half half) - { - return Half.ToHalf((ushort)(half.value ^ 0x8000)); - } - public static Half Abs(Half half) - { - return Half.ToHalf((ushort)(half.value & 0x7fff)); - } - - public static bool IsNaN(Half half) - { - return ((half.value & 0x7fff) > 0x7c00); - } - public static bool IsInfinity(Half half) - { - return ((half.value & 0x7fff) == 0x7c00); - } - public static bool IsPositiveInfinity(Half half) - { - return (half.value == 0x7c00); - } - public static bool IsNegativeInfinity(Half half) - { - return (half.value == 0xfc00); - } - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Extensions/System/Int128.cs b/Users/Orvid/Orvid.Extensions/System/Int128.cs deleted file mode 100644 index 0bd88e3eaf..0000000000 --- a/Users/Orvid/Orvid.Extensions/System/Int128.cs +++ /dev/null @@ -1,1220 +0,0 @@ -#region Copyright and License -/* - * SharpAssembler - * Library for .NET that assembles a predetermined list of - * instructions into machine code. - * - * Copyright (C) 2011 Daniël Pelsmaeker - * - * This file is part of SharpAssembler. - * - * SharpAssembler is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * SharpAssembler is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with SharpAssembler. If not, see . - */ -#endregion -using System; -using System.Diagnostics.Contracts; - -namespace SharpAssembler.Core -{ - /// - /// A 128-bit signed integer. - /// - /// - /// This implementation is based on the code described in - /// . - /// - public struct Int128 : IFormattable, IConvertible, - IComparable, IComparable, IEquatable - { - #region Constants - /// - /// The maximum value a can represent. - /// - public static readonly Int128 MaxValue = new Int128(0xFFFFFFFFFFFFFFFF, 0x7FFFFFFFFFFFFFFF); - /// - /// The minimum value a can represent. - /// - public static readonly Int128 MinValue = new Int128(0, unchecked((long)0x8000000000000000)); - - /// - /// A value of -1. - /// - public static readonly Int128 MinusOne = new Int128(0xFFFFFFFFFFFFFFFF, unchecked((long)0xFFFFFFFFFFFFFFFF)); - /// - /// A value of 0. - /// - public static readonly Int128 Zero = new Int128(0, 0); - /// - /// A value of 1. - /// - public static readonly Int128 One = new Int128(1, 0); - #endregion - - #region Constructors - /// - /// Initializes a new instance of the struct. - /// - /// The least significant 64-bits of the integer. - /// The most significant 64-bits of the integer. - public Int128(ulong low, long high) - { - this.low = low; - this.high = high; - } - #endregion - - #region Properties - /// - /// Gets whether the value of this is an even number. - /// - /// when this value is an even number; - /// otherwise, . - /// - /// Zero is also an even number. - /// - public bool IsEven - { - get - { - return (low & 1) == 0; - } - } - - /// - /// Gets whether the value of this is zero. - /// - /// when this value is zero; - /// otherwise, . - public bool IsZero - { - get { return high == 0 && low == 0; } - } - - /// - /// Gets whether the value of this is one. - /// - /// when this value is one; - /// otherwise, . - public bool IsOne - { - get { return high == 0 && low == 1; } - } - - /// - /// Gets whether the value of this is a power of two. - /// - /// when this value is a power of two; - /// otherwise, . - public bool IsPowerOfTwo - { - get { return !IsZero && (this & (this - 1)) == 0; } - } - - /// - /// Gets a number that indicates the sign (negative, positive, or zero) of the current . - /// - /// A number that indicates the sign. The return value is 0 when the value is zero, 1 when the value - /// is positive or -1 when the value is negative. - public int Sign - { - get { return this.CompareTo(0); } - } - - /// - /// Gets the 64 least significant bits of the value. - /// - /// The 64 least significant bits. - public ulong Low - { - get { return this.low; } - } - - /// - /// Gets the 64 most significant bits of the value. - /// - /// The 64 most significant bits. - public long High - { - get { return this.high; } - } - #endregion - - #region Equality - /// - /// Indicates whether this instance and a specified object are equal. - /// - /// Another object to compare to. - /// if and this instance are the same type and represent - /// the same value; otherwise, . - public override bool Equals(object obj) - { - if (Object.ReferenceEquals(obj, null) || - !(obj is Int128)) - return false; - return Equals((Int128)obj); - } - - /// - /// Indicates whether the current object is equal to another object of the same type. - /// - /// An object to compare with this object. - /// if the current object is equal to the other parameter; - /// otherwise, . - public bool Equals(Int128 other) - { - return this.high == other.high && this.low == other.low; - } - - /// - /// Returns the hash code for this instance. - /// - /// A 32-bit signed integer that is the hash code for this instance. - public override int GetHashCode() - { - unchecked - { - int hash = 17; - hash = hash * 23 + low.GetHashCode(); - hash = hash * 23 + high.GetHashCode(); - return hash; - } - } - - /// - /// Returns a value that indicates whether two objects have the same value. - /// - /// The first value to compare. - /// The second value to compare. - /// if the and parameters have - /// the same value; otherwise, . - public static bool operator ==(Int128 left, Int128 right) - { - return left.Equals(right); - } - - /// - /// Returns a value that indicates whether two objects have different values. - /// - /// The first value to compare. - /// The second value to compare. - /// if the and parameters have - /// different values; otherwise, . - public static bool operator !=(Int128 left, Int128 right) - { - return !left.Equals(right); - } - #endregion - - #region Comparisons - /// - /// Compares the current instance with another object of the same type. - /// - /// An object to compare with this instance. - /// A value that indicates the relative order of the objects being compared. - public int CompareTo(object obj) - { - if (obj is Int128) - return CompareTo((Int128)obj); - else - throw new ArgumentException("The specified object is not the same type as this instance.", "obj"); - } - - /// - /// Compares the current instance with another object of the same type. - /// - /// An object to compare with this instance. - /// A value that indicates the relative order of the objects being compared. - public int CompareTo(Int128 other) - { - int result = this.high.CompareTo(other.high); - if (result == 0) - result = this.low.CompareTo(other.low); - return result; - } - - /// - /// Returns a value that indicates whether a value is greater than another - /// value. - /// - /// The first value to compare. - /// The second value to compare. - /// if the value of is greater than the value of - /// ; otherwise, . - public static bool operator >(Int128 left, Int128 right) - { - return left.CompareTo(right) > 0; - } - - /// - /// Returns a value that indicates whether a value is less than another - /// value. - /// - /// The first value to compare. - /// The second value to compare. - /// if the value of is less than the value of - /// ; otherwise, . - public static bool operator <(Int128 left, Int128 right) - { - return left.CompareTo(right) < 0; - } - - /// - /// Returns a value that indicates whether a value is greater than or equal to another - /// value. - /// - /// The first value to compare. - /// The second value to compare. - /// if the value of is greater than or equal to the - /// value of ; otherwise, . - public static bool operator >=(Int128 left, Int128 right) - { - return left.CompareTo(right) >= 0; - } - - /// - /// Returns a value that indicates whether a value is less than or equal to another - /// value. - /// - /// The first value to compare. - /// The second value to compare. - /// if the value of is less than or equal to the value - /// of ; otherwise, . - public static bool operator <=(Int128 left, Int128 right) - { - return left.CompareTo(right) <= 0; - } - #endregion - - #region Conversions - /// - /// Converts the specified unsigned 64-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(ulong value) - { - return new Int128(value, 0); - } - - /// - /// Converts the specified signed 64-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(long value) - { - return new Int128(unchecked((ulong)value), (value < 0 ? -1 : 0)); - } - - /// - /// Converts the specified unsigned 32-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(uint value) - { - return (Int128)(ulong)value; - } - - /// - /// Converts the specified signed 32-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(int value) - { - return (Int128)(long)value; - } - - /// - /// Converts the specified unsigned 16-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(ushort value) - { - return (Int128)(ulong)value; - } - - /// - /// Converts the specified signed 16-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(short value) - { - return (Int128)(long)value; - } - - /// - /// Converts the specified unsigned 8-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(byte value) - { - return (Int128)(ulong)value; - } - - /// - /// Converts the specified signed 8-bit value to a signed 128-bit value. - /// - /// The value to convert. - /// The resulting 128-bit value. - public static implicit operator Int128(sbyte value) - { - return (Int128)(long)value; - } - - /// - /// Converts the specified signed 128-bit value to an unsigned 64-bit value. - /// - /// The value to convert. - /// The resulting 64-bit value. - public static explicit operator ulong(Int128 value) - { - return (ulong)value.low; - } - - /// - /// Converts the specified signed 128-bit value to a signed 64-bit value. - /// - /// The value to convert. - /// The resulting 64-bit value. - public static explicit operator long(Int128 value) - { - return (long)value.low; - } - - /// - /// Converts the specified signed 128-bit value to an unsigned 32-bit value. - /// - /// The value to convert. - /// The resulting 32-bit value. - public static explicit operator uint(Int128 value) - { - return (uint)value.low; - } - - /// - /// Converts the specified signed 128-bit value to a signed 32-bit value. - /// - /// The value to convert. - /// The resulting 32-bit value. - public static explicit operator int(Int128 value) - { - return (int)value.low; - } - - /// - /// Converts the specified signed 128-bit value to an unsigned 16-bit value. - /// - /// The value to convert. - /// The resulting 16-bit value. - public static explicit operator ushort(Int128 value) - { - return (ushort)value.low; - } - - /// - /// Converts the specified signed 128-bit value to a signed 16-bit value. - /// - /// The value to convert. - /// The resulting 16-bit value. - public static explicit operator short(Int128 value) - { - return (short)value.low; - } - - /// - /// Converts the specified signed 128-bit value to an unsigned 8-bit value. - /// - /// The value to convert. - /// The resulting 8-bit value. - public static explicit operator byte(Int128 value) - { - return (byte)value.low; - } - - /// - /// Converts the specified signed 128-bit value to a signed 8-bit value. - /// - /// The value to convert. - /// The resulting 8-bit value. - public static explicit operator sbyte(Int128 value) - { - return (sbyte)value.low; - } - - /// - /// Returns the for this instance. - /// - /// The enumerated constant that is the of the class or value type that - /// implements this interface. - public TypeCode GetTypeCode() - { - return TypeCode.Object; - } - - /// - /// Converts the value of this instance to an of the specified that has - /// an equivalent value, using the specified culture-specific formatting information. - /// - /// The to which the value of this instance is - /// converted. - /// An interface implementation that supplies - /// culture-specific formatting information. - /// An instance of type whose value is - /// equivalent to the value of this instance. - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - IConvertible conv = (IConvertible)this; - - if (conversionType == typeof(bool)) - return conv.ToBoolean(provider); - if (conversionType == typeof(byte)) - return conv.ToByte(provider); - if (conversionType == typeof(char)) - return conv.ToChar(provider); - if (conversionType == typeof(DateTime)) - return conv.ToDateTime(provider); - if (conversionType == typeof(Decimal)) - return conv.ToDecimal(provider); - if (conversionType == typeof(Double)) - return conv.ToDouble(provider); - if (conversionType == typeof(Int16)) - return conv.ToInt16(provider); - if (conversionType == typeof(Int32)) - return conv.ToInt32(provider); - if (conversionType == typeof(Int64)) - return conv.ToInt64(provider); - if (conversionType == typeof(SByte)) - return conv.ToSByte(provider); - if (conversionType == typeof(Single)) - return conv.ToSingle(provider); - if (conversionType == typeof(String)) - return conv.ToString(provider); - if (conversionType == typeof(UInt16)) - return conv.ToUInt16(provider); - if (conversionType == typeof(UInt32)) - return conv.ToUInt32(provider); - if (conversionType == typeof(UInt64)) - return conv.ToUInt64(provider); - if (conversionType == typeof(Int128)) - return this; - - throw new InvalidCastException(); - } - - /// - /// Converts the value of this instance to an equivalent boolean value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A boolean value equivalent to the value of this instance. - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return !(this.low == 0 && this.high == 0); - } - - /// - /// Converts the value of this instance to an equivalent Unicode character using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A Unicode character equivalent to the value of this instance. - Char IConvertible.ToChar(IFormatProvider provider) - { - if (this < Char.MinValue || this > Char.MaxValue) - throw new OverflowException(); - return (Char)this; - } - - /// - /// Converts the value of this instance to an equivalent 8-bit unsigned integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 8-bit unsigned integer equivalent to the value of this instance. - Byte IConvertible.ToByte(IFormatProvider provider) - { - if (this < Byte.MinValue || this > Byte.MaxValue) - throw new OverflowException(); - return (Byte)this; - } - - /// - /// Converts the value of this instance to an equivalent 8-bit signed integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 8-bit signed integer equivalent to the value of this instance. - SByte IConvertible.ToSByte(IFormatProvider provider) - { - if (this < SByte.MinValue || this > SByte.MaxValue) - throw new OverflowException(); - return (SByte)this; - } - - /// - /// Converts the value of this instance to an equivalent 16-bit signed integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 16-bit signed integer equivalent to the value of this instance. - Int16 IConvertible.ToInt16(IFormatProvider provider) - { - if (this < Int16.MinValue || this > Int16.MaxValue) - throw new OverflowException(); - return (Int16)this; - } - - /// - /// Converts the value of this instance to an equivalent 32-bit signed integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 32-bit signed integer equivalent to the value of this instance. - Int32 IConvertible.ToInt32(IFormatProvider provider) - { - if (this < Int32.MinValue || this > Int32.MaxValue) - throw new OverflowException(); - return (Int32)this; - } - - /// - /// Converts the value of this instance to an equivalent 64-bit signed integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 64-bit signed integer equivalent to the value of this instance. - Int64 IConvertible.ToInt64(IFormatProvider provider) - { - if (this < Int64.MinValue || this > Int64.MaxValue) - throw new OverflowException(); - return (Int64)this; - } - - /// - /// Converts the value of this instance to an equivalent 16-bit unsigned integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 16-bit unsigned integer equivalent to the value of this instance. - UInt16 IConvertible.ToUInt16(IFormatProvider provider) - { - if (this < UInt16.MinValue || this > UInt16.MaxValue) - throw new OverflowException(); - return (UInt16)this; - } - - /// - /// Converts the value of this instance to an equivalent 32-bit unsigned integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 32-bit unsigned integer equivalent to the value of this instance. - UInt32 IConvertible.ToUInt32(IFormatProvider provider) - { - if (this < UInt32.MinValue || this > UInt32.MaxValue) - throw new OverflowException(); - return (UInt32)this; - } - - /// - /// Converts the value of this instance to an equivalent 64-bit unsigned integer using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A 64-bit unsigned integer equivalent to the value of this instance. - UInt64 IConvertible.ToUInt64(IFormatProvider provider) - { - if (this < UInt64.MinValue || this > UInt64.MaxValue) - throw new OverflowException(); - return (UInt64)this; - } - - /// - /// Converts the value of this instance to an equivalent value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A value equivalent to the value of this instance. - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - throw new InvalidCastException(); - } - - /// - /// Converts the value of this instance to an equivalent decimal value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A decimal value equivalent to the value of this instance. - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - throw new InvalidCastException(); - } - - /// - /// Converts the value of this instance to an equivalent floating-point value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A floating-point value equivalent to the value of this instance. - double IConvertible.ToDouble(IFormatProvider provider) - { - throw new InvalidCastException(); - } - - /// - /// Converts the value of this instance to an equivalent floating-point value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A floating-point value equivalent to the value of this instance. - float IConvertible.ToSingle(IFormatProvider provider) - { - throw new InvalidCastException(); - } - - /// - /// Converts the value of this instance to an equivalent string value using the specified - /// culture-specific formatting information. - /// - /// An interface implementation that supplies - /// culture-specific formatting information. - /// A string value equivalent to the value of this instance. - string IConvertible.ToString(IFormatProvider provider) - { - throw new InvalidCastException(); - } - #endregion - - #region Arithmetic - - #region Unary - /// - /// Returns the value of the . - /// - /// An integer value. - /// The value of the parameter. - public static Int128 operator +(Int128 value) - { - return value; - } - - /// - /// Negates a value. - /// - /// The value to negate. - /// The result of the value parameter multiplied by negative one (-1). - public static Int128 operator -(Int128 value) - { - return Negate(value); - } - - /// - /// Negates an . - /// - /// The value to negate. - /// The result of the value parameter multiplied by negative one (-1). - public static Int128 Negate(Int128 value) - { - value = ~value; - value++; - return value; - } - - /// - /// Returns the bitwise one's complement of an value. - /// - /// An integer value. - /// The bitwise one's complement of . - public static Int128 operator ~(Int128 value) - { - return new Int128(~value.low, ~value.high); - } - - /// - /// Increments a value by 1. - /// - /// The value to increment. - /// The value of the parameter incremented by 1. - public static Int128 operator ++(Int128 value) - { - value.low++; - if (value.low == 0) - value.high++; - return value; - } - - /// - /// Decrements a value by 1. - /// - /// The value to decrement. - /// The value of the parameter decremented by 1. - public static Int128 operator --(Int128 value) - { - if (value.low == 0) - value.high--; - value.low--; - return value; - } - #endregion - - #region Binary - /// - /// Adds the values of two specified values. - /// - /// The first value to add. - /// The second value to add. - /// The sum of and . - public static Int128 operator +(Int128 left, Int128 right) - { - return Add(left, right); - } - - /// - /// Adds two values and returns the result. - /// - /// The first value to add. - /// The second value to add. - /// The sum of and . - public static Int128 Add(Int128 left, Int128 right) - { - var oldLow = left.low; - - left.low += right.low; - left.high += right.high; - if (left.low < oldLow) - left.high++; - - return left; - } - - /// - /// Subtracts an from another value. - /// - /// The value to subtract from. - /// The value to subtract. - /// The result of subtracting from . - public static Int128 operator -(Int128 left, Int128 right) - { - return Subtract(left, right); - } - - /// - /// Subtracts one from another and returns the result. - /// - /// The value to subtract from. - /// The value to subtract. - /// The result of subtracting from . - public static Int128 Subtract(Int128 left, Int128 right) - { - return left + (-right); - } - - /// - /// Performs a bitwise AND operation on two values. - /// - /// The first value. - /// The second value. - /// The result of the bitwise AND operation. - public static Int128 operator &(Int128 left, Int128 right) - { - return new Int128(left.low & right.low, left.high & right.high); - } - - /// - /// Performs a bitwise OR operation on two values. - /// - /// The first value. - /// The second value. - /// The result of the bitwise OR operation. - public static Int128 operator |(Int128 left, Int128 right) - { - return new Int128(left.low | right.low, left.high | right.high); - } - - /// - /// Performs a bitwise exclusive OR (XOR) operation on two values. - /// - /// The first value. - /// The second value. - /// The result of the bitwise XOR operation. - public static Int128 operator ^(Int128 left, Int128 right) - { - return new Int128(left.low ^ right.low, left.high ^ right.high); - } - - /// - /// Shifts an value a specified number of bits to the left. - /// - /// The value whose bits are to be shifted. - /// The number of bits to shift to the left. - /// A value that has been shifted to the left by the specified number of bits. - public static Int128 operator <<(Int128 value, int shift) - { - if (shift == 0) - return value; - if (shift < 0) - return value >> -shift; - - // Shifting more than 127 bits would shift out any bits. - if (shift > 127) - return 0; - - // Shifting more than 64 bits would shift all the low bits at least - // to the high bits. - if (shift > 63) - { - shift -= 64; - value.high = unchecked((long)value.low); - value.low = 0; - } - - if (shift > 0) - { - long highbits = unchecked((long)(value.low >> (64 - shift))); - value.low <<= shift; - value.high <<= shift; - value.high |= highbits; - } - - return value; - } - - /// - /// Shifts an value a specified number of bits to the right. - /// - /// The value whose bits are to be shifted. - /// The number of bits to shift to the right. - /// A value that has been shifted to the right by the specified number of bits. - public static Int128 operator >>(Int128 value, int shift) - { - if (shift == 0) - return value; - if (shift < 0) - return value << -shift; - - // Shifting more than 127 bits would shift out any bits. - if (shift > 127) - return 0; - - // Shifting more than 64 bits would shift all the high bits at least - // to the low bits. - if (shift > 63) - { - shift -= 64; - value.low = unchecked((ulong)value.high); - value.high = 0; - } - - if (shift > 0) - { - ulong lowbits = unchecked((ulong)(value.high << (64 - shift))); - value.low >>= shift; - value.high >>= shift; - value.low |= lowbits; - } - - return value; - } - - /// - /// Multiplies two specified values. - /// - /// The first value to multiply. - /// The second value to multiply. - /// The product of and . - public static Int128 operator *(Int128 left, Int128 right) - { - return Multiply(left, right); - } - - /// - /// Returns the product of two values. - /// - /// The first number to multiply. - /// The second number to multiply. - /// The product of and . - public static Int128 Multiply(Int128 left, Int128 right) - { - uint left3 = (uint)(left.high >> 32); - uint left2 = (uint)left.high; - uint left1 = (uint)(left.low >> 32); - uint left0 = (uint)left.low; - - ulong right3 = (uint)(right.high >> 32); - ulong right2 = (uint)right.high; - ulong right1 = (uint)(right.low >> 32); - ulong right0 = (uint)right.low; - - Int128 value00 = (Int128)(left0 * right0); - Int128 value10 = (Int128)(left1 * right0) << 32; - Int128 value20 = new Int128(0, (long)(left2 * right0)); - Int128 value30 = new Int128(0, (long)((left3 * right0) << 32)); - - Int128 value01 = (Int128)(left0 * right1) << 32; - Int128 value11 = new Int128(0, (long)(left1 * right1)); - Int128 value21 = new Int128(0, (long)((left2 * right1) << 32)); - - Int128 value02 = new Int128(0, (long)(left0 * right2)); - Int128 value12 = new Int128(0, (long)((left1 * right2) << 32)); - - Int128 value03 = new Int128(0, (long)((left0 * right3) << 32)); - - return value00 + value10 + value20 + value30 - + value01 + value11 + value21 - + value02 + value21 - + value03; - } - - /// - /// Divides a specified value by another specified value by using integer division. - /// - /// The value to be divided. - /// The value to divide by. - /// The integral result of the division. - public static Int128 operator /(Int128 dividend, Int128 divisor) - { - #region Contract - Contract.Requires(divisor != 0); - #endregion - - return Divide(dividend, divisor); - } - - /// - /// Divides one by another and returns the result. - /// - /// The value to be divided. - /// The value to divide by. - /// The quotient of the division. - public static Int128 Divide(Int128 dividend, Int128 divisor) - { - #region Contract - Contract.Requires(divisor != 0); - #endregion - - Int128 remainder; - return DivRem(dividend, divisor, out remainder); - } - - /// - /// Returns the remainder that results from division with two specified values. - /// - /// The value to be divided. - /// The value to divide by. - /// The remainder that results from the division. - public static Int128 operator %(Int128 dividend, Int128 divisor) - { - #region Contract - Contract.Requires(divisor != 0); - #endregion - - return Remainder(dividend, divisor); - } - - /// - /// Performs integer division on two values and returns the remainder. - /// - /// The value to be divided. - /// The value to divide by. - /// The remainder after dividing by . - public static Int128 Remainder(Int128 dividend, Int128 divisor) - { - #region Contract - Contract.Requires(divisor != 0); - #endregion - - Int128 remainder; - DivRem(dividend, divisor, out remainder); - return remainder; - } - #endregion - - /// - /// Gets the absolute value of an . - /// - /// A value. - /// The absolute value of . - public static Int128 Abs(Int128 value) - { - Int128 result = value; - if (result < 0) - result = -result; - return result; - } - - /// - /// Divides one value by another, using signed integer division, and returns the result - /// and the remainder. - /// - /// The value to be divided. - /// The value to divide by. - /// The remainder from the division. - /// The quotient of the division. - public static Int128 DivRem(Int128 dividend, Int128 divisor, out Int128 remainder) - { - Int128 quotient; - - int remainderSign = 1; - if (dividend < 0) - { - dividend = -dividend; - remainderSign = -1; - } - - int quotientSign = 1; - if (divisor < 0) - { - divisor = -divisor; - quotientSign = -1; - } - quotientSign *= remainderSign; - - quotient = UnsignedDivRem(dividend, divisor, out remainder); - - quotient *= quotientSign; - remainder *= remainderSign; - - return quotient; - } - - /// - /// Divides one value by another, using unsigned integer division, and returns the result - /// and the remainder. - /// - /// The value to be divided. - /// The value to divide by. - /// The remainder from the division. - /// The quotient of the division. - public static Int128 UnsignedDivRem(Int128 dividend, Int128 divisor, out Int128 remainder) - { - Int128 quotient = dividend; - remainder = 0; - for (int i = 0; i < 128; i++) - { - remainder <<= 1; - if (quotient < 0) - remainder.low |= 1; - quotient <<= 1; - - if (remainder >= divisor) - { - remainder -= divisor; - quotient++; - } - } - - return quotient; - } - - /// - /// Returns the larger of two values. - /// - /// The first value to compare. - /// The second value to compare. - /// The or parameter, whichever is larger. - public static Int128 Max(Int128 left, Int128 right) - { - Int128 result = left; - if (right > left) - result = right; - return result; - } - - /// - /// Returns the smaller of two values. - /// - /// The first value to compare. - /// The second value to compare. - /// The or parameter, whichever is smaller. - public static Int128 Min(Int128 left, Int128 right) - { - Int128 result = left; - if (right < left) - result = right; - return result; - } - - /// - /// Calculates the padding required to align the value to the next specified boundary. - /// - /// The boundary to align to, which must be a power of two. - /// The number of padding bytes required to align the address to the specified boundary. - public Int128 GetPadding(int boundary) - { - return (boundary + ((this - 1) & ~(boundary - 1))) - this; - } - - /// - /// Aligns the value to the next specified boundary. - /// - /// The boundary to align to, which must be a power of two. - /// The address aligned to the specified boundary. - public Int128 Align(int boundary) - { - return (boundary + ((this - 1) & ~(boundary - 1))); - } - #endregion - - #region Strings - /// - /// Formats the value of the current instance using the specified format. - /// - /// The format to use. - /// -or- - /// to use the default format defined for the type of the - /// implementation. - /// The provider to use to format the value. - /// -or- - /// to obtain the numeric format information from the current locale setting of - /// the operating system. - /// The value of the current instance in the specified format. - public string ToString(string format, IFormatProvider formatProvider) - { - // TODO: Implement. - return ToString(); - } - #endregion - - #region Fields - /// - /// The low part of the integer. - /// - private ulong low; - /// - /// The high part of the integer. - /// - private long high; - #endregion - } -} diff --git a/Users/Orvid/Orvid.Extensions/System/Math.cs b/Users/Orvid/Orvid.Extensions/System/Math.cs deleted file mode 100644 index c4112eef85..0000000000 --- a/Users/Orvid/Orvid.Extensions/System/Math.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace System -{ - /// - /// Contains various extensions to . - /// - public static class MathExtensions - { - #region Internal things - - private const ulong QuadhighestBit = 1UL << 63; - - private static int Quadnlz(ulong x) - { - //Future work: might be faster with a huge, explicit nested if tree, or use of an 256-element per-byte array. - - int n; - - if (x == 0) return (64); - n = 0; - if (x <= 0x00000000FFFFFFFF) { n = n + 32; x = x << 32; } - if (x <= 0x0000FFFFFFFFFFFF) { n = n + 16; x = x << 16; } - if (x <= 0x00FFFFFFFFFFFFFF) { n = n + 8; x = x << 8; } - if (x <= 0x0FFFFFFFFFFFFFFF) { n = n + 4; x = x << 4; } - if (x <= 0x3FFFFFFFFFFFFFFF) { n = n + 2; x = x << 2; } - if (x <= 0x7FFFFFFFFFFFFFFF) { n = n + 1; } - return n; - } - #endregion - - /// - /// Removes any fractional part of the provided value (rounding down for positive numbers, and rounding up for negative numbers) - /// - /// - /// - public static Quad Truncate(Quad value) - { - if (value.Exponent <= -64) - return Quad.Zero; - else if (value.Exponent >= 0) - return value; - else - { - //clear least significant "-value.exponent" bits that come after the binary point by shifting - return new Quad((value.SignificandBits >> (int)(-value.Exponent)) << (int)(-value.Exponent), value.Exponent); - } - } - - /// - /// Returns only the fractional part of the provided value. Equivalent to value % 1. - /// - /// - /// - public static Quad Fraction(Quad value) - { - if (value.Exponent >= 0) return Quad.Zero; //no fraction - else if (value.Exponent <= -64) return value; //all fraction (or zero) - else - { - //clear most significant 64+value.exponent bits before the binary point - ulong bits = (value.SignificandBits << (int)(64 + value.Exponent)) >> (int)(64 + value.Exponent); - if (bits == 0) return Quad.Zero; //value is an integer - - int shift = Quadnlz(bits); //renormalize - - return new Quad((~QuadhighestBit & (bits << shift)) | (QuadhighestBit & value.SignificandBits), value.Exponent - shift); - } - } - - /// - /// Calculates the log (base 2) of a Quad. - /// - /// - /// - public static double Log2(Quad value) - { - if (value.SignificandBits >= QuadhighestBit) return double.NaN; - if (value.Exponent == long.MinValue) return double.NegativeInfinity; //Log(0) - - return Math.Log(value.SignificandBits | QuadhighestBit, 2) + value.Exponent; - } - - /// - /// Calculates the natural log (base e) of a Quad. - /// - /// - /// - public static double Log(Quad value) - { - if (value.SignificandBits >= QuadhighestBit) - return double.NaN; - if (value.Exponent == long.MinValue) - return double.NegativeInfinity; //Log(0) - - return Math.Log(value.SignificandBits | QuadhighestBit) + value.Exponent * 0.69314718055994530941723212145818; - } - - /// - /// Raise a Quad to a given exponent. Pow returns 1 for x^0 for all x >= 0. An exception is thrown - /// if 0 is raised to a negative exponent (implying division by 0), or if a negative value is raised - /// by a non-integer exponent (yielding an imaginary number). - /// - /// - /// - /// - /// Internally, Pow uses Math.Pow. This effectively limits the precision of the output to a double's 53 bits. - public static Quad Pow(Quad value, double exponent) - { - if (value.Exponent == long.MinValue) - { - if (exponent > 0) - return Quad.Zero; - else if (exponent == 0) - return Quad.One; - else - throw new ArgumentOutOfRangeException("Cannot raise 0 to a negative exponent, as this implies division by zero."); - } - - if (value.SignificandBits >= QuadhighestBit && exponent % 1 != 0) - throw new ArgumentOutOfRangeException("Cannot raise a negative number to a non-integer exponent, as this yields an imaginary number."); - - double resultSignificand = Math.Pow((double)new Quad(value.SignificandBits, -63), exponent); - double resultExponent = (value.Exponent + 63) * exponent; //exponents multiply - - resultSignificand *= Math.Pow(2, resultExponent % 1); //push the fractional exponent into the significand - - Quad result = (Quad)resultSignificand; - result.Exponent += (long)Math.Truncate(resultExponent); - - return result; - } - - /// - /// Returns the larger of the 2 values. - /// - /// - /// - /// - public static Quad Max(Quad qd1, Quad qd2) - { - return qd1 > qd2 ? qd1 : qd2; - } - - /// - /// Returns the smaller of the 2 values. - /// - /// - /// - /// - public static Quad Min(Quad qd1, Quad qd2) - { - return qd1 < qd2 ? qd1 : qd2; - } - - /// - /// Returns the absolute value of the specified . - /// - /// - /// - public static Quad Abs(Quad qd) - { - return new Quad(qd.SignificandBits & ~QuadhighestBit, qd.Exponent); //clear the sign bit - } - - /// - /// Returns a value indicating the sign of a half-precision floating-point number. - /// - /// A signed number. - /// - /// A number indicating the sign of value. Number Description -1 value is less - /// than zero. 0 value is equal to zero. 1 value is greater than zero. - /// - /// value is equal to System.Half.NaN. - public static int Sign(Half value) - { - if (value < 0) - { - return -1; - } - else if (value > 0) - { - return 1; - } - else - { - if (value != 0) - { - throw new ArithmeticException("Function does not accept floating point Not-a-Number values."); - } - } - - return 0; - } - /// - /// Returns the absolute value of a half-precision floating-point number. - /// - /// A number in the range System.Half.MinValue ≤ value ≤ System.Half.MaxValue. - /// A half-precision floating-point number, x, such that 0 ≤ x ≤System.Half.MaxValue. - public static Half Abs(Half value) - { - return Half.ToHalf((ushort)(value.value & 0x7fff)); - } - - /// - /// Returns the larger of two half-precision floating-point numbers. - /// - /// The first of two half-precision floating-point numbers to compare. - /// The second of two half-precision floating-point numbers to compare. - /// - /// Parameter value1 or value2, whichever is larger. If value1, or value2, or both val1 - /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. - /// - public static Half Max(Half value1, Half value2) - { - return (value1 < value2) ? value2 : value1; - } - - /// - /// Returns the smaller of two half-precision floating-point numbers. - /// - /// The first of two half-precision floating-point numbers to compare. - /// The second of two half-precision floating-point numbers to compare. - /// - /// Parameter value1 or value2, whichever is smaller. If value1, or value2, or both val1 - /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. - /// - public static Half Min(Half value1, Half value2) - { - return (value1 < value2) ? value1 : value2; - } - } -} diff --git a/Users/Orvid/Orvid.Extensions/System/Oyster.IntX.cs b/Users/Orvid/Orvid.Extensions/System/Oyster.IntX.cs deleted file mode 100644 index c7a28a36cb..0000000000 --- a/Users/Orvid/Orvid.Extensions/System/Oyster.IntX.cs +++ /dev/null @@ -1,5008 +0,0 @@ -/* - -Copyright (c) 2005-2010, Andriy Kozachuk a.k.a. Oyster -All rights reserved. - -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. - -* Neither the name of Andriy Kozachuk nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -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. - - - PLEASE NOTE: This file has been heavily modified from it's original - version for use in this library. - - -*/ - - -using System; -using System.Text.RegularExpressions; -using System.Collections; -using System.Text; -using System.Collections.Generic; - -namespace System -{ - /// - /// Numeric class which represents arbitrary-precision integers. - /// (c) Andriy Kozachuk a.k.a. Oyster [dev.oyster@gmail.com] 2005-2010 - /// - public sealed class IntX : - IEquatable, IEquatable, IEquatable, IEquatable, IEquatable, - IComparable, IComparable, IComparable, IComparable, IComparable, IComparable, - IDisposable, ICloneable - { - - #region Internal Classes - - #region IntXDivider - internal static class IntXDivider - { - /// - /// Returns true if it's better to use classic algorithm for given big integers. - /// - /// First big integer length. - /// Second big integer length. - /// True if classic algorithm is better. - private static bool IsClassicAlgorithmNeeded(uint length1, uint length2) - { - return - length1 < Constants.AutoNewtonLengthLowerBound || length2 < Constants.AutoNewtonLengthLowerBound || - length1 > Constants.AutoNewtonLengthUpperBound || length2 > Constants.AutoNewtonLengthUpperBound; - } - - /// - /// Divides two big integers. - /// Also modifies and (it will contain remainder). - /// - /// First big integer digits. - /// Buffer for first big integer digits. May also contain remainder. Can be null - in this case it's created if necessary. - /// First big integer length. - /// Second big integer digits. - /// Buffer for second big integer digits. Only temporarily used. Can be null - in this case it's created if necessary. - /// Second big integer length. - /// Resulting big integer digits. - /// Which operation results to return. - /// Big integers comparsion result (pass -2 if omitted). - /// Resulting big integer length. - public static unsafe uint DivMod(uint[] digits1, uint[] digitsBuffer1, ref uint length1, uint[] digits2, uint[] digitsBuffer2, uint length2, uint[] digitsRes, DivModResultFlags resultFlags, int cmpResult) - { - // Maybe immediately use classic algorithm here - if (IsClassicAlgorithmNeeded(length1, length2)) - { - return ClassicDivMod(digits1, digitsBuffer1, ref length1, digits2, digitsBuffer2, length2, digitsRes, resultFlags, cmpResult); - } - - // Create some buffers if necessary - if (digitsBuffer1 == null) - { - digitsBuffer1 = new uint[length1 + 1]; - } - - fixed (uint* digitsPtr1 = digits1, digitsBufferPtr1 = digitsBuffer1, digitsPtr2 = digits2, digitsBufferPtr2 = digitsBuffer2 != null ? digitsBuffer2 : digits1, digitsResPtr = digitsRes != null ? digitsRes : digits1) - { - return DivMod( - digitsPtr1, - digitsBufferPtr1, - ref length1, - digitsPtr2, - digitsBufferPtr2 == digitsPtr1 ? null : digitsBufferPtr2, - length2, - digitsResPtr == digitsPtr1 ? null : digitsResPtr, - resultFlags, - cmpResult); - } - } - - /// - /// Divides two big integers. - /// Also modifies and (it will contain remainder). - /// - /// First big integer digits. - /// Buffer for first big integer digits. May also contain remainder. - /// First big integer length. - /// Second big integer digits. - /// Buffer for second big integer digits. Only temporarily used. - /// Second big integer length. - /// Resulting big integer digits. - /// Which operation results to return. - /// Big integers comparsion result (pass -2 if omitted). - /// Resulting big integer length. - public static unsafe uint DivMod(uint* digitsPtr1, uint* digitsBufferPtr1, ref uint length1, uint* digitsPtr2, uint* digitsBufferPtr2, uint length2, uint* digitsResPtr, DivModResultFlags resultFlags, int cmpResult) - { - // Maybe immediately use classic algorithm here - if (IsClassicAlgorithmNeeded(length1, length2)) - { - return ClassicDivMod(digitsPtr1, digitsBufferPtr1, ref length1, digitsPtr2, digitsBufferPtr2, length2, digitsResPtr, resultFlags, cmpResult); - } - - // Call base (for special cases) - uint resultLength = BaseDivMod(digitsPtr1, digitsBufferPtr1, ref length1, digitsPtr2, digitsBufferPtr2, length2, digitsResPtr, resultFlags, cmpResult); - if (resultLength != uint.MaxValue) - return resultLength; - - - // First retrieve opposite for the divider - uint int2OppositeLength; - ulong int2OppositeRightShift; - uint[] int2OppositeDigits = NewtonHelper.GetIntegerOpposite(digitsPtr2, length2, length1, digitsBufferPtr1, out int2OppositeLength, out int2OppositeRightShift); - - // We will need to muptiply it by divident now to receive quotient. - // Prepare digits for multiply result - uint quotLength; - uint[] quotDigits = new uint[length1 + int2OppositeLength]; - - // Fix some arrays - fixed (uint* oppositePtr = int2OppositeDigits, quotPtr = quotDigits) - { - // Multiply - quotLength = IntXMultiplier.Multiply(oppositePtr, int2OppositeLength, digitsPtr1, length1, quotPtr); - - // Calculate shift - uint shiftOffset = (uint)(int2OppositeRightShift / Constants.DigitBitCount); - int shiftCount = (int)(int2OppositeRightShift % Constants.DigitBitCount); - - // Get the very first bit of the shifted part - uint highestLostBit; - if (shiftCount == 0) - { - highestLostBit = quotPtr[shiftOffset - 1] >> 31; - } - else - { - highestLostBit = quotPtr[shiftOffset] >> (shiftCount - 1) & 1U; - } - - // After this result must be shifted to the right - this is required - quotLength = DigitOpHelper.Shr(quotPtr + shiftOffset, quotLength - shiftOffset, quotPtr, shiftCount, false); - - // Maybe quotient must be corrected - if (highestLostBit == 1U) - { - quotLength = DigitOpHelper.Add(quotPtr, quotLength, &highestLostBit, 1U, quotPtr); - } - - // Check quotient - finally it might be too big. - // For this we must multiply quotient by divider - uint quotDivLength; - uint[] quotDivDigits = new uint[quotLength + length2]; - fixed (uint* quotDivPtr = quotDivDigits) - { - quotDivLength = IntXMultiplier.Multiply(quotPtr, quotLength, digitsPtr2, length2, quotDivPtr); - - int cmpRes = DigitOpHelper.Cmp(quotDivPtr, quotDivLength, digitsPtr1, length1); - if (cmpRes > 0) - { - highestLostBit = 1; - quotLength = DigitOpHelper.Sub(quotPtr, quotLength, &highestLostBit, 1U, quotPtr); - quotDivLength = DigitOpHelper.Sub(quotDivPtr, quotDivLength, digitsPtr2, length2, quotDivPtr); - } - - // Now everything is ready and prepared to return results - - // First maybe fill remainder - if ((resultFlags & DivModResultFlags.Mod) != 0) - { - length1 = DigitOpHelper.Sub(digitsPtr1, length1, quotDivPtr, quotDivLength, digitsBufferPtr1); - } - - // And finally fill quotient - if ((resultFlags & DivModResultFlags.Div) != 0) - { - DigitHelper.DigitsBlockCopy(quotPtr, digitsResPtr, quotLength); - } - else - { - quotLength = 0; - } - - // Return some arrays to pool - ArrayPool.Instance.AddArray(int2OppositeDigits); - - return quotLength; - } - } - } - - /// - /// Divides one by another. - /// - /// First big integer. - /// Second big integer. - /// Remainder big integer. - /// Which operation results to return. - /// Divident big integer. - /// or is a null reference. - /// equals zero. - public static IntX DivMod(IntX int1, IntX int2, out IntX modRes, DivModResultFlags resultFlags) - { - // Null reference exceptions - if (ReferenceEquals(int1, null)) - { - throw new ArgumentNullException("int1", "Operands can't be null."); - } - else if (ReferenceEquals(int2, null)) - { - throw new ArgumentNullException("int2", "Operands can't be null."); - } - - // Check if int2 equals zero - if (int2._length == 0) - { - throw new DivideByZeroException(); - } - - // Get flags - bool divNeeded = (resultFlags & DivModResultFlags.Div) != 0; - bool modNeeded = (resultFlags & DivModResultFlags.Mod) != 0; - - // Special situation: check if int1 equals zero; in this case zero is always returned - if (int1._length == 0) - { - modRes = modNeeded ? new IntX() : null; - return divNeeded ? new IntX() : null; - } - - // Special situation: check if int2 equals one - nothing to divide in this case - if (int2._length == 1 && int2._digits[0] == 1) - { - modRes = modNeeded ? new IntX() : null; - return divNeeded ? int2._negative ? -int1 : +int1 : null; - } - - // Get resulting sign - bool resultNegative = int1._negative ^ int2._negative; - - // Check if int1 > int2 - int compareResult = DigitOpHelper.Cmp(int1._digits, int1._length, int2._digits, int2._length); - if (compareResult < 0) - { - modRes = modNeeded ? new IntX(int1) : null; - return divNeeded ? new IntX() : null; - } - else if (compareResult == 0) - { - modRes = modNeeded ? new IntX() : null; - return divNeeded ? new IntX(resultNegative ? -1 : 1) : null; - } - - // - // Actually divide here (by Knuth algorithm) - // - - // Prepare divident (if needed) - IntX divRes = null; - if (divNeeded) - { - divRes = new IntX(int1._length - int2._length + 1U, resultNegative); - } - - // Prepare mod (if needed) - if (modNeeded) - { - modRes = new IntX(int1._length + 1U, int1._negative); - } - else - { - modRes = null; - } - - // Call procedure itself - uint modLength = int1._length; - uint divLength = DivMod( - int1._digits, - modNeeded ? modRes._digits : null, - ref modLength, - int2._digits, - null, - int2._length, - divNeeded ? divRes._digits : null, - resultFlags, - compareResult); - - // Maybe set new lengths and perform normalization - if (divNeeded) - { - divRes._length = divLength; - divRes.TryNormalize(); - } - if (modNeeded) - { - modRes._length = modLength; - modRes.TryNormalize(); - } - - // Return div - return divRes; - } - - /// - /// Divides two big integers. - /// Also modifies and (it will contain remainder). - /// - /// First big integer digits. - /// Buffer for first big integer digits. May also contain remainder. Can be null - in this case it's created if necessary. - /// First big integer length. - /// Second big integer digits. - /// Buffer for second big integer digits. Only temporarily used. Can be null - in this case it's created if necessary. - /// Second big integer length. - /// Resulting big integer digits. - /// Which operation results to return. - /// Big integers comparsion result (pass -2 if omitted). - /// Resulting big integer length. - public static unsafe uint ClassicDivMod(uint[] digits1, uint[] digitsBuffer1, ref uint length1, uint[] digits2, uint[] digitsBuffer2, uint length2, uint[] digitsRes, DivModResultFlags resultFlags, int cmpResult) - { - // Create some buffers if necessary - if (digitsBuffer1 == null) - { - digitsBuffer1 = new uint[length1 + 1]; - } - if (digitsBuffer2 == null) - { - digitsBuffer2 = new uint[length2]; - } - - fixed (uint* digitsPtr1 = digits1, digitsBufferPtr1 = digitsBuffer1, digitsPtr2 = digits2, digitsBufferPtr2 = digitsBuffer2, digitsResPtr = digitsRes != null ? digitsRes : digits1) - { - return DivMod( - digitsPtr1, - digitsBufferPtr1, - ref length1, - digitsPtr2, - digitsBufferPtr2, - length2, - digitsResPtr == digitsPtr1 ? null : digitsResPtr, - resultFlags, - cmpResult); - } - } - - /// - /// Divides two big integers. - /// Also modifies and (it will contain remainder). - /// - /// First big integer digits. - /// Buffer for first big integer digits. May also contain remainder. - /// First big integer length. - /// Second big integer digits. - /// Buffer for second big integer digits. Only temporarily used. - /// Second big integer length. - /// Resulting big integer digits. - /// Which operation results to return. - /// Big integers comparsion result (pass -2 if omitted). - /// Resulting big integer length. - public static unsafe uint ClassicDivMod(uint* digitsPtr1, uint* digitsBufferPtr1, ref uint length1, uint* digitsPtr2, uint* digitsBufferPtr2, uint length2, uint* digitsResPtr, DivModResultFlags resultFlags, int cmpResult) - { - // Call base (for special cases) - uint resultLength = BaseDivMod(digitsPtr1, digitsBufferPtr1, ref length1, digitsPtr2, digitsBufferPtr2, length2, digitsResPtr, resultFlags, cmpResult); - if (resultLength != uint.MaxValue) - return resultLength; - - bool divNeeded = (resultFlags & DivModResultFlags.Div) != 0; - bool modNeeded = (resultFlags & DivModResultFlags.Mod) != 0; - - // - // Prepare digitsBufferPtr1 and digitsBufferPtr2 - // - - int shift1 = 31 - Bits.Msb(digitsPtr2[length2 - 1]); - if (shift1 == 0) - { - // We don't need to shift - just copy - DigitHelper.DigitsBlockCopy(digitsPtr1, digitsBufferPtr1, length1); - - // We also don't need to shift second digits - digitsBufferPtr2 = digitsPtr2; - } - else - { - int rightShift1 = Constants.DigitBitCount - shift1; - - // We do need to shift here - so copy with shift - suppose we have enough storage for this operation - length1 = DigitOpHelper.Shr(digitsPtr1, length1, digitsBufferPtr1 + 1, rightShift1, true) + 1U; - - // Second digits also must be shifted - DigitOpHelper.Shr(digitsPtr2, length2, digitsBufferPtr2 + 1, rightShift1, true); - } - - // - // Division main algorithm implementation - // - - ulong longDigit; - ulong divEst; - ulong modEst; - - ulong mulRes; - uint divRes; - long k, t; - - // Some digits2 cached digits - uint lastDigit2 = digitsBufferPtr2[length2 - 1]; - uint preLastDigit2 = digitsBufferPtr2[length2 - 2]; - - // Main divide loop - bool isMaxLength; - uint maxLength = length1 - length2; - for (uint i = maxLength, iLen2 = length1, j, ji; i <= maxLength; --i, --iLen2) - { - isMaxLength = iLen2 == length1; - - // Calculate estimates - if (isMaxLength) - { - longDigit = digitsBufferPtr1[iLen2 - 1]; - } - else - { - longDigit = (ulong)digitsBufferPtr1[iLen2] << Constants.DigitBitCount | digitsBufferPtr1[iLen2 - 1]; - } - - divEst = longDigit / lastDigit2; - modEst = longDigit - divEst * lastDigit2; - - // Check estimate (maybe correct it) - for (; ; ) - { - if (divEst == Constants.BitCountStepOf2 || divEst * preLastDigit2 > (modEst << Constants.DigitBitCount) + digitsBufferPtr1[iLen2 - 2]) - { - --divEst; - modEst += lastDigit2; - if (modEst < Constants.BitCountStepOf2) continue; - } - break; - } - divRes = (uint)divEst; - - // Multiply and subtract - k = 0; - for (j = 0, ji = i; j < length2; ++j, ++ji) - { - mulRes = (ulong)divRes * digitsBufferPtr2[j]; - t = digitsBufferPtr1[ji] - k - (long)(mulRes & 0xFFFFFFFF); - digitsBufferPtr1[ji] = (uint)t; - k = (long)(mulRes >> Constants.DigitBitCount) - (t >> Constants.DigitBitCount); - } - - if (!isMaxLength) - { - t = digitsBufferPtr1[iLen2] - k; - digitsBufferPtr1[iLen2] = (uint)t; - } - else - { - t = -k; - } - - // Correct result if subtracted too much - if (t < 0) - { - --divRes; - - k = 0; - for (j = 0, ji = i; j < length2; ++j, ++ji) - { - t = (long)digitsBufferPtr1[ji] + digitsBufferPtr2[j] + k; - digitsBufferPtr1[ji] = (uint)t; - k = t >> Constants.DigitBitCount; - } - - if (!isMaxLength) - { - digitsBufferPtr1[iLen2] = (uint)(k + digitsBufferPtr1[iLen2]); - } - } - - // Maybe save div result - if (divNeeded) - { - digitsResPtr[i] = divRes; - } - } - - if (modNeeded) - { - // First set correct mod length - length1 = DigitHelper.GetRealDigitsLength(digitsBufferPtr1, length2); - - // Next maybe shift result back to the right - if (shift1 != 0 && length1 != 0) - { - length1 = DigitOpHelper.Shr(digitsBufferPtr1, length1, digitsBufferPtr1, shift1, false); - } - } - - // Finally return length - return !divNeeded ? 0 : (digitsResPtr[maxLength] == 0 ? maxLength : ++maxLength); - } - - /// - /// Divides two big integers. - /// Also modifies and (it will contain remainder). - /// - /// First big integer digits. - /// Buffer for first big integer digits. May also contain remainder. - /// First big integer length. - /// Second big integer digits. - /// Buffer for second big integer digits. Only temporarily used. - /// Second big integer length. - /// Resulting big integer digits. - /// Which operation results to return. - /// Big integers comparsion result (pass -2 if omitted). - /// Resulting big integer length. - public static unsafe uint BaseDivMod(uint* digitsPtr1, uint* digitsBufferPtr1, ref uint length1, uint* digitsPtr2, uint* digitsBufferPtr2, uint length2, uint* digitsResPtr, DivModResultFlags resultFlags, int cmpResult) - { - // Base implementation covers some special cases - - bool divNeeded = (resultFlags & DivModResultFlags.Div) != 0; - bool modNeeded = (resultFlags & DivModResultFlags.Mod) != 0; - - // - // Special cases - // - - // Case when length1 == 0 - if (length1 == 0) return 0; - - // Case when both lengths are 1 - if (length1 == 1 && length2 == 1) - { - if (divNeeded) - { - *digitsResPtr = *digitsPtr1 / *digitsPtr2; - if (*digitsResPtr == 0) - { - length2 = 0; - } - } - if (modNeeded) - { - *digitsBufferPtr1 = *digitsPtr1 % *digitsPtr2; - if (*digitsBufferPtr1 == 0) - { - length1 = 0; - } - } - - return length2; - } - - // Compare digits first (if was not previously compared) - if (cmpResult == -2) - { - cmpResult = DigitOpHelper.Cmp(digitsPtr1, length1, digitsPtr2, length2); - } - - // Case when first value is smaller then the second one - we will have remainder only - if (cmpResult < 0) - { - // Maybe we should copy first digits into remainder (if remainder is needed at all) - if (modNeeded) - { - DigitHelper.DigitsBlockCopy(digitsPtr1, digitsBufferPtr1, length1); - } - - // Zero as division result - return 0; - } - - // Case when values are equal - if (cmpResult == 0) - { - // Maybe remainder must be marked as empty - if (modNeeded) - { - length1 = 0; - } - - // One as division result - if (divNeeded) - { - *digitsResPtr = 1; - } - - return 1; - } - - // Case when second length equals to 1 - if (length2 == 1) - { - // Call method basing on fact if div is needed - uint modRes; - if (divNeeded) - { - length2 = DigitOpHelper.DivMod(digitsPtr1, length1, *digitsPtr2, digitsResPtr, out modRes); - } - else - { - modRes = DigitOpHelper.Mod(digitsPtr1, length1, *digitsPtr2); - } - - // Maybe save mod result - if (modNeeded) - { - if (modRes != 0) - { - length1 = 1; - *digitsBufferPtr1 = modRes; - } - else - { - length1 = 0; - } - } - - return length2; - } - - - // This is regular case, not special - return uint.MaxValue; - } - - } - #endregion - - #region IntXMultiplier - internal static class IntXMultiplier - { - /// - /// Multiplies two big integers. - /// - /// First big integer. - /// Second big integer. - /// Resulting big integer. - /// or is a null reference. - /// or is too big for multiply operation. - public static IntX Multiply(IntX int1, IntX int2) - { - // Exceptions - if (ReferenceEquals(int1, null)) - { - throw new ArgumentNullException("int1", "Operands can't be null."); - } - else if (ReferenceEquals(int2, null)) - { - throw new ArgumentNullException("int2", "Operands can't be null."); - } - - // Special behavior for zero cases - if (int1._length == 0 || int2._length == 0) return new IntX(); - - // Get new big integer length and check it - ulong newLength = (ulong)int1._length + int2._length; - if (newLength >> 32 != 0) - { - throw new ArgumentException("One of the operated big integers is too big."); - } - - // Create resulting big int - IntX newInt = new IntX((uint)newLength, int1._negative ^ int2._negative); - - // Perform actual digits multiplication - newInt._length = Multiply(int1._digits, int1._length, int2._digits, int2._length, newInt._digits); - - // Normalization may be needed - newInt.TryNormalize(); - - return newInt; - } - - /// - /// Multiplies two big integers represented by their digits. - /// - /// First big integer digits. - /// First big integer real length. - /// Second big integer digits. - /// Second big integer real length. - /// Where to put resulting big integer. - /// Resulting big integer real length. - private static unsafe uint Multiply(uint[] digits1, uint length1, uint[] digits2, uint length2, uint[] digitsRes) - { - fixed (uint* digitsPtr1 = digits1, digitsPtr2 = digits2, digitsResPtr = digitsRes) - { - return Multiply(digitsPtr1, length1, digitsPtr2, length2, digitsResPtr); - } - } - /// - /// Multiplies two big integers using pointers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer real length. - internal static unsafe uint Multiply(uint* digitsPtr1, uint length1, uint* digitsPtr2, uint length2, uint* digitsResPtr) - { - // Check length - maybe use classic multiplier instead - if (length1 < Constants.AutoFhtLengthLowerBound || length2 < Constants.AutoFhtLengthLowerBound || - length1 > Constants.AutoFhtLengthUpperBound || length2 > Constants.AutoFhtLengthUpperBound) - { - return ClassicMultiply(digitsPtr1, length1, digitsPtr2, length2, digitsResPtr); - } - - uint newLength = length1 + length2; - - // Do FHT for first big integer - double[] data1 = FhtHelper.ConvertDigitsToDouble(digitsPtr1, length1, newLength); - FhtHelper.Fht(data1, (uint)data1.LongLength); - - // Compare digits - double[] data2; - if (digitsPtr1 == digitsPtr2 || DigitOpHelper.Cmp(digitsPtr1, length1, digitsPtr2, length2) == 0) - { - // Use the same FHT for equal big integers - data2 = data1; - } - else - { - // Do FHT over second digits - data2 = FhtHelper.ConvertDigitsToDouble(digitsPtr2, length2, newLength); - FhtHelper.Fht(data2, (uint)data2.LongLength); - } - - // Perform multiplication and reverse FHT - FhtHelper.MultiplyFhtResults(data1, data2, (uint)data1.LongLength); - FhtHelper.ReverseFht(data1, (uint)data1.LongLength); - - // Convert to digits - fixed (double* slice1 = data1) - { - FhtHelper.ConvertDoubleToDigits(slice1, (uint)data1.LongLength, newLength, digitsResPtr); - } - - // Return double arrays back to pool - ArrayPool.Instance.AddArray(data1); - if (data2 != data1) - { - ArrayPool.Instance.AddArray(data2); - } - - //// Maybe check for validity using classic multiplication - //if (System.IntX.GlobalSettings.ApplyFhtValidityCheck) - //{ - // uint lowerDigitCount = System.Math.Min(length2, System.Math.Min(length1, Constants.FhtValidityCheckDigitCount)); - - // // Validate result by multiplying lowerDigitCount digits using classic algorithm and comparing - // uint[] validationResult = new uint[lowerDigitCount * 2]; - // fixed (uint* validationResultPtr = validationResult) - // { - // ClassicMultiply(digitsPtr1, lowerDigitCount, digitsPtr2, lowerDigitCount, validationResultPtr); - // if (DigitOpHelper.Cmp(validationResultPtr, lowerDigitCount, digitsResPtr, lowerDigitCount) != 0) - // { - // throw new FhtMultiplicationException(string.Format("FHT multiplication returned invalid result for IntX objects with lengths {0} and {1}.", length1, length2)); - // } - // } - //} - - return digitsResPtr[newLength - 1] == 0 ? --newLength : newLength; - } - - /// - /// Multiplies two big integers using pointers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer length. - private static unsafe uint ClassicMultiply(uint* digitsPtr1, uint length1, uint* digitsPtr2, uint length2, uint* digitsResPtr) - { - ulong c; - - // External cycle must be always smaller - if (length1 < length2) - { - // First must be bigger - swap - uint lengthTemp = length1; - length1 = length2; - length2 = lengthTemp; - - uint* ptrTemp = digitsPtr1; - digitsPtr1 = digitsPtr2; - digitsPtr2 = ptrTemp; - } - - // Prepare end pointers - uint* digitsPtr1End = digitsPtr1 + length1; - uint* digitsPtr2End = digitsPtr2 + length2; - - // We must always clear first "length1" digits in result - DigitHelper.SetBlockDigits(digitsResPtr, length1, 0U); - - // Perform digits multiplication - uint* ptr1, ptrRes = null; - for (; digitsPtr2 < digitsPtr2End; ++digitsPtr2, ++digitsResPtr) - { - // Check for zero (sometimes may help). There is no sense to make this check in internal cycle - - // it would give performance gain only here - if (*digitsPtr2 == 0) continue; - - c = 0; - for (ptr1 = digitsPtr1, ptrRes = digitsResPtr; ptr1 < digitsPtr1End; ++ptr1, ++ptrRes) - { - c += (ulong)*digitsPtr2 * *ptr1 + *ptrRes; - *ptrRes = (uint)c; - c >>= 32; - } - *ptrRes = (uint)c; - } - - uint newLength = length1 + length2; - if (newLength > 0 && (ptrRes == null || *ptrRes == 0)) - { - --newLength; - } - return newLength; - } - } - #endregion - - #region IntXParser - internal static class IntXParser - { - /// - /// Regex pattern used on parsing stage to determine number sign and/or base - /// - private const string ParseRegexPattern = "(?[+-]?)((?0[Xx])|(?0))?"; - - /// - /// Regex object used on parsing stage to determine number sign and/or base - /// - private static readonly Regex ParseRegex = new Regex(ParseRegexPattern, RegexOptions.Compiled); - - - #region Pow2Parse - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Index inside string from which to start. - /// Index inside string on which to end. - /// Number base. - /// Char->digit dictionary. - /// Resulting digits. - /// Parsed integer length. - private static uint Pow2Parse(string value, int startIndex, int endIndex, uint numberBase, IDictionary charToDigits, uint[] digitsRes) - { - // Calculate length of input string - int bitsInChar = Bits.Msb(numberBase); - uint valueLength = (uint)(endIndex - startIndex + 1); - ulong valueBitLength = (ulong)valueLength * (ulong)bitsInChar; - - // Calculate needed digits length and first shift - uint digitsLength = (uint)(valueBitLength / Constants.DigitBitCount) + 1; - uint digitIndex = digitsLength - 1; - int initialShift = (int)(valueBitLength % Constants.DigitBitCount); - - // Probably correct digits length - if (initialShift == 0) - { - --digitsLength; - } - - // Do parsing in big cycle - uint digit; - for (int i = startIndex; i <= endIndex; ++i) - { - digit = StrRepHelper.GetDigit(charToDigits, value[i], numberBase); - - // Correct initial digit shift - if (initialShift == 0) - { - // If shift is equals to zero then char is not on digit elements bounds, - // so just go to the previous digit - initialShift = Constants.DigitBitCount - bitsInChar; - --digitIndex; - } - else - { - // Here shift might be negative, but it's okay - initialShift -= bitsInChar; - } - - // Insert new digit in correct place - digitsRes[digitIndex] |= initialShift < 0 ? digit >> -initialShift : digit << initialShift; - - // In case if shift was negative we also must modify previous digit - if (initialShift < 0) - { - initialShift += Constants.DigitBitCount; - digitsRes[--digitIndex] |= digit << initialShift; - } - } - - if (digitsRes[digitsLength - 1] == 0) - { - --digitsLength; - } - return digitsLength; - } - #endregion - - #region BaseParse - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Number base. - /// Char->digit dictionary. - /// Check actual format of number (0 or 0x at start). - /// Parsed object. - /// is a null reference. - /// is less then 2 or more then 16. - /// is not in valid format. - public static IntX Parse(string value, uint numberBase, IDictionary charToDigits, bool checkFormat) - { - // Exceptions - if (value == null) - { - throw new ArgumentNullException("value"); - } - if (charToDigits == null) - { - throw new ArgumentNullException("charToDigits"); - } - if (numberBase < 2 || numberBase > charToDigits.Count) - { - throw new ArgumentException("Base is invalid.", "numberBase"); - } - - // Initially determine start and end indices (Trim is too slow) - int startIndex = 0; - for (; startIndex < value.Length && char.IsWhiteSpace(value[startIndex]); ++startIndex) ; - int endIndex = value.Length - 1; - for (; endIndex >= startIndex && char.IsWhiteSpace(value[endIndex]); --endIndex) ; - - bool negative = false; // number sign - bool stringNotEmpty = false; // true if string is already guaranteed to be non-empty - - // Determine sign and/or base - Match match = ParseRegex.Match(value, startIndex, endIndex - startIndex + 1); - if (match.Groups["Sign"].Value == "-") - { - negative = true; - } - if (match.Groups["BaseHex"].Length != 0) - { - if (checkFormat) - { - // 0x before the number - this is hex number - numberBase = 16U; - } - else - { - // This is an error - throw new FormatException("Invalid character in input."); - } - } - else if (match.Groups["BaseOct"].Length != 0) - { - if (checkFormat) - { - // 0 before the number - this is octal number - numberBase = 8U; - } - - stringNotEmpty = true; - } - - // Skip leading sign and format - startIndex += match.Length; - - // If on this stage string is empty, this may mean an error - if (startIndex > endIndex && !stringNotEmpty) - { - throw new FormatException("No digits in string."); - } - - // Iterate thru string and skip all leading zeroes - for (; startIndex <= endIndex && value[startIndex] == '0'; ++startIndex) ; - - // Return zero if length is zero - if (startIndex > endIndex) return new IntX(); - - // Determine length of new digits array and create new IntX object with given length - int valueLength = endIndex - startIndex + 1; - uint digitsLength = (uint)System.Math.Ceiling(System.Math.Log(numberBase) / Constants.DigitBaseLog * valueLength); - IntX newInt = new IntX(digitsLength, negative); - - // Now we have only (in)valid string which consists from numbers only. - // Parse it - newInt._length = Parse(value, startIndex, endIndex, numberBase, charToDigits, newInt._digits); - - return newInt; - } - - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Index inside string from which to start. - /// Index inside string on which to end. - /// Number base. - /// Char->digit dictionary. - /// Resulting digits. - /// Parsed integer length. - private static uint BaseParse(string value, int startIndex, int endIndex, uint numberBase, IDictionary charToDigits, uint[] digitsRes) - { - // Default implementation - always call pow2 parser if numberBase is pow of 2 - return numberBase == 1U << Bits.Msb(numberBase) - ? Pow2Parse(value, startIndex, endIndex, numberBase, charToDigits, digitsRes) - : 0; - } - #endregion - - #region FastParser - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Index inside string from which to start. - /// Index inside string on which to end. - /// Number base. - /// Char->digit dictionary. - /// Resulting digits. - /// Parsed integer length. - private static unsafe uint Parse(string value, int startIndex, int endIndex, uint numberBase, IDictionary charToDigits, uint[] digitsRes) - { - uint newLength = BaseParse(value, startIndex, endIndex, numberBase, charToDigits, digitsRes); - - // Maybe base method already parsed this number - if (newLength != 0) return newLength; - - // Check length - maybe use classic parser instead - uint initialLength = (uint)digitsRes.LongLength; - if (initialLength < Constants.FastParseLengthLowerBound || initialLength > Constants.FastParseLengthUpperBound) - { - return ClassicParse(value, startIndex, endIndex, numberBase, charToDigits, digitsRes); - } - - uint valueLength = (uint)(endIndex - startIndex + 1); - uint digitsLength = 1U << Bits.CeilLog2(valueLength); - - // Prepare array for digits in other base - uint[] valueDigits = ArrayPool.Instance.GetArray(digitsLength); - - // This second array will store integer lengths initially - uint[] valueDigits2 = ArrayPool.Instance.GetArray(digitsLength); - - fixed (uint* valueDigitsStartPtr = valueDigits, valueDigitsStartPtr2 = valueDigits2) - { - // In the string first digit means last in digits array - uint* valueDigitsPtr = valueDigitsStartPtr + valueLength - 1; - uint* valueDigitsPtr2 = valueDigitsStartPtr2 + valueLength - 1; - - // Reverse copy characters into digits - fixed (char* valueStartPtr = value) - { - char* valuePtr = valueStartPtr + startIndex; - char* valueEndPtr = valuePtr + valueLength; - for (; valuePtr < valueEndPtr; ++valuePtr, --valueDigitsPtr, --valueDigitsPtr2) - { - // Get digit itself - this call will throw an exception if char is invalid - *valueDigitsPtr = StrRepHelper.GetDigit(charToDigits, *valuePtr, numberBase); - - // Set length of this digit (zero for zero) - *valueDigitsPtr2 = *valueDigitsPtr == 0U ? 0U : 1U; - } - } - - // We have retrieved lengths array from pool - it needs to be cleared before using - DigitHelper.SetBlockDigits(valueDigitsStartPtr2 + valueLength, digitsLength - valueLength, 0); - - // Now start from the digit arrays beginning - valueDigitsPtr = valueDigitsStartPtr; - valueDigitsPtr2 = valueDigitsStartPtr2; - - // Here base in needed power will be stored - IntX baseInt = null; - - // Temporary variables used on swapping - uint[] tempDigits; - uint* tempPtr; - - // Variables used in cycle - uint* ptr1, ptr2, valueDigitsPtrEnd; - uint loLength, hiLength; - - // Outer cycle instead of recursion - for (uint innerStep = 1, outerStep = 2; innerStep < digitsLength; innerStep <<= 1, outerStep <<= 1) - { - // Maybe baseInt must be multiplied by itself - baseInt = baseInt == null ? numberBase : baseInt * baseInt; - - // Using unsafe here - fixed (uint* baseDigitsPtr = baseInt._digits) - { - // Start from arrays beginning - ptr1 = valueDigitsPtr; - ptr2 = valueDigitsPtr2; - - // vauleDigits array end - valueDigitsPtrEnd = valueDigitsPtr + digitsLength; - - // Cycle thru all digits and their lengths - for (; ptr1 < valueDigitsPtrEnd; ptr1 += outerStep, ptr2 += outerStep) - { - // Get lengths of "lower" and "higher" value parts - loLength = *ptr2; - hiLength = *(ptr2 + innerStep); - - if (hiLength != 0) - { - // We always must clear an array before multiply - DigitHelper.SetBlockDigits(ptr2, outerStep, 0U); - - // Multiply per baseInt - hiLength = IntXMultiplier.Multiply(baseDigitsPtr, baseInt._length, ptr1 + innerStep, hiLength, ptr2); - } - - // Sum results - if (hiLength != 0 || loLength != 0) - { - *ptr1 = DigitOpHelper.Add(ptr2, hiLength, ptr1, loLength, ptr2); - } - else - { - *ptr1 = 0U; - } - } - } - - // After inner cycle valueDigits will contain lengths and valueDigits2 will contain actual values - // so we need to swap them here - tempDigits = valueDigits; - valueDigits = valueDigits2; - valueDigits2 = tempDigits; - - tempPtr = valueDigitsPtr; - valueDigitsPtr = valueDigitsPtr2; - valueDigitsPtr2 = tempPtr; - } - } - - // Determine real length of converted number - uint realLength = valueDigits2[0]; - - // Copy to result - Array.Copy(valueDigits, digitsRes, realLength); - - // Return arrays to pool - ArrayPool.Instance.AddArray(valueDigits); - ArrayPool.Instance.AddArray(valueDigits2); - - return realLength; - } - #endregion - - #region ClassicParser - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Index inside string from which to start. - /// Index inside string on which to end. - /// Number base. - /// Char->digit dictionary. - /// Resulting digits. - /// Parsed integer length. - private static uint ClassicParse(string value, int startIndex, int endIndex, uint numberBase, IDictionary charToDigits, uint[] digitsRes) - { - uint newLength = BaseParse(value, startIndex, endIndex, numberBase, charToDigits, digitsRes); - - // Maybe base method already parsed this number - if (newLength != 0) return newLength; - - // Do parsing in big cycle - ulong numberBaseLong = numberBase; - ulong digit; - for (int i = startIndex; i <= endIndex; ++i) - { - digit = StrRepHelper.GetDigit(charToDigits, value[i], numberBase); - - // Next multiply existing values by base and add this value to them - if (newLength == 0) - { - if (digit != 0) - { - digitsRes[0] = (uint)digit; - newLength = 1; - } - } - else - { - for (uint j = 0; j < newLength; ++j) - { - digit += digitsRes[j] * numberBaseLong; - digitsRes[j] = (uint)digit; - digit >>= 32; - } - if (digit != 0) - { - digitsRes[newLength++] = (uint)digit; - } - } - } - - return newLength; - } - #endregion - - } - #endregion - - #region IntXStringConverter - internal static class IntXStringConverter - { - /// - /// Returns string representation of object in given base. - /// - /// Big integer to convert. - /// Base of system in which to do output. - /// Alphabet which contains chars used to represent big integer, char position is coresponding digit value. - /// Object string representation. - /// is less then 2 or is too big to fit in string. - public static string ToString(IntX intX, uint numberBase, char[] alphabet) - { - // Test base - if (numberBase < 2 || numberBase > 65536) - { - throw new ArgumentException("Base must be between 2 and 65536.", "numberBase"); - } - - // Special processing for zero values - if (intX._length == 0) - return "0"; - - // Calculate output array length - uint outputLength = (uint)System.Math.Ceiling(Constants.DigitBaseLog / System.Math.Log(numberBase) * intX._length); - - // Define length coefficient for string builder - bool isBigBase = numberBase > alphabet.Length; - uint lengthCoef = isBigBase ? (uint)System.Math.Ceiling(System.Math.Log10(numberBase)) + 2U : 1U; - - // Determine maximal possible length of string - ulong maxBuilderLength = (ulong)outputLength * lengthCoef + 1UL; - if (maxBuilderLength > int.MaxValue) - { - // This big integer can't be transformed to string - throw new ArgumentException("One of the operated big integers is too big.", "intX"); - } - - // Transform digits into another base - uint[] outputArray = FastToString(intX._digits, intX._length, numberBase, ref outputLength); - - // Output everything to the string builder - StringBuilder outputBuilder = new StringBuilder((int)(outputLength * lengthCoef + 1)); - - // Maybe append minus sign - if (intX._negative) - { - outputBuilder.Append(Constants.DigitsMinusChar); - } - - // Output all digits - for (uint i = outputLength - 1; i < outputLength; --i) - { - if (!isBigBase) - { - // Output char-by-char for bases up to covered by alphabet - outputBuilder.Append(alphabet[(int)outputArray[i]]); - } - else - { - // Output digits in brackets for bigger bases - outputBuilder.Append(Constants.DigitOpeningBracet); - outputBuilder.Append(outputArray[i].ToString()); - outputBuilder.Append(Constants.DigitClosingBracet); - } - } - - return outputBuilder.ToString(); - } - - #region BaseToString - /// - /// Converts digits from internal representation into given base. - /// - /// Big integer digits. - /// Big integer length. - /// Base to use for output. - /// Calculated output length (will be corrected inside). - /// Conversion result (later will be transformed to string). - private static uint[] BaseToString(uint[] digits, uint length, uint numberBase, ref uint outputLength) - { - // Default implementation - always call pow2 converter if numberBase is power of 2 - return numberBase == 1U << Bits.Msb(numberBase) - ? Pow2ToString(digits, length, numberBase, ref outputLength) - : null; - } - #endregion - - #region FastToString - /// - /// Converts digits from internal representation into given base. - /// - /// Big integer digits. - /// Big integer length. - /// Base to use for output. - /// Calculated output length (will be corrected inside). - /// Conversion result (later will be transformed to string). - private static unsafe uint[] FastToString(uint[] digits, uint length, uint numberBase, ref uint outputLength) - { - uint[] outputArray = BaseToString(digits, length, numberBase, ref outputLength); - - // Maybe base method already converted this number - if (outputArray != null) return outputArray; - - // Check length - maybe use classic converter instead - if (length < Constants.FastConvertLengthLowerBound || length > Constants.FastConvertLengthUpperBound) - { - return ClassicToString(digits, length, numberBase, ref outputLength); - } - - int resultLengthLog2 = Bits.CeilLog2(outputLength); - uint resultLength = 1U << resultLengthLog2; - - // Create and initially fill array for transformed numbers storing - uint[] resultArray = ArrayPool.Instance.GetArray(resultLength); - Array.Copy(digits, resultArray, length); - - // Create and initially fill array with lengths - uint[] resultArray2 = ArrayPool.Instance.GetArray(resultLength); - resultArray2[0] = length; - - - // Generate all needed powers of numberBase in stack - Stack baseIntStack = new Stack(resultLengthLog2); - IntX baseInt = null; - for (int i = 0; i < resultLengthLog2; ++i) - { - baseInt = baseInt == null ? numberBase : IntXMultiplier.Multiply(baseInt, baseInt); - baseIntStack.Push(baseInt); - } - - // Create temporary buffer for second digits when doing div operation - uint[] tempBuffer = new uint[baseInt._length]; - - // We will use unsafe code here - fixed (uint* resultPtr1Const = resultArray, resultPtr2Const = resultArray2, tempBufferPtr = tempBuffer) - { - // Results pointers which will be modified (on swap) - uint* resultPtr1 = resultPtr1Const; - uint* resultPtr2 = resultPtr2Const; - - // Temporary variables used on swapping - uint[] tempArray; - uint* tempPtr; - - // Variables used in cycle - uint* ptr1, ptr2, ptr1end; - uint loLength; - - // Outer cycle instead of recursion - for (uint innerStep = resultLength >> 1, outerStep = resultLength; innerStep > 0; innerStep >>= 1, outerStep >>= 1) - { - // Prepare pointers - ptr1 = resultPtr1; - ptr2 = resultPtr2; - ptr1end = resultPtr1 + resultLength; - - // Get baseInt from stack and fix it too - baseInt = (IntX)baseIntStack.Pop(); - fixed (uint* baseIntPtr = baseInt._digits) - { - // Cycle thru all digits and their lengths - for (; ptr1 < ptr1end; ptr1 += outerStep, ptr2 += outerStep) - { - // Divide ptr1 (with length in *ptr2) by baseIntPtr here. - // Results are stored in ptr2 & (ptr2 + innerStep), lengths - in *ptr1 and (*ptr1 + innerStep) - loLength = *ptr2; - *(ptr1 + innerStep) = IntXDivider.DivMod( - ptr1, - ptr2, - ref loLength, - baseIntPtr, - tempBufferPtr, - baseInt._length, - ptr2 + innerStep, - DivModResultFlags.Div | DivModResultFlags.Mod, - -2); - *ptr1 = loLength; - } - } - - // After inner cycle resultArray will contain lengths and resultArray2 will contain actual values - // so we need to swap them here - tempArray = resultArray; - resultArray = resultArray2; - resultArray2 = tempArray; - - tempPtr = resultPtr1; - resultPtr1 = resultPtr2; - resultPtr2 = tempPtr; - } - - // Retrieve real output length - outputLength = DigitHelper.GetRealDigitsLength(resultArray2, outputLength); - - // Create output array - outputArray = new uint[outputLength]; - - // Copy each digit but only if length is not null - fixed (uint* outputPtr = outputArray) - { - for (uint i = 0; i < outputLength; ++i) - { - if (resultPtr2[i] != 0) - { - outputPtr[i] = resultPtr1[i]; - } - } - } - } - - // Return temporary arrays to pool - ArrayPool.Instance.AddArray(resultArray); - ArrayPool.Instance.AddArray(resultArray2); - - return outputArray; - } - #endregion - - #region ClassicToString - /// - /// Converts digits from internal representaion into given base. - /// - /// Big integer digits. - /// Big integer length. - /// Base to use for output. - /// Calculated output length (will be corrected inside). - /// Conversion result (later will be transformed to string). - private static uint[] ClassicToString(uint[] digits, uint length, uint numberBase, ref uint outputLength) - { - uint[] outputArray = BaseToString(digits, length, numberBase, ref outputLength); - - // Maybe base method already converted this number - if (outputArray != null) - return outputArray; - - // Create an output array for storing of number in other base - outputArray = new uint[outputLength + 1]; - - // Make a copy of initial data - uint[] digitsCopy = new uint[length]; - Array.Copy(digits, digitsCopy, length); - - // Calculate output numbers by dividing - uint outputIndex; - for (outputIndex = 0; length > 0; ++outputIndex) - { - length = DigitOpHelper.DivMod(digitsCopy, length, numberBase, digitsCopy, out outputArray[outputIndex]); - } - - outputLength = outputIndex; - return outputArray; - } - #endregion - - #region Pow2ToString - /// - /// Converts digits from internal representation into given base. - /// - /// Big integer digits. - /// Big integer length. - /// Base to use for output. - /// Calculated output length (will be corrected inside). - /// Conversion result (later will be transformed to string). - private static uint[] Pow2ToString(uint[] digits, uint length, uint numberBase, ref uint outputLength) - { - // Calculate real output length - int bitsInChar = Bits.Msb(numberBase); - ulong digitsBitLength = (ulong)(length - 1) * Constants.DigitBitCount + (ulong)Bits.Msb(digits[length - 1]) + 1UL; - uint realOutputLength = (uint)(digitsBitLength / (ulong)bitsInChar); - if (digitsBitLength % (ulong)bitsInChar != 0) - { - ++realOutputLength; - } - - // Prepare shift variables - int nextDigitShift = Constants.DigitBitCount - bitsInChar; // after this shift next digit must be used - int initialShift = 0; - - // We will also need bitmask for copying digits - uint digitBitMask = numberBase - 1; - - // Create an output array for storing of number in other base - uint[] outputArray = new uint[realOutputLength]; - - // Walk thru original digits and fill output - uint outputDigit; - for (uint outputIndex = 0, digitIndex = 0; outputIndex < realOutputLength; ++outputIndex) - { - // Get part of current digit - outputDigit = digits[digitIndex] >> initialShift; - - // Maybe we need to go to the next digit - if (initialShift >= nextDigitShift) - { - // Go to the next digit - ++digitIndex; - - // Maybe we also need a part of the next digit - if (initialShift != nextDigitShift && digitIndex < length) - { - outputDigit |= digits[digitIndex] << (Constants.DigitBitCount - initialShift); - } - - // Modify shift so that it will be valid for the next digit - initialShift = (initialShift + bitsInChar) % Constants.DigitBitCount; - } - else - { - // Modify shift as usual - initialShift += bitsInChar; - } - - // Write masked result to the output - outputArray[outputIndex] = outputDigit & digitBitMask; - } - - outputLength = realOutputLength; - return outputArray; - } - #endregion - - } - #endregion - - #region Bits - /// - /// Contains helping methods to with with bits in dword (). - /// - internal static class Bits - { - /// - /// Returns number of leading zero bits in int. - /// - /// Int value. - /// Number of leading zero bits. - static public int Nlz(uint x) - { - if (x == 0) return 32; - - int n = 1; - if ((x >> 16) == 0) { n += 16; x <<= 16; } - if ((x >> 24) == 0) { n += 8; x <<= 8; } - if ((x >> 28) == 0) { n += 4; x <<= 4; } - if ((x >> 30) == 0) { n += 2; x <<= 2; } - return n - (int)(x >> 31); - } - - /// - /// Counts position of the most significant bit in int. - /// Can also be used as Floor(Log2()). - /// - /// Int value. - /// Position of the most significant one bit (-1 if all zeroes). - static public int Msb(uint x) - { - return 31 - Nlz(x); - } - - /// - /// Ceil(Log2()). - /// - /// Int value. - /// Ceil of the Log2. - static public int CeilLog2(uint x) - { - int msb = Msb(x); - if (x != 1U << msb) - { - ++msb; - } - return msb; - } - } - #endregion - - #region DivModResultFlags - /// - /// divide results to return. - /// - [Flags] - internal enum DivModResultFlags - { - /// - /// Dividend is returned. - /// - Div = 1, - /// - /// Remainder is returned. - /// - Mod = 2 - } - #endregion - - #region Constants - /// - /// Constants used in and helping classes. - /// - static internal class Constants - { - #region .cctor - - static Constants() - { - BaseCharToDigits = StrRepHelper.CharDictionaryFromAlphabet(new string(BaseUpperChars), 16U); - for (int i = 10; i < BaseLowerChars.Length; i++) - { - BaseCharToDigits.Add(BaseLowerChars[i], (uint)i); - } - } - - #endregion .cctor - - - #region ToString constants - - /// - /// Chars used to parse/output big integers (upper case). - /// - public static readonly char[] BaseUpperChars = "0123456789ABCDEF".ToCharArray(); - - /// - /// Chars used to parse/output big integers (lower case). - /// - public static readonly char[] BaseLowerChars = "0123456789abcdef".ToCharArray(); - - /// - /// Standard char->digit dictionary. - /// - static readonly public IDictionary BaseCharToDigits; - - /// - /// Digit opening bracket (used for bases bigger then 16). - /// - public const char DigitOpeningBracet = '{'; - - /// - /// Digit closing bracket (used for bases bigger then 16). - /// - public const char DigitClosingBracet = '}'; - - /// - /// Minus char (-). - /// - public const char DigitsMinusChar = '-'; - - /// - /// Natural logarithm of digits base (log(2^32)). - /// - public static readonly double DigitBaseLog = System.Math.Log(1UL << DigitBitCount); - - #endregion ToString constants - - #region Pools constants - - /// - /// Minimal Log2(array length) which will be pooled using any array pool. - /// - public const int MinPooledArraySizeLog2 = 17; - - /// - /// Maximal Log2(array length) which will be pooled using any array pool. - /// - public const int MaxPooledArraySizeLog2 = 31; - - /// - /// Maximal allowed array pool items count in each stack. - /// - public const int MaxArrayPoolCount = 1024; - - #endregion Pools constants - - #region FHT constants - - /// - /// length from which FHT is used (in auto-FHT mode). - /// Before this length usual multiply algorithm works faster. - /// - public const uint AutoFhtLengthLowerBound = 1U << 9; - - /// - /// length 'till which FHT is used (in auto-FHT mode). - /// After this length using of FHT may be unsafe due to big precision errors. - /// - public const uint AutoFhtLengthUpperBound = 1U << 26; - - /// - /// Number of lower digits used to check FHT multiplication result validity. - /// - public const uint FhtValidityCheckDigitCount = 10; - - #endregion FHT constants - - #region Newton constants - - /// - /// length from which Newton approach is used (in auto-Newton mode). - /// Before this length usual divide algorithm works faster. - /// - public const uint AutoNewtonLengthLowerBound = 1U << 13; - - /// - /// length 'till which Newton approach is used (in auto-Newton mode). - /// After this length using of fast division may be slow. - /// - public const uint AutoNewtonLengthUpperBound = 1U << 26; - - #endregion Newton constants - - #region Parsing constants - - /// - /// length from which fast parsing is used (in Fast parsing mode). - /// Before this length usual parsing algorithm works faster. - /// - public const uint FastParseLengthLowerBound = 32; - - /// - /// length 'till which fast parsing is used (in Fast parsing mode). - /// After this length using of parsing will be slow. - /// - public const uint FastParseLengthUpperBound = uint.MaxValue; - - #endregion Parsing constants - - #region ToString convertion constants - - /// - /// length from which fast conversion is used (in Fast convert mode). - /// Before this length usual conversion algorithm works faster. - /// - public const uint FastConvertLengthLowerBound = 16; - - /// - /// length 'till which fast conversion is used (in Fast convert mode). - /// After this length using of conversion will be slow. - /// - public const uint FastConvertLengthUpperBound = uint.MaxValue; - - #endregion ToString convertion constants - - /// - /// Count of bits in one digit. - /// - public const int DigitBitCount = 32; - - /// - /// Maximum count of bits which can fit in . - /// - public const ulong MaxBitCount = uint.MaxValue * 32UL; - - /// - /// 2^. - /// - public const ulong BitCountStepOf2 = 1UL << 32; - } - #endregion - - #region ArrayPool - /// - /// Generic arrays pool on weak references. - /// - sealed internal class ArrayPool - { - #region Fields - - /// - /// Singleton instance. - /// - static readonly public ArrayPool Instance = new ArrayPool( - Constants.MinPooledArraySizeLog2, - Constants.MaxPooledArraySizeLog2, - Constants.MaxArrayPoolCount); - - // Minimal and maximal Log2(uint[] length) which will be pooled - int _minPooledArraySizeLog2; - int _maxPooledArraySizeLog2; - - // Maximal pool items count - int _maxPoolCount; - - Stack[] _pools; // ArrayPool pools - - #endregion Fields - - #region Constructor - - // Singleton - private ArrayPool(int minPooledArraySizeLog2, int maxPooledArraySizeLog2, int maxPoolCount) - { - _minPooledArraySizeLog2 = minPooledArraySizeLog2; - _maxPooledArraySizeLog2 = maxPooledArraySizeLog2; - _maxPoolCount = maxPoolCount; - - // Init pools - _pools = new Stack[maxPooledArraySizeLog2 - minPooledArraySizeLog2 + 1]; - for (int i = 0; i < _pools.Length; ++i) - { - // Calls to those pools are sync in code - _pools[i] = new Stack(); - } - } - - #endregion Constructor - - #region Pool management methods - - /// - /// Either returns array of given size from pool or creates it. - /// - /// Array length (always pow of 2). - /// Always array instance ready to use. - public T[] GetArray(uint length) - { - int lengthLog2 = Bits.Msb(length); - - // Check if we can search in pool - if (lengthLog2 >= _minPooledArraySizeLog2 && lengthLog2 <= _maxPooledArraySizeLog2) - { - // Get needed pool - Stack pool = _pools[lengthLog2 - _minPooledArraySizeLog2]; - - // Try to find at least one not collected array of given size - while (pool.Count > 0) - { - WeakReference arrayRef; - lock (pool) - { - // Double-guard here - if (pool.Count > 0) - { - arrayRef = pool.Pop(); - } - else - { - // Well, we can exit here - break; - } - } - - // Maybe return found array if link is alive - T[] array = (T[])arrayRef.Target; - if (arrayRef.IsAlive) return array; - } - } - - // Array can't be found in pool - create new one - return new T[length]; - } - - /// - /// Adds array to pool. - /// - /// Array to add (it/s length is always pow of 2). - public void AddArray(T[] array) - { - int lengthLog2 = Bits.Msb((uint)array.LongLength); - - // Check if we can add in pool - if (lengthLog2 >= _minPooledArraySizeLog2 && lengthLog2 <= _maxPooledArraySizeLog2) - { - // Get needed pool - Stack pool = _pools[lengthLog2 - _minPooledArraySizeLog2]; - - // Add array to pool (only if pool size is not too big) - if (pool.Count <= _maxPoolCount) - { - lock (pool) - { - // Double-guard here - if (pool.Count <= _maxPoolCount) - { - pool.Push(new WeakReference(array)); - } - } - } - } - } - - #endregion Pool management methods - } - #endregion - - #region StrRepHelper - /// - /// Helps to work with string representations. - /// - static internal class StrRepHelper - { - /// - /// Returns digit for given char. - /// - /// Char->digit dictionary. - /// Char which represents big integer digit. - /// String representation number base. - /// Digit. - /// is not in valid format. - static public uint GetDigit(IDictionary charToDigits, char ch, uint numberBase) - { - if (charToDigits == null) - { - throw new ArgumentNullException("charToDigits"); - } - - // Try to identify this digit - uint digit; - if (!charToDigits.TryGetValue(ch, out digit)) - { - throw new FormatException("Invalid character in input."); - } - if (digit >= numberBase) - { - throw new FormatException("Digit is too big for this base."); - } - return digit; - } - - /// - /// Verfies string alphabet provider by user for validity. - /// - /// Alphabet. - /// String representation number base. - static public void AssertAlphabet(string alphabet, uint numberBase) - { - if (alphabet == null) - { - throw new ArgumentNullException("alphabet"); - } - - // Ensure that alphabet has enough characters to represent numbers in given base - if (alphabet.Length < numberBase) - { - throw new ArgumentException(string.Format("Alphabet is too small to represent numbers in base {0}.", numberBase), "alphabet"); - } - - // Ensure that all the characters in alphabet are unique - char[] sortedChars = alphabet.ToCharArray(); - Array.Sort(sortedChars); - for (int i = 0; i < sortedChars.Length; i++) - { - if (i > 0 && sortedChars[i] == sortedChars[i - 1]) - { - throw new ArgumentException("Alphabet characters must be unique.", "alphabet"); - } - } - } - - /// - /// Generates char->digit dictionary from alphabet. - /// - /// Alphabet. - /// String representation number base. - /// Char->digit dictionary. - static public IDictionary CharDictionaryFromAlphabet(string alphabet, uint numberBase) - { - AssertAlphabet(alphabet, numberBase); - Dictionary charToDigits = new Dictionary((int)numberBase); - for (int i = 0; i < numberBase; i++) - { - charToDigits.Add(alphabet[i], (uint)i); - } - return charToDigits; - } - } - #endregion - - #region OpHelper - /// - /// Contains helping methods for operations over . - /// - static internal class OpHelper - { - #region Add operation - - /// - /// Adds two big integers. - /// - /// First big integer. - /// Second big integer. - /// Resulting big integer. - /// or is too big for add operation. - static public IntX Add(IntX int1, IntX int2) - { - // Process zero values in special way - if (int2._length == 0) return new IntX(int1); - if (int1._length == 0) - { - IntX x = new IntX(int2); - x._negative = int1._negative; // always get sign of the first big integer - return x; - } - - // Determine big int with lower length - IntX smallerInt; - IntX biggerInt; - DigitHelper.GetMinMaxLengthObjects(int1, int2, out smallerInt, out biggerInt); - - // Check for add operation possibility - if (biggerInt._length == uint.MaxValue) - { - throw new ArgumentException("One of the operated big integers is too big."); - } - - // Create new big int object of needed length - IntX newInt = new IntX(biggerInt._length + 1, int1._negative); - - // Do actual addition - newInt._length = DigitOpHelper.Add( - biggerInt._digits, - biggerInt._length, - smallerInt._digits, - smallerInt._length, - newInt._digits); - - // Normalization may be needed - newInt.TryNormalize(); - - return newInt; - } - - #endregion Add operation - - #region Subtract operation - - /// - /// Subtracts two big integers. - /// - /// First big integer. - /// Second big integer. - /// Resulting big integer. - static public IntX Sub(IntX int1, IntX int2) - { - // Process zero values in special way - if (int1._length == 0) return new IntX(int2._digits, true); - if (int2._length == 0) return new IntX(int1); - - // Determine lower big int (without sign) - IntX smallerInt; - IntX biggerInt; - int compareResult = DigitOpHelper.Cmp(int1._digits, int1._length, int2._digits, int2._length); - if (compareResult == 0) return new IntX(); // integers are equal - if (compareResult < 0) - { - smallerInt = int1; - biggerInt = int2; - } - else - { - smallerInt = int2; - biggerInt = int1; - } - - // Create new big int object - IntX newInt = new IntX(biggerInt._length, ReferenceEquals(int1, smallerInt) ^ int1._negative); - - // Do actual subtraction - newInt._length = DigitOpHelper.Sub( - biggerInt._digits, - biggerInt._length, - smallerInt._digits, - smallerInt._length, - newInt._digits); - - // Normalization may be needed - newInt.TryNormalize(); - - return newInt; - } - - #endregion Subtract operation - - #region Add/Subtract operation - common methods - - /// - /// Adds/subtracts one to/from another. - /// Determines which operation to use basing on operands signs. - /// - /// First big integer. - /// Second big integer. - /// Was subtraction initially. - /// Add/subtract operation result. - /// or is a null reference. - static public IntX AddSub(IntX int1, IntX int2, bool subtract) - { - // Exceptions - if (ReferenceEquals(int1, null)) - { - throw new ArgumentNullException("int1", "Operands can't be null."); - } - else if (ReferenceEquals(int2, null)) - { - throw new ArgumentNullException("int2", "Operands can't be null."); - } - - // Determine real operation type and result sign - return subtract ^ int1._negative == int2._negative ? Add(int1, int2) : Sub(int1, int2); - } - - #endregion Add/Subtract operation - common methods - - #region Power operation - - /// - /// Returns a specified big integer raised to the specified power. - /// - /// Number to raise. - /// Power. - /// Number in given power. - /// is a null reference. - static public IntX Pow(IntX value, uint power) - { - // Exception - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("value"); - } - - // Return one for zero pow - if (power == 0) return 1; - - // Return the number itself from a power of one - if (power == 1) return new IntX(value); - - // Return zero for a zero - if (value._length == 0) return new IntX(); - - // Get first one bit - int msb = Bits.Msb(power); - - // Do actual raising - IntX res = value; - for (uint powerMask = 1U << (msb - 1); powerMask != 0; powerMask >>= 1) - { - // Always square - res = IntXMultiplier.Multiply(res, res); - - // Maybe mul - if ((power & powerMask) != 0) - { - res = IntXMultiplier.Multiply(res, value); - } - } - return res; - } - - #endregion Power operation - - #region Compare operation - - /// - /// Compares 2 objects. - /// Returns "-2" if any argument is null, "-1" if < , - /// "0" if equal and "1" if >. - /// - /// First big integer. - /// Second big integer. - /// Raises or not . - /// Comparison result. - /// or is a null reference and is set to true. - static public int Cmp(IntX int1, IntX int2, bool throwNullException) - { - // If one of the operands is null, throw exception or return -2 - bool isNull1 = ReferenceEquals(int1, null); - bool isNull2 = ReferenceEquals(int2, null); - if (isNull1 || isNull2) - { - if (throwNullException) - { - throw new ArgumentNullException(isNull1 ? "int1" : "int2", "Can't use null in comparsion operations."); - } - else - { - return isNull1 && isNull2 ? 0 : -2; - } - } - - // Compare sign - if (int1._negative && !int2._negative) return -1; - if (!int1._negative && int2._negative) return 1; - - // Compare presentation - return DigitOpHelper.Cmp(int1._digits, int1._length, int2._digits, int2._length) * (int1._negative ? -1 : 1); - } - - /// - /// Compares object to int. - /// Returns "-1" if < , "0" if equal and "1" if >. - /// - /// First big integer. - /// Second integer. - /// Comparison result. - static public int Cmp(IntX int1, int int2) - { - // Special processing for zero - if (int2 == 0) return int1._length == 0 ? 0 : (int1._negative ? -1 : 1); - if (int1._length == 0) return int2 > 0 ? -1 : 1; - - // Compare presentation - if (int1._length > 1) return int1._negative ? -1 : 1; - uint digit2; - bool negative2; - DigitHelper.ToUInt32WithSign(int2, out digit2, out negative2); - - // Compare sign - if (int1._negative && !negative2) return -1; - if (!int1._negative && negative2) return 1; - - return int1._digits[0] == digit2 ? 0 : (int1._digits[0] < digit2 ^ negative2 ? -1 : 1); - } - - /// - /// Compares object to unsigned int. - /// Returns "-1" if < , "0" if equal and "1" if >. - /// For internal use. - /// - /// First big integer. - /// Second unsigned integer. - /// Comparsion result. - static public int Cmp(IntX int1, uint int2) - { - // Special processing for zero - if (int2 == 0) return int1._length == 0 ? 0 : (int1._negative ? -1 : 1); - if (int1._length == 0) return -1; - - // Compare presentation - if (int1._negative) return -1; - if (int1._length > 1) return 1; - return int1._digits[0] == int2 ? 0 : (int1._digits[0] < int2 ? -1 : 1); - } - - #endregion Compare operation - - #region Shift operation - - /// - /// Shifts object. - /// Determines which operation to use basing on shift sign. - /// - /// Big integer. - /// Bits count to shift. - /// If true the shifting to the left. - /// Bitwise shift operation result. - /// is a null reference. - static public IntX Sh(IntX intX, long shift, bool toLeft) - { - // Exceptions - if (ReferenceEquals(intX, null)) - { - throw new ArgumentNullException("intX", "Operand can't be null."); - } - - // Zero can't be shifted - if (intX._length == 0) return new IntX(); - - // Can't shift on zero value - if (shift == 0) return new IntX(intX); - - // Determine real bits count and direction - ulong bitCount; - bool negativeShift; - DigitHelper.ToUInt64WithSign(shift, out bitCount, out negativeShift); - toLeft ^= negativeShift; - - // Get position of the most significant bit in intX and amount of bits in intX - int msb = Bits.Msb(intX._digits[intX._length - 1]); - ulong intXBitCount = (ulong)(intX._length - 1) * Constants.DigitBitCount + (ulong)msb + 1UL; - - // If shifting to the right and shift is too big then return zero - if (!toLeft && bitCount >= intXBitCount) return new IntX(); - - // Calculate new bit count - ulong newBitCount = toLeft ? intXBitCount + bitCount : intXBitCount - bitCount; - - // If shifting to the left and shift is too big to fit in big integer, throw an exception - if (toLeft && newBitCount > Constants.MaxBitCount) - { - throw new ArgumentException("One of the operated big integers is too big.", "intX"); - } - - // Get exact length of new big integer (no normalize is ever needed here). - // Create new big integer with given length - uint newLength = (uint)(newBitCount / Constants.DigitBitCount + (newBitCount % Constants.DigitBitCount == 0 ? 0UL : 1UL)); - IntX newInt = new IntX(newLength, intX._negative); - - // Get full and small shift values - uint fullDigits = (uint)(bitCount / Constants.DigitBitCount); - int smallShift = (int)(bitCount % Constants.DigitBitCount); - - // We can just copy (no shift) if small shift is zero - if (smallShift == 0) - { - if (toLeft) - { - Array.Copy(intX._digits, 0, newInt._digits, fullDigits, intX._length); - } - else - { - Array.Copy(intX._digits, fullDigits, newInt._digits, 0, newLength); - } - } - else - { - // Do copy with real shift in the needed direction - if (toLeft) - { - DigitOpHelper.Shr(intX._digits, 0, intX._length, newInt._digits, fullDigits + 1, Constants.DigitBitCount - smallShift); - } - else - { - // If new result length is smaller then original length we shouldn't lose any digits - if (newLength < intX._length) - { - newLength++; - } - - DigitOpHelper.Shr(intX._digits, fullDigits, newLength, newInt._digits, 0, smallShift); - } - } - - return newInt; - } - - #endregion Shift operation - } - #endregion - - #region NewtonHelper - /// - /// Contains helping methods for fast division - /// using Newton approximation approach and fast multiplication. - /// - static internal class NewtonHelper - { - /// - /// Generates integer opposite to the given one using approximation. - /// Uses algorithm from Khuth vol. 2 3rd Edition (4.3.3). - /// - /// Initial big integer digits. - /// Initial big integer length. - /// Precision length. - /// Buffer in which shifted big integer may be stored. - /// Resulting big integer length. - /// How much resulting big integer is shifted to the left (or: must be shifted to the right). - /// Resulting big integer digits. - static unsafe public uint[] GetIntegerOpposite(uint* digitsPtr, uint length, uint maxLength, uint* bufferPtr, out uint newLength, out ulong rightShift) - { - // Maybe initially shift original digits a bit to the left - // (it must have MSB on 2nd position in the highest digit) - int msb = Bits.Msb(digitsPtr[length - 1]); - rightShift = (ulong)(length - 1) * Constants.DigitBitCount + (ulong)msb + 1U; - - if (msb != 2) - { - // Shift to the left (via actually right shift) - int leftShift = (2 - msb + Constants.DigitBitCount) % Constants.DigitBitCount; - length = DigitOpHelper.Shr(digitsPtr, length, bufferPtr + 1, Constants.DigitBitCount - leftShift, true) + 1U; - } - else - { - // Simply use the same digits without any shifting - bufferPtr = digitsPtr; - } - - // Calculate possible result length - int lengthLog2 = Bits.CeilLog2(maxLength); - uint newLengthMax = 1U << (lengthLog2 + 1); - int lengthLog2Bits = lengthLog2 + Bits.Msb(Constants.DigitBitCount); - - // Create result digits - uint[] resultDigits = ArrayPool.Instance.GetArray(newLengthMax); //new uint[newLengthMax]; - uint resultLength; - - // Create temporary digits for squared result (twice more size) - uint[] resultDigitsSqr = ArrayPool.Instance.GetArray(newLengthMax); //new uint[newLengthMax]; - uint resultLengthSqr; - - // Create temporary digits for squared result * buffer - uint[] resultDigitsSqrBuf = new uint[newLengthMax + length]; - uint resultLengthSqrBuf; - - // Fix some digits - fixed (uint* resultPtrFixed = resultDigits, resultSqrPtrFixed = resultDigitsSqr, resultSqrBufPtr = resultDigitsSqrBuf) - { - uint* resultPtr = resultPtrFixed; - uint* resultSqrPtr = resultSqrPtrFixed; - - // Cache two first digits - uint bufferDigitN1 = bufferPtr[length - 1]; - uint bufferDigitN2 = bufferPtr[length - 2]; - - // Prepare result. - // Initially result = floor(32 / (4*v1 + 2*v2 + v3)) / 4 - // (last division is not floored - here we emulate fixed point) - resultDigits[0] = 32 / bufferDigitN1; - resultLength = 1; - - // Prepare variables - uint nextBufferTempStorage = 0; - int nextBufferTempShift; - uint nextBufferLength = 1U; - uint* nextBufferPtr = &nextBufferTempStorage; - - ulong bitsAfterDotResult; - ulong bitsAfterDotResultSqr; - ulong bitsAfterDotNextBuffer; - ulong bitShift; - uint shiftOffset; - - uint* tempPtr; - uint[] tempDigits; - - // Iterate 'till result will be precise enough - for (int k = 0; k < lengthLog2Bits; ++k) - { - // Get result squared - resultLengthSqr = IntXMultiplier.Multiply( - resultPtr, - resultLength, - resultPtr, - resultLength, - resultSqrPtr); - - // Calculate current result bits after dot - bitsAfterDotResult = (1UL << k) + 1UL; - bitsAfterDotResultSqr = bitsAfterDotResult << 1; - - // Here we will get the next portion of data from bufferPtr - if (k < 4) - { - // For now buffer intermediate has length 1 and we will use this fact - nextBufferTempShift = 1 << (k + 1); - nextBufferTempStorage = - bufferDigitN1 << nextBufferTempShift | - bufferDigitN2 >> (Constants.DigitBitCount - nextBufferTempShift); - - // Calculate amount of bits after dot (simple formula here) - bitsAfterDotNextBuffer = (ulong)nextBufferTempShift + 3UL; - } - else - { - // Determine length to get from bufferPtr - nextBufferLength = System.Math.Min((1U << (k - 4)) + 1U, length); - nextBufferPtr = bufferPtr + (length - nextBufferLength); - - // Calculate amount of bits after dot (simple formula here) - bitsAfterDotNextBuffer = (ulong)(nextBufferLength - 1U) * Constants.DigitBitCount + 3UL; - } - - // Multiply result ^ 2 and nextBuffer + calculate new amount of bits after dot - resultLengthSqrBuf = IntXMultiplier.Multiply( - resultSqrPtr, - resultLengthSqr, - nextBufferPtr, - nextBufferLength, - resultSqrBufPtr); - - bitsAfterDotNextBuffer += bitsAfterDotResultSqr; - - // Now calculate 2 * result - resultSqrBufPtr - --bitsAfterDotResult; - --bitsAfterDotResultSqr; - - // Shift result on a needed amount of bits to the left - bitShift = bitsAfterDotResultSqr - bitsAfterDotResult; - shiftOffset = (uint)(bitShift / Constants.DigitBitCount); - resultLength = - shiftOffset + 1U + - DigitOpHelper.Shr( - resultPtr, - resultLength, - resultSqrPtr + shiftOffset + 1U, - Constants.DigitBitCount - (int)(bitShift % Constants.DigitBitCount), - true); - - // Swap resultPtr and resultSqrPtr pointers - tempPtr = resultPtr; - resultPtr = resultSqrPtr; - resultSqrPtr = tempPtr; - - tempDigits = resultDigits; - resultDigits = resultDigitsSqr; - resultDigitsSqr = tempDigits; - - DigitHelper.SetBlockDigits(resultPtr, shiftOffset, 0U); - - bitShift = bitsAfterDotNextBuffer - bitsAfterDotResultSqr; - shiftOffset = (uint)(bitShift / Constants.DigitBitCount); - - if (shiftOffset < resultLengthSqrBuf) - { - // Shift resultSqrBufPtr on a needed amount of bits to the right - resultLengthSqrBuf = DigitOpHelper.Shr( - resultSqrBufPtr + shiftOffset, - resultLengthSqrBuf - shiftOffset, - resultSqrBufPtr, - (int)(bitShift % Constants.DigitBitCount), - false); - - // Now perform actual subtraction - resultLength = DigitOpHelper.Sub( - resultPtr, - resultLength, - resultSqrBufPtr, - resultLengthSqrBuf, - resultPtr); - } - else - { - // Actually we can assume resultSqrBufPtr == 0 here and have nothing to do - } - } - } - - // Return some arrays to pool - ArrayPool.Instance.AddArray(resultDigitsSqr); - - rightShift += (1UL << lengthLog2Bits) + 1UL; - newLength = resultLength; - return resultDigits; - } - } - #endregion - - #region FhtHelper - /// - /// Contains helping methods for work with FHT (Fast Hartley Transform). - /// FHT is a better alternative of FFT (Fast Fourier Transform) - at least for . - /// - static unsafe internal class FhtHelper - { - #region struct TrigValues - - /// - /// Trigonometry values. - /// - internal struct TrigValues - { - /// - /// Sin value from . - /// - public double TableSin; - - /// - /// Cos value from . - /// - public double TableCos; - - /// - /// Sin value. - /// - public double Sin; - - /// - /// Cos value. - /// - public double Cos; - } - - #endregion struct SinCos - - #region Private constants (or static readonly fields) - - // double[] data base - const int DoubleDataBytes = 1; - const int DoubleDataLengthShift = 2 - (DoubleDataBytes >> 1); - const int DoubleDataDigitShift = DoubleDataBytes << 3; - const long DoubleDataBaseInt = 1L << DoubleDataDigitShift; - const double DoubleDataBase = DoubleDataBaseInt; - const double DoubleDataBaseDiv2 = DoubleDataBase / 2.0; - - // SQRT(2) and SQRT(2) / 2 - static readonly double Sqrt2 = System.Math.Sqrt(2.0); - static readonly double Sqrt2Div2 = Sqrt2 / 2.0; - - // SIN() table - static readonly double[] SineTable = new double[31]; - - #endregion Private constants (or static readonly fields) - - #region Constructors - - // .cctor - static FhtHelper() - { - // Initialize SinTable - FillSineTable(SineTable); - } - - #endregion Constructors - - #region Data conversion methods - - /// - /// Converts digits into real representation (used in FHT). - /// - /// Big integer digits. - /// length. - /// Multiplication result length (must be pow of 2). - /// Double array. - static public double[] ConvertDigitsToDouble(uint[] digits, uint length, uint newLength) - { - fixed (uint* digitsPtr = digits) - { - return ConvertDigitsToDouble(digitsPtr, length, newLength); - } - } - - /// - /// Converts digits into real representation (used in FHT). - /// - /// Big integer digits. - /// length. - /// Multiplication result length (must be pow of 2). - /// Double array. - static public double[] ConvertDigitsToDouble(uint* digitsPtr, uint length, uint newLength) - { - // Maybe fix newLength (make it the nearest bigger pow of 2) - newLength = 1U << Bits.CeilLog2(newLength); - - // For better FHT accuracy we will choose length smaller then dwords. - // So new length must be modified accordingly - newLength <<= DoubleDataLengthShift; - double[] data = ArrayPool.Instance.GetArray(newLength); - - // Run in unsafe context - fixed (double* slice = data) - { - // Amount of units pointed by digitsPtr - uint unitCount = length << DoubleDataLengthShift; - - // Copy all words from digits into new double[] - byte* unitDigitsPtr = (byte*)digitsPtr; - for (uint i = 0; i < unitCount; ++i) - { - slice[i] = unitDigitsPtr[i]; - } - - // Clear remaining double values (this array is from pool and may be dirty) - DigitHelper.SetBlockDigits(slice + unitCount, newLength - unitCount, 0.0); - - // FHT (as well as FFT) works more accurate with "balanced" data, so let's balance it - double carry = 0, dataDigit; - for (uint i = 0; i < unitCount || i < newLength && carry != 0; ++i) - { - dataDigit = slice[i] + carry; - if (dataDigit >= DoubleDataBaseDiv2) - { - dataDigit -= DoubleDataBase; - carry = 1.0; - } - else - { - carry = 0; - } - slice[i] = dataDigit; - } - - if (carry > 0) - { - slice[0] -= carry; - } - } - - return data; - } - - /// - /// Converts real digits representation (result of FHT) into usual digits. - /// - /// Real digits representation. - /// length. - /// New digits array length (we always do know the upper value for this array). - /// Big integer digits. - static unsafe public void ConvertDoubleToDigits(double[] array, uint length, uint digitsLength, uint[] digitsRes) - { - fixed (double* slice = array) - fixed (uint* digitsResPtr = digitsRes) - { - ConvertDoubleToDigits(slice, length, digitsLength, digitsResPtr); - } - } - - /// - /// Converts real digits representation (result of FHT) into usual digits. - /// - /// Real digits representation. - /// length. - /// New digits array length (we always do know the upper value for this array). - /// Resulting digits storage. - /// Big integer digits (dword values). - static unsafe public void ConvertDoubleToDigits(double* slice, uint length, uint digitsLength, uint* digitsResPtr) - { - // Calculate data multiplier (don't forget about additional div 2) - double normalizeMultiplier = 0.5 / length; - - // Count of units in digits - uint unitCount = digitsLength << DoubleDataLengthShift; - - // Carry and current digit - double carry = 0, dataDigit; - long carryInt = 0, dataDigitInt; - - - // Walk thru all double digits - byte* unitDigitsPtr = (byte*)digitsResPtr; - for (uint i = 0; i < length; ++i) - { - // Get data digit (don't forget it might be balanced) - dataDigit = slice[i] * normalizeMultiplier; - - // Round to the nearest - dataDigitInt = (long)(dataDigit < 0 ? dataDigit - 0.5 : dataDigit + 0.5) + carryInt; - - // Get next carry floored; maybe modify data digit - carry = dataDigitInt / DoubleDataBase; - if (carry < 0) - { - carry += carry % 1.0; - } - carryInt = (long)carry; - - dataDigitInt -= carryInt << DoubleDataDigitShift; - if (dataDigitInt < 0) - { - dataDigitInt += DoubleDataBaseInt; - --carryInt; - } - - // Maybe add to the digits - if (i < unitCount) - { - unitDigitsPtr[i] = (byte)dataDigitInt; - } - } - - // Last carry must be accounted - if (carryInt < 0) - { - digitsResPtr[0] -= (uint)-carryInt; - } - else if (carryInt > 0) - { - uint digitsCarry = (uint)carryInt, oldDigit; - for (uint i = 0; digitsCarry != 0 && i < digitsLength; ++i) - { - oldDigit = digitsResPtr[i]; - digitsResPtr[i] += digitsCarry; - - // Check for an overflow - digitsCarry = digitsResPtr[i] < oldDigit ? 1U : 0U; - } - } - } - - #endregion Data conversion methods - - #region FHT - - /// - /// Performs FHT "in place" for given double[] array. - /// - /// Double array. - /// Array length. - static public void Fht(double[] array, uint length) - { - fixed (double* slice = array) - { - Fht(slice, length, Bits.Msb(length)); - } - } - - /// - /// Performs FHT "in place" for given double[] array slice. - /// - /// Double array slice. - /// Slice length. - /// Log2(). - static public void Fht(double* slice, uint length, int lengthLog2) - { - // Special fast processing for length == 4 - if (length == 4) - { - Fht4(slice); - return; - } - - // Divide data into 2 recursively processed parts - length >>= 1; - --lengthLog2; - double* rightSlice = slice + length; - - uint lengthDiv2 = length >> 1; - uint lengthDiv4 = length >> 2; - - // Perform initial "butterfly" operations over left and right array parts - double leftDigit = slice[0]; - double rightDigit = rightSlice[0]; - slice[0] = leftDigit + rightDigit; - rightSlice[0] = leftDigit - rightDigit; - - leftDigit = slice[lengthDiv2]; - rightDigit = rightSlice[lengthDiv2]; - slice[lengthDiv2] = leftDigit + rightDigit; - rightSlice[lengthDiv2] = leftDigit - rightDigit; - - // Get initial trig values - //TrigValues trigValues = GetInitialTrigValues(lengthLog2); - TrigValues trigValues = new TrigValues(); - GetInitialTrigValues(&trigValues, lengthLog2); - - // Perform "butterfly" - for (uint i = 1; i < lengthDiv4; ++i) - { - FhtButterfly(slice, rightSlice, i, length - i, trigValues.Cos, trigValues.Sin); - FhtButterfly(slice, rightSlice, lengthDiv2 - i, lengthDiv2 + i, trigValues.Sin, trigValues.Cos); - - // Get next trig values - NextTrigValues(&trigValues); - } - - // Final "butterfly" - FhtButterfly(slice, rightSlice, lengthDiv4, length - lengthDiv4, Sqrt2Div2, Sqrt2Div2); - - // Finally perform recursive run - Fht(slice, length, lengthLog2); - Fht(rightSlice, length, lengthLog2); - } - - /// - /// Performs FHT "in place" for given double[] array slice. - /// Fast version for length == 4. - /// - /// Double array slice. - static private void Fht4(double* slice) - { - // Get 4 digits - double d0 = slice[0]; - double d1 = slice[1]; - double d2 = slice[2]; - double d3 = slice[3]; - - // Perform fast "butterfly" addition/subtraction for them. - // In case when length == 4 we can do it without trigonometry - double d02 = d0 + d2; - double d13 = d1 + d3; - slice[0] = d02 + d13; - slice[1] = d02 - d13; - - d02 = d0 - d2; - d13 = d1 - d3; - slice[2] = d02 + d13; - slice[3] = d02 - d13; - } - - #endregion FHT - - #region FHT results multiplication - - /// - /// Multiplies two FHT results and stores multiplication in first one. - /// - /// First FHT result. - /// Second FHT result. - /// FHT results length. - static public void MultiplyFhtResults(double[] data, double[] data2, uint length) - { - fixed (double* slice = data, slice2 = data2) - { - MultiplyFhtResults(slice, slice2, length); - } - } - - /// - /// Multiplies two FHT results and stores multiplication in first one. - /// - /// First FHT result. - /// Second FHT result. - /// FHT results length. - static public void MultiplyFhtResults(double* slice, double* slice2, uint length) - { - // Step0 and Step1 - slice[0] *= 2.0 * slice2[0]; - slice[1] *= 2.0 * slice2[1]; - - // Perform all other steps - double d11, d12, d21, d22, ad, sd; - for (uint stepStart = 2, stepEnd = 4, index1, index2; stepStart < length; stepStart *= 2, stepEnd *= 2) - { - for (index1 = stepStart, index2 = stepEnd - 1; index1 < stepEnd; index1 += 2, index2 -= 2) - { - d11 = slice[index1]; - d12 = slice[index2]; - d21 = slice2[index1]; - d22 = slice2[index2]; - - ad = d11 + d12; - sd = d11 - d12; - - slice[index1] = d21 * ad + d22 * sd; - slice[index2] = d22 * ad - d21 * sd; - } - } - } - - #endregion FHT results multiplication - - #region Reverse FHT - - /// - /// Performs FHT reverse "in place" for given double[] array. - /// - /// Double array. - /// Array length. - static public void ReverseFht(double[] array, uint length) - { - fixed (double* slice = array) - { - ReverseFht(slice, length, Bits.Msb(length)); - } - } - - /// - /// Performs reverse FHT "in place" for given double[] array slice. - /// - /// Double array slice. - /// Slice length. - /// Log2(). - static public void ReverseFht(double* slice, uint length, int lengthLog2) - { - // Special fast processing for length == 8 - if (length == 8) - { - ReverseFht8(slice); - return; - } - - // Divide data into 2 recursively processed parts - length >>= 1; - --lengthLog2; - double* rightSlice = slice + length; - - uint lengthDiv2 = length >> 1; - uint lengthDiv4 = length >> 2; - - // Perform recursive run - ReverseFht(slice, length, lengthLog2); - ReverseFht(rightSlice, length, lengthLog2); - - // Get initial trig values - TrigValues trigValues = new TrigValues(); - GetInitialTrigValues(&trigValues, lengthLog2); - - // Perform "butterfly" - for (uint i = 1; i < lengthDiv4; ++i) - { - ReverseFhtButterfly(slice, rightSlice, i, length - i, trigValues.Cos, trigValues.Sin); - ReverseFhtButterfly(slice, rightSlice, lengthDiv2 - i, lengthDiv2 + i, trigValues.Sin, trigValues.Cos); - - // Get next trig values - NextTrigValues(&trigValues); - } - - // Final "butterfly" - ReverseFhtButterfly(slice, rightSlice, lengthDiv4, length - lengthDiv4, Sqrt2Div2, Sqrt2Div2); - ReverseFhtButterfly2(slice, rightSlice, 0, 0, 1.0, 0); - ReverseFhtButterfly2(slice, rightSlice, lengthDiv2, lengthDiv2, 0, 1.0); - } - - /// - /// Performs reverse FHT "in place" for given double[] array slice. - /// Fast version for length == 8. - /// - /// Double array slice. - static private void ReverseFht8(double* slice) - { - // Get 8 digits - double d0 = slice[0]; - double d1 = slice[1]; - double d2 = slice[2]; - double d3 = slice[3]; - double d4 = slice[4]; - double d5 = slice[5]; - double d6 = slice[6]; - double d7 = slice[7]; - - // Calculate add and subtract pairs for first 4 digits - double da01 = d0 + d1; - double ds01 = d0 - d1; - double da23 = d2 + d3; - double ds23 = d2 - d3; - - // Calculate add and subtract pairs for first pairs - double daa0123 = da01 + da23; - double dsa0123 = da01 - da23; - double das0123 = ds01 + ds23; - double dss0123 = ds01 - ds23; - - // Calculate add and subtract pairs for next 4 digits - double da45 = d4 + d5; - double ds45 = (d4 - d5) * Sqrt2; - double da67 = d6 + d7; - double ds67 = (d6 - d7) * Sqrt2; - - // Calculate add and subtract pairs for next pairs - double daa4567 = da45 + da67; - double dsa4567 = da45 - da67; - - // Store digits values - slice[0] = daa0123 + daa4567; - slice[4] = daa0123 - daa4567; - slice[2] = dsa0123 + dsa4567; - slice[6] = dsa0123 - dsa4567; - slice[1] = das0123 + ds45; - slice[5] = das0123 - ds45; - slice[3] = dss0123 + ds67; - slice[7] = dss0123 - ds67; - } - - #endregion Reverse FHT - - #region "Butterfly" methods for FHT - - /// - /// Performs "butterfly" operation for . - /// - /// First data array slice. - /// Second data array slice. - /// First slice index. - /// Second slice index. - /// Cos value. - /// Sin value. - static private void FhtButterfly(double* slice1, double* slice2, uint index1, uint index2, double cos, double sin) - { - double d11 = slice1[index1]; - double d12 = slice1[index2]; - - double temp = slice2[index1]; - slice1[index1] = d11 + temp; - d11 -= temp; - - temp = slice2[index2]; - slice1[index2] = d12 + temp; - d12 -= temp; - - slice2[index1] = d11 * cos + d12 * sin; - slice2[index2] = d11 * sin - d12 * cos; - } - - /// - /// Performs "butterfly" operation for . - /// - /// First data array slice. - /// Second data array slice. - /// First slice index. - /// Second slice index. - /// Cos value. - /// Sin value. - static private void ReverseFhtButterfly(double* slice1, double* slice2, uint index1, uint index2, double cos, double sin) - { - double d21 = slice2[index1]; - double d22 = slice2[index2]; - - double temp = slice1[index1]; - double temp2 = d21 * cos + d22 * sin; - slice1[index1] = temp + temp2; - slice2[index1] = temp - temp2; - - temp = slice1[index2]; - temp2 = d21 * sin - d22 * cos; - slice1[index2] = temp + temp2; - slice2[index2] = temp - temp2; - } - - /// - /// Performs "butterfly" operation for . - /// Another version. - /// - /// First data array slice. - /// Second data array slice. - /// First slice index. - /// Second slice index. - /// Cos value. - /// Sin value. - static private void ReverseFhtButterfly2(double* slice1, double* slice2, uint index1, uint index2, double cos, double sin) - { - double temp = slice1[index1]; - double temp2 = slice2[index1] * cos + slice2[index2] * sin; - slice1[index1] = temp + temp2; - slice2[index2] = temp - temp2; - } - - #endregion "Butterfly" methods for FHT - - #region Trigonometry working methods - - /// - /// Fills sine table for FHT. - /// - /// Sine table to fill. - static private void FillSineTable(double[] sineTable) - { - for (int i = 0, p = 1; i < sineTable.Length; ++i, p *= 2) - { - sineTable[i] = System.Math.Sin(System.Math.PI / p); - } - } - - /// - /// Initializes trigonometry values for FHT. - /// - /// Values to init. - /// Log2(processing slice length). - static private void GetInitialTrigValues(TrigValues* valuesPtr, int lengthLog2) - { - valuesPtr->TableSin = SineTable[lengthLog2]; - valuesPtr->TableCos = SineTable[lengthLog2 + 1]; - valuesPtr->TableCos *= -2.0 * valuesPtr->TableCos; - - valuesPtr->Sin = valuesPtr->TableSin; - valuesPtr->Cos = valuesPtr->TableCos + 1.0; - } - - /// - /// Generates next trigonometry values for FHT basing on previous ones. - /// - /// Current trig values. - static private void NextTrigValues(TrigValues* valuesPtr) - { - double oldCos = valuesPtr->Cos; - valuesPtr->Cos = valuesPtr->Cos * valuesPtr->TableCos - valuesPtr->Sin * valuesPtr->TableSin + valuesPtr->Cos; - valuesPtr->Sin = valuesPtr->Sin * valuesPtr->TableCos + oldCos * valuesPtr->TableSin + valuesPtr->Sin; - } - - #endregion Trigonometry working methods - } - #endregion - - #region DigitOpHelper - /// - /// Contains helping methods for operations over digits as arrays. - /// - static internal class DigitOpHelper - { - #region Add operation - - /// - /// Adds two big integers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer length. - static unsafe public uint Add(uint[] digits1, uint length1, uint[] digits2, uint length2, uint[] digitsRes) - { - fixed (uint* digitsPtr1 = digits1, digitsPtr2 = digits2, digitsResPtr = digitsRes) - { - return Add(digitsPtr1, length1, digitsPtr2, length2, digitsResPtr); - } - } - - /// - /// Adds two big integers using pointers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer length. - static unsafe public uint Add(uint* digitsPtr1, uint length1, uint* digitsPtr2, uint length2, uint* digitsResPtr) - { - ulong c = 0; - - if (length1 < length2) - { - // First must be bigger - swap - uint lengthTemp = length1; - length1 = length2; - length2 = lengthTemp; - - uint* ptrTemp = digitsPtr1; - digitsPtr1 = digitsPtr2; - digitsPtr2 = ptrTemp; - } - - // Perform digits adding - for (uint i = 0; i < length2; ++i) - { - c += (ulong)digitsPtr1[i] + digitsPtr2[i]; - digitsResPtr[i] = (uint)c; - c >>= 32; - } - - // Perform digits + carry moving - for (uint i = length2; i < length1; ++i) - { - c += digitsPtr1[i]; - digitsResPtr[i] = (uint)c; - c >>= 32; - } - - // Account last carry - if (c != 0) - { - digitsResPtr[length1++] = (uint)c; - } - - return length1; - } - - #endregion Add operation - - #region Subtract operation - - /// - /// Subtracts two big integers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer length. - static unsafe public uint Sub(uint[] digits1, uint length1, uint[] digits2, uint length2, uint[] digitsRes) - { - fixed (uint* digitsPtr1 = digits1, digitsPtr2 = digits2, digitsResPtr = digitsRes) - { - return Sub(digitsPtr1, length1, digitsPtr2, length2, digitsResPtr); - } - } - - /// - /// Subtracts two big integers using pointers. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Resulting big integer digits. - /// Resulting big integer length. - static unsafe public uint Sub(uint* digitsPtr1, uint length1, uint* digitsPtr2, uint length2, uint* digitsResPtr) - { - ulong c = 0; - - // Perform digits subtraction - for (uint i = 0; i < length2; ++i) - { - c = (ulong)digitsPtr1[i] - digitsPtr2[i] - c; - digitsResPtr[i] = (uint)c; - c >>= 63; - } - - // Perform digits + carry moving - for (uint i = length2; i < length1; ++i) - { - c = digitsPtr1[i] - c; - digitsResPtr[i] = (uint)c; - c >>= 63; - } - - return DigitHelper.GetRealDigitsLength(digitsResPtr, length1); - } - - #endregion Subtract operation - - #region Divide/modulo operation - when second length == 1 - - /// - /// Divides one big integer represented by it's digits on another one big integer. - /// Reminder is always filled (but not the result). - /// - /// First big integer digits. - /// First big integer length. - /// Second integer. - /// Div result (can be null - not filled in this case). - /// Remainder (always filled). - /// Result length (0 if result is null). - static unsafe public uint DivMod(uint[] digits1, uint length1, uint int2, uint[] divRes, out uint modRes) - { - fixed (uint* digits1Ptr = digits1, divResPtr = divRes) - { - return DivMod(digits1Ptr, length1, int2, divResPtr, out modRes); - } - } - - /// - /// Divides one big integer represented by it's digits on another one big integer. - /// Reminder is always filled (but not the result). - /// - /// First big integer digits. - /// First big integer length. - /// Second integer. - /// Div result (can be null - not filled in this case). - /// Remainder (always filled). - /// Result length (0 if result is null). - static unsafe public uint DivMod(uint* digitsPtr1, uint length1, uint int2, uint* divResPtr, out uint modRes) - { - ulong c = 0; - uint res; - for (uint index = length1 - 1; index < length1; --index) - { - c = (c << Constants.DigitBitCount) + digitsPtr1[index]; - res = (uint)(c / int2); - c -= (ulong)res * int2; - - divResPtr[index] = res; - } - modRes = (uint)c; - - return length1 - (divResPtr[length1 - 1] == 0 ? 1U : 0U); - } - - - /// - /// Divides one big integer represented by it's digits on another one big integer. - /// Only remainder is filled. - /// - /// First big integer digits. - /// First big integer length. - /// Second integer. - /// Remainder. - static unsafe public uint Mod(uint[] digits1, uint length1, uint int2) - { - fixed (uint* digitsPtr1 = digits1) - { - return Mod(digitsPtr1, length1, int2); - } - } - - /// - /// Divides one big integer represented by it's digits on another one big integer. - /// Only remainder is filled. - /// - /// First big integer digits. - /// First big integer length. - /// Second integer. - /// Remainder. - static unsafe public uint Mod(uint* digitsPtr1, uint length1, uint int2) - { - ulong c = 0; - uint res; - for (uint* ptr1 = digitsPtr1 + length1 - 1; ptr1 >= digitsPtr1; --ptr1) - { - c = (c << Constants.DigitBitCount) + *ptr1; - res = (uint)(c / int2); - c -= (ulong)res * int2; - } - - return (uint)c; - } - - #endregion Divide/modulo operation - when second length == 1 - - #region Compare operation - - /// - /// Compares 2 objects represented by digits only (not taking sign into account). - /// Returns "-1" if < , "0" if equal and "1" if >. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Comparison result. - static unsafe public int Cmp(uint[] digits1, uint length1, uint[] digits2, uint length2) - { - // Always compare length if one of the integers has zero length - if (length1 == 0 || length2 == 0) return CmpLen(length1, length2); - - fixed (uint* digitsPtr1 = digits1, digitsPtr2 = digits2) - { - return Cmp(digitsPtr1, length1, digitsPtr2, length2); - } - } - - /// - /// Compares 2 objects represented by pointers only (not taking sign into account). - /// Returns "-1" if < , "0" if equal and "1" if >. - /// - /// First big integer digits. - /// First big integer length. - /// Second big integer digits. - /// Second big integer length. - /// Comparison result. - static unsafe public int Cmp(uint* digitsPtr1, uint length1, uint* digitsPtr2, uint length2) - { - // Maybe length comparing will be enough - int res = CmpLen(length1, length2); - if (res != -2) return res; - - for (uint index = length1 - 1; index < length1; --index) - { - if (digitsPtr1[index] != digitsPtr2[index]) return digitsPtr1[index] < digitsPtr2[index] ? -1 : 1; - } - return 0; - } - - /// - /// Compares two integers lengths. Returns -2 if further comparing is needed. - /// - /// First big integer length. - /// Second big integer length. - /// Comparison result. - static int CmpLen(uint length1, uint length2) - { - if (length1 < length2) return -1; - if (length1 > length2) return 1; - return length1 == 0 ? 0 : -2; - } - - #endregion Compare operation - - #region Shift operation - - /// - /// Shifts big integer. - /// - /// Big integer digits. - /// Big integer digits offset. - /// Big integer length. - /// Resulting big integer digits. - /// Resulting big integer digits offset. - /// Shift to the right (always between 1 an 31). - static unsafe public void Shr(uint[] digits, uint offset, uint length, uint[] digitsRes, uint resOffset, int rightShift) - { - fixed (uint* digitsPtr = digits, digitsResPtr = digitsRes) - { - Shr(digitsPtr + offset, length, digitsResPtr + resOffset, rightShift, resOffset != 0); - } - } - - /// - /// Shifts big integer. - /// - /// Big integer digits. - /// Big integer length. - /// Resulting big integer digits. - /// Shift to the right (always between 1 an 31). - /// True if has offset. - /// Resulting big integer length. - unsafe static public uint Shr(uint* digitsPtr, uint length, uint* digitsResPtr, int rightShift, bool resHasOffset) - { - int rightShiftRev = Constants.DigitBitCount - rightShift; - - // Shift first digit in special way - if (resHasOffset) - { - digitsResPtr[-1] = digitsPtr[0] << rightShiftRev; - } - - if (rightShift == 0) - { - // Handle special situation here - only memcpy is needed (maybe) - if (digitsPtr != digitsResPtr) - { - DigitHelper.DigitsBlockCopy(digitsPtr, digitsResPtr, length); - } - } - else - { - // Shift all digits except last one - uint* digitsPtrEndPrev = digitsPtr + length - 1; - uint* digitsPtrNext = digitsPtr + 1; - for (; digitsPtr < digitsPtrEndPrev; ++digitsPtr, ++digitsPtrNext, ++digitsResPtr) - { - *digitsResPtr = *digitsPtr >> rightShift | *digitsPtrNext << rightShiftRev; - } - - // Shift last digit in special way - uint lastValue = *digitsPtr >> rightShift; - if (lastValue != 0) - { - *digitsResPtr = lastValue; - } - else - { - --length; - } - } - - return length; - } - - #endregion Shift operation - } - #endregion - - #region DigitHelper - /// - /// Contains big integer uint[] digits utility methods. - /// - static internal class DigitHelper - { - #region Working with digits length methods - - /// - /// Returns real length of digits array (excluding leading zeroes). - /// - /// Big integer digits. - /// Initial big integers length. - /// Real length. - static public uint GetRealDigitsLength(uint[] digits, uint length) - { - for (; length > 0 && digits[length - 1] == 0; --length) ; - return length; - } - - /// - /// Returns real length of digits array (excluding leading zeroes). - /// - /// Big integer digits. - /// Initial big integers length. - /// Real length. - static unsafe public uint GetRealDigitsLength(uint* digits, uint length) - { - for (; length > 0 && digits[length - 1] == 0; --length) ; - return length; - } - - /// - /// Determines object with lower length. - /// - /// First big integer. - /// Second big integer. - /// Resulting smaller big integer (by length only). - /// Resulting bigger big integer (by length only). - static public void GetMinMaxLengthObjects(IntX int1, IntX int2, out IntX smallerInt, out IntX biggerInt) - { - if (int1._length < int2._length) - { - smallerInt = int1; - biggerInt = int2; - } - else - { - smallerInt = int2; - biggerInt = int1; - } - } - - #endregion Working with digits length methods - - #region Signed to unsigned+sign conversion methods - - /// - /// Converts int value to uint digit and value sign. - /// - /// Initial value. - /// Resulting unsigned part. - /// Resulting sign. - static public void ToUInt32WithSign(int value, out uint resultValue, out bool negative) - { - negative = value < 0; - resultValue = !negative - ? (uint)value - : value != int.MinValue ? (uint)-value : int.MaxValue + 1U; - } - - /// - /// Converts long value to ulong digit and value sign. - /// - /// Initial value. - /// Resulting unsigned part. - /// Resulting sign. - static public void ToUInt64WithSign(long value, out ulong resultValue, out bool negative) - { - negative = value < 0; - resultValue = !negative - ? (ulong)value - : value != long.MinValue ? (ulong)-value : long.MaxValue + 1UL; - } - - #endregion Signed to unsigned+sign conversion methods - - #region Working with digits directly methods - - /// - /// Sets digits in given block to given value. - /// - /// Block start pointer. - /// Block length. - /// Value to set. - static unsafe public void SetBlockDigits(uint* block, uint blockLength, uint value) - { - for (uint* blockEnd = block + blockLength; block < blockEnd; *block++ = value) ; - } - - /// - /// Sets digits in given block to given value. - /// - /// Block start pointer. - /// Block length. - /// Value to set. - unsafe static public void SetBlockDigits(double* block, uint blockLength, double value) - { - for (double* blockEnd = block + blockLength; block < blockEnd; *block++ = value) ; - } - - /// - /// Copies digits from one block to another. - /// - /// From block start pointer. - /// To block start pointer. - /// Count of dwords to copy. - static unsafe public void DigitsBlockCopy(uint* blockFrom, uint* blockTo, uint count) - { - for (uint* blockFromEnd = blockFrom + count; blockFrom < blockFromEnd; *blockTo++ = *blockFrom++) ; - } - - #endregion Working with digits directly methods - } - #endregion - - #endregion - - internal uint[] _digits; // big integer digits - internal uint _length; // big integer digits length - internal bool _negative; // big integer sign ("-" if true) - - #region Constructors - - /// - /// Creates new big integer with zero value. - /// - public IntX() : this(0) {} - - /// - /// Creates new big integer from integer value. - /// - /// Integer value to create big integer from. - public IntX(int value) - { - if (value == 0) - { - // Very specific fast processing for zero values - InitFromZero(); - } - else - { - // Prepare internal fields - _digits = new uint[_length = 1]; - - // Fill the only big integer digit - DigitHelper.ToUInt32WithSign(value, out _digits[0], out _negative); - } - } - - /// - /// Creates new big integer from unsigned integer value. - /// - /// Unsigned integer value to create big integer from. - public IntX(uint value) - { - if (value == 0) - { - // Very specific fast processing for zero values - InitFromZero(); - } - else - { - // Prepare internal fields - _digits = new uint[] { value }; - _length = 1; - } - } - - /// - /// Creates new big integer from long value. - /// - /// Long value to create big integer from. - public IntX(long value) - { - if (value == 0) - { - // Very specific fast processing for zero values - InitFromZero(); - } - else - { - // Fill the only big integer digit - ulong newValue; - DigitHelper.ToUInt64WithSign(value, out newValue, out _negative); - InitFromUlong(newValue); - } - } - - /// - /// Creates new big integer from unsigned long value. - /// - /// Unsigned long value to create big integer from. - public IntX(ulong value) - { - if (value == 0) - { - // Very specific fast processing for zero values - InitFromZero(); - } - else - { - InitFromUlong(value); - } - } - - /// - /// Creates new big integer from array of it's "digits". - /// Digit with lower index has less weight. - /// - /// Array of digits. - /// True if this number is negative. - /// is a null reference. - public IntX(uint[] digits, bool negative) - { - // Exceptions - if (digits == null) - { - throw new ArgumentNullException("values"); - } - - InitFromDigits(digits, negative, DigitHelper.GetRealDigitsLength(digits, (uint)digits.LongLength)); - } - - - /// - /// Creates new from string. - /// - /// Number as string. - public IntX(string value) - { - IntX intX = Parse(value); - InitFromIntX(intX); - } - - /// - /// Creates new from string. - /// - /// Number as string. - /// Number base. - public IntX(string value, uint numberBase) - { - IntX intX = Parse(value, numberBase); - InitFromIntX(intX); - } - - - /// - /// Copy constructor. - /// - /// Value to copy from. - /// is a null reference. - public IntX(IntX value) - { - // Exceptions - if (value == null) - { - throw new ArgumentNullException("value"); - } - - InitFromIntX(value); - } - - - /// - /// Creates new empty big integer with desired sign and length. - /// - /// For internal use. - /// - /// Desired digits length. - /// Desired integer sign. - internal IntX(uint length, bool negative) - { - _digits = new uint[_length = length]; - _negative = negative; - } - - /// - /// Creates new big integer from array of it's "digits" but with given length. - /// Digit with lower index has less weight. - /// - /// For internal use. - /// - /// Array of digits. - /// True if this number is negative. - /// Length to use for internal digits array. - /// is a null reference. - internal IntX(uint[] digits, bool negative, uint length) - { - // Exceptions - if (digits == null) - { - throw new ArgumentNullException("values"); - } - - InitFromDigits(digits, negative, length); - } - - #endregion Constructors - - #region Operators - - #region operator== - - /// - /// Compares two objects and returns true if their internal state is equal. - /// - /// First big integer. - /// Second big integer. - /// True if equals. - static public bool operator ==(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, false) == 0; - } - - /// - /// Compares object with integer and returns true if their internal state is equal. - /// - /// First big integer. - /// Second integer. - /// True if equals. - static public bool operator ==(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) == 0; - } - - /// - /// Compares integer with object and returns true if their internal state is equal. - /// - /// First integer. - /// Second big integer. - /// True if equals. - static public bool operator ==(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) == 0; - } - - /// - /// Compares object with unsinged integer and returns true if their internal state is equal. - /// - /// First big integer. - /// Second unsinged integer. - /// True if equals. - static public bool operator ==(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) == 0; - } - - /// - /// Compares unsinged integer with object and returns true if their internal state is equal. - /// - /// First unsinged integer. - /// Second big integer. - /// True if equals. - static public bool operator ==(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) == 0; - } - - #endregion operator== - - #region operator!= - - /// - /// Compares two objects and returns true if their internal state is not equal. - /// - /// First big integer. - /// Second big integer. - /// True if not equals. - static public bool operator !=(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, false) != 0; - } - - /// - /// Compares object with integer and returns true if their internal state is not equal. - /// - /// First big integer. - /// Second integer. - /// True if not equals. - static public bool operator !=(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) != 0; - } - - /// - /// Compares integer with object and returns true if their internal state is not equal. - /// - /// First integer. - /// Second big integer. - /// True if not equals. - static public bool operator !=(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) != 0; - } - - /// - /// Compares object with unsigned integer and returns true if their internal state is not equal. - /// - /// First big integer. - /// Second unsigned integer. - /// True if not equals. - static public bool operator !=(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) != 0; - } - - /// - /// Compares unsigned integer with object and returns true if their internal state is not equal. - /// - /// First unsigned integer. - /// Second big integer. - /// True if not equals. - static public bool operator !=(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) != 0; - } - - #endregion operator!= - - #region operator> - - /// - /// Compares two objects and returns true if first is greater. - /// - /// First big integer. - /// Second big integer. - /// True if first is greater. - static public bool operator >(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, true) > 0; - } - - /// - /// Compares object with integer and returns true if first is greater. - /// - /// First big integer. - /// Second integer. - /// True if first is greater. - static public bool operator >(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) > 0; - } - - /// - /// Compares integer with object and returns true if first is greater. - /// - /// First integer. - /// Second big integer. - /// True if first is greater. - static public bool operator >(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) < 0; - } - - /// - /// Compares object with unsigned integer and returns true if first is greater. - /// - /// First big integer. - /// Second unsigned integer. - /// True if first is greater. - static public bool operator >(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) > 0; - } - - /// - /// Compares unsigned integer with object and returns true if first is greater. - /// - /// First unsigned integer. - /// Second big integer. - /// True if first is greater. - static public bool operator >(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) < 0; - } - - #endregion operator> - - #region operator>= - - /// - /// Compares two objects and returns true if first is greater or equal. - /// - /// First big integer. - /// Second big integer. - /// True if first is greater or equal. - static public bool operator >=(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, true) >= 0; - } - - /// - /// Compares object with integer and returns true if first is greater or equal. - /// - /// First big integer. - /// Second integer. - /// True if first is greater or equal. - static public bool operator >=(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) >= 0; - } - - /// - /// Compares integer with object and returns true if first is greater or equal. - /// - /// First integer. - /// Second big integer. - /// True if first is greater or equal. - static public bool operator >=(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) <= 0; - } - - /// - /// Compares object with unsinged integer and returns true if first is greater or equal. - /// - /// First big integer. - /// Second unsinged integer. - /// True if first is greater or equal. - static public bool operator >=(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) >= 0; - } - - /// - /// Compares unsinged integer with object and returns true if first is greater or equal. - /// - /// First unsinged integer. - /// Second big integer. - /// True if first is greater or equal. - static public bool operator >=(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) <= 0; - } - - #endregion operator>= - - #region operator< - - /// - /// Compares two objects and returns true if first is lighter. - /// - /// First big integer. - /// Second big integer. - /// True if first is lighter. - static public bool operator <(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, true) < 0; - } - - /// - /// Compares object with integer and returns true if first is lighter. - /// - /// First big integer. - /// Second integer. - /// True if first is lighter. - static public bool operator <(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) < 0; - } - - /// - /// Compares integer with object and returns true if first is lighter. - /// - /// First integer. - /// Second big integer. - /// True if first is lighter. - static public bool operator <(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) > 0; - } - - /// - /// Compares object with unsinged integer and returns true if first is lighter. - /// - /// First big integer. - /// Second unsinged integer. - /// True if first is lighter. - static public bool operator <(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) < 0; - } - - /// - /// Compares unsinged integer with object and returns true if first is lighter. - /// - /// First unsinged integer. - /// Second big integer. - /// True if first is lighter. - static public bool operator <(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) > 0; - } - - #endregion operator< - - #region operator<= - - /// - /// Compares two objects and returns true if first is lighter or equal. - /// - /// First big integer. - /// Second big integer. - /// True if first is lighter or equal. - static public bool operator <=(IntX int1, IntX int2) - { - return OpHelper.Cmp(int1, int2, true) <= 0; - } - - /// - /// Compares object with integer and returns true if first is lighter or equal. - /// - /// First big integer. - /// Second integer. - /// True if first is lighter or equal. - static public bool operator <=(IntX int1, int int2) - { - return OpHelper.Cmp(int1, int2) <= 0; - } - - /// - /// Compares integer with object and returns true if first is lighter or equal. - /// - /// First integer. - /// Second big integer. - /// True if first is lighter or equal. - static public bool operator <=(int int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) >= 0; - } - - /// - /// Compares object with unsinged integer and returns true if first is lighter or equal. - /// - /// First big integer. - /// Second unsinged integer. - /// True if first is lighter or equal. - static public bool operator <=(IntX int1, uint int2) - { - return OpHelper.Cmp(int1, int2) <= 0; - } - - /// - /// Compares unsinged integer with object and returns true if first is lighter or equal. - /// - /// First unsinged integer. - /// Second big integer. - /// True if first is lighter or equal. - static public bool operator <=(uint int1, IntX int2) - { - return OpHelper.Cmp(int2, int1) >= 0; - } - - #endregion operator<= - - #region operator+ and operator- - - /// - /// Adds one object to another. - /// - /// First big integer. - /// Second big integer. - /// Addition result. - static public IntX operator +(IntX int1, IntX int2) - { - return OpHelper.AddSub(int1, int2, false); - } - - /// - /// Subtracts one object from another. - /// - /// First big integer. - /// Second big integer. - /// Subtraction result. - static public IntX operator -(IntX int1, IntX int2) - { - return OpHelper.AddSub(int1, int2, true); - } - - #endregion operator+ and operator- - - #region operator* - - /// - /// Multiplies one object on another. - /// - /// First big integer. - /// Second big integer. - /// Multiply result. - static public IntX operator *(IntX int1, IntX int2) - { - return IntXMultiplier.Multiply(int1, int2); - } - - #endregion operator* - - #region operator/ and operator% - - /// - /// Divides one object by another. - /// - /// First big integer. - /// Second big integer. - /// Division result. - static public IntX operator /(IntX int1, IntX int2) - { - IntX modRes; - return IntXDivider.DivMod(int1, int2, out modRes, DivModResultFlags.Div); - } - - /// - /// Divides one object by another and returns division modulo. - /// - /// First big integer. - /// Second big integer. - /// Modulo result. - static public IntX operator %(IntX int1, IntX int2) - { - IntX modRes; - IntXDivider.DivMod(int1, int2, out modRes, DivModResultFlags.Mod); - return modRes; - } - - #endregion operator/ and operator% - - #region operator<< and operator>> - - /// - /// Shifts object on selected bits count to the left. - /// - /// Big integer. - /// Bits count. - /// Shifting result. - static public IntX operator <<(IntX intX, int shift) - { - return OpHelper.Sh(intX, shift, true); - } - - /// - /// Shifts object on selected bits count to the right. - /// - /// Big integer. - /// Bits count. - /// Shifting result. - static public IntX operator >>(IntX intX, int shift) - { - return OpHelper.Sh(intX, shift, false); - } - - #endregion operator<< and operator>> - - #region +, -, ++, -- unary operators - - /// - /// Returns the same value. - /// - /// Initial value. - /// The same value, but new object. - /// is a null reference. - static public IntX operator +(IntX value) - { - // Exception - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("value"); - } - - return new IntX(value); - } - - /// - /// Returns the same value, but with other sign. - /// - /// Initial value. - /// The same value, but with other sign. - /// is a null reference. - static public IntX operator -(IntX value) - { - // Exception - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("value"); - } - - IntX newValue = new IntX(value); - if (newValue._length != 0) - { - newValue._negative = !newValue._negative; - } - return newValue; - } - - /// - /// Returns increased value. - /// - /// Initial value. - /// Increased value. - /// is a null reference. - static public IntX operator ++(IntX value) - { - // Exception - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("value"); - } - - return value + 1U; - } - - /// - /// Returns decreased value. - /// - /// Initial value. - /// Decreased value. - /// is a null reference. - static public IntX operator --(IntX value) - { - // Exception - if (ReferenceEquals(value, null)) - { - throw new ArgumentNullException("value"); - } - - return value - 1U; - } - - #endregion +, -, ++, -- unary operators - - #region Conversion operators - - #region To IntX (Implicit) - - /// - /// Implicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public implicit operator IntX(int value) - { - return new IntX(value); - } - - /// - /// Implicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public implicit operator IntX(uint value) - { - return new IntX(value); - } - - /// - /// Implicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public implicit operator IntX(ushort value) - { - return new IntX(value); - } - - /// - /// Implicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public implicit operator IntX(long value) - { - return new IntX(value); - } - - /// - /// Implicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public implicit operator IntX(ulong value) - { - return new IntX(value); - } - - #endregion To IntX (Implicit) - - #region From IntX (Explicit) - - /// - /// Explicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public explicit operator int(IntX value) - { - int res = (int)(uint)value; - return value._negative ? -res : res; - } - - /// - /// Explicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public explicit operator uint(IntX value) - { - if (value == null) - { - throw new ArgumentNullException("value"); - } - - if (value._length == 0) return 0; - return value._digits[0]; - } - - /// - /// Explicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public explicit operator long(IntX value) - { - long res = (long)(ulong)value; - return value._negative ? -res : res; - } - - /// - /// Explicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public explicit operator ulong(IntX value) - { - ulong res = (uint)value; - if (value._length > 1) - { - res |= (ulong)value._digits[1] << Constants.DigitBitCount; - } - return res; - } - - /// - /// Explicitly converts to . - /// - /// Value to convert. - /// Conversion result. - static public explicit operator ushort(IntX value) - { - return (ushort)(uint)value; - } - - #endregion From IntX (Explicit) - - #endregion Conversion operators - - #endregion Operators - - #region Math static methods - - #region Multiply - - /// - /// Multiplies one object on another. - /// - /// First big integer. - /// Second big integer. - /// Multiply result. - static public IntX Multiply(IntX int1, IntX int2) - { - return IntXMultiplier.Multiply(int1, int2); - } - - #endregion Multiply - - #region Divide/modulo - - /// - /// Divides one object by another. - /// - /// First big integer. - /// Second big integer. - /// Division result. - static public IntX Divide(IntX int1, IntX int2) - { - IntX modRes; - return IntXDivider.DivMod(int1, int2, out modRes, DivModResultFlags.Div); - } - - /// - /// Divides one object by another and returns division modulo. - /// - /// First big integer. - /// Second big integer. - /// Modulo result. - static public IntX Modulo(IntX int1, IntX int2) - { - IntX modRes; - IntXDivider.DivMod(int1, int2, out modRes, DivModResultFlags.Mod); - return modRes; - } - - /// - /// Divides one object on another. - /// Returns both divident and remainder - /// - /// First big integer. - /// Second big integer. - /// Remainder big integer. - /// Division result. - static public IntX DivideModulo(IntX int1, IntX int2, out IntX modRes) - { - return IntXDivider.DivMod(int1, int2, out modRes, DivModResultFlags.Div | DivModResultFlags.Mod); - } - - #endregion Divide/modulo - - #region Pow - - /// - /// Returns a specified big integer raised to the specified power. - /// - /// Number to raise. - /// Power. - /// Number in given power. - static public IntX Pow(IntX value, uint power) - { - return OpHelper.Pow(value, power); - } - - #endregion Pow - - #endregion Math static methods - - #region ToString override - - /// - /// Returns decimal string representation of this object. - /// - /// Decimal number in string. - override public string ToString() - { - return ToString(10U, true); - } - - /// - /// Returns string representation of this object in given base. - /// - /// Base of system in which to do output. - /// Object string representation. - public string ToString(uint numberBase) - { - return ToString(numberBase, true); - } - - /// - /// Returns string representation of this object in given base. - /// - /// Base of system in which to do output. - /// Use uppercase for bases from 11 to 16 (which use letters A-F). - /// Object string representation. - public string ToString(uint numberBase, bool upperCase) - { - return IntXStringConverter.ToString(this, numberBase, upperCase ? Constants.BaseUpperChars : Constants.BaseLowerChars); - } - - /// - /// Returns string representation of this object in given base using custom alphabet. - /// - /// Base of system in which to do output. - /// Alphabet which contains chars used to represent big integer, char position is coresponding digit value. - /// Object string representation. - public string ToString(uint numberBase, string alphabet) - { - StrRepHelper.AssertAlphabet(alphabet, numberBase); - return IntXStringConverter.ToString(this, numberBase, alphabet.ToCharArray()); - } - - #endregion ToString override - - #region Parsing methods - - /// - /// Parses provided string representation of object in decimal base. - /// If number starts from "0" then it's treated as octal; if number starts fropm "0x" - /// then it's treated as hexadecimal. - /// - /// Number as string. - /// Parsed object. - static public IntX Parse(string value) - { - return IntXParser.Parse(value, 10U, Constants.BaseCharToDigits, true); - } - - /// - /// Parses provided string representation of object. - /// - /// Number as string. - /// Number base. - /// Parsed object. - static public IntX Parse(string value, uint numberBase) - { - return IntXParser.Parse(value, numberBase, Constants.BaseCharToDigits, false); - } - - /// - /// Parses provided string representation of object using custom alphabet. - /// - /// Number as string. - /// Number base. - /// Alphabet which contains chars used to represent big integer, char position is coresponding digit value. - /// Parsed object. - static public IntX Parse(string value, uint numberBase, string alphabet) - { - return IntXParser.Parse(value, numberBase, StrRepHelper.CharDictionaryFromAlphabet(alphabet, numberBase), false); - } - - #endregion Parsing methods - - #region IEquatable/Equals/GetHashCode implementation/overrides - - /// - /// Returns equality of this with another big integer. - /// - /// Big integer to compare with. - /// True if equals. - public bool Equals(IntX n) - { - return base.Equals(n) || this == n; - } - - /// - /// Returns equality of this with another integer. - /// - /// Integer to compare with. - /// True if equals. - public bool Equals(int n) - { - return this == n; - } - - /// - /// Returns equality of this with another unsigned integer. - /// - /// Unsigned integer to compare with. - /// True if equals. - public bool Equals(uint n) - { - return this == n; - } - - /// - /// Returns equality of this with another long integer. - /// - /// Long integer to compare with. - /// True if equals. - public bool Equals(long n) - { - return this == n; - } - - /// - /// Returns equality of this with another unsigned long integer. - /// - /// Unsigned long integer to compare with. - /// True if equals. - public bool Equals(ulong n) - { - return this == n; - } - - - /// - /// Returns equality of this with another object. - /// - /// Object to compare with. - /// True if equals. - override public bool Equals(object obj) - { - return obj is IntX && Equals((IntX)obj); - } - - /// - /// Returns hash code for this object. - /// - /// Object hash code. - override public int GetHashCode() - { - switch (_length) - { - case 0: - return 0; - case 1: - return (int)(_digits[0] ^ _length ^ (_negative ? 1 : 0)); - default: - return (int)(_digits[0] ^ _digits[_length - 1] ^ _length ^ (_negative ? 1 : 0)); - } - } - - #endregion Equals/GetHashCode implementation/overrides - - #region IComparable implementation - - /// - /// Compares current object with another big integer. - /// - /// Big integer to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(IntX n) - { - return OpHelper.Cmp(this, n, true); - } - - /// - /// Compares current object with another integer. - /// - /// Integer to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(int n) - { - return OpHelper.Cmp(this, n); - } - - /// - /// Compares current object with another unsigned integer. - /// - /// Unsigned integer to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(uint n) - { - return OpHelper.Cmp(this, n); - } - - /// - /// Compares current object with another long integer. - /// - /// Long integer to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(long n) - { - return OpHelper.Cmp(this, n, true); - } - - /// - /// Compares current object with another unsigned long integer. - /// - /// Unsigned long integer to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(ulong n) - { - return OpHelper.Cmp(this, n, true); - } - - /// - /// Compares current object with another object. - /// - /// Object to compare with. - /// 1 if object is bigger than , -1 if object is smaller than , 0 if they are equal. - public int CompareTo(object obj) - { - if (obj is IntX) - { - return CompareTo((IntX)obj); - } - else if (obj is int) - { - return CompareTo((int)obj); - } - else if (obj is uint) - { - return CompareTo((uint)obj); - } - else if (obj is long) - { - return CompareTo((long)obj); - } - else if (obj is ulong) - { - return CompareTo((ulong)obj); - } - - throw new ArgumentException("Can't compare with provided argument.", "obj"); - } - - #endregion IComparable implementation - - #region Other public methods - - /// - /// Frees extra space not used by digits. - /// - public void Normalize() - { - if (_digits.LongLength > _length) - { - uint[] newDigits = new uint[_length]; - Array.Copy(_digits, newDigits, _length); - _digits = newDigits; - } - - if (_length == 0) - { - _negative = false; - } - } - - /// - /// Retrieves this internal state as digits array and sign. - /// Can be used for serialization and other purposes. - /// Note: please use constructor instead to clone object. - /// - /// Digits array. - /// Is negative integer. - public void GetInternalState(out uint[] digits, out bool negative) - { - digits = new uint[_length]; - Array.Copy(_digits, digits, _length); - - negative = _negative; - } - - #endregion Other public methods - - #region Init utilitary methods - - /// - /// Initializes class instance from zero. - /// For internal use. - /// - void InitFromZero() - { - _length = 0; - _digits = new uint[0]; - } - - /// - /// Initializes class instance from value. - /// Doesn't initialize sign. - /// For internal use. - /// - /// Unsigned long value. - void InitFromUlong(ulong value) - { - // Divide ulong into 2 uint values - uint low = (uint)value; - uint high = (uint)(value >> Constants.DigitBitCount); - - // Prepare internal fields - if (high == 0) - { - _digits = new uint[] { low }; - } - else - { - _digits = new uint[] { low, high }; - } - _length = (uint)_digits.Length; - } - - /// - /// Initializes class instance from another value. - /// For internal use. - /// - /// Big integer value. - void InitFromIntX(IntX value) - { - _digits = value._digits; - _length = value._length; - _negative = value._negative; - } - - /// - /// Initializes class instance from digits array. - /// For internal use. - /// - /// Big integer digits. - /// Big integer sign. - /// Big integer length. - void InitFromDigits(uint[] digits, bool negative, uint length) - { - _digits = new uint[_length = length]; - Array.Copy(digits, _digits, System.Math.Min((uint)digits.LongLength, length)); - if (length != 0) - { - _negative = negative; - } - } - - #endregion Init utilitary methods - - #region Other utilitary methods - - /// - /// Frees extra space not used by digits. - /// - internal void TryNormalize() - { - Normalize(); - } - - #endregion Other utilitary methods - - #region IDisposable Implementation - /// - /// Disposes of the resources - /// - public void Dispose() - { - this._digits = new uint[0]; - this._digits = null; - System.GC.Collect(); - } - #endregion - - #region IClonable Implementation - /// - /// Creates a clone of the current instance. - /// - /// The cloned instance. - object ICloneable.Clone() - { - return new IntX(this); - } - #endregion - - /// - /// Converts this IntX to a byte array. - /// - /// - public byte[] ToByteArray() - { - System.IO.MemoryStream m = new IO.MemoryStream(); - System.IO.BinaryWriter b = new IO.BinaryWriter(m); - for (int i = 0; i < _digits.Length; i++) - { - b.Write(_digits[i]); - } - b.Flush(); - return m.GetBuffer(); - } - - private static readonly IntX _zero = new IntX(0); - /// - /// Zero. - /// - public static IntX Zero - { - get - { - return _zero; - } - } - } -} diff --git a/Users/Orvid/Orvid.Extensions/System/Quad.cs b/Users/Orvid/Orvid.Extensions/System/Quad.cs deleted file mode 100644 index c9be7a789a..0000000000 --- a/Users/Orvid/Orvid.Extensions/System/Quad.cs +++ /dev/null @@ -1,1782 +0,0 @@ -/* - Copyright (c) 2011 Jeff Pasternack. All rights reserved. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace System -{ - /// - /// Quad is a signed 128-bit floating point number, stored internally as a 64-bit significand (with the most significant bit as the sign bit) and - /// a 64-bit signed exponent, with a value == significand * 2^exponent. Quads have both a higher precision (64 vs. 53 effective significand bits) - /// and a much higher range (64 vs. 11 exponent bits) than doubles. Most operations are unchecked and undefined in the event of overflow. - /// - /// - /// - /// Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved - /// and constitute overflow. 0 is defined by significand bits == 0 and an exponent of long.MinValue. - /// - /// - /// Quad multiplication and division operators are slightly imprecise for the sake of efficiency; specifically, - /// they may assign the wrong least significant bit, such that the precision is effectively only 63 bits rather than 64. - /// - /// - /// Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved, primarily because this allows slightly faster arithmetic operations - /// by removing the need for overflow checking in certain places. Quads with these exponents will have undefined behavior. - /// - /// - /// For speed, consider using instance methods (like Multiply and Add) rather - /// than the operators (like * and +) when possible, as the former are significantly faster (by as much as 50%). - /// - /// - [System.Diagnostics.DebuggerDisplay("{ToString(),nq}")] //this attributes makes the debugger display the value without braces or quotes - public struct Quad - { - #region Public constants - /// - /// Zero. - /// - public static readonly Quad Zero = new Quad(0UL, long.MinValue); //there is only one zero; all other significands with exponent long.MinValue are invalid. - /// - /// One. - /// - public static readonly Quad One = (Quad)1UL; //used for increment/decrement operators - #endregion - - #region Public fields - /// - /// The first (most significant) bit of the significand is the sign bit; 0 for positive values, 1 for negative. - /// The remainder of the bits represent the fractional part (after the binary point) of the significant; there is always an implicit "1" - /// preceding the binary point, just as in IEEE's double specification, except for 0 (defined by an exponent of long.MinValue and significand bits == 0). - /// - public ulong SignificandBits; - - /// - /// The value of the Quad == 1.[last 63 bits of significand] * 2^exponent, except where the exponent is long.MinValue, - /// which (in conjunction with SignificandBits == 0) denotes 0. Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved. - /// - /// - public long Exponent; - #endregion - - #region Constructors - /// - /// Creates a new Quad with the given significand bits and exponent. The significand has a first (most significant) bit - /// corresponding to the quad's sign (1 for positive, 0 for negative), and the rest of the bits correspond to the fractional - /// part of the significand value (immediately after the binary point). A "1" before the binary point is always implied. - /// - /// - /// - public Quad(ulong significandBits, long exponent) - { - this.SignificandBits = significandBits; - this.Exponent = exponent; - } - - /// - /// Creates a new Quad with the given significand value and exponent. - /// - /// - /// - public Quad(long significand, long exponent) - { - if (significand == 0) //handle 0 - { - SignificandBits = 0; - Exponent = long.MinValue; - return; - } - - if (significand < 0) - { - if (significand == long.MinValue) //corner case - { - SignificandBits = highestBit; - Exponent = 0; - return; - } - - significand = -significand; - SignificandBits = highestBit; - } - else - SignificandBits = 0; - - int shift = nlz((ulong)significand); //we must normalize the value such that the most significant bit is 1 - this.SignificandBits |= ~highestBit & (((ulong)significand) << shift); //mask out the highest bit--it's implicit - this.Exponent = exponent - shift; - } - #endregion - - #region Helper functions and constants - private const double base2to10Multiplier = 0.30102999566398119521373889472449; //Math.Log(2) / Math.Log(10); - private const ulong highestBit = 1UL << 63; - private const ulong secondHighestBit = 1UL << 62; - private const ulong lowWordMask = 0xffffffff; //lower 32 bits - private const ulong highWordMask = 0xffffffff00000000; //upper 32 bits - - private const ulong b = 4294967296; // Number base (32 bits). - - private static readonly Quad e19 = (Quad)10000000000000000000UL; - private static readonly Quad e10 = (Quad)10000000000UL; - private static readonly Quad e5 = (Quad)100000UL; - private static readonly Quad e3 = (Quad)1000UL; - private static readonly Quad e1 = (Quad)10UL; - - private static readonly Quad en19 = One / e19; - private static readonly Quad en10 = One / e10; - private static readonly Quad en5 = One / e5; - private static readonly Quad en3 = One / e3; - private static readonly Quad en1 = One / e1; - - private static readonly Quad en18 = One /(Quad)1000000000000000000UL; - private static readonly Quad en9 = One / (Quad)1000000000UL; - private static readonly Quad en4 = One / (Quad)10000UL; - private static readonly Quad en2 = One / (Quad)100UL; - - - /// - /// Returns the position of the highest set bit, counting from the most significant bit position (position 0). - /// Returns 64 if no bit is set. - /// - /// - /// - private static int nlz(ulong x) - { - //Future work: might be faster with a huge, explicit nested if tree, or use of an 256-element per-byte array. - - int n; - - if (x == 0) return (64); - n = 0; - if (x <= 0x00000000FFFFFFFF) { n = n + 32; x = x << 32; } - if (x <= 0x0000FFFFFFFFFFFF) { n = n + 16; x = x << 16; } - if (x <= 0x00FFFFFFFFFFFFFF) { n = n + 8; x = x << 8; } - if (x <= 0x0FFFFFFFFFFFFFFF) { n = n + 4; x = x << 4; } - if (x <= 0x3FFFFFFFFFFFFFFF) { n = n + 2; x = x << 2; } - if (x <= 0x7FFFFFFFFFFFFFFF) { n = n + 1; } - return n; - } - - #endregion - - #region Struct-modifying instance arithmetic functions - - /// - /// Multiplies this instance by the specified . - /// - /// The to multiply by. - public unsafe void Multiply(double multiplier) - { - #region Parse the double - ulong bits = *((ulong*)&multiplier); - long multiplierExponent = (((long)bits >> 52) & 0x7ffL); - - if (multiplierExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong multiplierSignificand = (bits) & 0xfffffffffffffUL; - - if (multiplierExponent == 0) - { - if (multiplierSignificand == 0) - { - //multiplication by 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - return; - } - - int firstSetPosition = nlz(multiplierSignificand); - multiplierSignificand = (highestBit & bits) | (multiplierSignificand << firstSetPosition); - multiplierExponent -= firstSetPosition - 1 + 1075; - } - else - { - multiplierSignificand = (highestBit & bits) | (multiplierSignificand << 11); - multiplierExponent -= 11 + 1075; - } - #endregion - - #region Multiply - - ulong high1 = (this.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (multiplierSignificand | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((this.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (multiplierSignificand & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - if (this.Exponent == long.MinValue) - return; //we're already 0 - - this.SignificandBits = ((this.SignificandBits ^ multiplierSignificand) & highestBit) | ((significandBits << 1) & ~highestBit); - this.Exponent = this.Exponent + multiplierExponent - 1 + 64; - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplierSignificand) & highestBit) | (significandBits & ~highestBit); - this.Exponent = this.Exponent + multiplierExponent + 64; - } - #endregion - } - - /// - /// Multiplies this instance by the specified value. - /// - /// - public void Multiply(Quad multiplier) - { - - ulong high1 = (this.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (multiplier.SignificandBits | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((this.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (multiplier.SignificandBits & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - //Checking for zeros here is significantly faster (~15%) on my machine than at the beginning, - //because this branch is rarely taken. This is acceptable because a zero will have a significand of 0, - //and thus (when the significant bit is erroneously OR'd to it) multiplying by that zero cannot yield a value - //of significandBits greater than or equal to 1 << 63. - if (this.Exponent == long.MinValue || multiplier.Exponent == long.MinValue) - { - this.Exponent = long.MinValue; - this.SignificandBits = 0; - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplier.SignificandBits) & highestBit) | ((significandBits << 1) & ~highestBit); - this.Exponent = this.Exponent + multiplier.Exponent - 1 + 64; - } - - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplier.SignificandBits) & highestBit) | (significandBits & ~highestBit); - this.Exponent = this.Exponent + multiplier.Exponent + 64; - } - - #region Multiply with reduced branching (slightly faster?) - //zeros - ////if (this.Exponent == long.MinValue)// || multiplier.Exponent == long.MinValue) - ////{ - //// this.Exponent = long.MinValue; - //// this.Significand = 0; - //// return; - ////} - - //ulong high1 = (this.Significand | highestBit ) >> 32; //de-implicitize the 1 - //ulong high2 = (multiplier.Significand | highestBit) >> 32; - - ////because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - //ulong significandBits = high1 * high2 + (((this.Significand & lowWordMask) * high2) >> 32) + ((high1 * (multiplier.Significand & lowWordMask)) >> 32); - - //if (significandBits < (1UL << 63)) //first bit clear? - //{ - // long zeroMask = ((this.Exponent ^ -this.Exponent) & (multiplier.Exponent ^ -multiplier.Exponent)) >> 63; - // this.Significand = (ulong)zeroMask & ((this.Significand ^ multiplier.Significand) & highestBit) | ((significandBits << 1) & ~highestBit); - // this.Exponent = (zeroMask & (this.Exponent + multiplier.Exponent - 1 + 64)) | (~zeroMask & long.MinValue); - //} - //else - //{ - // this.Significand = ((this.Significand ^ multiplier.Significand) & highestBit) | (significandBits & ~highestBit); - // this.Exponent = this.Exponent + multiplier.Exponent + 64; - //} - - ////long zeroMask = ((isZeroBit1 >> 63) & (isZeroBit2 >> 63)); - ////this.Significand = (ulong)zeroMask & ((this.Significand ^ multiplier.Significand) & highestBit) | ((significandBits << (int)(1 ^ (significandBits >> 63))) & ~highestBit); - ////this.Exponent = (zeroMask & (this.Exponent + multiplier.Exponent - 1 + 64 + (long)(significandBits >> 63))) | (~zeroMask & long.MinValue); - - #endregion - } - - /// - /// Adds the specified value to the current instance. - /// - /// - public unsafe void Add(double value) - { - #region Parse the double - ulong doubleBits = *((ulong*)&value); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //addition with 0 - return; - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Addition - - if ((this.SignificandBits ^ valueSignificand) >= highestBit) //this and value have different signs--use subtraction instead - { - Subtract(new Quad(valueSignificand ^ highestBit, valueExponent)); - return; - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (this.Exponent > valueExponent) - { - if (this.Exponent >= valueExponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) + ((valueSignificand | highestBit) >> (int)(this.Exponent - valueExponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = this.Exponent + 1; - } - else - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits & ~highestBit); - //this.Exponent = this.Exponent; //exponent stays the same - } - } - } - else if (this.Exponent < valueExponent) - { - if (valueExponent >= this.Exponent + 64) - { - this.SignificandBits = valueSignificand; //too small to matter - this.Exponent = valueExponent; - } - else - { - ulong bits = (valueSignificand | highestBit) + ((this.SignificandBits | highestBit) >> (int)(valueExponent - this.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (valueSignificand & highestBit) | (bits >> 1); - this.Exponent = valueExponent + 1; - } - else - { - this.SignificandBits = (valueSignificand & highestBit) | (bits & ~highestBit); - this.Exponent = valueExponent; - } - } - } - else //expDiff == 0 - { - if (this.Exponent == long.MinValue) //verify that we're not adding two 0's - return; //we are already 0, so just return - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - this.SignificandBits = ((this.SignificandBits + valueSignificand) >> 1) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent + 1; - } - - #endregion - } - - /// - /// Adds the specified value to the current instance. - /// - /// - public void Add(Quad value) - { - #region Addition - - if ((this.SignificandBits ^ value.SignificandBits) >= highestBit) //this and value have different signs--use subtraction instead - { - Subtract(new Quad(value.SignificandBits ^ highestBit, value.Exponent)); - return; - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (this.Exponent > value.Exponent) - { - if (this.Exponent >= value.Exponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) + ((value.SignificandBits | highestBit) >> (int)(this.Exponent - value.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = this.Exponent + 1; - } - else - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits & ~highestBit); - //this.Exponent = this.Exponent; //exponent stays the same - } - } - } - else if (this.Exponent < value.Exponent) - { - if (value.Exponent >= this.Exponent + 64) - { - this.SignificandBits = value.SignificandBits; //too small to matter - this.Exponent = value.Exponent; - } - else - { - ulong bits = (value.SignificandBits | highestBit) + ((this.SignificandBits | highestBit) >> (int)(value.Exponent - this.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (value.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = value.Exponent + 1; - } - else - { - this.SignificandBits = (value.SignificandBits & highestBit) | (bits & ~highestBit); - this.Exponent = value.Exponent; - } - } - } - else //expDiff == 0 - { - if (this.Exponent == long.MinValue) //verify that we're not adding two 0's - return; //we are already 0, so just return - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - this.SignificandBits = ((this.SignificandBits + value.SignificandBits) >> 1) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent + 1; - } - - #endregion - } - - /// - /// Subtracts the specified value from the current instance. - /// - /// - public unsafe void Subtract(double value) - { - #region Parse the double - ulong doubleBits = *((ulong*)&value); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //subtraction by 0 - return; - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Subtraction - if ((this.SignificandBits ^ valueSignificand) >= highestBit) //this and value have different signs--use addition instead - { - this.Add(new Quad(valueSignificand ^ highestBit, valueExponent)); - return; - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (this.Exponent > valueExponent) - { - if (this.Exponent >= valueExponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) - ((valueSignificand | highestBit) >> (int)(this.Exponent - valueExponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - } - else if (this.Exponent < valueExponent) //must subtract our significand from value, and switch the sign - { - if (valueExponent >= this.Exponent + 64) - { - this.SignificandBits = valueSignificand ^ highestBit; - this.Exponent = valueExponent; - return; - } - - ulong bits = (valueSignificand | highestBit) - ((this.SignificandBits | highestBit) >> (int)(valueExponent - this.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~valueSignificand & highestBit); - this.Exponent = valueExponent - highestBitPos; - } - else // (this.Exponent == valueExponent) - { - if (valueSignificand > this.SignificandBits) //must switch sign - { - ulong bits = valueSignificand - this.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~valueSignificand & highestBit); - this.Exponent = valueExponent - highestBitPos; - } - else if (valueSignificand < this.SignificandBits) //sign remains the same - { - ulong bits = this.SignificandBits - valueSignificand; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - else //this == value - { - //result is 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - } - } - #endregion - } - - /// - /// Subtracts the specified value from the current instance. - /// - /// - public void Subtract(Quad value) - { - #region Subtraction - if ((this.SignificandBits ^ value.SignificandBits) >= highestBit) //this and value have different signs--use addition instead - { - this.Add(new Quad(value.SignificandBits ^ highestBit, value.Exponent)); - return; - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (this.Exponent > value.Exponent) - { - if (this.Exponent >= value.Exponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) - ((value.SignificandBits | highestBit) >> (int)(this.Exponent - value.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - } - else if (this.Exponent < value.Exponent) //must subtract our significand from value, and switch the sign - { - if (value.Exponent >= this.Exponent + 64) - { - this.SignificandBits = value.SignificandBits ^ highestBit; - this.Exponent = value.Exponent; - return; - } - - ulong bits = (value.SignificandBits | highestBit) - ((this.SignificandBits | highestBit) >> (int)(value.Exponent - this.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~value.SignificandBits & highestBit); - this.Exponent = value.Exponent - highestBitPos; - } - else // (this.Exponent == value.Exponent) - { - if (value.SignificandBits > this.SignificandBits) //must switch sign - { - ulong bits = value.SignificandBits - this.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~value.SignificandBits & highestBit); - this.Exponent = value.Exponent - highestBitPos; - } - else if (value.SignificandBits < this.SignificandBits) //sign remains the same - { - ulong bits = this.SignificandBits - value.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - else //this == value - { - //result is 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - } - } - #endregion - } - - /// - /// Divides the current instance by the specified value. - /// - /// - public unsafe void Divide(double divisor) - { - #region Parse the double - ulong doubleBits = *((ulong*)&divisor); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //division by 0 - throw new DivideByZeroException(); - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Division - if (this.Exponent == long.MinValue) //0 / non-zero == 0 - return; //we're already 0 - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - //result.Significand = highestBit & (this.Significand ^ valueSignificand); //determine the sign bit - - //this.Significand |= highestBit; //de-implicitize the 1 before the binary point - //valueSignificand |= highestBit; - - long adjExponent = 0; - ulong thisAdjSignificand = this.SignificandBits | highestBit; - ulong divisorAdjSignificand = valueSignificand | highestBit; - - if (thisAdjSignificand >= divisorAdjSignificand) - { - //need to make this's significand smaller than divisor's - adjExponent = 1; - un1 = (this.SignificandBits & 1) << 31; - thisAdjSignificand = thisAdjSignificand >> 1; - } - - vn1 = divisorAdjSignificand >> 32; // Break divisor up into - vn0 = valueSignificand & 0xFFFFFFFF; // two 32-bit digits. - - q1 = thisAdjSignificand / vn1; // Compute the first - rhat = thisAdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = thisAdjSignificand * b + un1 - q1 * divisorAdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - thisAdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (this.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (thisAdjSignificand < (1UL << 63)) - { - this.SignificandBits = (~highestBit & (thisAdjSignificand << 1)) | ((this.SignificandBits ^ valueSignificand) & highestBit); - this.Exponent = this.Exponent - (valueExponent + 64) - 1 + adjExponent; - } - else - { - this.SignificandBits = (~highestBit & thisAdjSignificand) | ((this.SignificandBits ^ valueSignificand) & highestBit); - this.Exponent = this.Exponent - (valueExponent + 64) + adjExponent; - } - #endregion - } - - /// - /// Divides the current instance by the specified value. - /// - /// - public void Divide(Quad divisor) - { - #region Division - if (divisor.Exponent == long.MinValue) // something / 0 - throw new DivideByZeroException(); - else if (this.Exponent == long.MinValue) //0 / non-zero == 0 - return; //we're already 0 - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - //result.Significand = highestBit & (this.Significand ^ divisor.Significand); //determine the sign bit - - //this.Significand |= highestBit; //de-implicitize the 1 before the binary point - //divisor.Significand |= highestBit; - - long adjExponent = 0; - ulong thisAdjSignificand = this.SignificandBits | highestBit; - ulong divisorAdjSignificand = divisor.SignificandBits | highestBit; - - if (thisAdjSignificand >= divisorAdjSignificand) - { - //need to make this's significand smaller than divisor's - adjExponent = 1; - un1 = (this.SignificandBits & 1) << 31; - thisAdjSignificand = thisAdjSignificand >> 1; - } - - vn1 = divisorAdjSignificand >> 32; // Break divisor up into - vn0 = divisor.SignificandBits & 0xFFFFFFFF; // two 32-bit digits. - - q1 = thisAdjSignificand / vn1; // Compute the first - rhat = thisAdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = thisAdjSignificand * b + un1 - q1 * divisorAdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - thisAdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (this.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (thisAdjSignificand < (1UL << 63)) - { - this.SignificandBits = (~highestBit & (thisAdjSignificand << 1)) | ((this.SignificandBits ^ divisor.SignificandBits) & highestBit); - this.Exponent = this.Exponent - (divisor.Exponent + 64) - 1 + adjExponent; - } - else - { - this.SignificandBits = (~highestBit & thisAdjSignificand) | ((this.SignificandBits ^ divisor.SignificandBits) & highestBit); - this.Exponent = this.Exponent - (divisor.Exponent + 64) + adjExponent; - } - #endregion - } - - #endregion - - #region Operators - /// - /// Efficiently multiplies the Quad by 2^shift. - /// - /// - /// - /// - public static Quad operator <<(Quad qd, int shift) - { - if (qd.Exponent==long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits,qd.Exponent + shift); - } - - /// - /// Efficiently divides the Quad by 2^shift. - /// - /// - /// - /// - public static Quad operator >>(Quad qd, int shift) - { - if (qd.Exponent==long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits,qd.Exponent - shift); - } - - /// - /// Efficiently multiplies the Quad by 2^shift. - /// - /// - /// - /// - public static Quad LeftShift(Quad qd, long shift) - { - if (qd.Exponent == long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits, qd.Exponent + shift); - } - - /// - /// Efficiently divides the Quad by 2^shift. - /// - /// - /// - /// - public static Quad RightShift(Quad qd, long shift) - { - if (qd.Exponent == long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits, qd.Exponent - shift); - } - - /// - /// Divides one Quad by another and returns the result - /// - /// - /// - /// - /// - /// This code is a heavily modified derivation of a division routine given by http://www.hackersdelight.org/HDcode/divlu.c.txt , - /// which has a very liberal (public domain-like) license attached: http://www.hackersdelight.org/permissions.htm - /// - public static Quad operator /(Quad qd1, Quad qd2) - { - - if (qd2.Exponent == long.MinValue) - throw new DivideByZeroException(); - else if (qd1.Exponent == long.MinValue) - return Zero; - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - long adjExponent=0; - ulong qd1AdjSignificand = qd1.SignificandBits | highestBit; //de-implicitize the 1 before the binary point - ulong qd2AdjSignificand = qd2.SignificandBits | highestBit; //de-implicitize the 1 before the binary point - - if (qd1AdjSignificand >= qd2AdjSignificand) - { - // need to make qd1's significand smaller than qd2's - // If we were faithful to the original code this method derives from, - // we would branch on qd1AdjSignificand > qd2AdjSignificand instead. - // However, this results in undesirable results like (in binary) 11/11 = 0.11111..., - // where the result should be 1.0. Thus, we branch on >=, which prevents this problem. - adjExponent = 1; - un1 = (qd1.SignificandBits & 1) << 31; - qd1AdjSignificand = qd1AdjSignificand >> 1; - } - - vn1 = qd2AdjSignificand >> 32; // Break divisor up into - vn0 = qd2.SignificandBits & 0xFFFFFFFF; // two 32-bit digits. - - q1 = qd1AdjSignificand / vn1; // Compute the first - rhat = qd1AdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = qd1AdjSignificand * b + un1 - q1 * qd2AdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - qd1AdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (qd1.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (qd1AdjSignificand < (1UL << 63)) - return new Quad((~highestBit & (qd1AdjSignificand << 1)) | ((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit), - qd1.Exponent - (qd2.Exponent + 64) - 1 + adjExponent); - else - return new Quad((~highestBit & qd1AdjSignificand) | ((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit), - qd1.Exponent - (qd2.Exponent + 64) + adjExponent); - } - - /// - /// Performs the Modulus operation. - /// - /// - /// - /// - public static Quad operator %(Quad qd1, Quad qd2) - { - return qd1 - (qd2 * MathExtensions.Truncate(qd1 / qd2)); - } - - /// - /// Gets the negative version of the specified . - /// - /// - /// - public static Quad operator -(Quad qd) - { - //qd.Exponent ^ -qd.Exponent == has the MSB set iff qdExponent = long.MinValue; - //this allows us to handle 0's (which should never get a sign bit) without branching - return new Quad(qd.SignificandBits ^ (highestBit & (ulong)(qd.Exponent ^ -qd.Exponent)), qd.Exponent); - } - - /// - /// Adds 2 's together. - /// - /// - /// - /// - public static Quad operator +(Quad qd1, Quad qd2) - { - if ((qd1.SignificandBits ^ qd2.SignificandBits) >= highestBit) //qd1 and qd2 have different signs--use subtraction instead - { - return qd1 - new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (qd1.Exponent > qd2.Exponent) - { - if (qd1.Exponent >= qd2.Exponent + 64) - return qd1; //qd2 too small to make a difference - else - { - ulong bits = (qd1.SignificandBits | highestBit) + ((qd2.SignificandBits | highestBit) >> (int)(qd1.Exponent - qd2.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - return new Quad((qd1.SignificandBits & highestBit) | (bits >> 1), qd1.Exponent + 1); - else - return new Quad((qd1.SignificandBits & highestBit) | (bits & ~highestBit), qd1.Exponent); - } - } - else if (qd1.Exponent < qd2.Exponent) - { - if (qd2.Exponent >= qd1.Exponent + 64) - return qd2; //qd1 too small to matter - else - { - ulong bits = (qd2.SignificandBits | highestBit) + ((qd1.SignificandBits | highestBit) >> (int)(qd2.Exponent - qd1.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - return new Quad((qd2.SignificandBits & highestBit) | (bits >> 1), qd2.Exponent + 1); - else - return new Quad((qd2.SignificandBits & highestBit) | (bits & ~highestBit), qd2.Exponent); - } - } - else //expDiff == 0 - { - if (qd1.Exponent == long.MinValue) //verify that we're not adding two 0's - return Zero; //we are, return 0 - - //ulong bits = (qd1.Significand | highestBit) + (qd2.Significand | highestBit); - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - return new Quad(((qd1.SignificandBits + qd2.SignificandBits) >> 1) | (qd1.SignificandBits & highestBit), qd1.Exponent + 1); - } - } - - /// - /// Subtracts 2 's from each other. - /// - /// - /// - /// - public static Quad operator -(Quad qd1, Quad qd2) - { - if ((qd1.SignificandBits ^ qd2.SignificandBits) >= highestBit) //qd1 and qd2 have different signs--use addition instead - { - return qd1 + new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (qd1.Exponent > qd2.Exponent) - { - if (qd1.Exponent >= qd2.Exponent + 64) - return qd1; //qd2 too small to make a difference - else - { - ulong bits = (qd1.SignificandBits|highestBit) - ( (qd2.SignificandBits|highestBit) >> (int)(qd1.Exponent - qd2.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (qd1.SignificandBits & highestBit), qd1.Exponent - highestBitPos); - } - } - else if (qd1.Exponent < qd2.Exponent) //must subtract qd1's significand from qd2, and switch the sign - { - if (qd2.Exponent >= qd1.Exponent + 64) - return new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); //qd1 too small to matter, switch sign of qd2 and return - - ulong bits = (qd2.SignificandBits | highestBit) - ((qd1.SignificandBits | highestBit) >> (int)(qd2.Exponent - qd1.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (~qd2.SignificandBits & highestBit), qd2.Exponent - highestBitPos); - } - else // (qd1.Exponent == qd2.Exponent) - { - if (qd2.SignificandBits > qd1.SignificandBits) //must switch sign - { - ulong bits = qd2.SignificandBits - qd1.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (~qd2.SignificandBits & highestBit), qd2.Exponent - highestBitPos); - } - else if (qd2.SignificandBits < qd1.SignificandBits) //sign remains the same - { - ulong bits = qd1.SignificandBits - qd2.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (qd1.SignificandBits & highestBit), qd1.Exponent - highestBitPos); - } - else //qd1 == qd2 - return Zero; - } - - } - - /// - /// Multiplies the 2 's together. - /// - /// - /// - /// - public static Quad operator *(Quad qd1, Quad qd2) - { - ulong high1 = (qd1.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (qd2.SignificandBits | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((qd1.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (qd2.SignificandBits & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - //zeros - if (qd1.Exponent == long.MinValue || qd2.Exponent == long.MinValue) - return Zero; - else - return new Quad(((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit) | ((significandBits << 1) & ~highestBit), qd1.Exponent + qd2.Exponent - 1 + 64); - } - else - return new Quad(((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit) | (significandBits & ~highestBit), qd1.Exponent + qd2.Exponent + 64); - } - - /// - /// Adds one to the specified . - /// - /// - /// - public static Quad operator ++(Quad qd) - { - return qd + One; - } - - /// - /// Subtracts one from the specified . - /// - /// - /// - public static Quad operator --(Quad qd) - { - return qd - One; - } - - #endregion - - #region Comparison - - /// - /// Returns true if #1 is equal to #2. - /// - /// - /// - /// - public static bool operator ==(Quad qd1, Quad qd2) - { - return (qd1.SignificandBits == qd2.SignificandBits && qd1.Exponent == qd2.Exponent);// || (qd1.Exponent == long.MinValue && qd2.Exponent == long.MinValue); - } - - /// - /// Returns true if #1 is not equal to #2. - /// - /// - /// - /// - public static bool operator !=(Quad qd1, Quad qd2) - { - return (qd1.SignificandBits != qd2.SignificandBits || qd1.Exponent != qd2.Exponent);// && (qd1.Exponent != long.MinValue || qd2.Exponent != long.MinValue); - } - - /// - /// Returns true if #1 is greater than #2. - /// - /// - /// - /// - public static bool operator >(Quad qd1, Quad qd2) - { - //There is probably a faster way to accomplish this by cleverly exploiting signed longs - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return false; - case secondHighestBit: //qd1 positive, qd2 negative - return true; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits < qd2.SignificandBits); - default: //both positive - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits > qd2.SignificandBits); - } - } - - /// - /// Returns true if #1 is less than #2. - /// - /// - /// - /// - public static bool operator <(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return true; - case secondHighestBit: //qd1 positive, qd2 negative - return false; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits > qd2.SignificandBits); - default: //both positive - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits < qd2.SignificandBits); - } - - } - - /// - /// Returns true if #1 is greater than or equal to #2. - /// - /// - /// - /// - public static bool operator >=(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return false; - case secondHighestBit: //qd1 positive, qd2 negative - return true; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits <= qd2.SignificandBits); - default: //both positive - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits >= qd2.SignificandBits); - } - } - - /// - /// Returns true if #1 is less than or equal to #2. - /// - /// - /// - /// - public static bool operator <=(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return true; - case secondHighestBit: //qd1 positive, qd2 negative - return false; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits >= qd2.SignificandBits); - default: //both positive - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits <= qd2.SignificandBits); - } - } - - #endregion - - #region String parsing - - /// - /// Parses decimal number strings in the form of "1234.5678". Does not presently handle exponential/scientific notation. - /// - /// - /// - public static Quad Parse(string number) - { - //Can piggyback on BigInteger's parser for this, but this is inefficient. - //Smarter way is to break the numeric string into chunks and parse each of them using long's parse method, then combine. - - bool negative = number.StartsWith("-"); - if (negative) number = number.Substring(1); - - string left=number, right=null; - int decimalPoint = number.IndexOf('.'); - if (decimalPoint >= 0) - { - left = number.Substring(0,decimalPoint); - right = number.Substring(decimalPoint+1); - } - - IntX leftInt = IntX.Parse(left); - - Quad result = (Quad)leftInt; - if (right != null) - { - IntX rightInt = IntX.Parse(right); - Quad fractional = (Quad)rightInt; - - // we implicitly multiplied the stuff right of the decimal point by 10^(right.length) to get an integer; - // now we must reverse that and add this quantity to our results. - result += fractional * (MathExtensions.Pow(new Quad(10L, 0), -right.Length)); - } - - return negative ? -result : result; - } - #endregion - - #region Casts - /// - /// Converts an value to a value. - /// - /// - /// - public static explicit operator Quad(IntX value) - { - bool positive = !value._negative; - if (!positive) - value = -value; //don't want 2's complement! - - if (value == IntX.Zero) - return Zero; - - if (value <= ulong.MaxValue) //easy - { - ulong bits = (ulong)value; - int shift = nlz(bits); - return new Quad((bits << shift) & ~highestBit | (positive ? 0 : highestBit), -shift); - } - else //can only keep some of the bits - { - byte[] bytes = value.ToByteArray(); //least significant byte is first - - if (bytes[bytes.Length - 1] == 0) //appended when the MSB is set to differentiate from negative values - return new Quad((positive ? 0 : highestBit) | (~highestBit & ((ulong)bytes[bytes.Length - 2] << 56 | (ulong)bytes[bytes.Length - 3] << 48 | (ulong)bytes[bytes.Length - 4] << 40 | (ulong)bytes[bytes.Length - 5] << 32 | (ulong)bytes[bytes.Length - 6] << 24 | (ulong)bytes[bytes.Length - 7] << 16 | (ulong)bytes[bytes.Length - 8] << 8 | (ulong)bytes[bytes.Length - 9])), (bytes.Length - 9) * 8); - else //shift bits up - { - ulong bits = (ulong)bytes[bytes.Length - 1] << 56 | (ulong)bytes[bytes.Length - 2] << 48 | (ulong)bytes[bytes.Length - 3] << 40 | (ulong)bytes[bytes.Length - 4] << 32 | (ulong)bytes[bytes.Length - 5] << 24 | (ulong)bytes[bytes.Length - 6] << 16 | (ulong)bytes[bytes.Length - 7] << 8 | (ulong)bytes[bytes.Length - 8]; - int shift = nlz(bits); - bits = (bits << shift) | (((ulong)bytes[bytes.Length - 9]) >> (8 - shift)); - return new Quad((positive ? 0 : highestBit) | (~highestBit & bits), (bytes.Length - 8) * 8 - shift); - } - } - } - - /// - /// Converts a to an . - /// - /// - /// - public static explicit operator IntX(Quad value) - { - if (value.Exponent <= -64) //fractional or zero - return IntX.Zero; - - if (value.Exponent < 0) - { - if ( (value.SignificandBits & highestBit) == highestBit ) - return -new IntX((value.SignificandBits) >> ((int)-value.Exponent)); - else - return new IntX((value.SignificandBits | highestBit) >> ((int)-value.Exponent)); - } - - if ( (value.SignificandBits & highestBit) == highestBit ) //negative number? - return -(new IntX(value.SignificandBits)<<(int)value.Exponent); - else - return (new IntX(value.SignificandBits|highestBit) << (int)value.Exponent); - } - - /// - /// Converts a to a ulong. - /// - /// - /// - public static explicit operator ulong(Quad value) - { - if (value.SignificandBits >= highestBit) throw new ArgumentOutOfRangeException("Cannot convert negative value to ulong"); - - if (value.Exponent > 0) - throw new InvalidCastException("Value too large to fit in 64-bit unsigned integer"); - - if (value.Exponent <= -64) return 0; - - return (highestBit | value.SignificandBits) >> (int)(-value.Exponent); - } - - /// - /// Converts a to a long. - /// - /// - /// - public static explicit operator long(Quad value) - { - if (value.SignificandBits == highestBit && value.Exponent == 0) //corner case - return long.MinValue; - - if (value.Exponent >= 0) - throw new InvalidCastException("Value too large to fit in 64-bit signed integer"); - - if (value.Exponent <= -64) return 0; - - if (value.SignificandBits >= highestBit) //negative - return -(long)(value.SignificandBits >> (int)(-value.Exponent)); - else - return (long)( (value.SignificandBits|highestBit) >> (int)(-value.Exponent)); - } - - /// - /// Converts a to a double. - /// - /// - /// - public static unsafe explicit operator double(Quad value) - { - if (value.Exponent == long.MinValue) return 0; - - if (value.Exponent <= -1086) - { - if (value.Exponent > -1086 - 52) //can create subnormal double value - { - ulong bits = (value.SignificandBits&highestBit) | ((value.SignificandBits|highestBit) >> (int)(-value.Exponent - 1086 + 12)); - return *((double*)&bits); - } - else - return 0; - } - else - { - - ulong bits = (ulong)(value.Exponent + 1086); - if (bits >= 0x7ffUL) return value.SignificandBits >= highestBit ? double.NegativeInfinity : double.PositiveInfinity; //too large - - bits = (value.SignificandBits&highestBit) | (bits << 52) | (value.SignificandBits & (~highestBit)) >> 11; - - return *((double*)&bits); - } - } - - /// - /// Converts a 64-bit unsigned integer into a Quad. No data can be lost, nor will any exception be thrown, by this cast; - /// however, it is marked explicit in order to avoid ambiguity with the implicit long-to-Quad cast operator. - /// - /// - /// - public static explicit operator Quad(ulong value) - { - if (value == 0) return Zero; - int firstSetPosition = nlz(value); - return new Quad( (value << firstSetPosition) & ~highestBit, -firstSetPosition); - } - - /// - /// Converts a long to a . - /// - /// - /// - public static implicit operator Quad(long value) - { - return new Quad(value,0); - } - - /// - /// Converts a double to a . - /// - /// - /// - public static unsafe explicit operator Quad(double value) - { - // Translate the double into sign, exponent and mantissa. - //long bits = BitConverter.DoubleToInt64Bits(value); //I suspect doing an unsafe pointer-conversion to get the bits would be faster - ulong bits = *((ulong*)&value); - - // Note that the shift is sign-extended, hence the test against -1 not 1 - long exponent = (((long)bits >> 52) & 0x7ffL); - - if (exponent == 0x7ffL) - throw new InvalidCastException("Cannot cast NaN or infinity to Quad"); - - ulong mantissa = (bits) & 0xfffffffffffffUL; - - // Subnormal numbers; exponent is effectively one higher, - // but there's no extra normalization bit in the mantissa - if (exponent == 0) - { - if (mantissa == 0) return Zero; - exponent++; - - int firstSetPosition = nlz(mantissa); - mantissa <<= firstSetPosition; - exponent -= firstSetPosition; - } - else - { - mantissa = mantissa << 11; - exponent -= 11; - } - - exponent -= 1075; - - return new Quad( (highestBit&bits) | mantissa, exponent); - } - - #endregion - - #region ToString - /// - /// Returns this number as a decimal, or in scientific notation where a decimal would be excessively long. - /// Equivalent to ToString(QuadrupleFormat.ScientificApproximate). - /// - /// - public override string ToString() - { - return ToString(QuadrupleStringFormat.ScientificApproximate); - } - - /// - /// Obtains a string representation for this Quad according to the specified format. - /// - /// - /// - /// - /// ScientificExact returns the value in scientific notation as accurately as possible, but is still subject to imprecision due to the conversion from - /// binary to decimal and during the divisions or multiplications used in the conversion. It does not use rounding, which can lead to odd-looking outputs - /// that would otherwise be rounded by double.ToString() or the ScientificApproximate format (which uses double.ToString()). For example, 0.1 will be rendered - /// as the string "9.9999999999999999981e-2". - /// - public string ToString(QuadrupleStringFormat format) - { - if (Exponent == long.MinValue) return "0"; - - switch (format) - { - case QuadrupleStringFormat.HexExponential: - if (SignificandBits >= highestBit) - return "-" + SignificandBits.ToString("x") + "*2^" + (Exponent >= 0 ? Exponent.ToString("x") : "-" + (-Exponent).ToString("x")); - else - return (SignificandBits | highestBit).ToString("x") + "*2^" + (Exponent >= 0 ? Exponent.ToString("x") : "-" + (-Exponent).ToString("x")); - - case QuadrupleStringFormat.DecimalExponential: - if (SignificandBits >= highestBit) - return "-" + SignificandBits.ToString() + "*2^" + Exponent.ToString(); - else - return (SignificandBits | highestBit).ToString() + "*2^" + Exponent.ToString(); - - case QuadrupleStringFormat.ScientificApproximate: - if (Exponent >= -1022 && Exponent <= 1023) //can be represented as double (albeit with a precision loss) - return ((double)this).ToString(System.Globalization.CultureInfo.InvariantCulture); - - double dVal = (double)new Quad(SignificandBits, -61); - double dExp = base2to10Multiplier * (Exponent + 61); - - string sign = ""; - if (dVal < 0) - { - sign = "-"; - dVal = -dVal; - } - - if (dExp >= 0) - dVal *= Math.Pow(10, (dExp % 1)); - else - dVal *= Math.Pow(10, -((-dExp) % 1)); - - long iExp = (long)Math.Truncate(dExp); - - while (dVal >= 10) { iExp++; dVal /= 10; } - while (dVal < 1) { iExp--; dVal *= 10; } - - if (iExp >= -10 && iExp < 0) - { - string dValString = dVal.ToString(System.Globalization.CultureInfo.InvariantCulture); - if (dValString[1] != '.') - goto returnScientific; //unexpected formatting; use default behavior. - else - return sign + "0." + new string('0', (int)((-iExp) - 1)) + dVal.ToString(System.Globalization.CultureInfo.InvariantCulture).Remove(1, 1); - } - else if (iExp >= 0 && iExp <= 10) - { - string dValString = dVal.ToString(System.Globalization.CultureInfo.InvariantCulture); - if (dValString[1] != '.') - goto returnScientific; //unexpected formating; use default behavior. - else - { - dValString = dValString.Remove(1, 1); - if (iExp < dValString.Length - 1) - return sign + dValString.Substring(0, 1 + (int)iExp) + "." + dValString.Substring(1 + (int)iExp); - else - return sign + dValString + new string('0', (int)iExp - (dValString.Length - 1)) + ".0"; - } - } - - returnScientific: - return sign + dVal.ToString(System.Globalization.CultureInfo.InvariantCulture) + "E" + (iExp >= 0 ? "+" + iExp : iExp.ToString()); - - case QuadrupleStringFormat.ScientificExact: - if (this == Zero) return "0"; - if (MathExtensions.Fraction(this) == Zero && this.Exponent <= 0) //integer value that we can output directly - return (this.SignificandBits >= highestBit ? "-" : "") + ((this.SignificandBits | highestBit) >> (int)(-this.Exponent)).ToString(); - - Quad absValue = MathExtensions.Abs(this); - - long e = 0; - if (absValue < One) - { - while (true) - { - if (absValue < en18) - { - absValue.Multiply(e19); - e -= 19; - } - else if (absValue < en9) - { - absValue.Multiply(e10); - e -= 10; - } - else if (absValue < en4) - { - absValue.Multiply(e5); - e -= 5; - } - else if (absValue < en2) - { - absValue.Multiply(e3); - e -= 3; - } - else if (absValue < One) - { - absValue.Multiply(e1); - e -= 1; - } - else - break; - } - } - else - { - while (true) - { - if (absValue >= e19) - { - absValue.Divide(e19); - e += 19; - } - else if (absValue >= e10) - { - absValue.Divide(e10); - e += 10; - } - else if (absValue >= e5) - { - absValue.Divide(e5); - e += 5; - } - else if (absValue >= e3) - { - absValue.Divide(e3); - e += 3; - } - else if (absValue >= e1) - { - absValue.Divide(e1); - e += 1; - } - else - break; - } - } - - //absValue is now in the interval [1,10) - StringBuilder result = new StringBuilder(); - - result.Append(IntegerString(absValue,1) + "."); - - while ((absValue = MathExtensions.Fraction(absValue)) > Zero) - { - absValue.Multiply(e19); - result.Append(IntegerString(absValue, 19)); - } - - string resultString = result.ToString().TrimEnd('0'); //trim excess 0's at the end - if (resultString[resultString.Length - 1] == '.') resultString += "0"; //e.g. 1.0 instead of 1. - - return (this.SignificandBits >= highestBit ? "-" : "") + resultString + "e" + (e >= 0 ? "+" : "") + e; - - default: - throw new ArgumentException("Unknown format requested"); - } - } - - /// - /// Retrieves the integer portion of the quad as a string, - /// assuming that the quad's value is less than long.MaxValue. - /// No sign ("-") is prepended to the result in the case of negative values. - /// - /// - private static string IntegerString(Quad quad,int digits) - { - if (quad.Exponent > 0) throw new ArgumentOutOfRangeException("The given quad is larger than long.MaxValue"); - if (quad.Exponent <= -64) return "0"; - - ulong significand = quad.SignificandBits | highestBit; //make explicit the implicit bit - return (significand >> (int)(-quad.Exponent)).ToString( new string('0', digits )); - } - - - #endregion - - #region GetHashCode and Equals - - /// - /// Gets the hash code for this instance. - /// - /// - public override int GetHashCode() - { - int expHash = Exponent.GetHashCode(); - return SignificandBits.GetHashCode() ^ (expHash << 16 | expHash >> 16); //rotate expHash's bits 16 places - } - - /// - /// Returns true if this instance is equal to the specified value. - /// - /// - /// - public override bool Equals(object obj) - { - if (obj == null) return false; - - try - { - return this == (Quad)obj; - } - catch - { - return false; - } - } - - #endregion - } - - - /// - /// The enum that specifies the possible formats for the output - /// of Quad's ToString method. - /// - public enum QuadrupleStringFormat - { - /// - /// Obtains the quadruple in scientific notation. Only ~52 bits of significand - /// precision are used to create this string. - /// - ScientificApproximate, - - /// - /// Obtains the quadruple in scientific notation with full precision. - /// This can be very expensive to compute and takes time linear in the value - /// of the exponent. - /// - ScientificExact, - - /// - /// Obtains the quadruple in hexadecimal exponential format, consisting - /// of a 64-bit hex integer followed by the binary exponent, - /// also expressed as a (signed) 64-bit hexadecimal integer. - /// E.g. ffffffffffffffff*2^-AB3 - /// - HexExponential, - - /// - /// Obtains the quadruple in decimal exponential format, consisting - /// of a 64-bit decimal integer followed by the 64-bit signed decimal - /// integer exponent. - /// E.g. 34592233*2^34221 - /// - DecimalExponential - } -} diff --git a/Users/Orvid/Orvid.Extensions/license.txt b/Users/Orvid/Orvid.Extensions/license.txt deleted file mode 100644 index 2d2e40f039..0000000000 --- a/Users/Orvid/Orvid.Extensions/license.txt +++ /dev/null @@ -1,40 +0,0 @@ -This file contains the licenses for the various components used in Orvid.Extensions. - - -Projects used: -1. Oyster.IntX (System->Oyster.IntX.cs) - - - - -~~~~~~~~~~~~~~~~~~~~~ Oyster.IntX (System->Oyster.IntX.cs) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Copyright (c) 2005-2010, Andriy Kozachuk a.k.a. Oyster -All rights reserved. - -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. - -* Neither the name of Andriy Kozachuk nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -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. - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ No newline at end of file diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/PCI/VMWareSVGAII.cs b/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/PCI/VMWareSVGAII.cs deleted file mode 100644 index e9603136af..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/PCI/VMWareSVGAII.cs +++ /dev/null @@ -1,341 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Core; - -namespace Orvid.Graphics.Drivers -{ - public class VMWareSVGAII : GraphicsDriver - { - - #region Register - public enum Register : byte - { - ID = 0, - Enable = 1, - Width = 2, - Height = 3, - MaxWidth = 4, - MaxHeight = 5, - Depth = 6, - BitsPerPixel = 7, - PseudoColor = 8, - RedMask = 9, - GreenMask = 10, - BlueMask = 11, - BytesPerLine = 12, - FrameBufferStart = 13, - FrameBufferOffset = 14, - VRamSize = 15, - FrameBufferSize = 16, - - Capabilities = 17, - MemStart = 18, - MemSize = 19, - ConfigDone = 20, - Sync = 21, - Busy = 22, - GuestID = 23, - CursorID = 24, - CursorX = 25, - CursorY = 26, - CursorOn = 27, - HostBitsPerPixel = 28, - ScratchSize = 29, - MemRegs = 30, - NumDisplays = 31, - PitchLock = 32 - } - #endregion - - #region ID - private enum ID : uint - { - Magic = 0x900000, - V0 = Magic << 8, - V1 = (Magic << 8) | 1, - V2 = (Magic << 8) | 2, - Invalid = 0xFFFFFFFF - } - #endregion - - #region FIFO - public enum FIFO : uint - { - Min = 0, - Max = 1, - NextCmd = 2, - Stop = 3 - } - #endregion - - #region FIFOCommand - private enum FIFOCommand - { - Update = 1, - RECT_FILL = 2, - RECT_COPY = 3, - DEFINE_BITMAP = 4, - DEFINE_BITMAP_SCANLINE = 5, - DEFINE_PIXMAP = 6, - DEFINE_PIXMAP_SCANLINE = 7, - RECT_BITMAP_FILL = 8, - RECT_PIXMAP_FILL = 9, - RECT_BITMAP_COPY = 10, - RECT_PIXMAP_COPY = 11, - FREE_OBJECT = 12, - RECT_ROP_FILL = 13, - RECT_ROP_COPY = 14, - RECT_ROP_BITMAP_FILL = 15, - RECT_ROP_PIXMAP_FILL = 16, - RECT_ROP_BITMAP_COPY = 17, - RECT_ROP_PIXMAP_COPY = 18, - DEFINE_CURSOR = 19, - DISPLAY_CURSOR = 20, - MOVE_CURSOR = 21, - DEFINE_ALPHA_CURSOR = 22 - } - #endregion - - #region IOPortOffset - private enum IOPortOffset : byte - { - Index = 0, - Value = 1, - Bios = 2, - IRQ = 3 - } - #endregion - - private Cosmos.Core.IOPort IndexPort; - private Cosmos.Core.IOPort ValuePort; - private Cosmos.Core.IOPort BiosPort; - private Cosmos.Core.IOPort IRQPort; - - private Cosmos.Core.MemoryBlock Video_Memory; - private Cosmos.Core.MemoryBlock FIFO_Memory; - - private PCIDeviceNormal device; - - public VMWareSVGAII() - { - device = (PCIDeviceNormal)Cosmos.Core.PCI.GetDevice(0x15AD, 0x0405); - device.EnableMemory(true); - uint basePort = device.BaseAddresses[0].BaseAddress(); - IndexPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Index)); - ValuePort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Value)); - BiosPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Bios)); - IRQPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.IRQ)); - - WriteRegister(Register.ID, (uint)ID.V2); - if (ReadRegister(Register.ID) != (uint)ID.V2) - return; - - Video_Memory = new MemoryBlock(ReadRegister(Register.FrameBufferStart), ReadRegister(Register.VRamSize)); - InitializeFIFO(); - } - - protected void InitializeFIFO() - { - FIFO_Memory = new MemoryBlock(ReadRegister(Register.MemStart), ReadRegister(Register.MemSize)); - FIFO_Memory[(uint)FIFO.Min] = 16; - FIFO_Memory[(uint)FIFO.Max] = FIFO_Memory.Size; - FIFO_Memory[(uint)FIFO.NextCmd] = 16; - FIFO_Memory[(uint)FIFO.Stop] = 16; - WriteRegister(Register.ConfigDone, 1); - } - - protected void SetMode(ushort width, ushort height, ushort depth) - { - WriteRegister(Register.Width, width); - WriteRegister(Register.Height, height); - WriteRegister(Register.BitsPerPixel, depth); - WriteRegister(Register.Enable, 1); - InitializeFIFO(); - } - - protected void WriteRegister(Register register, uint value) - { - IndexPort.DWord = (uint)register; - ValuePort.DWord = value; - } - - protected uint ReadRegister(Register register) - { - IndexPort.DWord = (uint)register; - return ValuePort.DWord; - } - - protected uint GetFIFO(FIFO cmd) - { - return FIFO_Memory[(uint)cmd]; - } - - protected uint SetFIFO(FIFO cmd, uint value) - { - return FIFO_Memory[(uint)cmd] = value; - } - - protected void WaitForFifo() - { - WriteRegister(Register.Sync, 1); - while (ReadRegister(Register.Busy) != 0){} - } - - protected void WriteToFifo(uint value) - { - if (((GetFIFO(FIFO.NextCmd) == GetFIFO(FIFO.Max) - 4) && GetFIFO(FIFO.Stop) == GetFIFO(FIFO.Min)) || - (GetFIFO(FIFO.NextCmd) + 4 == GetFIFO(FIFO.Stop))) - WaitForFifo(); - - SetFIFO((FIFO)(GetFIFO(FIFO.NextCmd) / 4), value); - SetFIFO(FIFO.NextCmd, GetFIFO(FIFO.NextCmd) + 4); - - if (GetFIFO(FIFO.NextCmd) == GetFIFO(FIFO.Max)) - SetFIFO(FIFO.NextCmd, GetFIFO(FIFO.Min)); - } - - public void Update(ushort x, ushort y, ushort width, ushort height) - { - WriteToFifo((uint)FIFOCommand.Update); - WriteToFifo(x); - WriteToFifo(y); - WriteToFifo(width); - WriteToFifo(height); - WaitForFifo(); - } - - public void SetPixel(ushort x, ushort y, uint color) - { - Video_Memory[(uint)((y * ReadRegister(Register.Width)) + x)] = color; - } - - public uint GetPixel(ushort x, ushort y) - { - return Video_Memory[(uint)((y * ReadRegister(Register.Width)) + x)]; - } - - - public void Clear(uint color) - { - Fill(0, 0, 800, 600, color); - } - - public void Fill(ushort x, ushort y, ushort width, ushort height, uint color) - { - WriteToFifo((uint)FIFOCommand.RECT_FILL); - WriteToFifo(color); - WriteToFifo(x); - WriteToFifo(y); - WriteToFifo(width); - WriteToFifo(height); - WaitForFifo(); - } - - public void DefineCursor() - { - WaitForFifo(); - WriteToFifo((uint)FIFOCommand.DEFINE_CURSOR); - WriteToFifo(1); - WriteToFifo(0); - WriteToFifo(0); - WriteToFifo(2); - WriteToFifo(2); - WriteToFifo(1); - WriteToFifo(1); - for (int i = 0; i < 4; i++) - WriteToFifo(0); - for (int i = 0; i < 4; i++) - WriteToFifo(0xFFFFFF); - WaitForFifo(); - } - - public void SetCursor(bool visible, uint x, uint y) - { - WriteRegister(Register.CursorID, 1); - if (visible) - { - WaitForFifo(); - WriteToFifo((uint)FIFOCommand.MOVE_CURSOR); - WriteToFifo(x); - WriteToFifo(y); - } - WriteRegister(Register.CursorOn, (uint)(visible ? 1 : 0)); - } - - public override string Name - { - get { throw new NotImplementedException(); } - } - - public override string Version - { - get { throw new NotImplementedException(); } - } - - public override string Company - { - get { throw new NotImplementedException(); } - } - - public override string Author - { - get { throw new NotImplementedException(); } - } - - public override GraphicsMode Mode - { - get { throw new NotImplementedException(); } - } - - public override void Update(Image i) - { - for (ushort x = 0; x < i.Width; x++) - { - for (ushort y = 0; y < i.Height; y++) - { - SetPixel(x, y, i.GetPixel(x, y).ToUInt()); - } - } - } - - public override List GetSupportedModes() - { - throw new NotImplementedException(); - } - - public override void SetMode(GraphicsMode mode) - { - SetMode(800, 600, 32); - } - - public override bool Supported() - { - throw new NotImplementedException(); - } - - public override void Initialize() - { - device = (PCIDeviceNormal)Cosmos.Core.PCI.GetDevice(0x15AD, 0x0405); - device.EnableMemory(true); - uint basePort = device.BaseAddresses[0].BaseAddress(); - IndexPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Index)); - ValuePort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Value)); - BiosPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.Bios)); - IRQPort = new IOPort((ushort)(basePort + (uint)IOPortOffset.IRQ)); - - WriteRegister(Register.ID, (uint)ID.V2); - if (ReadRegister(Register.ID) != (uint)ID.V2) - return; - - Video_Memory = new MemoryBlock(ReadRegister(Register.FrameBufferStart), ReadRegister(Register.VRamSize)); - InitializeFIFO(); - } - - public override void Shutdown() - { - throw new NotImplementedException(); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/VGADriver.cs b/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/VGADriver.cs deleted file mode 100644 index 47effca81e..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/Drivers/VGADriver.cs +++ /dev/null @@ -1,413 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.Drivers -{ - /// - /// The default implementation of a VGA driver. - /// - public class VGADriver : GraphicsDriver - { - private readonly Cosmos.Core.IOGroup.VGA mIO = new Cosmos.Core.IOGroup.VGA(); - private GraphicsMode curMode; - - /// - /// The name of the driver. - /// - public override string Name - { - get - { - return "Standard VGA Driver"; - } - } - - /// - /// The version of the driver. - /// - public override string Version - { - get - { - return "v 1.0"; - } - } - - /// - /// The company responsible for the driver. - /// - public override string Company - { - get - { - return "The Cosmos Community"; - } - } - - /// - /// The Author of the driver. - /// - public override string Author - { - get - { - return "Orvid King"; - } - } - - /// - /// The current GraphicsMode. - /// - public override GraphicsMode Mode - { - get - { - return curMode; - } - } - - private byte GetForColorizer(Pixel p) - { - byte b = unchecked((byte)(Math.Floor((double)(getForPallet(p.R) / (byte)42)) * Math.Floor((double)(getForPallet(p.G) / (byte)42)) * Math.Floor((double)(getForPallet(p.B) / (byte)42)))); - if (b == 0) - { - return 1; - } - else if (b == 1) - { - return 0; - } - else - { - return unchecked((byte)(b + (byte)2)); - } - } - - private int[] Colorize(Image i) - { - int[] arr = new int[i.Height * i.Width]; - int indx = 0; - for (int y = 0; y < i.Height; y++) - { - for (int x = 0; x < i.Width; x++) - { - arr[indx] = GetForColorizer(i.Data[indx]); - //Console.WriteLine("Value: " + i.Data[indx].R.ToString()); - //Console.WriteLine("Colorized value: " + GetForColorizer(i.Data[indx]).ToString()); - indx++; - } - } - return arr; - } - - public override void Update(Image i) - { - - //Console.WriteLine("Well Update is getting called...."); - // TODO: Switch to an delegate based draw mechanism, - // it would be much faster than switch, case like statements. - - int[] data = Colorize(i); - for (uint i2 = 0; i2 < 64000 /* 320 Times 200 is 64,000 so we need to loop 64k times. */; i2++) - { - mIO.VGAMemoryBlock[i2] = (byte)(data[i2] & 0xFF); - } - } - - public override List GetSupportedModes() - { - List modes = new List(); - - - modes.Add(new GraphicsMode(Resolution.Size320x200, ColorDepth.Bit8)); - - - return modes; - } - - public override void SetMode(GraphicsMode mode) - { - if (SupportsMode(mode)) - { - curMode = mode; - } - } - - public override bool Supported() - { - return true; - } - - private byte getForPallet(byte i) - { - if (i > 210) - { - return 255; - } - else - { - return i; - } - } - - public override void Initialize() - { - curMode = new GraphicsMode(Resolution.Size320x200, ColorDepth.Bit8); - SetMode320x200x8(); - - SetPaletteEntry(0, 0, 0, 0); - SetPaletteEntry(1, 255, 255, 255); - int i = 2; - for (int r = 0; r < 6; r++) - { - for (int g = 0; g < 6; g++) - { - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 0); - i++; - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 42); - i++; - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 84); - i++; - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 126); - i++; - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 168); - i++; - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 210); - i++; - if (i < 256) - { - SetPaletteEntry(i, getForPallet((byte)(r * 42)), getForPallet((byte)(g * 42)), 255); - i++; - } - } - } - } - - private const byte NumSeqRegs = 5; - private const byte NumCRTCRegs = 25; - private const byte NumGCRegs = 9; - private const byte NumACRegs = 21; - - #region WriteVGARegisters - private void WriteVGARegisters(byte[] registers) - { - int xIdx = 0; - byte i; - - /* write MISCELLANEOUS reg */ - mIO.MiscellaneousOutput_Write.Byte = registers[xIdx]; - xIdx++; - /* write SEQUENCER regs */ - for (i = 0; i < NumSeqRegs; i++) - { - mIO.Sequencer_Index.Byte = i; - mIO.Sequencer_Data.Byte = registers[xIdx]; - xIdx++; - } - /* unlock CRTC registers */ - mIO.CRTController_Index.Byte = 0x03; - mIO.CRTController_Data.Byte = (byte)(mIO.CRTController_Data.Byte | 0x80); - mIO.CRTController_Index.Byte = 0x11; - mIO.CRTController_Data.Byte = (byte)(mIO.CRTController_Data.Byte & 0x7F); - - /* make sure they remain unlocked */ - registers[0x03] |= 0x80; - registers[0x11] &= 0x7f; - - /* write CRTC regs */ - for (i = 0; i < NumCRTCRegs; i++) - { - mIO.CRTController_Index.Byte = i; - mIO.CRTController_Data.Byte = registers[xIdx]; - xIdx++; - } - /* write GRAPHICS CONTROLLER regs */ - for (i = 0; i < NumGCRegs; i++) - { - mIO.GraphicsController_Index.Byte = i; - mIO.GraphicsController_Data.Byte = registers[xIdx]; - xIdx++; - } - /* write ATTRIBUTE CONTROLLER regs */ - for (i = 0; i < NumACRegs; i++) - { - var xDoSomething = mIO.Instat_Read.Byte; - mIO.AttributeController_Index.Byte = i; - mIO.AttributeController_Write.Byte = registers[xIdx]; - xIdx++; - } - /* lock 16-color palette and unblank display */ - var xNothing = mIO.Instat_Read.Byte; - mIO.AttributeController_Index.Byte = 0x20; - } - #endregion - - #region 300x200x4 - /* - private static byte[] g_320x200x4 = new byte[] - { - /* MISC * - 0x63, - /* SEQ * - 0x03, 0x09, 0x03, 0x00, 0x02, - /* CRTC * - 0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, - 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9C, 0x0E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA3, - 0xFF, - /* GC * - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, - 0xFF, - /* AC * - 0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x01, 0x00, 0x03, 0x00, 0x00 - }; - */ - #endregion - - #region 320x200x8 - public void SetMode320x200x8() - { - WriteVGARegisters(g_320x200x256); - } - - private static byte[] g_320x200x256 = new byte[] - { - /* MISC */ - 0x63, - /* SEQ */ - 0x03, 0x01, 0x0F, 0x00, 0x0E, - /* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, - 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, - 0xFF, - /* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, - 0xFF, - /* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x41, 0x00, 0x0F, 0x00, 0x00 - }; - #endregion - - #region 640x480x2 - /* - private static byte[] g_640x480x2 = new byte[] - { - /* MISC * - 0xE3, - /* SEQ * - 0x03, 0x01, 0x0F, 0x00, 0x06, - /* CRTC * - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, - 0xFF, - /* GC * - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, - 0xFF, - /* AC * - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x01, 0x00, 0x0F, 0x00, 0x00 - }; - */ - #endregion - - #region 640x480x16 - /* - public void SetPixel640x480x16(uint width, uint height, uint c) - { - var xSegment = GetFramebufferSegment(); - var xOffset = (height * 32) + width >> 1; - - c = c & 0xf; - - if ((width & 1) == 0) - { - xSegment[xOffset] = (byte)((xSegment[xOffset] & 0xf) | (c << 4)); - } - else - { - xSegment[xOffset] = (byte)((xSegment[xOffset] & 0xf0) | c); - } - } - - private static byte[] g_640x480x16 = new byte[] - { - /* MISC * - 0xE3, - /* SEQ * - 0x03, 0x01, 0x08, 0x00, 0x06, - /* CRTC * - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, - 0xFF, - /* GC * - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x0F, - 0xFF, - /* AC * - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x01, 0x00, 0x0F, 0x00, 0x00 - }; - */ - #endregion - - #region 720x480x16 - /* - private static byte[] g_720x480x16 = new byte[] - { - /* MISC * - 0xE7, - /* SEQ * - 0x03, 0x01, 0x08, 0x00, 0x06, - /* CRTC * - 0x6B, 0x59, 0x5A, 0x82, 0x60, 0x8D, 0x0B, 0x3E, - 0x00, 0x40, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x2D, 0x08, 0xE8, 0x05, 0xE3, - 0xFF, - /* GC * - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x0F, - 0xFF, - /* AC * - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x01, 0x00, 0x0F, 0x00, 0x00, - }; - */ - #endregion - - #region Palette Operations - public void SetPaletteEntry(int index, System.Drawing.Color color) - { - SetPaletteEntry(index, color.R, color.G, color.B); - } - - public void SetPalette(int index, byte[] pallete) - { - mIO.DACIndex_Write.Byte = (byte)index; - for (int i = 0; i < pallete.Length; i++) - mIO.DAC_Data.Byte = (byte)(pallete[i] >> 2); - } - - public void SetPaletteEntry(int index, byte r, byte g, byte b) - { - mIO.DACIndex_Write.Byte = (byte)index; - mIO.DAC_Data.Byte = (byte)(r >> 2); - mIO.DAC_Data.Byte = (byte)(g >> 2); - mIO.DAC_Data.Byte = (byte)(b >> 2); - } - #endregion - - public override void Shutdown() - { - - } - } -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsDriver.cs b/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsDriver.cs deleted file mode 100644 index a21bb88245..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsDriver.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Orvid.Graphics -{ - /// - /// This class describes a graphics driver. - /// - public abstract class GraphicsDriver - { - /// - /// Returns the name of the graphics driver. - /// - public abstract string Name { get; } - /// - /// Returns the version of the graphics driver. - /// - public abstract string Version { get; } - /// - /// Returns the company that created the graphics driver. - /// - public abstract string Company { get; } - /// - /// Returns the author of the graphics driver. - /// - public abstract string Author { get; } - /// - /// Returns the current graphics mode. - /// - public abstract GraphicsMode Mode { get; } - - /// - /// This method is called to update the entire screen. - /// - /// The image to draw. - public abstract void Update(Image i); - - /// - /// This method is used to get the resolutions the driver supports. - /// - /// A list of graphics modes that the driver supports. - public abstract List GetSupportedModes(); - - /// - /// This method is used to set the current graphics mode. - /// - /// The mode to set to. - public abstract void SetMode(GraphicsMode mode); - - /// - /// Returns true if the given graphics mode is supported. - /// - /// The mode to check. - /// True if the given mode is supported. - public bool SupportsMode(GraphicsMode mode) - { - return GetSupportedModes().Contains(mode); - } - - /// - /// This method is used to determine whether or not to load the driver. - /// - /// True if the driver is valid for the current system, otherwise false. - public abstract bool Supported(); - - /// - /// This method is called to initialize the graphics - /// driver and tell it we're going to use it. - /// - public abstract void Initialize(); - - /// - /// This method is called to tell the driver to shut-down. - /// - public abstract void Shutdown(); - } -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsMode.cs b/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsMode.cs deleted file mode 100644 index 1bb182201f..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsMode.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; - -namespace Orvid.Graphics -{ - public class GraphicsMode - { - public readonly Resolution Resolution; - public readonly ColorDepth ColorDepth; - public GraphicsMode(Resolution resolution, ColorDepth depth) - { - this.Resolution = resolution; - this.ColorDepth = depth; - } - - public static bool operator !=(GraphicsMode a, GraphicsMode b) - { - if (a.ColorDepth != b.ColorDepth || a.Resolution != b.Resolution) - return true; - return false; - } - - public static bool operator ==(GraphicsMode a,GraphicsMode b) - { - if (a.ColorDepth != b.ColorDepth || a.Resolution != b.Resolution) - return false; - return true; - } - - public override bool Equals(object obj) - { - return (this == (GraphicsMode)obj); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - } - - #region Resolution - /// - /// The enum that contains all of the possible display resolutions. - /// NOTE: - /// Just because they're here, doesn't mean they are implemented. - /// - public enum Resolution - { -#pragma warning disable 1591 - // That's to keep the compiler balking about the missing xml comments - - Size160x120, - Size240x160, - Size320x200, - Size320x240, - Size320x400, - Size360x480, - Size400x600, - Size432x240, - Size480x272, - Size480x320, - Size480x360, - Size640x240, - Size640x350, - Size640x360, - Size640x400, - Size640x480, - Size800x480, - Size800x600, - Size854x480, - Size960x540, - Size1024x576, - Size1024x600, - Size1024x768, - Size1152x864, - Size1280x720, - Size1280x768, - Size1280x800, - Size1280x960, - Size1280x1024, - Size1360x768, - Size1366x768, - Size1400x1050, - Size1440x900, - Size1600x768, - Size1600x1200, - Size1680x1050, - Size1920x1200, - Size2048x1152, - Size2048x1536, - Size2560x1080, - Size2560x1440, - Size2560x1600, - Size2560x2048, - Size3200x2048, - Size3200x2400, - Size3840x2160, - Size3840x2400, - Size4096x3072, - Size5120x3200, - Size5120x4096, - Size6400x4096, - Size6400x4800, - Size7680x4800, - - // And turn the warning back on for the rest of the file. -#pragma warning restore 1591 - } - #endregion - - #region Color Depth - /// - /// The enum that contains all of the possible color depths. - /// - public enum ColorDepth - { - /// - /// This is black and white. - /// (well it can actually be any 2 colors of your choice, but still) - /// - Bit2, - /// - /// This is the 4-bit color depth. - /// - Bit4, - /// - /// This is the 8-bit color depth, also known as 256 colors. - /// - Bit8, - /// - /// This is the 16-bit depth. - /// It's enough to be able to view photo's without losing much visually. - /// - Bit16, - /// - /// This is the 32-bit depth. It is the highest available depth. - /// - Bit32, - /// - /// This color depth isn't ever used, but is here for future possibilities. - /// - Bit64 - } - #endregion -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsPlugs.cs b/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsPlugs.cs deleted file mode 100644 index 9b7516b991..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/GraphicsPlugs.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Text; -using IL2CPU.API; -using CPUAll = Cosmos.Compiler.Assembler; -using CPUx86 = Cosmos.Compiler.Assembler.X86; - -namespace Orvid.Graphics -{ - [Plug(Target = typeof(global::System.Math))] - class MathImpl - { - public static double Floor(double d) - { - // Should subtract 0.5 then round. - String str = d.ToString(); - return (double)Int32.Parse(str.Substring(0, str.IndexOf('.'))); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/Monitor.cs b/Users/Orvid/Orvid.Graphics.Cosmos/Monitor.cs deleted file mode 100644 index c7b36d9dc8..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/Monitor.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Orvid.Graphics; - -namespace Orvid.Graphics -{ - /// - /// This class is describes a single monitor, - /// and also handles graphics driver wrangling. - /// - public class Monitor - { - /// - /// This image contains the taskbar. - /// - public Image Taskbar; - /// - /// This image contains the mouse. - /// - public Image Mouse; - - /// - /// The current graphics driver. - /// - private GraphicsDriver curdriver; - /// - /// The current graphics driver. - /// - public GraphicsDriver CurrentDriver - { - get - { - return curdriver; - } - } - - /// - /// This is the width of the monitor. - /// - public int Width; - /// - /// This is the height of the monitor. - /// - public int Height; - - public OForms.Windows.WindowManager WindowManager; - - public uint MouseX = 0; - public uint MouseY = 0; - - - public Monitor() - { - int width = 320; - int height = 200; - Taskbar = new Image(width, height); - Mouse = new Image(width, height); - this.curdriver = new Drivers.VGADriver(); - //this.curdriver.Initialize(); - this.Width = width; - this.Height = height; - WindowManager = new OForms.Windows.WindowManager(new Vec2(width, height)); - - InitializeMouse(); - - Taskbar.Clear(Colors.White); // Clear the screen white. - CurrentDriver.Update(Taskbar); - } - - public void Update() - { - WindowManager.Draw(Taskbar); - DrawCursor(); - //uint i = 0; - //uint yPixBase = 0; - //for (uint height = 0; height < Taskbar.Height; height++) - //{ - // yPixBase = height * 320; - // for (uint width = 0; width < Taskbar.Width; width++) - // { - // Cosmos.System.Global.Console.WriteLine("The value at (" + width.ToString() + ", " + height.ToString() + ") is '" + Taskbar.GetPixel(width, height).ToString() + "'"); - // if (i >= 24) - // { - // Cosmos.System.Global.Console.Y = 0; - // Cosmos.System.Global.Console.X = 0; - // i = 0; - // } - // i++; - // } - //} - - CurrentDriver.Update(GetEffectiveImage()); - // Now we need to restore what was behind the mouse. - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - Taskbar.DrawImage(v, behindMouseImage); - } - - #region Mouse Functions - /// - /// This image contains everything that is behind the mouse. - /// - private Image behindMouseImage = new Image(4, 4); // This means max mouse size is 4x4 - private Image MouseImage = new Image(4, 4); - private void DrawCursor() - { - #region SaveBehindMouse - behindMouseImage.SetPixel(0, 0, Taskbar.GetPixel(MouseX, MouseY)); - behindMouseImage.SetPixel(1, 0, Taskbar.GetPixel(MouseX + 1, MouseY)); - behindMouseImage.SetPixel(2, 0, Taskbar.GetPixel(MouseX + 2, MouseY)); - behindMouseImage.SetPixel(3, 0, Taskbar.GetPixel(MouseX + 3, MouseY)); - behindMouseImage.SetPixel(0, 1, Taskbar.GetPixel(MouseX, MouseY + 1)); - behindMouseImage.SetPixel(1, 1, Taskbar.GetPixel(MouseX + 1, MouseY + 1)); - behindMouseImage.SetPixel(2, 1, Taskbar.GetPixel(MouseX + 2, MouseY + 1)); - behindMouseImage.SetPixel(3, 1, Taskbar.GetPixel(MouseX + 3, MouseY + 1)); - behindMouseImage.SetPixel(0, 2, Taskbar.GetPixel(MouseX, MouseY + 2)); - behindMouseImage.SetPixel(1, 2, Taskbar.GetPixel(MouseX + 1, MouseY + 2)); - behindMouseImage.SetPixel(2, 2, Taskbar.GetPixel(MouseX + 2, MouseY + 2)); - behindMouseImage.SetPixel(3, 2, Taskbar.GetPixel(MouseX + 3, MouseY + 2)); - behindMouseImage.SetPixel(0, 3, Taskbar.GetPixel(MouseX, MouseY + 3)); - behindMouseImage.SetPixel(1, 3, Taskbar.GetPixel(MouseX + 1, MouseY + 3)); - behindMouseImage.SetPixel(2, 3, Taskbar.GetPixel(MouseX + 2, MouseY + 3)); - behindMouseImage.SetPixel(3, 3, Taskbar.GetPixel(MouseX + 3, MouseY + 3)); - #endregion - - #region Draw Mouse - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - Taskbar.DrawImage(v, MouseImage); - #endregion - } - - private void InitializeMouse() - { - // Now we need to setup the mouse - MouseImage.SetPixel(0, 0, Colors.Black); - MouseImage.SetPixel(1, 0, Colors.Black); - MouseImage.SetPixel(2, 0, Colors.Black); - MouseImage.SetPixel(3, 0, Colors.Black); - MouseImage.SetPixel(0, 1, Colors.Black); - MouseImage.SetPixel(1, 1, Colors.White); - MouseImage.SetPixel(2, 1, Colors.White); - MouseImage.SetPixel(3, 1, Colors.Black); - MouseImage.SetPixel(0, 2, Colors.Black); - MouseImage.SetPixel(1, 2, Colors.White); - MouseImage.SetPixel(2, 2, Colors.White); - MouseImage.SetPixel(3, 2, Colors.Black); - MouseImage.SetPixel(0, 3, Colors.Black); - MouseImage.SetPixel(1, 3, Colors.Black); - MouseImage.SetPixel(2, 3, Colors.Black); - MouseImage.SetPixel(3, 3, Colors.Black); - } - #endregion - - public Image GetEffectiveImage() - { - return Taskbar; - } - } - -} diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/Orvid.Graphics.Cosmos.csproj b/Users/Orvid/Orvid.Graphics.Cosmos/Orvid.Graphics.Cosmos.csproj deleted file mode 100644 index a1a867468e..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/Orvid.Graphics.Cosmos.csproj +++ /dev/null @@ -1,126 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {167D46D2-F0F2-4F59-BA0F-2452941E0450} - Library - Properties - Orvid.Graphics.Cosmos - Orvid.Graphics.Cosmos - v4.7.1 - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - {94D079E4-3C66-486A-8407-EA6EC049FF53} - Cosmos.Compiler.Assembler.X86 - - - {1116130E-28E0-428A-A597-F4B3B676C0CA} - Cosmos.Compiler.Assembler - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - IL2CPU.API - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {039E2C8F-E73C-48AF-B249-FC953072D9A0} - OForms - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - - diff --git a/Users/Orvid/Orvid.Graphics.Cosmos/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Graphics.Cosmos/Properties/AssemblyInfo.cs deleted file mode 100644 index 957c3323c4..0000000000 --- a/Users/Orvid/Orvid.Graphics.Cosmos/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("Orvid.Graphics.Cosmos")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("Orvid.Graphics.Cosmos")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("5c4a156a-b443-42f9-b307-2e24ff5e34d1")] - -// 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/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Half.cs b/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Half.cs deleted file mode 100644 index 4dc3bae84b..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Half.cs +++ /dev/null @@ -1,1083 +0,0 @@ -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; - -namespace System -{ - /// - /// Represents a half-precision floating point number. - /// - /// - /// Note: - /// Half is not fast enought and precision is also very bad, - /// so is should not be used for matemathical computation (use Single instead). - /// The main advantage of Half type is lower memory cost: two bytes per number. - /// Half is typically used in graphical applications. - /// - /// Note: - /// All functions, where is used conversion half->float/float->half, - /// are approx. ten times slower than float->double/double->float, i.e. ~3ns on 2GHz CPU. - /// - /// References: - /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - /// - IEEE 754 revision, link: http://grouper.ieee.org/groups/754/ - /// - [Serializable] - public struct Half : IComparable, IFormattable, IConvertible, IComparable, IEquatable - { - /// - /// Internal representation of the half-precision floating-point number. - /// - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - internal ushort value; - - #region Constants - /// - /// Represents the smallest positive System.Half value greater than zero. This field is constant. - /// - public static readonly Half Epsilon = Half.ToHalf(0x0001); - /// - /// Represents the largest possible value of System.Half. This field is constant. - /// - public static readonly Half MaxValue = Half.ToHalf(0x7bff); - /// - /// Represents the smallest possible value of System.Half. This field is constant. - /// - public static readonly Half MinValue = Half.ToHalf(0xfbff); - /// - /// Represents not a number (NaN). This field is constant. - /// - public static readonly Half NaN = Half.ToHalf(0xfe00); - /// - /// Represents negative infinity. This field is constant. - /// - public static readonly Half NegativeInfinity = Half.ToHalf(0xfc00); - /// - /// Represents positive infinity. This field is constant. - /// - public static readonly Half PositiveInfinity = Half.ToHalf(0x7c00); - #endregion - - #region Constructors - /// - /// Initializes a new instance of System.Half to the value of the specified single-precision floating-point number. - /// - /// The value to represent as a System.Half. - public Half(float value) { this = HalfHelper.SingleToHalf(value); } - /// - /// Initializes a new instance of System.Half to the value of the specified 32-bit signed integer. - /// - /// The value to represent as a System.Half. - public Half(int value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 64-bit signed integer. - /// - /// The value to represent as a System.Half. - public Half(long value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified double-precision floating-point number. - /// - /// The value to represent as a System.Half. - public Half(double value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified decimal number. - /// - /// The value to represent as a System.Half. - public Half(decimal value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 32-bit unsigned integer. - /// - /// The value to represent as a System.Half. - public Half(uint value) : this((float)value) { } - /// - /// Initializes a new instance of System.Half to the value of the specified 64-bit unsigned integer. - /// - /// The value to represent as a System.Half. - public Half(ulong value) : this((float)value) { } - #endregion - - #region Numeric operators - - /// - /// Returns the result of multiplying the specified System.Half value by negative one. - /// - /// A System.Half. - /// A System.Half with the value of half, but the opposite sign. -or- Zero, if half is zero. - public static Half Negate(Half half) { return -half; } - /// - /// Adds two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// A System.Half value that is the sum of half1 and half2. - public static Half Add(Half half1, Half half2) { return half1 + half2; } - /// - /// Subtracts one specified System.Half value from another. - /// - /// A System.Half (the minuend). - /// A System.Half (the subtrahend). - /// The System.Half result of subtracting half2 from half1. - public static Half Subtract(Half half1, Half half2) { return half1 - half2; } - /// - /// Multiplies two specified System.Half values. - /// - /// A System.Half (the multiplicand). - /// A System.Half (the multiplier). - /// A System.Half that is the result of multiplying half1 and half2. - public static Half Multiply(Half half1, Half half2) { return half1 * half2; } - /// - /// Divides two specified System.Half values. - /// - /// A System.Half (the dividend). - /// A System.Half (the divisor). - /// The System.Half that is the result of dividing half1 by half2. - /// half2 is zero. - public static Half Divide(Half half1, Half half2) { return half1 / half2; } - - /// - /// Returns the value of the System.Half operand (the sign of the operand is unchanged). - /// - /// The System.Half operand. - /// The value of the operand, half. - public static Half operator +(Half half) { return half; } - /// - /// Negates the value of the specified System.Half operand. - /// - /// The System.Half operand. - /// The result of half multiplied by negative one (-1). - public static Half operator -(Half half) { return HalfHelper.Negate(half); } - /// - /// Increments the System.Half operand by 1. - /// - /// The System.Half operand. - /// The value of half incremented by 1. - public static Half operator ++(Half half) { return (Half)(half + 1f); } - /// - /// Decrements the System.Half operand by one. - /// - /// The System.Half operand. - /// The value of half decremented by 1. - public static Half operator --(Half half) { return (Half)(half - 1f); } - /// - /// Adds two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of adding half1 and half2. - public static Half operator +(Half half1, Half half2) { return (Half)((float)half1 + (float)half2); } - /// - /// Subtracts two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of subtracting half1 and half2. - public static Half operator -(Half half1, Half half2) { return (Half)((float)half1 - (float)half2); } - /// - /// Multiplies two specified System.Half values. - /// - /// A System.Half. - /// A System.Half. - /// The System.Half result of multiplying half1 by half2. - public static Half operator *(Half half1, Half half2) { return (Half)((float)half1 * (float)half2); } - /// - /// Divides two specified System.Half values. - /// - /// A System.Half (the dividend). - /// A System.Half (the divisor). - /// The System.Half result of half1 by half2. - public static Half operator /(Half half1, Half half2) { return (Half)((float)half1 / (float)half2); } - /// - /// Returns a value indicating whether two instances of System.Half are equal. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 and half2 are equal; otherwise, false. - public static bool operator ==(Half half1, Half half2) { return (!IsNaN(half1) && (half1.value == half2.value)); } - /// - /// Returns a value indicating whether two instances of System.Half are not equal. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 and half2 are not equal; otherwise, false. - public static bool operator !=(Half half1, Half half2) { return !(half1.value == half2.value); } - /// - /// Returns a value indicating whether a specified System.Half is less than another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is less than half1; otherwise, false. - public static bool operator <(Half half1, Half half2) { return (float)half1 < (float)half2; } - /// - /// Returns a value indicating whether a specified System.Half is greater than another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is greater than half2; otherwise, false. - public static bool operator >(Half half1, Half half2) { return (float)half1 > (float)half2; } - /// - /// Returns a value indicating whether a specified System.Half is less than or equal to another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is less than or equal to half2; otherwise, false. - public static bool operator <=(Half half1, Half half2) { return (half1 == half2) || (half1 < half2); } - /// - /// Returns a value indicating whether a specified System.Half is greater than or equal to another specified System.Half. - /// - /// A System.Half. - /// A System.Half. - /// true if half1 is greater than or equal to half2; otherwise, false. - public static bool operator >=(Half half1, Half half2) { return (half1 == half2) || (half1 > half2); } - #endregion - - #region Type casting operators - /// - /// Converts an 8-bit unsigned integer to a System.Half. - /// - /// An 8-bit unsigned integer. - /// A System.Half that represents the converted 8-bit unsigned integer. - public static implicit operator Half(byte value) { return new Half((float)value); } - /// - /// Converts a 16-bit signed integer to a System.Half. - /// - /// A 16-bit signed integer. - /// A System.Half that represents the converted 16-bit signed integer. - public static implicit operator Half(short value) { return new Half((float)value); } - /// - /// Converts a Unicode character to a System.Half. - /// - /// A Unicode character. - /// A System.Half that represents the converted Unicode character. - public static implicit operator Half(char value) { return new Half((float)value); } - /// - /// Converts a 32-bit signed integer to a System.Half. - /// - /// A 32-bit signed integer. - /// A System.Half that represents the converted 32-bit signed integer. - public static implicit operator Half(int value) { return new Half((float)value); } - /// - /// Converts a 64-bit signed integer to a System.Half. - /// - /// A 64-bit signed integer. - /// A System.Half that represents the converted 64-bit signed integer. - public static implicit operator Half(long value) { return new Half((float)value); } - /// - /// Converts a single-precision floating-point number to a System.Half. - /// - /// A single-precision floating-point number. - /// A System.Half that represents the converted single-precision floating point number. - public static explicit operator Half(float value) { return new Half((float)value); } - /// - /// Converts a double-precision floating-point number to a System.Half. - /// - /// A double-precision floating-point number. - /// A System.Half that represents the converted double-precision floating point number. - public static explicit operator Half(double value) { return new Half((float)value); } - /// - /// Converts a decimal number to a System.Half. - /// - /// decimal number - /// A System.Half that represents the converted decimal number. - public static explicit operator Half(decimal value) { return new Half((float)value); } - /// - /// Converts a System.Half to an 8-bit unsigned integer. - /// - /// A System.Half to convert. - /// An 8-bit unsigned integer that represents the converted System.Half. - public static explicit operator byte(Half value) { return (byte)(float)value; } - /// - /// Converts a System.Half to a Unicode character. - /// - /// A System.Half to convert. - /// A Unicode character that represents the converted System.Half. - public static explicit operator char(Half value) { return (char)(float)value; } - /// - /// Converts a System.Half to a 16-bit signed integer. - /// - /// A System.Half to convert. - /// A 16-bit signed integer that represents the converted System.Half. - public static explicit operator short(Half value) { return (short)(float)value; } - /// - /// Converts a System.Half to a 32-bit signed integer. - /// - /// A System.Half to convert. - /// A 32-bit signed integer that represents the converted System.Half. - public static explicit operator int(Half value) { return (int)(float)value; } - /// - /// Converts a System.Half to a 64-bit signed integer. - /// - /// A System.Half to convert. - /// A 64-bit signed integer that represents the converted System.Half. - public static explicit operator long(Half value) { return (long)(float)value; } - /// - /// Converts a System.Half to a single-precision floating-point number. - /// - /// A System.Half to convert. - /// A single-precision floating-point number that represents the converted System.Half. - public static implicit operator float(Half value) { return (float)HalfHelper.HalfToSingle(value); } - /// - /// Converts a System.Half to a double-precision floating-point number. - /// - /// A System.Half to convert. - /// A double-precision floating-point number that represents the converted System.Half. - public static implicit operator double(Half value) { return (double)(float)value; } - /// - /// Converts a System.Half to a decimal number. - /// - /// A System.Half to convert. - /// A decimal number that represents the converted System.Half. - public static explicit operator decimal(Half value) { return (decimal)(float)value; } - /// - /// Converts an 8-bit signed integer to a System.Half. - /// - /// An 8-bit signed integer. - /// A System.Half that represents the converted 8-bit signed integer. - public static implicit operator Half(sbyte value) { return new Half((float)value); } - /// - /// Converts a 16-bit unsigned integer to a System.Half. - /// - /// A 16-bit unsigned integer. - /// A System.Half that represents the converted 16-bit unsigned integer. - public static implicit operator Half(ushort value) { return new Half((float)value); } - /// - /// Converts a 32-bit unsigned integer to a System.Half. - /// - /// A 32-bit unsigned integer. - /// A System.Half that represents the converted 32-bit unsigned integer. - public static implicit operator Half(uint value) { return new Half((float)value); } - /// - /// Converts a 64-bit unsigned integer to a System.Half. - /// - /// A 64-bit unsigned integer. - /// A System.Half that represents the converted 64-bit unsigned integer. - public static implicit operator Half(ulong value) { return new Half((float)value); } - /// - /// Converts a System.Half to an 8-bit signed integer. - /// - /// A System.Half to convert. - /// An 8-bit signed integer that represents the converted System.Half. - public static explicit operator sbyte(Half value) { return (sbyte)(float)value; } - /// - /// Converts a System.Half to a 16-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 16-bit unsigned integer that represents the converted System.Half. - public static explicit operator ushort(Half value) { return (ushort)(float)value; } - /// - /// Converts a System.Half to a 32-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 32-bit unsigned integer that represents the converted System.Half. - public static explicit operator uint(Half value) { return (uint)(float)value; } - /// - /// Converts a System.Half to a 64-bit unsigned integer. - /// - /// A System.Half to convert. - /// A 64-bit unsigned integer that represents the converted System.Half. - public static explicit operator ulong(Half value) { return (ulong)(float)value; } - #endregion - - /// - /// Compares this instance to a specified System.Half object. - /// - /// A System.Half object. - /// - /// A signed number indicating the relative values of this instance and value. - /// Return Value Meaning Less than zero This instance is less than value. Zero - /// This instance is equal to value. Greater than zero This instance is greater than value. - /// - public int CompareTo(Half other) - { - int result = 0; - if (this < other) - { - result = -1; - } - else if (this > other) - { - result = 1; - } - else if (this != other) - { - if (!IsNaN(this)) - { - result = 1; - } - else if (!IsNaN(other)) - { - result = -1; - } - } - - return result; - } - /// - /// Compares this instance to a specified System.Object. - /// - /// An System.Object or null. - /// - /// A signed number indicating the relative values of this instance and value. - /// Return Value Meaning Less than zero This instance is less than value. Zero - /// This instance is equal to value. Greater than zero This instance is greater - /// than value. -or- value is null. - /// - /// value is not a System.Half - public int CompareTo(object obj) - { - int result = 0; - if (obj == null) - { - result = 1; - } - else - { - if (obj is Half) - { - result = CompareTo((Half)obj); - } - else - { - throw new ArgumentException("Object must be of type Half."); - } - } - - return result; - } - /// - /// Returns a value indicating whether this instance and a specified System.Half object represent the same value. - /// - /// A System.Half object to compare to this instance. - /// true if value is equal to this instance; otherwise, false. - public bool Equals(Half other) - { - return ((other == this) || (IsNaN(other) && IsNaN(this))); - } - /// - /// Returns a value indicating whether this instance and a specified System.Object - /// represent the same type and value. - /// - /// An System.Object. - /// true if value is a System.Half and equal to this instance; otherwise, false. - public override bool Equals(object obj) - { - bool result = false; - if (obj is Half) - { - Half half = (Half)obj; - if ((half == this) || (IsNaN(half) && IsNaN(this))) - { - result = true; - } - } - - return result; - } - /// - /// Returns the hash code for this instance. - /// - /// A 32-bit signed integer hash code. - public override int GetHashCode() - { - return value.GetHashCode(); - } - /// - /// Returns the System.TypeCode for value type System.Half. - /// - /// The enumerated constant (TypeCode)255. - public TypeCode GetTypeCode() - { - return (TypeCode)255; - } - - #region BitConverter & Math methods for Half - /// - /// Returns the specified half-precision floating point value as an array of bytes. - /// - /// The number to convert. - /// An array of bytes with length 2. - public static byte[] GetBytes(Half value) - { - return BitConverter.GetBytes(value.value); - } - /// - /// Converts the value of a specified instance of System.Half to its equivalent binary representation. - /// - /// A System.Half value. - /// A 16-bit unsigned integer that contain the binary representation of value. - public static ushort GetBits(Half value) - { - return value.value; - } - /// - /// Returns a half-precision floating point number converted from two bytes - /// at a specified position in a byte array. - /// - /// An array of bytes. - /// The starting position within value. - /// A half-precision floating point number formed by two bytes beginning at startIndex. - /// - /// startIndex is greater than or equal to the length of value minus 1, and is - /// less than or equal to the length of value minus 1. - /// - /// value is null. - /// startIndex is less than zero or greater than the length of value minus 1. - public static Half ToHalf(byte[] value, int startIndex) - { - return Half.ToHalf((ushort)BitConverter.ToInt16(value, startIndex)); - } - /// - /// Returns a half-precision floating point number converted from its binary representation. - /// - /// Binary representation of System.Half value - /// A half-precision floating point number formed by its binary representation. - public static Half ToHalf(ushort bits) - { - return new Half { value = bits }; - } - - /// - /// Returns a value indicating the sign of a half-precision floating-point number. - /// - /// A signed number. - /// - /// A number indicating the sign of value. Number Description -1 value is less - /// than zero. 0 value is equal to zero. 1 value is greater than zero. - /// - /// value is equal to System.Half.NaN. - public static int Sign(Half value) - { - if (value < 0) - { - return -1; - } - else if (value > 0) - { - return 1; - } - else - { - if (value != 0) - { - throw new ArithmeticException("Function does not accept floating point Not-a-Number values."); - } - } - - return 0; - } - /// - /// Returns the absolute value of a half-precision floating-point number. - /// - /// A number in the range System.Half.MinValue ≤ value ≤ System.Half.MaxValue. - /// A half-precision floating-point number, x, such that 0 ≤ x ≤System.Half.MaxValue. - public static Half Abs(Half value) - { - return HalfHelper.Abs(value); - } - /// - /// Returns the larger of two half-precision floating-point numbers. - /// - /// The first of two half-precision floating-point numbers to compare. - /// The second of two half-precision floating-point numbers to compare. - /// - /// Parameter value1 or value2, whichever is larger. If value1, or value2, or both val1 - /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. - /// - public static Half Max(Half value1, Half value2) - { - return (value1 < value2) ? value2 : value1; - } - /// - /// Returns the smaller of two half-precision floating-point numbers. - /// - /// The first of two half-precision floating-point numbers to compare. - /// The second of two half-precision floating-point numbers to compare. - /// - /// Parameter value1 or value2, whichever is smaller. If value1, or value2, or both val1 - /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. - /// - public static Half Min(Half value1, Half value2) - { - return (value1 < value2) ? value1 : value2; - } - #endregion - - /// - /// Returns a value indicating whether the specified number evaluates to not a number (System.Half.NaN). - /// - /// A half-precision floating-point number. - /// true if value evaluates to not a number (System.Half.NaN); otherwise, false. - public static bool IsNaN(Half half) - { - return HalfHelper.IsNaN(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to negative or positive infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.PositiveInfinity or System.Half.NegativeInfinity; otherwise, false. - public static bool IsInfinity(Half half) - { - return HalfHelper.IsInfinity(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to negative infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.NegativeInfinity; otherwise, false. - public static bool IsNegativeInfinity(Half half) - { - return HalfHelper.IsNegativeInfinity(half); - } - /// - /// Returns a value indicating whether the specified number evaluates to positive infinity. - /// - /// A half-precision floating-point number. - /// true if half evaluates to System.Half.PositiveInfinity; otherwise, false. - public static bool IsPositiveInfinity(Half half) - { - return HalfHelper.IsPositiveInfinity(half); - } - - #region String operations (Parse and ToString) - /// - /// Converts the string representation of a number to its System.Half equivalent. - /// - /// The string representation of the number to convert. - /// The System.Half number equivalent to the number contained in value. - /// value is null. - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value) - { - return (Half)float.Parse(value, CultureInfo.InvariantCulture); - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified culture-specific format information. - /// - /// The string representation of the number to convert. - /// An System.IFormatProvider that supplies culture-specific parsing information about value. - /// The System.Half number equivalent to the number contained in s as specified by provider. - /// value is null. - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, IFormatProvider provider) - { - return (Half)float.Parse(value, provider); - } - /// - /// Converts the string representation of a number in a specified style to its System.Half equivalent. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the style elements that can be present in value. A typical value to specify is - /// System.Globalization.NumberStyles.Number. - /// - /// The System.Half number equivalent to the number contained in s as specified by style. - /// value is null. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style is the - /// System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, NumberStyles style) - { - return (Half)float.Parse(value, style, CultureInfo.InvariantCulture); - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified style and culture-specific format. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the style elements that can be present in value. A typical value to specify is - /// System.Globalization.NumberStyles.Number. - /// - /// An System.IFormatProvider object that supplies culture-specific information about the format of value. - /// The System.Half number equivalent to the number contained in s as specified by style and provider. - /// value is null. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style is the - /// System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - /// value is not in the correct format. - /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. - public static Half Parse(string value, NumberStyles style, IFormatProvider provider) - { - return (Half)float.Parse(value, style, provider); - } - /// - /// Converts the string representation of a number to its System.Half equivalent. - /// A return value indicates whether the conversion succeeded or failed. - /// - /// The string representation of the number to convert. - /// - /// When this method returns, contains the System.Half number that is equivalent - /// to the numeric value contained in value, if the conversion succeeded, or is zero - /// if the conversion failed. The conversion fails if the s parameter is null, - /// is not a number in a valid format, or represents a number less than System.Half.MinValue - /// or greater than System.Half.MaxValue. This parameter is passed uninitialized. - /// - /// true if s was converted successfully; otherwise, false. - public static bool TryParse(string value, out Half result) - { - float f; - if (float.TryParse(value, out f)) - { - result = (Half)f; - return true; - } - - result = new Half(); - return false; - } - /// - /// Converts the string representation of a number to its System.Half equivalent - /// using the specified style and culture-specific format. A return value indicates - /// whether the conversion succeeded or failed. - /// - /// The string representation of the number to convert. - /// - /// A bitwise combination of System.Globalization.NumberStyles values that indicates - /// the permitted format of value. A typical value to specify is System.Globalization.NumberStyles.Number. - /// - /// An System.IFormatProvider object that supplies culture-specific parsing information about value. - /// - /// When this method returns, contains the System.Half number that is equivalent - /// to the numeric value contained in value, if the conversion succeeded, or is zero - /// if the conversion failed. The conversion fails if the s parameter is null, - /// is not in a format compliant with style, or represents a number less than - /// System.Half.MinValue or greater than System.Half.MaxValue. This parameter is passed uninitialized. - /// - /// true if s was converted successfully; otherwise, false. - /// - /// style is not a System.Globalization.NumberStyles value. -or- style - /// is the System.Globalization.NumberStyles.AllowHexSpecifier value. - /// - public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out Half result) - { - bool parseResult = false; - float f; - if (float.TryParse(value, style, provider, out f)) - { - result = (Half)f; - parseResult = true; - } - else - { - result = new Half(); - } - - return parseResult; - } - /// - /// Converts the numeric value of this instance to its equivalent string representation. - /// - /// A string that represents the value of this instance. - public override string ToString() - { - return ((float)this).ToString(CultureInfo.InvariantCulture); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation - /// using the specified culture-specific format information. - /// - /// An System.IFormatProvider that supplies culture-specific formatting information. - /// The string representation of the value of this instance as specified by provider. - public string ToString(IFormatProvider formatProvider) - { - return ((float)this).ToString(formatProvider); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation, using the specified format. - /// - /// A numeric format string. - /// The string representation of the value of this instance as specified by format. - public string ToString(string format) - { - return ((float)this).ToString(format, CultureInfo.InvariantCulture); - } - /// - /// Converts the numeric value of this instance to its equivalent string representation - /// using the specified format and culture-specific format information. - /// - /// A numeric format string. - /// An System.IFormatProvider that supplies culture-specific formatting information. - /// The string representation of the value of this instance as specified by format and provider. - /// format is invalid. - public string ToString(string format, IFormatProvider formatProvider) - { - return ((float)this).ToString(format, formatProvider); - } - #endregion - - #region IConvertible Members - float IConvertible.ToSingle(IFormatProvider provider) - { - return (float)this; - } - TypeCode IConvertible.GetTypeCode() - { - return GetTypeCode(); - } - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return Convert.ToBoolean((float)this); - } - byte IConvertible.ToByte(IFormatProvider provider) - { - return Convert.ToByte((float)this); - } - char IConvertible.ToChar(IFormatProvider provider) - { - throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "Char")); - } - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "DateTime")); - } - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - return Convert.ToDecimal((float)this); - } - double IConvertible.ToDouble(IFormatProvider provider) - { - return Convert.ToDouble((float)this); - } - short IConvertible.ToInt16(IFormatProvider provider) - { - return Convert.ToInt16((float)this); - } - int IConvertible.ToInt32(IFormatProvider provider) - { - return Convert.ToInt32((float)this); - } - long IConvertible.ToInt64(IFormatProvider provider) - { - return Convert.ToInt64((float)this); - } - sbyte IConvertible.ToSByte(IFormatProvider provider) - { - return Convert.ToSByte((float)this); - } - string IConvertible.ToString(IFormatProvider provider) - { - return Convert.ToString((float)this, CultureInfo.InvariantCulture); - } - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - return (((float)this) as IConvertible).ToType(conversionType, provider); - } - ushort IConvertible.ToUInt16(IFormatProvider provider) - { - return Convert.ToUInt16((float)this); - } - uint IConvertible.ToUInt32(IFormatProvider provider) - { - return Convert.ToUInt32((float)this); - } - ulong IConvertible.ToUInt64(IFormatProvider provider) - { - return Convert.ToUInt64((float)this); - } - #endregion - - #region HalfHelper - /// - /// Helper class for Half conversions and some low level operations. - /// This class is internally used in the Half class. - /// - /// - /// References: - /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf - /// - private static class HalfHelper - { - private static uint[] mantissaTable = GenerateMantissaTable(); - private static uint[] exponentTable = GenerateExponentTable(); - private static ushort[] offsetTable = GenerateOffsetTable(); - private static ushort[] baseTable = GenerateBaseTable(); - private static sbyte[] shiftTable = GenerateShiftTable(); - - // Transforms the subnormal representation to a normalized one. - private static uint ConvertMantissa(int i) - { - uint m = (uint)(i << 13); // Zero pad mantissa bits - uint e = 0; // Zero exponent - - // While not normalized - while ((m & 0x00800000) == 0) - { - e -= 0x00800000; // Decrement exponent (1<<23) - m <<= 1; // Shift mantissa - } - m &= unchecked((uint)~0x00800000); // Clear leading 1 bit - e += 0x38800000; // Adjust bias ((127-14)<<23) - return m | e; // Return combined number - } - - private static uint[] GenerateMantissaTable() - { - uint[] mantissaTable = new uint[2048]; - mantissaTable[0] = 0; - for (int i = 1; i < 1024; i++) - { - mantissaTable[i] = ConvertMantissa(i); - } - for (int i = 1024; i < 2048; i++) - { - mantissaTable[i] = (uint)(0x38000000 + ((i - 1024) << 13)); - } - - return mantissaTable; - } - private static uint[] GenerateExponentTable() - { - uint[] exponentTable = new uint[64]; - exponentTable[0] = 0; - for (int i = 1; i < 31; i++) - { - exponentTable[i] = (uint)(i << 23); - } - exponentTable[31] = 0x47800000; - exponentTable[32] = 0x80000000; - for (int i = 33; i < 63; i++) - { - exponentTable[i] = (uint)(0x80000000 + ((i - 32) << 23)); - } - exponentTable[63] = 0xc7800000; - - return exponentTable; - } - private static ushort[] GenerateOffsetTable() - { - ushort[] offsetTable = new ushort[64]; - offsetTable[0] = 0; - for (int i = 1; i < 32; i++) - { - offsetTable[i] = 1024; - } - offsetTable[32] = 0; - for (int i = 33; i < 64; i++) - { - offsetTable[i] = 1024; - } - - return offsetTable; - } - private static ushort[] GenerateBaseTable() - { - ushort[] baseTable = new ushort[512]; - for (int i = 0; i < 256; ++i) - { - sbyte e = (sbyte)(127 - i); - if (e > 24) - { // Very small numbers map to zero - baseTable[i | 0x000] = 0x0000; - baseTable[i | 0x100] = 0x8000; - } - else if (e > 14) - { // Small numbers map to denorms - baseTable[i | 0x000] = (ushort)(0x0400 >> (18 + e)); - baseTable[i | 0x100] = (ushort)((0x0400 >> (18 + e)) | 0x8000); - } - else if (e >= -15) - { // Normal numbers just lose precision - baseTable[i | 0x000] = (ushort)((15 - e) << 10); - baseTable[i | 0x100] = (ushort)(((15 - e) << 10) | 0x8000); - } - else if (e > -128) - { // Large numbers map to Infinity - baseTable[i | 0x000] = 0x7c00; - baseTable[i | 0x100] = 0xfc00; - } - else - { // Infinity and NaN's stay Infinity and NaN's - baseTable[i | 0x000] = 0x7c00; - baseTable[i | 0x100] = 0xfc00; - } - } - - return baseTable; - } - private static sbyte[] GenerateShiftTable() - { - sbyte[] shiftTable = new sbyte[512]; - for (int i = 0; i < 256; ++i) - { - sbyte e = (sbyte)(127 - i); - if (e > 24) - { // Very small numbers map to zero - shiftTable[i | 0x000] = 24; - shiftTable[i | 0x100] = 24; - } - else if (e > 14) - { // Small numbers map to denorms - shiftTable[i | 0x000] = (sbyte)(e - 1); - shiftTable[i | 0x100] = (sbyte)(e - 1); - } - else if (e >= -15) - { // Normal numbers just lose precision - shiftTable[i | 0x000] = 13; - shiftTable[i | 0x100] = 13; - } - else if (e > -128) - { // Large numbers map to Infinity - shiftTable[i | 0x000] = 24; - shiftTable[i | 0x100] = 24; - } - else - { // Infinity and NaN's stay Infinity and NaN's - shiftTable[i | 0x000] = 13; - shiftTable[i | 0x100] = 13; - } - } - - return shiftTable; - } - - public static unsafe float HalfToSingle(Half half) - { - uint result = mantissaTable[offsetTable[half.value >> 10] + (half.value & 0x3ff)] + exponentTable[half.value >> 10]; - return *((float*)&result); - } - public static unsafe Half SingleToHalf(float single) - { - uint value = *((uint*)&single); - - ushort result = (ushort)(baseTable[(value >> 23) & 0x1ff] + ((value & 0x007fffff) >> shiftTable[value >> 23])); - return Half.ToHalf(result); - } - - public static Half Negate(Half half) - { - return Half.ToHalf((ushort)(half.value ^ 0x8000)); - } - public static Half Abs(Half half) - { - return Half.ToHalf((ushort)(half.value & 0x7fff)); - } - - public static bool IsNaN(Half half) - { - return ((half.value & 0x7fff) > 0x7c00); - } - public static bool IsInfinity(Half half) - { - return ((half.value & 0x7fff) == 0x7c00); - } - public static bool IsPositiveInfinity(Half half) - { - return (half.value == 0x7c00); - } - public static bool IsNegativeInfinity(Half half) - { - return (half.value == 0xfc00); - } - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Quad.cs b/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Quad.cs deleted file mode 100644 index 3ad3aa8b0f..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/DataFormats/Quad.cs +++ /dev/null @@ -1,1744 +0,0 @@ -/* - Copyright (c) 2011 Jeff Pasternack. All rights reserved. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Text; - -namespace System -{ - /// - /// Quad is a signed 128-bit floating point number, stored internally as a 64-bit significand (with the most significant bit as the sign bit) and - /// a 64-bit signed exponent, with a value == significand * 2^exponent. Quads have both a higher precision (64 vs. 53 effective significand bits) - /// and a much higher range (64 vs. 11 exponent bits) than doubles. Most operations are unchecked and undefined in the event of overflow. - /// - /// - /// - /// Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved - /// and constitute overflow. 0 is defined by significand bits == 0 and an exponent of long.MinValue. - /// - /// - /// Quad multiplication and division operators are slightly imprecise for the sake of efficiency; specifically, - /// they may assign the wrong least significant bit, such that the precision is effectively only 63 bits rather than 64. - /// - /// - /// Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved, primarily because this allows slightly faster arithmetic operations - /// by removing the need for overflow checking in certain places. Quads with these exponents will have undefined behavior. - /// - /// - /// For speed, consider using instance methods (like Multiply and Add) rather - /// than the operators (like * and +) when possible, as the former are significantly faster (by as much as 50%). - /// - /// - [System.Diagnostics.DebuggerDisplay("{ToString(),nq}")] //this attributes makes the debugger display the value without braces or quotes - public struct Quad - { - #region Public constants - public static readonly Quad Zero = new Quad(0UL, long.MinValue); //there is only one zero; all other significands with exponent long.MinValue are invalid. - public static readonly Quad One = (Quad)1UL; //used for increment/decrement operators - #endregion - - #region Public fields - /// - /// The first (most significant) bit of the significand is the sign bit; 0 for positive values, 1 for negative. - /// The remainder of the bits represent the fractional part (after the binary point) of the significant; there is always an implicit "1" - /// preceding the binary point, just as in IEEE's double specification, except for 0 (defined by an exponent of long.MinValue and significand bits == 0). - /// - public ulong SignificandBits; - - /// - /// The value of the Quad == 1.[last 63 bits of significand] * 2^exponent, except where the exponent is long.MinValue, - /// which (in conjunction with SignificandBits == 0) denotes 0. Exponents >= long.MaxValue - 64 and exponents <= long.MinValue + 64 are reserved. - /// - /// - public long Exponent; - #endregion - - #region Constructors - /// - /// Creates a new Quad with the given significand bits and exponent. The significand has a first (most significant) bit - /// corresponding to the quad's sign (1 for positive, 0 for negative), and the rest of the bits correspond to the fractional - /// part of the significand value (immediately after the binary point). A "1" before the binary point is always implied. - /// - /// - /// - public Quad(ulong significandBits, long exponent) - { - this.SignificandBits = significandBits; - this.Exponent = exponent; - } - - /// - /// Creates a new Quad with the given significand value and exponent. - /// - /// - /// - public Quad(long significand, long exponent) - { - if (significand == 0) //handle 0 - { - SignificandBits = 0; - Exponent = long.MinValue; - return; - } - - if (significand < 0) - { - if (significand == long.MinValue) //corner case - { - SignificandBits = highestBit; - Exponent = 0; - return; - } - - significand = -significand; - SignificandBits = highestBit; - } - else - SignificandBits = 0; - - int shift = nlz((ulong)significand); //we must normalize the value such that the most significant bit is 1 - this.SignificandBits |= ~highestBit & (((ulong)significand) << shift); //mask out the highest bit--it's implicit - this.Exponent = exponent - shift; - } - #endregion - - #region Helper functions and constants - private const double base2to10Multiplier = 0.30102999566398119521373889472449; //Math.Log(2) / Math.Log(10); - private const ulong highestBit = 1UL << 63; - private const ulong secondHighestBit = 1UL << 62; - private const ulong lowWordMask = 0xffffffff; //lower 32 bits - private const ulong highWordMask = 0xffffffff00000000; //upper 32 bits - - private const ulong b = 4294967296; // Number base (32 bits). - - private static readonly Quad e19 = (Quad)10000000000000000000UL; - private static readonly Quad e10 = (Quad)10000000000UL; - private static readonly Quad e5 = (Quad)100000UL; - private static readonly Quad e3 = (Quad)1000UL; - private static readonly Quad e1 = (Quad)10UL; - - private static readonly Quad en19 = One / e19; - private static readonly Quad en10 = One / e10; - private static readonly Quad en5 = One / e5; - private static readonly Quad en3 = One / e3; - private static readonly Quad en1 = One / e1; - - private static readonly Quad en18 = One /(Quad)1000000000000000000UL; - private static readonly Quad en9 = One / (Quad)1000000000UL; - private static readonly Quad en4 = One / (Quad)10000UL; - private static readonly Quad en2 = One / (Quad)100UL; - - - /// - /// Returns the position of the highest set bit, counting from the most significant bit position (position 0). - /// Returns 64 if no bit is set. - /// - /// - /// - private static int nlz(ulong x) - { - //Future work: might be faster with a huge, explicit nested if tree, or use of an 256-element per-byte array. - - int n; - - if (x == 0) return (64); - n = 0; - if (x <= 0x00000000FFFFFFFF) { n = n + 32; x = x << 32; } - if (x <= 0x0000FFFFFFFFFFFF) { n = n + 16; x = x << 16; } - if (x <= 0x00FFFFFFFFFFFFFF) { n = n + 8; x = x << 8; } - if (x <= 0x0FFFFFFFFFFFFFFF) { n = n + 4; x = x << 4; } - if (x <= 0x3FFFFFFFFFFFFFFF) { n = n + 2; x = x << 2; } - if (x <= 0x7FFFFFFFFFFFFFFF) { n = n + 1; } - return n; - } - - #endregion - - #region Struct-modifying instance arithmetic functions - - public unsafe void Multiply(double multiplier) - { - #region Parse the double - ulong bits = *((ulong*)&multiplier); - long multiplierExponent = (((long)bits >> 52) & 0x7ffL); - - if (multiplierExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong multiplierSignificand = (bits) & 0xfffffffffffffUL; - - if (multiplierExponent == 0) - { - if (multiplierSignificand == 0) - { - //multiplication by 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - return; - } - - int firstSetPosition = nlz(multiplierSignificand); - multiplierSignificand = (highestBit & bits) | (multiplierSignificand << firstSetPosition); - multiplierExponent -= firstSetPosition - 1 + 1075; - } - else - { - multiplierSignificand = (highestBit & bits) | (multiplierSignificand << 11); - multiplierExponent -= 11 + 1075; - } - #endregion - - #region Multiply - - ulong high1 = (this.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (multiplierSignificand | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((this.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (multiplierSignificand & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - if (this.Exponent == long.MinValue) - return; //we're already 0 - - this.SignificandBits = ((this.SignificandBits ^ multiplierSignificand) & highestBit) | ((significandBits << 1) & ~highestBit); - this.Exponent = this.Exponent + multiplierExponent - 1 + 64; - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplierSignificand) & highestBit) | (significandBits & ~highestBit); - this.Exponent = this.Exponent + multiplierExponent + 64; - } - #endregion - } - - public void Multiply(Quad multiplier) - { - - ulong high1 = (this.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (multiplier.SignificandBits | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((this.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (multiplier.SignificandBits & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - //Checking for zeros here is significantly faster (~15%) on my machine than at the beginning, - //because this branch is rarely taken. This is acceptable because a zero will have a significand of 0, - //and thus (when the significant bit is erroneously OR'd to it) multiplying by that zero cannot yield a value - //of significandBits greater than or equal to 1 << 63. - if (this.Exponent == long.MinValue || multiplier.Exponent == long.MinValue) - { - this.Exponent = long.MinValue; - this.SignificandBits = 0; - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplier.SignificandBits) & highestBit) | ((significandBits << 1) & ~highestBit); - this.Exponent = this.Exponent + multiplier.Exponent - 1 + 64; - } - - } - else - { - this.SignificandBits = ((this.SignificandBits ^ multiplier.SignificandBits) & highestBit) | (significandBits & ~highestBit); - this.Exponent = this.Exponent + multiplier.Exponent + 64; - } - - #region Multiply with reduced branching (slightly faster?) - //zeros - ////if (this.Exponent == long.MinValue)// || multiplier.Exponent == long.MinValue) - ////{ - //// this.Exponent = long.MinValue; - //// this.Significand = 0; - //// return; - ////} - - //ulong high1 = (this.Significand | highestBit ) >> 32; //de-implicitize the 1 - //ulong high2 = (multiplier.Significand | highestBit) >> 32; - - ////because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - //ulong significandBits = high1 * high2 + (((this.Significand & lowWordMask) * high2) >> 32) + ((high1 * (multiplier.Significand & lowWordMask)) >> 32); - - //if (significandBits < (1UL << 63)) //first bit clear? - //{ - // long zeroMask = ((this.Exponent ^ -this.Exponent) & (multiplier.Exponent ^ -multiplier.Exponent)) >> 63; - // this.Significand = (ulong)zeroMask & ((this.Significand ^ multiplier.Significand) & highestBit) | ((significandBits << 1) & ~highestBit); - // this.Exponent = (zeroMask & (this.Exponent + multiplier.Exponent - 1 + 64)) | (~zeroMask & long.MinValue); - //} - //else - //{ - // this.Significand = ((this.Significand ^ multiplier.Significand) & highestBit) | (significandBits & ~highestBit); - // this.Exponent = this.Exponent + multiplier.Exponent + 64; - //} - - ////long zeroMask = ((isZeroBit1 >> 63) & (isZeroBit2 >> 63)); - ////this.Significand = (ulong)zeroMask & ((this.Significand ^ multiplier.Significand) & highestBit) | ((significandBits << (int)(1 ^ (significandBits >> 63))) & ~highestBit); - ////this.Exponent = (zeroMask & (this.Exponent + multiplier.Exponent - 1 + 64 + (long)(significandBits >> 63))) | (~zeroMask & long.MinValue); - - #endregion - } - - public unsafe void Add(double value) - { - #region Parse the double - ulong doubleBits = *((ulong*)&value); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //addition with 0 - return; - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Addition - - if ((this.SignificandBits ^ valueSignificand) >= highestBit) //this and value have different signs--use subtraction instead - { - Subtract(new Quad(valueSignificand ^ highestBit, valueExponent)); - return; - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (this.Exponent > valueExponent) - { - if (this.Exponent >= valueExponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) + ((valueSignificand | highestBit) >> (int)(this.Exponent - valueExponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = this.Exponent + 1; - } - else - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits & ~highestBit); - //this.Exponent = this.Exponent; //exponent stays the same - } - } - } - else if (this.Exponent < valueExponent) - { - if (valueExponent >= this.Exponent + 64) - { - this.SignificandBits = valueSignificand; //too small to matter - this.Exponent = valueExponent; - } - else - { - ulong bits = (valueSignificand | highestBit) + ((this.SignificandBits | highestBit) >> (int)(valueExponent - this.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (valueSignificand & highestBit) | (bits >> 1); - this.Exponent = valueExponent + 1; - } - else - { - this.SignificandBits = (valueSignificand & highestBit) | (bits & ~highestBit); - this.Exponent = valueExponent; - } - } - } - else //expDiff == 0 - { - if (this.Exponent == long.MinValue) //verify that we're not adding two 0's - return; //we are already 0, so just return - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - this.SignificandBits = ((this.SignificandBits + valueSignificand) >> 1) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent + 1; - } - - #endregion - } - - public void Add(Quad value) - { - #region Addition - - if ((this.SignificandBits ^ value.SignificandBits) >= highestBit) //this and value have different signs--use subtraction instead - { - Subtract(new Quad(value.SignificandBits ^ highestBit, value.Exponent)); - return; - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (this.Exponent > value.Exponent) - { - if (this.Exponent >= value.Exponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) + ((value.SignificandBits | highestBit) >> (int)(this.Exponent - value.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = this.Exponent + 1; - } - else - { - this.SignificandBits = (this.SignificandBits & highestBit) | (bits & ~highestBit); - //this.Exponent = this.Exponent; //exponent stays the same - } - } - } - else if (this.Exponent < value.Exponent) - { - if (value.Exponent >= this.Exponent + 64) - { - this.SignificandBits = value.SignificandBits; //too small to matter - this.Exponent = value.Exponent; - } - else - { - ulong bits = (value.SignificandBits | highestBit) + ((this.SignificandBits | highestBit) >> (int)(value.Exponent - this.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - { - this.SignificandBits = (value.SignificandBits & highestBit) | (bits >> 1); - this.Exponent = value.Exponent + 1; - } - else - { - this.SignificandBits = (value.SignificandBits & highestBit) | (bits & ~highestBit); - this.Exponent = value.Exponent; - } - } - } - else //expDiff == 0 - { - if (this.Exponent == long.MinValue) //verify that we're not adding two 0's - return; //we are already 0, so just return - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - this.SignificandBits = ((this.SignificandBits + value.SignificandBits) >> 1) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent + 1; - } - - #endregion - } - - public unsafe void Subtract(double value) - { - #region Parse the double - ulong doubleBits = *((ulong*)&value); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //subtraction by 0 - return; - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Subtraction - if ((this.SignificandBits ^ valueSignificand) >= highestBit) //this and value have different signs--use addition instead - { - this.Add(new Quad(valueSignificand ^ highestBit, valueExponent)); - return; - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (this.Exponent > valueExponent) - { - if (this.Exponent >= valueExponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) - ((valueSignificand | highestBit) >> (int)(this.Exponent - valueExponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - } - else if (this.Exponent < valueExponent) //must subtract our significand from value, and switch the sign - { - if (valueExponent >= this.Exponent + 64) - { - this.SignificandBits = valueSignificand ^ highestBit; - this.Exponent = valueExponent; - return; - } - - ulong bits = (valueSignificand | highestBit) - ((this.SignificandBits | highestBit) >> (int)(valueExponent - this.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~valueSignificand & highestBit); - this.Exponent = valueExponent - highestBitPos; - } - else // (this.Exponent == valueExponent) - { - if (valueSignificand > this.SignificandBits) //must switch sign - { - ulong bits = valueSignificand - this.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~valueSignificand & highestBit); - this.Exponent = valueExponent - highestBitPos; - } - else if (valueSignificand < this.SignificandBits) //sign remains the same - { - ulong bits = this.SignificandBits - valueSignificand; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - else //this == value - { - //result is 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - } - } - #endregion - } - - public void Subtract(Quad value) - { - #region Subtraction - if ((this.SignificandBits ^ value.SignificandBits) >= highestBit) //this and value have different signs--use addition instead - { - this.Add(new Quad(value.SignificandBits ^ highestBit, value.Exponent)); - return; - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (this.Exponent > value.Exponent) - { - if (this.Exponent >= value.Exponent + 64) - return; //value too small to make a difference - else - { - ulong bits = (this.SignificandBits | highestBit) - ((value.SignificandBits | highestBit) >> (int)(this.Exponent - value.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - } - else if (this.Exponent < value.Exponent) //must subtract our significand from value, and switch the sign - { - if (value.Exponent >= this.Exponent + 64) - { - this.SignificandBits = value.SignificandBits ^ highestBit; - this.Exponent = value.Exponent; - return; - } - - ulong bits = (value.SignificandBits | highestBit) - ((this.SignificandBits | highestBit) >> (int)(value.Exponent - this.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~value.SignificandBits & highestBit); - this.Exponent = value.Exponent - highestBitPos; - } - else // (this.Exponent == value.Exponent) - { - if (value.SignificandBits > this.SignificandBits) //must switch sign - { - ulong bits = value.SignificandBits - this.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (~value.SignificandBits & highestBit); - this.Exponent = value.Exponent - highestBitPos; - } - else if (value.SignificandBits < this.SignificandBits) //sign remains the same - { - ulong bits = this.SignificandBits - value.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - this.SignificandBits = ((bits << highestBitPos) & ~highestBit) | (this.SignificandBits & highestBit); - this.Exponent = this.Exponent - highestBitPos; - } - else //this == value - { - //result is 0 - this.SignificandBits = 0; - this.Exponent = long.MinValue; - } - } - #endregion - } - - public unsafe void Divide(double divisor) - { - #region Parse the double - ulong doubleBits = *((ulong*)&divisor); - long valueExponent = (((long)doubleBits >> 52) & 0x7ffL); - - if (valueExponent == 0x7ffL) - throw new ArgumentOutOfRangeException("Cannot cast NaN or infinity to Quad"); - - ulong valueSignificand = (doubleBits) & 0xfffffffffffffUL; - - if (valueExponent == 0) - { - if (valueSignificand == 0) - { - //division by 0 - throw new DivideByZeroException(); - } - - int firstSetPosition = nlz(valueSignificand); - valueSignificand = (highestBit & doubleBits) | (valueSignificand << firstSetPosition); - valueExponent -= firstSetPosition - 1 + 1075; - } - else - { - valueSignificand = (highestBit & doubleBits) | (valueSignificand << 11); - valueExponent -= 11 + 1075; - } - #endregion - - #region Division - if (this.Exponent == long.MinValue) //0 / non-zero == 0 - return; //we're already 0 - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - //result.Significand = highestBit & (this.Significand ^ valueSignificand); //determine the sign bit - - //this.Significand |= highestBit; //de-implicitize the 1 before the binary point - //valueSignificand |= highestBit; - - long adjExponent = 0; - ulong thisAdjSignificand = this.SignificandBits | highestBit; - ulong divisorAdjSignificand = valueSignificand | highestBit; - - if (thisAdjSignificand >= divisorAdjSignificand) - { - //need to make this's significand smaller than divisor's - adjExponent = 1; - un1 = (this.SignificandBits & 1) << 31; - thisAdjSignificand = thisAdjSignificand >> 1; - } - - vn1 = divisorAdjSignificand >> 32; // Break divisor up into - vn0 = valueSignificand & 0xFFFFFFFF; // two 32-bit digits. - - q1 = thisAdjSignificand / vn1; // Compute the first - rhat = thisAdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = thisAdjSignificand * b + un1 - q1 * divisorAdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - thisAdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (this.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (thisAdjSignificand < (1UL << 63)) - { - this.SignificandBits = (~highestBit & (thisAdjSignificand << 1)) | ((this.SignificandBits ^ valueSignificand) & highestBit); - this.Exponent = this.Exponent - (valueExponent + 64) - 1 + adjExponent; - } - else - { - this.SignificandBits = (~highestBit & thisAdjSignificand) | ((this.SignificandBits ^ valueSignificand) & highestBit); - this.Exponent = this.Exponent - (valueExponent + 64) + adjExponent; - } - #endregion - } - - public void Divide(Quad divisor) - { - #region Division - if (divisor.Exponent == long.MinValue) // something / 0 - throw new DivideByZeroException(); - else if (this.Exponent == long.MinValue) //0 / non-zero == 0 - return; //we're already 0 - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - //result.Significand = highestBit & (this.Significand ^ divisor.Significand); //determine the sign bit - - //this.Significand |= highestBit; //de-implicitize the 1 before the binary point - //divisor.Significand |= highestBit; - - long adjExponent = 0; - ulong thisAdjSignificand = this.SignificandBits | highestBit; - ulong divisorAdjSignificand = divisor.SignificandBits | highestBit; - - if (thisAdjSignificand >= divisorAdjSignificand) - { - //need to make this's significand smaller than divisor's - adjExponent = 1; - un1 = (this.SignificandBits & 1) << 31; - thisAdjSignificand = thisAdjSignificand >> 1; - } - - vn1 = divisorAdjSignificand >> 32; // Break divisor up into - vn0 = divisor.SignificandBits & 0xFFFFFFFF; // two 32-bit digits. - - q1 = thisAdjSignificand / vn1; // Compute the first - rhat = thisAdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = thisAdjSignificand * b + un1 - q1 * divisorAdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - thisAdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (this.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (thisAdjSignificand < (1UL << 63)) - { - this.SignificandBits = (~highestBit & (thisAdjSignificand << 1)) | ((this.SignificandBits ^ divisor.SignificandBits) & highestBit); - this.Exponent = this.Exponent - (divisor.Exponent + 64) - 1 + adjExponent; - } - else - { - this.SignificandBits = (~highestBit & thisAdjSignificand) | ((this.SignificandBits ^ divisor.SignificandBits) & highestBit); - this.Exponent = this.Exponent - (divisor.Exponent + 64) + adjExponent; - } - #endregion - } - - #endregion - - #region Operators - /// - /// Efficiently multiplies the Quad by 2^shift. - /// - /// - /// - /// - public static Quad operator <<(Quad qd, int shift) - { - if (qd.Exponent==long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits,qd.Exponent + shift); - } - - /// - /// Efficiently divides the Quad by 2^shift. - /// - /// - /// - /// - public static Quad operator >>(Quad qd, int shift) - { - if (qd.Exponent==long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits,qd.Exponent - shift); - } - - /// - /// Efficiently multiplies the Quad by 2^shift. - /// - /// - /// - /// - public static Quad LeftShift(Quad qd, long shift) - { - if (qd.Exponent == long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits, qd.Exponent + shift); - } - - /// - /// Efficiently divides the Quad by 2^shift. - /// - /// - /// - /// - public static Quad RightShift(Quad qd, long shift) - { - if (qd.Exponent == long.MinValue) - return Zero; - else - return new Quad(qd.SignificandBits, qd.Exponent - shift); - } - - /// - /// Divides one Quad by another and returns the result - /// - /// - /// - /// - /// - /// This code is a heavily modified derivation of a division routine given by http://www.hackersdelight.org/HDcode/divlu.c.txt , - /// which has a very liberal (public domain-like) license attached: http://www.hackersdelight.org/permissions.htm - /// - public static Quad operator /(Quad qd1, Quad qd2) - { - - if (qd2.Exponent == long.MinValue) - throw new DivideByZeroException(); - else if (qd1.Exponent == long.MinValue) - return Zero; - - ulong un1 = 0, // Norm. dividend LSD's. - vn1, vn0, // Norm. divisor digits. - q1, q0, // Quotient digits. - un21,// Dividend digit pairs. - rhat; // A remainder. - - long adjExponent=0; - ulong qd1AdjSignificand = qd1.SignificandBits | highestBit; //de-implicitize the 1 before the binary point - ulong qd2AdjSignificand = qd2.SignificandBits | highestBit; //de-implicitize the 1 before the binary point - - if (qd1AdjSignificand >= qd2AdjSignificand) - { - // need to make qd1's significand smaller than qd2's - // If we were faithful to the original code this method derives from, - // we would branch on qd1AdjSignificand > qd2AdjSignificand instead. - // However, this results in undesirable results like (in binary) 11/11 = 0.11111..., - // where the result should be 1.0. Thus, we branch on >=, which prevents this problem. - adjExponent = 1; - un1 = (qd1.SignificandBits & 1) << 31; - qd1AdjSignificand = qd1AdjSignificand >> 1; - } - - vn1 = qd2AdjSignificand >> 32; // Break divisor up into - vn0 = qd2.SignificandBits & 0xFFFFFFFF; // two 32-bit digits. - - q1 = qd1AdjSignificand / vn1; // Compute the first - rhat = qd1AdjSignificand - q1 * vn1; // quotient digit, q1. - again1: - if (q1 >= b || q1 * vn0 > b * rhat + un1) - { - q1 = q1 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again1; - } - - un21 = qd1AdjSignificand * b + un1 - q1 * qd2AdjSignificand; // Multiply and subtract. - - q0 = un21 / vn1; // Compute the second - rhat = un21 - q0 * vn1; // quotient digit, q0. - again2: - if (q0 >= b || q0 * vn0 > b * rhat) - { - q0 = q0 - 1; - rhat = rhat + vn1; - if (rhat < b) goto again2; - } - - qd1AdjSignificand = q1 * b + q0; //convenient place to store intermediate result - - //if (qd1.Significand == 0) //the final significand should never be 0 - // result.Exponent = 0; - //else - - if (qd1AdjSignificand < (1UL << 63)) - return new Quad((~highestBit & (qd1AdjSignificand << 1)) | ((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit), - qd1.Exponent - (qd2.Exponent + 64) - 1 + adjExponent); - else - return new Quad((~highestBit & qd1AdjSignificand) | ((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit), - qd1.Exponent - (qd2.Exponent + 64) + adjExponent); - } - - public static Quad operator %(Quad qd1, Quad qd2) - { - return qd1 - (qd2 * Truncate(qd1 / qd2)); - } - - public static Quad operator -(Quad qd) - { - //qd.Exponent ^ -qd.Exponent == has the MSB set iff qdExponent = long.MinValue; - //this allows us to handle 0's (which should never get a sign bit) without branching - return new Quad(qd.SignificandBits ^ (highestBit & (ulong)(qd.Exponent ^ -qd.Exponent)), qd.Exponent); - } - - public static Quad operator +(Quad qd1, Quad qd2) - { - if ((qd1.SignificandBits ^ qd2.SignificandBits) >= highestBit) //qd1 and qd2 have different signs--use subtraction instead - { - return qd1 - new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); - } - - //note on zeros: adding 0 results in a nop because the exponent is 64 less than any valid exponent. - - if (qd1.Exponent > qd2.Exponent) - { - if (qd1.Exponent >= qd2.Exponent + 64) - return qd1; //qd2 too small to make a difference - else - { - ulong bits = (qd1.SignificandBits | highestBit) + ((qd2.SignificandBits | highestBit) >> (int)(qd1.Exponent - qd2.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - return new Quad((qd1.SignificandBits & highestBit) | (bits >> 1), qd1.Exponent + 1); - else - return new Quad((qd1.SignificandBits & highestBit) | (bits & ~highestBit), qd1.Exponent); - } - } - else if (qd1.Exponent < qd2.Exponent) - { - if (qd2.Exponent >= qd1.Exponent + 64) - return qd2; //qd1 too small to matter - else - { - ulong bits = (qd2.SignificandBits | highestBit) + ((qd1.SignificandBits | highestBit) >> (int)(qd2.Exponent - qd1.Exponent)); - - if (bits < highestBit) //this can only happen in an overflow - return new Quad((qd2.SignificandBits & highestBit) | (bits >> 1), qd2.Exponent + 1); - else - return new Quad((qd2.SignificandBits & highestBit) | (bits & ~highestBit), qd2.Exponent); - } - } - else //expDiff == 0 - { - if (qd1.Exponent == long.MinValue) //verify that we're not adding two 0's - return Zero; //we are, return 0 - - //ulong bits = (qd1.Significand | highestBit) + (qd2.Significand | highestBit); - - //the MSB must have the same sign, so the MSB will become 0, and logical overflow is guaranteed in this situation (so we can shift right and increment the exponent). - return new Quad(((qd1.SignificandBits + qd2.SignificandBits) >> 1) | (qd1.SignificandBits & highestBit), qd1.Exponent + 1); - } - } - - public static Quad operator -(Quad qd1, Quad qd2) - { - if ((qd1.SignificandBits ^ qd2.SignificandBits) >= highestBit) //qd1 and qd2 have different signs--use addition instead - { - return qd1 + new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); - } - - //as in addition, we handle 0's implicitly--they will have an exponent at least 64 less than any valid non-zero value. - - if (qd1.Exponent > qd2.Exponent) - { - if (qd1.Exponent >= qd2.Exponent + 64) - return qd1; //qd2 too small to make a difference - else - { - ulong bits = (qd1.SignificandBits|highestBit) - ( (qd2.SignificandBits|highestBit) >> (int)(qd1.Exponent - qd2.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (qd1.SignificandBits & highestBit), qd1.Exponent - highestBitPos); - } - } - else if (qd1.Exponent < qd2.Exponent) //must subtract qd1's significand from qd2, and switch the sign - { - if (qd2.Exponent >= qd1.Exponent + 64) - return new Quad(qd2.SignificandBits ^ highestBit, qd2.Exponent); //qd1 too small to matter, switch sign of qd2 and return - - ulong bits = (qd2.SignificandBits | highestBit) - ((qd1.SignificandBits | highestBit) >> (int)(qd2.Exponent - qd1.Exponent)); - - //make sure MSB is 1 - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (~qd2.SignificandBits & highestBit), qd2.Exponent - highestBitPos); - } - else // (qd1.Exponent == qd2.Exponent) - { - if (qd2.SignificandBits > qd1.SignificandBits) //must switch sign - { - ulong bits = qd2.SignificandBits - qd1.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (~qd2.SignificandBits & highestBit), qd2.Exponent - highestBitPos); - } - else if (qd2.SignificandBits < qd1.SignificandBits) //sign remains the same - { - ulong bits = qd1.SignificandBits - qd2.SignificandBits; //notice that we don't worry about de-implicitizing the MSB--it'd be eliminated by subtraction anyway - int highestBitPos = nlz(bits); - return new Quad(((bits << highestBitPos) & ~highestBit) | (qd1.SignificandBits & highestBit), qd1.Exponent - highestBitPos); - } - else //qd1 == qd2 - return Zero; - } - - } - - public static Quad operator *(Quad qd1, Quad qd2) - { - ulong high1 = (qd1.SignificandBits | highestBit) >> 32; //de-implicitize the 1 - ulong high2 = (qd2.SignificandBits | highestBit) >> 32; - - //because the MSB of both significands is 1, the MSB of the result will also be 1, and the product of low bits on both significands is dropped (and thus we can skip its calculation) - ulong significandBits = high1 * high2 + (((qd1.SignificandBits & lowWordMask) * high2) >> 32) + ((high1 * (qd2.SignificandBits & lowWordMask)) >> 32); - - if (significandBits < (1UL << 63)) - { - //zeros - if (qd1.Exponent == long.MinValue || qd2.Exponent == long.MinValue) - return Zero; - else - return new Quad(((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit) | ((significandBits << 1) & ~highestBit), qd1.Exponent + qd2.Exponent - 1 + 64); - } - else - return new Quad(((qd1.SignificandBits ^ qd2.SignificandBits) & highestBit) | (significandBits & ~highestBit), qd1.Exponent + qd2.Exponent + 64); - } - - public static Quad operator ++(Quad qd) - { - return qd + One; - } - - public static Quad operator --(Quad qd) - { - return qd - One; - } - - #endregion - - #region Comparison - - public static bool operator ==(Quad qd1, Quad qd2) - { - return (qd1.SignificandBits == qd2.SignificandBits && qd1.Exponent == qd2.Exponent);// || (qd1.Exponent == long.MinValue && qd2.Exponent == long.MinValue); - } - - public static bool operator !=(Quad qd1, Quad qd2) - { - return (qd1.SignificandBits != qd2.SignificandBits || qd1.Exponent != qd2.Exponent);// && (qd1.Exponent != long.MinValue || qd2.Exponent != long.MinValue); - } - - public static bool operator >(Quad qd1, Quad qd2) - { - //There is probably a faster way to accomplish this by cleverly exploiting signed longs - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return false; - case secondHighestBit: //qd1 positive, qd2 negative - return true; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits < qd2.SignificandBits); - default: //both positive - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits > qd2.SignificandBits); - } - } - - public static bool operator <(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return true; - case secondHighestBit: //qd1 positive, qd2 negative - return false; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits > qd2.SignificandBits); - default: //both positive - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits < qd2.SignificandBits); - } - - } - - public static bool operator >=(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return false; - case secondHighestBit: //qd1 positive, qd2 negative - return true; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits <= qd2.SignificandBits); - default: //both positive - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits >= qd2.SignificandBits); - } - } - - public static bool operator <=(Quad qd1, Quad qd2) - { - switch ((qd1.SignificandBits & highestBit) | ((qd2.SignificandBits & highestBit) >> 1)) - { - case highestBit: //qd1 is negative, qd2 positive - return true; - case secondHighestBit: //qd1 positive, qd2 negative - return false; - case highestBit | secondHighestBit: //both negative - return qd1.Exponent > qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits >= qd2.SignificandBits); - default: //both positive - return qd1.Exponent < qd2.Exponent || (qd1.Exponent == qd2.Exponent && qd1.SignificandBits <= qd2.SignificandBits); - } - } - - #endregion - - #region String parsing - - /// - /// Parses decimal number strings in the form of "1234.5678". Does not presently handle exponential/scientific notation. - /// - /// - /// - public static Quad Parse(string number) - { - //Can piggyback on BigInteger's parser for this, but this is inefficient. - //Smarter way is to break the numeric string into chunks and parse each of them using long's parse method, then combine. - - bool negative = number.StartsWith("-"); - if (negative) number = number.Substring(1); - - string left=number, right=null; - int decimalPoint = number.IndexOf('.'); - if (decimalPoint >= 0) - { - left = number.Substring(0,decimalPoint); - right = number.Substring(decimalPoint+1); - } - - System.Numerics.BigInteger leftInt = System.Numerics.BigInteger.Parse(left); - - Quad result = (Quad)leftInt; - if (right != null) - { - System.Numerics.BigInteger rightInt = System.Numerics.BigInteger.Parse(right); - Quad fractional = (Quad)rightInt; - - // we implicitly multiplied the stuff right of the decimal point by 10^(right.length) to get an integer; - // now we must reverse that and add this quantity to our results. - result += fractional * (Quad.Pow(new Quad(10L, 0), -right.Length)); - } - - return negative ? -result : result; - } - #endregion - - #region Math functions - - /// - /// Removes any fractional part of the provided value (rounding down for positive numbers, and rounding up for negative numbers) - /// - /// - /// - public static Quad Truncate(Quad value) - { - if (value.Exponent <= -64) return Zero; - else if (value.Exponent >= 0) return value; - else - { - //clear least significant "-value.exponent" bits that come after the binary point by shifting - return new Quad((value.SignificandBits >> (int)(-value.Exponent)) << (int)(-value.Exponent),value.Exponent); - } - } - - /// - /// Returns only the fractional part of the provided value. Equivalent to value % 1. - /// - /// - /// - public static Quad Fraction(Quad value) - { - if (value.Exponent >= 0) return Zero; //no fraction - else if (value.Exponent <= -64) return value; //all fraction (or zero) - else - { - //clear most significant 64+value.exponent bits before the binary point - ulong bits = (value.SignificandBits << (int)(64 + value.Exponent)) >> (int)(64 + value.Exponent); - if (bits == 0) return Zero; //value is an integer - - int shift = nlz(bits); //renormalize - - return new Quad((~highestBit & (bits << shift)) | (highestBit & value.SignificandBits), value.Exponent - shift); - } - } - - /// - /// Calculates the log (base 2) of a Quad. - /// - /// - /// - public static double Log2(Quad value) - { - if (value.SignificandBits >= highestBit) return double.NaN; - if (value.Exponent == long.MinValue) return double.NegativeInfinity; //Log(0) - - return Math.Log(value.SignificandBits | highestBit, 2) + value.Exponent; - } - - /// - /// Calculates the natural log (base e) of a Quad. - /// - /// - /// - public static double Log(Quad value) - { - if (value.SignificandBits >= highestBit) return double.NaN; - if (value.Exponent == long.MinValue) return double.NegativeInfinity; //Log(0) - - return Math.Log(value.SignificandBits | highestBit) + value.Exponent * 0.69314718055994530941723212145818; - } - - /// - /// Raise a Quad to a given exponent. Pow returns 1 for x^0 for all x >= 0. An exception is thrown - /// if 0 is raised to a negative exponent (implying division by 0), or if a negative value is raised - /// by a non-integer exponent (yielding an imaginary number). - /// - /// - /// - /// - /// Internally, Pow uses Math.Pow. This effectively limits the precision of the output to a double's 53 bits. - public static Quad Pow(Quad value, double exponent) - { - if (value.Exponent == long.MinValue) - { - if (exponent > 0) - return Zero; - else if (exponent == 0) - return One; - else - throw new ArgumentOutOfRangeException("Cannot raise 0 to a negative exponent, as this implies division by zero."); - } - - if (value.SignificandBits >= highestBit && exponent % 1 != 0) - throw new ArgumentOutOfRangeException("Cannot raise a negative number to a non-integer exponent, as this yields an imaginary number."); - - double resultSignificand = Math.Pow((double)new Quad(value.SignificandBits, -63), exponent); - double resultExponent = (value.Exponent + 63) * exponent; //exponents multiply - - resultSignificand *= Math.Pow(2, resultExponent % 1); //push the fractional exponent into the significand - - Quad result = (Quad)resultSignificand; - result.Exponent += (long)Math.Truncate(resultExponent); - - return result; - } - - public static Quad Max(Quad qd1, Quad qd2) - { - return qd1 > qd2 ? qd1 : qd2; - } - - public static Quad Min(Quad qd1, Quad qd2) - { - return qd1 < qd2 ? qd1 : qd2; - } - - public static Quad Abs(Quad qd) - { - return new Quad(qd.SignificandBits & ~highestBit, qd.Exponent); //clear the sign bit - } - #endregion - - #region Casts - public static explicit operator Quad(System.Numerics.BigInteger value) - { - bool positive = value.Sign >= 0; - if (!positive) - value = -value; //don't want 2's complement! - - if (value == System.Numerics.BigInteger.Zero) - return Zero; - - if (value <= ulong.MaxValue) //easy - { - ulong bits = (ulong)value; - int shift = nlz(bits); - return new Quad((bits << shift) & ~highestBit | (positive ? 0 : highestBit), -shift); - } - else //can only keep some of the bits - { - byte[] bytes = value.ToByteArray(); //least significant byte is first - - if (bytes[bytes.Length - 1] == 0) //appended when the MSB is set to differentiate from negative values - return new Quad((positive ? 0 : highestBit) | (~highestBit & ((ulong)bytes[bytes.Length - 2] << 56 | (ulong)bytes[bytes.Length - 3] << 48 | (ulong)bytes[bytes.Length - 4] << 40 | (ulong)bytes[bytes.Length - 5] << 32 | (ulong)bytes[bytes.Length - 6] << 24 | (ulong)bytes[bytes.Length - 7] << 16 | (ulong)bytes[bytes.Length - 8] << 8 | (ulong)bytes[bytes.Length - 9])), (bytes.Length - 9) * 8); - else //shift bits up - { - ulong bits = (ulong)bytes[bytes.Length - 1] << 56 | (ulong)bytes[bytes.Length - 2] << 48 | (ulong)bytes[bytes.Length - 3] << 40 | (ulong)bytes[bytes.Length - 4] << 32 | (ulong)bytes[bytes.Length - 5] << 24 | (ulong)bytes[bytes.Length - 6] << 16 | (ulong)bytes[bytes.Length - 7] << 8 | (ulong)bytes[bytes.Length - 8]; - int shift = nlz(bits); - bits = (bits << shift) | (((ulong)bytes[bytes.Length - 9]) >> (8 - shift)); - return new Quad((positive ? 0 : highestBit) | (~highestBit & bits), (bytes.Length - 8) * 8 - shift); - } - } - } - - public static explicit operator System.Numerics.BigInteger(Quad value) - { - if (value.Exponent <= -64) //fractional or zero - return System.Numerics.BigInteger.Zero; - - if (value.Exponent < 0) - { - if ( (value.SignificandBits & highestBit) == highestBit ) - return -new System.Numerics.BigInteger( (value.SignificandBits) >> ((int)-value.Exponent) ); - else - return new System.Numerics.BigInteger( (value.SignificandBits|highestBit) >> ((int)-value.Exponent) ); - } - - if (value.Exponent > int.MaxValue) //you can presumably get a BigInteger bigger than 2^int.MaxValue bits, but you probably don't want to (it'd be several hundred MB). - throw new InvalidCastException("BigIntegers do not permit left-shifts by more than int.MaxValue bits. Since the exponent of the quad is more than this, the conversion cannot be performed."); - - if ( (value.SignificandBits & highestBit) == highestBit ) //negative number? - return -(new System.Numerics.BigInteger(value.SignificandBits)<<(int)value.Exponent); - else - return (new System.Numerics.BigInteger(value.SignificandBits|highestBit) << (int)value.Exponent); - } - - public static explicit operator ulong(Quad value) - { - if (value.SignificandBits >= highestBit) throw new ArgumentOutOfRangeException("Cannot convert negative value to ulong"); - - if (value.Exponent > 0) - throw new InvalidCastException("Value too large to fit in 64-bit unsigned integer"); - - if (value.Exponent <= -64) return 0; - - return (highestBit | value.SignificandBits) >> (int)(-value.Exponent); - } - - public static explicit operator long(Quad value) - { - if (value.SignificandBits == highestBit && value.Exponent == 0) //corner case - return long.MinValue; - - if (value.Exponent >= 0) - throw new InvalidCastException("Value too large to fit in 64-bit signed integer"); - - if (value.Exponent <= -64) return 0; - - if (value.SignificandBits >= highestBit) //negative - return -(long)(value.SignificandBits >> (int)(-value.Exponent)); - else - return (long)( (value.SignificandBits|highestBit) >> (int)(-value.Exponent)); - } - - public static unsafe explicit operator double(Quad value) - { - if (value.Exponent == long.MinValue) return 0; - - if (value.Exponent <= -1086) - { - if (value.Exponent > -1086 - 52) //can create subnormal double value - { - ulong bits = (value.SignificandBits&highestBit) | ((value.SignificandBits|highestBit) >> (int)(-value.Exponent - 1086 + 12)); - return *((double*)&bits); - } - else - return 0; - } - else - { - - ulong bits = (ulong)(value.Exponent + 1086); - if (bits >= 0x7ffUL) return value.SignificandBits >= highestBit ? double.NegativeInfinity : double.PositiveInfinity; //too large - - bits = (value.SignificandBits&highestBit) | (bits << 52) | (value.SignificandBits & (~highestBit)) >> 11; - - return *((double*)&bits); - } - } - - /// - /// Converts a 64-bit unsigned integer into a Quad. No data can be lost, nor will any exception be thrown, by this cast; - /// however, it is marked explicit in order to avoid ambiguity with the implicit long-to-Quad cast operator. - /// - /// - /// - public static explicit operator Quad(ulong value) - { - if (value == 0) return Zero; - int firstSetPosition = nlz(value); - return new Quad( (value << firstSetPosition) & ~highestBit, -firstSetPosition); - } - - public static implicit operator Quad(long value) - { - return new Quad(value,0); - } - - public static unsafe explicit operator Quad(double value) - { - // Translate the double into sign, exponent and mantissa. - //long bits = BitConverter.DoubleToInt64Bits(value); //I suspect doing an unsafe pointer-conversion to get the bits would be faster - ulong bits = *((ulong*)&value); - - // Note that the shift is sign-extended, hence the test against -1 not 1 - long exponent = (((long)bits >> 52) & 0x7ffL); - - if (exponent == 0x7ffL) - throw new InvalidCastException("Cannot cast NaN or infinity to Quad"); - - ulong mantissa = (bits) & 0xfffffffffffffUL; - - // Subnormal numbers; exponent is effectively one higher, - // but there's no extra normalisation bit in the mantissa - if (exponent == 0) - { - if (mantissa == 0) return Zero; - exponent++; - - int firstSetPosition = nlz(mantissa); - mantissa <<= firstSetPosition; - exponent -= firstSetPosition; - } - else - { - mantissa = mantissa << 11; - exponent -= 11; - } - - exponent -= 1075; - - return new Quad( (highestBit&bits) | mantissa, exponent); - } - - #endregion - - #region ToString - /// - /// Returns this number as a decimal, or in scientific notation where a decimal would be excessively long. - /// Equivalent to ToString(QuadrupleFormat.ScientificApproximate). - /// - /// - public override string ToString() - { - return ToString(QuadrupleStringFormat.ScientificApproximate); - } - - /// - /// Obtains a string representation for this Quad according to the specified format. - /// - /// - /// - /// - /// ScientificExact returns the value in scientific notation as accurately as possible, but is still subject to imprecision due to the conversion from - /// binary to decimal and during the divisions or multiplications used in the conversion. It does not use rounding, which can lead to odd-looking outputs - /// that would otherwise be rounded by double.ToString() or the ScientificApproximate format (which uses double.ToString()). For example, 0.1 will be rendered - /// as the string "9.9999999999999999981e-2". - /// - public string ToString(QuadrupleStringFormat format) - { - if (Exponent == long.MinValue) return "0"; - - switch (format) - { - case QuadrupleStringFormat.HexExponential: - if (SignificandBits >= highestBit) - return "-" + SignificandBits.ToString("x") + "*2^" + (Exponent >= 0 ? Exponent.ToString("x") : "-" + (-Exponent).ToString("x")); - else - return (SignificandBits | highestBit).ToString("x") + "*2^" + (Exponent >= 0 ? Exponent.ToString("x") : "-" + (-Exponent).ToString("x")); - - case QuadrupleStringFormat.DecimalExponential: - if (SignificandBits >= highestBit) - return "-" + SignificandBits.ToString() + "*2^" + Exponent.ToString(); - else - return (SignificandBits | highestBit).ToString() + "*2^" + Exponent.ToString(); - - case QuadrupleStringFormat.ScientificApproximate: - if (Exponent >= -1022 && Exponent <= 1023) //can be represented as double (albeit with a precision loss) - return ((double)this).ToString(System.Globalization.CultureInfo.InvariantCulture); - - double dVal = (double)new Quad(SignificandBits, -61); - double dExp = base2to10Multiplier * (Exponent + 61); - - string sign = ""; - if (dVal < 0) - { - sign = "-"; - dVal = -dVal; - } - - if (dExp >= 0) - dVal *= Math.Pow(10, (dExp % 1)); - else - dVal *= Math.Pow(10, -((-dExp) % 1)); - - long iExp = (long)Math.Truncate(dExp); - - while (dVal >= 10) { iExp++; dVal /= 10; } - while (dVal < 1) { iExp--; dVal *= 10; } - - if (iExp >= -10 && iExp < 0) - { - string dValString = dVal.ToString(System.Globalization.CultureInfo.InvariantCulture); - if (dValString[1] != '.') - goto returnScientific; //unexpected formatting; use default behavior. - else - return sign + "0." + new string('0', (int)((-iExp) - 1)) + dVal.ToString(System.Globalization.CultureInfo.InvariantCulture).Remove(1, 1); - } - else if (iExp >= 0 && iExp <= 10) - { - string dValString = dVal.ToString(System.Globalization.CultureInfo.InvariantCulture); - if (dValString[1] != '.') - goto returnScientific; //unexpected formating; use default behavior. - else - { - dValString = dValString.Remove(1, 1); - if (iExp < dValString.Length - 1) - return sign + dValString.Substring(0, 1 + (int)iExp) + "." + dValString.Substring(1 + (int)iExp); - else - return sign + dValString + new string('0', (int)iExp - (dValString.Length - 1)) + ".0"; - } - } - - returnScientific: - return sign + dVal.ToString(System.Globalization.CultureInfo.InvariantCulture) + "E" + (iExp >= 0 ? "+" + iExp : iExp.ToString()); - - case QuadrupleStringFormat.ScientificExact: - if (this == Zero) return "0"; - if (Fraction(this) == Zero && this.Exponent <= 0) //integer value that we can output directly - return (this.SignificandBits >= highestBit ? "-" : "") + ((this.SignificandBits | highestBit) >> (int)(-this.Exponent)).ToString(); - - Quad absValue = Abs(this); - - long e = 0; - if (absValue < One) - { - while (true) - { - if (absValue < en18) - { - absValue.Multiply(e19); - e -= 19; - } - else if (absValue < en9) - { - absValue.Multiply(e10); - e -= 10; - } - else if (absValue < en4) - { - absValue.Multiply(e5); - e -= 5; - } - else if (absValue < en2) - { - absValue.Multiply(e3); - e -= 3; - } - else if (absValue < One) - { - absValue.Multiply(e1); - e -= 1; - } - else - break; - } - } - else - { - while (true) - { - if (absValue >= e19) - { - absValue.Divide(e19); - e += 19; - } - else if (absValue >= e10) - { - absValue.Divide(e10); - e += 10; - } - else if (absValue >= e5) - { - absValue.Divide(e5); - e += 5; - } - else if (absValue >= e3) - { - absValue.Divide(e3); - e += 3; - } - else if (absValue >= e1) - { - absValue.Divide(e1); - e += 1; - } - else - break; - } - } - - //absValue is now in the interval [1,10) - StringBuilder result = new StringBuilder(); - - result.Append(IntegerString(absValue,1) + "."); - - while ( (absValue=Fraction(absValue)) > Zero) - { - absValue.Multiply(e19); - result.Append(IntegerString(absValue, 19)); - } - - string resultString = result.ToString().TrimEnd('0'); //trim excess 0's at the end - if (resultString[resultString.Length - 1] == '.') resultString += "0"; //e.g. 1.0 instead of 1. - - return (this.SignificandBits >= highestBit ? "-" : "") + resultString + "e" + (e >= 0 ? "+" : "") + e; - - default: - throw new ArgumentException("Unknown format requested"); - } - } - - /// - /// Retrieves the integer portion of the quad as a string, - /// assuming that the quad's value is less than long.MaxValue. - /// No sign ("-") is prepended to the result in the case of negative values. - /// - /// - private static string IntegerString(Quad quad,int digits) - { - if (quad.Exponent > 0) throw new ArgumentOutOfRangeException("The given quad is larger than long.MaxValue"); - if (quad.Exponent <= -64) return "0"; - - ulong significand = quad.SignificandBits | highestBit; //make explicit the implicit bit - return (significand >> (int)(-quad.Exponent)).ToString( new string('0', digits )); - } - - - #endregion - - #region GetHashCode and Equals - - public override int GetHashCode() - { - int expHash = Exponent.GetHashCode(); - return SignificandBits.GetHashCode() ^ (expHash << 16 | expHash >> 16); //rotate expHash's bits 16 places - } - - public override bool Equals(object obj) - { - if (obj == null) return false; - - try - { - return this == (Quad)obj; - } - catch - { - return false; - } - } - - #endregion - } - - - /// - /// The enum that specifies the possible formats for the output - /// of Quad's ToString method. - /// - public enum QuadrupleStringFormat - { - /// - /// Obtains the quadruple in scientific notation. Only ~52 bits of significand - /// precision are used to create this string. - /// - ScientificApproximate, - - /// - /// Obtains the quadruple in scientific notation with full precision. - /// This can be very expensive to compute and takes time linear in the value - /// of the exponent. - /// - ScientificExact, - - /// - /// Obtains the quadruple in hexadecimal exponential format, consisting - /// of a 64-bit hex integer followed by the binary exponent, - /// also expressed as a (signed) 64-bit hexadecimal integer. - /// E.g. ffffffffffffffff*2^-AB3 - /// - HexExponential, - - /// - /// Obtains the quadruple in decimal exponential format, consisting - /// of a 64-bit decimal integer followed by the 64-bit signed decimal - /// integer exponent. - /// E.g. 34592233*2^34221 - /// - DecimalExponential - } -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/Deps/zLib.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/Deps/zLib.cs deleted file mode 100644 index 14a83f7e5a..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/Deps/zLib.cs +++ /dev/null @@ -1,5271 +0,0 @@ -/* - * Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. 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. - * - * 3. The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS Software IS PROVIDED ``AS IS'' AND Any EXPRESSED 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 JCRAFT, - * INC. OR Any CONTRIBUTORS TO THIS Software 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. - * - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) - * and contributors of zlib. - */ - -using System; -using System.Collections.Generic; -using System.Text; - -//namespace Orvid.Compression.zLib -namespace ComponentAce.Compression.Libs.zlib -{ - #region Deflate - sealed class Deflate - { - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_DEFAULT_COMPRESSION = -1; - - private const int MAX_WBITS = 15; // 32K LZ77 window - private const int DEF_MEM_LEVEL = 8; - - internal class Config - { - internal int good_length; // reduce lazy search above this match length - internal int max_lazy; // do not perform lazy search above this match length - internal int nice_length; // quit search above this match length - internal int max_chain; - internal int func; - internal Config(int good_length, int max_lazy, int nice_length, int max_chain, int func) - { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - } - - private const int STORED = 0; - private const int FAST = 1; - private const int SLOW = 2; - private static Config[] config_table; - - private static readonly System.String[] z_errmsg = new System.String[] { "need dictionary", "stream end", "", "file error", "stream error", "data error", "insufficient memory", "buffer error", "incompatible version", "" }; - - // block not completed, need more input or more output - private const int NeedMore = 0; - - // block flush performed - private const int BlockDone = 1; - - // finish started, need only more output at next deflate - private const int FinishStarted = 2; - - // finish done, accept no more input or output - private const int FinishDone = 3; - - // preset dictionary flag in zlib header - private const int PRESET_DICT = 0x20; - - private const int Z_FILTERED = 1; - private const int Z_HUFFMAN_ONLY = 2; - private const int Z_DEFAULT_STRATEGY = 0; - - private const int Z_NO_FLUSH = 0; - private const int Z_PARTIAL_FLUSH = 1; - private const int Z_SYNC_FLUSH = 2; - private const int Z_FULL_FLUSH = 3; - private const int Z_FINISH = 4; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - private const int INIT_STATE = 42; - private const int BUSY_STATE = 113; - private const int FINISH_STATE = 666; - - // The deflate compression method - private const int Z_DEFLATED = 8; - - private const int STORED_BLOCK = 0; - private const int STATIC_TREES = 1; - private const int DYN_TREES = 2; - - // The three kinds of block type - private const int Z_BINARY = 0; - private const int Z_ASCII = 1; - private const int Z_UNKNOWN = 2; - - private const int Buf_size = 8 * 2; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - private const int REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - private const int REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - private const int REPZ_11_138 = 18; - - private const int MIN_MATCH = 3; - private const int MAX_MATCH = 258; - private static readonly int MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - - private const int MAX_BITS = 15; - private const int D_CODES = 30; - private const int BL_CODES = 19; - private const int LENGTH_CODES = 29; - private const int LITERALS = 256; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - private static readonly int HEAP_SIZE = (2 * L_CODES + 1); - - private const int END_BLOCK = 256; - - internal ZStream strm; // pointer back to this zlib stream - internal int status; // as the name implies - internal byte[] pending_buf; // output still pending - internal int pending_buf_size; // size of pending_buf - internal int pending_out; // next pending byte to output to the stream - internal int pending; // nb of bytes in the pending buffer - internal int noheader; // suppress zlib header and adler32 - internal byte data_type; // Unknown, BINARY or ASCII - internal byte method; // STORED (for zip only) or DEFLATED - internal int last_flush; // value of flush param for previous deflate call - - internal int w_size; // LZ77 window size (32K by default) - internal int w_bits; // log2(w_size) (8..16) - internal int w_mask; // w_size - 1 - - internal byte[] window; - // Sliding window. Input bytes are read into the second half of the window, - // and move to the first half later to keep a dictionary of at least wSize - // bytes. With this organization, matches are limited to a distance of - // wSize-MAX_MATCH bytes, but this ensures that IO is always - // performed with a length multiple of the block size. Also, it limits - // the window size to 64K, which is quite useful on MSDOS. - // To do: use the user input buffer as sliding window. - - internal int window_size; - // Actual size of window: 2*wSize, except when the user input buffer - // is directly used as sliding window. - - internal short[] prev; - // Link to older string with same hash index. To limit the size of this - // array to 64K, this link is maintained only for the last 32K strings. - // An index in this array is thus a window index modulo 32K. - - internal short[] head; // Heads of the hash chains or NIL. - - internal int ins_h; // hash index of string to be inserted - internal int hash_size; // number of elements in hash table - internal int hash_bits; // log2(hash_size) - internal int hash_mask; // hash_size-1 - - // Number of bits by which ins_h must be shifted at each input - // step. It must be such that after MIN_MATCH steps, the oldest - // byte no longer takes part in the hash key, that is: - // hash_shift * MIN_MATCH >= hash_bits - internal int hash_shift; - - // Window position at the beginning of the current output block. Gets - // negative when the window is moved backwards. - - internal int block_start; - - internal int match_length; // length of best match - internal int prev_match; // previous match - internal int match_available; // set if previous match exists - internal int strstart; // start of string to insert - internal int match_start; // start of matching string - internal int lookahead; // number of valid bytes ahead in window - - // Length of the best match at previous step. Matches not greater than this - // are discarded. This is used in the lazy match evaluation. - internal int prev_length; - - // To speed up deflation, hash chains are never searched beyond this - // length. A higher limit improves compression ratio but degrades the speed. - internal int max_chain_length; - - // Attempt to find a better match only when the current match is strictly - // smaller than this value. This mechanism is used only for compression - // levels >= 4. - internal int max_lazy_match; - - // Insert new strings in the hash table only if the match length is not - // greater than this length. This saves time but degrades compression. - // max_insert_length is used only for compression levels <= 3. - - internal int level; // compression level (1..9) - internal int strategy; // favor or force Huffman coding - - // Use a faster search when the previous match is longer than this - internal int good_match; - - // Stop searching when current match exceeds this - internal int nice_match; - - internal short[] dyn_ltree; // literal and length tree - internal short[] dyn_dtree; // distance tree - internal short[] bl_tree; // Huffman tree for bit lengths - - internal Tree l_desc = new Tree(); // desc for literal tree - internal Tree d_desc = new Tree(); // desc for distance tree - internal Tree bl_desc = new Tree(); // desc for bit length tree - - // number of codes at each bit length for an optimal tree - internal short[] bl_count = new short[MAX_BITS + 1]; - - // heap used to build the Huffman trees - internal int[] heap = new int[2 * L_CODES + 1]; - - internal int heap_len; // number of elements in the heap - internal int heap_max; // element of largest frequency - // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - // The same heap array is used to build all trees. - - // Depth of each subtree used as tie breaker for trees of equal frequency - internal byte[] depth = new byte[2 * L_CODES + 1]; - - internal int l_buf; // index for literals or lengths */ - - // Size of match buffer for literals/lengths. There are 4 reasons for - // limiting lit_bufsize to 64K: - // - frequencies can be kept in 16 bit counters - // - if compression is not successful for the first block, all input - // data is still in the window so we can still emit a stored block even - // when input comes from standard input. (This can also be done for - // all blocks if lit_bufsize is not greater than 32K.) - // - if compression is not successful for a file smaller than 64K, we can - // even emit a stored file instead of a stored block (saving 5 bytes). - // This is applicable only for zip (not gzip or zlib). - // - creating new Huffman trees less frequently may not provide fast - // adaptation to changes in the input data statistics. (Take for - // example a binary file with poorly compressible code followed by - // a highly compressible string table.) Smaller buffer sizes give - // fast adaptation but have of course the overhead of transmitting - // trees more frequently. - // - I can't count above 4 - internal int lit_bufsize; - - internal int last_lit; // running index in l_buf - - // Buffer for distances. To simplify the code, d_buf and l_buf have - // the same number of elements. To use different lengths, an extra flag - // array would be necessary. - - internal int d_buf; // index of pendig_buf - - internal int opt_len; // bit length of current block with optimal trees - internal int static_len; // bit length of current block with static trees - internal int matches; // number of string matches in current block - internal int last_eob_len; // bit length of EOB code for last block - - // Output buffer. bits are inserted starting at the bottom (least - // significant bits). - internal short bi_buf; - - // Number of valid bits in bi_buf. All bits above the last valid bit - // are always zero. - internal int bi_valid; - - internal Deflate() - { - dyn_ltree = new short[HEAP_SIZE * 2]; - dyn_dtree = new short[(2 * D_CODES + 1) * 2]; // distance tree - bl_tree = new short[(2 * BL_CODES + 1) * 2]; // Huffman tree for bit lengths - } - - internal void lm_init() - { - window_size = 2 * w_size; - - head[hash_size - 1] = 0; - for (int i = 0; i < hash_size - 1; i++) - { - head[i] = 0; - } - - // Set the default configuration parameters: - max_lazy_match = Deflate.config_table[level].max_lazy; - good_match = Deflate.config_table[level].good_length; - nice_match = Deflate.config_table[level].nice_length; - max_chain_length = Deflate.config_table[level].max_chain; - - strstart = 0; - block_start = 0; - lookahead = 0; - match_length = prev_length = MIN_MATCH - 1; - match_available = 0; - ins_h = 0; - } - - // Initialize the tree data structures for a new zlib stream. - internal void tr_init() - { - - l_desc.dyn_tree = dyn_ltree; - l_desc.stat_desc = StaticTree.static_l_desc; - - d_desc.dyn_tree = dyn_dtree; - d_desc.stat_desc = StaticTree.static_d_desc; - - bl_desc.dyn_tree = bl_tree; - bl_desc.stat_desc = StaticTree.static_bl_desc; - - bi_buf = 0; - bi_valid = 0; - last_eob_len = 8; // enough lookahead for inflate - - // Initialize the first block of the first file: - init_block(); - } - - internal void init_block() - { - // Initialize the trees. - for (int i = 0; i < L_CODES; i++) - dyn_ltree[i * 2] = 0; - for (int i = 0; i < D_CODES; i++) - dyn_dtree[i * 2] = 0; - for (int i = 0; i < BL_CODES; i++) - bl_tree[i * 2] = 0; - - dyn_ltree[END_BLOCK * 2] = 1; - opt_len = static_len = 0; - last_lit = matches = 0; - } - - // Restore the heap property by moving down the tree starting at node k, - // exchanging a node with the smallest of its two sons if necessary, stopping - // when the heap property is re-established (each father smaller than its - // two sons). - internal void pqdownheap(short[] tree, int k) - { - int v = heap[k]; - int j = k << 1; // left son of k - while (j <= heap_len) - { - // Set j to the smallest of the two sons: - if (j < heap_len && smaller(tree, heap[j + 1], heap[j], depth)) - { - j++; - } - // Exit if v is smaller than both sons - if (smaller(tree, v, heap[j], depth)) - break; - - // Exchange v with the smallest son - heap[k] = heap[j]; k = j; - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - heap[k] = v; - } - - internal static bool smaller(short[] tree, int n, int m, byte[] depth) - { - return (tree[n * 2] < tree[m * 2] || (tree[n * 2] == tree[m * 2] && depth[n] <= depth[m])); - } - - // Scan a literal or distance tree to determine the frequencies of the codes - // in the bit length tree. - internal void scan_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - tree[(max_code + 1) * 2 + 1] = (short)SupportClass.Identity(0xffff); // guard - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - bl_tree[curlen * 2] = (short)(bl_tree[curlen * 2] + count); - } - else if (curlen != 0) - { - if (curlen != prevlen) - bl_tree[curlen * 2]++; - bl_tree[REP_3_6 * 2]++; - } - else if (count <= 10) - { - bl_tree[REPZ_3_10 * 2]++; - } - else - { - bl_tree[REPZ_11_138 * 2]++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Construct the Huffman tree for the bit lengths and return the index in - // bl_order of the last bit length code to send. - internal int build_bl_tree() - { - int max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - scan_tree(dyn_ltree, l_desc.max_code); - scan_tree(dyn_dtree, d_desc.max_code); - - // Build the bit length tree: - bl_desc.build_tree(this); - // opt_len now includes the length of the tree representations, except - // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - - // Determine the number of bit length codes to send. The pkzip format - // requires that at least 4 bit length codes be sent. (appnote.txt says - // 3 but the actual value used is 4.) - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) - { - if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) - break; - } - // Update opt_len to include the bit length tree and counts - opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - - return max_blindex; - } - - - // Send the header for a block using dynamic Huffman trees: the counts, the - // lengths of the bit length codes, the literal tree and the distance tree. - // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - internal void send_all_trees(int lcodes, int dcodes, int blcodes) - { - int rank; // index in bl_order - - send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt - send_bits(dcodes - 1, 5); - send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt - for (rank = 0; rank < blcodes; rank++) - { - send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3); - } - send_tree(dyn_ltree, lcodes - 1); // literal tree - send_tree(dyn_dtree, dcodes - 1); // distance tree - } - - // Send a literal or distance tree in compressed form, using the codes in - // bl_tree. - internal void send_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = -1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - do - { - send_code(curlen, bl_tree); - } - while (--count != 0); - } - else if (curlen != 0) - { - if (curlen != prevlen) - { - send_code(curlen, bl_tree); count--; - } - send_code(REP_3_6, bl_tree); - send_bits(count - 3, 2); - } - else if (count <= 10) - { - send_code(REPZ_3_10, bl_tree); - send_bits(count - 3, 3); - } - else - { - send_code(REPZ_11_138, bl_tree); - send_bits(count - 11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Output a byte on the stream. - // IN assertion: there is enough room in pending_buf. - internal void put_byte(byte[] p, int start, int len) - { - Buffer.BlockCopy(p, start, pending_buf, pending, len); - pending += len; - } - - internal void put_byte(byte c) - { - pending_buf[pending++] = c; - } - internal void put_short(int w) - { - put_byte((byte)(w)); - put_byte((byte)(SupportClass.URShift(w, 8))); - } - internal void putShortMSB(int b) - { - put_byte((byte)(b >> 8)); - put_byte((byte)(b)); - } - - internal void send_code(int c, short[] tree) - { - send_bits((tree[c * 2] & 0xffff), (tree[c * 2 + 1] & 0xffff)); - } - - internal void send_bits(int value_Renamed, int length) - { - int len = length; - if (bi_valid > (int)Buf_size - len) - { - int val = value_Renamed; - // bi_buf |= (val << bi_valid); - bi_buf = (short)((ushort)bi_buf | (ushort)(((val << bi_valid) & 0xffff))); - put_short(bi_buf); - bi_buf = (short)(SupportClass.URShift(val, (Buf_size - bi_valid))); - bi_valid += len - Buf_size; - } - else - { - // bi_buf |= (value) << bi_valid; - bi_buf = (short)((ushort)bi_buf | (ushort)((((value_Renamed) << bi_valid) & 0xffff))); - bi_valid += len; - } - } - - // Send one empty static block to give enough lookahead for inflate. - // This takes 10 bits, of which 7 may remain in the bit buffer. - // The current inflate code requires 9 bits of lookahead. If the - // last two codes for the previous block (real code plus EOB) were coded - // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - // the last real code. In this case we send two empty static blocks instead - // of one. (There are no problems if the previous block is stored or fixed.) - // To simplify the code, we assume the worst case of last real code encoded - // on one bit only. - internal void _tr_align() - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - - bi_flush(); - - // Of the 10 bits for the empty block, we have already sent - // (10 - bi_valid) bits. The lookahead for the last real code (before - // the EOB of the previous block) was thus at least one plus the length - // of the EOB plus what we have just sent of the empty static block. - if (1 + last_eob_len + 10 - bi_valid < 9) - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - bi_flush(); - } - last_eob_len = 7; - } - - - // Save the match info and tally the frequency counts. Return true if - // the current block must be flushed. - internal bool _tr_tally(int dist, int lc) - { - - pending_buf[d_buf + last_lit * 2] = (byte)(SupportClass.URShift(dist, 8)); - pending_buf[d_buf + last_lit * 2 + 1] = (byte)dist; - - pending_buf[l_buf + last_lit] = (byte)lc; last_lit++; - - if (dist == 0) - { - // lc is the unmatched char - dyn_ltree[lc * 2]++; - } - else - { - matches++; - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 - dyn_ltree[(Tree._length_code[lc] + LITERALS + 1) * 2]++; - dyn_dtree[Tree.d_code(dist) * 2]++; - } - - if ((last_lit & 0x1fff) == 0 && level > 2) - { - // Compute an upper bound for the compressed length - int out_length = last_lit * 8; - int in_length = strstart - block_start; - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) - { - out_length = (int)(out_length + (int)dyn_dtree[dcode * 2] * (5L + Tree.extra_dbits[dcode])); - } - out_length = SupportClass.URShift(out_length, 3); - if ((matches < (last_lit / 2)) && out_length < in_length / 2) - return true; - } - - return (last_lit == lit_bufsize - 1); - // We avoid equality with lit_bufsize because of wraparound at 64K - // on 16 bit machines and because stored blocks are restricted to - // 64K-1 bytes. - } - - // Send the block data compressed using the given Huffman trees - internal void compress_block(short[] ltree, short[] dtree) - { - int dist; // distance of matched string - int lc; // match length or unmatched char (if dist == 0) - int lx = 0; // running index in l_buf - int code; // the code to send - int extra; // number of extra bits to send - - if (last_lit != 0) - { - do - { - dist = ((pending_buf[d_buf + lx * 2] << 8) & 0xff00) | (pending_buf[d_buf + lx * 2 + 1] & 0xff); - lc = (pending_buf[l_buf + lx]) & 0xff; lx++; - - if (dist == 0) - { - send_code(lc, ltree); // send a literal byte - } - else - { - // Here, lc is the match length - MIN_MATCH - code = Tree._length_code[lc]; - - send_code(code + LITERALS + 1, ltree); // send the length code - extra = Tree.extra_lbits[code]; - if (extra != 0) - { - lc -= Tree.base_length[code]; - send_bits(lc, extra); // send the extra length bits - } - dist--; // dist is now the match distance - 1 - code = Tree.d_code(dist); - - send_code(code, dtree); // send the distance code - extra = Tree.extra_dbits[code]; - if (extra != 0) - { - dist -= Tree.base_dist[code]; - send_bits(dist, extra); // send the extra distance bits - } - } // literal or match pair ? - - // Check that the overlay between pending_buf and d_buf+l_buf is ok: - } - while (lx < last_lit); - } - - send_code(END_BLOCK, ltree); - last_eob_len = ltree[END_BLOCK * 2 + 1]; - } - - // Set the data type to ASCII or BINARY, using a crude approximation: - // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. - // IN assertion: the fields freq of dyn_ltree are set and the total of all - // frequencies does not exceed 64K (to fit in an int on 16 bit machines). - internal void set_data_type() - { - int n = 0; - int ascii_freq = 0; - int bin_freq = 0; - while (n < 7) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - while (n < 128) - { - ascii_freq += dyn_ltree[n * 2]; n++; - } - while (n < LITERALS) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - data_type = (byte)(bin_freq > (SupportClass.URShift(ascii_freq, 2)) ? Z_BINARY : Z_ASCII); - } - - // Flush the bit buffer, keeping at most 7 bits in it. - internal void bi_flush() - { - if (bi_valid == 16) - { - put_short(bi_buf); - bi_buf = 0; - bi_valid = 0; - } - else if (bi_valid >= 8) - { - put_byte((byte)bi_buf); - bi_buf = (short)(SupportClass.URShift(bi_buf, 8)); - bi_valid -= 8; - } - } - - // Flush the bit buffer and align the output on a byte boundary - internal void bi_windup() - { - if (bi_valid > 8) - { - put_short(bi_buf); - } - else if (bi_valid > 0) - { - put_byte((byte)bi_buf); - } - bi_buf = 0; - bi_valid = 0; - } - - // Copy a stored block, storing first the length and its - // one's complement if requested. - internal void copy_block(int buf, int len, bool header) - { - - bi_windup(); // align on byte boundary - last_eob_len = 8; // enough lookahead for inflate - - if (header) - { - put_short((short)len); - put_short((short)~len); - } - - // while(len--!=0) { - // put_byte(window[buf+index]); - // index++; - // } - put_byte(window, buf, len); - } - - internal void flush_block_only(bool eof) - { - _tr_flush_block(block_start >= 0 ? block_start : -1, strstart - block_start, eof); - block_start = strstart; - strm.flush_pending(); - } - - // Copy without compression as much as possible from the input stream, return - // the current block state. - // This function does not insert new strings in the dictionary since - // uncompressible data is probably not useful. This function is used - // only for the level=0 compression option. - // NOTE: this function should be optimized to avoid extra copying from - // window to pending_buf. - internal int deflate_stored(int flush) - { - // Stored blocks are limited to 0xffff bytes, pending_buf is limited - // to pending_buf_size, and each stored block has a 5 byte header: - - int max_block_size = 0xffff; - int max_start; - - if (max_block_size > pending_buf_size - 5) - { - max_block_size = pending_buf_size - 5; - } - - // Copy as much as possible from input to output: - while (true) - { - // Fill the window as much as possible: - if (lookahead <= 1) - { - fill_window(); - if (lookahead == 0 && flush == Z_NO_FLUSH) - return NeedMore; - if (lookahead == 0) - break; // flush the current block - } - - strstart += lookahead; - lookahead = 0; - - // Emit a stored block if pending_buf will be full: - max_start = block_start + max_block_size; - if (strstart == 0 || strstart >= max_start) - { - // strstart == 0 is possible when wraparound on 16-bit machine - lookahead = (int)(strstart - max_start); - strstart = (int)max_start; - - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - - // Flush if we may have to slide, otherwise block_start may become - // negative and the data will be gone: - if (strstart - block_start >= w_size - MIN_LOOKAHEAD) - { - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if (strm.avail_out == 0) - return (flush == Z_FINISH) ? FinishStarted : NeedMore; - - return flush == Z_FINISH ? FinishDone : BlockDone; - } - - // Send a stored block - internal void _tr_stored_block(int buf, int stored_len, bool eof) - { - send_bits((STORED_BLOCK << 1) + (eof ? 1 : 0), 3); // send block type - copy_block(buf, stored_len, true); // with header - } - - // Determine the best encoding for the current block: dynamic trees, static - // trees or store, and output the encoded block to the zip file. - internal void _tr_flush_block(int buf, int stored_len, bool eof) - { - int opt_lenb, static_lenb; // opt_len and static_len in bytes - int max_blindex = 0; // index of last bit length code of non zero freq - - // Build the Huffman trees unless a stored block is forced - if (level > 0) - { - // Check if the file is ascii or binary - if (data_type == Z_UNKNOWN) - set_data_type(); - - // Construct the literal and distance trees - l_desc.build_tree(this); - - d_desc.build_tree(this); - - // At this point, opt_len and static_len are the total bit lengths of - // the compressed block data, excluding the tree representations. - - // Build the bit length tree for the above two trees, and get the index - // in bl_order of the last bit length code to send. - max_blindex = build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb = SupportClass.URShift((opt_len + 3 + 7), 3); - static_lenb = SupportClass.URShift((static_len + 3 + 7), 3); - - if (static_lenb <= opt_lenb) - opt_lenb = static_lenb; - } - else - { - opt_lenb = static_lenb = stored_len + 5; // force a stored block - } - - if (stored_len + 4 <= opt_lenb && buf != -1) - { - // 4: two words for the lengths - // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - // Otherwise we can't have processed more than WSIZE input bytes since - // the last block flush, because compression would have been - // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - // transform a block into a stored block. - _tr_stored_block(buf, stored_len, eof); - } - else if (static_lenb == opt_lenb) - { - send_bits((STATIC_TREES << 1) + (eof ? 1 : 0), 3); - compress_block(StaticTree.static_ltree, StaticTree.static_dtree); - } - else - { - send_bits((DYN_TREES << 1) + (eof ? 1 : 0), 3); - send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, max_blindex + 1); - compress_block(dyn_ltree, dyn_dtree); - } - - // The above check is made mod 2^32, for files larger than 512 MB - // and uLong implemented on 32 bits. - - init_block(); - - if (eof) - { - bi_windup(); - } - } - - // Fill the window when the lookahead becomes insufficient. - // Updates strstart and lookahead. - // - // IN assertion: lookahead < MIN_LOOKAHEAD - // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - // At least one byte has been read, or avail_in == 0; reads are - // performed for at least two bytes (required for the zip translate_eol - // option -- not supported here). - internal void fill_window() - { - int n, m; - int p; - int more; // Amount of free space at the end of the window. - - do - { - more = (window_size - lookahead - strstart); - - // Deal with !@#$% 64K limit: - if (more == 0 && strstart == 0 && lookahead == 0) - { - more = w_size; - } - else if (more == -1) - { - // Very unlikely, but possible on 16 bit machine if strstart == 0 - // and lookahead == 1 (input done one byte at time) - more--; - - // If the window is almost full and there is insufficient lookahead, - // move the upper half to the lower one to make room in the upper half. - } - else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) - { - Buffer.BlockCopy(window, w_size, window, 0, w_size); - match_start -= w_size; - strstart -= w_size; // we now have strstart >= MAX_DIST - block_start -= w_size; - - // Slide the hash table (could be avoided with 32 bit values - // at the expense of memory usage). We slide even when level == 0 - // to keep the hash table consistent if we switch back to level > 0 - // later. (Using level 0 permanently is not an optimal usage of - // zlib, so we don't care about this pathological case.) - - n = hash_size; - p = n; - do - { - m = (head[--p] & 0xffff); - head[p] = (short)(m >= w_size ? (m - w_size) : 0); - //head[p] = (m >= w_size?(short) (m - w_size):0); - } - while (--n != 0); - - n = w_size; - p = n; - do - { - m = (prev[--p] & 0xffff); - prev[p] = (short)(m >= w_size ? (m - w_size) : 0); - //prev[p] = (m >= w_size?(short) (m - w_size):0); - // If n is not on any hash chain, prev[n] is garbage but - // its value will never be used. - } - while (--n != 0); - more += w_size; - } - - if (strm.avail_in == 0) - return; - - // If there was no sliding: - // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - // more == window_size - lookahead - strstart - // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - // => more >= window_size - 2*WSIZE + 2 - // In the BIG_MEM or MMAP case (not yet supported), - // window_size == input_size + MIN_LOOKAHEAD && - // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - // Otherwise, window_size == 2*WSIZE so more >= 2. - // If there was sliding, more >= WSIZE. So in all cases, more >= 2. - - n = strm.read_buf(window, strstart + lookahead, more); - lookahead += n; - - // Initialize the hash value now that we have some input: - if (lookahead >= MIN_MATCH) - { - ins_h = window[strstart] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - } - // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - // but this is not important since only literal bytes will be emitted. - } - while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0); - } - - // Compress as much as possible from the input stream, return the current - // block state. - // This function does not perform lazy evaluation of matches and inserts - // new strings in the dictionary only for unmatched strings or for short - // matches. It is used only for the fast compression options. - internal int deflate_fast(int flush) - { - // short hash_head = 0; // head of the hash chain - int hash_head = 0; // head of the hash chain - bool bflush; // set if current block must be flushed - - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) - { - return NeedMore; - } - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - - // Find the longest match, discarding those <= prev_length. - // At this point we have always match_length < MIN_MATCH - - if (hash_head != 0L && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - if (strategy != Z_HUFFMAN_ONLY) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - } - if (match_length >= MIN_MATCH) - { - // check_match(strstart, match_start, match_length); - - bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH); - - lookahead -= match_length; - - // Insert new strings in the hash table only if the match length - // is not too large. This saves time but degrades compression. - if (match_length <= max_lazy_match && lookahead >= MIN_MATCH) - { - match_length--; // string at strstart already in hash table - do - { - strstart++; - - ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - - // strstart never exceeds WSIZE-MAX_MATCH, so there are - // always MIN_MATCH bytes ahead. - } - while (--match_length != 0); - strstart++; - } - else - { - strstart += match_length; - match_length = 0; - ins_h = window[strstart] & 0xff; - - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - // If lookahead < MIN_MATCH, ins_h is garbage, but it does not - // matter since it will be recomputed at next deflate call. - } - } - else - { - // No match, output a literal byte - - bflush = _tr_tally(0, window[strstart] & 0xff); - lookahead--; - strstart++; - } - if (bflush) - { - - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if (strm.avail_out == 0) - { - if (flush == Z_FINISH) - return FinishStarted; - else - return NeedMore; - } - return flush == Z_FINISH ? FinishDone : BlockDone; - } - - // Same as above, but achieves better compression. We use a lazy - // evaluation for matches: a match is finally adopted only if there is - // no better match at the next window position. - internal int deflate_slow(int flush) - { - // short hash_head = 0; // head of hash chain - int hash_head = 0; // head of hash chain - bool bflush; // set if current block must be flushed - - // Process the input block. - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) - { - return NeedMore; - } - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - - // Find the longest match, discarding those <= prev_length. - prev_length = match_length; prev_match = match_start; - match_length = MIN_MATCH - 1; - - if (hash_head != 0 && prev_length < max_lazy_match && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - - if (strategy != Z_HUFFMAN_ONLY) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - - if (match_length <= 5 && (strategy == Z_FILTERED || (match_length == MIN_MATCH && strstart - match_start > 4096))) - { - - // If prev_match is also MIN_MATCH, match_start is garbage - // but we will ignore the current match anyway. - match_length = MIN_MATCH - 1; - } - } - - // If there was a match at the previous step and the current - // match is not better, output the previous match: - if (prev_length >= MIN_MATCH && match_length <= prev_length) - { - int max_insert = strstart + lookahead - MIN_MATCH; - // Do not insert strings in hash table beyond this. - - // check_match(strstart-1, prev_match, prev_length); - - bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); - - // Insert in hash table all strings up to the end of the match. - // strstart-1 and strstart are already inserted. If there is not - // enough lookahead, the last two strings are not inserted in - // the hash table. - lookahead -= (prev_length - 1); - prev_length -= 2; - do - { - if (++strstart <= max_insert) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - //prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - } - while (--prev_length != 0); - match_available = 0; - match_length = MIN_MATCH - 1; - strstart++; - - if (bflush) - { - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - else if (match_available != 0) - { - - // If there was no match at the previous position, output a - // single literal. If there was a match but the current match - // is longer, truncate the previous match to a single literal. - - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - - if (bflush) - { - flush_block_only(false); - } - strstart++; - lookahead--; - if (strm.avail_out == 0) - return NeedMore; - } - else - { - // There is no previous match to compare with, wait for - // the next step to decide. - - match_available = 1; - strstart++; - lookahead--; - } - } - - if (match_available != 0) - { - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - match_available = 0; - } - flush_block_only(flush == Z_FINISH); - - if (strm.avail_out == 0) - { - if (flush == Z_FINISH) - return FinishStarted; - else - return NeedMore; - } - - return flush == Z_FINISH ? FinishDone : BlockDone; - } - - internal int longest_match(int cur_match) - { - int chain_length = max_chain_length; // max hash chain length - int scan = strstart; // current string - int match; // matched string - int len; // length of current match - int best_len = prev_length; // best match length so far - int limit = strstart > (w_size - MIN_LOOKAHEAD) ? strstart - (w_size - MIN_LOOKAHEAD) : 0; - int nice_match = this.nice_match; - - // Stop when cur_match becomes <= limit. To simplify the code, - // we prevent matches with the string of window index 0. - - int wmask = w_mask; - - int strend = strstart + MAX_MATCH; - byte scan_end1 = window[scan + best_len - 1]; - byte scan_end = window[scan + best_len]; - - // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - // It is easy to get rid of this optimization if necessary. - - // Do not waste too much time if we already have a good match: - if (prev_length >= good_match) - { - chain_length >>= 2; - } - - // Do not look for matches beyond the end of the input. This is necessary - // to make deflate deterministic. - if (nice_match > lookahead) - nice_match = lookahead; - - do - { - match = cur_match; - - // Skip to next match if the match length cannot increase - // or if the match length is less than 2: - if (window[match + best_len] != scan_end || window[match + best_len - 1] != scan_end1 || window[match] != window[scan] || window[++match] != window[scan + 1]) - continue; - - // The check at best_len-1 can be removed because it will be made - // again later. (This heuristic is not always a win.) - // It is not necessary to compare scan[2] and match[2] since they - // are always equal when the other bytes match, given that - // the hash keys are equal and that HASH_BITS >= 8. - scan += 2; match++; - - // We check for insufficient lookahead only every 8th comparison; - // the 256th check will be made at strstart+258. - do - { - } - while (window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && scan < strend); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) - { - match_start = cur_match; - best_len = len; - if (len >= nice_match) - break; - scan_end1 = window[scan + best_len - 1]; - scan_end = window[scan + best_len]; - } - } - while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length != 0); - - if (best_len <= lookahead) - return best_len; - return lookahead; - } - - internal int deflateInit(ZStream strm, int level, int bits) - { - return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); - } - internal int deflateInit(ZStream strm, int level) - { - return deflateInit(strm, level, MAX_WBITS); - } - internal int deflateInit2(ZStream strm, int level, int method, int windowBits, int memLevel, int strategy) - { - int noheader = 0; - // byte[] my_version=ZLIB_VERSION; - - // - // if (version == null || version[0] != my_version[0] - // || stream_size != sizeof(z_stream)) { - // return Z_VERSION_ERROR; - // } - - strm.msg = null; - - if (level == Z_DEFAULT_COMPRESSION) - level = 6; - - if (windowBits < 0) - { - // undocumented feature: suppress zlib header - noheader = 1; - windowBits = -windowBits; - } - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) - { - return Z_STREAM_ERROR; - } - - strm.dstate = (Deflate)this; - - this.noheader = noheader; - w_bits = windowBits; - w_size = 1 << w_bits; - w_mask = w_size - 1; - - hash_bits = memLevel + 7; - hash_size = 1 << hash_bits; - hash_mask = hash_size - 1; - hash_shift = ((hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - window = new byte[w_size * 2]; - prev = new short[w_size]; - head = new short[hash_size]; - - lit_bufsize = 1 << (memLevel + 6); // 16K elements by default - - // We overlay pending_buf and d_buf+l_buf. This works since the average - // output size for (length,distance) codes is <= 24 bits. - pending_buf = new byte[lit_bufsize * 4]; - pending_buf_size = lit_bufsize * 4; - - d_buf = lit_bufsize; - l_buf = (1 + 2) * lit_bufsize; - - this.level = level; - - //System.out.println("level="+level); - - this.strategy = strategy; - this.method = (byte)method; - - return deflateReset(strm); - } - - internal int deflateReset(ZStream strm) - { - strm.total_in = strm.total_out = 0; - strm.msg = null; // - strm.data_type = Z_UNKNOWN; - - pending = 0; - pending_out = 0; - - if (noheader < 0) - { - noheader = 0; // was set to -1 by deflate(..., Z_FINISH); - } - status = (noheader != 0) ? BUSY_STATE : INIT_STATE; - strm.adler = strm._adler.adler32(0, null, 0, 0); - - last_flush = Z_NO_FLUSH; - - tr_init(); - lm_init(); - return Z_OK; - } - - internal int deflateEnd() - { - if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) - { - return Z_STREAM_ERROR; - } - // Deallocate in reverse order of allocations: - pending_buf = null; - head = null; - prev = null; - window = null; - // free - // dstate=null; - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; - } - - internal int deflateParams(ZStream strm, int _level, int _strategy) - { - int err = Z_OK; - - if (_level == Z_DEFAULT_COMPRESSION) - { - _level = 6; - } - if (_level < 0 || _level > 9 || _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) - { - return Z_STREAM_ERROR; - } - - if (config_table[level].func != config_table[_level].func && strm.total_in != 0) - { - // Flush the last buffer: - err = strm.deflate(Z_PARTIAL_FLUSH); - } - - if (level != _level) - { - level = _level; - max_lazy_match = config_table[level].max_lazy; - good_match = config_table[level].good_length; - nice_match = config_table[level].nice_length; - max_chain_length = config_table[level].max_chain; - } - strategy = _strategy; - return err; - } - - internal int deflateSetDictionary(ZStream strm, byte[] dictionary, int dictLength) - { - int length = dictLength; - int index = 0; - - if (dictionary == null || status != INIT_STATE) - return Z_STREAM_ERROR; - - strm.adler = strm._adler.adler32(strm.adler, dictionary, 0, dictLength); - - if (length < MIN_MATCH) - return Z_OK; - if (length > w_size - MIN_LOOKAHEAD) - { - length = w_size - MIN_LOOKAHEAD; - index = dictLength - length; // use the tail of the dictionary - } - Buffer.BlockCopy(dictionary, index, window, 0, length); - strstart = length; - block_start = length; - - // Insert all strings in the hash table (except for the last two bytes). - // s->lookahead stays null, so s->ins_h will be recomputed at the next - // call of fill_window. - - ins_h = window[0] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask; - - for (int n = 0; n <= length - MIN_MATCH; n++) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - prev[n & w_mask] = head[ins_h]; - head[ins_h] = (short)n; - } - return Z_OK; - } - - internal int deflate(ZStream strm, int flush) - { - int old_flush; - - if (flush > Z_FINISH || flush < 0) - { - return Z_STREAM_ERROR; - } - - if (strm.next_out == null || (strm.next_in == null && strm.avail_in != 0) || (status == FINISH_STATE && flush != Z_FINISH)) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_STREAM_ERROR)]; - return Z_STREAM_ERROR; - } - if (strm.avail_out == 0) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - this.strm = strm; // just in case - old_flush = last_flush; - last_flush = flush; - - // Write the zlib header - if (status == INIT_STATE) - { - int header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8; - int level_flags = ((level - 1) & 0xff) >> 1; - - if (level_flags > 3) - level_flags = 3; - header |= (level_flags << 6); - if (strstart != 0) - header |= PRESET_DICT; - header += 31 - (header % 31); - - status = BUSY_STATE; - putShortMSB(header); - - - // Save the adler32 of the preset dictionary: - if (strstart != 0) - { - putShortMSB((int)(SupportClass.URShift(strm.adler, 16))); - putShortMSB((int)(strm.adler & 0xffff)); - } - strm.adler = strm._adler.adler32(0, null, 0, 0); - } - - // Flush as much pending output as possible - if (pending != 0) - { - strm.flush_pending(); - if (strm.avail_out == 0) - { - //System.out.println(" avail_out==0"); - // Since avail_out is 0, deflate will be called again with - // more output space, but possibly with both pending and - // avail_in equal to zero. There won't be anything to do, - // but this is not an error situation so make sure we - // return OK instead of BUF_ERROR at next call of deflate: - last_flush = -1; - return Z_OK; - } - - // Make sure there is something to do and avoid duplicate consecutive - // flushes. For repeated and useless calls with Z_FINISH, we keep - // returning Z_STREAM_END instead of Z_BUFF_ERROR. - } - else if (strm.avail_in == 0 && flush <= old_flush && flush != Z_FINISH) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // User must not provide more input after the first FINISH: - if (status == FINISH_STATE && strm.avail_in != 0) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // Start a new block or continue the current one. - if (strm.avail_in != 0 || lookahead != 0 || (flush != Z_NO_FLUSH && status != FINISH_STATE)) - { - int bstate = -1; - switch (config_table[level].func) - { - - case STORED: - bstate = deflate_stored(flush); - break; - - case FAST: - bstate = deflate_fast(flush); - break; - - case SLOW: - bstate = deflate_slow(flush); - break; - - default: - break; - - } - - if (bstate == FinishStarted || bstate == FinishDone) - { - status = FINISH_STATE; - } - if (bstate == NeedMore || bstate == FinishStarted) - { - if (strm.avail_out == 0) - { - last_flush = -1; // avoid BUF_ERROR next call, see above - } - return Z_OK; - // If flush != Z_NO_FLUSH && avail_out == 0, the next call - // of deflate should use the same flush parameter to make sure - // that the flush is complete. So we don't have to output an - // empty block here, this will be done at next call. This also - // ensures that for a very small output buffer, we emit at most - // one empty block. - } - - if (bstate == BlockDone) - { - if (flush == Z_PARTIAL_FLUSH) - { - _tr_align(); - } - else - { - // FULL_FLUSH or SYNC_FLUSH - _tr_stored_block(0, 0, false); - // For a full flush, this empty block will be recognized - // as a special marker by inflate_sync(). - if (flush == Z_FULL_FLUSH) - { - //state.head[s.hash_size-1]=0; - for (int i = 0; i < hash_size; i++) - // forget history - head[i] = 0; - } - } - strm.flush_pending(); - if (strm.avail_out == 0) - { - last_flush = -1; // avoid BUF_ERROR at next call, see above - return Z_OK; - } - } - } - - if (flush != Z_FINISH) - return Z_OK; - if (noheader != 0) - return Z_STREAM_END; - - // Write the zlib trailer (adler32) - putShortMSB((int)(SupportClass.URShift(strm.adler, 16))); - putShortMSB((int)(strm.adler & 0xffff)); - strm.flush_pending(); - - // If avail_out is zero, the application will call deflate again - // to flush the rest. - noheader = -1; // write the trailer only once! - return pending != 0 ? Z_OK : Z_STREAM_END; - } - static Deflate() - { - { - config_table = new Config[10]; - // good lazy nice chain - config_table[0] = new Config(0, 0, 0, 0, STORED); - config_table[1] = new Config(4, 4, 8, 4, FAST); - config_table[2] = new Config(4, 5, 16, 8, FAST); - config_table[3] = new Config(4, 6, 32, 32, FAST); - - config_table[4] = new Config(4, 4, 16, 16, SLOW); - config_table[5] = new Config(8, 16, 32, 32, SLOW); - config_table[6] = new Config(8, 16, 128, 128, SLOW); - config_table[7] = new Config(8, 32, 128, 256, SLOW); - config_table[8] = new Config(32, 128, 258, 1024, SLOW); - config_table[9] = new Config(32, 258, 258, 4096, SLOW); - } - } - } - #endregion - - #region Inflate - sealed class Inflate - { - - private const int MAX_WBITS = 15; // 32K LZ77 window - - // preset dictionary flag in zlib header - private const int PRESET_DICT = 0x20; - - internal const int Z_NO_FLUSH = 0; - internal const int Z_PARTIAL_FLUSH = 1; - internal const int Z_SYNC_FLUSH = 2; - internal const int Z_FULL_FLUSH = 3; - internal const int Z_FINISH = 4; - - private const int Z_DEFLATED = 8; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - private const int METHOD = 0; // waiting for method byte - private const int FLAG = 1; // waiting for flag byte - private const int DICT4 = 2; // four dictionary check bytes to go - private const int DICT3 = 3; // three dictionary check bytes to go - private const int DICT2 = 4; // two dictionary check bytes to go - private const int DICT1 = 5; // one dictionary check byte to go - private const int DICT0 = 6; // waiting for inflateSetDictionary - private const int BLOCKS = 7; // decompressing blocks - private const int CHECK4 = 8; // four check bytes to go - private const int CHECK3 = 9; // three check bytes to go - private const int CHECK2 = 10; // two check bytes to go - private const int CHECK1 = 11; // one check byte to go - private const int DONE = 12; // finished check, done - private const int BAD = 13; // got an error--stay here - - internal int mode; // current inflate mode - - // mode dependent information - internal int method; // if FLAGS, method byte - - // if CHECK, check values to compare - internal long[] was = new long[1]; // computed check value - internal long need; // stream check value - - // if BAD, inflateSync's marker bytes count - internal int marker; - - // mode independent information - internal int nowrap; // flag for no wrapper - internal int wbits; // log2(window size) (8..15, defaults to 15) - - internal InfBlocks blocks; // current inflate_blocks state - - internal int inflateReset(ZStream z) - { - if (z == null || z.istate == null) - return Z_STREAM_ERROR; - - z.total_in = z.total_out = 0; - z.msg = null; - z.istate.mode = z.istate.nowrap != 0 ? BLOCKS : METHOD; - z.istate.blocks.reset(z, null); - return Z_OK; - } - - internal int inflateEnd(ZStream z) - { - if (blocks != null) - blocks.free(z); - blocks = null; - // ZFREE(z, z->state); - return Z_OK; - } - - internal int inflateInit(ZStream z, int w) - { - z.msg = null; - blocks = null; - - // handle undocumented nowrap option (no zlib header or check) - nowrap = 0; - if (w < 0) - { - w = -w; - nowrap = 1; - } - - // set window size - if (w < 8 || w > 15) - { - inflateEnd(z); - return Z_STREAM_ERROR; - } - wbits = w; - - z.istate.blocks = new InfBlocks(z, z.istate.nowrap != 0 ? null : this, 1 << w); - - // reset state - inflateReset(z); - return Z_OK; - } - - internal int inflate(ZStream z, int f) - { - int r; - int b; - - if (z == null || z.istate == null || z.next_in == null) - return Z_STREAM_ERROR; - f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; - r = Z_BUF_ERROR; - while (true) - { - //System.out.println("mode: "+z.istate.mode); - switch (z.istate.mode) - { - - case METHOD: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - if (((z.istate.method = z.next_in[z.next_in_index++]) & 0xf) != Z_DEFLATED) - { - z.istate.mode = BAD; - z.msg = "unknown compression method"; - z.istate.marker = 5; // can't try inflateSync - break; - } - if ((z.istate.method >> 4) + 8 > z.istate.wbits) - { - z.istate.mode = BAD; - z.msg = "invalid window size"; - z.istate.marker = 5; // can't try inflateSync - break; - } - z.istate.mode = FLAG; - goto case FLAG; - - case FLAG: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - b = (z.next_in[z.next_in_index++]) & 0xff; - - if ((((z.istate.method << 8) + b) % 31) != 0) - { - z.istate.mode = BAD; - z.msg = "incorrect header check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - if ((b & PRESET_DICT) == 0) - { - z.istate.mode = BLOCKS; - break; - } - z.istate.mode = DICT4; - goto case DICT4; - - case DICT4: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int)0xff000000L); - z.istate.mode = DICT3; - goto case DICT3; - - case DICT3: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); - z.istate.mode = DICT2; - goto case DICT2; - - case DICT2: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); - z.istate.mode = DICT1; - goto case DICT1; - - case DICT1: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); - z.adler = z.istate.need; - z.istate.mode = DICT0; - return Z_NEED_DICT; - - case DICT0: - z.istate.mode = BAD; - z.msg = "need dictionary"; - z.istate.marker = 0; // can try inflateSync - return Z_STREAM_ERROR; - - case BLOCKS: - - r = z.istate.blocks.proc(z, r); - if (r == Z_DATA_ERROR) - { - z.istate.mode = BAD; - z.istate.marker = 0; // can try inflateSync - break; - } - if (r == Z_OK) - { - r = f; - } - if (r != Z_STREAM_END) - { - return r; - } - r = f; - z.istate.blocks.reset(z, z.istate.was); - if (z.istate.nowrap != 0) - { - z.istate.mode = DONE; - break; - } - z.istate.mode = CHECK4; - goto case CHECK4; - - case CHECK4: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int)0xff000000L); - z.istate.mode = CHECK3; - goto case CHECK3; - - case CHECK3: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); - z.istate.mode = CHECK2; - goto case CHECK2; - - case CHECK2: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); - z.istate.mode = CHECK1; - goto case CHECK1; - - case CHECK1: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); - - if (((int)(z.istate.was[0])) != ((int)(z.istate.need))) - { - z.istate.mode = BAD; - z.msg = "incorrect data check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - z.istate.mode = DONE; - goto case DONE; - - case DONE: - return Z_STREAM_END; - - case BAD: - return Z_DATA_ERROR; - - default: - return Z_STREAM_ERROR; - - } - } - } - - - internal int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength) - { - int index = 0; - int length = dictLength; - if (z == null || z.istate == null || z.istate.mode != DICT0) - return Z_STREAM_ERROR; - - if (z._adler.adler32(1L, dictionary, 0, dictLength) != z.adler) - { - return Z_DATA_ERROR; - } - - z.adler = z._adler.adler32(0, null, 0, 0); - - if (length >= (1 << z.istate.wbits)) - { - length = (1 << z.istate.wbits) - 1; - index = dictLength - length; - } - z.istate.blocks.set_dictionary(dictionary, index, length); - z.istate.mode = BLOCKS; - return Z_OK; - } - - private static byte[] mark = new byte[] { 0, 0, 0xff, 0xff }; - - internal int inflateSync(ZStream z) - { - int n; // number of bytes to look at - int p; // pointer to bytes - int m; // number of marker bytes found in a row - long r, w; // temporaries to save total_in and total_out - - // set up - if (z == null || z.istate == null) - return Z_STREAM_ERROR; - if (z.istate.mode != BAD) - { - z.istate.mode = BAD; - z.istate.marker = 0; - } - if ((n = z.avail_in) == 0) - return Z_BUF_ERROR; - p = z.next_in_index; - m = z.istate.marker; - - // search - while (n != 0 && m < 4) - { - if (z.next_in[p] == mark[m]) - { - m++; - } - else if (z.next_in[p] != 0) - { - m = 0; - } - else - { - m = 4 - m; - } - p++; n--; - } - - // restore - z.total_in += p - z.next_in_index; - z.next_in_index = p; - z.avail_in = n; - z.istate.marker = m; - - // return no joy or set up to restart on a new block - if (m != 4) - { - return Z_DATA_ERROR; - } - r = z.total_in; w = z.total_out; - inflateReset(z); - z.total_in = r; z.total_out = w; - z.istate.mode = BLOCKS; - return Z_OK; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - // but removes the length bytes of the resulting empty stored block. When - // decompressing, PPP checks that at the end of input packet, inflate is - // waiting for these length bytes. - internal int inflateSyncPoint(ZStream z) - { - if (z == null || z.istate == null || z.istate.blocks == null) - return Z_STREAM_ERROR; - return z.istate.blocks.sync_point(); - } - } - #endregion - - #region Adler32 - sealed class Adler32 - { - - // largest prime smaller than 65536 - private const int BASE = 65521; - // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - private const int NMAX = 5552; - - internal long adler32(long adler, byte[] buf, int index, int len) - { - if (buf == null) - { - return 1L; - } - - long s1 = adler & 0xffff; - long s2 = (adler >> 16) & 0xffff; - int k; - - while (len > 0) - { - k = len < NMAX ? len : NMAX; - len -= k; - while (k >= 16) - { - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - k -= 16; - } - if (k != 0) - { - do - { - s1 += (buf[index++] & 0xff); s2 += s1; - } - while (--k != 0); - } - s1 %= BASE; - s2 %= BASE; - } - return (s2 << 16) | s1; - } - - } - #endregion - - #region Constants - sealed class zlibConst - { - public const System.String version = "1.0.2"; - - // compression levels - public const int Z_NO_COMPRESSION = 0; - public const int Z_BEST_SPEED = 1; - public const int Z_BEST_COMPRESSION = 9; - public const int Z_DEFAULT_COMPRESSION = (-1); - - // compression strategy - public const int Z_FILTERED = 1; - public const int Z_HUFFMAN_ONLY = 2; - public const int Z_DEFAULT_STRATEGY = 0; - - public const int Z_NO_FLUSH = 0; - public const int Z_PARTIAL_FLUSH = 1; - public const int Z_SYNC_FLUSH = 2; - public const int Z_FULL_FLUSH = 3; - public const int Z_FINISH = 4; - - public const int Z_OK = 0; - public const int Z_STREAM_END = 1; - public const int Z_NEED_DICT = 2; - public const int Z_ERRNO = -1; - public const int Z_STREAM_ERROR = -2; - public const int Z_DATA_ERROR = -3; - public const int Z_MEM_ERROR = -4; - public const int Z_BUF_ERROR = -5; - public const int Z_VERSION_ERROR = -6; - } - #endregion - - #region InfBlocks - sealed class InfBlocks - { - private const int MANY = 1440; - - // And'ing with mask[n] masks the lower n bits - private static readonly int[] inflate_mask = new int[] - { - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, - 0x0000ffff - }; - - // Table for deflate from PKZIP's appnote.txt. - internal static readonly int[] border = new int[] - { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - }; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - private const int TYPE = 0; // get type bits (3, including end bit) - private const int LENS = 1; // get lengths for stored - private const int STORED = 2; // processing stored block - private const int TABLE = 3; // get table lengths - private const int BTREE = 4; // get bit lengths tree for a dynamic block - private const int DTREE = 5; // get length, distance trees for a dynamic block - private const int CODES = 6; // processing fixed or dynamic block - private const int DRY = 7; // output remaining window bytes - private const int DONE = 8; // finished last block, done - private const int BAD = 9; // ot a data error--stuck here - - internal int mode; // current inflate_block mode - - internal int left; // if STORED, bytes left to copy - - internal int table; // table lengths (14 bits) - internal int index; // index into blens (or border) - internal int[] blens; // bit lengths of codes - internal int[] bb = new int[1]; // bit length tree depth - internal int[] tb = new int[1]; // bit length decoding tree - - internal InfCodes codes; // if CODES, current state - - internal int last; // true if this block is the last block - - // mode independent information - internal int bitk; // bits in bit buffer - internal int bitb; // bit buffer - internal int[] hufts; // single malloc for tree space - internal byte[] window; // sliding window - internal int end; // one byte after sliding window - internal int read; // window read pointer - internal int write; // window write pointer - internal System.Object checkfn; // check function - internal long check; // check on output - - internal InfBlocks(ZStream z, System.Object checkfn, int w) - { - hufts = new int[MANY * 3]; - window = new byte[w]; - end = w; - this.checkfn = checkfn; - mode = TYPE; - reset(z, null); - } - - internal void reset(ZStream z, long[] c) - { - if (c != null) - c[0] = check; - if (mode == BTREE || mode == DTREE) - { - blens = null; - } - if (mode == CODES) - { - codes.free(z); - } - mode = TYPE; - bitk = 0; - bitb = 0; - read = write = 0; - - if (checkfn != null) - z.adler = check = z._adler.adler32(0L, null, 0, 0); - } - - internal int proc(ZStream z, int r) - { - int t; // temporary storage - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - - // copy input/output information to locals (UPDATE macro restores) - { - p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; - } - { - q = write; m = (int)(q < read ? read - q - 1 : end - q); - } - - // process input based on current state - while (true) - { - switch (mode) - { - - case TYPE: - - while (k < (3)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - t = (int)(b & 7); - last = t & 1; - - switch (SupportClass.URShift(t, 1)) - { - - case 0: // stored - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - t = k & 7; // go to byte boundary - { - b = SupportClass.URShift(b, (t)); k -= (t); - } - mode = LENS; // get length of stored block - break; - - case 1: // fixed - { - int[] bl = new int[1]; - int[] bd = new int[1]; - int[][] tl = new int[1][]; - int[][] td = new int[1][]; - - InfTree.inflate_trees_fixed(bl, bd, tl, td, z); - codes = new InfCodes(bl[0], bd[0], tl[0], td[0], z); - } - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - - mode = CODES; - break; - - case 2: // dynamic - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - - mode = TABLE; - break; - - case 3: // illegal - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - mode = BAD; - z.msg = "invalid block type"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - break; - - case LENS: - - while (k < (32)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - if (((SupportClass.URShift((~b), 16)) & 0xffff) != (b & 0xffff)) - { - mode = BAD; - z.msg = "invalid stored block lengths"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - left = (b & 0xffff); - b = k = 0; // dump bits - mode = left != 0 ? STORED : (last != 0 ? DRY : TYPE); - break; - - case STORED: - if (n == 0) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - if (m == 0) - { - if (q == end && read != 0) - { - q = 0; m = (int)(q < read ? read - q - 1 : end - q); - } - if (m == 0) - { - write = q; - r = inflate_flush(z, r); - q = write; m = (int)(q < read ? read - q - 1 : end - q); - if (q == end && read != 0) - { - q = 0; m = (int)(q < read ? read - q - 1 : end - q); - } - if (m == 0) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - } - } - r = Z_OK; - - t = left; - if (t > n) - t = n; - if (t > m) - t = m; - Buffer.BlockCopy(z.next_in, p, window, q, t); - p += t; n -= t; - q += t; m -= t; - if ((left -= t) != 0) - break; - mode = last != 0 ? DRY : TYPE; - break; - - case TABLE: - - while (k < (14)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - table = t = (b & 0x3fff); - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - mode = BAD; - z.msg = "too many length or distance symbols"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - blens = new int[t]; - { - b = SupportClass.URShift(b, (14)); k -= (14); - } - - index = 0; - mode = BTREE; - goto case BTREE; - - case BTREE: - while (index < 4 + (SupportClass.URShift(table, 10))) - { - while (k < (3)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - blens[border[index++]] = b & 7; - - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - } - - while (index < 19) - { - blens[border[index++]] = 0; - } - - bb[0] = 7; - t = InfTree.inflate_trees_bits(blens, bb, tb, hufts, z); - if (t != Z_OK) - { - r = t; - if (r == Z_DATA_ERROR) - { - blens = null; - mode = BAD; - } - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - index = 0; - mode = DTREE; - goto case DTREE; - - case DTREE: - while (true) - { - t = table; - if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) - { - break; - } - - - int i, j, c; - - t = bb[0]; - - while (k < (t)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - if (tb[0] == -1) - { - //System.err.println("null..."); - } - - t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; - - if (c < 16) - { - b = SupportClass.URShift(b, (t)); k -= (t); - blens[index++] = c; - } - else - { - // c == 16..18 - i = c == 18 ? 7 : c - 14; - j = c == 18 ? 11 : 3; - - while (k < (t + i)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - b = SupportClass.URShift(b, (t)); k -= (t); - - j += (b & inflate_mask[i]); - - b = SupportClass.URShift(b, (i)); k -= (i); - - i = index; - t = table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) - { - blens = null; - mode = BAD; - z.msg = "invalid bit length repeat"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - c = c == 16 ? blens[i - 1] : 0; - do - { - blens[i++] = c; - } - while (--j != 0); - index = i; - } - } - - tb[0] = -1; - { - int[] bl = new int[1]; - int[] bd = new int[1]; - int[] tl = new int[1]; - int[] td = new int[1]; - - - bl[0] = 9; // must be <= 9 for lookahead assumptions - bd[0] = 6; // must be <= 9 for lookahead assumptions - t = table; - t = InfTree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, z); - if (t != Z_OK) - { - if (t == Z_DATA_ERROR) - { - blens = null; - mode = BAD; - } - r = t; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - codes = new InfCodes(bl[0], bd[0], hufts, tl[0], hufts, td[0], z); - } - blens = null; - mode = CODES; - goto case CODES; - - case CODES: - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - - if ((r = codes.proc(this, z, r)) != Z_STREAM_END) - { - return inflate_flush(z, r); - } - r = Z_OK; - codes.free(z); - - p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; - q = write; m = (int)(q < read ? read - q - 1 : end - q); - - if (last == 0) - { - mode = TYPE; - break; - } - mode = DRY; - goto case DRY; - - case DRY: - write = q; - r = inflate_flush(z, r); - q = write; m = (int)(q < read ? read - q - 1 : end - q); - if (read != write) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - mode = DONE; - goto case DONE; - - case DONE: - r = Z_STREAM_END; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - case BAD: - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - - default: - r = Z_STREAM_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - } - } - } - - internal void free(ZStream z) - { - reset(z, null); - window = null; - hufts = null; - //ZFREE(z, s); - } - - internal void set_dictionary(byte[] d, int start, int n) - { - Buffer.BlockCopy(d, start, window, 0, n); - read = write = n; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. - internal int sync_point() - { - return mode == LENS ? 1 : 0; - } - - // copy as much as possible from the sliding window to the output area - internal int inflate_flush(ZStream z, int r) - { - int n; - int p; - int q; - - // local copies of source and destination pointers - p = z.next_out_index; - q = read; - - // compute number of bytes to copy as far as end of window - n = (int)((q <= write ? write : end) - q); - if (n > z.avail_out) - n = z.avail_out; - if (n != 0 && r == Z_BUF_ERROR) - r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if (checkfn != null) - z.adler = check = z._adler.adler32(check, window, q, n); - - // copy as far as end of window - Buffer.BlockCopy(window, q, z.next_out, p, n); - p += n; - q += n; - - // see if more to copy at beginning of window - if (q == end) - { - // wrap pointers - q = 0; - if (write == end) - write = 0; - - // compute bytes to copy - n = write - q; - if (n > z.avail_out) - n = z.avail_out; - if (n != 0 && r == Z_BUF_ERROR) - r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if (checkfn != null) - z.adler = check = z._adler.adler32(check, window, q, n); - - // copy - Buffer.BlockCopy(window, q, z.next_out, p, n); - p += n; - q += n; - } - - // update pointers - z.next_out_index = p; - read = q; - - // done - return r; - } - } - #endregion - - #region InfCodes - sealed class InfCodes - { - - private static readonly int[] inflate_mask = new int[] { 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff }; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - // waiting for "i:"=input, - // "o:"=output, - // "x:"=nothing - private const int START = 0; // x: set up for LEN - private const int LEN = 1; // i: get length/literal/eob next - private const int LENEXT = 2; // i: getting length extra (have base) - private const int DIST = 3; // i: get distance next - private const int DISTEXT = 4; // i: getting distance extra - private const int COPY = 5; // o: copying bytes in window, waiting for space - private const int LIT = 6; // o: got literal, waiting for output space - private const int WASH = 7; // o: got eob, possibly still output waiting - private const int END = 8; // x: got eob and all data flushed - private const int BADCODE = 9; // x: got error - - internal int mode; // current inflate_codes mode - - // mode dependent information - internal int len; - - internal int[] tree; // pointer into tree - internal int tree_index = 0; - internal int need; // bits needed - - internal int lit; - - // if EXT or COPY, where and how much - internal int get_Renamed; // bits to get for extra - internal int dist; // distance back to copy from - - internal byte lbits; // ltree bits decoded per branch - internal byte dbits; // dtree bits decoder per branch - internal int[] ltree; // literal/length/eob tree - internal int ltree_index; // literal/length/eob tree - internal int[] dtree; // distance tree - internal int dtree_index; // distance tree - - internal InfCodes(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, ZStream z) - { - mode = START; - lbits = (byte)bl; - dbits = (byte)bd; - ltree = tl; - ltree_index = tl_index; - dtree = td; - dtree_index = td_index; - } - - internal InfCodes(int bl, int bd, int[] tl, int[] td, ZStream z) - { - mode = START; - lbits = (byte)bl; - dbits = (byte)bd; - ltree = tl; - ltree_index = 0; - dtree = td; - dtree_index = 0; - } - - internal int proc(InfBlocks s, ZStream z, int r) - { - int j; // temporary storage - //int[] t; // temporary pointer - int tindex; // temporary pointer - int e; // extra bits or operation - int b = 0; // bit buffer - int k = 0; // bits in bit buffer - int p = 0; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int f; // pointer to copy strings from - - // copy input/output information to locals (UPDATE macro restores) - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - // process input and output based on current state - while (true) - { - switch (mode) - { - - // waiting for "i:"=input, "o:"=output, "x:"=nothing - case START: // x: set up for LEN - if (m >= 258 && n >= 10) - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - r = inflate_fast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, s, z); - - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - if (r != Z_OK) - { - mode = r == Z_STREAM_END ? WASH : BADCODE; - break; - } - } - need = lbits; - tree = ltree; - tree_index = ltree_index; - - mode = LEN; - goto case LEN; - - case LEN: // i: get length/literal/eob next - j = need; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & inflate_mask[j])) * 3; - - b = SupportClass.URShift(b, (tree[tindex + 1])); - k -= (tree[tindex + 1]); - - e = tree[tindex]; - - if (e == 0) - { - // literal - lit = tree[tindex + 2]; - mode = LIT; - break; - } - if ((e & 16) != 0) - { - // length - get_Renamed = e & 15; - len = tree[tindex + 2]; - mode = LENEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - if ((e & 32) != 0) - { - // end of block - mode = WASH; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid literal/length code"; - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case LENEXT: // i: getting length extra (have base) - j = get_Renamed; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - len += (b & inflate_mask[j]); - - b >>= j; - k -= j; - - need = dbits; - tree = dtree; - tree_index = dtree_index; - mode = DIST; - goto case DIST; - - case DIST: // i: get distance next - j = need; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & inflate_mask[j])) * 3; - - b >>= tree[tindex + 1]; - k -= tree[tindex + 1]; - - e = (tree[tindex]); - if ((e & 16) != 0) - { - // distance - get_Renamed = e & 15; - dist = tree[tindex + 2]; - mode = DISTEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid distance code"; - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case DISTEXT: // i: getting distance extra - j = get_Renamed; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - dist += (b & inflate_mask[j]); - - b >>= j; - k -= j; - - mode = COPY; - goto case COPY; - - case COPY: // o: copying bytes in window, waiting for space - f = q - dist; - while (f < 0) - { - // modulo window size-"while" instead - f += s.end; // of "if" handles invalid distances - } - while (len != 0) - { - - if (m == 0) - { - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read ? s.read - q - 1 : s.end - q; - } - if (m == 0) - { - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read ? s.read - q - 1 : s.end - q; - } - - if (m == 0) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - } - } - - s.window[q++] = s.window[f++]; m--; - - if (f == s.end) - f = 0; - len--; - } - mode = START; - break; - - case LIT: // o: got literal, waiting for output space - if (m == 0) - { - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read ? s.read - q - 1 : s.end - q; - } - if (m == 0) - { - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read ? s.read - q - 1 : s.end - q; - } - if (m == 0) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - } - } - r = Z_OK; - - s.window[q++] = (byte)lit; m--; - - mode = START; - break; - - case WASH: // o: got eob, possibly more output - if (k > 7) - { - // return unused byte, if any - k -= 8; - n++; - p--; // can always return one - } - - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - if (s.read != s.write) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - mode = END; - goto case END; - - case END: - r = Z_STREAM_END; - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case BADCODE: // x: got error - - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - default: - r = Z_STREAM_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - } - } - } - - internal void free(ZStream z) - { - // ZFREE(z, c); - } - - // Called with number of bytes left to write in window at least 258 - // (the maximum string length) and number of input bytes available - // at least ten. The ten bytes are six bytes for the longest length/ - // distance pair plus four bytes for overloading the bit buffer. - - internal int inflate_fast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InfBlocks s, ZStream z) - { - int t; // temporary pointer - int[] tp; // temporary pointer - int tp_index; // temporary pointer - int e; // extra bits or operation - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int ml; // mask for literal/length tree - int md; // mask for distance tree - int c; // bytes to copy - int d; // distance back to copy from - int r; // copy source pointer - - // load input, output, bit values - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read ? s.read - q - 1 : s.end - q; - - // initialize masks - ml = inflate_mask[bl]; - md = inflate_mask[bd]; - - // do until not enough input or output space for fast loop - do - { - // assume called with m >= 258 && n >= 10 - // get literal/length code - while (k < (20)) - { - // max bits for literal/length code - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - t = b & ml; - tp = tl; - tp_index = tl_index; - if ((e = tp[(tp_index + t) * 3]) == 0) - { - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - s.window[q++] = (byte)tp[(tp_index + t) * 3 + 2]; - m--; - continue; - } - do - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - if ((e & 16) != 0) - { - e &= 15; - c = tp[(tp_index + t) * 3 + 2] + ((int)b & inflate_mask[e]); - - b >>= e; k -= e; - - // decode distance base of block to copy - while (k < (15)) - { - // max bits for distance code - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - t = b & md; - tp = td; - tp_index = td_index; - e = tp[(tp_index + t) * 3]; - - do - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - if ((e & 16) != 0) - { - // get extra bits to add to distance base - e &= 15; - while (k < (e)) - { - // get extra bits (up to 13) - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - d = tp[(tp_index + t) * 3 + 2] + (b & inflate_mask[e]); - - b >>= (e); k -= (e); - - // do the copy - m -= c; - if (q >= d) - { - // offset before dest - // just copy - r = q - d; - if (q - r > 0 && 2 > (q - r)) - { - s.window[q++] = s.window[r++]; c--; // minimum count is three, - s.window[q++] = s.window[r++]; c--; // so unroll loop a little - } - else - { - Buffer.BlockCopy(s.window, r, s.window, q, 2); - q += 2; r += 2; c -= 2; - } - } - else - { - // else offset after destination - r = q - d; - do - { - r += s.end; // force pointer in window - } - while (r < 0); // covers invalid distances - e = s.end - r; - if (c > e) - { - // if source crosses, - c -= e; // wrapped copy - if (q - r > 0 && e > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--e != 0); - } - else - { - Buffer.BlockCopy(s.window, r, s.window, q, e); - q += e; r += e; e = 0; - } - r = 0; // copy rest from start of window - } - } - - // copy all or what's left - if (q - r > 0 && c > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--c != 0); - } - else - { - Buffer.BlockCopy(s.window, r, s.window, q, c); - q += c; r += c; c = 0; - } - break; - } - else if ((e & 64) == 0) - { - t += tp[(tp_index + t) * 3 + 2]; - t += (b & inflate_mask[e]); - e = tp[(tp_index + t) * 3]; - } - else - { - z.msg = "invalid distance code"; - - c = z.avail_in - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_DATA_ERROR; - } - } - while (true); - break; - } - - if ((e & 64) == 0) - { - t += tp[(tp_index + t) * 3 + 2]; - t += (b & inflate_mask[e]); - if ((e = tp[(tp_index + t) * 3]) == 0) - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - s.window[q++] = (byte)tp[(tp_index + t) * 3 + 2]; - m--; - break; - } - } - else if ((e & 32) != 0) - { - - c = z.avail_in - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_STREAM_END; - } - else - { - z.msg = "invalid literal/length code"; - - c = z.avail_in - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_DATA_ERROR; - } - } - while (true); - } - while (m >= 258 && n >= 10); - - // not enough input or output--restore pointers and return - c = z.avail_in - n; c = (k >> 3) < c ? k >> 3 : c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_OK; - } - } - #endregion - - #region InfTree - sealed class InfTree - { - - private const int MANY = 1440; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - internal const int fixed_bl = 9; - internal const int fixed_bd = 5; - - - internal static readonly int[] fixed_tl = new int[] - { - 096, 007, 256, 000, 008, 080, 000, 008, 016, 084, - 008, 115, 082, 007, 031, 000, 008, 112, 000, 008, - 048, 000, 009, 192, 080, 007, 010, 000, 008, 096, - 000, 008, 032, 000, 009, 160, 000, 008, 000, 000, - 008, 128, 000, 008, 064, 000, 009, 224, 080, 007, - 006, 000, 008, 088, 000, 008, 024, 000, 009, 144, - 083, 007, 059, 000, 008, 120, 000, 008, 056, 000, - 009, 208, 081, 007, 017, 000, 008, 104, 000, 008, - 040, 000, 009, 176, 000, 008, 008, 000, 008, 136, - 000, 008, 072, 000, 009, 240, 080, 007, 004, 000, -#region NotAsFormatted - 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, - 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, - 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, - 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, - 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, - 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, - 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, - 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, - 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, - 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, - 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, - 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, - 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, - 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, - 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, - 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, - 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, - 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, - 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, - 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, - 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, - 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, - 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, - 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, - 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, - 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, - 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, - 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, - 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, - 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, - 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, - 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, - 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, - 000, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, - 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, - 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, - 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, - 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, - 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, - 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, - 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, - 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, - 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, - 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, - 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, - 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, - 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, - 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, - 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, - 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, - 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, - 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, - 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, - 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, - 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, - 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, - 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, - 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, - 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, - 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, - 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, - 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, - 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, - 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, - 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, - 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, - 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, - 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, - 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, - 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, - 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, - 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, - 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, - 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, - 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, - 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, - 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, - 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, - 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, - 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, - 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, - 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, - 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, - 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, - 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, - 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, - 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, - 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, - 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, - 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, - 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, - 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, - 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, - 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, - 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, - 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, - 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, - 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255 -#endregion - }; - - - internal static readonly int[] fixed_td = new int[] - { - 80, 5, 1, 87, 5, 257, 83, 005, 017, 091, 005, 4097, - 81, 5, 5, 89, 5, 1025, 85, 005, 65, 93, 005, 16385, - 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 005, 8193, 82, - 5, 9, 90, 5, 2049, 86, 5, 129, 192, 005, 24577, 80, - 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, - 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, - 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 090, 5, - 3073, 86, 5, 193, 192, 5, 24577 - }; - - // Tables for deflate from PKZIP's appnote.txt. - internal static readonly int[] cplens = new int[] - { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, - 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, - 131, 163, 195, 227, 258, 0, 0 - }; - - internal static readonly int[] cplext = new int[] - { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, - 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, - 0, 112, 112 - }; - - internal static readonly int[] cpdist = new int[] - { - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, - 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, - 3073, 4097, 6145, 8193, 12289, 16385, 24577 - }; - - internal static readonly int[] cpdext = new int[] - { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, - 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, - 13, 13 - }; - - // If BMAX needs to be larger than 16, then h and x[] should be uLong. - internal const int BMAX = 15; // maximum bit length of any code - - internal static int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) - { - // Given a list of code lengths and a maximum table size, make a set of - // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - // if the given code set is incomplete (the tables are still built in this - // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - // lengths), or Z_MEM_ERROR if not enough memory. - - int a; // counter for codes of length k - int[] c = new int[BMAX + 1]; // bit length count table - int f; // i repeats in table every f entries - int g; // maximum code length - int h; // table level - int i; // counter, current code - int j; // counter - int k; // number of bits in current code - int l; // bits per table (returned in m) - int mask; // (1 << w) - 1, to avoid cc -O bug on HP - int p; // pointer into c[], b[], or v[] - int q; // points to current table - int[] r = new int[3]; // table entry for structure assignment - int[] u = new int[BMAX]; // table stack - int w; // bits before this table == (l * h) - int[] x = new int[BMAX + 1]; // bit offsets, then code stack - int xp; // pointer into x - int y; // number of dummy codes added - int z; // number of entries in current table - - // Generate counts for each bit length - - p = 0; i = n; - do - { - c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX - } - while (i != 0); - - if (c[0] == n) - { - // null input--all zero length codes - t[0] = -1; - m[0] = 0; - return Z_OK; - } - - // Find minimum and maximum length, bound *m by those - l = m[0]; - for (j = 1; j <= BMAX; j++) - if (c[j] != 0) - break; - k = j; // minimum code length - if (l < j) - { - l = j; - } - for (i = BMAX; i != 0; i--) - { - if (c[i] != 0) - break; - } - g = i; // maximum code length - if (l > i) - { - l = i; - } - m[0] = l; - - // Adjust last length count to fill out codes, if needed - for (y = 1 << j; j < i; j++, y <<= 1) - { - if ((y -= c[j]) < 0) - { - return Z_DATA_ERROR; - } - } - if ((y -= c[i]) < 0) - { - return Z_DATA_ERROR; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = 1; xp = 2; - while (--i != 0) - { - // note that i == g from above - x[xp] = (j += c[p]); - xp++; - p++; - } - - // Make a table of values in order of bit lengths - i = 0; p = 0; - do - { - if ((j = b[bindex + p]) != 0) - { - v[x[j]++] = i; - } - p++; - } - while (++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = 0; // grab values in bit order - h = -1; // no tables yet--level -1 - w = -l; // bits decoded == (l * h) - u[0] = 0; // just to keep compilers happy - q = 0; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for (; k <= g; k++) - { - a = c[k]; - while (a-- != 0) - { - // here i is the Huffman code of length k bits for value *p - // make tables up to required level - while (k > w + l) - { - h++; - w += l; // previous table always l bits - // compute minimum size table less than or equal to l bits - z = g - w; - z = (z > l) ? l : z; // table size upper limit - if ((f = 1 << (j = k - w)) > a + 1) - { - // try a k-w bit table - // too few codes for k-w bit table - f -= (a + 1); // deduct codes from patterns left - xp = k; - if (j < z) - { - while (++j < z) - { - // try smaller tables up to z bits - if ((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - } - z = 1 << j; // table entries for j-bit table - - // allocate new table - if (hn[0] + z > MANY) - // (note: doesn't matter for fixed) - return Z_DATA_ERROR; // overflow of MANY - u[h] = q = hn[0]; // DEBUG - hn[0] += z; - - // connect to last table, if there is one - if (h != 0) - { - x[h] = i; // save pattern for backing up - r[0] = (byte)j; // bits in this table - r[1] = (byte)l; // bits to dump before this table - j = SupportClass.URShift(i, (w - l)); - r[2] = (int)(q - u[h - 1] - j); // offset to this table - Buffer.BlockCopy(r, 0, hp, (u[h - 1] + j) * 3 * sizeof(int), 3 * sizeof(int)); // connect to last table - } - else - { - t[0] = q; // first table is returned result - } - } - - // set up table entry in r - r[1] = (byte)(k - w); - if (p >= n) - { - r[0] = 128 + 64; // out of values--invalid code - } - else if (v[p] < s) - { - r[0] = (byte)(v[p] < 256 ? 0 : 32 + 64); // 256 is end-of-block - r[2] = v[p++]; // simple code is just the value - } - else - { - r[0] = (byte)(e[v[p] - s] + 16 + 64); // non-simple--look up in lists - r[2] = d[v[p++] - s]; - } - - // fill code-like entries with r - f = 1 << (k - w); - for (j = SupportClass.URShift(i, w); j < z; j += f) - { - Buffer.BlockCopy(r, 0, hp, (q + j) * 3 * sizeof(int), 3 * sizeof(int)); - } - - // backwards increment the k-bit code i - for (j = 1 << (k - 1); (i & j) != 0; j = SupportClass.URShift(j, 1)) - { - i ^= j; - } - i ^= j; - - // backup over finished tables - mask = (1 << w) - 1; // needed on HP, cc -O bug - while ((i & mask) != x[h]) - { - h--; // don't need to update q - w -= l; - mask = (1 << w) - 1; - } - } - } - // Return Z_BUF_ERROR if we were given an incomplete table - return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; - } - - internal static int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z) - { - int r; - int[] hn = new int[1]; // hufts used in space - int[] v = new int[19]; // work area for huft_build - - r = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); - - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed dynamic bit lengths tree"; - } - else if (r == Z_BUF_ERROR || bb[0] == 0) - { - z.msg = "incomplete dynamic bit lengths tree"; - r = Z_DATA_ERROR; - } - return r; - } - - internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z) - { - int r; - int[] hn = new int[1]; // hufts used in space - int[] v = new int[288]; // work area for huft_build - - // build literal/length tree - r = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); - if (r != Z_OK || bl[0] == 0) - { - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed literal/length tree"; - } - else if (r != Z_MEM_ERROR) - { - z.msg = "incomplete literal/length tree"; - r = Z_DATA_ERROR; - } - return r; - } - - // build distance tree - r = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); - - if (r != Z_OK || (bd[0] == 0 && nl > 257)) - { - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed distance tree"; - } - else if (r == Z_BUF_ERROR) - { - z.msg = "incomplete distance tree"; - r = Z_DATA_ERROR; - } - else if (r != Z_MEM_ERROR) - { - z.msg = "empty distance tree with lengths"; - r = Z_DATA_ERROR; - } - return r; - } - - return Z_OK; - } - - internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z) - { - bl[0] = fixed_bl; - bd[0] = fixed_bd; - tl[0] = fixed_tl; - td[0] = fixed_td; - return Z_OK; - } - } - #endregion - - #region StaticTree - sealed class StaticTree - { - private const int MAX_BITS = 15; - - private const int BL_CODES = 19; - private const int D_CODES = 30; - private const int LITERALS = 256; - private const int LENGTH_CODES = 29; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - - // Bit length codes must not exceed MAX_BL_BITS bits - internal const int MAX_BL_BITS = 7; - - internal static readonly short[] static_ltree = new short[] - { - 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, - 236, 8, 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, - 124, 8, 252, 8, 2, 8, 130, 8, 66, 8, 194, 8, 34, 8, - 162, 8, 98, 8, 226, 8, 18, 8, 146, 8, 82, 8, 210, 8, - 50, 8, 178, 8, 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, - 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, 26, 8, 154, 8, - 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, 6, 8, - 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8, - 22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, - 246, 8, 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, - 110, 8, 238, 8, 30, 8, 158, 8, 94, 8, 222, 8, 62, 8, - 190, 8, 126, 8, 254, 8, 1, 8, 129, 8, 65, 8, 193, 8, - 33, 8, 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, 81, 8, - 209, 8, 49, 8, 177, 8, 113, 8, 241, 8, 9, 8, 137, 8, - 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, - 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, - 5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, - 229, 8, 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, - 117, 8, 245, 8, 13, 8, 141, 8, 77, 8, 205, 8, 45, 8, - 173, 8, 109, 8, 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, - 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, 275, 9, 147, 9, - 403, 9, 83, 9, 339, 9, 211, 9, 467, 9, 51, 9, 307, 9, - 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, 11, - 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, - 9, 43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, - 9, 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, - 9, 219, 9, 475, 9, 59, 9, 315, 9, 187, 9, 443, 9, 123, - 9, 379, 9, 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, 391, - 9, 71, 9, 327, 9, 199, 9, 455, 9, 39, 9, 295, 9, 167, - 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, 23, 9, 279, - 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, 55, - 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, - 503, 9, 15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, - 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, 431, 9, 111, - 9, 367, 9, 239, 9, 495, 9, 31, 9, 287, 9, 159, 9, 415, - 9, 95, 9, 351, 9, 223, 9, 479, 9, 63, 9, 319, 9, 191, - 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, 0, 7, 64, 7 - , 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, 72, - 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, 4, 7, - 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, 3, - 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8 - }; - - internal static readonly short[] static_dtree = new short[] - { - 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, - 5, 28, 5, 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, - 22, 5, 14, 5, 30, 5, 1, 5, 17, 5, 9, 5, 25, - 5, 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, 19, 5, - 11, 5, 27, 5, 7, 5, 23, 5 - }; - - internal static StaticTree static_l_desc; - - internal static StaticTree static_d_desc; - - internal static StaticTree static_bl_desc; - - internal short[] static_tree; // static tree or null - internal int[] extra_bits; // extra bits for each code or null - internal int extra_base; // base index for extra_bits - internal int elems; // max number of elements in the tree - internal int max_length; // max bit length for the codes - - internal StaticTree(short[] static_tree, int[] extra_bits, int extra_base, int elems, int max_length) - { - this.static_tree = static_tree; - this.extra_bits = extra_bits; - this.extra_base = extra_base; - this.elems = elems; - this.max_length = max_length; - } - static StaticTree() - { - static_l_desc = new StaticTree(static_ltree, Tree.extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTree(static_dtree, Tree.extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, BL_CODES, MAX_BL_BITS); - } - } - #endregion - - #region SupportClass - class SupportClass - { - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static long Identity(long literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static ulong Identity(ulong literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static float Identity(float literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static double Identity(double literal) - { - return literal; - } - - /*******************************/ - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static int URShift(int number, int bits) - { - if (number >= 0) - return number >> bits; - else - return (number >> bits) + (2 << ~bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static int URShift(int number, long bits) - { - return URShift(number, (int)bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static long URShift(long number, int bits) - { - if (number >= 0) - return number >> bits; - else - return (number >> bits) + (2L << ~bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static long URShift(long number, long bits) - { - return URShift(number, (int)bits); - } - - /*******************************/ - /// Reads a number of characters from the current source Stream and writes the data to the target array at the specified index. - /// The source Stream to read from. - /// Contains the array of characteres read from the source Stream. - /// The starting index of the target array. - /// The maximum number of characters to read from the source Stream. - /// The number of characters read. The number will be less than or equal to count depending on the data available in the source Stream. Returns -1 if the end of the stream is reached. - public static System.Int32 ReadInput(System.IO.Stream sourceStream, byte[] target, int start, int count) - { - // Returns 0 bytes if not enough space in target - if (target.Length == 0) - return 0; - - byte[] receiver = new byte[target.Length]; - int bytesRead = sourceStream.Read(receiver, start, count); - - // Returns -1 if EOF - if (bytesRead == 0) - return -1; - - for (int i = start; i < start + bytesRead; i++) - target[i] = (byte)receiver[i]; - - return bytesRead; - } - - /// Reads a number of characters from the current source TextReader and writes the data to the target array at the specified index. - /// The source TextReader to read from - /// Contains the array of characteres read from the source TextReader. - /// The starting index of the target array. - /// The maximum number of characters to read from the source TextReader. - /// The number of characters read. The number will be less than or equal to count depending on the data available in the source TextReader. Returns -1 if the end of the stream is reached. - public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) - { - // Returns 0 bytes if not enough space in target - if (target.Length == 0) return 0; - - char[] charArray = new char[target.Length]; - int bytesRead = sourceTextReader.Read(charArray, start, count); - - // Returns -1 if EOF - if (bytesRead == 0) return -1; - - for (int index = start; index < start + bytesRead; index++) - target[index] = (byte)charArray[index]; - - return bytesRead; - } - - /// - /// Converts a string to an array of bytes - /// - /// The string to be converted - /// The new array of bytes - public static byte[] ToByteArray(System.String sourceString) - { - return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); - } - - /// - /// Converts an array of bytes to an array of chars - /// - /// The array of bytes to convert - /// The new array of chars - public static char[] ToCharArray(byte[] byteArray) - { - return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); - } - } - #endregion - - #region Tree - sealed class Tree - { - private const int MAX_BITS = 15; - private const int BL_CODES = 19; - private const int D_CODES = 30; - private const int LITERALS = 256; - private const int LENGTH_CODES = 29; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - private static readonly int HEAP_SIZE = (2 * L_CODES + 1); - - // Bit length codes must not exceed MAX_BL_BITS bits - internal const int MAX_BL_BITS = 7; - - // end of block literal code - internal const int END_BLOCK = 256; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - internal const int REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - internal const int REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - internal const int REPZ_11_138 = 18; - - // extra bits for each length code - internal static readonly int[] extra_lbits = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; - - // extra bits for each distance code - internal static readonly int[] extra_dbits = new int[] { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 }; - - // extra bits for each bit length code - internal static readonly int[] extra_blbits = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7 }; - - internal static readonly byte[] bl_order = new byte[] { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - - - // The lengths of the bit length codes are sent in order of decreasing - // probability, to avoid transmitting the lengths for unused bit - // length codes. - - internal const int Buf_size = 8 * 2; - - // see definition of array dist_code below - internal const int DIST_CODE_LEN = 512; - - internal static readonly byte[] _dist_code = new byte[]{0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29}; - - internal static readonly byte[] _length_code = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; - - internal static readonly int[] base_length = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; - - internal static readonly int[] base_dist = new int[] { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; - - // Mapping from a distance to a distance code. dist is the distance - 1 and - // must not have side effects. _dist_code[256] and _dist_code[257] are never - // used. - internal static int d_code(int dist) - { - return ((dist) < 256 ? _dist_code[dist] : _dist_code[256 + (SupportClass.URShift((dist), 7))]); - } - - internal short[] dyn_tree; // the dynamic tree - internal int max_code; // largest code with non zero frequency - internal StaticTree stat_desc; // the corresponding static tree - - // Compute the optimal bit lengths for a tree and update the total bit length - // for the current block. - // IN assertion: the fields freq and dad are set, heap[heap_max] and - // above are the tree nodes sorted by increasing frequency. - // OUT assertions: the field len is set to the optimal bit length, the - // array bl_count contains the frequencies for each bit length. - // The length opt_len is updated; static_len is also updated if stree is - // not null. - internal void gen_bitlen(Deflate s) - { - short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int[] extra = stat_desc.extra_bits; - int base_Renamed = stat_desc.extra_base; - int max_length = stat_desc.max_length; - int h; // heap index - int n, m; // iterate over the tree elements - int bits; // bit length - int xbits; // extra bits - short f; // frequency - int overflow = 0; // number of elements with bit length too large - - for (bits = 0; bits <= MAX_BITS; bits++) - s.bl_count[bits] = 0; - - // In a first pass, compute the optimal bit lengths (which may - // overflow in the case of the bit length tree). - tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap - - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) - { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; - if (bits > max_length) - { - bits = max_length; overflow++; - } - tree[n * 2 + 1] = (short)bits; - // We overwrite tree[n*2+1] which is no longer needed - - if (n > max_code) - continue; // not a leaf node - - s.bl_count[bits]++; - xbits = 0; - if (n >= base_Renamed) - xbits = extra[n - base_Renamed]; - f = tree[n * 2]; - s.opt_len += f * (bits + xbits); - if (stree != null) - s.static_len += f * (stree[n * 2 + 1] + xbits); - } - if (overflow == 0) - return; - - // This happens for example on obj2 and pic of the Calgary corpus - // Find the first bit length which could increase: - do - { - bits = max_length - 1; - while (s.bl_count[bits] == 0) - bits--; - s.bl_count[bits]--; // move one leaf down the tree - s.bl_count[bits + 1] = (short)(s.bl_count[bits + 1] + 2); // move one overflow item as its brother - s.bl_count[max_length]--; - // The brother of the overflow item also moves one step up, - // but this does not affect bl_count[max_length] - overflow -= 2; - } - while (overflow > 0); - - for (bits = max_length; bits != 0; bits--) - { - n = s.bl_count[bits]; - while (n != 0) - { - m = s.heap[--h]; - if (m > max_code) - continue; - if (tree[m * 2 + 1] != bits) - { - s.opt_len = (int)(s.opt_len + ((long)bits - (long)tree[m * 2 + 1]) * (long)tree[m * 2]); - tree[m * 2 + 1] = (short)bits; - } - n--; - } - } - } - - // Construct one Huffman tree and assigns the code bit strings and lengths. - // Update the total bit length for the current block. - // IN assertion: the field freq is set for all tree elements. - // OUT assertions: the fields len and code are set to the optimal bit length - // and corresponding code. The length opt_len is updated; static_len is - // also updated if stree is not null. The field max_code is set. - internal void build_tree(Deflate s) - { - short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int elems = stat_desc.elems; - int n, m; // iterate over heap elements - int max_code = -1; // largest code with non zero frequency - int node; // new node being created - - // Construct the initial heap, with least frequent element in - // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - // heap[0] is not used. - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) - { - if (tree[n * 2] != 0) - { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } - else - { - tree[n * 2 + 1] = 0; - } - } - - // The pkzip format requires that at least one distance code exists, - // and that at least one bit should be sent even if there is only one - // possible code. So to avoid special checks later on we force at least - // two codes of non zero frequency. - while (s.heap_len < 2) - { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2] = 1; - s.depth[node] = 0; - s.opt_len--; - if (stree != null) - s.static_len -= stree[node * 2 + 1]; - // node is 0 or 1 so it does not have extra bits - } - this.max_code = max_code; - - // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - // establish sub-heaps of increasing lengths: - - for (n = s.heap_len / 2; n >= 1; n--) - s.pqdownheap(tree, n); - - // Construct the Huffman tree by repeatedly combining the least two - // frequent nodes. - - node = elems; // next internal node of the tree - do - { - // n = node of least frequency - n = s.heap[1]; - s.heap[1] = s.heap[s.heap_len--]; - s.pqdownheap(tree, 1); - m = s.heap[1]; // m = node of next least frequency - - s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency - s.heap[--s.heap_max] = m; - - // Create a new node father of n and m - tree[node * 2] = (short)(tree[n * 2] + tree[m * 2]); - s.depth[node] = (byte)(System.Math.Max((byte)s.depth[n], (byte)s.depth[m]) + 1); - tree[n * 2 + 1] = tree[m * 2 + 1] = (short)node; - - // and insert the new node in the heap - s.heap[1] = node++; - s.pqdownheap(tree, 1); - } - while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1]; - - // At this point, the fields freq and dad are set. We can now - // generate the bit lengths. - - gen_bitlen(s); - - // The field len is now set, we can generate the bit codes - gen_codes(tree, max_code, s.bl_count); - } - - // Generate the codes for a given tree and bit counts (which need not be - // optimal). - // IN assertion: the array bl_count contains the bit length statistics for - // the given tree and the field len is set for all tree elements. - // OUT assertion: the field code is set for all tree elements of non - // zero code length. - internal static void gen_codes(short[] tree, int max_code, short[] bl_count) - { - short[] next_code = new short[MAX_BITS + 1]; // next code value for each bit length - short code = 0; // running code value - int bits; // bit index - int n; // code index - - // The distribution counts are first used to generate the code values - // without bit reversal. - for (bits = 1; bits <= MAX_BITS; bits++) - { - next_code[bits] = code = (short)((code + bl_count[bits - 1]) << 1); - } - - // Check that the bit counts in bl_count are consistent. The last code - // must be all ones. - //Assert (code + bl_count[MAX_BITS]-1 == (1< 0); - return SupportClass.URShift(res, 1); - } - } - #endregion - - #region ZInputStream - class ZInputStream : System.IO.BinaryReader - { - internal void InitBlock() - { - flush = zlibConst.Z_NO_FLUSH; - buf = new byte[bufsize]; - } - virtual public int FlushMode - { - get - { - return (flush); - } - - set - { - this.flush = value; - } - - } - /// Returns the total number of bytes input so far. - virtual public long TotalIn - { - get - { - return z.total_in; - } - - } - /// Returns the total number of bytes output so far. - virtual public long TotalOut - { - get - { - return z.total_out; - } - - } - - protected ZStream z = new ZStream(); - protected int bufsize = 512; - protected int flush; - protected byte[] buf, buf1 = new byte[1]; - protected bool compress; - - internal System.IO.Stream in_Renamed = null; - - public ZInputStream(System.IO.Stream in_Renamed) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.inflateInit(); - compress = false; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - public ZInputStream(System.IO.Stream in_Renamed, int level) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.deflateInit(level); - compress = true; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - /*public int available() throws IOException { - return inf.finished() ? 0 : 1; - }*/ - - public override int Read() - { - if (read(buf1, 0, 1) == -1) - return (-1); - return (buf1[0] & 0xFF); - } - - internal bool nomoreinput = false; - - public int read(byte[] b, int off, int len) - { - if (len == 0) - return (0); - int err; - z.next_out = b; - z.next_out_index = off; - z.avail_out = len; - do - { - if ((z.avail_in == 0) && (!nomoreinput)) - { - // if buffer is empty and more input is avaiable, refill it - z.next_in_index = 0; - z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, bufsize); //(bufsize - /// Returns the total number of bytes input so far. - /// - virtual public long TotalIn - { - get - { - return z.total_in; - } - - } - /// - /// Returns the total number of bytes output so far. - /// - virtual public long TotalOut - { - get - { - return z.total_out; - } - - } - - protected internal ZStream z = new ZStream(); - protected internal int bufsize = 4096; - protected internal int flush_Renamed_Field; - protected internal byte[] buf, buf1 = new byte[1]; - protected internal bool compress; - - private System.IO.Stream out_Renamed; - - public ZOutputStream(System.IO.Stream out_Renamed) - : base() - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.inflateInit(); - compress = false; - } - - public ZOutputStream(System.IO.Stream out_Renamed, int level) - : base() - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.deflateInit(level); - compress = true; - } - - public void WriteByte(int b) - { - buf1[0] = (byte)b; - Write(buf1, 0, 1); - } - //UPGRADE_TODO: The differences in the Expected value of parameters for method 'WriteByte' may cause compilation errors. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1092_3"' - public override void WriteByte(byte b) - { - WriteByte((int)b); - } - - public override void Write(System.Byte[] b1, int off, int len) - { - if (len == 0) - return; - int err; - byte[] b = new byte[b1.Length]; - Buffer.BlockCopy(b1, 0, b, 0, b1.Length); - z.next_in = b; - z.next_in_index = off; - z.avail_in = len; - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - if (compress) - err = z.deflate(flush_Renamed_Field); - else - err = z.inflate(flush_Renamed_Field); - if (err != zlibConst.Z_OK && err != zlibConst.Z_STREAM_END) - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - while (z.avail_in > 0 || z.avail_out == 0); - } - - public virtual void finish() - { - int err; - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - if (compress) - { - err = z.deflate(zlibConst.Z_FINISH); - } - else - { - err = z.inflate(zlibConst.Z_FINISH); - } - if (err != zlibConst.Z_STREAM_END && err != zlibConst.Z_OK) - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - if (bufsize - z.avail_out > 0) - { - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - } - while (z.avail_in > 0 || z.avail_out == 0); - try - { - Flush(); - } - catch - { - } - } - public virtual void end() - { - if (compress) - { - z.deflateEnd(); - } - else - { - z.inflateEnd(); - } - z.free(); - z = null; - } - public override void Close() - { - try - { - try - { - finish(); - } - catch - { - } - } - finally - { - end(); - out_Renamed.Close(); - out_Renamed = null; - } - } - - public override void Flush() - { - out_Renamed.Flush(); - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) - { - return 0; - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override void SetLength(System.Int64 value) - { - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) - { - return 0; - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanRead - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanSeek - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanWrite - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Length - { - get - { - return 0; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Position - { - get - { - return 0; - } - - set - { - } - - } - } - #endregion - - #region ZStream - public sealed class ZStream - { - private const int MAX_WBITS = 15; // 32K LZ77 window - private static readonly int DEF_WBITS = MAX_WBITS; - - private const int Z_NO_FLUSH = 0; - private const int Z_PARTIAL_FLUSH = 1; - private const int Z_SYNC_FLUSH = 2; - private const int Z_FULL_FLUSH = 3; - private const int Z_FINISH = 4; - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - public byte[] next_in; // next input byte - public int next_in_index; - public int avail_in; // number of bytes available at next_in - public long total_in; // total nb of input bytes read so far - - public byte[] next_out; // next output byte should be put there - public int next_out_index; - public int avail_out; // remaining free space at next_out - public long total_out; // total nb of bytes output so far - - public System.String msg; - - internal Deflate dstate; - internal Inflate istate; - - internal int data_type; // best guess about the data type: ascii or binary - - public long adler; - internal Adler32 _adler = new Adler32(); - - public int inflateInit() - { - return inflateInit(DEF_WBITS); - } - - public int inflateReset() - { - if (istate == null) - return Z_STREAM_ERROR; - - return istate.inflateReset(this); - } - - public int inflateInit(int w) - { - istate = new Inflate(); - return istate.inflateInit(this, w); - } - - public int inflate(int f) - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflate(this, f); - } - public int inflateEnd() - { - if (istate == null) - return Z_STREAM_ERROR; - int ret = istate.inflateEnd(this); - istate = null; - return ret; - } - public int inflateSync() - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflateSync(this); - } - public int inflateSetDictionary(byte[] dictionary, int dictLength) - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflateSetDictionary(this, dictionary, dictLength); - } - - public int deflateInit(int level) - { - return deflateInit(level, MAX_WBITS); - } - public int deflateInit(int level, int bits) - { - dstate = new Deflate(); - return dstate.deflateInit(this, level, bits); - } - public int deflate(int flush) - { - if (dstate == null) - { - return Z_STREAM_ERROR; - } - return dstate.deflate(this, flush); - } - public int deflateEnd() - { - if (dstate == null) - return Z_STREAM_ERROR; - int ret = dstate.deflateEnd(); - dstate = null; - return ret; - } - public int deflateParams(int level, int strategy) - { - if (dstate == null) - return Z_STREAM_ERROR; - return dstate.deflateParams(this, level, strategy); - } - public int deflateSetDictionary(byte[] dictionary, int dictLength) - { - if (dstate == null) - return Z_STREAM_ERROR; - return dstate.deflateSetDictionary(this, dictionary, dictLength); - } - - // Flush as much pending output as possible. All deflate() output goes - // through this function so some applications may wish to modify it - // to avoid allocating a large strm->next_out buffer and copying into it. - // (See also read_buf()). - internal void flush_pending() - { - int len = dstate.pending; - - if (len > avail_out) - len = avail_out; - if (len == 0) - return; - - if (dstate.pending_buf.Length <= dstate.pending_out || next_out.Length <= next_out_index || dstate.pending_buf.Length < (dstate.pending_out + len) || next_out.Length < (next_out_index + len)) - { - //System.Console.Out.WriteLine(dstate.pending_buf.Length + ", " + dstate.pending_out + ", " + next_out.Length + ", " + next_out_index + ", " + len); - //System.Console.Out.WriteLine("avail_out=" + avail_out); - } - - Buffer.BlockCopy(dstate.pending_buf, dstate.pending_out, next_out, next_out_index, len); - - next_out_index += len; - dstate.pending_out += len; - total_out += len; - avail_out -= len; - dstate.pending -= len; - if (dstate.pending == 0) - { - dstate.pending_out = 0; - } - } - - // Read a new buffer from the current input stream, update the adler32 - // and total number of bytes read. All deflate() input goes through - // this function so some applications may wish to modify it to avoid - // allocating a large strm->next_in buffer and copying from it. - // (See also flush_pending()). - internal int read_buf(byte[] buf, int start, int size) - { - int len = avail_in; - - if (len > size) - len = size; - if (len == 0) - return 0; - - avail_in -= len; - - if (dstate.noheader == 0) - { - adler = _adler.adler32(adler, next_in, next_in_index, len); - } - Buffer.BlockCopy(next_in, next_in_index, buf, start, len); - next_in_index += len; - total_in += len; - return len; - } - - public void free() - { - next_in = null; - next_out = null; - msg = null; - _adler = null; - } - } - #endregion - - #region ZStreamException - class ZStreamException : System.IO.IOException - { - public ZStreamException() : base() - { - } - public ZStreamException(System.String s) : base(s) - { - } - } - #endregion -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibJpeg.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibJpeg.cs deleted file mode 100644 index 80b7513768..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibJpeg.cs +++ /dev/null @@ -1,20230 +0,0 @@ -/**************************************************************************** - * - * LibJpeg.Net - * Copyright (c) 2008-2011, Bit Miracle - * - * All rights reserved. - * - * 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. - * - * Neither the name of the Bit Miracle nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * 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 BIT MIRACLE 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. - ****************************************************************************/ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Drawing; -using System.Collections.ObjectModel; - -namespace BitMiracle.LibJpeg -{ - #region JpegImage - public sealed class JpegImage : IDisposable - { - private bool m_alreadyDisposed; - private List m_rows = new List(); - private int m_width; - private int m_height; - private byte m_bitsPerComponent; - private byte m_componentsPerSample; - private ColorSpace m_colorspace; - private MemoryStream m_compressedData; - private CompressionParameters m_compressionParameters; - private MemoryStream m_decompressedData; - private Bitmap m_bitmap; - public JpegImage(System.Drawing.Bitmap bitmap) - { - createFromBitmap(bitmap); - } - public JpegImage(Stream imageData) - { - createFromStream(imageData); - } - public JpegImage(string fileName) - { - if (fileName == null) - throw new ArgumentNullException("fileName"); - - using (FileStream input = new FileStream(fileName, FileMode.Open)) - createFromStream(input); - } - public JpegImage(SampleRow[] sampleData, ColorSpace colorspace) - { - if (sampleData == null) - throw new ArgumentNullException("sampleData"); - - if (sampleData.Length == 0) - throw new ArgumentException("sampleData must not be empty"); - - if (colorspace == ColorSpace.Unknown) - throw new ArgumentException("Unknown colorspace"); - - m_rows = new List(sampleData); - - SampleRow firstRow = m_rows[0]; - m_width = firstRow.Length; - m_height = m_rows.Count; - - Sample firstSample = firstRow[0]; - m_bitsPerComponent = firstSample.BitsPerComponent; - m_componentsPerSample = firstSample.ComponentCount; - m_colorspace = colorspace; - } - public static JpegImage FromBitmap(Bitmap bitmap) - { - return new JpegImage(bitmap); - } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - private void Dispose(bool disposing) - { - if (!m_alreadyDisposed) - { - if (disposing) - { - if (m_compressedData != null) - m_compressedData.Dispose(); - - if (m_decompressedData != null) - m_decompressedData.Dispose(); - if (m_bitmap != null) - m_bitmap.Dispose(); - } - m_compressionParameters = null; - m_compressedData = null; - m_decompressedData = null; - m_bitmap = null; - m_rows = null; - m_alreadyDisposed = true; - } - } - - public int Width - { - get - { - return m_width; - } - internal set - { - m_width = value; - } - } - public int Height - { - get - { - return m_height; - } - internal set - { - m_height = value; - } - } - public byte ComponentsPerSample - { - get - { - return m_componentsPerSample; - } - internal set - { - m_componentsPerSample = value; - } - } - public byte BitsPerComponent - { - get - { - return m_bitsPerComponent; - } - internal set - { - m_bitsPerComponent = value; - } - } - public ColorSpace Colorspace - { - get - { - return m_colorspace; - } - internal set - { - m_colorspace = value; - } - } - public SampleRow GetRow(int rowNumber) - { - return m_rows[rowNumber]; - } - public void WriteJpeg(Stream output) - { - WriteJpeg(output, new CompressionParameters()); - } - public void WriteJpeg(Stream output, CompressionParameters parameters) - { - compress(parameters); - compressedData.WriteTo(output); - } - public void WriteBitmap(Stream output) - { - decompressedData.WriteTo(output); - } - public Bitmap ToBitmap() - { - return bitmap.Clone() as Bitmap; - } - private MemoryStream compressedData - { - get - { - if (m_compressedData == null) - compress(new CompressionParameters()); - return m_compressedData; - } - } - private MemoryStream decompressedData - { - get - { - if (m_decompressedData == null) - fillDecompressedData(); - return m_decompressedData; - } - } - private Bitmap bitmap - { - get - { - if (m_bitmap == null) - { - long position = compressedData.Position; - m_bitmap = new Bitmap(compressedData); - compressedData.Seek(position, SeekOrigin.Begin); - } - - return m_bitmap; - } - } - internal void addSampleRow(SampleRow row) - { - if (row == null) - throw new ArgumentNullException("row"); - - m_rows.Add(row); - } - private static bool isCompressed(Stream imageData) - { - if (imageData == null) - return false; - - if (imageData.Length <= 2) - return false; - - imageData.Seek(0, SeekOrigin.Begin); - int first = imageData.ReadByte(); - int second = imageData.ReadByte(); - return (first == 0xFF && second == (int)JpegMarkerType.SOI); - } - private void createFromBitmap(Bitmap bitmap) - { - initializeFromBitmap(bitmap); - compress(new CompressionParameters()); - } - private void createFromStream(Stream imageData) - { - if (imageData == null) - throw new ArgumentNullException("imageData"); - - if (isCompressed(imageData)) - { - m_compressedData = Utils.CopyStream(imageData); - decompress(); - } - else - { - createFromBitmap(new Bitmap(imageData)); - } - } - private void initializeFromBitmap(Bitmap bitmap) - { - if (bitmap == null) - throw new ArgumentNullException("bitmap"); - - m_bitmap = bitmap; - m_width = m_bitmap.Width; - m_height = m_bitmap.Height; - processPixelFormat(bitmap.PixelFormat); - fillSamplesFromBitmap(); - } - private void compress(CompressionParameters parameters) - { - - if (m_rows == null) - throw new Exception("'m_rows' Cannot be null!"); - - if (m_rows.Count == 0) - throw new ArgumentException("'m_rows' Cannot be empty!"); - - - RawImage source = new RawImage(m_rows, m_colorspace); - compress(source, parameters); - } - private void compress(IRawImage source, CompressionParameters parameters) - { - if (source == null) - throw new ArgumentNullException("'source' Cannot be null!"); - - if (!needCompressWith(parameters)) - return; - - m_compressedData = new MemoryStream(); - m_compressionParameters = new CompressionParameters(parameters); - - Jpeg jpeg = new Jpeg(); - jpeg.CompressionParameters = m_compressionParameters; - jpeg.Compress(source, m_compressedData); - } - private bool needCompressWith(CompressionParameters parameters) - { - return m_compressedData == null || - m_compressionParameters == null || - !m_compressionParameters.Equals(parameters); - } - private void decompress() - { - Jpeg jpeg = new Jpeg(); - jpeg.Decompress(compressedData, new DecompressorToJpegImage(this)); - } - private void fillDecompressedData() - { - if (m_decompressedData != null) - throw new Exception("'m_decompressedData' Is not null!"); - - m_decompressedData = new MemoryStream(); - BitmapDestination dest = new BitmapDestination(m_decompressedData); - - Jpeg jpeg = new Jpeg(); - jpeg.Decompress(compressedData, dest); - } - - private void processPixelFormat(System.Drawing.Imaging.PixelFormat pixelFormat) - { - if (pixelFormat == System.Drawing.Imaging.PixelFormat.Format16bppGrayScale) - { - m_bitsPerComponent = 16; - m_componentsPerSample = 1; - m_colorspace = ColorSpace.Grayscale; - return; - } - - byte formatIndexByte = (byte)((int)pixelFormat & 0x000000FF); - byte pixelSizeByte = (byte)((int)pixelFormat & 0x0000FF00); - - if (pixelSizeByte == 32 && formatIndexByte == 15) - { - m_bitsPerComponent = 8; - m_componentsPerSample = 4; - m_colorspace = ColorSpace.CMYK; - return; - } - - m_bitsPerComponent = 8; - m_componentsPerSample = 3; - m_colorspace = ColorSpace.RGB; - - if (pixelSizeByte == 16) - m_bitsPerComponent = 6; - else if (pixelSizeByte == 24 || pixelSizeByte == 32) - m_bitsPerComponent = 8; - else if (pixelSizeByte == 48 || pixelSizeByte == 64) - m_bitsPerComponent = 16; - } - private void fillSamplesFromBitmap() - { - if (m_bitmap == null) - throw new Exception("Field 'm_bitmap' Cannot be null!"); - - for (int y = 0; y < Height; ++y) - { - short[] samples = new short[Width * 3]; - for (int x = 0; x < Width; ++x) - { - Color color = m_bitmap.GetPixel(x, y); - samples[x * 3] = color.R; - samples[x * 3 + 1] = color.G; - samples[x * 3 + 2] = color.B; - } - m_rows.Add(new SampleRow(samples, m_bitsPerComponent, m_componentsPerSample)); - } - } - } - #endregion - - #region BitmapDestination - class BitmapDestination : IDecompressor - { - private Stream m_output; - private byte[][] m_pixels; - private int m_rowWidth; - private int m_currentRow; - private LoadedImageAttributes m_parameters; - - public BitmapDestination(Stream output) - { - m_output = output; - } - - public override Stream Output - { - get - { - return m_output; - } - } - - public override void SetImageAttributes(LoadedImageAttributes parameters) - { - if (parameters == null) - throw new ArgumentNullException("parameters"); - - m_parameters = parameters; - } - public override void BeginWrite() - { - m_rowWidth = m_parameters.Width * m_parameters.Components; - while (m_rowWidth % 4 != 0) - m_rowWidth++; - - m_pixels = new byte[m_rowWidth][]; - for (int i = 0; i < m_rowWidth; i++) - m_pixels[i] = new byte[m_parameters.Height]; - - m_currentRow = 0; - } - public override void ProcessPixelsRow(byte[] row) - { - if (m_parameters.Colorspace == ColorSpace.Grayscale || m_parameters.QuantizeColors) - { - putGrayRow(row); - } - else - { - if (m_parameters.Colorspace == ColorSpace.CMYK) - putCmykRow(row); - else - putRgbRow(row); - } - - ++m_currentRow; - } - public override void EndWrite() - { - writeHeader(); - writePixels(); - m_output.Flush(); - } - private void putGrayRow(byte[] row) - { - for (int i = 0; i < m_parameters.Width; ++i) - m_pixels[i][m_currentRow] = row[i]; - } - private void putRgbRow(byte[] row) - { - for (int i = 0; i < m_parameters.Width; ++i) - { - int firstComponent = i * 3; - byte red = row[firstComponent]; - byte green = row[firstComponent + 1]; - byte blue = row[firstComponent + 2]; - m_pixels[firstComponent][m_currentRow] = blue; - m_pixels[firstComponent + 1][m_currentRow] = green; - m_pixels[firstComponent + 2][m_currentRow] = red; - } - } - private void putCmykRow(byte[] row) - { - for (int i = 0; i < m_parameters.Width; ++i) - { - int firstComponent = i * 4; - m_pixels[firstComponent][m_currentRow] = row[firstComponent + 2]; - m_pixels[firstComponent + 1][m_currentRow] = row[firstComponent + 1]; - m_pixels[firstComponent + 2][m_currentRow] = row[firstComponent + 0]; - m_pixels[firstComponent + 3][m_currentRow] = row[firstComponent + 3]; - } - } - private void writeHeader() - { - int bits_per_pixel; - int cmap_entries; - - if (m_parameters.Colorspace == ColorSpace.Grayscale || m_parameters.QuantizeColors) - { - bits_per_pixel = 8; - cmap_entries = 256; - } - else - { - cmap_entries = 0; - - if (m_parameters.Colorspace == ColorSpace.RGB) - bits_per_pixel = 24; - else if (m_parameters.Colorspace == ColorSpace.CMYK) - bits_per_pixel = 32; - else - throw new InvalidOperationException(); - } - - byte[] infoHeader = null; - if (m_parameters.Colorspace == ColorSpace.RGB) - infoHeader = createBitmapInfoHeader(bits_per_pixel, cmap_entries); - else - infoHeader = createBitmapV4InfoHeader(bits_per_pixel); - - const int fileHeaderSize = 14; - int infoHeaderSize = infoHeader.Length; - int paletteSize = cmap_entries * 4; - int offsetToPixels = fileHeaderSize + infoHeaderSize + paletteSize; - int fileSize = offsetToPixels + m_rowWidth * m_parameters.Height; - - byte[] fileHeader = createBitmapFileHeader(offsetToPixels, fileSize); - - m_output.Write(fileHeader, 0, fileHeader.Length); - m_output.Write(infoHeader, 0, infoHeader.Length); - - if (cmap_entries > 0) - writeColormap(cmap_entries, 4); - } - - private static byte[] createBitmapFileHeader(int offsetToPixels, int fileSize) - { - byte[] bmpfileheader = new byte[14]; - bmpfileheader[0] = 0x42; - bmpfileheader[1] = 0x4D; - PUT_4B(bmpfileheader, 2, fileSize); - PUT_4B(bmpfileheader, 10, offsetToPixels); - return bmpfileheader; - } - - private byte[] createBitmapInfoHeader(int bits_per_pixel, int cmap_entries) - { - byte[] bmpinfoheader = new byte[40]; - fillBitmapInfoHeader(bits_per_pixel, cmap_entries, bmpinfoheader); - return bmpinfoheader; - } - - private void fillBitmapInfoHeader(int bitsPerPixel, int cmap_entries, byte[] infoHeader) - { - PUT_2B(infoHeader, 0, infoHeader.Length); - PUT_4B(infoHeader, 4, m_parameters.Width); - PUT_4B(infoHeader, 8, m_parameters.Height); - PUT_2B(infoHeader, 12, 1); - PUT_2B(infoHeader, 14, bitsPerPixel); - - if (m_parameters.DensityUnit == DensityUnit.DotsCm) - { - PUT_4B(infoHeader, 24, m_parameters.DensityX * 100); - PUT_4B(infoHeader, 28, m_parameters.DensityY * 100); - } - PUT_2B(infoHeader, 32, cmap_entries); - } - - private byte[] createBitmapV4InfoHeader(int bitsPerPixel) - { - byte[] infoHeader = new byte[40 + 68]; - fillBitmapInfoHeader(bitsPerPixel, 0, infoHeader); - - PUT_4B(infoHeader, 56, 0x02); - - return infoHeader; - } - - private void writeColormap(int map_colors, int map_entry_size) - { - byte[][] colormap = m_parameters.Colormap; - int num_colors = m_parameters.ActualNumberOfColors; - - int i = 0; - if (colormap != null) - { - if (m_parameters.ComponentsPerSample == 3) - { - for (i = 0; i < num_colors; i++) - { - m_output.WriteByte(colormap[2][i]); - m_output.WriteByte(colormap[1][i]); - m_output.WriteByte(colormap[0][i]); - if (map_entry_size == 4) - m_output.WriteByte(0); - } - } - else - { - for (i = 0; i < num_colors; i++) - { - m_output.WriteByte(colormap[0][i]); - m_output.WriteByte(colormap[0][i]); - m_output.WriteByte(colormap[0][i]); - if (map_entry_size == 4) - m_output.WriteByte(0); - } - } - } - else - { - for (i = 0; i < 256; i++) - { - m_output.WriteByte((byte)i); - m_output.WriteByte((byte)i); - m_output.WriteByte((byte)i); - if (map_entry_size == 4) - m_output.WriteByte(0); - } - } - - if (i > map_colors) - throw new InvalidOperationException("Too many colors"); - - for (; i < map_colors; i++) - { - m_output.WriteByte(0); - m_output.WriteByte(0); - m_output.WriteByte(0); - if (map_entry_size == 4) - m_output.WriteByte(0); - } - } - private void writePixels() - { - for (int row = m_parameters.Height - 1; row >= 0; --row) - for (int col = 0; col < m_rowWidth; ++col) - m_output.WriteByte(m_pixels[col][row]); - } - private static void PUT_2B(byte[] array, int offset, int value) - { - array[offset] = (byte)((value) & 0xFF); - array[offset + 1] = (byte)(((value) >> 8) & 0xFF); - } - private static void PUT_4B(byte[] array, int offset, int value) - { - array[offset] = (byte)((value) & 0xFF); - array[offset + 1] = (byte)(((value) >> 8) & 0xFF); - array[offset + 2] = (byte)(((value) >> 16) & 0xFF); - array[offset + 3] = (byte)(((value) >> 24) & 0xFF); - } - } - #endregion - - #region BitStream - class BitStream : IDisposable - { - private bool m_alreadyDisposed; - - private const int bitsInByte = 8; - private Stream m_stream; - private int m_positionInByte; - - private int m_size; - - public BitStream() - { - m_stream = new MemoryStream(); - } - - public BitStream(byte[] buffer) - { - if (buffer == null) - throw new ArgumentNullException("buffer"); - - m_stream = new MemoryStream(buffer); - m_size = bitsAllocated(); - } - - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (!m_alreadyDisposed) - { - if (disposing) - { - if (m_stream != null) - m_stream.Dispose(); - } - - m_stream = null; - m_alreadyDisposed = true; - } - } - - public int Size() - { - return m_size; - } - - public Stream UnderlyingStream - { - get - { - return m_stream; - } - } - - public virtual int Read(int bitCount) - { - if (Tell() + bitCount > bitsAllocated()) - throw new ArgumentOutOfRangeException("bitCount"); - - return read(bitCount); - } - - public int Write(int bitStorage, int bitCount) - { - if (bitCount == 0) - return 0; - - const int maxBitsInStorage = sizeof(int) * bitsInByte; - if (bitCount > maxBitsInStorage) - throw new ArgumentOutOfRangeException("bitCount"); - - for (int i = 0; i < bitCount; ++i) - { - byte bit = (byte)((bitStorage << (maxBitsInStorage - (bitCount - i))) >> (maxBitsInStorage - 1)); - if (!writeBit(bit)) - return i; - } - - return bitCount; - } - - public void Seek(int pos, SeekOrigin mode) - { - switch (mode) - { - case SeekOrigin.Begin: - seekSet(pos); - break; - - case SeekOrigin.Current: - seekCurrent(pos); - break; - - case SeekOrigin.End: - seekSet(Size() + pos); - break; - } - } - - public int Tell() - { - return (int)m_stream.Position * bitsInByte + m_positionInByte; - } - - private int bitsAllocated() - { - return (int)m_stream.Length * bitsInByte; - } - - private int read(int bitsCount) - { - if (bitsCount < 0 || bitsCount > 32) - throw new ArgumentOutOfRangeException("bitsCount"); - - if (bitsCount == 0) - return 0; - - int bitsRead = 0; - int result = 0; - byte[] bt = new byte[1]; - while (bitsRead == 0 || (bitsRead - m_positionInByte < bitsCount)) - { - m_stream.Read(bt, 0, 1); - - result = (result << bitsInByte); - result += bt[0]; - - bitsRead += 8; - } - - m_positionInByte = (m_positionInByte + bitsCount) % 8; - if (m_positionInByte != 0) - { - result = (result >> (bitsInByte - m_positionInByte)); - - m_stream.Seek(-1, SeekOrigin.Current); - } - - if (bitsCount < 32) - { - int mask = ((1 << bitsCount) - 1); - result = result & mask; - } - - return result; - } - - private bool writeBit(byte bit) - { - if (m_stream.Position == m_stream.Length) - { - byte[] bt = { (byte)(bit << (bitsInByte - 1)) }; - m_stream.Write(bt, 0, 1); - m_stream.Seek(-1, SeekOrigin.Current); - } - else - { - byte[] bt = { 0 }; - m_stream.Read(bt, 0, 1); - m_stream.Seek(-1, SeekOrigin.Current); - - int shift = (bitsInByte - m_positionInByte - 1) % bitsInByte; - byte maskByte = (byte)(bit << shift); - - bt[0] |= maskByte; - m_stream.Write(bt, 0, 1); - m_stream.Seek(-1, SeekOrigin.Current); - } - - Seek(1, SeekOrigin.Current); - - int currentPosition = Tell(); - if (currentPosition > m_size) - m_size = currentPosition; - - return true; - } - - private void seekSet(int pos) - { - if (pos < 0) - throw new ArgumentOutOfRangeException("pos"); - - int byteDisplacement = pos / bitsInByte; - m_stream.Seek(byteDisplacement, SeekOrigin.Begin); - - int shiftInByte = pos - byteDisplacement * bitsInByte; - m_positionInByte = shiftInByte; - } - - private void seekCurrent(int pos) - { - int result = Tell() + pos; - if (result < 0 || result > bitsAllocated()) - throw new ArgumentOutOfRangeException("pos"); - - seekSet(result); - } - } - #endregion - - #region CoefControllerImpl - class CoefControllerImpl : JpegCompressorCoefController - { - private BufferMode m_passModeSetByLastStartPass; - private JpegCompressor m_cinfo; - private int m_iMCU_row_num; - private int m_mcu_ctr; - private int m_MCU_vert_offset; - private int m_MCU_rows_per_iMCU_row; - private JpegBlock[][] m_MCU_buffer = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU][]; - - private JpegVirtualArray[] m_whole_image = new JpegVirtualArray[JpegConstants.MaxComponents]; - - public CoefControllerImpl(JpegCompressor cinfo, bool need_full_buffer) - { - m_cinfo = cinfo; - if (need_full_buffer) - { - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - m_whole_image[ci] = JpegCommonBase.CreateBlocksArray( - JpegUtils.jround_up(cinfo.Component_info[ci].Width_in_blocks, cinfo.Component_info[ci].H_samp_factor), - JpegUtils.jround_up(cinfo.Component_info[ci].height_in_blocks, cinfo.Component_info[ci].V_samp_factor)); - m_whole_image[ci].ErrorProcessor = cinfo; - } - } - else - { - JpegBlock[] buffer = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU]; - for (int i = 0; i < JpegConstants.CompressorMaxBlocksInMCU; i++) - buffer[i] = new JpegBlock(); - - for (int i = 0; i < JpegConstants.CompressorMaxBlocksInMCU; i++) - { - m_MCU_buffer[i] = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU - i]; - for (int j = i; j < JpegConstants.CompressorMaxBlocksInMCU; j++) - m_MCU_buffer[i][j - i] = buffer[j]; - } - m_whole_image[0] = null; - } - } - public virtual void start_pass(BufferMode pass_mode) - { - m_iMCU_row_num = 0; - start_iMCU_row(); - - switch (pass_mode) - { - case BufferMode.PassThru: - if (m_whole_image[0] != null) - throw new Exception("Bogus buffer control mode"); - break; - - case BufferMode.SaveAndPass: - if (m_whole_image[0] == null) - throw new Exception("Bogus buffer control mode"); - break; - - case BufferMode.CrankDest: - if (m_whole_image[0] == null) - throw new Exception("Bogus buffer control mode"); - break; - - default: - throw new Exception("Bogus buffer control mode"); - } - - m_passModeSetByLastStartPass = pass_mode; - } - - public virtual bool compress_data(byte[][][] input_buf) - { - switch (m_passModeSetByLastStartPass) - { - case BufferMode.PassThru: - return compressDataImpl(input_buf); - - case BufferMode.SaveAndPass: - return compressFirstPass(input_buf); - - case BufferMode.CrankDest: - return compressOutput(); - } - - return false; - } - private bool compressDataImpl(byte[][][] input_buf) - { - int last_MCU_col = m_cinfo.m_MCUs_per_row - 1; - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - for (int yoffset = m_MCU_vert_offset; yoffset < m_MCU_rows_per_iMCU_row; yoffset++) - { - for (int MCU_col_num = m_mcu_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) - { - int blkn = 0; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - int blockcnt = (MCU_col_num < last_MCU_col) ? componentInfo.MCU_width : componentInfo.last_col_width; - int xpos = MCU_col_num * componentInfo.MCU_sample_width; - int ypos = yoffset * JpegConstants.DCTSize; - - for (int yindex = 0; yindex < componentInfo.MCU_height; yindex++) - { - if (m_iMCU_row_num < last_iMCU_row || yoffset + yindex < componentInfo.last_row_height) - { - m_cinfo.m_fdct.forward_DCT(componentInfo.Quant_tbl_no, input_buf[componentInfo.Component_index], - m_MCU_buffer[blkn], ypos, xpos, blockcnt); - - if (blockcnt < componentInfo.MCU_width) - { - for (int i = 0; i < (componentInfo.MCU_width - blockcnt); i++) - Array.Clear(m_MCU_buffer[blkn + blockcnt][i].data, 0, m_MCU_buffer[blkn + blockcnt][i].data.Length); - - for (int bi = blockcnt; bi < componentInfo.MCU_width; bi++) - m_MCU_buffer[blkn + bi][0][0] = m_MCU_buffer[blkn + bi - 1][0][0]; - } - } - else - { - for (int i = 0; i < componentInfo.MCU_width; i++) - Array.Clear(m_MCU_buffer[blkn][i].data, 0, m_MCU_buffer[blkn][i].data.Length); - - for (int bi = 0; bi < componentInfo.MCU_width; bi++) - m_MCU_buffer[blkn + bi][0][0] = m_MCU_buffer[blkn - 1][0][0]; - } - - blkn += componentInfo.MCU_width; - ypos += JpegConstants.DCTSize; - } - } - if (!m_cinfo.m_entropy.encode_mcu(m_MCU_buffer)) - { - m_MCU_vert_offset = yoffset; - m_mcu_ctr = MCU_col_num; - return false; - } - } - m_mcu_ctr = 0; - } - m_iMCU_row_num++; - start_iMCU_row(); - return true; - } - private bool compressFirstPass(byte[][][] input_buf) - { - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[ci]; - JpegBlock[][] buffer = m_whole_image[ci].Access(m_iMCU_row_num * componentInfo.V_samp_factor, componentInfo.V_samp_factor); - int block_rows; - if (m_iMCU_row_num < last_iMCU_row) - { - block_rows = componentInfo.V_samp_factor; - } - else - { - block_rows = componentInfo.height_in_blocks % componentInfo.V_samp_factor; - if (block_rows == 0) - block_rows = componentInfo.V_samp_factor; - } - - int blocks_across = componentInfo.Width_in_blocks; - int h_samp_factor = componentInfo.H_samp_factor; - int ndummy = blocks_across % h_samp_factor; - if (ndummy > 0) - ndummy = h_samp_factor - ndummy; - for (int block_row = 0; block_row < block_rows; block_row++) - { - m_cinfo.m_fdct.forward_DCT(componentInfo.Quant_tbl_no, input_buf[ci], - buffer[block_row], block_row * JpegConstants.DCTSize, 0, blocks_across); - - if (ndummy > 0) - { - Array.Clear(buffer[block_row][blocks_across].data, 0, buffer[block_row][blocks_across].data.Length); - - short lastDC = buffer[block_row][blocks_across - 1][0]; - for (int bi = 0; bi < ndummy; bi++) - buffer[block_row][blocks_across + bi][0] = lastDC; - } - } - - if (m_iMCU_row_num == last_iMCU_row) - { - blocks_across += ndummy; - int MCUs_across = blocks_across / h_samp_factor; - for (int block_row = block_rows; block_row < componentInfo.V_samp_factor; block_row++) - { - for (int i = 0; i < blocks_across; i++) - Array.Clear(buffer[block_row][i].data, 0, buffer[block_row][i].data.Length); - - int thisOffset = 0; - int lastOffset = 0; - for (int MCUindex = 0; MCUindex < MCUs_across; MCUindex++) - { - short lastDC = buffer[block_row - 1][lastOffset + h_samp_factor - 1][0]; - for (int bi = 0; bi < h_samp_factor; bi++) - buffer[block_row][thisOffset + bi][0] = lastDC; - - thisOffset += h_samp_factor; - lastOffset += h_samp_factor; - } - } - } - } - return compressOutput(); - } - private bool compressOutput() - { - JpegBlock[][][] buffer = new JpegBlock[JpegConstants.MaxComponentsInScan][][]; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - buffer[ci] = m_whole_image[componentInfo.Component_index].Access( - m_iMCU_row_num * componentInfo.V_samp_factor, componentInfo.V_samp_factor); - } - for (int yoffset = m_MCU_vert_offset; yoffset < m_MCU_rows_per_iMCU_row; yoffset++) - { - for (int MCU_col_num = m_mcu_ctr; MCU_col_num < m_cinfo.m_MCUs_per_row; MCU_col_num++) - { - int blkn = 0; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - int start_col = MCU_col_num * componentInfo.MCU_width; - for (int yindex = 0; yindex < componentInfo.MCU_height; yindex++) - { - for (int xindex = 0; xindex < componentInfo.MCU_width; xindex++) - { - int bufLength = buffer[ci][yindex + yoffset].Length; - int start = start_col + xindex; - m_MCU_buffer[blkn] = new JpegBlock[bufLength - start]; - for (int j = start; j < bufLength; j++) - m_MCU_buffer[blkn][j - start] = buffer[ci][yindex + yoffset][j]; - - blkn++; - } - } - } - if (!m_cinfo.m_entropy.encode_mcu(m_MCU_buffer)) - { - m_MCU_vert_offset = yoffset; - m_mcu_ctr = MCU_col_num; - return false; - } - } - m_mcu_ctr = 0; - } - m_iMCU_row_num++; - start_iMCU_row(); - return true; - } - private void start_iMCU_row() - { - if (m_cinfo.m_comps_in_scan > 1) - { - m_MCU_rows_per_iMCU_row = 1; - } - else - { - if (m_iMCU_row_num < (m_cinfo.m_total_iMCU_rows - 1)) - m_MCU_rows_per_iMCU_row = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[0]].V_samp_factor; - else - m_MCU_rows_per_iMCU_row = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[0]].last_row_height; - } - - m_mcu_ctr = 0; - m_MCU_vert_offset = 0; - } - } - #endregion - - #region ColorConverter - class ColorConverter - { - private const int SCALEBITS = 16; - private const int CBCR_OFFSET = JpegConstants.MediumSampleValue << SCALEBITS; - private const int ONE_HALF = 1 << (SCALEBITS - 1); - private const int R_Y_OFF = 0; - private const int G_Y_OFF = (1 * (JpegConstants.MaxSampleValue + 1)); - private const int B_Y_OFF = (2 * (JpegConstants.MaxSampleValue + 1)); - private const int R_CB_OFF = (3 * (JpegConstants.MaxSampleValue + 1)); - private const int G_CB_OFF = (4 * (JpegConstants.MaxSampleValue + 1)); - private const int B_CB_OFF = (5 * (JpegConstants.MaxSampleValue + 1)); - private const int R_CR_OFF = B_CB_OFF; - private const int G_CR_OFF = (6 * (JpegConstants.MaxSampleValue + 1)); - private const int B_CR_OFF = (7 * (JpegConstants.MaxSampleValue + 1)); - private const int TABLE_SIZE = (8 * (JpegConstants.MaxSampleValue + 1)); - private JpegCompressor m_cinfo; - private bool m_useNullStart; - private bool m_useCmykYcckConvert; - private bool m_useGrayscaleConvert; - private bool m_useNullConvert; - private bool m_useRgbGrayConvert; - private bool m_useRgbYccConvert; - private int[] m_rgb_ycc_tab; - - public ColorConverter(JpegCompressor cinfo) - { - m_cinfo = cinfo; - m_useNullStart = true; - switch (cinfo.m_in_color_space) - { - case ColorSpace.Grayscale: - if (cinfo.m_input_components != 1) - throw new Exception("Bogus input colorspace!"); - break; - - case ColorSpace.RGB: - case ColorSpace.YCbCr: - if (cinfo.m_input_components != 3) - throw new Exception("Bogus input colorspace!"); - break; - - case ColorSpace.CMYK: - case ColorSpace.YCCK: - if (cinfo.m_input_components != 4) - throw new Exception("Bogus input colorspace!"); - break; - - default: - if (cinfo.m_input_components < 1) - throw new Exception("Bogus input colorspace!"); - break; - } - clearConvertFlags(); - switch (cinfo.m_jpeg_color_space) - { - case ColorSpace.Grayscale: - { - if (cinfo.m_num_components != 1) - throw new Exception("Bogus Jpeg colorspace!"); - - - if (cinfo.m_in_color_space == ColorSpace.Grayscale) - { - m_useGrayscaleConvert = true; - } - else if (cinfo.m_in_color_space == ColorSpace.RGB) - { - m_useNullStart = false; - m_useRgbGrayConvert = true; - } - else if (cinfo.m_in_color_space == ColorSpace.YCbCr) - { - m_useGrayscaleConvert = true; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - - break; - } - case ColorSpace.RGB: - { - if (cinfo.m_num_components != 3) - throw new Exception("Bogus Jpeg colorspace!"); - - - if (cinfo.m_in_color_space == ColorSpace.RGB) - { - m_useNullConvert = true; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - - break; - } - case ColorSpace.YCbCr: - { - if (cinfo.m_num_components != 3) - throw new Exception("Bogus Jpeg colorspace!"); - - - if (cinfo.m_in_color_space == ColorSpace.RGB) - { - m_useNullStart = false; - m_useRgbYccConvert = true; - } - else if (cinfo.m_in_color_space == ColorSpace.YCbCr) - { - m_useNullConvert = true; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - - break; - } - case ColorSpace.CMYK: - { - if (cinfo.m_num_components != 4) - throw new Exception("Bogus Jpeg colorspace!"); - - - if (cinfo.m_in_color_space == ColorSpace.CMYK) - { - m_useNullConvert = true; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - - break; - } - case ColorSpace.YCCK: - { - if (cinfo.m_num_components != 4) - throw new Exception("Bogus Jpeg colorspace!"); - - - if (cinfo.m_in_color_space == ColorSpace.CMYK) - { - m_useNullStart = false; - m_useCmykYcckConvert = true; - } - else if (cinfo.m_in_color_space == ColorSpace.YCCK) - { - m_useNullConvert = true; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - - break; - } - - default: - if (cinfo.m_jpeg_color_space != cinfo.m_in_color_space || cinfo.m_num_components != cinfo.m_input_components) - throw new Exception("Unsupported color conversion request."); - - m_useNullConvert = true; - break; - } - } - - public void start_pass() - { - if (!m_useNullStart) - rgb_ycc_start(); - } - public void color_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - if (m_useCmykYcckConvert) - cmyk_ycck_convert(input_buf, input_row, output_buf, output_row, num_rows); - else if (m_useGrayscaleConvert) - grayscale_convert(input_buf, input_row, output_buf, output_row, num_rows); - else if (m_useRgbGrayConvert) - rgb_gray_convert(input_buf, input_row, output_buf, output_row, num_rows); - else if (m_useRgbYccConvert) - rgb_ycc_convert(input_buf, input_row, output_buf, output_row, num_rows); - else if (m_useNullConvert) - null_convert(input_buf, input_row, output_buf, output_row, num_rows); - else - throw new Exception("Unsupported color conversion request."); - } - - private void clearConvertFlags() - { - m_useCmykYcckConvert = false; - m_useGrayscaleConvert = false; - m_useNullConvert = false; - m_useRgbGrayConvert = false; - m_useRgbYccConvert = false; - } - - private static int FIX(double x) - { - return (int)(x * (1L << SCALEBITS) + 0.5); - } - - #region RGB to YCC - private void rgb_ycc_start() - { - m_rgb_ycc_tab = new int[TABLE_SIZE]; - - for (int i = 0; i <= JpegConstants.MaxSampleValue; i++) - { - m_rgb_ycc_tab[i + R_Y_OFF] = FIX(0.29900) * i; - m_rgb_ycc_tab[i + G_Y_OFF] = FIX(0.58700) * i; - m_rgb_ycc_tab[i + B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; - m_rgb_ycc_tab[i + R_CB_OFF] = (-FIX(0.16874)) * i; - m_rgb_ycc_tab[i + G_CB_OFF] = (-FIX(0.33126)) * i; - m_rgb_ycc_tab[i + B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF - 1; - m_rgb_ycc_tab[i + G_CR_OFF] = (-FIX(0.41869)) * i; - m_rgb_ycc_tab[i + B_CR_OFF] = (-FIX(0.08131)) * i; - } - } - private void rgb_ycc_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - int num_cols = m_cinfo.m_image_width; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - int r = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Red]; - int g = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Green]; - int b = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Blue]; - columnOffset += JpegConstants.RGB_PixelLength; - output_buf[0][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_Y_OFF] + m_rgb_ycc_tab[g + G_Y_OFF] + m_rgb_ycc_tab[b + B_Y_OFF]) >> SCALEBITS); - output_buf[1][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_CB_OFF] + m_rgb_ycc_tab[g + G_CB_OFF] + m_rgb_ycc_tab[b + B_CB_OFF]) >> SCALEBITS); - output_buf[2][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_CR_OFF] + m_rgb_ycc_tab[g + G_CR_OFF] + m_rgb_ycc_tab[b + B_CR_OFF]) >> SCALEBITS); - } - output_row++; - } - } - #endregion - - #region RGB to Grayscale - private void rgb_gray_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - int num_cols = m_cinfo.m_image_width; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - int r = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Red]; - int g = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Green]; - int b = input_buf[input_row + row][columnOffset + JpegConstants.Offset_RGB_Blue]; - columnOffset += JpegConstants.RGB_PixelLength; - output_buf[0][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_Y_OFF] + m_rgb_ycc_tab[g + G_Y_OFF] + m_rgb_ycc_tab[b + B_Y_OFF]) >> SCALEBITS); - } - output_row++; - } - } - #endregion - - #region CMYK to YCCK - private void cmyk_ycck_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - int num_cols = m_cinfo.m_image_width; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - int r = JpegConstants.MaxSampleValue - input_buf[input_row + row][columnOffset]; - int g = JpegConstants.MaxSampleValue - input_buf[input_row + row][columnOffset + 1]; - int b = JpegConstants.MaxSampleValue - input_buf[input_row + row][columnOffset + 2]; - output_buf[3][output_row][col] = input_buf[input_row + row][columnOffset + 3]; - columnOffset += 4; - output_buf[0][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_Y_OFF] + m_rgb_ycc_tab[g + G_Y_OFF] + m_rgb_ycc_tab[b + B_Y_OFF]) >> SCALEBITS); - output_buf[1][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_CB_OFF] + m_rgb_ycc_tab[g + G_CB_OFF] + m_rgb_ycc_tab[b + B_CB_OFF]) >> SCALEBITS); - output_buf[2][output_row][col] = (byte)((m_rgb_ycc_tab[r + R_CR_OFF] + m_rgb_ycc_tab[g + G_CR_OFF] + m_rgb_ycc_tab[b + B_CR_OFF]) >> SCALEBITS); - } - output_row++; - } - } - #endregion - - #region Grayscale Conversion - private void grayscale_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - int num_cols = m_cinfo.m_image_width; - int instride = m_cinfo.m_input_components; - - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - output_buf[0][output_row][col] = input_buf[input_row + row][columnOffset]; - columnOffset += instride; - } - output_row++; - } - } - #endregion - - #region Null Conversion - private void null_convert(byte[][] input_buf, int input_row, byte[][][] output_buf, int output_row, int num_rows) - { - int nc = m_cinfo.m_num_components; - int num_cols = m_cinfo.m_image_width; - - for (int row = 0; row < num_rows; row++) - { - for (int ci = 0; ci < nc; ci++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - output_buf[ci][output_row][col] = input_buf[input_row + row][columnOffset + ci]; - columnOffset += nc; - } - } - - output_row++; - } - } - #endregion - } - #endregion - - #region ColorDeconverter - class ColorDeconverter - { - private const int SCALEBITS = 16; - private const int ONE_HALF = 1 << (SCALEBITS - 1); - - private enum ColorConverter - { - grayscale_converter, - ycc_rgb_converter, - gray_rgb_converter, - null_converter, - ycck_cmyk_converter - } - - private ColorConverter m_converter; - private JpegDecompressor m_cinfo; - - private int[] m_perComponentOffsets; - private int[] m_Cr_r_tab; - private int[] m_Cb_b_tab; - private int[] m_Cr_g_tab; - private int[] m_Cb_g_tab; - public ColorDeconverter(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - switch (cinfo.m_jpeg_color_space) - { - case ColorSpace.Grayscale: - if (cinfo.m_num_components != 1) - throw new Exception("Bogus Jpeg colorspace!"); - break; - - case ColorSpace.RGB: - case ColorSpace.YCbCr: - if (cinfo.m_num_components != 3) - throw new Exception("Bogus Jpeg colorspace!"); - break; - - case ColorSpace.CMYK: - case ColorSpace.YCCK: - if (cinfo.m_num_components != 4) - throw new Exception("Bogus Jpeg colorspace!"); - break; - - default: - if (cinfo.m_num_components < 1) - throw new Exception("Bogus Jpeg colorspace!"); - break; - } - - switch (cinfo.m_out_color_space) - { - case ColorSpace.Grayscale: - cinfo.m_out_color_components = 1; - if (cinfo.m_jpeg_color_space == ColorSpace.Grayscale || cinfo.m_jpeg_color_space == ColorSpace.YCbCr) - { - m_converter = ColorConverter.grayscale_converter; - for (int ci = 1; ci < cinfo.m_num_components; ci++) - cinfo.Comp_info[ci].component_needed = false; - } - else - throw new Exception("Unsupported color conversion request."); - break; - - case ColorSpace.RGB: - cinfo.m_out_color_components = JpegConstants.RGB_PixelLength; - if (cinfo.m_jpeg_color_space == ColorSpace.YCbCr) - { - m_converter = ColorConverter.ycc_rgb_converter; - build_ycc_rgb_table(); - } - else if (cinfo.m_jpeg_color_space == ColorSpace.Grayscale) - m_converter = ColorConverter.gray_rgb_converter; - else if (cinfo.m_jpeg_color_space == ColorSpace.RGB) - m_converter = ColorConverter.null_converter; - else - throw new Exception("Unsupported color conversion request."); - break; - - case ColorSpace.CMYK: - cinfo.m_out_color_components = 4; - if (cinfo.m_jpeg_color_space == ColorSpace.YCCK) - { - m_converter = ColorConverter.ycck_cmyk_converter; - build_ycc_rgb_table(); - } - else if (cinfo.m_jpeg_color_space == ColorSpace.CMYK) - m_converter = ColorConverter.null_converter; - else - throw new Exception("Unsupported color conversion request."); - break; - - default: - if (cinfo.m_out_color_space == cinfo.m_jpeg_color_space) - { - cinfo.m_out_color_components = cinfo.m_num_components; - m_converter = ColorConverter.null_converter; - } - else - { - throw new Exception("Unsupported color conversion request."); - } - break; - } - - if (cinfo.m_quantize_colors) - cinfo.m_output_components = 1; - else - cinfo.m_output_components = cinfo.m_out_color_components; - } - public void color_convert(ComponentBuffer[] input_buf, int[] perComponentOffsets, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - m_perComponentOffsets = perComponentOffsets; - - switch (m_converter) - { - case ColorConverter.grayscale_converter: - grayscale_convert(input_buf, input_row, output_buf, output_row, num_rows); - break; - case ColorConverter.ycc_rgb_converter: - ycc_rgb_convert(input_buf, input_row, output_buf, output_row, num_rows); - break; - case ColorConverter.gray_rgb_converter: - gray_rgb_convert(input_buf, input_row, output_buf, output_row, num_rows); - break; - case ColorConverter.null_converter: - null_convert(input_buf, input_row, output_buf, output_row, num_rows); - break; - case ColorConverter.ycck_cmyk_converter: - ycck_cmyk_convert(input_buf, input_row, output_buf, output_row, num_rows); - break; - default: - throw new Exception("Unsupported color conversion request."); - } - } - - private static int FIX(double x) - { - return (int)(x * (1L << SCALEBITS) + 0.5); - } - - - #region YCbCr to RGB - private void build_ycc_rgb_table() - { - m_Cr_r_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cb_b_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cr_g_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cb_g_tab = new int[JpegConstants.MaxSampleValue + 1]; - - for (int i = 0, x = -JpegConstants.MediumSampleValue; i <= JpegConstants.MaxSampleValue; i++, x++) - { - m_Cr_r_tab[i] = JpegUtils.RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - m_Cb_b_tab[i] = JpegUtils.RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - m_Cr_g_tab[i] = (-FIX(0.71414)) * x; - m_Cb_g_tab[i] = (-FIX(0.34414)) * x + ONE_HALF; - } - } - - private void ycc_rgb_convert(ComponentBuffer[] input_buf, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - int component0RowOffset = m_perComponentOffsets[0]; - int component1RowOffset = m_perComponentOffsets[1]; - int component2RowOffset = m_perComponentOffsets[2]; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < m_cinfo.m_output_width; col++) - { - int y = input_buf[0][input_row + component0RowOffset][col]; - int cb = input_buf[1][input_row + component1RowOffset][col]; - int cr = input_buf[2][input_row + component2RowOffset][col]; - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + m_Cr_r_tab[cr]]; - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS)]; - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + m_Cb_b_tab[cb]]; - columnOffset += JpegConstants.RGB_PixelLength; - } - input_row++; - } - } - #endregion - - #region YCCK to CMYK - private void ycck_cmyk_convert(ComponentBuffer[] input_buf, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - int component0RowOffset = m_perComponentOffsets[0]; - int component1RowOffset = m_perComponentOffsets[1]; - int component2RowOffset = m_perComponentOffsets[2]; - int component3RowOffset = m_perComponentOffsets[3]; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - int num_cols = m_cinfo.m_output_width; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - int y = input_buf[0][input_row + component0RowOffset][col]; - int cb = input_buf[1][input_row + component1RowOffset][col]; - int cr = input_buf[2][input_row + component2RowOffset][col]; - output_buf[output_row + row][columnOffset] = limit[limitOffset + JpegConstants.MaxSampleValue - (y + m_Cr_r_tab[cr])]; - output_buf[output_row + row][columnOffset + 1] = limit[limitOffset + JpegConstants.MaxSampleValue - (y + JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS))]; - output_buf[output_row + row][columnOffset + 2] = limit[limitOffset + JpegConstants.MaxSampleValue - (y + m_Cb_b_tab[cb])]; - output_buf[output_row + row][columnOffset + 3] = input_buf[3][input_row + component3RowOffset][col]; - columnOffset += 4; - } - input_row++; - } - } - #endregion - - #region Grayscale to RGB - private void gray_rgb_convert(ComponentBuffer[] input_buf, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - int component0RowOffset = m_perComponentOffsets[0]; - int component1RowOffset = m_perComponentOffsets[1]; - int component2RowOffset = m_perComponentOffsets[2]; - int num_cols = m_cinfo.m_output_width; - for (int row = 0; row < num_rows; row++) - { - int columnOffset = 0; - for (int col = 0; col < num_cols; col++) - { - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Red] = input_buf[0][input_row + component0RowOffset][col]; - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Green] = input_buf[0][input_row + component1RowOffset][col]; - output_buf[output_row + row][columnOffset + JpegConstants.Offset_RGB_Blue] = input_buf[0][input_row + component2RowOffset][col]; - columnOffset += JpegConstants.RGB_PixelLength; - } - input_row++; - } - } - #endregion - - #region Grayscale Conversion - private void grayscale_convert(ComponentBuffer[] input_buf, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - JpegUtils.jcopy_sample_rows(input_buf[0], input_row + m_perComponentOffsets[0], output_buf, output_row, num_rows, m_cinfo.m_output_width); - } - #endregion - - #region Null Conversion - private void null_convert(ComponentBuffer[] input_buf, int input_row, byte[][] output_buf, int output_row, int num_rows) - { - for (int row = 0; row < num_rows; row++) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - int columnIndex = 0; - int componentOffset = 0; - int perComponentOffset = m_perComponentOffsets[ci]; - - for (int count = m_cinfo.m_output_width; count > 0; count--) - { - output_buf[output_row + row][ci + componentOffset] = input_buf[ci][input_row + perComponentOffset][columnIndex]; - componentOffset += m_cinfo.m_num_components; - columnIndex++; - } - } - input_row++; - } - } - #endregion - } - #endregion - - #region ColorQuantizer - interface ColorQuantizer - { - void start_pass(bool is_pre_scan); - - void color_quantize(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows); - - void finish_pass(); - void new_color_map(); - } - #endregion - - #region ComponentBuffer - class ComponentBuffer - { - private byte[][] m_buffer; - private int[] m_funnyIndices; - private int m_funnyOffset; - - public ComponentBuffer() - { - } - - public ComponentBuffer(byte[][] buf, int[] funnyIndices, int funnyOffset) - { - SetBuffer(buf, funnyIndices, funnyOffset); - } - - public void SetBuffer(byte[][] buf, int[] funnyIndices, int funnyOffset) - { - m_buffer = buf; - m_funnyIndices = funnyIndices; - m_funnyOffset = funnyOffset; - } - - public byte[] this[int i] - { - get - { - if (m_funnyIndices == null) - return m_buffer[i]; - - return m_buffer[m_funnyIndices[i + m_funnyOffset]]; - } - } - } - #endregion - - #region CompressionParameters - public class CompressionParameters - { - private int m_quality = 75; - private int m_smoothingFactor; - private bool m_simpleProgressive; - public CompressionParameters() - { - } - - internal CompressionParameters(CompressionParameters parameters) - { - if (parameters == null) - throw new ArgumentNullException("parameters"); - - m_quality = parameters.m_quality; - m_smoothingFactor = parameters.m_smoothingFactor; - m_simpleProgressive = parameters.m_simpleProgressive; - } - public override bool Equals(object obj) - { - CompressionParameters parameters = obj as CompressionParameters; - if (parameters == null) - return false; - - return (m_quality == parameters.m_quality && - m_smoothingFactor == parameters.m_smoothingFactor && - m_simpleProgressive == parameters.m_simpleProgressive); - } - public override int GetHashCode() - { - return base.GetHashCode(); - } - public int Quality - { - get { return m_quality; } - set { m_quality = value; } - } - public int SmoothingFactor - { - get { return m_smoothingFactor; } - set { m_smoothingFactor = value; } - } - public bool SimpleProgressive - { - get { return m_simpleProgressive; } - set { m_simpleProgressive = value; } - } - } - #endregion - - #region DecompressionParameters - class DecompressionParameters - { - private ColorSpace m_outColorspace = ColorSpace.Unknown; - private int m_scaleNumerator = 1; - private int m_scaleDenominator = 1; - private bool m_bufferedImage; - private bool m_rawDataOut; - private DCTMethod m_dctMethod = (DCTMethod)JpegConstants.DefaultDCTMethod; - private DitherMode m_ditherMode = DitherMode.FloydStein; - private bool m_doFancyUpsampling = true; - private bool m_doBlockSmoothing = true; - private bool m_quantizeColors; - private bool m_twoPassQuantize = true; - private int m_desiredNumberOfColors = 256; - private bool m_enableOnePassQuantizer; - private bool m_enableExternalQuant; - private bool m_enableTwoPassQuantizer; - private int m_traceLevel; - - public int TraceLevel - { - get - { - return m_traceLevel; - } - set - { - m_traceLevel = value; - } - } - public ColorSpace OutColorspace - { - get - { - return m_outColorspace; - } - set - { - m_outColorspace = value; - } - } - public int ScaleNumerator - { - get - { - return m_scaleNumerator; - } - set - { - m_scaleNumerator = value; - } - } - - public int ScaleDenominator - { - get - { - return m_scaleDenominator; - } - set - { - m_scaleDenominator = value; - } - } - public bool BufferedImage - { - get - { - return m_bufferedImage; - } - set - { - m_bufferedImage = value; - } - } - public bool RawDataOut - { - get - { - return m_rawDataOut; - } - set - { - m_rawDataOut = value; - } - } - public DCTMethod DCTMethod - { - get - { - return m_dctMethod; - } - set - { - m_dctMethod = value; - } - } - public bool DoFancyUpsampling - { - get - { - return m_doFancyUpsampling; - } - set - { - m_doFancyUpsampling = value; - } - } - public bool DoBlockSmoothing - { - get - { - return m_doBlockSmoothing; - } - set - { - m_doBlockSmoothing = value; - } - } - public bool QuantizeColors - { - get - { - return m_quantizeColors; - } - set - { - m_quantizeColors = value; - } - } - public DitherMode DitherMode - { - get - { - return m_ditherMode; - } - set - { - m_ditherMode = value; - } - } - public bool TwoPassQuantize - { - get - { - return m_twoPassQuantize; - } - set - { - m_twoPassQuantize = value; - } - } - public int DesiredNumberOfColors - { - get - { - return m_desiredNumberOfColors; - } - set - { - m_desiredNumberOfColors = value; - } - } - public bool EnableOnePassQuantizer - { - get - { - return m_enableOnePassQuantizer; - } - set - { - m_enableOnePassQuantizer = value; - } - } - public bool EnableExternalQuant - { - get - { - return m_enableExternalQuant; - } - set - { - m_enableExternalQuant = value; - } - } - public bool EnableTwoPassQuantizer - { - get - { - return m_enableTwoPassQuantizer; - } - set - { - m_enableTwoPassQuantizer = value; - } - } - } - #endregion - - #region DecompressorToJpegImage - class DecompressorToJpegImage : IDecompressor - { - private JpegImage m_jpegImage; - - internal DecompressorToJpegImage(JpegImage jpegImage) - { - m_jpegImage = jpegImage; - } - - public override Stream Output - { - get - { - return null; - } - } - - public override void SetImageAttributes(LoadedImageAttributes parameters) - { - m_jpegImage.Width = parameters.Width; - m_jpegImage.Height = parameters.Height; - m_jpegImage.BitsPerComponent = 8; - m_jpegImage.ComponentsPerSample = (byte)parameters.ComponentsPerSample; - m_jpegImage.Colorspace = parameters.Colorspace; - } - - public override void BeginWrite() - { - } - - public override void ProcessPixelsRow(byte[] row) - { - SampleRow samplesRow = new SampleRow(row, m_jpegImage.Width, m_jpegImage.BitsPerComponent, m_jpegImage.ComponentsPerSample); - m_jpegImage.addSampleRow(samplesRow); - } - - public override void EndWrite() - { - } - } - #endregion - - #region DerivedTable - class DerivedTable - { - public int[] maxcode = new int[18]; - public int[] valoffset = new int[17]; - public JpegHuffmanTable pub; - public int[] look_nbits = new int[1 << JpegConstants.HuffmanLookaheadDistance]; - public byte[] look_sym = new byte[1 << JpegConstants.HuffmanLookaheadDistance]; - } - #endregion - - #region DestinationManager - public abstract class DestinationManager - { - private byte[] m_buffer; - private int m_position; - private int m_free_in_buffer; - public abstract void init_destination(); - public abstract bool empty_output_buffer(); - public abstract void term_destination(); - public virtual bool emit_byte(int val) - { - m_buffer[m_position] = (byte)val; - m_position++; - - if (--m_free_in_buffer == 0) - { - if (!empty_output_buffer()) - return false; - } - - return true; - } - protected void initInternalBuffer(byte[] buffer, int offset) - { - m_buffer = buffer; - m_free_in_buffer = buffer.Length - offset; - m_position = offset; - } - protected int freeInBuffer - { - get - { - return m_free_in_buffer; - } - } - } - #endregion - - #region DestinationManagerImpl - class DestinationManagerImpl : DestinationManager - { - private const int OUTPUT_BUF_SIZE = 4096; - private JpegCompressor m_cinfo; - private Stream m_outfile; - private byte[] m_buffer; - - public DestinationManagerImpl(JpegCompressor cinfo, Stream alreadyOpenFile) - { - m_cinfo = cinfo; - m_outfile = alreadyOpenFile; - } - public override void init_destination() - { - m_buffer = new byte[OUTPUT_BUF_SIZE]; - initInternalBuffer(m_buffer, 0); - } - public override bool empty_output_buffer() - { - writeBuffer(m_buffer.Length); - initInternalBuffer(m_buffer, 0); - return true; - } - public override void term_destination() - { - int datacount = m_buffer.Length - freeInBuffer; - if (datacount > 0) - writeBuffer(datacount); - - m_outfile.Flush(); - } - - private void writeBuffer(int dataCount) - { - try - { - m_outfile.Write(m_buffer, 0, dataCount); - } -#pragma warning disable 168 - catch (IOException e) - { - throw new Exception("Output file write error --- out of disk space?"); - } - catch (NotSupportedException e) - { - throw new Exception("Output file write error --- out of disk space?"); - } - catch (ObjectDisposedException e) - { - throw new Exception("Output file write error --- out of disk space?"); - } -#pragma warning restore 168 - } - } - #endregion - - #region Enumerations - enum BufferMode - { - PassThru, - SaveSource, - CrankDest, - SaveAndPass - } - public enum DensityUnit - { - Unknown = 0, - DotsInch = 1, - DotsCm = 2 - } - public enum DitherMode - { - None, - Ordered, - FloydStein - } - public enum ReadResult - { - Suspended = 0, - Header_Ok = 1, - Header_Tables_Only = 2, - Reached_SOS = 3, - Reached_EOI = 4, - Row_Completed = 5, - Scan_Completed = 6 - } - public enum ColorSpace - { - Unknown, - Grayscale, - RGB, - YCbCr, - CMYK, - YCCK - } - public enum DCTMethod - { - IntSlow, - IntFast, - Float - } - #endregion - - #region HuffEntropyDecoder - class HuffEntropyDecoder : JpegEntropyDecoder - { - private class savable_state - { - public int[] last_dc_val = new int[JpegConstants.MaxComponentsInScan]; /* last DC coef for each component */ - - public void Assign(savable_state ss) - { - Buffer.BlockCopy(ss.last_dc_val, 0, last_dc_val, 0, last_dc_val.Length * sizeof(int)); - } - } - private SavedBitreadState m_bitstate; - private savable_state m_saved = new savable_state(); - private int m_restarts_to_go; - private DerivedTable[] m_dc_derived_tbls = new DerivedTable[JpegConstants.NumberOfHuffmanTables]; - private DerivedTable[] m_ac_derived_tbls = new DerivedTable[JpegConstants.NumberOfHuffmanTables]; - private DerivedTable[] m_dc_cur_tbls = new DerivedTable[JpegConstants.DecompressorMaxBlocksInMCU]; - private DerivedTable[] m_ac_cur_tbls = new DerivedTable[JpegConstants.DecompressorMaxBlocksInMCU]; - private bool[] m_dc_needed = new bool[JpegConstants.DecompressorMaxBlocksInMCU]; - private bool[] m_ac_needed = new bool[JpegConstants.DecompressorMaxBlocksInMCU]; - - public HuffEntropyDecoder(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - m_dc_derived_tbls[i] = m_ac_derived_tbls[i] = null; - } - public override void start_pass() - { - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - int dctbl = componentInfo.Dc_tbl_no; - int actbl = componentInfo.Ac_tbl_no; - jpeg_make_d_derived_tbl(true, dctbl, ref m_dc_derived_tbls[dctbl]); - jpeg_make_d_derived_tbl(false, actbl, ref m_ac_derived_tbls[actbl]); - m_saved.last_dc_val[ci] = 0; - } - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - int ci = m_cinfo.m_MCU_membership[blkn]; - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - m_dc_cur_tbls[blkn] = m_dc_derived_tbls[componentInfo.Dc_tbl_no]; - m_ac_cur_tbls[blkn] = m_ac_derived_tbls[componentInfo.Ac_tbl_no]; - if (componentInfo.component_needed) - { - m_dc_needed[blkn] = true; - m_ac_needed[blkn] = (componentInfo.DCT_scaled_size > 1); - } - else - { - m_dc_needed[blkn] = m_ac_needed[blkn] = false; - } - } - m_bitstate.bits_left = 0; - m_bitstate.get_buffer = 0; - m_insufficient_data = false; - m_restarts_to_go = m_cinfo.m_restart_interval; - } - public override bool decode_mcu(JpegBlock[] MCU_data) - { - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!process_restart()) - return false; - } - } - if (!m_insufficient_data) - { - int get_buffer; - int bits_left; - WorkingBitreadState br_state = new WorkingBitreadState(); - BITREAD_LOAD_STATE(m_bitstate, out get_buffer, out bits_left, ref br_state); - savable_state state = new savable_state(); - state.Assign(m_saved); - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - int s; - if (!HUFF_DECODE(out s, ref br_state, m_dc_cur_tbls[blkn], ref get_buffer, ref bits_left)) - return false; - - if (s != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, s, ref get_buffer, ref bits_left)) - return false; - - int r = GET_BITS(s, get_buffer, ref bits_left); - s = HUFF_EXTEND(r, s); - } - - if (m_dc_needed[blkn]) - { - int ci = m_cinfo.m_MCU_membership[blkn]; - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - MCU_data[blkn][0] = (short)s; - } - - if (m_ac_needed[blkn]) - { - for (int k = 1; k < JpegConstants.DCTSize2; k++) - { - if (!HUFF_DECODE(out s, ref br_state, m_ac_cur_tbls[blkn], ref get_buffer, ref bits_left)) - return false; - - int r = s >> 4; - s &= 15; - - if (s != 0) - { - k += r; - if (!CHECK_BIT_BUFFER(ref br_state, s, ref get_buffer, ref bits_left)) - return false; - r = GET_BITS(s, get_buffer, ref bits_left); - s = HUFF_EXTEND(r, s); - MCU_data[blkn][JpegUtils.jpeg_natural_order[k]] = (short)s; - } - else - { - if (r != 15) - break; - - k += 15; - } - } - } - else - { - for (int k = 1; k < JpegConstants.DCTSize2; k++) - { - if (!HUFF_DECODE(out s, ref br_state, m_ac_cur_tbls[blkn], ref get_buffer, ref bits_left)) - return false; - - int r = s >> 4; - s &= 15; - - if (s != 0) - { - k += r; - if (!CHECK_BIT_BUFFER(ref br_state, s, ref get_buffer, ref bits_left)) - return false; - - DROP_BITS(s, ref bits_left); - } - else - { - if (r != 15) - break; - - k += 15; - } - } - } - } - BITREAD_SAVE_STATE(ref m_bitstate, get_buffer, bits_left); - m_saved.Assign(state); - } - m_restarts_to_go--; - - return true; - - } - private bool process_restart() - { - m_cinfo.m_marker.SkipBytes(m_bitstate.bits_left / 8); - m_bitstate.bits_left = 0; - if (!m_cinfo.m_marker.read_restart_marker()) - return false; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - m_saved.last_dc_val[ci] = 0; - m_restarts_to_go = m_cinfo.m_restart_interval; - if (m_cinfo.m_unread_marker == 0) - m_insufficient_data = false; - - return true; - } - } - #endregion - - #region HuffEntropyEncoder - class HuffEntropyEncoder : JpegEntropyEncoder - { - private class savable_state - { - public int put_buffer; - public int put_bits; - public int[] last_dc_val = new int[JpegConstants.MaxComponentsInScan]; - } - private bool m_gather_statistics; - private savable_state m_saved = new savable_state(); - private int m_restarts_to_go; - private int m_next_restart_num; - private c_derived_tbl[] m_dc_derived_tbls = new c_derived_tbl[JpegConstants.NumberOfHuffmanTables]; - private c_derived_tbl[] m_ac_derived_tbls = new c_derived_tbl[JpegConstants.NumberOfHuffmanTables]; - private long[][] m_dc_count_ptrs = new long[JpegConstants.NumberOfHuffmanTables][]; - private long[][] m_ac_count_ptrs = new long[JpegConstants.NumberOfHuffmanTables][]; - - public HuffEntropyEncoder(JpegCompressor cinfo) - { - m_cinfo = cinfo; - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - m_dc_derived_tbls[i] = m_ac_derived_tbls[i] = null; - m_dc_count_ptrs[i] = m_ac_count_ptrs[i] = null; - } - } - public override void start_pass(bool gather_statistics) - { - m_gather_statistics = gather_statistics; - - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - int dctbl = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no; - int actbl = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Ac_tbl_no; - if (m_gather_statistics) - { - if (dctbl < 0 || dctbl >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", dctbl)); - - if (actbl < 0 || actbl >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", actbl)); - if (m_dc_count_ptrs[dctbl] == null) - m_dc_count_ptrs[dctbl] = new long[257]; - - Array.Clear(m_dc_count_ptrs[dctbl], 0, m_dc_count_ptrs[dctbl].Length); - - if (m_ac_count_ptrs[actbl] == null) - m_ac_count_ptrs[actbl] = new long[257]; - - Array.Clear(m_ac_count_ptrs[actbl], 0, m_ac_count_ptrs[actbl].Length); - } - else - { - jpeg_make_c_derived_tbl(true, dctbl, ref m_dc_derived_tbls[dctbl]); - jpeg_make_c_derived_tbl(false, actbl, ref m_ac_derived_tbls[actbl]); - } - m_saved.last_dc_val[ci] = 0; - } - m_saved.put_buffer = 0; - m_saved.put_bits = 0; - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num = 0; - } - - public override bool encode_mcu(JpegBlock[][] MCU_data) - { - if (m_gather_statistics) - return encode_mcu_gather(MCU_data); - - return encode_mcu_huff(MCU_data); - } - - public override void finish_pass() - { - if (m_gather_statistics) - finish_pass_gather(); - else - finish_pass_huff(); - } - private bool encode_mcu_huff(JpegBlock[][] MCU_data) - { - savable_state state; - state = m_saved; - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!emit_restart(state, m_next_restart_num)) - return false; - } - } - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - int ci = m_cinfo.m_MCU_membership[blkn]; - if (!encode_one_block(state, MCU_data[blkn][0].data, state.last_dc_val[ci], - m_dc_derived_tbls[m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no], - m_ac_derived_tbls[m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Ac_tbl_no])) - { - return false; - } - state.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - m_saved = state; - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num++; - m_next_restart_num &= 7; - } - - m_restarts_to_go--; - } - - return true; - } - private void finish_pass_huff() - { - savable_state state; - state = m_saved; - if (!flush_bits(state)) - throw new Exception("Suspension not allowed here!"); - m_saved = state; - } - private bool encode_mcu_gather(JpegBlock[][] MCU_data) - { - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - m_saved.last_dc_val[ci] = 0; - m_restarts_to_go = m_cinfo.m_restart_interval; - } - - m_restarts_to_go--; - } - - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - int ci = m_cinfo.m_MCU_membership[blkn]; - htest_one_block(MCU_data[blkn][0].data, m_saved.last_dc_val[ci], - m_dc_count_ptrs[m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no], - m_ac_count_ptrs[m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Ac_tbl_no]); - m_saved.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - - return true; - } - private void finish_pass_gather() - { - bool[] did_dc = new bool[JpegConstants.NumberOfHuffmanTables]; - bool[] did_ac = new bool[JpegConstants.NumberOfHuffmanTables]; - - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - int dctbl = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no; - if (!did_dc[dctbl]) - { - if (m_cinfo.m_dc_huff_tbl_ptrs[dctbl] == null) - m_cinfo.m_dc_huff_tbl_ptrs[dctbl] = new JpegHuffmanTable(); - - jpeg_gen_optimal_table(m_cinfo.m_dc_huff_tbl_ptrs[dctbl], m_dc_count_ptrs[dctbl]); - did_dc[dctbl] = true; - } - - int actbl = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Ac_tbl_no; - if (!did_ac[actbl]) - { - if (m_cinfo.m_ac_huff_tbl_ptrs[actbl] == null) - m_cinfo.m_ac_huff_tbl_ptrs[actbl] = new JpegHuffmanTable(); - - jpeg_gen_optimal_table(m_cinfo.m_ac_huff_tbl_ptrs[actbl], m_ac_count_ptrs[actbl]); - did_ac[actbl] = true; - } - } - } - private bool encode_one_block(savable_state state, short[] block, int last_dc_val, c_derived_tbl dctbl, c_derived_tbl actbl) - { - int temp = block[0] - last_dc_val; - int temp2 = temp; - if (temp < 0) - { - temp = -temp; - temp2--; - } - - int nbits = 0; - while (temp != 0) - { - nbits++; - temp >>= 1; - } - if (nbits > MAX_HUFFMAN_COEF_BITS + 1) - throw new Exception("DCT coefficient is out of range!"); - if (!emit_bits(state, dctbl.ehufco[nbits], dctbl.ehufsi[nbits])) - return false; - if (nbits != 0) - { - if (!emit_bits(state, temp2, nbits)) - return false; - } - int r = 0; - for (int k = 1; k < JpegConstants.DCTSize2; k++) - { - temp = block[JpegUtils.jpeg_natural_order[k]]; - if (temp == 0) - { - r++; - } - else - { - while (r > 15) - { - if (!emit_bits(state, actbl.ehufco[0xF0], actbl.ehufsi[0xF0])) - return false; - r -= 16; - } - - temp2 = temp; - if (temp < 0) - { - temp = -temp; - temp2--; - } - nbits = 1; - while ((temp >>= 1) != 0) - nbits++; - if (nbits > MAX_HUFFMAN_COEF_BITS) - throw new Exception("DCT coefficient is out of range!"); - int i = (r << 4) + nbits; - if (!emit_bits(state, actbl.ehufco[i], actbl.ehufsi[i])) - return false; - if (!emit_bits(state, temp2, nbits)) - return false; - - r = 0; - } - } - if (r > 0) - { - if (!emit_bits(state, actbl.ehufco[0], actbl.ehufsi[0])) - return false; - } - - return true; - } - private void htest_one_block(short[] block, int last_dc_val, long[] dc_counts, long[] ac_counts) - { - int temp = block[0] - last_dc_val; - if (temp < 0) - temp = -temp; - int nbits = 0; - while (temp != 0) - { - nbits++; - temp >>= 1; - } - if (nbits > MAX_HUFFMAN_COEF_BITS + 1) - throw new Exception("DCT coefficient is out of range!"); - dc_counts[nbits]++; - int r = 0; - for (int k = 1; k < JpegConstants.DCTSize2; k++) - { - temp = block[JpegUtils.jpeg_natural_order[k]]; - if (temp == 0) - { - r++; - } - else - { - while (r > 15) - { - ac_counts[0xF0]++; - r -= 16; - } - if (temp < 0) - temp = -temp; - nbits = 1; - while ((temp >>= 1) != 0) - nbits++; - if (nbits > MAX_HUFFMAN_COEF_BITS) - throw new Exception("DCT coefficient is out of range!"); - ac_counts[(r << 4) + nbits]++; - - r = 0; - } - } - if (r > 0) - ac_counts[0]++; - } - - private bool emit_byte(int val) - { - return m_cinfo.m_dest.emit_byte(val); - } - private bool emit_bits(savable_state state, int code, int size) - { - int put_buffer = code; - int put_bits = state.put_bits; - if (size == 0) - throw new Exception("Missing Huffman code table entry"); - - put_buffer &= (1 << size) - 1; - put_bits += size; - put_buffer <<= 24 - put_bits; - put_buffer |= state.put_buffer; - - while (put_bits >= 8) - { - int c = (put_buffer >> 16) & 0xFF; - if (!emit_byte(c)) - return false; - - if (c == 0xFF) - { - if (!emit_byte(0)) - return false; - } - - put_buffer <<= 8; - put_bits -= 8; - } - - state.put_buffer = put_buffer; - state.put_bits = put_bits; - - return true; - } - - private bool flush_bits(savable_state state) - { - if (!emit_bits(state, 0x7F, 7)) - return false; - - state.put_buffer = 0; - state.put_bits = 0; - return true; - } - private bool emit_restart(savable_state state, int restart_num) - { - if (!flush_bits(state)) - return false; - - if (!emit_byte(0xFF)) - return false; - - if (!emit_byte((int)(JpegMarkerType.RST0 + restart_num))) - return false; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - state.last_dc_val[ci] = 0; - return true; - } - } - #endregion - - #region IDecompressDestination - abstract class IDecompressor - { - public abstract Stream Output { get; } - public abstract void SetImageAttributes(LoadedImageAttributes parameters); - public abstract void BeginWrite(); - public abstract void ProcessPixelsRow(byte[] row); - public abstract void EndWrite(); - } - class LoadedImageAttributes - { - private ColorSpace m_colorspace; - private bool m_quantizeColors; - private int m_width; - private int m_height; - private int m_componentsPerSample; - private int m_components; - private int m_actualNumberOfColors; - private byte[][] m_colormap; - private DensityUnit m_densityUnit; - private int m_densityX; - private int m_densityY; - public ColorSpace Colorspace - { - get - { - return m_colorspace; - } - internal set - { - m_colorspace = value; - } - } - public bool QuantizeColors - { - get - { - return m_quantizeColors; - } - internal set - { - m_quantizeColors = value; - } - } - public int Width - { - get - { - return m_width; - } - internal set - { - m_width = value; - } - } - public int Height - { - get - { - return m_height; - } - internal set - { - m_height = value; - } - } - public int ComponentsPerSample - { - get - { - return m_componentsPerSample; - } - internal set - { - m_componentsPerSample = value; - } - } - public int Components - { - get - { - return m_components; - } - internal set - { - m_components = value; - } - } - public int ActualNumberOfColors - { - get - { - return m_actualNumberOfColors; - } - internal set - { - m_actualNumberOfColors = value; - } - } - public byte[][] Colormap - { - get - { - return m_colormap; - } - internal set - { - m_colormap = value; - } - } - public DensityUnit DensityUnit - { - get - { - return m_densityUnit; - } - internal set - { - m_densityUnit = value; - } - } - public int DensityX - { - get - { - return m_densityX; - } - internal set - { - m_densityX = value; - } - } - public int DensityY - { - get - { - return m_densityY; - } - internal set - { - m_densityY = value; - } - } - } - #endregion - - #region IRawImage - abstract class IRawImage - { - public abstract int Width { get; } - public abstract int Height { get; } - public abstract ColorSpace Colorspace { get; } - public abstract int ComponentsPerPixel { get; } - - public abstract void BeginRead(); - public abstract byte[] GetPixelRow(); - public abstract void EndRead(); - } - #endregion - - #region Jpeg - class Jpeg - { - private JpegCompressor m_compressor = new JpegCompressor(); - private JpegDecompressor m_decompressor = new JpegDecompressor(); - private CompressionParameters m_compressionParameters = new CompressionParameters(); - private DecompressionParameters m_decompressionParameters = new DecompressionParameters(); - public CompressionParameters CompressionParameters - { - get - { - return m_compressionParameters; - } - set - { - if (value == null) - throw new ArgumentNullException("value"); - - m_compressionParameters = value; - } - } - public DecompressionParameters DecompressionParameters - { - get - { - return m_decompressionParameters; - } - set - { - if (value == null) - throw new ArgumentNullException("value"); - - m_decompressionParameters = value; - } - } - public void Compress(IRawImage source, Stream output) - { - if (source == null) - throw new ArgumentNullException("source"); - - if (output == null) - throw new ArgumentNullException("output"); - - m_compressor.Image_width = source.Width; - m_compressor.Image_height = source.Height; - m_compressor.In_color_space = (ColorSpace)source.Colorspace; - m_compressor.Input_components = source.ComponentsPerPixel; - m_compressor.jpeg_set_defaults(); - applyParameters(m_compressionParameters); - m_compressor.jpeg_stdio_dest(output); - m_compressor.jpeg_start_compress(true); - source.BeginRead(); - while (m_compressor.Next_scanline < m_compressor.Image_height) - { - byte[] row = source.GetPixelRow(); - if (row == null) - { - throw new InvalidDataException("Row of pixels is null"); - } - - byte[][] rowForDecompressor = new byte[1][]; - rowForDecompressor[0] = row; - m_compressor.jpeg_write_scanlines(rowForDecompressor, 1); - } - source.EndRead(); - m_compressor.jpeg_finish_compress(); - } - public void Decompress(Stream jpeg, IDecompressor destination) - { - if (jpeg == null) - throw new ArgumentNullException("jpeg"); - - if (destination == null) - throw new ArgumentNullException("destination"); - - beforeDecompress(jpeg); - m_decompressor.jpeg_start_decompress(); - - LoadedImageAttributes parameters = getImageParametersFromDecompressor(); - destination.SetImageAttributes(parameters); - destination.BeginWrite(); - while (m_decompressor.Output_scanline < m_decompressor.Output_height) - { - byte[][] row = JpegCommonBase.AllocJpegSamples(m_decompressor.Output_width * m_decompressor.Output_components, 1); - m_decompressor.jpeg_read_scanlines(row, 1); - destination.ProcessPixelsRow(row[0]); - } - - destination.EndWrite(); - m_decompressor.jpeg_finish_decompress(); - } - private void beforeDecompress(Stream jpeg) - { - m_decompressor.jpeg_stdio_src(jpeg); - m_decompressor.jpeg_read_header(true); - applyParameters(m_decompressionParameters); - m_decompressor.jpeg_calc_output_dimensions(); - } - - private LoadedImageAttributes getImageParametersFromDecompressor() - { - LoadedImageAttributes result = new LoadedImageAttributes(); - result.Colorspace = (ColorSpace)m_decompressor.Out_color_space; - result.QuantizeColors = m_decompressor.Quantize_colors; - result.Width = m_decompressor.Output_width; - result.Height = m_decompressor.Output_height; - result.ComponentsPerSample = m_decompressor.Out_color_components; - result.Components = m_decompressor.Output_components; - result.ActualNumberOfColors = m_decompressor.Actual_number_of_colors; - result.Colormap = m_decompressor.Colormap; - result.DensityUnit = m_decompressor.Density_unit; - result.DensityX = m_decompressor.X_density; - result.DensityY = m_decompressor.Y_density; - return result; - } - - public JpegCompressor ClassicCompressor - { - get - { - return m_compressor; - } - } - - public JpegDecompressor ClassicDecompressor - { - get - { - return m_decompressor; - } - } - public delegate bool MarkerParser(Jpeg decompressor); - public void SetMarkerProcessor(int markerCode, MarkerParser routine) - { - JpegDecompressor.jpeg_marker_parser_method f = delegate { return routine(this); }; - m_decompressor.jpeg_set_marker_processor(markerCode, f); - } - - private void applyParameters(DecompressionParameters parameters) - { - if (parameters == null) - throw new ArgumentNullException("'parameters' Cannot be null!"); - - if (parameters.OutColorspace != ColorSpace.Unknown) - m_decompressor.Out_color_space = (ColorSpace)parameters.OutColorspace; - - m_decompressor.Scale_num = parameters.ScaleNumerator; - m_decompressor.Scale_denom = parameters.ScaleDenominator; - m_decompressor.Buffered_image = parameters.BufferedImage; - m_decompressor.Raw_data_out = parameters.RawDataOut; - m_decompressor.Dct_method = (DCTMethod)parameters.DCTMethod; - m_decompressor.Dither_mode = (DitherMode)parameters.DitherMode; - m_decompressor.Do_fancy_upsampling = parameters.DoFancyUpsampling; - m_decompressor.Do_block_smoothing = parameters.DoBlockSmoothing; - m_decompressor.Quantize_colors = parameters.QuantizeColors; - m_decompressor.Two_pass_quantize = parameters.TwoPassQuantize; - m_decompressor.Desired_number_of_colors = parameters.DesiredNumberOfColors; - m_decompressor.Enable_1pass_quant = parameters.EnableOnePassQuantizer; - m_decompressor.Enable_external_quant = parameters.EnableExternalQuant; - m_decompressor.Enable_2pass_quant = parameters.EnableTwoPassQuantizer; - } - - private void applyParameters(CompressionParameters parameters) - { - if (parameters == null) - throw new ArgumentNullException("'parameters' Cannot be null!"); - - m_compressor.Smoothing_factor = parameters.SmoothingFactor; - m_compressor.jpeg_set_quality(parameters.Quality, true); - if (parameters.SimpleProgressive) - m_compressor.jpeg_simple_progression(); - } - } - #endregion - - #region JpegBlock - public class JpegBlock - { - internal short[] data = new short[JpegConstants.DCTSize2]; - public short this[int index] - { - get - { - return data[index]; - } - set - { - data[index] = value; - } - } - } - #endregion - - #region JpegCompressor - public class JpegCompressor : JpegCommonBase - { - private static int[] std_luminance_quant_tbl = { - 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, - 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, - 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, - 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, - 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, - 100, 103, 99 }; - - private static int[] std_chrominance_quant_tbl = { - 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, - 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99 }; - private static byte[] bits_dc_luminance = { 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; - - private static byte[] val_dc_luminance = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - private static byte[] bits_dc_chrominance = { 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; - - private static byte[] val_dc_chrominance = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - private static byte[] bits_ac_luminance = { 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; - - private static byte[] val_ac_luminance = - { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, - 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, - 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, - 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, - 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, - 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, - 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, - 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, - 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; - - private static byte[] bits_ac_chrominance = { 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; - - private static byte[] val_ac_chrominance = - { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, - 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, - 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, - 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, - 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, - 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, - 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, - 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, - 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, - 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; - - internal DestinationManager m_dest; - internal int m_image_width; - internal int m_image_height; - internal int m_input_components; - internal ColorSpace m_in_color_space; - internal int m_data_precision; - internal int m_num_components; - internal ColorSpace m_jpeg_color_space; - private JpegComponent[] m_comp_info; - internal JpegQuantizationTable[] m_quant_tbl_ptrs = new JpegQuantizationTable[JpegConstants.NumberOfQuantTables]; - internal JpegHuffmanTable[] m_dc_huff_tbl_ptrs = new JpegHuffmanTable[JpegConstants.NumberOfHuffmanTables]; - internal JpegHuffmanTable[] m_ac_huff_tbl_ptrs = new JpegHuffmanTable[JpegConstants.NumberOfHuffmanTables]; - internal int m_num_scans; - internal JpegScanInfo[] m_scan_info; - internal bool m_raw_data_in; - internal bool m_optimize_coding; - internal bool m_CCIR601_sampling; - internal int m_smoothing_factor; - internal DCTMethod m_dct_method; - internal int m_restart_interval; - internal int m_restart_in_rows; - internal bool m_write_JFIF_header; - internal byte m_JFIF_major_version; - internal byte m_JFIF_minor_version; - internal DensityUnit m_density_unit; - internal short m_X_density; - internal short m_Y_density; - internal bool m_write_Adobe_marker; - internal int m_next_scanline; - internal bool m_progressive_mode; - internal int m_max_h_samp_factor; - internal int m_max_v_samp_factor; - internal int m_total_iMCU_rows; - internal int m_comps_in_scan; - internal int[] m_cur_comp_info = new int[JpegConstants.MaxComponentsInScan]; - internal int m_MCUs_per_row; - internal int m_MCU_rows_in_scan; - internal int m_blocks_in_MCU; - internal int[] m_MCU_membership = new int[JpegConstants.CompressorMaxBlocksInMCU]; - internal int m_Ss; - internal int m_Se; - internal int m_Ah; - internal int m_Al; - internal JpegCompressorMaster m_master; - internal JpegCompressorMainController m_main; - internal JpegCompressorPrepController m_prep; - internal JpegCompressorCoefController m_coef; - internal JpegMarkerWriter m_marker; - internal ColorConverter m_cconvert; - internal JpegDownsampler m_downsample; - internal JpegFowardDCT m_fdct; - internal JpegEntropyEncoder m_entropy; - internal JpegScanInfo[] m_script_space; - internal int m_script_space_size; - public JpegCompressor() - : base() - { - initialize(); - } - public override bool IsDecompressor - { - get { return false; } - } - public LibJpeg.DestinationManager Dest - { - get { return m_dest; } - set { m_dest = value; } - } - public int Image_width - { - get { return m_image_width; } - set { m_image_width = value; } - } - public int Image_height - { - get { return m_image_height; } - set { m_image_height = value; } - } - public int Input_components - { - get { return m_input_components; } - set { m_input_components = value; } - } - public LibJpeg.ColorSpace In_color_space - { - get { return m_in_color_space; } - set { m_in_color_space = value; } - } - public int Data_precision - { - get { return m_data_precision; } - set { m_data_precision = value; } - } - public int Num_components - { - get { return m_num_components; } - set { m_num_components = value; } - } - public ColorSpace Jpeg_color_space - { - get { return m_jpeg_color_space; } - set { m_jpeg_color_space = value; } - } - public bool Raw_data_in - { - get { return m_raw_data_in; } - set { m_raw_data_in = value; } - } - public bool Optimize_coding - { - get { return m_optimize_coding; } - set { m_optimize_coding = value; } - } - public bool CCIR601_sampling - { - get { return m_CCIR601_sampling; } - set { m_CCIR601_sampling = value; } - } - public int Smoothing_factor - { - get { return m_smoothing_factor; } - set { m_smoothing_factor = value; } - } - public DCTMethod Dct_method - { - get { return m_dct_method; } - set { m_dct_method = value; } - } - public int Restart_interval - { - get { return m_restart_interval; } - set { m_restart_interval = value; } - } - public int Restart_in_rows - { - get { return m_restart_in_rows; } - set { m_restart_in_rows = value; } - } - public bool Write_JFIF_header - { - get { return m_write_JFIF_header; } - set { m_write_JFIF_header = value; } - } - public byte JFIF_major_version - { - get { return m_JFIF_major_version; } - set { m_JFIF_major_version = value; } - } - public byte JFIF_minor_version - { - get { return m_JFIF_minor_version; } - set { m_JFIF_minor_version = value; } - } - public DensityUnit Density_unit - { - get { return m_density_unit; } - set { m_density_unit = value; } - } - public short X_density - { - get { return m_X_density; } - set { m_X_density = value; } - } - public short Y_density - { - get { return m_Y_density; } - set { m_Y_density = value; } - } - public bool Write_Adobe_marker - { - get { return m_write_Adobe_marker; } - set { m_write_Adobe_marker = value; } - } - public int Max_v_samp_factor - { - get { return m_max_v_samp_factor; } - } - public JpegComponent[] Component_info - { - get { return m_comp_info; } - } - public JpegQuantizationTable[] Quant_tbl_ptrs - { - get { return m_quant_tbl_ptrs; } - } - public JpegHuffmanTable[] Dc_huff_tbl_ptrs - { - get { return m_dc_huff_tbl_ptrs; } - } - public JpegHuffmanTable[] Ac_huff_tbl_ptrs - { - get { return m_ac_huff_tbl_ptrs; } - } - public int Next_scanline - { - get { return m_next_scanline; } - } - public void jpeg_abort_compress() - { - jpeg_abort(); - } - public void jpeg_suppress_tables(bool suppress) - { - for (int i = 0; i < JpegConstants.NumberOfQuantTables; i++) - { - if (m_quant_tbl_ptrs[i] != null) - m_quant_tbl_ptrs[i].Sent_table = suppress; - } - - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - if (m_dc_huff_tbl_ptrs[i] != null) - m_dc_huff_tbl_ptrs[i].Sent_table = suppress; - - if (m_ac_huff_tbl_ptrs[i] != null) - m_ac_huff_tbl_ptrs[i].Sent_table = suppress; - } - } - public void jpeg_finish_compress() - { - int iMCU_row; - - if (m_global_state == JpegState.CSTATE_SCANNING || m_global_state == JpegState.CSTATE_RAW_OK) - { - if (m_next_scanline < m_image_height) - throw new Exception("Application transferred too few scanlines"); - m_master.finish_pass(); - } - else if (m_global_state != JpegState.CSTATE_WRCOEFS) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - while (!m_master.IsLastPass()) - { - m_master.prepare_for_pass(); - for (iMCU_row = 0; iMCU_row < m_total_iMCU_rows; iMCU_row++) - { - if (!m_coef.compress_data(null)) - throw new Exception("Suspension not allowed here"); - } - - m_master.finish_pass(); - } - m_marker.write_file_trailer(); - m_dest.term_destination(); - jpeg_abort(); - } - public void jpeg_write_marker(int marker, byte[] data) - { - if (m_next_scanline != 0 || (m_global_state != JpegState.CSTATE_SCANNING && m_global_state != JpegState.CSTATE_RAW_OK && m_global_state != JpegState.CSTATE_WRCOEFS)) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - m_marker.write_marker_header(marker, data.Length); - - for (int i = 0; i < data.Length; i++) - m_marker.write_marker_byte(data[i]); - } - public void jpeg_write_m_header(int marker, int datalen) - { - if (m_next_scanline != 0 || (m_global_state != JpegState.CSTATE_SCANNING && m_global_state != JpegState.CSTATE_RAW_OK && m_global_state != JpegState.CSTATE_WRCOEFS)) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - m_marker.write_marker_header(marker, datalen); - } - public void jpeg_write_m_byte(byte val) - { - m_marker.write_marker_byte(val); - } - public void jpeg_write_tables() - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - m_dest.init_destination(); - m_marker = new JpegMarkerWriter(this); - m_marker.write_tables_only(); - m_dest.term_destination(); - } - public void jpeg_stdio_dest(Stream outfile) - { - m_dest = new DestinationManagerImpl(this, outfile); - } - public void jpeg_set_defaults() - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - if (m_comp_info == null) - { - m_comp_info = JpegComponent.createArrayOfComponents(JpegConstants.MaxComponents); - } - m_data_precision = JpegConstants.BitsInSample; - jpeg_set_quality(75, true); - std_huff_tables(); - m_scan_info = null; - m_num_scans = 0; - m_raw_data_in = false; - m_optimize_coding = false; - if (m_data_precision > 8) - m_optimize_coding = true; - m_CCIR601_sampling = false; - m_smoothing_factor = 0; - m_dct_method = JpegConstants.DefaultDCTMethod; - m_restart_interval = 0; - m_restart_in_rows = 0; - m_JFIF_major_version = 1; - m_JFIF_minor_version = 1; - m_density_unit = DensityUnit.Unknown; - m_X_density = 1; - m_Y_density = 1; - jpeg_default_colorspace(); - } - public void jpeg_set_colorspace(ColorSpace colorspace) - { - int ci; - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - m_jpeg_color_space = colorspace; - m_write_JFIF_header = false; - m_write_Adobe_marker = false; - - switch (colorspace) - { - case ColorSpace.Grayscale: - m_write_JFIF_header = true; - m_num_components = 1; - jpeg_set_colorspace_SET_COMP(0, 1, 1, 1, 0, 0, 0); - break; - case ColorSpace.RGB: - m_write_Adobe_marker = true; - m_num_components = 3; - jpeg_set_colorspace_SET_COMP(0, 0x52, 1, 1, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(1, 0x47, 1, 1, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(2, 0x42, 1, 1, 0, 0, 0); - break; - case ColorSpace.YCbCr: - m_write_JFIF_header = true; - m_num_components = 3; - jpeg_set_colorspace_SET_COMP(0, 1, 2, 2, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(1, 2, 1, 1, 1, 1, 1); - jpeg_set_colorspace_SET_COMP(2, 3, 1, 1, 1, 1, 1); - break; - case ColorSpace.CMYK: - m_write_Adobe_marker = true; - m_num_components = 4; - jpeg_set_colorspace_SET_COMP(0, 0x43, 1, 1, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(1, 0x4D, 1, 1, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(2, 0x59, 1, 1, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(3, 0x4B, 1, 1, 0, 0, 0); - break; - case ColorSpace.YCCK: - m_write_Adobe_marker = true; - m_num_components = 4; - jpeg_set_colorspace_SET_COMP(0, 1, 2, 2, 0, 0, 0); - jpeg_set_colorspace_SET_COMP(1, 2, 1, 1, 1, 1, 1); - jpeg_set_colorspace_SET_COMP(2, 3, 1, 1, 1, 1, 1); - jpeg_set_colorspace_SET_COMP(3, 4, 2, 2, 0, 0, 0); - break; - case ColorSpace.Unknown: - m_num_components = m_input_components; - if (m_num_components < 1 || m_num_components > JpegConstants.MaxComponents) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_num_components, JpegConstants.MaxComponents)); - for (ci = 0; ci < m_num_components; ci++) - { - jpeg_set_colorspace_SET_COMP(ci, ci, 1, 1, 0, 0, 0); - } - break; - default: - throw new Exception("Bad Jpeg ColorSpace."); - } - } - public void jpeg_default_colorspace() - { - switch (m_in_color_space) - { - case ColorSpace.Grayscale: - jpeg_set_colorspace(ColorSpace.Grayscale); - break; - case ColorSpace.RGB: - jpeg_set_colorspace(ColorSpace.YCbCr); - break; - case ColorSpace.YCbCr: - jpeg_set_colorspace(ColorSpace.YCbCr); - break; - case ColorSpace.CMYK: - jpeg_set_colorspace(ColorSpace.CMYK); - break; - case ColorSpace.YCCK: - jpeg_set_colorspace(ColorSpace.YCCK); - break; - case ColorSpace.Unknown: - jpeg_set_colorspace(ColorSpace.Unknown); - break; - default: - throw new Exception("Bad input colorspace!"); - } - } - public void jpeg_set_quality(int quality, bool force_baseline) - { - quality = jpeg_quality_scaling(quality); - jpeg_set_linear_quality(quality, force_baseline); - } - public void jpeg_set_linear_quality(int scale_factor, bool force_baseline) - { - jpeg_add_quant_table(0, std_luminance_quant_tbl, scale_factor, force_baseline); - jpeg_add_quant_table(1, std_chrominance_quant_tbl, scale_factor, force_baseline); - } - public void jpeg_add_quant_table(int which_tbl, int[] basic_table, int scale_factor, bool force_baseline) - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (which_tbl < 0 || which_tbl >= JpegConstants.NumberOfQuantTables) - throw new Exception(String.Format("Bogus DQT index {0}", which_tbl)); - - if (m_quant_tbl_ptrs[which_tbl] == null) - m_quant_tbl_ptrs[which_tbl] = new JpegQuantizationTable(); - - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - int temp = (basic_table[i] * scale_factor + 50) / 100; - if (temp <= 0) - temp = 1; - if (temp > 32767) - temp = 32767; - if (force_baseline && temp > 255) - temp = 255; - - m_quant_tbl_ptrs[which_tbl].quantval[i] = (short)temp; - } - m_quant_tbl_ptrs[which_tbl].Sent_table = false; - } - public static int jpeg_quality_scaling(int quality) - { - if (quality <= 0) - quality = 1; - - if (quality > 100) - quality = 100; - - if (quality < 50) - quality = 5000 / quality; - else - quality = 200 - quality * 2; - - return quality; - } - public void jpeg_simple_progression() - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - int nscans; - if (m_num_components == 3 && m_jpeg_color_space == ColorSpace.YCbCr) - { - nscans = 10; - } - else - { - if (m_num_components > JpegConstants.MaxComponentsInScan) - { - nscans = 6 * m_num_components; - } - else - { - nscans = 2 + 4 * m_num_components; - } - } - if (m_script_space == null || m_script_space_size < nscans) - { - m_script_space_size = Math.Max(nscans, 10); - m_script_space = new JpegScanInfo[m_script_space_size]; - for (int i = 0; i < m_script_space_size; i++) - m_script_space[i] = new JpegScanInfo(); - } - - m_scan_info = m_script_space; - m_num_scans = nscans; - - int scanIndex = 0; - if (m_num_components == 3 && m_jpeg_color_space == ColorSpace.YCbCr) - { - fill_dc_scans(ref scanIndex, m_num_components, 0, 1); - fill_a_scan(ref scanIndex, 0, 1, 5, 0, 2); - fill_a_scan(ref scanIndex, 2, 1, 63, 0, 1); - fill_a_scan(ref scanIndex, 1, 1, 63, 0, 1); - fill_a_scan(ref scanIndex, 0, 6, 63, 0, 2); - fill_a_scan(ref scanIndex, 0, 1, 63, 2, 1); - fill_dc_scans(ref scanIndex, m_num_components, 1, 0); - fill_a_scan(ref scanIndex, 2, 1, 63, 1, 0); - fill_a_scan(ref scanIndex, 1, 1, 63, 1, 0); - fill_a_scan(ref scanIndex, 0, 1, 63, 1, 0); - } - else - { - fill_dc_scans(ref scanIndex, m_num_components, 0, 1); - fill_scans(ref scanIndex, m_num_components, 1, 5, 0, 2); - fill_scans(ref scanIndex, m_num_components, 6, 63, 0, 2); - fill_scans(ref scanIndex, m_num_components, 1, 63, 2, 1); - fill_dc_scans(ref scanIndex, m_num_components, 1, 0); - fill_scans(ref scanIndex, m_num_components, 1, 63, 1, 0); - } - } - public void jpeg_start_compress(bool write_all_tables) - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (write_all_tables) - jpeg_suppress_tables(false); - m_dest.init_destination(); - jinit_compress_master(); - m_master.prepare_for_pass(); - m_next_scanline = 0; - m_global_state = (m_raw_data_in ? JpegState.CSTATE_RAW_OK : JpegState.CSTATE_SCANNING); - } - public int jpeg_write_scanlines(byte[][] scanlines, int num_lines) - { - if (m_global_state != JpegState.CSTATE_SCANNING) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (m_master.MustCallPassStartup()) - m_master.pass_startup(); - - int rows_left = m_image_height - m_next_scanline; - if (num_lines > rows_left) - num_lines = rows_left; - - int row_ctr = 0; - m_main.process_data(scanlines, ref row_ctr, num_lines); - m_next_scanline += row_ctr; - return row_ctr; - } - public int jpeg_write_raw_data(byte[][][] data, int num_lines) - { - if (m_global_state != JpegState.CSTATE_RAW_OK) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (m_next_scanline >= m_image_height) - { - return 0; - } - if (m_master.MustCallPassStartup()) - m_master.pass_startup(); - - - int lines_per_iMCU_row = m_max_v_samp_factor * JpegConstants.DCTSize; - if (num_lines < lines_per_iMCU_row) - throw new Exception("Buffer passed to JPEG library is too small"); - - if (!m_coef.compress_data(data)) - { - return 0; - } - - m_next_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; - } - public void jpeg_write_coefficients(JpegVirtualArray[] coef_arrays) - { - if (m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - jpeg_suppress_tables(false); - m_dest.init_destination(); - transencode_master_selection(coef_arrays); - m_next_scanline = 0; - m_global_state = JpegState.CSTATE_WRCOEFS; - } - private void initialize() - { - m_dest = null; - m_comp_info = null; - - for (int i = 0; i < JpegConstants.NumberOfQuantTables; i++) - m_quant_tbl_ptrs[i] = null; - - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - m_dc_huff_tbl_ptrs[i] = null; - m_ac_huff_tbl_ptrs[i] = null; - } - m_script_space = null; - m_global_state = JpegState.CSTATE_START; - } - private void jinit_compress_master() - { - jinit_c_master_control(false); - if (!m_raw_data_in) - { - m_cconvert = new ColorConverter(this); - m_downsample = new JpegDownsampler(this); - m_prep = new JpegCompressorPrepController(this); - } - m_fdct = new JpegFowardDCT(this); - if (m_progressive_mode) - m_entropy = new ProgressiveHuffmanEncoder(this); - else - m_entropy = new HuffEntropyEncoder(this); - m_coef = new CoefControllerImpl(this, (bool)(m_num_scans > 1 || m_optimize_coding)); - jinit_c_main_controller(false); - m_marker = new JpegMarkerWriter(this); - m_marker.write_file_header(); - } - private void jinit_c_master_control(bool transcode_only) - { - initial_setup(); - - if (m_scan_info != null) - { - validate_script(); - } - else - { - m_progressive_mode = false; - m_num_scans = 1; - } - - if (m_progressive_mode) - m_optimize_coding = true; - - m_master = new JpegCompressorMaster(this, transcode_only); - } - private void jinit_c_main_controller(bool need_full_buffer) - { - if (m_raw_data_in) - return; - if (need_full_buffer) - throw new Exception("Bogus buffer control mode"); - else - m_main = new JpegCompressorMainController(this); - } - private void transencode_master_selection(JpegVirtualArray[] coef_arrays) - { - m_input_components = 1; - jinit_c_master_control(true); - if (m_progressive_mode) - m_entropy = new ProgressiveHuffmanEncoder(this); - else - m_entropy = new HuffEntropyEncoder(this); - m_coef = new TransCoefControllerImpl(this, coef_arrays); - m_marker = new JpegMarkerWriter(this); - m_marker.write_file_header(); - } - private void initial_setup() - { - if (m_image_height <= 0 || m_image_width <= 0 || m_num_components <= 0 || m_input_components <= 0) - throw new Exception("Empty JPEG image (DNL not supported)"); - - if (m_image_height > JpegConstants.JpegMaxDimention || m_image_width > JpegConstants.JpegMaxDimention) - throw new Exception(String.Format("Maximum supported image dimension is {0} pixels", (int)JpegConstants.JpegMaxDimention)); - - long samplesperrow = m_image_width * m_input_components; - int jd_samplesperrow = (int)samplesperrow; - if ((long)jd_samplesperrow != samplesperrow) - throw new Exception("Image too wide for this implementation"); - - if (m_data_precision != JpegConstants.BitsInSample) - throw new Exception(String.Format("Unsupported JPEG data precision {0}", m_data_precision)); - - if (m_num_components > JpegConstants.MaxComponents) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_num_components, JpegConstants.MaxComponents)); - - m_max_h_samp_factor = 1; - m_max_v_samp_factor = 1; - for (int ci = 0; ci < m_num_components; ci++) - { - if (m_comp_info[ci].H_samp_factor <= 0 || m_comp_info[ci].H_samp_factor > JpegConstants.MaxSamplingFactor || - m_comp_info[ci].V_samp_factor <= 0 || m_comp_info[ci].V_samp_factor > JpegConstants.MaxSamplingFactor) - { - throw new Exception("Bogus sampling factors"); - } - - m_max_h_samp_factor = Math.Max(m_max_h_samp_factor, m_comp_info[ci].H_samp_factor); - m_max_v_samp_factor = Math.Max(m_max_v_samp_factor, m_comp_info[ci].V_samp_factor); - } - - for (int ci = 0; ci < m_num_components; ci++) - { - m_comp_info[ci].Component_index = ci; - m_comp_info[ci].DCT_scaled_size = JpegConstants.DCTSize; - m_comp_info[ci].Width_in_blocks = JpegUtils.jdiv_round_up( - m_image_width * m_comp_info[ci].H_samp_factor, m_max_h_samp_factor * JpegConstants.DCTSize); - m_comp_info[ci].height_in_blocks = JpegUtils.jdiv_round_up( - m_image_height * m_comp_info[ci].V_samp_factor, m_max_v_samp_factor * JpegConstants.DCTSize); - m_comp_info[ci].downsampled_width = JpegUtils.jdiv_round_up( - m_image_width * m_comp_info[ci].H_samp_factor, m_max_h_samp_factor); - m_comp_info[ci].downsampled_height = JpegUtils.jdiv_round_up( - m_image_height * m_comp_info[ci].V_samp_factor, m_max_v_samp_factor); - m_comp_info[ci].component_needed = true; - } - m_total_iMCU_rows = JpegUtils.jdiv_round_up(m_image_height, m_max_v_samp_factor * JpegConstants.DCTSize); - } - private void validate_script() - { - if (m_num_scans <= 0) - throw new Exception(String.Format("Invalid scan script at entry {0}", 0)); - - int[][] last_bitpos = new int[JpegConstants.MaxComponents][]; - for (int i = 0; i < JpegConstants.MaxComponents; i++) - last_bitpos[i] = new int[JpegConstants.DCTSize2]; - - bool[] component_sent = new bool[JpegConstants.MaxComponents]; - if (m_scan_info[0].Ss != 0 || m_scan_info[0].Se != JpegConstants.DCTSize2 - 1) - { - m_progressive_mode = true; - for (int ci = 0; ci < m_num_components; ci++) - { - for (int coefi = 0; coefi < JpegConstants.DCTSize2; coefi++) - last_bitpos[ci][coefi] = -1; - } - } - else - { - m_progressive_mode = false; - for (int ci = 0; ci < m_num_components; ci++) - component_sent[ci] = false; - } - - for (int scanno = 1; scanno <= m_num_scans; scanno++) - { - JpegScanInfo scanInfo = m_scan_info[scanno - 1]; - - int ncomps = scanInfo.comps_in_scan; - if (ncomps <= 0 || ncomps > JpegConstants.MaxComponentsInScan) - throw new Exception(String.Format("Too many color components: {0}, max {1}", ncomps, JpegConstants.MaxComponentsInScan)); - - for (int ci = 0; ci < ncomps; ci++) - { - int thisi = scanInfo.component_index[ci]; - if (thisi < 0 || thisi >= m_num_components) - throw new Exception(String.Format("Invalid scan script at entry {0}", scanno)); - - if (ci > 0 && thisi <= scanInfo.component_index[ci - 1]) - throw new Exception(String.Format("Invalid scan script at entry {0}", scanno)); - } - - int Ss = scanInfo.Ss; - int Se = scanInfo.Se; - int Ah = scanInfo.Ah; - int Al = scanInfo.Al; - if (m_progressive_mode) - { - const int MAX_AH_AL = 10; - if (Ss < 0 || Ss >= JpegConstants.DCTSize2 || Se < Ss || Se >= JpegConstants.DCTSize2 || - Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) - { - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - } - - if (Ss == 0) - { - if (Se != 0) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - } - else - { - if (ncomps != 1) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - } - - for (int ci = 0; ci < ncomps; ci++) - { - int lastBitComponentIndex = scanInfo.component_index[ci]; - if (Ss != 0 && last_bitpos[lastBitComponentIndex][0] < 0) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - - for (int coefi = Ss; coefi <= Se; coefi++) - { - if (last_bitpos[lastBitComponentIndex][coefi] < 0) - { - if (Ah != 0) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - } - else - { - if (Ah != last_bitpos[lastBitComponentIndex][coefi] || Al != Ah - 1) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - } - - last_bitpos[lastBitComponentIndex][coefi] = Al; - } - } - } - else - { - if (Ss != 0 || Se != JpegConstants.DCTSize2 - 1 || Ah != 0 || Al != 0) - throw new Exception(String.Format("Invalid progressive parameters at scan script entry {0}", scanno)); - - for (int ci = 0; ci < ncomps; ci++) - { - int thisi = scanInfo.component_index[ci]; - if (component_sent[thisi]) - throw new Exception(String.Format("Invalid scan script at entry {0}", scanno)); - - component_sent[thisi] = true; - } - } - } - - if (m_progressive_mode) - { - for (int ci = 0; ci < m_num_components; ci++) - { - if (last_bitpos[ci][0] < 0) - throw new Exception("Scan script does not transmit all data"); - } - } - else - { - for (int ci = 0; ci < m_num_components; ci++) - { - if (!component_sent[ci]) - throw new Exception("Scan script does not transmit all data"); - } - } - } - private void std_huff_tables() - { - add_huff_table(ref m_dc_huff_tbl_ptrs[0], bits_dc_luminance, val_dc_luminance); - add_huff_table(ref m_ac_huff_tbl_ptrs[0], bits_ac_luminance, val_ac_luminance); - add_huff_table(ref m_dc_huff_tbl_ptrs[1], bits_dc_chrominance, val_dc_chrominance); - add_huff_table(ref m_ac_huff_tbl_ptrs[1], bits_ac_chrominance, val_ac_chrominance); - } - private void add_huff_table(ref JpegHuffmanTable htblptr, byte[] bits, byte[] val) - { - if (htblptr == null) - htblptr = new JpegHuffmanTable(); - Buffer.BlockCopy(bits, 0, htblptr.Bits, 0, htblptr.Bits.Length); - int nsymbols = 0; - for (int len = 1; len <= 16; len++) - nsymbols += bits[len]; - - if (nsymbols < 1 || nsymbols > 256) - throw new Exception("Bogus Huffman table definition"); - - Buffer.BlockCopy(val, 0, htblptr.Huffval, 0, nsymbols); - htblptr.Sent_table = false; - } - private void fill_a_scan(ref int scanIndex, int ci, int Ss, int Se, int Ah, int Al) - { - m_script_space[scanIndex].comps_in_scan = 1; - m_script_space[scanIndex].component_index[0] = ci; - m_script_space[scanIndex].Ss = Ss; - m_script_space[scanIndex].Se = Se; - m_script_space[scanIndex].Ah = Ah; - m_script_space[scanIndex].Al = Al; - scanIndex++; - } - private void fill_dc_scans(ref int scanIndex, int ncomps, int Ah, int Al) - { - if (ncomps <= JpegConstants.MaxComponentsInScan) - { - m_script_space[scanIndex].comps_in_scan = ncomps; - for (int ci = 0; ci < ncomps; ci++) - m_script_space[scanIndex].component_index[ci] = ci; - - m_script_space[scanIndex].Ss = 0; - m_script_space[scanIndex].Se = 0; - m_script_space[scanIndex].Ah = Ah; - m_script_space[scanIndex].Al = Al; - scanIndex++; - } - else - { - fill_scans(ref scanIndex, ncomps, 0, 0, Ah, Al); - } - } - private void fill_scans(ref int scanIndex, int ncomps, int Ss, int Se, int Ah, int Al) - { - for (int ci = 0; ci < ncomps; ci++) - { - m_script_space[scanIndex].comps_in_scan = 1; - m_script_space[scanIndex].component_index[0] = ci; - m_script_space[scanIndex].Ss = Ss; - m_script_space[scanIndex].Se = Se; - m_script_space[scanIndex].Ah = Ah; - m_script_space[scanIndex].Al = Al; - scanIndex++; - } - } - - private void jpeg_set_colorspace_SET_COMP(int index, int id, int hsamp, int vsamp, int quant, int dctbl, int actbl) - { - m_comp_info[index].Component_id = id; - m_comp_info[index].H_samp_factor = hsamp; - m_comp_info[index].V_samp_factor = vsamp; - m_comp_info[index].Quant_tbl_no = quant; - m_comp_info[index].Dc_tbl_no = dctbl; - m_comp_info[index].Ac_tbl_no = actbl; - } - } - #endregion - - - - // STOPPED REMOVING COMMENTS HERE. - - - - #region JpegCompressorCoefController - /// - /// Coefficient buffer control - /// - interface JpegCompressorCoefController - { - void start_pass(BufferMode pass_mode); - bool compress_data(byte[][][] input_buf); - } - #endregion - - #region JpegCompressorMainController - /// - /// Main buffer control (downsampled-data buffer) - /// - class JpegCompressorMainController - { - private JpegCompressor m_cinfo; - - private int m_cur_iMCU_row; /* number of current iMCU row */ - private int m_rowgroup_ctr; /* counts row groups received in iMCU row */ - private bool m_suspended; /* remember if we suspended output */ - - /* If using just a strip buffer, this points to the entire set of buffers - * (we allocate one for each component). In the full-image case, this - * points to the currently accessible strips of the virtual arrays. - */ - private byte[][][] m_buffer = new byte[JpegConstants.MaxComponents][][]; - - public JpegCompressorMainController(JpegCompressor cinfo) - { - m_cinfo = cinfo; - - /* Allocate a strip buffer for each component */ - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - m_buffer[ci] = JpegCommonBase.AllocJpegSamples( - cinfo.Component_info[ci].Width_in_blocks * JpegConstants.DCTSize, - cinfo.Component_info[ci].V_samp_factor * JpegConstants.DCTSize); - } - } - - // Initialize for a processing pass. - public void start_pass(BufferMode pass_mode) - { - /* Do nothing in raw-data mode. */ - if (m_cinfo.m_raw_data_in) - return; - - m_cur_iMCU_row = 0; /* initialize counters */ - m_rowgroup_ctr = 0; - m_suspended = false; - - if (pass_mode != BufferMode.PassThru) - throw new Exception("Bogus buffer control mode!"); - } - - /// - /// Process some data. - /// This routine handles the simple pass-through mode, - /// where we have only a strip buffer. - /// - public void process_data(byte[][] input_buf, ref int in_row_ctr, int in_rows_avail) - { - while (m_cur_iMCU_row < m_cinfo.m_total_iMCU_rows) - { - /* Read input data if we haven't filled the main buffer yet */ - if (m_rowgroup_ctr < JpegConstants.DCTSize) - m_cinfo.m_prep.pre_process_data(input_buf, ref in_row_ctr, in_rows_avail, m_buffer, ref m_rowgroup_ctr, JpegConstants.DCTSize); - - /* If we don't have a full iMCU row buffered, return to application for - * more data. Note that preprocessor will always pad to fill the iMCU row - * at the bottom of the image. - */ - if (m_rowgroup_ctr != JpegConstants.DCTSize) - return; - - /* Send the completed row to the compressor */ - if (!m_cinfo.m_coef.compress_data(m_buffer)) - { - /* If compressor did not consume the whole row, then we must need to - * suspend processing and return to the application. In this situation - * we pretend we didn't yet consume the last input row; otherwise, if - * it happened to be the last row of the image, the application would - * think we were done. - */ - if (!m_suspended) - { - in_row_ctr--; - m_suspended = true; - } - - return; - } - - /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main buffer empty. - */ - if (m_suspended) - { - in_row_ctr++; - m_suspended = false; - } - - m_rowgroup_ctr = 0; - m_cur_iMCU_row++; - } - } - } - #endregion - - #region JpegCompressorMaster - /// - /// Master control module - /// - class JpegCompressorMaster - { - private enum c_pass_type - { - main_pass, /* input data, also do first output step */ - huff_opt_pass, /* Huffman code optimization pass */ - output_pass /* data output pass */ - } - - private JpegCompressor m_cinfo; - - private bool m_call_pass_startup; /* True if pass_startup must be called */ - private bool m_is_last_pass; /* True during last pass */ - - private c_pass_type m_pass_type; /* the type of the current pass */ - - private int m_pass_number; /* # of passes completed */ - private int m_total_passes; /* total # of passes needed */ - - private int m_scan_number; /* current index in scan_info[] */ - - public JpegCompressorMaster(JpegCompressor cinfo, bool transcode_only) - { - m_cinfo = cinfo; - - if (transcode_only) - { - /* no main pass in transcoding */ - if (cinfo.m_optimize_coding) - m_pass_type = c_pass_type.huff_opt_pass; - else - m_pass_type = c_pass_type.output_pass; - } - else - { - /* for normal compression, first pass is always this type: */ - m_pass_type = c_pass_type.main_pass; - } - - if (cinfo.m_optimize_coding) - m_total_passes = cinfo.m_num_scans * 2; - else - m_total_passes = cinfo.m_num_scans; - } - - /// - /// Per-pass setup. - /// - /// This is called at the beginning of each pass. We determine which - /// modules will be active during this pass and give them appropriate - /// start_pass calls. - /// We also set is_last_pass to indicate whether any more passes will - /// be required. - /// - public void prepare_for_pass() - { - switch (m_pass_type) - { - case c_pass_type.main_pass: - prepare_for_main_pass(); - break; - case c_pass_type.huff_opt_pass: - if (!prepare_for_huff_opt_pass()) - break; - prepare_for_output_pass(); - break; - case c_pass_type.output_pass: - prepare_for_output_pass(); - break; - } - - m_is_last_pass = (m_pass_number == m_total_passes - 1); - } - - /// - /// Special start-of-pass hook. - /// - /// This is called by jpeg_write_scanlines if call_pass_startup is true. - /// In single-pass processing, we need this hook because we don't want to - /// write frame/scan headers during jpeg_start_compress; we want to let the - /// application write COM markers etc. between jpeg_start_compress and the - /// jpeg_write_scanlines loop. - /// In multi-pass processing, this routine is not used. - /// - public void pass_startup() - { - m_cinfo.m_master.m_call_pass_startup = false; /* reset flag so call only once */ - - m_cinfo.m_marker.write_frame_header(); - m_cinfo.m_marker.write_scan_header(); - } - - /// - /// Finish up at end of pass. - /// - public void finish_pass() - { - /* The entropy coder always needs an end-of-pass call, - * either to analyze statistics or to flush its output buffer. - */ - m_cinfo.m_entropy.finish_pass(); - - /* Update state for next pass */ - switch (m_pass_type) - { - case c_pass_type.main_pass: - /* next pass is either output of scan 0 (after optimization) - * or output of scan 1 (if no optimization). - */ - m_pass_type = c_pass_type.output_pass; - if (!m_cinfo.m_optimize_coding) - m_scan_number++; - break; - case c_pass_type.huff_opt_pass: - /* next pass is always output of current scan */ - m_pass_type = c_pass_type.output_pass; - break; - case c_pass_type.output_pass: - /* next pass is either optimization or output of next scan */ - if (m_cinfo.m_optimize_coding) - m_pass_type = c_pass_type.huff_opt_pass; - m_scan_number++; - break; - } - - m_pass_number++; - } - - public bool IsLastPass() - { - return m_is_last_pass; - } - - public bool MustCallPassStartup() - { - return m_call_pass_startup; - } - - private void prepare_for_main_pass() - { - /* Initial pass: will collect input data, and do either Huffman - * optimization or data output for the first scan. - */ - select_scan_parameters(); - per_scan_setup(); - - if (!m_cinfo.m_raw_data_in) - { - m_cinfo.m_cconvert.start_pass(); - m_cinfo.m_prep.start_pass(BufferMode.PassThru); - } - - m_cinfo.m_fdct.start_pass(); - m_cinfo.m_entropy.start_pass(m_cinfo.m_optimize_coding); - m_cinfo.m_coef.start_pass((m_total_passes > 1 ? BufferMode.SaveAndPass : BufferMode.PassThru)); - m_cinfo.m_main.start_pass(BufferMode.PassThru); - - if (m_cinfo.m_optimize_coding) - { - /* No immediate data output; postpone writing frame/scan headers */ - m_call_pass_startup = false; - } - else - { - /* Will write frame/scan headers at first jpeg_write_scanlines call */ - m_call_pass_startup = true; - } - } - - private bool prepare_for_huff_opt_pass() - { - /* Do Huffman optimization for a scan after the first one. */ - select_scan_parameters(); - per_scan_setup(); - - if (m_cinfo.m_Ss != 0 || m_cinfo.m_Ah == 0) - { - m_cinfo.m_entropy.start_pass(true); - m_cinfo.m_coef.start_pass(BufferMode.CrankDest); - m_call_pass_startup = false; - return false; - } - - /* Special case: Huffman DC refinement scans need no Huffman table - * and therefore we can skip the optimization pass for them. - */ - m_pass_type = c_pass_type.output_pass; - m_pass_number++; - return true; - } - - private void prepare_for_output_pass() - { - /* Do a data-output pass. */ - /* We need not repeat per-scan setup if prior optimization pass did it. */ - if (!m_cinfo.m_optimize_coding) - { - select_scan_parameters(); - per_scan_setup(); - } - - m_cinfo.m_entropy.start_pass(false); - m_cinfo.m_coef.start_pass(BufferMode.CrankDest); - - /* We emit frame/scan headers now */ - if (m_scan_number == 0) - m_cinfo.m_marker.write_frame_header(); - - m_cinfo.m_marker.write_scan_header(); - m_call_pass_startup = false; - } - - // Set up the scan parameters for the current scan - private void select_scan_parameters() - { - if (m_cinfo.m_scan_info != null) - { - /* Prepare for current scan --- the script is already validated */ - JpegScanInfo scanInfo = m_cinfo.m_scan_info[m_scan_number]; - - m_cinfo.m_comps_in_scan = scanInfo.comps_in_scan; - for (int ci = 0; ci < scanInfo.comps_in_scan; ci++) - m_cinfo.m_cur_comp_info[ci] = scanInfo.component_index[ci]; - - m_cinfo.m_Ss = scanInfo.Ss; - m_cinfo.m_Se = scanInfo.Se; - m_cinfo.m_Ah = scanInfo.Ah; - m_cinfo.m_Al = scanInfo.Al; - } - else - { - /* Prepare for single sequential-JPEG scan containing all components */ - if (m_cinfo.m_num_components > JpegConstants.MaxComponentsInScan) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_cinfo.m_num_components, JpegConstants.MaxComponentsInScan)); - - m_cinfo.m_comps_in_scan = m_cinfo.m_num_components; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - m_cinfo.m_cur_comp_info[ci] = ci; - - m_cinfo.m_Ss = 0; - m_cinfo.m_Se = JpegConstants.DCTSize2 - 1; - m_cinfo.m_Ah = 0; - m_cinfo.m_Al = 0; - } - } - - /// - /// Do computations that are needed before processing a JPEG scan - /// cinfo.comps_in_scan and cinfo.cur_comp_info[] are already set - /// - private void per_scan_setup() - { - if (m_cinfo.m_comps_in_scan == 1) - { - /* Non-interleaved (single-component) scan */ - int compIndex = m_cinfo.m_cur_comp_info[0]; - - /* Overall image size in MCUs */ - m_cinfo.m_MCUs_per_row = m_cinfo.Component_info[compIndex].Width_in_blocks; - m_cinfo.m_MCU_rows_in_scan = m_cinfo.Component_info[compIndex].height_in_blocks; - - /* For non-interleaved scan, always one block per MCU */ - m_cinfo.Component_info[compIndex].MCU_width = 1; - m_cinfo.Component_info[compIndex].MCU_height = 1; - m_cinfo.Component_info[compIndex].MCU_blocks = 1; - m_cinfo.Component_info[compIndex].MCU_sample_width = JpegConstants.DCTSize; - m_cinfo.Component_info[compIndex].last_col_width = 1; - - /* For non-interleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - int tmp = m_cinfo.Component_info[compIndex].height_in_blocks % m_cinfo.Component_info[compIndex].V_samp_factor; - if (tmp == 0) - tmp = m_cinfo.Component_info[compIndex].V_samp_factor; - m_cinfo.Component_info[compIndex].last_row_height = tmp; - - /* Prepare array describing MCU composition */ - m_cinfo.m_blocks_in_MCU = 1; - m_cinfo.m_MCU_membership[0] = 0; - } - else - { - /* Interleaved (multi-component) scan */ - if (m_cinfo.m_comps_in_scan <= 0 || m_cinfo.m_comps_in_scan > JpegConstants.MaxComponentsInScan) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_cinfo.m_comps_in_scan, JpegConstants.MaxComponentsInScan)); - - /* Overall image size in MCUs */ - m_cinfo.m_MCUs_per_row = JpegUtils.jdiv_round_up( - m_cinfo.m_image_width, m_cinfo.m_max_h_samp_factor * JpegConstants.DCTSize); - - m_cinfo.m_MCU_rows_in_scan = JpegUtils.jdiv_round_up(m_cinfo.m_image_height, - m_cinfo.m_max_v_samp_factor * JpegConstants.DCTSize); - - m_cinfo.m_blocks_in_MCU = 0; - - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - int compIndex = m_cinfo.m_cur_comp_info[ci]; - - /* Sampling factors give # of blocks of component in each MCU */ - m_cinfo.Component_info[compIndex].MCU_width = m_cinfo.Component_info[compIndex].H_samp_factor; - m_cinfo.Component_info[compIndex].MCU_height = m_cinfo.Component_info[compIndex].V_samp_factor; - m_cinfo.Component_info[compIndex].MCU_blocks = m_cinfo.Component_info[compIndex].MCU_width * m_cinfo.Component_info[compIndex].MCU_height; - m_cinfo.Component_info[compIndex].MCU_sample_width = m_cinfo.Component_info[compIndex].MCU_width * JpegConstants.DCTSize; - - /* Figure number of non-dummy blocks in last MCU column & row */ - int tmp = m_cinfo.Component_info[compIndex].Width_in_blocks % m_cinfo.Component_info[compIndex].MCU_width; - if (tmp == 0) - tmp = m_cinfo.Component_info[compIndex].MCU_width; - m_cinfo.Component_info[compIndex].last_col_width = tmp; - - tmp = m_cinfo.Component_info[compIndex].height_in_blocks % m_cinfo.Component_info[compIndex].MCU_height; - if (tmp == 0) - tmp = m_cinfo.Component_info[compIndex].MCU_height; - m_cinfo.Component_info[compIndex].last_row_height = tmp; - - /* Prepare array describing MCU composition */ - int mcublks = m_cinfo.Component_info[compIndex].MCU_blocks; - if (m_cinfo.m_blocks_in_MCU + mcublks > JpegConstants.CompressorMaxBlocksInMCU) - throw new Exception("Sampling factors too large for interleaved scan"); - - while (mcublks-- > 0) - m_cinfo.m_MCU_membership[m_cinfo.m_blocks_in_MCU++] = ci; - } - } - - /* Convert restart specified in rows to actual MCU count. */ - /* Note that count must fit in 16 bits, so we provide limiting. */ - if (m_cinfo.m_restart_in_rows > 0) - { - int nominal = m_cinfo.m_restart_in_rows * m_cinfo.m_MCUs_per_row; - m_cinfo.m_restart_interval = Math.Min(nominal, 65535); - } - } - } - #endregion - - #region JpegCompressorPrepController - /// - /// Compression preprocessing (downsampling input buffer control). - /// - /// For the simple (no-context-row) case, we just need to buffer one - /// row group's worth of pixels for the downsampling step. At the bottom of - /// the image, we pad to a full row group by replicating the last pixel row. - /// The downsampler's last output row is then replicated if needed to pad - /// out to a full iMCU row. - /// - /// When providing context rows, we must buffer three row groups' worth of - /// pixels. Three row groups are physically allocated, but the row pointer - /// arrays are made five row groups high, with the extra pointers above and - /// below "wrapping around" to point to the last and first real row groups. - /// This allows the downsampler to access the proper context rows. - /// At the top and bottom of the image, we create dummy context rows by - /// copying the first or last real pixel row. This copying could be avoided - /// by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the - /// trouble on the compression side. - /// - class JpegCompressorPrepController - { - private JpegCompressor m_cinfo; - - /* Downsampling input buffer. This buffer holds color-converted data - * until we have enough to do a downsample step. - */ - private byte[][][] m_color_buf = new byte[JpegConstants.MaxComponents][][]; - private int m_colorBufRowsOffset; - - private int m_rows_to_go; /* counts rows remaining in source image */ - private int m_next_buf_row; /* index of next row to store in color_buf */ - - private int m_this_row_group; /* starting row index of group to process */ - private int m_next_buf_stop; /* downsample when we reach this index */ - - public JpegCompressorPrepController(JpegCompressor cinfo) - { - m_cinfo = cinfo; - - /* Allocate the color conversion buffer. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - if (cinfo.m_downsample.NeedContextRows()) - { - /* Set up to provide context rows */ - create_context_buffer(); - } - else - { - /* No context, just make it tall enough for one row group */ - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - m_colorBufRowsOffset = 0; - m_color_buf[ci] = JpegCompressor.AllocJpegSamples( - (cinfo.Component_info[ci].Width_in_blocks * JpegConstants.DCTSize * cinfo.m_max_h_samp_factor) / cinfo.Component_info[ci].H_samp_factor, - cinfo.m_max_v_samp_factor); - } - } - } - - /// - /// Initialize for a processing pass. - /// - public void start_pass(BufferMode pass_mode) - { - if (pass_mode != BufferMode.PassThru) - throw new Exception("Bogus buffer control mode!"); - - /* Initialize total-height counter for detecting bottom of image */ - m_rows_to_go = m_cinfo.m_image_height; - - /* Mark the conversion buffer empty */ - m_next_buf_row = 0; - - /* Preset additional state variables for context mode. - * These aren't used in non-context mode, so we needn't test which mode. - */ - m_this_row_group = 0; - - /* Set next_buf_stop to stop after two row groups have been read in. */ - m_next_buf_stop = 2 * m_cinfo.m_max_v_samp_factor; - } - - public void pre_process_data(byte[][] input_buf, ref int in_row_ctr, int in_rows_avail, byte[][][] output_buf, ref int out_row_group_ctr, int out_row_groups_avail) - { - if (m_cinfo.m_downsample.NeedContextRows()) - pre_process_context(input_buf, ref in_row_ctr, in_rows_avail, output_buf, ref out_row_group_ctr, out_row_groups_avail); - else - pre_process_WithoutContext(input_buf, ref in_row_ctr, in_rows_avail, output_buf, ref out_row_group_ctr, out_row_groups_avail); - } - - /// - /// Create the wrapped-around downsampling input buffer needed for context mode. - /// - private void create_context_buffer() - { - int rgroup_height = m_cinfo.m_max_v_samp_factor; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - int samplesPerRow = (m_cinfo.Component_info[ci].Width_in_blocks * JpegConstants.DCTSize * m_cinfo.m_max_h_samp_factor) / m_cinfo.Component_info[ci].H_samp_factor; - - byte[][] fake_buffer = new byte[5 * rgroup_height][]; - for (int i = 1; i < 4 * rgroup_height; i++) - fake_buffer[i] = new byte[samplesPerRow]; - - /* Allocate the actual buffer space (3 row groups) for this component. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - byte[][] true_buffer = JpegCommonBase.AllocJpegSamples(samplesPerRow, 3 * rgroup_height); - - /* Copy true buffer row pointers into the middle of the fake row array */ - for (int i = 0; i < 3 * rgroup_height; i++) - fake_buffer[rgroup_height + i] = true_buffer[i]; - - /* Fill in the above and below wraparound pointers */ - for (int i = 0; i < rgroup_height; i++) - { - fake_buffer[i] = true_buffer[2 * rgroup_height + i]; - fake_buffer[4 * rgroup_height + i] = true_buffer[i]; - } - - m_color_buf[ci] = fake_buffer; - m_colorBufRowsOffset = rgroup_height; - } - } - - /// - /// Process some data in the simple no-context case. - /// - /// Preprocessor output data is counted in "row groups". A row group - /// is defined to be v_samp_factor sample rows of each component. - /// Downsampling will produce this much data from each max_v_samp_factor - /// input rows. - /// - private void pre_process_WithoutContext(byte[][] input_buf, ref int in_row_ctr, int in_rows_avail, byte[][][] output_buf, ref int out_row_group_ctr, int out_row_groups_avail) - { - while (in_row_ctr < in_rows_avail && out_row_group_ctr < out_row_groups_avail) - { - /* Do color conversion to fill the conversion buffer. */ - int inrows = in_rows_avail - in_row_ctr; - int numrows = m_cinfo.m_max_v_samp_factor - m_next_buf_row; - numrows = Math.Min(numrows, inrows); - m_cinfo.m_cconvert.color_convert(input_buf, in_row_ctr, m_color_buf, m_colorBufRowsOffset + m_next_buf_row, numrows); - in_row_ctr += numrows; - m_next_buf_row += numrows; - m_rows_to_go -= numrows; - - /* If at bottom of image, pad to fill the conversion buffer. */ - if (m_rows_to_go == 0 && m_next_buf_row < m_cinfo.m_max_v_samp_factor) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - expand_bottom_edge(m_color_buf[ci], m_colorBufRowsOffset, m_cinfo.m_image_width, m_next_buf_row, m_cinfo.m_max_v_samp_factor); - - m_next_buf_row = m_cinfo.m_max_v_samp_factor; - } - - /* If we've filled the conversion buffer, empty it. */ - if (m_next_buf_row == m_cinfo.m_max_v_samp_factor) - { - m_cinfo.m_downsample.downsample(m_color_buf, m_colorBufRowsOffset, output_buf, out_row_group_ctr); - m_next_buf_row = 0; - out_row_group_ctr++; - } - - /* If at bottom of image, pad the output to a full iMCU height. - * Note we assume the caller is providing a one-iMCU-height output buffer! - */ - if (m_rows_to_go == 0 && out_row_group_ctr < out_row_groups_avail) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[ci]; - expand_bottom_edge(output_buf[ci], 0, componentInfo.Width_in_blocks * JpegConstants.DCTSize, - out_row_group_ctr * componentInfo.V_samp_factor, - out_row_groups_avail * componentInfo.V_samp_factor); - } - - out_row_group_ctr = out_row_groups_avail; - break; /* can exit outer loop without test */ - } - } - } - - /// - /// Process some data in the context case. - /// - private void pre_process_context(byte[][] input_buf, ref int in_row_ctr, int in_rows_avail, byte[][][] output_buf, ref int out_row_group_ctr, int out_row_groups_avail) - { - while (out_row_group_ctr < out_row_groups_avail) - { - if (in_row_ctr < in_rows_avail) - { - /* Do color conversion to fill the conversion buffer. */ - int inrows = in_rows_avail - in_row_ctr; - int numrows = m_next_buf_stop - m_next_buf_row; - numrows = Math.Min(numrows, inrows); - m_cinfo.m_cconvert.color_convert(input_buf, in_row_ctr, m_color_buf, m_colorBufRowsOffset + m_next_buf_row, numrows); - - /* Pad at top of image, if first time through */ - if (m_rows_to_go == m_cinfo.m_image_height) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - for (int row = 1; row <= m_cinfo.m_max_v_samp_factor; row++) - JpegUtils.jcopy_sample_rows(m_color_buf[ci], m_colorBufRowsOffset, m_color_buf[ci], m_colorBufRowsOffset - row, 1, m_cinfo.m_image_width); - } - } - - in_row_ctr += numrows; - m_next_buf_row += numrows; - m_rows_to_go -= numrows; - } - else - { - /* Return for more data, unless we are at the bottom of the image. */ - if (m_rows_to_go != 0) - break; - - /* When at bottom of image, pad to fill the conversion buffer. */ - if (m_next_buf_row < m_next_buf_stop) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - expand_bottom_edge(m_color_buf[ci], m_colorBufRowsOffset, m_cinfo.m_image_width, m_next_buf_row, m_next_buf_stop); - - m_next_buf_row = m_next_buf_stop; - } - } - - /* If we've gotten enough data, downsample a row group. */ - if (m_next_buf_row == m_next_buf_stop) - { - m_cinfo.m_downsample.downsample(m_color_buf, m_colorBufRowsOffset + m_this_row_group, output_buf, out_row_group_ctr); - out_row_group_ctr++; - - /* Advance pointers with wraparound as necessary. */ - m_this_row_group += m_cinfo.m_max_v_samp_factor; - int buf_height = m_cinfo.m_max_v_samp_factor * 3; - - if (m_this_row_group >= buf_height) - m_this_row_group = 0; - - if (m_next_buf_row >= buf_height) - m_next_buf_row = 0; - - m_next_buf_stop = m_next_buf_row + m_cinfo.m_max_v_samp_factor; - } - } - } - - /// - /// Expand an image vertically from height input_rows to height output_rows, - /// by duplicating the bottom row. - /// - private static void expand_bottom_edge(byte[][] image_data, int rowsOffset, int num_cols, int input_rows, int output_rows) - { - for (int row = input_rows; row < output_rows; row++) - JpegUtils.jcopy_sample_rows(image_data, rowsOffset + input_rows - 1, image_data, row, 1, num_cols); - } - } - #endregion - - #region JpegDecompressor - /// - /// JPEG decompression routine. - /// - /// - public class JpegDecompressor : JpegCommonBase - { - /// - /// The delegate for application-supplied marker processing methods. - /// - /// Decompressor. - /// Return true to indicate success. false should be returned only - /// if you are using a suspending data source and it tells you to suspend. - /// - /// Although the marker code is not explicitly passed, the routine can find it - /// in the . At the time of call, - /// the marker proper has been read from the data source module. The processor routine - /// is responsible for reading the marker length word and the remaining parameter bytes, if any. - /// - public delegate bool jpeg_marker_parser_method(JpegDecompressor cinfo); - - /* Source of compressed data */ - internal Jpeg_Source m_src; - - internal int m_image_width; /* nominal image width (from SOF marker) */ - internal int m_image_height; /* nominal image height */ - internal int m_num_components; /* # of color components in JPEG image */ - internal ColorSpace m_jpeg_color_space; /* colorspace of JPEG image */ - - internal ColorSpace m_out_color_space; /* colorspace for output */ - internal int m_scale_num; - internal int m_scale_denom; /* fraction by which to scale image */ - internal bool m_buffered_image; /* true=multiple output passes */ - internal bool m_raw_data_out; /* true=downsampled data wanted */ - internal DCTMethod m_dct_method; /* IDCT algorithm selector */ - internal bool m_do_fancy_upsampling; /* true=apply fancy up-sampling */ - internal bool m_do_block_smoothing; /* true=apply inter-block smoothing */ - internal bool m_quantize_colors; /* true=colormapped output wanted */ - internal DitherMode m_dither_mode; /* type of color dithering to use */ - internal bool m_two_pass_quantize; /* true=use two-pass color quantization */ - internal int m_desired_number_of_colors; /* max # colors to use in created colormap */ - internal bool m_enable_1pass_quant; /* enable future use of 1-pass quantizer */ - internal bool m_enable_external_quant;/* enable future use of external colormap */ - internal bool m_enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - internal int m_output_width; /* scaled image width */ - internal int m_output_height; /* scaled image height */ - internal int m_out_color_components; /* # of color components in out_color_space */ - /* # of color components returned - * output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - internal int m_output_components; - - internal int m_rec_outbuf_height; /* min recommended height of scanline buffer */ - - internal int m_actual_number_of_colors; /* number of entries in use */ - internal byte[][] m_colormap; /* The color map as a 2-D pixel array */ - - internal int m_output_scanline; /* 0 .. output_height-1 */ - - internal int m_input_scan_number; /* Number of SOS markers seen so far */ - internal int m_input_iMCU_row; /* Number of iMCU rows completed */ - - internal int m_output_scan_number; /* Nominal scan number being displayed */ - internal int m_output_iMCU_row; /* Number of iMCU rows read */ - - internal int[][] m_coef_bits; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * data-streams when processing abbreviated JPEG data-streams. - */ - - internal JpegQuantizationTable[] m_quant_tbl_ptrs = new JpegQuantizationTable[JpegConstants.NumberOfQuantTables]; - /* ptrs to coefficient quantization tables, or null if not defined */ - - internal JpegHuffmanTable[] m_dc_huff_tbl_ptrs = new JpegHuffmanTable[JpegConstants.NumberOfHuffmanTables]; - internal JpegHuffmanTable[] m_ac_huff_tbl_ptrs = new JpegHuffmanTable[JpegConstants.NumberOfHuffmanTables]; - /* ptrs to Huffman coding tables, or null if not defined */ - - /* These parameters are never carried across data-streams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - internal int m_data_precision; /* bits of precision in image data */ - - /* m_comp_info[i] describes component that appears i'th in SOF */ - private JpegComponent[] m_comp_info; - - internal bool m_progressive_mode; /* true if SOFn specifies progressive mode */ - - internal int m_restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - internal bool m_saw_JFIF_marker; /* true iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is true: */ - internal byte m_JFIF_major_version; /* JFIF version number */ - internal byte m_JFIF_minor_version; - - internal DensityUnit m_density_unit; /* JFIF code for pixel size units */ - internal short m_X_density; /* Horizontal pixel density */ - internal short m_Y_density; /* Vertical pixel density */ - - internal bool m_saw_Adobe_marker; /* true iff an Adobe APP14 marker was found */ - internal byte m_Adobe_transform; /* Color transform code from Adobe marker */ - - internal bool m_CCIR601_sampling; /* true=first samples are co-sited */ - - internal List m_marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - internal int m_max_h_samp_factor; /* largest h_samp_factor */ - internal int m_max_v_samp_factor; /* largest v_samp_factor */ - - internal int m_min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ - - internal int m_total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. - */ - - internal byte[] m_sample_range_limit; /* table for fast range-limiting */ - internal int m_sampleRangeLimitOffset; - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - internal int m_comps_in_scan; /* # of JPEG components in this scan */ - internal int[] m_cur_comp_info = new int[JpegConstants.MaxComponentsInScan]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - internal int m_MCUs_per_row; /* # of MCUs across the image */ - internal int m_MCU_rows_in_scan; /* # of MCU rows in the image */ - - internal int m_blocks_in_MCU; /* # of DCT blocks per MCU */ - internal int[] m_MCU_membership = new int[JpegConstants.DecompressorMaxBlocksInMCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - /* progressive JPEG parameters for scan */ - internal int m_Ss; - internal int m_Se; - internal int m_Ah; - internal int m_Al; - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - internal int m_unread_marker; - - /* - * Links to decompression sub-objects (methods, private variables of modules) - */ - internal JpegDecompressorMaster m_master; - internal JpegDecompressorMainController m_main; - internal JpegDecompressorCoefController m_coef; - internal JpegDecompressorPostController m_post; - internal JpegInputController m_inputctl; - internal JpegMarkerReader m_marker; - internal JpegEntropyDecoder m_entropy; - internal JpegInverseDCT m_idct; - internal JpegUpsampler m_upsample; - internal ColorDeconverter m_cconvert; - internal ColorQuantizer m_cquantize; - - /// - /// Initializes a new instance of the class. - /// - /// - public JpegDecompressor() - : base() - { - initialize(); - } - - /// - /// Retrieves true because this is a decompressor. - /// - /// true - public override bool IsDecompressor - { - get { return true; } - } - - /// - /// Gets or sets the source for decompression. - /// - /// The source for decompression. - public LibJpeg.Jpeg_Source Src - { - get { return m_src; } - set { m_src = value; } - } - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - /// - /// Gets the width of image, set by - /// - /// The width of image. - /// Decompression parameter selection - public int Image_width - { - get { return m_image_width; } - } - - /// - /// Gets the height of image, set by - /// - /// The height of image. - /// Decompression parameter selection - public int Image_height - { - get { return m_image_height; } - } - - /// - /// Gets the number of color components in JPEG image. - /// - /// The number of color components. - /// Decompression parameter selection - public int Num_components - { - get { return m_num_components; } - } - - /// - /// Gets or sets the colorspace of JPEG image. - /// - /// The colorspace of JPEG image. - /// Decompression parameter selection - public LibJpeg.ColorSpace Jpeg_color_space - { - get { return m_jpeg_color_space; } - set { m_jpeg_color_space = value; } - } - - /// - /// Gets the list of loaded special markers. - /// - /// All the special markers in the file appear in this list, in order of - /// their occurrence in the file (but omitting any markers of types you didn't ask for) - /// - /// The list of loaded special markers. - /// Special markers - public ReadOnlyCollection Marker_list - { - get - { - return m_marker_list.AsReadOnly(); - } - } - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - /// - /// Gets or sets the output color space. - /// - /// The output color space. - /// Decompression parameter selection - public LibJpeg.ColorSpace Out_color_space - { - get { return m_out_color_space; } - set { m_out_color_space = value; } - } - - /// - /// Gets or sets the numerator of the fraction of image scaling. - /// - /// Scale the image by the fraction Scale_num/Scale_denom. - /// Default is 1/1, or no scaling. Currently, the only supported scaling ratios are 1/1, 1/2, 1/4, and 1/8. - /// (The library design allows for arbitrary scaling ratios but this is not likely to be implemented any time soon.) - /// - /// Smaller scaling ratios permit significantly faster decoding since fewer pixels - /// need to be processed and a simpler DCT method can be used. - /// - /// Decompression parameter selection - public int Scale_num - { - get { return m_scale_num; } - set { m_scale_num = value; } - } - - /// - /// Gets or sets the denominator of the fraction of image scaling. - /// - /// Scale the image by the fraction Scale_num/Scale_denom. - /// Default is 1/1, or no scaling. Currently, the only supported scaling ratios are 1/1, 1/2, 1/4, and 1/8. - /// (The library design allows for arbitrary scaling ratios but this is not likely to be implemented any time soon.) - /// - /// Smaller scaling ratios permit significantly faster decoding since fewer pixels - /// need to be processed and a simpler DCT method can be used. - /// - /// Decompression parameter selection - public int Scale_denom - { - get { return m_scale_denom; } - set { m_scale_denom = value; } - } - - /// - /// Gets or sets a value indicating whether to use buffered-image mode. - /// - /// true if buffered-image mode is turned on; otherwise, false. - /// Buffered-image mode - public bool Buffered_image - { - get { return m_buffered_image; } - set { m_buffered_image = value; } - } - - /// - /// Enable or disable raw data output. - /// - /// true if raw data output is enabled; otherwise, false. - /// Default value: false
- /// Set this to true before - /// if you need to obtain raw data output. - ///
- /// - public bool Raw_data_out - { - get { return m_raw_data_out; } - set { m_raw_data_out = value; } - } - - /// - /// Gets or sets the algorithm used for the DCT step. - /// - /// The algorithm used for the DCT step. - /// Decompression parameter selection - public LibJpeg.DCTMethod Dct_method - { - get { return m_dct_method; } - set { m_dct_method = value; } - } - - /// - /// Enable or disable up-sampling of chroma components. - /// - /// If true, do careful up-sampling of chroma components. - /// If false, a faster but sloppier method is used. - /// The visual impact of the sloppier method is often very small. - /// - /// Default value: true - /// Decompression parameter selection - public bool Do_fancy_upsampling - { - get { return m_do_fancy_upsampling; } - set { m_do_fancy_upsampling = value; } - } - - /// - /// Apply inter-block smoothing in early stages of decoding progressive JPEG files. - /// - /// If true, inter-block smoothing is applied in early stages of decoding progressive JPEG files; - /// if false, not. Early progression stages look "fuzzy" with smoothing, "blocky" without. - /// Default value: true
- /// In any case, block smoothing ceases to be applied after the first few AC coefficients are - /// known to full accuracy, so it is relevant only when using - /// buffered-image mode for progressive images. - ///
- /// Decompression parameter selection - public bool Do_block_smoothing - { - get { return m_do_block_smoothing; } - set { m_do_block_smoothing = value; } - } - - /// - /// Colors quantization. - /// - /// If set true, colormapped output will be delivered.
- /// Default value: false, meaning that full-color output will be delivered. - ///
- /// Decompression parameter selection - public bool Quantize_colors - { - get { return m_quantize_colors; } - set { m_quantize_colors = value; } - } - - /* the following are ignored if not quantize_colors: */ - - /// - /// Selects color dithering method. - /// - /// Default value: . - /// Ignored if is false.
- /// At present, ordered dither is implemented only in the single-pass, standard-colormap case. - /// If you ask for ordered dither when is true - /// or when you supply an external color map, you'll get F-S dithering. - ///
- /// - /// Decompression parameter selection - public LibJpeg.DitherMode Dither_mode - { - get { return m_dither_mode; } - set { m_dither_mode = value; } - } - - /// - /// Gets or sets a value indicating whether to use two-pass color quantization. - /// - /// If true, an extra pass over the image is made to select a custom color map for the image. - /// This usually looks a lot better than the one-size-fits-all colormap that is used otherwise. - /// Ignored when the application supplies its own color map.
- /// - /// Default value: true - ///
- /// Ignored if is false.
- ///
- /// - /// Decompression parameter selection - public bool Two_pass_quantize - { - get { return m_two_pass_quantize; } - set { m_two_pass_quantize = value; } - } - - /// - /// Maximum number of colors to use in generating a library-supplied color map. - /// - /// Default value: 256. - /// Ignored if is false.
- /// The actual number of colors is returned in a . - ///
- /// - /// Decompression parameter selection - public int Desired_number_of_colors - { - get { return m_desired_number_of_colors; } - set { m_desired_number_of_colors = value; } - } - - /* these are significant only in buffered-image mode: */ - - /// - /// Enable future use of 1-pass quantizer. - /// - /// Default value: false - /// Significant only in buffered-image mode. - /// Buffered-image mode - public bool Enable_1pass_quant - { - get { return m_enable_1pass_quant; } - set { m_enable_1pass_quant = value; } - } - - /// - /// Enable future use of external colormap. - /// - /// Default value: false - /// Significant only in buffered-image mode. - /// Buffered-image mode - public bool Enable_external_quant - { - get { return m_enable_external_quant; } - set { m_enable_external_quant = value; } - } - - /// - /// Enable future use of 2-pass quantizer. - /// - /// Default value: false - /// Significant only in buffered-image mode. - /// Buffered-image mode - public bool Enable_2pass_quant - { - get { return m_enable_2pass_quant; } - set { m_enable_2pass_quant = value; } - } - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - /// - /// Gets the actual width of output image. - /// - /// The width of output image. - /// Computed by . - /// You can also use to determine this value - /// in advance of calling . - /// - public int Output_width - { - get { return m_output_width; } - } - - /// - /// Gets the actual height of output image. - /// - /// The height of output image. - /// Computed by . - /// You can also use to determine this value - /// in advance of calling . - /// - public int Output_height - { - get { return m_output_height; } - } - - /// - /// Gets the number of color components in . - /// - /// Computed by . - /// You can also use to determine this value - /// in advance of calling . - /// The number of color components. - /// - /// Decompression parameter selection - public int Out_color_components - { - get { return m_out_color_components; } - } - - /// - /// Gets the number of color components returned. - /// - /// Computed by . - /// You can also use to determine this value - /// in advance of calling . - /// When quantizing colors, - /// Output_components is 1, indicating a single color map index per pixel. - /// Otherwise it equals to . - /// - /// - /// Decompression parameter selection - public int Output_components - { - get { return m_output_components; } - } - - /// - /// Gets the recommended height of scanline buffer. - /// - /// In high-quality modes, Rec_outbuf_height is always 1, but some faster, - /// lower-quality modes set it to larger values (typically 2 to 4). - /// Computed by . - /// You can also use to determine this value - /// in advance of calling .
- /// - /// Rec_outbuf_height is the recommended minimum height (in scanlines) - /// of the buffer passed to . - /// If the buffer is smaller, the library will still work, but time will be wasted due - /// to unnecessary data copying. If you are going to ask for a high-speed processing mode, - /// you may as well go to the trouble of honoring Rec_outbuf_height so as to avoid data copying. - /// (An output buffer larger than Rec_outbuf_height lines is OK, but won't provide - /// any material speed improvement over that height.) - ///
- /// Decompression parameter selection - public int Rec_outbuf_height - { - get { return m_rec_outbuf_height; } - } - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-null before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - - /// - /// The number of colors in the color map. - /// - /// The number of colors in the color map. - /// - /// Decompression parameter selection - public int Actual_number_of_colors - { - get { return m_actual_number_of_colors; } - set { m_actual_number_of_colors = value; } - } - - /// - /// The color map, represented as a 2-D pixel array of rows - /// and columns. - /// - /// Colormap is set to null by . - /// The application can supply a color map by setting Colormap non-null and setting - /// to the map size. - /// - /// Ignored if not quantizing.
- /// Implementation restriction: at present, an externally supplied Colormap - /// is only accepted for 3-component output color spaces. - ///
- /// - /// - /// Decompression parameter selection - public byte[][] Colormap - { - get { return m_colormap; } - set { m_colormap = value; } - } - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - - /// - /// Gets the number of scanlines returned so far. - /// - /// The output_scanline. - /// Usually you can just use this variable as the loop counter, - /// so that the loop test looks like - /// while (cinfo.Output_scanline < cinfo.Output_height) - /// Decompression details - public int Output_scanline - { - get { return m_output_scanline; } - } - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - - /// - /// Gets the number of SOS markers seen so far. - /// - /// The number of SOS markers seen so far. - /// Indicates the progress of the decompressor input side. - public int Input_scan_number - { - get { return m_input_scan_number; } - } - - /// - /// Gets the number of iMCU rows completed. - /// - /// The number of iMCU rows completed. - /// Indicates the progress of the decompressor input side. - public int Input_iMCU_row - { - get { return m_input_iMCU_row; } - } - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - - /// - /// Gets the nominal scan number being displayed. - /// - /// The nominal scan number being displayed. - public int Output_scan_number - { - get { return m_output_scan_number; } - } - - /// - /// Gets the number of iMCU rows read. - /// - /// The number of iMCU rows read. - public int Output_iMCU_row - { - get { return m_output_iMCU_row; } - } - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This is null when reading a non-progressive file. - */ - - /// - /// Gets the current progression status.. - /// - /// Coef_bits[c][i] indicates the precision with - /// which component c's DCT coefficient i (in zigzag order) is known. - /// It is -1 when no data has yet been received, otherwise - /// it is the point transform (shift) value for the most recent scan of the coefficient - /// (thus, 0 at completion of the progression). This is null when reading a non-progressive file. - /// - /// Progressive JPEG support - public int[][] Coef_bits - { - get { return m_coef_bits; } - } - - // These fields record data obtained from optional markers - // recognized by the JPEG library. - - /// - /// Gets the resolution information from JFIF marker. - /// - /// The information from JFIF marker. - /// - /// - /// Decompression parameter selection - public DensityUnit Density_unit - { - get { return m_density_unit; } - } - - /// - /// Gets the horizontal component of pixel ratio. - /// - /// The horizontal component of pixel ratio. - /// - /// - public short X_density - { - get { return m_X_density; } - } - - /// - /// Gets the vertical component of pixel ratio. - /// - /// The vertical component of pixel ratio. - /// - /// - public short Y_density - { - get { return m_Y_density; } - } - - /// - /// Gets the data precision. - /// - /// The data precision. - public int Data_precision - { - get { return m_data_precision; } - //set { m_data_precision = value; } - } - - /// - /// Gets the largest vertical sample factor. - /// - /// The largest vertical sample factor. - public int Max_v_samp_factor - { - get { return m_max_v_samp_factor; } - //set { m_max_v_samp_factor = value; } - } - - /// - /// Gets the last read and unprocessed JPEG marker. - /// - /// It is either zero or the code of a JPEG marker that has been - /// read from the data source, but has not yet been processed. - /// - /// - /// Special markers - public int Unread_marker - { - get { return m_unread_marker; } - } - - /// - /// Comp_info[i] describes component that appears i'th in SOF - /// - /// The components in SOF. - /// - public JpegComponent[] Comp_info - { - get { return m_comp_info; } - internal set { m_comp_info = value; } - } - - /// - /// Sets input stream. - /// - /// The input stream. - /// - /// The caller must have already opened the stream, and is responsible - /// for closing it after finishing decompression. - /// - /// Decompression details - public void jpeg_stdio_src(Stream infile) - { - /* The source object and input buffer are made permanent so that a series - * of JPEG images can be read from the same file by calling jpeg_stdio_src - * only before the first one. (If we discarded the buffer at the end of - * one image, we'd likely lose the start of the next one.) - * This makes it unsafe to use this manager and a different source - * manager serially with the same JPEG object. Caveat programmer. - */ - if (m_src == null) - { - /* first time for this JPEG object? */ - m_src = new SourceManagerImpl(this); - } - - SourceManagerImpl m = m_src as SourceManagerImpl; - if (m != null) - m.Attach(infile); - } - - /// - /// Decompression startup: this will read the source datastream header markers, up to the beginning of the compressed data proper. - /// - /// Read a description of Return Value. - /// - /// If you pass require_image=true (normal case), you need not check for a - /// return code; an abbreviated file will cause - /// an error exit. is only possible if you use a data source - /// module that can give a suspension return.

- /// - /// This method will read as far as the first SOS marker (ie, actual start of compressed data), - /// and will save all tables and parameters in the JPEG object. It will also initialize the - /// decompression parameters to default values, and finally return . - /// On return, the application may adjust the decompression parameters and then call - /// . (Or, if the application only wanted to - /// determine the image parameters, the data need not be decompressed. In that case, call - /// to release any temporary space.)

- /// - /// If an abbreviated (tables only) datastream is presented, the routine will return - /// upon reaching EOI. The application may then re-use - /// the JPEG object to read the abbreviated image datastream(s). It is unnecessary (but OK) to call - /// jpeg_abort in this case. - /// The return code only occurs if the data source module - /// requests suspension of the decompressor. In this case the application should load more source - /// data and then re-call jpeg_read_header to resume processing.

- /// - /// If a non-suspending data source is used and require_image is true, - /// then the return code need not be inspected since only is possible. - ///
- /// Need only initialize JPEG object and supply a data source before calling.
- /// On return, the image dimensions and other info have been stored in the JPEG object. - /// The application may wish to consult this information before selecting decompression parameters.
- /// This routine is now just a front end to , with some extra error checking. - ///
- /// Decompression details - /// Decompression parameter selection - public ReadResult jpeg_read_header(bool require_image) - { - if (m_global_state != JpegState.DSTATE_START && m_global_state != JpegState.DSTATE_INHEADER) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - ReadResult retcode = jpeg_consume_input(); - - switch (retcode) - { - case ReadResult.Reached_SOS: - return ReadResult.Header_Ok; - case ReadResult.Reached_EOI: - if (require_image) /* Complain if application wanted an image */ - throw new Exception("JPEG datastream contains no image"); - /* Reset to start state; it would be safer to require the application to - * call jpeg_abort, but we can't change it now for compatibility reasons. - * A side effect is to free any temporary memory (there shouldn't be any). - */ - jpeg_abort(); /* sets state = DSTATE_START */ - return ReadResult.Header_Tables_Only; - - case ReadResult.Suspended: - /* no work */ - break; - } - - return ReadResult.Suspended; - } - - ////////////////////////////////////////////////////////////////////////// - // Main entry points for decompression - - /// - /// Decompression initialization. - /// - /// Returns false if suspended. The return value need be inspected - /// only if a suspending data source is used. - /// - /// jpeg_read_header must be completed before calling this.
- /// - /// If a multipass operating mode was selected, this will do all but the last pass, and thus may take a great deal of time. - ///
- /// - /// Decompression details - public bool jpeg_start_decompress() - { - if (m_global_state == JpegState.DSTATE_READY) - { - /* First call: initialize master control, select active modules */ - m_master = new JpegDecompressorMaster(this); - if (m_buffered_image) - { - /* No more work here; expecting jpeg_start_output next */ - m_global_state = JpegState.DSTATE_BUFIMAGE; - return true; - } - m_global_state = JpegState.DSTATE_PRELOAD; - } - - if (m_global_state == JpegState.DSTATE_PRELOAD) - { - /* If file has multiple scans, absorb them all into the coef buffer */ - if (m_inputctl.HasMultipleScans()) - { - for (; ; ) - { - ReadResult retcode; - - /* Absorb some more input */ - retcode = m_inputctl.consume_input(); - if (retcode == ReadResult.Suspended) - return false; - - if (retcode == ReadResult.Reached_EOI) - break; - } - } - - m_output_scan_number = m_input_scan_number; - } - else if (m_global_state != JpegState.DSTATE_PRESCAN) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - /* Perform any dummy output passes, and set up for the final pass */ - return output_pass_setup(); - } - - /// - /// Read some scanlines of data from the JPEG decompressor. - /// - /// Buffer for filling. - /// Required number of lines. - /// The return value will be the number of lines actually read. - /// This may be less than the number requested in several cases, including - /// bottom of image, data source suspension, and operating modes that emit multiple scanlines at a time. - /// - /// We warn about excess calls to jpeg_read_scanlines since this likely signals an - /// application programmer error. However, an oversize buffer (max_lines > scanlines remaining) - /// is not an error. - /// - /// Decompression details - public int jpeg_read_scanlines(byte[][] scanlines, int max_lines) - { - if (m_global_state != JpegState.DSTATE_SCANNING) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (m_output_scanline >= m_output_height) - { - return 0; - } - - /* Process some data */ - int row_ctr = 0; - m_main.process_data(scanlines, ref row_ctr, max_lines); - m_output_scanline += row_ctr; - return row_ctr; - } - - /// - /// Finish JPEG decompression. - /// - /// Returns false if suspended. The return value need be inspected - /// only if a suspending data source is used. - /// - /// This will normally just verify the file trailer and release temp storage. - /// - /// Decompression details - public bool jpeg_finish_decompress() - { - if ((m_global_state == JpegState.DSTATE_SCANNING || m_global_state == JpegState.DSTATE_RAW_OK) && !m_buffered_image) - { - /* Terminate final pass of non-buffered mode */ - if (m_output_scanline < m_output_height) - throw new Exception("Application transferred too few scanlines"); - - m_master.finish_output_pass(); - m_global_state = JpegState.DSTATE_STOPPING; - } - else if (m_global_state == JpegState.DSTATE_BUFIMAGE) - { - /* Finishing after a buffered-image operation */ - m_global_state = JpegState.DSTATE_STOPPING; - } - else if (m_global_state != JpegState.DSTATE_STOPPING) - { - /* STOPPING = repeat call after a suspension, anything else is error */ - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - } - - /* Read until EOI */ - while (!m_inputctl.EOIReached()) - { - if (m_inputctl.consume_input() == ReadResult.Suspended) - { - /* Suspend, come back later */ - return false; - } - } - - /* Do final cleanup */ - m_src.term_source(); - - /* We can use jpeg_abort to release memory and reset global_state */ - jpeg_abort(); - return true; - } - - /// - /// Alternate entry point to read raw data. - /// - /// The raw data. - /// The number of scanlines for reading. - /// The number of lines actually read. - /// Replaces jpeg_read_scanlines - /// when reading raw downsampled data. Processes exactly one iMCU row per call, unless suspended. - /// - public int jpeg_read_raw_data(byte[][][] data, int max_lines) - { - if (m_global_state != JpegState.DSTATE_RAW_OK) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - if (m_output_scanline >= m_output_height) - { - return 0; - } - - /* Verify that at least one iMCU row can be returned. */ - int lines_per_iMCU_row = m_max_v_samp_factor * m_min_DCT_scaled_size; - if (max_lines < lines_per_iMCU_row) - throw new Exception("Buffer passed to JPEG library is too small"); - - int componentCount = data.Length; // maybe we should use max_lines here - ComponentBuffer[] cb = new ComponentBuffer[componentCount]; - for (int i = 0; i < componentCount; i++) - { - cb[i] = new ComponentBuffer(); - cb[i].SetBuffer(data[i], null, 0); - } - - /* Decompress directly into user's buffer. */ - if (m_coef.decompress_data(cb) == ReadResult.Suspended) - { - /* suspension forced, can do nothing more */ - return 0; - } - - /* OK, we processed one iMCU row. */ - m_output_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; - } - - ////////////////////////////////////////////////////////////////////////// - // Additional entry points for buffered-image mode. - - /// - /// Is there more than one scan? - /// - /// true if image has more than one scan; otherwise, false - /// If you are concerned about maximum performance on baseline JPEG files, - /// you should use buffered-image mode only - /// when the incoming file actually has multiple scans. This can be tested by calling this method. - /// - public bool jpeg_has_multiple_scans() - { - /* Only valid after jpeg_read_header completes */ - if (m_global_state < JpegState.DSTATE_READY || m_global_state > JpegState.DSTATE_STOPPING) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - return m_inputctl.HasMultipleScans(); - } - - /// - /// Initialize for an output pass in buffered-image mode. - /// - /// Indicates which scan of the input file is to be displayed; - /// the scans are numbered starting at 1 for this purpose. - /// true if done; false if suspended - /// - /// Buffered-image mode - public bool jpeg_start_output(int scan_number) - { - if (m_global_state != JpegState.DSTATE_BUFIMAGE && m_global_state != JpegState.DSTATE_PRESCAN) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - /* Limit scan number to valid range */ - if (scan_number <= 0) - scan_number = 1; - - if (m_inputctl.EOIReached() && scan_number > m_input_scan_number) - scan_number = m_input_scan_number; - - m_output_scan_number = scan_number; - /* Perform any dummy output passes, and set up for the real pass */ - return output_pass_setup(); - } - - /// - /// Finish up after an output pass in buffered-image mode. - /// - /// Returns false if suspended. The return value need be inspected only if a suspending data source is used. - /// - /// Buffered-image mode - public bool jpeg_finish_output() - { - if ((m_global_state == JpegState.DSTATE_SCANNING || m_global_state == JpegState.DSTATE_RAW_OK) && m_buffered_image) - { - /* Terminate this pass. */ - /* We do not require the whole pass to have been completed. */ - m_master.finish_output_pass(); - m_global_state = JpegState.DSTATE_BUFPOST; - } - else if (m_global_state != JpegState.DSTATE_BUFPOST) - { - /* BUFPOST = repeat call after a suspension, anything else is error */ - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - } - - /* Read markers looking for SOS or EOI */ - while (m_input_scan_number <= m_output_scan_number && !m_inputctl.EOIReached()) - { - if (m_inputctl.consume_input() == ReadResult.Suspended) - { - /* Suspend, come back later */ - return false; - } - } - - m_global_state = JpegState.DSTATE_BUFIMAGE; - return true; - } - - /// - /// Indicates if we have finished reading the input file. - /// - /// true if we have finished reading the input file. - /// Buffered-image mode - public bool jpeg_input_complete() - { - /* Check for valid jpeg object */ - if (m_global_state < JpegState.DSTATE_START || m_global_state > JpegState.DSTATE_STOPPING) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - return m_inputctl.EOIReached(); - } - - /// - /// Consume data in advance of what the decompressor requires. - /// - /// The result of data consumption. - /// This routine can be called at any time after initializing the JPEG object. - /// It reads some additional data and returns when one of the indicated significant events - /// occurs. If called after the EOI marker is reached, it will immediately return - /// without attempting to read more data. - public ReadResult jpeg_consume_input() - { - ReadResult retcode = ReadResult.Suspended; - - /* NB: every possible DSTATE value should be listed in this switch */ - switch (m_global_state) - { - case JpegState.DSTATE_START: - jpeg_consume_input_start(); - retcode = jpeg_consume_input_inHeader(); - break; - case JpegState.DSTATE_INHEADER: - retcode = jpeg_consume_input_inHeader(); - break; - case JpegState.DSTATE_READY: - /* Can't advance past first SOS until start_decompress is called */ - retcode = ReadResult.Reached_SOS; - break; - case JpegState.DSTATE_PRELOAD: - case JpegState.DSTATE_PRESCAN: - case JpegState.DSTATE_SCANNING: - case JpegState.DSTATE_RAW_OK: - case JpegState.DSTATE_BUFIMAGE: - case JpegState.DSTATE_BUFPOST: - case JpegState.DSTATE_STOPPING: - retcode = m_inputctl.consume_input(); - break; - default: - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - } - return retcode; - } - - /// - /// Pre-calculate output image dimensions and related values for current decompression parameters. - /// - /// This is allowed for possible use by application. Hence it mustn't do anything - /// that can't be done twice. Also note that it may be called before the master module is initialized! - /// - public void jpeg_calc_output_dimensions() - { - // Do computations that are needed before master selection phase - /* Prevent application from calling me at wrong times */ - if (m_global_state != JpegState.DSTATE_READY) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - /* Compute actual output image dimensions and DCT scaling choices. */ - if (m_scale_num * 8 <= m_scale_denom) - { - /* Provide 1/8 scaling */ - m_output_width = JpegUtils.jdiv_round_up(m_image_width, 8); - m_output_height = JpegUtils.jdiv_round_up(m_image_height, 8); - m_min_DCT_scaled_size = 1; - } - else if (m_scale_num * 4 <= m_scale_denom) - { - /* Provide 1/4 scaling */ - m_output_width = JpegUtils.jdiv_round_up(m_image_width, 4); - m_output_height = JpegUtils.jdiv_round_up(m_image_height, 4); - m_min_DCT_scaled_size = 2; - } - else if (m_scale_num * 2 <= m_scale_denom) - { - /* Provide 1/2 scaling */ - m_output_width = JpegUtils.jdiv_round_up(m_image_width, 2); - m_output_height = JpegUtils.jdiv_round_up(m_image_height, 2); - m_min_DCT_scaled_size = 4; - } - else - { - /* Provide 1/1 scaling */ - m_output_width = m_image_width; - m_output_height = m_image_height; - m_min_DCT_scaled_size = JpegConstants.DCTSize; - } - - /* In selecting the actual DCT scaling for each component, we try to - * scale up the chroma components via IDCT scaling rather than upsampling. - * This saves time if the upsampler gets to use 1:1 scaling. - * Note this code assumes that the supported DCT scalings are powers of 2. - */ - for (int ci = 0; ci < m_num_components; ci++) - { - int ssize = m_min_DCT_scaled_size; - while (ssize < JpegConstants.DCTSize && - (m_comp_info[ci].H_samp_factor * ssize * 2 <= m_max_h_samp_factor * m_min_DCT_scaled_size) && - (m_comp_info[ci].V_samp_factor * ssize * 2 <= m_max_v_samp_factor * m_min_DCT_scaled_size)) - { - ssize = ssize * 2; - } - - m_comp_info[ci].DCT_scaled_size = ssize; - } - - /* Recompute downsampled dimensions of components; - * application needs to know these if using raw downsampled data. - */ - for (int ci = 0; ci < m_num_components; ci++) - { - /* Size in samples, after IDCT scaling */ - m_comp_info[ci].downsampled_width = JpegUtils.jdiv_round_up( - m_image_width * m_comp_info[ci].H_samp_factor * m_comp_info[ci].DCT_scaled_size, - m_max_h_samp_factor * JpegConstants.DCTSize); - - m_comp_info[ci].downsampled_height = JpegUtils.jdiv_round_up( - m_image_height * m_comp_info[ci].V_samp_factor * m_comp_info[ci].DCT_scaled_size, - m_max_v_samp_factor * JpegConstants.DCTSize); - } - - /* Report number of components in selected colorspace. */ - /* Probably this should be in the color conversion module... */ - switch (m_out_color_space) - { - case ColorSpace.Grayscale: - m_out_color_components = 1; - break; - case ColorSpace.RGB: - case ColorSpace.YCbCr: - m_out_color_components = 3; - break; - case ColorSpace.CMYK: - case ColorSpace.YCCK: - m_out_color_components = 4; - break; - default: - /* else must be same colorspace as in file */ - m_out_color_components = m_num_components; - break; - } - - m_output_components = (m_quantize_colors ? 1 : m_out_color_components); - - /* See if up-sampler will want to emit more than one row at a time */ - if (use_merged_upsample()) - m_rec_outbuf_height = m_max_v_samp_factor; - else - m_rec_outbuf_height = 1; - } - - /// - /// Read or write the raw DCT coefficient arrays from a JPEG file (useful for lossless transcoding). - /// - /// Returns null if suspended. This case need be checked only - /// if a suspending data source is used. - /// - /// - /// jpeg_read_header must be completed before calling this.
- /// - /// The entire image is read into a set of virtual coefficient-block arrays, one per component. - /// The return value is an array of virtual-array descriptors.
- /// - /// An alternative usage is to simply obtain access to the coefficient arrays during a - /// buffered-image mode decompression operation. This is allowed after any - /// jpeg_finish_output call. The arrays can be accessed - /// until jpeg_finish_decompress is called. - /// Note that any call to the library may reposition the arrays, - /// so don't rely on results to stay valid across library calls. - ///
- public JpegVirtualArray[] jpeg_read_coefficients() - { - if (m_global_state == JpegState.DSTATE_READY) - { - /* First call: initialize active modules */ - transdecode_master_selection(); - m_global_state = JpegState.DSTATE_RDCOEFS; - } - - if (m_global_state == JpegState.DSTATE_RDCOEFS) - { - /* Absorb whole file into the coef buffer */ - for (; ; ) - { - ReadResult retcode; - - /* Absorb some more input */ - retcode = m_inputctl.consume_input(); - if (retcode == ReadResult.Suspended) - return null; - - if (retcode == ReadResult.Reached_EOI) - break; - } - - /* Set state so that jpeg_finish_decompress does the right thing */ - m_global_state = JpegState.DSTATE_STOPPING; - } - - /* At this point we should be in state DSTATE_STOPPING if being used - * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access - * to the coefficients during a full buffered-image-mode decompression. - */ - if ((m_global_state == JpegState.DSTATE_STOPPING || m_global_state == JpegState.DSTATE_BUFIMAGE) && m_buffered_image) - return m_coef.GetCoefArrays(); - - /* Oops, improper usage */ - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - } - - /// - /// Initializes the compression object with default parameters, then copy from the source object - /// all parameters needed for lossless transcoding. - /// - /// Target JPEG compression object. - /// Parameters that can be varied without loss (such as scan script and - /// Huffman optimization) are left in their default states. - public void jpeg_copy_critical_parameters(JpegCompressor dstinfo) - { - /* Safety check to ensure start_compress not called yet. */ - if (dstinfo.m_global_state != JpegState.CSTATE_START) - throw new Exception(String.Format("Improper call to JPEG library in state {0}", (int)m_global_state)); - - /* Copy fundamental image dimensions */ - dstinfo.m_image_width = m_image_width; - dstinfo.m_image_height = m_image_height; - dstinfo.m_input_components = m_num_components; - dstinfo.m_in_color_space = m_jpeg_color_space; - - /* Initialize all parameters to default values */ - dstinfo.jpeg_set_defaults(); - - /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. - * Fix it to get the right header markers for the image colorspace. - */ - dstinfo.jpeg_set_colorspace(m_jpeg_color_space); - dstinfo.m_data_precision = m_data_precision; - dstinfo.m_CCIR601_sampling = m_CCIR601_sampling; - - /* Copy the source's quantization tables. */ - for (int tblno = 0; tblno < JpegConstants.NumberOfQuantTables; tblno++) - { - if (m_quant_tbl_ptrs[tblno] != null) - { - if (dstinfo.m_quant_tbl_ptrs[tblno] == null) - dstinfo.m_quant_tbl_ptrs[tblno] = new JpegQuantizationTable(); - - Buffer.BlockCopy(m_quant_tbl_ptrs[tblno].quantval, 0, - dstinfo.m_quant_tbl_ptrs[tblno].quantval, 0, - dstinfo.m_quant_tbl_ptrs[tblno].quantval.Length * sizeof(short)); - - dstinfo.m_quant_tbl_ptrs[tblno].Sent_table = false; - } - } - - /* Copy the source's per-component info. - * Note we assume jpeg_set_defaults has allocated the dest comp_info array. - */ - dstinfo.m_num_components = m_num_components; - if (dstinfo.m_num_components < 1 || dstinfo.m_num_components > JpegConstants.MaxComponents) - throw new Exception(String.Format("Too many color components: {0}, max {1}", dstinfo.m_num_components, JpegConstants.MaxComponents)); - - for (int ci = 0; ci < dstinfo.m_num_components; ci++) - { - dstinfo.Component_info[ci].Component_id = m_comp_info[ci].Component_id; - dstinfo.Component_info[ci].H_samp_factor = m_comp_info[ci].H_samp_factor; - dstinfo.Component_info[ci].V_samp_factor = m_comp_info[ci].V_samp_factor; - dstinfo.Component_info[ci].Quant_tbl_no = m_comp_info[ci].Quant_tbl_no; - - /* Make sure saved quantization table for component matches the qtable - * slot. If not, the input file re-used this qtable slot. - * IJG encoder currently cannot duplicate this. - */ - int tblno = dstinfo.Component_info[ci].Quant_tbl_no; - if (tblno < 0 || tblno >= JpegConstants.NumberOfQuantTables || m_quant_tbl_ptrs[tblno] == null) - throw new Exception(String.Format("Quantization table 0x{0:X2} was not defined", tblno)); - - JpegQuantizationTable c_quant = m_comp_info[ci].quant_table; - if (c_quant != null) - { - JpegQuantizationTable slot_quant = m_quant_tbl_ptrs[tblno]; - for (int coefi = 0; coefi < JpegConstants.DCTSize2; coefi++) - { - if (c_quant.quantval[coefi] != slot_quant.quantval[coefi]) - throw new Exception(String.Format("Cannot transcode due to multiple use of quantization table {0}", tblno)); - } - } - /* Note: we do not copy the source's Huffman table assignments; - * instead we rely on jpeg_set_colorspace to have made a suitable choice. - */ - } - - /* Also copy JFIF version and resolution information, if available. - * Strictly speaking this isn't "critical" info, but it's nearly - * always appropriate to copy it if available. In particular, - * if the application chooses to copy JFIF 1.02 extension markers from - * the source file, we need to copy the version to make sure we don't - * emit a file that has 1.02 extensions but a claimed version of 1.01. - * We will *not*, however, copy version info from mislabeled "2.01" files. - */ - if (m_saw_JFIF_marker) - { - if (m_JFIF_major_version == 1) - { - dstinfo.m_JFIF_major_version = m_JFIF_major_version; - dstinfo.m_JFIF_minor_version = m_JFIF_minor_version; - } - - dstinfo.m_density_unit = m_density_unit; - dstinfo.m_X_density = (short)m_X_density; - dstinfo.m_Y_density = (short)m_Y_density; - } - } - - /// - /// Aborts processing of a JPEG decompression operation. - /// - /// - public void jpeg_abort_decompress() - { - jpeg_abort(); - } - - /// - /// Sets processor for special marker. - /// - /// The marker code. - /// The processor. - /// Allows you to supply your own routine to process - /// COM and/or APPn markers on-the-fly as they are read. - /// - /// Special markers - public void jpeg_set_marker_processor(int marker_code, jpeg_marker_parser_method routine) - { - m_marker.jpeg_set_marker_processor(marker_code, routine); - } - - /// - /// Control saving of COM and APPn markers into Marker_list. - /// - /// The marker type to save (see JpegMarkerType enumeration).
- /// To arrange to save all the special marker types, you need to call this - /// routine 17 times, for COM and APP0-APP15 markers. - /// If the incoming marker is longer than length_limit data bytes, - /// only length_limit bytes will be saved; this parameter allows you to avoid chewing up memory - /// when you only need to see the first few bytes of a potentially large marker. If you want to save - /// all the data, set length_limit to 0xFFFF; that is enough since marker lengths are only 16 bits. - /// As a special case, setting length_limit to 0 prevents that marker type from being saved at all. - /// (That is the default behavior, in fact.) - /// - /// - /// Special markers - public void jpeg_save_markers(int marker_code, int length_limit) - { - m_marker.jpeg_save_markers(marker_code, length_limit); - } - - /// - /// Determine whether merged upsample/color conversion should be used. - /// CRUCIAL: this must match the actual capabilities of merged upsampler! - /// - internal bool use_merged_upsample() - { - /* Merging is the equivalent of plain box-filter upsampling */ - if (m_do_fancy_upsampling || m_CCIR601_sampling) - return false; - - /* UpsamplerImpl only supports YCC=>RGB color conversion */ - if (m_jpeg_color_space != ColorSpace.YCbCr || m_num_components != 3 || - m_out_color_space != ColorSpace.RGB || m_out_color_components != JpegConstants.RGB_PixelLength) - { - return false; - } - - /* and it only handles 2h1v or 2h2v sampling ratios */ - if (m_comp_info[0].H_samp_factor != 2 || m_comp_info[1].H_samp_factor != 1 || - m_comp_info[2].H_samp_factor != 1 || m_comp_info[0].V_samp_factor > 2 || - m_comp_info[1].V_samp_factor != 1 || m_comp_info[2].V_samp_factor != 1) - { - return false; - } - - /* furthermore, it doesn't work if we've scaled the IDCTs differently */ - if (m_comp_info[0].DCT_scaled_size != m_min_DCT_scaled_size || - m_comp_info[1].DCT_scaled_size != m_min_DCT_scaled_size || - m_comp_info[2].DCT_scaled_size != m_min_DCT_scaled_size) - { - return false; - } - - /* ??? also need to test for upsample-time rescaling, when & if supported */ - /* by golly, it'll work... */ - return true; - } - - /// - /// Initialization of JPEG compression objects. - /// The error manager must already be set up (in case memory manager fails). - /// - private void initialize() - { - /* Zero out pointers to permanent structures. */ - m_src = null; - - for (int i = 0; i < JpegConstants.NumberOfQuantTables; i++) - m_quant_tbl_ptrs[i] = null; - - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - m_dc_huff_tbl_ptrs[i] = null; - m_ac_huff_tbl_ptrs[i] = null; - } - - /* Initialize marker processor so application can override methods - * for COM, APPn markers before calling jpeg_read_header. - */ - m_marker_list = new List(); - m_marker = new JpegMarkerReader(this); - - /* And initialize the overall input controller. */ - m_inputctl = new JpegInputController(this); - - /* OK, I'm ready */ - m_global_state = JpegState.DSTATE_START; - } - - /// - /// Master selection of decompression modules for transcoding (that is, reading - /// raw DCT coefficient arrays from an input JPEG file.) - /// This substitutes for initialization of the full decompressor. - /// - private void transdecode_master_selection() - { - /* This is effectively a buffered-image operation. */ - m_buffered_image = true; - - if (m_progressive_mode) - m_entropy = new ProgressiveHuffmanDecoder(this); - else - m_entropy = new HuffEntropyDecoder(this); - - /* Always get a full-image coefficient buffer. */ - m_coef = new JpegDecompressorCoefController(this, true); - - /* Initialize input side of decompressor to consume first scan. */ - m_inputctl.start_input_pass(); - } - - /// - /// Set up for an output pass, and perform any dummy pass(es) needed. - /// Common subroutine for jpeg_start_decompress and jpeg_start_output. - /// Entry: global_state = DSTATE_PRESCAN only if previously suspended. - /// Exit: If done, returns true and sets global_state for proper output mode. - /// If suspended, returns false and sets global_state = DSTATE_PRESCAN. - /// - private bool output_pass_setup() - { - if (m_global_state != JpegState.DSTATE_PRESCAN) - { - /* First call: do pass setup */ - m_master.prepare_for_output_pass(); - m_output_scanline = 0; - m_global_state = JpegState.DSTATE_PRESCAN; - } - - /* Loop over any required dummy passes */ - while (m_master.IsDummyPass()) - { - /* Crank through the dummy pass */ - while (m_output_scanline < m_output_height) - { - int last_scanline; - - /* Process some data */ - last_scanline = m_output_scanline; - m_main.process_data(null, ref m_output_scanline, 0); - if (m_output_scanline == last_scanline) - { - /* No progress made, must suspend */ - return false; - } - } - - /* Finish up dummy pass, and set up for another one */ - m_master.finish_output_pass(); - m_master.prepare_for_output_pass(); - m_output_scanline = 0; - } - - /* Ready for application to drive output pass through - * jpeg_read_scanlines or jpeg_read_raw_data. - */ - m_global_state = m_raw_data_out ? JpegState.DSTATE_RAW_OK : JpegState.DSTATE_SCANNING; - return true; - } - - /// - /// Set default decompression parameters. - /// - private void default_decompress_parms() - { - /* Guess the input colorspace, and set output colorspace accordingly. */ - /* (Wish JPEG committee had provided a real way to specify this...) */ - /* Note application may override our guesses. */ - switch (m_num_components) - { - case 1: - m_jpeg_color_space = ColorSpace.Grayscale; - m_out_color_space = ColorSpace.Grayscale; - break; - - case 3: - if (m_saw_JFIF_marker) - { - /* JFIF implies YCbCr */ - m_jpeg_color_space = ColorSpace.YCbCr; - } - else if (m_saw_Adobe_marker) - { - switch (m_Adobe_transform) - { - case 0: - m_jpeg_color_space = ColorSpace.RGB; - break; - case 1: - m_jpeg_color_space = ColorSpace.YCbCr; - break; - default: - m_jpeg_color_space = ColorSpace.YCbCr; /* assume it's YCbCr */ - break; - } - } - else - { - /* Saw no special markers, try to guess from the component IDs */ - int cid0 = m_comp_info[0].Component_id; - int cid1 = m_comp_info[1].Component_id; - int cid2 = m_comp_info[2].Component_id; - - if (cid0 == 1 && cid1 == 2 && cid2 == 3) - { - /* assume JFIF w/out marker */ - m_jpeg_color_space = ColorSpace.YCbCr; - } - else if (cid0 == 82 && cid1 == 71 && cid2 == 66) - { - /* ASCII 'R', 'G', 'B' */ - m_jpeg_color_space = ColorSpace.RGB; - } - else - { - /* assume it's YCbCr */ - m_jpeg_color_space = ColorSpace.YCbCr; - } - } - /* Always guess RGB is proper output colorspace. */ - m_out_color_space = ColorSpace.RGB; - break; - - case 4: - if (m_saw_Adobe_marker) - { - switch (m_Adobe_transform) - { - case 0: - m_jpeg_color_space = ColorSpace.CMYK; - break; - case 2: - m_jpeg_color_space = ColorSpace.YCCK; - break; - default: - /* assume it's YCCK */ - m_jpeg_color_space = ColorSpace.YCCK; - break; - } - } - else - { - /* No special markers, assume straight CMYK. */ - m_jpeg_color_space = ColorSpace.CMYK; - } - - m_out_color_space = ColorSpace.CMYK; - break; - - default: - m_jpeg_color_space = ColorSpace.Unknown; - m_out_color_space = ColorSpace.Unknown; - break; - } - - /* Set defaults for other decompression parameters. */ - m_scale_num = 1; /* 1:1 scaling */ - m_scale_denom = 1; - m_buffered_image = false; - m_raw_data_out = false; - m_dct_method = JpegConstants.DefaultDCTMethod; - m_do_fancy_upsampling = true; - m_do_block_smoothing = true; - m_quantize_colors = false; - - /* We set these in case application only sets quantize_colors. */ - m_dither_mode = DitherMode.FloydStein; - m_two_pass_quantize = true; - m_desired_number_of_colors = 256; - m_colormap = null; - - /* Initialize for no mode change in buffered-image mode. */ - m_enable_1pass_quant = false; - m_enable_external_quant = false; - m_enable_2pass_quant = false; - } - - private void jpeg_consume_input_start() - { - /* Start-of-datastream actions: reset appropriate modules */ - m_inputctl.reset_input_controller(); - - /* Initialize application's data source module */ - m_src.init_source(); - m_global_state = JpegState.DSTATE_INHEADER; - } - - private ReadResult jpeg_consume_input_inHeader() - { - ReadResult retcode = m_inputctl.consume_input(); - if (retcode == ReadResult.Reached_SOS) - { - /* Found SOS, prepare to decompress */ - /* Set up default parameters based on header data */ - default_decompress_parms(); - - /* Set global state: ready for start_decompress */ - m_global_state = JpegState.DSTATE_READY; - } - - return retcode; - } - } - #endregion - - #region JpegDecompressorCoefController - /// - /// Coefficient buffer control - /// - /// This code applies interblock smoothing as described by section K.8 - /// of the JPEG standard: the first 5 AC coefficients are estimated from - /// the DC values of a DCT block and its 8 neighboring blocks. - /// We apply smoothing only for progressive JPEG decoding, and only if - /// the coefficients it can estimate are not yet known to full precision. - /// - class JpegDecompressorCoefController - { - private const int SAVED_COEFS = 6; /* we save coef_bits[0..5] */ - - /* Natural-order array positions of the first 5 zigzag-order coefficients */ - private const int Q01_POS = 1; - private const int Q10_POS = 8; - private const int Q20_POS = 16; - private const int Q11_POS = 9; - private const int Q02_POS = 2; - - private enum DecompressorType - { - Ordinary, - Smooth, - OnePass - } - - private JpegDecompressor m_cinfo; - private bool m_useDummyConsumeData; - private DecompressorType m_decompressor; - - /* These variables keep track of the current location of the input side. */ - /* cinfo.input_iMCU_row is also used for this. */ - private int m_MCU_ctr; /* counts MCUs processed in current row */ - private int m_MCU_vert_offset; /* counts MCU rows within iMCU row */ - private int m_MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* The output side's location is represented by cinfo.output_iMCU_row. */ - - /* In single-pass modes, it's sufficient to buffer just one MCU. - * We allocate a workspace of DecompressorMaxBlocksInMCU coefficient blocks, - * and let the entropy decoder write into that workspace each time. - * (On 80x86, the workspace is FAR even though it's not really very big; - * this is to keep the module interfaces unchanged when a large coefficient - * buffer is necessary.) - * In multi-pass modes, this array points to the current MCU's blocks - * within the virtual arrays; it is used only by the input side. - */ - private JpegBlock[] m_MCU_buffer = new JpegBlock[JpegConstants.DecompressorMaxBlocksInMCU]; - - /* In multi-pass modes, we need a virtual block array for each component. */ - private JpegVirtualArray[] m_whole_image = new JpegVirtualArray[JpegConstants.MaxComponents]; - private JpegVirtualArray[] m_coef_arrays; - - /* When doing block smoothing, we latch coefficient Al values here */ - private int[] m_coef_bits_latch; - private int m_coef_bits_savedOffset; - - public JpegDecompressorCoefController(JpegDecompressor cinfo, bool need_full_buffer) - { - m_cinfo = cinfo; - - /* Create the coefficient buffer. */ - if (need_full_buffer) - { - /* Allocate a full-image virtual array for each component, */ - /* padded to a multiple of samp_factor DCT blocks in each direction. */ - /* Note we ask for a pre-zeroed array. */ - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - m_whole_image[ci] = JpegCommonBase.CreateBlocksArray( - JpegUtils.jround_up(cinfo.Comp_info[ci].Width_in_blocks, cinfo.Comp_info[ci].H_samp_factor), - JpegUtils.jround_up(cinfo.Comp_info[ci].height_in_blocks, cinfo.Comp_info[ci].V_samp_factor)); - m_whole_image[ci].ErrorProcessor = cinfo; - } - - m_useDummyConsumeData = false; - m_decompressor = DecompressorType.Ordinary; - m_coef_arrays = m_whole_image; /* link to virtual arrays */ - } - else - { - /* We only need a single-MCU buffer. */ - JpegBlock[] buffer = new JpegBlock[JpegConstants.DecompressorMaxBlocksInMCU]; - for (int i = 0; i < JpegConstants.DecompressorMaxBlocksInMCU; i++) - { - buffer[i] = new JpegBlock(); - for (int ii = 0; ii < buffer[i].data.Length; ii++) - buffer[i].data[ii] = -12851; - - m_MCU_buffer[i] = buffer[i]; - } - - m_useDummyConsumeData = true; - m_decompressor = DecompressorType.OnePass; - m_coef_arrays = null; /* flag for no virtual arrays */ - } - } - - /// - /// Initialize for an input processing pass. - /// - public void start_input_pass() - { - m_cinfo.m_input_iMCU_row = 0; - start_iMCU_row(); - } - - /// - /// Consume input data and store it in the full-image coefficient buffer. - /// We read as much as one fully interleaved MCU row ("iMCU" row) per call, - /// ie, v_samp_factor block rows for each component in the scan. - /// - public ReadResult consume_data() - { - if (m_useDummyConsumeData) - return ReadResult.Suspended; /* Always indicate nothing was done */ - - JpegBlock[][][] buffer = new JpegBlock[JpegConstants.MaxComponentsInScan][][]; - - /* Align the virtual buffers for the components used in this scan. */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - - buffer[ci] = m_whole_image[componentInfo.Component_index].Access( - m_cinfo.m_input_iMCU_row * componentInfo.V_samp_factor, componentInfo.V_samp_factor); - - /* Note: entropy decoder expects buffer to be zeroed, - * but this is handled automatically by the memory manager - * because we requested a pre-zeroed array. - */ - } - - /* Loop to process one whole iMCU row */ - for (int yoffset = m_MCU_vert_offset; yoffset < m_MCU_rows_per_iMCU_row; yoffset++) - { - for (int MCU_col_num = m_MCU_ctr; MCU_col_num < m_cinfo.m_MCUs_per_row; MCU_col_num++) - { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - int blkn = 0; /* index of current DCT block within MCU */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - int start_col = MCU_col_num * componentInfo.MCU_width; - for (int yindex = 0; yindex < componentInfo.MCU_height; yindex++) - { - for (int xindex = 0; xindex < componentInfo.MCU_width; xindex++) - { - m_MCU_buffer[blkn] = buffer[ci][yindex + yoffset][start_col + xindex]; - blkn++; - } - } - } - - /* Try to fetch the MCU. */ - if (!m_cinfo.m_entropy.decode_mcu(m_MCU_buffer)) - { - /* Suspension forced; update state counters and exit */ - m_MCU_vert_offset = yoffset; - m_MCU_ctr = MCU_col_num; - return ReadResult.Suspended; - } - } - - /* Completed an MCU row, but perhaps not an iMCU row */ - m_MCU_ctr = 0; - } - - /* Completed the iMCU row, advance counters for next one */ - m_cinfo.m_input_iMCU_row++; - if (m_cinfo.m_input_iMCU_row < m_cinfo.m_total_iMCU_rows) - { - start_iMCU_row(); - return ReadResult.Row_Completed; - } - - /* Completed the scan */ - m_cinfo.m_inputctl.finish_input_pass(); - return ReadResult.Scan_Completed; - } - - /// - /// Initialize for an output processing pass. - /// - public void start_output_pass() - { - /* If multipass, check to see whether to use block smoothing on this pass */ - if (m_coef_arrays != null) - { - if (m_cinfo.m_do_block_smoothing && smoothing_ok()) - m_decompressor = DecompressorType.Smooth; - else - m_decompressor = DecompressorType.Ordinary; - } - - m_cinfo.m_output_iMCU_row = 0; - } - - public ReadResult decompress_data(ComponentBuffer[] output_buf) - { - switch (m_decompressor) - { - case DecompressorType.Ordinary: - return decompress_data_ordinary(output_buf); - - case DecompressorType.Smooth: - return decompress_smooth_data(output_buf); - - case DecompressorType.OnePass: - return decompress_onepass(output_buf); - } - - throw new Exception("Not implemented yet"); - } - - /* Pointer to array of coefficient virtual arrays, or null if none */ - public JpegVirtualArray[] GetCoefArrays() - { - return m_coef_arrays; - } - - /// - /// Decompress and return some data in the single-pass case. - /// Always attempts to emit one fully interleaved MCU row ("iMCU" row). - /// Input and output must run in lockstep since we have only a one-MCU buffer. - /// Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - /// - /// NB: output_buf contains a plane for each component in image, - /// which we index according to the component's SOF position. - /// - private ReadResult decompress_onepass(ComponentBuffer[] output_buf) - { - int last_MCU_col = m_cinfo.m_MCUs_per_row - 1; - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - - /* Loop to process as much as one whole iMCU row */ - for (int yoffset = m_MCU_vert_offset; yoffset < m_MCU_rows_per_iMCU_row; yoffset++) - { - for (int MCU_col_num = m_MCU_ctr; MCU_col_num <= last_MCU_col; MCU_col_num++) - { - /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ - for (int i = 0; i < m_cinfo.m_blocks_in_MCU; i++) - Array.Clear(m_MCU_buffer[i].data, 0, m_MCU_buffer[i].data.Length); - - if (!m_cinfo.m_entropy.decode_mcu(m_MCU_buffer)) - { - /* Suspension forced; update state counters and exit */ - m_MCU_vert_offset = yoffset; - m_MCU_ctr = MCU_col_num; - return ReadResult.Suspended; - } - - /* Determine where data should go in output_buf and do the IDCT thing. - * We skip dummy blocks at the right and bottom edges (but blkn gets - * incremented past them!). Note the inner loop relies on having - * allocated the MCU_buffer[] blocks sequentially. - */ - int blkn = 0; /* index of current DCT block within MCU */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - - /* Don't bother to IDCT an uninteresting component. */ - if (!componentInfo.component_needed) - { - blkn += componentInfo.MCU_blocks; - continue; - } - - int useful_width = (MCU_col_num < last_MCU_col) ? componentInfo.MCU_width : componentInfo.last_col_width; - int outputIndex = yoffset * componentInfo.DCT_scaled_size; - int start_col = MCU_col_num * componentInfo.MCU_sample_width; - for (int yindex = 0; yindex < componentInfo.MCU_height; yindex++) - { - if (m_cinfo.m_input_iMCU_row < last_iMCU_row || yoffset + yindex < componentInfo.last_row_height) - { - int output_col = start_col; - for (int xindex = 0; xindex < useful_width; xindex++) - { - m_cinfo.m_idct.inverse(componentInfo.Component_index, - m_MCU_buffer[blkn + xindex].data, output_buf[componentInfo.Component_index], - outputIndex, output_col); - - output_col += componentInfo.DCT_scaled_size; - } - } - - blkn += componentInfo.MCU_width; - outputIndex += componentInfo.DCT_scaled_size; - } - } - } - - /* Completed an MCU row, but perhaps not an iMCU row */ - m_MCU_ctr = 0; - } - - /* Completed the iMCU row, advance counters for next one */ - m_cinfo.m_output_iMCU_row++; - m_cinfo.m_input_iMCU_row++; - if (m_cinfo.m_input_iMCU_row < m_cinfo.m_total_iMCU_rows) - { - start_iMCU_row(); - return ReadResult.Row_Completed; - } - - /* Completed the scan */ - m_cinfo.m_inputctl.finish_input_pass(); - return ReadResult.Scan_Completed; - } - - /// - /// Decompress and return some data in the multi-pass case. - /// Always attempts to emit one fully interleaved MCU row ("iMCU" row). - /// Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - /// - /// NB: output_buf contains a plane for each component in image. - /// - private ReadResult decompress_data_ordinary(ComponentBuffer[] output_buf) - { - /* Force some input to be done if we are getting ahead of the input. */ - while (m_cinfo.m_input_scan_number < m_cinfo.m_output_scan_number || - (m_cinfo.m_input_scan_number == m_cinfo.m_output_scan_number && - m_cinfo.m_input_iMCU_row <= m_cinfo.m_output_iMCU_row)) - { - if (m_cinfo.m_inputctl.consume_input() == ReadResult.Suspended) - return ReadResult.Suspended; - } - - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - - /* OK, output from the virtual arrays. */ - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[ci]; - - /* Don't bother to IDCT an uninteresting component. */ - if (!componentInfo.component_needed) - continue; - - /* Align the virtual buffer for this component. */ - JpegBlock[][] buffer = m_whole_image[ci].Access(m_cinfo.m_output_iMCU_row * componentInfo.V_samp_factor, - componentInfo.V_samp_factor); - - /* Count non-dummy DCT block rows in this iMCU row. */ - int block_rows; - if (m_cinfo.m_output_iMCU_row < last_iMCU_row) - block_rows = componentInfo.V_samp_factor; - else - { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = componentInfo.height_in_blocks % componentInfo.V_samp_factor; - if (block_rows == 0) - block_rows = componentInfo.V_samp_factor; - } - - /* Loop over all DCT blocks to be processed. */ - int rowIndex = 0; - for (int block_row = 0; block_row < block_rows; block_row++) - { - int output_col = 0; - for (int block_num = 0; block_num < componentInfo.Width_in_blocks; block_num++) - { - m_cinfo.m_idct.inverse(componentInfo.Component_index, - buffer[block_row][block_num].data, output_buf[ci], rowIndex, output_col); - - output_col += componentInfo.DCT_scaled_size; - } - - rowIndex += componentInfo.DCT_scaled_size; - } - } - - m_cinfo.m_output_iMCU_row++; - if (m_cinfo.m_output_iMCU_row < m_cinfo.m_total_iMCU_rows) - return ReadResult.Row_Completed; - - return ReadResult.Scan_Completed; - } - - /// - /// Variant of decompress_data for use when doing block smoothing. - /// - private ReadResult decompress_smooth_data(ComponentBuffer[] output_buf) - { - /* Force some input to be done if we are getting ahead of the input. */ - while (m_cinfo.m_input_scan_number <= m_cinfo.m_output_scan_number && !m_cinfo.m_inputctl.EOIReached()) - { - if (m_cinfo.m_input_scan_number == m_cinfo.m_output_scan_number) - { - /* If input is working on current scan, we ordinarily want it to - * have completed the current row. But if input scan is DC, - * we want it to keep one row ahead so that next block row's DC - * values are up to date. - */ - int delta = (m_cinfo.m_Ss == 0) ? 1 : 0; - if (m_cinfo.m_input_iMCU_row > m_cinfo.m_output_iMCU_row + delta) - break; - } - - if (m_cinfo.m_inputctl.consume_input() == ReadResult.Suspended) - return ReadResult.Suspended; - } - - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - - /* OK, output from the virtual arrays. */ - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[ci]; - - /* Don't bother to IDCT an uninteresting component. */ - if (!componentInfo.component_needed) - continue; - - int block_rows; - int access_rows; - bool last_row; - /* Count non-dummy DCT block rows in this iMCU row. */ - if (m_cinfo.m_output_iMCU_row < last_iMCU_row) - { - block_rows = componentInfo.V_samp_factor; - access_rows = block_rows * 2; /* this and next iMCU row */ - last_row = false; - } - else - { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = componentInfo.height_in_blocks % componentInfo.V_samp_factor; - if (block_rows == 0) - block_rows = componentInfo.V_samp_factor; - access_rows = block_rows; /* this iMCU row only */ - last_row = true; - } - - /* Align the virtual buffer for this component. */ - JpegBlock[][] buffer = null; - bool first_row; - int bufferRowOffset = 0; - if (m_cinfo.m_output_iMCU_row > 0) - { - access_rows += componentInfo.V_samp_factor; /* prior iMCU row too */ - buffer = m_whole_image[ci].Access((m_cinfo.m_output_iMCU_row - 1) * componentInfo.V_samp_factor, access_rows); - bufferRowOffset = componentInfo.V_samp_factor; /* point to current iMCU row */ - first_row = false; - } - else - { - buffer = m_whole_image[ci].Access(0, access_rows); - first_row = true; - } - - /* Fetch component-dependent info */ - int coefBitsOffset = ci * SAVED_COEFS; - int Q00 = componentInfo.quant_table.quantval[0]; - int Q01 = componentInfo.quant_table.quantval[Q01_POS]; - int Q10 = componentInfo.quant_table.quantval[Q10_POS]; - int Q20 = componentInfo.quant_table.quantval[Q20_POS]; - int Q11 = componentInfo.quant_table.quantval[Q11_POS]; - int Q02 = componentInfo.quant_table.quantval[Q02_POS]; - int outputIndex = ci; - - /* Loop over all DCT blocks to be processed. */ - for (int block_row = 0; block_row < block_rows; block_row++) - { - int bufferIndex = bufferRowOffset + block_row; - - int prev_block_row = 0; - if (first_row && block_row == 0) - prev_block_row = bufferIndex; - else - prev_block_row = bufferIndex - 1; - - int next_block_row = 0; - if (last_row && block_row == block_rows - 1) - next_block_row = bufferIndex; - else - next_block_row = bufferIndex + 1; - - /* We fetch the surrounding DC values using a sliding-register approach. - * Initialize all nine here so as to do the right thing on narrow pics. - */ - int DC1 = buffer[prev_block_row][0][0]; - int DC2 = DC1; - int DC3 = DC1; - - int DC4 = buffer[bufferIndex][0][0]; - int DC5 = DC4; - int DC6 = DC4; - - int DC7 = buffer[next_block_row][0][0]; - int DC8 = DC7; - int DC9 = DC7; - - int output_col = 0; - int last_block_column = componentInfo.Width_in_blocks - 1; - for (int block_num = 0; block_num <= last_block_column; block_num++) - { - /* Fetch current DCT block into workspace so we can modify it. */ - JpegBlock workspace = new JpegBlock(); - Buffer.BlockCopy(buffer[bufferIndex][0].data, 0, workspace.data, 0, workspace.data.Length * sizeof(short)); - - /* Update DC values */ - if (block_num < last_block_column) - { - DC3 = buffer[prev_block_row][1][0]; - DC6 = buffer[bufferIndex][1][0]; - DC9 = buffer[next_block_row][1][0]; - } - - /* Compute coefficient estimates per K.8. - * An estimate is applied only if coefficient is still zero, - * and is not known to be fully accurate. - */ - /* AC01 */ - int Al = m_coef_bits_latch[m_coef_bits_savedOffset + coefBitsOffset + 1]; - if (Al != 0 && workspace[1] == 0) - { - int pred; - int num = 36 * Q00 * (DC4 - DC6); - if (num >= 0) - { - pred = ((Q01 << 7) + num) / (Q01 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - } - else - { - pred = ((Q01 << 7) - num) / (Q01 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - pred = -pred; - } - workspace[1] = (short)pred; - } - - /* AC10 */ - Al = m_coef_bits_latch[m_coef_bits_savedOffset + coefBitsOffset + 2]; - if (Al != 0 && workspace[8] == 0) - { - int pred; - int num = 36 * Q00 * (DC2 - DC8); - if (num >= 0) - { - pred = ((Q10 << 7) + num) / (Q10 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - } - else - { - pred = ((Q10 << 7) - num) / (Q10 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - pred = -pred; - } - workspace[8] = (short)pred; - } - - /* AC20 */ - Al = m_coef_bits_latch[m_coef_bits_savedOffset + coefBitsOffset + 3]; - if (Al != 0 && workspace[16] == 0) - { - int pred; - int num = 9 * Q00 * (DC2 + DC8 - 2 * DC5); - if (num >= 0) - { - pred = ((Q20 << 7) + num) / (Q20 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - } - else - { - pred = ((Q20 << 7) - num) / (Q20 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - pred = -pred; - } - workspace[16] = (short)pred; - } - - /* AC11 */ - Al = m_coef_bits_latch[m_coef_bits_savedOffset + coefBitsOffset + 4]; - if (Al != 0 && workspace[9] == 0) - { - int pred; - int num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9); - if (num >= 0) - { - pred = ((Q11 << 7) + num) / (Q11 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - } - else - { - pred = ((Q11 << 7) - num) / (Q11 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - pred = -pred; - } - workspace[9] = (short)pred; - } - - /* AC02 */ - Al = m_coef_bits_latch[m_coef_bits_savedOffset + coefBitsOffset + 5]; - if (Al != 0 && workspace[2] == 0) - { - int pred; - int num = 9 * Q00 * (DC4 + DC6 - 2 * DC5); - if (num >= 0) - { - pred = ((Q02 << 7) + num) / (Q02 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - } - else - { - pred = ((Q02 << 7) - num) / (Q02 << 8); - if (Al > 0 && pred >= (1 << Al)) - pred = (1 << Al) - 1; - pred = -pred; - } - workspace[2] = (short)pred; - } - - /* OK, do the IDCT */ - m_cinfo.m_idct.inverse(componentInfo.Component_index, workspace.data, output_buf[outputIndex], 0, output_col); - - /* Advance for next column */ - DC1 = DC2; - DC2 = DC3; - DC4 = DC5; - DC5 = DC6; - DC7 = DC8; - DC8 = DC9; - - bufferIndex++; - prev_block_row++; - next_block_row++; - - output_col += componentInfo.DCT_scaled_size; - } - - outputIndex += componentInfo.DCT_scaled_size; - } - } - - m_cinfo.m_output_iMCU_row++; - if (m_cinfo.m_output_iMCU_row < m_cinfo.m_total_iMCU_rows) - return ReadResult.Row_Completed; - - return ReadResult.Scan_Completed; - } - - /// - /// Determine whether block smoothing is applicable and safe. - /// We also latch the current states of the coef_bits[] entries for the - /// AC coefficients; otherwise, if the input side of the decompressor - /// advances into a new scan, we might think the coefficients are known - /// more accurately than they really are. - /// - private bool smoothing_ok() - { - if (!m_cinfo.m_progressive_mode || m_cinfo.m_coef_bits == null) - return false; - - /* Allocate latch area if not already done */ - if (m_coef_bits_latch == null) - { - m_coef_bits_latch = new int[m_cinfo.m_num_components * SAVED_COEFS]; - m_coef_bits_savedOffset = 0; - } - - bool smoothing_useful = false; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - /* All components' quantization values must already be latched. */ - JpegQuantizationTable qtable = m_cinfo.Comp_info[ci].quant_table; - if (qtable == null) - return false; - - /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ - if (qtable.quantval[0] == 0 || qtable.quantval[Q01_POS] == 0 || - qtable.quantval[Q10_POS] == 0 || qtable.quantval[Q20_POS] == 0 || - qtable.quantval[Q11_POS] == 0 || qtable.quantval[Q02_POS] == 0) - { - return false; - } - - /* DC values must be at least partly known for all components. */ - if (m_cinfo.m_coef_bits[ci][0] < 0) - return false; - - /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ - for (int coefi = 1; coefi <= 5; coefi++) - { - m_coef_bits_latch[m_coef_bits_savedOffset + coefi] = m_cinfo.m_coef_bits[ci][coefi]; - if (m_cinfo.m_coef_bits[ci][coefi] != 0) - smoothing_useful = true; - } - - m_coef_bits_savedOffset += SAVED_COEFS; - } - - return smoothing_useful; - } - - /// - /// Reset within-iMCU-row counters for a new row (input side) - /// - private void start_iMCU_row() - { - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (m_cinfo.m_comps_in_scan > 1) - { - m_MCU_rows_per_iMCU_row = 1; - } - else - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[0]]; - - if (m_cinfo.m_input_iMCU_row < (m_cinfo.m_total_iMCU_rows - 1)) - m_MCU_rows_per_iMCU_row = componentInfo.V_samp_factor; - else - m_MCU_rows_per_iMCU_row = componentInfo.last_row_height; - } - - m_MCU_ctr = 0; - m_MCU_vert_offset = 0; - } - } - #endregion - - #region JpegDecompressorMainController - /// - /// Main buffer control (downsampled-data buffer) - /// - /// In the current system design, the main buffer need never be a full-image - /// buffer; any full-height buffers will be found inside the coefficient or - /// postprocessing controllers. Nonetheless, the main controller is not - /// trivial. Its responsibility is to provide context rows for upsampling/ - /// rescaling, and doing this in an efficient fashion is a bit tricky. - /// - /// Postprocessor input data is counted in "row groups". A row group - /// is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) - /// sample rows of each component. (We require DCT_scaled_size values to be - /// chosen such that these numbers are integers. In practice DCT_scaled_size - /// values will likely be powers of two, so we actually have the stronger - /// condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) - /// Upsampling will typically produce max_v_samp_factor pixel rows from each - /// row group (times any additional scale factor that the upsampler is - /// applying). - /// - /// The coefficient controller will deliver data to us one iMCU row at a time; - /// each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or - /// exactly min_DCT_scaled_size row groups. (This amount of data corresponds - /// to one row of MCUs when the image is fully interleaved.) Note that the - /// number of sample rows varies across components, but the number of row - /// groups does not. Some garbage sample rows may be included in the last iMCU - /// row at the bottom of the image. - /// - /// Depending on the vertical scaling algorithm used, the upsampler may need - /// access to the sample row(s) above and below its current input row group. - /// The upsampler is required to set need_context_rows true at global selection - /// time if so. When need_context_rows is false, this controller can simply - /// obtain one iMCU row at a time from the coefficient controller and dole it - /// out as row groups to the postprocessor. - /// - /// When need_context_rows is true, this controller guarantees that the buffer - /// passed to postprocessing contains at least one row group's worth of samples - /// above and below the row group(s) being processed. Note that the context - /// rows "above" the first passed row group appear at negative row offsets in - /// the passed buffer. At the top and bottom of the image, the required - /// context rows are manufactured by duplicating the first or last real sample - /// row; this avoids having special cases in the upsampling inner loops. - /// - /// The amount of context is fixed at one row group just because that's a - /// convenient number for this controller to work with. The existing - /// upsamplers really only need one sample row of context. An upsampler - /// supporting arbitrary output rescaling might wish for more than one row - /// group of context when shrinking the image; tough, we don't handle that. - /// (This is justified by the assumption that downsizing will be handled mostly - /// by adjusting the DCT_scaled_size values, so that the actual scale factor at - /// the upsample step needn't be much less than one.) - /// - /// To provide the desired context, we have to retain the last two row groups - /// of one iMCU row while reading in the next iMCU row. (The last row group - /// can't be processed until we have another row group for its below-context, - /// and so we have to save the next-to-last group too for its above-context.) - /// We could do this most simply by copying data around in our buffer, but - /// that'd be very slow. We can avoid copying any data by creating a rather - /// strange pointer structure. Here's how it works. We allocate a workspace - /// consisting of M+2 row groups (where M = min_DCT_scaled_size is the number - /// of row groups per iMCU row). We create two sets of redundant pointers to - /// the workspace. Labeling the physical row groups 0 to M+1, the synthesized - /// pointer lists look like this: - /// M+1 M-1 - /// master pointer --> 0 master pointer --> 0 - /// 1 1 - /// ... ... - /// M-3 M-3 - /// M-2 M - /// M-1 M+1 - /// M M-2 - /// M+1 M-1 - /// 0 0 - /// We read alternate iMCU rows using each master pointer; thus the last two - /// row groups of the previous iMCU row remain un-overwritten in the workspace. - /// The pointer lists are set up so that the required context rows appear to - /// be adjacent to the proper places when we pass the pointer lists to the - /// upsampler. - /// - /// The above pictures describe the normal state of the pointer lists. - /// At top and bottom of the image, we diddle the pointer lists to duplicate - /// the first or last sample row as necessary (this is cheaper than copying - /// sample rows around). - /// - /// This scheme breaks down if M less than 2, ie, min_DCT_scaled_size is 1. In that - /// situation each iMCU row provides only one row group so the buffering logic - /// must be different (eg, we must read two iMCU rows before we can emit the - /// first row group). For now, we simply do not support providing context - /// rows when min_DCT_scaled_size is 1. That combination seems unlikely to - /// be worth providing --- if someone wants a 1/8th-size preview, they probably - /// want it quick and dirty, so a context-free upsampler is sufficient. - /// - class JpegDecompressorMainController - { - private enum DataProcessor - { - context_main, - simple_main, - crank_post - } - - /* context_state values: */ - private const int CTX_PREPARE_FOR_IMCU = 0; /* need to prepare for MCU row */ - private const int CTX_PROCESS_IMCU = 1; /* feeding iMCU to postprocessor */ - private const int CTX_POSTPONED_ROW = 2; /* feeding postponed row group */ - - private DataProcessor m_dataProcessor; - private JpegDecompressor m_cinfo; - - /* Pointer to allocated workspace (M or M+2 row groups). */ - private byte[][][] m_buffer = new byte[JpegConstants.MaxComponents][][]; - - private bool m_buffer_full; /* Have we gotten an iMCU row from decoder? */ - private int m_rowgroup_ctr; /* counts row groups output to postprocessor */ - - /* Remaining fields are only used in the context case. */ - - private int[][][] m_funnyIndices = new int[2][][] { new int[JpegConstants.MaxComponents][], new int[JpegConstants.MaxComponents][] }; - private int[] m_funnyOffsets = new int[JpegConstants.MaxComponents]; - private int m_whichFunny; /* indicates which funny indices set is now in use */ - - private int m_context_state; /* process_data state machine status */ - private int m_rowgroups_avail; /* row groups available to postprocessor */ - private int m_iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ - - public JpegDecompressorMainController(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - /* Allocate the workspace. - * ngroups is the number of row groups we need. - */ - int ngroups = cinfo.m_min_DCT_scaled_size; - if (cinfo.m_upsample.NeedContextRows()) - { - if (cinfo.m_min_DCT_scaled_size < 2) /* unsupported, see comments above */ - throw new Exception("Not implemented yet"); - - alloc_funny_pointers(); /* Alloc space for xbuffer[] lists */ - ngroups = cinfo.m_min_DCT_scaled_size + 2; - } - - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - /* height of a row group of component */ - int rgroup = (cinfo.Comp_info[ci].V_samp_factor * cinfo.Comp_info[ci].DCT_scaled_size) / cinfo.m_min_DCT_scaled_size; - - m_buffer[ci] = JpegCommonBase.AllocJpegSamples( - cinfo.Comp_info[ci].Width_in_blocks * cinfo.Comp_info[ci].DCT_scaled_size, - rgroup * ngroups); - } - } - - /// - /// Initialize for a processing pass. - /// - public void start_pass(BufferMode pass_mode) - { - switch (pass_mode) - { - case BufferMode.PassThru: - if (m_cinfo.m_upsample.NeedContextRows()) - { - m_dataProcessor = DataProcessor.context_main; - make_funny_pointers(); /* Create the xbuffer[] lists */ - m_whichFunny = 0; /* Read first iMCU row into xbuffer[0] */ - m_context_state = CTX_PREPARE_FOR_IMCU; - m_iMCU_row_ctr = 0; - } - else - { - /* Simple case with no context needed */ - m_dataProcessor = DataProcessor.simple_main; - } - m_buffer_full = false; /* Mark buffer empty */ - m_rowgroup_ctr = 0; - break; - case BufferMode.CrankDest: - /* For last pass of 2-pass quantization, just crank the postprocessor */ - m_dataProcessor = DataProcessor.crank_post; - break; - default: - throw new Exception("Bogus buffer control mode"); - } - } - - public void process_data(byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - switch (m_dataProcessor) - { - case DataProcessor.simple_main: - process_data_simple_main(output_buf, ref out_row_ctr, out_rows_avail); - break; - - case DataProcessor.context_main: - process_data_context_main(output_buf, ref out_row_ctr, out_rows_avail); - break; - - case DataProcessor.crank_post: - process_data_crank_post(output_buf, ref out_row_ctr, out_rows_avail); - break; - - default: - throw new Exception("Not implemented yet"); - } - } - - /// - /// Process some data. - /// This handles the simple case where no context is required. - /// - private void process_data_simple_main(byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - ComponentBuffer[] cb = new ComponentBuffer[JpegConstants.MaxComponents]; - for (int i = 0; i < JpegConstants.MaxComponents; i++) - { - cb[i] = new ComponentBuffer(); - cb[i].SetBuffer(m_buffer[i], null, 0); - } - - /* Read input data if we haven't filled the main buffer yet */ - if (!m_buffer_full) - { - if (m_cinfo.m_coef.decompress_data(cb) == ReadResult.Suspended) - { - /* suspension forced, can do nothing more */ - return; - } - - /* OK, we have an iMCU row to work with */ - m_buffer_full = true; - } - - /* There are always min_DCT_scaled_size row groups in an iMCU row. */ - int rowgroups_avail = m_cinfo.m_min_DCT_scaled_size; - - /* Note: at the bottom of the image, we may pass extra garbage row groups - * to the postprocessor. The postprocessor has to check for bottom - * of image anyway (at row resolution), so no point in us doing it too. - */ - - /* Feed the postprocessor */ - m_cinfo.m_post.post_process_data(cb, ref m_rowgroup_ctr, rowgroups_avail, output_buf, ref out_row_ctr, out_rows_avail); - - /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ - if (m_rowgroup_ctr >= rowgroups_avail) - { - m_buffer_full = false; - m_rowgroup_ctr = 0; - } - } - - /// - /// Process some data. - /// This handles the case where context rows must be provided. - /// - private void process_data_context_main(byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - ComponentBuffer[] cb = new ComponentBuffer[m_cinfo.m_num_components]; - for (int i = 0; i < m_cinfo.m_num_components; i++) - { - cb[i] = new ComponentBuffer(); - cb[i].SetBuffer(m_buffer[i], m_funnyIndices[m_whichFunny][i], m_funnyOffsets[i]); - } - - /* Read input data if we haven't filled the main buffer yet */ - if (!m_buffer_full) - { - if (m_cinfo.m_coef.decompress_data(cb) == ReadResult.Suspended) - { - /* suspension forced, can do nothing more */ - return; - } - - /* OK, we have an iMCU row to work with */ - m_buffer_full = true; - - /* count rows received */ - m_iMCU_row_ctr++; - } - - /* Postprocessor typically will not swallow all the input data it is handed - * in one call (due to filling the output buffer first). Must be prepared - * to exit and restart. - - - This switch lets us keep track of how far we got. - * Note that each case falls through to the next on successful completion. - */ - if (m_context_state == CTX_POSTPONED_ROW) - { - /* Call postprocessor using previously set pointers for postponed row */ - m_cinfo.m_post.post_process_data(cb, ref m_rowgroup_ctr, - m_rowgroups_avail, output_buf, ref out_row_ctr, out_rows_avail); - - if (m_rowgroup_ctr < m_rowgroups_avail) - { - /* Need to suspend */ - return; - } - - m_context_state = CTX_PREPARE_FOR_IMCU; - - if (out_row_ctr >= out_rows_avail) - { - /* Postprocessor exactly filled output buf */ - return; - } - } - - if (m_context_state == CTX_PREPARE_FOR_IMCU) - { - /* Prepare to process first M-1 row groups of this iMCU row */ - m_rowgroup_ctr = 0; - m_rowgroups_avail = m_cinfo.m_min_DCT_scaled_size - 1; - - /* Check for bottom of image: if so, tweak pointers to "duplicate" - * the last sample row, and adjust rowgroups_avail to ignore padding rows. - */ - if (m_iMCU_row_ctr == m_cinfo.m_total_iMCU_rows) - set_bottom_pointers(); - - m_context_state = CTX_PROCESS_IMCU; - } - - if (m_context_state == CTX_PROCESS_IMCU) - { - /* Call postprocessor using previously set pointers */ - m_cinfo.m_post.post_process_data(cb, ref m_rowgroup_ctr, - m_rowgroups_avail, output_buf, ref out_row_ctr, out_rows_avail); - - if (m_rowgroup_ctr < m_rowgroups_avail) - { - /* Need to suspend */ - return; - } - - /* After the first iMCU, change wraparound pointers to normal state */ - if (m_iMCU_row_ctr == 1) - set_wraparound_pointers(); - - /* Prepare to load new iMCU row using other xbuffer list */ - m_whichFunny ^= 1; /* 0=>1 or 1=>0 */ - m_buffer_full = false; - - /* Still need to process last row group of this iMCU row, */ - /* which is saved at index M+1 of the other xbuffer */ - m_rowgroup_ctr = m_cinfo.m_min_DCT_scaled_size + 1; - m_rowgroups_avail = m_cinfo.m_min_DCT_scaled_size + 2; - m_context_state = CTX_POSTPONED_ROW; - } - } - - /// - /// Process some data. - /// Final pass of two-pass quantization: just call the postprocessor. - /// Source data will be the postprocessor controller's internal buffer. - /// - private void process_data_crank_post(byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - int dummy = 0; - m_cinfo.m_post.post_process_data(null, ref dummy, 0, output_buf, ref out_row_ctr, out_rows_avail); - } - - /// - /// Allocate space for the funny pointer lists. - /// This is done only once, not once per pass. - /// - private void alloc_funny_pointers() - { - int M = m_cinfo.m_min_DCT_scaled_size; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - /* height of a row group of component */ - int rgroup = (m_cinfo.Comp_info[ci].V_samp_factor * m_cinfo.Comp_info[ci].DCT_scaled_size) / m_cinfo.m_min_DCT_scaled_size; - - /* Get space for pointer lists --- M+4 row groups in each list. - */ - m_funnyIndices[0][ci] = new int[rgroup * (M + 4)]; - m_funnyIndices[1][ci] = new int[rgroup * (M + 4)]; - m_funnyOffsets[ci] = rgroup; - } - } - - /// - /// Create the funny pointer lists discussed in the comments above. - /// The actual workspace is already allocated (in main.buffer), - /// and the space for the pointer lists is allocated too. - /// This routine just fills in the curiously ordered lists. - /// This will be repeated at the beginning of each pass. - /// - private void make_funny_pointers() - { - int M = m_cinfo.m_min_DCT_scaled_size; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - /* height of a row group of component */ - int rgroup = (m_cinfo.Comp_info[ci].V_samp_factor * m_cinfo.Comp_info[ci].DCT_scaled_size) / m_cinfo.m_min_DCT_scaled_size; - - int[] ind0 = m_funnyIndices[0][ci]; - int[] ind1 = m_funnyIndices[1][ci]; - - /* First copy the workspace pointers as-is */ - for (int i = 0; i < rgroup * (M + 2); i++) - { - ind0[i + rgroup] = i; - ind1[i + rgroup] = i; - } - - /* In the second list, put the last four row groups in swapped order */ - for (int i = 0; i < rgroup * 2; i++) - { - ind1[rgroup * (M - 1) + i] = rgroup * M + i; - ind1[rgroup * (M + 1) + i] = rgroup * (M - 2) + i; - } - - /* The wraparound pointers at top and bottom will be filled later - * (see set_wraparound_pointers, below). Initially we want the "above" - * pointers to duplicate the first actual data line. This only needs - * to happen in xbuffer[0]. - */ - for (int i = 0; i < rgroup; i++) - ind0[i] = ind0[rgroup]; - } - } - - /// - /// Set up the "wraparound" pointers at top and bottom of the pointer lists. - /// This changes the pointer list state from top-of-image to the normal state. - /// - private void set_wraparound_pointers() - { - int M = m_cinfo.m_min_DCT_scaled_size; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - /* height of a row group of component */ - int rgroup = (m_cinfo.Comp_info[ci].V_samp_factor * m_cinfo.Comp_info[ci].DCT_scaled_size) / m_cinfo.m_min_DCT_scaled_size; - - int[] ind0 = m_funnyIndices[0][ci]; - int[] ind1 = m_funnyIndices[1][ci]; - - for (int i = 0; i < rgroup; i++) - { - ind0[i] = ind0[rgroup * (M + 2) + i]; - ind1[i] = ind1[rgroup * (M + 2) + i]; - - ind0[rgroup * (M + 3) + i] = ind0[i + rgroup]; - ind1[rgroup * (M + 3) + i] = ind1[i + rgroup]; - } - } - } - - /// - /// Change the pointer lists to duplicate the last sample row at the bottom - /// of the image. m_whichFunny indicates which m_funnyIndices holds the final iMCU row. - /// Also sets rowgroups_avail to indicate number of nondummy row groups in row. - /// - private void set_bottom_pointers() - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - /* Count sample rows in one iMCU row and in one row group */ - int iMCUheight = m_cinfo.Comp_info[ci].V_samp_factor * m_cinfo.Comp_info[ci].DCT_scaled_size; - int rgroup = iMCUheight / m_cinfo.m_min_DCT_scaled_size; - - /* Count nondummy sample rows remaining for this component */ - int rows_left = m_cinfo.Comp_info[ci].downsampled_height % iMCUheight; - if (rows_left == 0) - rows_left = iMCUheight; - - /* Count nondummy row groups. Should get same answer for each component, - * so we need only do it once. - */ - if (ci == 0) - m_rowgroups_avail = (rows_left - 1) / rgroup + 1; - - /* Duplicate the last real sample row rgroup*2 times; this pads out the - * last partial rowgroup and ensures at least one full rowgroup of context. - */ - for (int i = 0; i < rgroup * 2; i++) - m_funnyIndices[m_whichFunny][ci][rows_left + i + rgroup] = m_funnyIndices[m_whichFunny][ci][rows_left - 1 + rgroup]; - } - } - } - #endregion - - #region JpegDecompressorMaster - /// - /// Master control module - /// - class JpegDecompressorMaster - { - private JpegDecompressor m_cinfo; - - private int m_pass_number; /* # of passes completed */ - private bool m_is_dummy_pass; /* True during 1st pass for 2-pass quant */ - - private bool m_using_merged_upsample; /* true if using merged upsample/cconvert */ - - /* Saved references to initialized quantizer modules, - * in case we need to switch modes. - */ - private ColorQuantizer m_quantizer_1pass; - private ColorQuantizer m_quantizer_2pass; - - public JpegDecompressorMaster(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - master_selection(); - } - - /// - /// Per-pass setup. - /// This is called at the beginning of each output pass. We determine which - /// modules will be active during this pass and give them appropriate - /// start_pass calls. We also set is_dummy_pass to indicate whether this - /// is a "real" output pass or a dummy pass for color quantization. - /// (In the latter case, we will crank the pass to completion.) - /// - public void prepare_for_output_pass() - { - if (m_is_dummy_pass) - { - /* Final pass of 2-pass quantization */ - m_is_dummy_pass = false; - m_cinfo.m_cquantize.start_pass(false); - m_cinfo.m_post.start_pass(BufferMode.CrankDest); - m_cinfo.m_main.start_pass(BufferMode.CrankDest); - } - else - { - if (m_cinfo.m_quantize_colors && m_cinfo.m_colormap == null) - { - /* Select new quantization method */ - if (m_cinfo.m_two_pass_quantize && m_cinfo.m_enable_2pass_quant) - { - m_cinfo.m_cquantize = m_quantizer_2pass; - m_is_dummy_pass = true; - } - else if (m_cinfo.m_enable_1pass_quant) - m_cinfo.m_cquantize = m_quantizer_1pass; - else - throw new Exception("Invalid color quantization mode change"); - } - - m_cinfo.m_idct.start_pass(); - m_cinfo.m_coef.start_output_pass(); - - if (!m_cinfo.m_raw_data_out) - { - m_cinfo.m_upsample.start_pass(); - - if (m_cinfo.m_quantize_colors) - m_cinfo.m_cquantize.start_pass(m_is_dummy_pass); - - m_cinfo.m_post.start_pass((m_is_dummy_pass ? BufferMode.SaveAndPass : BufferMode.PassThru)); - m_cinfo.m_main.start_pass(BufferMode.PassThru); - } - } - } - - /// - /// Finish up at end of an output pass. - /// - public void finish_output_pass() - { - if (m_cinfo.m_quantize_colors) - m_cinfo.m_cquantize.finish_pass(); - - m_pass_number++; - } - - public bool IsDummyPass() - { - return m_is_dummy_pass; - } - - /// - /// Master selection of decompression modules. - /// This is done once at jpeg_start_decompress time. We determine - /// which modules will be used and give them appropriate initialization calls. - /// We also initialize the decompressor input side to begin consuming data. - /// - /// Since jpeg_read_header has finished, we know what is in the SOF - /// and (first) SOS markers. We also have all the application parameter - /// settings. - /// - private void master_selection() - { - /* Initialize dimensions and other stuff */ - m_cinfo.jpeg_calc_output_dimensions(); - prepare_range_limit_table(); - - /* Width of an output scanline must be representable as int. */ - long samplesperrow = m_cinfo.m_output_width * m_cinfo.m_out_color_components; - int jd_samplesperrow = (int)samplesperrow; - if ((long)jd_samplesperrow != samplesperrow) - throw new Exception("Image too wide for this implementation"); - - /* Initialize my private state */ - m_pass_number = 0; - m_using_merged_upsample = m_cinfo.use_merged_upsample(); - - /* Color quantizer selection */ - m_quantizer_1pass = null; - m_quantizer_2pass = null; - - /* No mode changes if not using buffered-image mode. */ - if (!m_cinfo.m_quantize_colors || !m_cinfo.m_buffered_image) - { - m_cinfo.m_enable_1pass_quant = false; - m_cinfo.m_enable_external_quant = false; - m_cinfo.m_enable_2pass_quant = false; - } - - if (m_cinfo.m_quantize_colors) - { - if (m_cinfo.m_raw_data_out) - throw new Exception("Not implemented yet"); - - /* 2-pass quantizer only works in 3-component color space. */ - if (m_cinfo.m_out_color_components != 3) - { - m_cinfo.m_enable_1pass_quant = true; - m_cinfo.m_enable_external_quant = false; - m_cinfo.m_enable_2pass_quant = false; - m_cinfo.m_colormap = null; - } - else if (m_cinfo.m_colormap != null) - m_cinfo.m_enable_external_quant = true; - else if (m_cinfo.m_two_pass_quantize) - m_cinfo.m_enable_2pass_quant = true; - else - m_cinfo.m_enable_1pass_quant = true; - - if (m_cinfo.m_enable_1pass_quant) - { - m_cinfo.m_cquantize = new Pass1ColorQuantizer(m_cinfo); - m_quantizer_1pass = m_cinfo.m_cquantize; - } - - /* We use the 2-pass code to map to external colormaps. */ - if (m_cinfo.m_enable_2pass_quant || m_cinfo.m_enable_external_quant) - { - m_cinfo.m_cquantize = new Pass2ColorQuantizer(m_cinfo); - m_quantizer_2pass = m_cinfo.m_cquantize; - } - /* If both quantizers are initialized, the 2-pass one is left active; - * this is necessary for starting with quantization to an external map. - */ - } - - /* Post-processing: in particular, color conversion first */ - if (!m_cinfo.m_raw_data_out) - { - if (m_using_merged_upsample) - { - /* does color conversion too */ - m_cinfo.m_upsample = new MergedUpsampler(m_cinfo); - } - else - { - m_cinfo.m_cconvert = new ColorDeconverter(m_cinfo); - m_cinfo.m_upsample = new UpsamplerImpl(m_cinfo); - } - - m_cinfo.m_post = new JpegDecompressorPostController(m_cinfo, m_cinfo.m_enable_2pass_quant); - } - - /* Inverse DCT */ - m_cinfo.m_idct = new JpegInverseDCT(m_cinfo); - - if (m_cinfo.m_progressive_mode) - m_cinfo.m_entropy = new ProgressiveHuffmanDecoder(m_cinfo); - else - m_cinfo.m_entropy = new HuffEntropyDecoder(m_cinfo); - - /* Initialize principal buffer controllers. */ - bool use_c_buffer = m_cinfo.m_inputctl.HasMultipleScans() || m_cinfo.m_buffered_image; - m_cinfo.m_coef = new JpegDecompressorCoefController(m_cinfo, use_c_buffer); - - if (!m_cinfo.m_raw_data_out) - m_cinfo.m_main = new JpegDecompressorMainController(m_cinfo); - - /* Initialize input side of decompressor to consume first scan. */ - m_cinfo.m_inputctl.start_input_pass(); - } - - /// - /// Allocate and fill in the sample_range_limit table. - /// - /// Several decompression processes need to range-limit values to the range - /// 0..MaxSampleValue; the input value may fall somewhat outside this range - /// due to noise introduced by quantization, roundoff error, etc. These - /// processes are inner loops and need to be as fast as possible. On most - /// machines, particularly CPUs with pipelines or instruction prefetch, - /// a (subscript-check-less) C table lookup - /// x = sample_range_limit[x]; - /// is faster than explicit tests - /// - /// if (x & 0) - /// x = 0; - /// else if (x > MaxSampleValue) - /// x = MaxSampleValue; - /// - /// These processes all use a common table prepared by the routine below. - /// - /// For most steps we can mathematically guarantee that the initial value - /// of x is within MaxSampleValue + 1 of the legal range, so a table running from - /// -(MaxSampleValue + 1) to 2 * MaxSampleValue + 1 is sufficient. But for the initial - /// limiting step (just after the IDCT), a wildly out-of-range value is - /// possible if the input data is corrupt. To avoid any chance of indexing - /// off the end of memory and getting a bad-pointer trap, we perform the - /// post-IDCT limiting thus: x = range_limit[x & Mask]; - /// where Mask is 2 bits wider than legal sample data, ie 10 bits for 8-bit - /// samples. Under normal circumstances this is more than enough range and - /// a correct output will be generated; with bogus input data the mask will - /// cause wraparound, and we will safely generate a bogus-but-in-range output. - /// For the post-IDCT step, we want to convert the data from signed to unsigned - /// representation by adding MediumSampleValue at the same time that we limit it. - /// So the post-IDCT limiting table ends up looking like this: - ///
-        ///     MediumSampleValue, MediumSampleValue + 1, ..., MaxSampleValue,
-        ///     MaxSampleValue (repeat 2 * (MaxSampleValue + 1) - MediumSampleValue times),
-        ///     0          (repeat 2 * (MaxSampleValue + 1) - MediumSampleValue times),
-        ///     0, 1, ..., MediumSampleValue - 1
-        /// 
- /// Negative inputs select values from the upper half of the table after - /// masking. - /// - /// We can save some space by overlapping the start of the post-IDCT table - /// with the simpler range limiting table. The post-IDCT table begins at - /// sample_range_limit + MediumSampleValue. - /// - /// Note that the table is allocated in near data space on PCs; it's small - /// enough and used often enough to justify this. - ///
- private void prepare_range_limit_table() - { - byte[] table = new byte[5 * (JpegConstants.MaxSampleValue + 1) + JpegConstants.MediumSampleValue]; - - /* allow negative subscripts of simple table */ - int tableOffset = JpegConstants.MaxSampleValue + 1; - m_cinfo.m_sample_range_limit = table; - m_cinfo.m_sampleRangeLimitOffset = tableOffset; - - /* First segment of "simple" table: limit[x] = 0 for x < 0 */ - Array.Clear(table, 0, JpegConstants.MaxSampleValue + 1); - - /* Main part of "simple" table: limit[x] = x */ - for (int i = 0; i <= JpegConstants.MaxSampleValue; i++) - table[tableOffset + i] = (byte)i; - - tableOffset += JpegConstants.MediumSampleValue; /* Point to where post-IDCT table starts */ - - /* End of simple table, rest of first half of post-IDCT table */ - for (int i = JpegConstants.MediumSampleValue; i < 2 * (JpegConstants.MaxSampleValue + 1); i++) - table[tableOffset + i] = JpegConstants.MaxSampleValue; - - /* Second half of post-IDCT table */ - Array.Clear(table, tableOffset + 2 * (JpegConstants.MaxSampleValue + 1), - 2 * (JpegConstants.MaxSampleValue + 1) - JpegConstants.MediumSampleValue); - - Buffer.BlockCopy(m_cinfo.m_sample_range_limit, 0, table, - tableOffset + 4 * (JpegConstants.MaxSampleValue + 1) - JpegConstants.MediumSampleValue, JpegConstants.MediumSampleValue); - } - } - #endregion - - #region JpegDecompressorPostController - /// - /// Decompression postprocessing (color quantization buffer control) - /// - class JpegDecompressorPostController - { - private enum ProcessorType - { - OnePass, - PrePass, - Upsample, - SecondPass - } - - private ProcessorType m_processor; - - private JpegDecompressor m_cinfo; - - /* Color quantization source buffer: this holds output data from - * the upsample/color conversion step to be passed to the quantizer. - * For two-pass color quantization, we need a full-image buffer; - * for one-pass operation, a strip buffer is sufficient. - */ - private JpegVirtualArray m_whole_image; /* virtual array, or null if one-pass */ - private byte[][] m_buffer; /* strip buffer, or current strip of virtual */ - private int m_strip_height; /* buffer size in rows */ - /* for two-pass mode only: */ - private int m_starting_row; /* row # of first row in current strip */ - private int m_next_row; /* index of next row to fill/empty in strip */ - - /// - /// Initialize postprocessing controller. - /// - public JpegDecompressorPostController(JpegDecompressor cinfo, bool need_full_buffer) - { - m_cinfo = cinfo; - - /* Create the quantization buffer, if needed */ - if (cinfo.m_quantize_colors) - { - /* The buffer strip height is max_v_samp_factor, which is typically - * an efficient number of rows for upsampling to return. - * (In the presence of output rescaling, we might want to be smarter?) - */ - m_strip_height = cinfo.m_max_v_samp_factor; - - if (need_full_buffer) - { - /* Two-pass color quantization: need full-image storage. */ - /* We round up the number of rows to a multiple of the strip height. */ - m_whole_image = JpegCommonBase.CreateSamplesArray( - cinfo.m_output_width * cinfo.m_out_color_components, - JpegUtils.jround_up(cinfo.m_output_height, m_strip_height)); - m_whole_image.ErrorProcessor = cinfo; - } - else - { - /* One-pass color quantization: just make a strip buffer. */ - m_buffer = JpegCommonBase.AllocJpegSamples( - cinfo.m_output_width * cinfo.m_out_color_components, m_strip_height); - } - } - } - - /// - /// Initialize for a processing pass. - /// - public void start_pass(BufferMode pass_mode) - { - switch (pass_mode) - { - case BufferMode.PassThru: - if (m_cinfo.m_quantize_colors) - { - /* Single-pass processing with color quantization. */ - m_processor = ProcessorType.OnePass; - /* We could be doing buffered-image output before starting a 2-pass - * color quantization; in that case, jinit_d_post_controller did not - * allocate a strip buffer. Use the virtual-array buffer as workspace. - */ - if (m_buffer == null) - m_buffer = m_whole_image.Access(0, m_strip_height); - } - else - { - /* For single-pass processing without color quantization, - * I have no work to do; just call the upsampler directly. - */ - m_processor = ProcessorType.Upsample; - } - break; - case BufferMode.SaveAndPass: - /* First pass of 2-pass quantization */ - if (m_whole_image == null) - throw new Exception("Bogus buffer control mode"); - - m_processor = ProcessorType.PrePass; - break; - case BufferMode.CrankDest: - /* Second pass of 2-pass quantization */ - if (m_whole_image == null) - throw new Exception("Bogus buffer control mode"); - - m_processor = ProcessorType.SecondPass; - break; - default: - throw new Exception("Bogus buffer control mode"); - } - m_starting_row = m_next_row = 0; - } - - public void post_process_data(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - switch (m_processor) - { - case ProcessorType.OnePass: - post_process_1pass(input_buf, ref in_row_group_ctr, in_row_groups_avail, output_buf, ref out_row_ctr, out_rows_avail); - break; - case ProcessorType.PrePass: - post_process_prepass(input_buf, ref in_row_group_ctr, in_row_groups_avail, ref out_row_ctr); - break; - case ProcessorType.Upsample: - m_cinfo.m_upsample.upsample(input_buf, ref in_row_group_ctr, in_row_groups_avail, output_buf, ref out_row_ctr, out_rows_avail); - break; - case ProcessorType.SecondPass: - post_process_2pass(output_buf, ref out_row_ctr, out_rows_avail); - break; - default: - throw new Exception("Not implemented yet"); - } - } - - /// - /// Process some data in the one-pass (strip buffer) case. - /// This is used for color precision reduction as well as one-pass quantization. - /// - private void post_process_1pass(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - /* Fill the buffer, but not more than what we can dump out in one go. */ - /* Note we rely on the upsampler to detect bottom of image. */ - int max_rows = out_rows_avail - out_row_ctr; - if (max_rows > m_strip_height) - max_rows = m_strip_height; - - int num_rows = 0; - m_cinfo.m_upsample.upsample(input_buf, ref in_row_group_ctr, in_row_groups_avail, m_buffer, ref num_rows, max_rows); - - /* Quantize and emit data. */ - m_cinfo.m_cquantize.color_quantize(m_buffer, 0, output_buf, out_row_ctr, num_rows); - out_row_ctr += num_rows; - } - - /// - /// Process some data in the first pass of 2-pass quantization. - /// - private void post_process_prepass(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, ref int out_row_ctr) - { - int old_next_row, num_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (m_next_row == 0) - m_buffer = m_whole_image.Access(m_starting_row, m_strip_height); - - /* Upsample some data (up to a strip height's worth). */ - old_next_row = m_next_row; - m_cinfo.m_upsample.upsample(input_buf, ref in_row_group_ctr, in_row_groups_avail, m_buffer, ref m_next_row, m_strip_height); - - /* Allow quantizer to scan new data. No data is emitted, */ - /* but we advance out_row_ctr so outer loop can tell when we're done. */ - if (m_next_row > old_next_row) - { - num_rows = m_next_row - old_next_row; - m_cinfo.m_cquantize.color_quantize(m_buffer, old_next_row, null, 0, num_rows); - out_row_ctr += num_rows; - } - - /* Advance if we filled the strip. */ - if (m_next_row >= m_strip_height) - { - m_starting_row += m_strip_height; - m_next_row = 0; - } - } - - /// - /// Process some data in the second pass of 2-pass quantization. - /// - private void post_process_2pass(byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - int num_rows, max_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (m_next_row == 0) - m_buffer = m_whole_image.Access(m_starting_row, m_strip_height); - - /* Determine number of rows to emit. */ - num_rows = m_strip_height - m_next_row; /* available in strip */ - max_rows = out_rows_avail - out_row_ctr; /* available in output area */ - if (num_rows > max_rows) - num_rows = max_rows; - - /* We have to check bottom of image here, can't depend on upsampler. */ - max_rows = m_cinfo.m_output_height - m_starting_row; - if (num_rows > max_rows) - num_rows = max_rows; - - /* Quantize and emit data. */ - m_cinfo.m_cquantize.color_quantize(m_buffer, m_next_row, output_buf, out_row_ctr, num_rows); - out_row_ctr += num_rows; - - /* Advance if we filled the strip. */ - m_next_row += num_rows; - if (m_next_row >= m_strip_height) - { - m_starting_row += m_strip_height; - m_next_row = 0; - } - } - } - #endregion - - #region JpegCommonBase - /// Base class for both JPEG compressor and decompresor. - /// - /// Routines that are to be used by both halves of the library are declared - /// to receive an instance of this class. There are no actual instances of - /// , only of - /// and - /// - public abstract class JpegCommonBase - { - internal enum JpegState - { - DESTROYED = 0, - CSTATE_START = 100, /* after create_compress */ - CSTATE_SCANNING = 101, /* start_compress done, write_scanlines OK */ - CSTATE_RAW_OK = 102, /* start_compress done, write_raw_data OK */ - CSTATE_WRCOEFS = 103, /* jpeg_write_coefficients done */ - DSTATE_START = 200, /* after create_decompress */ - DSTATE_INHEADER = 201, /* reading header markers, no SOS yet */ - DSTATE_READY = 202, /* found SOS, ready for start_decompress */ - DSTATE_PRELOAD = 203, /* reading multi-scan file in start_decompress*/ - DSTATE_PRESCAN = 204, /* performing dummy pass for 2-pass quant */ - DSTATE_SCANNING = 205, /* start_decompress done, read_scanlines OK */ - DSTATE_RAW_OK = 206, /* start_decompress done, read_raw_data OK */ - DSTATE_BUFIMAGE = 207, /* expecting jpeg_start_output */ - DSTATE_BUFPOST = 208, /* looking for SOS/EOI in jpeg_finish_output */ - DSTATE_RDCOEFS = 209, /* reading file in jpeg_read_coefficients */ - DSTATE_STOPPING = 210 /* looking for EOI in jpeg_finish_decompress */ - } - - internal JpegState m_global_state; /* For checking call sequence validity */ - - /// - /// Base constructor. - /// - /// - /// - public JpegCommonBase() - { - } - - /// - /// Gets a value indicating whether this instance is Jpeg decompressor. - /// - /// - /// true if this is Jpeg decompressor; otherwise, false. - /// - public abstract bool IsDecompressor - { - get; - } - - /// - /// Gets the version of LibJpeg. - /// - /// The version of LibJpeg. - public static string Version - { - get - { - return "Special Compilation for Cosmos. Based on version 1.2.300.0 of LibJpeg.Net"; - } - } - - /// - /// Gets the LibJpeg's copyright. - /// - /// The copyright. - public static string Copyright - { - get - { - return "Copyright (C) 2008-2011, Bit Miracle"; - } - } - - /// - /// Creates the array of samples. - /// - /// The number of samples in row. - /// The number of rows. - /// The array of samples. - public static JpegVirtualArray CreateSamplesArray(int samplesPerRow, int numberOfRows) - { - return new JpegVirtualArray(samplesPerRow, numberOfRows, AllocJpegSamples); - } - - /// - /// Creates the array of blocks. - /// - /// The number of blocks in row. - /// The number of rows. - /// The array of blocks. - /// - public static JpegVirtualArray CreateBlocksArray(int blocksPerRow, int numberOfRows) - { - return new JpegVirtualArray(blocksPerRow, numberOfRows, allocJpegBlocks); - } - - /// - /// Creates 2-D sample array. - /// - /// The number of samples per row. - /// The number of rows. - /// The array of samples. - public static byte[][] AllocJpegSamples(int samplesPerRow, int numberOfRows) - { - byte[][] result = new byte[numberOfRows][]; - for (int i = 0; i < numberOfRows; ++i) - result[i] = new byte[samplesPerRow]; - - return result; - } - - // Creation of 2-D block arrays. - private static JpegBlock[][] allocJpegBlocks(int blocksPerRow, int numberOfRows) - { - JpegBlock[][] result = new JpegBlock[numberOfRows][]; - for (int i = 0; i < numberOfRows; ++i) - { - result[i] = new JpegBlock[blocksPerRow]; - for (int j = 0; j < blocksPerRow; ++j) - result[i][j] = new JpegBlock(); - } - return result; - } - - // Generic versions of jpeg_abort and jpeg_destroy that work on either - // flavor of JPEG object. These may be more convenient in some places. - - /// - /// Abort processing of a JPEG compression or decompression operation, - /// but don't destroy the object itself. - /// - /// Closing a data source or destination, if necessary, is the - /// application's responsibility. - /// - public void jpeg_abort() - { - /* Reset overall state for possible reuse of object */ - if (IsDecompressor) - { - m_global_state = JpegState.DSTATE_START; - - /* Try to keep application from accessing now-deleted marker list. - * A bit kludgy to do it here, but this is the most central place. - */ - JpegDecompressor s = this as JpegDecompressor; - if (s != null) - s.m_marker_list = null; - } - else - { - m_global_state = JpegState.CSTATE_START; - } - } - - /// - /// Destruction of a JPEG object. - /// - /// Closing a data source or destination, if necessary, is the - /// application's responsibility. - /// - public void jpeg_destroy() - { - // mark it destroyed - m_global_state = JpegState.DESTROYED; - } - } - #endregion - - #region JpegComponent - /// - /// Basic info about one component (color channel). - /// - public class JpegComponent - { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - - private int component_id; - private int component_index; - private int h_samp_factor; - private int v_samp_factor; - private int quant_tbl_no; - - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - private int dc_tbl_no; - private int ac_tbl_no; - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - private int width_in_blocks; - internal int height_in_blocks; - /* Size of a DCT block in samples. Always DCTSize for compression. - * For decompression this is the size of the output from one DCT block, - * reflecting any scaling we choose to apply during the IDCT step. - * Values of 1,2,4,8 are likely to be supported. Note that different - * components may receive different IDCT scalings. - */ - internal int DCT_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface), thus - * downsampled_width = ceil(image_width * Hi/Hmax) - * and similarly for height. For decompression, IDCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSize) - */ - internal int downsampled_width; /* actual width in samples */ - - internal int downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - internal bool component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - internal int MCU_width; /* number of blocks per MCU, horizontally */ - internal int MCU_height; /* number of blocks per MCU, vertically */ - internal int MCU_blocks; /* MCU_width * MCU_height */ - internal int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ - internal int last_col_width; /* # of non-dummy blocks across in last MCU */ - internal int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; null if none yet saved. - * See JpegInputController comments about the need for this information. - * This field is currently used only for decompression. - */ - internal JpegQuantizationTable quant_table; - - internal JpegComponent() - { - } - - internal void Assign(JpegComponent ci) - { - component_id = ci.component_id; - component_index = ci.component_index; - h_samp_factor = ci.h_samp_factor; - v_samp_factor = ci.v_samp_factor; - quant_tbl_no = ci.quant_tbl_no; - dc_tbl_no = ci.dc_tbl_no; - ac_tbl_no = ci.ac_tbl_no; - width_in_blocks = ci.width_in_blocks; - height_in_blocks = ci.height_in_blocks; - DCT_scaled_size = ci.DCT_scaled_size; - downsampled_width = ci.downsampled_width; - downsampled_height = ci.downsampled_height; - component_needed = ci.component_needed; - MCU_width = ci.MCU_width; - MCU_height = ci.MCU_height; - MCU_blocks = ci.MCU_blocks; - MCU_sample_width = ci.MCU_sample_width; - last_col_width = ci.last_col_width; - last_row_height = ci.last_row_height; - quant_table = ci.quant_table; - } - - /// - /// Identifier for this component (0..255) - /// - /// The component ID. - public int Component_id - { - get { return component_id; } - set { component_id = value; } - } - - /// - /// Its index in SOF or . - /// - /// The component index. - public int Component_index - { - get { return component_index; } - set { component_index = value; } - } - - /// - /// Horizontal sampling factor (1..4) - /// - /// The horizontal sampling factor. - public int H_samp_factor - { - get { return h_samp_factor; } - set { h_samp_factor = value; } - } - - /// - /// Vertical sampling factor (1..4) - /// - /// The vertical sampling factor. - public int V_samp_factor - { - get { return v_samp_factor; } - set { v_samp_factor = value; } - } - - /// - /// Quantization table selector (0..3) - /// - /// The quantization table selector. - public int Quant_tbl_no - { - get { return quant_tbl_no; } - set { quant_tbl_no = value; } - } - - /// - /// DC entropy table selector (0..3) - /// - /// The DC entropy table selector. - public int Dc_tbl_no - { - get { return dc_tbl_no; } - set { dc_tbl_no = value; } - } - - /// - /// AC entropy table selector (0..3) - /// - /// The AC entropy table selector. - public int Ac_tbl_no - { - get { return ac_tbl_no; } - set { ac_tbl_no = value; } - } - - /// - /// Gets or sets the width in blocks. - /// - /// The width in blocks. - public int Width_in_blocks - { - get { return width_in_blocks; } - set { width_in_blocks = value; } - } - - /// - /// Gets the downsampled width. - /// - /// The downsampled width. - public int Downsampled_width - { - get { return downsampled_width; } - } - - internal static JpegComponent[] createArrayOfComponents(int length) - { - if (length < 0) - throw new ArgumentOutOfRangeException("length"); - - JpegComponent[] result = new JpegComponent[length]; - for (int i = 0; i < result.Length; ++i) - result[i] = new JpegComponent(); - - return result; - } - } - #endregion - - #region JpegConstants - /// - /// Defines some JPEG constants. - /// - public static class JpegConstants - { - ////////////////////////////////////////////////////////////////////////// - // All of these are specified by the JPEG standard, so don't change them - // if you want to be compatible. - // - - /// - /// The basic DCT block is 8x8 samples - /// - public const int DCTSize = 8; - - /// - /// DCTSize squared; the number of elements in a block. - /// - public const int DCTSize2 = DCTSize * DCTSize; - - /// - /// Quantization tables are numbered 0..3 - /// - public const int NumberOfQuantTables = 4; - - /// - /// Huffman tables are numbered 0..3 - /// - public const int NumberOfHuffmanTables = 4; - - /// - /// JPEG limit on the number of components in one scan. - /// - public const int MaxComponentsInScan = 4; - - // compressor's limit on blocks per MCU - // - // Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - // the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - // If you happen to run across such a file, you can up DecompressorMaxBlocksInMCU - // to handle it. We even let you do this from the jconfig.h file. However, - // we strongly discourage changing CompressorMaxBlocksInMCU; just because Adobe - // sometimes emits noncompliant files doesn't mean you should too. - - /// - /// Compressor's limit on blocks per MCU. - /// - public const int CompressorMaxBlocksInMCU = 10; - - /// - /// Decompressor's limit on blocks per MCU. - /// - public const int DecompressorMaxBlocksInMCU = 10; - - /// - /// JPEG limit on sampling factors. - /// - public const int MaxSamplingFactor = 4; - - - ////////////////////////////////////////////////////////////////////////// - // implementation-specific constants - // - - // Maximum number of components (color channels) allowed in JPEG image. - // To meet the letter of the JPEG spec, set this to 255. However, darn - // few applications need more than 4 channels (maybe 5 for CMYK + alpha - // mask). We recommend 10 as a reasonable compromise; use 4 if you are - // really short on memory. (Each allowed component costs a hundred or so - // bytes of storage, whether actually used in an image or not.) - - /// - /// Maximum number of color channels allowed in JPEG image. - /// - public const int MaxComponents = 10; - - - - /// - /// The size of sample. - /// - /// Is either: - /// 8 - for 8-bit sample values (the usual setting)
- /// 12 - for 12-bit sample values (not supported by this version)
- /// Only 8 and 12 are legal data precisions for lossy JPEG according to the JPEG standard. - /// Although original IJG code claims it supports 12 bit images, our code does not support - /// anything except 8-bit images.
- public const int BitsInSample = 8; - - /// - /// DCT method used by default. - /// - public static DCTMethod DefaultDCTMethod = DCTMethod.IntSlow; - - /// - /// Fastest DCT method. - /// - public static DCTMethod FastestDCTMethod = DCTMethod.IntFast; - - /// - /// A tad under 64K to prevent overflows. - /// - public const int JpegMaxDimention = 65500; - - /// - /// The maximum sample value. - /// - public const int MaxSampleValue = 255; - - /// - /// The medium sample value. - /// - public const int MediumSampleValue = 128; - - // Ordering of RGB data in scanlines passed to or from the application. - // RESTRICTIONS: - // 1. These macros only affect RGB<=>YCbCr color conversion, so they are not - // useful if you are using JPEG color spaces other than YCbCr or grayscale. - // 2. The color quantizer modules will not behave desirably if RGB_PixelLength - // is not 3 (they don't understand about dummy color components!). So you - // can't use color quantization if you change that value. - - /// - /// Offset of Red in an RGB scanline element. - /// - public const int Offset_RGB_Red = 0; - - /// - /// Offset of Green in an RGB scanline element. - /// - public const int Offset_RGB_Green = 1; - - /// - /// Offset of Blue in an RGB scanline element. - /// - public const int Offset_RGB_Blue = 2; - - /// - /// Bytes per RGB scanline element. - /// - public const int RGB_PixelLength = 3; - - /// - /// The number of bits of lookahead. - /// - public const int HuffmanLookaheadDistance = 8; - } - #endregion - - #region JpegDownsampler - /// - /// Downsampling - /// - class JpegDownsampler - { - private enum downSampleMethod - { - fullsize_smooth_downsampler, - fullsize_downsampler, - h2v1_downsampler, - h2v2_smooth_downsampler, - h2v2_downsampler, - int_downsampler - }; - - /* Downsamplers, one per component */ - private downSampleMethod[] m_downSamplers = new downSampleMethod[JpegConstants.MaxComponents]; - - private JpegCompressor m_cinfo; - private bool m_need_context_rows; /* true if need rows above & below */ - - public JpegDownsampler(JpegCompressor cinfo) - { - m_cinfo = cinfo; - m_need_context_rows = false; - - if (cinfo.m_CCIR601_sampling) - throw new Exception("CCIR601 sampling not implemented yet"); - - /* Verify we can handle the sampling factors, and set up method pointers */ - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = cinfo.Component_info[ci]; - - if (componentInfo.H_samp_factor == cinfo.m_max_h_samp_factor && - componentInfo.V_samp_factor == cinfo.m_max_v_samp_factor) - { - if (cinfo.m_smoothing_factor != 0) - { - m_downSamplers[ci] = downSampleMethod.fullsize_smooth_downsampler; - m_need_context_rows = true; - } - else - { - m_downSamplers[ci] = downSampleMethod.fullsize_downsampler; - } - } - else if (componentInfo.H_samp_factor * 2 == cinfo.m_max_h_samp_factor && - componentInfo.V_samp_factor == cinfo.m_max_v_samp_factor) - { - m_downSamplers[ci] = downSampleMethod.h2v1_downsampler; - } - else if (componentInfo.H_samp_factor * 2 == cinfo.m_max_h_samp_factor && - componentInfo.V_samp_factor * 2 == cinfo.m_max_v_samp_factor) - { - if (cinfo.m_smoothing_factor != 0) - { - m_downSamplers[ci] = downSampleMethod.h2v2_smooth_downsampler; - m_need_context_rows = true; - } - else - { - m_downSamplers[ci] = downSampleMethod.h2v2_downsampler; - } - } - else if ((cinfo.m_max_h_samp_factor % componentInfo.H_samp_factor) == 0 && - (cinfo.m_max_v_samp_factor % componentInfo.V_samp_factor) == 0) - { - m_downSamplers[ci] = downSampleMethod.int_downsampler; - } - else - throw new Exception("Fractional sampling not implemented yet"); - } - } - - /// - /// Do downsampling for a whole row group (all components). - /// - /// In this version we simply downsample each component independently. - /// - public void downsample(byte[][][] input_buf, int in_row_index, byte[][][] output_buf, int out_row_group_index) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - int outIndex = out_row_group_index * m_cinfo.Component_info[ci].V_samp_factor; - switch (m_downSamplers[ci]) - { - case downSampleMethod.fullsize_smooth_downsampler: - fullsize_smooth_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - - case downSampleMethod.fullsize_downsampler: - fullsize_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - - case downSampleMethod.h2v1_downsampler: - h2v1_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - - case downSampleMethod.h2v2_smooth_downsampler: - h2v2_smooth_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - - case downSampleMethod.h2v2_downsampler: - h2v2_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - - case downSampleMethod.int_downsampler: - int_downsample(ci, input_buf[ci], in_row_index, output_buf[ci], outIndex); - break; - }; - } - } - - public bool NeedContextRows() - { - return m_need_context_rows; - } - - /// - /// Downsample pixel values of a single component. - /// One row group is processed per call. - /// This version handles arbitrary integral sampling ratios, without smoothing. - /// Note that this version is not actually used for customary sampling ratios. - /// - private void int_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - int output_cols = m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize; - int h_expand = m_cinfo.m_max_h_samp_factor / m_cinfo.Component_info[componentIndex].H_samp_factor; - expand_right_edge(input_data, startInputRow, m_cinfo.m_max_v_samp_factor, m_cinfo.m_image_width, output_cols * h_expand); - - int v_expand = m_cinfo.m_max_v_samp_factor / m_cinfo.Component_info[componentIndex].V_samp_factor; - int numpix = h_expand * v_expand; - int numpix2 = numpix / 2; - int inrow = 0; - for (int outrow = 0; outrow < m_cinfo.Component_info[componentIndex].V_samp_factor; outrow++) - { - for (int outcol = 0, outcol_h = 0; outcol < output_cols; outcol++, outcol_h += h_expand) - { - int outvalue = 0; - for (int v = 0; v < v_expand; v++) - { - for (int h = 0; h < h_expand; h++) - outvalue += input_data[startInputRow + inrow + v][outcol_h + h]; - } - - output_data[startOutRow + outrow][outcol] = (byte)((outvalue + numpix2) / numpix); - } - - inrow += v_expand; - } - } - - /// - /// Downsample pixel values of a single component. - /// This version handles the special case of a full-size component, - /// without smoothing. - /// - private void fullsize_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Copy the data */ - JpegUtils.jcopy_sample_rows(input_data, startInputRow, output_data, startOutRow, m_cinfo.m_max_v_samp_factor, m_cinfo.m_image_width); - - /* Edge-expand */ - expand_right_edge(output_data, startOutRow, m_cinfo.m_max_v_samp_factor, m_cinfo.m_image_width, m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize); - } - - /// - /// Downsample pixel values of a single component. - /// This version handles the common case of 2:1 horizontal and 1:1 vertical, - /// without smoothing. - /// - /// A note about the "bias" calculations: when rounding fractional values to - /// integer, we do not want to always round 0.5 up to the next integer. - /// If we did that, we'd introduce a noticeable bias towards larger values. - /// Instead, this code is arranged so that 0.5 will be rounded up or down at - /// alternate pixel locations (a simple ordered dither pattern). - /// - private void h2v1_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - int output_cols = m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize; - expand_right_edge(input_data, startInputRow, m_cinfo.m_max_v_samp_factor, m_cinfo.m_image_width, output_cols * 2); - - for (int outrow = 0; outrow < m_cinfo.Component_info[componentIndex].V_samp_factor; outrow++) - { - /* bias = 0,1,0,1,... for successive samples */ - int bias = 0; - int inputColumn = 0; - for (int outcol = 0; outcol < output_cols; outcol++) - { - output_data[startOutRow + outrow][outcol] = (byte)( - ((int)input_data[startInputRow + outrow][inputColumn] + - (int)input_data[startInputRow + outrow][inputColumn + 1] + bias) >> 1); - - bias ^= 1; /* 0=>1, 1=>0 */ - inputColumn += 2; - } - } - } - - /// - /// Downsample pixel values of a single component. - /// This version handles the standard case of 2:1 horizontal and 2:1 vertical, - /// without smoothing. - /// - private void h2v2_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - int output_cols = m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize; - expand_right_edge(input_data, startInputRow, m_cinfo.m_max_v_samp_factor, m_cinfo.m_image_width, output_cols * 2); - - int inrow = 0; - for (int outrow = 0; outrow < m_cinfo.Component_info[componentIndex].V_samp_factor; outrow++) - { - /* bias = 1,2,1,2,... for successive samples */ - int bias = 1; - int inputColumn = 0; - for (int outcol = 0; outcol < output_cols; outcol++) - { - output_data[startOutRow + outrow][outcol] = (byte)(( - (int)input_data[startInputRow + inrow][inputColumn] + - (int)input_data[startInputRow + inrow][inputColumn + 1] + - (int)input_data[startInputRow + inrow + 1][inputColumn] + - (int)input_data[startInputRow + inrow + 1][inputColumn + 1] + bias) >> 2); - - bias ^= 3; /* 1=>2, 2=>1 */ - inputColumn += 2; - } - - inrow += 2; - } - } - - /// - /// Downsample pixel values of a single component. - /// This version handles the standard case of 2:1 horizontal and 2:1 vertical, - /// with smoothing. One row of context is required. - /// - private void h2v2_smooth_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - int output_cols = m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize; - expand_right_edge(input_data, startInputRow - 1, m_cinfo.m_max_v_samp_factor + 2, m_cinfo.m_image_width, output_cols * 2); - - /* We don't bother to form the individual "smoothed" input pixel values; - * we can directly compute the output which is the average of the four - * smoothed values. Each of the four member pixels contributes a fraction - * (1-8*SF) to its own smoothed image and a fraction SF to each of the three - * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final - * output. The four corner-adjacent neighbor pixels contribute a fraction - * SF to just one smoothed pixel, or SF/4 to the final output; while the - * eight edge-adjacent neighbors contribute SF to each of two smoothed - * pixels, or SF/2 overall. In order to use integer arithmetic, these - * factors are scaled by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - int memberscale = 16384 - m_cinfo.m_smoothing_factor * 80; /* scaled (1-5*SF)/4 */ - int neighscale = m_cinfo.m_smoothing_factor * 16; /* scaled SF/4 */ - - for (int inrow = 0, outrow = 0; outrow < m_cinfo.Component_info[componentIndex].V_samp_factor; outrow++) - { - int outIndex = 0; - int inIndex0 = 0; - int inIndex1 = 0; - int aboveIndex = 0; - int belowIndex = 0; - - /* Special case for first column: pretend column -1 is same as column 0 */ - int membersum = input_data[startInputRow + inrow][inIndex0] + - input_data[startInputRow + inrow][inIndex0 + 1] + - input_data[startInputRow + inrow + 1][inIndex1] + - input_data[startInputRow + inrow + 1][inIndex1 + 1]; - - int neighsum = input_data[startInputRow + inrow - 1][aboveIndex] + - input_data[startInputRow + inrow - 1][aboveIndex + 1] + - input_data[startInputRow + inrow + 2][belowIndex] + - input_data[startInputRow + inrow + 2][belowIndex + 1] + - input_data[startInputRow + inrow][inIndex0] + - input_data[startInputRow + inrow][inIndex0 + 2] + - input_data[startInputRow + inrow + 1][inIndex1] + - input_data[startInputRow + inrow + 1][inIndex1 + 2]; - - neighsum += neighsum; - neighsum += input_data[startInputRow + inrow - 1][aboveIndex] + - input_data[startInputRow + inrow - 1][aboveIndex + 2] + - input_data[startInputRow + inrow + 2][belowIndex] + - input_data[startInputRow + inrow + 2][belowIndex + 2]; - - membersum = membersum * memberscale + neighsum * neighscale; - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - outIndex++; - - inIndex0 += 2; - inIndex1 += 2; - aboveIndex += 2; - belowIndex += 2; - - for (int colctr = output_cols - 2; colctr > 0; colctr--) - { - /* sum of pixels directly mapped to this output element */ - membersum = input_data[startInputRow + inrow][inIndex0] + - input_data[startInputRow + inrow][inIndex0 + 1] + - input_data[startInputRow + inrow + 1][inIndex1] + - input_data[startInputRow + inrow + 1][inIndex1 + 1]; - - /* sum of edge-neighbor pixels */ - neighsum = input_data[startInputRow + inrow - 1][aboveIndex] + - input_data[startInputRow + inrow - 1][aboveIndex + 1] + - input_data[startInputRow + inrow + 2][belowIndex] + - input_data[startInputRow + inrow + 2][belowIndex + 1] + - input_data[startInputRow + inrow][inIndex0 - 1] + - input_data[startInputRow + inrow][inIndex0 + 2] + - input_data[startInputRow + inrow + 1][inIndex1 - 1] + - input_data[startInputRow + inrow + 1][inIndex1 + 2]; - - /* The edge-neighbors count twice as much as corner-neighbors */ - neighsum += neighsum; - - /* Add in the corner-neighbors */ - neighsum += input_data[startInputRow + inrow - 1][aboveIndex - 1] + - input_data[startInputRow + inrow - 1][aboveIndex + 2] + - input_data[startInputRow + inrow + 2][belowIndex - 1] + - input_data[startInputRow + inrow + 2][belowIndex + 2]; - - /* form final output scaled up by 2^16 */ - membersum = membersum * memberscale + neighsum * neighscale; - - /* round, descale and output it */ - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - outIndex++; - - inIndex0 += 2; - inIndex1 += 2; - aboveIndex += 2; - belowIndex += 2; - } - - /* Special case for last column */ - membersum = input_data[startInputRow + inrow][inIndex0] + - input_data[startInputRow + inrow][inIndex0 + 1] + - input_data[startInputRow + inrow + 1][inIndex1] + - input_data[startInputRow + inrow + 1][inIndex1 + 1]; - - neighsum = input_data[startInputRow + inrow - 1][aboveIndex] + - input_data[startInputRow + inrow - 1][aboveIndex + 1] + - input_data[startInputRow + inrow + 2][belowIndex] + - input_data[startInputRow + inrow + 2][belowIndex + 1] + - input_data[startInputRow + inrow][inIndex0 - 1] + - input_data[startInputRow + inrow][inIndex0 + 1] + - input_data[startInputRow + inrow + 1][inIndex1 - 1] + - input_data[startInputRow + inrow + 1][inIndex1 + 1]; - - neighsum += neighsum; - neighsum += input_data[startInputRow + inrow - 1][aboveIndex - 1] + - input_data[startInputRow + inrow - 1][aboveIndex + 1] + - input_data[startInputRow + inrow + 2][belowIndex - 1] + - input_data[startInputRow + inrow + 2][belowIndex + 1]; - - membersum = membersum * memberscale + neighsum * neighscale; - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - - inrow += 2; - } - } - - /// - /// Downsample pixel values of a single component. - /// This version handles the special case of a full-size component, - /// with smoothing. One row of context is required. - /// - private void fullsize_smooth_downsample(int componentIndex, byte[][] input_data, int startInputRow, byte[][] output_data, int startOutRow) - { - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - int output_cols = m_cinfo.Component_info[componentIndex].Width_in_blocks * JpegConstants.DCTSize; - expand_right_edge(input_data, startInputRow - 1, m_cinfo.m_max_v_samp_factor + 2, m_cinfo.m_image_width, output_cols); - - /* Each of the eight neighbor pixels contributes a fraction SF to the - * smoothed pixel, while the main pixel contributes (1-8*SF). In order - * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - int memberscale = 65536 - m_cinfo.m_smoothing_factor * 512; /* scaled 1-8*SF */ - int neighscale = m_cinfo.m_smoothing_factor * 64; /* scaled SF */ - - for (int outrow = 0; outrow < m_cinfo.Component_info[componentIndex].V_samp_factor; outrow++) - { - int outIndex = 0; - int inIndex = 0; - int aboveIndex = 0; - int belowIndex = 0; - - /* Special case for first column */ - int colsum = input_data[startInputRow + outrow - 1][aboveIndex] + - input_data[startInputRow + outrow + 1][belowIndex] + - input_data[startInputRow + outrow][inIndex]; - - aboveIndex++; - belowIndex++; - - int membersum = input_data[startInputRow + outrow][inIndex]; - inIndex++; - - int nextcolsum = input_data[startInputRow + outrow - 1][aboveIndex] + - input_data[startInputRow + outrow + 1][belowIndex] + - input_data[startInputRow + outrow][inIndex]; - - int neighsum = colsum + (colsum - membersum) + nextcolsum; - - membersum = membersum * memberscale + neighsum * neighscale; - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - outIndex++; - - int lastcolsum = colsum; - colsum = nextcolsum; - - for (int colctr = output_cols - 2; colctr > 0; colctr--) - { - membersum = input_data[startInputRow + outrow][inIndex]; - - inIndex++; - aboveIndex++; - belowIndex++; - - nextcolsum = input_data[startInputRow + outrow - 1][aboveIndex] + - input_data[startInputRow + outrow + 1][belowIndex] + - input_data[startInputRow + outrow][inIndex]; - - neighsum = lastcolsum + (colsum - membersum) + nextcolsum; - membersum = membersum * memberscale + neighsum * neighscale; - - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - outIndex++; - - lastcolsum = colsum; - colsum = nextcolsum; - } - - /* Special case for last column */ - membersum = input_data[startInputRow + outrow][inIndex]; - neighsum = lastcolsum + (colsum - membersum) + colsum; - membersum = membersum * memberscale + neighsum * neighscale; - output_data[startOutRow + outrow][outIndex] = (byte)((membersum + 32768) >> 16); - } - } - - /// - /// Expand a component horizontally from width input_cols to width output_cols, - /// by duplicating the rightmost samples. - /// - private static void expand_right_edge(byte[][] image_data, int startInputRow, int num_rows, int input_cols, int output_cols) - { - int numcols = output_cols - input_cols; - if (numcols > 0) - { - for (int row = startInputRow; row < (startInputRow + num_rows); row++) - { - /* don't need GETJSAMPLE() here */ - byte pixval = image_data[row][input_cols - 1]; - for (int count = 0; count < numcols; count++) - image_data[row][input_cols + count] = pixval; - } - } - } - } - #endregion - - #region JpegEntropyDecoder - /// - /// Entropy decoding - /// - abstract class JpegEntropyDecoder - { - // Figure F.12: extend sign bit. - // entry n is 2**(n-1) - private static int[] extend_test = - { - 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, - 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, - 0x1000, 0x2000, 0x4000 - }; - - // entry n is (-1 << n) + 1 - private static int[] extend_offset = - { - 0, (-1 << 1) + 1, (-1 << 2) + 1, - (-1 << 3) + 1, (-1 << 4) + 1, (-1 << 5) + 1, - (-1 << 6) + 1, (-1 << 7) + 1, (-1 << 8) + 1, - (-1 << 9) + 1, (-1 << 10) + 1, - (-1 << 11) + 1, (-1 << 12) + 1, - (-1 << 13) + 1, (-1 << 14) + 1, - (-1 << 15) + 1 - }; - - /* Fetching the next N bits from the input stream is a time-critical operation - * for the Huffman decoders. We implement it with a combination of inline - * macros and out-of-line subroutines. Note that N (the number of bits - * demanded at one time) never exceeds 15 for JPEG use. - * - * We read source bytes into get_buffer and dole out bits as needed. - * If get_buffer already contains enough bits, they are fetched in-line - * by the macros CHECK_BIT_BUFFER and GET_BITS. When there aren't enough - * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer - * as full as possible (not just to the number of bits needed; this - * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer). - * Note that jpeg_fill_bit_buffer may return false to indicate suspension. - * On true return, jpeg_fill_bit_buffer guarantees that get_buffer contains - * at least the requested number of bits --- dummy zeroes are inserted if - * necessary. - */ - protected const int BIT_BUF_SIZE = 32; /* size of buffer in bits */ - - /* - * Out-of-line code for bit fetching (shared with jdphuff.c). - * See jdhuff.h for info about usage. - * Note: current values of get_buffer and bits_left are passed as parameters, - * but are returned in the corresponding fields of the state struct. - * - * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width - * of get_buffer to be used. (On machines with wider words, an even larger - * buffer could be used.) However, on some machines 32-bit shifts are - * quite slow and take time proportional to the number of places shifted. - * (This is true with most PC compilers, for instance.) In this case it may - * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the - * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. - */ - - protected const int MIN_GET_BITS = BIT_BUF_SIZE - 7; - - protected JpegDecompressor m_cinfo; - - /* This is here to share code between baseline and progressive decoders; */ - /* other modules probably should not use it */ - protected bool m_insufficient_data; /* set true after emitting warning */ - - public abstract void start_pass(); - public abstract bool decode_mcu(JpegBlock[] MCU_data); - - protected static int HUFF_EXTEND(int x, int s) - { - return ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)); - } - - protected void BITREAD_LOAD_STATE(SavedBitreadState bitstate, out int get_buffer, out int bits_left, ref WorkingBitreadState br_state) - { - br_state.cinfo = m_cinfo; - get_buffer = bitstate.get_buffer; - bits_left = bitstate.bits_left; - } - - protected static void BITREAD_SAVE_STATE(ref SavedBitreadState bitstate, int get_buffer, int bits_left) - { - bitstate.get_buffer = get_buffer; - bitstate.bits_left = bits_left; - } - - /// - /// Expand a Huffman table definition into the derived format - /// This routine also performs some validation checks on the table. - /// - protected void jpeg_make_d_derived_tbl(bool isDC, int tblno, ref DerivedTable dtbl) - { - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl.huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", tblno)); - - JpegHuffmanTable htbl = isDC ? m_cinfo.m_dc_huff_tbl_ptrs[tblno] : m_cinfo.m_ac_huff_tbl_ptrs[tblno]; - if (htbl == null) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", tblno)); - - /* Allocate a workspace if we haven't already done so. */ - if (dtbl == null) - dtbl = new DerivedTable(); - - dtbl.pub = htbl; /* fill in back link */ - - /* Figure C.1: make table of Huffman code length for each symbol */ - - int p = 0; - char[] huffsize = new char[257]; - for (int l = 1; l <= 16; l++) - { - int i = htbl.Bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - throw new Exception("Bogus Huffman table definition"); - - while ((i--) != 0) - huffsize[p++] = (char)l; - } - huffsize[p] = (char)0; - int numsymbols = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - int code = 0; - int si = huffsize[0]; - int[] huffcode = new int[257]; - p = 0; - while (huffsize[p] != 0) - { - while (((int)huffsize[p]) == si) - { - huffcode[p++] = code; - code++; - } - - /* code is now 1 more than the last code used for code-length si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (code >= (1 << si)) - throw new Exception("Bogus Huffman table definition"); - code <<= 1; - si++; - } - - /* Figure F.15: generate decoding tables for bit-sequential decoding */ - - p = 0; - for (int l = 1; l <= 16; l++) - { - if (htbl.Bits[l] != 0) - { - /* valoffset[l] = huffval[] index of 1st symbol of code length l, - * minus the minimum code of length l - */ - dtbl.valoffset[l] = p - huffcode[p]; - p += htbl.Bits[l]; - dtbl.maxcode[l] = huffcode[p - 1]; /* maximum code of length l */ - } - else - { - /* -1 if no codes of this length */ - dtbl.maxcode[l] = -1; - } - } - dtbl.maxcode[17] = 0xFFFFF; /* ensures jpeg_huff_decode terminates */ - - /* Compute lookahead tables to speed up decoding. - * First we set all the table entries to 0, indicating "too long"; - * then we iterate through the Huffman codes that are short enough and - * fill in all the entries that correspond to bit sequences starting - * with that code. - */ - - Array.Clear(dtbl.look_nbits, 0, dtbl.look_nbits.Length); - p = 0; - for (int l = 1; l <= JpegConstants.HuffmanLookaheadDistance; l++) - { - for (int i = 1; i <= htbl.Bits[l]; i++, p++) - { - /* l = current code's length, p = its index in huffcode[] & huffval[]. */ - /* Generate left-justified code followed by all possible bit sequences */ - int lookbits = huffcode[p] << (JpegConstants.HuffmanLookaheadDistance - l); - for (int ctr = 1 << (JpegConstants.HuffmanLookaheadDistance - l); ctr > 0; ctr--) - { - dtbl.look_nbits[lookbits] = l; - dtbl.look_sym[lookbits] = htbl.Huffval[p]; - lookbits++; - } - } - } - - /* Validate symbols as being reasonable. - * For AC tables, we make no check, but accept all byte values 0..255. - * For DC tables, we require the symbols to be in range 0..15. - * (Tighter bounds could be applied depending on the data depth and mode, - * but this is sufficient to ensure safe decoding.) - */ - if (isDC) - { - for (int i = 0; i < numsymbols; i++) - { - int sym = htbl.Huffval[i]; - if (sym < 0 || sym > 15) - throw new Exception("Bogus Huffman table definition"); - } - } - } - - /* - * These methods provide the in-line portion of bit fetching. - * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer - * before using GET_BITS, PEEK_BITS, or DROP_BITS. - * The variables get_buffer and bits_left are assumed to be locals, - * but the state struct might not be (jpeg_huff_decode needs this). - * CHECK_BIT_BUFFER(state,n,action); - * Ensure there are N bits in get_buffer; if suspend, take action. - * val = GET_BITS(n); - * Fetch next N bits. - * val = PEEK_BITS(n); - * Fetch next N bits without removing them from the buffer. - * DROP_BITS(n); - * Discard next N bits. - * The value N should be a simple variable, not an expression, because it - * is evaluated multiple times. - */ - - protected static bool CHECK_BIT_BUFFER(ref WorkingBitreadState state, int nbits, ref int get_buffer, ref int bits_left) - { - if (bits_left < nbits) - { - if (!jpeg_fill_bit_buffer(ref state, get_buffer, bits_left, nbits)) - return false; - - get_buffer = state.get_buffer; - bits_left = state.bits_left; - } - - return true; - } - - protected static int GET_BITS(int nbits, int get_buffer, ref int bits_left) - { - return (((int)(get_buffer >> (bits_left -= nbits))) & ((1 << nbits) - 1)); - } - - protected static int PEEK_BITS(int nbits, int get_buffer, int bits_left) - { - return (((int)(get_buffer >> (bits_left - nbits))) & ((1 << nbits) - 1)); - } - - protected static void DROP_BITS(int nbits, ref int bits_left) - { - bits_left -= nbits; - } - - /* Load up the bit buffer to a depth of at least nbits */ - protected static bool jpeg_fill_bit_buffer(ref WorkingBitreadState state, int get_buffer, int bits_left, int nbits) - { - /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ - /* (It is assumed that no request will be for more than that many bits.) */ - /* We fail to do so only if we hit a marker or are forced to suspend. */ - - bool noMoreBytes = false; - - if (state.cinfo.m_unread_marker == 0) - { - /* cannot advance past a marker */ - while (bits_left < MIN_GET_BITS) - { - int c; - state.cinfo.m_src.GetByte(out c); - - /* If it's 0xFF, check and discard stuffed zero byte */ - if (c == 0xFF) - { - /* Loop here to discard any padding FF's on terminating marker, - * so that we can save a valid unread_marker value. NOTE: we will - * accept multiple FF's followed by a 0 as meaning a single FF data - * byte. This data pattern is not valid according to the standard. - */ - do - { - state.cinfo.m_src.GetByte(out c); - } - while (c == 0xFF); - - if (c == 0) - { - /* Found FF/00, which represents an FF data byte */ - c = 0xFF; - } - else - { - /* Oops, it's actually a marker indicating end of compressed data. - * Save the marker code for later use. - * Fine point: it might appear that we should save the marker into - * bitread working state, not straight into permanent state. But - * once we have hit a marker, we cannot need to suspend within the - * current MCU, because we will read no more bytes from the data - * source. So it is OK to update permanent state right away. - */ - state.cinfo.m_unread_marker = c; - /* See if we need to insert some fake zero bits. */ - noMoreBytes = true; - break; - } - } - - /* OK, load c into get_buffer */ - get_buffer = (get_buffer << 8) | c; - bits_left += 8; - } /* end while */ - } - else - noMoreBytes = true; - - if (noMoreBytes) - { - /* We get here if we've read the marker that terminates the compressed - * data segment. There should be enough bits in the buffer register - * to satisfy the request; if so, no problem. - */ - if (nbits > bits_left) - { - /* Uh-oh. Report corrupted data to user and stuff zeroes into - * the data stream, so that we can produce some kind of image. - * We use a nonvolatile flag to ensure that only one warning message - * appears per data segment. - */ - if (!state.cinfo.m_entropy.m_insufficient_data) - { - state.cinfo.m_entropy.m_insufficient_data = true; - } - - /* Fill the buffer with zero bits */ - get_buffer <<= MIN_GET_BITS - bits_left; - bits_left = MIN_GET_BITS; - } - } - - /* Unload the local registers */ - state.get_buffer = get_buffer; - state.bits_left = bits_left; - - return true; - } - - /* - * Code for extracting next Huffman-coded symbol from input bit stream. - * Again, this is time-critical and we make the main paths be macros. - * - * We use a lookahead table to process codes of up to HuffmanLookaheadDistance bits - * without looping. Usually, more than 95% of the Huffman codes will be 8 - * or fewer bits long. The few overlength codes are handled with a loop, - * which need not be inline code. - * - * Notes about the HUFF_DECODE macro: - * 1. Near the end of the data segment, we may fail to get enough bits - * for a lookahead. In that case, we do it the hard way. - * 2. If the lookahead table contains no entry, the next code must be - * more than HuffmanLookaheadDistance bits long. - * 3. jpeg_huff_decode returns -1 if forced to suspend. - */ - protected static bool HUFF_DECODE(out int result, ref WorkingBitreadState state, DerivedTable htbl, ref int get_buffer, ref int bits_left) - { - int nb = 0; - bool doSlow = false; - - if (bits_left < JpegConstants.HuffmanLookaheadDistance) - { - if (!jpeg_fill_bit_buffer(ref state, get_buffer, bits_left, 0)) - { - result = -1; - return false; - } - - get_buffer = state.get_buffer; - bits_left = state.bits_left; - if (bits_left < JpegConstants.HuffmanLookaheadDistance) - { - nb = 1; - doSlow = true; - } - } - - if (!doSlow) - { - int look = PEEK_BITS(JpegConstants.HuffmanLookaheadDistance, get_buffer, bits_left); - if ((nb = htbl.look_nbits[look]) != 0) - { - DROP_BITS(nb, ref bits_left); - result = htbl.look_sym[look]; - return true; - } - - nb = JpegConstants.HuffmanLookaheadDistance + 1; - } - - result = jpeg_huff_decode(ref state, get_buffer, bits_left, htbl, nb); - if (result < 0) - return false; - - get_buffer = state.get_buffer; - bits_left = state.bits_left; - - return true; - } - - /* Out-of-line case for Huffman code fetching */ - protected static int jpeg_huff_decode(ref WorkingBitreadState state, int get_buffer, int bits_left, DerivedTable htbl, int min_bits) - { - /* HUFF_DECODE has determined that the code is at least min_bits */ - /* bits long, so fetch that many bits in one swoop. */ - int l = min_bits; - if (!CHECK_BIT_BUFFER(ref state, l, ref get_buffer, ref bits_left)) - return -1; - - int code = GET_BITS(l, get_buffer, ref bits_left); - - /* Collect the rest of the Huffman code one bit at a time. */ - /* This is per Figure F.16 in the JPEG spec. */ - - while (code > htbl.maxcode[l]) - { - code <<= 1; - if (!CHECK_BIT_BUFFER(ref state, 1, ref get_buffer, ref bits_left)) - return -1; - - code |= GET_BITS(1, get_buffer, ref bits_left); - l++; - } - - /* Unload the local registers */ - state.get_buffer = get_buffer; - state.bits_left = bits_left; - - /* With garbage input we may reach the sentinel value l = 17. */ - - if (l > 16) - { - /* fake a zero as the safest result */ - return 0; - } - - return htbl.pub.Huffval[code + htbl.valoffset[l]]; - } - } - #endregion - - #region JpegEntropyEncoder - /// - /// Entropy encoding - /// - abstract class JpegEntropyEncoder - { - /* Derived data constructed for each Huffman table */ - protected class c_derived_tbl - { - public int[] ehufco = new int[256]; /* code for each symbol */ - public char[] ehufsi = new char[256]; /* length of code for each symbol */ - /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ - } - - /* The legal range of a DCT coefficient is - * -1024 .. +1023 for 8-bit data; - * -16384 .. +16383 for 12-bit data. - * Hence the magnitude should always fit in 10 or 14 bits respectively. - */ - protected static int MAX_HUFFMAN_COEF_BITS = 10; - private static int MAX_CLEN = 32; /* assumed maximum initial code length */ - - protected JpegCompressor m_cinfo; - - public abstract void start_pass(bool gather_statistics); - public abstract bool encode_mcu(JpegBlock[][] MCU_data); - public abstract void finish_pass(); - - /// - /// Expand a Huffman table definition into the derived format - /// Compute the derived values for a Huffman table. - /// This routine also performs some validation checks on the table. - /// - protected void jpeg_make_c_derived_tbl(bool isDC, int tblno, ref c_derived_tbl dtbl) - { - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl.huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", tblno)); - - JpegHuffmanTable htbl = isDC ? m_cinfo.m_dc_huff_tbl_ptrs[tblno] : m_cinfo.m_ac_huff_tbl_ptrs[tblno]; - if (htbl == null) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", tblno)); - - /* Allocate a workspace if we haven't already done so. */ - if (dtbl == null) - dtbl = new c_derived_tbl(); - - /* Figure C.1: make table of Huffman code length for each symbol */ - - int p = 0; - char[] huffsize = new char[257]; - for (int l = 1; l <= 16; l++) - { - int i = htbl.Bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - throw new Exception("Bogus Huffman table definition"); - - while ((i--) != 0) - huffsize[p++] = (char)l; - } - huffsize[p] = (char)0; - int lastp = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - int code = 0; - int si = huffsize[0]; - p = 0; - int[] huffcode = new int[257]; - while (huffsize[p] != 0) - { - while (((int)huffsize[p]) == si) - { - huffcode[p++] = code; - code++; - } - /* code is now 1 more than the last code used for codelength si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (code >= (1 << si)) - throw new Exception("Bogus Huffman table definition"); - code <<= 1; - si++; - } - - /* Figure C.3: generate encoding tables */ - /* These are code and size indexed by symbol value */ - - /* Set all codeless symbols to have code length 0; - * this lets us detect duplicate VAL entries here, and later - * allows emit_bits to detect any attempt to emit such symbols. - */ - Array.Clear(dtbl.ehufsi, 0, dtbl.ehufsi.Length); - - /* This is also a convenient place to check for out-of-range - * and duplicated VAL entries. We allow 0..255 for AC symbols - * but only 0..15 for DC. (We could constrain them further - * based on data depth and mode, but this seems enough.) - */ - int maxsymbol = isDC ? 15 : 255; - - for (p = 0; p < lastp; p++) - { - int i = htbl.Huffval[p]; - if (i < 0 || i > maxsymbol || dtbl.ehufsi[i] != 0) - throw new Exception("Bogus Huffman table definition"); - - dtbl.ehufco[i] = huffcode[p]; - dtbl.ehufsi[i] = huffsize[p]; - } - } - - /// - /// Generate the best Huffman code table for the given counts, fill htbl. - /// - /// The JPEG standard requires that no symbol be assigned a codeword of all - /// one bits (so that padding bits added at the end of a compressed segment - /// can't look like a valid code). Because of the canonical ordering of - /// codewords, this just means that there must be an unused slot in the - /// longest codeword length category. Section K.2 of the JPEG spec suggests - /// reserving such a slot by pretending that symbol 256 is a valid symbol - /// with count 1. In theory that's not optimal; giving it count zero but - /// including it in the symbol set anyway should give a better Huffman code. - /// But the theoretically better code actually seems to come out worse in - /// practice, because it produces more all-ones bytes (which incur stuffed - /// zero bytes in the final file). In any case the difference is tiny. - /// - /// The JPEG standard requires Huffman codes to be no more than 16 bits long. - /// If some symbols have a very small but nonzero probability, the Huffman tree - /// must be adjusted to meet the code length restriction. We currently use - /// the adjustment method suggested in JPEG section K.2. This method is *not* - /// optimal; it may not choose the best possible limited-length code. But - /// typically only very-low-frequency symbols will be given less-than-optimal - /// lengths, so the code is almost optimal. Experimental comparisons against - /// an optimal limited-length-code algorithm indicate that the difference is - /// microscopic --- usually less than a hundredth of a percent of total size. - /// So the extra complexity of an optimal algorithm doesn't seem worthwhile. - /// - protected void jpeg_gen_optimal_table(JpegHuffmanTable htbl, long[] freq) - { - byte[] bits = new byte[MAX_CLEN + 1]; /* bits[k] = # of symbols with code length k */ - int[] codesize = new int[257]; /* codesize[k] = code length of symbol k */ - int[] others = new int[257]; /* next symbol in current branch of tree */ - int c1, c2; - int p, i, j; - long v; - - /* This algorithm is explained in section K.2 of the JPEG standard */ - for (i = 0; i < 257; i++) - others[i] = -1; /* init links to empty */ - - freq[256] = 1; /* make sure 256 has a nonzero count */ - /* Including the pseudo-symbol 256 in the Huffman procedure guarantees - * that no real symbol is given code-value of all ones, because 256 - * will be placed last in the largest codeword category. - */ - - /* Huffman's basic algorithm to assign optimal code lengths to symbols */ - - for (; ; ) - { - /* Find the smallest nonzero frequency, set c1 = its symbol */ - /* In case of ties, take the larger symbol number */ - c1 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) - { - if (freq[i] != 0 && freq[i] <= v) - { - v = freq[i]; - c1 = i; - } - } - - /* Find the next smallest nonzero frequency, set c2 = its symbol */ - /* In case of ties, take the larger symbol number */ - c2 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) - { - if (freq[i] != 0 && freq[i] <= v && i != c1) - { - v = freq[i]; - c2 = i; - } - } - - /* Done if we've merged everything into one frequency */ - if (c2 < 0) - break; - - /* Else merge the two counts/trees */ - freq[c1] += freq[c2]; - freq[c2] = 0; - - /* Increment the codesize of everything in c1's tree branch */ - codesize[c1]++; - while (others[c1] >= 0) - { - c1 = others[c1]; - codesize[c1]++; - } - - others[c1] = c2; /* chain c2 onto c1's tree branch */ - - /* Increment the codesize of everything in c2's tree branch */ - codesize[c2]++; - while (others[c2] >= 0) - { - c2 = others[c2]; - codesize[c2]++; - } - } - - /* Now count the number of symbols of each code length */ - for (i = 0; i <= 256; i++) - { - if (codesize[i] != 0) - { - /* The JPEG standard seems to think that this can't happen, */ - /* but I'm paranoid... */ - if (codesize[i] > MAX_CLEN) - throw new Exception("Huffman code size table overflow"); - - bits[codesize[i]]++; - } - } - - /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure - * Huffman procedure assigned any such lengths, we must adjust the coding. - * Here is what the JPEG spec says about how this next bit works: - * Since symbols are paired for the longest Huffman code, the symbols are - * removed from this length category two at a time. The prefix for the pair - * (which is one bit shorter) is allocated to one of the pair; then, - * skipping the BITS entry for that prefix length, a code word from the next - * shortest nonzero BITS entry is converted into a prefix for two code words - * one bit longer. - */ - - for (i = MAX_CLEN; i > 16; i--) - { - while (bits[i] > 0) - { - j = i - 2; /* find length of new prefix to be used */ - while (bits[j] == 0) - j--; - - bits[i] -= 2; /* remove two symbols */ - bits[i - 1]++; /* one goes in this length */ - bits[j + 1] += 2; /* two new symbols in this length */ - bits[j]--; /* symbol of this length is now a prefix */ - } - } - - /* Remove the count for the pseudo-symbol 256 from the largest codelength */ - while (bits[i] == 0) /* find largest codelength still in use */ - i--; - bits[i]--; - - /* Return final symbol counts (only for lengths 0..16) */ - Buffer.BlockCopy(bits, 0, htbl.Bits, 0, htbl.Bits.Length); - - /* Return a list of the symbols sorted by code length */ - /* It's not real clear to me why we don't need to consider the codelength - * changes made above, but the JPEG spec seems to think this works. - */ - p = 0; - for (i = 1; i <= MAX_CLEN; i++) - { - for (j = 0; j <= 255; j++) - { - if (codesize[j] == i) - { - htbl.Huffval[p] = (byte)j; - p++; - } - } - } - - /* Set sent_table false so updated table will be written to JPEG file. */ - htbl.Sent_table = false; - } - } - #endregion - - #region JpegFowardDCT - /// - /// Forward DCT (also controls coefficient quantization) - /// - /// A forward DCT routine is given a pointer to a work area of type DCTELEM[]; - /// the DCT is to be performed in-place in that buffer. Type DCTELEM is int - /// for 8-bit samples, int for 12-bit samples. (NOTE: Floating-point DCT - /// implementations use an array of type float, instead.) - /// The DCT inputs are expected to be signed (range +-MediumSampleValue). - /// The DCT outputs are returned scaled up by a factor of 8; they therefore - /// have a range of +-8K for 8-bit data, +-128K for 12-bit data. This - /// convention improves accuracy in integer implementations and saves some - /// work in floating-point ones. - /// - /// Each IDCT routine has its own ideas about the best dct_table element type. - /// - class JpegFowardDCT - { - private const int FAST_INTEGER_CONST_BITS = 8; - - /* We use the following pre-calculated constants. - * If you change FAST_INTEGER_CONST_BITS you may want to add appropriate values. - * - * Convert a positive real constant to an integer scaled by CONST_SCALE. - * static int FAST_INTEGER_FIX(double x) - *{ - * return ((int) ((x) * (((int) 1) << FAST_INTEGER_CONST_BITS) + 0.5)); - *} - */ - private const int FAST_INTEGER_FIX_0_382683433 = 98; /* FIX(0.382683433) */ - private const int FAST_INTEGER_FIX_0_541196100 = 139; /* FIX(0.541196100) */ - private const int FAST_INTEGER_FIX_0_707106781 = 181; /* FIX(0.707106781) */ - private const int FAST_INTEGER_FIX_1_306562965 = 334; /* FIX(1.306562965) */ - - private const int SLOW_INTEGER_CONST_BITS = 13; - private const int SLOW_INTEGER_PASS1_BITS = 2; - - /* We use the following pre-calculated constants. - * If you change SLOW_INTEGER_CONST_BITS you may want to add appropriate values. - * - * Convert a positive real constant to an integer scaled by CONST_SCALE. - * - * static int SLOW_INTEGER_FIX(double x) - * { - * return ((int) ((x) * (((int) 1) << SLOW_INTEGER_CONST_BITS) + 0.5)); - * } - */ - private const int SLOW_INTEGER_FIX_0_298631336 = 2446; /* FIX(0.298631336) */ - private const int SLOW_INTEGER_FIX_0_390180644 = 3196; /* FIX(0.390180644) */ - private const int SLOW_INTEGER_FIX_0_541196100 = 4433; /* FIX(0.541196100) */ - private const int SLOW_INTEGER_FIX_0_765366865 = 6270; /* FIX(0.765366865) */ - private const int SLOW_INTEGER_FIX_0_899976223 = 7373; /* FIX(0.899976223) */ - private const int SLOW_INTEGER_FIX_1_175875602 = 9633; /* FIX(1.175875602) */ - private const int SLOW_INTEGER_FIX_1_501321110 = 12299; /* FIX(1.501321110) */ - private const int SLOW_INTEGER_FIX_1_847759065 = 15137; /* FIX(1.847759065) */ - private const int SLOW_INTEGER_FIX_1_961570560 = 16069; /* FIX(1.961570560) */ - private const int SLOW_INTEGER_FIX_2_053119869 = 16819; /* FIX(2.053119869) */ - private const int SLOW_INTEGER_FIX_2_562915447 = 20995; /* FIX(2.562915447) */ - private const int SLOW_INTEGER_FIX_3_072711026 = 25172; /* FIX(3.072711026) */ - - /* For AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - */ - private const int CONST_BITS = 14; - - /* precomputed values scaled up by 14 bits */ - private static short[] aanscales = { - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 22725, 31521, 29692, 26722, 22725, 17855, - 12299, 6270, 21407, 29692, 27969, 25172, 21407, 16819, 11585, - 5906, 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 12873, - 17855, 16819, 15137, 12873, 10114, 6967, 3552, 8867, 12299, - 11585, 10426, 8867, 6967, 4799, 2446, 4520, 6270, 5906, 5315, - 4520, 3552, 2446, 1247 }; - - /* For float AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - * What's actually stored is 1/divisor so that the inner loop can - * use a multiplication rather than a division. - */ - private static double[] aanscalefactor = { - 1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, - 0.785694958, 0.541196100, 0.275899379 }; - - private JpegCompressor m_cinfo; - private bool m_useSlowMethod; - private bool m_useFloatMethod; - - /* The actual post-DCT divisors --- not identical to the quant table - * entries, because of scaling (especially for an unnormalized DCT). - * Each table is given in normal array order. - */ - private int[][] m_divisors = new int[JpegConstants.NumberOfQuantTables][]; - - /* Same as above for the floating-point case. */ - private float[][] m_float_divisors = new float[JpegConstants.NumberOfQuantTables][]; - - public JpegFowardDCT(JpegCompressor cinfo) - { - m_cinfo = cinfo; - - switch (cinfo.m_dct_method) - { - case DCTMethod.IntSlow: - m_useFloatMethod = false; - m_useSlowMethod = true; - break; - case DCTMethod.IntFast: - m_useFloatMethod = false; - m_useSlowMethod = false; - break; - case DCTMethod.Float: - m_useFloatMethod = true; - break; - default: - throw new Exception("Unknown dct method!"); - } - - /* Mark divisor tables unallocated */ - for (int i = 0; i < JpegConstants.NumberOfQuantTables; i++) - { - m_divisors[i] = null; - m_float_divisors[i] = null; - } - } - - /// - /// Initialize for a processing pass. - /// Verify that all referenced Q-tables are present, and set up - /// the divisor table for each one. - /// In the current implementation, DCT of all components is done during - /// the first pass, even if only some components will be output in the - /// first scan. Hence all components should be examined here. - /// - public virtual void start_pass() - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - int qtblno = m_cinfo.Component_info[ci].Quant_tbl_no; - - /* Make sure specified quantization table is present */ - if (qtblno < 0 || qtblno >= JpegConstants.NumberOfQuantTables || m_cinfo.m_quant_tbl_ptrs[qtblno] == null) - throw new Exception(String.Format("Quantization table 0x{0:X2} was not defined", qtblno)); - - JpegQuantizationTable qtbl = m_cinfo.m_quant_tbl_ptrs[qtblno]; - - /* Compute divisors for this quant table */ - /* We may do this more than once for same table, but it's not a big deal */ - int i = 0; - switch (m_cinfo.m_dct_method) - { - case DCTMethod.IntSlow: - /* For LL&M IDCT method, divisors are equal to raw quantization - * coefficients multiplied by 8 (to counteract scaling). - */ - if (m_divisors[qtblno] == null) - m_divisors[qtblno] = new int[JpegConstants.DCTSize2]; - - for (i = 0; i < JpegConstants.DCTSize2; i++) - m_divisors[qtblno][i] = ((int)qtbl.quantval[i]) << 3; - - break; - case DCTMethod.IntFast: - if (m_divisors[qtblno] == null) - m_divisors[qtblno] = new int[JpegConstants.DCTSize2]; - - for (i = 0; i < JpegConstants.DCTSize2; i++) - m_divisors[qtblno][i] = JpegUtils.DESCALE((int)qtbl.quantval[i] * (int)aanscales[i], CONST_BITS - 3); - break; - case DCTMethod.Float: - if (m_float_divisors[qtblno] == null) - m_float_divisors[qtblno] = new float[JpegConstants.DCTSize2]; - - float[] fdtbl = m_float_divisors[qtblno]; - i = 0; - for (int row = 0; row < JpegConstants.DCTSize; row++) - { - for (int col = 0; col < JpegConstants.DCTSize; col++) - { - fdtbl[i] = (float)(1.0 / (((double)qtbl.quantval[i] * aanscalefactor[row] * aanscalefactor[col] * 8.0))); - i++; - } - } - break; - default: - throw new Exception("Unknown dct method!"); - } - } - } - - /// - /// Perform forward DCT on one or more blocks of a component. - /// - /// The input samples are taken from the sample_data[] array starting at - /// position start_row/start_col, and moving to the right for any additional - /// blocks. The quantized coefficients are returned in coef_blocks[]. - /// - public virtual void forward_DCT(int quant_tbl_no, byte[][] sample_data, JpegBlock[] coef_blocks, int start_row, int start_col, int num_blocks) - { - if (m_useFloatMethod) - forwardDCTFloatImpl(quant_tbl_no, sample_data, coef_blocks, start_row, start_col, num_blocks); - else - forwardDCTImpl(quant_tbl_no, sample_data, coef_blocks, start_row, start_col, num_blocks); - } - - // This version is used for integer DCT implementations. - private void forwardDCTImpl(int quant_tbl_no, byte[][] sample_data, JpegBlock[] coef_blocks, int start_row, int start_col, int num_blocks) - { - /* This routine is heavily used, so it's worth coding it tightly. */ - int[] workspace = new int[JpegConstants.DCTSize2]; /* work area for FDCT subroutine */ - for (int bi = 0; bi < num_blocks; bi++, start_col += JpegConstants.DCTSize) - { - /* Load data into workspace, applying unsigned->signed conversion */ - int workspaceIndex = 0; - for (int elemr = 0; elemr < JpegConstants.DCTSize; elemr++) - { - for (int column = 0; column < JpegConstants.DCTSize; column++) - { - workspace[workspaceIndex] = (int)sample_data[start_row + elemr][start_col + column] - JpegConstants.MediumSampleValue; - workspaceIndex++; - } - } - - /* Perform the DCT */ - if (m_useSlowMethod) - jpeg_fdct_islow(workspace); - else - jpeg_fdct_ifast(workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - int qval = m_divisors[quant_tbl_no][i]; - int temp = workspace[i]; - - if (temp < 0) - { - temp = -temp; - temp += qval >> 1; /* for rounding */ - - if (temp >= qval) - temp /= qval; - else - temp = 0; - - temp = -temp; - } - else - { - temp += qval >> 1; /* for rounding */ - - if (temp >= qval) - temp /= qval; - else - temp = 0; - } - - coef_blocks[bi][i] = (short)temp; - } - } - } - - // This version is used for floating-point DCT implementations. - private void forwardDCTFloatImpl(int quant_tbl_no, byte[][] sample_data, JpegBlock[] coef_blocks, int start_row, int start_col, int num_blocks) - { - /* This routine is heavily used, so it's worth coding it tightly. */ - float[] workspace = new float[JpegConstants.DCTSize2]; /* work area for FDCT subroutine */ - for (int bi = 0; bi < num_blocks; bi++, start_col += JpegConstants.DCTSize) - { - /* Load data into workspace, applying unsigned->signed conversion */ - int workspaceIndex = 0; - for (int elemr = 0; elemr < JpegConstants.DCTSize; elemr++) - { - for (int column = 0; column < JpegConstants.DCTSize; column++) - { - workspace[workspaceIndex] = (float)((int)sample_data[start_row + elemr][start_col + column] - JpegConstants.MediumSampleValue); - workspaceIndex++; - } - } - - /* Perform the DCT */ - jpeg_fdct_float(workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - /* Apply the quantization and scaling factor */ - float temp = workspace[i] * m_float_divisors[quant_tbl_no][i]; - - /* Round to nearest integer. - * Since C does not specify the direction of rounding for negative - * quotients, we have to force the dividend positive for portability. - * The maximum coefficient size is +-16K (for 12-bit data), so this - * code should work for either 16-bit or 32-bit ints. - */ - coef_blocks[bi][i] = (short)((int)(temp + (float)16384.5) - 16384); - } - } - } - - /// - /// Perform the forward DCT on one block of samples. - /// NOTE: this code only copes with 8x8 DCTs. - /// - /// A floating-point implementation of the - /// forward DCT (Discrete Cosine Transform). - /// - /// This implementation should be more accurate than either of the integer - /// DCT implementations. However, it may not give the same results on all - /// machines because of differences in roundoff behavior. Speed will depend - /// on the hardware's floating point capacity. - /// - /// A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - /// on each column. Direct algorithms are also available, but they are - /// much more complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on Arai, Agui, and Nakajima's algorithm for - /// scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - /// Japanese, but the algorithm is described in the Pennebaker & Mitchell - /// JPEG textbook (see REFERENCES section in file README). The following code - /// is based directly on figure 4-8 in P&M. - /// While an 8-point DCT cannot be done in less than 11 multiplies, it is - /// possible to arrange the computation so that many of the multiplies are - /// simple scalings of the final outputs. These multiplies can then be - /// folded into the multiplications or divisions by the JPEG quantization - /// table entries. The AA&N method leaves only 5 multiplies and 29 adds - /// to be done in the DCT itself. - /// The primary disadvantage of this method is that with a fixed-point - /// implementation, accuracy is lost due to imprecise representation of the - /// scaled quantization values. However, that problem does not arise if - /// we use floating point arithmetic. - /// - private static void jpeg_fdct_float(float[] data) - { - /* Pass 1: process rows. */ - int dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - float tmp0 = data[dataIndex + 0] + data[dataIndex + 7]; - float tmp7 = data[dataIndex + 0] - data[dataIndex + 7]; - float tmp1 = data[dataIndex + 1] + data[dataIndex + 6]; - float tmp6 = data[dataIndex + 1] - data[dataIndex + 6]; - float tmp2 = data[dataIndex + 2] + data[dataIndex + 5]; - float tmp5 = data[dataIndex + 2] - data[dataIndex + 5]; - float tmp3 = data[dataIndex + 3] + data[dataIndex + 4]; - float tmp4 = data[dataIndex + 3] - data[dataIndex + 4]; - - /* Even part */ - - float tmp10 = tmp0 + tmp3; /* phase 2 */ - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - data[dataIndex + 0] = tmp10 + tmp11; /* phase 3 */ - data[dataIndex + 4] = tmp10 - tmp11; - - float z1 = (tmp12 + tmp13) * ((float)0.707106781); /* c4 */ - data[dataIndex + 2] = tmp13 + z1; /* phase 5 */ - data[dataIndex + 6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - float z5 = (tmp10 - tmp12) * ((float)0.382683433); /* c6 */ - float z2 = ((float)0.541196100) * tmp10 + z5; /* c2-c6 */ - float z4 = ((float)1.306562965) * tmp12 + z5; /* c2+c6 */ - float z3 = tmp11 * ((float)0.707106781); /* c4 */ - - float z11 = tmp7 + z3; /* phase 5 */ - float z13 = tmp7 - z3; - - data[dataIndex + 5] = z13 + z2; /* phase 6 */ - data[dataIndex + 3] = z13 - z2; - data[dataIndex + 1] = z11 + z4; - data[dataIndex + 7] = z11 - z4; - - dataIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - float tmp0 = data[dataIndex + JpegConstants.DCTSize * 0] + data[dataIndex + JpegConstants.DCTSize * 7]; - float tmp7 = data[dataIndex + JpegConstants.DCTSize * 0] - data[dataIndex + JpegConstants.DCTSize * 7]; - float tmp1 = data[dataIndex + JpegConstants.DCTSize * 1] + data[dataIndex + JpegConstants.DCTSize * 6]; - float tmp6 = data[dataIndex + JpegConstants.DCTSize * 1] - data[dataIndex + JpegConstants.DCTSize * 6]; - float tmp2 = data[dataIndex + JpegConstants.DCTSize * 2] + data[dataIndex + JpegConstants.DCTSize * 5]; - float tmp5 = data[dataIndex + JpegConstants.DCTSize * 2] - data[dataIndex + JpegConstants.DCTSize * 5]; - float tmp3 = data[dataIndex + JpegConstants.DCTSize * 3] + data[dataIndex + JpegConstants.DCTSize * 4]; - float tmp4 = data[dataIndex + JpegConstants.DCTSize * 3] - data[dataIndex + JpegConstants.DCTSize * 4]; - - /* Even part */ - - float tmp10 = tmp0 + tmp3; /* phase 2 */ - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - data[dataIndex + JpegConstants.DCTSize * 0] = tmp10 + tmp11; /* phase 3 */ - data[dataIndex + JpegConstants.DCTSize * 4] = tmp10 - tmp11; - - float z1 = (tmp12 + tmp13) * ((float)0.707106781); /* c4 */ - data[dataIndex + JpegConstants.DCTSize * 2] = tmp13 + z1; /* phase 5 */ - data[dataIndex + JpegConstants.DCTSize * 6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - float z5 = (tmp10 - tmp12) * ((float)0.382683433); /* c6 */ - float z2 = ((float)0.541196100) * tmp10 + z5; /* c2-c6 */ - float z4 = ((float)1.306562965) * tmp12 + z5; /* c2+c6 */ - float z3 = tmp11 * ((float)0.707106781); /* c4 */ - - float z11 = tmp7 + z3; /* phase 5 */ - float z13 = tmp7 - z3; - - data[dataIndex + JpegConstants.DCTSize * 5] = z13 + z2; /* phase 6 */ - data[dataIndex + JpegConstants.DCTSize * 3] = z13 - z2; - data[dataIndex + JpegConstants.DCTSize * 1] = z11 + z4; - data[dataIndex + JpegConstants.DCTSize * 7] = z11 - z4; - - dataIndex++; /* advance pointer to next column */ - } - } - - /// - /// Perform the forward DCT on one block of samples. - /// NOTE: this code only copes with 8x8 DCTs. - /// This file contains a fast, not so accurate integer implementation of the - /// forward DCT (Discrete Cosine Transform). - /// - /// A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - /// on each column. Direct algorithms are also available, but they are - /// much more complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on Arai, Agui, and Nakajima's algorithm for - /// scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - /// Japanese, but the algorithm is described in the Pennebaker & Mitchell - /// JPEG textbook (see REFERENCES section in file README). The following code - /// is based directly on figure 4-8 in P&M. - /// While an 8-point DCT cannot be done in less than 11 multiplies, it is - /// possible to arrange the computation so that many of the multiplies are - /// simple scalings of the final outputs. These multiplies can then be - /// folded into the multiplications or divisions by the JPEG quantization - /// table entries. The AA&N method leaves only 5 multiplies and 29 adds - /// to be done in the DCT itself. - /// The primary disadvantage of this method is that with fixed-point math, - /// accuracy is lost due to imprecise representation of the scaled - /// quantization values. The smaller the quantization table entry, the less - /// precise the scaled value, so this implementation does worse with high- - /// quality-setting files than with low-quality ones. - /// - /// Scaling decisions are generally the same as in the LL&M algorithm; - /// see jpeg_fdct_islow for more details. However, we choose to descale - /// (right shift) multiplication products as soon as they are formed, - /// rather than carrying additional fractional bits into subsequent additions. - /// This compromises accuracy slightly, but it lets us save a few shifts. - /// More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - /// everywhere except in the multiplications proper; this saves a good deal - /// of work on 16-bit-int machines. - /// - /// Again to save a few shifts, the intermediate results between pass 1 and - /// pass 2 are not upscaled, but are represented only to integral precision. - /// - /// A final compromise is to represent the multiplicative constants to only - /// 8 fractional bits, rather than 13. This saves some shifting work on some - /// machines, and may also reduce the cost of multiplication (since there - /// are fewer one-bits in the constants). - /// - private static void jpeg_fdct_ifast(int[] data) - { - /* Pass 1: process rows. */ - int dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - int tmp0 = data[dataIndex + 0] + data[dataIndex + 7]; - int tmp7 = data[dataIndex + 0] - data[dataIndex + 7]; - int tmp1 = data[dataIndex + 1] + data[dataIndex + 6]; - int tmp6 = data[dataIndex + 1] - data[dataIndex + 6]; - int tmp2 = data[dataIndex + 2] + data[dataIndex + 5]; - int tmp5 = data[dataIndex + 2] - data[dataIndex + 5]; - int tmp3 = data[dataIndex + 3] + data[dataIndex + 4]; - int tmp4 = data[dataIndex + 3] - data[dataIndex + 4]; - - /* Even part */ - - int tmp10 = tmp0 + tmp3; /* phase 2 */ - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - data[dataIndex + 0] = tmp10 + tmp11; /* phase 3 */ - data[dataIndex + 4] = tmp10 - tmp11; - - int z1 = FAST_INTEGER_MULTIPLY(tmp12 + tmp13, FAST_INTEGER_FIX_0_707106781); /* c4 */ - data[dataIndex + 2] = tmp13 + z1; /* phase 5 */ - data[dataIndex + 6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - int z5 = FAST_INTEGER_MULTIPLY(tmp10 - tmp12, FAST_INTEGER_FIX_0_382683433); /* c6 */ - int z2 = FAST_INTEGER_MULTIPLY(tmp10, FAST_INTEGER_FIX_0_541196100) + z5; /* c2-c6 */ - int z4 = FAST_INTEGER_MULTIPLY(tmp12, FAST_INTEGER_FIX_1_306562965) + z5; /* c2+c6 */ - int z3 = FAST_INTEGER_MULTIPLY(tmp11, FAST_INTEGER_FIX_0_707106781); /* c4 */ - - int z11 = tmp7 + z3; /* phase 5 */ - int z13 = tmp7 - z3; - - data[dataIndex + 5] = z13 + z2; /* phase 6 */ - data[dataIndex + 3] = z13 - z2; - data[dataIndex + 1] = z11 + z4; - data[dataIndex + 7] = z11 - z4; - - dataIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - int tmp0 = data[dataIndex + JpegConstants.DCTSize * 0] + data[dataIndex + JpegConstants.DCTSize * 7]; - int tmp7 = data[dataIndex + JpegConstants.DCTSize * 0] - data[dataIndex + JpegConstants.DCTSize * 7]; - int tmp1 = data[dataIndex + JpegConstants.DCTSize * 1] + data[dataIndex + JpegConstants.DCTSize * 6]; - int tmp6 = data[dataIndex + JpegConstants.DCTSize * 1] - data[dataIndex + JpegConstants.DCTSize * 6]; - int tmp2 = data[dataIndex + JpegConstants.DCTSize * 2] + data[dataIndex + JpegConstants.DCTSize * 5]; - int tmp5 = data[dataIndex + JpegConstants.DCTSize * 2] - data[dataIndex + JpegConstants.DCTSize * 5]; - int tmp3 = data[dataIndex + JpegConstants.DCTSize * 3] + data[dataIndex + JpegConstants.DCTSize * 4]; - int tmp4 = data[dataIndex + JpegConstants.DCTSize * 3] - data[dataIndex + JpegConstants.DCTSize * 4]; - - /* Even part */ - - int tmp10 = tmp0 + tmp3; /* phase 2 */ - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - data[dataIndex + JpegConstants.DCTSize * 0] = tmp10 + tmp11; /* phase 3 */ - data[dataIndex + JpegConstants.DCTSize * 4] = tmp10 - tmp11; - - int z1 = FAST_INTEGER_MULTIPLY(tmp12 + tmp13, FAST_INTEGER_FIX_0_707106781); /* c4 */ - data[dataIndex + JpegConstants.DCTSize * 2] = tmp13 + z1; /* phase 5 */ - data[dataIndex + JpegConstants.DCTSize * 6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - int z5 = FAST_INTEGER_MULTIPLY(tmp10 - tmp12, FAST_INTEGER_FIX_0_382683433); /* c6 */ - int z2 = FAST_INTEGER_MULTIPLY(tmp10, FAST_INTEGER_FIX_0_541196100) + z5; /* c2-c6 */ - int z4 = FAST_INTEGER_MULTIPLY(tmp12, FAST_INTEGER_FIX_1_306562965) + z5; /* c2+c6 */ - int z3 = FAST_INTEGER_MULTIPLY(tmp11, FAST_INTEGER_FIX_0_707106781); /* c4 */ - - int z11 = tmp7 + z3; /* phase 5 */ - int z13 = tmp7 - z3; - - data[dataIndex + JpegConstants.DCTSize * 5] = z13 + z2; /* phase 6 */ - data[dataIndex + JpegConstants.DCTSize * 3] = z13 - z2; - data[dataIndex + JpegConstants.DCTSize * 1] = z11 + z4; - data[dataIndex + JpegConstants.DCTSize * 7] = z11 - z4; - - dataIndex++; /* advance pointer to next column */ - } - } - - /// - /// Perform the forward DCT on one block of samples. - /// NOTE: this code only copes with 8x8 DCTs. - /// - /// A slow-but-accurate integer implementation of the - /// forward DCT (Discrete Cosine Transform). - /// - /// A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - /// on each column. Direct algorithms are also available, but they are - /// much more complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on an algorithm described in - /// C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - /// Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - /// Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - /// The primary algorithm described there uses 11 multiplies and 29 adds. - /// We use their alternate method with 12 multiplies and 32 adds. - /// The advantage of this method is that no data path contains more than one - /// multiplication; this allows a very simple and accurate implementation in - /// scaled fixed-point arithmetic, with a minimal number of shifts. - /// - /// The poop on this scaling stuff is as follows: - /// - /// Each 1-D DCT step produces outputs which are a factor of sqrt(N) - /// larger than the true DCT outputs. The final outputs are therefore - /// a factor of N larger than desired; since N=8 this can be cured by - /// a simple right shift at the end of the algorithm. The advantage of - /// this arrangement is that we save two multiplications per 1-D DCT, - /// because the y0 and y4 outputs need not be divided by sqrt(N). - /// In the IJG code, this factor of 8 is removed by the quantization - /// step, NOT here. - /// - /// We have to do addition and subtraction of the integer inputs, which - /// is no problem, and multiplication by fractional constants, which is - /// a problem to do in integer arithmetic. We multiply all the constants - /// by CONST_SCALE and convert them to integer constants (thus retaining - /// SLOW_INTEGER_CONST_BITS bits of precision in the constants). After doing a - /// multiplication we have to divide the product by CONST_SCALE, with proper - /// rounding, to produce the correct output. This division can be done - /// cheaply as a right shift of SLOW_INTEGER_CONST_BITS bits. We postpone shifting - /// as long as possible so that partial sums can be added together with - /// full fractional precision. - /// - /// The outputs of the first pass are scaled up by SLOW_INTEGER_PASS1_BITS bits so that - /// they are represented to better-than-integral precision. These outputs - /// require BitsInSample + SLOW_INTEGER_PASS1_BITS + 3 bits; this fits in a 16-bit word - /// with the recommended scaling. (For 12-bit sample data, the intermediate - /// array is int anyway.) - /// - /// To avoid overflow of the 32-bit intermediate results in pass 2, we must - /// have BitsInSample + SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS <= 26. Error analysis - /// shows that the values given below are the most effective. - /// - private static void jpeg_fdct_islow(int[] data) - { - /* Pass 1: process rows. */ - /* Note results are scaled up by sqrt(8) compared to a true DCT; */ - /* furthermore, we scale the results by 2**SLOW_INTEGER_PASS1_BITS. */ - int dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - int tmp0 = data[dataIndex + 0] + data[dataIndex + 7]; - int tmp7 = data[dataIndex + 0] - data[dataIndex + 7]; - int tmp1 = data[dataIndex + 1] + data[dataIndex + 6]; - int tmp6 = data[dataIndex + 1] - data[dataIndex + 6]; - int tmp2 = data[dataIndex + 2] + data[dataIndex + 5]; - int tmp5 = data[dataIndex + 2] - data[dataIndex + 5]; - int tmp3 = data[dataIndex + 3] + data[dataIndex + 4]; - int tmp4 = data[dataIndex + 3] - data[dataIndex + 4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - int tmp10 = tmp0 + tmp3; - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - data[dataIndex + 0] = (tmp10 + tmp11) << SLOW_INTEGER_PASS1_BITS; - data[dataIndex + 4] = (tmp10 - tmp11) << SLOW_INTEGER_PASS1_BITS; - - int z1 = (tmp12 + tmp13) * SLOW_INTEGER_FIX_0_541196100; - data[dataIndex + 2] = JpegUtils.DESCALE(z1 + tmp13 * SLOW_INTEGER_FIX_0_765366865, - SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - data[dataIndex + 6] = JpegUtils.DESCALE(z1 + tmp12 * (-SLOW_INTEGER_FIX_1_847759065), - SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - int z2 = tmp5 + tmp6; - int z3 = tmp4 + tmp6; - int z4 = tmp5 + tmp7; - int z5 = (z3 + z4) * SLOW_INTEGER_FIX_1_175875602; /* sqrt(2) * c3 */ - - tmp4 = tmp4 * SLOW_INTEGER_FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = tmp5 * SLOW_INTEGER_FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = tmp6 * SLOW_INTEGER_FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = tmp7 * SLOW_INTEGER_FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = z1 * (-SLOW_INTEGER_FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = z2 * (-SLOW_INTEGER_FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = z3 * (-SLOW_INTEGER_FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = z4 * (-SLOW_INTEGER_FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - data[dataIndex + 7] = JpegUtils.DESCALE(tmp4 + z1 + z3, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - data[dataIndex + 5] = JpegUtils.DESCALE(tmp5 + z2 + z4, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - data[dataIndex + 3] = JpegUtils.DESCALE(tmp6 + z2 + z3, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - data[dataIndex + 1] = JpegUtils.DESCALE(tmp7 + z1 + z4, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - - dataIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - - /* Pass 2: process columns. - * We remove the SLOW_INTEGER_PASS1_BITS scaling, but leave the results scaled up - * by an overall factor of 8. - */ - - dataIndex = 0; - for (int ctr = JpegConstants.DCTSize - 1; ctr >= 0; ctr--) - { - int tmp0 = data[dataIndex + JpegConstants.DCTSize * 0] + data[dataIndex + JpegConstants.DCTSize * 7]; - int tmp7 = data[dataIndex + JpegConstants.DCTSize * 0] - data[dataIndex + JpegConstants.DCTSize * 7]; - int tmp1 = data[dataIndex + JpegConstants.DCTSize * 1] + data[dataIndex + JpegConstants.DCTSize * 6]; - int tmp6 = data[dataIndex + JpegConstants.DCTSize * 1] - data[dataIndex + JpegConstants.DCTSize * 6]; - int tmp2 = data[dataIndex + JpegConstants.DCTSize * 2] + data[dataIndex + JpegConstants.DCTSize * 5]; - int tmp5 = data[dataIndex + JpegConstants.DCTSize * 2] - data[dataIndex + JpegConstants.DCTSize * 5]; - int tmp3 = data[dataIndex + JpegConstants.DCTSize * 3] + data[dataIndex + JpegConstants.DCTSize * 4]; - int tmp4 = data[dataIndex + JpegConstants.DCTSize * 3] - data[dataIndex + JpegConstants.DCTSize * 4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - int tmp10 = tmp0 + tmp3; - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - data[dataIndex + JpegConstants.DCTSize * 0] = JpegUtils.DESCALE(tmp10 + tmp11, SLOW_INTEGER_PASS1_BITS); - data[dataIndex + JpegConstants.DCTSize * 4] = JpegUtils.DESCALE(tmp10 - tmp11, SLOW_INTEGER_PASS1_BITS); - - int z1 = (tmp12 + tmp13) * SLOW_INTEGER_FIX_0_541196100; - data[dataIndex + JpegConstants.DCTSize * 2] = JpegUtils.DESCALE(z1 + tmp13 * SLOW_INTEGER_FIX_0_765366865, - SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - data[dataIndex + JpegConstants.DCTSize * 6] = JpegUtils.DESCALE(z1 + tmp12 * (-SLOW_INTEGER_FIX_1_847759065), - SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - int z2 = tmp5 + tmp6; - int z3 = tmp4 + tmp6; - int z4 = tmp5 + tmp7; - int z5 = (z3 + z4) * SLOW_INTEGER_FIX_1_175875602; /* sqrt(2) * c3 */ - - tmp4 = tmp4 * SLOW_INTEGER_FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = tmp5 * SLOW_INTEGER_FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = tmp6 * SLOW_INTEGER_FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = tmp7 * SLOW_INTEGER_FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = z1 * (-SLOW_INTEGER_FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = z2 * (-SLOW_INTEGER_FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = z3 * (-SLOW_INTEGER_FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = z4 * (-SLOW_INTEGER_FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - data[dataIndex + JpegConstants.DCTSize * 7] = JpegUtils.DESCALE(tmp4 + z1 + z3, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - data[dataIndex + JpegConstants.DCTSize * 5] = JpegUtils.DESCALE(tmp5 + z2 + z4, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - data[dataIndex + JpegConstants.DCTSize * 3] = JpegUtils.DESCALE(tmp6 + z2 + z3, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - data[dataIndex + JpegConstants.DCTSize * 1] = JpegUtils.DESCALE(tmp7 + z1 + z4, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS); - - dataIndex++; /* advance pointer to next column */ - } - } - - /// - /// Multiply a DCTELEM variable by an int constant, and immediately - /// descale to yield a DCTELEM result. - /// - private static int FAST_INTEGER_MULTIPLY(int var, int c) - { - return (JpegUtils.DESCALE((var) * (c), FAST_INTEGER_CONST_BITS)); - } - } - #endregion - - #region JpegHuffmanTable - /// - /// Huffman coding table. - /// - public class JpegHuffmanTable - { - /* These two fields directly represent the contents of a JPEG DHT marker */ - private readonly byte[] m_bits = new byte[17]; /* bits[k] = # of symbols with codes of */ - - /* length k bits; bits[0] is unused */ - private readonly byte[] m_huffval = new byte[256]; /* The symbols, in order of incr code length */ - - private bool m_sent_table; /* true when table has been output */ - - - internal JpegHuffmanTable() - { - } - - internal byte[] Bits - { - get { return m_bits; } - } - - internal byte[] Huffval - { - get { return m_huffval; } - } - - /// - /// Gets or sets a value indicating whether the table has been output to file. - /// - /// It's initialized false when the table is created, and set - /// true when it's been output to the file. You could suppress output - /// of a table by setting this to true. - /// - /// This property is used only during compression. It's initialized - /// false when the table is created, and set true when it's been - /// output to the file. You could suppress output of a table by setting this to - /// true. (See jpeg_suppress_tables for an example.) - /// - public bool Sent_table - { - get { return m_sent_table; } - set { m_sent_table = value; } - } - } - #endregion - - #region JpegInputController - /// - /// Input control module - /// - class JpegInputController - { - private JpegDecompressor m_cinfo; - private bool m_consumeData; - private bool m_inheaders; /* true until first SOS is reached */ - private bool m_has_multiple_scans; /* True if file has multiple scans */ - private bool m_eoi_reached; /* True when EOI has been consumed */ - - /// - /// Initialize the input controller module. - /// This is called only once, when the decompression object is created. - /// - public JpegInputController(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - /* Initialize state: can't use reset_input_controller since we don't - * want to try to reset other modules yet. - */ - m_inheaders = true; - } - - public ReadResult consume_input() - { - if (m_consumeData) - return m_cinfo.m_coef.consume_data(); - - return consume_markers(); - } - - /// - /// Reset state to begin a fresh datastream. - /// - public void reset_input_controller() - { - m_consumeData = false; - m_has_multiple_scans = false; /* "unknown" would be better */ - m_eoi_reached = false; - m_inheaders = true; - - /* Reset other modules */ - m_cinfo.m_marker.reset_marker_reader(); - - /* Reset progression state -- would be cleaner if entropy decoder did this */ - m_cinfo.m_coef_bits = null; - } - - /// - /// Initialize the input modules to read a scan of compressed data. - /// The first call to this is done after initializing - /// the entire decompressor (during jpeg_start_decompress). - /// Subsequent calls come from consume_markers, below. - /// - public void start_input_pass() - { - per_scan_setup(); - latch_quant_tables(); - m_cinfo.m_entropy.start_pass(); - m_cinfo.m_coef.start_input_pass(); - m_consumeData = true; - } - - /// - /// Finish up after inputting a compressed-data scan. - /// This is called by the coefficient controller after it's read all - /// the expected data of the scan. - /// - public void finish_input_pass() - { - m_consumeData = false; - } - - public bool HasMultipleScans() - { - return m_has_multiple_scans; - } - - public bool EOIReached() - { - return m_eoi_reached; - } - - /// - /// Read JPEG markers before, between, or after compressed-data scans. - /// Change state as necessary when a new scan is reached. - /// Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - /// - /// The consume_input method pointer points either here or to the - /// coefficient controller's consume_data routine, depending on whether - /// we are reading a compressed data segment or inter-segment markers. - /// - private ReadResult consume_markers() - { - ReadResult val; - - if (m_eoi_reached) /* After hitting EOI, read no further */ - return ReadResult.Reached_EOI; - - val = m_cinfo.m_marker.read_markers(); - - switch (val) - { - case ReadResult.Reached_SOS: - /* Found SOS */ - if (m_inheaders) - { - /* 1st SOS */ - initial_setup(); - m_inheaders = false; - /* Note: start_input_pass must be called by JpegDecompressorMaster - * before any more input can be consumed. - */ - } - else - { - /* 2nd or later SOS marker */ - if (!m_has_multiple_scans) - { - /* Oops, I wasn't expecting this! */ - throw new Exception("Didn't expect more than one scan"); - } - - m_cinfo.m_inputctl.start_input_pass(); - } - break; - case ReadResult.Reached_EOI: - /* Found EOI */ - m_eoi_reached = true; - if (m_inheaders) - { - /* Tables-only data-stream, apparently */ - if (m_cinfo.m_marker.SawSOF()) - throw new Exception("Invalid JPEG file structure: missing SOS marker"); - } - else - { - /* Prevent infinite loop in coef ctlr's decompress_data routine - * if user set output_scan_number larger than number of scans. - */ - if (m_cinfo.m_output_scan_number > m_cinfo.m_input_scan_number) - m_cinfo.m_output_scan_number = m_cinfo.m_input_scan_number; - } - break; - case ReadResult.Suspended: - break; - } - - return val; - } - - /// - /// Routines to calculate various quantities related to the size of the image. - /// Called once, when first SOS marker is reached - /// - private void initial_setup() - { - /* Make sure image isn't bigger than I can handle */ - if (m_cinfo.m_image_height > JpegConstants.JpegMaxDimention || - m_cinfo.m_image_width > JpegConstants.JpegMaxDimention) - { - throw new Exception(String.Format("Maximum supported image dimension is {0} pixels", (int)JpegConstants.JpegMaxDimention)); - - } - - /* For now, precision must match compiled-in value... */ - if (m_cinfo.m_data_precision != JpegConstants.BitsInSample) - throw new Exception(String.Format("Unsupported JPEG data precision {0}", m_cinfo.m_data_precision)); - - /* Check that number of components won't exceed internal array sizes */ - if (m_cinfo.m_num_components > JpegConstants.MaxComponents) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_cinfo.m_num_components, JpegConstants.MaxComponents)); - - /* Compute maximum sampling factors; check factor validity */ - m_cinfo.m_max_h_samp_factor = 1; - m_cinfo.m_max_v_samp_factor = 1; - - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - if (m_cinfo.Comp_info[ci].H_samp_factor <= 0 || m_cinfo.Comp_info[ci].H_samp_factor > JpegConstants.MaxSamplingFactor || - m_cinfo.Comp_info[ci].V_samp_factor <= 0 || m_cinfo.Comp_info[ci].V_samp_factor > JpegConstants.MaxSamplingFactor) - { - throw new Exception("Bogus sampling factors"); - } - - m_cinfo.m_max_h_samp_factor = Math.Max(m_cinfo.m_max_h_samp_factor, m_cinfo.Comp_info[ci].H_samp_factor); - m_cinfo.m_max_v_samp_factor = Math.Max(m_cinfo.m_max_v_samp_factor, m_cinfo.Comp_info[ci].V_samp_factor); - } - - /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSize. - * In the full decompressor, this will be overridden JpegDecompressorMaster; - * but in the transcoder, JpegDecompressorMaster is not used, so we must do it here. - */ - m_cinfo.m_min_DCT_scaled_size = JpegConstants.DCTSize; - - /* Compute dimensions of components */ - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - m_cinfo.Comp_info[ci].DCT_scaled_size = JpegConstants.DCTSize; - - /* Size in DCT blocks */ - m_cinfo.Comp_info[ci].Width_in_blocks = JpegUtils.jdiv_round_up( - m_cinfo.m_image_width * m_cinfo.Comp_info[ci].H_samp_factor, - m_cinfo.m_max_h_samp_factor * JpegConstants.DCTSize); - - m_cinfo.Comp_info[ci].height_in_blocks = JpegUtils.jdiv_round_up( - m_cinfo.m_image_height * m_cinfo.Comp_info[ci].V_samp_factor, - m_cinfo.m_max_v_samp_factor * JpegConstants.DCTSize); - - /* downsampled_width and downsampled_height will also be overridden by - * JpegDecompressorMaster if we are doing full decompression. The transcoder library - * doesn't use these values, but the calling application might. - */ - /* Size in samples */ - m_cinfo.Comp_info[ci].downsampled_width = JpegUtils.jdiv_round_up( - m_cinfo.m_image_width * m_cinfo.Comp_info[ci].H_samp_factor, - m_cinfo.m_max_h_samp_factor); - - m_cinfo.Comp_info[ci].downsampled_height = JpegUtils.jdiv_round_up( - m_cinfo.m_image_height * m_cinfo.Comp_info[ci].V_samp_factor, - m_cinfo.m_max_v_samp_factor); - - /* Mark component needed, until color conversion says otherwise */ - m_cinfo.Comp_info[ci].component_needed = true; - - /* Mark no quantization table yet saved for component */ - m_cinfo.Comp_info[ci].quant_table = null; - } - - /* Compute number of fully interleaved MCU rows. */ - m_cinfo.m_total_iMCU_rows = JpegUtils.jdiv_round_up( - m_cinfo.m_image_height, m_cinfo.m_max_v_samp_factor * JpegConstants.DCTSize); - - /* Decide whether file contains multiple scans */ - if (m_cinfo.m_comps_in_scan < m_cinfo.m_num_components || m_cinfo.m_progressive_mode) - m_cinfo.m_inputctl.m_has_multiple_scans = true; - else - m_cinfo.m_inputctl.m_has_multiple_scans = false; - } - - /// - /// Save away a copy of the Q-table referenced by each component present - /// in the current scan, unless already saved during a prior scan. - /// - /// In a multiple-scan JPEG file, the encoder could assign different components - /// the same Q-table slot number, but change table definitions between scans - /// so that each component uses a different Q-table. (The IJG encoder is not - /// currently capable of doing this, but other encoders might.) Since we want - /// to be able to de-quantize all the components at the end of the file, this - /// means that we have to save away the table actually used for each component. - /// We do this by copying the table at the start of the first scan containing - /// the component. - /// The JPEG spec prohibits the encoder from changing the contents of a Q-table - /// slot between scans of a component using that slot. If the encoder does so - /// anyway, this decoder will simply use the Q-table values that were current - /// at the start of the first scan for the component. - /// - /// The decompressor output side looks only at the saved quant tables, - /// not at the current Q-table slots. - /// - private void latch_quant_tables() - { - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - - /* No work if we already saved Q-table for this component */ - if (componentInfo.quant_table != null) - continue; - - /* Make sure specified quantization table is present */ - int qtblno = componentInfo.Quant_tbl_no; - if (qtblno < 0 || qtblno >= JpegConstants.NumberOfQuantTables || m_cinfo.m_quant_tbl_ptrs[qtblno] == null) - throw new Exception(String.Format("Quantization table 0x{0:X2} was not defined", qtblno)); - - /* OK, save away the quantization table */ - JpegQuantizationTable qtbl = new JpegQuantizationTable(); - Buffer.BlockCopy(m_cinfo.m_quant_tbl_ptrs[qtblno].quantval, 0, - qtbl.quantval, 0, qtbl.quantval.Length * sizeof(short)); - qtbl.Sent_table = m_cinfo.m_quant_tbl_ptrs[qtblno].Sent_table; - componentInfo.quant_table = qtbl; - m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]] = componentInfo; - } - } - - /// - /// Do computations that are needed before processing a JPEG scan - /// cinfo.comps_in_scan and cinfo.cur_comp_info[] were set from SOS marker - /// - private void per_scan_setup() - { - if (m_cinfo.m_comps_in_scan == 1) - { - /* Non-interleaved (single-component) scan */ - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[0]]; - - /* Overall image size in MCUs */ - m_cinfo.m_MCUs_per_row = componentInfo.Width_in_blocks; - m_cinfo.m_MCU_rows_in_scan = componentInfo.height_in_blocks; - - /* For non-interleaved scan, always one block per MCU */ - componentInfo.MCU_width = 1; - componentInfo.MCU_height = 1; - componentInfo.MCU_blocks = 1; - componentInfo.MCU_sample_width = componentInfo.DCT_scaled_size; - componentInfo.last_col_width = 1; - - /* For non-interleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - int tmp = componentInfo.height_in_blocks % componentInfo.V_samp_factor; - if (tmp == 0) - tmp = componentInfo.V_samp_factor; - componentInfo.last_row_height = tmp; - m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[0]] = componentInfo; - - /* Prepare array describing MCU composition */ - m_cinfo.m_blocks_in_MCU = 1; - m_cinfo.m_MCU_membership[0] = 0; - } - else - { - /* Interleaved (multi-component) scan */ - if (m_cinfo.m_comps_in_scan <= 0 || m_cinfo.m_comps_in_scan > JpegConstants.MaxComponentsInScan) - throw new Exception(String.Format("Too many color components: {0}, max {1}", m_cinfo.m_comps_in_scan, JpegConstants.MaxComponentsInScan)); - - /* Overall image size in MCUs */ - m_cinfo.m_MCUs_per_row = JpegUtils.jdiv_round_up( - m_cinfo.m_image_width, m_cinfo.m_max_h_samp_factor * JpegConstants.DCTSize); - - m_cinfo.m_MCU_rows_in_scan = JpegUtils.jdiv_round_up( - m_cinfo.m_image_height, m_cinfo.m_max_v_samp_factor * JpegConstants.DCTSize); - - m_cinfo.m_blocks_in_MCU = 0; - - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - - /* Sampling factors give # of blocks of component in each MCU */ - componentInfo.MCU_width = componentInfo.H_samp_factor; - componentInfo.MCU_height = componentInfo.V_samp_factor; - componentInfo.MCU_blocks = componentInfo.MCU_width * componentInfo.MCU_height; - componentInfo.MCU_sample_width = componentInfo.MCU_width * componentInfo.DCT_scaled_size; - - /* Figure number of non-dummy blocks in last MCU column & row */ - int tmp = componentInfo.Width_in_blocks % componentInfo.MCU_width; - if (tmp == 0) - tmp = componentInfo.MCU_width; - componentInfo.last_col_width = tmp; - - tmp = componentInfo.height_in_blocks % componentInfo.MCU_height; - if (tmp == 0) - tmp = componentInfo.MCU_height; - componentInfo.last_row_height = tmp; - - /* Prepare array describing MCU composition */ - int mcublks = componentInfo.MCU_blocks; - if (m_cinfo.m_blocks_in_MCU + mcublks > JpegConstants.DecompressorMaxBlocksInMCU) - throw new Exception("Sampling factors too large for interleaved scan"); - - m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]] = componentInfo; - - while (mcublks-- > 0) - m_cinfo.m_MCU_membership[m_cinfo.m_blocks_in_MCU++] = ci; - } - } - } - } - #endregion - - #region JpegInverseDCT - /// - /// An inverse DCT routine is given a pointer to the input JpegBlock and a pointer - /// to an output sample array. The routine must dequantize the input data as - /// well as perform the IDCT; for dequantization, it uses the multiplier table - /// pointed to by componentInfo.dct_table. The output data is to be placed into the - /// sample array starting at a specified column. (Any row offset needed will - /// be applied to the array pointer before it is passed to the IDCT code) - /// Note that the number of samples emitted by the IDCT routine is - /// DCT_scaled_size * DCT_scaled_size. - /// - /// Each IDCT routine has its own ideas about the best dct_table element type. - /// - /// The decompressor input side saves away the appropriate - /// quantization table for each component at the start of the first scan - /// involving that component. (This is necessary in order to correctly - /// decode files that reuse Q-table slots.) - /// When we are ready to make an output pass, the saved Q-table is converted - /// to a multiplier table that will actually be used by the IDCT routine. - /// The multiplier table contents are IDCT-method-dependent. To support - /// application changes in IDCT method between scans, we can remake the - /// multiplier tables if necessary. - /// In buffered-image mode, the first output pass may occur before any data - /// has been seen for some components, and thus before their Q-tables have - /// been saved away. To handle this case, multiplier tables are preset - /// to zeroes; the result of the IDCT will be a neutral gray level. - /// - class JpegInverseDCT - { - private const int IFAST_SCALE_BITS = 2; /* fractional bits in scale factors */ - - /* - * Each IDCT routine is responsible for range-limiting its results and - * converting them to unsigned form (0..MaxSampleValue). The raw outputs could - * be quite far out of range if the input data is corrupt, so a bulletproof - * range-limiting step is required. We use a mask-and-table-lookup method - * to do the combined operations quickly. See the comments with - * prepare_range_limit_table (in jdmaster.c) for more info. - */ - private const int RANGE_MASK = (JpegConstants.MaxSampleValue * 4 + 3); /* 2 bits wider than legal samples */ - - private const int SLOW_INTEGER_CONST_BITS = 13; - private const int SLOW_INTEGER_PASS1_BITS = 2; - - /* We use the following pre-calculated constants. - * If you change SLOW_INTEGER_CONST_BITS you may want to add appropriate values. - * - * Convert a positive real constant to an integer scaled by CONST_SCALE. - * static int SLOW_INTEGER_FIX(double x) - * { - * return ((int) ((x) * (((int) 1) << SLOW_INTEGER_CONST_BITS) + 0.5)); - * } - */ - - private const int SLOW_INTEGER_FIX_0_298631336 = 2446; /* SLOW_INTEGER_FIX(0.298631336) */ - private const int SLOW_INTEGER_FIX_0_390180644 = 3196; /* SLOW_INTEGER_FIX(0.390180644) */ - private const int SLOW_INTEGER_FIX_0_541196100 = 4433; /* SLOW_INTEGER_FIX(0.541196100) */ - private const int SLOW_INTEGER_FIX_0_765366865 = 6270; /* SLOW_INTEGER_FIX(0.765366865) */ - private const int SLOW_INTEGER_FIX_0_899976223 = 7373; /* SLOW_INTEGER_FIX(0.899976223) */ - private const int SLOW_INTEGER_FIX_1_175875602 = 9633; /* SLOW_INTEGER_FIX(1.175875602) */ - private const int SLOW_INTEGER_FIX_1_501321110 = 12299; /* SLOW_INTEGER_FIX(1.501321110) */ - private const int SLOW_INTEGER_FIX_1_847759065 = 15137; /* SLOW_INTEGER_FIX(1.847759065) */ - private const int SLOW_INTEGER_FIX_1_961570560 = 16069; /* SLOW_INTEGER_FIX(1.961570560) */ - private const int SLOW_INTEGER_FIX_2_053119869 = 16819; /* SLOW_INTEGER_FIX(2.053119869) */ - private const int SLOW_INTEGER_FIX_2_562915447 = 20995; /* SLOW_INTEGER_FIX(2.562915447) */ - private const int SLOW_INTEGER_FIX_3_072711026 = 25172; /* SLOW_INTEGER_FIX(3.072711026) */ - - private const int FAST_INTEGER_CONST_BITS = 8; - private const int FAST_INTEGER_PASS1_BITS = 2; - - /* We use the following pre-calculated constants. - * If you change FAST_INTEGER_CONST_BITS you may want to add appropriate values. - */ - private const int FAST_INTEGER_FIX_1_082392200 = 277; /* FAST_INTEGER_FIX(1.082392200) */ - private const int FAST_INTEGER_FIX_1_414213562 = 362; /* FAST_INTEGER_FIX(1.414213562) */ - private const int FAST_INTEGER_FIX_1_847759065 = 473; /* FAST_INTEGER_FIX(1.847759065) */ - private const int FAST_INTEGER_FIX_2_613125930 = 669; /* FAST_INTEGER_FIX(2.613125930) */ - - private const int REDUCED_CONST_BITS = 13; - private const int REDUCED_PASS1_BITS = 2; - - /* We use the following pre-calculated constants. - * If you change REDUCED_CONST_BITS you may want to add appropriate values. - * Convert a positive real constant to an integer scaled by CONST_SCALE. - * static int REDUCED_FIX(double x) - * { - * return ((int) ((x) * (((int) 1) << REDUCED_CONST_BITS) + 0.5)); - * } - */ - - private const int REDUCED_FIX_0_211164243 = 1730; /* REDUCED_FIX(0.211164243) */ - private const int REDUCED_FIX_0_509795579 = 4176; /* REDUCED_FIX(0.509795579) */ - private const int REDUCED_FIX_0_601344887 = 4926; /* REDUCED_FIX(0.601344887) */ - private const int REDUCED_FIX_0_720959822 = 5906; /* REDUCED_FIX(0.720959822) */ - private const int REDUCED_FIX_0_765366865 = 6270; /* REDUCED_FIX(0.765366865) */ - private const int REDUCED_FIX_0_850430095 = 6967; /* REDUCED_FIX(0.850430095) */ - private const int REDUCED_FIX_0_899976223 = 7373; /* REDUCED_FIX(0.899976223) */ - private const int REDUCED_FIX_1_061594337 = 8697; /* REDUCED_FIX(1.061594337) */ - private const int REDUCED_FIX_1_272758580 = 10426; /* REDUCED_FIX(1.272758580) */ - private const int REDUCED_FIX_1_451774981 = 11893; /* REDUCED_FIX(1.451774981) */ - private const int REDUCED_FIX_1_847759065 = 15137; /* REDUCED_FIX(1.847759065) */ - private const int REDUCED_FIX_2_172734803 = 17799; /* REDUCED_FIX(2.172734803) */ - private const int REDUCED_FIX_2_562915447 = 20995; /* REDUCED_FIX(2.562915447) */ - private const int REDUCED_FIX_3_624509785 = 29692; /* REDUCED_FIX(3.624509785) */ - - /* precomputed values scaled up by 14 bits */ - private static short[] aanscales = - { - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 22725, 31521, 29692, 26722, 22725, 17855, - 12299, 6270, 21407, 29692, 27969, 25172, 21407, 16819, 11585, - 5906, 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 12873, - 17855, 16819, 15137, 12873, 10114, 6967, 3552, 8867, 12299, - 11585, 10426, 8867, 6967, 4799, 2446, 4520, 6270, 5906, 5315, - 4520, 3552, 2446, 1247 - }; - - private const int CONST_BITS = 14; - - private static double[] aanscalefactor = - { - 1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, - 0.785694958, 0.541196100, 0.275899379 - }; - - private enum InverseMethod - { - Unknown, - idct_1x1_method, - idct_2x2_method, - idct_4x4_method, - idct_islow_method, - idct_ifast_method, - idct_float_method - } - - /* It is useful to allow each component to have a separate IDCT method. */ - private InverseMethod[] m_inverse_DCT_method = new InverseMethod[JpegConstants.MaxComponents]; - - /* Allocated multiplier tables: big enough for any supported variant */ - private class multiplier_table - { - public int[] int_array = new int[JpegConstants.DCTSize2]; - public float[] float_array = new float[JpegConstants.DCTSize2]; - }; - - private multiplier_table[] m_dctTables; - - private JpegDecompressor m_cinfo; - - /* This array contains the IDCT method code that each multiplier table - * is currently set up for, or -1 if it's not yet set up. - * The actual multiplier tables are pointed to by dct_table in the - * per-component comp_info structures. - */ - private int[] m_cur_method = new int[JpegConstants.MaxComponents]; - - private ComponentBuffer m_componentBuffer; - - public JpegInverseDCT(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - m_dctTables = new multiplier_table[cinfo.m_num_components]; - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - /* Allocate and pre-zero a multiplier table for each component */ - m_dctTables[ci] = new multiplier_table(); - - /* Mark multiplier table not yet set up for any method */ - m_cur_method[ci] = -1; - } - } - - /// - /// Prepare for an output pass. - /// Here we select the proper IDCT routine for each component and build - /// a matching multiplier table. - /// - public void start_pass() - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[ci]; - - InverseMethod im = InverseMethod.Unknown; - int method = 0; - /* Select the proper IDCT routine for this component's scaling */ - switch (componentInfo.DCT_scaled_size) - { - case 1: - im = InverseMethod.idct_1x1_method; - method = (int)DCTMethod.IntSlow; /* jidctred uses islow-style table */ - break; - case 2: - im = InverseMethod.idct_2x2_method; - method = (int)DCTMethod.IntSlow; /* jidctred uses islow-style table */ - break; - case 4: - im = InverseMethod.idct_4x4_method; - method = (int)DCTMethod.IntSlow; /* jidctred uses islow-style table */ - break; - case JpegConstants.DCTSize: - switch (m_cinfo.m_dct_method) - { - case DCTMethod.IntSlow: - im = InverseMethod.idct_islow_method; - method = (int)DCTMethod.IntSlow; - break; - case DCTMethod.IntFast: - im = InverseMethod.idct_ifast_method; - method = (int)DCTMethod.IntFast; - break; - case DCTMethod.Float: - im = InverseMethod.idct_float_method; - method = (int)DCTMethod.Float; - break; - default: - throw new Exception("Unknown DCT Method!"); - } - break; - default: - throw new Exception(String.Format("IDCT output block size {0} not supported", componentInfo.DCT_scaled_size)); - } - - m_inverse_DCT_method[ci] = im; - - /* Create multiplier table from quant table. - * However, we can skip this if the component is uninteresting - * or if we already built the table. Also, if no quant table - * has yet been saved for the component, we leave the - * multiplier table all-zero; we'll be reading zeroes from the - * coefficient controller's buffer anyway. - */ - if (!componentInfo.component_needed || m_cur_method[ci] == method) - continue; - - if (componentInfo.quant_table == null) - { - /* happens if no data yet for component */ - continue; - } - - m_cur_method[ci] = method; - switch ((DCTMethod)method) - { - case DCTMethod.IntSlow: - /* For LL&M IDCT method, multipliers are equal to raw quantization - * coefficients, but are stored as ints to ensure access efficiency. - */ - int[] ismtbl = m_dctTables[ci].int_array; - for (int i = 0; i < JpegConstants.DCTSize2; i++) - ismtbl[i] = componentInfo.quant_table.quantval[i]; - break; - - case DCTMethod.IntFast: - /* For AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * For integer operation, the multiplier table is to be scaled by - * IFAST_SCALE_BITS. - */ - int[] ifmtbl = m_dctTables[ci].int_array; - - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - ifmtbl[i] = JpegUtils.DESCALE((int)componentInfo.quant_table.quantval[i] * (int)aanscales[i], CONST_BITS - IFAST_SCALE_BITS); - } - break; - - case DCTMethod.Float: - /* For float AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - */ - float[] fmtbl = m_dctTables[ci].float_array; - int ii = 0; - for (int row = 0; row < JpegConstants.DCTSize; row++) - { - for (int col = 0; col < JpegConstants.DCTSize; col++) - { - fmtbl[ii] = (float)((double)componentInfo.quant_table.quantval[ii] * aanscalefactor[row] * aanscalefactor[col]); - ii++; - } - } - break; - - default: - throw new Exception("Unknown DCT Method!"); - } - } - } - - /* Inverse DCT (also performs de-quantization) */ - public void inverse(int component_index, short[] coef_block, ComponentBuffer output_buf, int output_row, int output_col) - { - m_componentBuffer = output_buf; - switch (m_inverse_DCT_method[component_index]) - { - case InverseMethod.idct_1x1_method: - jpeg_idct_1x1(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.idct_2x2_method: - jpeg_idct_2x2(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.idct_4x4_method: - jpeg_idct_4x4(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.idct_islow_method: - jpeg_idct_islow(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.idct_ifast_method: - jpeg_idct_ifast(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.idct_float_method: - jpeg_idct_float(component_index, coef_block, output_row, output_col); - break; - case InverseMethod.Unknown: - default: - throw new Exception("Unknown Inverse Method!"); - } - } - - /// - /// Perform de-quantization and inverse DCT on one block of coefficients. - /// NOTE: this code only copes with 8x8 DCTs. - /// A slow-but-accurate integer implementation of the - /// inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - /// must also perform de-quantization of the input coefficients. - /// - /// A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - /// on each row (or vice versa, but it's more convenient to emit a row at - /// a time). Direct algorithms are also available, but they are much more - /// complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on an algorithm described in - /// C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - /// Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - /// Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - /// The primary algorithm described there uses 11 multiplies and 29 adds. - /// We use their alternate method with 12 multiplies and 32 adds. - /// The advantage of this method is that no data path contains more than one - /// multiplication; this allows a very simple and accurate implementation in - /// scaled fixed-point arithmetic, with a minimal number of shifts. - /// - /// The poop on this scaling stuff is as follows: - /// - /// Each 1-D IDCT step produces outputs which are a factor of sqrt(N) - /// larger than the true IDCT outputs. The final outputs are therefore - /// a factor of N larger than desired; since N=8 this can be cured by - /// a simple right shift at the end of the algorithm. The advantage of - /// this arrangement is that we save two multiplications per 1-D IDCT, - /// because the y0 and y4 inputs need not be divided by sqrt(N). - /// - /// We have to do addition and subtraction of the integer inputs, which - /// is no problem, and multiplication by fractional constants, which is - /// a problem to do in integer arithmetic. We multiply all the constants - /// by CONST_SCALE and convert them to integer constants (thus retaining - /// SLOW_INTEGER_CONST_BITS bits of precision in the constants). After doing a - /// multiplication we have to divide the product by CONST_SCALE, with proper - /// rounding, to produce the correct output. This division can be done - /// cheaply as a right shift of SLOW_INTEGER_CONST_BITS bits. We postpone shifting - /// as long as possible so that partial sums can be added together with - /// full fractional precision. - /// - /// The outputs of the first pass are scaled up by SLOW_INTEGER_PASS1_BITS bits so that - /// they are represented to better-than-integral precision. These outputs - /// require BitsInSample + SLOW_INTEGER_PASS1_BITS + 3 bits; this fits in a 16-bit word - /// with the recommended scaling. (To scale up 12-bit sample data further, an - /// intermediate int array would be needed.) - /// - /// To avoid overflow of the 32-bit intermediate results in pass 2, we must - /// have BitsInSample + SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS <= 26. Error analysis - /// shows that the values given below are the most effective. - /// - private void jpeg_idct_islow(int component_index, short[] coef_block, int output_row, int output_col) - { - /* buffers data between passes */ - int[] workspace = new int[JpegConstants.DCTSize2]; - - /* Pass 1: process columns from input, store into work array. */ - /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ - /* furthermore, we scale the results by 2**SLOW_INTEGER_PASS1_BITS. */ - - int coefBlockIndex = 0; - - int[] quantTable = m_dctTables[component_index].int_array; - int quantTableIndex = 0; - - int workspaceIndex = 0; - - for (int ctr = JpegConstants.DCTSize; ctr > 0; ctr--) - { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (coef_block[coefBlockIndex + JpegConstants.DCTSize * 1] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 2] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 3] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 4] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 5] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 6] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 7] == 0) - { - /* AC terms all zero */ - int dcval = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]) << SLOW_INTEGER_PASS1_BITS; - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = dcval; - - /* advance pointers to next column */ - coefBlockIndex++; - quantTableIndex++; - workspaceIndex++; - continue; - } - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - int z2 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 2], - quantTable[quantTableIndex + JpegConstants.DCTSize * 2]); - int z3 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 6], - quantTable[quantTableIndex + JpegConstants.DCTSize * 6]); - - int z1 = (z2 + z3) * SLOW_INTEGER_FIX_0_541196100; - int tmp2 = z1 + z3 * (-SLOW_INTEGER_FIX_1_847759065); - int tmp3 = z1 + z2 * SLOW_INTEGER_FIX_0_765366865; - - z2 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - z3 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 4], - quantTable[quantTableIndex + JpegConstants.DCTSize * 4]); - - int tmp0 = (z2 + z3) << SLOW_INTEGER_CONST_BITS; - int tmp1 = (z2 - z3) << SLOW_INTEGER_CONST_BITS; - - int tmp10 = tmp0 + tmp3; - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 7], - quantTable[quantTableIndex + JpegConstants.DCTSize * 7]); - tmp1 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 5], - quantTable[quantTableIndex + JpegConstants.DCTSize * 5]); - tmp2 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 3], - quantTable[quantTableIndex + JpegConstants.DCTSize * 3]); - tmp3 = SLOW_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 1], - quantTable[quantTableIndex + JpegConstants.DCTSize * 1]); - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - int z4 = tmp1 + tmp3; - int z5 = (z3 + z4) * SLOW_INTEGER_FIX_1_175875602; /* sqrt(2) * c3 */ - - tmp0 = tmp0 * SLOW_INTEGER_FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = tmp1 * SLOW_INTEGER_FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = tmp2 * SLOW_INTEGER_FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = tmp3 * SLOW_INTEGER_FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = z1 * (-SLOW_INTEGER_FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = z2 * (-SLOW_INTEGER_FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = z3 * (-SLOW_INTEGER_FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = z4 * (-SLOW_INTEGER_FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = JpegUtils.DESCALE(tmp10 + tmp3, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = JpegUtils.DESCALE(tmp10 - tmp3, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = JpegUtils.DESCALE(tmp11 + tmp2, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = JpegUtils.DESCALE(tmp11 - tmp2, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = JpegUtils.DESCALE(tmp12 + tmp1, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = JpegUtils.DESCALE(tmp12 - tmp1, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = JpegUtils.DESCALE(tmp13 + tmp0, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = JpegUtils.DESCALE(tmp13 - tmp0, SLOW_INTEGER_CONST_BITS - SLOW_INTEGER_PASS1_BITS); - - /* advance pointers to next column */ - coefBlockIndex++; - quantTableIndex++; - workspaceIndex++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the SLOW_INTEGER_PASS1_BITS scaling. */ - - workspaceIndex = 0; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - for (int ctr = 0; ctr < JpegConstants.DCTSize; ctr++) - { - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - int currentOutRow = output_row + ctr; - if (workspace[workspaceIndex + 1] == 0 && - workspace[workspaceIndex + 2] == 0 && - workspace[workspaceIndex + 3] == 0 && - workspace[workspaceIndex + 4] == 0 && - workspace[workspaceIndex + 5] == 0 && - workspace[workspaceIndex + 6] == 0 && - workspace[workspaceIndex + 7] == 0) - { - /* AC terms all zero */ - byte dcval = limit[limitOffset + JpegUtils.DESCALE(workspace[workspaceIndex + 0], SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - - m_componentBuffer[currentOutRow][output_col + 0] = dcval; - m_componentBuffer[currentOutRow][output_col + 1] = dcval; - m_componentBuffer[currentOutRow][output_col + 2] = dcval; - m_componentBuffer[currentOutRow][output_col + 3] = dcval; - m_componentBuffer[currentOutRow][output_col + 4] = dcval; - m_componentBuffer[currentOutRow][output_col + 5] = dcval; - m_componentBuffer[currentOutRow][output_col + 6] = dcval; - m_componentBuffer[currentOutRow][output_col + 7] = dcval; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - continue; - } - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - int z2 = workspace[workspaceIndex + 2]; - int z3 = workspace[workspaceIndex + 6]; - - int z1 = (z2 + z3) * SLOW_INTEGER_FIX_0_541196100; - int tmp2 = z1 + z3 * (-SLOW_INTEGER_FIX_1_847759065); - int tmp3 = z1 + z2 * SLOW_INTEGER_FIX_0_765366865; - - int tmp0 = (workspace[workspaceIndex + 0] + workspace[workspaceIndex + 4]) << SLOW_INTEGER_CONST_BITS; - int tmp1 = (workspace[workspaceIndex + 0] - workspace[workspaceIndex + 4]) << SLOW_INTEGER_CONST_BITS; - - int tmp10 = tmp0 + tmp3; - int tmp13 = tmp0 - tmp3; - int tmp11 = tmp1 + tmp2; - int tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = workspace[workspaceIndex + 7]; - tmp1 = workspace[workspaceIndex + 5]; - tmp2 = workspace[workspaceIndex + 3]; - tmp3 = workspace[workspaceIndex + 1]; - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - int z4 = tmp1 + tmp3; - int z5 = (z3 + z4) * SLOW_INTEGER_FIX_1_175875602; /* sqrt(2) * c3 */ - - tmp0 = tmp0 * SLOW_INTEGER_FIX_0_298631336; /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = tmp1 * SLOW_INTEGER_FIX_2_053119869; /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = tmp2 * SLOW_INTEGER_FIX_3_072711026; /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = tmp3 * SLOW_INTEGER_FIX_1_501321110; /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = z1 * (-SLOW_INTEGER_FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = z2 * (-SLOW_INTEGER_FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = z3 * (-SLOW_INTEGER_FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = z4 * (-SLOW_INTEGER_FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - m_componentBuffer[currentOutRow][output_col + 0] = limit[limitOffset + JpegUtils.DESCALE(tmp10 + tmp3, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 7] = limit[limitOffset + JpegUtils.DESCALE(tmp10 - tmp3, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 1] = limit[limitOffset + JpegUtils.DESCALE(tmp11 + tmp2, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 6] = limit[limitOffset + JpegUtils.DESCALE(tmp11 - tmp2, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 2] = limit[limitOffset + JpegUtils.DESCALE(tmp12 + tmp1, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 5] = limit[limitOffset + JpegUtils.DESCALE(tmp12 - tmp1, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 3] = limit[limitOffset + JpegUtils.DESCALE(tmp13 + tmp0, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 4] = limit[limitOffset + JpegUtils.DESCALE(tmp13 - tmp0, SLOW_INTEGER_CONST_BITS + SLOW_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - - /* advance pointer to next row */ - workspaceIndex += JpegConstants.DCTSize; - } - } - - /// - /// Dequantize a coefficient by multiplying it by the multiplier-table - /// entry; produce an int result. In this module, both inputs and result - /// are 16 bits or less, so either int or short multiply will work. - /// - private static int SLOW_INTEGER_DEQUANTIZE(int coef, int quantval) - { - return (coef * quantval); - } - - /// - /// Perform dequantization and inverse DCT on one block of coefficients. - /// NOTE: this code only copes with 8x8 DCTs. - /// - /// A fast, not so accurate integer implementation of the - /// inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - /// must also perform dequantization of the input coefficients. - /// - /// A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - /// on each row (or vice versa, but it's more convenient to emit a row at - /// a time). Direct algorithms are also available, but they are much more - /// complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on Arai, Agui, and Nakajima's algorithm for - /// scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - /// Japanese, but the algorithm is described in the Pennebaker & Mitchell - /// JPEG textbook (see REFERENCES section in file README). The following code - /// is based directly on figure 4-8 in P&M. - /// While an 8-point DCT cannot be done in less than 11 multiplies, it is - /// possible to arrange the computation so that many of the multiplies are - /// simple scalings of the final outputs. These multiplies can then be - /// folded into the multiplications or divisions by the JPEG quantization - /// table entries. The AA&N method leaves only 5 multiplies and 29 adds - /// to be done in the DCT itself. - /// The primary disadvantage of this method is that with fixed-point math, - /// accuracy is lost due to imprecise representation of the scaled - /// quantization values. The smaller the quantization table entry, the less - /// precise the scaled value, so this implementation does worse with high- - /// quality-setting files than with low-quality ones. - /// - /// Scaling decisions are generally the same as in the LL&M algorithm; - /// However, we choose to descale - /// (right shift) multiplication products as soon as they are formed, - /// rather than carrying additional fractional bits into subsequent additions. - /// This compromises accuracy slightly, but it lets us save a few shifts. - /// More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - /// everywhere except in the multiplications proper; this saves a good deal - /// of work on 16-bit-int machines. - /// - /// The dequantized coefficients are not integers because the AA&N scaling - /// factors have been incorporated. We represent them scaled up by FAST_INTEGER_PASS1_BITS, - /// so that the first and second IDCT rounds have the same input scaling. - /// For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = FAST_INTEGER_PASS1_BITS so as to - /// avoid a descaling shift; this compromises accuracy rather drastically - /// for small quantization table entries, but it saves a lot of shifts. - /// For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, - /// so we use a much larger scaling factor to preserve accuracy. - /// - /// A final compromise is to represent the multiplicative constants to only - /// 8 fractional bits, rather than 13. This saves some shifting work on some - /// machines, and may also reduce the cost of multiplication (since there - /// are fewer one-bits in the constants). - /// - private void jpeg_idct_ifast(int component_index, short[] coef_block, int output_row, int output_col) - { - /* buffers data between passes */ - int[] workspace = new int[JpegConstants.DCTSize2]; - - /* Pass 1: process columns from input, store into work array. */ - - int coefBlockIndex = 0; - int workspaceIndex = 0; - - int[] quantTable = m_dctTables[component_index].int_array; - int quantTableIndex = 0; - - for (int ctr = JpegConstants.DCTSize; ctr > 0; ctr--) - { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (coef_block[coefBlockIndex + JpegConstants.DCTSize * 1] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 2] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 3] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 4] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 5] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 6] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 7] == 0) - { - /* AC terms all zero */ - int dcval = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = dcval; - - /* advance pointers to next column */ - coefBlockIndex++; - quantTableIndex++; - workspaceIndex++; - continue; - } - - /* Even part */ - - int tmp0 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - int tmp1 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 2], - quantTable[quantTableIndex + JpegConstants.DCTSize * 2]); - int tmp2 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 4], - quantTable[quantTableIndex + JpegConstants.DCTSize * 4]); - int tmp3 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 6], - quantTable[quantTableIndex + JpegConstants.DCTSize * 6]); - - int tmp10 = tmp0 + tmp2; /* phase 3 */ - int tmp11 = tmp0 - tmp2; - - int tmp13 = tmp1 + tmp3; /* phases 5-3 */ - int tmp12 = FAST_INTEGER_MULTIPLY(tmp1 - tmp3, FAST_INTEGER_FIX_1_414213562) - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - int tmp4 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 1], - quantTable[quantTableIndex + JpegConstants.DCTSize * 1]); - int tmp5 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 3], - quantTable[quantTableIndex + JpegConstants.DCTSize * 3]); - int tmp6 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 5], - quantTable[quantTableIndex + JpegConstants.DCTSize * 5]); - int tmp7 = FAST_INTEGER_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 7], - quantTable[quantTableIndex + JpegConstants.DCTSize * 7]); - - int z13 = tmp6 + tmp5; /* phase 6 */ - int z10 = tmp6 - tmp5; - int z11 = tmp4 + tmp7; - int z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = FAST_INTEGER_MULTIPLY(z11 - z13, FAST_INTEGER_FIX_1_414213562); /* 2*c4 */ - - int z5 = FAST_INTEGER_MULTIPLY(z10 + z12, FAST_INTEGER_FIX_1_847759065); /* 2*c2 */ - tmp10 = FAST_INTEGER_MULTIPLY(z12, FAST_INTEGER_FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = FAST_INTEGER_MULTIPLY(z10, -FAST_INTEGER_FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = tmp0 + tmp7; - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = tmp0 - tmp7; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = tmp1 + tmp6; - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = tmp1 - tmp6; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = tmp2 + tmp5; - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = tmp2 - tmp5; - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = tmp3 + tmp4; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = tmp3 - tmp4; - - /* advance pointers to next column */ - coefBlockIndex++; - quantTableIndex++; - workspaceIndex++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the FAST_INTEGER_PASS1_BITS scaling. */ - - workspaceIndex = 0; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - for (int ctr = 0; ctr < JpegConstants.DCTSize; ctr++) - { - int currentOutRow = output_row + ctr; - - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - - if (workspace[workspaceIndex + 1] == 0 && - workspace[workspaceIndex + 2] == 0 && - workspace[workspaceIndex + 3] == 0 && - workspace[workspaceIndex + 4] == 0 && - workspace[workspaceIndex + 5] == 0 && - workspace[workspaceIndex + 6] == 0 && - workspace[workspaceIndex + 7] == 0) - { - /* AC terms all zero */ - byte dcval = limit[limitOffset + FAST_INTEGER_IDESCALE(workspace[workspaceIndex + 0], FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - - m_componentBuffer[currentOutRow][output_col + 0] = dcval; - m_componentBuffer[currentOutRow][output_col + 1] = dcval; - m_componentBuffer[currentOutRow][output_col + 2] = dcval; - m_componentBuffer[currentOutRow][output_col + 3] = dcval; - m_componentBuffer[currentOutRow][output_col + 4] = dcval; - m_componentBuffer[currentOutRow][output_col + 5] = dcval; - m_componentBuffer[currentOutRow][output_col + 6] = dcval; - m_componentBuffer[currentOutRow][output_col + 7] = dcval; - - /* advance pointer to next row */ - workspaceIndex += JpegConstants.DCTSize; - continue; - } - - /* Even part */ - - int tmp10 = workspace[workspaceIndex + 0] + workspace[workspaceIndex + 4]; - int tmp11 = workspace[workspaceIndex + 0] - workspace[workspaceIndex + 4]; - - int tmp13 = workspace[workspaceIndex + 2] + workspace[workspaceIndex + 6]; - int tmp12 = FAST_INTEGER_MULTIPLY(workspace[workspaceIndex + 2] - workspace[workspaceIndex + 6], FAST_INTEGER_FIX_1_414213562) - tmp13; - - int tmp0 = tmp10 + tmp13; - int tmp3 = tmp10 - tmp13; - int tmp1 = tmp11 + tmp12; - int tmp2 = tmp11 - tmp12; - - /* Odd part */ - - int z13 = workspace[workspaceIndex + 5] + workspace[workspaceIndex + 3]; - int z10 = workspace[workspaceIndex + 5] - workspace[workspaceIndex + 3]; - int z11 = workspace[workspaceIndex + 1] + workspace[workspaceIndex + 7]; - int z12 = workspace[workspaceIndex + 1] - workspace[workspaceIndex + 7]; - - int tmp7 = z11 + z13; /* phase 5 */ - tmp11 = FAST_INTEGER_MULTIPLY(z11 - z13, FAST_INTEGER_FIX_1_414213562); /* 2*c4 */ - - int z5 = FAST_INTEGER_MULTIPLY(z10 + z12, FAST_INTEGER_FIX_1_847759065); /* 2*c2 */ - tmp10 = FAST_INTEGER_MULTIPLY(z12, FAST_INTEGER_FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = FAST_INTEGER_MULTIPLY(z10, -FAST_INTEGER_FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - int tmp6 = tmp12 - tmp7; /* phase 2 */ - int tmp5 = tmp11 - tmp6; - int tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - - m_componentBuffer[currentOutRow][output_col + 0] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp0 + tmp7, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 7] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp0 - tmp7, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 1] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp1 + tmp6, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 6] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp1 - tmp6, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 2] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp2 + tmp5, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 5] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp2 - tmp5, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 4] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp3 + tmp4, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 3] = limit[limitOffset + FAST_INTEGER_IDESCALE(tmp3 - tmp4, FAST_INTEGER_PASS1_BITS + 3) & RANGE_MASK]; - - /* advance pointer to next row */ - workspaceIndex += JpegConstants.DCTSize; - } - } - - /// - /// Multiply a DCTELEM variable by an int constant, and immediately - /// descale to yield a DCTELEM result. - /// - private static int FAST_INTEGER_MULTIPLY(int var, int c) - { - return (JpegUtils.DESCALE(var * c, FAST_INTEGER_CONST_BITS)); - } - - /// - /// Dequantize a coefficient by multiplying it by the multiplier-table - /// entry; produce a DCTELEM result. For 8-bit data a 16x16->16 - /// multiplication will do. For 12-bit data, the multiplier table is - /// declared int, so a 32-bit multiply will be used. - /// - private static int FAST_INTEGER_DEQUANTIZE(short coef, int quantval) - { - return ((int)coef * quantval); - } - - /// - /// Like DESCALE, but applies to a DCTELEM and produces an int. - /// We assume that int right shift is unsigned if int right shift is. - /// - private static int FAST_INTEGER_IRIGHT_SHIFT(int x, int shft) - { - return (x >> shft); - } - - private static int FAST_INTEGER_IDESCALE(int x, int n) - { - return (FAST_INTEGER_IRIGHT_SHIFT((x) + (1 << ((n) - 1)), n)); - } - - /// - /// Perform dequantization and inverse DCT on one block of coefficients. - /// NOTE: this code only copes with 8x8 DCTs. - /// - /// A floating-point implementation of the - /// inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - /// must also perform dequantization of the input coefficients. - /// - /// This implementation should be more accurate than either of the integer - /// IDCT implementations. However, it may not give the same results on all - /// machines because of differences in roundoff behavior. Speed will depend - /// on the hardware's floating point capacity. - /// - /// A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - /// on each row (or vice versa, but it's more convenient to emit a row at - /// a time). Direct algorithms are also available, but they are much more - /// complex and seem not to be any faster when reduced to code. - /// - /// This implementation is based on Arai, Agui, and Nakajima's algorithm for - /// scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - /// Japanese, but the algorithm is described in the Pennebaker & Mitchell - /// JPEG textbook (see REFERENCES section in file README). The following code - /// is based directly on figure 4-8 in P&M. - /// While an 8-point DCT cannot be done in less than 11 multiplies, it is - /// possible to arrange the computation so that many of the multiplies are - /// simple scalings of the final outputs. These multiplies can then be - /// folded into the multiplications or divisions by the JPEG quantization - /// table entries. The AA&N method leaves only 5 multiplies and 29 adds - /// to be done in the DCT itself. - /// The primary disadvantage of this method is that with a fixed-point - /// implementation, accuracy is lost due to imprecise representation of the - /// scaled quantization values. However, that problem does not arise if - /// we use floating point arithmetic. - /// - private void jpeg_idct_float(int component_index, short[] coef_block, int output_row, int output_col) - { - /* buffers data between passes */ - float[] workspace = new float[JpegConstants.DCTSize2]; - - /* Pass 1: process columns from input, store into work array. */ - - int coefBlockIndex = 0; - int workspaceIndex = 0; - - float[] quantTable = m_dctTables[component_index].float_array; - int quantTableIndex = 0; - - for (int ctr = JpegConstants.DCTSize; ctr > 0; ctr--) - { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (coef_block[coefBlockIndex + JpegConstants.DCTSize * 1] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 2] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 3] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 4] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 5] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 6] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 7] == 0) - { - /* AC terms all zero */ - float dcval = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = dcval; - - coefBlockIndex++; /* advance pointers to next column */ - quantTableIndex++; - workspaceIndex++; - continue; - } - - /* Even part */ - - float tmp0 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - float tmp1 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 2], - quantTable[quantTableIndex + JpegConstants.DCTSize * 2]); - float tmp2 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 4], - quantTable[quantTableIndex + JpegConstants.DCTSize * 4]); - float tmp3 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 6], - quantTable[quantTableIndex + JpegConstants.DCTSize * 6]); - - float tmp10 = tmp0 + tmp2; /* phase 3 */ - float tmp11 = tmp0 - tmp2; - - float tmp13 = tmp1 + tmp3; /* phases 5-3 */ - float tmp12 = (tmp1 - tmp3) * 1.414213562f - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - float tmp4 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 1], - quantTable[quantTableIndex + JpegConstants.DCTSize * 1]); - float tmp5 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 3], - quantTable[quantTableIndex + JpegConstants.DCTSize * 3]); - float tmp6 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 5], - quantTable[quantTableIndex + JpegConstants.DCTSize * 5]); - float tmp7 = FLOAT_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 7], - quantTable[quantTableIndex + JpegConstants.DCTSize * 7]); - - float z13 = tmp6 + tmp5; /* phase 6 */ - float z10 = tmp6 - tmp5; - float z11 = tmp4 + tmp7; - float z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = (z11 - z13) * 1.414213562f; /* 2*c4 */ - - float z5 = (z10 + z12) * 1.847759065f; /* 2*c2 */ - tmp10 = 1.082392200f * z12 - z5; /* 2*(c2-c6) */ - tmp12 = -2.613125930f * z10 + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = tmp0 + tmp7; - workspace[workspaceIndex + JpegConstants.DCTSize * 7] = tmp0 - tmp7; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = tmp1 + tmp6; - workspace[workspaceIndex + JpegConstants.DCTSize * 6] = tmp1 - tmp6; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = tmp2 + tmp5; - workspace[workspaceIndex + JpegConstants.DCTSize * 5] = tmp2 - tmp5; - workspace[workspaceIndex + JpegConstants.DCTSize * 4] = tmp3 + tmp4; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = tmp3 - tmp4; - - coefBlockIndex++; /* advance pointers to next column */ - quantTableIndex++; - workspaceIndex++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3. */ - workspaceIndex = 0; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - for (int ctr = 0; ctr < JpegConstants.DCTSize; ctr++) - { - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * And testing floats for zero is relatively expensive, so we don't bother. - */ - - /* Even part */ - - float tmp10 = workspace[workspaceIndex + 0] + workspace[workspaceIndex + 4]; - float tmp11 = workspace[workspaceIndex + 0] - workspace[workspaceIndex + 4]; - - float tmp13 = workspace[workspaceIndex + 2] + workspace[workspaceIndex + 6]; - float tmp12 = (workspace[workspaceIndex + 2] - workspace[workspaceIndex + 6]) * 1.414213562f - tmp13; - - float tmp0 = tmp10 + tmp13; - float tmp3 = tmp10 - tmp13; - float tmp1 = tmp11 + tmp12; - float tmp2 = tmp11 - tmp12; - - /* Odd part */ - - float z13 = workspace[workspaceIndex + 5] + workspace[workspaceIndex + 3]; - float z10 = workspace[workspaceIndex + 5] - workspace[workspaceIndex + 3]; - float z11 = workspace[workspaceIndex + 1] + workspace[workspaceIndex + 7]; - float z12 = workspace[workspaceIndex + 1] - workspace[workspaceIndex + 7]; - - float tmp7 = z11 + z13; - tmp11 = (z11 - z13) * 1.414213562f; - - float z5 = (z10 + z12) * 1.847759065f; /* 2*c2 */ - tmp10 = 1.082392200f * z12 - z5; /* 2*(c2-c6) */ - tmp12 = -2.613125930f * z10 + z5; /* -2*(c2+c6) */ - - float tmp6 = tmp12 - tmp7; - float tmp5 = tmp11 - tmp6; - float tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - int currentOutRow = output_row + ctr; - m_componentBuffer[currentOutRow][output_col + 0] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp0 + tmp7), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 7] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp0 - tmp7), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 1] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp1 + tmp6), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 6] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp1 - tmp6), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 2] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp2 + tmp5), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 5] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp2 - tmp5), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 4] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp3 + tmp4), 3) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 3] = limit[limitOffset + JpegUtils.DESCALE((int)(tmp3 - tmp4), 3) & RANGE_MASK]; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - } - - /// - /// Dequantize a coefficient by multiplying it by the multiplier-table - /// entry; produce a float result. - /// - private static float FLOAT_DEQUANTIZE(short coef, float quantval) - { - return (((float)(coef)) * (quantval)); - } - - /// - /// Inverse-DCT routines that produce reduced-size output: - /// either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. - /// - /// NOTE: this code only copes with 8x8 DCTs. - /// - /// The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) - /// algorithm. We simply replace each 8-to-8 1-D IDCT step - /// with an 8-to-4 step that produces the four averages of two adjacent outputs - /// (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). - /// These steps were derived by computing the corresponding values at the end - /// of the normal LL&M code, then simplifying as much as possible. - /// - /// 1x1 is trivial: just take the DC coefficient divided by 8. - /// - /// Perform dequantization and inverse DCT on one block of coefficients, - /// producing a reduced-size 4x4 output block. - /// - private void jpeg_idct_4x4(int component_index, short[] coef_block, int output_row, int output_col) - { - /* buffers data between passes */ - int[] workspace = new int[JpegConstants.DCTSize * 4]; - - /* Pass 1: process columns from input, store into work array. */ - int coefBlockIndex = 0; - int workspaceIndex = 0; - - int[] quantTable = m_dctTables[component_index].int_array; - int quantTableIndex = 0; - - for (int ctr = JpegConstants.DCTSize; ctr > 0; coefBlockIndex++, quantTableIndex++, workspaceIndex++, ctr--) - { - /* Don't bother to process column 4, because second pass won't use it */ - if (ctr == JpegConstants.DCTSize - 4) - continue; - - if (coef_block[coefBlockIndex + JpegConstants.DCTSize * 1] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 2] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 3] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 5] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 6] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 7] == 0) - { - /* AC terms all zero; we need not examine term 4 for 4x4 output */ - int dcval = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]) << REDUCED_PASS1_BITS; - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = dcval; - - continue; - } - - /* Even part */ - - int tmp0 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - tmp0 <<= (REDUCED_CONST_BITS + 1); - - int z2 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 2], - quantTable[quantTableIndex + JpegConstants.DCTSize * 2]); - int z3 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 6], - quantTable[quantTableIndex + JpegConstants.DCTSize * 6]); - - int tmp2 = z2 * REDUCED_FIX_1_847759065 + z3 * (-REDUCED_FIX_0_765366865); - - int tmp10 = tmp0 + tmp2; - int tmp12 = tmp0 - tmp2; - - /* Odd part */ - - int z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 7], - quantTable[quantTableIndex + JpegConstants.DCTSize * 7]); - z2 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 5], - quantTable[quantTableIndex + JpegConstants.DCTSize * 5]); - z3 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 3], - quantTable[quantTableIndex + JpegConstants.DCTSize * 3]); - int z4 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 1], - quantTable[quantTableIndex + JpegConstants.DCTSize * 1]); - - tmp0 = z1 * (-REDUCED_FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + - z2 * REDUCED_FIX_1_451774981 /* sqrt(2) * (c3+c7) */ + - z3 * (-REDUCED_FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + - z4 * REDUCED_FIX_1_061594337; /* sqrt(2) * (c5+c7) */ - - tmp2 = z1 * (-REDUCED_FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + - z2 * (-REDUCED_FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + - z3 * REDUCED_FIX_0_899976223 /* sqrt(2) * (c3-c7) */ + - z4 * REDUCED_FIX_2_562915447; /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = JpegUtils.DESCALE(tmp10 + tmp2, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 1); - workspace[workspaceIndex + JpegConstants.DCTSize * 3] = JpegUtils.DESCALE(tmp10 - tmp2, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 1); - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = JpegUtils.DESCALE(tmp12 + tmp0, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 1); - workspace[workspaceIndex + JpegConstants.DCTSize * 2] = JpegUtils.DESCALE(tmp12 - tmp0, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 1); - } - - /* Pass 2: process 4 rows from work array, store into output array. */ - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - workspaceIndex = 0; - for (int ctr = 0; ctr < 4; ctr++) - { - int currentOutRow = output_row + ctr; - /* It's not clear whether a zero row test is worthwhile here ... */ - - if (workspace[workspaceIndex + 1] == 0 && - workspace[workspaceIndex + 2] == 0 && - workspace[workspaceIndex + 3] == 0 && - workspace[workspaceIndex + 5] == 0 && - workspace[workspaceIndex + 6] == 0 && - workspace[workspaceIndex + 7] == 0) - { - /* AC terms all zero */ - byte dcval = limit[limitOffset + JpegUtils.DESCALE(workspace[workspaceIndex + 0], REDUCED_PASS1_BITS + 3) & RANGE_MASK]; - - m_componentBuffer[currentOutRow][output_col + 0] = dcval; - m_componentBuffer[currentOutRow][output_col + 1] = dcval; - m_componentBuffer[currentOutRow][output_col + 2] = dcval; - m_componentBuffer[currentOutRow][output_col + 3] = dcval; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - continue; - } - - /* Even part */ - - int tmp0 = (workspace[workspaceIndex + 0]) << (REDUCED_CONST_BITS + 1); - - int tmp2 = workspace[workspaceIndex + 2] * REDUCED_FIX_1_847759065 + workspace[workspaceIndex + 6] * (-REDUCED_FIX_0_765366865); - - int tmp10 = tmp0 + tmp2; - int tmp12 = tmp0 - tmp2; - - /* Odd part */ - - int z1 = workspace[workspaceIndex + 7]; - int z2 = workspace[workspaceIndex + 5]; - int z3 = workspace[workspaceIndex + 3]; - int z4 = workspace[workspaceIndex + 1]; - - tmp0 = z1 * (-REDUCED_FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + - z2 * REDUCED_FIX_1_451774981 /* sqrt(2) * (c3+c7) */ + - z3 * (-REDUCED_FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + - z4 * REDUCED_FIX_1_061594337; /* sqrt(2) * (c5+c7) */ - - tmp2 = z1 * (-REDUCED_FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + - z2 * (-REDUCED_FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + - z3 * REDUCED_FIX_0_899976223 /* sqrt(2) * (c3-c7) */ + - z4 * REDUCED_FIX_2_562915447; /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - m_componentBuffer[currentOutRow][output_col + 0] = limit[limitOffset + JpegUtils.DESCALE(tmp10 + tmp2, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 1) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 3] = limit[limitOffset + JpegUtils.DESCALE(tmp10 - tmp2, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 1) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 1] = limit[limitOffset + JpegUtils.DESCALE(tmp12 + tmp0, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 1) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 2] = limit[limitOffset + JpegUtils.DESCALE(tmp12 - tmp0, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 1) & RANGE_MASK]; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - } - - /// - /// Perform dequantization and inverse DCT on one block of coefficients, - /// producing a reduced-size 2x2 output block. - /// - private void jpeg_idct_2x2(int component_index, short[] coef_block, int output_row, int output_col) - { - /* buffers data between passes */ - int[] workspace = new int[JpegConstants.DCTSize * 2]; - - /* Pass 1: process columns from input, store into work array. */ - int coefBlockIndex = 0; - int workspaceIndex = 0; - - int[] quantTable = m_dctTables[component_index].int_array; - int quantTableIndex = 0; - - for (int ctr = JpegConstants.DCTSize; ctr > 0; coefBlockIndex++, quantTableIndex++, workspaceIndex++, ctr--) - { - /* Don't bother to process columns 2,4,6 */ - if (ctr == JpegConstants.DCTSize - 2 || ctr == JpegConstants.DCTSize - 4 || ctr == JpegConstants.DCTSize - 6) - continue; - - if (coef_block[coefBlockIndex + JpegConstants.DCTSize * 1] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 3] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 5] == 0 && - coef_block[coefBlockIndex + JpegConstants.DCTSize * 7] == 0) - { - /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ - int dcval = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]) << REDUCED_PASS1_BITS; - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = dcval; - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = dcval; - - continue; - } - - /* Even part */ - - int z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 0], - quantTable[quantTableIndex + JpegConstants.DCTSize * 0]); - int tmp10 = z1 << (REDUCED_CONST_BITS + 2); - - /* Odd part */ - - z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 7], - quantTable[quantTableIndex + JpegConstants.DCTSize * 7]); - int tmp0 = z1 * -REDUCED_FIX_0_720959822; /* sqrt(2) * (c7-c5+c3-c1) */ - z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 5], - quantTable[quantTableIndex + JpegConstants.DCTSize * 5]); - tmp0 += z1 * REDUCED_FIX_0_850430095; /* sqrt(2) * (-c1+c3+c5+c7) */ - z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 3], - quantTable[quantTableIndex + JpegConstants.DCTSize * 3]); - tmp0 += z1 * (-REDUCED_FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ - z1 = REDUCED_DEQUANTIZE(coef_block[coefBlockIndex + JpegConstants.DCTSize * 1], - quantTable[quantTableIndex + JpegConstants.DCTSize * 1]); - tmp0 += z1 * REDUCED_FIX_3_624509785; /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - workspace[workspaceIndex + JpegConstants.DCTSize * 0] = JpegUtils.DESCALE(tmp10 + tmp0, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 2); - workspace[workspaceIndex + JpegConstants.DCTSize * 1] = JpegUtils.DESCALE(tmp10 - tmp0, REDUCED_CONST_BITS - REDUCED_PASS1_BITS + 2); - } - - /* Pass 2: process 2 rows from work array, store into output array. */ - workspaceIndex = 0; - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - for (int ctr = 0; ctr < 2; ctr++) - { - int currentOutRow = output_row + ctr; - /* It's not clear whether a zero row test is worthwhile here ... */ - - if (workspace[workspaceIndex + 1] == 0 && - workspace[workspaceIndex + 3] == 0 && - workspace[workspaceIndex + 5] == 0 && - workspace[workspaceIndex + 7] == 0) - { - /* AC terms all zero */ - byte dcval = limit[limitOffset + JpegUtils.DESCALE(workspace[workspaceIndex + 0], REDUCED_PASS1_BITS + 3) & RANGE_MASK]; - - m_componentBuffer[currentOutRow][output_col + 0] = dcval; - m_componentBuffer[currentOutRow][output_col + 1] = dcval; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - continue; - } - - /* Even part */ - - int tmp10 = (workspace[workspaceIndex + 0]) << (REDUCED_CONST_BITS + 2); - - /* Odd part */ - - int tmp0 = workspace[workspaceIndex + 7] * (-REDUCED_FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ + - workspace[workspaceIndex + 5] * REDUCED_FIX_0_850430095 /* sqrt(2) * (-c1+c3+c5+c7) */ + - workspace[workspaceIndex + 3] * (-REDUCED_FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ + - workspace[workspaceIndex + 1] * REDUCED_FIX_3_624509785; /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - m_componentBuffer[currentOutRow][output_col + 0] = limit[limitOffset + JpegUtils.DESCALE(tmp10 + tmp0, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 2) & RANGE_MASK]; - m_componentBuffer[currentOutRow][output_col + 1] = limit[limitOffset + JpegUtils.DESCALE(tmp10 - tmp0, REDUCED_CONST_BITS + REDUCED_PASS1_BITS + 3 + 2) & RANGE_MASK]; - - workspaceIndex += JpegConstants.DCTSize; /* advance pointer to next row */ - } - } - - /// - /// Perform dequantization and inverse DCT on one block of coefficients, - /// producing a reduced-size 1x1 output block. - /// - private void jpeg_idct_1x1(int component_index, short[] coef_block, int output_row, int output_col) - { - /* We hardly need an inverse DCT routine for this: just take the - * average pixel value, which is one-eighth of the DC coefficient. - */ - int[] quantptr = m_dctTables[component_index].int_array; - int dcval = REDUCED_DEQUANTIZE(coef_block[0], quantptr[0]); - dcval = JpegUtils.DESCALE(dcval, 3); - - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset + JpegConstants.MediumSampleValue; - - m_componentBuffer[output_row + 0][output_col] = limit[limitOffset + dcval & RANGE_MASK]; - } - - /// - /// Dequantize a coefficient by multiplying it by the multiplier-table - /// entry; produce an int result. In this module, both inputs and result - /// are 16 bits or less, so either int or short multiply will work. - /// - private static int REDUCED_DEQUANTIZE(short coef, int quantval) - { - return ((int)coef * quantval); - } - } - #endregion - - #region JpegMarker - /// - /// Representation of special JPEG marker. - /// - /// You can't create instance of this class manually. - /// Concrete objects are instantiated by library and you can get them - /// through Marker_list property. - /// - /// - /// Special markers - public class JpegMarker - { - /// - /// marker code: JPEG_COM, or JPEG_APP0+n - /// - private byte m_marker; - /// - /// # bytes of data in the file - /// - private int m_originalLength; - /// - /// the data contained in the marker - /// - private byte[] m_data; - - internal JpegMarker(byte marker, int originalDataLength, int lengthLimit) - { - m_marker = marker; - m_originalLength = originalDataLength; - m_data = new byte[lengthLimit]; - } - - /// - /// Gets the special marker. - /// - /// The marker value. - public byte Marker - { - get - { - return m_marker; - } - } - - /// - /// Gets the full length of original data associated with the marker. - /// - /// The length of original data associated with the marker. - /// This length excludes the marker length word, whereas the stored representation - /// within the JPEG file includes it. (Hence the maximum data length is really only 65533.) - /// - public int OriginalLength - { - get - { - return m_originalLength; - } - } - - /// - /// Gets the data associated with the marker. - /// - /// The data associated with the marker. - /// The length of this array doesn't exceed length_limit for the particular marker type. - /// Note that this length excludes the marker length word, whereas the stored representation - /// within the JPEG file includes it. (Hence the maximum data length is really only 65533.) - /// - public byte[] Data - { - get - { - return m_data; - } - } - } - #endregion - - #region JpegMarkerReader - /// - /// Marker reading and parsing - /// - class JpegMarkerReader - { - private const int APP0_DATA_LEN = 14; /* Length of interesting data in APP0 */ - private const int APP14_DATA_LEN = 12; /* Length of interesting data in APP14 */ - private const int APPN_DATA_LEN = 14; /* Must be the largest of the above!! */ - - private JpegDecompressor m_cinfo; - - /* Application-overridable marker processing methods */ - private JpegDecompressor.jpeg_marker_parser_method m_process_COM; - private JpegDecompressor.jpeg_marker_parser_method[] m_process_APPn = new JpegDecompressor.jpeg_marker_parser_method[16]; - - /* Limit on marker data length to save for each marker type */ - private int m_length_limit_COM; - private int[] m_length_limit_APPn = new int[16]; - - private bool m_saw_SOI; /* found SOI? */ - private bool m_saw_SOF; /* found SOF? */ - private int m_next_restart_num; /* next restart number expected (0-7) */ - private int m_discarded_bytes; /* # of bytes skipped looking for a marker */ - - /* Status of COM/APPn marker saving */ - private JpegMarker m_cur_marker; /* null if not processing a marker */ - private int m_bytes_read; /* data bytes read so far in marker */ - /* Note: cur_marker is not linked into marker_list until it's all read. */ - - /// - /// Initialize the marker reader module. - /// This is called only once, when the decompression object is created. - /// - public JpegMarkerReader(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - /* Initialize COM/APPn processing. - * By default, we examine and then discard APP0 and APP14, - * but simply discard COM and all other APPn. - */ - m_process_COM = skip_variable; - - for (int i = 0; i < 16; i++) - { - m_process_APPn[i] = skip_variable; - m_length_limit_APPn[i] = 0; - } - - m_process_APPn[0] = get_interesting_appn; - m_process_APPn[14] = get_interesting_appn; - - /* Reset marker processing state */ - reset_marker_reader(); - } - - /// - /// Reset marker processing state to begin a fresh datastream. - /// - public void reset_marker_reader() - { - m_cinfo.Comp_info = null; /* until allocated by get_sof */ - m_cinfo.m_input_scan_number = 0; /* no SOS seen yet */ - m_cinfo.m_unread_marker = 0; /* no pending marker */ - m_saw_SOI = false; /* set internal state too */ - m_saw_SOF = false; - m_discarded_bytes = 0; - m_cur_marker = null; - } - - /// - /// Read markers until SOS or EOI. - /// - /// Returns same codes as are defined for jpeg_consume_input: - /// JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - /// - public ReadResult read_markers() - { - /* Outer loop repeats once for each marker. */ - for (; ; ) - { - /* Collect the marker proper, unless we already did. */ - /* NB: first_marker() enforces the requirement that SOI appear first. */ - if (m_cinfo.m_unread_marker == 0) - { - if (!m_cinfo.m_marker.m_saw_SOI) - { - if (!first_marker()) - return ReadResult.Suspended; - } - else - { - if (!next_marker()) - return ReadResult.Suspended; - } - } - - /* At this point m_cinfo.unread_marker contains the marker code and the - * input point is just past the marker proper, but before any parameters. - * A suspension will cause us to return with this state still true. - */ - switch ((JpegMarkerType)m_cinfo.m_unread_marker) - { - case JpegMarkerType.SOI: - if (!get_soi()) - return ReadResult.Suspended; - break; - - case JpegMarkerType.SOF0: - /* Baseline */ - case JpegMarkerType.SOF1: - /* Extended sequential, Huffman */ - if (!get_sof(false)) - return ReadResult.Suspended; - break; - - case JpegMarkerType.SOF2: - /* Progressive, Huffman */ - if (!get_sof(true)) - return ReadResult.Suspended; - break; - - /* Currently unsupported SOFn types */ - case JpegMarkerType.SOF3: - /* Lossless, Huffman */ - case JpegMarkerType.SOF5: - /* Differential sequential, Huffman */ - case JpegMarkerType.SOF6: - /* Differential progressive, Huffman */ - case JpegMarkerType.SOF7: - /* Differential lossless, Huffman */ - case JpegMarkerType.SOF9: - /* Extended sequential, arithmetic */ - case JpegMarkerType.SOF10: - /* Progressive, arithmetic */ - case JpegMarkerType.JPG: - /* Reserved for JPEG extensions */ - case JpegMarkerType.SOF11: - /* Lossless, arithmetic */ - case JpegMarkerType.SOF13: - /* Differential sequential, arithmetic */ - case JpegMarkerType.SOF14: - /* Differential progressive, arithmetic */ - case JpegMarkerType.SOF15: - /* Differential lossless, arithmetic */ - throw new Exception(String.Format("Unsupported JPEG process: SOF type 0x{0:X2}", m_cinfo.m_unread_marker)); - - case JpegMarkerType.SOS: - if (!get_sos()) - return ReadResult.Suspended; - m_cinfo.m_unread_marker = 0; /* processed the marker */ - return ReadResult.Reached_SOS; - - case JpegMarkerType.EOI: - m_cinfo.m_unread_marker = 0; /* processed the marker */ - return ReadResult.Reached_EOI; - - case JpegMarkerType.DAC: - if (!skip_variable(m_cinfo)) - return ReadResult.Suspended; - break; - - case JpegMarkerType.DHT: - if (!get_dht()) - return ReadResult.Suspended; - break; - - case JpegMarkerType.DQT: - if (!get_dqt()) - return ReadResult.Suspended; - break; - - case JpegMarkerType.DRI: - if (!get_dri()) - return ReadResult.Suspended; - break; - - case JpegMarkerType.APP0: - case JpegMarkerType.APP1: - case JpegMarkerType.APP2: - case JpegMarkerType.APP3: - case JpegMarkerType.APP4: - case JpegMarkerType.APP5: - case JpegMarkerType.APP6: - case JpegMarkerType.APP7: - case JpegMarkerType.APP8: - case JpegMarkerType.APP9: - case JpegMarkerType.APP10: - case JpegMarkerType.APP11: - case JpegMarkerType.APP12: - case JpegMarkerType.APP13: - case JpegMarkerType.APP14: - case JpegMarkerType.APP15: - if (!m_cinfo.m_marker.m_process_APPn[m_cinfo.m_unread_marker - (int)JpegMarkerType.APP0](m_cinfo)) - return ReadResult.Suspended; - break; - - case JpegMarkerType.COM: - if (!m_cinfo.m_marker.m_process_COM(m_cinfo)) - return ReadResult.Suspended; - break; - - /* these are all parameter-less */ - case JpegMarkerType.RST0: - case JpegMarkerType.RST1: - case JpegMarkerType.RST2: - case JpegMarkerType.RST3: - case JpegMarkerType.RST4: - case JpegMarkerType.RST5: - case JpegMarkerType.RST6: - case JpegMarkerType.RST7: - case JpegMarkerType.TEM: - break; - - case JpegMarkerType.DNL: - /* Ignore DNL ... perhaps the wrong thing */ - if (!skip_variable(m_cinfo)) - return ReadResult.Suspended; - break; - - default: - /* must be DHP, EXP, JPGn, or RESn */ - /* For now, we treat the reserved markers as fatal errors since they are - * likely to be used to signal incompatible JPEG Part 3 extensions. - * Once the JPEG 3 version-number marker is well defined, this code - * ought to change! - */ - throw new Exception(String.Format("Unsupported marker type 0x{0:X2}", m_cinfo.m_unread_marker)); - } - - /* Successfully processed marker, so reset state variable */ - m_cinfo.m_unread_marker = 0; - } /* end loop */ - } - - /// - /// Read a restart marker, which is expected to appear next in the data-stream; - /// if the marker is not there, take appropriate recovery action. - /// Returns false if suspension is required. - /// - /// Made public for use by entropy decoder only - /// - /// This is called by the entropy decoder after it has read an appropriate - /// number of MCUs. cinfo.unread_marker may be nonzero if the entropy decoder - /// has already read a marker from the data source. Under normal conditions - /// cinfo.unread_marker will be reset to 0 before returning; if not reset, - /// it holds a marker which the decoder will be unable to read past. - /// - public bool read_restart_marker() - { - /* Obtain a marker unless we already did. */ - /* Note that next_marker will complain if it skips any data. */ - if (m_cinfo.m_unread_marker == 0) - { - if (!next_marker()) - return false; - } - - if (m_cinfo.m_unread_marker == ((int)JpegMarkerType.RST0 + m_cinfo.m_marker.m_next_restart_num)) - { - /* Normal case --- swallow the marker and let entropy decoder continue */ - m_cinfo.m_unread_marker = 0; - } - else - { - /* Uh-oh, the restart markers have been messed up. */ - /* Let the data source manager determine how to re-sync. */ - if (!m_cinfo.m_src.resync_to_restart(m_cinfo, m_cinfo.m_marker.m_next_restart_num)) - return false; - } - - /* Update next-restart state */ - m_cinfo.m_marker.m_next_restart_num = (m_cinfo.m_marker.m_next_restart_num + 1) & 7; - - return true; - } - - /// - /// Find the next JPEG marker, save it in cinfo.unread_marker. - /// Returns false if had to suspend before reaching a marker; - /// in that case cinfo.unread_marker is unchanged. - /// - /// Note that the result might not be a valid marker code, - /// but it will never be 0 or FF. - /// - public bool next_marker() - { - int c; - for (; ; ) - { - if (!m_cinfo.m_src.GetByte(out c)) - return false; - - /* Skip any non-FF bytes. - * This may look a bit inefficient, but it will not occur in a valid file. - * We sync after each discarded byte so that a suspending data source - * can discard the byte from its buffer. - */ - while (c != 0xFF) - { - m_cinfo.m_marker.m_discarded_bytes++; - if (!m_cinfo.m_src.GetByte(out c)) - return false; - } - - /* This loop swallows any duplicate FF bytes. Extra FFs are legal as - * pad bytes, so don't count them in discarded_bytes. We assume there - * will not be so many consecutive FF bytes as to overflow a suspending - * data source's input buffer. - */ - do - { - if (!m_cinfo.m_src.GetByte(out c)) - return false; - } - while (c == 0xFF); - - if (c != 0) - { - /* found a valid marker, exit loop */ - break; - } - - /* Reach here if we found a stuffed-zero data sequence (FF/00). - * Discard it and loop back to try again. - */ - m_cinfo.m_marker.m_discarded_bytes += 2; - } - - if (m_cinfo.m_marker.m_discarded_bytes != 0) - { - m_cinfo.m_marker.m_discarded_bytes = 0; - } - - m_cinfo.m_unread_marker = c; - return true; - } - - /// - /// Install a special processing method for COM or APPn markers. - /// - public void jpeg_set_marker_processor(int marker_code, JpegDecompressor.jpeg_marker_parser_method routine) - { - if (marker_code == (int)JpegMarkerType.COM) - m_process_COM = routine; - else if (marker_code >= (int)JpegMarkerType.APP0 && marker_code <= (int)JpegMarkerType.APP15) - m_process_APPn[marker_code - (int)JpegMarkerType.APP0] = routine; - else - throw new Exception(String.Format("Unsupported marker type 0x{0:X2}", marker_code)); - } - - public void jpeg_save_markers(int marker_code, int length_limit) - { - /* Choose processor routine to use. - * APP0/APP14 have special requirements. - */ - JpegDecompressor.jpeg_marker_parser_method processor; - if (length_limit != 0) - { - processor = save_marker; - /* If saving APP0/APP14, save at least enough for our internal use. */ - if (marker_code == (int)JpegMarkerType.APP0 && length_limit < APP0_DATA_LEN) - length_limit = APP0_DATA_LEN; - else if (marker_code == (int)JpegMarkerType.APP14 && length_limit < APP14_DATA_LEN) - length_limit = APP14_DATA_LEN; - } - else - { - processor = skip_variable; - /* If discarding APP0/APP14, use our regular on-the-fly processor. */ - if (marker_code == (int)JpegMarkerType.APP0 || marker_code == (int)JpegMarkerType.APP14) - processor = get_interesting_appn; - } - - if (marker_code == (int)JpegMarkerType.COM) - { - m_process_COM = processor; - m_length_limit_COM = length_limit; - } - else if (marker_code >= (int)JpegMarkerType.APP0 && marker_code <= (int)JpegMarkerType.APP15) - { - m_process_APPn[marker_code - (int)JpegMarkerType.APP0] = processor; - m_length_limit_APPn[marker_code - (int)JpegMarkerType.APP0] = length_limit; - } - else - throw new Exception(String.Format("Unsupported marker type 0x{0:X2}", marker_code)); - } - - /* State of marker reader, applications - * supplying COM or APPn handlers might like to know the state. - */ - public bool SawSOI() - { - return m_saw_SOI; - } - - public bool SawSOF() - { - return m_saw_SOF; - } - - public int NextRestartNumber() - { - return m_next_restart_num; - } - - public int DiscardedByteCount() - { - return m_discarded_bytes; - } - - public void SkipBytes(int count) - { - m_discarded_bytes += count; - } - - /// - /// Save an APPn or COM marker into the marker list - /// - private static bool save_marker(JpegDecompressor cinfo) - { - JpegMarker cur_marker = cinfo.m_marker.m_cur_marker; - - byte[] data = null; - int length = 0; - int bytes_read; - int data_length; - int dataOffset = 0; - - if (cur_marker == null) - { - /* begin reading a marker */ - if (!cinfo.m_src.GetTwoBytes(out length)) - return false; - - length -= 2; - if (length >= 0) - { - /* watch out for bogus length word */ - /* figure out how much we want to save */ - int limit; - if (cinfo.m_unread_marker == (int)JpegMarkerType.COM) - limit = cinfo.m_marker.m_length_limit_COM; - else - limit = cinfo.m_marker.m_length_limit_APPn[cinfo.m_unread_marker - (int)JpegMarkerType.APP0]; - - if (length < limit) - limit = length; - - /* allocate and initialize the marker item */ - cur_marker = new JpegMarker((byte)cinfo.m_unread_marker, length, limit); - - /* data area is just beyond the JpegMarker */ - data = cur_marker.Data; - cinfo.m_marker.m_cur_marker = cur_marker; - cinfo.m_marker.m_bytes_read = 0; - bytes_read = 0; - data_length = limit; - } - else - { - /* deal with bogus length word */ - bytes_read = data_length = 0; - data = null; - } - } - else - { - /* resume reading a marker */ - bytes_read = cinfo.m_marker.m_bytes_read; - data_length = cur_marker.Data.Length; - data = cur_marker.Data; - dataOffset = bytes_read; - } - - byte[] tempData = null; - if (data_length != 0) - tempData = new byte[data.Length]; - - while (bytes_read < data_length) - { - /* move the restart point to here */ - cinfo.m_marker.m_bytes_read = bytes_read; - - /* If there's not at least one byte in buffer, suspend */ - if (!cinfo.m_src.MakeByteAvailable()) - return false; - - /* Copy bytes with reasonable rapidity */ - int read = cinfo.m_src.GetBytes(tempData, data_length - bytes_read); - Buffer.BlockCopy(tempData, 0, data, dataOffset, data_length - bytes_read); - bytes_read += read; - } - - /* Done reading what we want to read */ - if (cur_marker != null) - { - /* will be null if bogus length word */ - /* Add new marker to end of list */ - cinfo.m_marker_list.Add(cur_marker); - - /* Reset pointer & calc remaining data length */ - data = cur_marker.Data; - dataOffset = 0; - length = cur_marker.OriginalLength - data_length; - } - - /* Reset to initial state for next marker */ - cinfo.m_marker.m_cur_marker = null; - - JpegMarkerType currentMarker = (JpegMarkerType)cinfo.m_unread_marker; - if (data_length != 0 && (currentMarker == JpegMarkerType.APP0 || currentMarker == JpegMarkerType.APP14)) - { - tempData = new byte[data.Length]; - Buffer.BlockCopy(data, dataOffset, tempData, 0, data.Length - dataOffset); - } - - /* Process the marker if interesting; else just make a generic trace msg */ - switch ((JpegMarkerType)cinfo.m_unread_marker) - { - case JpegMarkerType.APP0: - examine_app0(cinfo, tempData, data_length, length); - break; - case JpegMarkerType.APP14: - examine_app14(cinfo, tempData, data_length, length); - break; - default: - break; - } - - /* skip any remaining data -- could be lots */ - if (length > 0) - cinfo.m_src.skip_input_data(length); - - return true; - } - - /// - /// Skip over an unknown or uninteresting variable-length marker - /// - private static bool skip_variable(JpegDecompressor cinfo) - { - int length; - if (!cinfo.m_src.GetTwoBytes(out length)) - return false; - - length -= 2; - - if (length > 0) - cinfo.m_src.skip_input_data(length); - - return true; - } - - /// - /// Process an APP0 or APP14 marker without saving it - /// - private static bool get_interesting_appn(JpegDecompressor cinfo) - { - int length; - if (!cinfo.m_src.GetTwoBytes(out length)) - return false; - - length -= 2; - - /* get the interesting part of the marker data */ - int numtoread = 0; - if (length >= APPN_DATA_LEN) - numtoread = APPN_DATA_LEN; - else if (length > 0) - numtoread = length; - - byte[] b = new byte[APPN_DATA_LEN]; - for (int i = 0; i < numtoread; i++) - { - int temp = 0; - if (!cinfo.m_src.GetByte(out temp)) - return false; - - b[i] = (byte)temp; - } - - length -= numtoread; - - /* process it */ - switch ((JpegMarkerType)cinfo.m_unread_marker) - { - case JpegMarkerType.APP0: - examine_app0(cinfo, b, numtoread, length); - break; - case JpegMarkerType.APP14: - examine_app14(cinfo, b, numtoread, length); - break; - default: - /* can't get here unless jpeg_save_markers chooses wrong processor */ - throw new Exception(String.Format("Unsupported marker type 0x{0:X2}", cinfo.m_unread_marker)); - } - - /* skip any remaining data -- could be lots */ - if (length > 0) - cinfo.m_src.skip_input_data(length); - - return true; - } - - /* - * Routines for processing APPn and COM markers. - * These are either saved in memory or discarded, per application request. - * APP0 and APP14 are specially checked to see if they are - * JFIF and Adobe markers, respectively. - */ - - /// - /// Examine first few bytes from an APP0. - /// Take appropriate action if it is a JFIF marker. - /// datalen is # of bytes at data[], remaining is length of rest of marker data. - /// - private static void examine_app0(JpegDecompressor cinfo, byte[] data, int datalen, int remaining) - { - int totallen = datalen + remaining; - - if (datalen >= APP0_DATA_LEN && - data[0] == 0x4A && - data[1] == 0x46 && - data[2] == 0x49 && - data[3] == 0x46 && - data[4] == 0) - { - /* Found JFIF APP0 marker: save info */ - cinfo.m_saw_JFIF_marker = true; - cinfo.m_JFIF_major_version = data[5]; - cinfo.m_JFIF_minor_version = data[6]; - cinfo.m_density_unit = (DensityUnit)data[7]; - cinfo.m_X_density = (short)((data[8] << 8) + data[9]); - cinfo.m_Y_density = (short)((data[10] << 8) + data[11]); - } - else if (datalen >= 6 && data[0] == 0x4A && data[1] == 0x46 && data[2] == 0x58 && data[3] == 0x58 && data[4] == 0) - { - /* Found JFIF "JFXX" extension APP0 marker */ - /* The library doesn't actually do anything with these. - */ - } - else - { - /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ - } - } - - /// - /// Examine first few bytes from an APP14. - /// Take appropriate action if it is an Adobe marker. - /// datalen is # of bytes at data[], remaining is length of rest of marker data. - /// - private static void examine_app14(JpegDecompressor cinfo, byte[] data, int datalen, int remaining) - { - if (datalen >= APP14_DATA_LEN && - data[0] == 0x41 && - data[1] == 0x64 && - data[2] == 0x6F && - data[3] == 0x62 && - data[4] == 0x65) - { - /* Found Adobe APP14 marker */ - int version = (data[5] << 8) + data[6]; - int flags0 = (data[7] << 8) + data[8]; - int flags1 = (data[9] << 8) + data[10]; - int transform = data[11]; - cinfo.m_saw_Adobe_marker = true; - cinfo.m_Adobe_transform = (byte)transform; - } - else - { - /* Start of APP14 does not match "Adobe", or too short */ - } - } - - /* - * Routines to process JPEG markers. - * - * Entry condition: JPEG marker itself has been read and its code saved - * in cinfo.unread_marker; input restart point is just after the marker. - * - * Exit: if return true, have read and processed any parameters, and have - * updated the restart point to point after the parameters. - * If return false, was forced to suspend before reaching end of - * marker parameters; restart point has not been moved. Same routine - * will be called again after application supplies more input data. - * - * This approach to suspension assumes that all of a marker's parameters - * can fit into a single input buffer-load. This should hold for "normal" - * markers. Some COM/APPn markers might have large parameter segments - * that might not fit. If we are simply dropping such a marker, we use - * skip_input_data to get past it, and thereby put the problem on the - * source manager's shoulders. If we are saving the marker's contents - * into memory, we use a slightly different convention: when forced to - * suspend, the marker processor updates the restart point to the end of - * what it's consumed (ie, the end of the buffer) before returning false. - * On resumption, cinfo.unread_marker still contains the marker code, - * but the data source will point to the next chunk of marker data. - * The marker processor must retain internal state to deal with this. - * - * Note that we don't bother to avoid duplicate trace messages if a - * suspension occurs within marker parameters. Other side effects - * require more care. - */ - - - /// - /// Process an SOI marker - /// - private bool get_soi() - { - if (m_cinfo.m_marker.m_saw_SOI) - throw new Exception("Invalid JPEG file structure: two SOI markers"); - - /* Reset all parameters that are defined to be reset by SOI */ - m_cinfo.m_restart_interval = 0; - - /* Set initial assumptions for colorspace etc */ - - m_cinfo.m_jpeg_color_space = ColorSpace.Unknown; - m_cinfo.m_CCIR601_sampling = false; /* Assume non-CCIR sampling??? */ - - m_cinfo.m_saw_JFIF_marker = false; - m_cinfo.m_JFIF_major_version = 1; /* set default JFIF APP0 values */ - m_cinfo.m_JFIF_minor_version = 1; - m_cinfo.m_density_unit = DensityUnit.Unknown; - m_cinfo.m_X_density = 1; - m_cinfo.m_Y_density = 1; - m_cinfo.m_saw_Adobe_marker = false; - m_cinfo.m_Adobe_transform = 0; - - m_cinfo.m_marker.m_saw_SOI = true; - - return true; - } - - /// - /// Process a SOFn marker - /// - private bool get_sof(bool is_prog) - { - m_cinfo.m_progressive_mode = is_prog; - - int length; - if (!m_cinfo.m_src.GetTwoBytes(out length)) - return false; - - if (!m_cinfo.m_src.GetByte(out m_cinfo.m_data_precision)) - return false; - - int temp = 0; - if (!m_cinfo.m_src.GetTwoBytes(out temp)) - return false; - m_cinfo.m_image_height = temp; - - if (!m_cinfo.m_src.GetTwoBytes(out temp)) - return false; - m_cinfo.m_image_width = temp; - - if (!m_cinfo.m_src.GetByte(out m_cinfo.m_num_components)) - return false; - - length -= 8; - - if (m_cinfo.m_marker.m_saw_SOF) - throw new Exception("Invalid JPEG file structure: two SOI markers"); - - /* We don't support files in which the image height is initially specified */ - /* as 0 and is later redefined by DNL. As long as we have to check that, */ - /* might as well have a general sanity check. */ - if (m_cinfo.m_image_height <= 0 || m_cinfo.m_image_width <= 0 || m_cinfo.m_num_components <= 0) - throw new Exception("Empty JPEG image (DNL not supported)"); - - if (length != (m_cinfo.m_num_components * 3)) - throw new Exception("Bogus marker length"); - - if (m_cinfo.Comp_info == null) - { - /* do only once, even if suspend */ - m_cinfo.Comp_info = JpegComponent.createArrayOfComponents(m_cinfo.m_num_components); - } - - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - m_cinfo.Comp_info[ci].Component_index = ci; - - int component_id; - if (!m_cinfo.m_src.GetByte(out component_id)) - return false; - - m_cinfo.Comp_info[ci].Component_id = component_id; - - int c; - if (!m_cinfo.m_src.GetByte(out c)) - return false; - - m_cinfo.Comp_info[ci].H_samp_factor = (c >> 4) & 15; - m_cinfo.Comp_info[ci].V_samp_factor = (c) & 15; - - int quant_tbl_no; - if (!m_cinfo.m_src.GetByte(out quant_tbl_no)) - return false; - - m_cinfo.Comp_info[ci].Quant_tbl_no = quant_tbl_no; - } - - m_cinfo.m_marker.m_saw_SOF = true; - return true; - } - - /// - /// Process a SOS marker - /// - private bool get_sos() - { - if (!m_cinfo.m_marker.m_saw_SOF) - throw new Exception("Invalid JPEG file structure: SOS before SOF"); - - int length; - if (!m_cinfo.m_src.GetTwoBytes(out length)) - return false; - - /* Number of components */ - int n; - if (!m_cinfo.m_src.GetByte(out n)) - return false; - - if (length != (n * 2 + 6) || n < 1 || n > JpegConstants.MaxComponentsInScan) - throw new Exception("Bogus marker length"); - - m_cinfo.m_comps_in_scan = n; - - /* Collect the component-spec parameters */ - - for (int i = 0; i < n; i++) - { - int cc; - if (!m_cinfo.m_src.GetByte(out cc)) - return false; - - int c; - if (!m_cinfo.m_src.GetByte(out c)) - return false; - - bool idFound = false; - int foundIndex = -1; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - if (cc == m_cinfo.Comp_info[ci].Component_id) - { - foundIndex = ci; - idFound = true; - break; - } - } - - if (!idFound) - throw new Exception(String.Format("Invalid component ID {0} in SOS", cc)); - - m_cinfo.m_cur_comp_info[i] = foundIndex; - m_cinfo.Comp_info[foundIndex].Dc_tbl_no = (c >> 4) & 15; - m_cinfo.Comp_info[foundIndex].Ac_tbl_no = (c) & 15; - } - - /* Collect the additional scan parameters Ss, Se, Ah/Al. */ - int temp; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - m_cinfo.m_Ss = temp; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - m_cinfo.m_Se = temp; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - m_cinfo.m_Ah = (temp >> 4) & 15; - m_cinfo.m_Al = (temp) & 15; - - /* Prepare to scan data & restart markers */ - m_cinfo.m_marker.m_next_restart_num = 0; - - /* Count another SOS marker */ - m_cinfo.m_input_scan_number++; - return true; - } - - /// - /// Process a DHT marker - /// - private bool get_dht() - { - int length; - if (!m_cinfo.m_src.GetTwoBytes(out length)) - return false; - - length -= 2; - - byte[] bits = new byte[17]; - byte[] huffval = new byte[256]; - while (length > 16) - { - int index; - if (!m_cinfo.m_src.GetByte(out index)) - return false; - - bits[0] = 0; - int count = 0; - for (int i = 1; i <= 16; i++) - { - int temp = 0; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - bits[i] = (byte)temp; - count += bits[i]; - } - - length -= 1 + 16; - - /* Here we just do minimal validation of the counts to avoid walking - * off the end of our table space. HuffEntropyDecoder will check more carefully. - */ - if (count > 256 || count > length) - throw new Exception("Bogus Huffman table definition"); - - for (int i = 0; i < count; i++) - { - int temp = 0; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - huffval[i] = (byte)temp; - } - - length -= count; - - JpegHuffmanTable htblptr = null; - if ((index & 0x10) != 0) - { - /* AC table definition */ - index -= 0x10; - if (m_cinfo.m_ac_huff_tbl_ptrs[index] == null) - m_cinfo.m_ac_huff_tbl_ptrs[index] = new JpegHuffmanTable(); - - htblptr = m_cinfo.m_ac_huff_tbl_ptrs[index]; - } - else - { - /* DC table definition */ - if (m_cinfo.m_dc_huff_tbl_ptrs[index] == null) - m_cinfo.m_dc_huff_tbl_ptrs[index] = new JpegHuffmanTable(); - - htblptr = m_cinfo.m_dc_huff_tbl_ptrs[index]; - } - - if (index < 0 || index >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Bogus DHT index {0}", index)); - - Buffer.BlockCopy(bits, 0, htblptr.Bits, 0, htblptr.Bits.Length); - Buffer.BlockCopy(huffval, 0, htblptr.Huffval, 0, htblptr.Huffval.Length); - } - - if (length != 0) - throw new Exception("Bogus marker length"); - - return true; - } - - /// - /// Process a DQT marker - /// - private bool get_dqt() - { - int length; - if (!m_cinfo.m_src.GetTwoBytes(out length)) - return false; - - length -= 2; - while (length > 0) - { - int n; - if (!m_cinfo.m_src.GetByte(out n)) - return false; - - int prec = n >> 4; - n &= 0x0F; - - if (n >= JpegConstants.NumberOfQuantTables) - throw new Exception(String.Format("Bogus DQT index {0}", n)); - - if (m_cinfo.m_quant_tbl_ptrs[n] == null) - m_cinfo.m_quant_tbl_ptrs[n] = new JpegQuantizationTable(); - - JpegQuantizationTable quant_ptr = m_cinfo.m_quant_tbl_ptrs[n]; - - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - int tmp; - if (prec != 0) - { - int temp = 0; - if (!m_cinfo.m_src.GetTwoBytes(out temp)) - return false; - - tmp = temp; - } - else - { - int temp = 0; - if (!m_cinfo.m_src.GetByte(out temp)) - return false; - - tmp = temp; - } - - /* We convert the zigzag-order table to natural array order. */ - quant_ptr.quantval[JpegUtils.jpeg_natural_order[i]] = (short)tmp; - } - - length -= JpegConstants.DCTSize2 + 1; - if (prec != 0) - length -= JpegConstants.DCTSize2; - } - - if (length != 0) - throw new Exception("Bogus marker length"); - - return true; - } - - /// - /// Process a DRI marker - /// - private bool get_dri() - { - int length; - if (!m_cinfo.m_src.GetTwoBytes(out length)) - return false; - - if (length != 4) - throw new Exception("Bogus marker length"); - - int temp = 0; - if (!m_cinfo.m_src.GetTwoBytes(out temp)) - return false; - - int tmp = temp; - m_cinfo.m_restart_interval = tmp; - - return true; - } - - /// - /// Like next_marker, but used to obtain the initial SOI marker. - /// For this marker, we do not allow preceding garbage or fill; otherwise, - /// we might well scan an entire input file before realizing it's not JPEG. - /// If an application wants to process non-JFIF files, it must seek to the - /// SOI before calling the JPEG library. - /// - private bool first_marker() - { - int c; - if (!m_cinfo.m_src.GetByte(out c)) - return false; - - int c2; - if (!m_cinfo.m_src.GetByte(out c2)) - return false; - - if (c != 0xFF || c2 != (int)JpegMarkerType.SOI) - throw new Exception(String.Format("Not a JPEG file: starts with 0x{0:X2} 0x{1:X2}", c, c2)); - - m_cinfo.m_unread_marker = c2; - return true; - } - } - #endregion - - #region JpegMarkerType - /// - /// JPEG marker codes. - /// - /// Special markers - public enum JpegMarkerType - { - /// - /// - /// - SOF0 = 0xc0, - /// - /// - /// - SOF1 = 0xc1, - /// - /// - /// - SOF2 = 0xc2, - /// - /// - /// - SOF3 = 0xc3, - /// - /// - /// - SOF5 = 0xc5, - /// - /// - /// - SOF6 = 0xc6, - /// - /// - /// - SOF7 = 0xc7, - /// - /// - /// - JPG = 0xc8, - /// - /// - /// - SOF9 = 0xc9, - /// - /// - /// - SOF10 = 0xca, - /// - /// - /// - SOF11 = 0xcb, - /// - /// - /// - SOF13 = 0xcd, - /// - /// - /// - SOF14 = 0xce, - /// - /// - /// - SOF15 = 0xcf, - /// - /// - /// - DHT = 0xc4, - /// - /// - /// - DAC = 0xcc, - /// - /// - /// - RST0 = 0xd0, - /// - /// - /// - RST1 = 0xd1, - /// - /// - /// - RST2 = 0xd2, - /// - /// - /// - RST3 = 0xd3, - /// - /// - /// - RST4 = 0xd4, - /// - /// - /// - RST5 = 0xd5, - /// - /// - /// - RST6 = 0xd6, - /// - /// - /// - RST7 = 0xd7, - /// - /// - /// - SOI = 0xd8, - /// - /// - /// - EOI = 0xd9, - /// - /// - /// - SOS = 0xda, - /// - /// - /// - DQT = 0xdb, - /// - /// - /// - DNL = 0xdc, - /// - /// - /// - DRI = 0xdd, - /// - /// - /// - DHP = 0xde, - /// - /// - /// - EXP = 0xdf, - /// - /// - /// - APP0 = 0xe0, - /// - /// - /// - APP1 = 0xe1, - /// - /// - /// - APP2 = 0xe2, - /// - /// - /// - APP3 = 0xe3, - /// - /// - /// - APP4 = 0xe4, - /// - /// - /// - APP5 = 0xe5, - /// - /// - /// - APP6 = 0xe6, - /// - /// - /// - APP7 = 0xe7, - /// - /// - /// - APP8 = 0xe8, - /// - /// - /// - APP9 = 0xe9, - /// - /// - /// - APP10 = 0xea, - /// - /// - /// - APP11 = 0xeb, - /// - /// - /// - APP12 = 0xec, - /// - /// - /// - APP13 = 0xed, - /// - /// - /// - APP14 = 0xee, - /// - /// - /// - APP15 = 0xef, - /// - /// - /// - JPG0 = 0xf0, - /// - /// - /// - JPG13 = 0xfd, - /// - /// - /// - COM = 0xfe, - /// - /// - /// - TEM = 0x01, - /// - /// - /// - ERROR = 0x100 - } - #endregion - - #region JpegMarkerWriter - /// - /// Marker writing - /// - class JpegMarkerWriter - { - private JpegCompressor m_cinfo; - private int m_last_restart_interval; /* last DRI value emitted; 0 after SOI */ - - public JpegMarkerWriter(JpegCompressor cinfo) - { - m_cinfo = cinfo; - } - - /// - /// Write datastream header. - /// This consists of an SOI and optional APPn markers. - /// We recommend use of the JFIF marker, but not the Adobe marker, - /// when using YCbCr or grayscale data. The JFIF marker should NOT - /// be used for any other JPEG colorspace. The Adobe marker is helpful - /// to distinguish RGB, CMYK, and YCCK colorspaces. - /// Note that an application can write additional header markers after - /// jpeg_start_compress returns. - /// - public void write_file_header() - { - emit_marker(JpegMarkerType.SOI); /* first the SOI */ - - /* SOI is defined to reset restart interval to 0 */ - m_last_restart_interval = 0; - - if (m_cinfo.m_write_JFIF_header) /* next an optional JFIF APP0 */ - emit_jfif_app0(); - if (m_cinfo.m_write_Adobe_marker) /* next an optional Adobe APP14 */ - emit_adobe_app14(); - } - - /// - /// Write frame header. - /// This consists of DQT and SOFn markers. - /// Note that we do not emit the SOF until we have emitted the DQT(s). - /// This avoids compatibility problems with incorrect implementations that - /// try to error-check the quant table numbers as soon as they see the SOF. - /// - public void write_frame_header() - { - /* Emit DQT for each quantization table. - * Note that emit_dqt() suppresses any duplicate tables. - */ - int prec = 0; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - prec += emit_dqt(m_cinfo.Component_info[ci].Quant_tbl_no); - - /* now prec is nonzero iff there are any 16-bit quant tables. */ - - /* Check for a non-baseline specification. - * Note we assume that Huffman table numbers won't be changed later. - */ - bool is_baseline; - if (m_cinfo.m_progressive_mode || m_cinfo.m_data_precision != 8) - { - is_baseline = false; - } - else - { - is_baseline = true; - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - if (m_cinfo.Component_info[ci].Dc_tbl_no > 1 || m_cinfo.Component_info[ci].Ac_tbl_no > 1) - is_baseline = false; - } - - if (prec != 0 && is_baseline) - { - is_baseline = false; - } - } - - /* Emit the proper SOF marker */ - if (m_cinfo.m_progressive_mode) - emit_sof(JpegMarkerType.SOF2); /* SOF code for progressive Huffman */ - else if (is_baseline) - emit_sof(JpegMarkerType.SOF0); /* SOF code for baseline implementation */ - else - emit_sof(JpegMarkerType.SOF1); /* SOF code for non-baseline Huffman file */ - } - - /// - /// Write scan header. - /// This consists of DHT or DAC markers, optional DRI, and SOS. - /// Compressed data will be written following the SOS. - /// - public void write_scan_header() - { - /* Emit Huffman tables. - * Note that emit_dht() suppresses any duplicate tables. - */ - for (int i = 0; i < m_cinfo.m_comps_in_scan; i++) - { - int ac_tbl_no = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[i]].Ac_tbl_no; - int dc_tbl_no = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[i]].Dc_tbl_no; - if (m_cinfo.m_progressive_mode) - { - /* Progressive mode: only DC or only AC tables are used in one scan */ - if (m_cinfo.m_Ss == 0) - { - if (m_cinfo.m_Ah == 0) - { - /* DC needs no table for refinement scan */ - emit_dht(dc_tbl_no, false); - } - } - else - { - emit_dht(ac_tbl_no, true); - } - } - else - { - /* Sequential mode: need both DC and AC tables */ - emit_dht(dc_tbl_no, false); - emit_dht(ac_tbl_no, true); - } - } - - /* Emit DRI if required --- note that DRI value could change for each scan. - * We avoid wasting space with unnecessary DRIs, however. - */ - if (m_cinfo.m_restart_interval != m_last_restart_interval) - { - emit_dri(); - m_last_restart_interval = m_cinfo.m_restart_interval; - } - - emit_sos(); - } - - /// - /// Write datastream trailer. - /// - public void write_file_trailer() - { - emit_marker(JpegMarkerType.EOI); - } - - /// - /// Write an abbreviated table-specification datastream. - /// This consists of SOI, DQT and DHT tables, and EOI. - /// Any table that is defined and not marked sent_table = true will be - /// emitted. Note that all tables will be marked sent_table = true at exit. - /// - public void write_tables_only() - { - emit_marker(JpegMarkerType.SOI); - - for (int i = 0; i < JpegConstants.NumberOfQuantTables; i++) - { - if (m_cinfo.m_quant_tbl_ptrs[i] != null) - emit_dqt(i); - } - - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - if (m_cinfo.m_dc_huff_tbl_ptrs[i] != null) - emit_dht(i, false); - if (m_cinfo.m_ac_huff_tbl_ptrs[i] != null) - emit_dht(i, true); - } - - emit_marker(JpegMarkerType.EOI); - } - - ////////////////////////////////////////////////////////////////////////// - // These routines allow writing an arbitrary marker with parameters. - // The only intended use is to emit COM or APPn markers after calling - // write_file_header and before calling write_frame_header. - // Other uses are not guaranteed to produce desirable results. - // Counting the parameter bytes properly is the caller's responsibility. - - /// - /// Emit an arbitrary marker header - /// - public void write_marker_header(int marker, int datalen) - { - if (datalen > 65533) /* safety check */ - throw new Exception("Bogus marker length"); - - emit_marker((JpegMarkerType)marker); - - emit_2bytes(datalen + 2); /* total length */ - } - - /// - /// Emit one byte of marker parameters following write_marker_header - /// - public void write_marker_byte(byte val) - { - emit_byte(val); - } - - ////////////////////////////////////////////////////////////////////////// - // Routines to write specific marker types. - // - - /// - /// Emit a SOS marker - /// - private void emit_sos() - { - emit_marker(JpegMarkerType.SOS); - - emit_2bytes(2 * m_cinfo.m_comps_in_scan + 2 + 1 + 3); /* length */ - - emit_byte(m_cinfo.m_comps_in_scan); - - for (int i = 0; i < m_cinfo.m_comps_in_scan; i++) - { - int componentIndex = m_cinfo.m_cur_comp_info[i]; - emit_byte(m_cinfo.Component_info[componentIndex].Component_id); - - int td = m_cinfo.Component_info[componentIndex].Dc_tbl_no; - int ta = m_cinfo.Component_info[componentIndex].Ac_tbl_no; - if (m_cinfo.m_progressive_mode) - { - /* Progressive mode: only DC or only AC tables are used in one scan; - * furthermore, Huffman coding of DC refinement uses no table at all. - * We emit 0 for unused field(s); this is recommended by the P&M text - * but does not seem to be specified in the standard. - */ - if (m_cinfo.m_Ss == 0) - { - /* DC scan */ - ta = 0; - if (m_cinfo.m_Ah != 0) - { - /* no DC table either */ - td = 0; - } - } - else - { - /* AC scan */ - td = 0; - } - } - - emit_byte((td << 4) + ta); - } - - emit_byte(m_cinfo.m_Ss); - emit_byte(m_cinfo.m_Se); - emit_byte((m_cinfo.m_Ah << 4) + m_cinfo.m_Al); - } - - /// - /// Emit a SOF marker - /// - private void emit_sof(JpegMarkerType code) - { - emit_marker(code); - - emit_2bytes(3 * m_cinfo.m_num_components + 2 + 5 + 1); /* length */ - - /* Make sure image isn't bigger than SOF field can handle */ - if (m_cinfo.m_image_height > 65535 || m_cinfo.m_image_width > 65535) - throw new Exception(String.Format("Maximum supported image dimension is {0} pixels", 65535)); - - emit_byte(m_cinfo.m_data_precision); - emit_2bytes(m_cinfo.m_image_height); - emit_2bytes(m_cinfo.m_image_width); - - emit_byte(m_cinfo.m_num_components); - - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[ci]; - emit_byte(componentInfo.Component_id); - emit_byte((componentInfo.H_samp_factor << 4) + componentInfo.V_samp_factor); - emit_byte(componentInfo.Quant_tbl_no); - } - } - - /// - /// Emit an Adobe APP14 marker - /// - private void emit_adobe_app14() - { - /* - * Length of APP14 block (2 bytes) - * Block ID (5 bytes - ASCII "Adobe") - * Version Number (2 bytes - currently 100) - * Flags0 (2 bytes - currently 0) - * Flags1 (2 bytes - currently 0) - * Color transform (1 byte) - * - * Although Adobe TN 5116 mentions Version = 101, all the Adobe files - * now in circulation seem to use Version = 100, so that's what we write. - * - * We write the color transform byte as 1 if the JPEG color space is - * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with - * whether the encoder performed a transformation, which is pretty useless. - */ - - emit_marker(JpegMarkerType.APP14); - - emit_2bytes(2 + 5 + 2 + 2 + 2 + 1); /* length */ - - emit_byte(0x41); /* Identifier: ASCII "Adobe" */ - emit_byte(0x64); - emit_byte(0x6F); - emit_byte(0x62); - emit_byte(0x65); - emit_2bytes(100); /* Version */ - emit_2bytes(0); /* Flags0 */ - emit_2bytes(0); /* Flags1 */ - switch (m_cinfo.m_jpeg_color_space) - { - case ColorSpace.YCbCr: - emit_byte(1); /* Color transform = 1 */ - break; - case ColorSpace.YCCK: - emit_byte(2); /* Color transform = 2 */ - break; - default: - emit_byte(0); /* Color transform = 0 */ - break; - } - } - - /// - /// Emit a DRI marker - /// - private void emit_dri() - { - emit_marker(JpegMarkerType.DRI); - - emit_2bytes(4); /* fixed length */ - - emit_2bytes(m_cinfo.m_restart_interval); - } - - /// - /// Emit a DHT marker - /// - private void emit_dht(int index, bool is_ac) - { - JpegHuffmanTable htbl = m_cinfo.m_dc_huff_tbl_ptrs[index]; - if (is_ac) - { - htbl = m_cinfo.m_ac_huff_tbl_ptrs[index]; - index += 0x10; /* output index has AC bit set */ - } - - if (htbl == null) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", index)); - - if (!htbl.Sent_table) - { - emit_marker(JpegMarkerType.DHT); - - int length = 0; - for (int i = 1; i <= 16; i++) - length += htbl.Bits[i]; - - emit_2bytes(length + 2 + 1 + 16); - emit_byte(index); - - for (int i = 1; i <= 16; i++) - emit_byte(htbl.Bits[i]); - - for (int i = 0; i < length; i++) - emit_byte(htbl.Huffval[i]); - - htbl.Sent_table = true; - } - } - - /// - /// Emit a DQT marker - /// - /// The index. - /// the precision used (0 = 8bits, 1 = 16bits) for baseline checking - private int emit_dqt(int index) - { - JpegQuantizationTable qtbl = m_cinfo.m_quant_tbl_ptrs[index]; - if (qtbl == null) - throw new Exception(String.Format("Quantization table 0x{0:X2} was not defined", index)); - - int prec = 0; - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - if (qtbl.quantval[i] > 255) - prec = 1; - } - - if (!qtbl.Sent_table) - { - emit_marker(JpegMarkerType.DQT); - - emit_2bytes(prec != 0 ? JpegConstants.DCTSize2 * 2 + 1 + 2 : JpegConstants.DCTSize2 + 1 + 2); - - emit_byte(index + (prec << 4)); - - for (int i = 0; i < JpegConstants.DCTSize2; i++) - { - /* The table entries must be emitted in zigzag order. */ - int qval = qtbl.quantval[JpegUtils.jpeg_natural_order[i]]; - - if (prec != 0) - emit_byte(qval >> 8); - - emit_byte(qval & 0xFF); - } - - qtbl.Sent_table = true; - } - - return prec; - } - - /// - /// Emit a JFIF-compliant APP0 marker - /// - private void emit_jfif_app0() - { - /* - * Length of APP0 block (2 bytes) - * Block ID (4 bytes - ASCII "JFIF") - * Zero byte (1 byte to terminate the ID string) - * Version Major, Minor (2 bytes - major first) - * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) - * Xdpu (2 bytes - dots per unit horizontal) - * Ydpu (2 bytes - dots per unit vertical) - * Thumbnail X size (1 byte) - * Thumbnail Y size (1 byte) - */ - - emit_marker(JpegMarkerType.APP0); - - emit_2bytes(2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ - - emit_byte(0x4A); /* Identifier: ASCII "JFIF" */ - emit_byte(0x46); - emit_byte(0x49); - emit_byte(0x46); - emit_byte(0); - emit_byte(m_cinfo.m_JFIF_major_version); /* Version fields */ - emit_byte(m_cinfo.m_JFIF_minor_version); - emit_byte((int)m_cinfo.m_density_unit); /* Pixel size information */ - emit_2bytes(m_cinfo.m_X_density); - emit_2bytes(m_cinfo.m_Y_density); - emit_byte(0); /* No thumbnail image */ - emit_byte(0); - } - - ////////////////////////////////////////////////////////////////////////// - // Basic output routines. - // - // Note that we do not support suspension while writing a marker. - // Therefore, an application using suspension must ensure that there is - // enough buffer space for the initial markers (typ. 600-700 bytes) before - // calling jpeg_start_compress, and enough space to write the trailing EOI - // (a few bytes) before calling jpeg_finish_compress. Multi-pass compression - // modes are not supported at all with suspension, so those two are the only - // points where markers will be written. - - - /// - /// Emit a marker code - /// - private void emit_marker(JpegMarkerType mark) - { - emit_byte(0xFF); - emit_byte((int)mark); - } - - /// - /// Emit a 2-byte integer; these are always MSB first in JPEG files - /// - private void emit_2bytes(int value) - { - emit_byte((value >> 8) & 0xFF); - emit_byte(value & 0xFF); - } - - /// - /// Emit a byte - /// - private void emit_byte(int val) - { - if (!m_cinfo.m_dest.emit_byte(val)) - throw new Exception("Suspension not allowed here"); - } - } - #endregion - - #region JpegQuantizationTable - /// - /// DCT coefficient quantization table. - /// - public class JpegQuantizationTable - { - /// - /// This field is used only during compression. It's initialized false when - /// the table is created, and set true when it's been output to the file. - /// You could suppress output of a table by setting this to true. - /// - private bool m_sent_table; - - /// - /// This array gives the coefficient quantizers in natural array order - /// (not the zigzag order in which they are stored in a JPEG DQT marker). - /// CAUTION: IJG versions prior to v6a kept this array in zigzag order. - /// - internal readonly short[] quantval = new short[JpegConstants.DCTSize2]; - - internal JpegQuantizationTable() - { - } - - /// - /// Gets or sets a value indicating whether the table has been output to file. - /// - /// It's initialized false when the table is created, and set - /// true when it's been output to the file. You could suppress output of a table by setting this to true. - /// - /// This property is used only during compression. - /// - public bool Sent_table - { - get { return m_sent_table; } - set { m_sent_table = value; } - } - } - #endregion - - #region JpegScanInfo - /// - /// The script for encoding a multiple-scan file is an array of these: - /// - class JpegScanInfo - { - public int comps_in_scan; /* number of components encoded in this scan */ - public int[] component_index = new int[JpegConstants.MaxComponentsInScan]; /* their SOF/comp_info[] indexes */ - public int Ss; - public int Se; /* progressive JPEG spectral selection parms */ - public int Ah; - public int Al; /* progressive JPEG successive approx. parms */ - } - #endregion - - #region JpegSource - /// - /// Data source object for decompression. - /// - public abstract class Jpeg_Source - { - private byte[] m_next_input_byte; - private int m_bytes_in_buffer; /* # of bytes remaining (unread) in buffer */ - private int m_position; - - /// - /// Initializes this instance. - /// - public abstract void init_source(); - - /// - /// Fills input buffer - /// - /// true if operation succeed; otherwise, false - public abstract bool fill_input_buffer(); - - /// - /// Initializes the internal buffer. - /// - /// The buffer. - /// The size. - protected void initInternalBuffer(byte[] buffer, int size) - { - m_bytes_in_buffer = size; - m_next_input_byte = buffer; - m_position = 0; - } - - /// - /// Skip data - used to skip over a potentially large amount of - /// uninteresting data (such as an APPn marker). - /// - /// The number of bytes to skip. - /// Writers of suspendable-input applications must note that skip_input_data - /// is not granted the right to give a suspension return. If the skip extends - /// beyond the data currently in the buffer, the buffer can be marked empty so - /// that the next read will cause a fill_input_buffer call that can suspend. - /// Arranging for additional bytes to be discarded before reloading the input - /// buffer is the application writer's problem. - public virtual void skip_input_data(int num_bytes) - { - /* Just a dumb implementation for now. Could use fseek() except - * it doesn't work on pipes. Not clear that being smart is worth - * any trouble anyway --- large skips are infrequent. - */ - if (num_bytes > 0) - { - while (num_bytes > m_bytes_in_buffer) - { - num_bytes -= m_bytes_in_buffer; - fill_input_buffer(); - /* note we assume that fill_input_buffer will never return false, - * so suspension need not be handled. - */ - } - - m_position += num_bytes; - m_bytes_in_buffer -= num_bytes; - } - } - - /// - /// This is the default resync_to_restart method for data source - /// managers to use if they don't have any better approach. - /// - /// An instance of - /// The desired - /// false if suspension is required. - /// That method assumes that no backtracking is possible. - /// Some data source managers may be able to back up, or may have - /// additional knowledge about the data which permits a more - /// intelligent recovery strategy; such managers would - /// presumably supply their own resync method.

- /// - /// read_restart_marker calls resync_to_restart if it finds a marker other than - /// the restart marker it was expecting. (This code is *not* used unless - /// a nonzero restart interval has been declared.) cinfo.unread_marker is - /// the marker code actually found (might be anything, except 0 or FF). - /// The desired restart marker number (0..7) is passed as a parameter.

- /// - /// This routine is supposed to apply whatever error recovery strategy seems - /// appropriate in order to position the input stream to the next data segment. - /// Note that cinfo.unread_marker is treated as a marker appearing before - /// the current data-source input point; usually it should be reset to zero - /// before returning.

- /// - /// This implementation is substantially constrained by wanting to treat the - /// input as a data stream; this means we can't back up. Therefore, we have - /// only the following actions to work with:
- /// 1. Simply discard the marker and let the entropy decoder resume at next - /// byte of file.
- /// 2. Read forward until we find another marker, discarding intervening - /// data. (In theory we could look ahead within the current bufferload, - /// without having to discard data if we don't find the desired marker. - /// This idea is not implemented here, in part because it makes behavior - /// dependent on buffer size and chance buffer-boundary positions.)
- /// 3. Leave the marker unread (by failing to zero cinfo.unread_marker). - /// This will cause the entropy decoder to process an empty data segment, - /// inserting dummy zeroes, and then we will reprocess the marker.
- /// - /// #2 is appropriate if we think the desired marker lies ahead, while #3 is - /// appropriate if the found marker is a future restart marker (indicating - /// that we have missed the desired restart marker, probably because it got - /// corrupted).
- /// We apply #2 or #3 if the found marker is a restart marker no more than - /// two counts behind or ahead of the expected one. We also apply #2 if the - /// found marker is not a legal JPEG marker code (it's certainly bogus data). - /// If the found marker is a restart marker more than 2 counts away, we do #1 - /// (too much risk that the marker is erroneous; with luck we will be able to - /// resync at some future point).
- /// For any valid non-restart JPEG marker, we apply #3. This keeps us from - /// overrunning the end of a scan. An implementation limited to single-scan - /// files might find it better to apply #2 for markers other than EOI, since - /// any other marker would have to be bogus data in that case.
- public virtual bool resync_to_restart(JpegDecompressor cinfo, int desired) - { - /* Outer loop handles repeated decision after scanning forward. */ - int action = 1; - for (; ; ) - { - if (cinfo.m_unread_marker < (int)JpegMarkerType.SOF0) - { - /* invalid marker */ - action = 2; - } - else if (cinfo.m_unread_marker < (int)JpegMarkerType.RST0 || - cinfo.m_unread_marker > (int)JpegMarkerType.RST7) - { - /* valid non-restart marker */ - action = 3; - } - else - { - if (cinfo.m_unread_marker == ((int)JpegMarkerType.RST0 + ((desired + 1) & 7)) - || cinfo.m_unread_marker == ((int)JpegMarkerType.RST0 + ((desired + 2) & 7))) - { - /* one of the next two expected restarts */ - action = 3; - } - else if (cinfo.m_unread_marker == ((int)JpegMarkerType.RST0 + ((desired - 1) & 7)) || - cinfo.m_unread_marker == ((int)JpegMarkerType.RST0 + ((desired - 2) & 7))) - { - /* a prior restart, so advance */ - action = 2; - } - else - { - /* desired restart or too far away */ - action = 1; - } - } - - switch (action) - { - case 1: - /* Discard marker and let entropy decoder resume processing. */ - cinfo.m_unread_marker = 0; - return true; - case 2: - /* Scan to the next marker, and repeat the decision loop. */ - if (!cinfo.m_marker.next_marker()) - return false; - break; - case 3: - /* Return without advancing past this marker. */ - /* Entropy decoder will be forced to process an empty segment. */ - return true; - } - } - } - - /// - /// Terminate source - called by jpeg_finish_decompress - /// after all data has been read. Often a no-op. - /// - /// NB: not called by jpeg_abort or jpeg_destroy; surrounding - /// application must deal with any cleanup that should happen even - /// for error exit. - public virtual void term_source() - { - } - - /// - /// Reads two bytes interpreted as an unsigned 16-bit integer. - /// - /// The result. - /// true if operation succeed; otherwise, false - public virtual bool GetTwoBytes(out int V) - { - if (!MakeByteAvailable()) - { - V = 0; - return false; - } - - m_bytes_in_buffer--; - V = m_next_input_byte[m_position] << 8; - m_position++; - - if (!MakeByteAvailable()) - return false; - - m_bytes_in_buffer--; - V += m_next_input_byte[m_position]; - m_position++; - return true; - } - - /// - /// Read a byte into variable V. - /// If must suspend, take the specified action (typically "return false"). - /// - /// The result. - /// true if operation succeed; otherwise, false - public virtual bool GetByte(out int V) - { - if (!MakeByteAvailable()) - { - V = 0; - return false; - } - - m_bytes_in_buffer--; - V = m_next_input_byte[m_position]; - m_position++; - return true; - } - - /// - /// Gets the bytes. - /// - /// The destination. - /// The amount. - /// The number of available bytes. - public virtual int GetBytes(byte[] dest, int amount) - { - int avail = amount; - if (avail > m_bytes_in_buffer) - avail = m_bytes_in_buffer; - - for (int i = 0; i < avail; i++) - { - dest[i] = m_next_input_byte[m_position]; - m_position++; - m_bytes_in_buffer--; - } - - return avail; - } - - /// - /// Functions for fetching data from the data source module. - /// - /// true if operation succeed; otherwise, false - /// At all times, cinfo.src.next_input_byte and .bytes_in_buffer reflect - /// the current restart point; we update them only when we have reached a - /// suitable place to restart if a suspension occurs. - public virtual bool MakeByteAvailable() - { - if (m_bytes_in_buffer == 0) - { - if (!fill_input_buffer()) - return false; - } - - return true; - } - } - #endregion - - #region JpegUpsampler - /// - /// Upsampling (note that upsampler must also call color converter) - /// - abstract class JpegUpsampler - { - protected bool m_need_context_rows; /* true if need rows above & below */ - - public abstract void start_pass(); - public abstract void upsample(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail); - - public bool NeedContextRows() - { - return m_need_context_rows; - } - } - #endregion - - #region JpegUtils - class JpegUtils - { - /* - * jpeg_natural_order[i] is the natural-order position of the i'th element - * of zigzag order. - * - * When reading corrupted data, the Huffman decoders could attempt - * to reference an entry beyond the end of this array (if the decoded - * zero run length reaches past the end of the block). To prevent - * wild stores without adding an inner-loop test, we put some extra - * "63"s after the real entries. This will cause the extra coefficient - * to be stored in location 63 of the block, not somewhere random. - * The worst case would be a run-length of 15, which means we need 16 - * fake entries. - */ - public static int[] jpeg_natural_order = - { - 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, - 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, - 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, - 63, 63, 63, 63, 63, 63, 63, 63, 63, - /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 - }; - - /* We assume that right shift corresponds to signed division by 2 with - * rounding towards minus infinity. This is correct for typical "arithmetic - * shift" instructions that shift in copies of the sign bit. - * RIGHT_SHIFT provides a proper signed right shift of an int quantity. - * It is only applied with constant shift counts. SHIFT_TEMPS must be - * included in the variables of any routine using RIGHT_SHIFT. - */ - public static int RIGHT_SHIFT(int x, int shft) - { - return (x >> shft); - } - - /* Descale and correctly round an int value that's scaled by N bits. - * We assume RIGHT_SHIFT rounds towards minus infinity, so adding - * the fudge factor is correct for either sign of X. - */ - public static int DESCALE(int x, int n) - { - return RIGHT_SHIFT(x + (1 << (n - 1)), n); - } - - ////////////////////////////////////////////////////////////////////////// - // Arithmetic utilities - - /// - /// Compute a/b rounded up to next integer, ie, ceil(a/b) - /// Assumes a >= 0, b > 0 - /// - public static int jdiv_round_up(int a, int b) - { - return (a + b - 1) / b; - } - - /// - /// Compute a rounded up to next multiple of b, ie, ceil(a/b)*b - /// Assumes a >= 0, b > 0 - /// - public static int jround_up(int a, int b) - { - a += b - 1; - return a - (a % b); - } - - /// - /// Copy some rows of samples from one place to another. - /// num_rows rows are copied from input_array[source_row++] - /// to output_array[dest_row++]; these areas may overlap for duplication. - /// The source and destination arrays must be at least as wide as num_cols. - /// - public static void jcopy_sample_rows(ComponentBuffer input_array, int source_row, byte[][] output_array, int dest_row, int num_rows, int num_cols) - { - for (int row = 0; row < num_rows; row++) - Buffer.BlockCopy(input_array[source_row + row], 0, output_array[dest_row + row], 0, num_cols); - } - - public static void jcopy_sample_rows(ComponentBuffer input_array, int source_row, ComponentBuffer output_array, int dest_row, int num_rows, int num_cols) - { - for (int row = 0; row < num_rows; row++) - Buffer.BlockCopy(input_array[source_row + row], 0, output_array[dest_row + row], 0, num_cols); - } - - public static void jcopy_sample_rows(byte[][] input_array, int source_row, byte[][] output_array, int dest_row, int num_rows, int num_cols) - { - for (int row = 0; row < num_rows; row++) - Buffer.BlockCopy(input_array[source_row++], 0, output_array[dest_row++], 0, num_cols); - } - } - #endregion - - #region JpegVirtualArray - /// - /// JPEG virtual array. - /// - /// The type of array's elements. - /// You can't create virtual array manually. For creation use methods - /// and - /// . - /// - public class JpegVirtualArray - { - internal delegate T[][] Allocator(int width, int height); - - private JpegCommonBase m_cinfo; - - /// - /// the in-memory buffer - /// - private T[][] m_buffer; - - /// - /// Request a virtual 2-D array - /// - /// Width of array - /// Total virtual array height - /// The allocator. - internal JpegVirtualArray(int width, int height, Allocator allocator) - { - m_cinfo = null; - m_buffer = allocator(width, height); - - if (m_buffer == null) - throw new Exception("Filling of 'm_buffer' Failed!"); - } - - /// - /// Gets or sets the error processor. - /// - /// The error processor.
- /// Default value: null - ///
- /// Uses only for calling - /// JpegCommonBase.ERREXIT - /// on error. - public JpegCommonBase ErrorProcessor - { - get { return m_cinfo; } - set { m_cinfo = value; } - } - - /// - /// Access the part of a virtual array. - /// - /// The first row in required block. - /// The number of required rows. - /// The required part of virtual array. - public T[][] Access(int startRow, int numberOfRows) - { - /* debugging check */ - if (startRow + numberOfRows > m_buffer.Length) - { - throw new InvalidOperationException("Bogus virtual array access"); - } - - /* Return proper part of the buffer */ - T[][] ret = new T[numberOfRows][]; - for (int i = 0; i < numberOfRows; i++) - ret[i] = m_buffer[startRow + i]; - - return ret; - } - } - #endregion - - #region MergedUpsampler - class MergedUpsampler : JpegUpsampler - { - private const int SCALEBITS = 16; /* speediest right-shift on some machines */ - private const int ONE_HALF = 1 << (SCALEBITS - 1); - - private JpegDecompressor m_cinfo; - - private bool m_use_2v_upsample; - - /* Private state for YCC->RGB conversion */ - private int[] m_Cr_r_tab; /* => table for Cr to R conversion */ - private int[] m_Cb_b_tab; /* => table for Cb to B conversion */ - private int[] m_Cr_g_tab; /* => table for Cr to G conversion */ - private int[] m_Cb_g_tab; /* => table for Cb to G conversion */ - - /* For 2:1 vertical sampling, we produce two output rows at a time. - * We need a "spare" row buffer to hold the second output row if the - * application provides just a one-row buffer; we also use the spare - * to discard the dummy last row if the image height is odd. - */ - private byte[] m_spare_row; - private bool m_spare_full; /* T if spare buffer is occupied */ - - private int m_out_row_width; /* samples per output row */ - private int m_rows_to_go; /* counts rows remaining in image */ - - public MergedUpsampler(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - m_need_context_rows = false; - - m_out_row_width = cinfo.m_output_width * cinfo.m_out_color_components; - - if (cinfo.m_max_v_samp_factor == 2) - { - m_use_2v_upsample = true; - /* Allocate a spare row buffer */ - m_spare_row = new byte[m_out_row_width]; - } - else - { - m_use_2v_upsample = false; - } - - build_ycc_rgb_table(); - } - - /// - /// Initialize for an upsampling pass. - /// - public override void start_pass() - { - /* Mark the spare buffer empty */ - m_spare_full = false; - - /* Initialize total-height counter for detecting bottom of image */ - m_rows_to_go = m_cinfo.m_output_height; - } - - public override void upsample(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - if (m_use_2v_upsample) - merged_2v_upsample(input_buf, ref in_row_group_ctr, output_buf, ref out_row_ctr, out_rows_avail); - else - merged_1v_upsample(input_buf, ref in_row_group_ctr, output_buf, ref out_row_ctr); - } - - /// - /// Control routine to do upsampling (and color conversion). - /// The control routine just handles the row buffering considerations. - /// 1:1 vertical sampling case: much easier, never need a spare row. - /// - private void merged_1v_upsample(ComponentBuffer[] input_buf, ref int in_row_group_ctr, byte[][] output_buf, ref int out_row_ctr) - { - /* Just do the upsampling. */ - h2v1_merged_upsample(input_buf, in_row_group_ctr, output_buf, out_row_ctr); - - /* Adjust counts */ - out_row_ctr++; - in_row_group_ctr++; - } - - /// - /// Control routine to do upsampling (and color conversion). - /// The control routine just handles the row buffering considerations. - /// 2:1 vertical sampling case: may need a spare row. - /// - private void merged_2v_upsample(ComponentBuffer[] input_buf, ref int in_row_group_ctr, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - int num_rows; /* number of rows returned to caller */ - if (m_spare_full) - { - /* If we have a spare row saved from a previous cycle, just return it. */ - byte[][] temp = new byte[1][]; - temp[0] = m_spare_row; - JpegUtils.jcopy_sample_rows(temp, 0, output_buf, out_row_ctr, 1, m_out_row_width); - num_rows = 1; - m_spare_full = false; - } - else - { - /* Figure number of rows to return to caller. */ - num_rows = 2; - - /* Not more than the distance to the end of the image. */ - if (num_rows > m_rows_to_go) - num_rows = m_rows_to_go; - - /* And not more than what the client can accept: */ - out_rows_avail -= out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - - /* Create output pointer array for upsampler. */ - byte[][] work_ptrs = new byte[2][]; - work_ptrs[0] = output_buf[out_row_ctr]; - if (num_rows > 1) - { - work_ptrs[1] = output_buf[out_row_ctr + 1]; - } - else - { - work_ptrs[1] = m_spare_row; - m_spare_full = true; - } - - /* Now do the upsampling. */ - h2v2_merged_upsample(input_buf, in_row_group_ctr, work_ptrs); - } - - /* Adjust counts */ - out_row_ctr += num_rows; - m_rows_to_go -= num_rows; - - /* When the buffer is emptied, declare this input row group consumed */ - if (!m_spare_full) - in_row_group_ctr++; - } - - /* - * These are the routines invoked by the control routines to do - * the actual upsampling/conversion. One row group is processed per call. - * - * Note: since we may be writing directly into application-supplied buffers, - * we have to be honest about the output width; we can't assume the buffer - * has been rounded up to an even width. - */ - - /// - /// Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. - /// - private void h2v1_merged_upsample(ComponentBuffer[] input_buf, int in_row_group_ctr, byte[][] output_buf, int outRow) - { - int inputIndex0 = 0; - int inputIndex1 = 0; - int inputIndex2 = 0; - int outputIndex = 0; - - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - - /* Loop for each pair of output pixels */ - for (int col = m_cinfo.m_output_width >> 1; col > 0; col--) - { - /* Do the chroma part of the calculation */ - int cb = input_buf[1][in_row_group_ctr][inputIndex1]; - inputIndex1++; - - int cr = input_buf[2][in_row_group_ctr][inputIndex2]; - inputIndex2++; - - int cred = m_Cr_r_tab[cr]; - int cgreen = JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS); - int cblue = m_Cb_b_tab[cb]; - - /* Fetch 2 Y values and emit 2 pixels */ - int y = input_buf[0][in_row_group_ctr][inputIndex0]; - inputIndex0++; - - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outputIndex += JpegConstants.RGB_PixelLength; - - y = input_buf[0][in_row_group_ctr][inputIndex0]; - inputIndex0++; - - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outputIndex += JpegConstants.RGB_PixelLength; - } - - /* If image width is odd, do the last output column separately */ - if ((m_cinfo.m_output_width & 1) != 0) - { - int cb = input_buf[1][in_row_group_ctr][inputIndex1]; - int cr = input_buf[2][in_row_group_ctr][inputIndex2]; - int cred = m_Cr_r_tab[cr]; - int cgreen = JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS); - int cblue = m_Cb_b_tab[cb]; - - int y = input_buf[0][in_row_group_ctr][inputIndex0]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[outRow][outputIndex + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - } - } - - /// - /// Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. - /// - private void h2v2_merged_upsample(ComponentBuffer[] input_buf, int in_row_group_ctr, byte[][] output_buf) - { - int inputRow00 = in_row_group_ctr * 2; - int inputIndex00 = 0; - - int inputRow01 = in_row_group_ctr * 2 + 1; - int inputIndex01 = 0; - - int inputIndex1 = 0; - int inputIndex2 = 0; - - int outIndex0 = 0; - int outIndex1 = 0; - - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - - /* Loop for each group of output pixels */ - for (int col = m_cinfo.m_output_width >> 1; col > 0; col--) - { - /* Do the chroma part of the calculation */ - int cb = input_buf[1][in_row_group_ctr][inputIndex1]; - inputIndex1++; - - int cr = input_buf[2][in_row_group_ctr][inputIndex2]; - inputIndex2++; - - int cred = m_Cr_r_tab[cr]; - int cgreen = JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS); - int cblue = m_Cb_b_tab[cb]; - - /* Fetch 4 Y values and emit 4 pixels */ - int y = input_buf[0][inputRow00][inputIndex00]; - inputIndex00++; - - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outIndex0 += JpegConstants.RGB_PixelLength; - - y = input_buf[0][inputRow00][inputIndex00]; - inputIndex00++; - - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outIndex0 += JpegConstants.RGB_PixelLength; - - y = input_buf[0][inputRow01][inputIndex01]; - inputIndex01++; - - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outIndex1 += JpegConstants.RGB_PixelLength; - - y = input_buf[0][inputRow01][inputIndex01]; - inputIndex01++; - - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - outIndex1 += JpegConstants.RGB_PixelLength; - } - - /* If image width is odd, do the last output column separately */ - if ((m_cinfo.m_output_width & 1) != 0) - { - int cb = input_buf[1][in_row_group_ctr][inputIndex1]; - int cr = input_buf[2][in_row_group_ctr][inputIndex2]; - int cred = m_Cr_r_tab[cr]; - int cgreen = JpegUtils.RIGHT_SHIFT(m_Cb_g_tab[cb] + m_Cr_g_tab[cr], SCALEBITS); - int cblue = m_Cb_b_tab[cb]; - - int y = input_buf[0][inputRow00][inputIndex00]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[0][outIndex0 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - - y = input_buf[0][inputRow01][inputIndex01]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Red] = limit[limitOffset + y + cred]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Green] = limit[limitOffset + y + cgreen]; - output_buf[1][outIndex1 + JpegConstants.Offset_RGB_Blue] = limit[limitOffset + y + cblue]; - } - } - - /// - /// Initialize tables for YCC->RGB colorspace conversion. - /// This is taken directly from ColorDeconverter; see that file for more info. - /// - private void build_ycc_rgb_table() - { - m_Cr_r_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cb_b_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cr_g_tab = new int[JpegConstants.MaxSampleValue + 1]; - m_Cb_g_tab = new int[JpegConstants.MaxSampleValue + 1]; - - for (int i = 0, x = -JpegConstants.MediumSampleValue; i <= JpegConstants.MaxSampleValue; i++, x++) - { - /* i is the actual input pixel value, in the range 0..MaxSampleValue */ - /* The Cb or Cr value we are thinking of is x = i - MediumSampleValue */ - /* Cr=>R value is nearest int to 1.40200 * x */ - m_Cr_r_tab[i] = JpegUtils.RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - - /* Cb=>B value is nearest int to 1.77200 * x */ - m_Cb_b_tab[i] = JpegUtils.RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - - /* Cr=>G value is scaled-up -0.71414 * x */ - m_Cr_g_tab[i] = (-FIX(0.71414)) * x; - - /* Cb=>G value is scaled-up -0.34414 * x */ - /* We also add in ONE_HALF so that need not do it in inner loop */ - m_Cb_g_tab[i] = (-FIX(0.34414)) * x + ONE_HALF; - } - } - - private static int FIX(double x) - { - return ((int)((x) * (1L << SCALEBITS) + 0.5)); - } - } - #endregion - - #region Pass1ColorQuantizer - /// - /// The main purpose of 1-pass quantization is to provide a fast, if not very - /// high quality, colormapped output capability. A 2-pass quantizer usually - /// gives better visual quality; however, for quantized grayscale output this - /// quantizer is perfectly adequate. Dithering is highly recommended with this - /// quantizer, though you can turn it off if you really want to. - /// - /// In 1-pass quantization the colormap must be chosen in advance of seeing the - /// image. We use a map consisting of all combinations of Ncolors[i] color - /// values for the i'th component. The Ncolors[] values are chosen so that - /// their product, the total number of colors, is no more than that requested. - /// (In most cases, the product will be somewhat less.) - /// - /// Since the colormap is orthogonal, the representative value for each color - /// component can be determined without considering the other components; - /// then these indexes can be combined into a colormap index by a standard - /// N-dimensional-array-subscript calculation. Most of the arithmetic involved - /// can be precalculated and stored in the lookup table colorindex[]. - /// colorindex[i][j] maps pixel value j in component i to the nearest - /// representative value (grid plane) for that component; this index is - /// multiplied by the array stride for component i, so that the - /// index of the colormap entry closest to a given pixel value is just - /// sum( colorindex[component-number][pixel-component-value] ) - /// Aside from being fast, this scheme allows for variable spacing between - /// representative values with no additional lookup cost. - /// - /// If gamma correction has been applied in color conversion, it might be wise - /// to adjust the color grid spacing so that the representative colors are - /// equidistant in linear space. At this writing, gamma correction is not - /// implemented, so nothing is done here. - /// - /// - /// Declarations for Floyd-Steinberg dithering. - /// - /// Errors are accumulated into the array fserrors[], at a resolution of - /// 1/16th of a pixel count. The error at a given pixel is propagated - /// to its not-yet-processed neighbors using the standard F-S fractions, - /// ... (here) 7/16 - /// 3/16 5/16 1/16 - /// We work left-to-right on even rows, right-to-left on odd rows. - /// - /// We can get away with a single array (holding one row's worth of errors) - /// by using it to store the current row's errors at pixel columns not yet - /// processed, but the next row's errors at columns already processed. We - /// need only a few extra variables to hold the errors immediately around the - /// current column. (If we are lucky, those variables are in registers, but - /// even if not, they're probably cheaper to access than array elements are.) - /// - /// The fserrors[] array is indexed [component#][position]. - /// We provide (#columns + 2) entries per component; the extra entry at each - /// end saves us from special-casing the first and last pixels. - /// - /// - /// Declarations for ordered dithering. - /// - /// We use a standard 16x16 ordered dither array. The basic concept of ordered - /// dithering is described in many references, for instance Dale Schumacher's - /// chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). - /// In place of Schumacher's comparisons against a "threshold" value, we add a - /// "dither" value to the input pixel and then round the result to the nearest - /// output value. The dither value is equivalent to (0.5 - threshold) times - /// the distance between output values. For ordered dithering, we assume that - /// the output colors are equally spaced; if not, results will probably be - /// worse, since the dither may be too much or too little at a given point. - /// - /// The normal calculation would be to form pixel value + dither, range-limit - /// this to 0..MaxSampleValue, and then index into the colorindex table as usual. - /// We can skip the separate range-limiting step by extending the colorindex - /// table in both directions. - /// - class Pass1ColorQuantizer : ColorQuantizer - { - private enum QuantizerType - { - color_quantizer3, - color_quantizer, - quantize3_ord_dither_quantizer, - quantize_ord_dither_quantizer, - quantize_fs_dither_quantizer - } - - private static int[] RGB_order = { JpegConstants.Offset_RGB_Green, JpegConstants.Offset_RGB_Red, JpegConstants.Offset_RGB_Blue }; - private const int MAX_Q_COMPS = 4; /* max components I can handle */ - - private const int ODITHER_SIZE = 16; /* dimension of dither matrix */ - - /* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ - private const int ODITHER_CELLS = (ODITHER_SIZE * ODITHER_SIZE); /* # cells in matrix */ - private const int ODITHER_MASK = (ODITHER_SIZE - 1); /* mask for wrapping around counters */ - - /* Bayer's order-4 dither array. Generated by the code given in - * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. - * The values in this array must range from 0 to ODITHER_CELLS-1. - */ - private static byte[][] base_dither_matrix = new byte[][] - { - new byte[] { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, - new byte[] { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, - new byte[] { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, - new byte[] { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, - new byte[] { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, - new byte[] { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, - new byte[] { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, - new byte[] { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, - new byte[] { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, - new byte[] { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, - new byte[] { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, - new byte[] { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, - new byte[] { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, - new byte[] { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, - new byte[] { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, - new byte[] { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } - }; - - private QuantizerType m_quantizer; - - private JpegDecompressor m_cinfo; - - /* Initially allocated colormap is saved here */ - private byte[][] m_sv_colormap; /* The color map as a 2-D pixel array */ - private int m_sv_actual; /* number of entries in use */ - - private byte[][] m_colorindex; /* Precomputed mapping for speed */ - private int[] m_colorindexOffset; - - /* colorindex[i][j] = index of color closest to pixel value j in component i, - * premultiplied as described above. Since colormap indexes must fit into - * bytes, the entries of this array will too. - */ - private bool m_is_padded; /* is the colorindex padded for odither? */ - - private int[] m_Ncolors = new int[MAX_Q_COMPS]; /* # of values alloced to each component */ - - /* Variables for ordered dithering */ - private int m_row_index; /* cur row's vertical index in dither matrix */ - private int[][][] m_odither = new int[MAX_Q_COMPS][][]; /* one dither array per component */ - - /* Variables for Floyd-Steinberg dithering */ - private short[][] m_fserrors = new short[MAX_Q_COMPS][]; /* accumulated errors */ - private bool m_on_odd_row; /* flag to remember which row we are on */ - - /// - /// Module initialization routine for 1-pass color quantization. - /// - /// The cinfo. - public Pass1ColorQuantizer(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - m_fserrors[0] = null; /* Flag FS workspace not allocated */ - m_odither[0] = null; /* Also flag odither arrays not allocated */ - - /* Make sure my internal arrays won't overflow */ - if (cinfo.m_out_color_components > MAX_Q_COMPS) - throw new Exception(String.Format("Cannot quantize more than {0} color components", MAX_Q_COMPS)); - - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (cinfo.m_desired_number_of_colors > (JpegConstants.MaxSampleValue + 1)) - throw new Exception(String.Format("Cannot quantize to more than {0} colors", JpegConstants.MaxSampleValue + 1)); - - /* Create the colormap and color index table. */ - create_colormap(); - create_colorindex(); - - /* Allocate Floyd-Steinberg workspace now if requested. - * We do this now since it is FAR storage and may affect the memory - * manager's space calculations. If the user changes to FS dither - * mode in a later pass, we will allocate the space then, and will - * possibly overrun the max_memory_to_use setting. - */ - if (cinfo.m_dither_mode == DitherMode.FloydStein) - alloc_fs_workspace(); - } - - /// - /// Initialize for one-pass color quantization. - /// - public virtual void start_pass(bool is_pre_scan) - { - /* Install my colormap. */ - m_cinfo.m_colormap = m_sv_colormap; - m_cinfo.m_actual_number_of_colors = m_sv_actual; - - /* Initialize for desired dithering mode. */ - switch (m_cinfo.m_dither_mode) - { - case DitherMode.None: - if (m_cinfo.m_out_color_components == 3) - m_quantizer = QuantizerType.color_quantizer3; - else - m_quantizer = QuantizerType.color_quantizer; - - break; - case DitherMode.Ordered: - if (m_cinfo.m_out_color_components == 3) - m_quantizer = QuantizerType.quantize3_ord_dither_quantizer; - else - m_quantizer = QuantizerType.quantize3_ord_dither_quantizer; - - /* initialize state for ordered dither */ - m_row_index = 0; - - /* If user changed to ordered dither from another mode, - * we must recreate the color index table with padding. - * This will cost extra space, but probably isn't very likely. - */ - if (!m_is_padded) - create_colorindex(); - - /* Create ordered-dither tables if we didn't already. */ - if (m_odither[0] == null) - create_odither_tables(); - - break; - case DitherMode.FloydStein: - m_quantizer = QuantizerType.quantize_fs_dither_quantizer; - - /* initialize state for F-S dither */ - m_on_odd_row = false; - - /* Allocate Floyd-Steinberg workspace if didn't already. */ - if (m_fserrors[0] == null) - alloc_fs_workspace(); - - /* Initialize the propagated errors to zero. */ - int arraysize = m_cinfo.m_output_width + 2; - for (int i = 0; i < m_cinfo.m_out_color_components; i++) - Array.Clear(m_fserrors[i], 0, arraysize); - - break; - default: - throw new Exception("Unknown Dither Mode"); - } - } - - public virtual void color_quantize(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - switch (m_quantizer) - { - case QuantizerType.color_quantizer3: - quantize3(input_buf, in_row, output_buf, out_row, num_rows); - break; - case QuantizerType.color_quantizer: - quantize(input_buf, in_row, output_buf, out_row, num_rows); - break; - case QuantizerType.quantize3_ord_dither_quantizer: - quantize3_ord_dither(input_buf, in_row, output_buf, out_row, num_rows); - break; - case QuantizerType.quantize_ord_dither_quantizer: - quantize_ord_dither(input_buf, in_row, output_buf, out_row, num_rows); - break; - case QuantizerType.quantize_fs_dither_quantizer: - quantize_fs_dither(input_buf, in_row, output_buf, out_row, num_rows); - break; - default: - throw new Exception("Not implemented yet"); - } - } - - /// - /// Finish up at the end of the pass. - /// - public virtual void finish_pass() - { - /* no work in 1-pass case */ - } - - /// - /// Switch to a new external colormap between output passes. - /// Shouldn't get to this! - /// - public virtual void new_color_map() - { - throw new Exception("Invalid mode change during color quantization"); - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// General case, no dithering. - /// - private void quantize(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - int nc = m_cinfo.m_out_color_components; - - for (int row = 0; row < num_rows; row++) - { - int inIndex = 0; - int inRow = in_row + row; - - int outIndex = 0; - int outRow = out_row + row; - - for (int col = m_cinfo.m_output_width; col > 0; col--) - { - int pixcode = 0; - for (int ci = 0; ci < nc; ci++) - { - pixcode += m_colorindex[ci][m_colorindexOffset[ci] + input_buf[inRow][inIndex]]; - inIndex++; - } - - output_buf[outRow][outIndex] = (byte)pixcode; - outIndex++; - } - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// Fast path for out_color_components==3, no dithering - /// - private void quantize3(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - int width = m_cinfo.m_output_width; - - for (int row = 0; row < num_rows; row++) - { - int inIndex = 0; - int inRow = in_row + row; - - int outIndex = 0; - int outRow = out_row + row; - - for (int col = width; col > 0; col--) - { - int pixcode = m_colorindex[0][m_colorindexOffset[0] + input_buf[inRow][inIndex]]; - inIndex++; - - pixcode += m_colorindex[1][m_colorindexOffset[1] + input_buf[inRow][inIndex]]; - inIndex++; - - pixcode += m_colorindex[2][m_colorindexOffset[2] + input_buf[inRow][inIndex]]; - inIndex++; - - output_buf[outRow][outIndex] = (byte)pixcode; - outIndex++; - } - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// General case, with ordered dithering. - /// - private void quantize_ord_dither(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - int nc = m_cinfo.m_out_color_components; - int width = m_cinfo.m_output_width; - - for (int row = 0; row < num_rows; row++) - { - /* Initialize output values to 0 so can process components separately */ - Array.Clear(output_buf[out_row + row], 0, width); - - int row_index = m_row_index; - for (int ci = 0; ci < nc; ci++) - { - int inputIndex = ci; - int outIndex = 0; - int outRow = out_row + row; - - int col_index = 0; - for (int col = width; col > 0; col--) - { - /* Form pixel value + dither, range-limit to 0..MaxSampleValue, - * select output value, accumulate into output code for this pixel. - * Range-limiting need not be done explicitly, as we have extended - * the colorindex table to produce the right answers for out-of-range - * inputs. The maximum dither is +- MaxSampleValue; this sets the - * required amount of padding. - */ - output_buf[outRow][outIndex] += m_colorindex[ci][m_colorindexOffset[ci] + input_buf[in_row + row][inputIndex] + m_odither[ci][row_index][col_index]]; - inputIndex += nc; - outIndex++; - col_index = (col_index + 1) & ODITHER_MASK; - } - } - - /* Advance row index for next row */ - row_index = (row_index + 1) & ODITHER_MASK; - m_row_index = row_index; - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// Fast path for out_color_components==3, with ordered dithering - /// - private void quantize3_ord_dither(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - int width = m_cinfo.m_output_width; - - for (int row = 0; row < num_rows; row++) - { - int row_index = m_row_index; - int inRow = in_row + row; - int inIndex = 0; - - int outIndex = 0; - int outRow = out_row + row; - - int col_index = 0; - for (int col = width; col > 0; col--) - { - int pixcode = m_colorindex[0][m_colorindexOffset[0] + input_buf[inRow][inIndex] + m_odither[0][row_index][col_index]]; - inIndex++; - - pixcode += m_colorindex[1][m_colorindexOffset[1] + input_buf[inRow][inIndex] + m_odither[1][row_index][col_index]]; - inIndex++; - - pixcode += m_colorindex[2][m_colorindexOffset[2] + input_buf[inRow][inIndex] + m_odither[2][row_index][col_index]]; - inIndex++; - - output_buf[outRow][outIndex] = (byte)pixcode; - outIndex++; - - col_index = (col_index + 1) & ODITHER_MASK; - } - - row_index = (row_index + 1) & ODITHER_MASK; - m_row_index = row_index; - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// General case, with Floyd-Steinberg dithering - /// - private void quantize_fs_dither(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - int nc = m_cinfo.m_out_color_components; - int width = m_cinfo.m_output_width; - - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - - for (int row = 0; row < num_rows; row++) - { - /* Initialize output values to 0 so can process components separately */ - Array.Clear(output_buf[out_row + row], 0, width); - - for (int ci = 0; ci < nc; ci++) - { - int inRow = in_row + row; - int inIndex = ci; - - int outIndex = 0; - int outRow = out_row + row; - - int errorIndex = 0; - int dir; /* 1 for left-to-right, -1 for right-to-left */ - if (m_on_odd_row) - { - /* work right to left in this row */ - inIndex += (width - 1) * nc; /* so point to rightmost pixel */ - outIndex += width - 1; - dir = -1; - errorIndex = width + 1; /* => entry after last column */ - } - else - { - /* work left to right in this row */ - dir = 1; - errorIndex = 0; /* => entry before first column */ - } - int dirnc = dir * nc; - - /* Preset error values: no error propagated to first pixel from left */ - int cur = 0; - /* and no error propagated to row below yet */ - int belowerr = 0; - int bpreverr = 0; - - for (int col = width; col > 0; col--) - { - /* cur holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorIndex is for *previous* column's array entry. - */ - cur = JpegUtils.RIGHT_SHIFT(cur + m_fserrors[ci][errorIndex + dir] + 8, 4); - - /* Form pixel value + error, and range-limit to 0..MaxSampleValue. - * The maximum error is +- MaxSampleValue; this sets the required size - * of the range_limit array. - */ - cur += input_buf[inRow][inIndex]; - cur = limit[limitOffset + cur]; - - /* Select output value, accumulate into output code for this pixel */ - int pixcode = m_colorindex[ci][m_colorindexOffset[ci] + cur]; - output_buf[outRow][outIndex] += (byte)pixcode; - - /* Compute actual representation error at this pixel */ - /* Note: we can do this even though we don't have the final */ - /* pixel code, because the colormap is orthogonal. */ - cur -= m_sv_colormap[ci][pixcode]; - - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - int bnexterr = cur; - int delta = cur * 2; - cur += delta; /* form error * 3 */ - m_fserrors[ci][errorIndex + 0] = (short)(bpreverr + cur); - cur += delta; /* form error * 5 */ - bpreverr = belowerr + cur; - belowerr = bnexterr; - cur += delta; /* form error * 7 */ - - /* At this point cur contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - inIndex += dirnc; /* advance input to next column */ - outIndex += dir; /* advance output to next column */ - errorIndex += dir; /* advance errorIndex to current column */ - } - - /* Post-loop cleanup: we must unload the final error value into the - * final fserrors[] entry. Note we need not unload belowerr because - * it is for the dummy column before or after the actual array. - */ - m_fserrors[ci][errorIndex + 0] = (short)bpreverr; /* unload prev err into array */ - } - - m_on_odd_row = (m_on_odd_row ? false : true); - } - } - - /// - /// Create the colormap. - /// - private void create_colormap() - { - /* Select number of colors for each component */ - int total_colors = select_ncolors(m_Ncolors); - - /* Allocate and fill in the colormap. */ - /* The colors are ordered in the map in standard row-major order, */ - /* i.e. rightmost (highest-indexed) color changes most rapidly. */ - byte[][] colormap = JpegCommonBase.AllocJpegSamples(total_colors, m_cinfo.m_out_color_components); - - /* blksize is number of adjacent repeated entries for a component */ - /* blkdist is distance between groups of identical entries for a component */ - int blkdist = total_colors; - for (int i = 0; i < m_cinfo.m_out_color_components; i++) - { - /* fill in colormap entries for i'th color component */ - int nci = m_Ncolors[i]; /* # of distinct values for this color */ - int blksize = blkdist / nci; - for (int j = 0; j < nci; j++) - { - /* Compute j'th output value (out of nci) for component */ - int val = output_value(j, nci - 1); - - /* Fill in all colormap entries that have this value of this component */ - for (int ptr = j * blksize; ptr < total_colors; ptr += blkdist) - { - /* fill in blksize entries beginning at ptr */ - for (int k = 0; k < blksize; k++) - colormap[i][ptr + k] = (byte)val; - } - } - - /* blksize of this color is blkdist of next */ - blkdist = blksize; - } - - /* Save the colormap in private storage, - * where it will survive color quantization mode changes. - */ - m_sv_colormap = colormap; - m_sv_actual = total_colors; - } - - /// - /// Create the color index table. - /// - private void create_colorindex() - { - /* For ordered dither, we pad the color index tables by MaxSampleValue in - * each direction (input index values can be -MaxSampleValue .. 2*MaxSampleValue). - * This is not necessary in the other dithering modes. However, we - * flag whether it was done in case user changes dithering mode. - */ - int pad; - if (m_cinfo.m_dither_mode == DitherMode.Ordered) - { - pad = JpegConstants.MaxSampleValue * 2; - m_is_padded = true; - } - else - { - pad = 0; - m_is_padded = false; - } - - m_colorindex = JpegCommonBase.AllocJpegSamples(JpegConstants.MaxSampleValue + 1 + pad, m_cinfo.m_out_color_components); - m_colorindexOffset = new int[m_cinfo.m_out_color_components]; - - /* blksize is number of adjacent repeated entries for a component */ - int blksize = m_sv_actual; - for (int i = 0; i < m_cinfo.m_out_color_components; i++) - { - /* fill in colorindex entries for i'th color component */ - int nci = m_Ncolors[i]; /* # of distinct values for this color */ - blksize = blksize / nci; - - /* adjust colorindex pointers to provide padding at negative indexes. */ - if (pad != 0) - m_colorindexOffset[i] += JpegConstants.MaxSampleValue; - - /* in loop, val = index of current output value, */ - /* and k = largest j that maps to current val */ - int val = 0; - int k = largest_input_value(0, nci - 1); - for (int j = 0; j <= JpegConstants.MaxSampleValue; j++) - { - while (j > k) - { - /* advance val if past boundary */ - k = largest_input_value(++val, nci - 1); - } - - /* premultiply so that no multiplication needed in main processing */ - m_colorindex[i][m_colorindexOffset[i] + j] = (byte)(val * blksize); - } - - /* Pad at both ends if necessary */ - if (pad != 0) - { - for (int j = 1; j <= JpegConstants.MaxSampleValue; j++) - { - m_colorindex[i][m_colorindexOffset[i] + -j] = m_colorindex[i][m_colorindexOffset[i]]; - m_colorindex[i][m_colorindexOffset[i] + JpegConstants.MaxSampleValue + j] = m_colorindex[i][m_colorindexOffset[i] + JpegConstants.MaxSampleValue]; - } - } - } - } - - /// - /// Create the ordered-dither tables. - /// Components having the same number of representative colors may - /// share a dither table. - /// - private void create_odither_tables() - { - for (int i = 0; i < m_cinfo.m_out_color_components; i++) - { - int nci = m_Ncolors[i]; /* # of distinct values for this color */ - - /* search for matching prior component */ - int foundPos = -1; - for (int j = 0; j < i; j++) - { - if (nci == m_Ncolors[j]) - { - foundPos = j; - break; - } - } - - if (foundPos == -1) - { - /* need a new table? */ - m_odither[i] = make_odither_array(nci); - } - else - m_odither[i] = m_odither[foundPos]; - } - } - - /// - /// Allocate workspace for Floyd-Steinberg errors. - /// - private void alloc_fs_workspace() - { - for (int i = 0; i < m_cinfo.m_out_color_components; i++) - m_fserrors[i] = new short[m_cinfo.m_output_width + 2]; - } - - /* - * Policy-making subroutines for create_colormap and create_colorindex. - * These routines determine the colormap to be used. The rest of the module - * only assumes that the colormap is orthogonal. - * - * * select_ncolors decides how to divvy up the available colors - * among the components. - * * output_value defines the set of representative values for a component. - * * largest_input_value defines the mapping from input values to - * representative values for a component. - * Note that the latter two routines may impose different policies for - * different components, though this is not currently done. - */ - - /// - /// Return largest input value that should map to j'th output value - /// Must have largest(j=0) >= 0, and largest(j=maxj) >= MaxSampleValue - /// - private static int largest_input_value(int j, int maxj) - { - /* Breakpoints are halfway between values returned by output_value */ - return (int)(((2 * j + 1) * JpegConstants.MaxSampleValue + maxj) / (2 * maxj)); - } - - /// - /// Return j'th output value, where j will range from 0 to maxj - /// The output values must fall in 0..MaxSampleValue in increasing order - /// - private static int output_value(int j, int maxj) - { - /* We always provide values 0 and MaxSampleValue for each component; - * any additional values are equally spaced between these limits. - * (Forcing the upper and lower values to the limits ensures that - * dithering can't produce a color outside the selected gamut.) - */ - return (int)((j * JpegConstants.MaxSampleValue + maxj / 2) / maxj); - } - - /// - /// Determine allocation of desired colors to components, - /// and fill in Ncolors[] array to indicate choice. - /// Return value is total number of colors (product of Ncolors[] values). - /// - private int select_ncolors(int[] Ncolors) - { - int nc = m_cinfo.m_out_color_components; /* number of color components */ - int max_colors = m_cinfo.m_desired_number_of_colors; - - /* We can allocate at least the nc'th root of max_colors per component. */ - /* Compute floor(nc'th root of max_colors). */ - int iroot = 1; - long temp = 0; - do - { - iroot++; - temp = iroot; /* set temp = iroot ** nc */ - for (int i = 1; i < nc; i++) - temp *= iroot; - } - while (temp <= max_colors); /* repeat till iroot exceeds root */ - - /* now iroot = floor(root) */ - iroot--; - - /* Must have at least 2 color values per component */ - if (iroot < 2) - throw new Exception(String.Format("Cannot quantize to fewer than {0} colors", (int)temp)); - - /* Initialize to iroot color values for each component */ - int total_colors = 1; - for (int i = 0; i < nc; i++) - { - Ncolors[i] = iroot; - total_colors *= iroot; - } - - /* We may be able to increment the count for one or more components without - * exceeding max_colors, though we know not all can be incremented. - * Sometimes, the first component can be incremented more than once! - * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) - * In RGB colorspace, try to increment G first, then R, then B. - */ - bool changed = false; - do - { - changed = false; - for (int i = 0; i < nc; i++) - { - int j = (m_cinfo.m_out_color_space == ColorSpace.RGB ? RGB_order[i] : i); - /* calculate new total_colors if Ncolors[j] is incremented */ - temp = total_colors / Ncolors[j]; - temp *= Ncolors[j] + 1; /* done in long arith to avoid oflo */ - - if (temp > max_colors) - break; /* won't fit, done with this pass */ - - Ncolors[j]++; /* OK, apply the increment */ - total_colors = (int)temp; - changed = true; - } - } - while (changed); - - return total_colors; - } - - /// - /// Create an ordered-dither array for a component having ncolors - /// distinct output values. - /// - private static int[][] make_odither_array(int ncolors) - { - int[][] odither = new int[ODITHER_SIZE][]; - for (int i = 0; i < ODITHER_SIZE; i++) - odither[i] = new int[ODITHER_SIZE]; - - /* The inter-value distance for this color is MaxSampleValue/(ncolors-1). - * Hence the dither value for the matrix cell with fill order f - * (f=0..N-1) should be (N-1-2*f)/(2*N) * MaxSampleValue/(ncolors-1). - * On 16-bit-int machine, be careful to avoid overflow. - */ - int den = 2 * ODITHER_CELLS * (ncolors - 1); - for (int j = 0; j < ODITHER_SIZE; j++) - { - for (int k = 0; k < ODITHER_SIZE; k++) - { - int num = ((int)(ODITHER_CELLS - 1 - 2 * ((int)base_dither_matrix[j][k]))) * JpegConstants.MaxSampleValue; - - /* Ensure round towards zero despite C's lack of consistency - * about rounding negative values in integer division... - */ - odither[j][k] = num < 0 ? -((-num) / den) : num / den; - } - } - - return odither; - } - } - #endregion - - #region Pass2ColorQuantizer - /// - /// This module implements the well-known Heckbert paradigm for color - /// quantization. Most of the ideas used here can be traced back to - /// Heckbert's seminal paper - /// Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", - /// Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. - /// - /// In the first pass over the image, we accumulate a histogram showing the - /// usage count of each possible color. To keep the histogram to a reasonable - /// size, we reduce the precision of the input; typical practice is to retain - /// 5 or 6 bits per color, so that 8 or 4 different input values are counted - /// in the same histogram cell. - /// - /// Next, the color-selection step begins with a box representing the whole - /// color space, and repeatedly splits the "largest" remaining box until we - /// have as many boxes as desired colors. Then the mean color in each - /// remaining box becomes one of the possible output colors. - /// - /// The second pass over the image maps each input pixel to the closest output - /// color (optionally after applying a Floyd-Steinberg dithering correction). - /// This mapping is logically trivial, but making it go fast enough requires - /// considerable care. - /// - /// Heckbert-style quantizers vary a good deal in their policies for choosing - /// the "largest" box and deciding where to cut it. The particular policies - /// used here have proved out well in experimental comparisons, but better ones - /// may yet be found. - /// - /// In earlier versions of the IJG code, this module quantized in YCbCr color - /// space, processing the raw upsampled data without a color conversion step. - /// This allowed the color conversion math to be done only once per colormap - /// entry, not once per pixel. However, that optimization precluded other - /// useful optimizations (such as merging color conversion with upsampling) - /// and it also interfered with desired capabilities such as quantizing to an - /// externally-supplied colormap. We have therefore abandoned that approach. - /// The present code works in the post-conversion color space, typically RGB. - /// - /// To improve the visual quality of the results, we actually work in scaled - /// RGB space, giving G distances more weight than R, and R in turn more than - /// B. To do everything in integer math, we must use integer scale factors. - /// The 2/3/1 scale factors used here correspond loosely to the relative - /// weights of the colors in the NTSC grayscale equation. - /// If you want to use this code to quantize a non-RGB color space, you'll - /// probably need to change these scale factors. - /// - /// First we have the histogram data structure and routines for creating it. - /// - /// The number of bits of precision can be adjusted by changing these symbols. - /// We recommend keeping 6 bits for G and 5 each for R and B. - /// If you have plenty of memory and cycles, 6 bits all around gives marginally - /// better results; if you are short of memory, 5 bits all around will save - /// some space but degrade the results. - /// To maintain a fully accurate histogram, we'd need to allocate a "long" - /// (preferably unsigned long) for each cell. In practice this is overkill; - /// we can get by with 16 bits per cell. Few of the cell counts will overflow, - /// and clamping those that do overflow to the maximum value will give close- - /// enough results. This reduces the recommended histogram size from 256Kb - /// to 128Kb, which is a useful savings on PC-class machines. - /// (In the second pass the histogram space is re-used for pixel mapping data; - /// in that capacity, each cell must be able to store zero to the number of - /// desired colors. 16 bits/cell is plenty for that too.) - /// Since the JPEG code is intended to run in small memory model on 80x86 - /// machines, we can't just allocate the histogram in one chunk. Instead - /// of a true 3-D array, we use a row of pointers to 2-D arrays. Each - /// pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and - /// each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that - /// on 80x86 machines, the pointer row is in near memory but the actual - /// arrays are in far memory (same arrangement as we use for image arrays). - /// - /// - /// Declarations for Floyd-Steinberg dithering. - /// - /// Errors are accumulated into the array fserrors[], at a resolution of - /// 1/16th of a pixel count. The error at a given pixel is propagated - /// to its not-yet-processed neighbors using the standard F-S fractions, - /// ... (here) 7/16 - /// 3/16 5/16 1/16 - /// We work left-to-right on even rows, right-to-left on odd rows. - /// - /// We can get away with a single array (holding one row's worth of errors) - /// by using it to store the current row's errors at pixel columns not yet - /// processed, but the next row's errors at columns already processed. We - /// need only a few extra variables to hold the errors immediately around the - /// current column. (If we are lucky, those variables are in registers, but - /// even if not, they're probably cheaper to access than array elements are.) - /// - /// The fserrors[] array has (#columns + 2) entries; the extra entry at - /// each end saves us from special-casing the first and last pixels. - /// Each entry is three values long, one value for each color component. - /// - class Pass2ColorQuantizer : ColorQuantizer - { - private struct box - { - /* The bounds of the box (inclusive); expressed as histogram indexes */ - public int c0min; - public int c0max; - public int c1min; - public int c1max; - public int c2min; - public int c2max; - /* The volume (actually 2-norm) of the box */ - public int volume; - /* The number of nonzero histogram cells within this box */ - public long colorcount; - } - - private enum QuantizerType - { - prescan_quantizer, - pass2_fs_dither_quantizer, - pass2_no_dither_quantizer - } - - private const int MAXNUMCOLORS = (JpegConstants.MaxSampleValue + 1); /* maximum size of colormap */ - - /* These will do the right thing for either R,G,B or B,G,R color order, - * but you may not like the results for other color orders. - */ - private const int HIST_C0_BITS = 5; /* bits of precision in R/B histogram */ - private const int HIST_C1_BITS = 6; /* bits of precision in G histogram */ - private const int HIST_C2_BITS = 5; /* bits of precision in B/R histogram */ - - /* Number of elements along histogram axes. */ - private const int HIST_C0_ELEMS = (1 << HIST_C0_BITS); - private const int HIST_C1_ELEMS = (1 << HIST_C1_BITS); - private const int HIST_C2_ELEMS = (1 << HIST_C2_BITS); - - /* These are the amounts to shift an input value to get a histogram index. */ - private const int C0_SHIFT = (JpegConstants.BitsInSample - HIST_C0_BITS); - private const int C1_SHIFT = (JpegConstants.BitsInSample - HIST_C1_BITS); - private const int C2_SHIFT = (JpegConstants.BitsInSample - HIST_C2_BITS); - - private const int R_SCALE = 2; /* scale R distances by this much */ - private const int G_SCALE = 3; /* scale G distances by this much */ - private const int B_SCALE = 1; /* and B by this much */ - - /* log2(histogram cells in update box) for each axis; this can be adjusted */ - private const int BOX_C0_LOG = (HIST_C0_BITS - 3); - private const int BOX_C1_LOG = (HIST_C1_BITS - 3); - private const int BOX_C2_LOG = (HIST_C2_BITS - 3); - - private const int BOX_C0_ELEMS = (1 << BOX_C0_LOG); /* # of hist cells in update box */ - private const int BOX_C1_ELEMS = (1 << BOX_C1_LOG); - private const int BOX_C2_ELEMS = (1 << BOX_C2_LOG); - - private const int BOX_C0_SHIFT = (C0_SHIFT + BOX_C0_LOG); - private const int BOX_C1_SHIFT = (C1_SHIFT + BOX_C1_LOG); - private const int BOX_C2_SHIFT = (C2_SHIFT + BOX_C2_LOG); - - private QuantizerType m_quantizer; - - private bool m_useFinishPass1; - - private JpegDecompressor m_cinfo; - - /* Space for the eventually created colormap is stashed here */ - private byte[][] m_sv_colormap; /* colormap allocated at init time */ - private int m_desired; /* desired # of colors = size of colormap */ - - /* Variables for accumulating image statistics */ - private ushort[][] m_histogram; /* pointer to the histogram */ - - private bool m_needs_zeroed; /* true if next pass must zero histogram */ - - /* Variables for Floyd-Steinberg dithering */ - private short[] m_fserrors; /* accumulated errors */ - private bool m_on_odd_row; /* flag to remember which row we are on */ - private int[] m_error_limiter; /* table for clamping the applied error */ - - /// - /// Module initialization routine for 2-pass color quantization. - /// - public Pass2ColorQuantizer(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - /* Make sure jdmaster didn't give me a case I can't handle */ - if (cinfo.m_out_color_components != 3) - throw new Exception("Unable to handle anything other than 3 color components!"); - - /* Allocate the histogram/inverse colormap storage */ - m_histogram = new ushort[HIST_C0_ELEMS][]; - for (int i = 0; i < HIST_C0_ELEMS; i++) - m_histogram[i] = new ushort[HIST_C1_ELEMS * HIST_C2_ELEMS]; - - m_needs_zeroed = true; /* histogram is garbage now */ - - /* Allocate storage for the completed colormap, if required. - * We do this now since it is FAR storage and may affect - * the memory manager's space calculations. - */ - if (cinfo.m_enable_2pass_quant) - { - /* Make sure color count is acceptable */ - int desired_local = cinfo.m_desired_number_of_colors; - - /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ - if (desired_local < 8) - throw new Exception("Cannot quantize to fewer than 8 colors"); - - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (desired_local > MAXNUMCOLORS) - throw new Exception(String.Format("Cannot quantize to more than {0} colors", MAXNUMCOLORS)); - - m_sv_colormap = JpegCommonBase.AllocJpegSamples(desired_local, 3); - m_desired = desired_local; - } - - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (cinfo.m_dither_mode != DitherMode.None) - cinfo.m_dither_mode = DitherMode.FloydStein; - - /* Allocate Floyd-Steinberg workspace if necessary. - * This isn't really needed until pass 2, but again it is FAR storage. - * Although we will cope with a later change in dither_mode, - * we do not promise to honor max_memory_to_use if dither_mode changes. - */ - if (cinfo.m_dither_mode == DitherMode.FloydStein) - { - m_fserrors = new short[(cinfo.m_output_width + 2) * 3]; - - /* Might as well create the error-limiting table too. */ - init_error_limit(); - } - } - - /// - /// Initialize for each processing pass. - /// - public virtual void start_pass(bool is_pre_scan) - { - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (m_cinfo.m_dither_mode != DitherMode.None) - m_cinfo.m_dither_mode = DitherMode.FloydStein; - - if (is_pre_scan) - { - /* Set up method pointers */ - m_quantizer = QuantizerType.prescan_quantizer; - m_useFinishPass1 = true; - m_needs_zeroed = true; /* Always zero histogram */ - } - else - { - /* Set up method pointers */ - if (m_cinfo.m_dither_mode == DitherMode.FloydStein) - m_quantizer = QuantizerType.pass2_fs_dither_quantizer; - else - m_quantizer = QuantizerType.pass2_no_dither_quantizer; - - m_useFinishPass1 = false; - - /* Make sure color count is acceptable */ - int i = m_cinfo.m_actual_number_of_colors; - if (i < 1) - throw new Exception("Cannot quantize to less than 1 color"); - - if (i > MAXNUMCOLORS) - throw new Exception(String.Format("Cannot quantize to more than {0} colors", MAXNUMCOLORS)); - - if (m_cinfo.m_dither_mode == DitherMode.FloydStein) - { - /* Allocate Floyd-Steinberg workspace if we didn't already. */ - if (m_fserrors == null) - { - int arraysize = (m_cinfo.m_output_width + 2) * 3; - m_fserrors = new short[arraysize]; - } - else - { - /* Initialize the propagated errors to zero. */ - Array.Clear(m_fserrors, 0, m_fserrors.Length); - } - - /* Make the error-limit table if we didn't already. */ - if (m_error_limiter == null) - init_error_limit(); - - m_on_odd_row = false; - } - } - - /* Zero the histogram or inverse color map, if necessary */ - if (m_needs_zeroed) - { - for (int i = 0; i < HIST_C0_ELEMS; i++) - Array.Clear(m_histogram[i], 0, m_histogram[i].Length); - - m_needs_zeroed = false; - } - } - - public virtual void color_quantize(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - switch (m_quantizer) - { - case QuantizerType.prescan_quantizer: - prescan_quantize(input_buf, in_row, num_rows); - break; - case QuantizerType.pass2_fs_dither_quantizer: - pass2_fs_dither(input_buf, in_row, output_buf, out_row, num_rows); - break; - case QuantizerType.pass2_no_dither_quantizer: - pass2_no_dither(input_buf, in_row, output_buf, out_row, num_rows); - break; - default: - throw new Exception("Specified Quantizer Type not implemented"); - } - } - - public virtual void finish_pass() - { - if (m_useFinishPass1) - finish_pass1(); - } - - /// - /// Switch to a new external colormap between output passes. - /// - public virtual void new_color_map() - { - /* Reset the inverse color map */ - m_needs_zeroed = true; - } - - /// - /// Prescan some rows of pixels. - /// In this module the prescan simply updates the histogram, which has been - /// initialized to zeroes by start_pass. - /// An output_buf parameter is required by the method signature, but no data - /// is actually output (in fact the buffer controller is probably passing a - /// null pointer). - /// - private void prescan_quantize(byte[][] input_buf, int in_row, int num_rows) - { - for (int row = 0; row < num_rows; row++) - { - int inputIndex = 0; - for (int col = m_cinfo.m_output_width; col > 0; col--) - { - int rowIndex = (int)input_buf[in_row + row][inputIndex] >> C0_SHIFT; - int columnIndex = ((int)input_buf[in_row + row][inputIndex + 1] >> C1_SHIFT) * HIST_C2_ELEMS + - ((int)input_buf[in_row + row][inputIndex + 2] >> C2_SHIFT); - - /* increment pixel value, check for overflow and undo increment if so. */ - m_histogram[rowIndex][columnIndex]++; - if (m_histogram[rowIndex][columnIndex] <= 0) - m_histogram[rowIndex][columnIndex]--; - - inputIndex += 3; - } - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// This version performs Floyd-Steinberg dithering - /// - private void pass2_fs_dither(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - byte[] limit = m_cinfo.m_sample_range_limit; - int limitOffset = m_cinfo.m_sampleRangeLimitOffset; - - for (int row = 0; row < num_rows; row++) - { - int inputPixelIndex = 0; - int outputPixelIndex = 0; - int errorIndex = 0; - int dir; /* +1 or -1 depending on direction */ - int dir3; /* 3*dir, for advancing inputIndex & errorIndex */ - if (m_on_odd_row) - { - /* work right to left in this row */ - inputPixelIndex += (m_cinfo.m_output_width - 1) * 3; /* so point to rightmost pixel */ - outputPixelIndex += m_cinfo.m_output_width - 1; - dir = -1; - dir3 = -3; - errorIndex = (m_cinfo.m_output_width + 1) * 3; /* => entry after last column */ - m_on_odd_row = false; /* flip for next time */ - } - else - { - /* work left to right in this row */ - dir = 1; - dir3 = 3; - errorIndex = 0; /* => entry before first real column */ - m_on_odd_row = true; /* flip for next time */ - } - - /* Preset error values: no error propagated to first pixel from left */ - /* current error or pixel value */ - int cur0 = 0; - int cur1 = 0; - int cur2 = 0; - /* and no error propagated to row below yet */ - /* error for pixel below cur */ - int belowerr0 = 0; - int belowerr1 = 0; - int belowerr2 = 0; - /* error for below/prev col */ - int bpreverr0 = 0; - int bpreverr1 = 0; - int bpreverr2 = 0; - - for (int col = m_cinfo.m_output_width; col > 0; col--) - { - /* curN holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorIndex is for *previous* column's array entry. - */ - cur0 = JpegUtils.RIGHT_SHIFT(cur0 + m_fserrors[errorIndex + dir3] + 8, 4); - cur1 = JpegUtils.RIGHT_SHIFT(cur1 + m_fserrors[errorIndex + dir3 + 1] + 8, 4); - cur2 = JpegUtils.RIGHT_SHIFT(cur2 + m_fserrors[errorIndex + dir3 + 2] + 8, 4); - - /* Limit the error using transfer function set by init_error_limit. - * See comments with init_error_limit for rationale. - */ - cur0 = m_error_limiter[JpegConstants.MaxSampleValue + cur0]; - cur1 = m_error_limiter[JpegConstants.MaxSampleValue + cur1]; - cur2 = m_error_limiter[JpegConstants.MaxSampleValue + cur2]; - - /* Form pixel value + error, and range-limit to 0..MaxSampleValue. - * The maximum error is +- MaxSampleValue (or less with error limiting); - * this sets the required size of the range_limit array. - */ - cur0 += input_buf[in_row + row][inputPixelIndex]; - cur1 += input_buf[in_row + row][inputPixelIndex + 1]; - cur2 += input_buf[in_row + row][inputPixelIndex + 2]; - cur0 = limit[limitOffset + cur0]; - cur1 = limit[limitOffset + cur1]; - cur2 = limit[limitOffset + cur2]; - - /* Index into the cache with adjusted pixel value */ - int hRow = cur0 >> C0_SHIFT; - int hColumn = (cur1 >> C1_SHIFT) * HIST_C2_ELEMS + (cur2 >> C2_SHIFT); - - /* If we have not seen this color before, find nearest colormap */ - /* entry and update the cache */ - if (m_histogram[hRow][hColumn] == 0) - fill_inverse_cmap(cur0 >> C0_SHIFT, cur1 >> C1_SHIFT, cur2 >> C2_SHIFT); - - /* Now emit the colormap index for this cell */ - int pixcode = m_histogram[hRow][hColumn] - 1; - output_buf[out_row + row][outputPixelIndex] = (byte)pixcode; - - /* Compute representation error for this pixel */ - cur0 -= m_cinfo.m_colormap[0][pixcode]; - cur1 -= m_cinfo.m_colormap[1][pixcode]; - cur2 -= m_cinfo.m_colormap[2][pixcode]; - - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - int bnexterr = cur0; /* Process component 0 */ - int delta = cur0 * 2; - cur0 += delta; /* form error * 3 */ - m_fserrors[errorIndex] = (short)(bpreverr0 + cur0); - cur0 += delta; /* form error * 5 */ - bpreverr0 = belowerr0 + cur0; - belowerr0 = bnexterr; - cur0 += delta; /* form error * 7 */ - bnexterr = cur1; /* Process component 1 */ - delta = cur1 * 2; - cur1 += delta; /* form error * 3 */ - m_fserrors[errorIndex + 1] = (short)(bpreverr1 + cur1); - cur1 += delta; /* form error * 5 */ - bpreverr1 = belowerr1 + cur1; - belowerr1 = bnexterr; - cur1 += delta; /* form error * 7 */ - bnexterr = cur2; /* Process component 2 */ - delta = cur2 * 2; - cur2 += delta; /* form error * 3 */ - m_fserrors[errorIndex + 2] = (short)(bpreverr2 + cur2); - cur2 += delta; /* form error * 5 */ - bpreverr2 = belowerr2 + cur2; - belowerr2 = bnexterr; - cur2 += delta; /* form error * 7 */ - - /* At this point curN contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - inputPixelIndex += dir3; /* Advance pixel pointers to next column */ - outputPixelIndex += dir; - errorIndex += dir3; /* advance errorIndex to current column */ - } - - /* Post-loop cleanup: we must unload the final error values into the - * final fserrors[] entry. Note we need not unload belowerrN because - * it is for the dummy column before or after the actual array. - */ - m_fserrors[errorIndex] = (short)bpreverr0; /* unload prev errs into array */ - m_fserrors[errorIndex + 1] = (short)bpreverr1; - m_fserrors[errorIndex + 2] = (short)bpreverr2; - } - } - - /// - /// Map some rows of pixels to the output colormapped representation. - /// This version performs no dithering - /// - private void pass2_no_dither(byte[][] input_buf, int in_row, byte[][] output_buf, int out_row, int num_rows) - { - for (int row = 0; row < num_rows; row++) - { - int inRow = row + in_row; - int inIndex = 0; - int outIndex = 0; - int outRow = out_row + row; - for (int col = m_cinfo.m_output_width; col > 0; col--) - { - /* get pixel value and index into the cache */ - int c0 = (int)input_buf[inRow][inIndex] >> C0_SHIFT; - inIndex++; - - int c1 = (int)input_buf[inRow][inIndex] >> C1_SHIFT; - inIndex++; - - int c2 = (int)input_buf[inRow][inIndex] >> C2_SHIFT; - inIndex++; - - int hRow = c0; - int hColumn = c1 * HIST_C2_ELEMS + c2; - - /* If we have not seen this color before, find nearest colormap entry */ - /* and update the cache */ - if (m_histogram[hRow][hColumn] == 0) - fill_inverse_cmap(c0, c1, c2); - - /* Now emit the colormap index for this cell */ - output_buf[outRow][outIndex] = (byte)(m_histogram[hRow][hColumn] - 1); - outIndex++; - } - } - } - - /// - /// Finish up at the end of each pass. - /// - private void finish_pass1() - { - /* Select the representative colors and fill in cinfo.colormap */ - m_cinfo.m_colormap = m_sv_colormap; - select_colors(m_desired); - - /* Force next pass to zero the color index table */ - m_needs_zeroed = true; - } - - /// - /// Compute representative color for a box, put it in colormap[icolor] - /// - private void compute_color(box[] boxlist, int boxIndex, int icolor) - { - /* Current algorithm: mean weighted by pixels (not colors) */ - /* Note it is important to get the rounding correct! */ - long total = 0; - long c0total = 0; - long c1total = 0; - long c2total = 0; - box curBox = boxlist[boxIndex]; - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - long count = m_histogram[c0][histogramIndex]; - histogramIndex++; - - if (count != 0) - { - total += count; - c0total += ((c0 << C0_SHIFT) + ((1 << C0_SHIFT) >> 1)) * count; - c1total += ((c1 << C1_SHIFT) + ((1 << C1_SHIFT) >> 1)) * count; - c2total += ((c2 << C2_SHIFT) + ((1 << C2_SHIFT) >> 1)) * count; - } - } - } - } - - m_cinfo.m_colormap[0][icolor] = (byte)((c0total + (total >> 1)) / total); - m_cinfo.m_colormap[1][icolor] = (byte)((c1total + (total >> 1)) / total); - m_cinfo.m_colormap[2][icolor] = (byte)((c2total + (total >> 1)) / total); - } - - /// - /// Master routine for color selection - /// - private void select_colors(int desired_colors) - { - /* Allocate workspace for box list */ - box[] boxlist = new box[desired_colors]; - - /* Initialize one box containing whole space */ - int numboxes = 1; - boxlist[0].c0min = 0; - boxlist[0].c0max = JpegConstants.MaxSampleValue >> C0_SHIFT; - boxlist[0].c1min = 0; - boxlist[0].c1max = JpegConstants.MaxSampleValue >> C1_SHIFT; - boxlist[0].c2min = 0; - boxlist[0].c2max = JpegConstants.MaxSampleValue >> C2_SHIFT; - - /* Shrink it to actually-used volume and set its statistics */ - update_box(boxlist, 0); - - /* Perform median-cut to produce final box list */ - numboxes = median_cut(boxlist, numboxes, desired_colors); - - /* Compute the representative color for each box, fill colormap */ - for (int i = 0; i < numboxes; i++) - compute_color(boxlist, i, i); - - m_cinfo.m_actual_number_of_colors = numboxes; - } - - /// - /// Repeatedly select and split the largest box until we have enough boxes - /// - private int median_cut(box[] boxlist, int numboxes, int desired_colors) - { - while (numboxes < desired_colors) - { - /* Select box to split. - * Current algorithm: by population for first half, then by volume. - */ - int foundIndex; - if (numboxes * 2 <= desired_colors) - foundIndex = find_biggest_color_pop(boxlist, numboxes); - else - foundIndex = find_biggest_volume(boxlist, numboxes); - - if (foundIndex == -1) /* no splittable boxes left! */ - break; - - /* Copy the color bounds to the new box. */ - boxlist[numboxes].c0max = boxlist[foundIndex].c0max; - boxlist[numboxes].c1max = boxlist[foundIndex].c1max; - boxlist[numboxes].c2max = boxlist[foundIndex].c2max; - boxlist[numboxes].c0min = boxlist[foundIndex].c0min; - boxlist[numboxes].c1min = boxlist[foundIndex].c1min; - boxlist[numboxes].c2min = boxlist[foundIndex].c2min; - - /* Choose which axis to split the box on. - * Current algorithm: longest scaled axis. - * See notes in update_box about scaling distances. - */ - int c0 = ((boxlist[foundIndex].c0max - boxlist[foundIndex].c0min) << C0_SHIFT) * R_SCALE; - int c1 = ((boxlist[foundIndex].c1max - boxlist[foundIndex].c1min) << C1_SHIFT) * G_SCALE; - int c2 = ((boxlist[foundIndex].c2max - boxlist[foundIndex].c2min) << C2_SHIFT) * B_SCALE; - - /* We want to break any ties in favor of green, then red, blue last. - * This code does the right thing for R,G,B or B,G,R color orders only. - */ - int cmax = c1; - int n = 1; - - if (c0 > cmax) - { - cmax = c0; - n = 0; - } - - if (c2 > cmax) - { - n = 2; - } - - /* Choose split point along selected axis, and update box bounds. - * Current algorithm: split at halfway point. - * (Since the box has been shrunk to minimum volume, - * any split will produce two nonempty subboxes.) - * Note that lb value is max for lower box, so must be < old max. - */ - int lb; - switch (n) - { - case 0: - lb = (boxlist[foundIndex].c0max + boxlist[foundIndex].c0min) / 2; - boxlist[foundIndex].c0max = lb; - boxlist[numboxes].c0min = lb + 1; - break; - case 1: - lb = (boxlist[foundIndex].c1max + boxlist[foundIndex].c1min) / 2; - boxlist[foundIndex].c1max = lb; - boxlist[numboxes].c1min = lb + 1; - break; - case 2: - lb = (boxlist[foundIndex].c2max + boxlist[foundIndex].c2min) / 2; - boxlist[foundIndex].c2max = lb; - boxlist[numboxes].c2min = lb + 1; - break; - } - - /* Update stats for boxes */ - update_box(boxlist, foundIndex); - update_box(boxlist, numboxes); - numboxes++; - } - - return numboxes; - } - - /* - * Next we have the really interesting routines: selection of a colormap - * given the completed histogram. - * These routines work with a list of "boxes", each representing a rectangular - * subset of the input color space (to histogram precision). - */ - - /// - /// Find the splittable box with the largest color population - /// Returns null if no splittable boxes remain - /// - private static int find_biggest_color_pop(box[] boxlist, int numboxes) - { - long maxc = 0; - int which = -1; - for (int i = 0; i < numboxes; i++) - { - if (boxlist[i].colorcount > maxc && boxlist[i].volume > 0) - { - which = i; - maxc = boxlist[i].colorcount; - } - } - - return which; - } - - /// - /// Find the splittable box with the largest (scaled) volume - /// Returns null if no splittable boxes remain - /// - private static int find_biggest_volume(box[] boxlist, int numboxes) - { - int maxv = 0; - int which = -1; - for (int i = 0; i < numboxes; i++) - { - if (boxlist[i].volume > maxv) - { - which = i; - maxv = boxlist[i].volume; - } - } - - return which; - } - - /// - /// Shrink the min/max bounds of a box to enclose only nonzero elements, - /// and recompute its volume and population - /// - private void update_box(box[] boxlist, int boxIndex) - { - box curBox = boxlist[boxIndex]; - bool have_c0min = false; - - if (curBox.c0max > curBox.c0min) - { - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - if (m_histogram[c0][histogramIndex++] != 0) - { - curBox.c0min = c0; - have_c0min = true; - break; - } - } - - if (have_c0min) - break; - } - - if (have_c0min) - break; - } - } - - bool have_c0max = false; - if (curBox.c0max > curBox.c0min) - { - for (int c0 = curBox.c0max; c0 >= curBox.c0min; c0--) - { - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - if (m_histogram[c0][histogramIndex++] != 0) - { - curBox.c0max = c0; - have_c0max = true; - break; - } - } - - if (have_c0max) - break; - } - - if (have_c0max) - break; - } - } - - bool have_c1min = false; - if (curBox.c1max > curBox.c1min) - { - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++) - { - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - if (m_histogram[c0][histogramIndex++] != 0) - { - curBox.c1min = c1; - have_c1min = true; - break; - } - } - - if (have_c1min) - break; - } - - if (have_c1min) - break; - } - } - - bool have_c1max = false; - if (curBox.c1max > curBox.c1min) - { - for (int c1 = curBox.c1max; c1 >= curBox.c1min; c1--) - { - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - if (m_histogram[c0][histogramIndex++] != 0) - { - curBox.c1max = c1; - have_c1max = true; - break; - } - } - - if (have_c1max) - break; - } - - if (have_c1max) - break; - } - } - - bool have_c2min = false; - if (curBox.c2max > curBox.c2min) - { - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++) - { - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - int histogramIndex = curBox.c1min * HIST_C2_ELEMS + c2; - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++, histogramIndex += HIST_C2_ELEMS) - { - if (m_histogram[c0][histogramIndex] != 0) - { - curBox.c2min = c2; - have_c2min = true; - break; - } - } - - if (have_c2min) - break; - } - - if (have_c2min) - break; - } - } - - bool have_c2max = false; - if (curBox.c2max > curBox.c2min) - { - for (int c2 = curBox.c2max; c2 >= curBox.c2min; c2--) - { - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - int histogramIndex = curBox.c1min * HIST_C2_ELEMS + c2; - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++, histogramIndex += HIST_C2_ELEMS) - { - if (m_histogram[c0][histogramIndex] != 0) - { - curBox.c2max = c2; - have_c2max = true; - break; - } - } - - if (have_c2max) - break; - } - - if (have_c2max) - break; - } - } - - /* Update box volume. - * We use 2-norm rather than real volume here; this biases the method - * against making long narrow boxes, and it has the side benefit that - * a box is splittable iff norm > 0. - * Since the differences are expressed in histogram-cell units, - * we have to shift back to byte units to get consistent distances; - * after which, we scale according to the selected distance scale factors. - */ - int dist0 = ((curBox.c0max - curBox.c0min) << C0_SHIFT) * R_SCALE; - int dist1 = ((curBox.c1max - curBox.c1min) << C1_SHIFT) * G_SCALE; - int dist2 = ((curBox.c2max - curBox.c2min) << C2_SHIFT) * B_SCALE; - curBox.volume = dist0 * dist0 + dist1 * dist1 + dist2 * dist2; - - /* Now scan remaining volume of box and compute population */ - long ccount = 0; - for (int c0 = curBox.c0min; c0 <= curBox.c0max; c0++) - { - for (int c1 = curBox.c1min; c1 <= curBox.c1max; c1++) - { - int histogramIndex = c1 * HIST_C2_ELEMS + curBox.c2min; - for (int c2 = curBox.c2min; c2 <= curBox.c2max; c2++, histogramIndex++) - { - if (m_histogram[c0][histogramIndex] != 0) - ccount++; - } - } - } - - curBox.colorcount = ccount; - boxlist[boxIndex] = curBox; - } - - /// - /// Initialize the error-limiting transfer function (lookup table). - /// The raw F-S error computation can potentially compute error values of up to - /// +- MaxSampleValue. But we want the maximum correction applied to a pixel to be - /// much less, otherwise obviously wrong pixels will be created. (Typical - /// effects include weird fringes at color-area boundaries, isolated bright - /// pixels in a dark area, etc.) The standard advice for avoiding this problem - /// is to ensure that the "corners" of the color cube are allocated as output - /// colors; then repeated errors in the same direction cannot cause cascading - /// error buildup. However, that only prevents the error from getting - /// completely out of hand; Aaron Giles reports that error limiting improves - /// the results even with corner colors allocated. - /// A simple clamping of the error values to about +- MaxSampleValue/8 works pretty - /// well, but the smoother transfer function used below is even better. Thanks - /// to Aaron Giles for this idea. - /// - private void init_error_limit() - { - m_error_limiter = new int[JpegConstants.MaxSampleValue * 2 + 1]; - int tableOffset = JpegConstants.MaxSampleValue; - - const int STEPSIZE = ((JpegConstants.MaxSampleValue + 1) / 16); - - /* Map errors 1:1 up to +- MaxSampleValue/16 */ - int output = 0; - int input = 0; - for (; input < STEPSIZE; input++, output++) - { - m_error_limiter[tableOffset + input] = output; - m_error_limiter[tableOffset - input] = -output; - } - - /* Map errors 1:2 up to +- 3*MaxSampleValue/16 */ - for (; input < STEPSIZE * 3; input++) - { - m_error_limiter[tableOffset + input] = output; - m_error_limiter[tableOffset - input] = -output; - output += (input & 1) != 0 ? 1 : 0; - } - - /* Clamp the rest to final output value (which is (MaxSampleValue+1)/8) */ - for (; input <= JpegConstants.MaxSampleValue; input++) - { - m_error_limiter[tableOffset + input] = output; - m_error_limiter[tableOffset - input] = -output; - } - } - - /* - * These routines are concerned with the time-critical task of mapping input - * colors to the nearest color in the selected colormap. - * - * We re-use the histogram space as an "inverse color map", essentially a - * cache for the results of nearest-color searches. All colors within a - * histogram cell will be mapped to the same colormap entry, namely the one - * closest to the cell's center. This may not be quite the closest entry to - * the actual input color, but it's almost as good. A zero in the cache - * indicates we haven't found the nearest color for that cell yet; the array - * is cleared to zeroes before starting the mapping pass. When we find the - * nearest color for a cell, its colormap index plus one is recorded in the - * cache for future use. The pass2 scanning routines call fill_inverse_cmap - * when they need to use an unfilled entry in the cache. - * - * Our method of efficiently finding nearest colors is based on the "locally - * sorted search" idea described by Heckbert and on the incremental distance - * calculation described by Spencer W. Thomas in chapter III.1 of Graphics - * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that - * the distances from a given colormap entry to each cell of the histogram can - * be computed quickly using an incremental method: the differences between - * distances to adjacent cells themselves differ by a constant. This allows a - * fairly fast implementation of the "brute force" approach of computing the - * distance from every colormap entry to every histogram cell. Unfortunately, - * it needs a work array to hold the best-distance-so-far for each histogram - * cell (because the inner loop has to be over cells, not colormap entries). - * The work array elements have to be ints, so the work array would need - * 256Kb at our recommended precision. This is not feasible in DOS machines. - * - * To get around these problems, we apply Thomas' method to compute the - * nearest colors for only the cells within a small subbox of the histogram. - * The work array need be only as big as the subbox, so the memory usage - * problem is solved. Furthermore, we need not fill subboxes that are never - * referenced in pass2; many images use only part of the color gamut, so a - * fair amount of work is saved. An additional advantage of this - * approach is that we can apply Heckbert's locality criterion to quickly - * eliminate colormap entries that are far away from the subbox; typically - * three-fourths of the colormap entries are rejected by Heckbert's criterion, - * and we need not compute their distances to individual cells in the subbox. - * The speed of this approach is heavily influenced by the subbox size: too - * small means too much overhead, too big loses because Heckbert's criterion - * can't eliminate as many colormap entries. Empirically the best subbox - * size seems to be about 1/512th of the histogram (1/8th in each direction). - * - * Thomas' article also describes a refined method which is asymptotically - * faster than the brute-force method, but it is also far more complex and - * cannot efficiently be applied to small subboxes. It is therefore not - * useful for programs intended to be portable to DOS machines. On machines - * with plenty of memory, filling the whole histogram in one shot with Thomas' - * refined method might be faster than the present code --- but then again, - * it might not be any faster, and it's certainly more complicated. - */ - - /* - * The next three routines implement inverse colormap filling. They could - * all be folded into one big routine, but splitting them up this way saves - * some stack space (the mindist[] and bestdist[] arrays need not coexist) - * and may allow some compilers to produce better code by registerizing more - * inner-loop variables. - */ - - /// - /// Locate the colormap entries close enough to an update box to be candidates - /// for the nearest entry to some cell(s) in the update box. The update box - /// is specified by the center coordinates of its first cell. The number of - /// candidate colormap entries is returned, and their colormap indexes are - /// placed in colorlist[]. - /// This routine uses Heckbert's "locally sorted search" criterion to select - /// the colors that need further consideration. - /// - private int find_nearby_colors(int minc0, int minc1, int minc2, byte[] colorlist) - { - /* Compute true coordinates of update box's upper corner and center. - * Actually we compute the coordinates of the center of the upper-corner - * histogram cell, which are the upper bounds of the volume we care about. - * Note that since ">>" rounds down, the "center" values may be closer to - * min than to max; hence comparisons to them must be "<=", not "<". - */ - int maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); - int centerc0 = (minc0 + maxc0) >> 1; - - int maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); - int centerc1 = (minc1 + maxc1) >> 1; - - int maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); - int centerc2 = (minc2 + maxc2) >> 1; - - /* For each color in colormap, find: - * 1. its minimum squared-distance to any point in the update box - * (zero if color is within update box); - * 2. its maximum squared-distance to any point in the update box. - * Both of these can be found by considering only the corners of the box. - * We save the minimum distance for each color in mindist[]; - * only the smallest maximum distance is of interest. - */ - int minmaxdist = 0x7FFFFFFF; - int[] mindist = new int[MAXNUMCOLORS]; /* min distance to colormap entry i */ - - for (int i = 0; i < m_cinfo.m_actual_number_of_colors; i++) - { - /* We compute the squared-c0-distance term, then add in the other two. */ - int x = m_cinfo.m_colormap[0][i]; - int min_dist; - int max_dist; - - if (x < minc0) - { - int tdist = (x - minc0) * R_SCALE; - min_dist = tdist * tdist; - tdist = (x - maxc0) * R_SCALE; - max_dist = tdist * tdist; - } - else if (x > maxc0) - { - int tdist = (x - maxc0) * R_SCALE; - min_dist = tdist * tdist; - tdist = (x - minc0) * R_SCALE; - max_dist = tdist * tdist; - } - else - { - /* within cell range so no contribution to min_dist */ - min_dist = 0; - if (x <= centerc0) - { - int tdist = (x - maxc0) * R_SCALE; - max_dist = tdist * tdist; - } - else - { - int tdist = (x - minc0) * R_SCALE; - max_dist = tdist * tdist; - } - } - - x = m_cinfo.m_colormap[1][i]; - if (x < minc1) - { - int tdist = (x - minc1) * G_SCALE; - min_dist += tdist * tdist; - tdist = (x - maxc1) * G_SCALE; - max_dist += tdist * tdist; - } - else if (x > maxc1) - { - int tdist = (x - maxc1) * G_SCALE; - min_dist += tdist * tdist; - tdist = (x - minc1) * G_SCALE; - max_dist += tdist * tdist; - } - else - { - /* within cell range so no contribution to min_dist */ - if (x <= centerc1) - { - int tdist = (x - maxc1) * G_SCALE; - max_dist += tdist * tdist; - } - else - { - int tdist = (x - minc1) * G_SCALE; - max_dist += tdist * tdist; - } - } - - x = m_cinfo.m_colormap[2][i]; - if (x < minc2) - { - int tdist = (x - minc2) * B_SCALE; - min_dist += tdist * tdist; - tdist = (x - maxc2) * B_SCALE; - max_dist += tdist * tdist; - } - else if (x > maxc2) - { - int tdist = (x - maxc2) * B_SCALE; - min_dist += tdist * tdist; - tdist = (x - minc2) * B_SCALE; - max_dist += tdist * tdist; - } - else - { - /* within cell range so no contribution to min_dist */ - if (x <= centerc2) - { - int tdist = (x - maxc2) * B_SCALE; - max_dist += tdist * tdist; - } - else - { - int tdist = (x - minc2) * B_SCALE; - max_dist += tdist * tdist; - } - } - - mindist[i] = min_dist; /* save away the results */ - if (max_dist < minmaxdist) - minmaxdist = max_dist; - } - - /* Now we know that no cell in the update box is more than minmaxdist - * away from some colormap entry. Therefore, only colors that are - * within minmaxdist of some part of the box need be considered. - */ - int ncolors = 0; - for (int i = 0; i < m_cinfo.m_actual_number_of_colors; i++) - { - if (mindist[i] <= minmaxdist) - colorlist[ncolors++] = (byte)i; - } - - return ncolors; - } - - /// - /// Find the closest colormap entry for each cell in the update box, - /// given the list of candidate colors prepared by find_nearby_colors. - /// Return the indexes of the closest entries in the bestcolor[] array. - /// This routine uses Thomas' incremental distance calculation method to - /// find the distance from a colormap entry to successive cells in the box. - /// - private void find_best_colors(int minc0, int minc1, int minc2, int numcolors, byte[] colorlist, byte[] bestcolor) - { - /* Nominal steps between cell centers ("x" in Thomas article) */ - const int STEP_C0 = ((1 << C0_SHIFT) * R_SCALE); - const int STEP_C1 = ((1 << C1_SHIFT) * G_SCALE); - const int STEP_C2 = ((1 << C2_SHIFT) * B_SCALE); - - /* This array holds the distance to the nearest-so-far color for each cell */ - int[] bestdist = new int[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - - /* Initialize best-distance for each cell of the update box */ - int bestIndex = 0; - for (int i = BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS - 1; i >= 0; i--) - { - bestdist[bestIndex] = 0x7FFFFFFF; - bestIndex++; - } - - /* For each color selected by find_nearby_colors, - * compute its distance to the center of each cell in the box. - * If that's less than best-so-far, update best distance and color number. - */ - for (int i = 0; i < numcolors; i++) - { - int icolor = colorlist[i]; - - /* Compute (square of) distance from minc0/c1/c2 to this color */ - int inc0 = (minc0 - m_cinfo.m_colormap[0][icolor]) * R_SCALE; - int dist0 = inc0 * inc0; - - int inc1 = (minc1 - m_cinfo.m_colormap[1][icolor]) * G_SCALE; - dist0 += inc1 * inc1; - - int inc2 = (minc2 - m_cinfo.m_colormap[2][icolor]) * B_SCALE; - dist0 += inc2 * inc2; - - /* Form the initial difference increments */ - inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; - inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; - inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; - - /* Now loop over all cells in box, updating distance per Thomas method */ - bestIndex = 0; - int colorIndex = 0; - int xx0 = inc0; - for (int ic0 = BOX_C0_ELEMS - 1; ic0 >= 0; ic0--) - { - int dist1 = dist0; - int xx1 = inc1; - for (int ic1 = BOX_C1_ELEMS - 1; ic1 >= 0; ic1--) - { - int dist2 = dist1; - int xx2 = inc2; - for (int ic2 = BOX_C2_ELEMS - 1; ic2 >= 0; ic2--) - { - if (dist2 < bestdist[bestIndex]) - { - bestdist[bestIndex] = dist2; - bestcolor[colorIndex] = (byte)icolor; - } - - dist2 += xx2; - xx2 += 2 * STEP_C2 * STEP_C2; - bestIndex++; - colorIndex++; - } - - dist1 += xx1; - xx1 += 2 * STEP_C1 * STEP_C1; - } - - dist0 += xx0; - xx0 += 2 * STEP_C0 * STEP_C0; - } - } - } - - /// - /// Fill the inverse-colormap entries in the update box that contains - /// histogram cell c0/c1/c2. (Only that one cell MUST be filled, but - /// we can fill as many others as we wish.) - /// - private void fill_inverse_cmap(int c0, int c1, int c2) - { - /* Convert cell coordinates to update box ID */ - c0 >>= BOX_C0_LOG; - c1 >>= BOX_C1_LOG; - c2 >>= BOX_C2_LOG; - - /* Compute true coordinates of update box's origin corner. - * Actually we compute the coordinates of the center of the corner - * histogram cell, which are the lower bounds of the volume we care about. - */ - int minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); - int minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); - int minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); - - /* Determine which colormap entries are close enough to be candidates - * for the nearest entry to some cell in the update box. - */ - /* This array lists the candidate colormap indexes. */ - byte[] colorlist = new byte[MAXNUMCOLORS]; - int numcolors = find_nearby_colors(minc0, minc1, minc2, colorlist); - - /* Determine the actually nearest colors. */ - /* This array holds the actually closest colormap index for each cell. */ - byte[] bestcolor = new byte[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - find_best_colors(minc0, minc1, minc2, numcolors, colorlist, bestcolor); - - /* Save the best color numbers (plus 1) in the main cache array */ - c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ - c1 <<= BOX_C1_LOG; - c2 <<= BOX_C2_LOG; - int bestcolorIndex = 0; - for (int ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) - { - for (int ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) - { - int histogramIndex = (c1 + ic1) * HIST_C2_ELEMS + c2; - for (int ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) - { - m_histogram[c0 + ic0][histogramIndex] = (ushort)((int)bestcolor[bestcolorIndex] + 1); - histogramIndex++; - bestcolorIndex++; - } - } - } - } - } - #endregion - - #region ProgressiveHuffmanDecoder - /// - /// Expanded entropy decoder object for progressive Huffman decoding. - /// - /// The savable_state sub-record contains fields that change within an MCU, - /// but must not be updated permanently until we complete the MCU. - /// - class ProgressiveHuffmanDecoder : JpegEntropyDecoder - { - private class savable_state - { - //savable_state operator=(savable_state src); - public int EOBRUN; /* remaining EOBs in EOBRUN */ - public int[] last_dc_val = new int[JpegConstants.MaxComponentsInScan]; /* last DC coef for each component */ - - public void Assign(savable_state ss) - { - EOBRUN = ss.EOBRUN; - Buffer.BlockCopy(ss.last_dc_val, 0, last_dc_val, 0, last_dc_val.Length * sizeof(int)); - } - } - - private enum MCUDecoder - { - mcu_DC_first_decoder, - mcu_AC_first_decoder, - mcu_DC_refine_decoder, - mcu_AC_refine_decoder - } - - private MCUDecoder m_decoder; - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - private SavedBitreadState m_bitstate; /* Bit buffer at start of MCU */ - private savable_state m_saved = new savable_state(); /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - private int m_restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - private DerivedTable[] m_derived_tbls = new DerivedTable[JpegConstants.NumberOfHuffmanTables]; - - private DerivedTable m_ac_derived_tbl; /* active table during an AC scan */ - - public ProgressiveHuffmanDecoder(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - - /* Mark derived tables unallocated */ - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - m_derived_tbls[i] = null; - - /* Create progression status table */ - cinfo.m_coef_bits = new int[cinfo.m_num_components][]; - for (int i = 0; i < cinfo.m_num_components; i++) - cinfo.m_coef_bits[i] = new int[JpegConstants.DCTSize2]; - - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - for (int i = 0; i < JpegConstants.DCTSize2; i++) - cinfo.m_coef_bits[ci][i] = -1; - } - } - - /// - /// Initialize for a Huffman-compressed scan. - /// - public override void start_pass() - { - /* Validate scan parameters */ - bool bad = false; - bool is_DC_band = (m_cinfo.m_Ss == 0); - if (is_DC_band) - { - if (m_cinfo.m_Se != 0) - bad = true; - } - else - { - /* need not check Ss/Se < 0 since they came from unsigned bytes */ - if (m_cinfo.m_Ss > m_cinfo.m_Se || m_cinfo.m_Se >= JpegConstants.DCTSize2) - bad = true; - - /* AC scans may have only one component */ - if (m_cinfo.m_comps_in_scan != 1) - bad = true; - } - - if (m_cinfo.m_Ah != 0) - { - /* Successive approximation refinement scan: must have Al = Ah-1. */ - if (m_cinfo.m_Al != m_cinfo.m_Ah - 1) - bad = true; - } - - if (m_cinfo.m_Al > 13) - { - /* need not check for < 0 */ - bad = true; - } - - /* Arguably the maximum Al value should be less than 13 for 8-bit precision, - * but the spec doesn't say so, and we try to be liberal about what we - * accept. Note: large Al values could result in out-of-range DC - * coefficients during early scans, leading to bizarre displays due to - * overflows in the IDCT math. But we won't crash. - */ - if (bad) - throw new Exception(String.Format("Invalid progressive parameters Ss={0} Se={1} Ah={2} Al={3}", m_cinfo.m_Ss, m_cinfo.m_Se, m_cinfo.m_Ah, m_cinfo.m_Al)); - - /* Update progression status, and verify that scan order is legal. - * Note that inter-scan inconsistencies are treated as warnings - * not fatal errors ... not clear if this is right way to behave. - */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - int cindex = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]].Component_index; - - for (int coefi = m_cinfo.m_Ss; coefi <= m_cinfo.m_Se; coefi++) - { - int expected = m_cinfo.m_coef_bits[cindex][coefi]; - if (expected < 0) - expected = 0; - - m_cinfo.m_coef_bits[cindex][coefi] = m_cinfo.m_Al; - } - } - - /* Select MCU decoding routine */ - if (m_cinfo.m_Ah == 0) - { - if (is_DC_band) - m_decoder = MCUDecoder.mcu_DC_first_decoder; - else - m_decoder = MCUDecoder.mcu_AC_first_decoder; - } - else - { - if (is_DC_band) - m_decoder = MCUDecoder.mcu_DC_refine_decoder; - else - m_decoder = MCUDecoder.mcu_AC_refine_decoder; - } - - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]]; - /* Make sure requested tables are present, and compute derived tables. - * We may build same derived table more than once, but it's not expensive. - */ - if (is_DC_band) - { - if (m_cinfo.m_Ah == 0) - { - /* DC refinement needs no table */ - jpeg_make_d_derived_tbl(true, componentInfo.Dc_tbl_no, ref m_derived_tbls[componentInfo.Dc_tbl_no]); - } - } - else - { - jpeg_make_d_derived_tbl(false, componentInfo.Ac_tbl_no, ref m_derived_tbls[componentInfo.Ac_tbl_no]); - - /* remember the single active table */ - m_ac_derived_tbl = m_derived_tbls[componentInfo.Ac_tbl_no]; - } - - /* Initialize DC predictions to 0 */ - m_saved.last_dc_val[ci] = 0; - } - - /* Initialize bitread state variables */ - m_bitstate.bits_left = 0; - m_bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - m_insufficient_data = false; - - /* Initialize private state variables */ - m_saved.EOBRUN = 0; - - /* Initialize restart counter */ - m_restarts_to_go = m_cinfo.m_restart_interval; - } - - public override bool decode_mcu(JpegBlock[] MCU_data) - { - switch (m_decoder) - { - case MCUDecoder.mcu_DC_first_decoder: - return decode_mcu_DC_first(MCU_data); - case MCUDecoder.mcu_AC_first_decoder: - return decode_mcu_AC_first(MCU_data); - case MCUDecoder.mcu_DC_refine_decoder: - return decode_mcu_DC_refine(MCU_data); - case MCUDecoder.mcu_AC_refine_decoder: - return decode_mcu_AC_refine(MCU_data); - } - - throw new Exception("The specified MCUDecoder is not implemented!"); - } - - /* - * Huffman MCU decoding. - * Each of these routines decodes and returns one MCU's worth of - * Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not de-quantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. - * - * We return false if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * spectral selection, since we'll just re-assign them on the next call. - * Successive approximation AC refinement has to be more careful, however.) - */ - - /// - /// MCU decoding for DC initial scan (either spectral selection, - /// or first pass of successive approximation). - /// - private bool decode_mcu_DC_first(JpegBlock[] MCU_data) - { - /* Process restart marker if needed; may have to suspend */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!process_restart()) - return false; - } - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (!m_insufficient_data) - { - /* Load up working state */ - int get_buffer; - int bits_left; - WorkingBitreadState br_state = new WorkingBitreadState(); - BITREAD_LOAD_STATE(m_bitstate, out get_buffer, out bits_left, ref br_state); - savable_state state = new savable_state(); - state.Assign(m_saved); - - /* Outer loop handles each block in the MCU */ - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - int ci = m_cinfo.m_MCU_membership[blkn]; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - int s; - if (!HUFF_DECODE(out s, ref br_state, m_derived_tbls[m_cinfo.Comp_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no], ref get_buffer, ref bits_left)) - return false; - - if (s != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, s, ref get_buffer, ref bits_left)) - return false; - - int r = GET_BITS(s, get_buffer, ref bits_left); - s = HUFF_EXTEND(r, s); - } - - /* Convert DC difference to actual value, update last_dc_val */ - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - - /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ - MCU_data[blkn][0] = (short)(s << m_cinfo.m_Al); - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(ref m_bitstate, get_buffer, bits_left); - m_saved.Assign(state); - } - - /* Account for restart interval (no-op if not using restarts) */ - m_restarts_to_go--; - - return true; - } - - /// - /// MCU decoding for AC initial scan (either spectral selection, - /// or first pass of successive approximation). - /// - private bool decode_mcu_AC_first(JpegBlock[] MCU_data) - { - /* Process restart marker if needed; may have to suspend */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!process_restart()) - return false; - } - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (!m_insufficient_data) - { - /* Load up working state. - * We can avoid loading/saving bitread state if in an EOB run. - */ - int EOBRUN = m_saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - - if (EOBRUN > 0) - { - /* if it's a band of zeroes... */ - /* ...process it now (we do nothing) */ - EOBRUN--; - } - else - { - int get_buffer; - int bits_left; - WorkingBitreadState br_state = new WorkingBitreadState(); - BITREAD_LOAD_STATE(m_bitstate, out get_buffer, out bits_left, ref br_state); - - for (int k = m_cinfo.m_Ss; k <= m_cinfo.m_Se; k++) - { - int s; - if (!HUFF_DECODE(out s, ref br_state, m_ac_derived_tbl, ref get_buffer, ref bits_left)) - return false; - - int r = s >> 4; - s &= 15; - if (s != 0) - { - k += r; - - if (!CHECK_BIT_BUFFER(ref br_state, s, ref get_buffer, ref bits_left)) - return false; - - r = GET_BITS(s, get_buffer, ref bits_left); - s = HUFF_EXTEND(r, s); - - /* Scale and output coefficient in natural (dezigzagged) order */ - MCU_data[0][JpegUtils.jpeg_natural_order[k]] = (short)(s << m_cinfo.m_Al); - } - else - { - if (r == 15) - { - /* ZRL */ - k += 15; /* skip 15 zeroes in band */ - } - else - { - /* EOBr, run length is 2^r + appended bits */ - EOBRUN = 1 << r; - if (r != 0) - { - /* EOBr, r > 0 */ - if (!CHECK_BIT_BUFFER(ref br_state, r, ref get_buffer, ref bits_left)) - return false; - - r = GET_BITS(r, get_buffer, ref bits_left); - EOBRUN += r; - } - - EOBRUN--; /* this band is processed at this moment */ - break; /* force end-of-band */ - } - } - } - - BITREAD_SAVE_STATE(ref m_bitstate, get_buffer, bits_left); - } - - /* Completed MCU, so update state */ - m_saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - m_restarts_to_go--; - - return true; - } - - /// - /// MCU decoding for DC successive approximation refinement scan. - /// Note: we assume such scans can be multi-component, although the spec - /// is not very clear on the point. - /// - private bool decode_mcu_DC_refine(JpegBlock[] MCU_data) - { - /* Process restart marker if needed; may have to suspend */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!process_restart()) - return false; - } - } - - /* Not worth the cycles to check insufficient_data here, - * since we will not change the data anyway if we read zeroes. - */ - - /* Load up working state */ - int get_buffer; - int bits_left; - WorkingBitreadState br_state = new WorkingBitreadState(); - BITREAD_LOAD_STATE(m_bitstate, out get_buffer, out bits_left, ref br_state); - - /* Outer loop handles each block in the MCU */ - - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - /* Encoded data is simply the next bit of the two's-complement DC value */ - if (!CHECK_BIT_BUFFER(ref br_state, 1, ref get_buffer, ref bits_left)) - return false; - - if (GET_BITS(1, get_buffer, ref bits_left) != 0) - { - /* 1 in the bit position being coded */ - MCU_data[blkn][0] |= (short)(1 << m_cinfo.m_Al); - } - - /* Note: since we use |=, repeating the assignment later is safe */ - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(ref m_bitstate, get_buffer, bits_left); - - /* Account for restart interval (no-op if not using restarts) */ - m_restarts_to_go--; - - return true; - } - - // There is always only one block per MCU - private bool decode_mcu_AC_refine(JpegBlock[] MCU_data) - { - int p1 = 1 << m_cinfo.m_Al; /* 1 in the bit position being coded */ - int m1 = -1 << m_cinfo.m_Al; /* -1 in the bit position being coded */ - - /* Process restart marker if needed; may have to suspend */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - if (!process_restart()) - return false; - } - } - - /* If we've run out of data, don't modify the MCU. - */ - if (!m_insufficient_data) - { - /* Load up working state */ - int get_buffer; - int bits_left; - WorkingBitreadState br_state = new WorkingBitreadState(); - BITREAD_LOAD_STATE(m_bitstate, out get_buffer, out bits_left, ref br_state); - int EOBRUN = m_saved.EOBRUN; /* only part of saved state we need */ - - /* If we are forced to suspend, we must undo the assignments to any newly - * nonzero coefficients in the block, because otherwise we'd get confused - * next time about which coefficients were already nonzero. - * But we need not undo addition of bits to already-nonzero coefficients; - * instead, we can test the current bit to see if we already did it. - */ - int num_newnz = 0; - int[] newnz_pos = new int[JpegConstants.DCTSize2]; - - /* initialize coefficient loop counter to start of band */ - int k = m_cinfo.m_Ss; - - if (EOBRUN == 0) - { - for (; k <= m_cinfo.m_Se; k++) - { - int s; - if (!HUFF_DECODE(out s, ref br_state, m_ac_derived_tbl, ref get_buffer, ref bits_left)) - { - undo_decode_mcu_AC_refine(MCU_data, newnz_pos, num_newnz); - return false; - } - - int r = s >> 4; - s &= 15; - if (s != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, 1, ref get_buffer, ref bits_left)) - { - undo_decode_mcu_AC_refine(MCU_data, newnz_pos, num_newnz); - return false; - } - - if (GET_BITS(1, get_buffer, ref bits_left) != 0) - { - /* newly nonzero coef is positive */ - s = p1; - } - else - { - /* newly nonzero coef is negative */ - s = m1; - } - } - else - { - if (r != 15) - { - EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ - if (r != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, r, ref get_buffer, ref bits_left)) - { - undo_decode_mcu_AC_refine(MCU_data, newnz_pos, num_newnz); - return false; - } - - r = GET_BITS(r, get_buffer, ref bits_left); - EOBRUN += r; - } - break; /* rest of block is handled by EOB logic */ - } - /* note s = 0 for processing ZRL */ - } - /* Advance over already-nonzero coefs and r still-zero coefs, - * appending correction bits to the nonzeroes. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - do - { - int blockIndex = JpegUtils.jpeg_natural_order[k]; - short thiscoef = MCU_data[0][blockIndex]; - if (thiscoef != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, 1, ref get_buffer, ref bits_left)) - { - undo_decode_mcu_AC_refine(MCU_data, newnz_pos, num_newnz); - return false; - } - - if (GET_BITS(1, get_buffer, ref bits_left) != 0) - { - if ((thiscoef & p1) == 0) - { - /* do nothing if already set it */ - if (thiscoef >= 0) - MCU_data[0][blockIndex] += (short)p1; - else - MCU_data[0][blockIndex] += (short)m1; - } - } - } - else - { - if (--r < 0) - break; /* reached target zero coefficient */ - } - - k++; - } - while (k <= m_cinfo.m_Se); - - if (s != 0) - { - int pos = JpegUtils.jpeg_natural_order[k]; - - /* Output newly nonzero coefficient */ - MCU_data[0][pos] = (short)s; - - /* Remember its position in case we have to suspend */ - newnz_pos[num_newnz++] = pos; - } - } - } - - if (EOBRUN > 0) - { - /* Scan any remaining coefficient positions after the end-of-band - * (the last newly nonzero coefficient, if any). Append a correction - * bit to each already-nonzero coefficient. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - for (; k <= m_cinfo.m_Se; k++) - { - int blockIndex = JpegUtils.jpeg_natural_order[k]; - short thiscoef = MCU_data[0][blockIndex]; - if (thiscoef != 0) - { - if (!CHECK_BIT_BUFFER(ref br_state, 1, ref get_buffer, ref bits_left)) - { - //undo_decode_mcu_AC_refine(MCU_data[0], newnz_pos, num_newnz); - undo_decode_mcu_AC_refine(MCU_data, newnz_pos, num_newnz); - return false; - } - - if (GET_BITS(1, get_buffer, ref bits_left) != 0) - { - if ((thiscoef & p1) == 0) - { - /* do nothing if already changed it */ - if (thiscoef >= 0) - MCU_data[0][blockIndex] += (short)p1; - else - MCU_data[0][blockIndex] += (short)m1; - } - } - } - } - - /* Count one block completed in EOB run */ - EOBRUN--; - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(ref m_bitstate, get_buffer, bits_left); - m_saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - m_restarts_to_go--; - - return true; - } - - /// - /// Check for a restart marker and resynchronize decoder. - /// Returns false if must suspend. - /// - private bool process_restart() - { - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - m_cinfo.m_marker.SkipBytes(m_bitstate.bits_left / 8); - m_bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (!m_cinfo.m_marker.read_restart_marker()) - return false; - - /* Re-initialize DC predictions to 0 */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - m_saved.last_dc_val[ci] = 0; - - /* Re-init EOB run count, too */ - m_saved.EOBRUN = 0; - - /* Reset restart counter */ - m_restarts_to_go = m_cinfo.m_restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (m_cinfo.m_unread_marker == 0) - m_insufficient_data = false; - - return true; - } - - /// - /// MCU decoding for AC successive approximation refinement scan. - /// - private static void undo_decode_mcu_AC_refine(JpegBlock[] block, int[] newnz_pos, int num_newnz) - { - /* Re-zero any output coefficients that we made newly nonzero */ - while (num_newnz > 0) - block[0][newnz_pos[--num_newnz]] = 0; - } - } - #endregion - - #region ProgressiveHuffmanEncoder - /// - /// Expanded entropy encoder object for progressive Huffman encoding. - /// - class ProgressiveHuffmanEncoder : JpegEntropyEncoder - { - private enum MCUEncoder - { - mcu_DC_first_encoder, - mcu_AC_first_encoder, - mcu_DC_refine_encoder, - mcu_AC_refine_encoder - } - - /* MAX_CORR_BITS is the number of bits the AC refinement correction-bit - * buffer can hold. Larger sizes may slightly improve compression, but - * 1000 is already well into the realm of overkill. - * The minimum safe size is 64 bits. - */ - private const int MAX_CORR_BITS = 1000; /* Max # of correction bits I can buffer */ - - private MCUEncoder m_MCUEncoder; - - /* Mode flag: true for optimization, false for actual data output */ - private bool m_gather_statistics; - - // Bit-level coding status. - private int m_put_buffer; /* current bit-accumulation buffer */ - private int m_put_bits; /* # of bits now in it */ - - /* Coding status for DC components */ - private int[] m_last_dc_val = new int[JpegConstants.MaxComponentsInScan]; /* last DC coef for each component */ - - /* Coding status for AC components */ - private int m_ac_tbl_no; /* the table number of the single component */ - private int m_EOBRUN; /* run length of EOBs */ - private int m_BE; /* # of buffered correction bits before MCU */ - private char[] m_bit_buffer; /* buffer for correction bits (1 per char) */ - /* packing correction bits tightly would save some space but cost time... */ - - private int m_restarts_to_go; /* MCUs left in this restart interval */ - private int m_next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan). - * Since any one scan codes only DC or only AC, we only need one set - * of tables, not one for DC and one for AC. - */ - private c_derived_tbl[] m_derived_tbls = new c_derived_tbl[JpegConstants.NumberOfHuffmanTables]; - - /* Statistics tables for optimization; again, one set is enough */ - private long[][] m_count_ptrs = new long[JpegConstants.NumberOfHuffmanTables][]; - - public ProgressiveHuffmanEncoder(JpegCompressor cinfo) - { - m_cinfo = cinfo; - - /* Mark tables unallocated */ - for (int i = 0; i < JpegConstants.NumberOfHuffmanTables; i++) - { - m_derived_tbls[i] = null; - m_count_ptrs[i] = null; - } - } - - // Initialize for a Huffman-compressed scan using progressive JPEG. - public override void start_pass(bool gather_statistics) - { - m_gather_statistics = gather_statistics; - - /* We assume the scan parameters are already validated. */ - - /* Select execution routines */ - bool is_DC_band = (m_cinfo.m_Ss == 0); - if (m_cinfo.m_Ah == 0) - { - if (is_DC_band) - m_MCUEncoder = MCUEncoder.mcu_DC_first_encoder; - else - m_MCUEncoder = MCUEncoder.mcu_AC_first_encoder; - } - else - { - if (is_DC_band) - { - m_MCUEncoder = MCUEncoder.mcu_DC_refine_encoder; - } - else - { - m_MCUEncoder = MCUEncoder.mcu_AC_refine_encoder; - - /* AC refinement needs a correction bit buffer */ - if (m_bit_buffer == null) - m_bit_buffer = new char[MAX_CORR_BITS]; - } - } - - /* Only DC coefficients may be interleaved, so m_cinfo.comps_in_scan = 1 - * for AC coefficients. - */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - - /* Initialize DC predictions to 0 */ - m_last_dc_val[ci] = 0; - - /* Get table index */ - int tbl; - if (is_DC_band) - { - if (m_cinfo.m_Ah != 0) /* DC refinement needs no table */ - continue; - - tbl = componentInfo.Dc_tbl_no; - } - else - { - m_ac_tbl_no = componentInfo.Ac_tbl_no; - tbl = componentInfo.Ac_tbl_no; - } - - if (m_gather_statistics) - { - /* Check for invalid table index */ - /* (make_c_derived_tbl does this in the other path) */ - if (tbl < 0 || tbl >= JpegConstants.NumberOfHuffmanTables) - throw new Exception(String.Format("Huffman table 0x{0:X2} was not defined", tbl)); - - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (m_count_ptrs[tbl] == null) - m_count_ptrs[tbl] = new long[257]; - - Array.Clear(m_count_ptrs[tbl], 0, 257); - } - else - { - /* Compute derived values for Huffman table */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(is_DC_band, tbl, ref m_derived_tbls[tbl]); - } - } - - /* Initialize AC stuff */ - m_EOBRUN = 0; - m_BE = 0; - - /* Initialize bit buffer to empty */ - m_put_buffer = 0; - m_put_bits = 0; - - /* Initialize restart stuff */ - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num = 0; - } - - public override bool encode_mcu(JpegBlock[][] MCU_data) - { - switch (m_MCUEncoder) - { - case MCUEncoder.mcu_DC_first_encoder: - return encode_mcu_DC_first(MCU_data); - case MCUEncoder.mcu_AC_first_encoder: - return encode_mcu_AC_first(MCU_data); - case MCUEncoder.mcu_DC_refine_encoder: - return encode_mcu_DC_refine(MCU_data); - case MCUEncoder.mcu_AC_refine_encoder: - return encode_mcu_AC_refine(MCU_data); - } - - throw new Exception("The specified MCUEncoder is not implemented."); - } - - public override void finish_pass() - { - if (m_gather_statistics) - finish_pass_gather_phuff(); - else - finish_pass_phuff(); - } - - /// - /// MCU encoding for DC initial scan (either spectral selection, - /// or first pass of successive approximation). - /// - private bool encode_mcu_DC_first(JpegBlock[][] MCU_data) - { - /* Emit restart marker if needed */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - emit_restart(m_next_restart_num); - } - - /* Encode the MCU data blocks */ - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - /* Compute the DC value after the required point transform by Al. - * This is simply an arithmetic right shift. - */ - int temp2 = IRIGHT_SHIFT(MCU_data[blkn][0][0], m_cinfo.m_Al); - - /* DC differences are figured on the point-transformed values. */ - int ci = m_cinfo.m_MCU_membership[blkn]; - int temp = temp2 - m_last_dc_val[ci]; - m_last_dc_val[ci] = temp2; - - /* Encode the DC coefficient difference per section G.1.2.1 */ - temp2 = temp; - if (temp < 0) - { - /* temp is abs value of input */ - temp = -temp; - - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - int nbits = 0; - while (temp != 0) - { - nbits++; - temp >>= 1; - } - - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_HUFFMAN_COEF_BITS + 1) - throw new Exception("DCT coefficient out of range"); - - /* Count/emit the Huffman-coded symbol for the number of bits */ - emit_symbol(m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]].Dc_tbl_no, nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits != 0) - { - /* emit_bits rejects calls with size 0 */ - emit_bits(temp2, nbits); - } - } - - /* Update restart-interval state too */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num++; - m_next_restart_num &= 7; - } - - m_restarts_to_go--; - } - - return true; - } - - /// - /// MCU encoding for AC initial scan (either spectral selection, - /// or first pass of successive approximation). - /// - private bool encode_mcu_AC_first(JpegBlock[][] MCU_data) - { - /* Emit restart marker if needed */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - emit_restart(m_next_restart_num); - } - - /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ - /* r = run length of zeros */ - int r = 0; - for (int k = m_cinfo.m_Ss; k <= m_cinfo.m_Se; k++) - { - int temp = MCU_data[0][0][JpegUtils.jpeg_natural_order[k]]; - if (temp == 0) - { - r++; - continue; - } - - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value; so the code is - * interwoven with finding the abs value (temp) and output bits (temp2). - */ - int temp2; - if (temp < 0) - { - temp = -temp; /* temp is abs value of input */ - temp >>= m_cinfo.m_Al; /* apply the point transform */ - /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ - temp2 = ~temp; - } - else - { - temp >>= m_cinfo.m_Al; /* apply the point transform */ - temp2 = temp; - } - - /* Watch out for case that nonzero coef is zero after point transform */ - if (temp == 0) - { - r++; - continue; - } - - /* Emit any pending EOBRUN */ - if (m_EOBRUN > 0) - emit_eobrun(); - - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) - { - emit_symbol(m_ac_tbl_no, 0xF0); - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - int nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1) != 0) - nbits++; - - /* Check for out-of-range coefficient values */ - if (nbits > MAX_HUFFMAN_COEF_BITS) - throw new Exception("DCT coefficient out of range"); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(m_ac_tbl_no, (r << 4) + nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - emit_bits(temp2, nbits); - - r = 0; /* reset zero run length */ - } - - if (r > 0) - { - /* If there are trailing zeroes, */ - m_EOBRUN++; /* count an EOB */ - if (m_EOBRUN == 0x7FFF) - emit_eobrun(); /* force it out to avoid overflow */ - } - - /* Update restart-interval state too */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num++; - m_next_restart_num &= 7; - } - m_restarts_to_go--; - } - - return true; - } - - /// - /// MCU encoding for DC successive approximation refinement scan. - /// Note: we assume such scans can be multi-component, although the spec - /// is not very clear on the point. - /// - private bool encode_mcu_DC_refine(JpegBlock[][] MCU_data) - { - /* Emit restart marker if needed */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - emit_restart(m_next_restart_num); - } - - /* Encode the MCU data blocks */ - for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++) - { - /* We simply emit the Al'th bit of the DC coefficient value. */ - int temp = MCU_data[blkn][0][0]; - emit_bits(temp >> m_cinfo.m_Al, 1); - } - - /* Update restart-interval state too */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num++; - m_next_restart_num &= 7; - } - m_restarts_to_go--; - } - - return true; - } - - /// - /// MCU encoding for AC successive approximation refinement scan. - /// - private bool encode_mcu_AC_refine(JpegBlock[][] MCU_data) - { - /* Emit restart marker if needed */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - emit_restart(m_next_restart_num); - } - - /* Encode the MCU data block */ - - /* It is convenient to make a pre-pass to determine the transformed - * coefficients' absolute values and the EOB position. - */ - int EOB = 0; - int[] absvalues = new int[JpegConstants.DCTSize2]; - for (int k = m_cinfo.m_Ss; k <= m_cinfo.m_Se; k++) - { - int temp = MCU_data[0][0][JpegUtils.jpeg_natural_order[k]]; - - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value. - */ - if (temp < 0) - temp = -temp; /* temp is abs value of input */ - - temp >>= m_cinfo.m_Al; /* apply the point transform */ - absvalues[k] = temp; /* save abs value for main pass */ - - if (temp == 1) - { - /* EOB = index of last newly-nonzero coef */ - EOB = k; - } - } - - /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ - - int r = 0; /* r = run length of zeros */ - int BR = 0; /* BR = count of buffered bits added now */ - int bitBufferOffset = m_BE; /* Append bits to buffer */ - - for (int k = m_cinfo.m_Ss; k <= m_cinfo.m_Se; k++) - { - int temp = absvalues[k]; - if (temp == 0) - { - r++; - continue; - } - - /* Emit any required ZRLs, but not if they can be folded into EOB */ - while (r > 15 && k <= EOB) - { - /* emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(); - - /* Emit ZRL */ - emit_symbol(m_ac_tbl_no, 0xF0); - r -= 16; - - /* Emit buffered correction bits that must be associated with ZRL */ - emit_buffered_bits(bitBufferOffset, BR); - bitBufferOffset = 0;/* BE bits are gone now */ - BR = 0; - } - - /* If the coef was previously nonzero, it only needs a correction bit. - * NOTE: a straight translation of the spec's figure G.7 would suggest - * that we also need to test r > 15. But if r > 15, we can only get here - * if k > EOB, which implies that this coefficient is not 1. - */ - if (temp > 1) - { - /* The correction bit is the next bit of the absolute value. */ - m_bit_buffer[bitBufferOffset + BR] = (char)(temp & 1); - BR++; - continue; - } - - /* Emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(m_ac_tbl_no, (r << 4) + 1); - - /* Emit output bit for newly-nonzero coef */ - temp = (MCU_data[0][0][JpegUtils.jpeg_natural_order[k]] < 0) ? 0 : 1; - emit_bits(temp, 1); - - /* Emit buffered correction bits that must be associated with this code */ - emit_buffered_bits(bitBufferOffset, BR); - bitBufferOffset = 0;/* BE bits are gone now */ - BR = 0; - r = 0; /* reset zero run length */ - } - - if (r > 0 || BR > 0) - { - /* If there are trailing zeroes, */ - m_EOBRUN++; /* count an EOB */ - m_BE += BR; /* concat my correction bits to older ones */ - - /* We force out the EOB if we risk either: - * 1. overflow of the EOB counter; - * 2. overflow of the correction bit buffer during the next MCU. - */ - if (m_EOBRUN == 0x7FFF || m_BE > (MAX_CORR_BITS - JpegConstants.DCTSize2 + 1)) - emit_eobrun(); - } - - /* Update restart-interval state too */ - if (m_cinfo.m_restart_interval != 0) - { - if (m_restarts_to_go == 0) - { - m_restarts_to_go = m_cinfo.m_restart_interval; - m_next_restart_num++; - m_next_restart_num &= 7; - } - m_restarts_to_go--; - } - - return true; - } - - /// - /// Finish up at the end of a Huffman-compressed progressive scan. - /// - private void finish_pass_phuff() - { - /* Flush out any buffered data */ - emit_eobrun(); - flush_bits(); - } - - /// - /// Finish up a statistics-gathering pass and create the new Huffman tables. - /// - private void finish_pass_gather_phuff() - { - /* Flush out buffered data (all we care about is counting the EOB symbol) */ - emit_eobrun(); - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - bool[] did = new bool[JpegConstants.NumberOfHuffmanTables]; - - bool is_DC_band = (m_cinfo.m_Ss == 0); - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - int tbl = componentInfo.Ac_tbl_no; - - if (is_DC_band) - { - if (m_cinfo.m_Ah != 0) /* DC refinement needs no table */ - continue; - - tbl = componentInfo.Dc_tbl_no; - } - - if (!did[tbl]) - { - JpegHuffmanTable htblptr = null; - if (is_DC_band) - { - if (m_cinfo.m_dc_huff_tbl_ptrs[tbl] == null) - m_cinfo.m_dc_huff_tbl_ptrs[tbl] = new JpegHuffmanTable(); - - htblptr = m_cinfo.m_dc_huff_tbl_ptrs[tbl]; - } - else - { - if (m_cinfo.m_ac_huff_tbl_ptrs[tbl] == null) - m_cinfo.m_ac_huff_tbl_ptrs[tbl] = new JpegHuffmanTable(); - - htblptr = m_cinfo.m_ac_huff_tbl_ptrs[tbl]; - } - - jpeg_gen_optimal_table(htblptr, m_count_ptrs[tbl]); - did[tbl] = true; - } - } - } - - ////////////////////////////////////////////////////////////////////////// - // Outputting bytes to the file. - // NB: these must be called only when actually outputting, - // that is, entropy.gather_statistics == false. - - // Emit a byte - private void emit_byte(int val) - { - m_cinfo.m_dest.emit_byte(val); - } - - /// - /// Outputting bits to the file - /// - /// Only the right 24 bits of put_buffer are used; the valid bits are - /// left-justified in this part. At most 16 bits can be passed to emit_bits - /// in one call, and we never retain more than 7 bits in put_buffer - /// between calls, so 24 bits are sufficient. - /// - private void emit_bits(int code, int size) - { - // Emit some bits, unless we are in gather mode - /* This routine is heavily used, so it's worth coding tightly. */ - int local_put_buffer = code; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - throw new Exception("Missing Huffman code table entry"); - - if (m_gather_statistics) - { - /* do nothing if we're only getting stats */ - return; - } - - local_put_buffer &= (1 << size) - 1; /* mask off any extra bits in code */ - - m_put_bits += size; /* new number of bits in buffer */ - - local_put_buffer <<= 24 - m_put_bits; /* align incoming bits */ - - local_put_buffer |= m_put_buffer; /* and merge with old buffer contents */ - - while (m_put_bits >= 8) - { - int c = (local_put_buffer >> 16) & 0xFF; - - emit_byte(c); - if (c == 0xFF) - { - /* need to stuff a zero byte? */ - emit_byte(0); - } - local_put_buffer <<= 8; - m_put_bits -= 8; - } - - m_put_buffer = local_put_buffer; /* update variables */ - } - - private void flush_bits() - { - emit_bits(0x7F, 7); /* fill any partial byte with ones */ - m_put_buffer = 0; /* and reset bit-buffer to empty */ - m_put_bits = 0; - } - - // Emit (or just count) a Huffman symbol. - private void emit_symbol(int tbl_no, int symbol) - { - if (m_gather_statistics) - m_count_ptrs[tbl_no][symbol]++; - else - emit_bits(m_derived_tbls[tbl_no].ehufco[symbol], m_derived_tbls[tbl_no].ehufsi[symbol]); - } - - // Emit bits from a correction bit buffer. - private void emit_buffered_bits(int offset, int nbits) - { - if (m_gather_statistics) - { - /* no real work */ - return; - } - - for (int i = 0; i < nbits; i++) - emit_bits(m_bit_buffer[offset + i], 1); - } - - // Emit any pending EOBRUN symbol. - private void emit_eobrun() - { - if (m_EOBRUN > 0) - { - /* if there is any pending EOBRUN */ - int temp = m_EOBRUN; - int nbits = 0; - while ((temp >>= 1) != 0) - nbits++; - - /* safety check: shouldn't happen given limited correction-bit buffer */ - if (nbits > 14) - throw new Exception("Missing Huffman code table entry"); - - emit_symbol(m_ac_tbl_no, nbits << 4); - if (nbits != 0) - emit_bits(m_EOBRUN, nbits); - - m_EOBRUN = 0; - - /* Emit any buffered correction bits */ - emit_buffered_bits(0, m_BE); - m_BE = 0; - } - } - - // Emit a restart marker & resynchronize predictions. - private void emit_restart(int restart_num) - { - emit_eobrun(); - - if (!m_gather_statistics) - { - flush_bits(); - emit_byte(0xFF); - emit_byte((int)(JpegMarkerType.RST0 + restart_num)); - } - - if (m_cinfo.m_Ss == 0) - { - /* Re-initialize DC predictions to 0 */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - m_last_dc_val[ci] = 0; - } - else - { - /* Re-initialize all AC-related fields to 0 */ - m_EOBRUN = 0; - m_BE = 0; - } - } - - /// - /// IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than int. - /// We assume that int right shift is unsigned if int right shift is, - /// which should be safe. - /// - private static int IRIGHT_SHIFT(int x, int shft) - { - return (x >> shft); - } - } - #endregion - - #region RawImage - class RawImage : IRawImage - { - private List m_samples; - private ColorSpace m_colorspace; - - private int m_currentRow = -1; - - internal RawImage(List samples, ColorSpace colorspace) - { - if (samples == null) - throw new ArgumentNullException("'samples' Cannot be null!"); - if (samples.Count <= 0) - throw new Exception("No element specified in 'samples'"); - if (colorspace == ColorSpace.Unknown) - throw new Exception("Unknown Color Space!"); - - m_samples = samples; - m_colorspace = colorspace; - } - - public override int Width - { - get - { - return m_samples[0].Length; - } - } - - public override int Height - { - get - { - return m_samples.Count; - } - } - - public override ColorSpace Colorspace - { - get - { - return m_colorspace; - } - } - - public override int ComponentsPerPixel - { - get - { - return m_samples[0][0].ComponentCount; - } - } - - public override void BeginRead() - { - m_currentRow = 0; - } - - public override byte[] GetPixelRow() - { - SampleRow row = m_samples[m_currentRow]; - List result = new List(); - for (int i = 0; i < row.Length; ++i) - { - Sample sample = row[i]; - for (int j = 0; j < sample.ComponentCount; ++j) - result.Add((byte)sample[j]); - } - ++m_currentRow; - return result.ToArray(); - } - - public override void EndRead() - { - } - } - #endregion - - #region Sample - /// - /// Represents a "sample" (you can understand it as a "pixel") of image. - /// - /// It's impossible to create an instance of this class directly, - /// but you can use existing samples through collection. - /// Usual scenario is to get row of samples from the method. - /// - public class Sample - { - private short[] m_components; - private byte m_bitsPerComponent; - - internal Sample(BitStream bitStream, byte bitsPerComponent, byte componentCount) - { - if (bitStream == null) - throw new ArgumentNullException("bitStream"); - - if (bitsPerComponent <= 0 || bitsPerComponent > 16) - throw new ArgumentOutOfRangeException("bitsPerComponent"); - - if (componentCount <= 0 || componentCount > 5) - throw new ArgumentOutOfRangeException("componentCount"); - - m_bitsPerComponent = bitsPerComponent; - - m_components = new short[componentCount]; - for (short i = 0; i < componentCount; ++i) - m_components[i] = (short)bitStream.Read(bitsPerComponent); - } - - internal Sample(short[] components, byte bitsPerComponent) - { - if (components == null) - throw new ArgumentNullException("components"); - - if (components.Length == 0 || components.Length > 5) - throw new ArgumentException("components must be not empty and contain less than 5 elements"); - - if (bitsPerComponent <= 0 || bitsPerComponent > 16) - throw new ArgumentOutOfRangeException("bitsPerComponent"); - - m_bitsPerComponent = bitsPerComponent; - - m_components = new short[components.Length]; - Buffer.BlockCopy(components, 0, m_components, 0, components.Length * sizeof(short)); - } - - /// - /// Gets the number of bits per color component. - /// - /// The number of bits per color component. - public byte BitsPerComponent - { - get - { - return m_bitsPerComponent; - } - } - - /// - /// Gets the number of color components. - /// - /// The number of color components. - public byte ComponentCount - { - get - { - return (byte)m_components.Length; - } - } - - /// - /// Gets the color component at the specified index. - /// - /// The number of color component. - /// Value of color component. - public short this[int componentNumber] - { - get - { - return GetComponent(componentNumber); - } - } - - /// - /// Gets the required color component. - /// - /// The number of color component. - /// Value of color component. - public short GetComponent(int componentNumber) - { - return m_components[componentNumber]; - } - } - #endregion - - #region SampleRow - /// - /// Represents a row of image - collection of samples. - /// - public class SampleRow - { - private byte[] m_bytes; - private Sample[] m_samples; - - /// - /// Creates a row from raw samples data. - /// - /// Raw description of samples.
- /// You can pass collection with more than sampleCount samples - only sampleCount samples - /// will be parsed and all remaining bytes will be ignored. - /// The number of samples in row. - /// The number of bits per component. - /// The number of components per sample. - public SampleRow(byte[] row, int sampleCount, byte bitsPerComponent, byte componentsPerSample) - { - if (row == null) - throw new ArgumentNullException("row"); - - if (row.Length == 0) - throw new ArgumentException("row is empty"); - - if (sampleCount <= 0) - throw new ArgumentOutOfRangeException("sampleCount"); - - if (bitsPerComponent <= 0 || bitsPerComponent > 16) - throw new ArgumentOutOfRangeException("bitsPerComponent"); - - if (componentsPerSample <= 0 || componentsPerSample > 5) - throw new ArgumentOutOfRangeException("componentsPerSample"); - - m_bytes = row; - - using (BitStream bitStream = new BitStream(row)) - { - m_samples = new Sample[sampleCount]; - for (int i = 0; i < sampleCount; ++i) - m_samples[i] = new Sample(bitStream, bitsPerComponent, componentsPerSample); - } - } - - /// - /// Creates row from an array of components. - /// - /// Array of color components. - /// The number of bits per component. - /// The number of components per sample. - /// The difference between this constructor and - /// another one - - /// this constructor accept an array of prepared color components whereas - /// another constructor accept raw bytes and parse them. - /// - internal SampleRow(short[] sampleComponents, byte bitsPerComponent, byte componentsPerSample) - { - if (sampleComponents == null) - throw new ArgumentNullException("sampleComponents"); - - if (sampleComponents.Length == 0) - throw new ArgumentException("row is empty"); - - if (bitsPerComponent <= 0 || bitsPerComponent > 16) - throw new ArgumentOutOfRangeException("bitsPerComponent"); - - if (componentsPerSample <= 0 || componentsPerSample > 5) - throw new ArgumentOutOfRangeException("componentsPerSample"); - - int sampleCount = sampleComponents.Length / componentsPerSample; - m_samples = new Sample[sampleCount]; - for (int i = 0; i < sampleCount; ++i) - { - short[] components = new short[componentsPerSample]; - Buffer.BlockCopy(sampleComponents, i * componentsPerSample * sizeof(short), components, 0, componentsPerSample * sizeof(short)); - m_samples[i] = new Sample(components, bitsPerComponent); - } - - using (BitStream bits = new BitStream()) - { - for (int i = 0; i < sampleCount; ++i) - { - for (int j = 0; j < componentsPerSample; ++j) - bits.Write(sampleComponents[i * componentsPerSample + j], bitsPerComponent); - } - - m_bytes = new byte[bits.UnderlyingStream.Length]; - bits.UnderlyingStream.Seek(0, System.IO.SeekOrigin.Begin); - bits.UnderlyingStream.Read(m_bytes, 0, (int)bits.UnderlyingStream.Length); - } - } - - - /// - /// Gets the number of samples in this row. - /// - /// The number of samples. - public int Length - { - get - { - return m_samples.Length; - } - } - - - /// - /// Gets the sample at the specified index. - /// - /// The number of sample. - /// The required sample. - public Sample this[int sampleNumber] - { - get - { - return GetAt(sampleNumber); - } - } - - /// - /// Gets the sample at the specified index. - /// - /// The number of sample. - /// The required sample. - public Sample GetAt(int sampleNumber) - { - return m_samples[sampleNumber]; - } - - /// - /// Serializes this row to raw bytes. - /// - /// The row representation as array of bytes - public byte[] ToBytes() - { - return m_bytes; - } - } - #endregion - - #region SavedBitreadState - /// - /// Bitreading state saved across MCUs - /// - struct SavedBitreadState - { - public int get_buffer; /* current bit-extraction buffer */ - public int bits_left; /* # of unused bits in it */ - } - #endregion - - #region SourceManagerImpl - /// - /// Expanded data source object for stdio input - /// - class SourceManagerImpl : Jpeg_Source - { - private const int INPUT_BUF_SIZE = 4096; - - private JpegDecompressor m_cinfo; - - private Stream m_infile; /* source stream */ - private byte[] m_buffer; /* start of buffer */ - private bool m_start_of_file; /* have we gotten any data yet? */ - - /// - /// Initialize source - called by jpeg_read_header - /// before any data is actually read. - /// - public SourceManagerImpl(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - m_buffer = new byte[INPUT_BUF_SIZE]; - } - - public void Attach(Stream infile) - { - m_infile = infile; - m_infile.Seek(0, SeekOrigin.Begin); - initInternalBuffer(null, 0); - } - - public override void init_source() - { - /* We reset the empty-input-file flag for each image, - * but we don't clear the input buffer. - * This is correct behavior for reading a series of images from one source. - */ - m_start_of_file = true; - } - - /// - /// Fill the input buffer - called whenever buffer is emptied. - /// - /// In typical applications, this should read fresh data into the buffer - /// (ignoring the current state of next_input_byte and bytes_in_buffer), - /// reset the pointer and count to the start of the buffer, and return true - /// indicating that the buffer has been reloaded. It is not necessary to - /// fill the buffer entirely, only to obtain at least one more byte. - /// - /// There is no such thing as an EOF return. If the end of the file has been - /// reached, the routine has a choice of ERREXIT() or inserting fake data into - /// the buffer. In most cases, generating a warning message and inserting a - /// fake EOI marker is the best course of action --- this will allow the - /// decompressor to output however much of the image is there. However, - /// the resulting error message is misleading if the real problem is an empty - /// input file, so we handle that case specially. - /// - /// In applications that need to be able to suspend compression due to input - /// not being available yet, a false return indicates that no more data can be - /// obtained right now, but more may be forthcoming later. In this situation, - /// the decompressor will return to its caller (with an indication of the - /// number of scanlines it has read, if any). The application should resume - /// decompression after it has loaded more data into the input buffer. Note - /// that there are substantial restrictions on the use of suspension --- see - /// the documentation. - /// - /// When suspending, the decompressor will back up to a convenient restart point - /// (typically the start of the current MCU). next_input_byte and bytes_in_buffer - /// indicate where the restart point will be if the current call returns false. - /// Data beyond this point must be rescanned after resumption, so move it to - /// the front of the buffer rather than discarding it. - /// - public override bool fill_input_buffer() - { - int nbytes = m_infile.Read(m_buffer, 0, INPUT_BUF_SIZE); - if (nbytes <= 0) - { - if (m_start_of_file) /* Treat empty input file as fatal error */ - throw new Exception("The input file is empty!"); - - /* Insert a fake EOI marker */ - m_buffer[0] = (byte)0xFF; - m_buffer[1] = (byte)JpegMarkerType.EOI; - nbytes = 2; - } - - initInternalBuffer(m_buffer, nbytes); - m_start_of_file = false; - - return true; - } - } - #endregion - - #region TransCoefControllerImpl - /// - /// This is a special implementation of the coefficient - /// buffer controller. This is similar to jccoefct.c, but it handles only - /// output from presupplied virtual arrays. Furthermore, we generate any - /// dummy padding blocks on-the-fly rather than expecting them to be present - /// in the arrays. - /// - class TransCoefControllerImpl : JpegCompressorCoefController - { - private JpegCompressor m_cinfo; - - private int m_iMCU_row_num; /* iMCU row # within image */ - private int m_mcu_ctr; /* counts MCUs processed in current row */ - private int m_MCU_vert_offset; /* counts MCU rows within iMCU row */ - private int m_MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* Virtual block array for each component. */ - private JpegVirtualArray[] m_whole_image; - - /* Workspace for constructing dummy blocks at right/bottom edges. */ - private JpegBlock[][] m_dummy_buffer = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU][]; - - /// - /// Initialize coefficient buffer controller. - /// - /// Each passed coefficient array must be the right size for that - /// coefficient: width_in_blocks wide and height_in_blocks high, - /// with unit height at least v_samp_factor. - /// - public TransCoefControllerImpl(JpegCompressor cinfo, JpegVirtualArray[] coef_arrays) - { - m_cinfo = cinfo; - - /* Save pointer to virtual arrays */ - m_whole_image = coef_arrays; - - /* Allocate and pre-zero space for dummy DCT blocks. */ - JpegBlock[] buffer = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU]; - for (int i = 0; i < JpegConstants.CompressorMaxBlocksInMCU; i++) - buffer[i] = new JpegBlock(); - - for (int i = 0; i < JpegConstants.CompressorMaxBlocksInMCU; i++) - { - m_dummy_buffer[i] = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU - i]; - for (int j = i; j < JpegConstants.CompressorMaxBlocksInMCU; j++) - m_dummy_buffer[i][j - i] = buffer[j]; - } - } - - /// - /// Initialize for a processing pass. - /// - public virtual void start_pass(BufferMode pass_mode) - { - if (pass_mode != BufferMode.CrankDest) - throw new Exception("Bogus buffer control mode"); - - m_iMCU_row_num = 0; - start_iMCU_row(); - } - - /// - /// Process some data. - /// We process the equivalent of one fully interleaved MCU row ("iMCU" row) - /// per call, ie, v_samp_factor block rows for each component in the scan. - /// The data is obtained from the virtual arrays and fed to the entropy coder. - /// Returns true if the iMCU row is completed, false if suspended. - /// - /// NB: input_buf is ignored; it is likely to be a null pointer. - /// - public virtual bool compress_data(byte[][][] input_buf) - { - /* Align the virtual buffers for the components used in this scan. */ - JpegBlock[][][] buffer = new JpegBlock[JpegConstants.MaxComponentsInScan][][]; - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - buffer[ci] = m_whole_image[componentInfo.Component_index].Access( - m_iMCU_row_num * componentInfo.V_samp_factor, componentInfo.V_samp_factor); - } - - /* Loop to process one whole iMCU row */ - int last_MCU_col = m_cinfo.m_MCUs_per_row - 1; - int last_iMCU_row = m_cinfo.m_total_iMCU_rows - 1; - JpegBlock[][] MCU_buffer = new JpegBlock[JpegConstants.CompressorMaxBlocksInMCU][]; - for (int yoffset = m_MCU_vert_offset; yoffset < m_MCU_rows_per_iMCU_row; yoffset++) - { - for (int MCU_col_num = m_mcu_ctr; MCU_col_num < m_cinfo.m_MCUs_per_row; MCU_col_num++) - { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - int blkn = 0; /* index of current DCT block within MCU */ - for (int ci = 0; ci < m_cinfo.m_comps_in_scan; ci++) - { - JpegComponent componentInfo = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]]; - int start_col = MCU_col_num * componentInfo.MCU_width; - int blockcnt = (MCU_col_num < last_MCU_col) ? componentInfo.MCU_width : componentInfo.last_col_width; - for (int yindex = 0; yindex < componentInfo.MCU_height; yindex++) - { - int xindex = 0; - if (m_iMCU_row_num < last_iMCU_row || yindex + yoffset < componentInfo.last_row_height) - { - /* Fill in pointers to real blocks in this row */ - for (xindex = 0; xindex < blockcnt; xindex++) - { - int bufLength = buffer[ci][yindex + yoffset].Length; - int start = start_col + xindex; - MCU_buffer[blkn] = new JpegBlock[bufLength - start]; - for (int j = start; j < bufLength; j++) - MCU_buffer[blkn][j - start] = buffer[ci][yindex + yoffset][j]; - - blkn++; - } - } - else - { - /* At bottom of image, need a whole row of dummy blocks */ - xindex = 0; - } - - /* Fill in any dummy blocks needed in this row. - * Dummy blocks are filled in the same way as in jccoefct.c: - * all zeroes in the AC entries, DC entries equal to previous - * block's DC value. The init routine has already zeroed the - * AC entries, so we need only set the DC entries correctly. - */ - for (; xindex < componentInfo.MCU_width; xindex++) - { - MCU_buffer[blkn] = m_dummy_buffer[blkn]; - MCU_buffer[blkn][0][0] = MCU_buffer[blkn - 1][0][0]; - blkn++; - } - } - } - - /* Try to write the MCU. */ - if (!m_cinfo.m_entropy.encode_mcu(MCU_buffer)) - { - /* Suspension forced; update state counters and exit */ - m_MCU_vert_offset = yoffset; - m_mcu_ctr = MCU_col_num; - return false; - } - } - - /* Completed an MCU row, but perhaps not an iMCU row */ - m_mcu_ctr = 0; - } - - /* Completed the iMCU row, advance counters for next one */ - m_iMCU_row_num++; - start_iMCU_row(); - return true; - } - - /// - /// Reset within-iMCU-row counters for a new row - /// - private void start_iMCU_row() - { - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (m_cinfo.m_comps_in_scan > 1) - { - m_MCU_rows_per_iMCU_row = 1; - } - else - { - if (m_iMCU_row_num < (m_cinfo.m_total_iMCU_rows - 1)) - m_MCU_rows_per_iMCU_row = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[0]].V_samp_factor; - else - m_MCU_rows_per_iMCU_row = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[0]].last_row_height; - } - - m_mcu_ctr = 0; - m_MCU_vert_offset = 0; - } - } - #endregion - - #region UpsamplerImpl - class UpsamplerImpl : JpegUpsampler - { - private enum ComponentUpsampler - { - noop_upsampler, - fullsize_upsampler, - h2v1_fancy_upsampler, - h2v1_upsampler, - h2v2_fancy_upsampler, - h2v2_upsampler, - int_upsampler - } - - private JpegDecompressor m_cinfo; - - /* Color conversion buffer. When using separate upsampling and color - * conversion steps, this buffer holds one upsampled row group until it - * has been color converted and output. - * Note: we do not allocate any storage for component(s) which are full-size, - * ie do not need rescaling. The corresponding entry of color_buf[] is - * simply set to point to the input data array, thereby avoiding copying. - */ - private ComponentBuffer[] m_color_buf = new ComponentBuffer[JpegConstants.MaxComponents]; - - // used only for fullsize_upsampler mode - private int[] m_perComponentOffsets = new int[JpegConstants.MaxComponents]; - - /* Per-component upsampling method pointers */ - private ComponentUpsampler[] m_upsampleMethods = new ComponentUpsampler[JpegConstants.MaxComponents]; - private int m_currentComponent; // component being upsampled - private int m_upsampleRowOffset; - - private int m_next_row_out; /* counts rows emitted from color_buf */ - private int m_rows_to_go; /* counts rows remaining in image */ - - /* Height of an input row group for each component. */ - private int[] m_rowgroup_height = new int[JpegConstants.MaxComponents]; - - /* These arrays save pixel expansion factors so that int_expand need not - * re-compute them each time. They are unused for other up-sampling methods. - */ - private byte[] m_h_expand = new byte[JpegConstants.MaxComponents]; - private byte[] m_v_expand = new byte[JpegConstants.MaxComponents]; - - public UpsamplerImpl(JpegDecompressor cinfo) - { - m_cinfo = cinfo; - m_need_context_rows = false; /* until we find out differently */ - - if (cinfo.m_CCIR601_sampling) /* this isn't supported */ - throw new Exception("CCIR601 sampling not implemented yet"); - - /* JpegDecompressorMainController doesn't support context rows when min_DCT_scaled_size = 1, - * so don't ask for it. - */ - bool do_fancy = cinfo.m_do_fancy_upsampling && cinfo.m_min_DCT_scaled_size > 1; - - /* Verify we can handle the sampling factors, select per-component methods, - * and create storage as needed. - */ - for (int ci = 0; ci < cinfo.m_num_components; ci++) - { - JpegComponent componentInfo = cinfo.Comp_info[ci]; - - /* Compute size of an "input group" after IDCT scaling. This many samples - * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. - */ - int h_in_group = (componentInfo.H_samp_factor * componentInfo.DCT_scaled_size) / cinfo.m_min_DCT_scaled_size; - int v_in_group = (componentInfo.V_samp_factor * componentInfo.DCT_scaled_size) / cinfo.m_min_DCT_scaled_size; - int h_out_group = cinfo.m_max_h_samp_factor; - int v_out_group = cinfo.m_max_v_samp_factor; - - /* save for use later */ - m_rowgroup_height[ci] = v_in_group; - bool need_buffer = true; - if (!componentInfo.component_needed) - { - /* Don't bother to upsample an uninteresting component. */ - m_upsampleMethods[ci] = ComponentUpsampler.noop_upsampler; - need_buffer = false; - } - else if (h_in_group == h_out_group && v_in_group == v_out_group) - { - /* Fullsize components can be processed without any work. */ - m_upsampleMethods[ci] = ComponentUpsampler.fullsize_upsampler; - need_buffer = false; - } - else if (h_in_group * 2 == h_out_group && v_in_group == v_out_group) - { - /* Special cases for 2h1v upsampling */ - if (do_fancy && componentInfo.downsampled_width > 2) - m_upsampleMethods[ci] = ComponentUpsampler.h2v1_fancy_upsampler; - else - m_upsampleMethods[ci] = ComponentUpsampler.h2v1_upsampler; - } - else if (h_in_group * 2 == h_out_group && v_in_group * 2 == v_out_group) - { - /* Special cases for 2h2v upsampling */ - if (do_fancy && componentInfo.downsampled_width > 2) - { - m_upsampleMethods[ci] = ComponentUpsampler.h2v2_fancy_upsampler; - m_need_context_rows = true; - } - else - { - m_upsampleMethods[ci] = ComponentUpsampler.h2v2_upsampler; - } - } - else if ((h_out_group % h_in_group) == 0 && (v_out_group % v_in_group) == 0) - { - /* Generic integral-factors up-sampling method */ - m_upsampleMethods[ci] = ComponentUpsampler.int_upsampler; - m_h_expand[ci] = (byte)(h_out_group / h_in_group); - m_v_expand[ci] = (byte)(v_out_group / v_in_group); - } - else - throw new Exception("Fractional sampling not implemented yet"); - - if (need_buffer) - { - ComponentBuffer cb = new ComponentBuffer(); - cb.SetBuffer(JpegCommonBase.AllocJpegSamples(JpegUtils.jround_up(cinfo.m_output_width, - cinfo.m_max_h_samp_factor), cinfo.m_max_v_samp_factor), null, 0); - - m_color_buf[ci] = cb; - } - } - } - - /// - /// Initialize for an upsampling pass. - /// - public override void start_pass() - { - /* Mark the conversion buffer empty */ - m_next_row_out = m_cinfo.m_max_v_samp_factor; - - /* Initialize total-height counter for detecting bottom of image */ - m_rows_to_go = m_cinfo.m_output_height; - } - - /// - /// Control routine to do upsampling (and color conversion). - /// - /// In this version we upsample each component independently. - /// We upsample one row group into the conversion buffer, then apply - /// color conversion a row at a time. - /// - public override void upsample(ComponentBuffer[] input_buf, ref int in_row_group_ctr, int in_row_groups_avail, byte[][] output_buf, ref int out_row_ctr, int out_rows_avail) - { - /* Fill the conversion buffer, if it's empty */ - if (m_next_row_out >= m_cinfo.m_max_v_samp_factor) - { - for (int ci = 0; ci < m_cinfo.m_num_components; ci++) - { - m_perComponentOffsets[ci] = 0; - - /* Invoke per-component upsample method.*/ - m_currentComponent = ci; - m_upsampleRowOffset = in_row_group_ctr * m_rowgroup_height[ci]; - upsampleComponent(ref input_buf[ci]); - } - - m_next_row_out = 0; - } - - /* Color-convert and emit rows */ - - /* How many we have in the buffer: */ - int num_rows = m_cinfo.m_max_v_samp_factor - m_next_row_out; - - /* Not more than the distance to the end of the image. Need this test - * in case the image height is not a multiple of max_v_samp_factor: - */ - if (num_rows > m_rows_to_go) - num_rows = m_rows_to_go; - - /* And not more than what the client can accept: */ - out_rows_avail -= out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - - m_cinfo.m_cconvert.color_convert(m_color_buf, m_perComponentOffsets, m_next_row_out, output_buf, out_row_ctr, num_rows); - - /* Adjust counts */ - out_row_ctr += num_rows; - m_rows_to_go -= num_rows; - m_next_row_out += num_rows; - - /* When the buffer is emptied, declare this input row group consumed */ - if (m_next_row_out >= m_cinfo.m_max_v_samp_factor) - in_row_group_ctr++; - } - - private void upsampleComponent(ref ComponentBuffer input_data) - { - switch (m_upsampleMethods[m_currentComponent]) - { - case ComponentUpsampler.noop_upsampler: - noop_upsample(); - break; - case ComponentUpsampler.fullsize_upsampler: - fullsize_upsample(ref input_data); - break; - case ComponentUpsampler.h2v1_fancy_upsampler: - h2v1_fancy_upsample(m_cinfo.Comp_info[m_currentComponent].downsampled_width, ref input_data); - break; - case ComponentUpsampler.h2v1_upsampler: - h2v1_upsample(ref input_data); - break; - case ComponentUpsampler.h2v2_fancy_upsampler: - h2v2_fancy_upsample(m_cinfo.Comp_info[m_currentComponent].downsampled_width, ref input_data); - break; - case ComponentUpsampler.h2v2_upsampler: - h2v2_upsample(ref input_data); - break; - case ComponentUpsampler.int_upsampler: - int_upsample(ref input_data); - break; - default: - throw new Exception("The specified Component Up-sampler isn't implemented."); - } - } - - /* - * These are the routines invoked to upsample pixel values - * of a single component. One row group is processed per call. - */ - - /// - /// This is a no-op version used for "uninteresting" components. - /// These components will not be referenced by color conversion. - /// - private static void noop_upsample() - { - // do nothing - } - - /// - /// For full-size components, we just make color_buf[ci] point at the - /// input buffer, and thus avoid copying any data. Note that this is - /// safe only because sep_upsample doesn't declare the input row group - /// "consumed" until we are done color converting and emitting it. - /// - private void fullsize_upsample(ref ComponentBuffer input_data) - { - m_color_buf[m_currentComponent] = input_data; - m_perComponentOffsets[m_currentComponent] = m_upsampleRowOffset; - } - - /// - /// Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. - /// - /// The upsampling algorithm is linear interpolation between pixel centers, - /// also known as a "triangle filter". This is a good compromise between - /// speed and visual quality. The centers of the output pixels are 1/4 and 3/4 - /// of the way between input pixel centers. - /// - /// A note about the "bias" calculations: when rounding fractional values to - /// integer, we do not want to always round 0.5 up to the next integer. - /// If we did that, we'd introduce a noticeable bias towards larger values. - /// Instead, this code is arranged so that 0.5 will be rounded up or down at - /// alternate pixel locations (a simple ordered dither pattern). - /// - private void h2v1_fancy_upsample(int downsampled_width, ref ComponentBuffer input_data) - { - ComponentBuffer output_data = m_color_buf[m_currentComponent]; - - for (int inrow = 0; inrow < m_cinfo.m_max_v_samp_factor; inrow++) - { - int row = m_upsampleRowOffset + inrow; - int inIndex = 0; - - int outIndex = 0; - - /* Special case for first column */ - int invalue = input_data[row][inIndex]; - inIndex++; - - output_data[inrow][outIndex] = (byte)invalue; - outIndex++; - output_data[inrow][outIndex] = (byte)((invalue * 3 + (int)input_data[row][inIndex] + 2) >> 2); - outIndex++; - - for (int colctr = downsampled_width - 2; colctr > 0; colctr--) - { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ - invalue = (int)input_data[row][inIndex] * 3; - inIndex++; - - output_data[inrow][outIndex] = (byte)((invalue + (int)input_data[row][inIndex - 2] + 1) >> 2); - outIndex++; - - output_data[inrow][outIndex] = (byte)((invalue + (int)input_data[row][inIndex] + 2) >> 2); - outIndex++; - } - - /* Special case for last column */ - invalue = input_data[row][inIndex]; - output_data[inrow][outIndex] = (byte)((invalue * 3 + (int)input_data[row][inIndex - 1] + 1) >> 2); - outIndex++; - output_data[inrow][outIndex] = (byte)invalue; - outIndex++; - } - } - - /// - /// Fast processing for the common case of 2:1 horizontal and 1:1 vertical. - /// It's still a box filter. - /// - private void h2v1_upsample(ref ComponentBuffer input_data) - { - ComponentBuffer output_data = m_color_buf[m_currentComponent]; - - for (int inrow = 0; inrow < m_cinfo.m_max_v_samp_factor; inrow++) - { - int row = m_upsampleRowOffset + inrow; - int outIndex = 0; - - for (int col = 0; col < m_cinfo.m_output_width; col++) - { - byte invalue = input_data[row][col]; /* don't need GETJSAMPLE() here */ - output_data[inrow][outIndex] = invalue; - outIndex++; - output_data[inrow][outIndex] = invalue; - outIndex++; - } - } - } - - /// - /// Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. - /// Again a triangle filter; see comments for h2v1 case, above. - /// - /// It is OK for us to reference the adjacent input rows because we demanded - /// context from the main buffer controller (see initialization code). - /// - private void h2v2_fancy_upsample(int downsampled_width, ref ComponentBuffer input_data) - { - ComponentBuffer output_data = m_color_buf[m_currentComponent]; - - int inrow = m_upsampleRowOffset; - int outrow = 0; - while (outrow < m_cinfo.m_max_v_samp_factor) - { - for (int v = 0; v < 2; v++) - { - // nearest input row index - int inIndex0 = 0; - - //next nearest input row index - int inIndex1 = 0; - int inRow1 = -1; - if (v == 0) - { - /* next nearest is row above */ - inRow1 = inrow - 1; - } - else - { - /* next nearest is row below */ - inRow1 = inrow + 1; - } - - int row = outrow; - int outIndex = 0; - outrow++; - - /* Special case for first column */ - int thiscolsum = (int)input_data[inrow][inIndex0] * 3 + (int)input_data[inRow1][inIndex1]; - inIndex0++; - inIndex1++; - - int nextcolsum = (int)input_data[inrow][inIndex0] * 3 + (int)input_data[inRow1][inIndex1]; - inIndex0++; - inIndex1++; - - output_data[row][outIndex] = (byte)((thiscolsum * 4 + 8) >> 4); - outIndex++; - - output_data[row][outIndex] = (byte)((thiscolsum * 3 + nextcolsum + 7) >> 4); - outIndex++; - - int lastcolsum = thiscolsum; - thiscolsum = nextcolsum; - - for (int colctr = downsampled_width - 2; colctr > 0; colctr--) - { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ - /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ - nextcolsum = (int)input_data[inrow][inIndex0] * 3 + (int)input_data[inRow1][inIndex1]; - inIndex0++; - inIndex1++; - - output_data[row][outIndex] = (byte)((thiscolsum * 3 + lastcolsum + 8) >> 4); - outIndex++; - - output_data[row][outIndex] = (byte)((thiscolsum * 3 + nextcolsum + 7) >> 4); - outIndex++; - - lastcolsum = thiscolsum; - thiscolsum = nextcolsum; - } - - /* Special case for last column */ - output_data[row][outIndex] = (byte)((thiscolsum * 3 + lastcolsum + 8) >> 4); - outIndex++; - output_data[row][outIndex] = (byte)((thiscolsum * 4 + 7) >> 4); - outIndex++; - } - - inrow++; - } - } - - /// - /// Fast processing for the common case of 2:1 horizontal and 2:1 vertical. - /// It's still a box filter. - /// - private void h2v2_upsample(ref ComponentBuffer input_data) - { - ComponentBuffer output_data = m_color_buf[m_currentComponent]; - - int inrow = 0; - int outrow = 0; - while (outrow < m_cinfo.m_max_v_samp_factor) - { - int row = m_upsampleRowOffset + inrow; - int outIndex = 0; - - for (int col = 0; col < m_cinfo.m_output_width; col++) - { - byte invalue = input_data[row][col]; /* don't need GETJSAMPLE() here */ - output_data[outrow][outIndex] = invalue; - outIndex++; - output_data[outrow][outIndex] = invalue; - outIndex++; - } - - JpegUtils.jcopy_sample_rows(output_data, outrow, output_data, outrow + 1, 1, m_cinfo.m_output_width); - inrow++; - outrow += 2; - } - } - - /// - /// This version handles any integral sampling ratios. - /// This is not used for typical JPEG files, so it need not be fast. - /// Nor, for that matter, is it particularly accurate: the algorithm is - /// simple replication of the input pixel onto the corresponding output - /// pixels. The hi-falutin sampling literature refers to this as a - /// "box filter". A box filter tends to introduce visible artifacts, - /// so if you are actually going to use 3:1 or 4:1 sampling ratios - /// you would be well advised to improve this code. - /// - private void int_upsample(ref ComponentBuffer input_data) - { - ComponentBuffer output_data = m_color_buf[m_currentComponent]; - int h_expand = m_h_expand[m_currentComponent]; - int v_expand = m_v_expand[m_currentComponent]; - - int inrow = 0; - int outrow = 0; - while (outrow < m_cinfo.m_max_v_samp_factor) - { - /* Generate one output row with proper horizontal expansion */ - int row = m_upsampleRowOffset + inrow; - for (int col = 0; col < m_cinfo.m_output_width; col++) - { - byte invalue = input_data[row][col]; /* don't need GETJSAMPLE() here */ - int outIndex = 0; - for (int h = h_expand; h > 0; h--) - { - output_data[outrow][outIndex] = invalue; - outIndex++; - } - } - - /* Generate any additional output rows by duplicating the first one */ - if (v_expand > 1) - { - JpegUtils.jcopy_sample_rows(output_data, outrow, output_data, - outrow + 1, v_expand - 1, m_cinfo.m_output_width); - } - - inrow++; - outrow += v_expand; - } - } - } - #endregion - - #region Utils - class Utils - { - public static MemoryStream CopyStream(Stream stream) - { - if (stream == null) - throw new ArgumentNullException("stream"); - - long positionBefore = stream.Position; - stream.Seek(0, SeekOrigin.Begin); - - MemoryStream result = new MemoryStream((int)stream.Length); - - byte[] block = new byte[2048]; - for (; ; ) - { - int bytesRead = stream.Read(block, 0, 2048); - result.Write(block, 0, bytesRead); - if (bytesRead < 2048) - break; - } - - stream.Seek(positionBefore, SeekOrigin.Begin); - return result; - } - - public static void CMYK2RGB(byte c, byte m, byte y, byte k, out byte red, out byte green, out byte blue) - { - float C, M, Y, K; - C = c / 255.0f; - M = m / 255.0f; - Y = y / 255.0f; - K = k / 255.0f; - - float R, G, B; - R = C * (1.0f - K) + K; - G = M * (1.0f - K) + K; - B = Y * (1.0f - K) + K; - - R = (1.0f - R) * 255.0f + 0.5f; - G = (1.0f - G) * 255.0f + 0.5f; - B = (1.0f - B) * 255.0f + 0.5f; - - red = (byte)(R * 255); - green = (byte)(G * 255); - blue = (byte)(B * 255); - } - } - #endregion - - #region WorkingBitreadState - struct WorkingBitreadState - { - public int get_buffer; - public int bits_left; - public JpegDecompressor cinfo; - } - #endregion -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibTiff.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibTiff.cs deleted file mode 100644 index 8641b9701f..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/BitMiracle/LibTiff.cs +++ /dev/null @@ -1,34406 +0,0 @@ -/**************************************************************************** - * - * LibTiff.Net - * Copyright (c) 2008-2011, Bit Miracle - * - * All rights reserved. - * - * 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. - * - * Neither the name of the Bit Miracle nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * 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 BIT MIRACLE 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. - ****************************************************************************/ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using ComponentAce.Compression.Libs.zlib; -using BitMiracle.LibJpeg; -using System.Collections; -using System.Diagnostics; -using System.Globalization; - -namespace BitMiracle.LibTiff -{ - #region Tiff - /// - /// Tag Image File Format (TIFF) - /// - /// - /// Based on Rev 6.0 from - /// - /// - public class Tiff : IDisposable - { - - private bool writeCheckStrips(string module) - { - return ((m_flags & TiffFlags.BeenWriting) == TiffFlags.BeenWriting || WriteCheck(false, module)); - } - - private bool writeCheckTiles(string module) - { - return ((m_flags & TiffFlags.BeenWriting) == TiffFlags.BeenWriting || WriteCheck(true, module)); - } - - private void bufferCheck() - { - if (!((m_flags & TiffFlags.BufferSetup) == TiffFlags.BufferSetup && m_rawdata != null)) - WriteBufferSetup(null, -1); - } - - private bool writeOK(byte[] buffer, int offset, int count) - { - try - { - m_stream.Write(m_clientdata, buffer, offset, count); - } - catch (Exception) - { - Tiff.Warning(this, "writeOK", "Failed to write {0} bytes", count); - return false; - } - - return true; - } - - private bool writeHeaderOK(TiffHeader header) - { - bool res = writeShortOK(header.tiff_magic); - - if (res) - res = writeShortOK(header.tiff_version); - - if (res) - res = writeIntOK((int)header.tiff_diroff); - - return res; - } - - private bool writeDirEntryOK(TiffDirEntry[] entries, int count) - { - bool res = true; - for (int i = 0; i < count; i++) - { - res = writeShortOK((short)entries[i].tdir_tag); - - if (res) - res = writeShortOK((short)entries[i].tdir_type); - - if (res) - res = writeIntOK(entries[i].tdir_count); - - if (res) - res = writeIntOK((int)entries[i].tdir_offset); - - if (!res) - break; - } - - return res; - } - - private bool writeShortOK(short value) - { - byte[] cp = new byte[2]; - cp[0] = (byte)value; - cp[1] = (byte)(value >> 8); - - return writeOK(cp, 0, 2); - } - - private bool writeIntOK(int value) - { - byte[] cp = new byte[4]; - cp[0] = (byte)value; - cp[1] = (byte)(value >> 8); - cp[2] = (byte)(value >> 16); - cp[3] = (byte)(value >> 24); - - return writeOK(cp, 0, 4); - } - - private bool isUnspecified(int f) - { - return (fieldSet(f) && m_dir.td_imagelength == 0); - } - - /* - * Grow the strip data structures by delta strips. - */ - private bool growStrips(int delta) - { - Debug.Assert(m_dir.td_planarconfig == PlanarConfig.Contig); - uint[] new_stripoffset = Realloc(m_dir.td_stripoffset, m_dir.td_nstrips, m_dir.td_nstrips + delta); - uint[] new_stripbytecount = Realloc(m_dir.td_stripbytecount, m_dir.td_nstrips, m_dir.td_nstrips + delta); - m_dir.td_stripoffset = new_stripoffset; - m_dir.td_stripbytecount = new_stripbytecount; - Array.Clear(m_dir.td_stripoffset, m_dir.td_nstrips, delta); - Array.Clear(m_dir.td_stripbytecount, m_dir.td_nstrips, delta); - m_dir.td_nstrips += delta; - return true; - } - - /// - /// Appends the data to the specified strip. - /// - private bool appendToStrip(int strip, byte[] buffer, int offset, int count) - { - const string module = "appendToStrip"; - - if (m_dir.td_stripoffset[strip] == 0 || m_curoff == 0) - { - Debug.Assert(m_dir.td_nstrips > 0); - - if (m_dir.td_stripbytecount[strip] != 0 && - m_dir.td_stripoffset[strip] != 0 && - m_dir.td_stripbytecount[strip] >= count) - { - // There is already tile data on disk, and the new tile - // data we have to will fit in the same space. The only - // aspect of this that is risky is that there could be - // more data to append to this strip before we are done - // depending on how we are getting called. - if (!seekOK(m_dir.td_stripoffset[strip])) - { - ErrorExt(this, m_clientdata, module, "Seek error at scanline {0}", m_row); - return false; - } - } - else - { - // Seek to end of file, and set that as our location - // to write this strip. - m_dir.td_stripoffset[strip] = (uint)seekFile(0, SeekOrigin.End); - } - - m_curoff = m_dir.td_stripoffset[strip]; - - // We are starting a fresh strip/tile, so set the size to zero. - m_dir.td_stripbytecount[strip] = 0; - } - - if (!writeOK(buffer, offset, count)) - { - ErrorExt(this, m_clientdata, module, "Write error at scanline {0}", m_row); - return false; - } - - m_curoff += (uint)count; - m_dir.td_stripbytecount[strip] += (uint)count; - return true; - } - - /* - * Internal version of FlushData that can be - * called by ``encodestrip routines'' w/o concern - * for infinite recursion. - */ - internal bool flushData1() - { - if (m_rawcc > 0) - { - if (!isFillOrder(m_dir.td_fillorder) && (m_flags & TiffFlags.NoBitRev) != TiffFlags.NoBitRev) - ReverseBits(m_rawdata, m_rawcc); - - if (!appendToStrip(IsTiled() ? m_curtile : m_curstrip, m_rawdata, 0, m_rawcc)) - return false; - - m_rawcc = 0; - m_rawcp = 0; - } - - return true; - } - - /* - * Bit reversal tables. TIFFBitRevTable[] gives - * the bit reversed value of . Used in various - * places in the library when the BitOrder requires - * bit reversal of byte values (e.g. CCITT Fax 3 - * encoding/decoding). TIFFNoBitRevTable is provided - * for algorithms that want an equivalent table that - * do not reverse bit values. - */ - private static readonly byte[] TIFFBitRevTable = - { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, - 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, - 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, - 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, - 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, - 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, - 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, - 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, - 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, - 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, - 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, - 0x3f, 0xbf, 0x7f, 0xff - }; - - private static readonly byte[] TIFFNoBitRevTable = - { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, - 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, - 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, - 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, - 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, - 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, - 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, - 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff, - }; - - private int summarize(int summand1, int summand2, string where) - { - int bytes = summand1 + summand2; - if (bytes - summand1 != summand2) - { - ErrorExt(this, m_clientdata, m_name, "Integer overflow in {0}", where); - bytes = 0; - } - - return bytes; - } - - private int multiply(int nmemb, int elem_size, string where) - { - int bytes = nmemb * elem_size; - if (elem_size != 0 && bytes / elem_size != nmemb) - { - ErrorExt(this, m_clientdata, m_name, "Integer overflow in {0}", where); - bytes = 0; - } - - return bytes; - } - - /* - * Return the number of bytes to read/write in a call to - * one of the scanline-oriented i/o routines. Note that - * this number may be 1/samples-per-pixel if data is - * stored as separate planes. - * The ScanlineSize in case of YCbCrSubsampling is defined as the - * strip size divided by the strip height, i.e. the size of a pack of vertical - * subsampling lines divided by vertical subsampling. It should thus make - * sense when multiplied by a multiple of vertical subsampling. - * Some stuff depends on this newer version of TIFFScanlineSize - * TODO: resolve this - */ - internal int newScanlineSize() - { - int scanline; - if (m_dir.td_planarconfig == PlanarConfig.Contig) - { - if (m_dir.td_photometric == Photometric.YCBCR && !IsUpSampled()) - { - FieldValue[] result = GetField(TiffTag.YCBCRSUBSAMPLING); - ushort ycbcrsubsampling0 = result[0].ToUShort(); - ushort ycbcrsubsampling1 = result[1].ToUShort(); - - if (ycbcrsubsampling0 * ycbcrsubsampling1 == 0) - { - ErrorExt(this, m_clientdata, m_name, "Invalid YCbCr subsampling"); - return 0; - } - - return ((((m_dir.td_imagewidth + ycbcrsubsampling0 - 1) / ycbcrsubsampling0) * (ycbcrsubsampling0 * ycbcrsubsampling1 + 2) * m_dir.td_bitspersample + 7) / 8) / ycbcrsubsampling1; - } - else - { - scanline = multiply(m_dir.td_imagewidth, m_dir.td_samplesperpixel, "TIFFScanlineSize"); - } - } - else - { - scanline = m_dir.td_imagewidth; - } - - return howMany8(multiply(scanline, m_dir.td_bitspersample, "TIFFScanlineSize")); - } - - /* - * Some stuff depends on this older version of TIFFScanlineSize - * TODO: resolve this - */ - internal int oldScanlineSize() - { - int scanline = multiply(m_dir.td_bitspersample, m_dir.td_imagewidth, "TIFFScanlineSize"); - if (m_dir.td_planarconfig == PlanarConfig.Contig) - scanline = multiply(scanline, m_dir.td_samplesperpixel, "TIFFScanlineSize"); - - return howMany8(scanline); - } - - /// - /// undefined state - /// - private const int NOSTRIP = -1; - - /// - /// undefined state - /// - private const int NOTILE = -1; - - internal const int O_RDONLY = 0; - internal const int O_WRONLY = 0x0001; - internal const int O_CREAT = 0x0100; - internal const int O_TRUNC = 0x0200; - internal const int O_RDWR = 0x0002; - - // - // Default Read/Seek/Write definitions. - // - - private int readFile(byte[] buf, int offset, int size) - { - return m_stream.Read(m_clientdata, buf, offset, size); - } - - private long seekFile(long off, SeekOrigin whence) - { - return m_stream.Seek(m_clientdata, off, whence); - } - - private long getFileSize() - { - return m_stream.Size(m_clientdata); - } - - private bool readOK(byte[] buf, int size) - { - return (readFile(buf, 0, size) == size); - } - - private bool readShortOK(out short value) - { - byte[] bytes = new byte[2]; - bool res = readOK(bytes, 2); - value = 0; - if (res) - { - value = (short)(bytes[0] & 0xFF); - value += (short)((bytes[1] & 0xFF) << 8); - } - - return res; - } - - private bool readUIntOK(out uint value) - { - int temp; - bool res = readIntOK(out temp); - if (res) - value = (uint)temp; - else - value = 0; - - return res; - } - - private bool readIntOK(out int value) - { - byte[] cp = new byte[4]; - bool res = readOK(cp, 4); - value = 0; - if (res) - { - value = cp[0] & 0xFF; - value += (cp[1] & 0xFF) << 8; - value += (cp[2] & 0xFF) << 16; - value += cp[3] << 24; - } - - return res; - } - - private bool readDirEntryOk(TiffDirEntry[] dir, short dircount) - { - int entrySize = sizeof(short) * 2 + sizeof(int) * 2; - int totalSize = entrySize * dircount; - byte[] bytes = new byte[totalSize]; - bool res = readOK(bytes, totalSize); - if (res) - readDirEntry(dir, dircount, bytes, 0); - - return res; - } - - private static void readDirEntry(TiffDirEntry[] dir, short dircount, byte[] bytes, int offset) - { - int pos = offset; - for (int i = 0; i < dircount; i++) - { - TiffDirEntry entry = new TiffDirEntry(); - entry.tdir_tag = (TiffTag)(ushort)readShort(bytes, pos); - pos += sizeof(short); - entry.tdir_type = (TiffType)readShort(bytes, pos); - pos += sizeof(short); - entry.tdir_count = readInt(bytes, pos); - pos += sizeof(int); - entry.tdir_offset = (uint)readInt(bytes, pos); - pos += sizeof(int); - dir[i] = entry; - } - } - - private bool readHeaderOk(ref TiffHeader header) - { - bool res = readShortOK(out header.tiff_magic); - - if (res) - res = readShortOK(out header.tiff_version); - - if (res) - res = readUIntOK(out header.tiff_diroff); - - return res; - } - - private bool seekOK(long off) - { - return (seekFile(off, SeekOrigin.Begin) == off); - } - - /* - * Seek to a random row+sample in a file. - */ - private bool seek(int row, short sample) - { - if (row >= m_dir.td_imagelength) - { - /* out of range */ - ErrorExt(this, m_clientdata, m_name, - "{0}: Row out of range, max {1}", row, m_dir.td_imagelength); - return false; - } - - int strip; - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - if (sample >= m_dir.td_samplesperpixel) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Sample out of range, max {1}", sample, m_dir.td_samplesperpixel); - return false; - } - - if (m_dir.td_rowsperstrip != -1) - strip = sample * m_dir.td_stripsperimage + row / m_dir.td_rowsperstrip; - else - strip = 0; - } - else - { - if (m_dir.td_rowsperstrip != -1) - strip = row / m_dir.td_rowsperstrip; - else - strip = 0; - } - - if (strip != m_curstrip) - { - /* different strip, refill */ - if (!fillStrip(strip)) - return false; - } - else if (row < m_row) - { - /* - * Moving backwards within the same strip: backup - * to the start and then decode forward (below). - * - * NB: If you're planning on lots of random access within a - * strip, it's better to just read and decode the entire - * strip, and then access the decoded data in a random fashion. - */ - if (!startStrip(strip)) - return false; - } - - if (row != m_row) - { - /* - * Seek forward to the desired row. - */ - if (!m_currentCodec.Seek(row - m_row)) - return false; - - m_row = row; - } - - return true; - } - - private int readRawStrip1(int strip, byte[] buf, int offset, int size, string module) - { - Debug.Assert((m_flags & TiffFlags.NoReadRaw) != TiffFlags.NoReadRaw); - - if (!seekOK(m_dir.td_stripoffset[strip])) - { - ErrorExt(this, m_clientdata, module, - "{0}: Seek error at scanline {1}, strip {2}", m_name, m_row, strip); - return -1; - } - - int cc = readFile(buf, offset, size); - if (cc != size) - { - ErrorExt(this, m_clientdata, module, - "{0}: Read error at scanline {1}; got {2} bytes, expected {3}", - m_name, m_row, cc, size); - return -1; - } - - return size; - } - - private int readRawTile1(int tile, byte[] buf, int offset, int size, string module) - { - Debug.Assert((m_flags & TiffFlags.NoReadRaw) != TiffFlags.NoReadRaw); - - if (!seekOK(m_dir.td_stripoffset[tile])) - { - ErrorExt(this, m_clientdata, module, - "{0}: Seek error at row {1}, col {2}, tile {3}", m_name, m_row, m_col, tile); - return -1; - } - - int cc = readFile(buf, offset, size); - if (cc != size) - { - ErrorExt(this, m_clientdata, module, - "{0}: Read error at row {1}, col {2}; got {3} bytes, expected {4}", - m_name, m_row, m_col, cc, size); - return -1; - } - - return size; - } - - /// - /// Set state to appear as if a strip has just been read in. - /// - private bool startStrip(int strip) - { - if ((m_flags & TiffFlags.CoderSetup) != TiffFlags.CoderSetup) - { - if (!m_currentCodec.SetupDecode()) - return false; - - m_flags |= TiffFlags.CoderSetup; - } - - m_curstrip = strip; - m_row = (strip % m_dir.td_stripsperimage) * m_dir.td_rowsperstrip; - m_rawcp = 0; - - if ((m_flags & TiffFlags.NoReadRaw) == TiffFlags.NoReadRaw) - m_rawcc = 0; - else - m_rawcc = (int)m_dir.td_stripbytecount[strip]; - - return m_currentCodec.PreDecode((short)(strip / m_dir.td_stripsperimage)); - } - - /* - * Set state to appear as if a - * tile has just been read in. - */ - private bool startTile(int tile) - { - if ((m_flags & TiffFlags.CoderSetup) != TiffFlags.CoderSetup) - { - if (!m_currentCodec.SetupDecode()) - return false; - - m_flags |= TiffFlags.CoderSetup; - } - - m_curtile = tile; - m_row = (tile % howMany(m_dir.td_imagewidth, m_dir.td_tilewidth)) * m_dir.td_tilelength; - m_col = (tile % howMany(m_dir.td_imagelength, m_dir.td_tilelength)) * m_dir.td_tilewidth; - m_rawcp = 0; - - if ((m_flags & TiffFlags.NoReadRaw) == TiffFlags.NoReadRaw) - m_rawcc = 0; - else - m_rawcc = (int)m_dir.td_stripbytecount[tile]; - - return m_currentCodec.PreDecode((short)(tile / m_dir.td_stripsperimage)); - } - - private bool checkRead(bool tiles) - { - if (m_mode == O_WRONLY) - { - ErrorExt(this, m_clientdata, m_name, "File not open for reading"); - return false; - } - - if (tiles ^ IsTiled()) - { - ErrorExt(this, m_clientdata, m_name, tiles ? - "Can not read tiles from a stripped image" : - "Can not read scanlines from a tiled image"); - return false; - } - - return true; - } - - private static void swab16BitData(byte[] buffer, int offset, int count) - { - Debug.Assert((count & 1) == 0); - short[] swabee = ByteArrayToShorts(buffer, offset, count); - SwabArrayOfShort(swabee, count / 2); - ShortsToByteArray(swabee, 0, count / 2, buffer, offset); - } - - private static void swab24BitData(byte[] buffer, int offset, int count) - { - Debug.Assert((count % 3) == 0); - SwabArrayOfTriples(buffer, offset, count / 3); - } - - private static void swab32BitData(byte[] buffer, int offset, int count) - { - Debug.Assert((count & 3) == 0); - int[] swabee = ByteArrayToInts(buffer, offset, count); - SwabArrayOfLong(swabee, count / 4); - IntsToByteArray(swabee, 0, count / 4, buffer, offset); - } - - private static void swab64BitData(byte[] buffer, int offset, int count) - { - Debug.Assert((count & 7) == 0); - - int doubleCount = count / 8; - double[] doubles = new double[doubleCount]; - int byteOffset = offset; - for (int i = 0; i < doubleCount; i++) - { - doubles[i] = BitConverter.ToDouble(buffer, byteOffset); - byteOffset += 8; - } - - SwabArrayOfDouble(doubles, doubleCount); - - byteOffset = offset; - for (int i = 0; i < doubleCount; i++) - { - byte[] bytes = BitConverter.GetBytes(doubles[i]); - Buffer.BlockCopy(bytes, 0, buffer, byteOffset, bytes.Length); - byteOffset += bytes.Length; - } - } - - /// - /// Read the specified strip and setup for decoding. - /// The data buffer is expanded, as necessary, to hold the strip's data. - /// - internal bool fillStrip(int strip) - { - const string module = "fillStrip"; - - if ((m_flags & TiffFlags.NoReadRaw) != TiffFlags.NoReadRaw) - { - int bytecount = (int)m_dir.td_stripbytecount[strip]; - if (bytecount <= 0) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Invalid strip byte count, strip {1}", bytecount, strip); - return false; - } - - /* - * Expand raw data buffer, if needed, to - * hold data strip coming from file - * (perhaps should set upper bound on - * the size of a buffer we'll use?). - */ - if (bytecount > m_rawdatasize) - { - m_curstrip = NOSTRIP; - if ((m_flags & TiffFlags.MyBuffer) != TiffFlags.MyBuffer) - { - ErrorExt(this, m_clientdata, module, - "{0}: Data buffer too small to hold strip {1}", m_name, strip); - return false; - } - - ReadBufferSetup(null, roundUp(bytecount, 1024)); - } - - if (readRawStrip1(strip, m_rawdata, 0, bytecount, module) != bytecount) - return false; - - if (!isFillOrder(m_dir.td_fillorder) && (m_flags & TiffFlags.NoBitRev) != TiffFlags.NoBitRev) - ReverseBits(m_rawdata, bytecount); - } - - return startStrip(strip); - } - - /// - /// Read the specified tile and setup for decoding. - /// The data buffer is expanded, as necessary, to hold the tile's data. - /// - internal bool fillTile(int tile) - { - const string module = "fillTile"; - - if ((m_flags & TiffFlags.NoReadRaw) != TiffFlags.NoReadRaw) - { - int bytecount = (int)m_dir.td_stripbytecount[tile]; - if (bytecount <= 0) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Invalid tile byte count, tile {1}", bytecount, tile); - return false; - } - - /* - * Expand raw data buffer, if needed, to - * hold data tile coming from file - * (perhaps should set upper bound on - * the size of a buffer we'll use?). - */ - if (bytecount > m_rawdatasize) - { - m_curtile = NOTILE; - if ((m_flags & TiffFlags.MyBuffer) != TiffFlags.MyBuffer) - { - ErrorExt(this, m_clientdata, module, - "{0}: Data buffer too small to hold tile {1}", m_name, tile); - return false; - } - - ReadBufferSetup(null, roundUp(bytecount, 1024)); - } - - if (readRawTile1(tile, m_rawdata, 0, bytecount, module) != bytecount) - return false; - - if (!isFillOrder(m_dir.td_fillorder) && (m_flags & TiffFlags.NoBitRev) != TiffFlags.NoBitRev) - ReverseBits(m_rawdata, bytecount); - } - - return startTile(tile); - } - - private static readonly string[] photoNames = - { - "min-is-white", // Photometric.MinIsWhite - "min-is-black", // Photometric.MinIsBlack - "RGB color", // Photometric.RGB - "palette color (RGB from colormap)", // Photometric.Palette - "transparency mask", // Photometric.Mask - "separated", // Photometric.Separated - "YCbCr", // Photometric.YCBCR - "7 (0x7)", - "CIE L*a*b*", // Photometric.CIELAB - }; - - private static readonly string[] orientNames = - { - "0 (0x0)", - "row 0 top, col 0 lhs", // Orientation.TopLeft - "row 0 top, col 0 rhs", // Orientation.TopRight - "row 0 bottom, col 0 rhs", // Orientation.BottomRight - "row 0 bottom, col 0 lhs", // Orientation.BottomLeft - "row 0 lhs, col 0 top", // Orientation.LeftTop - "row 0 rhs, col 0 top", // Orientation.RightTop - "row 0 rhs, col 0 bottom", // Orientation.RightBottom - "row 0 lhs, col 0 bottom", // Orientation.LeftBottom - }; - - private static void printField(Stream fd, TiffFieldInfo fip, int value_count, object raw_data) - { - fprintf(fd, " {0}: ", fip.Name); - - byte[] bytes = raw_data as byte[]; - sbyte[] sbytes = raw_data as sbyte[]; - short[] shorts = raw_data as short[]; - ushort[] ushorts = raw_data as ushort[]; - int[] ints = raw_data as int[]; - uint[] uints = raw_data as uint[]; - float[] floats = raw_data as float[]; - double[] doubles = raw_data as double[]; - string s = raw_data as string; - - for (int j = 0; j < value_count; j++) - { - if (fip.Type == TiffType.Byte || fip.Type == TiffType.SByte) - { - if (bytes != null) - fprintf(fd, "{0}", bytes[j]); - else if (sbytes != null) - fprintf(fd, "{0}", sbytes[j]); - } - else if (fip.Type == TiffType.Undefined) - { - if (bytes != null) - fprintf(fd, "0x{0:x}", bytes[j]); - } - else if (fip.Type == TiffType.Short || fip.Type == TiffType.SShort) - { - if (shorts != null) - fprintf(fd, "{0}", shorts[j]); - else if (ushorts != null) - fprintf(fd, "{0}", ushorts[j]); - } - else if (fip.Type == TiffType.Long || fip.Type == TiffType.SLong) - { - if (ints != null) - fprintf(fd, "{0}", ints[j]); - else if (uints != null) - fprintf(fd, "{0}", uints[j]); - } - else if (fip.Type == TiffType.Rational || - fip.Type == TiffType.SRational || - fip.Type == TiffType.Float) - { - if (floats != null) - fprintf(fd, "{0}", floats[j]); - } - else if (fip.Type == TiffType.IFD) - { - if (ints != null) - fprintf(fd, "0x{0:x}", ints[j]); - else if (uints != null) - fprintf(fd, "0x{0:x}", uints[j]); - } - else if (fip.Type == TiffType.ASCII) - { - if (s != null) - fprintf(fd, "{0}", s); - - break; - } - else if (fip.Type == TiffType.Double || fip.Type == TiffType.Float) - { - if (floats != null) - fprintf(fd, "{0}", floats[j]); - else if (doubles != null) - fprintf(fd, "{0}", doubles[j]); - } - else - { - fprintf(fd, ""); - break; - } - - if (j < value_count - 1) - fprintf(fd, ","); - } - - fprintf(fd, "\r\n"); - } - - private bool prettyPrintField(Stream fd, TiffTag tag, int value_count, object raw_data) - { - FieldValue value = new FieldValue(raw_data); - short[] sdata = value.ToShortArray(); - float[] fdata = value.ToFloatArray(); - double[] ddata = value.ToDoubleArray(); - - switch (tag) - { - case TiffTag.InkSet: - if (sdata != null) - { - fprintf(fd, " Ink Set: "); - switch ((InkSet)sdata[0]) - { - case InkSet.CMYK: - fprintf(fd, "CMYK\n"); - break; - - default: - fprintf(fd, "{0} (0x{1:x})\n", sdata[0], sdata[0]); - break; - } - return true; - } - return false; - - case TiffTag.DotRange: - if (sdata != null) - { - fprintf(fd, " Dot Range: {0}-{1}\n", sdata[0], sdata[1]); - return true; - } - return false; - - case TiffTag.WhitePoint: - if (fdata != null) - { - fprintf(fd, " White Point: {0:G}-{1:G}\n", fdata[0], fdata[1]); - return true; - } - return false; - - case TiffTag.REFERENCEBLACKWHITE: - if (fdata != null) - { - fprintf(fd, " Reference Black/White:\n"); - for (short i = 0; i < 3; i++) - fprintf(fd, " {0,2:D}: {1,5:G} {2,5:G}\n", i, fdata[2 * i + 0], fdata[2 * i + 1]); - return true; - } - return false; - - case TiffTag.XMLPACKET: - string s = raw_data as string; - if (s != null) - { - fprintf(fd, " XMLPacket (XMP Metadata):\n"); - fprintf(fd, s.Substring(0, value_count)); - fprintf(fd, "\n"); - return true; - } - return false; - - case TiffTag.RICHTIFFIPTC: - // XXX: for some weird reason RichTIFFIPTC tag defined - // as array of Long values. - fprintf(fd, " RichTIFFIPTC Data: , {0} bytes\n", value_count * 4); - return true; - - case TiffTag.PHOTOSHOP: - fprintf(fd, " Photoshop Data: , {0} bytes\n", value_count); - return true; - - case TiffTag.ICCPROFILE: - fprintf(fd, " ICC Profile: , {0} bytes\n", value_count); - return true; - - case TiffTag.STONITS: - if (ddata != null) - { - fprintf(fd, " Sample to Nits conversion factor: {0:e4}\n", ddata[0]); - return true; - } - return false; - } - - return false; - } - - private static void printAscii(Stream fd, string cp) - { - for (int cpPos = 0; cp[cpPos] != '\0'; cpPos++) - { - if (!char.IsControl(cp[cpPos])) - { - fprintf(fd, "{0}", cp[cpPos]); - continue; - } - - string tp = "\tt\bb\rr\nn\vv"; - int tpPos = 0; - for (; tp[tpPos] != 0; tpPos++) - { - if (tp[tpPos++] == cp[cpPos]) - break; - } - - if (tp[tpPos] != 0) - fprintf(fd, "\\{0}", tp[tpPos]); - else - fprintf(fd, "\\{0}", encodeOctalString((byte)(cp[cpPos] & 0xff))); - } - } - - private static readonly uint[] typemask = - { - 0, // TIFF_NOTYPE - 0x000000ff, // TIFF_BYTE - 0xffffffff, // TIFF_ASCII - 0x0000ffff, // TIFF_SHORT - 0xffffffff, // TIFF_LONG - 0xffffffff, // TIFF_RATIONAL - 0x000000ff, // TIFF_SBYTE - 0x000000ff, // TIFF_UNDEFINED - 0x0000ffff, // TIFF_SSHORT - 0xffffffff, // TIFF_SLONG - 0xffffffff, // TIFF_SRATIONAL - 0xffffffff, // TIFF_FLOAT - 0xffffffff, // TIFF_DOUBLE - }; - - private static readonly int[] bigTypeshift = - { - 0, // TIFF_NOTYPE - 24, // TIFF_BYTE - 0, // TIFF_ASCII - 16, // TIFF_SHORT - 0, // TIFF_LONG - 0, // TIFF_RATIONAL - 24, // TIFF_SBYTE - 24, // TIFF_UNDEFINED - 16, // TIFF_SSHORT - 0, // TIFF_SLONG - 0, // TIFF_SRATIONAL - 0, // TIFF_FLOAT - 0, // TIFF_DOUBLE - }; - - private static readonly int[] litTypeshift = - { - 0, // TIFF_NOTYPE - 0, // TIFF_BYTE - 0, // TIFF_ASCII - 0, // TIFF_SHORT - 0, // TIFF_LONG - 0, // TIFF_RATIONAL - 0, // TIFF_SBYTE - 0, // TIFF_UNDEFINED - 0, // TIFF_SSHORT - 0, // TIFF_SLONG - 0, // TIFF_SRATIONAL - 0, // TIFF_FLOAT - 0, // TIFF_DOUBLE - }; - - /* - * Initialize the shift & mask tables, and the - * byte swapping state according to the file - * contents and the machine architecture. - */ - private void initOrder(int magic) - { - m_typemask = typemask; - if (magic == TIFF_BIGENDIAN) - { - m_typeshift = bigTypeshift; - m_flags |= TiffFlags.Swab; - } - else - { - m_typeshift = litTypeshift; - } - } - - private static int getMode(string mode, string module, out FileMode m, out FileAccess a) - { - m = 0; - a = 0; - int tiffMode = -1; - - if (mode.Length == 0) - return tiffMode; - - switch (mode[0]) - { - case 'r': - m = FileMode.Open; - a = FileAccess.Read; - tiffMode = O_RDONLY; - if (mode.Length > 1 && mode[1] == '+') - { - a = FileAccess.ReadWrite; - tiffMode = O_RDWR; - } - break; - - case 'w': - m = FileMode.Create; - a = FileAccess.ReadWrite; - tiffMode = O_RDWR | O_CREAT | O_TRUNC; - break; - - case 'a': - m = FileMode.Open; - a = FileAccess.ReadWrite; - tiffMode = O_RDWR | O_CREAT; - break; - - default: - ErrorExt(null, 0, module, "\"{0}\": Bad mode", mode); - break; - } - - return tiffMode; - } - - private const int TIFF_VERSION = 42; - private const int TIFF_BIGTIFF_VERSION = 43; - - private const short TIFF_BIGENDIAN = 0x4d4d; - private const short TIFF_LITTLEENDIAN = 0x4949; - private const short MDI_LITTLEENDIAN = 0x5045; - - // reference white - private const float D50_X0 = 96.4250F; - private const float D50_Y0 = 100.0F; - private const float D50_Z0 = 82.4680F; - - internal const int STRIP_SIZE_DEFAULT = 8192; - - /// - /// Support strip chopping (whether or not to convert single-strip - /// uncompressed images to mutiple strips of ~8Kb to reduce memory usage) - /// - internal const TiffFlags STRIPCHOP_DEFAULT = TiffFlags.StripChop; - - /// - /// Treat extra sample as alpha (default enabled). The RGBA interface - /// will treat a fourth sample with no EXTRASAMPLE_ value as being - /// AssociatedAlpha. Many packages produce RGBA files but don't mark the - /// alpha properly. - /// - internal const bool DEFAULT_EXTRASAMPLE_AS_ALPHA = true; - - /// - /// Pick up YCbCr subsampling info from the JPEG data stream to support - /// files lacking the tag (default enabled). - /// - internal const bool CHECK_JPEG_YCBCR_SUBSAMPLING = true; - - internal static Encoding Latin1Encoding = Encoding.GetEncoding("Latin1"); - - internal enum PostDecodeMethodType - { - pdmNone, - pdmSwab16Bit, - pdmSwab24Bit, - pdmSwab32Bit, - pdmSwab64Bit - }; - - /// - /// name of open file - /// - internal string m_name; - - /// - /// open mode (O_*) - /// - internal int m_mode; - internal TiffFlags m_flags; - - // - // the first directory - // - - /// - /// file offset of current directory - /// - internal uint m_diroff; - - // directories to prevent IFD looping - - /// - /// internal rep of current directory - /// - internal TiffDirectory m_dir; - - /// - /// current scanline - /// - internal int m_row; - - /// - /// current strip for read/write - /// - internal int m_curstrip; - - // tiling support - - /// - /// current tile for read/write - /// - internal int m_curtile; - - /// - /// # of bytes in a tile - /// - internal int m_tilesize; - - // compression scheme hooks - internal TiffCodec m_currentCodec; - - // input/output buffering - - /// - /// # of bytes in a scanline - /// - internal int m_scanlinesize; - - /// - /// raw data buffer - /// - internal byte[] m_rawdata; - - /// - /// # of bytes in raw data buffer - /// - internal int m_rawdatasize; - - /// - /// current spot in raw buffer - /// - internal int m_rawcp; - - /// - /// bytes unread from raw buffer - /// - internal int m_rawcc; - - /// - /// callback parameter - /// - internal object m_clientdata; - - // post-decoding support - - /// - /// post decoding method type - /// - internal PostDecodeMethodType m_postDecodeMethod; - - // tag support - - /// - /// tag get/set/print routines - /// - internal TiffTagMethods m_tagmethods; - - private class codecList - { - public codecList next; - public TiffCodec codec; - }; - - private class clientInfoLink - { - public clientInfoLink next; - public object data; - public string name; - }; - - // the first directory - - /// - /// file offset of following directory - /// - private uint m_nextdiroff; - - /// - /// list of offsets to already seen directories to prevent IFD looping - /// - private uint[] m_dirlist; - - /// - /// number of entires in offset list - /// - private int m_dirlistsize; - - /// - /// number of already seen directories - /// - private short m_dirnumber; - - /// - /// file's header block - /// - private TiffHeader m_header; - - /// - /// data type shift counts - /// - private int[] m_typeshift; - - /// - /// data type masks - /// - private uint[] m_typemask; - - /// - /// current directory (index) - /// - private short m_curdir; - - /// - /// current offset for read/write - /// - private uint m_curoff; - - /// - /// current offset for writing dir - /// - private uint m_dataoff; - - // - // SubIFD support - // - - /// - /// remaining subifds to write - /// - private short m_nsubifd; - - /// - /// offset for patching SubIFD link - /// - private uint m_subifdoff; - - // tiling support - - /// - /// current column (offset by row too) - /// - private int m_col; - - // compression scheme hooks - - private bool m_decodestatus; - - // tag support - - /// - /// sorted table of registered tags - /// - private TiffFieldInfo[] m_fieldinfo; - - /// - /// # entries in registered tag table - /// - private int m_nfields; - - /// - /// cached pointer to already found tag - /// - private TiffFieldInfo m_foundfield; - - /// - /// extra client information. - /// - private clientInfoLink m_clientinfo; - - private TiffCodec[] m_builtInCodecs; - private codecList m_registeredCodecs; - - private TiffTagMethods m_defaultTagMethods; - - private static TiffErrorHandler m_errorHandler; - private TiffErrorHandler m_defaultErrorHandler; - - private bool m_disposed; - private Stream m_fileStream; - - /// - /// Client Tag extension support (from Niles Ritter). - /// - private static TiffExtendProc m_extender; - - /// - /// stream used for read|write|etc. - /// - private TiffStream m_stream; - - private Tiff() - { - m_clientdata = 0; - m_postDecodeMethod = PostDecodeMethodType.pdmNone; - - setupBuiltInCodecs(); - - m_defaultTagMethods = new TiffTagMethods(); - - m_defaultErrorHandler = null; - if (m_errorHandler == null) - { - // user did not setup custom handler. - // install default - m_defaultErrorHandler = new TiffErrorHandler(); - m_errorHandler = m_defaultErrorHandler; - } - } - - private void Dispose(bool disposing) - { - if (!this.m_disposed) - { - // If disposing equals true, dispose all managed - // and unmanaged resources. - if (disposing) - { - // Dispose managed resources. - Close(); - - if (m_fileStream != null) - m_fileStream.Dispose(); - } - - // Call the appropriate methods to clean up - // unmanaged resources here. - - // Note disposing has been done. - m_disposed = true; - } - } - - /// - /// Writes custom directory. See ticket #51. - /// - /// Output directory offset. - /// true if succeeded; otherwise, false - private bool WriteCustomDirectory(out long pdiroff) - { - pdiroff = -1; - - if (m_mode == O_RDONLY) - return true; - - // Size the directory so that we can calculate offsets for the data - // items that aren't kept in-place in each field. - int nfields = 0; - for (int b = 0; b <= FieldBit.Last; b++) - { - if (fieldSet(b) && b != FieldBit.Custom) - nfields += (b < FieldBit.SubFileType ? 2 : 1); - } - - nfields += m_dir.td_customValueCount; - int dirsize = nfields * TiffDirEntry.SizeInBytes; - TiffDirEntry[] data = new TiffDirEntry[nfields]; - - // Put the directory at the end of the file. - m_diroff = (uint)((seekFile(0, SeekOrigin.End) + 1) & ~1); - m_dataoff = m_diroff + sizeof(short) + (uint)dirsize + sizeof(int); - if ((m_dataoff & 1) != 0) - m_dataoff++; - - seekFile(m_dataoff, SeekOrigin.Begin); - - // Setup external form of directory entries and write data items. - int[] fields = new int[FieldBit.SetLongs]; - Buffer.BlockCopy(m_dir.td_fieldsset, 0, fields, 0, FieldBit.SetLongs * sizeof(int)); - - for (int fi = 0, nfi = m_nfields; nfi > 0; nfi--, fi++) - { - TiffFieldInfo fip = m_fieldinfo[fi]; - - // For custom fields, we test to see if the custom field - // is set or not. For normal fields, we just use the FieldSet test. - if (fip.Bit == FieldBit.Custom) - { - bool is_set = false; - for (int ci = 0; ci < m_dir.td_customValueCount; ci++) - is_set |= (m_dir.td_customValues[ci].info == fip); - - if (!is_set) - continue; - } - else if (!fieldSet(fields, fip.Bit)) - continue; - - if (fip.Bit != FieldBit.Custom) - resetFieldBit(fields, fip.Bit); - } - - // Write directory. - - short dircount = (short)nfields; - pdiroff = m_nextdiroff; - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - // The file's byte order is opposite to the native machine - // architecture. We overwrite the directory information with - // impunity because it'll be released below after we write it - // to the file. Note that all the other tag construction - // routines assume that we do this byte-swapping; i.e. they only - // byte-swap indirect data. - for (int i = 0; i < dircount; i++) - { - TiffDirEntry dirEntry = data[i]; - - short temp = (short)dirEntry.tdir_tag; - SwabShort(ref temp); - dirEntry.tdir_tag = (TiffTag)(ushort)temp; - - temp = (short)dirEntry.tdir_type; - SwabShort(ref temp); - dirEntry.tdir_type = (TiffType)temp; - - SwabLong(ref dirEntry.tdir_count); - SwabUInt(ref dirEntry.tdir_offset); - } - - dircount = (short)nfields; - SwabShort(ref dircount); - - int tempOff = (int)pdiroff; - SwabLong(ref tempOff); - pdiroff = tempOff; - } - - seekFile(m_diroff, SeekOrigin.Begin); - if (!writeShortOK(dircount)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory count"); - return false; - } - - if (!writeDirEntryOK(data, dirsize / TiffDirEntry.SizeInBytes)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory contents"); - return false; - } - - if (!writeIntOK((int)pdiroff)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory link"); - return false; - } - - return true; - } - - internal static void SwabUInt(ref uint lp) - { - byte[] cp = new byte[4]; - cp[0] = (byte)lp; - cp[1] = (byte)(lp >> 8); - cp[2] = (byte)(lp >> 16); - cp[3] = (byte)(lp >> 24); - - byte t = cp[3]; - cp[3] = cp[0]; - cp[0] = t; - - t = cp[2]; - cp[2] = cp[1]; - cp[1] = t; - - lp = (uint)(cp[0] & 0xFF); - lp += (uint)((cp[1] & 0xFF) << 8); - lp += (uint)((cp[2] & 0xFF) << 16); - lp += (uint)(cp[3] << 24); - } - - internal static uint[] Realloc(uint[] buffer, int elementCount, int newElementCount) - { - uint[] newBuffer = new uint[newElementCount]; - if (buffer != null) - { - int copyLength = Math.Min(elementCount, newElementCount); - Buffer.BlockCopy(buffer, 0, newBuffer, 0, copyLength * sizeof(uint)); - } - - return newBuffer; - } - - internal static TiffFieldInfo[] Realloc(TiffFieldInfo[] buffer, int elementCount, int newElementCount) - { - TiffFieldInfo[] newBuffer = new TiffFieldInfo[newElementCount]; - - if (buffer != null) - { - int copyLength = Math.Min(elementCount, newElementCount); - Array.Copy(buffer, newBuffer, copyLength); - } - - return newBuffer; - } - - internal static TiffTagValue[] Realloc(TiffTagValue[] buffer, int elementCount, int newElementCount) - { - TiffTagValue[] newBuffer = new TiffTagValue[newElementCount]; - - if (buffer != null) - { - int copyLength = Math.Min(elementCount, newElementCount); - Array.Copy(buffer, newBuffer, copyLength); - } - - return newBuffer; - } - - internal bool setCompressionScheme(Compression scheme) - { - TiffCodec c = FindCodec(scheme); - if (c == null) - { - /* - * Don't treat an unknown compression scheme as an error. - * This permits applications to open files with data that - * the library does not have builtin support for, but which - * may still be meaningful. - */ - c = m_builtInCodecs[0]; - } - - m_decodestatus = c.CanDecode; - m_flags &= ~(TiffFlags.NoBitRev | TiffFlags.NoReadRaw); - - m_currentCodec = c; - return c.Init(); - } - - /// - /// post decoding routine - /// - private void postDecode(byte[] buffer, int offset, int count) - { - switch (m_postDecodeMethod) - { - case PostDecodeMethodType.pdmSwab16Bit: - swab16BitData(buffer, offset, count); - break; - case PostDecodeMethodType.pdmSwab24Bit: - swab24BitData(buffer, offset, count); - break; - case PostDecodeMethodType.pdmSwab32Bit: - swab32BitData(buffer, offset, count); - break; - case PostDecodeMethodType.pdmSwab64Bit: - swab64BitData(buffer, offset, count); - break; - } - } - - private uint insertData(TiffType type, int v) - { - int t = (int)type; - if (m_header.tiff_magic == TIFF_BIGENDIAN) - return (((uint)v & m_typemask[t]) << m_typeshift[t]); - - return ((uint)v & m_typemask[t]); - } - - private static void resetFieldBit(int[] fields, short f) - { - fields[f / 32] &= ~BITn(f); - } - - private static bool fieldSet(int[] fields, short f) - { - return ((fields[f / 32] & BITn(f)) != 0); - } - - private bool writeRational(TiffType type, TiffTag tag, ref TiffDirEntry dir, float v) - { - dir.tdir_tag = tag; - dir.tdir_type = type; - dir.tdir_count = 1; - - float[] a = new float[1]; - a[0] = v; - if (!writeRationalArray(ref dir, a)) - return false; - - return true; - } - - private bool writeRationalPair(TiffDirEntry[] entries, int dirOffset, TiffType type, TiffTag tag1, float v1, TiffTag tag2, float v2) - { - if (!writeRational(type, tag1, ref entries[dirOffset], v1)) - return false; - - if (!writeRational(type, tag2, ref entries[dirOffset + 1], v2)) - return false; - - return true; - } - - /// - /// Writes the contents of the current directory to the specified file. - /// - /// This routine doesn't handle overwriting a directory with - /// auxiliary storage that's been changed. - private bool writeDirectory(bool done) - { - if (m_mode == O_RDONLY) - return true; - - // Clear write state so that subsequent images with different - // characteristics get the right buffers setup for them. - if (done) - { - if ((m_flags & TiffFlags.PostEncode) == TiffFlags.PostEncode) - { - m_flags &= ~TiffFlags.PostEncode; - if (!m_currentCodec.PostEncode()) - { - ErrorExt(this, m_clientdata, m_name, "Error post-encoding before directory write"); - return false; - } - } - - // shutdown encoder - m_currentCodec.Close(); - - // Flush any data that might have been written by the - // compression close+cleanup routines. - if (m_rawcc > 0 && (m_flags & TiffFlags.BeenWriting) == TiffFlags.BeenWriting && !flushData1()) - { - ErrorExt(this, m_clientdata, m_name, "Error flushing data before directory write"); - return false; - } - - if ((m_flags & TiffFlags.MyBuffer) == TiffFlags.MyBuffer && m_rawdata != null) - { - m_rawdata = null; - m_rawcc = 0; - m_rawdatasize = 0; - } - - m_flags &= ~(TiffFlags.BeenWriting | TiffFlags.BufferSetup); - } - - // Size the directory so that we can calculate offsets for the data - // items that aren't kept in-place in each field. - int nfields = 0; - for (int b = 0; b <= FieldBit.Last; b++) - { - if (fieldSet(b) && b != FieldBit.Custom) - nfields += (b < FieldBit.SubFileType ? 2 : 1); - } - - nfields += m_dir.td_customValueCount; - int dirsize = nfields * TiffDirEntry.SizeInBytes; - TiffDirEntry[] data = new TiffDirEntry[nfields]; - for (int i = 0; i < nfields; i++) - data[i] = new TiffDirEntry(); - - // Directory hasn't been placed yet, put it at the end of the file - // and link it into the existing directory structure. - if (m_diroff == 0 && !linkDirectory()) - return false; - - m_dataoff = m_diroff + sizeof(short) + (uint)dirsize + sizeof(int); - if ((m_dataoff & 1) != 0) - m_dataoff++; - - seekFile(m_dataoff, SeekOrigin.Begin); - m_curdir++; - int dir = 0; - - // Setup external form of directory entries and write data items. - int[] fields = new int[FieldBit.SetLongs]; - Buffer.BlockCopy(m_dir.td_fieldsset, 0, fields, 0, FieldBit.SetLongs * sizeof(int)); - - // Write out ExtraSamples tag only if extra samples are present in the data. - if (fieldSet(fields, FieldBit.ExtraSamples) && m_dir.td_extrasamples == 0) - { - resetFieldBit(fields, FieldBit.ExtraSamples); - nfields--; - dirsize -= TiffDirEntry.SizeInBytes; - } // XXX - - for (int fi = 0, nfi = m_nfields; nfi > 0; nfi--, fi++) - { - TiffFieldInfo fip = m_fieldinfo[fi]; - - // For custom fields, we test to see if the custom field is set - // or not. For normal fields, we just use the fieldSet test. - if (fip.Bit == FieldBit.Custom) - { - bool is_set = false; - for (int ci = 0; ci < m_dir.td_customValueCount; ci++) - is_set |= (m_dir.td_customValues[ci].info == fip); - - if (!is_set) - continue; - } - else if (!fieldSet(fields, fip.Bit)) - { - continue; - } - - // Handle other fields. - - TiffTag tag = (TiffTag)FieldBit.Ignore; - switch (fip.Bit) - { - case FieldBit.StripOffsets: - // We use one field bit for both strip and tile - // offsets, and so must be careful in selecting - // the appropriate field descriptor (so that tags - // are written in sorted order). - tag = IsTiled() ? TiffTag.TileOffsets : TiffTag.StripOffsets; - if (tag != fip.Tag) - continue; - - data[dir].tdir_tag = tag; - data[dir].tdir_type = TiffType.Long; - data[dir].tdir_count = m_dir.td_nstrips; - if (!writeLongArray(ref data[dir], m_dir.td_stripoffset)) - return false; - - break; - case FieldBit.StripByteCounts: - // We use one field bit for both strip and tile byte - // counts, and so must be careful in selecting the - // appropriate field descriptor (so that tags are - // written in sorted order). - tag = IsTiled() ? TiffTag.TileByteCounts : TiffTag.StripByteCounts; - if (tag != fip.Tag) - continue; - - data[dir].tdir_tag = tag; - data[dir].tdir_type = TiffType.Long; - data[dir].tdir_count = m_dir.td_nstrips; - if (!writeLongArray(ref data[dir], m_dir.td_stripbytecount)) - return false; - - break; - case FieldBit.RowsPerStrip: - setupShortLong(TiffTag.RowsPerStrip, ref data[dir], m_dir.td_rowsperstrip); - break; - case FieldBit.ColorMap: - if (!writeShortTable(TiffTag.Colormap, ref data[dir], 3, m_dir.td_colormap)) - return false; - - break; - case FieldBit.ImageDimensions: - setupShortLong(TiffTag.ImageWidth, ref data[dir++], m_dir.td_imagewidth); - setupShortLong(TiffTag.ImageLength, ref data[dir], m_dir.td_imagelength); - break; - case FieldBit.TileDimensions: - setupShortLong(TiffTag.TileWidth, ref data[dir++], m_dir.td_tilewidth); - setupShortLong(TiffTag.TileLength, ref data[dir], m_dir.td_tilelength); - break; - case FieldBit.Compression: - setupShort(TiffTag.Compression, ref data[dir], (short)m_dir.td_compression); - break; - case FieldBit.Photometric: - setupShort(TiffTag.Photometric, ref data[dir], (short)m_dir.td_photometric); - break; - case FieldBit.Position: - if (!writeRationalPair(data, dir, TiffType.Rational, TiffTag.XPosition, m_dir.td_xposition, TiffTag.YPosition, m_dir.td_yposition)) - return false; - - dir++; - break; - case FieldBit.Resolution: - if (!writeRationalPair(data, dir, TiffType.Rational, TiffTag.XResolution, m_dir.td_xresolution, TiffTag.YResolution, m_dir.td_yresolution)) - return false; - - dir++; - break; - case FieldBit.BitsPerSample: - case FieldBit.MinSampleValue: - case FieldBit.MaxSampleValue: - case FieldBit.SampleFormat: - if (!writePerSampleShorts(fip.Tag, ref data[dir])) - return false; - - break; - case FieldBit.SMinSampleValue: - case FieldBit.SMaxSampleValue: - if (!writePerSampleAnys(sampleToTagType(), fip.Tag, ref data[dir])) - return false; - - break; - case FieldBit.PageNumber: - case FieldBit.HalftoneHints: - case FieldBit.YCbCrSubsampling: - if (!setupShortPair(fip.Tag, ref data[dir])) - return false; - - break; - case FieldBit.InkNames: - if (!writeInkNames(ref data[dir])) - return false; - - break; - case FieldBit.TransferFunction: - if (!writeTransferFunction(ref data[dir])) - return false; - - break; - case FieldBit.SubIFD: - // XXX: Always write this field using Long type - // for backward compatibility. - data[dir].tdir_tag = fip.Tag; - data[dir].tdir_type = TiffType.Long; - data[dir].tdir_count = m_dir.td_nsubifd; - if (!writeLongArray(ref data[dir], m_dir.td_subifd)) - return false; - - // Total hack: if this directory includes a SubIFD - // tag then force the next directories to be - // written as "sub directories" of this one. This - // is used to write things like thumbnails and - // image masks that one wants to keep out of the - // normal directory linkage access mechanism. - if (data[dir].tdir_count > 0) - { - m_flags |= TiffFlags.InSubIFD; - m_nsubifd = (short)data[dir].tdir_count; - if (data[dir].tdir_count > 1) - { - m_subifdoff = data[dir].tdir_offset; - } - else - { - m_subifdoff = m_diroff + sizeof(short) + - (uint)dir * TiffDirEntry.SizeInBytes + - sizeof(short) * 2 + sizeof(int); - } - } - break; - default: - // XXX: Should be fixed and removed. - if (fip.Tag == TiffTag.DotRange) - { - if (!setupShortPair(fip.Tag, ref data[dir])) - return false; - } - else if (!writeNormalTag(ref data[dir], fip)) - return false; - - break; - } - - dir++; - - if (fip.Bit != FieldBit.Custom) - resetFieldBit(fields, fip.Bit); - } - - // Write directory. - - short dircount = (short)nfields; - uint diroff = m_nextdiroff; - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - // The file's byte order is opposite to the native machine - // architecture. We overwrite the directory information with - // impunity because it'll be released below after we write it to - // the file. Note that all the other tag construction routines - // assume that we do this byte-swapping; i.e. they only - // byte-swap indirect data. - for (dir = 0; dircount != 0; dir++, dircount--) - { - short temp = (short)data[dir].tdir_tag; - SwabShort(ref temp); - data[dir].tdir_tag = (TiffTag)(ushort)temp; - - temp = (short)data[dir].tdir_type; - SwabShort(ref temp); - data[dir].tdir_type = (TiffType)temp; - - SwabLong(ref data[dir].tdir_count); - SwabUInt(ref data[dir].tdir_offset); - } - - dircount = (short)nfields; - SwabShort(ref dircount); - SwabUInt(ref diroff); - } - - seekFile(m_diroff, SeekOrigin.Begin); - if (!writeShortOK(dircount)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory count"); - return false; - } - - if (!writeDirEntryOK(data, dirsize / TiffDirEntry.SizeInBytes)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory contents"); - return false; - } - - if (!writeIntOK((int)diroff)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing directory link"); - return false; - } - - if (done) - { - FreeDirectory(); - m_flags &= ~TiffFlags.DirtyDirect; - m_currentCodec.Cleanup(); - - // Reset directory-related state for subsequent directories. - CreateDirectory(); - } - - return true; - } - - /// - /// Writes tags that are not special cased. - /// - private bool writeNormalTag(ref TiffDirEntry dir, TiffFieldInfo fip) - { - short wc = fip.WriteCount; - dir.tdir_tag = fip.Tag; - dir.tdir_type = fip.Type; - dir.tdir_count = wc; - - switch (fip.Type) - { - case TiffType.Short: - case TiffType.SShort: - if (fip.PassCount) - { - short[] wp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - wp = result[1].ToShortArray(); - - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - wp = result[1].ToShortArray(); - dir.tdir_count = wc; - } - - if (!writeShortArray(ref dir, wp)) - return false; - } - else - { - if (wc == 1) - { - FieldValue[] result = GetField(fip.Tag); - short sv = result[0].ToShort(); - dir.tdir_offset = insertData(dir.tdir_type, sv); - } - else - { - FieldValue[] result = GetField(fip.Tag); - short[] wp = result[0].ToShortArray(); - if (!writeShortArray(ref dir, wp)) - return false; - } - } - break; - case TiffType.Long: - case TiffType.SLong: - case TiffType.IFD: - if (fip.PassCount) - { - int[] lp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - lp = result[1].ToIntArray(); - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - lp = result[1].ToIntArray(); - dir.tdir_count = wc; - } - - if (!writeLongArray(ref dir, lp)) - return false; - } - else - { - if (wc == 1) - { - // XXX handle Long->Short conversion - FieldValue[] result = GetField(fip.Tag); - dir.tdir_offset = result[0].ToUInt(); - } - else - { - int[] lp; - FieldValue[] result = GetField(fip.Tag); - lp = result[0].ToIntArray(); - if (!writeLongArray(ref dir, lp)) - return false; - } - } - break; - case TiffType.Rational: - case TiffType.SRational: - if (fip.PassCount) - { - float[] fp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - fp = result[1].ToFloatArray(); - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - fp = result[1].ToFloatArray(); - dir.tdir_count = wc; - } - - if (!writeRationalArray(ref dir, fp)) - return false; - } - else - { - if (wc == 1) - { - float[] fv = new float[1]; - FieldValue[] result = GetField(fip.Tag); - fv[0] = result[0].ToFloat(); - if (!writeRationalArray(ref dir, fv)) - return false; - } - else - { - FieldValue[] result = GetField(fip.Tag); - float[] fp = result[0].ToFloatArray(); - if (!writeRationalArray(ref dir, fp)) - return false; - } - } - break; - case TiffType.Float: - if (fip.PassCount) - { - float[] fp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - fp = result[1].ToFloatArray(); - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - fp = result[1].ToFloatArray(); - dir.tdir_count = wc; - } - - if (!writeFloatArray(ref dir, fp)) - return false; - } - else - { - if (wc == 1) - { - float[] fv = new float[1]; - FieldValue[] result = GetField(fip.Tag); - fv[0] = result[0].ToFloat(); - if (!writeFloatArray(ref dir, fv)) - return false; - } - else - { - FieldValue[] result = GetField(fip.Tag); - float[] fp = result[0].ToFloatArray(); - if (!writeFloatArray(ref dir, fp)) - return false; - } - } - break; - case TiffType.Double: - if (fip.PassCount) - { - double[] dp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - dp = result[1].ToDoubleArray(); - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - dp = result[1].ToDoubleArray(); - dir.tdir_count = wc; - } - - if (!writeDoubleArray(ref dir, dp)) - return false; - } - else - { - if (wc == 1) - { - double[] dv = new double[1]; - FieldValue[] result = GetField(fip.Tag); - dv[0] = result[0].ToDouble(); - if (!writeDoubleArray(ref dir, dv)) - return false; - } - else - { - FieldValue[] result = GetField(fip.Tag); - double[] dp = result[0].ToDoubleArray(); - if (!writeDoubleArray(ref dir, dp)) - return false; - } - } - break; - case TiffType.ASCII: - { - FieldValue[] result = GetField(fip.Tag); - - string cp; - if (fip.PassCount) - cp = result[1].ToString(); - else - cp = result[0].ToString(); - - // add zero ('\0') at the end of the byte array - byte[] stringBytes = Latin1Encoding.GetBytes(cp); - byte[] totalBytes = new byte[stringBytes.Length + 1]; - Buffer.BlockCopy(stringBytes, 0, totalBytes, 0, stringBytes.Length); - - dir.tdir_count = totalBytes.Length; - if (!writeByteArray(ref dir, totalBytes)) - return false; - } - break; - - case TiffType.Byte: - case TiffType.SByte: - if (fip.PassCount) - { - byte[] cp; - int wc2; - if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - cp = result[1].ToByteArray(); - dir.tdir_count = wc2; - } - else - { - // Assume TiffFieldInfo.Variable - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - cp = result[1].ToByteArray(); - dir.tdir_count = wc; - } - - if (!writeByteArray(ref dir, cp)) - return false; - } - else - { - if (wc == 1) - { - byte[] cv = new byte[1]; - FieldValue[] result = GetField(fip.Tag); - cv[0] = result[0].ToByte(); - if (!writeByteArray(ref dir, cv)) - return false; - } - else - { - FieldValue[] result = GetField(fip.Tag); - byte[] cp = result[0].ToByteArray(); - if (!writeByteArray(ref dir, cp)) - return false; - } - } - break; - - case TiffType.Undefined: - { - byte[] cp; - int wc2; - if (wc == TiffFieldInfo.Variable) - { - FieldValue[] result = GetField(fip.Tag); - wc = result[0].ToShort(); - cp = result[1].ToByteArray(); - dir.tdir_count = wc; - } - else if (wc == TiffFieldInfo.Variable2) - { - FieldValue[] result = GetField(fip.Tag); - wc2 = result[0].ToInt(); - cp = result[1].ToByteArray(); - dir.tdir_count = wc2; - } - else - { - FieldValue[] result = GetField(fip.Tag); - cp = result[0].ToByteArray(); - } - - if (!writeByteArray(ref dir, cp)) - return false; - } - break; - - case TiffType.NoType: - break; - } - - return true; - } - - /// - /// Setups a directory entry with either a Short or Long type - /// according to the value. - /// - private void setupShortLong(TiffTag tag, ref TiffDirEntry dir, int v) - { - dir.tdir_tag = tag; - dir.tdir_count = 1; - if (v > 0xffffL) - { - dir.tdir_type = TiffType.Long; - dir.tdir_offset = (uint)v; - } - else - { - dir.tdir_type = TiffType.Short; - dir.tdir_offset = insertData(TiffType.Short, v); - } - } - - /// - /// Setups a Short directory entry - /// - private void setupShort(TiffTag tag, ref TiffDirEntry dir, short v) - { - dir.tdir_tag = tag; - dir.tdir_count = 1; - dir.tdir_type = TiffType.Short; - dir.tdir_offset = insertData(TiffType.Short, v); - } - - /* - * Setup a directory entry that references a - * samples/pixel array of Short values and - * (potentially) write the associated indirect - * values. - */ - private bool writePerSampleShorts(TiffTag tag, ref TiffDirEntry dir) - { - short[] w = new short[m_dir.td_samplesperpixel]; - - FieldValue[] result = GetField(tag); - short v = result[0].ToShort(); - - for (short i = 0; i < m_dir.td_samplesperpixel; i++) - w[i] = v; - - dir.tdir_tag = tag; - dir.tdir_type = TiffType.Short; - dir.tdir_count = m_dir.td_samplesperpixel; - bool status = writeShortArray(ref dir, w); - return status; - } - - /* - * Setup a directory entry that references a samples/pixel array of ``type'' - * values and (potentially) write the associated indirect values. The source - * data from GetField() for the specified tag must be returned as double. - */ - private bool writePerSampleAnys(TiffType type, TiffTag tag, ref TiffDirEntry dir) - { - double[] w = new double[m_dir.td_samplesperpixel]; - - FieldValue[] result = GetField(tag); - double v = result[0].ToDouble(); - - for (short i = 0; i < m_dir.td_samplesperpixel; i++) - w[i] = v; - - bool status = writeAnyArray(type, tag, ref dir, m_dir.td_samplesperpixel, w); - return status; - } - - /* - * Setup a pair of shorts that are returned by - * value, rather than as a reference to an array. - */ - private bool setupShortPair(TiffTag tag, ref TiffDirEntry dir) - { - short[] v = new short[2]; - FieldValue[] result = GetField(tag); - v[0] = result[0].ToShort(); - v[1] = result[1].ToShort(); - - dir.tdir_tag = tag; - dir.tdir_type = TiffType.Short; - dir.tdir_count = 2; - return writeShortArray(ref dir, v); - } - - /// - /// Setup a directory entry for an NxM table of shorts, where M is - /// known to be 2**bitspersample, and write the associated indirect data. - /// - private bool writeShortTable(TiffTag tag, ref TiffDirEntry dir, int n, short[][] table) - { - dir.tdir_tag = tag; - dir.tdir_type = TiffType.Short; - - // XXX -- yech, fool writeData - dir.tdir_count = 1 << m_dir.td_bitspersample; - uint off = m_dataoff; - for (int i = 0; i < n; i++) - { - if (!writeData(ref dir, table[i], dir.tdir_count)) - return false; - } - - dir.tdir_count *= n; - dir.tdir_offset = off; - return true; - } - - /// - /// Write/copy data associated with an ASCII or opaque tag value. - /// - private bool writeByteArray(ref TiffDirEntry dir, byte[] cp) - { - if (dir.tdir_count <= 4) - { - if (m_header.tiff_magic == TIFF_BIGENDIAN) - { - dir.tdir_offset = (uint)(cp[0] << 24); - if (dir.tdir_count >= 2) - dir.tdir_offset |= (uint)(cp[1] << 16); - - if (dir.tdir_count >= 3) - dir.tdir_offset |= (uint)(cp[2] << 8); - - if (dir.tdir_count == 4) - dir.tdir_offset |= cp[3]; - } - else - { - dir.tdir_offset = cp[0]; - if (dir.tdir_count >= 2) - dir.tdir_offset |= (uint)(cp[1] << 8); - - if (dir.tdir_count >= 3) - dir.tdir_offset |= (uint)(cp[2] << 16); - - if (dir.tdir_count == 4) - dir.tdir_offset |= (uint)(cp[3] << 24); - } - - return true; - } - - return writeData(ref dir, cp, dir.tdir_count); - } - - /// - /// Setup a directory entry of an array of Short or SShort and write - /// the associated indirect values. - /// - private bool writeShortArray(ref TiffDirEntry dir, short[] v) - { - if (dir.tdir_count <= 2) - { - if (m_header.tiff_magic == TIFF_BIGENDIAN) - { - dir.tdir_offset = (uint)(v[0] << 16); - if (dir.tdir_count == 2) - dir.tdir_offset |= (uint)(v[1] & 0xffff); - } - else - { - dir.tdir_offset = (uint)(v[0] & 0xffff); - if (dir.tdir_count == 2) - dir.tdir_offset |= (uint)(v[1] << 16); - } - - return true; - } - - return writeData(ref dir, v, dir.tdir_count); - } - - /// - /// Setup a directory entry of an array of Long or SLong and write the - /// associated indirect values. - /// - private bool writeLongArray(ref TiffDirEntry dir, int[] v) - { - if (dir.tdir_count == 1) - { - dir.tdir_offset = (uint)v[0]; - return true; - } - - return writeData(ref dir, v, dir.tdir_count); - } - - private bool writeLongArray(ref TiffDirEntry dir, uint[] v) - { - int[] temp = new int[v.Length]; - Buffer.BlockCopy(v, 0, temp, 0, v.Length * sizeof(uint)); - return writeLongArray(ref dir, temp); - } - - /// - /// Setup a directory entry of an array of Rational or SRational and - /// write the associated indirect values. - /// - private bool writeRationalArray(ref TiffDirEntry dir, float[] v) - { - int[] t = new int[2 * dir.tdir_count]; - for (int i = 0; i < dir.tdir_count; i++) - { - int sign = 1; - float fv = v[i]; - if (fv < 0) - { - if (dir.tdir_type == TiffType.Rational) - { - WarningExt(this, m_clientdata, m_name, - "\"{0}\": Information lost writing value ({1:G}) as (unsigned) Rational", - FieldWithTag(dir.tdir_tag).Name, fv); - fv = 0; - } - else - { - fv = -fv; - sign = -1; - } - } - - int den = 1; - if (fv > 0) - { - while (fv < (1L << (31 - 3)) && den < (1L << (31 - 3))) - { - fv *= 1 << 3; - den *= 1 << 3; - } - } - - t[2 * i + 0] = (int)(sign * (fv + 0.5)); - t[2 * i + 1] = den; - } - - return writeData(ref dir, t, 2 * dir.tdir_count); - } - - private bool writeFloatArray(ref TiffDirEntry dir, float[] v) - { - if (dir.tdir_count == 1) - { - dir.tdir_offset = BitConverter.ToUInt32(BitConverter.GetBytes(v[0]), 0); - return true; - } - - return writeData(ref dir, v, dir.tdir_count); - } - - private bool writeDoubleArray(ref TiffDirEntry dir, double[] v) - { - return writeData(ref dir, v, dir.tdir_count); - } - - /// - /// Writes an array of "type" values for a specified tag (i.e. this is - /// a tag which is allowed to have different types, e.g. SMaxSampleType). - /// Internally the data values are represented as double since a double - /// can hold any of the TIFF tag types (yes, this should really be an abstract - /// type tany_t for portability). The data is converted into the specified - /// type in a temporary buffer and then handed off to the appropriate array - /// writer. - /// - private bool writeAnyArray(TiffType type, TiffTag tag, ref TiffDirEntry dir, int n, double[] v) - { - dir.tdir_tag = tag; - dir.tdir_type = type; - dir.tdir_count = n; - - bool failed = false; - switch (type) - { - case TiffType.Byte: - case TiffType.SByte: - { - byte[] bp = new byte[n]; - for (int i = 0; i < n; i++) - bp[i] = (byte)v[i]; - - if (!writeByteArray(ref dir, bp)) - failed = true; - } - break; - case TiffType.Short: - case TiffType.SShort: - { - short[] bp = new short[n]; - for (int i = 0; i < n; i++) - bp[i] = (short)v[i]; - - if (!writeShortArray(ref dir, bp)) - failed = true; - } - break; - case TiffType.Long: - case TiffType.SLong: - { - int[] bp = new int[n]; - for (int i = 0; i < n; i++) - bp[i] = (int)v[i]; - - if (!writeLongArray(ref dir, bp)) - failed = true; - } - break; - case TiffType.Float: - { - float[] bp = new float[n]; - for (int i = 0; i < n; i++) - bp[i] = (float)v[i]; - - if (!writeFloatArray(ref dir, bp)) - failed = true; - } - break; - case TiffType.Double: - if (!writeDoubleArray(ref dir, v)) - failed = true; - - break; - - default: - // NoType - // ASCII - // Undefined - // Rational - // SRational - failed = true; - break; - } - - return !failed; - } - - private bool writeTransferFunction(ref TiffDirEntry dir) - { - // Check if the table can be written as a single column, or if it - // must be written as 3 columns. Note that we write a 3-column tag - // if there are 2 samples/pixel and a single column of data - // won't suffice--hmm. - int u = m_dir.td_samplesperpixel - m_dir.td_extrasamples; - int ncols = 1; - bool reCheck = false; - int n = 1 << m_dir.td_bitspersample; - - if (u < 0 || u > 2) - { - if (Compare(m_dir.td_transferfunction[0], m_dir.td_transferfunction[2], n) != 0) - ncols = 3; - else - reCheck = true; - } - - if (u == 2 || reCheck) - { - if (Compare(m_dir.td_transferfunction[0], m_dir.td_transferfunction[1], n) != 0) - ncols = 3; - } - - return writeShortTable(TiffTag.TransferFunction, ref dir, ncols, m_dir.td_transferfunction); - } - - private bool writeInkNames(ref TiffDirEntry dir) - { - dir.tdir_tag = TiffTag.InkNames; - dir.tdir_type = TiffType.ASCII; - byte[] bytes = Latin1Encoding.GetBytes(m_dir.td_inknames); - dir.tdir_count = bytes.Length; - return writeByteArray(ref dir, bytes); - } - - /// - /// Writes a contiguous directory item. - /// - private bool writeData(ref TiffDirEntry dir, byte[] buffer, int count) - { - dir.tdir_offset = m_dataoff; - count = (int)dir.tdir_count * DataWidth(dir.tdir_type); - if (seekOK(dir.tdir_offset) && writeOK(buffer, 0, count)) - { - m_dataoff += (uint)((count + 1) & ~1); - return true; - } - - ErrorExt(this, m_clientdata, m_name, - "Error writing data for field \"{0}\"", - FieldWithTag(dir.tdir_tag).Name); - return false; - } - - private bool writeData(ref TiffDirEntry dir, short[] buffer, int count) - { - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabArrayOfShort(buffer, count); - - int byteCount = count * sizeof(short); - byte[] bytes = new byte[byteCount]; - ShortsToByteArray(buffer, 0, count, bytes, 0); - return writeData(ref dir, bytes, byteCount); - } - - private bool writeData(ref TiffDirEntry dir, int[] cp, int cc) - { - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabArrayOfLong(cp, cc); - - int byteCount = cc * sizeof(int); - byte[] bytes = new byte[byteCount]; - IntsToByteArray(cp, 0, cc, bytes, 0); - bool res = writeData(ref dir, bytes, byteCount); - return res; - } - - private bool writeData(ref TiffDirEntry dir, float[] cp, int cc) - { - int[] ints = new int[cc]; - for (int i = 0; i < cc; i++) - { - byte[] result = BitConverter.GetBytes(cp[i]); - ints[i] = BitConverter.ToInt32(result, 0); - } - - return writeData(ref dir, ints, cc); - } - - private bool writeData(ref TiffDirEntry dir, double[] buffer, int count) - { - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabArrayOfDouble(buffer, count); - - byte[] bytes = new byte[count * sizeof(double)]; - Buffer.BlockCopy(buffer, 0, bytes, 0, bytes.Length); - - return writeData(ref dir, bytes, count * sizeof(double)); - } - - /// - /// Link the current directory into the directory chain for the file. - /// - private bool linkDirectory() - { - const string module = "linkDirectory"; - - m_diroff = (uint)((seekFile(0, SeekOrigin.End) + 1) & ~1); - uint diroff = m_diroff; - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabUInt(ref diroff); - - // Handle SubIFDs - - if ((m_flags & TiffFlags.InSubIFD) == TiffFlags.InSubIFD) - { - seekFile(m_subifdoff, SeekOrigin.Begin); - if (!writeIntOK((int)diroff)) - { - ErrorExt(this, m_clientdata, module, - "{0}: Error writing SubIFD directory link", m_name); - return false; - } - - // Advance to the next SubIFD or, if this is the last one - // configured, revert back to the normal directory linkage. - --m_nsubifd; - - if (m_nsubifd != 0) - m_subifdoff += sizeof(int); - else - m_flags &= ~TiffFlags.InSubIFD; - - return true; - } - - if (m_header.tiff_diroff == 0) - { - // First directory, overwrite offset in header. - - m_header.tiff_diroff = m_diroff; - seekFile(TiffHeader.TIFF_MAGIC_SIZE + TiffHeader.TIFF_VERSION_SIZE, SeekOrigin.Begin); - if (!writeIntOK((int)diroff)) - { - ErrorExt(this, m_clientdata, m_name, "Error writing TIFF header"); - return false; - } - - return true; - } - - // Not the first directory, search to the last and append. - - uint nextdir = m_header.tiff_diroff; - do - { - short dircount; - if (!seekOK(nextdir) || !readShortOK(out dircount)) - { - ErrorExt(this, m_clientdata, module, "Error fetching directory count"); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabShort(ref dircount); - - seekFile(dircount * TiffDirEntry.SizeInBytes, SeekOrigin.Current); - if (!readUIntOK(out nextdir)) - { - ErrorExt(this, m_clientdata, module, "Error fetching directory link"); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabUInt(ref nextdir); - } - while (nextdir != 0); - - // get current offset - long off = seekFile(0, SeekOrigin.Current); - seekFile(off - sizeof(int), SeekOrigin.Begin); - - if (!writeIntOK((int)diroff)) - { - ErrorExt(this, m_clientdata, module, "Error writing directory link"); - return false; - } - - return true; - } - - private int extractData(TiffDirEntry dir) - { - int type = (int)dir.tdir_type; - if (m_header.tiff_magic == TIFF_BIGENDIAN) - return (int)((dir.tdir_offset >> m_typeshift[type]) & m_typemask[type]); - - return (int)(dir.tdir_offset & m_typemask[type]); - } - - private bool byteCountLooksBad(TiffDirectory td) - { - /* - * Assume we have wrong StripByteCount value (in case of single strip) in - * following cases: - * - it is equal to zero along with StripOffset; - * - it is larger than file itself (in case of uncompressed image); - * - it is smaller than the size of the bytes per row multiplied on the - * number of rows. The last case should not be checked in the case of - * writing new image, because we may do not know the exact strip size - * until the whole image will be written and directory dumped out. - */ - return - ( - (td.td_stripbytecount[0] == 0 && td.td_stripoffset[0] != 0) || - (td.td_compression == Compression.None && td.td_stripbytecount[0] > getFileSize() - td.td_stripoffset[0]) || - (m_mode == O_RDONLY && td.td_compression == Compression.None && td.td_stripbytecount[0] < ScanlineSize() * td.td_imagelength) - ); - } - - private static int howMany8(int x) - { - return ((x & 0x07) != 0 ? (x >> 3) + 1 : x >> 3); - } - - private bool estimateStripByteCounts(TiffDirEntry[] dir, short dircount) - { - const string module = "estimateStripByteCounts"; - - m_dir.td_stripbytecount = new uint[m_dir.td_nstrips]; - - if (m_dir.td_compression != Compression.None) - { - long space = TiffHeader.SizeInBytes + sizeof(short) + (dircount * TiffDirEntry.SizeInBytes) + sizeof(int); - long filesize = getFileSize(); - - // calculate amount of space used by indirect values - for (short n = 0; n < dircount; n++) - { - int cc = DataWidth((TiffType)dir[n].tdir_type); - if (cc == 0) - { - ErrorExt(this, m_clientdata, module, - "{0}: Cannot determine size of unknown tag type {1}", - m_name, dir[n].tdir_type); - return false; - } - - cc = cc * dir[n].tdir_count; - if (cc > sizeof(int)) - space += cc; - } - - space = filesize - space; - if (m_dir.td_planarconfig == PlanarConfig.Separate) - space /= m_dir.td_samplesperpixel; - - int strip = 0; - for (; strip < m_dir.td_nstrips; strip++) - m_dir.td_stripbytecount[strip] = (uint)space; - - // This gross hack handles the case were the offset to the last - // strip is past the place where we think the strip should begin. - // Since a strip of data must be contiguous, it's safe to assume - // that we've overestimated the amount of data in the strip and - // trim this number back accordingly. - strip--; - if ((m_dir.td_stripoffset[strip] + m_dir.td_stripbytecount[strip]) > filesize) - m_dir.td_stripbytecount[strip] = (uint)(filesize - m_dir.td_stripoffset[strip]); - } - else if (IsTiled()) - { - int bytespertile = TileSize(); - for (int strip = 0; strip < m_dir.td_nstrips; strip++) - m_dir.td_stripbytecount[strip] = (uint)bytespertile; - } - else - { - int rowbytes = ScanlineSize(); - int rowsperstrip = m_dir.td_imagelength / m_dir.td_stripsperimage; - for (int strip = 0; strip < m_dir.td_nstrips; strip++) - m_dir.td_stripbytecount[strip] = (uint)(rowbytes * rowsperstrip); - } - - setFieldBit(FieldBit.StripByteCounts); - if (!fieldSet(FieldBit.RowsPerStrip)) - m_dir.td_rowsperstrip = m_dir.td_imagelength; - - return true; - } - - private void missingRequired(string tagname) - { - const string module = "missingRequired"; - ErrorExt(this, m_clientdata, module, - "{0}: TIFF directory is missing required \"{1}\" field", - m_name, tagname); - } - - private int fetchFailed(TiffDirEntry dir) - { - ErrorExt(this, m_clientdata, m_name, - "Error fetching data for field \"{0}\"", FieldWithTag(dir.tdir_tag).Name); - return 0; - } - - private static int readDirectoryFind(TiffDirEntry[] dir, short dircount, TiffTag tagid) - { - for (short n = 0; n < dircount; n++) - { - if (dir[n].tdir_tag == tagid) - return n; - } - - return -1; - } - - /// - /// Checks the directory offset against the list of already seen directory - /// offsets. - /// - /// This is a trick to prevent IFD looping. The one can - /// create TIFF file with looped directory pointers. We will maintain a - /// list of already seen directories and check every IFD offset against - /// that list. - private bool checkDirOffset(uint diroff) - { - if (diroff == 0) - { - // no more directories - return false; - } - - for (short n = 0; n < m_dirnumber && m_dirlist != null; n++) - { - if (m_dirlist[n] == diroff) - return false; - } - - m_dirnumber++; - - if (m_dirnumber > m_dirlistsize) - { - // XXX: Reduce memory allocation granularity of the dirlist array. - uint[] new_dirlist = Realloc(m_dirlist, m_dirnumber - 1, 2 * m_dirnumber); - m_dirlistsize = 2 * m_dirnumber; - m_dirlist = new_dirlist; - } - - m_dirlist[m_dirnumber - 1] = diroff; - return true; - } - - /// - /// Reads IFD structure from the specified offset. - /// - /// The number of fields in the directory or 0 if failed. - private short fetchDirectory(uint diroff, out TiffDirEntry[] pdir, out uint nextdiroff) - { - const string module = "fetchDirectory"; - - m_diroff = diroff; - nextdiroff = 0; - - short dircount; - TiffDirEntry[] dir = null; - pdir = null; - - if (!seekOK(m_diroff)) - { - ErrorExt(this, m_clientdata, module, - "{0}: Seek error accessing TIFF directory", m_name); - return 0; - } - - if (!readShortOK(out dircount)) - { - ErrorExt(this, m_clientdata, module, - "{0}: Can not read TIFF directory count", m_name); - return 0; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabShort(ref dircount); - - dir = new TiffDirEntry[dircount]; - if (!readDirEntryOk(dir, dircount)) - { - ErrorExt(this, m_clientdata, module, "{0}: Can not read TIFF directory", m_name); - return 0; - } - - // Read offset to next directory for sequential scans. - int temp; - readIntOK(out temp); - nextdiroff = (uint)temp; - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - temp = (int)nextdiroff; - SwabLong(ref temp); - nextdiroff = (uint)temp; - } - - pdir = dir; - return dircount; - } - - /* - * Fetch and set the SubjectDistance EXIF tag. - */ - private bool fetchSubjectDistance(TiffDirEntry dir) - { - if (dir.tdir_count != 1 || dir.tdir_type != TiffType.Rational) - { - Tiff.WarningExt(this, m_clientdata, m_name, - "incorrect count or type for SubjectDistance, tag ignored"); - - return false; - } - - bool ok = false; - - byte[] b = new byte[2 * sizeof(int)]; - int read = fetchData(dir, b); - if (read != 0) - { - int[] l = new int[2]; - l[0] = readInt(b, 0); - l[1] = readInt(b, sizeof(int)); - - float v; - if (cvtRational(dir, l[0], l[1], out v)) - { - /* - * XXX: Numerator -1 means that we have infinite - * distance. Indicate that with a negative floating point - * SubjectDistance value. - */ - ok = SetField(dir.tdir_tag, (l[0] != -1) ? v : -v); - } - } - - return ok; - } - - /* - * Check the count field of a directory - * entry against a known value. The caller - * is expected to skip/ignore the tag if - * there is a mismatch. - */ - private bool checkDirCount(TiffDirEntry dir, int count) - { - if (count > dir.tdir_count) - { - WarningExt(this, m_clientdata, m_name, - "incorrect count for field \"{0}\" ({1}, expecting {2}); tag ignored", - FieldWithTag(dir.tdir_tag).Name, dir.tdir_count, count); - return false; - } - else if (count < dir.tdir_count) - { - WarningExt(this, m_clientdata, m_name, - "incorrect count for field \"{0}\" ({1}, expecting {2}); tag trimmed", - FieldWithTag(dir.tdir_tag).Name, dir.tdir_count, count); - return true; - } - - return true; - } - - /// - /// Fetches a contiguous directory item. - /// - private int fetchData(TiffDirEntry dir, byte[] buffer) - { - int width = DataWidth(dir.tdir_type); - int count = (int)dir.tdir_count * width; - - // Check for overflow. - if (dir.tdir_count == 0 || width == 0 || (count / width) != dir.tdir_count) - fetchFailed(dir); - - if (!seekOK(dir.tdir_offset)) - fetchFailed(dir); - - if (!readOK(buffer, count)) - fetchFailed(dir); - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - switch (dir.tdir_type) - { - case TiffType.Short: - case TiffType.SShort: - short[] s = ByteArrayToShorts(buffer, 0, count); - SwabArrayOfShort(s, dir.tdir_count); - ShortsToByteArray(s, 0, dir.tdir_count, buffer, 0); - break; - - case TiffType.Long: - case TiffType.SLong: - case TiffType.Float: - int[] l = ByteArrayToInts(buffer, 0, count); - SwabArrayOfLong(l, dir.tdir_count); - IntsToByteArray(l, 0, dir.tdir_count, buffer, 0); - break; - - case TiffType.Rational: - case TiffType.SRational: - int[] r = ByteArrayToInts(buffer, 0, count); - SwabArrayOfLong(r, 2 * dir.tdir_count); - IntsToByteArray(r, 0, 2 * dir.tdir_count, buffer, 0); - break; - - case TiffType.Double: - swab64BitData(buffer, 0, count); - break; - } - } - - return count; - } - - /// - /// Fetches an ASCII item from the file. - /// - private int fetchString(TiffDirEntry dir, out string cp) - { - byte[] bytes = null; - - if (dir.tdir_count <= 4) - { - int l = (int)dir.tdir_offset; - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabLong(ref l); - - bytes = new byte[sizeof(int)]; - writeInt(l, bytes, 0); - cp = Latin1Encoding.GetString(bytes, 0, dir.tdir_count); - return 1; - } - - bytes = new byte[dir.tdir_count]; - int res = fetchData(dir, bytes); - cp = Latin1Encoding.GetString(bytes, 0, dir.tdir_count); - return res; - } - - /* - * Convert numerator+denominator to float. - */ - private bool cvtRational(TiffDirEntry dir, int num, int denom, out float rv) - { - if (denom == 0) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Rational with zero denominator (num = {1})", - FieldWithTag(dir.tdir_tag).Name, num); - rv = float.NaN; - return false; - } - else - { - rv = ((float)num / (float)denom); - return true; - } - } - - /* - * Fetch a rational item from the file - * at offset off and return the value - * as a floating point number. - */ - private float fetchRational(TiffDirEntry dir) - { - byte[] bytes = new byte[sizeof(int) * 2]; - int read = fetchData(dir, bytes); - if (read != 0) - { - int[] l = new int[2]; - l[0] = readInt(bytes, 0); - l[1] = readInt(bytes, sizeof(int)); - - float v; - bool res = cvtRational(dir, l[0], l[1], out v); - if (res) - return v; - } - - return 1.0f; - } - - /// - /// Fetch a single floating point value from the offset field and - /// return it as a native float. - /// - private float fetchFloat(TiffDirEntry dir) - { - int l = extractData(dir); - return BitConverter.ToSingle(BitConverter.GetBytes(l), 0); - } - - /// - /// Fetches an array of Byte or SByte values. - /// - private bool fetchByteArray(TiffDirEntry dir, byte[] v) - { - if (dir.tdir_count <= 4) - { - // Extract data from offset field. - int count = dir.tdir_count; - - if (m_header.tiff_magic == TIFF_BIGENDIAN) - { - if (count == 4) - v[3] = (byte)(dir.tdir_offset & 0xff); - - if (count >= 3) - v[2] = (byte)((dir.tdir_offset >> 8) & 0xff); - - if (count >= 2) - v[1] = (byte)((dir.tdir_offset >> 16) & 0xff); - - if (count >= 1) - v[0] = (byte)(dir.tdir_offset >> 24); - } - else - { - if (count == 4) - v[3] = (byte)(dir.tdir_offset >> 24); - - if (count >= 3) - v[2] = (byte)((dir.tdir_offset >> 16) & 0xff); - - if (count >= 2) - v[1] = (byte)((dir.tdir_offset >> 8) & 0xff); - - if (count >= 1) - v[0] = (byte)(dir.tdir_offset & 0xff); - } - - return true; - } - - return (fetchData(dir, v) != 0); - } - - /// - /// Fetch an array of Short or SShort values. - /// - private bool fetchShortArray(TiffDirEntry dir, short[] v) - { - if (dir.tdir_count <= 2) - { - int count = dir.tdir_count; - - if (m_header.tiff_magic == TIFF_BIGENDIAN) - { - if (count == 2) - v[1] = (short)(dir.tdir_offset & 0xffff); - - if (count >= 1) - v[0] = (short)(dir.tdir_offset >> 16); - } - else - { - if (count == 2) - v[1] = (short)(dir.tdir_offset >> 16); - - if (count >= 1) - v[0] = (short)(dir.tdir_offset & 0xffff); - } - - return true; - } - - int cc = dir.tdir_count * sizeof(short); - byte[] b = new byte[cc]; - int read = fetchData(dir, b); - if (read != 0) - Buffer.BlockCopy(b, 0, v, 0, b.Length); - - return (read != 0); - } - - /* - * Fetch a pair of Short or Byte values. Some tags may have either Byte - * or Short type and this function works with both ones. - */ - private bool fetchShortPair(TiffDirEntry dir) - { - /* - * Prevent overflowing arrays below by performing a sanity - * check on tdir_count, this should never be greater than two. - */ - if (dir.tdir_count > 2) - { - WarningExt(this, m_clientdata, m_name, - "unexpected count for field \"{0}\", {1}, expected 2; ignored", - FieldWithTag(dir.tdir_tag).Name, dir.tdir_count); - return false; - } - - switch (dir.tdir_type) - { - case TiffType.Byte: - case TiffType.SByte: - byte[] bytes = new byte[4]; - return fetchByteArray(dir, bytes) && SetField(dir.tdir_tag, bytes[0], bytes[1]); - - case TiffType.Short: - case TiffType.SShort: - short[] shorts = new short[2]; - return fetchShortArray(dir, shorts) && SetField(dir.tdir_tag, shorts[0], shorts[1]); - } - - return false; - } - - /// - /// Fetches an array of Long or SLong values. - /// - private bool fetchLongArray(TiffDirEntry dir, int[] v) - { - if (dir.tdir_count == 1) - { - v[0] = (int)dir.tdir_offset; - return true; - } - - int cc = dir.tdir_count * sizeof(int); - byte[] b = new byte[cc]; - int read = fetchData(dir, b); - if (read != 0) - Buffer.BlockCopy(b, 0, v, 0, b.Length); - - return (read != 0); - } - - /// - /// Fetch an array of Rational or SRational values. - /// - private bool fetchRationalArray(TiffDirEntry dir, float[] v) - { - Debug.Assert(sizeof(float) == sizeof(int)); - - bool ok = false; - byte[] l = new byte[dir.tdir_count * DataWidth(dir.tdir_type)]; - if (fetchData(dir, l) != 0) - { - int offset = 0; - int[] pair = new int[2]; - for (int i = 0; i < dir.tdir_count; i++) - { - pair[0] = readInt(l, offset); - offset += sizeof(int); - pair[1] = readInt(l, offset); - offset += sizeof(int); - - ok = cvtRational(dir, pair[0], pair[1], out v[i]); - if (!ok) - break; - } - } - - return ok; - } - - /// - /// Fetches an array of Float values. - /// - private bool fetchFloatArray(TiffDirEntry dir, float[] v) - { - if (dir.tdir_count == 1) - { - v[0] = BitConverter.ToSingle(BitConverter.GetBytes(dir.tdir_offset), 0); - return true; - } - - int w = DataWidth(dir.tdir_type); - int cc = dir.tdir_count * w; - byte[] b = new byte[cc]; - int read = fetchData(dir, b); - if (read != 0) - { - int byteOffset = 0; - for (int i = 0; i < read / 4; i++) - { - v[i] = BitConverter.ToSingle(b, byteOffset); - byteOffset += 4; - } - } - - return (read != 0); - } - - /// - /// Fetches an array of Double values. - /// - private bool fetchDoubleArray(TiffDirEntry dir, double[] v) - { - int w = DataWidth(dir.tdir_type); - int cc = dir.tdir_count * w; - byte[] b = new byte[cc]; - int read = fetchData(dir, b); - if (read != 0) - { - int byteOffset = 0; - for (int i = 0; i < read / 8; i++) - { - v[i] = BitConverter.ToDouble(b, byteOffset); - byteOffset += 8; - } - } - - return (read != 0); - } - - /// - /// Fetches an array of Any values. - /// - /// The actual values are returned as doubles which should be - /// able hold all the types. Note in particular that we assume that the - /// double return value vector is large enough to read in any - /// fundamental type. We use that vector as a buffer to read in the base - /// type vector and then convert it in place to double (from end to - /// front of course). - private bool fetchAnyArray(TiffDirEntry dir, double[] v) - { - int i = 0; - bool res = false; - switch (dir.tdir_type) - { - case TiffType.Byte: - case TiffType.SByte: - byte[] b = new byte[dir.tdir_count]; - res = fetchByteArray(dir, b); - if (res) - { - for (i = dir.tdir_count - 1; i >= 0; i--) - v[i] = b[i]; - } - - if (!res) - return false; - - break; - case TiffType.Short: - case TiffType.SShort: - short[] u = new short[dir.tdir_count]; - res = fetchShortArray(dir, u); - if (res) - { - for (i = dir.tdir_count - 1; i >= 0; i--) - v[i] = u[i]; - } - - if (!res) - return false; - - break; - case TiffType.Long: - case TiffType.SLong: - int[] l = new int[dir.tdir_count]; - res = fetchLongArray(dir, l); - if (res) - { - for (i = dir.tdir_count - 1; i >= 0; i--) - v[i] = l[i]; - } - - if (!res) - return false; - - break; - case TiffType.Rational: - case TiffType.SRational: - float[] r = new float[dir.tdir_count]; - res = fetchRationalArray(dir, r); - if (res) - { - for (i = dir.tdir_count - 1; i >= 0; i--) - v[i] = r[i]; - } - - if (!res) - return false; - - break; - case TiffType.Float: - float[] f = new float[dir.tdir_count]; - res = fetchFloatArray(dir, f); - if (res) - { - for (i = dir.tdir_count - 1; i >= 0; i--) - v[i] = f[i]; - } - - if (!res) - return false; - - break; - case TiffType.Double: - return fetchDoubleArray(dir, v); - default: - // NoType - // ASCII - // Undefined - ErrorExt(this, m_clientdata, m_name, - "cannot read TIFF_ANY type {0} for field \"{1}\"", - dir.tdir_type, FieldWithTag(dir.tdir_tag).Name); - return false; - } - - return true; - } - - /// - /// Fetches a tag that is not handled by special case code. - /// - private bool fetchNormalTag(TiffDirEntry dir) - { - bool ok = false; - TiffFieldInfo fip = FieldWithTag(dir.tdir_tag); - - if (dir.tdir_count > 1) - { - switch (dir.tdir_type) - { - case TiffType.Byte: - case TiffType.SByte: - byte[] bytes = new byte[dir.tdir_count]; - ok = fetchByteArray(dir, bytes); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, bytes); - else - ok = SetField(dir.tdir_tag, bytes); - } - break; - - case TiffType.Short: - case TiffType.SShort: - short[] shorts = new short[dir.tdir_count]; - ok = fetchShortArray(dir, shorts); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, shorts); - else - ok = SetField(dir.tdir_tag, shorts); - } - break; - - case TiffType.Long: - case TiffType.SLong: - int[] ints = new int[dir.tdir_count]; - ok = fetchLongArray(dir, ints); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, ints); - else - ok = SetField(dir.tdir_tag, ints); - } - break; - - case TiffType.Rational: - case TiffType.SRational: - float[] rs = new float[dir.tdir_count]; - ok = fetchRationalArray(dir, rs); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, rs); - else - ok = SetField(dir.tdir_tag, rs); - } - break; - - case TiffType.Float: - float[] fs = new float[dir.tdir_count]; - ok = fetchFloatArray(dir, fs); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, fs); - else - ok = SetField(dir.tdir_tag, fs); - } - break; - - case TiffType.Double: - double[] ds = new double[dir.tdir_count]; - ok = fetchDoubleArray(dir, ds); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, ds); - else - ok = SetField(dir.tdir_tag, ds); - } - break; - - case TiffType.ASCII: - case TiffType.Undefined: - // bit of a cheat... - - // Some vendors write strings w/o the trailing null - // byte, so always append one just in case. - string cp; - ok = fetchString(dir, out cp) != 0; - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, dir.tdir_count, cp); - else - ok = SetField(dir.tdir_tag, cp); - } - break; - } - } - else if (checkDirCount(dir, 1)) - { - int v32 = 0; - // singleton value - switch (dir.tdir_type) - { - case TiffType.Byte: - case TiffType.SByte: - case TiffType.Short: - case TiffType.SShort: - // If the tag is also acceptable as a Long or SLong - // then SetField will expect an int parameter - // passed to it. - // - // NB: We use FieldWithTag here knowing that - // it returns us the first entry in the table - // for the tag and that that entry is for the - // widest potential data type the tag may have. - TiffType type = fip.Type; - if (type != TiffType.Long && type != TiffType.SLong) - { - short v = (short)extractData(dir); - if (fip.PassCount) - { - short[] a = new short[1]; - a[0] = v; - ok = SetField(dir.tdir_tag, 1, a); - } - else - ok = SetField(dir.tdir_tag, v); - - break; - } - - v32 = extractData(dir); - if (fip.PassCount) - { - int[] a = new int[1]; - a[0] = (int)v32; - ok = SetField(dir.tdir_tag, 1, a); - } - else - ok = SetField(dir.tdir_tag, v32); - - break; - - case TiffType.Long: - case TiffType.SLong: - v32 = extractData(dir); - if (fip.PassCount) - { - int[] a = new int[1]; - a[0] = (int)v32; - ok = SetField(dir.tdir_tag, 1, a); - } - else - ok = SetField(dir.tdir_tag, v32); - - break; - - case TiffType.Rational: - case TiffType.SRational: - case TiffType.Float: - float f = (dir.tdir_type == TiffType.Float ? fetchFloat(dir) : fetchRational(dir)); - if (fip.PassCount) - { - float[] a = new float[1]; - a[0] = f; - ok = SetField(dir.tdir_tag, 1, a); - } - else - ok = SetField(dir.tdir_tag, f); - - break; - - case TiffType.Double: - double[] ds = new double[1]; - ok = fetchDoubleArray(dir, ds); - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, 1, ds); - else - ok = SetField(dir.tdir_tag, ds[0]); - } - break; - - case TiffType.ASCII: - case TiffType.Undefined: - // bit of a cheat... - string c; - ok = fetchString(dir, out c) != 0; - if (ok) - { - if (fip.PassCount) - ok = SetField(dir.tdir_tag, 1, c); - else - ok = SetField(dir.tdir_tag, c); - } - break; - } - } - - return ok; - } - - /// - /// Fetches samples/pixel short values for the specified tag and verify - /// that all values are the same. - /// - private bool fetchPerSampleShorts(TiffDirEntry dir, out short pl) - { - pl = 0; - short samples = m_dir.td_samplesperpixel; - bool status = false; - - if (checkDirCount(dir, samples)) - { - short[] v = new short[dir.tdir_count]; - if (fetchShortArray(dir, v)) - { - int check_count = dir.tdir_count; - if (samples < check_count) - check_count = samples; - - bool failed = false; - for (ushort i = 1; i < check_count; i++) - { - if (v[i] != v[0]) - { - ErrorExt(this, m_clientdata, m_name, - "Cannot handle different per-sample values for field \"{0}\"", - FieldWithTag(dir.tdir_tag).Name); - failed = true; - break; - } - } - - if (!failed) - { - pl = v[0]; - status = true; - } - } - } - - return status; - } - - /// - /// Fetches samples/pixel long values for the specified tag and verify - /// that all values are the same. - /// - private bool fetchPerSampleLongs(TiffDirEntry dir, out int pl) - { - pl = 0; - short samples = m_dir.td_samplesperpixel; - bool status = false; - - if (checkDirCount(dir, samples)) - { - int[] v = new int[dir.tdir_count]; - if (fetchLongArray(dir, v)) - { - int check_count = dir.tdir_count; - if (samples < check_count) - check_count = samples; - - bool failed = false; - for (ushort i = 1; i < check_count; i++) - { - if (v[i] != v[0]) - { - ErrorExt(this, m_clientdata, m_name, - "Cannot handle different per-sample values for field \"{0}\"", - FieldWithTag(dir.tdir_tag).Name); - failed = true; - break; - } - } - - if (!failed) - { - pl = (int)v[0]; - status = true; - } - } - } - - return status; - } - - /// - /// Fetches samples/pixel Any values for the specified tag and verify - /// that all values are the same. - /// - private bool fetchPerSampleAnys(TiffDirEntry dir, out double pl) - { - pl = 0; - short samples = m_dir.td_samplesperpixel; - bool status = false; - - if (checkDirCount(dir, samples)) - { - double[] v = new double[dir.tdir_count]; - if (fetchAnyArray(dir, v)) - { - int check_count = dir.tdir_count; - if (samples < check_count) - check_count = samples; - - bool failed = false; - for (ushort i = 1; i < check_count; i++) - { - if (v[i] != v[0]) - { - ErrorExt(this, m_clientdata, m_name, - "Cannot handle different per-sample values for field \"{0}\"", - FieldWithTag(dir.tdir_tag).Name); - failed = true; - break; - } - } - - if (!failed) - { - pl = v[0]; - status = true; - } - } - } - - return status; - } - - /// - /// Fetches a set of offsets or lengths. - /// - /// While this routine says "strips", in fact it's also used - /// for tiles. - private bool fetchStripThing(TiffDirEntry dir, int nstrips, ref int[] lpp) - { - checkDirCount(dir, nstrips); - - // Allocate space for strip information. - if (lpp == null) - lpp = new int[nstrips]; - else - Array.Clear(lpp, 0, lpp.Length); - - bool status = false; - if (dir.tdir_type == TiffType.Short) - { - // Handle short -> int expansion. - short[] dp = new short[dir.tdir_count]; - status = fetchShortArray(dir, dp); - if (status) - { - for (int i = 0; i < nstrips && i < dir.tdir_count; i++) - lpp[i] = dp[i]; - } - } - else if (nstrips != dir.tdir_count) - { - // Special case to correct length - int[] dp = new int[dir.tdir_count]; - status = fetchLongArray(dir, dp); - if (status) - { - for (int i = 0; i < nstrips && i < dir.tdir_count; i++) - lpp[i] = dp[i]; - } - } - else - { - status = fetchLongArray(dir, lpp); - } - - return status; - } - - private bool fetchStripThing(TiffDirEntry dir, int nstrips, ref uint[] lpp) - { - int[] temp = null; - if (lpp != null) - temp = new int[lpp.Length]; - - bool res = fetchStripThing(dir, nstrips, ref temp); - if (res) - { - if (lpp == null) - lpp = new uint[temp.Length]; - - Buffer.BlockCopy(temp, 0, lpp, 0, temp.Length * sizeof(uint)); - } - - return res; - } - - /// - /// Fetches and sets the RefBlackWhite tag. - /// - private bool fetchRefBlackWhite(TiffDirEntry dir) - { - if (dir.tdir_type == TiffType.Rational) - return fetchNormalTag(dir); - - // Handle Long's for backward compatibility. - int[] cp = new int[dir.tdir_count]; - bool ok = fetchLongArray(dir, cp); - if (ok) - { - float[] fp = new float[dir.tdir_count]; - for (int i = 0; i < dir.tdir_count; i++) - fp[i] = (float)cp[i]; - - ok = SetField(dir.tdir_tag, fp); - } - - return ok; - } - - /// - /// Replace a single strip (tile) of uncompressed data with multiple - /// strips (tiles), each approximately 8Kbytes. - /// - /// This is useful for dealing with large images or for - /// dealing with machines with a limited amount of memory. - private void chopUpSingleUncompressedStrip() - { - uint bytecount = m_dir.td_stripbytecount[0]; - uint offset = m_dir.td_stripoffset[0]; - - // Make the rows hold at least one scanline, but fill specified - // amount of data if possible. - int rowbytes = VTileSize(1); - uint stripbytes; - int rowsperstrip; - if (rowbytes > STRIP_SIZE_DEFAULT) - { - stripbytes = (uint)rowbytes; - rowsperstrip = 1; - } - else if (rowbytes > 0) - { - rowsperstrip = STRIP_SIZE_DEFAULT / rowbytes; - stripbytes = (uint)(rowbytes * rowsperstrip); - } - else - { - return; - } - - // never increase the number of strips in an image - if (rowsperstrip >= m_dir.td_rowsperstrip) - return; - - uint nstrips = howMany(bytecount, stripbytes); - if (nstrips == 0) - { - // something is wonky, do nothing. - return; - } - - uint[] newcounts = new uint[nstrips]; - uint[] newoffsets = new uint[nstrips]; - - // Fill the strip information arrays with new bytecounts and offsets - // that reflect the broken-up format. - for (int strip = 0; strip < nstrips; strip++) - { - if (stripbytes > bytecount) - stripbytes = bytecount; - - newcounts[strip] = stripbytes; - newoffsets[strip] = offset; - offset += stripbytes; - bytecount -= stripbytes; - } - - // Replace old single strip info with multi-strip info. - m_dir.td_nstrips = (int)nstrips; - m_dir.td_stripsperimage = (int)nstrips; - SetField(TiffTag.RowsPerStrip, rowsperstrip); - - m_dir.td_stripbytecount = newcounts; - m_dir.td_stripoffset = newoffsets; - m_dir.td_stripbytecountsorted = true; - } - - internal static int roundUp(int x, int y) - { - return (howMany(x, y) * y); - } - - internal static int howMany(int x, int y) - { - long res = (((long)x + ((long)y - 1)) / (long)y); - if (res > int.MaxValue) - return 0; - - return (int)res; - } - - internal static uint howMany(uint x, uint y) - { - long res = (((long)x + ((long)y - 1)) / (long)y); - if (res > uint.MaxValue) - return 0; - - return (uint)res; - } - - /// - /// NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG. - /// If a tag can have both Long and Short types then the Long must - /// be placed before the Short for writing to work properly. - /// - /// NOTE: The second field (field_readcount) and third field - /// (field_writecount) sometimes use the values - /// TiffFieldInfo.Variable (-1), TiffFieldInfo.Variable2 (-3) - /// and TiffFieldInfo.Spp (-2). These values should be used but - /// would throw off the formatting of the code, so please - /// interpret the -1, -2 and -3 values accordingly. - /// - static TiffFieldInfo[] tiffFieldInfo = - { - new TiffFieldInfo(TiffTag.SubFileType, 1, 1, TiffType.Long, FieldBit.SubFileType, true, false, "SubfileType"), - /* XXX Short for compatibility w/ old versions of the library */ - new TiffFieldInfo(TiffTag.SubFileType, 1, 1, TiffType.Short, FieldBit.SubFileType, true, false, "SubfileType"), - new TiffFieldInfo(TiffTag.OSubFileType, 1, 1, TiffType.Short, FieldBit.SubFileType, true, false, "OldSubfileType"), - new TiffFieldInfo(TiffTag.ImageWidth, 1, 1, TiffType.Long, FieldBit.ImageDimensions, false, false, "ImageWidth"), - new TiffFieldInfo(TiffTag.ImageWidth, 1, 1, TiffType.Short, FieldBit.ImageDimensions, false, false, "ImageWidth"), - new TiffFieldInfo(TiffTag.ImageLength, 1, 1, TiffType.Long, FieldBit.ImageDimensions, true, false, "ImageLength"), - new TiffFieldInfo(TiffTag.ImageLength, 1, 1, TiffType.Short, FieldBit.ImageDimensions, true, false, "ImageLength"), - new TiffFieldInfo(TiffTag.BitsPerSample, -1, -1, TiffType.Short, FieldBit.BitsPerSample, false, false, "BitsPerSample"), - /* XXX Long for compatibility with some broken TIFF writers */ - new TiffFieldInfo(TiffTag.BitsPerSample, -1, -1, TiffType.Long, FieldBit.BitsPerSample, false, false, "BitsPerSample"), - new TiffFieldInfo(TiffTag.Compression, -1, 1, TiffType.Short, FieldBit.Compression, false, false, "Compression"), - /* XXX Long for compatibility with some broken TIFF writers */ - new TiffFieldInfo(TiffTag.Compression, -1, 1, TiffType.Long, FieldBit.Compression, false, false, "Compression"), - new TiffFieldInfo(TiffTag.Photometric, 1, 1, TiffType.Short, FieldBit.Photometric, false, false, "PhotometricInterpretation"), - /* XXX Long for compatibility with some broken TIFF writers */ - new TiffFieldInfo(TiffTag.Photometric, 1, 1, TiffType.Long, FieldBit.Photometric, false, false, "PhotometricInterpretation"), - new TiffFieldInfo(TiffTag.Threshholding, 1, 1, TiffType.Short, FieldBit.Thresholding, true, false, "Threshholding"), - new TiffFieldInfo(TiffTag.CellWidth, 1, 1, TiffType.Short, FieldBit.Ignore, true, false, "CellWidth"), - new TiffFieldInfo(TiffTag.CellLength, 1, 1, TiffType.Short, FieldBit.Ignore, true, false, "CellLength"), - new TiffFieldInfo(TiffTag.FillOrder, 1, 1, TiffType.Short, FieldBit.FillOrder, false, false, "BitOrder"), - new TiffFieldInfo(TiffTag.DocumentName, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "DocumentName"), - new TiffFieldInfo(TiffTag.ImageDescription, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "ImageDescription"), - new TiffFieldInfo(TiffTag.Manufacturer, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "Make"), - new TiffFieldInfo(TiffTag.Model, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "Model"), - new TiffFieldInfo(TiffTag.StripOffsets, -1, -1, TiffType.Long, FieldBit.StripOffsets, false, false, "StripOffsets"), - new TiffFieldInfo(TiffTag.StripOffsets, -1, -1, TiffType.Short, FieldBit.StripOffsets, false, false, "StripOffsets"), - new TiffFieldInfo(TiffTag.Orientation, 1, 1, TiffType.Short, FieldBit.Orientation, false, false, "Orientation"), - new TiffFieldInfo(TiffTag.SamplesPerPixel, 1, 1, TiffType.Short, FieldBit.SamplesPerPixel, false, false, "SamplesPerPixel"), - new TiffFieldInfo(TiffTag.RowsPerStrip, 1, 1, TiffType.Long, FieldBit.RowsPerStrip, false, false, "RowsPerStrip"), - new TiffFieldInfo(TiffTag.RowsPerStrip, 1, 1, TiffType.Short, FieldBit.RowsPerStrip, false, false, "RowsPerStrip"), - new TiffFieldInfo(TiffTag.StripByteCounts, -1, -1, TiffType.Long, FieldBit.StripByteCounts, false, false, "StripByteCounts"), - new TiffFieldInfo(TiffTag.StripByteCounts, -1, -1, TiffType.Short, FieldBit.StripByteCounts, false, false, "StripByteCounts"), - new TiffFieldInfo(TiffTag.MinSampleValue, -2, -1, TiffType.Short, FieldBit.MinSampleValue, true, false, "MinSampleValue"), - new TiffFieldInfo(TiffTag.MaxSampleValue, -2, -1, TiffType.Short, FieldBit.MaxSampleValue, true, false, "MaxSampleValue"), - new TiffFieldInfo(TiffTag.XResolution, 1, 1, TiffType.Rational, FieldBit.Resolution, true, false, "XResolution"), - new TiffFieldInfo(TiffTag.YResolution, 1, 1, TiffType.Rational, FieldBit.Resolution, true, false, "YResolution"), - new TiffFieldInfo(TiffTag.PlanarConfig, 1, 1, TiffType.Short, FieldBit.PlanarConfig, false, false, "PlanarConfiguration"), - new TiffFieldInfo(TiffTag.PageName, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "PageName"), - new TiffFieldInfo(TiffTag.XPosition, 1, 1, TiffType.Rational, FieldBit.Position, true, false, "XPosition"), - new TiffFieldInfo(TiffTag.YPosition, 1, 1, TiffType.Rational, FieldBit.Position, true, false, "YPosition"), - new TiffFieldInfo(TiffTag.FreeOffsets, -1, -1, TiffType.Long, FieldBit.Ignore, false, false, "FreeOffsets"), - new TiffFieldInfo(TiffTag.FreeByteCounts, -1, -1, TiffType.Long, FieldBit.Ignore, false, false, "FreeByteCounts"), - new TiffFieldInfo(TiffTag.GrayResponseUnit, 1, 1, TiffType.Short, FieldBit.Ignore, true, false, "CurveAccuracy"), - new TiffFieldInfo(TiffTag.GrayResponseCurve, -1, -1, TiffType.Short, FieldBit.Ignore, true, false, "GrayResponseCurve"), - new TiffFieldInfo(TiffTag.ResolutionUnit, 1, 1, TiffType.Short, FieldBit.ResolutionUnit, true, false, "ResolutionUnit"), - new TiffFieldInfo(TiffTag.PageNumber, 2, 2, TiffType.Short, FieldBit.PageNumber, true, false, "PageNumber"), - new TiffFieldInfo(TiffTag.ColorResponseUnit, 1, 1, TiffType.Short, FieldBit.Ignore, true, false, "CurveAccuracy"), - new TiffFieldInfo(TiffTag.TransferFunction, -1, -1, TiffType.Short, FieldBit.TransferFunction, true, false, "TransferFunction"), - new TiffFieldInfo(TiffTag.Software, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "Software"), - new TiffFieldInfo(TiffTag.DateTime, 20, 20, TiffType.ASCII, FieldBit.Custom, true, false, "DateTime"), - new TiffFieldInfo(TiffTag.Artist, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "Artist"), - new TiffFieldInfo(TiffTag.HostComputer, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "HostComputer"), - new TiffFieldInfo(TiffTag.WhitePoint, 2, 2, TiffType.Rational, FieldBit.Custom, true, false, "WhitePoint"), - new TiffFieldInfo(TiffTag.PrimaryChromaticities, 6, 6, TiffType.Rational, FieldBit.Custom, true, false, "PrimaryChromaticities"), - new TiffFieldInfo(TiffTag.Colormap, -1, -1, TiffType.Short, FieldBit.ColorMap, true, false, "ColorMap"), - new TiffFieldInfo(TiffTag.HalfToneHints, 2, 2, TiffType.Short, FieldBit.HalftoneHints, true, false, "HalftoneHints"), - new TiffFieldInfo(TiffTag.TileWidth, 1, 1, TiffType.Long, FieldBit.TileDimensions, false, false, "TileWidth"), - new TiffFieldInfo(TiffTag.TileWidth, 1, 1, TiffType.Short, FieldBit.TileDimensions, false, false, "TileWidth"), - new TiffFieldInfo(TiffTag.TileLength, 1, 1, TiffType.Long, FieldBit.TileDimensions, false, false, "TileLength"), - new TiffFieldInfo(TiffTag.TileLength, 1, 1, TiffType.Short, FieldBit.TileDimensions, false, false, "TileLength"), - new TiffFieldInfo(TiffTag.TileOffsets, -1, 1, TiffType.Long, FieldBit.StripOffsets, false, false, "TileOffsets"), - new TiffFieldInfo(TiffTag.TileByteCounts, -1, 1, TiffType.Long, FieldBit.StripByteCounts, false, false, "TileByteCounts"), - new TiffFieldInfo(TiffTag.TileByteCounts, -1, 1, TiffType.Short, FieldBit.StripByteCounts, false, false, "TileByteCounts"), - new TiffFieldInfo(TiffTag.SubImageDescriptor, -1, -1, TiffType.IFD, FieldBit.SubIFD, true, true, "SubIFD"), - new TiffFieldInfo(TiffTag.SubImageDescriptor, -1, -1, TiffType.Long, FieldBit.SubIFD, true, true, "SubIFD"), - new TiffFieldInfo(TiffTag.InkSet, 1, 1, TiffType.Short, FieldBit.Custom, false, false, "InkSet"), - new TiffFieldInfo(TiffTag.InkNames, -1, -1, TiffType.ASCII, FieldBit.InkNames, true, true, "InkNames"), - new TiffFieldInfo(TiffTag.NumberOfInks, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "NumberOfInks"), - new TiffFieldInfo(TiffTag.DotRange, 2, 2, TiffType.Short, FieldBit.Custom, false, false, "DotRange"), - new TiffFieldInfo(TiffTag.DotRange, 2, 2, TiffType.Byte, FieldBit.Custom, false, false, "DotRange"), - new TiffFieldInfo(TiffTag.TargetPrinter, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "TargetPrinter"), - new TiffFieldInfo(TiffTag.ExtraSamples, -1, -1, TiffType.Short, FieldBit.ExtraSamples, false, true, "ExtraSamples"), - /* XXX for bogus Adobe Photoshop v2.5 files */ - new TiffFieldInfo(TiffTag.ExtraSamples, -1, -1, TiffType.Byte, FieldBit.ExtraSamples, false, true, "ExtraSamples"), - new TiffFieldInfo(TiffTag.SampleFormat, -1, -1, TiffType.Short, FieldBit.SampleFormat, false, false, "SampleFormat"), - new TiffFieldInfo(TiffTag.SMinSampleValue, -2, -1, TiffType.Any, FieldBit.SMinSampleValue, true, false, "SMinSampleValue"), - new TiffFieldInfo(TiffTag.SMaxSampleValue, -2, -1, TiffType.Any, FieldBit.SMaxSampleValue, true, false, "SMaxSampleValue"), - new TiffFieldInfo(TiffTag.ClipPath, -1, -3, TiffType.Byte, FieldBit.Custom, false, true, "ClipPath"), - new TiffFieldInfo(TiffTag.XClipPathUnits, 1, 1, TiffType.SLong, FieldBit.Custom, false, false, "XClipPathUnits"), - new TiffFieldInfo(TiffTag.XClipPathUnits, 1, 1, TiffType.SShort, FieldBit.Custom, false, false, "XClipPathUnits"), - new TiffFieldInfo(TiffTag.XClipPathUnits, 1, 1, TiffType.SByte, FieldBit.Custom, false, false, "XClipPathUnits"), - new TiffFieldInfo(TiffTag.YClipPathUnits, 1, 1, TiffType.SLong, FieldBit.Custom, false, false, "YClipPathUnits"), - new TiffFieldInfo(TiffTag.YClipPathUnits, 1, 1, TiffType.SShort, FieldBit.Custom, false, false, "YClipPathUnits"), - new TiffFieldInfo(TiffTag.YClipPathUnits, 1, 1, TiffType.SByte, FieldBit.Custom, false, false, "YClipPathUnits"), - new TiffFieldInfo(TiffTag.YCBCRCOEFFICIENTS, 3, 3, TiffType.Rational, FieldBit.Custom, false, false, "YCbCrCoefficients"), - new TiffFieldInfo(TiffTag.YCBCRSUBSAMPLING, 2, 2, TiffType.Short, FieldBit.YCbCrSubsampling, false, false, "YCbCrSubsampling"), - new TiffFieldInfo(TiffTag.YCBCRPOSITIONING, 1, 1, TiffType.Short, FieldBit.YCbCrPositioning, false, false, "YCbCrPositioning"), - new TiffFieldInfo(TiffTag.REFERENCEBLACKWHITE, 6, 6, TiffType.Rational, FieldBit.RefBlackWhite, true, false, "ReferenceBlackWhite"), - /* XXX temporarily accept Long for backwards compatibility */ - new TiffFieldInfo(TiffTag.REFERENCEBLACKWHITE, 6, 6, TiffType.Long, FieldBit.RefBlackWhite, true, false, "ReferenceBlackWhite"), - new TiffFieldInfo(TiffTag.XMLPACKET, -3, -3, TiffType.Byte, FieldBit.Custom, false, true, "XMLPacket"), - /* begin SGI tags */ - new TiffFieldInfo(TiffTag.MATTEING, 1, 1, TiffType.Short, FieldBit.ExtraSamples, false, false, "Matteing"), - new TiffFieldInfo(TiffTag.DATATYPE, -2, -1, TiffType.Short, FieldBit.SampleFormat, false, false, "DataType"), - new TiffFieldInfo(TiffTag.IMAGEDEPTH, 1, 1, TiffType.Long, FieldBit.ImageDepth, false, false, "ImageDepth"), - new TiffFieldInfo(TiffTag.IMAGEDEPTH, 1, 1, TiffType.Short, FieldBit.ImageDepth, false, false, "ImageDepth"), - new TiffFieldInfo(TiffTag.TILEDEPTH, 1, 1, TiffType.Long, FieldBit.TileDepth, false, false, "TileDepth"), - new TiffFieldInfo(TiffTag.TILEDEPTH, 1, 1, TiffType.Short, FieldBit.TileDepth, false, false, "TileDepth"), - /* end SGI tags */ - /* begin Pixar tags */ - new TiffFieldInfo(TiffTag.PIXAR_IMAGEFULLWIDTH, 1, 1, TiffType.Long, FieldBit.Custom, true, false, "ImageFullWidth"), - new TiffFieldInfo(TiffTag.PIXAR_IMAGEFULLLENGTH, 1, 1, TiffType.Long, FieldBit.Custom, true, false, "ImageFullLength"), - new TiffFieldInfo(TiffTag.PIXAR_TEXTUREFORMAT, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "TextureFormat"), - new TiffFieldInfo(TiffTag.PIXAR_WRAPMODES, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "TextureWrapModes"), - new TiffFieldInfo(TiffTag.PIXAR_FOVCOT, 1, 1, TiffType.Float, FieldBit.Custom, true, false, "FieldOfViewCotangent"), - new TiffFieldInfo(TiffTag.PIXAR_MATRIX_WORLDTOSCREEN, 16, 16, TiffType.Float, FieldBit.Custom, true, false, "MatrixWorldToScreen"), - new TiffFieldInfo(TiffTag.PIXAR_MATRIX_WORLDTOCAMERA, 16, 16, TiffType.Float, FieldBit.Custom, true, false, "MatrixWorldToCamera"), - new TiffFieldInfo(TiffTag.COPYRIGHT, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "Copyright"), - /* end Pixar tags */ - new TiffFieldInfo(TiffTag.RICHTIFFIPTC, -3, -3, TiffType.Long, FieldBit.Custom, false, true, "RichTIFFIPTC"), - new TiffFieldInfo(TiffTag.PHOTOSHOP, -3, -3, TiffType.Byte, FieldBit.Custom, false, true, "Photoshop"), - new TiffFieldInfo(TiffTag.EXIFIFD, 1, 1, TiffType.Long, FieldBit.Custom, false, false, "EXIFIFDOffset"), - new TiffFieldInfo(TiffTag.ICCPROFILE, -3, -3, TiffType.Undefined, FieldBit.Custom, false, true, "ICC Profile"), - new TiffFieldInfo(TiffTag.GPSIFD, 1, 1, TiffType.Long, FieldBit.Custom, false, false, "GPSIFDOffset"), - new TiffFieldInfo(TiffTag.STONITS, 1, 1, TiffType.Double, FieldBit.Custom, false, false, "StoNits"), - new TiffFieldInfo(TiffTag.INTEROPERABILITYIFD, 1, 1, TiffType.Long, FieldBit.Custom, false, false, "InteroperabilityIFDOffset"), - /* begin DNG tags */ - new TiffFieldInfo(TiffTag.DNGVERSION, 4, 4, TiffType.Byte, FieldBit.Custom, false, false, "DNGVersion"), - new TiffFieldInfo(TiffTag.DNGBACKWARDVERSION, 4, 4, TiffType.Byte, FieldBit.Custom, false, false, "DNGBackwardVersion"), - new TiffFieldInfo(TiffTag.UNIQUECAMERAMODEL, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "UniqueCameraModel"), - new TiffFieldInfo(TiffTag.LOCALIZEDCAMERAMODEL, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "LocalizedCameraModel"), - new TiffFieldInfo(TiffTag.LOCALIZEDCAMERAMODEL, -1, -1, TiffType.Byte, FieldBit.Custom, true, true, "LocalizedCameraModel"), - new TiffFieldInfo(TiffTag.CFAPLANECOLOR, -1, -1, TiffType.Byte, FieldBit.Custom, false, true, "CFAPlaneColor"), - new TiffFieldInfo(TiffTag.CFALAYOUT, 1, 1, TiffType.Short, FieldBit.Custom, false, false, "CFALayout"), - new TiffFieldInfo(TiffTag.LINEARIZATIONTABLE, -1, -1, TiffType.Short, FieldBit.Custom, false, true, "LinearizationTable"), - new TiffFieldInfo(TiffTag.BLACKLEVELREPEATDIM, 2, 2, TiffType.Short, FieldBit.Custom, false, false, "BlackLevelRepeatDim"), - new TiffFieldInfo(TiffTag.BLACKLEVEL, -1, -1, TiffType.Long, FieldBit.Custom, false, true, "BlackLevel"), - new TiffFieldInfo(TiffTag.BLACKLEVEL, -1, -1, TiffType.Short, FieldBit.Custom, false, true, "BlackLevel"), - new TiffFieldInfo(TiffTag.BLACKLEVEL, -1, -1, TiffType.Rational, FieldBit.Custom, false, true, "BlackLevel"), - new TiffFieldInfo(TiffTag.BLACKLEVELDELTAH, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "BlackLevelDeltaH"), - new TiffFieldInfo(TiffTag.BLACKLEVELDELTAV, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "BlackLevelDeltaV"), - new TiffFieldInfo(TiffTag.WHITELEVEL, -2, -2, TiffType.Long, FieldBit.Custom, false, false, "WhiteLevel"), - new TiffFieldInfo(TiffTag.WHITELEVEL, -2, -2, TiffType.Short, FieldBit.Custom, false, false, "WhiteLevel"), - new TiffFieldInfo(TiffTag.DEFAULTSCALE, 2, 2, TiffType.Rational, FieldBit.Custom, false, false, "DefaultScale"), - new TiffFieldInfo(TiffTag.BESTQUALITYSCALE, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "BestQualityScale"), - new TiffFieldInfo(TiffTag.DEFAULTCROPORIGIN, 2, 2, TiffType.Long, FieldBit.Custom, false, false, "DefaultCropOrigin"), - new TiffFieldInfo(TiffTag.DEFAULTCROPORIGIN, 2, 2, TiffType.Short, FieldBit.Custom, false, false, "DefaultCropOrigin"), - new TiffFieldInfo(TiffTag.DEFAULTCROPORIGIN, 2, 2, TiffType.Rational, FieldBit.Custom, false, false, "DefaultCropOrigin"), - new TiffFieldInfo(TiffTag.DEFAULTCROPSIZE, 2, 2, TiffType.Long, FieldBit.Custom, false, false, "DefaultCropSize"), - new TiffFieldInfo(TiffTag.DEFAULTCROPSIZE, 2, 2, TiffType.Short, FieldBit.Custom, false, false, "DefaultCropSize"), - new TiffFieldInfo(TiffTag.DEFAULTCROPSIZE, 2, 2, TiffType.Rational, FieldBit.Custom, false, false, "DefaultCropSize"), - new TiffFieldInfo(TiffTag.COLORMATRIX1, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "ColorMatrix1"), - new TiffFieldInfo(TiffTag.COLORMATRIX2, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "ColorMatrix2"), - new TiffFieldInfo(TiffTag.CAMERACALIBRATION1, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "CameraCalibration1"), - new TiffFieldInfo(TiffTag.CAMERACALIBRATION2, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "CameraCalibration2"), - new TiffFieldInfo(TiffTag.REDUCTIONMATRIX1, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "ReductionMatrix1"), - new TiffFieldInfo(TiffTag.REDUCTIONMATRIX2, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "ReductionMatrix2"), - new TiffFieldInfo(TiffTag.ANALOGBALANCE, -1, -1, TiffType.Rational, FieldBit.Custom, false, true, "AnalogBalance"), - new TiffFieldInfo(TiffTag.ASSHOTNEUTRAL, -1, -1, TiffType.Short, FieldBit.Custom, false, true, "AsShotNeutral"), - new TiffFieldInfo(TiffTag.ASSHOTNEUTRAL, -1, -1, TiffType.Rational, FieldBit.Custom, false, true, "AsShotNeutral"), - new TiffFieldInfo(TiffTag.ASSHOTWHITEXY, 2, 2, TiffType.Rational, FieldBit.Custom, false, false, "AsShotWhiteXY"), - new TiffFieldInfo(TiffTag.BASELINEEXPOSURE, 1, 1, TiffType.SRational, FieldBit.Custom, false, false, "BaselineExposure"), - new TiffFieldInfo(TiffTag.BASELINENOISE, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "BaselineNoise"), - new TiffFieldInfo(TiffTag.BASELINESHARPNESS, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "BaselineSharpness"), - new TiffFieldInfo(TiffTag.BAYERGREENSPLIT, 1, 1, TiffType.Long, FieldBit.Custom, false, false, "BayerGreenSplit"), - new TiffFieldInfo(TiffTag.LINEARRESPONSELIMIT, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "LinearResponseLimit"), - new TiffFieldInfo(TiffTag.CAMERASERIALNUMBER, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "CameraSerialNumber"), - new TiffFieldInfo(TiffTag.LENSINFO, 4, 4, TiffType.Rational, FieldBit.Custom, false, false, "LensInfo"), - new TiffFieldInfo(TiffTag.CHROMABLURRADIUS, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "ChromaBlurRadius"), - new TiffFieldInfo(TiffTag.ANTIALIASSTRENGTH, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "AntiAliasStrength"), - new TiffFieldInfo(TiffTag.SHADOWSCALE, 1, 1, TiffType.Rational, FieldBit.Custom, false, false, "ShadowScale"), - new TiffFieldInfo(TiffTag.DNGPRIVATEDATA, -1, -1, TiffType.Byte, FieldBit.Custom, false, true, "DNGPrivateData"), - new TiffFieldInfo(TiffTag.MAKERNOTESAFETY, 1, 1, TiffType.Short, FieldBit.Custom, false, false, "MakerNoteSafety"), - new TiffFieldInfo(TiffTag.CALIBRATIONILLUMINANT1, 1, 1, TiffType.Short, FieldBit.Custom, false, false, "CalibrationIlluminant1"), - new TiffFieldInfo(TiffTag.CALIBRATIONILLUMINANT2, 1, 1, TiffType.Short, FieldBit.Custom, false, false, "CalibrationIlluminant2"), - new TiffFieldInfo(TiffTag.RAWDATAUNIQUEID, 16, 16, TiffType.Byte, FieldBit.Custom, false, false, "RawDataUniqueID"), - new TiffFieldInfo(TiffTag.ORIGINALRAWFILENAME, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "OriginalRawFileName"), - new TiffFieldInfo(TiffTag.ORIGINALRAWFILENAME, -1, -1, TiffType.Byte, FieldBit.Custom, true, true, "OriginalRawFileName"), - new TiffFieldInfo(TiffTag.ORIGINALRAWFILEDATA, -1, -1, TiffType.Undefined, FieldBit.Custom, false, true, "OriginalRawFileData"), - new TiffFieldInfo(TiffTag.ACTIVEAREA, 4, 4, TiffType.Long, FieldBit.Custom, false, false, "ActiveArea"), - new TiffFieldInfo(TiffTag.ACTIVEAREA, 4, 4, TiffType.Short, FieldBit.Custom, false, false, "ActiveArea"), - new TiffFieldInfo(TiffTag.MASKEDAREAS, -1, -1, TiffType.Long, FieldBit.Custom, false, true, "MaskedAreas"), - new TiffFieldInfo(TiffTag.ASSHOTICCPROFILE, -1, -1, TiffType.Undefined, FieldBit.Custom, false, true, "AsShotICCProfile"), - new TiffFieldInfo(TiffTag.ASSHOTPREPROFILEMATRIX, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "AsShotPreProfileMatrix"), - new TiffFieldInfo(TiffTag.CURRENTICCPROFILE, -1, -1, TiffType.Undefined, FieldBit.Custom, false, true, "CurrentICCProfile"), - new TiffFieldInfo(TiffTag.CURRENTPREPROFILEMATRIX, -1, -1, TiffType.SRational, FieldBit.Custom, false, true, "CurrentPreProfileMatrix"), - /* end DNG tags */ - }; - - static TiffFieldInfo[] exifFieldInfo = - { - new TiffFieldInfo(TiffTag.EXIF_EXPOSURETIME, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "ExposureTime"), - new TiffFieldInfo(TiffTag.EXIF_FNUMBER, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "FNumber"), - new TiffFieldInfo(TiffTag.EXIF_EXPOSUREPROGRAM, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "ExposureProgram"), - new TiffFieldInfo(TiffTag.EXIF_SPECTRALSENSITIVITY, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "SpectralSensitivity"), - new TiffFieldInfo(TiffTag.EXIF_ISOSPEEDRATINGS, -1, -1, TiffType.Short, FieldBit.Custom, true, true, "ISOSpeedRatings"), - new TiffFieldInfo(TiffTag.EXIF_OECF, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "OptoelectricConversionFactor"), - new TiffFieldInfo(TiffTag.EXIF_EXIFVERSION, 4, 4, TiffType.Undefined, FieldBit.Custom, true, false, "ExifVersion"), - new TiffFieldInfo(TiffTag.EXIF_DATETIMEORIGINAL, 20, 20, TiffType.ASCII, FieldBit.Custom, true, false, "DateTimeOriginal"), - new TiffFieldInfo(TiffTag.EXIF_DATETIMEDIGITIZED, 20, 20, TiffType.ASCII, FieldBit.Custom, true, false, "DateTimeDigitized"), - new TiffFieldInfo(TiffTag.EXIF_COMPONENTSCONFIGURATION, 4, 4, TiffType.Undefined, FieldBit.Custom, true, false, "ComponentsConfiguration"), - new TiffFieldInfo(TiffTag.EXIF_COMPRESSEDBITSPERPIXEL, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "CompressedBitsPerPixel"), - new TiffFieldInfo(TiffTag.EXIF_SHUTTERSPEEDVALUE, 1, 1, TiffType.SRational, FieldBit.Custom, true, false, "ShutterSpeedValue"), - new TiffFieldInfo(TiffTag.EXIF_APERTUREVALUE, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "ApertureValue"), - new TiffFieldInfo(TiffTag.EXIF_BRIGHTNESSVALUE, 1, 1, TiffType.SRational, FieldBit.Custom, true, false, "BrightnessValue"), - new TiffFieldInfo(TiffTag.EXIF_EXPOSUREBIASVALUE, 1, 1, TiffType.SRational, FieldBit.Custom, true, false, "ExposureBiasValue"), - new TiffFieldInfo(TiffTag.EXIF_MAXAPERTUREVALUE, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "MaxApertureValue"), - new TiffFieldInfo(TiffTag.EXIF_SUBJECTDISTANCE, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "SubjectDistance"), - new TiffFieldInfo(TiffTag.EXIF_METERINGMODE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "MeteringMode"), - new TiffFieldInfo(TiffTag.EXIF_LIGHTSOURCE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "LightSource"), - new TiffFieldInfo(TiffTag.EXIF_FLASH, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "Flash"), - new TiffFieldInfo(TiffTag.EXIF_FOCALLENGTH, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "FocalLength"), - new TiffFieldInfo(TiffTag.EXIF_SUBJECTAREA, -1, -1, TiffType.Short, FieldBit.Custom, true, true, "SubjectArea"), - new TiffFieldInfo(TiffTag.EXIF_MAKERNOTE, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "MakerNote"), - new TiffFieldInfo(TiffTag.EXIF_USERCOMMENT, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "UserComment"), - new TiffFieldInfo(TiffTag.EXIF_SUBSECTIME, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "SubSecTime"), - new TiffFieldInfo(TiffTag.EXIF_SUBSECTIMEORIGINAL, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "SubSecTimeOriginal"), - new TiffFieldInfo(TiffTag.EXIF_SUBSECTIMEDIGITIZED, -1, -1, TiffType.ASCII, FieldBit.Custom, true, false, "SubSecTimeDigitized"), - new TiffFieldInfo(TiffTag.EXIF_FLASHPIXVERSION, 4, 4, TiffType.Undefined, FieldBit.Custom, true, false, "FlashpixVersion"), - new TiffFieldInfo(TiffTag.EXIF_COLORSPACE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "ColorSpace"), - new TiffFieldInfo(TiffTag.EXIF_PIXELXDIMENSION, 1, 1, TiffType.Long, FieldBit.Custom, true, false, "PixelXDimension"), - new TiffFieldInfo(TiffTag.EXIF_PIXELXDIMENSION, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "PixelXDimension"), - new TiffFieldInfo(TiffTag.EXIF_PIXELYDIMENSION, 1, 1, TiffType.Long, FieldBit.Custom, true, false, "PixelYDimension"), - new TiffFieldInfo(TiffTag.EXIF_PIXELYDIMENSION, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "PixelYDimension"), - new TiffFieldInfo(TiffTag.EXIF_RELATEDSOUNDFILE, 13, 13, TiffType.ASCII, FieldBit.Custom, true, false, "RelatedSoundFile"), - new TiffFieldInfo(TiffTag.EXIF_FLASHENERGY, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "FlashEnergy"), - new TiffFieldInfo(TiffTag.EXIF_SPATIALFREQUENCYRESPONSE, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "SpatialFrequencyResponse"), - new TiffFieldInfo(TiffTag.EXIF_FOCALPLANEXRESOLUTION, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "FocalPlaneXResolution"), - new TiffFieldInfo(TiffTag.EXIF_FOCALPLANEYRESOLUTION, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "FocalPlaneYResolution"), - new TiffFieldInfo(TiffTag.EXIF_FOCALPLANERESOLUTIONUNIT, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "FocalPlaneResolutionUnit"), - new TiffFieldInfo(TiffTag.EXIF_SUBJECTLOCATION, 2, 2, TiffType.Short, FieldBit.Custom, true, false, "SubjectLocation"), - new TiffFieldInfo(TiffTag.EXIF_EXPOSUREINDEX, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "ExposureIndex"), - new TiffFieldInfo(TiffTag.EXIF_SENSINGMETHOD, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "SensingMethod"), - new TiffFieldInfo(TiffTag.EXIF_FILESOURCE, 1, 1, TiffType.Undefined, FieldBit.Custom, true, false, "FileSource"), - new TiffFieldInfo(TiffTag.EXIF_SCENETYPE, 1, 1, TiffType.Undefined, FieldBit.Custom, true, false, "SceneType"), - new TiffFieldInfo(TiffTag.EXIF_CFAPATTERN, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "CFAPattern"), - new TiffFieldInfo(TiffTag.EXIF_CUSTOMRENDERED, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "CustomRendered"), - new TiffFieldInfo(TiffTag.EXIF_EXPOSUREMODE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "ExposureMode"), - new TiffFieldInfo(TiffTag.EXIF_WHITEBALANCE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "WhiteBalance"), - new TiffFieldInfo(TiffTag.EXIF_DIGITALZOOMRATIO, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "DigitalZoomRatio"), - new TiffFieldInfo(TiffTag.EXIF_FOCALLENGTHIN35MMFILM, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "FocalLengthIn35mmFilm"), - new TiffFieldInfo(TiffTag.EXIF_SCENECAPTURETYPE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "SceneCaptureType"), - new TiffFieldInfo(TiffTag.EXIF_GAINCONTROL, 1, 1, TiffType.Rational, FieldBit.Custom, true, false, "GainControl"), - new TiffFieldInfo(TiffTag.EXIF_CONTRAST, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "Contrast"), - new TiffFieldInfo(TiffTag.EXIF_SATURATION, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "Saturation"), - new TiffFieldInfo(TiffTag.EXIF_SHARPNESS, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "Sharpness"), - new TiffFieldInfo(TiffTag.EXIF_DEVICESETTINGDESCRIPTION, -1, -1, TiffType.Undefined, FieldBit.Custom, true, true, "DeviceSettingDescription"), - new TiffFieldInfo(TiffTag.EXIF_SUBJECTDISTANCERANGE, 1, 1, TiffType.Short, FieldBit.Custom, true, false, "SubjectDistanceRange"), - new TiffFieldInfo(TiffTag.EXIF_IMAGEUNIQUEID, 33, 33, TiffType.ASCII, FieldBit.Custom, true, false, "ImageUniqueID") - }; - - private static TiffFieldInfo[] getFieldInfo(out int size) - { - size = tiffFieldInfo.Length; - return tiffFieldInfo; - } - - private static TiffFieldInfo[] getExifFieldInfo(out int size) - { - size = exifFieldInfo.Length; - return exifFieldInfo; - } - - private void setupFieldInfo(TiffFieldInfo[] info, int n) - { - m_nfields = 0; - MergeFieldInfo(info, n); - } - - /* - * Return nearest TiffDataType to the sample type of an image. - */ - private TiffType sampleToTagType() - { - int bps = howMany8(m_dir.td_bitspersample); - - switch (m_dir.td_sampleformat) - { - case SampleFormat.IEEEFloat: - return (bps == 4 ? TiffType.Float : TiffType.Double); - case SampleFormat.Int: - return (bps <= 1 ? TiffType.SByte : bps <= 2 ? TiffType.SShort : TiffType.SLong); - case SampleFormat.UInt: - return (bps <= 1 ? TiffType.Byte : bps <= 2 ? TiffType.Short : TiffType.Long); - case SampleFormat.UnTyped: - return TiffType.Undefined; - } - - return TiffType.Undefined; - } - - private static TiffFieldInfo createAnonFieldInfo(TiffTag tag, TiffType field_type) - { - TiffFieldInfo fld = new TiffFieldInfo(tag, TiffFieldInfo.Variable2, - TiffFieldInfo.Variable2, field_type, FieldBit.Custom, true, true, null); - - // note that this name is a special sign to Close() and - // setupFieldInfo() to free the field - fld.Name = string.Format(CultureInfo.InvariantCulture, "Tag {0}", tag); - return fld; - } - - /* - * Return size of TiffDataType in bytes. - * - * XXX: We need a separate function to determine the space needed - * to store the value. For TiffType.Rational values DataWidth() - * returns 8, but we use 4-byte float to represent rationals. - */ - internal static int dataSize(TiffType type) - { - switch (type) - { - case TiffType.Byte: - case TiffType.SByte: - case TiffType.ASCII: - case TiffType.Undefined: - return 1; - - case TiffType.Short: - case TiffType.SShort: - return 2; - - case TiffType.Long: - case TiffType.SLong: - case TiffType.Float: - case TiffType.IFD: - case TiffType.Rational: - case TiffType.SRational: - return 4; - - case TiffType.Double: - return 8; - - default: - return 0; - } - } - - /* is tag value normal or pseudo */ - internal static bool isPseudoTag(TiffTag t) - { - return ((int)t > 0xffff); - } - - private bool isFillOrder(BitOrder o) - { - TiffFlags order = (TiffFlags)o; - return ((m_flags & order) == order); - } - - private static int BITn(int n) - { - return (1 << (n & 0x1f)); - } - - /* - * Return true / false according to whether or not - * it is permissible to set the tag's value. - * Note that we allow ImageLength to be changed - * so that we can append and extend to images. - * Any other tag may not be altered once writing - * has commenced, unless its value has no effect - * on the format of the data that is written. - */ - private bool okToChangeTag(TiffTag tag) - { - TiffFieldInfo fip = FindFieldInfo(tag, TiffType.Any); - if (fip == null) - { - // unknown tag - ErrorExt(this, m_clientdata, "SetField", "{0}: Unknown {1}tag {2}", - m_name, isPseudoTag(tag) ? "pseudo-" : "", tag); - return false; - } - - if (tag != TiffTag.ImageLength && - (m_flags & TiffFlags.BeenWriting) == TiffFlags.BeenWriting && - !fip.OkToChange) - { - // Consult info table to see if tag can be changed after we've - // started writing. We only allow changes to those tags that - // don't / shouldn't affect the compression and / or format of - // the data. - ErrorExt(this, m_clientdata, "SetField", "{0}: Cannot modify tag \"{1}\" while writing", - m_name, fip.Name); - return false; - } - - return true; - } - - /* - * Setup a default directory structure. - */ - private void setupDefaultDirectory() - { - int tiffFieldInfoCount; - TiffFieldInfo[] tiffFieldInfo = getFieldInfo(out tiffFieldInfoCount); - setupFieldInfo(tiffFieldInfo, tiffFieldInfoCount); - - m_dir = new TiffDirectory(); - m_postDecodeMethod = PostDecodeMethodType.pdmNone; - m_foundfield = null; - - m_tagmethods = m_defaultTagMethods; - - /* - * Give client code a chance to install their own - * tag extensions & methods, prior to compression overloads. - */ - if (m_extender != null) - m_extender(this); - - SetField(TiffTag.Compression, Compression.None); - - /* - * NB: The directory is marked dirty as a result of setting - * up the default compression scheme. However, this really - * isn't correct -- we want DirtyDirect to be set only - * if the user does something. We could just do the setup - * by hand, but it seems better to use the normal mechanism - * (i.e. SetField). - */ - m_flags &= ~TiffFlags.DirtyDirect; - - /* - * we clear the IsTiled flag when setting up a new directory. - * Should we also be clearing stuff like InSubIFD? - */ - m_flags &= ~TiffFlags.IsTiled; - - /* - * Clear other directory-specific fields. - */ - m_tilesize = -1; - m_scanlinesize = -1; - } - - private bool advanceDirectory(ref uint nextdir, out long off) - { - off = 0; - - const string module = "advanceDirectory"; - short dircount; - - if (!seekOK(nextdir) || !readShortOK(out dircount)) - { - ErrorExt(this, m_clientdata, module, "{0}: Error fetching directory count", m_name); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabShort(ref dircount); - - off = seekFile(dircount * TiffDirEntry.SizeInBytes, SeekOrigin.Current); - - if (!readUIntOK(out nextdir)) - { - ErrorExt(this, m_clientdata, module, "{0}: Error fetching directory link", m_name); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabUInt(ref nextdir); - - return true; - } - - internal static void setString(out string cpp, string cp) - { - cpp = cp; - } - - internal static void setShortArray(out short[] wpp, short[] wp, int n) - { - wpp = new short[n]; - for (int i = 0; i < n; i++) - wpp[i] = wp[i]; - } - - internal static void setLongArray(out int[] lpp, int[] lp, int n) - { - lpp = new int[n]; - for (int i = 0; i < n; i++) - lpp[i] = lp[i]; - } - - internal static void setFloatArray(out float[] fpp, float[] fp, int n) - { - fpp = new float[n]; - for (int i = 0; i < n; i++) - fpp[i] = fp[i]; - } - - internal bool fieldSet(int field) - { - return ((m_dir.td_fieldsset[field / 32] & BITn(field)) != 0); - } - - internal void setFieldBit(int field) - { - m_dir.td_fieldsset[field / 32] |= BITn(field); - } - - internal void clearFieldBit(int field) - { - m_dir.td_fieldsset[field / 32] &= ~BITn(field); - } - - /// - /// Compression schemes statically built into the library. - /// - private void setupBuiltInCodecs() - { - // change initial syntax of m_builtInCodecs, maintains easier. - // San Chen - - m_builtInCodecs = new TiffCodec[] - { - new TiffCodec(this, (Compression)(-1), "Not configured"), - new DumpModeCodec(this, Compression.None, "None"), - new LZWCodec(this, Compression.LZW, "LZW"), - new PackBitsCodec(this, Compression.PackBits, "PackBits"), - new TiffCodec(this, Compression.ThunderScan, "ThunderScan"), - new TiffCodec(this, Compression.NeXT, "NeXT"), - new JpegCodec(this, Compression.JPEG, "JPEG"), - new OJpegCodec(this, Compression.OJPEG, "Old-style JPEG"), - new CCITTCodec(this, Compression.CCITTRLE, "CCITT RLE"), - new CCITTCodec(this, Compression.CCITTRLEW, "CCITT RLE/W"), - new CCITTCodec(this, Compression.CCITTFAX3, "CCITT Group 3"), - new CCITTCodec(this, Compression.CCITTFAX4, "CCITT Group 4"), - new TiffCodec(this, Compression.JBIG, "ISO JBIG"), - new DeflateCodec(this, Compression.Deflate, "Deflate"), - new DeflateCodec(this, Compression.AdobeDeflate, "AdobeDeflate"), - new TiffCodec(this, Compression.PixarLog, "PixarLog"), - new TiffCodec(this, Compression.SGILOG, "SGILog"), - new TiffCodec(this, Compression.SGILOG24, "SGILog24"), - null, - }; - } - - private static bool defaultTransferFunction(TiffDirectory td) - { - short[][] tf = td.td_transferfunction; - tf[0] = null; - tf[1] = null; - tf[2] = null; - - if (td.td_bitspersample >= sizeof(int) * 8 - 2) - return false; - - int n = 1 << td.td_bitspersample; - tf[0] = new short[n]; - tf[0][0] = 0; - for (int i = 1; i < n; i++) - { - double t = (double)i / ((double)n - 1.0); - tf[0][i] = (short)Math.Floor(65535.0 * Math.Pow(t, 2.2) + 0.5); - } - - if (td.td_samplesperpixel - td.td_extrasamples > 1) - { - tf[1] = new short[n]; - Buffer.BlockCopy(tf[0], 0, tf[1], 0, tf[0].Length * sizeof(short)); - - tf[2] = new short[n]; - Buffer.BlockCopy(tf[0], 0, tf[2], 0, tf[0].Length * sizeof(short)); - } - - return true; - } - - private static void defaultRefBlackWhite(TiffDirectory td) - { - td.td_refblackwhite = new float[6]; - if (td.td_photometric == Photometric.YCBCR) - { - // YCbCr (Class Y) images must have the ReferenceBlackWhite tag set. Fix the - // broken images, which lacks that tag. - td.td_refblackwhite[0] = 0.0F; - td.td_refblackwhite[1] = td.td_refblackwhite[3] = td.td_refblackwhite[5] = 255.0F; - td.td_refblackwhite[2] = td.td_refblackwhite[4] = 128.0F; - } - else - { - // Assume RGB (Class R) - for (int i = 0; i < 3; i++) - { - td.td_refblackwhite[2 * i + 0] = 0; - td.td_refblackwhite[2 * i + 1] = (float)((1L << td.td_bitspersample) - 1L); - } - } - } - - internal static int readInt(byte[] buffer, int offset) - { - int value = buffer[offset++] & 0xFF; - value += (buffer[offset++] & 0xFF) << 8; - value += (buffer[offset++] & 0xFF) << 16; - value += buffer[offset++] << 24; - return value; - } - - internal static void writeInt(int value, byte[] buffer, int offset) - { - buffer[offset++] = (byte)value; - buffer[offset++] = (byte)(value >> 8); - buffer[offset++] = (byte)(value >> 16); - buffer[offset++] = (byte)(value >> 24); - } - - internal static short readShort(byte[] buffer, int offset) - { - short value = (short)(buffer[offset] & 0xFF); - value += (short)((buffer[offset + 1] & 0xFF) << 8); - return value; - } - - internal static void fprintf(Stream fd, string format, params object[] list) - { - string s = string.Format(CultureInfo.InvariantCulture, format, list); - byte[] bytes = Latin1Encoding.GetBytes(s); - fd.Write(bytes, 0, bytes.Length); - } - - private static string encodeOctalString(byte value) - { - //convert to int, for cleaner syntax below. - int x = value; - - //return octal encoding \ddd of the character value. - return string.Format(CultureInfo.InvariantCulture, @"\{0}{1}{2}", (x >> 6) & 7, (x >> 3) & 7, x & 7); - } - - /// - /// Delegate for LibTiff.Net extender method - /// - /// An instance of the class. - /// - /// Extender method is usually used for registering custom tags. - /// To setup extender method that will be called upon creation of - /// each instance of object please use - /// method. - /// - public delegate void TiffExtendProc(Tiff tif); - - /// - /// Delegate for a method used to image decoded spans. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The array of black and white run lengths (white then black). - /// The zero-based offset in array at - /// which current row's run begins. - /// The zero-based offset in array at - /// which next row's run begins. - /// The width in pixels of the row. - /// - /// To override the default method used to image decoded spans please set - /// tag with an instance of this delegate. - /// - /// Fill methods can assume the array has room for at least - /// runs and can overwrite data in the - /// array as needed (e.g. to append zero runs to bring the count up to a nice multiple). - /// - public delegate void FaxFillFunc( - byte[] buffer, int offset, int[] runs, int thisRunOffset, int nextRunOffset, int width); - - /// - /// Gets the library version string. - /// - /// The library version string. - public static string GetVersion() - { - return string.Format(CultureInfo.InvariantCulture, - "LibTiff.Net, Version {0}\nCopyright (C) 2008-2011, Bit Miracle.", AssemblyVersion); - } - - /// - /// Gets the version of the library's assembly. - /// - /// The version of the library's assembly. - public static string AssemblyVersion - { - get - { - return "Some version, but it doesn't really matter."; - } - } - - /// - /// Gets the R component from ABGR value returned by - /// ReadRGBAImage. - /// - /// The ABGR value. - /// The R component from ABGR value. - public static int GetR(int abgr) - { - return (abgr & 0xff); - } - - /// - /// Gets the G component from ABGR value returned by - /// ReadRGBAImage. - /// - /// The ABGR value. - /// The G component from ABGR value. - public static int GetG(int abgr) - { - return ((abgr >> 8) & 0xff); - } - - /// - /// Gets the B component from ABGR value returned by - /// ReadRGBAImage. - /// - /// The ABGR value. - /// The B component from ABGR value. - public static int GetB(int abgr) - { - return ((abgr >> 16) & 0xff); - } - - /// - /// Gets the A component from ABGR value returned by - /// ReadRGBAImage. - /// - /// The ABGR value. - /// The A component from ABGR value. - public static int GetA(int abgr) - { - return ((abgr >> 24) & 0xff); - } - - /// - /// Retrieves the codec registered for the specified compression scheme. - /// - /// The compression scheme. - /// The codec registered for the specified compression scheme or null - /// if there is no codec registered for the given scheme. - /// - /// - /// LibTiff.Net supports a variety of compression schemes implemented by software codecs. - /// Each codec adheres to a modular interface that provides for the decoding and encoding - /// of image data; as well as some other methods for initialization, setup, cleanup, and - /// the control of default strip and tile sizes. Codecs are identified by the associated - /// value of the .Compression tag. - /// - /// - /// Other compression schemes may be registered. Registered schemes can also override the - /// built-in versions provided by the library. - /// - /// - public TiffCodec FindCodec(Compression scheme) - { - for (codecList list = m_registeredCodecs; list != null; list = list.next) - { - if (list.codec.m_scheme == scheme) - return list.codec; - } - - for (int i = 0; m_builtInCodecs[i] != null; i++) - { - TiffCodec codec = m_builtInCodecs[i]; - if (codec.m_scheme == scheme) - return codec; - } - - return null; - } - - /// - /// Adds specified codec to a list of registered codec. - /// - /// The codec to register. - /// - /// This method can be used to augment or override the set of codecs available to an - /// application. If the is for a scheme that already has a - /// registered codec then it is overridden and any images with data encoded with this - /// compression scheme will be decoded using the supplied codec. - /// - public void RegisterCodec(TiffCodec codec) - { - if (codec == null) - throw new ArgumentNullException("codec"); - - codecList list = new codecList(); - list.codec = codec; - list.next = m_registeredCodecs; - m_registeredCodecs = list; - } - - /// - /// Removes specified codec from a list of registered codecs. - /// - /// The codec to remove from a list of registered codecs. - public void UnRegisterCodec(TiffCodec codec) - { - if (m_registeredCodecs == null) - return; - - codecList temp; - if (m_registeredCodecs.codec == codec) - { - temp = m_registeredCodecs.next; - m_registeredCodecs = temp; - return; - } - - for (codecList list = m_registeredCodecs; list != null; list = list.next) - { - if (list.next != null) - { - if (list.next.codec == codec) - { - temp = list.next.next; - list.next = temp; - return; - } - } - } - - ErrorExt(this, 0, "UnRegisterCodec", - "Cannot remove compression scheme {0}; not registered", codec.m_name); - } - - /// - /// Checks whether library has working codec for the specific compression scheme. - /// - /// The scheme to check. - /// - /// true if the codec is configured and working; otherwise, false. - /// - public bool IsCodecConfigured(Compression scheme) - { - TiffCodec codec = FindCodec(scheme); - - if (codec == null) - return false; - - if (codec.CanEncode != false || codec.CanDecode != false) - return true; - - return false; - } - - /// - /// Retrieves an array of configured codecs, both built-in and registered by user. - /// - /// An array of configured codecs. - public TiffCodec[] GetConfiguredCodecs() - { - int totalCodecs = 0; - for (int i = 0; m_builtInCodecs[i] != null; i++) - { - if (m_builtInCodecs[i] != null && IsCodecConfigured(m_builtInCodecs[i].m_scheme)) - totalCodecs++; - } - - for (codecList cd = m_registeredCodecs; cd != null; cd = cd.next) - totalCodecs++; - - TiffCodec[] codecs = new TiffCodec[totalCodecs]; - - int codecPos = 0; - for (codecList cd = m_registeredCodecs; cd != null; cd = cd.next) - codecs[codecPos++] = cd.codec; - - for (int i = 0; m_builtInCodecs[i] != null; i++) - { - if (m_builtInCodecs[i] != null && IsCodecConfigured(m_builtInCodecs[i].m_scheme)) - codecs[codecPos++] = m_builtInCodecs[i]; - } - - return codecs; - } - - /// - /// Allocates new byte array of specified size and copies data from the existing to - /// the new array. - /// - /// The existing array. - /// The number of elements in new array. - /// - /// The new byte array of specified size with data from the existing array. - /// - /// Allocates new array of specified size and copies data from the existing to - /// the new array. - internal static byte[] Realloc(byte[] array, int size) - { - byte[] newArray = new byte[size]; - if (array != null) - { - int copyLength = Math.Min(array.Length, size); - Buffer.BlockCopy(array, 0, newArray, 0, copyLength); - } - - return newArray; - } - - /// - /// Allocates new integer array of specified size and copies data from the existing to - /// the new array. - /// - /// The existing array. - /// The number of elements in new array. - /// - /// The new integer array of specified size with data from the existing array. - /// - /// Size of the array is in elements, not bytes. - private static int[] Realloc(int[] array, int size) - { - int[] newArray = new int[size]; - if (array != null) - { - int copyLength = Math.Min(array.Length, size); - Buffer.BlockCopy(array, 0, newArray, 0, copyLength * sizeof(int)); - } - - return newArray; - } - - /// - /// Compares specified number of elements in two arrays. - /// - /// The first array to compare. - /// The second array to compare. - /// The number of elements to compare. - /// - /// The difference between compared elements or 0 if all elements are equal. - /// - private static int Compare(short[] first, short[] second, int elementCount) - { - for (int i = 0; i < elementCount; i++) - { - if (first[i] != second[i]) - return first[i] - second[i]; - } - - return 0; - } - - /// - /// Initializes new instance of class and opens a TIFF file for - /// reading or writing. - /// - /// The name of the file to open. - /// The open mode. Specifies if the file is to be opened for - /// reading ("r"), writing ("w"), or appending ("a") and, optionally, whether to override - /// certain default aspects of library operation (see remarks). - /// The new instance of class if specified file is - /// successfully opened; otherwise, null. - /// - /// - /// opens a TIFF file whose name is . When - /// a file is opened for appending, existing data will not be touched; instead new data - /// will be written as additional subfiles. If an existing file is opened for writing, - /// all previous data is overwritten. - /// - /// - /// If a file is opened for reading, the first TIFF directory in the file is automatically - /// read (see for reading directories other than the first). If - /// a file is opened for writing or appending, a default directory is automatically - /// created for writing subsequent data. This directory has all the default values - /// specified in TIFF Revision 6.0: BitsPerSample = 1, ThreshHolding = Threshold.BILevel - /// (bilevel art scan), BitOrder = BigEndian (most significant bit of each data byte is - /// filled first), Orientation = TopLeft (the 0th row represents the visual top of the - /// image, and the 0th column represents the visual left hand side), SamplesPerPixel = 1, - /// RowsPerStrip = infinity, ResolutionUnit = Inch, and Compression = None. To alter - /// these values, or to define values for additional fields, must - /// be used. - /// - /// - /// The parameter can include the following flags in addition to - /// the "r", "w", and "a" flags. Note however that option flags must follow the - /// read-write-append specification. - /// - /// - /// FlagDescription - /// l - /// When creating a new file force information be written with Little-BitOrder - /// byte order (but see below). - /// b - /// When creating a new file force information be written with Big-BitOrder - /// byte order (but see below). - /// L - /// Force image data that is read or written to be treated with bits filled - /// from Least Significant Bit (LSB) to Most Significant Bit (MSB). Note that this is the - /// opposite to the way the library has worked from its inception. - /// B - /// Force image data that is read or written to be treated with bits filled - /// from Most Significant Bit (MSB) to Least Significant Bit (LSB); this is the - /// default. - /// H - /// Force image data that is read or written to be treated with bits filled - /// in the same order as the native CPU. - /// C - /// Enable the use of "strip chopping" when reading images that are comprised - /// of a single strip or tile of uncompressed data. Strip chopping is a mechanism by which - /// the library will automatically convert the single-strip image to multiple strips, each - /// of which has about 8 Kilobytes of data. This facility can be useful in reducing the - /// amount of memory used to read an image because the library normally reads each strip - /// in its entirety. Strip chopping does however alter the apparent contents of the image - /// because when an image is divided into multiple strips it looks as though the - /// underlying file contains multiple separate strips. The default behaviour is to enable - /// strip chopping. - /// c - /// Disable the use of strip chopping when reading images. - /// h - /// Read TIFF header only, do not load the first image directory. That could - /// be useful in case of the broken first directory. We can open the file and proceed to - /// the other directories. - /// - /// By default the library will create new files with the native byte-order of the CPU on - /// which the application is run. This ensures optimal performance and is portable to any - /// application that conforms to the TIFF specification. To force the library to use a - /// specific byte-order when creating a new file the "b" and "l" option flags may be - /// included in the parameter; for example, "wb" or "wl". - /// The use of the "l" and "b" flags is strongly discouraged. These flags are - /// provided solely because numerous vendors do not correctly support TIFF; they only - /// support one of the two byte orders. It is strongly recommended that you not use this - /// feature except to deal with busted apps that write invalid TIFF. - /// The "L", "B", and "H" flags are intended for applications that can optimize - /// operations on data by using a particular bit order. By default the library returns - /// data in BigEndian bit order. Returning data in the bit order of the native CPU makes the - /// most sense but also requires applications to check the value of the - /// tag; something they probably do not do right now. - /// The "c" option permits applications that only want to look at the tags, for - /// example, to get the unadulterated TIFF tag information. - /// - public static Tiff Open(string fileName, string mode) - { - const string module = "Open"; - - FileMode fileMode; - FileAccess fileAccess; - getMode(mode, module, out fileMode, out fileAccess); - - FileStream stream = null; - try - { - if (fileAccess == FileAccess.Read) - stream = File.Open(fileName, fileMode, fileAccess, FileShare.Read); - else - stream = File.Open(fileName, fileMode, fileAccess); - } - catch (Exception e) - { - Error(module, "Failed to open '{0}'. {1}", fileName, e.Message); - return null; - } - - Tiff tif = ClientOpen(fileName, mode, stream, new TiffStream()); - if (tif == null) - stream.Dispose(); - else - tif.m_fileStream = stream; - - return tif; - } - - public static Tiff Open(Stream s) - { - Tiff tif = ClientOpen("Temp.tiff", "r", s, new TiffStream()); - tif.m_fileStream = s; - return tif; - } - - //public static Tiff OpenForWrite(Stream s) - //{ - // Tiff tif = ClientOpen("Temp.tiff", "w", s, new TiffStream()); - // tif.m_fileStream = s; - // return tif; - //} - - /// - /// Initializes new instance of class and opens a stream with TIFF data - /// for reading or writing. - /// - /// The name for the new instance of class. - /// The open mode. Specifies if the file is to be opened for - /// reading ("r"), writing ("w"), or appending ("a") and, optionally, whether to override - /// certain default aspects of library operation (see remarks for - /// method for the list of the mode flags). - /// Some client data. This data is passed as parameter to every - /// method of the object specified by the - /// parameter. - /// An instance of the class to use for - /// reading, writing and seeking of TIFF data. - /// The new instance of class if stream is successfully - /// opened; otherwise, null. - /// - /// - /// This method can be used to read TIFF data from sources other than file. When custom - /// stream class derived from is used it is possible to read (or - /// write) TIFF data that reside in memory, database, etc. - /// - /// Please note, that is an arbitrary string used as - /// ID for the created . It's not required to be a file name or anything - /// meaningful at all. - /// - /// Please read remarks for method for the list of option flags that - /// can be specified in parameter. - /// - /// - public static Tiff ClientOpen(string name, string mode, object clientData, TiffStream stream) - { - const string module = "ClientOpen"; - - if (mode == null || mode.Length == 0) - { - ErrorExt(null, clientData, module, "{0}: mode string should contain at least one char", name); - return null; - } - - FileMode fileMode; - FileAccess fileAccess; - int m = getMode(mode, module, out fileMode, out fileAccess); - - Tiff tif = new Tiff(); - tif.m_name = name; - - tif.m_mode = m & ~(O_CREAT | O_TRUNC); - tif.m_curdir = -1; // non-existent directory - tif.m_curoff = 0; - tif.m_curstrip = -1; // invalid strip - tif.m_row = -1; // read/write pre-increment - tif.m_clientdata = clientData; - - if (stream == null) - { - ErrorExt(tif, clientData, module, "TiffStream is null pointer."); - return null; - } - - tif.m_stream = stream; - - // setup default state - tif.m_currentCodec = tif.m_builtInCodecs[0]; - - // Default is to return data BigEndian and enable the use of - // strip chopping when a file is opened read-only. - tif.m_flags = TiffFlags.BigEndian; - - if (m == O_RDONLY || m == O_RDWR) - tif.m_flags |= STRIPCHOP_DEFAULT; - - // Process library-specific flags in the open mode string. - // See remarks for Open method for the list of supported flags. - int modelength = mode.Length; - for (int i = 0; i < modelength; i++) - { - switch (mode[i]) - { - case 'b': - if ((m & O_CREAT) != 0) - tif.m_flags |= TiffFlags.Swab; - break; - case 'l': - break; - case 'B': - tif.m_flags = (tif.m_flags & ~TiffFlags.FillOrder) | TiffFlags.BigEndian; - break; - case 'L': - tif.m_flags = (tif.m_flags & ~TiffFlags.FillOrder) | TiffFlags.LittleEndian; - break; - case 'H': - tif.m_flags = (tif.m_flags & ~TiffFlags.FillOrder) | TiffFlags.LittleEndian; - break; - case 'C': - if (m == O_RDONLY) - tif.m_flags |= TiffFlags.StripChop; - break; - case 'c': - if (m == O_RDONLY) - tif.m_flags &= ~TiffFlags.StripChop; - break; - case 'h': - tif.m_flags |= TiffFlags.HeaderOnly; - break; - } - } - - // Read in TIFF header. - - if ((tif.m_mode & O_TRUNC) != 0 || !tif.readHeaderOk(ref tif.m_header)) - { - if (tif.m_mode == O_RDONLY) - { - ErrorExt(tif, tif.m_clientdata, name, "Cannot read TIFF header"); - return null; - } - - // Setup header and write. - - if ((tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - tif.m_header.tiff_magic = TIFF_BIGENDIAN; - else - tif.m_header.tiff_magic = TIFF_LITTLEENDIAN; - - tif.m_header.tiff_version = TIFF_VERSION; - if ((tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabShort(ref tif.m_header.tiff_version); - - tif.m_header.tiff_diroff = 0; // filled in later - - tif.seekFile(0, SeekOrigin.Begin); - - if (!tif.writeHeaderOK(tif.m_header)) - { - ErrorExt(tif, tif.m_clientdata, name, "Error writing TIFF header"); - tif.m_mode = O_RDONLY; - return null; - } - - // Setup the byte order handling. - tif.initOrder(tif.m_header.tiff_magic); - - // Setup default directory. - tif.setupDefaultDirectory(); - tif.m_diroff = 0; - tif.m_dirlist = null; - tif.m_dirlistsize = 0; - tif.m_dirnumber = 0; - return tif; - } - - // Setup the byte order handling. - if (tif.m_header.tiff_magic != TIFF_BIGENDIAN && - tif.m_header.tiff_magic != TIFF_LITTLEENDIAN && - tif.m_header.tiff_magic != MDI_LITTLEENDIAN) - { - ErrorExt(tif, tif.m_clientdata, name, - "Not a TIFF or MDI file, bad magic number {0} (0x{1:x})", - tif.m_header.tiff_magic, tif.m_header.tiff_magic); - tif.m_mode = O_RDONLY; - return null; - } - - tif.initOrder(tif.m_header.tiff_magic); - - // Swap header if required. - if ((tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - SwabShort(ref tif.m_header.tiff_version); - SwabUInt(ref tif.m_header.tiff_diroff); - } - - // Now check version (if needed, it's been byte-swapped). - // Note that this isn't actually a version number, it's a - // magic number that doesn't change (stupid). - if (tif.m_header.tiff_version == TIFF_BIGTIFF_VERSION) - { - ErrorExt(tif, tif.m_clientdata, name, - "This is a BigTIFF file. This format not supported\nby this version of LibTiff.Net."); - tif.m_mode = O_RDONLY; - return null; - } - - if (tif.m_header.tiff_version != TIFF_VERSION) - { - ErrorExt(tif, tif.m_clientdata, name, - "Not a TIFF file, bad version number {0} (0x{1:x})", - tif.m_header.tiff_version, tif.m_header.tiff_version); - tif.m_mode = O_RDONLY; - return null; - } - - tif.m_flags |= TiffFlags.MyBuffer; - tif.m_rawcp = 0; - tif.m_rawdata = null; - tif.m_rawdatasize = 0; - - // Sometimes we do not want to read the first directory (for example, - // it may be broken) and want to proceed to other directories. I this - // case we use the HeaderOnly flag to open file and return - // immediately after reading TIFF header. - if ((tif.m_flags & TiffFlags.HeaderOnly) == TiffFlags.HeaderOnly) - return tif; - - // Setup initial directory. - switch (mode[0]) - { - case 'r': - tif.m_nextdiroff = tif.m_header.tiff_diroff; - - if (tif.ReadDirectory()) - { - tif.m_rawcc = -1; - tif.m_flags |= TiffFlags.BufferSetup; - return tif; - } - break; - case 'a': - // New directories are automatically append to the end of - // the directory chain when they are written out (see WriteDirectory). - tif.setupDefaultDirectory(); - return tif; - } - - tif.m_mode = O_RDONLY; - return null; - } - - /// - /// Closes a previously opened TIFF file. - /// - /// - /// This method closes a file or stream that was previously opened with - /// or . Any buffered data are flushed to the file/stream, - /// including the contents of the current directory (if modified); and all resources - /// are reclaimed. - /// - public void Close() - { - Flush(); - - m_stream.Close(m_clientdata); - - if (m_fileStream != null) - m_fileStream.Close(); - } - - /// - /// Frees and releases all resources allocated by this . - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Gets the number of elements in the custom tag list. - /// - /// The number of elements in the custom tag list. - public int GetTagListCount() - { - return m_dir.td_customValueCount; - } - - /// - /// Retrieves the custom tag with specified index. - /// - /// The zero-based index of a custom tag to retrieve. - /// The custom tag with specified index. - public int GetTagListEntry(int index) - { - if (index < 0 || index >= m_dir.td_customValueCount) - return -1; - else - return (int)m_dir.td_customValues[index].info.Tag; - } - - /// - /// Merges given field information to existing one. - /// - /// The array of objects. - /// The number of items to use from the array. - public void MergeFieldInfo(TiffFieldInfo[] info, int count) - { - m_foundfield = null; - - if (m_nfields > 0) - m_fieldinfo = Realloc(m_fieldinfo, m_nfields, m_nfields + count); - else - m_fieldinfo = new TiffFieldInfo[count]; - - for (int i = 0; i < count; i++) - { - TiffFieldInfo fip = FindFieldInfo(info[i].Tag, info[i].Type); - - // only add definitions that aren't already present - if (fip == null) - { - m_fieldinfo[m_nfields] = info[i]; - m_nfields++; - } - } - - // Sort the field info by tag number - IComparer myComparer = new TagCompare(); - Array.Sort(m_fieldinfo, 0, m_nfields, myComparer); - } - - /// - /// Retrieves field information for the specified tag. - /// - /// The tag to retrieve field information for. - /// The tiff data type to use us additional filter. - /// The field information for specified tag with specified type or null if - /// the field information wasn't found. - public TiffFieldInfo FindFieldInfo(TiffTag tag, TiffType type) - { - if (m_foundfield != null && m_foundfield.Tag == tag && - (type == TiffType.Any || type == m_foundfield.Type)) - { - return m_foundfield; - } - - // If we are invoked with no field information, then just return. - if (m_fieldinfo == null) - return null; - - m_foundfield = null; - - foreach (TiffFieldInfo info in m_fieldinfo) - { - if (info != null && info.Tag == tag && (type == TiffType.Any || type == info.Type)) - { - m_foundfield = info; - break; - } - } - - return m_foundfield; - } - - /// - /// Retrieves field information for the tag with specified name. - /// - /// The name of the tag to retrieve field information for. - /// The tiff data type to use us additional filter. - /// The field information for specified tag with specified type or null if - /// the field information wasn't found. - public TiffFieldInfo FindFieldInfoByName(string name, TiffType type) - { - if (m_foundfield != null && m_foundfield.Name == name && - (type == TiffType.Any || type == m_foundfield.Type)) - { - return m_foundfield; - } - - // If we are invoked with no field information, then just return. - if (m_fieldinfo == null) - return null; - - m_foundfield = null; - - foreach (TiffFieldInfo info in m_fieldinfo) - { - if (info != null && info.Name == name && - (type == TiffType.Any || type == info.Type)) - { - m_foundfield = info; - break; - } - } - - return m_foundfield; - } - - /// - /// Retrieves field information for the specified tag. - /// - /// The tag to retrieve field information for. - /// The field information for specified tag or null if - /// the field information wasn't found. - public TiffFieldInfo FieldWithTag(TiffTag tag) - { - TiffFieldInfo fip = FindFieldInfo(tag, TiffType.Any); - if (fip != null) - return fip; - - ErrorExt(this, m_clientdata, "FieldWithTag", "Internal error, unknown tag 0x{0:x}", tag); - Debug.Assert(false); - return null; - } - - /// - /// Retrieves field information for the tag with specified name. - /// - /// The name of the tag to retrieve field information for. - /// The field information for specified tag or null if - /// the field information wasn't found. - public TiffFieldInfo FieldWithName(string name) - { - TiffFieldInfo fip = FindFieldInfoByName(name, TiffType.Any); - if (fip != null) - return fip; - - ErrorExt(this, m_clientdata, "FieldWithName", "Internal error, unknown tag {0}", name); - Debug.Assert(false); - return null; - } - - /// - /// Gets the currently used tag methods. - /// - /// The currently used tag methods. - public TiffTagMethods GetTagMethods() - { - return m_tagmethods; - } - - /// - /// Sets the new tag methods to use. - /// - /// Tag methods. - /// The previously used tag methods. - public TiffTagMethods SetTagMethods(TiffTagMethods methods) - { - TiffTagMethods prevTagMethods = m_tagmethods; - - if (methods != null) - m_tagmethods = methods; - - return prevTagMethods; - } - - /// - /// Gets the extra information with specified name associated with this . - /// - /// Name of the extra information to retrieve. - /// The extra information with specified name associated with - /// this or null if extra information with specified - /// name was not found. - public object GetClientInfo(string name) - { - // should get copy - clientInfoLink link = m_clientinfo; - - while (link != null && link.name != name) - link = link.next; - - if (link != null) - return link.data; - - return null; - } - - /// - /// Associates extra information with this . - /// - /// The information to associate with this . - /// The name (label) of the information. - /// If there is already an extra information with the name specified by - /// it will be replaced by the information specified by - /// . - public void SetClientInfo(object data, string name) - { - clientInfoLink link = m_clientinfo; - - // Do we have an existing link with this name? If so, just set it. - while (link != null && link.name != name) - link = link.next; - - if (link != null) - { - link.data = data; - return; - } - - // Create a new link. - link = new clientInfoLink(); - link.next = m_clientinfo; - link.name = name; - link.data = data; - - m_clientinfo = link; - } - - /// - /// Flushes pending writes to an open TIFF file. - /// - /// true if succeeded; otherwise, false - /// causes any pending writes for the specified file - /// (including writes for the current directory) to be done. In normal operation this call - /// is never needed − the library automatically does any flushing required. - /// - /// - public bool Flush() - { - if (m_mode != O_RDONLY) - { - if (!FlushData()) - return false; - - if ((m_flags & TiffFlags.DirtyDirect) == TiffFlags.DirtyDirect && !WriteDirectory()) - return false; - } - - return true; - } - - /// - /// Flushes any pending image data for the specified file to be written out. - /// - /// true if succeeded; otherwise, false - /// flushes any pending image data for the specified file - /// to be written out; directory-related data are not flushed. In normal operation this - /// call is never needed − the library automatically does any flushing required. - /// - /// - public bool FlushData() - { - if ((m_flags & TiffFlags.BeenWriting) != TiffFlags.BeenWriting) - return false; - - if ((m_flags & TiffFlags.PostEncode) == TiffFlags.PostEncode) - { - m_flags &= ~TiffFlags.PostEncode; - if (!m_currentCodec.PostEncode()) - return false; - } - - return flushData1(); - } - - /// - /// Gets the value(s) of a tag in an open TIFF file. - /// - /// The tag. - /// The value(s) of a tag in an open TIFF file as array of - /// objects or null if there is no such tag set. - /// - /// - /// returns the value(s) of a tag or pseudo-tag associated with the - /// current directory of the opened TIFF file. The tag is identified by - /// . The type and number of values returned is dependent on the - /// tag being requested. You may want to consult - /// "Well-known tags and their - /// value(s) data types" to become familiar with exact data types and calling - /// conventions required for each tag supported by the library. - /// - /// - /// A pseudo-tag is a parameter that is used to control the operation of the library but - /// whose value is not read or written to the underlying file. - /// - /// - /// - public FieldValue[] GetField(TiffTag tag) - { - TiffFieldInfo fip = FindFieldInfo(tag, TiffType.Any); - if (fip != null && (isPseudoTag(tag) || fieldSet(fip.Bit))) - return m_tagmethods.GetField(this, tag); - - return null; - } - - /// - /// Gets the value(s) of a tag in an open TIFF file or default value(s) of a tag if a tag - /// is not defined in the current directory and it has a default value(s). - /// - /// The tag. - /// - /// The value(s) of a tag in an open TIFF file as array of - /// objects or null if there is no such tag set and - /// tag has no default value. - /// - /// - /// - /// returns the value(s) of a tag or pseudo-tag associated - /// with the current directory of the opened TIFF file or default value(s) of a tag if a - /// tag is not defined in the current directory and it has a default value(s). The tag is - /// identified by . The type and number of values returned is - /// dependent on the tag being requested. You may want to consult - /// "Well-known tags and their - /// value(s) data types" to become familiar with exact data types and calling - /// conventions required for each tag supported by the library. - /// - /// - /// A pseudo-tag is a parameter that is used to control the operation of the library but - /// whose value is not read or written to the underlying file. - /// - /// - /// - public FieldValue[] GetFieldDefaulted(TiffTag tag) - { - TiffDirectory td = m_dir; - - FieldValue[] result = GetField(tag); - if (result != null) - return result; - - switch (tag) - { - case TiffTag.SubFileType: - result = new FieldValue[1]; - result[0].Set(td.td_subfiletype); - break; - case TiffTag.BitsPerSample: - result = new FieldValue[1]; - result[0].Set(td.td_bitspersample); - break; - case TiffTag.Threshholding: - result = new FieldValue[1]; - result[0].Set(td.td_threshholding); - break; - case TiffTag.FillOrder: - result = new FieldValue[1]; - result[0].Set(td.td_fillorder); - break; - case TiffTag.Orientation: - result = new FieldValue[1]; - result[0].Set(td.td_orientation); - break; - case TiffTag.SamplesPerPixel: - result = new FieldValue[1]; - result[0].Set(td.td_samplesperpixel); - break; - case TiffTag.RowsPerStrip: - result = new FieldValue[1]; - result[0].Set(td.td_rowsperstrip); - break; - case TiffTag.MinSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_minsamplevalue); - break; - case TiffTag.MaxSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_maxsamplevalue); - break; - case TiffTag.PlanarConfig: - result = new FieldValue[1]; - result[0].Set(td.td_planarconfig); - break; - case TiffTag.ResolutionUnit: - result = new FieldValue[1]; - result[0].Set(td.td_resolutionunit); - break; - case TiffTag.Predictor: - CodecWithPredictor sp = m_currentCodec as CodecWithPredictor; - if (sp != null) - { - result = new FieldValue[1]; - result[0].Set(sp.GetPredictorValue()); - } - break; - case TiffTag.DotRange: - result = new FieldValue[2]; - result[0].Set(0); - result[1].Set((1 << td.td_bitspersample) - 1); - break; - case TiffTag.InkSet: - result = new FieldValue[1]; - result[0].Set(InkSet.CMYK); - break; - case TiffTag.NumberOfInks: - result = new FieldValue[1]; - result[0].Set(4); - break; - case TiffTag.ExtraSamples: - result = new FieldValue[2]; - result[0].Set(td.td_extrasamples); - result[1].Set(td.td_sampleinfo); - break; - case TiffTag.MATTEING: - result = new FieldValue[1]; - result[0].Set((td.td_extrasamples == 1 && td.td_sampleinfo[0] == ExtraSample.AssociatedAlpha)); - break; - case TiffTag.TILEDEPTH: - result = new FieldValue[1]; - result[0].Set(td.td_tiledepth); - break; - case TiffTag.DATATYPE: - result = new FieldValue[1]; - result[0].Set(td.td_sampleformat - 1); - break; - case TiffTag.SampleFormat: - result = new FieldValue[1]; - result[0].Set(td.td_sampleformat); - break; - case TiffTag.IMAGEDEPTH: - result = new FieldValue[1]; - result[0].Set(td.td_imagedepth); - break; - case TiffTag.YCBCRCOEFFICIENTS: - { - // defaults are from CCIR Recommendation 601-1 - float[] ycbcrcoeffs = new float[3]; - ycbcrcoeffs[0] = 0.299f; - ycbcrcoeffs[1] = 0.587f; - ycbcrcoeffs[2] = 0.114f; - - result = new FieldValue[1]; - result[0].Set(ycbcrcoeffs); - break; - } - case TiffTag.YCBCRSUBSAMPLING: - result = new FieldValue[2]; - result[0].Set(td.td_ycbcrsubsampling[0]); - result[1].Set(td.td_ycbcrsubsampling[1]); - break; - case TiffTag.YCBCRPOSITIONING: - result = new FieldValue[1]; - result[0].Set(td.td_ycbcrpositioning); - break; - case TiffTag.WhitePoint: - { - // TIFF 6.0 specification tells that it is no default value for the - // WhitePoint, but AdobePhotoshop TIFF Technical Note tells that it - // should be CIE D50. - float[] whitepoint = new float[2]; - whitepoint[0] = D50_X0 / (D50_X0 + D50_Y0 + D50_Z0); - whitepoint[1] = D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0); - - result = new FieldValue[1]; - result[0].Set(whitepoint); - break; - } - case TiffTag.TransferFunction: - if (td.td_transferfunction[0] == null && !defaultTransferFunction(td)) - { - ErrorExt(this, m_clientdata, m_name, "No space for \"TransferFunction\" tag"); - return null; - } - - result = new FieldValue[3]; - result[0].Set(td.td_transferfunction[0]); - if (td.td_samplesperpixel - td.td_extrasamples > 1) - { - result[1].Set(td.td_transferfunction[1]); - result[2].Set(td.td_transferfunction[2]); - } - break; - case TiffTag.REFERENCEBLACKWHITE: - if (td.td_refblackwhite == null) - defaultRefBlackWhite(td); - - result = new FieldValue[1]; - result[0].Set(td.td_refblackwhite); - break; - } - - return result; - } - - /// - /// Reads the contents of the next TIFF directory in an open TIFF file/stream and makes - /// it the current directory. - /// - /// true if directory was successfully read; otherwise, false if an - /// error was encountered, or if there are no more directories to be read. - /// Directories are read sequentially. - /// Applications only need to call to read multiple - /// subfiles in a single TIFF file/stream - the first directory in a file/stream is - /// automatically read when or is called. - /// - /// The images that have a single uncompressed strip or tile of data are automatically - /// treated as if they were made up of multiple strips or tiles of approximately 8 - /// kilobytes each. This operation is done only in-memory; it does not alter the contents - /// of the file/stream. However, the construction of the "chopped strips" is visible to - /// the application through the number of strips returned by - /// or the number of tiles returned by . - /// - public bool ReadDirectory() - { - const string module = "ReadDirectory"; - - m_diroff = m_nextdiroff; - if (m_diroff == 0) - { - // no more directories - return false; - } - - // Check whether we have the last offset or bad offset (IFD looping). - if (!checkDirOffset(m_nextdiroff)) - return false; - - // Cleanup any previous compression state. - m_currentCodec.Cleanup(); - m_curdir++; - TiffDirEntry[] dir; - short dircount = fetchDirectory(m_nextdiroff, out dir, out m_nextdiroff); - if (dircount == 0) - { - ErrorExt(this, m_clientdata, module, "{0}: Failed to read directory at offset {1}", m_name, m_nextdiroff); - return false; - } - - // reset before new dir - m_flags &= ~TiffFlags.BeenWriting; - - // Setup default value and then make a pass over the fields to check type and tag - // information, and to extract info required to size data structures. A second pass is - // made afterwards to read in everthing not taken in the first pass. - - // free any old stuff and reinit - FreeDirectory(); - setupDefaultDirectory(); - - // Electronic Arts writes gray-scale TIFF files without a PlanarConfiguration - // directory entry. Thus we setup a default value here, even though the TIFF spec says - // there is no default value. - SetField(TiffTag.PlanarConfig, PlanarConfig.Contig); - - // Sigh, we must make a separate pass through the directory for the following reason: - // - // We must process the Compression tag in the first pass in order to merge in - // codec-private tag definitions (otherwise we may get complaints about unknown tags). - // However, the Compression tag may be dependent on the SamplesPerPixel tag value - // because older TIFF specs permited Compression to be written as a - // SamplesPerPixel-count tag entry. Thus if we don't first figure out the correct - // SamplesPerPixel tag value then we may end up ignoring the Compression tag value - // because it has an incorrect count value (if the true value of SamplesPerPixel is not 1). - // - // It sure would have been nice if Aldus had really thought this stuff through carefully. - - for (int i = 0; i < dircount; i++) - { - TiffDirEntry dp = dir[i]; - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - short temp = (short)dp.tdir_tag; - SwabShort(ref temp); - dp.tdir_tag = (TiffTag)(ushort)temp; - - temp = (short)dp.tdir_type; - SwabShort(ref temp); - dp.tdir_type = (TiffType)temp; - - SwabLong(ref dp.tdir_count); - SwabUInt(ref dp.tdir_offset); - } - - if (dp.tdir_tag == TiffTag.SamplesPerPixel) - { - if (!fetchNormalTag(dir[i])) - return false; - - dp.tdir_tag = TiffTag.Ignore; - } - } - - // First real pass over the directory. - int fix = 0; - bool diroutoforderwarning = false; - bool haveunknowntags = false; - for (int i = 0; i < dircount; i++) - { - if (dir[i].tdir_tag == TiffTag.Ignore) - continue; - - if (fix >= m_nfields) - fix = 0; - - // Silicon Beach (at least) writes unordered directory tags (violating the spec). - // Handle it here, but be obnoxious (maybe they'll fix it?). - if (dir[i].tdir_tag < m_fieldinfo[fix].Tag) - { - if (!diroutoforderwarning) - { - WarningExt(this, m_clientdata, module, - "{0}: invalid TIFF directory; tags are not sorted in ascending order", m_name); - diroutoforderwarning = true; - } - - fix = 0; // O(n^2) - } - - while (fix < m_nfields && m_fieldinfo[fix].Tag < dir[i].tdir_tag) - fix++; - - if (fix >= m_nfields || m_fieldinfo[fix].Tag != dir[i].tdir_tag) - { - // Unknown tag ... we'll deal with it below - haveunknowntags = true; - continue; - } - - // null out old tags that we ignore. - if (m_fieldinfo[fix].Bit == FieldBit.Ignore) - { - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - - // Check data type. - TiffFieldInfo fip = m_fieldinfo[fix]; - while (dir[i].tdir_type != fip.Type && fix < m_nfields) - { - if (fip.Type == TiffType.Any) - { - // wildcard - break; - } - - fip = m_fieldinfo[++fix]; - if (fix >= m_nfields || fip.Tag != dir[i].tdir_tag) - { - WarningExt(this, m_clientdata, module, - "{0}: wrong data type {1} for \"{2}\"; tag ignored", - m_name, dir[i].tdir_type, m_fieldinfo[fix - 1].Name); - - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - } - - // Check count if known in advance. - if (fip.ReadCount != TiffFieldInfo.Variable && - fip.ReadCount != TiffFieldInfo.Variable2) - { - int expected = fip.ReadCount; - if (fip.ReadCount == TiffFieldInfo.Spp) - expected = m_dir.td_samplesperpixel; - - if (!checkDirCount(dir[i], expected)) - { - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - } - - switch (dir[i].tdir_tag) - { - case TiffTag.Compression: - // The 5.0 spec says the Compression tag has one value, - // while earlier specs say it has one value per sample. - // Because of this, we accept the tag if one value is supplied. - if (dir[i].tdir_count == 1) - { - int v = extractData(dir[i]); - if (!SetField(dir[i].tdir_tag, v)) - return false; - - break; - // XXX: workaround for broken TIFFs - } - else if (dir[i].tdir_type == TiffType.Long) - { - int v; - if (!fetchPerSampleLongs(dir[i], out v) || !SetField(dir[i].tdir_tag, v)) - return false; - } - else - { - short iv; - if (!fetchPerSampleShorts(dir[i], out iv) || !SetField(dir[i].tdir_tag, iv)) - return false; - } - dir[i].tdir_tag = TiffTag.Ignore; - break; - case TiffTag.StripOffsets: - case TiffTag.StripByteCounts: - case TiffTag.TileOffsets: - case TiffTag.TileByteCounts: - setFieldBit(fip.Bit); - break; - case TiffTag.ImageWidth: - case TiffTag.ImageLength: - case TiffTag.IMAGEDEPTH: - case TiffTag.TileLength: - case TiffTag.TileWidth: - case TiffTag.TILEDEPTH: - case TiffTag.PlanarConfig: - case TiffTag.RowsPerStrip: - case TiffTag.ExtraSamples: - if (!fetchNormalTag(dir[i])) - return false; - dir[i].tdir_tag = TiffTag.Ignore; - break; - } - } - - // If we saw any unknown tags, make an extra pass over the directory to deal with - // them. This must be done separately because the tags could have become known when we - // registered a codec after finding the Compression tag. In a correctly-sorted - // directory there's no problem because Compression will come before any codec-private - // tags, but if the sorting is wrong that might not hold. - if (haveunknowntags) - { - fix = 0; - for (int i = 0; i < dircount; i++) - { - if (dir[i].tdir_tag == TiffTag.Ignore) - continue; - - if (fix >= m_nfields || dir[i].tdir_tag < m_fieldinfo[fix].Tag) - { - // O(n^2) - fix = 0; - } - - while (fix < m_nfields && m_fieldinfo[fix].Tag < dir[i].tdir_tag) - fix++; - - if (fix >= m_nfields || m_fieldinfo[fix].Tag != dir[i].tdir_tag) - { - Tiff.WarningExt(this, m_clientdata, module, - "{0}: unknown field with tag {1} (0x{2:x}) encountered", - m_name, (ushort)dir[i].tdir_tag, (ushort)dir[i].tdir_tag); - - TiffFieldInfo[] arr = new TiffFieldInfo[1]; - arr[0] = createAnonFieldInfo(dir[i].tdir_tag, dir[i].tdir_type); - MergeFieldInfo(arr, 1); - - fix = 0; - while (fix < m_nfields && m_fieldinfo[fix].Tag < dir[i].tdir_tag) - fix++; - } - - // Check data type. - TiffFieldInfo fip = m_fieldinfo[fix]; - while (dir[i].tdir_type != fip.Type && fix < m_nfields) - { - if (fip.Type == TiffType.Any) - { - // wildcard - break; - } - - fip = m_fieldinfo[++fix]; - if (fix >= m_nfields || fip.Tag != dir[i].tdir_tag) - { - Tiff.WarningExt(this, m_clientdata, module, - "{0}: wrong data type {1} for \"{2}\"; tag ignored", - m_name, dir[i].tdir_type, m_fieldinfo[fix - 1].Name); - - dir[i].tdir_tag = TiffTag.Ignore; - break; - } - } - } - } - - // XXX: OJPEG hack. - // If a) compression is OJPEG, b) planarconfig tag says it's separate, c) strip - // offsets/bytecounts tag are both present and d) both contain exactly one value, then - // we consistently find that the buggy implementation of the buggy compression scheme - // matches contig planarconfig best. So we 'fix-up' the tag here - if ((m_dir.td_compression == Compression.OJPEG) && (m_dir.td_planarconfig == PlanarConfig.Separate)) - { - int dpIndex = readDirectoryFind(dir, dircount, TiffTag.StripOffsets); - if (dpIndex != -1 && dir[dpIndex].tdir_count == 1) - { - dpIndex = readDirectoryFind(dir, dircount, TiffTag.StripByteCounts); - if (dpIndex != -1 && dir[dpIndex].tdir_count == 1) - { - m_dir.td_planarconfig = PlanarConfig.Contig; - WarningExt(this, m_clientdata, "ReadDirectory", - "Planarconfig tag value assumed incorrect, assuming data is contig instead of chunky"); - } - } - } - - // Allocate directory structure and setup defaults. - if (!fieldSet(FieldBit.ImageDimensions)) - { - missingRequired("ImageLength"); - return false; - } - - // Setup appropriate structures (by strip or by tile) - if (!fieldSet(FieldBit.TileDimensions)) - { - m_dir.td_nstrips = NumberOfStrips(); - m_dir.td_tilewidth = m_dir.td_imagewidth; - m_dir.td_tilelength = m_dir.td_rowsperstrip; - m_dir.td_tiledepth = m_dir.td_imagedepth; - m_flags &= ~TiffFlags.IsTiled; - } - else - { - m_dir.td_nstrips = NumberOfTiles(); - m_flags |= TiffFlags.IsTiled; - } - - if (m_dir.td_nstrips == 0) - { - ErrorExt(this, m_clientdata, module, - "{0}: cannot handle zero number of {1}", m_name, IsTiled() ? "tiles" : "strips"); - return false; - } - - m_dir.td_stripsperimage = m_dir.td_nstrips; - if (m_dir.td_planarconfig == PlanarConfig.Separate) - m_dir.td_stripsperimage /= m_dir.td_samplesperpixel; - - if (!fieldSet(FieldBit.StripOffsets)) - { - if ((m_dir.td_compression == Compression.OJPEG) && !IsTiled() && (m_dir.td_nstrips == 1)) - { - // XXX: OJPEG hack. - // If a) compression is OJPEG, b) it's not a tiled TIFF, and c) the number of - // strips is 1, then we tolerate the absence of stripoffsets tag, because, - // presumably, all required data is in the JpegInterchangeFormat stream. - setFieldBit(FieldBit.StripOffsets); - } - else - { - missingRequired(IsTiled() ? "TileOffsets" : "StripOffsets"); - return false; - } - } - - // Second pass: extract other information. - for (int i = 0; i < dircount; i++) - { - if (dir[i].tdir_tag == TiffTag.Ignore) - continue; - - switch (dir[i].tdir_tag) - { - case TiffTag.MinSampleValue: - case TiffTag.MaxSampleValue: - case TiffTag.BitsPerSample: - case TiffTag.DATATYPE: - case TiffTag.SampleFormat: - // The 5.0 spec says the Compression tag has one value, while earlier - // specs say it has one value per sample. Because of this, we accept the - // tag if one value is supplied. - // - // The MinSampleValue, MaxSampleValue, BitsPerSample DataType and - // SampleFormat tags are supposed to be written as one value/sample, but - // some vendors incorrectly write one value only - so we accept that as - // well (yech). Other vendors write correct value for NumberOfSamples, but - // incorrect one for BitsPerSample and friends, and we will read this too. - if (dir[i].tdir_count == 1) - { - int v = extractData(dir[i]); - if (!SetField(dir[i].tdir_tag, v)) - return false; - // XXX: workaround for broken TIFFs - } - else if (dir[i].tdir_tag == TiffTag.BitsPerSample && dir[i].tdir_type == TiffType.Long) - { - int v; - if (!fetchPerSampleLongs(dir[i], out v) || !SetField(dir[i].tdir_tag, v)) - return false; - } - else - { - short iv; - if (!fetchPerSampleShorts(dir[i], out iv) || !SetField(dir[i].tdir_tag, iv)) - return false; - } - break; - case TiffTag.SMinSampleValue: - case TiffTag.SMaxSampleValue: - double dv; - if (!fetchPerSampleAnys(dir[i], out dv) || !SetField(dir[i].tdir_tag, dv)) - return false; - break; - case TiffTag.StripOffsets: - case TiffTag.TileOffsets: - if (!fetchStripThing(dir[i], m_dir.td_nstrips, ref m_dir.td_stripoffset)) - return false; - break; - case TiffTag.StripByteCounts: - case TiffTag.TileByteCounts: - if (!fetchStripThing(dir[i], m_dir.td_nstrips, ref m_dir.td_stripbytecount)) - return false; - break; - case TiffTag.Colormap: - case TiffTag.TransferFunction: - { - // TransferFunction can have either 1x or 3x data values; - // Colormap can have only 3x items. - int v = 1 << m_dir.td_bitspersample; - if (dir[i].tdir_tag == TiffTag.Colormap || dir[i].tdir_count != v) - { - if (!checkDirCount(dir[i], 3 * v)) - break; - } - - byte[] cp = new byte[dir[i].tdir_count * sizeof(short)]; - if (fetchData(dir[i], cp) != 0) - { - int c = 1 << m_dir.td_bitspersample; - if (dir[i].tdir_count == c) - { - // This deals with there being only one array to apply to all samples. - short[] u = ByteArrayToShorts(cp, 0, dir[i].tdir_count * sizeof(short)); - SetField(dir[i].tdir_tag, u, u, u); - } - else - { - v *= sizeof(short); - short[] u0 = ByteArrayToShorts(cp, 0, v); - short[] u1 = ByteArrayToShorts(cp, v, v); - short[] u2 = ByteArrayToShorts(cp, 2 * v, v); - SetField(dir[i].tdir_tag, u0, u1, u2); - } - } - break; - } - case TiffTag.PageNumber: - case TiffTag.HalfToneHints: - case TiffTag.YCBCRSUBSAMPLING: - case TiffTag.DotRange: - fetchShortPair(dir[i]); - break; - case TiffTag.REFERENCEBLACKWHITE: - fetchRefBlackWhite(dir[i]); - break; - // BEGIN REV 4.0 COMPATIBILITY - case TiffTag.OSubFileType: - FileType ft = 0; - switch ((SubFileType)extractData(dir[i])) - { - case SubFileType.ReducedSizeImage: - ft = FileType.ReducedResImage; - break; - case SubFileType.Page: - ft = FileType.Page; - break; - } - - if (ft != 0) - SetField(TiffTag.SubFileType, ft); - - break; - // END REV 4.0 COMPATIBILITY - default: - fetchNormalTag(dir[i]); - break; - } - } - - // OJPEG hack: - // - If a) compression is OJPEG, and b) photometric tag is missing, then we - // consistently find that photometric should be YCbCr - // - If a) compression is OJPEG, and b) photometric tag says it's RGB, then we - // consistently find that the buggy implementation of the buggy compression scheme - // matches photometric YCbCr instead. - // - If a) compression is OJPEG, and b) bitspersample tag is missing, then we - // consistently find bitspersample should be 8. - // - If a) compression is OJPEG, b) samplesperpixel tag is missing, and c) photometric - // is RGB or YCbCr, then we consistently find samplesperpixel should be 3 - // - If a) compression is OJPEG, b) samplesperpixel tag is missing, and c) photometric - // is MinIsWhite or MinIsBlack, then we consistently find samplesperpixel should be 3 - if (m_dir.td_compression == Compression.OJPEG) - { - if (!fieldSet(FieldBit.Photometric)) - { - WarningExt(this, m_clientdata, - "ReadDirectory", "Photometric tag is missing, assuming data is YCbCr"); - - if (!SetField(TiffTag.Photometric, Photometric.YCBCR)) - return false; - } - else if (m_dir.td_photometric == Photometric.RGB) - { - m_dir.td_photometric = Photometric.YCBCR; - WarningExt(this, m_clientdata, "ReadDirectory", - "Photometric tag value assumed incorrect, assuming data is YCbCr instead of RGB"); - } - - if (!fieldSet(FieldBit.BitsPerSample)) - { - WarningExt(this, m_clientdata, "ReadDirectory", - "BitsPerSample tag is missing, assuming 8 bits per sample"); - - if (!SetField(TiffTag.BitsPerSample, 8)) - return false; - } - - if (!fieldSet(FieldBit.SamplesPerPixel)) - { - if ((m_dir.td_photometric == Photometric.RGB) || - (m_dir.td_photometric == Photometric.YCBCR)) - { - WarningExt(this, m_clientdata, "ReadDirectory", - "SamplesPerPixel tag is missing, assuming correct SamplesPerPixel value is 3"); - - if (!SetField(TiffTag.SamplesPerPixel, 3)) - return false; - } - else if ((m_dir.td_photometric == Photometric.MinIsWhite) || - (m_dir.td_photometric == Photometric.MinIsBlack)) - { - WarningExt(this, m_clientdata, "ReadDirectory", - "SamplesPerPixel tag is missing, assuming correct SamplesPerPixel value is 1"); - if (!SetField(TiffTag.SamplesPerPixel, 1)) - return false; - } - } - } - - // Verify Palette image has a Colormap. - if (m_dir.td_photometric == Photometric.Palette && !fieldSet(FieldBit.ColorMap)) - { - missingRequired("Colormap"); - return false; - } - - // OJPEG hack: - // We do no further messing with strip/tile offsets/bytecounts in OJPEG TIFFs - if (m_dir.td_compression != Compression.OJPEG) - { - // Attempt to deal with a missing StripByteCounts tag. - if (!fieldSet(FieldBit.StripByteCounts)) - { - // Some manufacturers violate the spec by not giving the size of the strips. - // In this case, assume there is one uncompressed strip of data. - if ((m_dir.td_planarconfig == PlanarConfig.Contig && m_dir.td_nstrips > 1) || - (m_dir.td_planarconfig == PlanarConfig.Separate && m_dir.td_nstrips != m_dir.td_samplesperpixel)) - { - missingRequired("StripByteCounts"); - return false; - } - - WarningExt(this, m_clientdata, module, - "{0}: TIFF directory is missing required \"{1}\" field, calculating from imagelength", - m_name, FieldWithTag(TiffTag.StripByteCounts).Name); - - if (!estimateStripByteCounts(dir, dircount)) - return false; - } - else if (m_dir.td_nstrips == 1 && m_dir.td_stripoffset[0] != 0 && byteCountLooksBad(m_dir)) - { - // XXX: Plexus (and others) sometimes give a value of zero for a tag when - // they don't know what the correct value is! Try and handle the simple case - // of estimating the size of a one strip image. - WarningExt(this, m_clientdata, module, - "{0}: Bogus \"{1}\" field, ignoring and calculating from imagelength", - m_name, FieldWithTag(TiffTag.StripByteCounts).Name); - - if (!estimateStripByteCounts(dir, dircount)) - return false; - } - else if (m_dir.td_planarconfig == PlanarConfig.Contig && m_dir.td_nstrips > 2 && - m_dir.td_compression == Compression.None && - m_dir.td_stripbytecount[0] != m_dir.td_stripbytecount[1]) - { - // XXX: Some vendors fill StripByteCount array with absolutely wrong values - // (it can be equal to StripOffset array, for example). Catch this case here. - WarningExt(this, m_clientdata, module, - "{0}: Wrong \"{1}\" field, ignoring and calculating from imagelength", - m_name, FieldWithTag(TiffTag.StripByteCounts).Name); - - if (!estimateStripByteCounts(dir, dircount)) - return false; - } - } - - dir = null; - - if (!fieldSet(FieldBit.MaxSampleValue)) - m_dir.td_maxsamplevalue = (short)((1 << m_dir.td_bitspersample) - 1); - - // Setup default compression scheme. - - // XXX: We can optimize checking for the strip bounds using the sorted bytecounts - // array. See also comments for appendToStrip() function. - if (m_dir.td_nstrips > 1) - { - m_dir.td_stripbytecountsorted = true; - for (int strip = 1; strip < m_dir.td_nstrips; strip++) - { - if (m_dir.td_stripoffset[strip - 1] > m_dir.td_stripoffset[strip]) - { - m_dir.td_stripbytecountsorted = false; - break; - } - } - } - - if (!fieldSet(FieldBit.Compression)) - SetField(TiffTag.Compression, Compression.None); - - // Some manufacturers make life difficult by writing large amounts of uncompressed - // data as a single strip. This is contrary to the recommendations of the spec. The - // following makes an attempt at breaking such images into strips closer to the - // recommended 8k bytes. A side effect, however, is that the RowsPerStrip tag value - // may be changed. - if (m_dir.td_nstrips == 1 && m_dir.td_compression == Compression.None && - (m_flags & TiffFlags.StripChop) == TiffFlags.StripChop && - (m_flags & TiffFlags.IsTiled) != TiffFlags.IsTiled) - { - chopUpSingleUncompressedStrip(); - } - - // Reinitialize i/o since we are starting on a new directory. - m_row = -1; - m_curstrip = -1; - m_col = -1; - m_curtile = -1; - m_tilesize = -1; - - m_scanlinesize = ScanlineSize(); - if (m_scanlinesize == 0) - { - ErrorExt(this, m_clientdata, module, "{0}: cannot handle zero scanline size", m_name); - return false; - } - - if (IsTiled()) - { - m_tilesize = TileSize(); - if (m_tilesize == 0) - { - ErrorExt(this, m_clientdata, module, "{0}: cannot handle zero tile size", m_name); - return false; - } - } - else - { - if (StripSize() == 0) - { - ErrorExt(this, m_clientdata, module, "{0}: cannot handle zero strip size", m_name); - return false; - } - } - - return true; - } - - /// - /// Reads a custom directory from the arbitrary offset within file/stream. - /// - /// The directory offset. - /// The array of objects to merge to - /// existing field information. - /// The number of items to use from - /// the array. - /// true if a custom directory was read successfully; - /// otherwise, false - public bool ReadCustomDirectory(long offset, TiffFieldInfo[] info, int count) - { - const string module = "ReadCustomDirectory"; - - setupFieldInfo(info, count); - - uint dummyNextDirOff; - TiffDirEntry[] dir; - short dircount = fetchDirectory((uint)offset, out dir, out dummyNextDirOff); - if (dircount == 0) - { - ErrorExt(this, m_clientdata, module, - "{0}: Failed to read custom directory at offset {1}", m_name, offset); - return false; - } - - FreeDirectory(); - m_dir = new TiffDirectory(); - - int fix = 0; - for (short i = 0; i < dircount; i++) - { - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - short temp = (short)dir[i].tdir_tag; - SwabShort(ref temp); - dir[i].tdir_tag = (TiffTag)(ushort)temp; - - temp = (short)dir[i].tdir_type; - SwabShort(ref temp); - dir[i].tdir_type = (TiffType)temp; - - SwabLong(ref dir[i].tdir_count); - SwabUInt(ref dir[i].tdir_offset); - } - - if (fix >= m_nfields || dir[i].tdir_tag == TiffTag.Ignore) - continue; - - while (fix < m_nfields && m_fieldinfo[fix].Tag < dir[i].tdir_tag) - fix++; - - if (fix >= m_nfields || m_fieldinfo[fix].Tag != dir[i].tdir_tag) - { - WarningExt(this, m_clientdata, module, - "{0}: unknown field with tag {1} (0x{2:x}) encountered", - m_name, (ushort)dir[i].tdir_tag, (ushort)dir[i].tdir_tag); - - TiffFieldInfo[] arr = new TiffFieldInfo[1]; - arr[0] = createAnonFieldInfo(dir[i].tdir_tag, dir[i].tdir_type); - MergeFieldInfo(arr, 1); - - fix = 0; - while (fix < m_nfields && m_fieldinfo[fix].Tag < dir[i].tdir_tag) - fix++; - } - - // null out old tags that we ignore. - if (m_fieldinfo[fix].Bit == FieldBit.Ignore) - { - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - - // Check data type. - TiffFieldInfo fip = m_fieldinfo[fix]; - while (dir[i].tdir_type != fip.Type && fix < m_nfields) - { - if (fip.Type == TiffType.Any) - { - // wildcard - break; - } - - fip = m_fieldinfo[++fix]; - if (fix >= m_nfields || fip.Tag != dir[i].tdir_tag) - { - WarningExt(this, m_clientdata, module, - "{0}: wrong data type {1} for \"{2}\"; tag ignored", - m_name, dir[i].tdir_type, m_fieldinfo[fix - 1].Name); - - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - } - - // Check count if known in advance. - if (fip.ReadCount != TiffFieldInfo.Variable && - fip.ReadCount != TiffFieldInfo.Variable2) - { - int expected = fip.ReadCount; - if (fip.ReadCount == TiffFieldInfo.Spp) - expected = m_dir.td_samplesperpixel; - - if (!checkDirCount(dir[i], expected)) - { - dir[i].tdir_tag = TiffTag.Ignore; - continue; - } - } - - // EXIF tags which need to be specifically processed. - switch (dir[i].tdir_tag) - { - case TiffTag.EXIF_SUBJECTDISTANCE: - fetchSubjectDistance(dir[i]); - break; - default: - fetchNormalTag(dir[i]); - break; - } - } - - return true; - } - - /// - /// Reads an EXIF directory from the given offset within file/stream. - /// - /// The directory offset. - /// true if an EXIF directory was read successfully; - /// otherwise, false - public bool ReadEXIFDirectory(long offset) - { - int exifFieldInfoCount; - TiffFieldInfo[] exifFieldInfo = getExifFieldInfo(out exifFieldInfoCount); - return ReadCustomDirectory(offset, exifFieldInfo, exifFieldInfoCount); - } - - /// - /// Calculates the size in bytes of a row of data as it would be returned in a call to - /// , or as it would be - /// expected in a call to . - /// - /// The size in bytes of a row of data. - /// ScanlineSize calculates size for one sample plane only. Please use - /// if you want to get size in bytes of a complete - /// decoded and packed raster scanline. - /// - public int ScanlineSize() - { - int scanline; - if (m_dir.td_planarconfig == PlanarConfig.Contig) - { - if (m_dir.td_photometric == Photometric.YCBCR && !IsUpSampled()) - { - FieldValue[] result = GetFieldDefaulted(TiffTag.YCBCRSUBSAMPLING); - short ycbcrsubsampling0 = result[0].ToShort(); - - if (ycbcrsubsampling0 == 0) - { - ErrorExt(this, m_clientdata, m_name, "Invalid YCbCr subsampling"); - return 0; - } - - scanline = roundUp(m_dir.td_imagewidth, ycbcrsubsampling0); - scanline = howMany8(multiply(scanline, m_dir.td_bitspersample, "ScanlineSize")); - return summarize(scanline, multiply(2, scanline / ycbcrsubsampling0, "VStripSize"), "VStripSize"); - } - else - { - scanline = multiply(m_dir.td_imagewidth, m_dir.td_samplesperpixel, "ScanlineSize"); - } - } - else - { - scanline = m_dir.td_imagewidth; - } - - return howMany8(multiply(scanline, m_dir.td_bitspersample, "ScanlineSize")); - } - - /// - /// Calculates the size in bytes of a complete decoded and packed raster scanline. - /// - /// The size in bytes of a complete decoded and packed raster scanline. - /// The value returned by RasterScanlineSize may be different from the - /// value returned by if data is stored as separate - /// planes ( = .Separate). - /// - public int RasterScanlineSize() - { - int scanline = multiply(m_dir.td_bitspersample, m_dir.td_imagewidth, "RasterScanlineSize"); - if (m_dir.td_planarconfig == PlanarConfig.Contig) - { - scanline = multiply(scanline, m_dir.td_samplesperpixel, "RasterScanlineSize"); - return howMany8(scanline); - } - - return multiply(howMany8(scanline), m_dir.td_samplesperpixel, "RasterScanlineSize"); - } - - /// - /// Computes the number of rows for a reasonable-sized strip according to the current - /// settings of the , - /// and tags and any compression-specific requirements. - /// - /// The esimated value (may be zero). - /// The number of rows for a reasonable-sized strip according to the current - /// tag settings and compression-specific requirements. - /// If the parameter is non-zero, then it is taken - /// as an estimate of the desired strip size and adjusted according to any - /// compression-specific requirements. The value returned by DefaultStripSize is - /// typically used to define the tag. If there is no - /// any unusual requirements DefaultStripSize tries to create strips that have - /// approximately 8 kilobytes of uncompressed data. - public int DefaultStripSize(int estimate) - { - return m_currentCodec.DefStripSize(estimate); - } - - /// - /// Computes the number of bytes in a row-aligned strip. - /// - /// The number of bytes in a row-aligned strip - /// - /// - /// StripSize returns the equivalent size for a strip of data as it would be - /// returned in a call to or as it would be expected in a - /// call to . - /// - /// If the value of the field corresponding to is - /// larger than the recorded , then the strip size is - /// truncated to reflect the actual space required to hold the strip. - /// - public int StripSize() - { - int rps = m_dir.td_rowsperstrip; - if (rps > m_dir.td_imagelength) - rps = m_dir.td_imagelength; - - return VStripSize(rps); - } - - /// - /// Computes the number of bytes in a row-aligned strip with specified number of rows. - /// - /// The number of rows in a strip. - /// - /// The number of bytes in a row-aligned strip with specified number of rows. - public int VStripSize(int rowCount) - { - if (rowCount == -1) - rowCount = m_dir.td_imagelength; - - if (m_dir.td_planarconfig == PlanarConfig.Contig && - m_dir.td_photometric == Photometric.YCBCR && !IsUpSampled()) - { - // Packed YCbCr data contain one Cb+Cr for every - // HorizontalSampling * VerticalSampling Y values. - // Must also roundup width and height when calculating since images that are not - // a multiple of the horizontal/vertical subsampling area include YCbCr data for - // the extended image. - FieldValue[] result = GetFieldDefaulted(TiffTag.YCBCRSUBSAMPLING); - short ycbcrsubsampling0 = result[0].ToShort(); - short ycbcrsubsampling1 = result[1].ToShort(); - - int samplingarea = ycbcrsubsampling0 * ycbcrsubsampling1; - if (samplingarea == 0) - { - ErrorExt(this, m_clientdata, m_name, "Invalid YCbCr subsampling"); - return 0; - } - - int w = roundUp(m_dir.td_imagewidth, ycbcrsubsampling0); - int scanline = howMany8(multiply(w, m_dir.td_bitspersample, "VStripSize")); - rowCount = roundUp(rowCount, ycbcrsubsampling1); - // NB: don't need howMany here 'cuz everything is rounded - scanline = multiply(rowCount, scanline, "VStripSize"); - return summarize(scanline, multiply(2, scanline / samplingarea, "VStripSize"), "VStripSize"); - } - - return multiply(rowCount, ScanlineSize(), "VStripSize"); - } - - /// - /// Computes the number of bytes in a raw (i.e. not decoded) strip. - /// - /// The zero-based index of a strip. - /// The number of bytes in a raw strip. - public long RawStripSize(int strip) - { - long bytecount = m_dir.td_stripbytecount[strip]; - if (bytecount <= 0) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Invalid strip byte count, strip {1}", bytecount, strip); - bytecount = -1; - } - - return bytecount; - } - - /// - /// Computes which strip contains the specified coordinates (row, plane). - /// - /// The row. - /// The sample plane. - /// The number of the strip that contains the specified coordinates. - /// - /// A valid strip number is always returned; out-of-range coordinate values are clamped to - /// the bounds of the image. The parameter is always used in - /// calculating a strip. The parameter is used only if data are - /// organized in separate planes - /// ( = .Separate). - /// - public int ComputeStrip(int row, short plane) - { - int strip = 0; - if (m_dir.td_rowsperstrip != -1) - strip = row / m_dir.td_rowsperstrip; - - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - if (plane >= m_dir.td_samplesperpixel) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Sample out of range, max {1}", plane, m_dir.td_samplesperpixel); - return 0; - } - - strip += plane * m_dir.td_stripsperimage; - } - - return strip; - } - - /// - /// Retrives the number of strips in the image. - /// - /// The number of strips in the image. - public int NumberOfStrips() - { - int nstrips = (m_dir.td_rowsperstrip == -1 ? 1 : howMany(m_dir.td_imagelength, m_dir.td_rowsperstrip)); - if (m_dir.td_planarconfig == PlanarConfig.Separate) - nstrips = multiply(nstrips, m_dir.td_samplesperpixel, "NumberOfStrips"); - - return nstrips; - } - - /// - /// Computes the pixel width and height of a reasonable-sized tile suitable for setting - /// up the and tags. - /// - /// The proposed tile width upon the call / tile width to use - /// after the call. - /// The proposed tile height upon the call / tile height to use - /// after the call. - /// If the and values passed - /// in are non-zero, then they are adjusted to reflect any compression-specific - /// requirements. The returned width and height are constrained to be a multiple of - /// 16 pixels to conform with the TIFF specification. - public void DefaultTileSize(ref int width, ref int height) - { - m_currentCodec.DefTileSize(ref width, ref height); - } - - /// - /// Compute the number of bytes in a row-aligned tile. - /// - /// The number of bytes in a row-aligned tile. - /// TileSize returns the equivalent size for a tile of data as it would be - /// returned in a call to or as it would be expected in a - /// call to . - /// - public int TileSize() - { - return VTileSize(m_dir.td_tilelength); - } - - /// - /// Computes the number of bytes in a row-aligned tile with specified number of rows. - /// - /// The number of rows in a tile. - /// - /// The number of bytes in a row-aligned tile with specified number of rows. - public int VTileSize(int rowCount) - { - if (m_dir.td_tilelength == 0 || m_dir.td_tilewidth == 0 || m_dir.td_tiledepth == 0) - return 0; - - int tilesize; - if (m_dir.td_planarconfig == PlanarConfig.Contig && - m_dir.td_photometric == Photometric.YCBCR && !IsUpSampled()) - { - // Packed YCbCr data contain one Cb+Cr for every - // HorizontalSampling * VerticalSampling Y values. - // Must also roundup width and height when calculating since images that are not a - // multiple of the horizontal/vertical subsampling area include YCbCr data for - // the extended image. - int w = roundUp(m_dir.td_tilewidth, m_dir.td_ycbcrsubsampling[0]); - int rowsize = howMany8(multiply(w, m_dir.td_bitspersample, "VTileSize")); - int samplingarea = m_dir.td_ycbcrsubsampling[0] * m_dir.td_ycbcrsubsampling[1]; - if (samplingarea == 0) - { - ErrorExt(this, m_clientdata, m_name, "Invalid YCbCr subsampling"); - return 0; - } - - rowCount = roundUp(rowCount, m_dir.td_ycbcrsubsampling[1]); - // NB: don't need howMany here 'cuz everything is rounded - tilesize = multiply(rowCount, rowsize, "VTileSize"); - tilesize = summarize(tilesize, multiply(2, tilesize / samplingarea, "VTileSize"), "VTileSize"); - } - else - { - tilesize = multiply(rowCount, TileRowSize(), "VTileSize"); - } - - return multiply(tilesize, m_dir.td_tiledepth, "VTileSize"); - } - - /// - /// Computes the number of bytes in a raw (i.e. not decoded) tile. - /// - /// The zero-based index of a tile. - /// The number of bytes in a raw tile. - public long RawTileSize(int tile) - { - // yes, one method for raw tile and strip sizes - return RawStripSize(tile); - } - - /// - /// Compute the number of bytes in each row of a tile. - /// - /// The number of bytes in each row of a tile. - public int TileRowSize() - { - if (m_dir.td_tilelength == 0 || m_dir.td_tilewidth == 0) - return 0; - - int rowsize = multiply(m_dir.td_bitspersample, m_dir.td_tilewidth, "TileRowSize"); - if (m_dir.td_planarconfig == PlanarConfig.Contig) - rowsize = multiply(rowsize, m_dir.td_samplesperpixel, "TileRowSize"); - - return howMany8(rowsize); - } - - /// - /// Computes which tile contains the specified coordinates (x, y, z, plane). - /// - /// The x-coordinate. - /// The y-coordinate. - /// The z-coordinate. - /// The sample plane. - /// The number of the tile that contains the specified coordinates. - /// - /// A valid tile number is always returned; out-of-range coordinate values are - /// clamped to the bounds of the image. The and - /// parameters are always used in calculating a tile. The parameter - /// is used if the image is deeper than 1 slice ( > 1). - /// The parameter is used only if data are organized in separate - /// planes ( = .Separate). - /// - public int ComputeTile(int x, int y, int z, short plane) - { - if (m_dir.td_imagedepth == 1) - z = 0; - - int dx = m_dir.td_tilewidth; - if (dx == -1) - dx = m_dir.td_imagewidth; - - int dy = m_dir.td_tilelength; - if (dy == -1) - dy = m_dir.td_imagelength; - - int dz = m_dir.td_tiledepth; - if (dz == -1) - dz = m_dir.td_imagedepth; - - int tile = 1; - if (dx != 0 && dy != 0 && dz != 0) - { - int xpt = howMany(m_dir.td_imagewidth, dx); - int ypt = howMany(m_dir.td_imagelength, dy); - int zpt = howMany(m_dir.td_imagedepth, dz); - - if (m_dir.td_planarconfig == PlanarConfig.Separate) - tile = (xpt * ypt * zpt) * plane + (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx; - else - tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx; - } - - return tile; - } - - /// - /// Checks whether the specified (x, y, z, plane) coordinates are within the bounds of - /// the image. - /// - /// The x-coordinate. - /// The y-coordinate. - /// The z-coordinate. - /// The sample plane. - /// true if the specified coordinates are within the bounds of the image; - /// otherwise, false. - /// The parameter is checked against the value of the - /// tag. The parameter is checked - /// against the value of the tag. The - /// parameter is checked against the value of the tag - /// (if defined). The parameter is checked against the value of - /// the tag if the data are organized in separate - /// planes. - public bool CheckTile(int x, int y, int z, short plane) - { - if (x >= m_dir.td_imagewidth) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Col out of range, max {1}", x, m_dir.td_imagewidth - 1); - return false; - } - - if (y >= m_dir.td_imagelength) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Row out of range, max {1}", y, m_dir.td_imagelength - 1); - return false; - } - - if (z >= m_dir.td_imagedepth) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Depth out of range, max {1}", z, m_dir.td_imagedepth - 1); - return false; - } - - if (m_dir.td_planarconfig == PlanarConfig.Separate && plane >= m_dir.td_samplesperpixel) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Sample out of range, max {1}", plane, m_dir.td_samplesperpixel - 1); - return false; - } - - return true; - } - - /// - /// Retrives the number of tiles in the image. - /// - /// The number of tiles in the image. - public int NumberOfTiles() - { - int dx = m_dir.td_tilewidth; - if (dx == -1) - dx = m_dir.td_imagewidth; - - int dy = m_dir.td_tilelength; - if (dy == -1) - dy = m_dir.td_imagelength; - - int dz = m_dir.td_tiledepth; - if (dz == -1) - dz = m_dir.td_imagedepth; - - int ntiles; - if (dx == 0 || dy == 0 || dz == 0) - { - ntiles = 0; - } - else - { - ntiles = multiply( - multiply(howMany(m_dir.td_imagewidth, dx), howMany(m_dir.td_imagelength, dy), "NumberOfTiles"), - howMany(m_dir.td_imagedepth, dz), "NumberOfTiles"); - } - - if (m_dir.td_planarconfig == PlanarConfig.Separate) - ntiles = multiply(ntiles, m_dir.td_samplesperpixel, "NumberOfTiles"); - - return ntiles; - } - - /// - /// Returns the custom client data associated with this . - /// - /// The custom client data associated with this . - public object Clientdata() - { - return m_clientdata; - } - - /// - /// Asscociates a custom data with this . - /// - /// The data to associate. - /// The previously associated data. - public object SetClientdata(object data) - { - object prev = m_clientdata; - m_clientdata = data; - return prev; - } - - /// - /// Gets the mode with which the underlying file or stream was opened. - /// - /// The mode with which the underlying file or stream was opened. - public int GetMode() - { - return m_mode; - } - - /// - /// Sets the new mode for the underlying file or stream. - /// - /// The new mode for the underlying file or stream. - /// The previous mode with which the underlying file or stream was opened. - public int SetMode(int mode) - { - int prevMode = m_mode; - m_mode = mode; - return prevMode; - } - - /// - /// Gets the value indicating whether the image data of this has a - /// tiled organization. - /// - /// - /// true if the image data of this has a tiled organization or - /// false if the image data of this is organized in strips. - /// - public bool IsTiled() - { - return ((m_flags & TiffFlags.IsTiled) == TiffFlags.IsTiled); - } - - /// - /// Gets the value indicating whether the image data was in a different byte-order than - /// the host computer. - /// - /// true if the image data was in a different byte-order than the host - /// computer or false if the TIFF file/stream and local host byte-orders are the - /// same. - /// - /// Note that , , - /// and - /// methods already - /// normally perform byte swapping to local host order if needed. - /// - /// Also note that and do not - /// perform byte swapping to local host order. - /// - public bool IsByteSwapped() - { - return ((m_flags & TiffFlags.Swab) == TiffFlags.Swab); - } - - /// - /// Gets the value indicating whether the image data returned through the read interface - /// methods is being up-sampled. - /// - /// - /// true if the data is returned up-sampled; otherwise, false. - /// - /// The value returned by this method can be useful to applications that want to - /// calculate I/O buffer sizes to reflect this usage (though the usual strip and tile size - /// routines already do this). - public bool IsUpSampled() - { - return ((m_flags & TiffFlags.UpSampled) == TiffFlags.UpSampled); - } - - /// - /// Gets the value indicating whether the image data is being returned in MSB-to-LSB - /// bit order. - /// - /// - /// true if the data is being returned in MSB-to-LSB bit order (i.e with bit 0 as - /// the most significant bit); otherwise, false. - /// - public bool IsMSB2LSB() - { - return isFillOrder(BitOrder.BigEndian); - } - - /// - /// Gets the value indicating whether given image data was written in big-endian order. - /// - /// - /// true if given image data was written in big-endian order; otherwise, false. - /// - public bool IsBigEndian() - { - return (m_header.tiff_magic == TIFF_BIGENDIAN); - } - - /// - /// Gets the tiff stream. - /// - /// The tiff stream. - public TiffStream GetStream() - { - return m_stream; - } - - /// - /// Gets the current row that is being read or written. - /// - /// The current row that is being read or written. - /// The current row is updated each time a read or write is done. - public int CurrentRow() - { - return m_row; - } - - /// - /// Gets the zero-based index of the current directory. - /// - /// The zero-based index of the current directory. - /// The zero-based index returned by this method is suitable for use with - /// the method. - /// - public short CurrentDirectory() - { - return m_curdir; - } - - /// - /// Gets the number of directories in a file. - /// - /// The number of directories in a file. - public short NumberOfDirectories() - { - uint nextdir = m_header.tiff_diroff; - short n = 0; - long dummyOff; - while (nextdir != 0 && advanceDirectory(ref nextdir, out dummyOff)) - n++; - - return n; - } - - /// - /// Retrieves the file/stream offset of the current directory. - /// - /// The file/stream offset of the current directory. - public long CurrentDirOffset() - { - return m_diroff; - } - - /// - /// Gets the current strip that is being read or written. - /// - /// The current strip that is being read or written. - /// The current strip is updated each time a read or write is done. - public int CurrentStrip() - { - return m_curstrip; - } - - /// - /// Gets the current tile that is being read or written. - /// - /// The current tile that is being read or written. - /// The current tile is updated each time a read or write is done. - public int CurrentTile() - { - return m_curtile; - } - - /// - /// Sets up the data buffer used to read raw (encoded) data from a file. - /// - /// The data buffer. - /// The buffer size. - /// - /// - /// This method is provided for client-control of the I/O buffers used by the library. - /// Applications need never use this method; it's provided only for "intelligent clients" - /// that wish to optimize memory usage and/or eliminate potential copy operations that can - /// occur when working with images that have data stored without compression. - /// - /// - /// If the is null, then a buffer of appropriate size is - /// allocated by the library. Otherwise, the caller must guarantee that the buffer is - /// large enough to hold any individual strip of raw data. - /// - /// - public void ReadBufferSetup(byte[] buffer, int size) - { - Debug.Assert((m_flags & TiffFlags.NoReadRaw) != TiffFlags.NoReadRaw); - m_rawdata = null; - - if (buffer != null) - { - m_rawdatasize = size; - m_rawdata = buffer; - m_flags &= ~TiffFlags.MyBuffer; - } - else - { - m_rawdatasize = roundUp(size, 1024); - if (m_rawdatasize > 0) - { - m_rawdata = new byte[m_rawdatasize]; - } - else - { - Tiff.ErrorExt(this, m_clientdata, - "ReadBufferSetup", "{0}: No space for data buffer at scanline {1}", m_name, m_row); - m_rawdatasize = 0; - } - - m_flags |= TiffFlags.MyBuffer; - } - } - - /// - /// Sets up the data buffer used to write raw (encoded) data to a file. - /// - /// The data buffer. - /// The buffer size. - /// - /// - /// This method is provided for client-control of the I/O buffers used by the library. - /// Applications need never use this method; it's provided only for "intelligent clients" - /// that wish to optimize memory usage and/or eliminate potential copy operations that can - /// occur when working with images that have data stored without compression. - /// - /// - /// If the is -1 then the buffer size is selected to hold a - /// complete tile or strip, or at least 8 kilobytes, whichever is greater. If the - /// is null, then a buffer of appropriate size is - /// allocated by the library. - /// - /// - public void WriteBufferSetup(byte[] buffer, int size) - { - if (m_rawdata != null) - { - if ((m_flags & TiffFlags.MyBuffer) == TiffFlags.MyBuffer) - m_flags &= ~TiffFlags.MyBuffer; - - m_rawdata = null; - } - - if (size == -1) - { - size = (IsTiled() ? m_tilesize : StripSize()); - - // Make raw data buffer at least 8K - if (size < 8 * 1024) - size = 8 * 1024; - - // force allocation - buffer = null; - } - - if (buffer == null) - { - buffer = new byte[size]; - m_flags |= TiffFlags.MyBuffer; - } - else - { - m_flags &= ~TiffFlags.MyBuffer; - } - - m_rawdata = buffer; - m_rawdatasize = size; - m_rawcc = 0; - m_rawcp = 0; - m_flags |= TiffFlags.BufferSetup; - } - - /// - /// Setups the strips. - /// - /// true if setup successfully; otherwise, false - public bool SetupStrips() - { - if (IsTiled()) - m_dir.td_stripsperimage = isUnspecified(FieldBit.TileDimensions) ? m_dir.td_samplesperpixel : NumberOfTiles(); - else - m_dir.td_stripsperimage = isUnspecified(FieldBit.RowsPerStrip) ? m_dir.td_samplesperpixel : NumberOfStrips(); - - m_dir.td_nstrips = m_dir.td_stripsperimage; - - if (m_dir.td_planarconfig == PlanarConfig.Separate) - m_dir.td_stripsperimage /= m_dir.td_samplesperpixel; - - m_dir.td_stripoffset = new uint[m_dir.td_nstrips]; - m_dir.td_stripbytecount = new uint[m_dir.td_nstrips]; - - setFieldBit(FieldBit.StripOffsets); - setFieldBit(FieldBit.StripByteCounts); - return true; - } - - /// - /// Verifies that file/stream is writable and that the directory information is - /// setup properly. - /// - /// If set to true then ability to write tiles will be verified; - /// otherwise, ability to write strips will be verified. - /// The name of the calling method. - /// true if file/stream is writeable and the directory information is - /// setup properly; otherwise, false - public bool WriteCheck(bool tiles, string method) - { - if (m_mode == O_RDONLY) - { - ErrorExt(this, m_clientdata, method, "{0}: File not open for writing", m_name); - return false; - } - - if (tiles ^ IsTiled()) - { - ErrorExt(this, m_clientdata, m_name, - tiles ? "Can not write tiles to a stripped image" : "Can not write scanlines to a tiled image"); - - return false; - } - - // On the first write verify all the required information has been setup and - // initialize any data structures that had to wait until directory information was set. - // Note that a lot of our work is assumed to remain valid because we disallow any of - // the important parameters from changing after we start writing (i.e. once - // BeenWriting is set, SetField will only allow the image's length to be changed). - if (!fieldSet(FieldBit.ImageDimensions)) - { - ErrorExt(this, m_clientdata, method, "{0}: Must set \"ImageWidth\" before writing data", m_name); - return false; - } - - if (m_dir.td_samplesperpixel == 1) - { - // PlanarConfiguration is irrelevant in case of single band images and need not - // be included. We will set it anyway, because this field is used in other parts - // of library even in the single band case. - if (!fieldSet(FieldBit.PlanarConfig)) - m_dir.td_planarconfig = PlanarConfig.Contig; - } - else - { - if (!fieldSet(FieldBit.PlanarConfig)) - { - ErrorExt(this, m_clientdata, method, - "{0}: Must set \"PlanarConfiguration\" before writing data", m_name); - - return false; - } - } - - if (m_dir.td_stripoffset == null && !SetupStrips()) - { - m_dir.td_nstrips = 0; - ErrorExt(this, m_clientdata, method, - "{0}: No space for {1} arrays", m_name, IsTiled() ? "tile" : "strip"); - - return false; - } - - m_tilesize = IsTiled() ? TileSize() : -1; - m_scanlinesize = ScanlineSize(); - m_flags |= TiffFlags.BeenWriting; - return true; - } - - /// - /// Releases storage associated with current directory. - /// - public void FreeDirectory() - { - if (m_dir != null) - { - clearFieldBit(FieldBit.YCbCrSubsampling); - clearFieldBit(FieldBit.YCbCrPositioning); - - m_dir = null; - } - } - - /// - /// Creates a new directory within file/stream. - /// - /// The newly created directory will not exist on the file/stream till - /// , , - /// or is called. - public void CreateDirectory() - { - // Should we automatically call WriteDirectory() - // if the current one is dirty? - - setupDefaultDirectory(); - m_diroff = 0; - m_nextdiroff = 0; - m_curoff = 0; - m_row = -1; - m_curstrip = -1; - } - - /// - /// Returns an indication of whether the current directory is the last directory - /// in the file. - /// - /// true if current directory is the last directory in the file; - /// otherwise, false. - public bool LastDirectory() - { - return (m_nextdiroff == 0); - } - - /// - /// Sets the directory with specified number as the current directory. - /// - /// The zero-based number of the directory to set as the - /// current directory. - /// true if the specified directory was set as current successfully; - /// otherwise, false - /// SetDirectory changes the current directory and reads its contents with - /// . - public bool SetDirectory(short number) - { - uint nextdir = m_header.tiff_diroff; - short n; - for (n = number; n > 0 && nextdir != 0; n--) - { - long dummyOff; - if (!advanceDirectory(ref nextdir, out dummyOff)) - return false; - } - - m_nextdiroff = nextdir; - - // Set curdir to the actual directory index. The -1 is because - // ReadDirectory will increment m_curdir after successfully reading - // the directory. - m_curdir = (short)(number - n - 1); - - // Reset m_dirnumber counter and start new list of seen directories. - // We need this to prevent IFD loops. - m_dirnumber = 0; - return ReadDirectory(); - } - - /// - /// Sets the directory at specified file/stream offset as the current directory. - /// - /// The offset from the beginnig of the file/stream to the directory - /// to set as the current directory. - /// true if the directory at specified file offset was set as current - /// successfully; otherwise, false - /// SetSubDirectory acts like , except the - /// directory is specified as a file offset instead of an index; this is required for - /// accessing subdirectories linked through a SubIFD tag (e.g. thumbnail images). - public bool SetSubDirectory(long offset) - { - m_nextdiroff = (uint)offset; - - // Reset m_dirnumber counter and start new list of seen directories. - // We need this to prevent IFD loops. - m_dirnumber = 0; - return ReadDirectory(); - } - - /// - /// Unlinks the specified directory from the directory chain. - /// - /// The zero-based number of the directory to unlink. - /// true if directory was unlinked successfully; otherwise, false. - /// UnlinkDirectory does not removes directory bytes from the file/stream. - /// It only makes them unused. - public bool UnlinkDirectory(short number) - { - const string module = "UnlinkDirectory"; - - if (m_mode == O_RDONLY) - { - ErrorExt(this, m_clientdata, module, "Can not unlink directory in read-only file"); - return false; - } - - // Go to the directory before the one we want - // to unlink and nab the offset of the link - // field we'll need to patch. - uint nextdir = m_header.tiff_diroff; - long off = sizeof(short) + sizeof(short); - for (int n = number - 1; n > 0; n--) - { - if (nextdir == 0) - { - ErrorExt(this, m_clientdata, module, - "Directory {0} does not exist", number); - return false; - } - - if (!advanceDirectory(ref nextdir, out off)) - return false; - } - - // Advance to the directory to be unlinked and fetch the offset of the directory - // that follows. - long dummyOff; - if (!advanceDirectory(ref nextdir, out dummyOff)) - return false; - - // Go back and patch the link field of the preceding directory to point to the - // offset of the directory that follows. - seekFile(off, SeekOrigin.Begin); - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabUInt(ref nextdir); - - if (!writeIntOK((int)nextdir)) - { - ErrorExt(this, m_clientdata, module, "Error writing directory link"); - return false; - } - - // Leave directory state setup safely. We don't have facilities for doing inserting - // and removing directories, so it's safest to just invalidate everything. This means - // that the caller can only append to the directory chain. - m_currentCodec.Cleanup(); - if ((m_flags & TiffFlags.MyBuffer) == TiffFlags.MyBuffer && m_rawdata != null) - { - m_rawdata = null; - m_rawcc = 0; - } - - m_flags &= ~(TiffFlags.BeenWriting | TiffFlags.BufferSetup | TiffFlags.PostEncode); - FreeDirectory(); - setupDefaultDirectory(); - m_diroff = 0; // force link on next write - m_nextdiroff = 0; // next write must be at end - m_curoff = 0; - m_row = -1; - m_curstrip = -1; - return true; - } - - /// - /// Sets the value(s) of a tag in a TIFF file/stream open for writing. - /// - /// The tag. - /// The tag value(s). - /// true if tag value(s) were set successfully; otherwise, false. - /// - /// SetField sets the value of a tag or pseudo-tag in the current directory - /// associated with the open TIFF file/stream. To set the value of a field the file/stream - /// must have been previously opened for writing with or - /// ; pseudo-tags can be set whether the file was opened for - /// reading or writing. The tag is identified by . - /// The type and number of values in is dependent on the tag - /// being set. You may want to consult - /// "Well-known tags and their - /// value(s) data types" to become familiar with exact data types and calling - /// conventions required for each tag supported by the library. - /// - /// A pseudo-tag is a parameter that is used to control the operation of the library but - /// whose value is not read or written to the underlying file. - /// - /// The field will be written to the file when/if the directory structure is updated. - /// - public bool SetField(TiffTag tag, params object[] value) - { - if (okToChangeTag(tag)) - return m_tagmethods.SetField(this, tag, FieldValue.FromParams(value)); - - return false; - } - - /// - /// Writes the contents of the current directory to the file and setup to create a new - /// subfile (page) in the same file. - /// - /// true if the current directory was written successfully; - /// otherwise, false - /// Applications only need to call WriteDirectory when writing multiple - /// subfiles (pages) to a single TIFF file. WriteDirectory is automatically called - /// by and to write a modified directory if the - /// file is open for writing. - public bool WriteDirectory() - { - return writeDirectory(true); - } - - /// - /// Writes the current state of the TIFF directory into the file to make what is currently - /// in the file/stream readable. - /// - /// true if the current directory was rewritten successfully; - /// otherwise, false - /// Unlike , CheckpointDirectory does not free - /// up the directory data structures in memory, so they can be updated (as strips/tiles - /// are written) and written again. Reading such a partial file you will at worst get a - /// TIFF read error for the first strip/tile encountered that is incomplete, but you will - /// at least get all the valid data in the file before that. When the file is complete, - /// just use as usual to finish it off cleanly. - public bool CheckpointDirectory() - { - // Setup the strips arrays, if they haven't already been. - if (m_dir.td_stripoffset == null) - SetupStrips(); - - bool rc = writeDirectory(false); - SetWriteOffset(seekFile(0, SeekOrigin.End)); - return rc; - } - - /// - /// Rewrites the contents of the current directory to the file and setup to create a new - /// subfile (page) in the same file. - /// - /// true if the current directory was rewritten successfully; - /// otherwise, false - /// The RewriteDirectory operates similarly to , - /// but can be called with directories previously read or written that already have an - /// established location in the file. It will rewrite the directory, but instead of place - /// it at it's old location (as would) it will place them at - /// the end of the file, correcting the pointer from the preceeding directory or file - /// header to point to it's new location. This is particularly important in cases where - /// the size of the directory and pointed to data has grown, so it won’t fit in the space - /// available at the old location. Note that this will result in the loss of the - /// previously used directory space. - public bool RewriteDirectory() - { - const string module = "RewriteDirectory"; - - // We don't need to do anything special if it hasn't been written. - if (m_diroff == 0) - return WriteDirectory(); - - // Find and zero the pointer to this directory, so that linkDirectory will cause it to - // be added after this directories current pre-link. - - // Is it the first directory in the file? - if (m_header.tiff_diroff == m_diroff) - { - m_header.tiff_diroff = 0; - m_diroff = 0; - - seekFile(TiffHeader.TIFF_MAGIC_SIZE + TiffHeader.TIFF_VERSION_SIZE, SeekOrigin.Begin); - if (!writeIntOK((int)m_header.tiff_diroff)) - { - ErrorExt(this, m_clientdata, m_name, "Error updating TIFF header"); - return false; - } - } - else - { - uint nextdir = m_header.tiff_diroff; - do - { - short dircount; - if (!seekOK(nextdir) || !readShortOK(out dircount)) - { - ErrorExt(this, m_clientdata, module, "Error fetching directory count"); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabShort(ref dircount); - - seekFile(dircount * TiffDirEntry.SizeInBytes, SeekOrigin.Current); - - if (!readUIntOK(out nextdir)) - { - ErrorExt(this, m_clientdata, module, "Error fetching directory link"); - return false; - } - - if ((m_flags & TiffFlags.Swab) == TiffFlags.Swab) - SwabUInt(ref nextdir); - } - while (nextdir != m_diroff && nextdir != 0); - - // get current offset - long off = seekFile(0, SeekOrigin.Current); - seekFile(off - sizeof(int), SeekOrigin.Begin); - m_diroff = 0; - - if (!writeIntOK((int)m_diroff)) - { - ErrorExt(this, m_clientdata, module, "Error writing directory link"); - return false; - } - } - - // Now use WriteDirectory() normally. - return WriteDirectory(); - } - - /// - /// Prints formatted description of the contents of the current directory to the - /// specified stream. - /// - /// - /// Prints formatted description of the contents of the current directory to the - /// specified stream possibly using specified print options. - /// - /// The stream. - public void PrintDirectory(Stream stream) - { - PrintDirectory(stream, TiffPrintFlags.None); - } - - /// - /// Prints formatted description of the contents of the current directory to the - /// specified stream using specified print (formatting) options. - /// - /// The stream. - /// The print (formatting) options. - public void PrintDirectory(Stream stream, TiffPrintFlags flags) - { - const string EndOfLine = "\r\n"; - - fprintf(stream, "TIFF Directory at offset 0x{0:x} ({1})" + EndOfLine, m_diroff, m_diroff); - - if (fieldSet(FieldBit.SubFileType)) - { - fprintf(stream, " Subfile Type:"); - string sep = " "; - if ((m_dir.td_subfiletype & FileType.ReducedResImage) != 0) - { - fprintf(stream, "{0}reduced-resolution image", sep); - sep = "/"; - } - - if ((m_dir.td_subfiletype & FileType.Page) != 0) - { - fprintf(stream, "{0}multi-page document", sep); - sep = "/"; - } - - if ((m_dir.td_subfiletype & FileType.Mask) != 0) - fprintf(stream, "{0}transparency mask", sep); - - fprintf(stream, " ({0} = 0x{1:x})" + EndOfLine, m_dir.td_subfiletype, m_dir.td_subfiletype); - } - - if (fieldSet(FieldBit.ImageDimensions)) - { - fprintf(stream, " Image Width: {0} Image Length: {1}", m_dir.td_imagewidth, m_dir.td_imagelength); - if (fieldSet(FieldBit.ImageDepth)) - fprintf(stream, " Image Depth: {0}", m_dir.td_imagedepth); - fprintf(stream, EndOfLine); - } - - if (fieldSet(FieldBit.TileDimensions)) - { - fprintf(stream, " Tile Width: {0} Tile Length: {1}", m_dir.td_tilewidth, m_dir.td_tilelength); - if (fieldSet(FieldBit.TileDepth)) - fprintf(stream, " Tile Depth: {0}", m_dir.td_tiledepth); - fprintf(stream, EndOfLine); - } - - if (fieldSet(FieldBit.Resolution)) - { - fprintf(stream, " Resolution: {0:G}, {1:G}", m_dir.td_xresolution, m_dir.td_yresolution); - if (fieldSet(FieldBit.ResolutionUnit)) - { - switch (m_dir.td_resolutionunit) - { - case ResolutionUnit.None: - fprintf(stream, " (unitless)"); - break; - case ResolutionUnit.Inch: - fprintf(stream, " pixels/inch"); - break; - case ResolutionUnit.Centimeter: - fprintf(stream, " pixels/cm"); - break; - default: - fprintf(stream, " (unit {0} = 0x{1:x})", m_dir.td_resolutionunit, m_dir.td_resolutionunit); - break; - } - } - fprintf(stream, EndOfLine); - } - - if (fieldSet(FieldBit.Position)) - fprintf(stream, " Position: {0:G}, {1:G}" + EndOfLine, m_dir.td_xposition, m_dir.td_yposition); - - if (fieldSet(FieldBit.BitsPerSample)) - fprintf(stream, " Bits/Sample: {0}" + EndOfLine, m_dir.td_bitspersample); - - if (fieldSet(FieldBit.SampleFormat)) - { - fprintf(stream, " Sample Format: "); - switch (m_dir.td_sampleformat) - { - case SampleFormat.UnTyped: - fprintf(stream, "void" + EndOfLine); - break; - case SampleFormat.Int: - fprintf(stream, "signed integer" + EndOfLine); - break; - case SampleFormat.UInt: - fprintf(stream, "unsigned integer" + EndOfLine); - break; - case SampleFormat.IEEEFloat: - fprintf(stream, "IEEE floating point" + EndOfLine); - break; - case SampleFormat.COMPLEXINT: - fprintf(stream, "complex signed integer" + EndOfLine); - break; - case SampleFormat.ComplexIEEEFloat: - fprintf(stream, "complex IEEE floating point" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_sampleformat, m_dir.td_sampleformat); - break; - } - } - - if (fieldSet(FieldBit.Compression)) - { - TiffCodec c = FindCodec(m_dir.td_compression); - fprintf(stream, " Compression Scheme: "); - if (c != null) - fprintf(stream, "{0}" + EndOfLine, c.m_name); - else - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_compression, m_dir.td_compression); - } - - if (fieldSet(FieldBit.Photometric)) - { - fprintf(stream, " Photometric Interpretation: "); - if ((int)m_dir.td_photometric < photoNames.Length) - fprintf(stream, "{0}" + EndOfLine, photoNames[(int)m_dir.td_photometric]); - else - { - switch (m_dir.td_photometric) - { - case Photometric.LogL: - fprintf(stream, "CIE Log2(L)" + EndOfLine); - break; - case Photometric.LogLUV: - fprintf(stream, "CIE Log2(L) (u',v')" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_photometric, m_dir.td_photometric); - break; - } - } - } - - if (fieldSet(FieldBit.ExtraSamples) && m_dir.td_extrasamples != 0) - { - fprintf(stream, " Extra Samples: {0}<", m_dir.td_extrasamples); - string sep = ""; - for (short i = 0; i < m_dir.td_extrasamples; i++) - { - switch (m_dir.td_sampleinfo[i]) - { - case ExtraSample.UnSpecified: - fprintf(stream, "{0}unspecified", sep); - break; - case ExtraSample.AssociatedAlpha: - fprintf(stream, "{0}assoc-alpha", sep); - break; - case ExtraSample.UnAssociatedAlpha: - fprintf(stream, "{0}unassoc-alpha", sep); - break; - default: - fprintf(stream, "{0}{1} (0x{2:x})", sep, m_dir.td_sampleinfo[i], m_dir.td_sampleinfo[i]); - break; - } - sep = ", "; - } - fprintf(stream, ">" + EndOfLine); - } - - if (fieldSet(FieldBit.InkNames)) - { - fprintf(stream, " Ink Names: "); - - string[] names = m_dir.td_inknames.Split(new char[] { '\0' }); - for (int i = 0; i < names.Length; i++) - { - printAscii(stream, names[i]); - fprintf(stream, ", "); - } - - fprintf(stream, EndOfLine); - } - - if (fieldSet(FieldBit.Thresholding)) - { - fprintf(stream, " Thresholding: "); - switch (m_dir.td_threshholding) - { - case Threshold.BILevel: - fprintf(stream, "bilevel art scan" + EndOfLine); - break; - case Threshold.HalfTone: - fprintf(stream, "halftone or dithered scan" + EndOfLine); - break; - case Threshold.ErrorDiffuse: - fprintf(stream, "error diffused" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_threshholding, m_dir.td_threshholding); - break; - } - } - - if (fieldSet(FieldBit.FillOrder)) - { - fprintf(stream, " BitOrder: "); - switch (m_dir.td_fillorder) - { - case BitOrder.BigEndian: - fprintf(stream, "msb-to-lsb" + EndOfLine); - break; - case BitOrder.LittleEndian: - fprintf(stream, "lsb-to-msb" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_fillorder, m_dir.td_fillorder); - break; - } - } - - if (fieldSet(FieldBit.YCbCrSubsampling)) - { - // For hacky reasons (see JpegCodecTagMethods.JPEGFixupTestSubsampling method), - // we need to fetch this rather than trust what is in our structures. - FieldValue[] result = GetField(TiffTag.YCBCRSUBSAMPLING); - short subsampling0 = result[0].ToShort(); - short subsampling1 = result[1].ToShort(); - fprintf(stream, " YCbCr Subsampling: {0}, {1}" + EndOfLine, subsampling0, subsampling1); - } - - if (fieldSet(FieldBit.YCbCrPositioning)) - { - fprintf(stream, " YCbCr Positioning: "); - switch (m_dir.td_ycbcrpositioning) - { - case YCbCrPosition.Centered: - fprintf(stream, "centered" + EndOfLine); - break; - case YCbCrPosition.CoSited: - fprintf(stream, "cosited" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_ycbcrpositioning, m_dir.td_ycbcrpositioning); - break; - } - } - - if (fieldSet(FieldBit.HalftoneHints)) - fprintf(stream, " Halftone Hints: light {0} dark {1}" + EndOfLine, m_dir.td_halftonehints[0], m_dir.td_halftonehints[1]); - - if (fieldSet(FieldBit.Orientation)) - { - fprintf(stream, " Orientation: "); - if ((int)m_dir.td_orientation < orientNames.Length) - fprintf(stream, "{0}" + EndOfLine, orientNames[(int)m_dir.td_orientation]); - else - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_orientation, m_dir.td_orientation); - } - - if (fieldSet(FieldBit.SamplesPerPixel)) - fprintf(stream, " Samples/Pixel: {0}" + EndOfLine, m_dir.td_samplesperpixel); - - if (fieldSet(FieldBit.RowsPerStrip)) - { - fprintf(stream, " Rows/Strip: "); - if (m_dir.td_rowsperstrip == -1) - fprintf(stream, "(infinite)" + EndOfLine); - else - fprintf(stream, "{0}" + EndOfLine, m_dir.td_rowsperstrip); - } - - if (fieldSet(FieldBit.MinSampleValue)) - fprintf(stream, " Min Sample Value: {0}" + EndOfLine, m_dir.td_minsamplevalue); - - if (fieldSet(FieldBit.MaxSampleValue)) - fprintf(stream, " Max Sample Value: {0}" + EndOfLine, m_dir.td_maxsamplevalue); - - if (fieldSet(FieldBit.SMinSampleValue)) - fprintf(stream, " SMin Sample Value: {0:G}" + EndOfLine, m_dir.td_sminsamplevalue); - - if (fieldSet(FieldBit.SMaxSampleValue)) - fprintf(stream, " SMax Sample Value: {0:G}" + EndOfLine, m_dir.td_smaxsamplevalue); - - if (fieldSet(FieldBit.PlanarConfig)) - { - fprintf(stream, " Planar Configuration: "); - switch (m_dir.td_planarconfig) - { - case PlanarConfig.Contig: - fprintf(stream, "single image plane" + EndOfLine); - break; - case PlanarConfig.Separate: - fprintf(stream, "separate image planes" + EndOfLine); - break; - default: - fprintf(stream, "{0} (0x{1:x})" + EndOfLine, m_dir.td_planarconfig, m_dir.td_planarconfig); - break; - } - } - - if (fieldSet(FieldBit.PageNumber)) - fprintf(stream, " Page Number: {0}-{1}" + EndOfLine, m_dir.td_pagenumber[0], m_dir.td_pagenumber[1]); - - if (fieldSet(FieldBit.ColorMap)) - { - fprintf(stream, " Color Map: "); - if ((flags & TiffPrintFlags.Colormap) != 0) - { - fprintf(stream, "" + EndOfLine); - int n = 1 << m_dir.td_bitspersample; - for (int l = 0; l < n; l++) - fprintf(stream, " {0,5}: {1,5} {2,5} {3,5}" + EndOfLine, l, m_dir.td_colormap[0][l], m_dir.td_colormap[1][l], m_dir.td_colormap[2][l]); - } - else - fprintf(stream, "(present)" + EndOfLine); - } - - if (fieldSet(FieldBit.TransferFunction)) - { - fprintf(stream, " Transfer Function: "); - if ((flags & TiffPrintFlags.Curves) != 0) - { - fprintf(stream, "" + EndOfLine); - int n = 1 << m_dir.td_bitspersample; - for (int l = 0; l < n; l++) - { - fprintf(stream, " {0,2}: {0,5}", l, m_dir.td_transferfunction[0][l]); - for (short i = 1; i < m_dir.td_samplesperpixel; i++) - fprintf(stream, " {0,5}", m_dir.td_transferfunction[i][l]); - fprintf(stream, "" + EndOfLine); - } - } - else - fprintf(stream, "(present)" + EndOfLine); - } - - if (fieldSet(FieldBit.SubIFD) && m_dir.td_subifd != null) - { - fprintf(stream, " SubIFD Offsets:"); - for (short i = 0; i < m_dir.td_nsubifd; i++) - fprintf(stream, " {0,5}", m_dir.td_subifd[i]); - fprintf(stream, "" + EndOfLine); - } - - // Custom tag support. - - int count = GetTagListCount(); - for (int i = 0; i < count; i++) - { - TiffTag tag = (TiffTag)GetTagListEntry(i); - TiffFieldInfo fip = FieldWithTag(tag); - if (fip == null) - continue; - - byte[] raw_data = null; - int value_count; - if (fip.PassCount) - { - FieldValue[] result = GetField(tag); - if (result == null) - continue; - - value_count = result[0].ToInt(); - raw_data = result[1].ToByteArray(); - } - else - { - if (fip.ReadCount == TiffFieldInfo.Variable || - fip.ReadCount == TiffFieldInfo.Variable2) - { - value_count = 1; - } - else if (fip.ReadCount == TiffFieldInfo.Spp) - { - value_count = m_dir.td_samplesperpixel; - } - else - { - value_count = fip.ReadCount; - } - - if ((fip.Type == TiffType.ASCII || - fip.ReadCount == TiffFieldInfo.Variable || - fip.ReadCount == TiffFieldInfo.Variable2 || - fip.ReadCount == TiffFieldInfo.Spp || - value_count > 1) && - fip.Tag != TiffTag.PageNumber && - fip.Tag != TiffTag.HalfToneHints && - fip.Tag != TiffTag.YCBCRSUBSAMPLING && - fip.Tag != TiffTag.DotRange) - { - FieldValue[] result = GetField(tag); - if (result == null) - continue; - - raw_data = result[0].ToByteArray(); - } - else if (fip.Tag != TiffTag.PageNumber && - fip.Tag != TiffTag.HalfToneHints && - fip.Tag != TiffTag.YCBCRSUBSAMPLING && - fip.Tag != TiffTag.DotRange) - { - raw_data = new byte[dataSize(fip.Type) * value_count]; - - FieldValue[] result = GetField(tag); - if (result == null) - continue; - - raw_data = result[0].ToByteArray(); - } - else - { - // XXX: Should be fixed and removed, see the notes - // related to PageNumber, HalfToneHints, - // YCBCRSUBSAMPLING and DotRange tags - raw_data = new byte[dataSize(fip.Type) * value_count]; - - FieldValue[] result = GetField(tag); - if (result == null) - continue; - - byte[] first = result[0].ToByteArray(); - byte[] second = result[1].ToByteArray(); - - Buffer.BlockCopy(first, 0, raw_data, 0, first.Length); - Buffer.BlockCopy(second, 0, raw_data, dataSize(fip.Type), second.Length); - } - } - - // Catch the tags which needs to be specially handled and - // pretty print them. If tag not handled in prettyPrintField() - // fall down and print it as any other tag. - if (prettyPrintField(stream, tag, value_count, raw_data)) - continue; - else - printField(stream, fip, value_count, raw_data); - } - - m_tagmethods.PrintDir(this, stream, flags); - - if ((flags & TiffPrintFlags.Strips) != 0 && fieldSet(FieldBit.StripOffsets)) - { - fprintf(stream, " {0} {1}:" + EndOfLine, m_dir.td_nstrips, IsTiled() ? "Tiles" : "Strips"); - for (int s = 0; s < m_dir.td_nstrips; s++) - fprintf(stream, " {0,3}: [{0,8}, {0,8}]" + EndOfLine, s, m_dir.td_stripoffset[s], m_dir.td_stripbytecount[s]); - } - } - - /// - /// Reads and decodes a scanline of data from an open TIFF file/stream. - /// - /// - /// Reads and decodes a scanline of data from an open TIFF file/stream. - /// - /// The buffer to place read and decoded image data to. - /// The zero-based index of scanline (row) to read. - /// - /// true if image data were read and decoded successfully; otherwise, false - /// - /// - /// - /// ReadScanline reads the data for the specified into the - /// user supplied data buffer . The data are returned - /// decompressed and, in the native byte- and bit-ordering, but are otherwise packed - /// (see further below). The must be large enough to hold an - /// entire scanline of data. Applications should call the - /// to find out the size (in bytes) of a scanline buffer. Applications should use - /// or - /// and specify correct sample plane if - /// image data are organized in separate planes - /// ( = .Separate). - /// - /// - /// The library attempts to hide bit- and byte-ordering differences between the image and - /// the native machine by converting data to the native machine order. Bit reversal is - /// done if the value of tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - /// - public bool ReadScanline(byte[] buffer, int row) - { - return ReadScanline(buffer, 0, row, 0); - } - - /// - /// Reads and decodes a scanline of data from an open TIFF file/stream. - /// - /// The buffer to place read and decoded image data to. - /// The zero-based index of scanline (row) to read. - /// The zero-based index of the sample plane. - /// - /// true if image data were read and decoded successfully; otherwise, false - /// - /// - /// - /// ReadScanline reads the data for the specified and - /// specified sample plane into the user supplied data buffer - /// . The data are returned decompressed and, in the native - /// byte- and bit-ordering, but are otherwise packed (see further below). The - /// must be large enough to hold an entire scanline of data. - /// Applications should call the to find out the size (in - /// bytes) of a scanline buffer. Applications may use - /// or specify 0 for - /// parameter if image data is contiguous (i.e not organized in separate planes, - /// = .Contig). - /// - /// - /// The library attempts to hide bit- and byte-ordering differences between the image and - /// the native machine by converting data to the native machine order. Bit reversal is - /// done if the value of tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - /// - public bool ReadScanline(byte[] buffer, int row, short plane) - { - return ReadScanline(buffer, 0, row, plane); - } - - /// - /// Reads and decodes a scanline of data from an open TIFF file/stream. - /// - /// The buffer to place read and decoded image data to. - /// The zero-based byte offset in at which - /// to begin storing read and decoded bytes. - /// The zero-based index of scanline (row) to read. - /// The zero-based index of the sample plane. - /// - /// true if image data were read and decoded successfully; otherwise, false - /// - /// - /// - /// ReadScanline reads the data for the specified and - /// specified sample plane into the user supplied data buffer - /// . The data are returned decompressed and, in the native - /// byte- and bit-ordering, but are otherwise packed (see further below). The - /// must be large enough to hold an entire scanline of data. - /// Applications should call the to find out the size (in - /// bytes) of a scanline buffer. Applications may use - /// or specify 0 for - /// parameter if image data is contiguous (i.e not organized in separate planes, - /// = .Contig). - /// - /// - /// The library attempts to hide bit- and byte-ordering differences between the image and - /// the native machine by converting data to the native machine order. Bit reversal is - /// done if the value of tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - /// - public bool ReadScanline(byte[] buffer, int offset, int row, short plane) - { - if (!checkRead(false)) - return false; - - bool e = seek(row, plane); - if (e) - { - // Decompress desired row into user buffer. - e = m_currentCodec.DecodeRow(buffer, offset, m_scanlinesize, plane); - - // we are now poised at the beginning of the next row - m_row = row + 1; - - if (e) - postDecode(buffer, offset, m_scanlinesize); - } - - return e; - } - - /// - /// Encodes and writes a scanline of data to an open TIFF file/stream. - /// - /// Encodes and writes a scanline of data to an open TIFF file/stream. - /// The buffer with image data to be encoded and written. - /// The zero-based index of scanline (row) to place encoded data at. - /// - /// true if image data were encoded and written successfully; otherwise, false - /// - /// - /// - /// WriteScanline encodes and writes to a file at the specified - /// . Applications should use - /// or - /// and specify correct sample plane - /// parameter if image data in a file/stream is organized in separate planes (i.e - /// = .Separate). - /// - /// The data are assumed to be uncompressed and in the native bit- and byte-order of the - /// host machine. The data written to the file is compressed according to the compression - /// scheme of the current TIFF directory (see further below). If the current scanline is - /// past the end of the current subfile, the value of - /// tag is automatically increased to include the scanline (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. The library attempts to hide bit-ordering differences between the image and - /// the native machine by converting data from the native machine order. - /// - /// Once data are written to a file/stream for the current directory, the values of - /// certain tags may not be altered; see - /// "Well-known tags and their - /// value(s) data types" for more information. - /// - /// It is not possible to write scanlines to a file/stream that uses a tiled organization. - /// The can be used to determine if the file/stream is organized as - /// tiles or strips. - /// - public bool WriteScanline(byte[] buffer, int row) - { - return WriteScanline(buffer, 0, row, 0); - } - - /// - /// Encodes and writes a scanline of data to an open TIFF file/stream. - /// - /// The buffer with image data to be encoded and written. - /// The zero-based index of scanline (row) to place encoded data at. - /// The zero-based index of the sample plane. - /// - /// true if image data were encoded and written successfully; otherwise, false - /// - /// - /// - /// WriteScanline encodes and writes to a file at the specified - /// and specified sample plane . - /// Applications may use or specify 0 for - /// parameter if image data in a file/stream is contiguous (i.e - /// not organized in separate planes, - /// = .Contig). - /// - /// The data are assumed to be uncompressed and in the native bit- and byte-order of the - /// host machine. The data written to the file is compressed according to the compression - /// scheme of the current TIFF directory (see further below). If the current scanline is - /// past the end of the current subfile, the value of - /// tag is automatically increased to include the scanline (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. The library attempts to hide bit-ordering differences between the image and - /// the native machine by converting data from the native machine order. - /// - /// Once data are written to a file/stream for the current directory, the values of - /// certain tags may not be altered; see - /// "Well-known tags and their - /// value(s) data types" for more information. - /// - /// It is not possible to write scanlines to a file/stream that uses a tiled organization. - /// The can be used to determine if the file/stream is organized as - /// tiles or strips. - /// - public bool WriteScanline(byte[] buffer, int row, short plane) - { - return WriteScanline(buffer, 0, row, plane); - } - - /// - /// Encodes and writes a scanline of data to an open TIFF file/stream. - /// - /// The buffer with image data to be encoded and written. - /// The zero-based byte offset in at which - /// to begin reading bytes. - /// The zero-based index of scanline (row) to place encoded data at. - /// The zero-based index of the sample plane. - /// - /// true if image data were encoded and written successfully; otherwise, false - /// - /// - /// - /// WriteScanline encodes and writes to a file at the specified - /// and specified sample plane . - /// Applications may use or specify 0 for - /// parameter if image data in a file/stream is contiguous (i.e - /// not organized in separate planes, - /// = .Contig). - /// - /// The data are assumed to be uncompressed and in the native bit- and byte-order of the - /// host machine. The data written to the file is compressed according to the compression - /// scheme of the current TIFF directory (see further below). If the current scanline is - /// past the end of the current subfile, the value of - /// tag is automatically increased to include the scanline (except for - /// = .Contig, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. The library attempts to hide bit-ordering differences between the image and - /// the native machine by converting data from the native machine order. - /// - /// Once data are written to a file/stream for the current directory, the values of - /// certain tags may not be altered; see - /// "Well-known tags and their - /// value(s) data types" for more information. - /// - /// It is not possible to write scanlines to a file/stream that uses a tiled organization. - /// The can be used to determine if the file/stream is organized as - /// tiles or strips. - /// - public bool WriteScanline(byte[] buffer, int offset, int row, short plane) - { - const string module = "WriteScanline"; - - if (!writeCheckStrips(module)) - return false; - - // Handle delayed allocation of data buffer. This permits it to be - // sized more intelligently (using directory information). - bufferCheck(); - - // Extend image length if needed (but only for PlanarConfig.Contig). - bool imagegrew = false; - if (row >= m_dir.td_imagelength) - { - // extend image - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - ErrorExt(this, m_clientdata, m_name, "Can not change \"ImageLength\" when using separate planes"); - return false; - } - - m_dir.td_imagelength = row + 1; - imagegrew = true; - } - - // Calculate strip and check for crossings. - int strip; - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - if (plane >= m_dir.td_samplesperpixel) - { - ErrorExt(this, m_clientdata, m_name, - "{0}: Sample out of range, max {1}", plane, m_dir.td_samplesperpixel); - return false; - } - - if (m_dir.td_rowsperstrip != -1) - strip = plane * m_dir.td_stripsperimage + row / m_dir.td_rowsperstrip; - else - strip = 0; - } - else - { - if (m_dir.td_rowsperstrip != -1) - strip = row / m_dir.td_rowsperstrip; - else - strip = 0; - } - - // Check strip array to make sure there's space. We don't support - // dynamically growing files that have data organized in separate - // bitplanes because it's too painful. In that case we require that - // the imagelength be set properly before the first write (so that - // the strips array will be fully allocated above). - if (strip >= m_dir.td_nstrips && !growStrips(1)) - return false; - - if (strip != m_curstrip) - { - // Changing strips - flush any data present. - if (!FlushData()) - return false; - - m_curstrip = (int)strip; - - // Watch out for a growing image. The value of strips/image - // will initially be 1 (since it can't be deduced until the - // imagelength is known). - if (strip >= m_dir.td_stripsperimage && imagegrew) - m_dir.td_stripsperimage = howMany(m_dir.td_imagelength, m_dir.td_rowsperstrip); - - m_row = (strip % m_dir.td_stripsperimage) * m_dir.td_rowsperstrip; - if ((m_flags & TiffFlags.CoderSetup) != TiffFlags.CoderSetup) - { - if (!m_currentCodec.SetupEncode()) - return false; - - m_flags |= TiffFlags.CoderSetup; - } - - m_rawcc = 0; - m_rawcp = 0; - - if (m_dir.td_stripbytecount[strip] > 0) - { - // if we are writing over existing tiles, zero length - m_dir.td_stripbytecount[strip] = 0; - - // this forces appendToStrip() to do a seek - m_curoff = 0; - } - - if (!m_currentCodec.PreEncode(plane)) - return false; - - m_flags |= TiffFlags.PostEncode; - } - - // Ensure the write is either sequential or at the beginning of a - // strip (or that we can randomly access the data - i.e. no encoding). - if (row != m_row) - { - if (row < m_row) - { - // Moving backwards within the same strip: - // backup to the start and then decode forward (below). - m_row = (strip % m_dir.td_stripsperimage) * m_dir.td_rowsperstrip; - m_rawcp = 0; - } - - // Seek forward to the desired row. - if (!m_currentCodec.Seek(row - m_row)) - return false; - - m_row = row; - } - - // swab if needed - note that source buffer will be altered - postDecode(buffer, offset, m_scanlinesize); - - bool status = m_currentCodec.EncodeRow(buffer, offset, m_scanlinesize, plane); - - // we are now poised at the beginning of the next row - m_row = row + 1; - return status; - } - - /// - /// Reads the image and decodes it into RGBA format raster. - /// - /// - /// Reads the image and decodes it into RGBA format raster. - /// - /// The raster width. - /// The raster height. - /// The raster (the buffer to place decoded image data to). - /// true if the image was successfully read and converted; otherwise, - /// false is returned if an error was encountered. - /// - /// ReadRGBAImage reads a strip- or tile-based image into memory, storing the - /// result in the user supplied RGBA . The raster is assumed to - /// be an array of times 32-bit entries, - /// where must be less than or equal to the width of the image - /// ( may be any non-zero size). If the raster dimensions are - /// smaller than the image, the image data is cropped to the raster bounds. If the raster - /// height is greater than that of the image, then the image data are placed in the lower - /// part of the raster. Note that the raster is assumed to be organized such that the - /// pixel at location (x, y) is [y * width + x]; with the raster - /// origin in the lower-left hand corner. Please use - /// if you - /// want to specify another raster origin. - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// ReadRGBAImage converts non-8-bit images by scaling sample values. Palette, - /// grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. Raster - /// pixels are returned uncorrected by any colorimetry information present in the directory. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBAImage is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBAImage(int width, int height, int[] raster) - { - return ReadRGBAImage(width, height, raster, false); - } - - /// - /// Reads the image and decodes it into RGBA format raster. - /// - /// The raster width. - /// The raster height. - /// The raster (the buffer to place decoded image data to). - /// if set to true then an error will terminate the - /// operation; otherwise method will continue processing data until all the possible data - /// in the image have been requested. - /// - /// true if the image was successfully read and converted; otherwise, false - /// is returned if an error was encountered and stopOnError is false. - /// - /// - /// ReadRGBAImage reads a strip- or tile-based image into memory, storing the - /// result in the user supplied RGBA . The raster is assumed to - /// be an array of times 32-bit entries, - /// where must be less than or equal to the width of the image - /// ( may be any non-zero size). If the raster dimensions are - /// smaller than the image, the image data is cropped to the raster bounds. If the raster - /// height is greater than that of the image, then the image data are placed in the lower - /// part of the raster. Note that the raster is assumed to be organized such that the - /// pixel at location (x, y) is [y * width + x]; with the raster - /// origin in the lower-left hand corner. Please use - /// if you - /// want to specify another raster origin. - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// ReadRGBAImage converts non-8-bit images by scaling sample values. Palette, - /// grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. Raster - /// pixels are returned uncorrected by any colorimetry information present in the directory. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBAImage is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBAImage(int width, int height, int[] raster, bool stopOnError) - { - return ReadRGBAImageOriented(width, height, raster, Orientation.BottomLeft, stopOnError); - } - - /// - /// Reads the image and decodes it into RGBA format raster using specified raster origin. - /// - /// - /// Reads the image and decodes it into RGBA format raster using specified raster origin. - /// - /// The raster width. - /// The raster height. - /// The raster (the buffer to place decoded image data to). - /// The raster origin position. - /// - /// true if the image was successfully read and converted; otherwise, false - /// is returned if an error was encountered. - /// - /// - /// ReadRGBAImageOriented reads a strip- or tile-based image into memory, storing the - /// result in the user supplied RGBA . The raster is assumed to - /// be an array of times 32-bit entries, - /// where must be less than or equal to the width of the image - /// ( may be any non-zero size). If the raster dimensions are - /// smaller than the image, the image data is cropped to the raster bounds. If the raster - /// height is greater than that of the image, then the image data placement depends on - /// . Note that the raster is assumed to be organized such - /// that the pixel at location (x, y) is [y * width + x]; with - /// the raster origin specified by parameter. - /// - /// When ReadRGBAImageOriented is used with .BottomLeft for - /// the the produced result is the same as retuned by - /// . - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// ReadRGBAImageOriented converts non-8-bit images by scaling sample values. - /// Palette, grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. - /// Raster pixels are returned uncorrected by any colorimetry information present in - /// the directory. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBAImageOriented is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBAImageOriented(int width, int height, int[] raster, Orientation orientation) - { - return ReadRGBAImageOriented(width, height, raster, orientation, false); - } - - /// - /// Reads the image and decodes it into RGBA format raster using specified raster origin. - /// - /// The raster width. - /// The raster height. - /// The raster (the buffer to place decoded image data to). - /// The raster origin position. - /// if set to true then an error will terminate the - /// operation; otherwise method will continue processing data until all the possible data - /// in the image have been requested. - /// - /// true if the image was successfully read and converted; otherwise, false - /// is returned if an error was encountered and stopOnError is false. - /// - /// - /// ReadRGBAImageOriented reads a strip- or tile-based image into memory, storing the - /// result in the user supplied RGBA . The raster is assumed to - /// be an array of times 32-bit entries, - /// where must be less than or equal to the width of the image - /// ( may be any non-zero size). If the raster dimensions are - /// smaller than the image, the image data is cropped to the raster bounds. If the raster - /// height is greater than that of the image, then the image data placement depends on - /// . Note that the raster is assumed to be organized such - /// that the pixel at location (x, y) is [y * width + x]; with - /// the raster origin specified by parameter. - /// - /// When ReadRGBAImageOriented is used with .BottomLeft for - /// the the produced result is the same as retuned by - /// . - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// ReadRGBAImageOriented converts non-8-bit images by scaling sample values. - /// Palette, grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. - /// Raster pixels are returned uncorrected by any colorimetry information present in - /// the directory. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBAImageOriented is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBAImageOriented(int width, int height, int[] raster, Orientation orientation, bool stopOnError) - { - bool ok = false; - string emsg; - if (RGBAImageOK(out emsg)) - { - TiffRgbaImage img = TiffRgbaImage.Create(this, stopOnError, out emsg); - if (img != null) - { - img.ReqOrientation = orientation; - // XXX verify rwidth and rheight against image width and height - ok = img.GetRaster(raster, (height - img.Height) * width, width, img.Height); - } - } - else - { - ErrorExt(this, m_clientdata, FileName(), "{0}", emsg); - ok = false; - } - - return ok; - } - - /// - /// Reads a whole strip of a strip-based image, decodes it and converts it to RGBA format. - /// - /// The row. - /// The RGBA raster. - /// true if the strip was successfully read and converted; otherwise, - /// false - /// - /// - /// ReadRGBAStrip reads a single strip of a strip-based image into memory, storing - /// the result in the user supplied RGBA . If specified strip is - /// the last strip, then it will only contain the portion of the strip that is actually - /// within the image space. The raster is assumed to be an array of width times - /// rowsperstrip 32-bit entries, where width is the width of the image - /// () and rowsperstrip is the maximum lines in a strip - /// (). - /// - /// The value should be the row of the first row in the strip - /// (strip * rowsperstrip, zero based). - /// - /// Note that the raster is assumed to be organized such that the pixel at location (x, y) - /// is [y * width + x]; with the raster origin in the lower-left - /// hand corner of the strip. That is bottom to top organization. When reading a partial - /// last strip in the file the last line of the image will begin at the beginning of - /// the buffer. - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// See for more details on how various image types are - /// converted to RGBA values. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBAStrip's main advantage over the similar - /// function is that for - /// large images a single buffer capable of holding the whole image doesn't need to be - /// allocated, only enough for one strip. The function does a - /// similar operation for tiled images. - /// - /// ReadRGBAStrip is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBAStrip(int row, int[] raster) - { - if (IsTiled()) - { - ErrorExt(this, m_clientdata, FileName(), "Can't use ReadRGBAStrip() with tiled file."); - return false; - } - - FieldValue[] result = GetFieldDefaulted(TiffTag.RowsPerStrip); - int rowsperstrip = result[0].ToInt(); - if ((row % rowsperstrip) != 0) - { - ErrorExt(this, m_clientdata, FileName(), "Row passed to ReadRGBAStrip() must be first in a strip."); - return false; - } - - bool ok; - string emsg; - if (RGBAImageOK(out emsg)) - { - TiffRgbaImage img = TiffRgbaImage.Create(this, false, out emsg); - if (img != null) - { - img.row_offset = row; - img.col_offset = 0; - - int rows_to_read = rowsperstrip; - if (row + rowsperstrip > img.Height) - rows_to_read = img.Height - row; - - ok = img.GetRaster(raster, 0, img.Width, rows_to_read); - return ok; - } - - return true; - } - - ErrorExt(this, m_clientdata, FileName(), "{0}", emsg); - return false; - } - - - /// - /// Reads a whole tile of a tile-based image, decodes it and converts it to RGBA format. - /// - /// The column. - /// The row. - /// The RGBA raster. - /// true if the strip was successfully read and converted; otherwise, - /// false - /// - /// ReadRGBATile reads a single tile of a tile-based image into memory, - /// storing the result in the user supplied RGBA . The raster is - /// assumed to be an array of width times length 32-bit entries, where width is the width - /// of the tile () and length is the height of a tile - /// (). - /// - /// The and values are the offsets from the - /// top left corner of the image to the top left corner of the tile to be read. They must - /// be an exact multiple of the tile width and length. - /// - /// Note that the raster is assumed to be organized such that the pixel at location (x, y) - /// is [y * width + x]; with the raster origin in the lower-left - /// hand corner of the tile. That is bottom to top organization. Edge tiles which partly - /// fall off the image will be filled out with appropriate zeroed areas. - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// See for more details on how various image types are - /// converted to RGBA values. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// ReadRGBATile's main advantage over the similar - /// function is that for - /// large images a single buffer capable of holding the whole image doesn't need to be - /// allocated, only enough for one tile. The function does a - /// similar operation for stripped images. - /// - /// ReadRGBATile is just a wrapper around the more general - /// facilities. - /// - /// All error messages are directed to the current error handler. - /// - /// - /// - /// - /// - public bool ReadRGBATile(int col, int row, int[] raster) - { - // Verify that our request is legal - on a tile file, and on a tile boundary. - if (!IsTiled()) - { - ErrorExt(this, m_clientdata, FileName(), "Can't use ReadRGBATile() with stripped file."); - return false; - } - - FieldValue[] result = GetFieldDefaulted(TiffTag.TileWidth); - int tile_xsize = result[0].ToInt(); - result = GetFieldDefaulted(TiffTag.TileLength); - int tile_ysize = result[0].ToInt(); - - if ((col % tile_xsize) != 0 || (row % tile_ysize) != 0) - { - ErrorExt(this, m_clientdata, FileName(), "Row/col passed to ReadRGBATile() must be topleft corner of a tile."); - return false; - } - - // Setup the RGBA reader. - string emsg; - TiffRgbaImage img = TiffRgbaImage.Create(this, false, out emsg); - if (!RGBAImageOK(out emsg) || img == null) - { - ErrorExt(this, m_clientdata, FileName(), "{0}", emsg); - return false; - } - - // The TiffRgbaImage.Get() function doesn't allow us to get off the edge of the - // image, even to fill an otherwise valid tile. So we figure out how much we can read, - // and fix up the tile buffer to a full tile configuration afterwards. - int read_ysize; - if (row + tile_ysize > img.Height) - read_ysize = img.Height - row; - else - read_ysize = tile_ysize; - - int read_xsize; - if (col + tile_xsize > img.Width) - read_xsize = img.Width - col; - else - read_xsize = tile_xsize; - - // Read the chunk of imagery. - img.row_offset = row; - img.col_offset = col; - - bool ok = img.GetRaster(raster, 0, read_xsize, read_ysize); - - // If our read was incomplete we will need to fix up the tile by shifting the data - // around as if a full tile of data is being returned. This is all the more - // complicated because the image is organized in bottom to top format. - if (read_xsize == tile_xsize && read_ysize == tile_ysize) - return ok; - - for (int i_row = 0; i_row < read_ysize; i_row++) - { - Buffer.BlockCopy(raster, (read_ysize - i_row - 1) * read_xsize * sizeof(int), - raster, (tile_ysize - i_row - 1) * tile_xsize * sizeof(int), read_xsize * sizeof(int)); - - Array.Clear(raster, (tile_ysize - i_row - 1) * tile_xsize + read_xsize, tile_xsize - read_xsize); - } - - for (int i_row = read_ysize; i_row < tile_ysize; i_row++) - Array.Clear(raster, (tile_ysize - i_row - 1) * tile_xsize, tile_xsize); - - return ok; - } - - /// - /// Check the image to see if it can be converted to RGBA format. - /// - /// The error message (if any) gets placed here. - /// true if the image can be converted to RGBA format; otherwise, - /// false is returned and contains the reason why it - /// is being rejected. - /// - /// To convert the image to RGBA format please use - /// , - /// , - /// or - /// - /// Convertible images should follow this rules: samples must be either 1, 2, 4, 8, or - /// 16 bits; colorimetric samples/pixel must be either 1, 3, or 4 (i.e. SamplesPerPixel - /// minus ExtraSamples). - /// - public bool RGBAImageOK(out string errorMsg) - { - errorMsg = null; - - if (!m_decodestatus) - { - errorMsg = "Sorry, requested compression method is not configured"; - return false; - } - - switch (m_dir.td_bitspersample) - { - case 1: - case 2: - case 4: - case 8: - case 16: - break; - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle images with {0}-bit samples", m_dir.td_bitspersample); - return false; - } - - int colorchannels = m_dir.td_samplesperpixel - m_dir.td_extrasamples; - Photometric photometric = Photometric.RGB; - FieldValue[] result = GetField(TiffTag.Photometric); - if (result == null) - { - switch (colorchannels) - { - case 1: - photometric = Photometric.MinIsBlack; - break; - case 3: - photometric = Photometric.RGB; - break; - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Missing needed {0} tag", TiffRgbaImage.photoTag); - return false; - } - } - else - { - // San Chen - photometric = (Photometric)result[0].Value; - } - - switch (photometric) - { - case Photometric.MinIsWhite: - case Photometric.MinIsBlack: - case Photometric.Palette: - if (m_dir.td_planarconfig == PlanarConfig.Contig && - m_dir.td_samplesperpixel != 1 && m_dir.td_bitspersample < 8) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle contiguous data with {0}={1}, and {2}={3} and Bits/Sample={4}", - TiffRgbaImage.photoTag, photometric, "Samples/pixel", m_dir.td_samplesperpixel, - m_dir.td_bitspersample); - - return false; - } - // We should likely validate that any extra samples are either to be ignored, - // or are alpha, and if alpha we should try to use them. But for now we won't - // bother with this. - break; - case Photometric.YCBCR: - // TODO: if at all meaningful and useful, make more complete support check - // here, or better still, refactor to let supporting code decide whether there - // is support and what meaningfull error to return - break; - case Photometric.RGB: - if (colorchannels < 3) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle RGB image with {0}={1}", - "Color channels", colorchannels); - - return false; - } - break; - case Photometric.Separated: - result = GetFieldDefaulted(TiffTag.InkSet); - InkSet inkset = (InkSet)result[0].ToByte(); - if (inkset != InkSet.CMYK) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle separated image with {0}={1}", "InkSet", inkset); - return false; - } - if (m_dir.td_samplesperpixel < 4) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle separated image with {0}={1}", - "Samples/pixel", m_dir.td_samplesperpixel); - return false; - } - break; - case Photometric.LogL: - if (m_dir.td_compression != Compression.SGILOG) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, LogL data must have {0}={1}", - "Compression", Compression.SGILOG); - return false; - } - break; - case Photometric.LogLUV: - if (m_dir.td_compression != Compression.SGILOG && - m_dir.td_compression != Compression.SGILOG24) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, LogLuv data must have {0}={1} or {2}", - "Compression", Compression.SGILOG, Compression.SGILOG24); - return false; - } - - if (m_dir.td_planarconfig != PlanarConfig.Contig) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle LogLuv images with {0}={1}", - "Planarconfiguration", m_dir.td_planarconfig); - return false; - } - break; - case Photometric.CIELAB: - break; - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle image with {0}={1}", - TiffRgbaImage.photoTag, photometric); - return false; - } - - return true; - } - - /// - /// Gets the name of the file or ID string for this . - /// - /// The name of the file or ID string for this . - /// If this was created using method then - /// value of fileName parameter of method is returned. If this - /// was created using then value of - /// name parameter of method is returned. - public string FileName() - { - return m_name; - } - - /// - /// Sets the new ID string for this . - /// - /// The ID string for this . - /// The previous file name or ID string for this . - /// Please note, that is an arbitrary string used as - /// ID for this . It's not required to be a file name or anything - /// meaningful at all. - public string SetFileName(string name) - { - string old_name = m_name; - m_name = name; - return old_name; - } - - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the . - /// - /// An instance of the class. Can be null. - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - /// Applications that desire to capture control in the event of an error should use - /// to override the default error and warning handler. - /// - /// - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the . - /// - public static void Error(Tiff tif, string method, string format, params object[] args) - { - if (m_errorHandler == null) - return; - - m_errorHandler.ErrorHandler(tif, method, format, args); - m_errorHandler.ErrorHandlerExt(tif, null, method, format, args); - } - - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the . - /// - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - /// Applications that desire to capture control in the event of an error should use - /// to override the default error and warning handler. - /// - /// - public static void Error(string method, string format, params object[] args) - { - Error(null, method, format, args); - } - - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the . - /// - /// An instance of the class. Can be null. - /// The client data to be passed to error handler. - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - /// - /// The parameter can be anything you want. It will be passed - /// unchanged to the error handler. Default error handler does not use it. Only custom - /// error handlers may make use of it. - /// - /// Applications that desire to capture control in the event of an error should use - /// to override the default error and warning handler. - /// - /// - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the and passes client data to the error handler. - /// - public static void ErrorExt(Tiff tif, object clientData, string method, string format, params object[] args) - { - if (m_errorHandler == null) - return; - - m_errorHandler.ErrorHandler(tif, method, format, args); - m_errorHandler.ErrorHandlerExt(tif, clientData, method, format, args); - } - - /// - /// Invokes the library-wide error handling methods to (normally) write an error message - /// to the . - /// - /// The client data to be passed to error handler. - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - /// - /// The parameter can be anything you want. It will be passed - /// unchanged to the error handler. Default error handler does not use it. Only custom - /// error handlers may make use of it. - /// - /// Applications that desire to capture control in the event of an error should use - /// to override the default error and warning handler. - /// - /// - public static void ErrorExt(object clientData, string method, string format, params object[] args) - { - ErrorExt(null, clientData, method, format, args); - } - - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the . - /// - /// An instance of the class. Can be null. - /// The method in which a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, - /// if not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - /// Applications that desire to capture control in the event of a warning should use - /// to override the default error and warning handler. - /// - /// - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the . - /// - public static void Warning(Tiff tif, string method, string format, params object[] args) - { - if (m_errorHandler == null) - return; - - m_errorHandler.WarningHandler(tif, method, format, args); - m_errorHandler.WarningHandlerExt(tif, null, method, format, args); - } - - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the . - /// - /// The method in which a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, - /// if not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - /// Applications that desire to capture control in the event of a warning should use - /// to override the default error and warning handler. - /// - /// - public static void Warning(string method, string format, params object[] args) - { - Warning(null, method, format, args); - } - - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the and passes client data to the warning handler. - /// - /// An instance of the class. Can be null. - /// The client data to be passed to warning handler. - /// The method in which a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - /// - /// The parameter can be anything you want. It will be passed - /// unchanged to the warning handler. Default warning handler does not use it. Only custom - /// warning handlers may make use of it. - /// - /// Applications that desire to capture control in the event of a warning should use - /// to override the default error and warning handler. - /// - /// - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the and passes client data to the warning handler. - /// - public static void WarningExt(Tiff tif, object clientData, string method, string format, params object[] args) - { - if (m_errorHandler == null) - return; - - m_errorHandler.WarningHandler(tif, method, format, args); - m_errorHandler.WarningHandlerExt(tif, clientData, method, format, args); - } - - /// - /// Invokes the library-wide warning handling methods to (normally) write a warning message - /// to the and passes client data to the warning handler. - /// - /// The client data to be passed to warning handler. - /// The method in which a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - /// The parameter can be anything you want. It will be passed - /// unchanged to the warning handler. Default warning handler does not use it. Only custom - /// warning handlers may make use of it. - /// - /// Applications that desire to capture control in the event of a warning should use - /// to override the default error and warning handler. - /// - /// - public static void WarningExt(object clientData, string method, string format, params object[] args) - { - WarningExt(null, clientData, method, format, args); - } - - /// - /// Sets an instance of the class as custom library-wide - /// error and warning handler. - /// - /// An instance of the class - /// to set as custom library-wide error and warning handler. - /// - /// Previous error handler or null if there was no error handler set. - /// - public static TiffErrorHandler SetErrorHandler(TiffErrorHandler errorHandler) - { - TiffErrorHandler prev = m_errorHandler; - m_errorHandler = errorHandler; - return prev; - } - - /// - /// Sets the tag extender method. - /// - /// The tag extender method. - /// Previous tag extender method. - /// - /// Extender method is called upon creation of each instance of object. - /// - public static TiffExtendProc SetTagExtender(TiffExtendProc extender) - { - TiffExtendProc prev = m_extender; - m_extender = extender; - return prev; - } - - /// - /// Reads and decodes a tile of data from an open TIFF file/stream. - /// - /// The buffer to place read and decoded image data to. - /// The zero-based byte offset in at which - /// to begin storing read and decoded bytes. - /// The x-coordinate of the pixel within a tile to be read and decoded. - /// The y-coordinate of the pixel within a tile to be read and decoded. - /// The z-coordinate of the pixel within a tile to be read and decoded. - /// The zero-based index of the sample plane. - /// The number of bytes in the decoded tile or -1 if an error occurred. - /// - /// - /// The tile to read and decode is selected by the (x, y, z, plane) coordinates (i.e. - /// ReadTile returns the data for the tile containing the specified coordinates. - /// The data placed in are returned decompressed and, typically, - /// in the native byte- and bit-ordering, but are otherwise packed (see further below). - /// The buffer must be large enough to hold an entire tile of data. Applications should - /// call the to find out the size (in bytes) of a tile buffer. - /// The and parameters are always used by - /// ReadTile. The parameter is used if the image is deeper - /// than 1 slice (a value of > 1). In other cases the - /// value of is ignored. The parameter is - /// used only if data are organized in separate planes - /// ( = .Separate). In other - /// cases the value of is ignored. - /// - /// The library attempts to hide bit- and byte-ordering differences between the image and - /// the native machine by converting data to the native machine order. Bit reversal is - /// done if the value of tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - public int ReadTile(byte[] buffer, int offset, int x, int y, int z, short plane) - { - if (!checkRead(true) || !CheckTile(x, y, z, plane)) - return -1; - - return ReadEncodedTile(ComputeTile(x, y, z, plane), buffer, offset, -1); - } - - /// - /// Reads a tile of data from an open TIFF file/stream, decompresses it and places - /// specified amount of decompressed bytes into the user supplied buffer. - /// - /// The zero-based index of the tile to read. - /// The buffer to place decompressed tile bytes to. - /// The zero-based byte offset in buffer at which to begin storing - /// decompressed tile bytes. - /// The maximum number of decompressed tile bytes to be stored - /// to buffer. - /// The actual number of bytes of data that were placed in buffer or -1 if an - /// error was encountered. - /// - /// - /// The value of is a "raw tile number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// To read a full tile of data the data buffer should typically be at least as - /// large as the number returned by . If the -1 passed in - /// parameter, the whole tile will be read. You should be sure - /// you have enough space allocated for the buffer. - /// The library attempts to hide bit- and byte-ordering differences between the - /// image and the native machine by converting data to the native machine order. Bit - /// reversal is done if the tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - public int ReadEncodedTile(int tile, byte[] buffer, int offset, int count) - { - if (!checkRead(true)) - return -1; - - if (tile >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Tile out of range, max {1}", tile, m_dir.td_nstrips); - return -1; - } - - if (count == -1) - count = m_tilesize; - else if (count > m_tilesize) - count = m_tilesize; - - if (fillTile(tile) && m_currentCodec.DecodeTile(buffer, offset, count, (short)(tile / m_dir.td_stripsperimage))) - { - postDecode(buffer, offset, count); - return count; - } - - return -1; - } - - /// - /// Reads the undecoded contents of a tile of data from an open TIFF file/stream and places - /// specified amount of read bytes into the user supplied buffer. - /// - /// The zero-based index of the tile to read. - /// The buffer to place read tile bytes to. - /// The zero-based byte offset in buffer at which to begin storing - /// read tile bytes. - /// The maximum number of read tile bytes to be stored to buffer. - /// The actual number of bytes of data that were placed in buffer or -1 if an - /// error was encountered. - /// - /// - /// The value of is a "raw tile number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// To read a full tile of data the data buffer should typically be at least as - /// large as the number returned by . If the -1 passed in - /// parameter, the whole tile will be read. You should be sure - /// you have enough space allocated for the buffer. - public int ReadRawTile(int tile, byte[] buffer, int offset, int count) - { - const string module = "ReadRawTile"; - - if (!checkRead(true)) - return -1; - - if (tile >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Tile out of range, max {1}", tile, m_dir.td_nstrips); - return -1; - } - - if ((m_flags & TiffFlags.NoReadRaw) == TiffFlags.NoReadRaw) - { - ErrorExt(m_clientdata, m_name, "Compression scheme does not support access to raw uncompressed data"); - return -1; - } - - uint bytecount = m_dir.td_stripbytecount[tile]; - if (count != -1 && (uint)count < bytecount) - bytecount = (uint)count; - - return readRawTile1(tile, buffer, offset, (int)bytecount, module); - } - - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// The buffer with image data to be encoded and written. - /// The x-coordinate of the pixel within a tile to be encoded and written. - /// The y-coordinate of the pixel within a tile to be encoded and written. - /// The z-coordinate of the pixel within a tile to be encoded and written. - /// The zero-based index of the sample plane. - /// - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// - /// - /// The tile to place encoded data is selected by the (x, y, z, plane) coordinates (i.e. - /// WriteTile writes data to the tile containing the specified coordinates. - /// WriteTile (potentially) encodes the data and writes - /// it to open file/stream. The buffer must contain an entire tile of data. Applications - /// should call the to find out the size (in bytes) of a tile buffer. - /// The and parameters are always used by - /// WriteTile. The parameter is used if the image is deeper - /// than 1 slice (a value of > 1). In other cases the - /// value of is ignored. The parameter is - /// used only if data are organized in separate planes - /// ( = .Separate). In other - /// cases the value of is ignored. - /// - /// A correct value for the tag must be setup before - /// writing; WriteTile does not support automatically growing the image on - /// each write (as does). - /// - public int WriteTile(byte[] buffer, int x, int y, int z, short plane) - { - return WriteTile(buffer, 0, x, y, z, plane); - } - - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// - /// The buffer with image data to be encoded and written. - /// The zero-based byte offset in at which - /// to begin reading bytes to be encoded and written. - /// The x-coordinate of the pixel within a tile to be encoded and written. - /// The y-coordinate of the pixel within a tile to be encoded and written. - /// The z-coordinate of the pixel within a tile to be encoded and written. - /// The zero-based index of the sample plane. - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// - /// The tile to place encoded data is selected by the (x, y, z, plane) coordinates (i.e. - /// WriteTile writes data to the tile containing the specified coordinates. - /// WriteTile (potentially) encodes the data and writes - /// it to open file/stream. The buffer must contain an entire tile of data. Applications - /// should call the to find out the size (in bytes) of a tile buffer. - /// The and parameters are always used by - /// WriteTile. The parameter is used if the image is deeper - /// than 1 slice (a value of > 1). In other cases the - /// value of is ignored. The parameter is - /// used only if data are organized in separate planes - /// ( = .Separate). In other - /// cases the value of is ignored. - /// - /// A correct value for the tag must be setup before - /// writing; WriteTile does not support automatically growing the image on - /// each write (as does). - /// - public int WriteTile(byte[] buffer, int offset, int x, int y, int z, short plane) - { - if (!CheckTile(x, y, z, plane)) - return -1; - - // NB: A tile size of -1 is used instead of m_tilesize knowing that WriteEncodedTile - // will clamp this to the tile size. This is done because the tile size may not be - // defined until after the output buffer is setup in WriteBufferSetup. - return WriteEncodedTile(ComputeTile(x, y, z, plane), buffer, offset, -1); - } - - /// - /// Reads a strip of data from an open TIFF file/stream, decompresses it and places - /// specified amount of decompressed bytes into the user supplied buffer. - /// - /// The zero-based index of the strip to read. - /// The buffer to place decompressed strip bytes to. - /// The zero-based byte offset in buffer at which to begin storing - /// decompressed strip bytes. - /// The maximum number of decompressed strip bytes to be stored - /// to buffer. - /// The actual number of bytes of data that were placed in buffer or -1 if an - /// error was encountered. - /// - /// - /// The value of is a "raw strip number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to a - /// strip index. - /// To read a full strip of data the data buffer should typically be at least - /// as large as the number returned by . If the -1 passed in - /// parameter, the whole strip will be read. You should be sure - /// you have enough space allocated for the buffer. - /// The library attempts to hide bit- and byte-ordering differences between the - /// image and the native machine by converting data to the native machine order. Bit - /// reversal is done if the tag is opposite to the native - /// machine bit order. 16- and 32-bit samples are automatically byte-swapped if the file - /// was written with a byte order opposite to the native machine byte order. - /// - public int ReadEncodedStrip(int strip, byte[] buffer, int offset, int count) - { - if (!checkRead(false)) - return -1; - - if (strip >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Strip out of range, max {1}", strip, m_dir.td_nstrips); - return -1; - } - - // Calculate the strip size according to the number of rows in the strip (check for - // truncated last strip on any of the separations). - int strips_per_sep; - if (m_dir.td_rowsperstrip >= m_dir.td_imagelength) - strips_per_sep = 1; - else - strips_per_sep = (m_dir.td_imagelength + m_dir.td_rowsperstrip - 1) / m_dir.td_rowsperstrip; - - int sep_strip = strip % strips_per_sep; - - int nrows = m_dir.td_imagelength % m_dir.td_rowsperstrip; - if (sep_strip != strips_per_sep - 1 || nrows == 0) - nrows = m_dir.td_rowsperstrip; - - int stripsize = VStripSize(nrows); - if (count == -1) - count = stripsize; - else if (count > stripsize) - count = stripsize; - - if (fillStrip(strip) && m_currentCodec.DecodeStrip(buffer, offset, count, (short)(strip / m_dir.td_stripsperimage))) - { - postDecode(buffer, offset, count); - return count; - } - - return -1; - } - - /// - /// Reads the undecoded contents of a strip of data from an open TIFF file/stream and - /// places specified amount of read bytes into the user supplied buffer. - /// - /// The zero-based index of the strip to read. - /// The buffer to place read bytes to. - /// The zero-based byte offset in buffer at which to begin storing - /// read bytes. - /// The maximum number of read bytes to be stored to buffer. - /// The actual number of bytes of data that were placed in buffer or -1 if an - /// error was encountered. - /// - /// - /// The value of is a "raw strip number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to a - /// strip index. - /// To read a full strip of data the data buffer should typically be at least - /// as large as the number returned by . If the -1 passed in - /// parameter, the whole strip will be read. You should be sure - /// you have enough space allocated for the buffer. - public int ReadRawStrip(int strip, byte[] buffer, int offset, int count) - { - const string module = "ReadRawStrip"; - - if (!checkRead(false)) - return -1; - - if (strip >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Strip out of range, max {1}", strip, m_dir.td_nstrips); - return -1; - } - - if ((m_flags & TiffFlags.NoReadRaw) == TiffFlags.NoReadRaw) - { - ErrorExt(this, m_clientdata, m_name, "Compression scheme does not support access to raw uncompressed data"); - return -1; - } - - uint bytecount = m_dir.td_stripbytecount[strip]; - if (bytecount <= 0) - { - ErrorExt(this, m_clientdata, m_name, "{0}: Invalid strip byte count, strip {1}", bytecount, strip); - return -1; - } - - if (count != -1 && (uint)count < bytecount) - bytecount = (uint)count; - - return readRawStrip1(strip, buffer, offset, (int)bytecount, module); - } - - /// - /// Encodes and writes a strip of data to an open TIFF file/stream. - /// - /// The zero-based index of the strip to write. - /// The buffer with image data to be encoded and written. - /// The maximum number of strip bytes to be read from - /// . - /// - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// Encodes and writes a strip of data to an open TIFF file/stream. - /// - /// - /// WriteEncodedStrip encodes bytes of raw data from - /// and append the result to the specified strip; replacing any - /// previously written data. Note that the value of is a "raw - /// strip number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to - /// a strip index. - /// - /// If there is no space for the strip, the value of - /// tag is automatically increased to include the strip (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. - /// - public int WriteEncodedStrip(int strip, byte[] buffer, int count) - { - return WriteEncodedStrip(strip, buffer, 0, count); - } - - /// - /// Encodes and writes a strip of data to an open TIFF file/stream. - /// - /// The zero-based index of the strip to write. - /// The buffer with image data to be encoded and written. - /// The zero-based byte offset in at which - /// to begin reading bytes to be encoded and written. - /// The maximum number of strip bytes to be read from - /// . - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// - /// WriteEncodedStrip encodes bytes of raw data from - /// and append the result to the specified strip; replacing any - /// previously written data. Note that the value of is a "raw - /// strip number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to - /// a strip index. - /// - /// If there is no space for the strip, the value of - /// tag is automatically increased to include the strip (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. - /// - public int WriteEncodedStrip(int strip, byte[] buffer, int offset, int count) - { - const string module = "WriteEncodedStrip"; - - if (!writeCheckStrips(module)) - return -1; - - // Check strip array to make sure there's space. We don't support dynamically growing - // files that have data organized in separate bitplanes because it's too painful. - // In that case we require that the imagelength be set properly before the first write - // (so that the strips array will be fully allocated above). - if (strip >= m_dir.td_nstrips) - { - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - ErrorExt(this, m_clientdata, m_name, "Can not grow image by strips when using separate planes"); - return -1; - } - - if (!growStrips(1)) - return -1; - - m_dir.td_stripsperimage = howMany(m_dir.td_imagelength, m_dir.td_rowsperstrip); - } - - // Handle delayed allocation of data buffer. This permits it to be sized according to - // the directory info. - bufferCheck(); - - m_curstrip = strip; - m_row = (strip % m_dir.td_stripsperimage) * m_dir.td_rowsperstrip; - if ((m_flags & TiffFlags.CoderSetup) != TiffFlags.CoderSetup) - { - if (!m_currentCodec.SetupEncode()) - return -1; - - m_flags |= TiffFlags.CoderSetup; - } - - m_rawcc = 0; - m_rawcp = 0; - - if (m_dir.td_stripbytecount[strip] > 0) - { - // this forces appendToStrip() to do a seek - m_curoff = 0; - } - - m_flags &= ~TiffFlags.PostEncode; - short sample = (short)(strip / m_dir.td_stripsperimage); - if (!m_currentCodec.PreEncode(sample)) - return -1; - - // swab if needed - note that source buffer will be altered - postDecode(buffer, offset, count); - - if (!m_currentCodec.EncodeStrip(buffer, offset, count, sample)) - return 0; - - if (!m_currentCodec.PostEncode()) - return -1; - - if (!isFillOrder(m_dir.td_fillorder) && (m_flags & TiffFlags.NoBitRev) != TiffFlags.NoBitRev) - ReverseBits(m_rawdata, m_rawcc); - - if (m_rawcc > 0 && !appendToStrip(strip, m_rawdata, 0, m_rawcc)) - return -1; - - m_rawcc = 0; - m_rawcp = 0; - return count; - } - - /// - /// Writes a strip of raw data to an open TIFF file/stream. - /// - /// Writes a strip of raw data to an open TIFF file/stream. - /// The zero-based index of the strip to write. - /// The buffer with raw image data to be written. - /// The maximum number of strip bytes to be read from - /// . - /// - /// The number of written bytes or -1 if an error occurred. - /// - /// - /// - /// WriteRawStrip appends bytes of raw data from - /// to the specified strip; replacing any - /// previously written data. Note that the value of is a "raw - /// strip number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to - /// a strip index. - /// - /// If there is no space for the strip, the value of - /// tag is automatically increased to include the strip (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - public int WriteRawStrip(int strip, byte[] buffer, int count) - { - return WriteRawStrip(strip, buffer, 0, count); - } - - /// - /// Writes a strip of raw data to an open TIFF file/stream. - /// - /// The zero-based index of the strip to write. - /// The buffer with raw image data to be written. - /// The zero-based byte offset in at which - /// to begin reading bytes to be written. - /// The maximum number of strip bytes to be read from - /// . - /// The number of written bytes or -1 if an error occurred. - /// - /// - /// WriteRawStrip appends bytes of raw data from - /// to the specified strip; replacing any - /// previously written data. Note that the value of is a "raw - /// strip number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (row, plane) to - /// a strip index. - /// - /// If there is no space for the strip, the value of - /// tag is automatically increased to include the strip (except for - /// = .Separate, where the - /// tag cannot be changed once the first data are - /// written). If the is increased, the values of - /// and tags are - /// similarly enlarged to reflect data written past the previous end of image. - /// - public int WriteRawStrip(int strip, byte[] buffer, int offset, int count) - { - const string module = "WriteRawStrip"; - - if (!writeCheckStrips(module)) - return -1; - - // Check strip array to make sure there's space. We don't support dynamically growing - // files that have data organized in separate bitplanes because it's too painful. - // In that case we require that the imagelength be set properly before the first write - // (so that the strips array will be fully allocated above). - if (strip >= m_dir.td_nstrips) - { - if (m_dir.td_planarconfig == PlanarConfig.Separate) - { - ErrorExt(this, m_clientdata, m_name, "Can not grow image by strips when using separate planes"); - return -1; - } - - // Watch out for a growing image. The value of strips/image will initially be 1 - // (since it can't be deduced until the imagelength is known). - if (strip >= m_dir.td_stripsperimage) - m_dir.td_stripsperimage = howMany(m_dir.td_imagelength, m_dir.td_rowsperstrip); - - if (!growStrips(1)) - return -1; - } - - m_curstrip = strip; - m_row = (strip % m_dir.td_stripsperimage) * m_dir.td_rowsperstrip; - return (appendToStrip(strip, buffer, offset, count) ? count : -1); - } - - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// The zero-based index of the tile to write. - /// The buffer with image data to be encoded and written. - /// The maximum number of tile bytes to be read from - /// . - /// - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// - /// WriteEncodedTile encodes bytes of raw data from - /// and append the result to the end of the specified tile. Note - /// that the value of is a "raw tile number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// - /// There must be space for the data. The function clamps individual writes to a tile to - /// the tile size, but does not (and can not) check that multiple writes to the same tile - /// were performed. - /// - /// A correct value for the tag must be setup before - /// writing; WriteEncodedTile does not support automatically growing the image on - /// each write (as does). - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. - /// - public int WriteEncodedTile(int tile, byte[] buffer, int count) - { - return WriteEncodedTile(tile, buffer, 0, count); - } - - /// - /// Encodes and writes a tile of data to an open TIFF file/stream. - /// - /// The zero-based index of the tile to write. - /// The buffer with image data to be encoded and written. - /// The zero-based byte offset in at which - /// to begin reading bytes to be encoded and written. - /// The maximum number of tile bytes to be read from - /// . - /// The number of encoded and written bytes or -1 if an error occurred. - /// - /// - /// WriteEncodedTile encodes bytes of raw data from - /// and append the result to the end of the specified tile. Note - /// that the value of is a "raw tile number". That is, the caller - /// must take into account whether or not the data are organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// - /// There must be space for the data. The function clamps individual writes to a tile to - /// the tile size, but does not (and can not) check that multiple writes to the same tile - /// were performed. - /// - /// A correct value for the tag must be setup before - /// writing; WriteEncodedTile does not support automatically growing the image on - /// each write (as does). - /// - /// The library writes encoded data using the native machine byte order. Correctly - /// implemented TIFF readers are expected to do any necessary byte-swapping to correctly - /// process image data with value of tag greater - /// than 8. - /// - public int WriteEncodedTile(int tile, byte[] buffer, int offset, int count) - { - const string module = "WriteEncodedTile"; - - if (!writeCheckTiles(module)) - return -1; - - if (tile >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, module, "{0}: Tile {1} out of range, max {2}", m_name, tile, m_dir.td_nstrips); - return -1; - } - - // Handle delayed allocation of data buffer. This permits it to be sized more - // intelligently (using directory information). - bufferCheck(); - - m_curtile = tile; - - m_rawcc = 0; - m_rawcp = 0; - - if (m_dir.td_stripbytecount[tile] > 0) - { - // this forces appendToStrip() to do a seek - m_curoff = 0; - } - - // Compute tiles per row & per column to compute current row and column - m_row = (tile % howMany(m_dir.td_imagelength, m_dir.td_tilelength)) * m_dir.td_tilelength; - m_col = (tile % howMany(m_dir.td_imagewidth, m_dir.td_tilewidth)) * m_dir.td_tilewidth; - - if ((m_flags & TiffFlags.CoderSetup) != TiffFlags.CoderSetup) - { - if (!m_currentCodec.SetupEncode()) - return -1; - - m_flags |= TiffFlags.CoderSetup; - } - - m_flags &= ~TiffFlags.PostEncode; - short sample = (short)(tile / m_dir.td_stripsperimage); - if (!m_currentCodec.PreEncode(sample)) - return -1; - - // Clamp write amount to the tile size. This is mostly done so that callers can pass - // in some large number (e.g. -1) and have the tile size used instead. - if (count < 1 || count > m_tilesize) - count = m_tilesize; - - // swab if needed - note that source buffer will be altered - postDecode(buffer, offset, count); - - if (!m_currentCodec.EncodeTile(buffer, offset, count, sample)) - return 0; - - if (!m_currentCodec.PostEncode()) - return -1; - - if (!isFillOrder(m_dir.td_fillorder) && (m_flags & TiffFlags.NoBitRev) != TiffFlags.NoBitRev) - ReverseBits(m_rawdata, m_rawcc); - - if (m_rawcc > 0 && !appendToStrip(tile, m_rawdata, 0, m_rawcc)) - return -1; - - m_rawcc = 0; - m_rawcp = 0; - return count; - } - - /// - /// Writes a tile of raw data to an open TIFF file/stream. - /// - /// Writes a tile of raw data to an open TIFF file/stream. - /// The zero-based index of the tile to write. - /// The buffer with raw image data to be written. - /// The maximum number of tile bytes to be read from - /// . - /// - /// The number of written bytes or -1 if an error occurred. - /// - /// - /// - /// WriteRawTile appends bytes of raw data to the end of - /// the specified tile. Note that the value of is a "raw tile - /// number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// - /// There must be space for the data. The function clamps individual writes to a tile to - /// the tile size, but does not (and can not) check that multiple writes to the same tile - /// were performed. - /// - /// A correct value for the tag must be setup before - /// writing; WriteRawTile does not support automatically growing the image on - /// each write (as does). - /// - public int WriteRawTile(int tile, byte[] buffer, int count) - { - return WriteRawTile(tile, buffer, 0, count); - } - - /// - /// Writes a tile of raw data to an open TIFF file/stream. - /// - /// The zero-based index of the tile to write. - /// The buffer with raw image data to be written. - /// The zero-based byte offset in at which - /// to begin reading bytes to be written. - /// The maximum number of tile bytes to be read from - /// . - /// The number of written bytes or -1 if an error occurred. - /// - /// - /// WriteRawTile appends bytes of raw data to the end of - /// the specified tile. Note that the value of is a "raw tile - /// number". That is, the caller must take into account whether or not the data are - /// organized in separate planes - /// ( = .Separate). - /// automatically does this when converting an (x, y, z, plane) - /// coordinate quadruple to a tile number. - /// - /// There must be space for the data. The function clamps individual writes to a tile to - /// the tile size, but does not (and can not) check that multiple writes to the same tile - /// were performed. - /// - /// A correct value for the tag must be setup before - /// writing; WriteRawTile does not support automatically growing the image on - /// each write (as does). - /// - public int WriteRawTile(int tile, byte[] buffer, int offset, int count) - { - const string module = "WriteRawTile"; - - if (!writeCheckTiles(module)) - return -1; - - if (tile >= m_dir.td_nstrips) - { - ErrorExt(this, m_clientdata, module, - "{0}: Tile {1} out of range, max {2}", m_name, tile, m_dir.td_nstrips); - return -1; - } - - return (appendToStrip(tile, buffer, offset, count) ? count : -1); - } - - /// - /// Sets the current write offset. - /// - /// The write offset. - /// This should only be used to set the offset to a known previous location - /// (very carefully), or to 0 so that the next write gets appended to the end of the file. - /// - public void SetWriteOffset(long offset) - { - m_curoff = (uint)offset; - } - - /// - /// Gets the number of bytes occupied by the item of given type. - /// - /// The type. - /// The number of bytes occupied by the or 0 if unknown - /// data type is supplied. - public static int DataWidth(TiffType type) - { - switch (type) - { - case TiffType.NoType: - case TiffType.Byte: - case TiffType.ASCII: - case TiffType.SByte: - case TiffType.Undefined: - return 1; - - case TiffType.Short: - case TiffType.SShort: - return 2; - - case TiffType.Long: - case TiffType.SLong: - case TiffType.Float: - case TiffType.IFD: - return 4; - - case TiffType.Rational: - case TiffType.SRational: - case TiffType.Double: - return 8; - - default: - // will return 0 for unknown types - return 0; - } - } - - /// - /// Swaps the bytes in a single 16-bit item. - /// - /// The value to swap bytes in. - public static void SwabShort(ref short value) - { - byte[] bytes = new byte[2]; - bytes[0] = (byte)value; - bytes[1] = (byte)(value >> 8); - - byte temp = bytes[1]; - bytes[1] = bytes[0]; - bytes[0] = temp; - - value = (short)(bytes[0] & 0xFF); - value += (short)((bytes[1] & 0xFF) << 8); - } - - /// - /// Swaps the bytes in a single 32-bit item. - /// - /// The value to swap bytes in. - public static void SwabLong(ref int value) - { - byte[] bytes = new byte[4]; - bytes[0] = (byte)value; - bytes[1] = (byte)(value >> 8); - bytes[2] = (byte)(value >> 16); - bytes[3] = (byte)(value >> 24); - - byte temp = bytes[3]; - bytes[3] = bytes[0]; - bytes[0] = temp; - - temp = bytes[2]; - bytes[2] = bytes[1]; - bytes[1] = temp; - - value = bytes[0] & 0xFF; - value += (bytes[1] & 0xFF) << 8; - value += (bytes[2] & 0xFF) << 16; - value += bytes[3] << 24; - } - - /// - /// Swaps the bytes in a single double-precision floating-point number. - /// - /// The value to swap bytes in. - public static void SwabDouble(ref double value) - { - byte[] bytes = BitConverter.GetBytes(value); - int[] ints = new int[2]; - ints[0] = BitConverter.ToInt32(bytes, 0); - ints[0] = BitConverter.ToInt32(bytes, sizeof(int)); - - SwabArrayOfLong(ints, 2); - - int temp = ints[0]; - ints[0] = ints[1]; - ints[1] = temp; - - Buffer.BlockCopy(BitConverter.GetBytes(ints[0]), 0, bytes, 0, sizeof(int)); - Buffer.BlockCopy(BitConverter.GetBytes(ints[1]), 0, bytes, sizeof(int), sizeof(int)); - value = BitConverter.ToDouble(bytes, 0); - } - - /// - /// Swaps the bytes in specified number of values in the array of 16-bit items. - /// - /// - /// Swaps the bytes in specified number of values in the array of 16-bit items. - /// - /// The array to swap bytes in. - /// The number of items to swap bytes in. - public static void SwabArrayOfShort(short[] array, int count) - { - SwabArrayOfShort(array, 0, count); - } - - /// - /// Swaps the bytes in specified number of values in the array of 16-bit items starting at - /// specified offset. - /// - /// The array to swap bytes in. - /// The zero-based offset in at - /// which to begin swapping bytes. - /// The number of items to swap bytes in. - public static void SwabArrayOfShort(short[] array, int offset, int count) - { - byte[] bytes = new byte[2]; - for (int i = 0; i < count; i++, offset++) - { - bytes[0] = (byte)array[offset]; - bytes[1] = (byte)(array[offset] >> 8); - - byte temp = bytes[1]; - bytes[1] = bytes[0]; - bytes[0] = temp; - - array[offset] = (short)(bytes[0] & 0xFF); - array[offset] += (short)((bytes[1] & 0xFF) << 8); - } - } - - /// - /// Swaps the bytes in specified number of values in the array of triples (24-bit items). - /// - /// - /// Swaps the bytes in specified number of values in the array of triples (24-bit items). - /// - /// The array to swap bytes in. - /// The number of items to swap bytes in. - public static void SwabArrayOfTriples(byte[] array, int count) - { - SwabArrayOfTriples(array, 0, count); - } - - /// - /// Swaps the bytes in specified number of values in the array of triples (24-bit items) - /// starting at specified offset. - /// - /// The array to swap bytes in. - /// The zero-based offset in at - /// which to begin swapping bytes. - /// The number of items to swap bytes in. - public static void SwabArrayOfTriples(byte[] array, int offset, int count) - { - // XXX unroll loop some - while (count-- > 0) - { - byte t = array[offset + 2]; - array[offset + 2] = array[offset]; - array[offset] = t; - offset += 3; - } - } - - /// - /// Swaps the bytes in specified number of values in the array of 32-bit items. - /// - /// - /// Swaps the bytes in specified number of values in the array of 32-bit items. - /// - /// The array to swap bytes in. - /// The number of items to swap bytes in. - public static void SwabArrayOfLong(int[] array, int count) - { - SwabArrayOfLong(array, 0, count); - } - - /// - /// Swaps the bytes in specified number of values in the array of 32-bit items - /// starting at specified offset. - /// - /// The array to swap bytes in. - /// The zero-based offset in at - /// which to begin swapping bytes. - /// The number of items to swap bytes in. - public static void SwabArrayOfLong(int[] array, int offset, int count) - { - byte[] bytes = new byte[4]; - - for (int i = 0; i < count; i++, offset++) - { - bytes[0] = (byte)array[offset]; - bytes[1] = (byte)(array[offset] >> 8); - bytes[2] = (byte)(array[offset] >> 16); - bytes[3] = (byte)(array[offset] >> 24); - - byte temp = bytes[3]; - bytes[3] = bytes[0]; - bytes[0] = temp; - - temp = bytes[2]; - bytes[2] = bytes[1]; - bytes[1] = temp; - - array[offset] = bytes[0] & 0xFF; - array[offset] += (bytes[1] & 0xFF) << 8; - array[offset] += (bytes[2] & 0xFF) << 16; - array[offset] += bytes[3] << 24; - } - } - - /// - /// Swaps the bytes in specified number of values in the array of double-precision - /// floating-point numbers. - /// - /// - /// Swaps the bytes in specified number of values in the array of double-precision - /// floating-point numbers. - /// - /// The array to swap bytes in. - /// The number of items to swap bytes in. - public static void SwabArrayOfDouble(double[] array, int count) - { - SwabArrayOfDouble(array, 0, count); - } - - /// - /// Swaps the bytes in specified number of values in the array of double-precision - /// floating-point numbers starting at specified offset. - /// - /// The array to swap bytes in. - /// The zero-based offset in at - /// which to begin swapping bytes. - /// The number of items to swap bytes in. - public static void SwabArrayOfDouble(double[] array, int offset, int count) - { - int[] ints = new int[count * sizeof(int) / sizeof(double)]; - Buffer.BlockCopy(array, offset * sizeof(double), ints, 0, ints.Length * sizeof(int)); - - SwabArrayOfLong(ints, ints.Length); - - int pos = 0; - while (count-- > 0) - { - int temp = ints[pos]; - ints[pos] = ints[pos + 1]; - ints[pos + 1] = temp; - pos += 2; - } - - Buffer.BlockCopy(ints, 0, array, offset * sizeof(double), ints.Length * sizeof(int)); - } - - /// - /// Replaces specified number of bytes in with the - /// equivalent bit-reversed bytes. - /// - /// - /// Replaces specified number of bytes in with the - /// equivalent bit-reversed bytes. - /// - /// The buffer to replace bytes in. - /// The number of bytes to process. - /// - /// This operation is performed with a lookup table, which can be retrieved using the - /// method. - /// - public static void ReverseBits(byte[] buffer, int count) - { - ReverseBits(buffer, 0, count); - } - - /// - /// Replaces specified number of bytes in with the - /// equivalent bit-reversed bytes starting at specified offset. - /// - /// The buffer to replace bytes in. - /// The zero-based offset in at - /// which to begin processing bytes. - /// The number of bytes to process. - /// - /// This operation is performed with a lookup table, which can be retrieved using the - /// method. - /// - public static void ReverseBits(byte[] buffer, int offset, int count) - { - for (; count > 8; count -= 8) - { - buffer[offset + 0] = TIFFBitRevTable[buffer[offset + 0]]; - buffer[offset + 1] = TIFFBitRevTable[buffer[offset + 1]]; - buffer[offset + 2] = TIFFBitRevTable[buffer[offset + 2]]; - buffer[offset + 3] = TIFFBitRevTable[buffer[offset + 3]]; - buffer[offset + 4] = TIFFBitRevTable[buffer[offset + 4]]; - buffer[offset + 5] = TIFFBitRevTable[buffer[offset + 5]]; - buffer[offset + 6] = TIFFBitRevTable[buffer[offset + 6]]; - buffer[offset + 7] = TIFFBitRevTable[buffer[offset + 7]]; - offset += 8; - } - - while (count-- > 0) - { - buffer[offset] = TIFFBitRevTable[buffer[offset]]; - offset++; - } - } - - /// - /// Retrieves a bit reversal table. - /// - /// if set to true then bit reversal table will be - /// retrieved; otherwise, the table that do not reverse bit values will be retrieved. - /// The bit reversal table. - /// If is false then the table that do not - /// reverse bit values will be retrieved. It is a lookup table that can be used as an - /// identity function; i.e. NoBitRevTable[n] == n. - public static byte[] GetBitRevTable(bool reversed) - { - return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable); - } - - /// - /// Converts a byte buffer into array of 32-bit values. - /// - /// The byte buffer. - /// The zero-based offset in at - /// which to begin converting bytes. - /// The number of bytes to convert. - /// The array of 32-bit values. - public static int[] ByteArrayToInts(byte[] buffer, int offset, int count) - { - int intCount = count / sizeof(int); - int[] integers = new int[intCount]; - Buffer.BlockCopy(buffer, offset, integers, 0, intCount * sizeof(int)); - return integers; - } - - /// - /// Converts array of 32-bit values into array of bytes. - /// - /// The array of 32-bit values. - /// The zero-based offset in at - /// which to begin converting bytes. - /// The number of 32-bit values to convert. - /// The byte array to store converted values at. - /// The zero-based offset in at - /// which to begin storing converted values. - public static void IntsToByteArray(int[] source, int srcOffset, int srcCount, byte[] bytes, int offset) - { - Buffer.BlockCopy(source, srcOffset * sizeof(int), bytes, offset, srcCount * sizeof(int)); - } - - /// - /// Converts a byte buffer into array of 16-bit values. - /// - /// The byte buffer. - /// The zero-based offset in at - /// which to begin converting bytes. - /// The number of bytes to convert. - /// The array of 16-bit values. - public static short[] ByteArrayToShorts(byte[] buffer, int offset, int count) - { - int shortCount = count / sizeof(short); - short[] shorts = new short[shortCount]; - Buffer.BlockCopy(buffer, offset, shorts, 0, shortCount * sizeof(short)); - return shorts; - } - - /// - /// Converts array of 16-bit values into array of bytes. - /// - /// The array of 16-bit values. - /// The zero-based offset in at - /// which to begin converting bytes. - /// The number of 16-bit values to convert. - /// The byte array to store converted values at. - /// The zero-based offset in at - /// which to begin storing converted values. - public static void ShortsToByteArray(short[] source, int srcOffset, int srcCount, byte[] bytes, int offset) - { - Buffer.BlockCopy(source, srcOffset * sizeof(short), bytes, offset, srcCount * sizeof(short)); - } - } - #endregion - - #region Tiff2RGBAConverter - public class TiffToRGBAConverter - { - public Compression m_compression = Compression.PackBits; - public int m_rowsPerStrip = -1; - public bool m_processByBlock; - public bool m_noAlpha; - public bool m_testFriendly; - - public bool tiffcvt(Tiff inImage, Tiff outImage) - { - FieldValue[] result = inImage.GetField(TiffTag.ImageWidth); - if (result == null) - return false; - int width = result[0].ToInt(); - - result = inImage.GetField(TiffTag.ImageLength); - if (result == null) - return false; - int height = result[0].ToInt(); - - copyField(inImage, outImage, TiffTag.SubFileType); - outImage.SetField(TiffTag.ImageWidth, width); - outImage.SetField(TiffTag.ImageLength, height); - outImage.SetField(TiffTag.BitsPerSample, 8); - outImage.SetField(TiffTag.Compression, m_compression); - outImage.SetField(TiffTag.Photometric, Photometric.RGB); - - copyField(inImage, outImage, TiffTag.FillOrder); - outImage.SetField(TiffTag.Orientation, Orientation.TopLeft); - - if (m_noAlpha) - outImage.SetField(TiffTag.SamplesPerPixel, 3); - else - outImage.SetField(TiffTag.SamplesPerPixel, 4); - - if (!m_noAlpha) - { - short[] v = new short[1]; - v[0] = (short)ExtraSample.AssociatedAlpha; - outImage.SetField(TiffTag.ExtraSamples, 1, v); - } - - copyField(inImage, outImage, TiffTag.XResolution); - copyField(inImage, outImage, TiffTag.YResolution); - copyField(inImage, outImage, TiffTag.ResolutionUnit); - outImage.SetField(TiffTag.PlanarConfig, PlanarConfig.Contig); - - if (!m_testFriendly) - outImage.SetField(TiffTag.Software, Tiff.GetVersion()); - - copyField(inImage, outImage, TiffTag.DocumentName); - - if (m_processByBlock && inImage.IsTiled()) - return cvt_by_tile(inImage, outImage, width, height); - else if (m_processByBlock) - return cvt_by_strip(inImage, outImage, width, height); - - return cvt_whole_image(inImage, outImage, width, height); - } - - private static void copyField(Tiff inImage, Tiff outImage, TiffTag tag) - { - FieldValue[] result = inImage.GetField(tag); - if (result != null) - outImage.SetField(tag, result[0]); - } - - private static int multiply(int x, int y) - { - long res = (long)x * (long)y; - if (res > int.MaxValue) - return 0; - - return (int)res; - } - - static bool cvt_by_tile(Tiff inImage, Tiff outImage, int width, int height) - { - int tile_width = 0; - int tile_height = 0; - - FieldValue[] result = inImage.GetField(TiffTag.TileWidth); - if (result != null) - { - tile_width = result[0].ToInt(); - - result = inImage.GetField(TiffTag.TileLength); - if (result != null) - tile_height = result[0].ToInt(); - } - - if (result == null) - { - Tiff.Error(inImage.FileName(), "Source image not tiled"); - return false; - } - - outImage.SetField(TiffTag.TileWidth, tile_width); - outImage.SetField(TiffTag.TileLength, tile_height); - - // Allocate tile buffer - int raster_size = multiply(tile_width, tile_height); - int rasterByteSize = multiply(raster_size, sizeof(int)); - if (raster_size == 0 || rasterByteSize == 0) - { - Tiff.Error(inImage.FileName(), - "Can't allocate buffer for raster of size {0}x{1}", tile_width, tile_height); - return false; - } - - int[] raster = new int[raster_size]; - byte[] rasterBytes = new byte[rasterByteSize]; - - // Allocate a scanline buffer for swapping during the vertical mirroring pass. - // (Request can't overflow given prior checks.) - int[] wrk_line = new int[tile_width]; - - // Loop over the tiles. - for (int row = 0; row < height; row += tile_height) - { - for (int col = 0; col < width; col += tile_width) - { - // Read the tile into an RGBA array - if (!inImage.ReadRGBATile(col, row, raster)) - return false; - - // For some reason the ReadRGBATile() function chooses the lower left corner - // as the origin. Vertically mirror scanlines. - for (int i_row = 0; i_row < tile_height / 2; i_row++) - { - int topIndex = tile_width * i_row * sizeof(int); - int bottomIndex = tile_width * (tile_height - i_row - 1) * sizeof(int); - - Buffer.BlockCopy(raster, topIndex, wrk_line, 0, tile_width * sizeof(int)); - Buffer.BlockCopy(raster, bottomIndex, raster, topIndex, tile_width * sizeof(int)); - Buffer.BlockCopy(wrk_line, 0, raster, bottomIndex, tile_width * sizeof(int)); - } - - // Write out the result in a tile. - int tile = outImage.ComputeTile(col, row, 0, 0); - Buffer.BlockCopy(raster, 0, rasterBytes, 0, rasterByteSize); - if (outImage.WriteEncodedTile(tile, rasterBytes, rasterByteSize) == -1) - return false; - } - } - - return true; - } - - private bool cvt_by_strip(Tiff inImage, Tiff outImage, int width, int height) - { - FieldValue[] result = inImage.GetField(TiffTag.RowsPerStrip); - if (result == null) - { - Tiff.Error(inImage.FileName(), "Source image not in strips"); - return false; - } - - m_rowsPerStrip = result[0].ToInt(); - outImage.SetField(TiffTag.RowsPerStrip, m_rowsPerStrip); - - // Allocate strip buffer - int raster_size = multiply(width, m_rowsPerStrip); - int rasterByteSize = multiply(raster_size, sizeof(int)); - if (raster_size == 0 || rasterByteSize == 0) - { - Tiff.Error(inImage.FileName(), - "Can't allocate buffer for raster of size {0}x{1}", width, m_rowsPerStrip); - return false; - } - - int[] raster = new int[raster_size]; - byte[] rasterBytes = new byte[rasterByteSize]; - - // Allocate a scanline buffer for swapping during the vertical mirroring pass. - // (Request can't overflow given prior checks.) - int[] wrk_line = new int[width]; - - // Loop over the strips. - for (int row = 0; row < height; row += m_rowsPerStrip) - { - // Read the strip into an RGBA array - if (!inImage.ReadRGBAStrip(row, raster)) - return false; - - // Figure out the number of scanlines actually in this strip. - int rows_to_write; - if (row + m_rowsPerStrip > height) - rows_to_write = height - row; - else - rows_to_write = m_rowsPerStrip; - - // For some reason the TIFFReadRGBAStrip() function chooses the lower left corner - // as the origin. Vertically mirror scanlines. - for (int i_row = 0; i_row < rows_to_write / 2; i_row++) - { - int topIndex = width * i_row * sizeof(int); - int bottomIndex = width * (rows_to_write - i_row - 1) * sizeof(int); - - Buffer.BlockCopy(raster, topIndex, wrk_line, 0, width * sizeof(int)); - Buffer.BlockCopy(raster, bottomIndex, raster, topIndex, width * sizeof(int)); - Buffer.BlockCopy(wrk_line, 0, raster, bottomIndex, width * sizeof(int)); - } - - // Write out the result in a strip - int bytesToWrite = rows_to_write * width * sizeof(int); - Buffer.BlockCopy(raster, 0, rasterBytes, 0, bytesToWrite); - if (outImage.WriteEncodedStrip(row / m_rowsPerStrip, rasterBytes, bytesToWrite) == -1) - return false; - } - - return true; - } - - /// - /// Read the whole image into one big RGBA buffer and then write out - /// strips from that. This is using the traditional TIFFReadRGBAImage() - /// API that we trust. - /// - private bool cvt_whole_image(Tiff inImage, Tiff outImage, int width, int height) - { - int pixel_count = width * height; - - /* XXX: Check the integer overflow. */ - if (width == 0 || height == 0 || (pixel_count / width) != height) - { - Tiff.Error(inImage.FileName(), - "Malformed input file; can't allocate buffer for raster of {0}x{1} size", - width, height); - return false; - } - - m_rowsPerStrip = outImage.DefaultStripSize(m_rowsPerStrip); - outImage.SetField(TiffTag.RowsPerStrip, m_rowsPerStrip); - - int[] raster = new int[pixel_count]; - - /* Read the image in one chunk into an RGBA array */ - if (!inImage.ReadRGBAImageOriented(width, height, raster, Orientation.TopLeft, false)) - return false; - - /* - * Do we want to strip away alpha components? - */ - byte[] rasterBytes; - int rasterByteSize; - if (m_noAlpha) - { - rasterByteSize = pixel_count * 3; - rasterBytes = new byte[rasterByteSize]; - - for (int i = 0, rasterBytesPos = 0; i < pixel_count; i++) - { - byte[] bytes = BitConverter.GetBytes(raster[i]); - rasterBytes[rasterBytesPos++] = bytes[0]; - rasterBytes[rasterBytesPos++] = bytes[1]; - rasterBytes[rasterBytesPos++] = bytes[2]; - } - } - else - { - rasterByteSize = pixel_count * 4; - rasterBytes = new byte[rasterByteSize]; - Buffer.BlockCopy(raster, 0, rasterBytes, 0, rasterByteSize); - } - - /* - * Write out the result in strips - */ - for (int row = 0; row < height; row += m_rowsPerStrip) - { - int bytes_per_pixel; - if (m_noAlpha) - bytes_per_pixel = 3; - else - bytes_per_pixel = 4; - - int rows_to_write; - if (row + m_rowsPerStrip > height) - rows_to_write = height - row; - else - rows_to_write = m_rowsPerStrip; - - int offset = bytes_per_pixel * row * width; - int count = bytes_per_pixel * rows_to_write * width; - if (outImage.WriteEncodedStrip(row / m_rowsPerStrip, rasterBytes, offset, count) == -1) - return false; - } - - return true; - } - } - #endregion - - #region TiffRGBAImage - /// - /// RGBA-style image support. Provides methods for decoding images into RGBA (or other) format. - /// - /// - /// - /// TiffRgbaImage provide a high-level interface through which TIFF images may be read - /// into memory. Images may be strip- or tile-based and have a variety of different - /// characteristics: bits/sample, samples/pixel, photometric, etc. The target raster format - /// can be customized to a particular application's needs by installing custom methods that - /// manipulate image data according to application requirements. - /// - /// The default usage for this class: check if an image can be processed using - /// , construct an instance of - /// TiffRgbaImage using and then read and decode an image into a - /// target raster using . can be called - /// multiple times to decode an image using different state parameters. If multiple images - /// are to be displayed and there is not enough space for each of the decoded rasters, - /// multiple instances of TiffRgbaImage can be managed and then calls can be made to - /// as needed to display an image. - /// - /// To use the core support for reading and processing TIFF images, but write the resulting - /// raster data in a different format one need only override the "put methods" used to store - /// raster data. These methods are initially setup by to point to methods - /// that pack raster data in the default ABGR pixel format. Two different methods are used - /// according to the physical organization of the image data in the file: one for - /// = .Contig (packed samples), - /// and another for = .Separate - /// (separated samples). Note that this mechanism can be used to transform the data before - /// storing it in the raster. For example one can convert data to colormap indices for display - /// on a colormap display. - /// To setup custom "put" method please use property for contiguously - /// packed samples and/or property for separated samples. - /// - /// The methods of TiffRgbaImage support the most commonly encountered flavors of TIFF. - /// It is possible to extend this support by overriding the "get method" invoked by - /// to read TIFF image data. Details of doing this are a bit involved, - /// it is best to make a copy of an existing get method and modify it to suit the needs of an - /// application. To setup custom "get" method please use property. - /// - public class TiffRgbaImage - { - internal const string photoTag = "PhotometricInterpretation"; - - /// - /// image handle - /// - private Tiff tif; - - /// - /// stop on read error - /// - private bool stoponerr; - - /// - /// data is packed/separate - /// - private bool isContig; - - /// - /// type of alpha data present - /// - private ExtraSample alpha; - - /// - /// image width - /// - private int width; - - /// - /// image height - /// - private int height; - - /// - /// image bits/sample - /// - private short bitspersample; - - /// - /// image samples/pixel - /// - private short samplesperpixel; - - /// - /// image orientation - /// - private Orientation orientation; - - /// - /// requested orientation - /// - private Orientation req_orientation; - - /// - /// image photometric interp - /// - private Photometric photometric; - - /// - /// colormap pallete - /// - private short[] redcmap; - - private short[] greencmap; - - private short[] bluecmap; - - private GetDelegate get; - private PutContigDelegate putContig; - private PutSeparateDelegate putSeparate; - - /// - /// sample mapping array - /// - private byte[] Map; - - /// - /// black and white map - /// - private int[][] BWmap; - - /// - /// palette image map - /// - private int[][] PALmap; - - /// - /// YCbCr conversion state - /// - private TiffYCbCrToRGB ycbcr; - - /// - /// CIE L*a*b conversion state - /// - private TiffCIELabToRGB cielab; - - private static TiffDisplay display_sRGB = new TiffDisplay( - // XYZ -> luminance matrix - new float[] { 3.2410F, -1.5374F, -0.4986F }, - new float[] { -0.9692F, 1.8760F, 0.0416F }, - new float[] { 0.0556F, -0.2040F, 1.0570F }, - 100.0F, 100.0F, 100.0F, // Light o/p for reference white - 255, 255, 255, // Pixel values for ref. white - 1.0F, 1.0F, 1.0F, // Residual light o/p for black pixel - 2.4F, 2.4F, 2.4F // Gamma values for the three guns - ); - - private const int A1 = 0xff << 24; - - // Helper constants used in Orientation tag handling - private const int FLIP_VERTICALLY = 0x01; - private const int FLIP_HORIZONTALLY = 0x02; - - internal int row_offset; - internal int col_offset; - - /// - /// Delegate for "put" method (the method that is called to pack pixel data in the raster) - /// used when converting contiguously packed samples. - /// - /// An instance of the class. - /// The raster (the buffer to place decoded image data to). - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The value that should be added to - /// after each row processed. - /// The x-coordinate of the first pixel in block of pixels to be decoded. - /// The y-coordinate of the first pixel in block of pixels to be decoded. - /// The block width. - /// The block height. - /// The buffer with image data. - /// The zero-based byte offset in at - /// which to begin reading image bytes. - /// The value that should be added to - /// after each row processed. - /// - /// The image reading and conversion methods invoke "put" methods to copy/image/whatever - /// tiles of raw image data. A default set of methods is provided to convert/copy raw - /// image data to 8-bit packed ABGR format rasters. Applications can supply alternate - /// methods that unpack the data into a different format or, for example, unpack the data - /// and draw the unpacked raster on the display. - /// - /// To setup custom "put" method for contiguously packed samples please use - /// property. - /// - /// The is usually 0. It is greater than 0 if width of strip - /// being converted is greater than image width or part of the tile being converted is - /// outside the image (may be true for tiles on the right and bottom edge of the image). - /// In other words, is used to make up for any padding on - /// the end of each line of the buffer with image data. - /// - /// The is 0 if width of tile being converted is equal to - /// image width and image data should not be flipped vertically. In other circumstances - /// is used to make up for any padding on the end of each - /// line of the raster and/or for flipping purposes. - /// - public delegate void PutContigDelegate( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift); - - /// - /// Delegate for "put" method (the method that is called to pack pixel data in the raster) - /// used when converting separated samples. - /// - /// An instance of the class. - /// The raster (the buffer to place decoded image data to). - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The value that should be added to - /// after each row processed. - /// The x-coordinate of the first pixel in block of pixels to be decoded. - /// The y-coordinate of the first pixel in block of pixels to be decoded. - /// The block width. - /// The block height. - /// The buffer with image data. - /// The zero-based byte offset in at - /// which to begin reading image bytes that constitute first sample plane. - /// The zero-based byte offset in at - /// which to begin reading image bytes that constitute second sample plane. - /// The zero-based byte offset in at - /// which to begin reading image bytes that constitute third sample plane. - /// The zero-based byte offset in at - /// which to begin reading image bytes that constitute fourth sample plane. - /// The value that should be added to , - /// , and - /// after each row processed. - /// - /// The image reading and conversion methods invoke "put" methods to copy/image/whatever - /// tiles of raw image data. A default set of methods is provided to convert/copy raw - /// image data to 8-bit packed ABGR format rasters. Applications can supply alternate - /// methods that unpack the data into a different format or, for example, unpack the data - /// and draw the unpacked raster on the display. - /// - /// To setup custom "put" method for separated samples please use - /// property. - /// - /// The is usually 0. It is greater than 0 if width of strip - /// being converted is greater than image width or part of the tile being converted is - /// outside the image (may be true for tiles on the right and bottom edge of the image). - /// In other words, is used to make up for any padding on - /// the end of each line of the buffer with image data. - /// - /// The is 0 if width of tile being converted is equal to - /// image width and image data should not be flipped vertically. In other circumstances - /// is used to make up for any padding on the end of each - /// line of the raster and/or for flipping purposes. - /// - public delegate void PutSeparateDelegate( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift); - - /// - /// Delegate for "get" method (the method that is called to produce RGBA raster). - /// - /// An instance of the class. - /// The raster (the buffer to place decoded image data to). - /// The zero-based byte offset in at which - /// to begin storing decoded bytes. - /// The raster width. - /// The raster height. - /// true if the image was successfully read and decoded; otherwise, - /// false. - /// - /// A default set of methods is provided to read and convert/copy raw image data to 8-bit - /// packed ABGR format rasters. Applications can supply alternate method for this. - /// - /// To setup custom "get" method please use property. - /// - public delegate bool GetDelegate(TiffRgbaImage img, int[] raster, int offset, int width, int height); - - private TiffRgbaImage() - { - } - - /// - /// Creates new instance of the class. - /// - /// - /// The instance of the class used to retrieve - /// image data. - /// - /// - /// if set to true then an error will terminate the conversion; otherwise "get" - /// methods will continue processing data until all the possible data in the image have - /// been requested. - /// - /// The error message (if any) gets placed here. - /// - /// New instance of the class if the image specified - /// by can be converted to RGBA format; otherwise, null is - /// returned and contains the reason why it is being - /// rejected. - /// - public static TiffRgbaImage Create(Tiff tif, bool stopOnError, out string errorMsg) - { - errorMsg = null; - - // Initialize to normal values - TiffRgbaImage img = new TiffRgbaImage(); - img.row_offset = 0; - img.col_offset = 0; - img.redcmap = null; - img.greencmap = null; - img.bluecmap = null; - img.req_orientation = Orientation.BottomLeft; // It is the default - img.tif = tif; - img.stoponerr = stopOnError; - - FieldValue[] result = tif.GetFieldDefaulted(TiffTag.BitsPerSample); - img.bitspersample = result[0].ToShort(); - switch (img.bitspersample) - { - case 1: - case 2: - case 4: - case 8: - case 16: - break; - - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle images with {0}-bit samples", img.bitspersample); - return null; - } - - img.alpha = 0; - result = tif.GetFieldDefaulted(TiffTag.SamplesPerPixel); - img.samplesperpixel = result[0].ToShort(); - - result = tif.GetFieldDefaulted(TiffTag.ExtraSamples); - short extrasamples = result[0].ToShort(); - byte[] sampleinfo = result[1].ToByteArray(); - - if (extrasamples >= 1) - { - switch ((ExtraSample)sampleinfo[0]) - { - case ExtraSample.UnSpecified: - if (img.samplesperpixel > 3) - { - // Workaround for some images without correct info about alpha channel - img.alpha = ExtraSample.AssociatedAlpha; - } - break; - - case ExtraSample.AssociatedAlpha: - // data is pre-multiplied - case ExtraSample.UnAssociatedAlpha: - // data is not pre-multiplied - img.alpha = (ExtraSample)sampleinfo[0]; - break; - } - } - - if (Tiff.DEFAULT_EXTRASAMPLE_AS_ALPHA) - { - result = tif.GetField(TiffTag.Photometric); - if (result == null) - img.photometric = Photometric.MinIsWhite; - - if (extrasamples == 0 && img.samplesperpixel == 4 && img.photometric == Photometric.RGB) - { - img.alpha = ExtraSample.AssociatedAlpha; - extrasamples = 1; - } - } - - int colorchannels = img.samplesperpixel - extrasamples; - - result = tif.GetFieldDefaulted(TiffTag.Compression); - Compression compress = (Compression)result[0].ToInt(); - - result = tif.GetFieldDefaulted(TiffTag.PlanarConfig); - PlanarConfig planarconfig = (PlanarConfig)result[0].ToShort(); - - result = tif.GetField(TiffTag.Photometric); - if (result == null) - { - switch (colorchannels) - { - case 1: - if (img.isCCITTCompression()) - img.photometric = Photometric.MinIsWhite; - else - img.photometric = Photometric.MinIsBlack; - break; - - case 3: - img.photometric = Photometric.RGB; - break; - - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, "Missing needed {0} tag", photoTag); - return null; - } - } - else - img.photometric = (Photometric)result[0].ToInt(); - - switch (img.photometric) - { - case Photometric.Palette: - result = tif.GetField(TiffTag.Colormap); - if (result == null) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, "Missing required \"Colormap\" tag"); - return null; - } - - short[] red_orig = result[0].ToShortArray(); - short[] green_orig = result[1].ToShortArray(); - short[] blue_orig = result[2].ToShortArray(); - - // copy the colormaps so we can modify them - int n_color = (1 << img.bitspersample); - img.redcmap = new short[n_color]; - img.greencmap = new short[n_color]; - img.bluecmap = new short[n_color]; - - Buffer.BlockCopy(red_orig, 0, img.redcmap, 0, n_color * sizeof(short)); - Buffer.BlockCopy(green_orig, 0, img.greencmap, 0, n_color * sizeof(short)); - Buffer.BlockCopy(blue_orig, 0, img.bluecmap, 0, n_color * sizeof(short)); - - if (planarconfig == PlanarConfig.Contig && - img.samplesperpixel != 1 && img.bitspersample < 8) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle contiguous data with {0}={1}, and {2}={3} and Bits/Sample={4}", - photoTag, img.photometric, "Samples/pixel", img.samplesperpixel, img.bitspersample); - return null; - } - break; - - case Photometric.MinIsWhite: - case Photometric.MinIsBlack: - if (planarconfig == PlanarConfig.Contig && - img.samplesperpixel != 1 && img.bitspersample < 8) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle contiguous data with {0}={1}, and {2}={3} and Bits/Sample={4}", - photoTag, img.photometric, "Samples/pixel", img.samplesperpixel, img.bitspersample); - return null; - } - break; - - case Photometric.YCBCR: - // It would probably be nice to have a reality check here. - if (planarconfig == PlanarConfig.Contig) - { - // can rely on LibJpeg.Net to convert to RGB - // XXX should restore current state on exit - switch (compress) - { - case Compression.JPEG: - // TODO: when complete tests verify complete desubsampling and - // YCbCr handling, remove use of JPEGCOLORMODE in favor of native - // handling - tif.SetField(TiffTag.JPEGCOLORMODE, JpegColorMode.RGB); - img.photometric = Photometric.RGB; - break; - - default: - // do nothing - break; - } - } - - // TODO: if at all meaningful and useful, make more complete support check - // here, or better still, refactor to let supporting code decide whether there - // is support and what meaningfull error to return - break; - - case Photometric.RGB: - if (colorchannels < 3) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle RGB image with {0}={1}", "Color channels", colorchannels); - return null; - } - break; - - case Photometric.Separated: - result = tif.GetFieldDefaulted(TiffTag.InkSet); - InkSet inkset = (InkSet)result[0].ToByte(); - - if (inkset != InkSet.CMYK) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle separated image with {0}={1}", "InkSet", inkset); - return null; - } - - if (img.samplesperpixel < 4) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle separated image with {0}={1}", "Samples/pixel", img.samplesperpixel); - return null; - } - break; - - case Photometric.LogL: - if (compress != Compression.SGILOG) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, LogL data must have {0}={1}", "Compression", Compression.SGILOG); - return null; - } - - tif.SetField(TiffTag.SGILOGDATAFMT, 3); // 8-bit RGB monitor values. - img.photometric = Photometric.MinIsBlack; // little white lie - img.bitspersample = 8; - break; - - case Photometric.LogLUV: - if (compress != Compression.SGILOG && compress != Compression.SGILOG24) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, LogLuv data must have {0}={1} or {2}", "Compression", Compression.SGILOG, Compression.SGILOG24); - return null; - } - - if (planarconfig != PlanarConfig.Contig) - { - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle LogLuv images with {0}={1}", "Planarconfiguration", planarconfig); - return null; - } - - tif.SetField(TiffTag.SGILOGDATAFMT, 3); // 8-bit RGB monitor values. - img.photometric = Photometric.RGB; // little white lie - img.bitspersample = 8; - break; - - case Photometric.CIELAB: - break; - - default: - errorMsg = string.Format(CultureInfo.InvariantCulture, - "Sorry, can not handle image with {0}={1}", photoTag, img.photometric); - return null; - } - - img.Map = null; - img.BWmap = null; - img.PALmap = null; - img.ycbcr = null; - img.cielab = null; - - result = tif.GetField(TiffTag.ImageWidth); - img.width = result[0].ToInt(); - - result = tif.GetField(TiffTag.ImageLength); - img.height = result[0].ToInt(); - - result = tif.GetFieldDefaulted(TiffTag.Orientation); - img.orientation = (Orientation)result[0].ToByte(); - - img.isContig = !(planarconfig == PlanarConfig.Separate && colorchannels > 1); - if (img.isContig) - { - if (!img.pickContigCase()) - { - errorMsg = "Sorry, can not handle image"; - return null; - } - } - else - { - if (!img.pickSeparateCase()) - { - errorMsg = "Sorry, can not handle image"; - return null; - } - } - - return img; - } - - /// - /// Gets a value indicating whether image data has contiguous (packed) or separated samples. - /// - /// true if this image data has contiguous (packed) samples; otherwise, - /// false. - public bool IsContig - { - get - { - return isContig; - } - } - - /// - /// Gets the type of alpha data present. - /// - /// The type of alpha data present. - public ExtraSample Alpha - { - get - { - return alpha; - } - } - - /// - /// Gets the image width. - /// - /// The image width. - public int Width - { - get - { - return width; - } - } - - /// - /// Gets the image height. - /// - /// The image height. - public int Height - { - get - { - return height; - } - } - - /// - /// Gets the image bits per sample count. - /// - /// The image bits per sample count. - public short BitsPerSample - { - get - { - return bitspersample; - } - } - - /// - /// Gets the image samples per pixel count. - /// - /// The image samples per pixel count. - public short SamplesPerPixel - { - get - { - return samplesperpixel; - } - } - - /// - /// Gets the image orientation. - /// - /// The image orientation. - public Orientation Orientation - { - get - { - return orientation; - } - } - - /// - /// Gets or sets the requested orientation. - /// - /// The requested orientation. - /// The method uses this value when placing converted - /// image data into raster buffer. - public Orientation ReqOrientation - { - get - { - return req_orientation; - } - set - { - req_orientation = value; - } - } - - /// - /// Gets the photometric interpretation of the image data. - /// - /// The photometric interpretation of the image data. - public Photometric Photometric - { - get - { - return photometric; - } - } - - /// - /// Gets or sets the "get" method (the method that is called to produce RGBA raster). - /// - /// The "get" method. - public GetDelegate Get - { - get - { - return get; - } - set - { - get = value; - } - } - - /// - /// Gets or sets the "put" method (the method that is called to pack pixel data in the - /// raster) used when converting contiguously packed samples. - /// - /// The "put" method used when converting contiguously packed samples. - public PutContigDelegate PutContig - { - get - { - return putContig; - } - set - { - putContig = value; - } - } - - /// - /// Gets or sets the "put" method (the method that is called to pack pixel data in the - /// raster) used when converting separated samples. - /// - /// The "put" method used when converting separated samples. - public PutSeparateDelegate PutSeparate - { - get - { - return putSeparate; - } - set - { - putSeparate = value; - } - } - - /// - /// Reads the underlaying TIFF image and decodes it into RGBA format raster. - /// - /// The raster (the buffer to place decoded image data to). - /// The zero-based byte offset in at which - /// to begin storing decoded bytes. - /// The raster width. - /// The raster height. - /// true if the image was successfully read and decoded; otherwise, - /// false. - /// - /// GetRaster reads image into memory using current "get" () method, - /// storing the result in the user supplied RGBA using one of - /// the "put" ( or ) methods. The raster - /// is assumed to be an array of times - /// 32-bit entries, where must be less than or equal to the width - /// of the image ( may be any non-zero size). If the raster - /// dimensions are smaller than the image, the image data is cropped to the raster bounds. - /// If the raster height is greater than that of the image, then the image data placement - /// depends on the value of property. Note that the raster is - /// assumed to be organized such that the pixel at location (x, y) is - /// [y * width + x]; with the raster origin specified by the - /// value of property. - /// - /// Raster pixels are 8-bit packed red, green, blue, alpha samples. The - /// , , , and - /// should be used to access individual samples. Images without - /// Associated Alpha matting information have a constant Alpha of 1.0 (255). - /// - /// GetRaster converts non-8-bit images by scaling sample values. Palette, - /// grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. - /// Raster pixels are returned uncorrected by any colorimetry information present in - /// the directory. - /// - /// Samples must be either 1, 2, 4, 8, or 16 bits. Colorimetric samples/pixel must be - /// either 1, 3, or 4 (i.e. SamplesPerPixel minus ExtraSamples). - /// - /// Palette image colormaps that appear to be incorrectly written as 8-bit values are - /// automatically scaled to 16-bits. - /// - /// All error messages are directed to the current error handler. - /// - public bool GetRaster(int[] raster, int offset, int width, int height) - { - if (get == null) - { - Tiff.ErrorExt(tif, tif.m_clientdata, tif.FileName(), "No \"get\" method setup"); - return false; - } - - return get(this, raster, offset, width, height); - } - - private static int PACK(int r, int g, int b) - { - return (r | (g << 8) | (b << 16) | A1); - } - - private static int PACK4(int r, int g, int b, int a) - { - return (r | (g << 8) | (b << 16) | (a << 24)); - } - - private static int W2B(short v) - { - return ((v >> 8) & 0xff); - } - - private static int PACKW(short r, short g, short b) - { - return (W2B(r) | (W2B(g) << 8) | (W2B(b) << 16) | (int)A1); - } - - private static int PACKW4(short r, short g, short b, short a) - { - return (W2B(r) | (W2B(g) << 8) | (W2B(b) << 16) | (W2B(a) << 24)); - } - - /// - /// Palette images with <= 8 bits/sample are handled with a table to avoid lots of shifts - /// and masks. The table is setup so that put*cmaptile (below) can retrieve 8 / bitspersample - /// pixel values simply by indexing into the table with one number. - /// - private void CMAP(int x, int i, ref int j) - { - PALmap[i][j++] = PACK(redcmap[x] & 0xff, greencmap[x] & 0xff, bluecmap[x] & 0xff); - } - - /// - /// Greyscale images with less than 8 bits/sample are handled with a table to avoid lots - /// of shifts and masks. The table is setup so that put*bwtile (below) can retrieve - /// 8 / bitspersample pixel values simply by indexing into the table with one number. - /// - private void GREY(int x, int i, ref int j) - { - int c = Map[x]; - BWmap[i][j++] = PACK(c, c, c); - } - - /// - /// Get an tile-organized image that has - /// PlanarConfiguration contiguous if SamplesPerPixel > 1 - /// or - /// SamplesPerPixel == 1 - /// - private static bool gtTileContig(TiffRgbaImage img, int[] raster, int offset, int width, int height) - { - byte[] buf = new byte[img.tif.TileSize()]; - - FieldValue[] result = img.tif.GetField(TiffTag.TileWidth); - int tileWidth = result[0].ToInt(); - - result = img.tif.GetField(TiffTag.TileLength); - int tileHeight = result[0].ToInt(); - - int flip = img.setorientation(); - int y; - int rasterShift; - if ((flip & FLIP_VERTICALLY) != 0) - { - y = height - 1; - rasterShift = -(tileWidth + width); - } - else - { - y = 0; - rasterShift = -(tileWidth - width); - } - - bool ret = true; - for (int row = 0; row < height; ) - { - int rowstoread = tileHeight - (row + img.row_offset) % tileHeight; - int nrow = (row + rowstoread > height ? height - row : rowstoread); - for (int col = 0; col < width; col += tileWidth) - { - if (img.tif.ReadTile(buf, 0, col + img.col_offset, row + img.row_offset, 0, 0) < 0 && img.stoponerr) - { - ret = false; - break; - } - - int pos = ((row + img.row_offset) % tileHeight) * img.tif.TileRowSize(); - - if (col + tileWidth > width) - { - // Tile is clipped horizontally. Calculate visible portion and - // skewing factors. - int npix = width - col; - int bufferShift = tileWidth - npix; - - img.putContig(img, raster, offset + y * width + col, rasterShift + bufferShift, - col, y, npix, nrow, buf, pos, bufferShift); - } - else - { - img.putContig(img, raster, offset + y * width + col, rasterShift, - col, y, tileWidth, nrow, buf, pos, 0); - } - } - - y += ((flip & FLIP_VERTICALLY) != 0 ? -nrow : nrow); - row += nrow; - } - - if ((flip & FLIP_HORIZONTALLY) != 0) - { - for (int line = 0; line < height; line++) - { - int left = offset + line * width; - int right = left + width - 1; - - while (left < right) - { - int temp = raster[left]; - raster[left] = raster[right]; - raster[right] = temp; - left++; - right--; - } - } - } - - return ret; - } - - /// - /// Get an tile-organized image that has - /// SamplesPerPixel > 1 - /// PlanarConfiguration separated - /// We assume that all such images are RGB. - /// - private static bool gtTileSeparate(TiffRgbaImage img, int[] raster, int offset, int width, int height) - { - int tilesize = img.tif.TileSize(); - byte[] buf = new byte[(img.alpha != 0 ? 4 : 3) * tilesize]; - - int p0 = 0; - int p1 = p0 + tilesize; - int p2 = p1 + tilesize; - int pa = (img.alpha != 0 ? (p2 + tilesize) : -1); - - FieldValue[] result = img.tif.GetField(TiffTag.TileWidth); - int tileWidth = result[0].ToInt(); - - result = img.tif.GetField(TiffTag.TileLength); - int tileHeight = result[0].ToInt(); - - int flip = img.setorientation(); - int y; - int rasterShift; - if ((flip & FLIP_VERTICALLY) != 0) - { - y = height - 1; - rasterShift = -(tileWidth + width); - } - else - { - y = 0; - rasterShift = -(tileWidth - width); - } - - bool ret = true; - for (int row = 0; row < height; ) - { - int rowstoread = tileHeight - (row + img.row_offset) % tileHeight; - int nrow = (row + rowstoread > height ? height - row : rowstoread); - for (int col = 0; col < width; col += tileWidth) - { - if (img.tif.ReadTile(buf, p0, col + img.col_offset, row + img.row_offset, 0, 0) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.tif.ReadTile(buf, p1, col + img.col_offset, row + img.row_offset, 0, 1) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.tif.ReadTile(buf, p2, col + img.col_offset, row + img.row_offset, 0, 2) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.alpha != 0) - { - if (img.tif.ReadTile(buf, pa, col + img.col_offset, row + img.row_offset, 0, 3) < 0 && img.stoponerr) - { - ret = false; - break; - } - } - - int pos = ((row + img.row_offset) % tileHeight) * img.tif.TileRowSize(); - - if (col + tileWidth > width) - { - // Tile is clipped horizontally. - // Calculate visible portion and skewing factors. - int npix = width - col; - int bufferShift = tileWidth - npix; - - img.putSeparate(img, raster, offset + y * width + col, rasterShift + bufferShift, - col, y, npix, nrow, - buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, bufferShift); - } - else - { - img.putSeparate(img, raster, offset + y * width + col, rasterShift, - col, y, tileWidth, nrow, - buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, 0); - } - } - - y += ((flip & FLIP_VERTICALLY) != 0 ? -nrow : nrow); - row += nrow; - } - - if ((flip & FLIP_HORIZONTALLY) != 0) - { - for (int line = 0; line < height; line++) - { - int left = offset + line * width; - int right = left + width - 1; - - while (left < right) - { - int temp = raster[left]; - raster[left] = raster[right]; - raster[right] = temp; - left++; - right--; - } - } - } - - return ret; - } - - /// - /// Get a strip-organized image that has - /// PlanarConfiguration contiguous if SamplesPerPixel > 1 - /// or - /// SamplesPerPixel == 1 - /// - private static bool gtStripContig(TiffRgbaImage img, int[] raster, int offset, int width, int height) - { - byte[] buf = new byte[img.tif.StripSize()]; - - int flip = img.setorientation(); - int y; - int rasterShift; - if ((flip & FLIP_VERTICALLY) != 0) - { - y = height - 1; - rasterShift = -(width + width); - } - else - { - y = 0; - rasterShift = -(width - width); - } - - FieldValue[] result = img.tif.GetFieldDefaulted(TiffTag.RowsPerStrip); - int rowsperstrip = result[0].ToInt(); - if (rowsperstrip == -1) - { - // San Chen - // HACK: should be UInt32.MaxValue - rowsperstrip = Int32.MaxValue; - } - - result = img.tif.GetFieldDefaulted(TiffTag.YCBCRSUBSAMPLING); - short subsamplingver = result[1].ToShort(); - - int scanline = img.tif.newScanlineSize(); - int bufferShift = (width < img.width ? img.width - width : 0); - bool ret = true; - - for (int row = 0; row < height; ) - { - int rowstoread = rowsperstrip - (row + img.row_offset) % rowsperstrip; - int nrow = (row + rowstoread > height ? height - row : rowstoread); - int nrowsub = nrow; - if ((nrowsub % subsamplingver) != 0) - nrowsub += subsamplingver - nrowsub % subsamplingver; - - if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(row + img.row_offset, 0), buf, 0, ((row + img.row_offset) % rowsperstrip + nrowsub) * scanline) < 0 && img.stoponerr) - { - ret = false; - break; - } - - int pos = ((row + img.row_offset) % rowsperstrip) * scanline; - img.putContig(img, raster, offset + y * width, rasterShift, 0, y, width, nrow, buf, pos, bufferShift); - y += (flip & FLIP_VERTICALLY) != 0 ? -nrow : nrow; - row += nrow; - } - - if ((flip & FLIP_HORIZONTALLY) != 0) - { - for (int line = 0; line < height; line++) - { - int left = offset + line * width; - int right = left + width - 1; - - while (left < right) - { - int temp = raster[left]; - raster[left] = raster[right]; - raster[right] = temp; - left++; - right--; - } - } - } - - return ret; - } - - /// - /// Get a strip-organized image with - /// SamplesPerPixel > 1 - /// PlanarConfiguration separated - /// We assume that all such images are RGB. - /// - private static bool gtStripSeparate(TiffRgbaImage img, int[] raster, int offset, int width, int height) - { - int stripsize = img.tif.StripSize(); - byte[] buf = new byte[(img.alpha != 0 ? 4 : 3) * stripsize]; - - int p0 = 0; - int p1 = p0 + stripsize; - int p2 = p1 + stripsize; - int pa = p2 + stripsize; - pa = (img.alpha != 0 ? (p2 + stripsize) : -1); - - int flip = img.setorientation(); - int y; - int rasterShift; - if ((flip & FLIP_VERTICALLY) != 0) - { - y = height - 1; - rasterShift = -(width + width); - } - else - { - y = 0; - rasterShift = -(width - width); - } - - FieldValue[] result = img.tif.GetFieldDefaulted(TiffTag.RowsPerStrip); - int rowsperstrip = result[0].ToInt(); - - int scanline = img.tif.ScanlineSize(); - int bufferShift = (width < img.width ? img.width - width : 0); - bool ret = true; - for (int row = 0; row < height; ) - { - int rowstoread = rowsperstrip - (row + img.row_offset) % rowsperstrip; - int nrow = (row + rowstoread > height ? height - row : rowstoread); - int offset_row = row + img.row_offset; - - if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 0), buf, p0, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 1), buf, p1, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 2), buf, p2, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr) - { - ret = false; - break; - } - - if (img.alpha != 0) - { - if ((img.tif.ReadEncodedStrip(img.tif.ComputeStrip(offset_row, 3), buf, pa, ((row + img.row_offset) % rowsperstrip + nrow) * scanline) < 0 && img.stoponerr)) - { - ret = false; - break; - } - } - - int pos = ((row + img.row_offset) % rowsperstrip) * scanline; - - img.putSeparate(img, raster, offset + y * width, rasterShift, - 0, y, width, nrow, - buf, p0 + pos, p1 + pos, p2 + pos, img.alpha != 0 ? (pa + pos) : -1, bufferShift); - - y += (flip & FLIP_VERTICALLY) != 0 ? -nrow : nrow; - row += nrow; - } - - if ((flip & FLIP_HORIZONTALLY) != 0) - { - for (int line = 0; line < height; line++) - { - int left = offset + line * width; - int right = left + width - 1; - - while (left < right) - { - int temp = raster[left]; - raster[left] = raster[right]; - raster[right] = temp; - left++; - right--; - } - } - } - - return ret; - } - - private bool isCCITTCompression() - { - FieldValue[] result = tif.GetField(TiffTag.Compression); - Compression compress = (Compression)result[0].ToInt(); - - return (compress == Compression.CCITTFAX3 || - compress == Compression.CCITTFAX4 || - compress == Compression.CCITTRLE || - compress == Compression.CCITTRLEW); - } - - private int setorientation() - { - switch (orientation) - { - case Orientation.TopLeft: - case Orientation.LeftTop: - if (req_orientation == Orientation.TopRight || req_orientation == Orientation.RightTop) - return FLIP_HORIZONTALLY; - else if (req_orientation == Orientation.BottomRight || req_orientation == Orientation.RightBottom) - return FLIP_HORIZONTALLY | FLIP_VERTICALLY; - else if (req_orientation == Orientation.BottomLeft || req_orientation == Orientation.LeftBottom) - return FLIP_VERTICALLY; - - return 0; - - case Orientation.TopRight: - case Orientation.RightTop: - if (req_orientation == Orientation.TopLeft || req_orientation == Orientation.LeftTop) - return FLIP_HORIZONTALLY; - else if (req_orientation == Orientation.BottomRight || req_orientation == Orientation.RightBottom) - return FLIP_VERTICALLY; - else if (req_orientation == Orientation.BottomLeft || req_orientation == Orientation.LeftBottom) - return FLIP_HORIZONTALLY | FLIP_VERTICALLY; - - return 0; - - case Orientation.BottomRight: - case Orientation.RightBottom: - if (req_orientation == Orientation.TopLeft || req_orientation == Orientation.LeftTop) - return FLIP_HORIZONTALLY | FLIP_VERTICALLY; - else if (req_orientation == Orientation.TopRight || req_orientation == Orientation.RightTop) - return FLIP_VERTICALLY; - else if (req_orientation == Orientation.BottomLeft || req_orientation == Orientation.LeftBottom) - return FLIP_HORIZONTALLY; - - return 0; - - case Orientation.BottomLeft: - case Orientation.LeftBottom: - if (req_orientation == Orientation.TopLeft || req_orientation == Orientation.LeftTop) - return FLIP_VERTICALLY; - else if (req_orientation == Orientation.TopRight || req_orientation == Orientation.RightTop) - return FLIP_HORIZONTALLY | FLIP_VERTICALLY; - else if (req_orientation == Orientation.BottomRight || req_orientation == Orientation.RightBottom) - return FLIP_HORIZONTALLY; - - return 0; - } - - return 0; - } - - /// - /// Select the appropriate conversion routine for packed data. - /// - private bool pickContigCase() - { - get = tif.IsTiled() ? new GetDelegate(gtTileContig) : new GetDelegate(gtStripContig); - putContig = null; - - switch (photometric) - { - case Photometric.RGB: - switch (bitspersample) - { - case 8: - if (alpha == ExtraSample.AssociatedAlpha) - putContig = putRGBAAcontig8bittile; - else if (alpha == ExtraSample.UnAssociatedAlpha) - putContig = putRGBUAcontig8bittile; - else - putContig = putRGBcontig8bittile; - break; - - case 16: - if (alpha == ExtraSample.AssociatedAlpha) - putContig = putRGBAAcontig16bittile; - else if (alpha == ExtraSample.UnAssociatedAlpha) - putContig = putRGBUAcontig16bittile; - else - putContig = putRGBcontig16bittile; - break; - } - break; - - case Photometric.Separated: - if (buildMap()) - { - if (bitspersample == 8) - { - if (Map == null) - putContig = putRGBcontig8bitCMYKtile; - else - putContig = putRGBcontig8bitCMYKMaptile; - } - } - break; - - case Photometric.Palette: - if (buildMap()) - { - switch (bitspersample) - { - case 8: - putContig = put8bitcmaptile; - break; - case 4: - putContig = put4bitcmaptile; - break; - case 2: - putContig = put2bitcmaptile; - break; - case 1: - putContig = put1bitcmaptile; - break; - } - } - break; - - case Photometric.MinIsWhite: - case Photometric.MinIsBlack: - if (buildMap()) - { - switch (bitspersample) - { - case 16: - putContig = put16bitbwtile; - break; - case 8: - putContig = putgreytile; - break; - case 4: - putContig = put4bitbwtile; - break; - case 2: - putContig = put2bitbwtile; - break; - case 1: - putContig = put1bitbwtile; - break; - } - } - break; - - case Photometric.YCBCR: - if (bitspersample == 8) - { - if (initYCbCrConversion()) - { - // The 6.0 spec says that subsampling must be one of 1, 2, or 4, and - // that vertical subsampling must always be <= horizontal subsampling; - // so there are only a few possibilities and we just enumerate the cases. - // Joris: added support for the [1, 2] case, nonetheless, to accommodate - // some OJPEG files - FieldValue[] result = tif.GetFieldDefaulted(TiffTag.YCBCRSUBSAMPLING); - short SubsamplingHor = result[0].ToShort(); - short SubsamplingVer = result[1].ToShort(); - - switch (((ushort)SubsamplingHor << 4) | (ushort)SubsamplingVer) - { - case 0x44: - putContig = putcontig8bitYCbCr44tile; - break; - case 0x42: - putContig = putcontig8bitYCbCr42tile; - break; - case 0x41: - putContig = putcontig8bitYCbCr41tile; - break; - case 0x22: - putContig = putcontig8bitYCbCr22tile; - break; - case 0x21: - putContig = putcontig8bitYCbCr21tile; - break; - case 0x12: - putContig = putcontig8bitYCbCr12tile; - break; - case 0x11: - putContig = putcontig8bitYCbCr11tile; - break; - } - } - } - break; - - case Photometric.CIELAB: - if (buildMap()) - { - if (bitspersample == 8) - putContig = initCIELabConversion(); - } - break; - } - - return (putContig != null); - } - - /// - /// Select the appropriate conversion routine for unpacked data. - /// NB: we assume that unpacked single channel data is directed to the "packed routines. - /// - private bool pickSeparateCase() - { - get = tif.IsTiled() ? new GetDelegate(gtTileSeparate) : new GetDelegate(gtStripSeparate); - putSeparate = null; - - switch (photometric) - { - case Photometric.RGB: - switch (bitspersample) - { - case 8: - if (alpha == ExtraSample.AssociatedAlpha) - putSeparate = putRGBAAseparate8bittile; - else if (alpha == ExtraSample.UnAssociatedAlpha) - putSeparate = putRGBUAseparate8bittile; - else - putSeparate = putRGBseparate8bittile; - break; - - case 16: - if (alpha == ExtraSample.AssociatedAlpha) - putSeparate = putRGBAAseparate16bittile; - else if (alpha == ExtraSample.UnAssociatedAlpha) - putSeparate = putRGBUAseparate16bittile; - else - putSeparate = putRGBseparate16bittile; - break; - } - break; - - case Photometric.YCBCR: - if ((bitspersample == 8) && (samplesperpixel == 3)) - { - if (initYCbCrConversion()) - { - FieldValue[] result = tif.GetFieldDefaulted(TiffTag.YCBCRSUBSAMPLING); - short hs = result[0].ToShort(); - short vs = result[0].ToShort(); - - switch (((ushort)hs << 4) | (ushort)vs) - { - case 0x11: - putSeparate = putseparate8bitYCbCr11tile; - break; - // TODO: add other cases here - } - } - } - break; - } - - return (putSeparate != null); - } - - private bool initYCbCrConversion() - { - if (ycbcr == null) - ycbcr = new TiffYCbCrToRGB(); - - FieldValue[] result = tif.GetFieldDefaulted(TiffTag.YCBCRCOEFFICIENTS); - float[] luma = result[0].ToFloatArray(); - - result = tif.GetFieldDefaulted(TiffTag.REFERENCEBLACKWHITE); - float[] refBlackWhite = result[0].ToFloatArray(); - - ycbcr.Init(luma, refBlackWhite); - return true; - } - - private PutContigDelegate initCIELabConversion() - { - if (cielab == null) - cielab = new TiffCIELabToRGB(); - - FieldValue[] result = tif.GetFieldDefaulted(TiffTag.WhitePoint); - float[] whitePoint = result[0].ToFloatArray(); - - float[] refWhite = new float[3]; - refWhite[1] = 100.0F; - refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1]; - refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1]) / whitePoint[1] * refWhite[1]; - cielab.Init(display_sRGB, refWhite); - - return putcontig8bitCIELab; - } - - /// - /// Construct any mapping table used by the associated put method. - /// - private bool buildMap() - { - switch (photometric) - { - case Photometric.RGB: - case Photometric.YCBCR: - case Photometric.Separated: - if (bitspersample == 8) - break; - if (!setupMap()) - return false; - break; - - case Photometric.MinIsBlack: - case Photometric.MinIsWhite: - if (!setupMap()) - return false; - break; - - case Photometric.Palette: - // Convert 16-bit colormap to 8-bit - // (unless it looks like an old-style 8-bit colormap). - if (checkcmap() == 16) - cvtcmap(); - else - Tiff.WarningExt(tif, tif.m_clientdata, tif.FileName(), "Assuming 8-bit colormap"); - - // Use mapping table and colormap to construct unpacking - // tables for samples < 8 bits. - if (bitspersample <= 8 && !makecmap()) - return false; - break; - } - - return true; - } - - /// - /// Construct a mapping table to convert from the range of the data samples to [0, 255] - - /// for display. This process also handles inverting B&W images when needed. - /// - private bool setupMap() - { - int range = (1 << bitspersample) - 1; - - // treat 16 bit the same as eight bit - if (bitspersample == 16) - range = 255; - - Map = new byte[range + 1]; - - if (photometric == Photometric.MinIsWhite) - { - for (int x = 0; x <= range; x++) - Map[x] = (byte)(((range - x) * 255) / range); - } - else - { - for (int x = 0; x <= range; x++) - Map[x] = (byte)((x * 255) / range); - } - - if (bitspersample <= 16 && (photometric == Photometric.MinIsBlack || photometric == Photometric.MinIsWhite)) - { - // Use photometric mapping table to construct unpacking tables for samples <= 8 bits. - if (!makebwmap()) - return false; - - // no longer need Map - Map = null; - } - - return true; - } - - private int checkcmap() - { - int r = 0; - int g = 0; - int b = 0; - int n = 1 << bitspersample; - while (n-- > 0) - { - if (redcmap[r] >= 256 || greencmap[g] >= 256 || bluecmap[b] >= 256) - return 16; - - r++; - g++; - b++; - } - - return 8; - } - - private void cvtcmap() - { - for (int i = (1 << bitspersample) - 1; i >= 0; i--) - { - redcmap[i] = (short)(redcmap[i] >> 8); - greencmap[i] = (short)(greencmap[i] >> 8); - bluecmap[i] = (short)(bluecmap[i] >> 8); - } - } - - private bool makecmap() - { - int nsamples = 8 / bitspersample; - - PALmap = new int[256][]; - for (int i = 0; i < 256; i++) - PALmap[i] = new int[nsamples]; - - for (int i = 0; i < 256; i++) - { - int j = 0; - switch (bitspersample) - { - case 1: - CMAP(i >> 7, i, ref j); - CMAP((i >> 6) & 1, i, ref j); - CMAP((i >> 5) & 1, i, ref j); - CMAP((i >> 4) & 1, i, ref j); - CMAP((i >> 3) & 1, i, ref j); - CMAP((i >> 2) & 1, i, ref j); - CMAP((i >> 1) & 1, i, ref j); - CMAP(i & 1, i, ref j); - break; - case 2: - CMAP(i >> 6, i, ref j); - CMAP((i >> 4) & 3, i, ref j); - CMAP((i >> 2) & 3, i, ref j); - CMAP(i & 3, i, ref j); - break; - case 4: - CMAP(i >> 4, i, ref j); - CMAP(i & 0xf, i, ref j); - break; - case 8: - CMAP(i, i, ref j); - break; - } - } - - return true; - } - - private bool makebwmap() - { - int nsamples = 8 / bitspersample; - if (nsamples == 0) - nsamples = 1; - - BWmap = new int[256][]; - for (int i = 0; i < 256; i++) - BWmap[i] = new int[nsamples]; - - for (int i = 0; i < 256; i++) - { - int j = 0; - switch (bitspersample) - { - case 1: - GREY(i >> 7, i, ref j); - GREY((i >> 6) & 1, i, ref j); - GREY((i >> 5) & 1, i, ref j); - GREY((i >> 4) & 1, i, ref j); - GREY((i >> 3) & 1, i, ref j); - GREY((i >> 2) & 1, i, ref j); - GREY((i >> 1) & 1, i, ref j); - GREY(i & 1, i, ref j); - break; - case 2: - GREY(i >> 6, i, ref j); - GREY((i >> 4) & 3, i, ref j); - GREY((i >> 2) & 3, i, ref j); - GREY(i & 3, i, ref j); - break; - case 4: - GREY(i >> 4, i, ref j); - GREY(i & 0xf, i, ref j); - break; - case 8: - case 16: - GREY(i, i, ref j); - break; - } - } - - return true; - } - - /// - /// YCbCr -> RGB conversion and packing routines. - /// - private void YCbCrtoRGB(out int dst, int Y, int Cb, int Cr) - { - int r, g, b; - ycbcr.YCbCrtoRGB(Y, Cb, Cr, out r, out g, out b); - dst = PACK(r, g, b); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // The following routines move decoded data returned from the TIFF library into rasters - // filled with packed ABGR pixels - // - // The routines have been created according to the most important cases and optimized. - // pickTileContigCase and pickTileSeparateCase analyze the parameters and select the - // appropriate "put" routine to use. - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Contiguous cases - // - - /// - /// 8-bit palette => colormap/RGB - /// - private static void put8bitcmaptile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] PALmap = img.PALmap; - int samplesperpixel = img.samplesperpixel; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - raster[rasterOffset] = PALmap[buffer[offset]][0]; - rasterOffset++; - offset += samplesperpixel; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 4-bit palette => colormap/RGB - /// - private static void put4bitcmaptile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] PALmap = img.PALmap; - bufferShift /= 2; - - while (height-- > 0) - { - int[] bw = null; - - int _x; - for (_x = width; _x >= 2; _x -= 2) - { - bw = PALmap[buffer[offset]]; - offset++; - for (int rc = 0; rc < 2; rc++) - { - raster[rasterOffset] = bw[rc]; - rasterOffset++; - } - } - - if (_x != 0) - { - bw = PALmap[buffer[offset]]; - offset++; - - raster[rasterOffset] = bw[0]; - rasterOffset++; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 2-bit palette => colormap/RGB - /// - private static void put2bitcmaptile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] PALmap = img.PALmap; - bufferShift /= 4; - - while (height-- > 0) - { - int[] bw = null; - - int _x; - for (_x = width; _x >= 4; _x -= 4) - { - bw = PALmap[buffer[offset]]; - offset++; - for (int rc = 0; rc < 4; rc++) - { - raster[rasterOffset] = bw[rc]; - rasterOffset++; - } - } - - if (_x > 0) - { - bw = PALmap[buffer[offset]]; - offset++; - - if (_x <= 3 && _x > 0) - { - for (int i = 0; i < _x; i++) - { - raster[rasterOffset] = bw[i]; - rasterOffset++; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 1-bit palette => colormap/RGB - /// - private static void put1bitcmaptile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] PALmap = img.PALmap; - bufferShift /= 8; - - while (height-- > 0) - { - int[] bw; - int bwPos = 0; - - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - bw = PALmap[buffer[offset++]]; - bwPos = 0; - - for (int i = 0; i < 8; i++) - raster[rasterOffset++] = bw[bwPos++]; - } - - if (_x > 0) - { - bw = PALmap[buffer[offset++]]; - bwPos = 0; - - if (_x <= 7 && _x > 0) - { - for (int i = 0; i < _x; i++) - raster[rasterOffset++] = bw[bwPos++]; - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit greyscale => colormap/RGB - /// - private static void putgreytile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - int[][] BWmap = img.BWmap; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - raster[rasterOffset] = BWmap[buffer[offset]][0]; - rasterOffset++; - offset += samplesperpixel; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 16-bit greyscale => colormap/RGB - /// - private static void put16bitbwtile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - int[][] BWmap = img.BWmap; - - while (height-- > 0) - { - short[] wp = Tiff.ByteArrayToShorts(buffer, offset, buffer.Length - offset); - int wpPos = 0; - - for (x = width; x-- > 0; ) - { - // use high order byte of 16bit value - raster[rasterOffset] = BWmap[(wp[wpPos] & 0xffff) >> 8][0]; - rasterOffset++; - offset += 2 * samplesperpixel; - wpPos += samplesperpixel; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 1-bit bilevel => colormap/RGB - /// - private static void put1bitbwtile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] BWmap = img.BWmap; - bufferShift /= 8; - - while (height-- > 0) - { - int[] bw = null; - - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - bw = BWmap[buffer[offset]]; - offset++; - - for (int rc = 0; rc < 8; rc++) - { - raster[rasterOffset] = bw[rc]; - rasterOffset++; - } - } - - if (_x > 0) - { - bw = BWmap[buffer[offset]]; - offset++; - - if (_x <= 7 && _x > 0) - { - for (int i = 0; i < _x; i++) - { - raster[rasterOffset] = bw[i]; - rasterOffset++; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 2-bit greyscale => colormap/RGB - /// - private static void put2bitbwtile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] BWmap = img.BWmap; - bufferShift /= 4; - - while (height-- > 0) - { - int[] bw = null; - - int _x; - for (_x = width; _x >= 4; _x -= 4) - { - bw = BWmap[buffer[offset]]; - offset++; - for (int rc = 0; rc < 4; rc++) - { - raster[rasterOffset] = bw[rc]; - rasterOffset++; - } - } - - if (_x > 0) - { - bw = BWmap[buffer[offset]]; - offset++; - - if (_x <= 3 && _x > 0) - { - for (int i = 0; i < _x; i++) - { - raster[rasterOffset] = bw[i]; - rasterOffset++; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 4-bit greyscale => colormap/RGB - /// - private static void put4bitbwtile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int[][] BWmap = img.BWmap; - bufferShift /= 2; - - while (height-- > 0) - { - int[] bw = null; - - int _x; - for (_x = width; _x >= 2; _x -= 2) - { - bw = BWmap[buffer[offset]]; - offset++; - for (int rc = 0; rc < 2; rc++) - { - raster[rasterOffset] = bw[rc]; - rasterOffset++; - } - } - - if (_x != 0) - { - bw = BWmap[buffer[offset]]; - offset++; - - raster[rasterOffset] = bw[0]; - rasterOffset++; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit packed samples, no Map => RGB - /// - private static void putRGBcontig8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - - while (height-- > 0) - { - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - for (int rc = 0; rc < 8; rc++) - { - raster[rasterOffset] = PACK(buffer[offset], buffer[offset + 1], buffer[offset + 2]); - rasterOffset++; - offset += samplesperpixel; - } - } - - if (_x > 0) - { - if (_x <= 7 && _x > 0) - { - for (int i = _x; i > 0; i--) - { - raster[rasterOffset] = PACK(buffer[offset], buffer[offset + 1], buffer[offset + 2]); - rasterOffset++; - offset += samplesperpixel; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit packed samples => RGBA w/ associated alpha (known to have Map == null) - /// - private static void putRGBAAcontig8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - - while (height-- > 0) - { - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - for (int rc = 0; rc < 8; rc++) - { - raster[rasterOffset] = PACK4(buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]); - rasterOffset++; - offset += samplesperpixel; - } - } - - if (_x > 0) - { - if (_x <= 7 && _x > 0) - { - for (int i = _x; i > 0; i--) - { - raster[rasterOffset] = PACK4(buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]); - rasterOffset++; - offset += samplesperpixel; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit packed samples => RGBA w/ unassociated alpha (known to have Map == null) - /// - private static void putRGBUAcontig8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - int a = buffer[offset + 3]; - int r = (buffer[offset] * a + 127) / 255; - int g = (buffer[offset + 1] * a + 127) / 255; - int b = (buffer[offset + 2] * a + 127) / 255; - raster[rasterOffset] = PACK4(r, g, b, a); - rasterOffset++; - offset += samplesperpixel; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 16-bit packed samples => RGB - /// - private static void putRGBcontig16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - - short[] wp = Tiff.ByteArrayToShorts(buffer, offset, buffer.Length); - int wpPos = 0; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - raster[rasterOffset] = PACKW(wp[wpPos], wp[wpPos + 1], wp[wpPos + 2]); - rasterOffset++; - wpPos += samplesperpixel; - } - - rasterOffset += rasterShift; - wpPos += bufferShift; - } - } - - /// - /// 16-bit packed samples => RGBA w/ associated alpha (known to have Map == null) - /// - private static void putRGBAAcontig16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - - short[] wp = Tiff.ByteArrayToShorts(buffer, offset, buffer.Length); - int wpPos = 0; - - bufferShift *= samplesperpixel; - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - raster[rasterOffset] = PACKW4(wp[wpPos], wp[wpPos + 1], wp[wpPos + 2], wp[wpPos + 3]); - rasterOffset++; - wpPos += samplesperpixel; - } - - rasterOffset += rasterShift; - wpPos += bufferShift; - } - } - - /// - /// 16-bit packed samples => RGBA w/ unassociated alpha (known to have Map == null) - /// - private static void putRGBUAcontig16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - - short[] wp = Tiff.ByteArrayToShorts(buffer, offset, buffer.Length); - int wpPos = 0; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - int a = W2B(wp[wpPos + 3]); - int r = (W2B(wp[wpPos]) * a + 127) / 255; - int g = (W2B(wp[wpPos + 1]) * a + 127) / 255; - int b = (W2B(wp[wpPos + 2]) * a + 127) / 255; - raster[rasterOffset] = PACK4(r, g, b, a); - rasterOffset++; - wpPos += samplesperpixel; - } - - rasterOffset += rasterShift; - wpPos += bufferShift; - } - } - - /// - /// 8-bit packed CMYK samples w/o Map => RGB. - /// NB: The conversion of CMYK->RGB is *very* crude. - /// - private static void putRGBcontig8bitCMYKtile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - bufferShift *= samplesperpixel; - - while (height-- > 0) - { - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - for (int rc = 0; rc < 8; rc++) - { - short k = (short)(255 - buffer[offset + 3]); - short r = (short)((k * (255 - buffer[offset])) / 255); - short g = (short)((k * (255 - buffer[offset + 1])) / 255); - short b = (short)((k * (255 - buffer[offset + 2])) / 255); - raster[rasterOffset] = PACK(r, g, b); - rasterOffset++; - offset += samplesperpixel; - } - } - - if (_x > 0) - { - if (_x <= 7 && _x > 0) - { - for (int i = _x; i > 0; i--) - { - short k = (short)(255 - buffer[offset + 3]); - short r = (short)((k * (255 - buffer[offset])) / 255); - short g = (short)((k * (255 - buffer[offset + 1])) / 255); - short b = (short)((k * (255 - buffer[offset + 2])) / 255); - raster[rasterOffset] = PACK(r, g, b); - rasterOffset++; - offset += samplesperpixel; - } - } - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit packed CIE L*a*b 1976 samples => RGB - /// - private static void putcontig8bitCIELab( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - bufferShift *= 3; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - float X, Y, Z; - img.cielab.CIELabToXYZ(buffer[offset], (sbyte)buffer[offset + 1], (sbyte)buffer[offset + 2], out X, out Y, out Z); - - int r, g, b; - img.cielab.XYZToRGB(X, Y, Z, out r, out g, out b); - - raster[rasterOffset] = PACK(r, g, b); - rasterOffset++; - offset += 3; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - } - - /// - /// 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB - /// - private static void putcontig8bitYCbCr22tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - bufferShift = (bufferShift / 2) * 6; - int rasterOffset2 = rasterOffset + width + rasterShift; - - while (height >= 2) - { - x = width; - while (x >= 2) - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 2], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 3], Cb, Cr); - rasterOffset += 2; - rasterOffset2 += 2; - offset += 6; - x -= 2; - } - - if (x == 1) - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 2], Cb, Cr); - rasterOffset++; - rasterOffset2++; - offset += 6; - } - - rasterOffset += rasterShift * 2 + width; - rasterOffset2 += rasterShift * 2 + width; - offset += bufferShift; - height -= 2; - } - - if (height == 1) - { - x = width; - while (x >= 2) - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - rasterOffset += 2; - rasterOffset2 += 2; - offset += 6; - x -= 2; - } - - if (x == 1) - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - } - } - } - - /// - /// 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB - /// - private static void putcontig8bitYCbCr21tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - bufferShift = (bufferShift * 4) / 2; - - do - { - x = width >> 1; - do - { - int Cb = buffer[offset + 2]; - int Cr = buffer[offset + 3]; - - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - - rasterOffset += 2; - offset += 4; - } - while (--x != 0); - - if ((width & 1) != 0) - { - int Cb = buffer[offset + 2]; - int Cr = buffer[offset + 3]; - - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - - rasterOffset += 1; - offset += 4; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - while (--height != 0); - } - - /// - /// 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB - /// - private static void putcontig8bitYCbCr44tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int rasterOffset1 = rasterOffset + width + rasterShift; - int rasterOffset2 = rasterOffset1 + width + rasterShift; - int rasterOffset3 = rasterOffset2 + width + rasterShift; - int incr = 3 * width + 4 * rasterShift; - - // adjust bufferShift - bufferShift = (bufferShift * 18) / 4; - if ((height & 3) == 0 && (width & 3) == 0) - { - for (; height >= 4; height -= 4) - { - x = width >> 2; - do - { - int Cb = buffer[offset + 16]; - int Cr = buffer[offset + 17]; - - img.YCbCrtoRGB(out raster[rasterOffset], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset1 + 0], buffer[offset + 4], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset1 + 1], buffer[offset + 5], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset1 + 2], buffer[offset + 6], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset1 + 3], buffer[offset + 7], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 8], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 9], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 10], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 11], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset3 + 0], buffer[offset + 12], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset3 + 1], buffer[offset + 13], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset3 + 2], buffer[offset + 14], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset3 + 3], buffer[offset + 15], Cb, Cr); - - rasterOffset += 4; - rasterOffset1 += 4; - rasterOffset2 += 4; - rasterOffset3 += 4; - offset += 18; - } - while (--x != 0); - - rasterOffset += incr; - rasterOffset1 += incr; - rasterOffset2 += incr; - rasterOffset3 += incr; - offset += bufferShift; - } - } - else - { - while (height > 0) - { - for (x = width; x > 0; ) - { - int Cb = buffer[offset + 16]; - int Cr = buffer[offset + 17]; - - bool h_goOn = false; - bool x_goOn = false; - - // order of if's is important - if (x < 1 || x > 3) - { - // order of if's is important - h_goOn = false; - if (height < 1 || height > 3) - { - img.YCbCrtoRGB(out raster[rasterOffset3 + 3], buffer[offset + 15], Cb, Cr); - h_goOn = true; - } - - if (height == 3 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 11], Cb, Cr); - h_goOn = true; - } - - if (height == 2 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset1 + 3], buffer[offset + 7], Cb, Cr); - h_goOn = true; - } - - if (height == 1 || h_goOn) - img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr); - - x_goOn = true; - } - - if (x == 3 || x_goOn) - { - // order of if's is important - h_goOn = false; - if (height < 1 || height > 3) - { - img.YCbCrtoRGB(out raster[rasterOffset3 + 2], buffer[offset + 14], Cb, Cr); - h_goOn = true; - } - - if (height == 3 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 10], Cb, Cr); - h_goOn = true; - } - - if (height == 2 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset1 + 2], buffer[offset + 6], Cb, Cr); - h_goOn = true; - } - - if (height == 1 || h_goOn) - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - - x_goOn = true; - } - - if (x == 2 || x_goOn) - { - // order of if's is important - h_goOn = false; - if (height < 1 || height > 3) - { - img.YCbCrtoRGB(out raster[rasterOffset3 + 1], buffer[offset + 13], Cb, Cr); - h_goOn = true; - } - - if (height == 3 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 9], Cb, Cr); - h_goOn = true; - } - - if (height == 2 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset1 + 1], buffer[offset + 5], Cb, Cr); - h_goOn = true; - } - - if (height == 1 || h_goOn) - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - } - - if (x == 1 || x_goOn) - { - // order of if's is important - h_goOn = false; - if (height < 1 || height > 3) - { - img.YCbCrtoRGB(out raster[rasterOffset3 + 0], buffer[offset + 12], Cb, Cr); - h_goOn = true; - } - - if (height == 3 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 8], Cb, Cr); - h_goOn = true; - } - - if (height == 2 || h_goOn) - { - img.YCbCrtoRGB(out raster[rasterOffset1 + 0], buffer[offset + 4], Cb, Cr); - h_goOn = true; - } - - if (height == 1 || h_goOn) - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - } - - if (x < 4) - { - rasterOffset += x; - rasterOffset1 += x; - rasterOffset2 += x; - rasterOffset3 += x; - x = 0; - } - else - { - rasterOffset += 4; - rasterOffset1 += 4; - rasterOffset2 += 4; - rasterOffset3 += 4; - x -= 4; - } - - offset += 18; - } - - if (height <= 4) - break; - - height -= 4; - rasterOffset += incr; - rasterOffset1 += incr; - rasterOffset2 += incr; - rasterOffset3 += incr; - offset += bufferShift; - } - } - } - - /// - /// 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB - /// - private static void putcontig8bitYCbCr42tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int rasterOffset2 = rasterOffset + width + rasterShift; - int incr = 2 * rasterShift + width; - - bufferShift = (bufferShift * 10) / 4; - if ((height & 3) == 0 && (width & 1) == 0) - { - for (; height >= 2; height -= 2) - { - x = width >> 2; - do - { - int Cb = buffer[offset + 8]; - int Cr = buffer[offset + 9]; - - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 4], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 5], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 6], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 7], Cb, Cr); - - rasterOffset += 4; - rasterOffset2 += 4; - offset += 10; - } - while (--x != 0); - - rasterOffset += incr; - rasterOffset2 += incr; - offset += bufferShift; - } - } - else - { - while (height > 0) - { - for (x = width; x > 0; ) - { - int Cb = buffer[offset + 8]; - int Cr = buffer[offset + 9]; - - bool x_goOn = false; - if (x < 1 || x > 3) - { - if (height != 1) - img.YCbCrtoRGB(out raster[rasterOffset2 + 3], buffer[offset + 7], Cb, Cr); - - img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr); - x_goOn = true; - } - - if (x == 3 || x_goOn) - { - if (height != 1) - img.YCbCrtoRGB(out raster[rasterOffset2 + 2], buffer[offset + 6], Cb, Cr); - - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - x_goOn = true; - } - - if (x == 2 || x_goOn) - { - if (height != 1) - img.YCbCrtoRGB(out raster[rasterOffset2 + 1], buffer[offset + 5], Cb, Cr); - - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - x_goOn = true; - } - - if (x == 1 || x_goOn) - { - if (height != 1) - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 4], Cb, Cr); - - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - } - - if (x < 4) - { - rasterOffset += x; - rasterOffset2 += x; - x = 0; - } - else - { - rasterOffset += 4; - rasterOffset2 += 4; - x -= 4; - } - - offset += 10; - } - - if (height <= 2) - break; - - height -= 2; - rasterOffset += incr; - rasterOffset2 += incr; - offset += bufferShift; - } - } - } - - /// - /// 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB - /// - private static void putcontig8bitYCbCr41tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - // XXX adjust bufferShift - do - { - x = width >> 2; - do - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset + 3], buffer[offset + 3], Cb, Cr); - - rasterOffset += 4; - offset += 6; - } - while (--x != 0); - - if ((width & 3) != 0) - { - int Cb = buffer[offset + 4]; - int Cr = buffer[offset + 5]; - - int xx = width & 3; - if (xx == 3) - img.YCbCrtoRGB(out raster[rasterOffset + 2], buffer[offset + 2], Cb, Cr); - - if (xx == 3 || xx == 2) - img.YCbCrtoRGB(out raster[rasterOffset + 1], buffer[offset + 1], Cb, Cr); - - if (xx == 3 || xx == 2 || xx == 1) - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - - rasterOffset += xx; - offset += 6; - } - - rasterOffset += rasterShift; - offset += bufferShift; - } - while (--height != 0); - } - - /// - /// 8-bit packed YCbCr samples w/ no subsampling => RGB - /// - private static void putcontig8bitYCbCr11tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - bufferShift *= 3; - do - { - x = width; // was x = w >> 1; patched 2000/09/25 warmerda@home.com - do - { - int Cb = buffer[offset + 1]; - int Cr = buffer[offset + 2]; - - img.YCbCrtoRGB(out raster[rasterOffset], buffer[offset + 0], Cb, Cr); - rasterOffset++; - offset += 3; - } - while (--x != 0); - - rasterOffset += rasterShift; - offset += bufferShift; - } - while (--height != 0); - } - - /// - /// 8-bit packed YCbCr samples w/ 1,2 subsampling => RGB - /// - private static void putcontig8bitYCbCr12tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - bufferShift = (bufferShift / 2) * 4; - int rasterOffset2 = rasterOffset + width + rasterShift; - - while (height >= 2) - { - x = width; - do - { - int Cb = buffer[offset + 2]; - int Cr = buffer[offset + 3]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - img.YCbCrtoRGB(out raster[rasterOffset2 + 0], buffer[offset + 1], Cb, Cr); - rasterOffset++; - rasterOffset2++; - offset += 4; - } while (--x != 0); - - rasterOffset += rasterShift * 2 + width; - rasterOffset2 += rasterShift * 2 + width; - offset += bufferShift; - height -= 2; - } - - if (height == 1) - { - x = width; - do - { - int Cb = buffer[offset + 2]; - int Cr = buffer[offset + 3]; - img.YCbCrtoRGB(out raster[rasterOffset + 0], buffer[offset + 0], Cb, Cr); - rasterOffset++; - offset += 4; - } while (--x != 0); - } - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Separated cases - // - - /// - /// 8-bit unpacked samples => RGB - /// - private static void putRGBseparate8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - while (height-- > 0) - { - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - for (int rc = 0; rc < 8; rc++) - { - raster[rasterOffset] = PACK(buffer[offset1], buffer[offset2], buffer[offset3]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - } - } - - if (_x > 0) - { - if (_x <= 7 && _x > 0) - { - for (int i = _x; i > 0; i--) - { - raster[rasterOffset] = PACK(buffer[offset1], buffer[offset2], buffer[offset3]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - } - } - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - rasterOffset += rasterShift; - } - } - - /// - /// 8-bit unpacked samples => RGBA w/ associated alpha - /// - private static void putRGBAAseparate8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - while (height-- > 0) - { - int _x; - for (_x = width; _x >= 8; _x -= 8) - { - for (int rc = 0; rc < 8; rc++) - { - raster[rasterOffset] = PACK4(buffer[offset1], buffer[offset2], buffer[offset3], buffer[offset4]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - offset4++; - } - } - - if (_x > 0) - { - if (_x <= 7 && _x > 0) - { - for (int i = _x; i > 0; i--) - { - raster[rasterOffset] = PACK4(buffer[offset1], buffer[offset2], buffer[offset3], buffer[offset4]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - offset4++; - } - } - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - offset4 += bufferShift; - - rasterOffset += rasterShift; - } - } - - /// - /// 8-bit unpacked samples => RGBA w/ unassociated alpha - /// - private static void putRGBUAseparate8bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - int av = buffer[offset4]; - int rv = (buffer[offset1] * av + 127) / 255; - int gv = (buffer[offset2] * av + 127) / 255; - int bv = (buffer[offset3] * av + 127) / 255; - raster[rasterOffset] = PACK4(rv, gv, bv, av); - rasterOffset++; - offset1++; - offset2++; - offset3++; - offset4++; - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - offset4 += bufferShift; - - rasterOffset += rasterShift; - } - } - - /// - /// 16-bit unpacked samples => RGB - /// - private static void putRGBseparate16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - short[] wrgba = Tiff.ByteArrayToShorts(buffer, 0, buffer.Length); - - offset1 /= sizeof(short); - offset2 /= sizeof(short); - offset3 /= sizeof(short); - - while (height-- > 0) - { - for (x = 0; x < width; x++) - { - raster[rasterOffset] = PACKW(wrgba[offset1], wrgba[offset2], wrgba[offset3]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - rasterOffset += rasterShift; - } - } - - /// - /// 16-bit unpacked samples => RGBA w/ associated alpha - /// - private static void putRGBAAseparate16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - short[] wrgba = Tiff.ByteArrayToShorts(buffer, 0, buffer.Length); - - offset1 /= sizeof(short); - offset2 /= sizeof(short); - offset3 /= sizeof(short); - offset4 /= sizeof(short); - - while (height-- > 0) - { - for (x = 0; x < width; x++) - { - raster[rasterOffset] = PACKW4(wrgba[offset1], wrgba[offset2], wrgba[offset3], wrgba[offset4]); - rasterOffset++; - offset1++; - offset2++; - offset3++; - offset4++; - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - offset4 += bufferShift; - - rasterOffset += rasterShift; - } - } - - /// - /// 16-bit unpacked samples => RGBA w/ unassociated alpha - /// - private static void putRGBUAseparate16bittile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - short[] wrgba = Tiff.ByteArrayToShorts(buffer, 0, buffer.Length); - - offset1 /= sizeof(short); - offset2 /= sizeof(short); - offset3 /= sizeof(short); - offset4 /= sizeof(short); - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - int a = W2B(wrgba[offset4]); - int r = (W2B(wrgba[offset1]) * a + 127) / 255; - int g = (W2B(wrgba[offset2]) * a + 127) / 255; - int b = (W2B(wrgba[offset3]) * a + 127) / 255; - raster[rasterOffset] = PACK4(r, g, b, a); - rasterOffset++; - offset1++; - offset2++; - offset3++; - offset4++; - } - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - offset4 += bufferShift; - - rasterOffset += rasterShift; - } - } - - /// - /// 8-bit packed YCbCr samples w/ no subsampling => RGB - /// - private static void putseparate8bitYCbCr11tile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, - byte[] buffer, int offset1, int offset2, int offset3, int offset4, int bufferShift) - { - while (height-- > 0) - { - x = width; - do - { - int r, g, b; - img.ycbcr.YCbCrtoRGB(buffer[offset1], buffer[offset2], buffer[offset3], out r, out g, out b); - - raster[rasterOffset] = PACK(r, g, b); - rasterOffset++; - offset1++; - offset2++; - offset3++; - } while (--x != 0); - - offset1 += bufferShift; - offset2 += bufferShift; - offset3 += bufferShift; - rasterOffset += rasterShift; - } - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Untested methods - // - // This methods are untested (and, probably, should be deleted). - // - // pickContigCase implicitly *excludes* putRGBcontig8bitCMYKMaptile from possible "put" - // methods when it requires images to have Photometric.Separated *and* 8-bit - // samples *and* a Map to use putRGBcontig8bitCMYKMaptile. The problem is: - // no Map is ever built for Photometric.Separated *and* 8-bit samples. - - /// - /// 8-bit packed CMYK samples w/Map => RGB - /// NB: The conversion of CMYK->RGB is *very* crude. - /// - private static void putRGBcontig8bitCMYKMaptile( - TiffRgbaImage img, int[] raster, int rasterOffset, int rasterShift, - int x, int y, int width, int height, byte[] buffer, int offset, int bufferShift) - { - int samplesperpixel = img.samplesperpixel; - byte[] Map = img.Map; - bufferShift *= samplesperpixel; - - while (height-- > 0) - { - for (x = width; x-- > 0; ) - { - short k = (short)(255 - buffer[offset + 3]); - short r = (short)((k * (255 - buffer[offset])) / 255); - short g = (short)((k * (255 - buffer[offset + 1])) / 255); - short b = (short)((k * (255 - buffer[offset + 2])) / 255); - raster[rasterOffset] = PACK(Map[r], Map[g], Map[b]); - rasterOffset++; - offset += samplesperpixel; - } - - offset += bufferShift; - rasterOffset += rasterShift; - } - } - } - #endregion - - #region Enums - - #region BitOrder - /// - /// Data order within a byte.
- /// Possible values for .FillOrder tag. - ///
- public enum BitOrder - { - /// - /// Most significant -> least. - /// - BigEndian = 1, - /// - /// Least significant -> most. - /// - LittleEndian = 2, - } - #endregion - - #region CleanFaxData - /// - /// Regenerated line info.
- /// Possible values for .CleanFaxData tag. - ///
- public enum CleanFaxData - { - /// - /// No errors detected. - /// - Clean = 0, - /// - /// Receiver regenerated lines. - /// - Regenerated = 1, - /// - /// Uncorrected errors exist. - /// - UnClean = 2, - } - #endregion - - #region CurveAccuracy - /// - /// Color curve accuracy.
- /// Possible values for .ColorResponseUnit tag. - ///
- public enum CurveAccuracy - { - /// - /// Tenths of a unit. - /// - Tenths = 1, - /// - /// Hundredths of a unit. - /// - Hundredths = 2, - /// - /// Thousandths of a unit. - /// - Thousandths = 3, - /// - /// Ten-thousandths of a unit. - /// - TenThousandths = 4, - /// - /// Hundred-thousandths. - /// - HundredThousandths = 5, - } - #endregion - - #region Compression - /// - /// Compression scheme.
- /// Possible values for .Compression tag. - ///
- public enum Compression - { - /// - /// Dump mode. - /// - None = 1, - /// - /// CCITT modified Huffman RLE. - /// - CCITTRLE = 2, - /// - /// CCITT Group 3 fax encoding. - /// - CCITTFAX3 = 3, - /// - /// CCITT T.4 (TIFF 6 name for CCITT Group 3 fax encoding). - /// - CCITT_T4 = 3, - /// - /// CCITT Group 4 fax encoding. - /// - CCITTFAX4 = 4, - /// - /// CCITT T.6 (TIFF 6 name for CCITT Group 4 fax encoding). - /// - CCITT_T6 = 4, - /// - /// Lempel-Ziv & Welch. - /// - LZW = 5, - /// - /// Original JPEG / Old-style JPEG (6.0). - /// - OJPEG = 6, - /// - /// JPEG DCT compression. Introduced post TIFF rev 6.0. - /// - JPEG = 7, - /// - /// NeXT 2-bit RLE. - /// - NeXT = 32766, - /// - /// CCITT RLE. - /// - CCITTRLEW = 32771, - /// - /// Macintosh RLE. - /// - PackBits = 32773, - /// - /// ThunderScan RLE. - /// - ThunderScan = 32809, - /// - /// IT8 CT w/padding. Reserved for ANSI IT8 TIFF/IT. - /// - IT8CTPAD = 32895, - /// - /// IT8 Linework RLE. Reserved for ANSI IT8 TIFF/IT. - /// - IT8LW = 32896, - /// - /// IT8 Monochrome picture. Reserved for ANSI IT8 TIFF/IT. - /// - IT8MP = 32897, - /// - /// IT8 Binary line art. Reserved for ANSI IT8 TIFF/IT. - /// - IT8BL = 32898, - /// - /// Pixar commanded 10bit LZW. Reserved for Pixar. - /// - PixarFilm = 32908, - /// - /// Pixar commanded 11bit ZIP. Reserved for Pixar. - /// - PixarLog = 32909, - /// - /// Deflate compression. - /// - Deflate = 32946, - /// - /// Deflate compression, as recognized by Adobe. - /// - AdobeDeflate = 8, - /// - /// Kodak DCS encoding. - /// Reserved for Oceana Matrix (dev@oceana.com). - /// - DCS = 32947, - /// - /// ISO JBIG. - /// - JBIG = 34661, - /// - /// SGI Log Luminance RLE. - /// - SGILOG = 34676, - /// - /// SGI Log 24-bit packed. - /// - SGILOG24 = 34677, - /// - /// Leadtools JPEG2000. - /// - JP2000 = 34712, - } - #endregion - - #region ExtraSample - /// - /// Information about extra samples.
- /// Possible values for .ExtraSamples tag. - ///
- public enum ExtraSample - { - /// - /// Unspecified data. - /// - UnSpecified = 0, - /// - /// Associated alpha data. - /// - AssociatedAlpha = 1, - /// - /// Unassociated alpha data. - /// - UnAssociatedAlpha = 2, - } - #endregion - - #region FaxMode - /// - /// Group 3/4 format control.
- /// Possible values for .FAXMODE tag. - ///
- public enum FaxMode - { - /// - /// Default, include RTC. - /// - Classic = 0x0000, - /// - /// No RTC at end of data. - /// - NoRTC = 0x0001, - /// - /// No EOL code at end of row. - /// - NoEOL = 0x0002, - /// - /// Byte align row. - /// - ByteAlign = 0x0004, - /// - /// Word align row. - /// - WordAlign = 0x0008, - /// - /// TIFF Class F. - /// - ClassF = NoRTC, - } - #endregion - - #region FileType - /// - /// Sub-file data descriptor.
- /// Possible values for .SubFileType tag. - ///
- public enum FileType - { - /// - /// Reduced resolution version. - /// - ReducedResImage = 0x1, - /// - /// One page of many. - /// - Page = 0x2, - /// - /// Transparency mask. - /// - Mask = 0x4 - } - #endregion - - #region Group3Option - /// - /// Options for CCITT Group 3/4 fax encoding.
- /// Possible values for .Group3Options / TiffTag.T4Options and - /// TiffTag.Group4Options / TiffTag.T6Options tags. - ///
- public enum Group3Option - { - /// - /// Unknown (uninitialized). - /// - Unknown = -1, - /// - /// 2-dimensional coding. - /// - Encoding2D = 0x1, - /// - /// Data not compressed. - /// - UnCompressed = 0x2, - /// - /// Fill to byte boundary. - /// - FillBits = 0x4, - } - #endregion - - #region InkSet - /// - /// Inks in separated image.
- /// Possible values for .InkSet tag. - ///
- public enum InkSet - { - /// - /// Cyan-magenta-yellow-black color. - /// - CMYK = 1, - /// - /// Multi-ink or hi-fi color. - /// - MultiInk = 2, - } - #endregion - - #region JpegColorMode - /// - /// Auto RGB<=>YCbCr convert.
- /// Possible values for .JPEGCOLORMODE tag. - ///
- public enum JpegColorMode - { - /// - /// No conversion (default). - /// - Raw = 0x0000, - - /// - /// Do auto conversion. - /// - RGB = 0x0001, - } - #endregion - - #region JpegProc - /// - /// JPEG processing algorithm.
- /// Possible values for .JPEGProc tag. - ///
- public enum JpegProc - { - /// - /// Baseline sequential. - /// - Baseline = 1, - - /// - /// Huffman coded lossless. - /// - Lossless = 14, - } - #endregion - - #region JpegTablesMode - /// - /// Jpeg Tables Mode.
- /// Possible values for .JPEGTABLESMODE tag. - ///
- public enum JpegTablesMode - { - /// - /// None. - /// - None = 0, - /// - /// Include quantization tables. - /// - Quant = 0x0001, - /// - /// Include Huffman tables. - /// - Huff = 0x0002, - } - #endregion - - #region Orientation - /// - /// Image orientation.
- /// Possible values for .Orientation tag. - ///
- public enum Orientation - { - /// - /// Row 0 top, Column 0 lhs. - /// - TopLeft = 1, - /// - /// Row 0 top, Column 0 rhs. - /// - TopRight = 2, - /// - /// Row 0 bottom, Column 0 rhs. - /// - BottomRight = 3, - /// - /// Row 0 bottom, Column 0 lhs. - /// - BottomLeft = 4, - /// - /// Row 0 lhs, Column 0 top. - /// - LeftTop = 5, - /// - /// Row 0 rhs, Column 0 top. - /// - RightTop = 6, - /// - /// Row 0 rhs, Column 0 bottom. - /// - RightBottom = 7, - /// - /// Row 0 lhs, Column 0 bottom. - /// - LeftBottom = 8, - } - #endregion - - #region Photometric - /// - /// Photometric interpretation.
- /// Possible values for .Photometric tag. - ///
- public enum Photometric - { - /// - /// Min value is white. - /// - MinIsWhite = 0, - /// - /// Min value is black. - /// - MinIsBlack = 1, - /// - /// RGB color model. - /// - RGB = 2, - /// - /// Color map indexed. - /// - Palette = 3, - /// - /// [obsoleted by TIFF rev. 6.0] Holdout mask. - /// - Mask = 4, - /// - /// Color separations. - /// - Separated = 5, - /// - /// CCIR 601. - /// - YCBCR = 6, - /// - /// 1976 CIE L*a*b*. - /// - CIELAB = 8, - /// - /// ICC L*a*b*. Introduced post TIFF rev 6.0 by Adobe TIFF Technote 4. - /// - ICCLAB = 9, - /// - /// ITU L*a*b*. - /// - ITULAB = 10, - /// - /// CIE Log2(L). - /// - LogL = 32844, - /// - /// CIE Log2(L) (u',v'). - /// - LogLUV = 32845, - } - #endregion - - #region PlanarConfig - /// - /// Storage organization.
- /// Possible values for .PlanarConfig tag. - ///
- public enum PlanarConfig - { - /// - /// Unknown (uninitialized). - /// - Unknown = 0, - /// - /// Single image plane. - /// - Contig = 1, - /// - /// Separate planes of data. - /// - Separate = 2 - } - #endregion - - #region PredictionScheme - /// - /// Prediction scheme w/ LZW.
- /// Possible values for .Predictor tag. - ///
- public enum PredictionScheme - { - /// - /// No prediction scheme used. - /// - None = 1, - /// - /// Horizontal differencing. - /// - Horizontal = 2, - /// - /// Floating point predictor. - /// - FloatingPoint = 3, - } - #endregion - - #region ResolutionUnit - /// - /// Units of resolutions.
- /// Possible values for .ResolutionUnit tag. - ///
- public enum ResolutionUnit - { - /// - /// No meaningful units. - /// - None = 1, - /// - /// English. - /// - Inch = 2, - /// - /// Metric. - /// - Centimeter = 3, - } - #endregion - - #region SampleFormat - /// - /// Data sample format.
- /// Possible values for .SampleFormat tag. - ///
- public enum SampleFormat - { - /// - /// Unsigned integer data - /// - UInt = 1, - /// - /// Signed integer data - /// - Int = 2, - /// - /// IEEE floating point data - /// - IEEEFloat = 3, - /// - /// Un-typed data - /// - UnTyped = 4, - /// - /// Complex signed int - /// - COMPLEXINT = 5, - /// - /// Complex IEEE floating - /// - ComplexIEEEFloat = 6, - } - #endregion - - #region SubFileType - /// - /// Kind of data in subfile.
- /// Possible values for .OSubFileType tag. - ///
- public enum SubFileType - { - /// - /// Full resolution image data. - /// - Image = 1, - /// - /// Reduced size image data. - /// - ReducedSizeImage = 2, - /// - /// One page of many. - /// - Page = 3 - } - #endregion - - #region Threshold - /// - /// Thresholding used on data.
- /// Possible values for .Threshholding tag. - ///
- public enum Threshold - { - /// - /// B&W art scan. - /// - BILevel = 1, - - /// - /// Dithered scan. - /// - HalfTone = 2, - - /// - /// Usually Floyd-Steinberg. - /// - ErrorDiffuse = 3, - } - #endregion - - #region TiffPrintFlags - /// - /// Flags that can be passed to - /// method to control printing of data structures that are potentially very large. - /// - /// More than one flag can be used. Bit-or these flags to enable printing - /// multiple items. - [Flags] - public enum TiffPrintFlags - { - /// - /// no extra info - /// - None = 0x0, - /// - /// strips/tiles info - /// - Strips = 0x1, - /// - /// color/gray response curves - /// - Curves = 0x2, - /// - /// colormap - /// - Colormap = 0x4, - /// - /// JPEG Q matrices - /// - JPEGQTables = 0x100, - /// - /// JPEG AC tables - /// - JPEGACTABLES = 0x200, - /// - /// JPEG DC tables - /// - JPEGDCTables = 0x200, - } - #endregion - - #region TiffTag - /// - /// TIFF tag definitions. - /// - /// - /// Joris Van Damme maintains - /// - /// TIFF Tag Reference, good source of tag information. It's an overview of known TIFF - /// Tags with properties, short description, and other useful information. - /// - public enum TiffTag - { - /// - /// Tag placeholder - /// - Ignore = 0, - - /// - /// Subfile data descriptor. - /// For the list of possible values, see . - /// - SubFileType = 254, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Kind of data in subfile. For the list of possible values, see . - ///
- OSubFileType = 255, - - /// - /// Image width in pixels. - /// - ImageWidth = 256, - - /// - /// Image height in pixels. - /// - ImageLength = 257, - - /// - /// Bits per channel (sample). - /// - BitsPerSample = 258, - - /// - /// Data compression technique. - /// For the list of possible values, see . - /// - Compression = 259, - - /// - /// Photometric interpretation. - /// For the list of possible values, see . - /// - Photometric = 262, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Thresholding used on data. For the list of possible values, see . - ///
- Threshholding = 263, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Dithering matrix width. - ///
- CellWidth = 264, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Dithering matrix height. - ///
- CellLength = 265, - - /// - /// Data order within a byte. - /// For the list of possible values, see . - /// - FillOrder = 266, - - /// - /// Name of document which holds for image. - /// - DocumentName = 269, - - /// - /// Information about image. - /// - ImageDescription = 270, - - /// - /// Scanner manufacturer name. - /// - Manufacturer = 271, - - /// - /// Scanner model name/number. - /// - Model = 272, - - /// - /// Offsets to data strips. - /// - StripOffsets = 273, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Image orientation. For the list of possible values, see . - ///
- Orientation = 274, - - /// - /// Samples per pixel. - /// - SamplesPerPixel = 277, - - /// - /// Rows per strip of data. - /// - RowsPerStrip = 278, - - /// - /// Bytes counts for strips. - /// - StripByteCounts = 279, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Minimum sample value. - ///
- MinSampleValue = 280, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Maximum sample value. - ///
- MaxSampleValue = 281, - - /// - /// Pixels/resolution in x. - /// - XResolution = 282, - - /// - /// Pixels/resolution in y. - /// - YResolution = 283, - - /// - /// Storage organization. - /// For the list of possible values, see . - /// - PlanarConfig = 284, - - /// - /// Page name image is from. - /// - PageName = 285, - - /// - /// X page offset of image lhs. - /// - XPosition = 286, - - /// - /// Y page offset of image lhs. - /// - YPosition = 287, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Byte offset to free block. - ///
- FreeOffsets = 288, - - /// - /// [obsoleted by TIFF rev. 5.0]
- /// Sizes of free blocks. - ///
- FreeByteCounts = 289, - - /// - /// [obsoleted by TIFF rev. 6.0]
- /// Gray scale curve accuracy. - /// For the list of possible values, see . - ///
- GrayResponseUnit = 290, - - /// - /// [obsoleted by TIFF rev. 6.0]
- /// Gray scale response curve. - ///
- GrayResponseCurve = 291, - - /// - /// Options for CCITT Group 3 fax encoding. 32 flag bits. - /// For the list of possible values, see . - /// - Group3Options = 292, - - /// - /// TIFF 6.0 proper name alias for Group3Options. - /// - T4Options = 292, - - /// - /// Options for CCITT Group 4 fax encoding. 32 flag bits. - /// For the list of possible values, see . - /// - Group4Options = 293, - - /// - /// TIFF 6.0 proper name alias for Group4Options. - /// - T6Options = 293, - - /// - /// Units of resolutions. - /// For the list of possible values, see . - /// - ResolutionUnit = 296, - - /// - /// Page numbers of multi-page. - /// - PageNumber = 297, - - /// - /// [obsoleted by TIFF rev. 6.0]
- /// Color curve accuracy. - /// For the list of possible values, see . - ///
- ColorResponseUnit = 300, - - /// - /// Colorimetry info. - /// - TransferFunction = 301, - - /// - /// Name & release. - /// - Software = 305, - - /// - /// Creation date and time. - /// - DateTime = 306, - - /// - /// Creator of image. - /// - Artist = 315, - - /// - /// Machine where created. - /// - HostComputer = 316, - - /// - /// Prediction scheme w/ LZW. - /// For the list of possible values, see . - /// - Predictor = 317, - - /// - /// Image white point. - /// - WhitePoint = 318, - - /// - /// Primary chromaticities. - /// - PrimaryChromaticities = 319, - - /// - /// RGB map for pallette image. - /// - Colormap = 320, - - /// - /// Highlight + shadow info. - /// - HalfToneHints = 321, - - /// - /// Tile width in pixels. - /// - TileWidth = 322, - - /// - /// Tile height in pixels. - /// - TileLength = 323, - - /// - /// Offsets to data tiles. - /// - TileOffsets = 324, - - /// - /// Byte counts for tiles. - /// - TileByteCounts = 325, - - /// - /// Lines with wrong pixel count. - /// - BadFaxLines = 326, - - /// - /// Regenerated line info. - /// For the list of possible values, see . - /// - CleanFaxData = 327, - - /// - /// Max consecutive bad lines. - /// - ConsecutiveBadFaxLines = 328, - - /// - /// Subimage descriptors. - /// - SubImageDescriptor = 330, - - /// - /// Inks in separated image. - /// For the list of possible values, see . - /// - InkSet = 332, - - /// - /// ASCII names of inks. - /// - InkNames = 333, - - /// - /// Number of inks. - /// - NumberOfInks = 334, - - /// - /// 0% and 100% dot codes. - /// - DotRange = 336, - - /// - /// Separation target. - /// - TargetPrinter = 337, - - /// - /// Information about extra samples. - /// For the list of possible values, see . - /// - ExtraSamples = 338, - - /// - /// Data sample format. - /// For the list of possible values, see . - /// - SampleFormat = 339, - - /// - /// Variable MinSampleValue. - /// - SMinSampleValue = 340, - - /// - /// Variable MaxSampleValue. - /// - SMaxSampleValue = 341, - - /// - /// ClipPath. Introduced post TIFF rev 6.0 by Adobe TIFF technote 2. - /// - ClipPath = 343, - - /// - /// XClipPathUnits. Introduced post TIFF rev 6.0 by Adobe TIFF technote 2. - /// - XClipPathUnits = 344, - - /// - /// YClipPathUnits. Introduced post TIFF rev 6.0 by Adobe TIFF technote 2. - /// - YClipPathUnits = 345, - - /// - /// Indexed. Introduced post TIFF rev 6.0 by Adobe TIFF Technote 3. - /// - Indexed = 346, - - /// - /// JPEG table stream. Introduced post TIFF rev 6.0. - /// - JpegTables = 347, - - /// - /// OPI Proxy. Introduced post TIFF rev 6.0 by Adobe TIFF technote. - /// - OPIProxy = 351, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// JPEG processing algorithm. - /// For the list of possible values, see . - ///
- JPEGProc = 512, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// Pointer to SOI marker. - ///
- JPEGIFOffset = 513, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// JFIF stream length - ///
- JPEGIFByteCount = 514, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// Restart interval length. - ///
- JPEGRestartInterval = 515, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// Lossless proc predictor. - ///
- JPEGLosslessPredictors = 517, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// Lossless point transform. - ///
- JPEGPointTransform = 518, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// Q matrice offsets. - ///
- JPEGQTables = 519, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// DCT table offsets. - ///
- JPEGDCTables = 520, - - /// - /// [obsoleted by Technical Note #2 which specifies a revised JPEG-in-TIFF scheme]
- /// AC coefficient offsets. - ///
- JPEGACTABLES = 521, - - /// - /// RGB -> YCbCr transform. - /// - YCBCRCOEFFICIENTS = 529, - - /// - /// YCbCr subsampling factors. - /// - YCBCRSUBSAMPLING = 530, - - /// - /// Subsample positioning. - /// For the list of possible values, see . - /// - YCBCRPOSITIONING = 531, - - /// - /// Colorimetry info. - /// - REFERENCEBLACKWHITE = 532, - - /// - /// XML packet. Introduced post TIFF rev 6.0 by Adobe XMP Specification, January 2004. - /// - XMLPACKET = 700, - - /// - /// OPI ImageID. Introduced post TIFF rev 6.0 by Adobe TIFF technote. - /// - OPIIMAGEID = 32781, - - /// - /// Image reference points. Private tag registered to Island Graphics. - /// - REFPTS = 32953, - - /// - /// Region-xform tack point. Private tag registered to Island Graphics. - /// - REGIONTACKPOINT = 32954, - - /// - /// Warp quadrilateral. Private tag registered to Island Graphics. - /// - REGIONWARPCORNERS = 32955, - - /// - /// Affine transformation matrix. Private tag registered to Island Graphics. - /// - REGIONAFFINE = 32956, - - /// - /// [obsoleted by TIFF rev. 6.0]
- /// Use EXTRASAMPLE tag. Private tag registered to SGI. - ///
- MATTEING = 32995, - - /// - /// [obsoleted by TIFF rev. 6.0]
- /// Use SampleFormat tag. Private tag registered to SGI. - ///
- DATATYPE = 32996, - - /// - /// Z depth of image. Private tag registered to SGI. - /// - IMAGEDEPTH = 32997, - - /// - /// Z depth/data tile. Private tag registered to SGI. - /// - TILEDEPTH = 32998, - - /// - /// Full image size in X. This tag is set when an image has been cropped out of a larger - /// image. It reflect width of the original uncropped image. The XPosition tag can be used - /// to determine the position of the smaller image in the larger one. - /// Private tag registered to Pixar. - /// - PIXAR_IMAGEFULLWIDTH = 33300, - - /// - /// Full image size in Y. This tag is set when an image has been cropped out of a larger - /// image. It reflect height of the original uncropped image. The YPosition can be used - /// to determine the position of the smaller image in the larger one. - /// Private tag registered to Pixar. - /// - PIXAR_IMAGEFULLLENGTH = 33301, - - /// - /// Texture map format. Used to identify special image modes and data used by Pixar's - /// texture formats. Private tag registered to Pixar. - /// - PIXAR_TEXTUREFORMAT = 33302, /* t */ - - /// - /// S&T wrap modes. Used to identify special image modes and data used by Pixar's - /// texture formats. Private tag registered to Pixar. - /// - PIXAR_WRAPMODES = 33303, - - /// - /// Cotan(fov) for env. maps. Used to identify special image modes and data used by - /// Pixar's texture formats. Private tag registered to Pixar. - /// - PIXAR_FOVCOT = 33304, - - /// - /// Used to identify special image modes and data used by Pixar's texture formats. - /// Private tag registered to Pixar. - /// - PIXAR_MATRIX_WORLDTOSCREEN = 33305, - - /// - /// Used to identify special image modes and data used by Pixar's texture formats. - /// Private tag registered to Pixar. - /// - PIXAR_MATRIX_WORLDTOCAMERA = 33306, - - /// - /// Device serial number. Private tag registered to Eastman Kodak. - /// - WRITERSERIALNUMBER = 33405, - - /// - /// Copyright string. This tag is listed in the TIFF rev. 6.0 w/ unknown ownership. - /// - COPYRIGHT = 33432, - - /// - /// IPTC TAG from RichTIFF specifications. - /// - RICHTIFFIPTC = 33723, - - /// - /// Site name. Reserved for ANSI IT8 TIFF/IT. - /// - IT8SITE = 34016, - - /// - /// Color seq. [RGB, CMYK, etc]. Reserved for ANSI IT8 TIFF/IT. - /// - IT8COLORSEQUENCE = 34017, - - /// - /// DDES Header. Reserved for ANSI IT8 TIFF/IT. - /// - IT8HEADER = 34018, - - /// - /// Raster scanline padding. Reserved for ANSI IT8 TIFF/IT. - /// - IT8RASTERPADDING = 34019, - - /// - /// The number of bits in short run. Reserved for ANSI IT8 TIFF/IT. - /// - IT8BITSPERRUNLENGTH = 34020, - - /// - /// The number of bits in long run. Reserved for ANSI IT8 TIFF/IT. - /// - IT8BITSPEREXTENDEDRUNLENGTH = 34021, - - /// - /// LW colortable. Reserved for ANSI IT8 TIFF/IT. - /// - IT8COLORTABLE = 34022, - - /// - /// BP/BL image color switch. Reserved for ANSI IT8 TIFF/IT. - /// - IT8IMAGECOLORINDICATOR = 34023, - - /// - /// BP/BL bg color switch. Reserved for ANSI IT8 TIFF/IT. - /// - IT8BKGCOLORINDICATOR = 34024, - - /// - /// BP/BL image color value. Reserved for ANSI IT8 TIFF/IT. - /// - IT8IMAGECOLORVALUE = 34025, - - /// - /// BP/BL bg color value. Reserved for ANSI IT8 TIFF/IT. - /// - IT8BKGCOLORVALUE = 34026, - - /// - /// MP pixel intensity value. Reserved for ANSI IT8 TIFF/IT. - /// - IT8PIXELINTENSITYRANGE = 34027, - - /// - /// HC transparency switch. Reserved for ANSI IT8 TIFF/IT. - /// - IT8TRANSPARENCYINDICATOR = 34028, - - /// - /// Color characterization table. Reserved for ANSI IT8 TIFF/IT. - /// - IT8COLORCHARACTERIZATION = 34029, - - /// - /// HC usage indicator. Reserved for ANSI IT8 TIFF/IT. - /// - IT8HCUSAGE = 34030, - - /// - /// Trapping indicator (untrapped = 0, trapped = 1). Reserved for ANSI IT8 TIFF/IT. - /// - IT8TRAPINDICATOR = 34031, - - /// - /// CMYK color equivalents. - /// - IT8CMYKEQUIVALENT = 34032, - - /// - /// Sequence Frame Count. Private tag registered to Texas Instruments. - /// - FRAMECOUNT = 34232, - - /// - /// Private tag registered to Adobe for PhotoShop. - /// - PHOTOSHOP = 34377, - - /// - /// Pointer to EXIF private directory. This tag is documented in EXIF specification. - /// - EXIFIFD = 34665, - - /// - /// ICC profile data. ?? Private tag registered to Adobe. ?? - /// - ICCPROFILE = 34675, - - /// - /// JBIG options. Private tag registered to Pixel Magic. - /// - JBIGOPTIONS = 34750, - - /// - /// Pointer to GPS private directory. This tag is documented in EXIF specification. - /// - GPSIFD = 34853, - - /// - /// Encoded Class 2 ses. params. Private tag registered to SGI. - /// - FAXRECVPARAMS = 34908, - - /// - /// Received SubAddr string. Private tag registered to SGI. - /// - FAXSUBADDRESS = 34909, - - /// - /// Receive time (secs). Private tag registered to SGI. - /// - FAXRECVTIME = 34910, - - /// - /// Encoded fax ses. params, Table 2/T.30. Private tag registered to SGI. - /// - FAXDCS = 34911, - - /// - /// Sample value to Nits. Private tag registered to SGI. - /// - STONITS = 37439, - - /// - /// Private tag registered to FedEx. - /// - FEDEX_EDR = 34929, - - /// - /// Pointer to Interoperability private directory. - /// This tag is documented in EXIF specification. - /// - INTEROPERABILITYIFD = 40965, - - /// - /// DNG version number. Introduced by Adobe DNG specification. - /// - DNGVERSION = 50706, - - /// - /// DNG compatibility version. Introduced by Adobe DNG specification. - /// - DNGBACKWARDVERSION = 50707, - - /// - /// Name for the camera model. Introduced by Adobe DNG specification. - /// - UNIQUECAMERAMODEL = 50708, - - /// - /// Localized camera model name. Introduced by Adobe DNG specification. - /// - LOCALIZEDCAMERAMODEL = 50709, - - /// - /// CFAPattern->LinearRaw space mapping. Introduced by Adobe DNG specification. - /// - CFAPLANECOLOR = 50710, - - /// - /// Spatial layout of the CFA. Introduced by Adobe DNG specification. - /// - CFALAYOUT = 50711, - - /// - /// Lookup table description. Introduced by Adobe DNG specification. - /// - LINEARIZATIONTABLE = 50712, - - /// - /// Repeat pattern size for the BlackLevel tag. Introduced by Adobe DNG specification. - /// - BLACKLEVELREPEATDIM = 50713, - - /// - /// Zero light encoding level. Introduced by Adobe DNG specification. - /// - BLACKLEVEL = 50714, - - /// - /// Zero light encoding level differences (columns). Introduced by Adobe DNG specification. - /// - BLACKLEVELDELTAH = 50715, - - /// - /// Zero light encoding level differences (rows). Introduced by Adobe DNG specification. - /// - BLACKLEVELDELTAV = 50716, - - /// - /// Fully saturated encoding level. Introduced by Adobe DNG specification. - /// - WHITELEVEL = 50717, - - /// - /// Default scale factors. Introduced by Adobe DNG specification. - /// - DEFAULTSCALE = 50718, - - /// - /// Origin of the final image area. Introduced by Adobe DNG specification. - /// - DEFAULTCROPORIGIN = 50719, - - /// - /// Size of the final image area. Introduced by Adobe DNG specification. - /// - DEFAULTCROPSIZE = 50720, - - /// - /// XYZ->reference color space transformation matrix 1. - /// Introduced by Adobe DNG specification. - /// - COLORMATRIX1 = 50721, - - /// - /// XYZ->reference color space transformation matrix 2. - /// Introduced by Adobe DNG specification. - /// - COLORMATRIX2 = 50722, - - /// - /// Calibration matrix 1. Introduced by Adobe DNG specification. - /// - CAMERACALIBRATION1 = 50723, - - /// - /// Calibration matrix 2. Introduced by Adobe DNG specification. - /// - CAMERACALIBRATION2 = 50724, - - /// - /// Dimensionality reduction matrix 1. Introduced by Adobe DNG specification. - /// - REDUCTIONMATRIX1 = 50725, - - /// - /// Dimensionality reduction matrix 2. Introduced by Adobe DNG specification. - /// - REDUCTIONMATRIX2 = 50726, - - /// - /// Gain applied the stored raw values. Introduced by Adobe DNG specification. - /// - ANALOGBALANCE = 50727, - - /// - /// Selected white balance in linear reference space. - /// Introduced by Adobe DNG specification. - /// - ASSHOTNEUTRAL = 50728, - - /// - /// Selected white balance in x-y chromaticity coordinates. - /// Introduced by Adobe DNG specification. - /// - ASSHOTWHITEXY = 50729, - - /// - /// How much to move the zero point. Introduced by Adobe DNG specification. - /// - BASELINEEXPOSURE = 50730, - - /// - /// Relative noise level. Introduced by Adobe DNG specification. - /// - BASELINENOISE = 50731, - - /// - /// Relative amount of sharpening. Introduced by Adobe DNG specification. - /// - BASELINESHARPNESS = 50732, - - /// - /// How closely the values of the green pixels in the blue/green rows - /// track the values of the green pixels in the red/green rows. - /// Introduced by Adobe DNG specification. - /// - BAYERGREENSPLIT = 50733, - - /// - /// Non-linear encoding range. Introduced by Adobe DNG specification. - /// - LINEARRESPONSELIMIT = 50734, - - /// - /// Camera's serial number. Introduced by Adobe DNG specification. - /// - CAMERASERIALNUMBER = 50735, - - /// - /// Information about the lens. - /// - LENSINFO = 50736, - - /// - /// Chroma blur radius. Introduced by Adobe DNG specification. - /// - CHROMABLURRADIUS = 50737, - - /// - /// Relative strength of the camera's anti-alias filter. - /// Introduced by Adobe DNG specification. - /// - ANTIALIASSTRENGTH = 50738, - - /// - /// Used by Adobe Camera Raw. Introduced by Adobe DNG specification. - /// - SHADOWSCALE = 50739, - - /// - /// Manufacturer's private data. Introduced by Adobe DNG specification. - /// - DNGPRIVATEDATA = 50740, - - /// - /// Whether the EXIF MakerNote tag is safe to preserve along with the rest of the EXIF data. - /// Introduced by Adobe DNG specification. - /// - MAKERNOTESAFETY = 50741, - - /// - /// Illuminant 1. Introduced by Adobe DNG specification. - /// - CALIBRATIONILLUMINANT1 = 50778, - - /// - /// Illuminant 2. Introduced by Adobe DNG specification. - /// - CALIBRATIONILLUMINANT2 = 50779, - - /// - /// Best quality multiplier. Introduced by Adobe DNG specification. - /// - BESTQUALITYSCALE = 50780, - - /// - /// Unique identifier for the raw image data. Introduced by Adobe DNG specification. - /// - RAWDATAUNIQUEID = 50781, - - /// - /// File name of the original raw file. Introduced by Adobe DNG specification. - /// - ORIGINALRAWFILENAME = 50827, - - /// - /// Contents of the original raw file. Introduced by Adobe DNG specification. - /// - ORIGINALRAWFILEDATA = 50828, - - /// - /// Active (non-masked) pixels of the sensor. Introduced by Adobe DNG specification. - /// - ACTIVEAREA = 50829, - - /// - /// List of coordinates of fully masked pixels. Introduced by Adobe DNG specification. - /// - MASKEDAREAS = 50830, - - /// - /// Used to map cameras's color space into ICC profile space. - /// Introduced by Adobe DNG specification. - /// - ASSHOTICCPROFILE = 50831, - - /// - /// Used to map cameras's color space into ICC profile space. - /// Introduced by Adobe DNG specification. - /// - ASSHOTPREPROFILEMATRIX = 50832, - - /// - /// Introduced by Adobe DNG specification. - /// - CURRENTICCPROFILE = 50833, - - /// - /// Introduced by Adobe DNG specification. - /// - CURRENTPREPROFILEMATRIX = 50834, - - /// - /// Undefined tag used by Eastman Kodak, hue shift correction data. - /// - DCSHUESHIFTVALUES = 65535, - - /// - /// [pseudo tag. not written to file]
- /// Group 3/4 format control. - /// For the list of possible values, see . - ///
- FAXMODE = 65536, - - /// - /// [pseudo tag. not written to file]
- /// Compression quality level. Quality level is on the IJG 0-100 scale. Default value is 75. - ///
- JPEGQUALITY = 65537, - - /// - /// [pseudo tag. not written to file]
- /// Auto RGB<=>YCbCr convert. - /// For the list of possible values, see . - ///
- JPEGCOLORMODE = 65538, - - /// - /// [pseudo tag. not written to file]
- /// For the list of possible values, see . - /// Default is | . - ///
- JPEGTABLESMODE = 65539, - - /// - /// [pseudo tag. not written to file]
- /// G3/G4 fill function. - ///
- FAXFILLFUNC = 65540, - - /// - /// [pseudo tag. not written to file]
- /// PixarLogCodec I/O data sz. - ///
- PIXARLOGDATAFMT = 65549, - - /// - /// [pseudo tag. not written to file]
- /// Imager mode & filter. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSIMAGERTYPE = 65550, - - /// - /// [pseudo tag. not written to file]
- /// Interpolation mode. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSINTERPMODE = 65551, - - /// - /// [pseudo tag. not written to file]
- /// Color balance values. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSBALANCEARRAY = 65552, - - /// - /// [pseudo tag. not written to file]
- /// Color correction values. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSCORRECTMATRIX = 65553, - - /// - /// [pseudo tag. not written to file]
- /// Gamma value. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSGAMMA = 65554, - - /// - /// [pseudo tag. not written to file]
- /// Toe & shoulder points. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSTOESHOULDERPTS = 65555, - - /// - /// [pseudo tag. not written to file]
- /// Calibration file description. - ///
- DCSCALIBRATIONFD = 65556, - - /// - /// [pseudo tag. not written to file]
- /// Compression quality level. - /// Quality level is on the ZLIB 1-9 scale. Default value is -1. - ///
- ZIPQUALITY = 65557, - - /// - /// [pseudo tag. not written to file]
- /// PixarLog uses same scale. - ///
- PIXARLOGQUALITY = 65558, - - /// - /// [pseudo tag. not written to file]
- /// Area of image to acquire. - /// Allocated to Oceana Matrix (dev@oceana.com). - ///
- DCSCLIPRECTANGLE = 65559, - - /// - /// [pseudo tag. not written to file]
- /// SGILog user data format. - ///
- SGILOGDATAFMT = 65560, - - /// - /// [pseudo tag. not written to file]
- /// SGILog data encoding control. - ///
- SGILOGENCODE = 65561, - - /// - /// Exposure time. - /// - EXIF_EXPOSURETIME = 33434, - - /// - /// F number. - /// - EXIF_FNUMBER = 33437, - - /// - /// Exposure program. - /// - EXIF_EXPOSUREPROGRAM = 34850, - - /// - /// Spectral sensitivity. - /// - EXIF_SPECTRALSENSITIVITY = 34852, - - /// - /// ISO speed rating. - /// - EXIF_ISOSPEEDRATINGS = 34855, - - /// - /// Optoelectric conversion factor. - /// - EXIF_OECF = 34856, - - /// - /// Exif version. - /// - EXIF_EXIFVERSION = 36864, - - /// - /// Date and time of original data generation. - /// - EXIF_DATETIMEORIGINAL = 36867, - - /// - /// Date and time of digital data generation. - /// - EXIF_DATETIMEDIGITIZED = 36868, - - /// - /// Meaning of each component. - /// - EXIF_COMPONENTSCONFIGURATION = 37121, - - /// - /// Image compression mode. - /// - EXIF_COMPRESSEDBITSPERPIXEL = 37122, - - /// - /// Shutter speed. - /// - EXIF_SHUTTERSPEEDVALUE = 37377, - - /// - /// Aperture. - /// - EXIF_APERTUREVALUE = 37378, - - /// - /// Brightness. - /// - EXIF_BRIGHTNESSVALUE = 37379, - - /// - /// Exposure bias. - /// - EXIF_EXPOSUREBIASVALUE = 37380, - - /// - /// Maximum lens aperture. - /// - EXIF_MAXAPERTUREVALUE = 37381, - - /// - /// Subject distance. - /// - EXIF_SUBJECTDISTANCE = 37382, - - /// - /// Metering mode. - /// - EXIF_METERINGMODE = 37383, - - /// - /// Light source. - /// - EXIF_LIGHTSOURCE = 37384, - - /// - /// Flash. - /// - EXIF_FLASH = 37385, - - /// - /// Lens focal length. - /// - EXIF_FOCALLENGTH = 37386, - - /// - /// Subject area. - /// - EXIF_SUBJECTAREA = 37396, - - /// - /// Manufacturer notes. - /// - EXIF_MAKERNOTE = 37500, - - /// - /// User comments. - /// - EXIF_USERCOMMENT = 37510, - - /// - /// DateTime subseconds. - /// - EXIF_SUBSECTIME = 37520, - - /// - /// DateTimeOriginal subseconds. - /// - EXIF_SUBSECTIMEORIGINAL = 37521, - - /// - /// DateTimeDigitized subseconds. - /// - EXIF_SUBSECTIMEDIGITIZED = 37522, - - /// - /// Supported Flashpix version. - /// - EXIF_FLASHPIXVERSION = 40960, - - /// - /// Color space information. - /// - EXIF_COLORSPACE = 40961, - - /// - /// Valid image width. - /// - EXIF_PIXELXDIMENSION = 40962, - - /// - /// Valid image height. - /// - EXIF_PIXELYDIMENSION = 40963, - - /// - /// Related audio file. - /// - EXIF_RELATEDSOUNDFILE = 40964, - - /// - /// Flash energy. - /// - EXIF_FLASHENERGY = 41483, - - /// - /// Spatial frequency response. - /// - EXIF_SPATIALFREQUENCYRESPONSE = 41484, - - /// - /// Focal plane X resolution. - /// - EXIF_FOCALPLANEXRESOLUTION = 41486, - - /// - /// Focal plane Y resolution. - /// - EXIF_FOCALPLANEYRESOLUTION = 41487, - - /// - /// Focal plane resolution unit. - /// - EXIF_FOCALPLANERESOLUTIONUNIT = 41488, - - /// - /// Subject location. - /// - EXIF_SUBJECTLOCATION = 41492, - - /// - /// Exposure index. - /// - EXIF_EXPOSUREINDEX = 41493, - - /// - /// Sensing method. - /// - EXIF_SENSINGMETHOD = 41495, - - /// - /// File source. - /// - EXIF_FILESOURCE = 41728, - - /// - /// Scene type. - /// - EXIF_SCENETYPE = 41729, - - /// - /// CFA pattern. - /// - EXIF_CFAPATTERN = 41730, - - /// - /// Custom image processing. - /// - EXIF_CUSTOMRENDERED = 41985, - - /// - /// Exposure mode. - /// - EXIF_EXPOSUREMODE = 41986, - - /// - /// White balance. - /// - EXIF_WHITEBALANCE = 41987, - - /// - /// Digital zoom ratio. - /// - EXIF_DIGITALZOOMRATIO = 41988, - - /// - /// Focal length in 35 mm film. - /// - EXIF_FOCALLENGTHIN35MMFILM = 41989, - - /// - /// Scene capture type. - /// - EXIF_SCENECAPTURETYPE = 41990, - - /// - /// Gain control. - /// - EXIF_GAINCONTROL = 41991, - - /// - /// Contrast. - /// - EXIF_CONTRAST = 41992, - - /// - /// Saturation. - /// - EXIF_SATURATION = 41993, - - /// - /// Sharpness. - /// - EXIF_SHARPNESS = 41994, - - /// - /// Device settings description. - /// - EXIF_DEVICESETTINGDESCRIPTION = 41995, - - /// - /// Subject distance range. - /// - EXIF_SUBJECTDISTANCERANGE = 41996, - - /// - /// Unique image ID. - /// - EXIF_IMAGEUNIQUEID = 42016, - } - #endregion - - #region TiffType - /// - /// Tag data type. - /// - /// Note: RATIONALs are the ratio of two 32-bit integer values. - public enum TiffType : short - { - /// - /// Placeholder. - /// - NoType = 0, - /// - /// For field descriptor searching. - /// - Any = NoType, - /// - /// 8-bit unsigned integer. - /// - Byte = 1, - /// - /// 8-bit bytes with last byte null. - /// - ASCII = 2, - /// - /// 16-bit unsigned integer. - /// - Short = 3, - /// - /// 32-bit unsigned integer. - /// - Long = 4, - /// - /// 64-bit unsigned fraction. - /// - Rational = 5, - /// - /// 8-bit signed integer. - /// - SByte = 6, - /// - /// 8-bit untyped data. - /// - Undefined = 7, - /// - /// 16-bit signed integer. - /// - SShort = 8, - /// - /// 32-bit signed integer. - /// - SLong = 9, - /// - /// 64-bit signed fraction. - /// - SRational = 10, - /// - /// 32-bit IEEE floating point. - /// - Float = 11, - /// - /// 64-bit IEEE floating point. - /// - Double = 12, - /// - /// 32-bit unsigned integer (offset) - /// - IFD = 13 - } - #endregion - - #region YCbCrPosition - /// - /// Subsample positioning.
- /// Possible values for .YCBCRPOSITIONING tag. - ///
- public enum YCbCrPosition - { - /// - /// As in PostScript Level 2 - /// - Centered = 1, - /// - /// As in CCIR 601-1 - /// - CoSited = 2, - } - #endregion - - #endregion - - #region Internal - - #region CCITTCodec - partial class CCITTCodec : TiffCodec - { - private static int[] m_faxMainTable = - { - 12,7,0, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0, 1,4,0, - 3,1,0, 5,3,1, 3,1,0, - 2,3,0, 3,1,0, 4,3,1, - 3,1,0, 5,6,2, 3,1,0, - 5,3,1, 3,1,0, 2,3,0, - 3,1,0, 4,3,1, 3,1,0, - 1,4,0, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0, 5,7,3, - 3,1,0, 5,3,1, 3,1,0, - 2,3,0, 3,1,0, 4,3,1, - 3,1,0, 1,4,0, 3,1,0, - 5,3,1, 3,1,0, 2,3,0, - 3,1,0, 4,3,1, 3,1,0, - 4,6,2, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0, 1,4,0, - 3,1,0, 5,3,1, 3,1,0, - 2,3,0, 3,1,0, 4,3,1, - 3,1,0, 6,7,0, 3,1,0, - 5,3,1, 3,1,0, 2,3,0, - 3,1,0, 4,3,1, 3,1,0, - 1,4,0, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0, 5,6,2, - 3,1,0, 5,3,1, 3,1,0, - 2,3,0, 3,1,0, 4,3,1, - 3,1,0, 1,4,0, 3,1,0, - 5,3,1, 3,1,0, 2,3,0, - 3,1,0, 4,3,1, 3,1,0, - 4,7,3, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0, 1,4,0, - 3,1,0, 5,3,1, 3,1,0, - 2,3,0, 3,1,0, 4,3,1, - 3,1,0, 4,6,2, 3,1,0, - 5,3,1, 3,1,0, 2,3,0, - 3,1,0, 4,3,1, 3,1,0, - 1,4,0, 3,1,0, 5,3,1, - 3,1,0, 2,3,0, 3,1,0, - 4,3,1, 3,1,0 - }; - - private static int[] m_faxWhiteTable = - { - 12,11,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,11,1792, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,11,1856, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,2112, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,12,2368, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,1984, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,11,1920, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,2240, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,12,2496, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 12,11,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,11,1792, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,11,1856, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,2176, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,12,2432, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,2048, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,11,1920, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1472, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1216, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, 9,9,960, - 7,4,6, 7,8,31, 7,5,8, - 7,8,57, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,7,22, 7,4,3, 7,5,11, - 7,4,5, 7,7,26, 7,5,9, - 9,9,704, 7,4,6, 7,8,37, - 9,5,128, 7,7,25, 7,6,15, - 9,8,320, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 7,7,18, 7,4,5, 7,7,21, - 7,6,17, 9,7,256, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, - 11,12,2304, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,832, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1600, 7,4,5, 7,8,44, - 7,6,17, 9,9,1344, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1088, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 0,0,0, 7,4,3, 7,5,11, - 7,4,5, 7,6,12, 7,5,9, - 9,6,1664, 7,4,6, 7,7,20, - 9,5,128, 7,7,24, 7,6,14, - 7,7,28, 7,4,4, 7,4,2, - 7,4,7, 7,7,23, 7,4,3, - 7,7,27, 7,4,5, 7,8,39, - 7,6,16, 9,8,576, 7,4,6, - 7,7,19, 7,5,8, 7,8,55, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,45, - 7,4,3, 7,5,11, 7,4,5, - 7,8,53, 7,5,9, 9,8,448, - 7,4,6, 7,8,35, 9,5,128, - 7,8,51, 7,6,15, 7,8,63, - 7,4,4, 7,4,2, 7,4,7, - 7,6,13, 7,4,3, 9,9,1536, - 7,4,5, 7,8,43, 7,6,17, - 9,9,1280, 7,4,6, 7,6,1, - 7,5,8, 9,6,192, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,8,29, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,8,33, 9,5,128, 7,8,49, - 7,6,14, 7,8,61, 7,4,4, - 7,4,2, 7,4,7, 7,8,47, - 7,4,3, 7,8,59, 7,4,5, - 7,8,41, 7,6,16, - 9,9,1024, 7,4,6, 7,8,31, - 7,5,8, 7,8,57, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,9,768, 7,4,6, - 7,8,37, 9,5,128, 7,7,25, - 7,6,15, 9,8,320, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 11,12,2560, 7,4,3, - 7,5,11, 7,4,5, 7,6,12, - 7,5,9, 9,6,1664, 7,4,6, - 7,7,20, 9,5,128, 7,7,24, - 7,6,14, 7,7,28, 7,4,4, - 7,4,2, 7,4,7, 7,7,23, - 7,4,3, 7,7,27, 7,4,5, - 7,8,40, 7,6,16, 9,9,896, - 7,4,6, 7,7,19, 7,5,8, - 7,8,56, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7, - 7,8,46, 7,4,3, 7,5,11, - 7,4,5, 7,8,54, 7,5,9, - 9,8,512, 7,4,6, 7,8,36, - 9,5,128, 7,8,52, 7,6,15, - 7,8,0, 7,4,4, 7,4,2, - 7,4,7, 7,6,13, 7,4,3, - 9,9,1728, 7,4,5, 7,8,44, - 7,6,17, 9,9,1408, 7,4,6, - 7,6,1, 7,5,8, 9,6,192, - 9,5,64, 7,5,10, 7,4,4, - 7,4,2, 7,4,7, 7,8,30, - 7,4,3, 7,5,11, 7,4,5, - 7,6,12, 7,5,9, 9,6,1664, - 7,4,6, 7,8,34, 9,5,128, - 7,8,50, 7,6,14, 7,8,62, - 7,4,4, 7,4,2, 7,4,7, - 7,8,48, 7,4,3, 7,8,60, - 7,4,5, 7,8,42, 7,6,16, - 9,9,1152, 7,4,6, 7,8,32, - 7,5,8, 7,8,58, 9,5,64, - 7,5,10, 7,4,4, 7,4,2, - 7,4,7, 7,7,22, 7,4,3, - 7,5,11, 7,4,5, 7,7,26, - 7,5,9, 9,8,640, 7,4,6, - 7,8,38, 9,5,128, 7,7,25, - 7,6,15, 9,8,384, 7,4,4, - 7,4,2, 7,4,7, 7,6,13, - 7,4,3, 7,7,18, 7,4,5, - 7,7,21, 7,6,17, 9,7,256, - 7,4,6, 7,6,1, 7,5,8, - 9,6,192, 9,5,64, 7,5,10, - 7,4,4, 7,4,2, 7,4,7 - }; - - private static int[] m_faxBlackTable = - { - 12,11,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1792, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,11,23, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,20, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,25, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,128, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,56, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,30, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1856, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,57, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,21, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,54, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,52, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,48, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2112, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,44, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,36, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,384, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,28, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,60, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,40, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2368, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,1984, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,50, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,34, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1664, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,26, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,1408, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,32, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1920, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,61, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,42, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1024, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,9,15, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,768, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,62, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 11,12,2240, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,46, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,38, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,512, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,14, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 0,0,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,13, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,19, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,24, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,22, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2496, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 12,11,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1792, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,11,23, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,20, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,25, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,192, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,1280, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,31, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,11,1856, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,58, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,21, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,13,896, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,640, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,49, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2176, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,45, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,37, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,448, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,29, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,1536, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,41, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2432, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2048, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,51, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,35, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,320, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,27, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,59, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,33, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1920, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,256, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,43, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1152, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,9,15, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,55, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,63, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 11,12,2304, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,47, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,39, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,53, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,14, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 0,0,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,13, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,19, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,24, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,22, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2560, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 12,11,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1792, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,11,23, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,20, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,25, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,128, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,56, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,30, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1856, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,57, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,21, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,54, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,52, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,48, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2112, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,44, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,36, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,384, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,28, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,60, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,40, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2368, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,1984, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,50, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,34, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1728, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,26, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,1472, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,32, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1920, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,61, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,42, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1088, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,9,15, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,832, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,62, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 11,12,2240, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,46, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,38, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,13,576, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,14, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 0,0,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,13, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,19, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,24, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,22, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2496, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 12,11,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1792, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,11,23, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,20, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,25, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,192, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,1344, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,31, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,11,1856, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,58, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,21, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,13,960, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,704, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,49, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2176, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,45, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,37, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,448, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,29, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 10,13,1600, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,41, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2432, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,9,15, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,18, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,17, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,12,2048, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,51, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,35, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,12,320, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 0,0,0, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,10, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,13, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,27, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,59, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,33, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 11,11,1920, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 10,12,256, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,43, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, - 10,13,1216, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,11, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,14, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,12, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 0,0,0, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,13, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,9,15, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,55, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,63, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 11,12,2304, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,10, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,12,47, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,12,39, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,12,53, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,9, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,7,11, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,8,14, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,8, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,12, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 0,0,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,8,13, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,19, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,11,24, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,11,22, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 11,12,2560, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,9, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,10, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,10,16, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,6,8, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,10,0, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,5,7, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 10,10,64, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,6,9, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2, - 8,7,11, 8,2,3, 8,3,1, - 8,2,2, 8,4,6, 8,2,3, - 8,3,4, 8,2,2, 8,5,7, - 8,2,3, 8,3,1, 8,2,2, - 8,4,5, 8,2,3, 8,3,4, - 8,2,2, 8,8,14, 8,2,3, - 8,3,1, 8,2,2, 8,4,6, - 8,2,3, 8,3,4, 8,2,2, - 8,6,8, 8,2,3, 8,3,1, - 8,2,2, 8,4,5, 8,2,3, - 8,3,4, 8,2,2, 8,7,12, - 8,2,3, 8,3,1, 8,2,2, - 8,4,6, 8,2,3, 8,3,4, - 8,2,2, 8,5,7, 8,2,3, - 8,3,1, 8,2,2, 8,4,5, - 8,2,3, 8,3,4, 8,2,2 - }; - - /* - * Note that these tables are ordered such that the - * index into the table is known to be either the - * run length, or (run length / 64) + a fixed offset. - * - * NB: The G3CODE_INVALID entries are only used - * during state generation (see mkg3states.c). - */ - private static short[] m_faxWhiteCodes = - { - 8, 0x35, 0, /* 0011 0101 */ - 6, 0x7, 1, /* 0001 11 */ - 4, 0x7, 2, /* 0111 */ - 4, 0x8, 3, /* 1000 */ - 4, 0xB, 4, /* 1011 */ - 4, 0xC, 5, /* 1100 */ - 4, 0xE, 6, /* 1110 */ - 4, 0xF, 7, /* 1111 */ - 5, 0x13, 8, /* 1001 1 */ - 5, 0x14, 9, /* 1010 0 */ - 5, 0x7, 10, /* 0011 1 */ - 5, 0x8, 11, /* 0100 0 */ - 6, 0x8, 12, /* 0010 00 */ - 6, 0x3, 13, /* 0000 11 */ - 6, 0x34, 14, /* 1101 00 */ - 6, 0x35, 15, /* 1101 01 */ - 6, 0x2A, 16, /* 1010 10 */ - 6, 0x2B, 17, /* 1010 11 */ - 7, 0x27, 18, /* 0100 111 */ - 7, 0xC, 19, /* 0001 100 */ - 7, 0x8, 20, /* 0001 000 */ - 7, 0x17, 21, /* 0010 111 */ - 7, 0x3, 22, /* 0000 011 */ - 7, 0x4, 23, /* 0000 100 */ - 7, 0x28, 24, /* 0101 000 */ - 7, 0x2B, 25, /* 0101 011 */ - 7, 0x13, 26, /* 0010 011 */ - 7, 0x24, 27, /* 0100 100 */ - 7, 0x18, 28, /* 0011 000 */ - 8, 0x2, 29, /* 0000 0010 */ - 8, 0x3, 30, /* 0000 0011 */ - 8, 0x1A, 31, /* 0001 1010 */ - 8, 0x1B, 32, /* 0001 1011 */ - 8, 0x12, 33, /* 0001 0010 */ - 8, 0x13, 34, /* 0001 0011 */ - 8, 0x14, 35, /* 0001 0100 */ - 8, 0x15, 36, /* 0001 0101 */ - 8, 0x16, 37, /* 0001 0110 */ - 8, 0x17, 38, /* 0001 0111 */ - 8, 0x28, 39, /* 0010 1000 */ - 8, 0x29, 40, /* 0010 1001 */ - 8, 0x2A, 41, /* 0010 1010 */ - 8, 0x2B, 42, /* 0010 1011 */ - 8, 0x2C, 43, /* 0010 1100 */ - 8, 0x2D, 44, /* 0010 1101 */ - 8, 0x4, 45, /* 0000 0100 */ - 8, 0x5, 46, /* 0000 0101 */ - 8, 0xA, 47, /* 0000 1010 */ - 8, 0xB, 48, /* 0000 1011 */ - 8, 0x52, 49, /* 0101 0010 */ - 8, 0x53, 50, /* 0101 0011 */ - 8, 0x54, 51, /* 0101 0100 */ - 8, 0x55, 52, /* 0101 0101 */ - 8, 0x24, 53, /* 0010 0100 */ - 8, 0x25, 54, /* 0010 0101 */ - 8, 0x58, 55, /* 0101 1000 */ - 8, 0x59, 56, /* 0101 1001 */ - 8, 0x5A, 57, /* 0101 1010 */ - 8, 0x5B, 58, /* 0101 1011 */ - 8, 0x4A, 59, /* 0100 1010 */ - 8, 0x4B, 60, /* 0100 1011 */ - 8, 0x32, 61, /* 0011 0010 */ - 8, 0x33, 62, /* 0011 0011 */ - 8, 0x34, 63, /* 0011 0100 */ - 5, 0x1B, 64, /* 1101 1 */ - 5, 0x12, 128, /* 1001 0 */ - 6, 0x17, 192, /* 0101 11 */ - 7, 0x37, 256, /* 0110 111 */ - 8, 0x36, 320, /* 0011 0110 */ - 8, 0x37, 384, /* 0011 0111 */ - 8, 0x64, 448, /* 0110 0100 */ - 8, 0x65, 512, /* 0110 0101 */ - 8, 0x68, 576, /* 0110 1000 */ - 8, 0x67, 640, /* 0110 0111 */ - 9, 0xCC, 704, /* 0110 0110 0 */ - 9, 0xCD, 768, /* 0110 0110 1 */ - 9, 0xD2, 832, /* 0110 1001 0 */ - 9, 0xD3, 896, /* 0110 1001 1 */ - 9, 0xD4, 960, /* 0110 1010 0 */ - 9, 0xD5, 1024, /* 0110 1010 1 */ - 9, 0xD6, 1088, /* 0110 1011 0 */ - 9, 0xD7, 1152, /* 0110 1011 1 */ - 9, 0xD8, 1216, /* 0110 1100 0 */ - 9, 0xD9, 1280, /* 0110 1100 1 */ - 9, 0xDA, 1344, /* 0110 1101 0 */ - 9, 0xDB, 1408, /* 0110 1101 1 */ - 9, 0x98, 1472, /* 0100 1100 0 */ - 9, 0x99, 1536, /* 0100 1100 1 */ - 9, 0x9A, 1600, /* 0100 1101 0 */ - 6, 0x18, 1664, /* 0110 00 */ - 9, 0x9B, 1728, /* 0100 1101 1 */ - 11, 0x8, 1792, /* 0000 0001 000 */ - 11, 0xC, 1856, /* 0000 0001 100 */ - 11, 0xD, 1920, /* 0000 0001 101 */ - 12, 0x12, 1984, /* 0000 0001 0010 */ - 12, 0x13, 2048, /* 0000 0001 0011 */ - 12, 0x14, 2112, /* 0000 0001 0100 */ - 12, 0x15, 2176, /* 0000 0001 0101 */ - 12, 0x16, 2240, /* 0000 0001 0110 */ - 12, 0x17, 2304, /* 0000 0001 0111 */ - 12, 0x1C, 2368, /* 0000 0001 1100 */ - 12, 0x1D, 2432, /* 0000 0001 1101 */ - 12, 0x1E, 2496, /* 0000 0001 1110 */ - 12, 0x1F, 2560, /* 0000 0001 1111 */ - 12, 0x1, G3CODE_EOL, /* 0000 0000 0001 */ - 9, 0x1, G3CODE_INVALID, /* 0000 0000 1 */ - 10, 0x1, G3CODE_INVALID, /* 0000 0000 01 */ - 11, 0x1, G3CODE_INVALID, /* 0000 0000 001 */ - 12, 0x0, G3CODE_INVALID, /* 0000 0000 0000 */ - }; - - private static short[] m_faxBlackCodes = - { - 10, 0x37, 0, /* 0000 1101 11 */ - 3, 0x2, 1, /* 010 */ - 2, 0x3, 2, /* 11 */ - 2, 0x2, 3, /* 10 */ - 3, 0x3, 4, /* 011 */ - 4, 0x3, 5, /* 0011 */ - 4, 0x2, 6, /* 0010 */ - 5, 0x3, 7, /* 0001 1 */ - 6, 0x5, 8, /* 0001 01 */ - 6, 0x4, 9, /* 0001 00 */ - 7, 0x4, 10, /* 0000 100 */ - 7, 0x5, 11, /* 0000 101 */ - 7, 0x7, 12, /* 0000 111 */ - 8, 0x4, 13, /* 0000 0100 */ - 8, 0x7, 14, /* 0000 0111 */ - 9, 0x18, 15, /* 0000 1100 0 */ - 10, 0x17, 16, /* 0000 0101 11 */ - 10, 0x18, 17, /* 0000 0110 00 */ - 10, 0x8, 18, /* 0000 0010 00 */ - 11, 0x67, 19, /* 0000 1100 111 */ - 11, 0x68, 20, /* 0000 1101 000 */ - 11, 0x6C, 21, /* 0000 1101 100 */ - 11, 0x37, 22, /* 0000 0110 111 */ - 11, 0x28, 23, /* 0000 0101 000 */ - 11, 0x17, 24, /* 0000 0010 111 */ - 11, 0x18, 25, /* 0000 0011 000 */ - 12, 0xCA, 26, /* 0000 1100 1010 */ - 12, 0xCB, 27, /* 0000 1100 1011 */ - 12, 0xCC, 28, /* 0000 1100 1100 */ - 12, 0xCD, 29, /* 0000 1100 1101 */ - 12, 0x68, 30, /* 0000 0110 1000 */ - 12, 0x69, 31, /* 0000 0110 1001 */ - 12, 0x6A, 32, /* 0000 0110 1010 */ - 12, 0x6B, 33, /* 0000 0110 1011 */ - 12, 0xD2, 34, /* 0000 1101 0010 */ - 12, 0xD3, 35, /* 0000 1101 0011 */ - 12, 0xD4, 36, /* 0000 1101 0100 */ - 12, 0xD5, 37, /* 0000 1101 0101 */ - 12, 0xD6, 38, /* 0000 1101 0110 */ - 12, 0xD7, 39, /* 0000 1101 0111 */ - 12, 0x6C, 40, /* 0000 0110 1100 */ - 12, 0x6D, 41, /* 0000 0110 1101 */ - 12, 0xDA, 42, /* 0000 1101 1010 */ - 12, 0xDB, 43, /* 0000 1101 1011 */ - 12, 0x54, 44, /* 0000 0101 0100 */ - 12, 0x55, 45, /* 0000 0101 0101 */ - 12, 0x56, 46, /* 0000 0101 0110 */ - 12, 0x57, 47, /* 0000 0101 0111 */ - 12, 0x64, 48, /* 0000 0110 0100 */ - 12, 0x65, 49, /* 0000 0110 0101 */ - 12, 0x52, 50, /* 0000 0101 0010 */ - 12, 0x53, 51, /* 0000 0101 0011 */ - 12, 0x24, 52, /* 0000 0010 0100 */ - 12, 0x37, 53, /* 0000 0011 0111 */ - 12, 0x38, 54, /* 0000 0011 1000 */ - 12, 0x27, 55, /* 0000 0010 0111 */ - 12, 0x28, 56, /* 0000 0010 1000 */ - 12, 0x58, 57, /* 0000 0101 1000 */ - 12, 0x59, 58, /* 0000 0101 1001 */ - 12, 0x2B, 59, /* 0000 0010 1011 */ - 12, 0x2C, 60, /* 0000 0010 1100 */ - 12, 0x5A, 61, /* 0000 0101 1010 */ - 12, 0x66, 62, /* 0000 0110 0110 */ - 12, 0x67, 63, /* 0000 0110 0111 */ - 10, 0xF, 64, /* 0000 0011 11 */ - 12, 0xC8, 128, /* 0000 1100 1000 */ - 12, 0xC9, 192, /* 0000 1100 1001 */ - 12, 0x5B, 256, /* 0000 0101 1011 */ - 12, 0x33, 320, /* 0000 0011 0011 */ - 12, 0x34, 384, /* 0000 0011 0100 */ - 12, 0x35, 448, /* 0000 0011 0101 */ - 13, 0x6C, 512, /* 0000 0011 0110 0 */ - 13, 0x6D, 576, /* 0000 0011 0110 1 */ - 13, 0x4A, 640, /* 0000 0010 0101 0 */ - 13, 0x4B, 704, /* 0000 0010 0101 1 */ - 13, 0x4C, 768, /* 0000 0010 0110 0 */ - 13, 0x4D, 832, /* 0000 0010 0110 1 */ - 13, 0x72, 896, /* 0000 0011 1001 0 */ - 13, 0x73, 960, /* 0000 0011 1001 1 */ - 13, 0x74, 1024, /* 0000 0011 1010 0 */ - 13, 0x75, 1088, /* 0000 0011 1010 1 */ - 13, 0x76, 1152, /* 0000 0011 1011 0 */ - 13, 0x77, 1216, /* 0000 0011 1011 1 */ - 13, 0x52, 1280, /* 0000 0010 1001 0 */ - 13, 0x53, 1344, /* 0000 0010 1001 1 */ - 13, 0x54, 1408, /* 0000 0010 1010 0 */ - 13, 0x55, 1472, /* 0000 0010 1010 1 */ - 13, 0x5A, 1536, /* 0000 0010 1101 0 */ - 13, 0x5B, 1600, /* 0000 0010 1101 1 */ - 13, 0x64, 1664, /* 0000 0011 0010 0 */ - 13, 0x65, 1728, /* 0000 0011 0010 1 */ - 11, 0x8, 1792, /* 0000 0001 000 */ - 11, 0xC, 1856, /* 0000 0001 100 */ - 11, 0xD, 1920, /* 0000 0001 101 */ - 12, 0x12, 1984, /* 0000 0001 0010 */ - 12, 0x13, 2048, /* 0000 0001 0011 */ - 12, 0x14, 2112, /* 0000 0001 0100 */ - 12, 0x15, 2176, /* 0000 0001 0101 */ - 12, 0x16, 2240, /* 0000 0001 0110 */ - 12, 0x17, 2304, /* 0000 0001 0111 */ - 12, 0x1C, 2368, /* 0000 0001 1100 */ - 12, 0x1D, 2432, /* 0000 0001 1101 */ - 12, 0x1E, 2496, /* 0000 0001 1110 */ - 12, 0x1F, 2560, /* 0000 0001 1111 */ - 12, 0x1, G3CODE_EOL, /* 0000 0000 0001 */ - 9, 0x1, G3CODE_INVALID, /* 0000 0000 1 */ - 10, 0x1, G3CODE_INVALID, /* 0000 0000 01 */ - 11, 0x1, G3CODE_INVALID, /* 0000 0000 001 */ - 12, 0x0, G3CODE_INVALID, /* 0000 0000 0000 */ - }; - - private static tableEntry m_horizcode = new tableEntry(3, 0x1, 0); /* 001 */ - private static tableEntry m_passcode = new tableEntry(4, 0x1, 0); /* 0001 */ - private static tableEntry[] m_vcodes = - { - new tableEntry(7, 0x03, 0), /* 0000 011 */ - new tableEntry(6, 0x03, 0), /* 0000 11 */ - new tableEntry(3, 0x03, 0), /* 011 */ - new tableEntry(1, 0x1, 0), /* 1 */ - new tableEntry(3, 0x2, 0), /* 010 */ - new tableEntry(6, 0x02, 0), /* 0000 10 */ - new tableEntry(7, 0x02, 0) /* 0000 010 */ - }; - - private static int[] m_msbmask = - { - 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff - }; - - private static byte[] m_zeroruns = - { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */ - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */ - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */ - }; - - private static byte[] m_oneruns = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */ - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */ - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */ - 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */ - }; - - static byte[] fillMasks = - { - 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff - }; - - public const int FIELD_BADFAXLINES = (FieldBit.Codec + 0); - public const int FIELD_CLEANFAXDATA = (FieldBit.Codec + 1); - public const int FIELD_BADFAXRUN = (FieldBit.Codec + 2); - public const int FIELD_RECVPARAMS = (FieldBit.Codec + 3); - public const int FIELD_SUBADDRESS = (FieldBit.Codec + 4); - public const int FIELD_RECVTIME = (FieldBit.Codec + 5); - public const int FIELD_FAXDCS = (FieldBit.Codec + 6); - public const int FIELD_OPTIONS = (FieldBit.Codec + 7); - - internal FaxMode m_mode; /* operating mode */ - internal Group3Option m_groupoptions; /* Group 3/4 options tag */ - internal CleanFaxData m_cleanfaxdata; /* CleanFaxData tag */ - internal int m_badfaxlines; /* BadFaxLines tag */ - internal int m_badfaxrun; /* BadFaxRun tag */ - internal int m_recvparams; /* encoded Class 2 session params */ - internal string m_subaddress; /* subaddress string */ - internal int m_recvtime; /* time spent receiving (secs) */ - internal string m_faxdcs; /* Table 2/T.30 encoded session params */ - - /* Decoder state info */ - internal Tiff.FaxFillFunc fill; /* fill routine */ - - private const int EOL_CODE = 0x001; /* EOL code value - 0000 0000 0000 1 */ - - /* finite state machine codes */ - private const byte S_Null = 0; - private const byte S_Pass = 1; - private const byte S_Horiz = 2; - private const byte S_V0 = 3; - private const byte S_VR = 4; - private const byte S_VL = 5; - private const byte S_Ext = 6; - private const byte S_TermW = 7; - private const byte S_TermB = 8; - private const byte S_MakeUpW = 9; - private const byte S_MakeUpB = 10; - private const byte S_MakeUp = 11; - private const byte S_EOL = 12; - - /* status values returned instead of a run length */ - private const short G3CODE_EOL = -1; /* NB: ACT_EOL - ACT_WRUNT */ - private const short G3CODE_INVALID = -2; /* NB: ACT_INVALID - ACT_WRUNT */ - private const short G3CODE_EOF = -3; /* end of input data */ - private const short G3CODE_INCOMP = -4; /* incomplete run code */ - - /* - * CCITT T.4 1D Huffman runlength codes and - * related definitions. Given the small sizes - * of these tables it does not seem - * worthwhile to make code & length 8 bits. - */ - private struct tableEntry - { - public short length; /* bit length of g3 code */ - public short code; /* g3 code */ - public short runlen; /* run length in bits */ - - public tableEntry(short _length, short _code, short _runlen) - { - length = _length; - code = _code; - runlen = _runlen; - } - - public static tableEntry FromArray(short[] array, int entryNumber) - { - int offset = entryNumber * 3; // we have 3 elements in entry - return new tableEntry(array[offset], array[offset + 1], array[offset + 2]); - } - }; - - private struct faxTableEntry - { - public faxTableEntry(byte _State, byte _Width, int _Param) - { - State = _State; - Width = _Width; - Param = _Param; - } - - public static faxTableEntry FromArray(int[] array, int entryNumber) - { - int offset = entryNumber * 3; // we have 3 elements in entry - return new faxTableEntry((byte)array[offset], (byte)array[offset + 1], array[offset + 2]); - } - - /* state table entry */ - public byte State; /* see above */ - public byte Width; /* width of code in bits */ - public int Param; /* unsigned 32-bit run length in bits */ - }; - - private enum Decoder - { - useFax3_1DDecoder, - useFax3_2DDecoder, - useFax4Decoder, - useFax3RLEDecoder - }; - - private enum Fax3Encoder - { - useFax1DEncoder, - useFax2DEncoder - }; - - private static TiffFieldInfo[] m_faxFieldInfo = - { - new TiffFieldInfo(TiffTag.FAXMODE, 0, 0, TiffType.Any, FieldBit.Pseudo, false, false, "FaxMode"), - new TiffFieldInfo(TiffTag.FAXFILLFUNC, 0, 0, TiffType.Any, FieldBit.Pseudo, false, false, "FaxFillFunc"), - new TiffFieldInfo(TiffTag.BadFaxLines, 1, 1, TiffType.Long, FIELD_BADFAXLINES, true, false, "BadFaxLines"), - new TiffFieldInfo(TiffTag.BadFaxLines, 1, 1, TiffType.Short, FIELD_BADFAXLINES, true, false, "BadFaxLines"), - new TiffFieldInfo(TiffTag.CleanFaxData, 1, 1, TiffType.Short, FIELD_CLEANFAXDATA, true, false, "CleanFaxData"), - new TiffFieldInfo(TiffTag.ConsecutiveBadFaxLines, 1, 1, TiffType.Long, FIELD_BADFAXRUN, true, false, "ConsecutiveBadFaxLines"), - new TiffFieldInfo(TiffTag.ConsecutiveBadFaxLines, 1, 1, TiffType.Short, FIELD_BADFAXRUN, true, false, "ConsecutiveBadFaxLines"), - new TiffFieldInfo(TiffTag.FAXRECVPARAMS, 1, 1, TiffType.Long, FIELD_RECVPARAMS, true, false, "FaxRecvParams"), - new TiffFieldInfo(TiffTag.FAXSUBADDRESS, -1, -1, TiffType.ASCII, FIELD_SUBADDRESS, true, false, "FaxSubAddress"), - new TiffFieldInfo(TiffTag.FAXRECVTIME, 1, 1, TiffType.Long, FIELD_RECVTIME, true, false, "FaxRecvTime"), - new TiffFieldInfo(TiffTag.FAXDCS, -1, -1, TiffType.ASCII, FIELD_FAXDCS, true, false, "FaxDcs"), - }; - - private static TiffFieldInfo[] m_fax3FieldInfo = - { - new TiffFieldInfo(TiffTag.Group3Options, 1, 1, TiffType.Long, FIELD_OPTIONS, false, false, "Group3Options"), - }; - - private static TiffFieldInfo[] m_fax4FieldInfo = - { - new TiffFieldInfo(TiffTag.Group4Options, 1, 1, TiffType.Long, FIELD_OPTIONS, false, false, "Group4Options"), - }; - - private TiffTagMethods m_parentTagMethods; - private TiffTagMethods m_tagMethods; - - private int m_rw_mode; /* O_RDONLY for decode, else encode */ - private int m_rowbytes; /* bytes in a decoded scanline */ - private int m_rowpixels; /* pixels in a scanline */ - - /* Decoder state info */ - private Decoder m_decoder; - private byte[] m_bitmap; /* bit reversal table */ - private int m_data; /* current i/o byte/word */ - private int m_bit; /* current i/o bit in byte */ - private int m_EOLcnt; /* count of EOL codes recognized */ - private int[] m_runs; /* b&w runs for current/previous row */ - private int m_refruns; /* runs for reference line (index in m_runs) */ - private int m_curruns; /* runs for current line (index in m_runs) */ - - private int m_a0; /* reference element */ - private int m_RunLength; /* length of current run */ - private int m_thisrun; /* current row's run array (index in m_runs) */ - private int m_pa; /* place to stuff next run (index in m_runs) */ - private int m_pb; /* next run in reference line (index in m_runs) */ - - /* Encoder state info */ - private Fax3Encoder m_encoder; /* encoding state */ - private bool m_encodingFax4; // if false, G3 will be used - private byte[] m_refline; /* reference line for 2d decoding */ - private int m_k; /* #rows left that can be 2d encoded */ - private int m_maxk; /* max #rows that can be 2d encoded */ - private int m_line; - - private byte[] m_buffer; // buffer with data to encode - private int m_offset; // current position in m_buffer - - public CCITTCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - m_tagMethods = new CCITTCodecTagMethods(); - } - - public override bool Init() - { - switch (m_scheme) - { - case Compression.CCITTRLE: - return TIFFInitCCITTRLE(); - case Compression.CCITTRLEW: - return TIFFInitCCITTRLEW(); - case Compression.CCITTFAX3: - return TIFFInitCCITTFax3(); - case Compression.CCITTFAX4: - return TIFFInitCCITTFax4(); - } - - return false; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - public override bool SetupDecode() - { - // same for all types - return setupState(); - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// - /// PreDecode is called after and before decoding. - /// - public override bool PreDecode(short plane) - { - m_bit = 0; // force initial read - m_data = 0; - m_EOLcnt = 0; // force initial scan for EOL - - // Decoder assumes lsb-to-msb bit order. Note that we select this here rather than in - // setupState so that viewers can hold the image open, fiddle with the BitOrder tag - // value, and then re-decode the image. Otherwise they'd need to close and open the - // image to get the state reset. - m_bitmap = Tiff.GetBitRevTable(m_tif.m_dir.td_fillorder != BitOrder.LittleEndian); - if (m_refruns >= 0) - { - // init reference line to white - m_runs[m_refruns] = m_rowpixels; - m_runs[m_refruns + 1] = 0; - } - - m_line = 0; - return true; - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - switch (m_decoder) - { - case Decoder.useFax3_1DDecoder: - return Fax3Decode1D(buffer, offset, count); - case Decoder.useFax3_2DDecoder: - return Fax3Decode2D(buffer, offset, count); - case Decoder.useFax4Decoder: - return Fax4Decode(buffer, offset, count); - case Decoder.useFax3RLEDecoder: - return Fax3DecodeRLE(buffer, offset, count); - } - - return false; - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - return DecodeRow(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - return DecodeRow(buffer, offset, count, plane); - } - - /// - /// Setups the encoder part of the codec. - /// - /// - /// true if this codec successfully setup its encoder part and can encode data; - /// otherwise, false. - /// - /// - /// SetupEncode is called once before - /// . - public override bool SetupEncode() - { - // same for all types - return setupState(); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - m_bit = 8; - m_data = 0; - m_encoder = Fax3Encoder.useFax1DEncoder; - - /* - * This is necessary for Group 4; otherwise it isn't - * needed because the first scanline of each strip ends - * up being copied into the refline. - */ - if (m_refline != null) - Array.Clear(m_refline, 0, m_refline.Length); - - if (is2DEncoding()) - { - float res = m_tif.m_dir.td_yresolution; - /* - * The CCITT spec says that when doing 2d encoding, you - * should only do it on K consecutive scanlines, where K - * depends on the resolution of the image being encoded - * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory - * code initializes td_yresolution to 0, this code will - * select a K of 2 unless the YResolution tag is set - * appropriately. (Note also that we fudge a little here - * and use 150 lpi to avoid problems with units conversion.) - */ - if (m_tif.m_dir.td_resolutionunit == ResolutionUnit.Centimeter) - { - /* convert to inches */ - res *= 2.54f; - } - - m_maxk = (res > 150 ? 4 : 2); - m_k = m_maxk - 1; - } - else - { - m_maxk = 0; - m_k = 0; - } - - m_line = 0; - return true; - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public override bool PostEncode() - { - if (m_encodingFax4) - return Fax4PostEncode(); - - return Fax3PostEncode(); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - if (m_encodingFax4) - return Fax4Encode(buffer, offset, count); - - return Fax3Encode(buffer, offset, count); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - return EncodeRow(buffer, offset, count, plane); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - return EncodeRow(buffer, offset, count, plane); - } - - /// - /// Flushes any internal data buffers and terminates current operation. - /// - public override void Close() - { - if ((m_mode & FaxMode.NoRTC) == 0) - { - int code = EOL_CODE; - int length = 12; - if (is2DEncoding()) - { - bool b = ((code << 1) != 0) | (m_encoder == Fax3Encoder.useFax1DEncoder); - if (b) - code = 1; - else - code = 0; - - length++; - } - - for (int i = 0; i < 6; i++) - putBits(code, length); - - flushBits(); - } - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public override void Cleanup() - { - m_tif.m_tagmethods = m_parentTagMethods; - } - - private bool is2DEncoding() - { - return (m_groupoptions & Group3Option.Encoding2D) != 0; - } - - /* - * Update the value of b1 using the array - * of runs for the reference line. - */ - private void CHECK_b1(ref int b1) - { - if (m_pa != m_thisrun) - { - while (b1 <= m_a0 && b1 < m_rowpixels) - { - b1 += m_runs[m_pb] + m_runs[m_pb + 1]; - m_pb += 2; - } - } - } - - private static void SWAP(ref int a, ref int b) - { - int x = a; - a = b; - b = x; - } - - private static bool isLongAligned(int offset) - { - return (offset % sizeof(int) == 0); - } - - private static bool isShortAligned(int offset) - { - return (offset % sizeof(short) == 0); - } - - /* - * The FILL macro must handle spans < 2*sizeof(int) bytes. - * This is <8 bytes. - */ - private static void FILL(int n, byte[] cp, ref int offset, byte value) - { - const int max = 7; - - if (n <= max && n > 0) - { - for (int i = n; i > 0; i--) - cp[offset + i - 1] = value; - - offset += n; - } - } - - /* - * Bit-fill a row according to the white/black - * runs generated during G3/G4 decoding. - * The default run filler; made public for other decoders. - */ - private static void fax3FillRuns(byte[] buffer, int offset, int[] runs, - int thisRunOffset, int nextRunOffset, int width) - { - if (((nextRunOffset - thisRunOffset) & 1) != 0) - { - runs[nextRunOffset] = 0; - nextRunOffset++; - } - - int x = 0; - for (; thisRunOffset < nextRunOffset; thisRunOffset += 2) - { - int run = runs[thisRunOffset]; - - // should cast 'run' to unsigned in order to discard values bigger than int.MaxValue - // for such value 'run' become negative and following condition is not met - if ((uint)x + (uint)run > (uint)width || (uint)run > (uint)width) - { - runs[thisRunOffset] = width - x; - run = runs[thisRunOffset]; - } - - if (run != 0) - { - int cp = offset + (x >> 3); - int bx = x & 7; - if (run > 8 - bx) - { - if (bx != 0) - { - // align to byte boundary - buffer[cp] &= (byte)(0xff << (8 - bx)); - cp++; - run -= 8 - bx; - } - - int n = run >> 3; - if (n != 0) - { - // multiple bytes to fill - if ((n / sizeof(int)) > 1) - { - // Align to longword boundary and fill. - for (; n != 0 && !isLongAligned(cp); n--) - { - buffer[cp] = 0x00; - cp++; - } - - int bytesToFill = n - (n % sizeof(int)); - n -= bytesToFill; - - int stop = bytesToFill + cp; - for (; cp < stop; cp++) - buffer[cp] = 0; - } - - FILL(n, buffer, ref cp, 0); - run &= 7; - } - - if (run != 0) - buffer[cp] &= (byte)(0xff >> run); - } - else - buffer[cp] &= (byte)(~(fillMasks[run] >> bx)); - - x += runs[thisRunOffset]; - } - - run = runs[thisRunOffset + 1]; - - // should cast 'run' to unsigned in order to discard values bigger than int.MaxValue - // for such value 'run' become negative and following condition is not met - if ((uint)x + (uint)run > (uint)width || (uint)run > (uint)width) - { - runs[thisRunOffset + 1] = width - x; - run = runs[thisRunOffset + 1]; - } - - if (run != 0) - { - int cp = offset + (x >> 3); - int bx = x & 7; - if (run > 8 - bx) - { - if (bx != 0) - { - // align to byte boundary - buffer[cp] |= (byte)(0xff >> bx); - cp++; - run -= 8 - bx; - } - - int n = run >> 3; - if (n != 0) - { - // multiple bytes to fill - if ((n / sizeof(int)) > 1) - { - // Align to longword boundary and fill. - for (; n != 0 && !isLongAligned(cp); n--) - { - buffer[cp] = 0xff; - cp++; - } - - int bytesToFill = n - (n % sizeof(int)); - n -= bytesToFill; - - int stop = bytesToFill + cp; - for (; cp < stop; cp++) - buffer[cp] = 0xff; - } - - FILL(n, buffer, ref cp, 0xff); - run &= 7; - } - - if (run != 0) - buffer[cp] |= (byte)(0xff00 >> run); - } - else - buffer[cp] |= (byte)(fillMasks[run] >> bx); - - x += runs[thisRunOffset + 1]; - } - } - - Debug.Assert(x == width); - } - - /* - * Find a span of ones or zeros using the supplied - * table. The ``base'' of the bit string is supplied - * along with the start+end bit indices. - */ - private static int find0span(byte[] bp, int bpOffset, int bs, int be) - { - int offset = bpOffset + (bs >> 3); - - /* - * Check partial byte on lhs. - */ - int bits = be - bs; - int n = bs & 7; - int span = 0; - if (bits > 0 && n != 0) - { - span = m_zeroruns[(bp[offset] << n) & 0xff]; - - if (span > 8 - n) - { - /* table value too generous */ - span = 8 - n; - } - - if (span > bits) - { - /* constrain span to bit range */ - span = bits; - } - - if (n + span < 8) - { - /* doesn't extend to edge of byte */ - return span; - } - - bits -= span; - offset++; - } - - if (bits >= (2 * 8 * sizeof(int))) - { - /* - * Align to longword boundary and check longwords. - */ - while (!isLongAligned(offset)) - { - if (bp[offset] != 0x00) - return (span + m_zeroruns[bp[offset]]); - - span += 8; - bits -= 8; - offset++; - } - - while (bits >= 8 * sizeof(int)) - { - bool allZeros = true; - for (int i = 0; i < sizeof(int); i++) - { - if (bp[offset + i] != 0) - { - allZeros = false; - break; - } - } - - if (allZeros) - { - span += 8 * sizeof(int); - bits -= 8 * sizeof(int); - offset += sizeof(int); - } - else - { - break; - } - } - } - - /* - * Scan full bytes for all 0's. - */ - while (bits >= 8) - { - if (bp[offset] != 0x00) - { - /* end of run */ - return (span + m_zeroruns[bp[offset]]); - } - - span += 8; - bits -= 8; - offset++; - } - - /* - * Check partial byte on rhs. - */ - if (bits > 0) - { - n = m_zeroruns[bp[offset]]; - span += (n > bits ? bits : n); - } - - return span; - } - - private static int find1span(byte[] bp, int bpOffset, int bs, int be) - { - int offset = bpOffset + (bs >> 3); - - /* - * Check partial byte on lhs. - */ - int n = bs & 7; - int span = 0; - int bits = be - bs; - if (bits > 0 && n != 0) - { - span = m_oneruns[(bp[offset] << n) & 0xff]; - if (span > 8 - n) - { - /* table value too generous */ - span = 8 - n; - } - - if (span > bits) - { - /* constrain span to bit range */ - span = bits; - } - - if (n + span < 8) - { - /* doesn't extend to edge of byte */ - return (span); - } - - bits -= span; - offset++; - } - - if (bits >= (2 * 8 * sizeof(int))) - { - /* - * Align to longword boundary and check longwords. - */ - while (!isLongAligned(offset)) - { - if (bp[offset] != 0xff) - return (span + m_oneruns[bp[offset]]); - - span += 8; - bits -= 8; - offset++; - } - - while (bits >= 8 * sizeof(int)) - { - bool allOnes = true; - for (int i = 0; i < sizeof(int); i++) - { - if (bp[offset + i] != 0xff) - { - allOnes = false; - break; - } - } - - if (allOnes) - { - span += 8 * sizeof(int); - bits -= 8 * sizeof(int); - offset += sizeof(int); - } - else - { - break; - } - } - } - - /* - * Scan full bytes for all 1's. - */ - while (bits >= 8) - { - if (bp[offset] != 0xff) - { - /* end of run */ - return (span + m_oneruns[bp[offset]]); - } - - span += 8; - bits -= 8; - offset++; - } - - /* - * Check partial byte on rhs. - */ - if (bits > 0) - { - n = m_oneruns[bp[offset]]; - span += (n > bits ? bits : n); - } - - return span; - } - - /* - * Return the offset of the next bit in the range - * [bs..be] that is different from the specified - * color. The end, be, is returned if no such bit - * exists. - */ - private static int finddiff(byte[] bp, int bpOffset, int _bs, int _be, int _color) - { - if (_color != 0) - return (_bs + find1span(bp, bpOffset, _bs, _be)); - - return (_bs + find0span(bp, bpOffset, _bs, _be)); - } - - /* - * Like finddiff, but also check the starting bit - * against the end in case start > end. - */ - private static int finddiff2(byte[] bp, int bpOffset, int _bs, int _be, int _color) - { - if (_bs < _be) - return finddiff(bp, bpOffset, _bs, _be, _color); - - return _be; - } - - /* - * Group 3 and Group 4 Decoding. - */ - - /* - * The following macros define the majority of the G3/G4 decoder - * algorithm using the state tables defined elsewhere. To build - * a decoder you need some setup code and some glue code. Note - * that you may also need/want to change the way the NeedBits* - * macros get input data if, for example, you know the data to be - * decoded is properly aligned and oriented (doing so before running - * the decoder can be a big performance win). - * - * Consult the decoder in the TIFF library for an idea of what you - * need to define and setup to make use of these definitions. - * - * NB: to enable a debugging version of these macros define FAX3_DEBUG - * before including this file. Trace output goes to stdout. - */ - - private bool EndOfData() - { - return (m_tif.m_rawcp >= m_tif.m_rawcc); - } - - private int GetBits(int n) - { - return (m_data & ((1 << n) - 1)); - } - - private void ClrBits(int n) - { - m_bit -= n; - m_data >>= n; - } - - /* - * Need <=8 or <=16 bits of input data. Unlike viewfax we - * cannot use/assume a word-aligned, properly bit swizzled - * input data set because data may come from an arbitrarily - * aligned, read-only source such as a memory-mapped file. - * Note also that the viewfax decoder does not check for - * running off the end of the input data buffer. This is - * possible for G3-encoded data because it prescans the input - * data to count EOL markers, but can cause problems for G4 - * data. In any event, we don't prescan and must watch for - * running out of data since we can't permit the library to - * scan past the end of the input data buffer. - * - * Finally, note that we must handle remaindered data at the end - * of a strip specially. The coder asks for a fixed number of - * bits when scanning for the next code. This may be more bits - * than are actually present in the data stream. If we appear - * to run out of data but still have some number of valid bits - * remaining then we makeup the requested amount with zeros and - * return successfully. If the returned data is incorrect then - * we should be called again and get a premature EOF error; - * otherwise we should get the right answer. - */ - private bool NeedBits8(int n) - { - if (m_bit < n) - { - if (EndOfData()) - { - if (m_bit == 0) - { - /* no valid bits */ - return false; - } - - m_bit = n; /* pad with zeros */ - } - else - { - m_data |= m_bitmap[m_tif.m_rawdata[m_tif.m_rawcp]] << m_bit; - m_tif.m_rawcp++; - m_bit += 8; - } - } - - return true; - } - - private bool NeedBits16(int n) - { - if (m_bit < n) - { - if (EndOfData()) - { - if (m_bit == 0) - { - /* no valid bits */ - return false; - } - - m_bit = n; /* pad with zeros */ - } - else - { - m_data |= m_bitmap[m_tif.m_rawdata[m_tif.m_rawcp]] << m_bit; - m_tif.m_rawcp++; - m_bit += 8; - if (m_bit < n) - { - if (EndOfData()) - { - /* NB: we know BitsAvail is non-zero here */ - m_bit = n; /* pad with zeros */ - } - else - { - m_data |= m_bitmap[m_tif.m_rawdata[m_tif.m_rawcp]] << m_bit; - m_tif.m_rawcp++; - m_bit += 8; - } - } - } - } - - return true; - } - - private bool LOOKUP8(out faxTableEntry TabEnt, int wid) - { - if (!NeedBits8(wid)) - { - TabEnt = new faxTableEntry(); - return false; - } - - TabEnt = faxTableEntry.FromArray(m_faxMainTable, GetBits(wid)); - ClrBits(TabEnt.Width); - - return true; - } - - private bool LOOKUP16(out faxTableEntry TabEnt, int wid, bool useBlack) - { - if (!NeedBits16(wid)) - { - TabEnt = new faxTableEntry(); - return false; - } - - if (useBlack) - TabEnt = faxTableEntry.FromArray(m_faxBlackTable, GetBits(wid)); - else - TabEnt = faxTableEntry.FromArray(m_faxWhiteTable, GetBits(wid)); - - ClrBits(TabEnt.Width); - - return true; - } - - /* - * Synchronize input decoding at the start of each - * row by scanning for an EOL (if appropriate) and - * skipping any trash data that might be present - * after a decoding error. Note that the decoding - * done elsewhere that recognizes an EOL only consumes - * 11 consecutive zero bits. This means that if EOLcnt - * is non-zero then we still need to scan for the final flag - * bit that is part of the EOL code. - */ - private bool SYNC_EOL() - { - if (m_EOLcnt == 0) - { - for (; ; ) - { - if (!NeedBits16(11)) - return false; - - if (GetBits(11) == 0) - break; - - ClrBits(1); - } - } - - for (; ; ) - { - if (!NeedBits8(8)) - return false; - - if (GetBits(8) != 0) - break; - - ClrBits(8); - } - - while (GetBits(1) == 0) - ClrBits(1); - - ClrBits(1); /* EOL bit */ - m_EOLcnt = 0; /* reset EOL counter/flag */ - - return true; - } - - /* - * Setup G3/G4-related compression/decompression state - * before data is processed. This routine is called once - * per image -- it sets up different state based on whether - * or not decoding or encoding is being done and whether - * 1D- or 2D-encoded data is involved. - */ - private bool setupState() - { - if (m_tif.m_dir.td_bitspersample != 1) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Bits/sample must be 1 for Group 3/4 encoding/decoding"); - return false; - } - - /* - * Calculate the scanline/tile widths. - */ - int rowbytes = 0; - int rowpixels = 0; - if (m_tif.IsTiled()) - { - rowbytes = m_tif.TileRowSize(); - rowpixels = m_tif.m_dir.td_tilewidth; - } - else - { - rowbytes = m_tif.ScanlineSize(); - rowpixels = m_tif.m_dir.td_imagewidth; - } - - m_rowbytes = rowbytes; - m_rowpixels = rowpixels; - - /* - * Allocate any additional space required for decoding/encoding. - */ - bool needsRefLine = ((m_groupoptions & Group3Option.Encoding2D) != 0 || - m_tif.m_dir.td_compression == Compression.CCITTFAX4); - - // Assure that allocation computations do not overflow. - m_runs = null; - int nruns = Tiff.roundUp(rowpixels, 32); - if (needsRefLine) - { - long multiplied = (long)nruns * 2; - if (multiplied > int.MaxValue) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Row pixels integer overflow (rowpixels {0})", rowpixels); - return false; - } - else - { - nruns = (int)multiplied; - } - } - - if (nruns == 0 || ((long)nruns * 2) > int.MaxValue) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Row pixels integer overflow (rowpixels {0})", rowpixels); - return false; - } - - m_runs = new int[2 * nruns]; - m_curruns = 0; - - if (needsRefLine) - m_refruns = nruns; - else - m_refruns = -1; - - if (m_tif.m_dir.td_compression == Compression.CCITTFAX3 && is2DEncoding()) - { - /* NB: default is 1D routine */ - m_decoder = Decoder.useFax3_2DDecoder; - } - - if (needsRefLine) - { - /* 2d encoding */ - /* - * 2d encoding requires a scanline - * buffer for the "reference line"; the - * scanline against which delta encoding - * is referenced. The reference line must - * be initialized to be "white" (done elsewhere). - */ - m_refline = new byte[rowbytes + 1]; - } - else - { - /* 1d encoding */ - m_refline = null; - } - - return true; - } - - /* - * Routine for handling various errors/conditions. - * Note how they are "glued into the decoder" by - * overriding the definitions used by the decoder. - */ - private void Fax3Unexpected(string module) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: Bad code word at line {1} of {2} {3} (x {4})", - m_tif.m_name, m_line, m_tif.IsTiled() ? "tile" : "strip", - (m_tif.IsTiled() ? m_tif.m_curtile : m_tif.m_curstrip), m_a0); - } - - private void Fax3Extension(string module) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: Uncompressed data (not supported) at line {1} of {2} {3} (x {4})", - m_tif.m_name, m_line, m_tif.IsTiled() ? "tile" : "strip", - (m_tif.IsTiled() ? m_tif.m_curtile : m_tif.m_curstrip), m_a0); - } - - private void Fax3BadLength(string module) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "{0}: {1} at line {2} of {3} {4} (got {5}, expected {6})", - m_tif.m_name, m_a0 < m_rowpixels ? "Premature EOL" : "Line length mismatch", - m_line, m_tif.IsTiled() ? "tile" : "strip", - (m_tif.IsTiled() ? m_tif.m_curtile : m_tif.m_curstrip), m_a0, m_rowpixels); - } - - private void Fax3PrematureEOF(string module) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "{0}: Premature EOF at line {1} of {2} {3} (x {4})", - m_tif.m_name, m_line, m_tif.IsTiled() ? "tile" : "strip", - (m_tif.IsTiled() ? m_tif.m_curtile : m_tif.m_curstrip), m_a0); - } - - /// - /// Decode the requested amount of G3 1D-encoded data. - /// - private bool Fax3Decode1D(byte[] buffer, int offset, int count) - { - const string module = "Fax3Decode1D"; - - // current row's run array - m_thisrun = m_curruns; - while (count > 0) - { - m_a0 = 0; - m_RunLength = 0; - m_pa = m_thisrun; - - if (!SYNC_EOL()) - { - // premature EOF - CLEANUP_RUNS(module); - } - else - { - bool expandSucceeded = EXPAND1D(module); - if (expandSucceeded) - { - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - offset += m_rowbytes; - count -= m_rowbytes; - m_line++; - continue; - } - } - - // premature EOF - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - return false; - } - - return true; - } - - /// - /// Decode the requested amount of G3 2D-encoded data. - /// - private bool Fax3Decode2D(byte[] buffer, int offset, int count) - { - const string module = "Fax3Decode2D"; - - while (count > 0) - { - m_a0 = 0; - m_RunLength = 0; - m_pa = m_curruns; - m_thisrun = m_curruns; - - bool prematureEOF = false; - if (!SYNC_EOL()) - prematureEOF = true; - - if (!prematureEOF && !NeedBits8(1)) - prematureEOF = true; - - if (!prematureEOF) - { - int is1D = GetBits(1); // 1D/2D-encoding tag bit - ClrBits(1); - m_pb = m_refruns; - int b1 = m_runs[m_pb]; - m_pb++; // next change on prev line - - bool expandSucceeded = false; - if (is1D != 0) - expandSucceeded = EXPAND1D(module); - else - expandSucceeded = EXPAND2D(module, b1); - - if (expandSucceeded) - { - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - SETVALUE(0); // imaginary change for reference - SWAP(ref m_curruns, ref m_refruns); - offset += m_rowbytes; - count -= m_rowbytes; - m_line++; - continue; - } - } - else - { - // premature EOF - CLEANUP_RUNS(module); - } - - // premature EOF - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - return false; - } - - return true; - } - - /* - * 1d-encode a row of pixels. The encoding is - * a sequence of all-white or all-black spans - * of pixels encoded with Huffman codes. - */ - private bool Fax3Encode1DRow() - { - int bs = 0; - for (; ; ) - { - int span = find0span(m_buffer, m_offset, bs, m_rowpixels); /* white span */ - putspan(span, false); - bs += span; - if (bs >= m_rowpixels) - break; - - span = find1span(m_buffer, m_offset, bs, m_rowpixels); /* black span */ - putspan(span, true); - bs += span; - if (bs >= m_rowpixels) - break; - } - - if ((m_mode & (FaxMode.ByteAlign | FaxMode.WordAlign)) != 0) - { - if (m_bit != 8) - { - /* byte-align */ - flushBits(); - } - - if ((m_mode & FaxMode.WordAlign) != 0 && !isShortAligned(m_tif.m_rawcp)) - flushBits(); - } - - return true; - } - - /* - * 2d-encode a row of pixels. Consult the CCITT - * documentation for the algorithm. - */ - private bool Fax3Encode2DRow() - { - int a0 = 0; - int a1 = (Fax3Encode2DRow_Pixel(m_buffer, m_offset, 0) != 0 ? 0 : finddiff(m_buffer, m_offset, 0, m_rowpixels, 0)); - int b1 = (Fax3Encode2DRow_Pixel(m_refline, 0, 0) != 0 ? 0 : finddiff(m_refline, 0, 0, m_rowpixels, 0)); - - for (; ; ) - { - int b2 = finddiff2(m_refline, 0, b1, m_rowpixels, Fax3Encode2DRow_Pixel(m_refline, 0, b1)); - if (b2 >= a1) - { - int d = b1 - a1; - if (!(-3 <= d && d <= 3)) - { - /* horizontal mode */ - int a2 = finddiff2(m_buffer, m_offset, a1, m_rowpixels, Fax3Encode2DRow_Pixel(m_buffer, m_offset, a1)); - putcode(m_horizcode); - - if (a0 + a1 == 0 || Fax3Encode2DRow_Pixel(m_buffer, m_offset, a0) == 0) - { - putspan(a1 - a0, false); - putspan(a2 - a1, true); - } - else - { - putspan(a1 - a0, true); - putspan(a2 - a1, false); - } - - a0 = a2; - } - else - { - /* vertical mode */ - putcode(m_vcodes[d + 3]); - a0 = a1; - } - } - else - { - /* pass mode */ - putcode(m_passcode); - a0 = b2; - } - - if (a0 >= m_rowpixels) - break; - - a1 = finddiff(m_buffer, m_offset, a0, m_rowpixels, Fax3Encode2DRow_Pixel(m_buffer, m_offset, a0)); - - int color = Fax3Encode2DRow_Pixel(m_buffer, m_offset, a0); - if (color == 0) - color = 1; - else - color = 0; - - b1 = finddiff(m_refline, 0, a0, m_rowpixels, color); - b1 = finddiff(m_refline, 0, b1, m_rowpixels, Fax3Encode2DRow_Pixel(m_buffer, m_offset, a0)); - } - - return true; - } - - private static int Fax3Encode2DRow_Pixel(byte[] buf, int bufOffset, int ix) - { - // some images caused out-of-bounds exception here. not sure why. maybe the images are - // malformed or implementation is buggy. original libtiff does not produce exceptions - // here. it's just read after the end of the buffer. - - // it's a fast fix (use last byte when requested any byte beyond buffer end) for - // the problem that possibly should be reviewed. - // (it's weird but produced output is byte-to-byte equal to libtiff's one) - return (((buf[Math.Min(bufOffset + (ix >> 3), buf.Length - 1)]) >> (7 - (ix & 7))) & 1); - } - - /// - /// Encode a buffer of pixels. - /// - private bool Fax3Encode(byte[] buffer, int offset, int count) - { - m_buffer = buffer; - m_offset = offset; - - while (count > 0) - { - if ((m_mode & FaxMode.NoEOL) == 0) - Fax3PutEOL(); - - if (is2DEncoding()) - { - if (m_encoder == Fax3Encoder.useFax1DEncoder) - { - if (!Fax3Encode1DRow()) - return false; - - m_encoder = Fax3Encoder.useFax2DEncoder; - } - else - { - if (!Fax3Encode2DRow()) - return false; - - m_k--; - } - - if (m_k == 0) - { - m_encoder = Fax3Encoder.useFax1DEncoder; - m_k = m_maxk - 1; - } - else - { - Buffer.BlockCopy(m_buffer, m_offset, m_refline, 0, m_rowbytes); - } - } - else - { - if (!Fax3Encode1DRow()) - return false; - } - - m_offset += m_rowbytes; - count -= m_rowbytes; - } - - return true; - } - - private bool Fax3PostEncode() - { - if (m_bit != 8) - flushBits(); - - return true; - } - - private void InitCCITTFax3() - { - /* - * Merge codec-specific tag information and - * override parent get/set field methods. - */ - m_tif.MergeFieldInfo(m_faxFieldInfo, m_faxFieldInfo.Length); - - /* - * Allocate state block so tag methods have storage to record values. - */ - m_rw_mode = m_tif.m_mode; - - m_parentTagMethods = m_tif.m_tagmethods; - m_tif.m_tagmethods = m_tagMethods; - - m_groupoptions = 0; - m_recvparams = 0; - m_subaddress = null; - m_faxdcs = null; - - if (m_rw_mode == Tiff.O_RDONLY) - { - // FIXME: improve for in place update - m_tif.m_flags |= TiffFlags.NoBitRev; - // decoder does bit reversal - } - - m_runs = null; - m_tif.SetField(TiffTag.FAXFILLFUNC, new Tiff.FaxFillFunc(fax3FillRuns)); - m_refline = null; - - m_decoder = Decoder.useFax3_1DDecoder; - m_encodingFax4 = false; - } - - private bool TIFFInitCCITTFax3() - { - InitCCITTFax3(); - m_tif.MergeFieldInfo(m_fax3FieldInfo, m_fax3FieldInfo.Length); - - /* - * The default format is Class/F-style w/o RTC. - */ - return m_tif.SetField(TiffTag.FAXMODE, FaxMode.ClassF); - } - - /* - * CCITT Group 3 FAX Encoding. - */ - private void flushBits() - { - if (m_tif.m_rawcc >= m_tif.m_rawdatasize) - m_tif.flushData1(); - - m_tif.m_rawdata[m_tif.m_rawcp] = (byte)m_data; - m_tif.m_rawcp++; - m_tif.m_rawcc++; - m_data = 0; - m_bit = 8; - } - - /* - * Write a variable-length bit-value to - * the output stream. Values are - * assumed to be at most 16 bits. - */ - private void putBits(int bits, int length) - { - while (length > m_bit) - { - m_data |= bits >> (length - m_bit); - length -= m_bit; - flushBits(); - } - - m_data |= (bits & m_msbmask[length]) << (m_bit - length); - m_bit -= length; - if (m_bit == 0) - flushBits(); - } - - /* - * Write a code to the output stream. - */ - private void putcode(tableEntry te) - { - putBits(te.code, te.length); - } - - /* - * Write the sequence of codes that describes - * the specified span of zero's or one's. The - * appropriate table that holds the make-up and - * terminating codes is supplied. - */ - private void putspan(int span, bool useBlack) - { - short[] entries = null; - if (useBlack) - entries = m_faxBlackCodes; - else - entries = m_faxWhiteCodes; - - tableEntry te = tableEntry.FromArray(entries, 63 + (2560 >> 6)); - while (span >= 2624) - { - putBits(te.code, te.length); - span -= te.runlen; - } - - if (span >= 64) - { - te = tableEntry.FromArray(entries, 63 + (span >> 6)); - Debug.Assert(te.runlen == 64 * (span >> 6)); - putBits(te.code, te.length); - span -= te.runlen; - } - - te = tableEntry.FromArray(entries, span); - putBits(te.code, te.length); - } - - /* - * Write an EOL code to the output stream. The zero-fill - * logic for byte-aligning encoded scanlines is handled - * here. We also handle writing the tag bit for the next - * scanline when doing 2d encoding. - */ - private void Fax3PutEOL() - { - if ((m_groupoptions & Group3Option.FillBits) != 0) - { - /* - * Force bit alignment so EOL will terminate on - * a byte boundary. That is, force the bit alignment - * to 16-12 = 4 before putting out the EOL code. - */ - int align = 8 - 4; - if (align != m_bit) - { - if (align > m_bit) - align = m_bit + (8 - align); - else - align = m_bit - align; - - putBits(0, align); - } - } - - int code = EOL_CODE; - int length = 12; - if (is2DEncoding()) - { - code = (code << 1); - if (m_encoder == Fax3Encoder.useFax1DEncoder) - code++; - - length++; - } - - putBits(code, length); - } - - /* - * Append a run to the run length array for the - * current row and reset decoding state. - */ - private void SETVALUE(int x) - { - m_runs[m_pa] = m_RunLength + x; - m_pa++; - m_a0 += x; - m_RunLength = 0; - } - - /* - * Cleanup the array of runs after decoding a row. - * We adjust final runs to insure the user buffer is not - * overwritten and/or undecoded area is white filled. - */ - private void CLEANUP_RUNS(string module) - { - if (m_RunLength != 0) - SETVALUE(0); - - if (m_a0 != m_rowpixels) - { - Fax3BadLength(module); - - while (m_a0 > m_rowpixels && m_pa > m_thisrun) - { - m_pa--; - m_a0 -= m_runs[m_pa]; - } - - if (m_a0 < m_rowpixels) - { - if (m_a0 < 0) - m_a0 = 0; - - if (((m_pa - m_thisrun) & 1) != 0) - SETVALUE(0); - - SETVALUE(m_rowpixels - m_a0); - } - else if (m_a0 > m_rowpixels) - { - SETVALUE(m_rowpixels); - SETVALUE(0); - } - } - } - - private void handlePrematureEOFinExpand2D(string module) - { - Fax3PrematureEOF(module); - CLEANUP_RUNS(module); - } - - /* - * Decode a line of 1D-encoded data. - */ - private bool EXPAND1D(string module) - { - faxTableEntry TabEnt; - bool decodingDone = false; - bool whiteDecodingDone = false; - bool blackDecodingDone = false; - - for (; ; ) - { - for (; ; ) - { - if (!LOOKUP16(out TabEnt, 12, false)) - { - Fax3PrematureEOF(module); - CLEANUP_RUNS(module); - return false; - } - - switch (TabEnt.State) - { - case S_EOL: - m_rowpixels = 1; - decodingDone = true; - break; - - case S_TermW: - SETVALUE(TabEnt.Param); - whiteDecodingDone = true; - break; - - case S_MakeUpW: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "WhiteTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (decodingDone || whiteDecodingDone) - break; - } - - if (decodingDone) - break; - - if (m_a0 >= m_rowpixels) - break; - - for (; ; ) - { - if (!LOOKUP16(out TabEnt, 13, true)) - { - Fax3PrematureEOF(module); - CLEANUP_RUNS(module); - return false; - } - - switch (TabEnt.State) - { - case S_EOL: - m_EOLcnt = 1; - decodingDone = true; - break; - - case S_TermB: - SETVALUE(TabEnt.Param); - blackDecodingDone = true; - break; - - case S_MakeUpB: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "BlackTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (decodingDone || blackDecodingDone) - break; - } - - if (decodingDone) - break; - - if (m_a0 >= m_rowpixels) - break; - - if (m_runs[m_pa - 1] == 0 && m_runs[m_pa - 2] == 0) - m_pa -= 2; - - whiteDecodingDone = false; - blackDecodingDone = false; - } - - CLEANUP_RUNS(module); - return true; - } - - /* - * Expand a row of 2D-encoded data. - */ - private bool EXPAND2D(string module, int b1) - { - faxTableEntry TabEnt; - bool decodingDone = false; - - while (m_a0 < m_rowpixels) - { - if (!LOOKUP8(out TabEnt, 7)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - switch (TabEnt.State) - { - case S_Pass: - CHECK_b1(ref b1); - b1 += m_runs[m_pb]; - m_pb++; - m_RunLength += b1 - m_a0; - m_a0 = b1; - b1 += m_runs[m_pb]; - m_pb++; - break; - - case S_Horiz: - if (((m_pa - m_thisrun) & 1) != 0) - { - for (; ; ) - { - /* black first */ - if (!LOOKUP16(out TabEnt, 13, true)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - bool doneWhite2d = false; - switch (TabEnt.State) - { - case S_TermB: - SETVALUE(TabEnt.Param); - doneWhite2d = true; - break; - - case S_MakeUpB: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "BlackTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (doneWhite2d || decodingDone) - break; - } - - if (decodingDone) - break; - - for (; ; ) - { - /* then white */ - if (!LOOKUP16(out TabEnt, 12, false)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - bool doneBlack2d = false; - switch (TabEnt.State) - { - case S_TermW: - SETVALUE(TabEnt.Param); - doneBlack2d = true; - break; - - case S_MakeUpW: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "WhiteTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (doneBlack2d || decodingDone) - break; - } - - if (decodingDone) - break; - } - else - { - for (; ; ) - { - /* white first */ - if (!LOOKUP16(out TabEnt, 12, false)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - bool doneWhite2d = false; - switch (TabEnt.State) - { - case S_TermW: - SETVALUE(TabEnt.Param); - doneWhite2d = true; - break; - - case S_MakeUpW: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "WhiteTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (doneWhite2d || decodingDone) - break; - } - - if (decodingDone) - break; - - for (; ; ) - { - /* then black */ - if (!LOOKUP16(out TabEnt, 13, true)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - bool doneBlack2d = false; - switch (TabEnt.State) - { - case S_TermB: - SETVALUE(TabEnt.Param); - doneBlack2d = true; - break; - - case S_MakeUpB: - case S_MakeUp: - m_a0 += TabEnt.Param; - m_RunLength += TabEnt.Param; - break; - - default: - /* "BlackTable" */ - Fax3Unexpected(module); - decodingDone = true; - break; - } - - if (doneBlack2d || decodingDone) - break; - } - } - - if (decodingDone) - break; - - CHECK_b1(ref b1); - break; - - case S_V0: - CHECK_b1(ref b1); - SETVALUE(b1 - m_a0); - b1 += m_runs[m_pb]; - m_pb++; - break; - - case S_VR: - CHECK_b1(ref b1); - SETVALUE(b1 - m_a0 + TabEnt.Param); - b1 += m_runs[m_pb]; - m_pb++; - break; - - case S_VL: - CHECK_b1(ref b1); - SETVALUE(b1 - m_a0 - TabEnt.Param); - m_pb--; - b1 -= m_runs[m_pb]; - break; - - case S_Ext: - m_runs[m_pa] = m_rowpixels - m_a0; - m_pa++; - Fax3Extension(module); - decodingDone = true; - break; - - case S_EOL: - m_runs[m_pa] = m_rowpixels - m_a0; - m_pa++; - - if (!NeedBits8(4)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - if (GetBits(4) != 0) - { - /* "EOL" */ - Fax3Unexpected(module); - } - - ClrBits(4); - m_EOLcnt = 1; - decodingDone = true; - break; - - default: - Fax3Unexpected(module); - decodingDone = true; - break; - } - } - - if (!decodingDone && m_RunLength != 0) - { - if (m_RunLength + m_a0 < m_rowpixels) - { - /* expect a final V0 */ - if (!NeedBits8(1)) - { - handlePrematureEOFinExpand2D(module); - return false; - } - - if (GetBits(1) == 0) - { - /* "MainTable" */ - Fax3Unexpected(module); - decodingDone = true; - } - - if (!decodingDone) - ClrBits(1); - } - - if (!decodingDone) - SETVALUE(0); - } - - CLEANUP_RUNS(module); - return true; - } - - /* - * CCITT Group 3 1-D Modified Huffman RLE Compression Support. - * (Compression algorithms 2 and 32771) - */ - - private bool TIFFInitCCITTRLE() - { - /* reuse G3 support */ - InitCCITTFax3(); - - m_decoder = Decoder.useFax3RLEDecoder; - - /* - * Suppress RTC+EOLs when encoding and byte-align data. - */ - return m_tif.SetField(TiffTag.FAXMODE, - FaxMode.NoRTC | FaxMode.NoEOL | FaxMode.ByteAlign); - } - - private bool TIFFInitCCITTRLEW() - { - /* reuse G3 support */ - InitCCITTFax3(); - - m_decoder = Decoder.useFax3RLEDecoder; - - /* - * Suppress RTC+EOLs when encoding and word-align data. - */ - return m_tif.SetField(TiffTag.FAXMODE, - FaxMode.NoRTC | FaxMode.NoEOL | FaxMode.WordAlign); - } - - /// - /// Decode the requested amount of RLE-encoded data. - /// - private bool Fax3DecodeRLE(byte[] buffer, int offset, int count) - { - const string module = "Fax3DecodeRLE"; - - int thisrun = m_curruns; // current row's run array - - while (count > 0) - { - m_a0 = 0; - m_RunLength = 0; - m_pa = thisrun; - - bool expandSucceeded = EXPAND1D(module); - if (expandSucceeded) - { - fill(buffer, offset, m_runs, thisrun, m_pa, m_rowpixels); - - // Cleanup at the end of the row. - if ((m_mode & FaxMode.ByteAlign) != 0) - { - int n = m_bit - (m_bit & ~7); - ClrBits(n); - } - else if ((m_mode & FaxMode.WordAlign) != 0) - { - int n = m_bit - (m_bit & ~15); - ClrBits(n); - if (m_bit == 0 && !isShortAligned(m_tif.m_rawcp)) - m_tif.m_rawcp++; - } - - offset += m_rowbytes; - count -= m_rowbytes; - m_line++; - continue; - } - - // premature EOF - fill(buffer, offset, m_runs, thisrun, m_pa, m_rowpixels); - return false; - } - - return true; - } - - /* - * CCITT Group 4 (T.6) Facsimile-compatible - * Compression Scheme Support. - */ - - private bool TIFFInitCCITTFax4() - { - /* reuse G3 support */ - InitCCITTFax3(); - - m_tif.MergeFieldInfo(m_fax4FieldInfo, m_fax4FieldInfo.Length); - - m_decoder = Decoder.useFax4Decoder; - m_encodingFax4 = true; - - /* - * Suppress RTC at the end of each strip. - */ - return m_tif.SetField(TiffTag.FAXMODE, FaxMode.NoRTC); - } - - /// - /// Decode the requested amount of G4-encoded data. - /// - private bool Fax4Decode(byte[] buffer, int offset, int count) - { - const string module = "Fax4Decode"; - - while (count > 0) - { - m_a0 = 0; - m_RunLength = 0; - m_thisrun = m_curruns; - m_pa = m_curruns; - m_pb = m_refruns; - int b1 = m_runs[m_pb]; - m_pb++; // next change on prev line - - bool expandSucceeded = EXPAND2D(module, b1); - if (expandSucceeded && m_EOLcnt != 0) - expandSucceeded = false; - - if (expandSucceeded) - { - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - SETVALUE(0); // imaginary change for reference - SWAP(ref m_curruns, ref m_refruns); - offset += m_rowbytes; - count -= m_rowbytes; - m_line++; - continue; - } - - NeedBits16(13); - ClrBits(13); - fill(buffer, offset, m_runs, m_thisrun, m_pa, m_rowpixels); - return false; - } - - return true; - } - - /// - /// Encode the requested amount of data. - /// - private bool Fax4Encode(byte[] buffer, int offset, int count) - { - m_buffer = buffer; - m_offset = offset; - - while (count > 0) - { - if (!Fax3Encode2DRow()) - return false; - - Buffer.BlockCopy(m_buffer, m_offset, m_refline, 0, m_rowbytes); - m_offset += m_rowbytes; - count -= m_rowbytes; - } - - return true; - } - - private bool Fax4PostEncode() - { - // terminate strip w/ EOFB - putBits(EOL_CODE, 12); - putBits(EOL_CODE, 12); - - if (m_bit != 8) - flushBits(); - - return true; - } - } - #endregion - - #region CCITTCodecTagMethods - class CCITTCodecTagMethods : TiffTagMethods - { - public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) - { - CCITTCodec sp = tif.m_currentCodec as CCITTCodec; - Debug.Assert(sp != null); - - switch (tag) - { - case TiffTag.FAXMODE: - sp.m_mode = (FaxMode)ap[0].ToShort(); - return true; /* NB: pseudo tag */ - case TiffTag.FAXFILLFUNC: - sp.fill = ap[0].Value as Tiff.FaxFillFunc; - return true; /* NB: pseudo tag */ - case TiffTag.Group3Options: - /* XXX: avoid reading options if compression mismatches. */ - if (tif.m_dir.td_compression == Compression.CCITTFAX3) - sp.m_groupoptions = (Group3Option)ap[0].ToShort(); - break; - case TiffTag.Group4Options: - /* XXX: avoid reading options if compression mismatches. */ - if (tif.m_dir.td_compression == Compression.CCITTFAX4) - sp.m_groupoptions = (Group3Option)ap[0].ToShort(); - break; - case TiffTag.BadFaxLines: - sp.m_badfaxlines = ap[0].ToInt(); - break; - case TiffTag.CleanFaxData: - sp.m_cleanfaxdata = (CleanFaxData)ap[0].ToByte(); - break; - case TiffTag.ConsecutiveBadFaxLines: - sp.m_badfaxrun = ap[0].ToInt(); - break; - case TiffTag.FAXRECVPARAMS: - sp.m_recvparams = ap[0].ToInt(); - break; - case TiffTag.FAXSUBADDRESS: - Tiff.setString(out sp.m_subaddress, ap[0].ToString()); - break; - case TiffTag.FAXRECVTIME: - sp.m_recvtime = ap[0].ToInt(); - break; - case TiffTag.FAXDCS: - Tiff.setString(out sp.m_faxdcs, ap[0].ToString()); - break; - default: - return base.SetField(tif, tag, ap); - } - - TiffFieldInfo fip = tif.FieldWithTag(tag); - if (fip != null) - tif.setFieldBit(fip.Bit); - else - return false; - - tif.m_flags |= TiffFlags.DirtyDirect; - return true; - } - - public override FieldValue[] GetField(Tiff tif, TiffTag tag) - { - CCITTCodec sp = tif.m_currentCodec as CCITTCodec; - Debug.Assert(sp != null); - - FieldValue[] result = new FieldValue[1]; - - switch (tag) - { - case TiffTag.FAXMODE: - result[0].Set(sp.m_mode); - break; - case TiffTag.FAXFILLFUNC: - result[0].Set(sp.fill); - break; - case TiffTag.Group3Options: - case TiffTag.Group4Options: - result[0].Set(sp.m_groupoptions); - break; - case TiffTag.BadFaxLines: - result[0].Set(sp.m_badfaxlines); - break; - case TiffTag.CleanFaxData: - result[0].Set(sp.m_cleanfaxdata); - break; - case TiffTag.ConsecutiveBadFaxLines: - result[0].Set(sp.m_badfaxrun); - break; - case TiffTag.FAXRECVPARAMS: - result[0].Set(sp.m_recvparams); - break; - case TiffTag.FAXSUBADDRESS: - result[0].Set(sp.m_subaddress); - break; - case TiffTag.FAXRECVTIME: - result[0].Set(sp.m_recvtime); - break; - case TiffTag.FAXDCS: - result[0].Set(sp.m_faxdcs); - break; - default: - return base.GetField(tif, tag); - } - - return result; - } - - public override void PrintDir(Tiff tif, Stream fd, TiffPrintFlags flags) - { - CCITTCodec sp = tif.m_currentCodec as CCITTCodec; - Debug.Assert(sp != null); - - if (tif.fieldSet(CCITTCodec.FIELD_OPTIONS)) - { - string sep = " "; - if (tif.m_dir.td_compression == Compression.CCITTFAX4) - { - Tiff.fprintf(fd, " Group 4 Options:"); - if ((sp.m_groupoptions & Group3Option.UnCompressed) != 0) - Tiff.fprintf(fd, "{0}uncompressed data", sep); - } - else - { - Tiff.fprintf(fd, " Group 3 Options:"); - if ((sp.m_groupoptions & Group3Option.Encoding2D) != 0) - { - Tiff.fprintf(fd, "{0}2-d encoding", sep); - sep = "+"; - } - - if ((sp.m_groupoptions & Group3Option.FillBits) != 0) - { - Tiff.fprintf(fd, "{0}EOL padding", sep); - sep = "+"; - } - - if ((sp.m_groupoptions & Group3Option.UnCompressed) != 0) - Tiff.fprintf(fd, "{0}uncompressed data", sep); - } - - Tiff.fprintf(fd, " ({0} = 0x{1:x})\n", sp.m_groupoptions, sp.m_groupoptions); - } - - if (tif.fieldSet(CCITTCodec.FIELD_CLEANFAXDATA)) - { - Tiff.fprintf(fd, " Fax Data:"); - - switch (sp.m_cleanfaxdata) - { - case CleanFaxData.Clean: - Tiff.fprintf(fd, " clean"); - break; - case CleanFaxData.Regenerated: - Tiff.fprintf(fd, " receiver regenerated"); - break; - case CleanFaxData.UnClean: - Tiff.fprintf(fd, " uncorrected errors"); - break; - } - - Tiff.fprintf(fd, " ({0} = 0x{1:x})\n", sp.m_cleanfaxdata, sp.m_cleanfaxdata); - } - - if (tif.fieldSet(CCITTCodec.FIELD_BADFAXLINES)) - Tiff.fprintf(fd, " Bad Fax Lines: {0}\n", sp.m_badfaxlines); - - if (tif.fieldSet(CCITTCodec.FIELD_BADFAXRUN)) - Tiff.fprintf(fd, " Consecutive Bad Fax Lines: {0}\n", sp.m_badfaxrun); - - if (tif.fieldSet(CCITTCodec.FIELD_RECVPARAMS)) - Tiff.fprintf(fd, " Fax Receive Parameters: {0,8:x}\n", sp.m_recvparams); - - if (tif.fieldSet(CCITTCodec.FIELD_SUBADDRESS)) - Tiff.fprintf(fd, " Fax SubAddress: {0}\n", sp.m_subaddress); - - if (tif.fieldSet(CCITTCodec.FIELD_RECVTIME)) - Tiff.fprintf(fd, " Fax Receive Time: {0} secs\n", sp.m_recvtime); - - if (tif.fieldSet(CCITTCodec.FIELD_FAXDCS)) - Tiff.fprintf(fd, " Fax DCS: {0}\n", sp.m_faxdcs); - } - } - #endregion - - #region CodecWithPredictor - /// - /// Codecs that want to support the PredictionScheme tag should inherit from - /// this class instead of TiffCodec. - /// - /// Such codecs should not override default TiffCodec's methods for - /// decode|encode setup and encoding|decoding of row|tile|strip. - /// Codecs with predictor support should override equivalent methods - /// provided by this class. - /// - /// If codec wants to provide custom tag get|set|print methods, then - /// it should pass pointer to a object derived from TiffTagMethods - /// as parameter to TIFFPredictorInit - /// - class CodecWithPredictor : TiffCodec - { - public const int FIELD_PREDICTOR = (FieldBit.Codec + 0); - - private enum PredictorType - { - ptNone, - ptHorAcc8, - ptHorAcc16, - ptHorAcc32, - ptSwabHorAcc16, - ptSwabHorAcc32, - ptHorDiff8, - ptHorDiff16, - ptHorDiff32, - ptFpAcc, - ptFpDiff, - }; - - private static TiffFieldInfo[] m_predictFieldInfo = - { - new TiffFieldInfo(TiffTag.Predictor, 1, 1, TiffType.Short, CodecWithPredictor.FIELD_PREDICTOR, false, false, "PredictionScheme"), - }; - - /// - /// predictor tag value - /// - private PredictionScheme m_predictor; - - /// - /// sample stride over data - /// - private int m_stride; - - /// - /// tile/strip row size - /// - private int m_rowSize; - - private TiffTagMethods m_parentTagMethods; - private TiffTagMethods m_tagMethods; - private TiffTagMethods m_childTagMethods; // could be null - - private bool m_passThruDecode; - private bool m_passThruEncode; - - /// - /// horizontal differencer/accumulator - /// - private PredictorType m_predictorType; - - public CodecWithPredictor(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - m_tagMethods = new CodecWithPredictorTagMethods(); - } - - // tagMethods can be null - public void TIFFPredictorInit(TiffTagMethods tagMethods) - { - // Merge codec-specific tag information and override parent get/set field methods. - m_tif.MergeFieldInfo(m_predictFieldInfo, m_predictFieldInfo.Length); - m_childTagMethods = tagMethods; - m_parentTagMethods = m_tif.m_tagmethods; - m_tif.m_tagmethods = m_tagMethods; - - m_predictor = PredictionScheme.None; // default value - m_predictorType = PredictorType.ptNone; // no predictor method - } - - public void TIFFPredictorCleanup() - { - m_tif.m_tagmethods = m_parentTagMethods; - } - - ////////////////////////////////////////////////////////////////////////// - // WARNING: do not override this methods! - // please override their equivalents listed below - - /// - /// Setups the decoder part of the codec. - /// - /// - /// true if this codec successfully setup its decoder part and can decode data; - /// otherwise, false. - /// - /// - /// SetupDecode is called once before - /// . - public override bool SetupDecode() - { - return PredictorSetupDecode(); - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruDecode) - return PredictorDecodeRow(buffer, offset, count, plane); - - return predictor_decoderow(buffer, offset, count, plane); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruDecode) - return PredictorDecodeTile(buffer, offset, count, plane); - - return predictor_decodestrip(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruDecode) - return PredictorDecodeTile(buffer, offset, count, plane); - - return predictor_decodetile(buffer, offset, count, plane); - } - - /// - /// Setups the encoder part of the codec. - /// - /// - /// true if this codec successfully setup its encoder part and can encode data; - /// otherwise, false. - /// - /// - /// SetupEncode is called once before - /// . - public override bool SetupEncode() - { - return PredictorSetupEncode(); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruEncode) - return PredictorEncodeRow(buffer, offset, count, plane); - - return predictor_encoderow(buffer, offset, count, plane); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruEncode) - return PredictorEncodeTile(buffer, offset, count, plane); - - return predictor_encodestrip(buffer, offset, count, plane); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - if (!m_passThruEncode) - return PredictorEncodeTile(buffer, offset, count, plane); - - return predictor_encodetile(buffer, offset, count, plane); - } - - ////////////////////////////////////////////////////////////////////////// - // derived class should override methods below instead of - // TiffCodec's methods - - public virtual bool predictor_setupdecode() - { - return base.SetupDecode(); - } - - public virtual bool predictor_decoderow(byte[] buffer, int offset, int count, short plane) - { - return base.DecodeRow(buffer, offset, count, plane); - } - - public virtual bool predictor_decodestrip(byte[] buffer, int offset, int count, short plane) - { - return base.DecodeStrip(buffer, offset, count, plane); - } - - public virtual bool predictor_decodetile(byte[] buffer, int offset, int count, short plane) - { - return base.DecodeTile(buffer, offset, count, plane); - } - - public virtual bool predictor_setupencode() - { - return base.SetupEncode(); - } - - public virtual bool predictor_encoderow(byte[] buffer, int offset, int count, short plane) - { - return base.EncodeRow(buffer, offset, count, plane); - } - - public virtual bool predictor_encodestrip(byte[] buffer, int offset, int count, short plane) - { - return base.EncodeStrip(buffer, offset, count, plane); - } - - public virtual bool predictor_encodetile(byte[] buffer, int offset, int count, short plane) - { - return base.EncodeTile(buffer, offset, count, plane); - } - - public PredictionScheme GetPredictorValue() - { - return m_predictor; - } - - public void SetPredictorValue(PredictionScheme value) - { - m_predictor = value; - } - - // retrieves child object's tag methods (could be null) - public TiffTagMethods GetChildTagMethods() - { - return m_childTagMethods; - } - - private void predictorFunc(byte[] buffer, int offset, int count) - { - switch (m_predictorType) - { - case PredictorType.ptHorAcc8: - horAcc8(buffer, offset, count); - break; - case PredictorType.ptHorAcc16: - horAcc16(buffer, offset, count); - break; - case PredictorType.ptHorAcc32: - horAcc32(buffer, offset, count); - break; - case PredictorType.ptSwabHorAcc16: - swabHorAcc16(buffer, offset, count); - break; - case PredictorType.ptSwabHorAcc32: - swabHorAcc32(buffer, offset, count); - break; - case PredictorType.ptHorDiff8: - horDiff8(buffer, offset, count); - break; - case PredictorType.ptHorDiff16: - horDiff16(buffer, offset, count); - break; - case PredictorType.ptHorDiff32: - horDiff32(buffer, offset, count); - break; - case PredictorType.ptFpAcc: - fpAcc(buffer, offset, count); - break; - case PredictorType.ptFpDiff: - fpDiff(buffer, offset, count); - break; - } - } - - private void horAcc8(byte[] buffer, int offset, int count) - { - int cp = offset; - if (count > m_stride) - { - count -= m_stride; - - // Pipeline the most common cases. - - if (m_stride == 3) - { - int cr = buffer[cp]; - int cg = buffer[cp + 1]; - int cb = buffer[cp + 2]; - do - { - count -= 3; - cp += 3; - - cr += buffer[cp]; - buffer[cp] = (byte)cr; - - cg += buffer[cp + 1]; - buffer[cp + 1] = (byte)cg; - - cb += buffer[cp + 2]; - buffer[cp + 2] = (byte)cb; - } - while (count > 0); - } - else if (m_stride == 4) - { - int cr = buffer[cp]; - int cg = buffer[cp + 1]; - int cb = buffer[cp + 2]; - int ca = buffer[cp + 3]; - do - { - count -= 4; - cp += 4; - - cr += buffer[cp]; - buffer[cp] = (byte)cr; - - cg += buffer[cp + 1]; - buffer[cp + 1] = (byte)cg; - - cb += buffer[cp + 2]; - buffer[cp + 2] = (byte)cb; - - ca += buffer[cp + 3]; - buffer[cp + 3] = (byte)ca; - } - while (count > 0); - } - else - { - do - { - for (int i = m_stride; i > 0; i--) - { - buffer[cp + m_stride] = (byte)(buffer[cp + m_stride] + buffer[cp]); - cp++; - } - - count -= m_stride; - } - while (count > 0); - } - } - } - - private void horAcc16(byte[] buffer, int offset, int count) - { - short[] wBuffer = Tiff.ByteArrayToShorts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 2; - if (wCount > m_stride) - { - wCount -= m_stride; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] += wBuffer[wOffset]; - wOffset++; - } - - wCount -= m_stride; - } - while (wCount > 0); - } - - Tiff.ShortsToByteArray(wBuffer, 0, count / 2, buffer, offset); - } - - private void horAcc32(byte[] buffer, int offset, int count) - { - int[] wBuffer = Tiff.ByteArrayToInts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 4; - if (wCount > m_stride) - { - wCount -= m_stride; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] += wBuffer[wOffset]; - wOffset++; - } - - wCount -= m_stride; - } while (wCount > 0); - } - - Tiff.IntsToByteArray(wBuffer, 0, count / 4, buffer, offset); - } - - private void swabHorAcc16(byte[] buffer, int offset, int count) - { - short[] wBuffer = Tiff.ByteArrayToShorts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 2; - if (wCount > m_stride) - { - Tiff.SwabArrayOfShort(wBuffer, wCount); - wCount -= m_stride; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] += wBuffer[wOffset]; - wOffset++; - } - - wCount -= m_stride; - } - while (wCount > 0); - } - - Tiff.ShortsToByteArray(wBuffer, 0, count / 2, buffer, offset); - } - - private void swabHorAcc32(byte[] buffer, int offset, int count) - { - int[] wBuffer = Tiff.ByteArrayToInts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 4; - if (wCount > m_stride) - { - Tiff.SwabArrayOfLong(wBuffer, wCount); - wCount -= m_stride; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] += wBuffer[wOffset]; - wOffset++; - } - - wCount -= m_stride; - } while (wCount > 0); - } - - Tiff.IntsToByteArray(wBuffer, 0, count / 4, buffer, offset); - } - - private void horDiff8(byte[] buffer, int offset, int count) - { - if (count > m_stride) - { - count -= m_stride; - int cp = offset; - - // Pipeline the most common cases. - - if (m_stride == 3) - { - int r2 = buffer[cp]; - int g2 = buffer[cp + 1]; - int b2 = buffer[cp + 2]; - do - { - int r1 = buffer[cp + 3]; - buffer[cp + 3] = (byte)(r1 - r2); - r2 = r1; - - int g1 = buffer[cp + 4]; - buffer[cp + 4] = (byte)(g1 - g2); - g2 = g1; - - int b1 = buffer[cp + 5]; - buffer[cp + 5] = (byte)(b1 - b2); - b2 = b1; - - cp += 3; - } - while ((count -= 3) > 0); - } - else if (m_stride == 4) - { - int r2 = buffer[cp]; - int g2 = buffer[cp + 1]; - int b2 = buffer[cp + 2]; - int a2 = buffer[cp + 3]; - do - { - int r1 = buffer[cp + 4]; - buffer[cp + 4] = (byte)(r1 - r2); - r2 = r1; - - int g1 = buffer[cp + 5]; - buffer[cp + 5] = (byte)(g1 - g2); - g2 = g1; - - int b1 = buffer[cp + 6]; - buffer[cp + 6] = (byte)(b1 - b2); - b2 = b1; - - int a1 = buffer[cp + 7]; - buffer[cp + 7] = (byte)(a1 - a2); - a2 = a1; - - cp += 4; - } - while ((count -= 4) > 0); - } - else - { - cp += count - 1; - do - { - for (int i = m_stride; i > 0; i--) - { - buffer[cp + m_stride] -= buffer[cp]; - cp--; - } - } - while ((count -= m_stride) > 0); - } - } - } - - private void horDiff16(byte[] buffer, int offset, int count) - { - short[] wBuffer = Tiff.ByteArrayToShorts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 2; - if (wCount > m_stride) - { - wCount -= m_stride; - wOffset += wCount - 1; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] -= wBuffer[wOffset]; - wOffset--; - } - - wCount -= m_stride; - } - while (wCount > 0); - } - - Tiff.ShortsToByteArray(wBuffer, 0, count / 2, buffer, offset); - } - - private void horDiff32(byte[] buffer, int offset, int count) - { - int[] wBuffer = Tiff.ByteArrayToInts(buffer, offset, count); - int wOffset = 0; - - int wCount = count / 4; - if (wCount > m_stride) - { - wCount -= m_stride; - wOffset += wCount - 1; - do - { - for (int i = m_stride; i > 0; i--) - { - wBuffer[wOffset + m_stride] -= wBuffer[wOffset]; - wOffset--; - } - - wCount -= m_stride; - } while (wCount > 0); - } - - Tiff.IntsToByteArray(wBuffer, 0, count / 4, buffer, offset); - } - - /// - /// Floating point predictor accumulation routine. - /// - private void fpAcc(byte[] buffer, int offset, int count) - { - int bps = m_tif.m_dir.td_bitspersample / 8; - int wCount = count / bps; - int left = count; - int cp = offset; - - while (left > m_stride) - { - for (int i = m_stride; i > 0; i--) - { - buffer[cp + m_stride] += buffer[cp]; - cp++; - } - - left -= m_stride; - } - - byte[] tmp = new byte[count]; - Buffer.BlockCopy(buffer, offset, tmp, 0, count); - for (int i = 0; i < wCount; i++) - { - for (int b = 0; b < bps; b++) - buffer[offset + bps * i + b] = tmp[(bps - b - 1) * wCount + i]; - } - } - - /// - /// Floating point predictor differencing routine. - /// - private void fpDiff(byte[] buffer, int offset, int count) - { - byte[] tmp = new byte[count]; - Buffer.BlockCopy(buffer, offset, tmp, 0, count); - - int bps = m_tif.m_dir.td_bitspersample / 8; - int wCount = count / bps; - for (int c = 0; c < wCount; c++) - { - for (int b = 0; b < bps; b++) - buffer[offset + (bps - b - 1) * wCount + c] = tmp[bps * c + b]; - } - - int cp = offset + count - m_stride - 1; - for (int c = count; c > m_stride; c -= m_stride) - { - for (int i = m_stride; i > 0; i--) - { - buffer[cp + m_stride] -= buffer[cp]; - cp--; - } - } - } - - /// - /// Decode a scanline and apply the predictor routine. - /// - private bool PredictorDecodeRow(byte[] buffer, int offset, int count, short plane) - { - Debug.Assert(m_predictorType != PredictorType.ptNone); - - if (predictor_decoderow(buffer, offset, count, plane)) - { - predictorFunc(buffer, offset, count); - return true; - } - - return false; - } - - /// - /// Decode a tile/strip and apply the predictor routine. Note that horizontal differencing - /// must be done on a row-by-row basis. The width of a "row" has already been calculated - /// at pre-decode time according to the strip/tile dimensions. - /// - private bool PredictorDecodeTile(byte[] buffer, int offset, int count, short plane) - { - if (predictor_decodetile(buffer, offset, count, plane)) - { - Debug.Assert(m_rowSize > 0); - Debug.Assert(m_predictorType != PredictorType.ptNone); - - while (count > 0) - { - predictorFunc(buffer, offset, m_rowSize); - count -= m_rowSize; - offset += m_rowSize; - } - - return true; - } - - return false; - } - - private bool PredictorEncodeRow(byte[] buffer, int offset, int count, short plane) - { - Debug.Assert(m_predictorType != PredictorType.ptNone); - - // XXX horizontal differencing alters user's data XXX - predictorFunc(buffer, offset, count); - return predictor_encoderow(buffer, offset, count, plane); - } - - private bool PredictorEncodeTile(byte[] buffer, int offset, int count, short plane) - { - Debug.Assert(m_predictorType != PredictorType.ptNone); - - // Do predictor manipulation in a working buffer to avoid altering - // the callers buffer. http://trac.osgeo.org/gdal/ticket/1965 - byte[] working_copy = new byte[count]; - Buffer.BlockCopy(buffer, 0, working_copy, 0, count); - - Debug.Assert(m_rowSize > 0); - Debug.Assert((count % m_rowSize) == 0); - - int cc = count; - while (cc > 0) - { - predictorFunc(working_copy, offset, m_rowSize); - cc -= m_rowSize; - offset += m_rowSize; - } - - return predictor_encodetile(working_copy, 0, count, plane); - } - - private bool PredictorSetupDecode() - { - if (!predictor_setupdecode() || !PredictorSetup()) - return false; - - m_passThruDecode = true; - if (m_predictor == PredictionScheme.Horizontal) - { - switch (m_tif.m_dir.td_bitspersample) - { - case 8: - m_predictorType = PredictorType.ptHorAcc8; - break; - case 16: - m_predictorType = PredictorType.ptHorAcc16; - break; - case 32: - m_predictorType = PredictorType.ptHorAcc32; - break; - } - - // Override default decoding method with one that does the predictor stuff. - m_passThruDecode = false; - - // If the data is horizontally differenced 16-bit data that requires byte-swapping, - // then it must be byte swapped before the accumulation step. We do this with a - // special-purpose method and override the normal post decoding logic that the - // library setup when the directory was read. - if ((m_tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - if (m_predictorType == PredictorType.ptHorAcc16) - { - m_predictorType = PredictorType.ptSwabHorAcc16; - m_tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmNone; - } - else if (m_predictorType == PredictorType.ptHorAcc32) - { - m_predictorType = PredictorType.ptSwabHorAcc32; - m_tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmNone; - } - } - } - else if (m_predictor == PredictionScheme.FloatingPoint) - { - m_predictorType = PredictorType.ptFpAcc; - - // Override default decoding method with one that does the predictor stuff. - m_passThruDecode = false; - - // The data should not be swapped outside of the floating point predictor, the - // accumulation method should return bytes in the native order. - if ((m_tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - m_tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmNone; - - // Allocate buffer to keep the decoded bytes before rearranging in the right order - } - - return true; - } - - private bool PredictorSetupEncode() - { - if (!predictor_setupencode() || !PredictorSetup()) - return false; - - m_passThruEncode = true; - if (m_predictor == PredictionScheme.Horizontal) - { - switch (m_tif.m_dir.td_bitspersample) - { - case 8: - m_predictorType = PredictorType.ptHorDiff8; - break; - case 16: - m_predictorType = PredictorType.ptHorDiff16; - break; - case 32: - m_predictorType = PredictorType.ptHorDiff32; - break; - } - - // Override default encoding method with one that does the predictor stuff. - m_passThruEncode = false; - } - else if (m_predictor == PredictionScheme.FloatingPoint) - { - m_predictorType = PredictorType.ptFpDiff; - - // Override default encoding method with one that does the predictor stuff. - m_passThruEncode = false; - } - - return true; - } - - private bool PredictorSetup() - { - const string module = "PredictorSetup"; - TiffDirectory td = m_tif.m_dir; - - switch (m_predictor) - { - case PredictionScheme.None: - // no differencing - return true; - - case PredictionScheme.Horizontal: - if (td.td_bitspersample != 8 && - td.td_bitspersample != 16 && - td.td_bitspersample != 32) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "Horizontal differencing \"PredictionScheme\" not supported with {0}-bit samples", - td.td_bitspersample); - return false; - } - break; - - case PredictionScheme.FloatingPoint: - if (td.td_sampleformat != SampleFormat.IEEEFloat) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "Floating point \"PredictionScheme\" not supported with {0} data format", - td.td_sampleformat); - return false; - } - break; - - default: - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "\"PredictionScheme\" value {0} not supported", m_predictor); - return false; - } - - m_stride = (td.td_planarconfig == PlanarConfig.Contig ? (int)td.td_samplesperpixel : 1); - - // Calculate the scanline/tile-width size in bytes. - if (m_tif.IsTiled()) - m_rowSize = m_tif.TileRowSize(); - else - m_rowSize = m_tif.ScanlineSize(); - - return true; - } - } - #endregion - - #region CodecWithPredictorTagMethods - class CodecWithPredictorTagMethods : TiffTagMethods - { - public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) - { - CodecWithPredictor sp = tif.m_currentCodec as CodecWithPredictor; - Debug.Assert(sp != null); - - switch (tag) - { - case TiffTag.Predictor: - sp.SetPredictorValue((PredictionScheme)ap[0].ToByte()); - tif.setFieldBit(CodecWithPredictor.FIELD_PREDICTOR); - tif.m_flags |= TiffFlags.DirtyDirect; - return true; - } - - TiffTagMethods childMethods = sp.GetChildTagMethods(); - if (childMethods != null) - return childMethods.SetField(tif, tag, ap); - - return base.SetField(tif, tag, ap); - } - - public override FieldValue[] GetField(Tiff tif, TiffTag tag) - { - CodecWithPredictor sp = tif.m_currentCodec as CodecWithPredictor; - Debug.Assert(sp != null); - - switch (tag) - { - case TiffTag.Predictor: - FieldValue[] result = new FieldValue[1]; - result[0].Set(sp.GetPredictorValue()); - return result; - } - - TiffTagMethods childMethods = sp.GetChildTagMethods(); - if (childMethods != null) - return childMethods.GetField(tif, tag); - - return base.GetField(tif, tag); - } - - public override void PrintDir(Tiff tif, Stream fd, TiffPrintFlags flags) - { - CodecWithPredictor sp = tif.m_currentCodec as CodecWithPredictor; - Debug.Assert(sp != null); - - if (tif.fieldSet(CodecWithPredictor.FIELD_PREDICTOR)) - { - Tiff.fprintf(fd, " PredictionScheme: "); - PredictionScheme predictor = sp.GetPredictorValue(); - switch (predictor) - { - case PredictionScheme.None: - Tiff.fprintf(fd, "none "); - break; - case PredictionScheme.Horizontal: - Tiff.fprintf(fd, "horizontal differencing "); - break; - case PredictionScheme.FloatingPoint: - Tiff.fprintf(fd, "floating point predictor "); - break; - } - - Tiff.fprintf(fd, "{0} (0x{1:x})\r\n", predictor, predictor); - } - - TiffTagMethods childMethods = sp.GetChildTagMethods(); - if (childMethods != null) - childMethods.PrintDir(tif, fd, flags); - else - base.PrintDir(tif, fd, flags); - } - } - #endregion - - #region DeflateCodec - class DeflateCodec : CodecWithPredictor - { - public const int ZSTATE_INIT_DECODE = 0x01; - public const int ZSTATE_INIT_ENCODE = 0x02; - - public ZStream m_stream = new ZStream(); - public int m_zipquality; /* compression level */ - public int m_state; /* state flags */ - - private static TiffFieldInfo[] zipFieldInfo = - { - new TiffFieldInfo(TiffTag.ZIPQUALITY, 0, 0, TiffType.Any, FieldBit.Pseudo, true, false, ""), - }; - - private TiffTagMethods m_tagMethods; - - public DeflateCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - m_tagMethods = new DeflateCodecTagMethods(); - } - - public override bool Init() - { - Debug.Assert((m_scheme == Compression.Deflate) || - (m_scheme == Compression.AdobeDeflate)); - - /* - * Merge codec-specific tag information and - * override parent get/set field methods. - */ - m_tif.MergeFieldInfo(zipFieldInfo, zipFieldInfo.Length); - - /* Default values for codec-specific fields */ - m_zipquality = zlibConst.Z_DEFAULT_COMPRESSION; /* default comp. level */ - m_state = 0; - - /* - * Setup predictor setup. - */ - TIFFPredictorInit(m_tagMethods); - return true; - } - - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// - /// PreDecode is called after and before decoding. - /// - public override bool PreDecode(short plane) - { - return ZIPPreDecode(plane); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - return ZIPPreEncode(plane); - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public override bool PostEncode() - { - return ZIPPostEncode(); - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public override void Cleanup() - { - ZIPCleanup(); - } - - // CodecWithPredictor overrides - - public override bool predictor_setupdecode() - { - return ZIPSetupDecode(); - } - - public override bool predictor_decoderow(byte[] buffer, int offset, int count, short plane) - { - return ZIPDecode(buffer, offset, count, plane); - } - - public override bool predictor_decodestrip(byte[] buffer, int offset, int count, short plane) - { - return ZIPDecode(buffer, offset, count, plane); - } - - public override bool predictor_decodetile(byte[] buffer, int offset, int count, short plane) - { - return ZIPDecode(buffer, offset, count, plane); - } - - public override bool predictor_setupencode() - { - return ZIPSetupEncode(); - } - - public override bool predictor_encoderow(byte[] buffer, int offset, int count, short plane) - { - return ZIPEncode(buffer, offset, count, plane); - } - - public override bool predictor_encodestrip(byte[] buffer, int offset, int count, short plane) - { - return ZIPEncode(buffer, offset, count, plane); - } - - public override bool predictor_encodetile(byte[] buffer, int offset, int count, short plane) - { - return ZIPEncode(buffer, offset, count, plane); - } - - private void ZIPCleanup() - { - base.TIFFPredictorCleanup(); - - if ((m_state & ZSTATE_INIT_ENCODE) != 0) - { - m_stream.deflateEnd(); - m_state = 0; - } - else if ((m_state & ZSTATE_INIT_DECODE) != 0) - { - m_stream.inflateEnd(); - m_state = 0; - } - } - - private bool ZIPDecode(byte[] buffer, int offset, int count, short plane) - { - const string module = "ZIPDecode"; - - Debug.Assert(m_state == ZSTATE_INIT_DECODE); - m_stream.next_out = buffer; - m_stream.next_out_index = offset; - m_stream.avail_out = count; - do - { - int state = m_stream.inflate(zlibConst.Z_PARTIAL_FLUSH); - if (state == zlibConst.Z_STREAM_END) - break; - - if (state == zlibConst.Z_DATA_ERROR) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: Decoding error at scanline {1}, {2}", - m_tif.m_name, m_tif.m_row, m_stream.msg); - - if (m_stream.inflateSync() != zlibConst.Z_OK) - return false; - - continue; - } - - if (state != zlibConst.Z_OK) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: zlib error: {1}", m_tif.m_name, m_stream.msg); - return false; - } - } - while (m_stream.avail_out > 0); - - if (m_stream.avail_out != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: Not enough data at scanline {1} (short {2} bytes)", - m_tif.m_name, m_tif.m_row, m_stream.avail_out); - return false; - } - - return true; - } - - /// - /// Encode a chunk of pixels. - /// - private bool ZIPEncode(byte[] buffer, int offset, int count, short plane) - { - const string module = "ZIPEncode"; - - Debug.Assert(m_state == ZSTATE_INIT_ENCODE); - - m_stream.next_in = buffer; - m_stream.next_in_index = offset; - m_stream.avail_in = count; - do - { - if (m_stream.deflate(zlibConst.Z_NO_FLUSH) != zlibConst.Z_OK) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: Encoder error: {1}", m_tif.m_name, m_stream.msg); - return false; - } - - if (m_stream.avail_out == 0) - { - m_tif.m_rawcc = m_tif.m_rawdatasize; - m_tif.flushData1(); - m_stream.next_out = m_tif.m_rawdata; - m_stream.next_out_index = 0; - m_stream.avail_out = m_tif.m_rawdatasize; - } - } - while (m_stream.avail_in > 0); - - return true; - } - - /* - * Finish off an encoded strip by flushing the last - * string and tacking on an End Of Information code. - */ - private bool ZIPPostEncode() - { - const string module = "ZIPPostEncode"; - int state; - - m_stream.avail_in = 0; - do - { - state = m_stream.deflate(zlibConst.Z_FINISH); - switch (state) - { - case zlibConst.Z_STREAM_END: - case zlibConst.Z_OK: - if (m_stream.avail_out != m_tif.m_rawdatasize) - { - m_tif.m_rawcc = m_tif.m_rawdatasize - m_stream.avail_out; - m_tif.flushData1(); - m_stream.next_out = m_tif.m_rawdata; - m_stream.next_out_index = 0; - m_stream.avail_out = m_tif.m_rawdatasize; - } - break; - default: - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "{0}: zlib error: {1}", m_tif.m_name, m_stream.msg); - return false; - } - } - while (state != zlibConst.Z_STREAM_END); - - return true; - } - - /* - * Setup state for decoding a strip. - */ - private bool ZIPPreDecode(short s) - { - if ((m_state & ZSTATE_INIT_DECODE) == 0) - SetupDecode(); - - m_stream.next_in = m_tif.m_rawdata; - m_stream.next_in_index = 0; - m_stream.avail_in = m_tif.m_rawcc; - return (m_stream.inflateInit() == zlibConst.Z_OK); - } - - /* - * Reset encoding state at the start of a strip. - */ - private bool ZIPPreEncode(short s) - { - if (m_state != ZSTATE_INIT_ENCODE) - SetupEncode(); - - m_stream.next_out = m_tif.m_rawdata; - m_stream.next_out_index = 0; - m_stream.avail_out = m_tif.m_rawdatasize; - return (m_stream.deflateInit(m_zipquality) == zlibConst.Z_OK); - } - - private bool ZIPSetupDecode() - { - const string module = "ZIPSetupDecode"; - - /* if we were last encoding, terminate this mode */ - if ((m_state & ZSTATE_INIT_ENCODE) != 0) - { - m_stream.deflateEnd(); - m_state = 0; - } - - if (m_stream.inflateInit() != zlibConst.Z_OK) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "{0}: {1}", - m_tif.m_name, m_stream.msg); - return false; - } - - m_state |= ZSTATE_INIT_DECODE; - return true; - } - - private bool ZIPSetupEncode() - { - const string module = "ZIPSetupEncode"; - - if ((m_state & ZSTATE_INIT_DECODE) != 0) - { - m_stream.inflateEnd(); - m_state = 0; - } - - if (m_stream.deflateInit(m_zipquality) != zlibConst.Z_OK) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "{0}: {1}", - m_tif.m_name, m_stream.msg); - return false; - } - - m_state |= ZSTATE_INIT_ENCODE; - return true; - } - } - #endregion - - #region DeflateCodecTagMethods - class DeflateCodecTagMethods : TiffTagMethods - { - public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) - { - DeflateCodec sp = tif.m_currentCodec as DeflateCodec; - Debug.Assert(sp != null); - - const string module = "ZIPVSetField"; - - switch (tag) - { - case TiffTag.ZIPQUALITY: - sp.m_zipquality = ap[0].ToInt(); - if ((sp.m_state & DeflateCodec.ZSTATE_INIT_ENCODE) != 0) - { - if (sp.m_stream.deflateParams(sp.m_zipquality, zlibConst.Z_DEFAULT_STRATEGY) != zlibConst.Z_OK) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: zlib error: {0}", tif.m_name, sp.m_stream.msg); - return false; - } - } - - return true; - } - - return base.SetField(tif, tag, ap); - } - - public override FieldValue[] GetField(Tiff tif, TiffTag tag) - { - DeflateCodec sp = tif.m_currentCodec as DeflateCodec; - Debug.Assert(sp != null); - - switch (tag) - { - case TiffTag.ZIPQUALITY: - FieldValue[] result = new FieldValue[1]; - result[0].Set(sp.m_zipquality); - return result; - } - - return base.GetField(tif, tag); - } - } - #endregion - - #region DumpModeCodec - class DumpModeCodec : TiffCodec - { - public DumpModeCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - } - - public override bool Init() - { - return true; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - return DumpModeDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - return DumpModeDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - return DumpModeDecode(buffer, offset, count, plane); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - return DumpModeEncode(buffer, offset, count, plane); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - return DumpModeEncode(buffer, offset, count, plane); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - return DumpModeEncode(buffer, offset, count, plane); - } - - /// - /// Seeks the specified row in the strip being processed. - /// - /// The row to seek. - /// - /// true if specified row was successfully found; otherwise, false - /// - public override bool Seek(int row) - { - m_tif.m_rawcp += row * m_tif.m_scanlinesize; - m_tif.m_rawcc -= row * m_tif.m_scanlinesize; - return true; - } - - /// - /// Encode a hunk of pixels. - /// - private bool DumpModeEncode(byte[] buffer, int offset, int count, short plane) - { - while (count > 0) - { - int n = count; - if (m_tif.m_rawcc + n > m_tif.m_rawdatasize) - n = m_tif.m_rawdatasize - m_tif.m_rawcc; - - Debug.Assert(n > 0); - - Buffer.BlockCopy(buffer, offset, m_tif.m_rawdata, m_tif.m_rawcp, n); - m_tif.m_rawcp += n; - m_tif.m_rawcc += n; - - offset += n; - count -= n; - if (m_tif.m_rawcc >= m_tif.m_rawdatasize && !m_tif.flushData1()) - return false; - } - - return true; - } - - /// - /// Decode a hunk of pixels. - /// - private bool DumpModeDecode(byte[] buffer, int offset, int count, short plane) - { - if (m_tif.m_rawcc < count) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "DumpModeDecode: Not enough data for scanline {0}", m_tif.m_row); - return false; - } - - Buffer.BlockCopy(m_tif.m_rawdata, m_tif.m_rawcp, buffer, offset, count); - m_tif.m_rawcp += count; - m_tif.m_rawcc -= count; - return true; - } - } - #endregion - - #region FieldBit - /// - /// Field bits (flags) for tags. - /// - /// Field bits used to indicate fields that have been set in a directory, and to - /// reference fields when manipulating a directory. - public static class FieldBit - { - internal const int SetLongs = 4; - - ///////////////////////////////////////////////////////////////////////// - // multi-item fields - - internal const short ImageDimensions = 1; - internal const short TileDimensions = 2; - internal const short Resolution = 3; - internal const short Position = 4; - - ///////////////////////////////////////////////////////////////////////// - // single-item fields - - internal const short SubFileType = 5; - internal const short BitsPerSample = 6; - internal const short Compression = 7; - internal const short Photometric = 8; - internal const short Thresholding = 9; - internal const short FillOrder = 10; - internal const short Orientation = 15; - internal const short SamplesPerPixel = 16; - internal const short RowsPerStrip = 17; - internal const short MinSampleValue = 18; - internal const short MaxSampleValue = 19; - internal const short PlanarConfig = 20; - internal const short ResolutionUnit = 22; - internal const short PageNumber = 23; - internal const short StripByteCounts = 24; - internal const short StripOffsets = 25; - internal const short ColorMap = 26; - internal const short ExtraSamples = 31; - internal const short SampleFormat = 32; - internal const short SMinSampleValue = 33; - internal const short SMaxSampleValue = 34; - internal const short ImageDepth = 35; - internal const short TileDepth = 36; - internal const short HalftoneHints = 37; - internal const short YCbCrSubsampling = 39; - internal const short YCbCrPositioning = 40; - internal const short RefBlackWhite = 41; - internal const short TransferFunction = 44; - internal const short InkNames = 46; - internal const short SubIFD = 49; - - ///////////////////////////////////////////////////////////////////////// - // end of support for well-known tags; codec-private tags follow - - /// - /// This value is used to signify tags that are to be processed - /// but otherwise ignored.
- /// This permits antiquated tags to be quietly read and discarded. Note that - /// a bit is allocated for ignored tags; this is understood by the - /// directory reading logic which uses this fact to avoid special-case handling. - ///
- public const short Ignore = 0; - - /// - /// This value is used to signify pseudo-tags.
- /// Pseudo-tags don't normally need field bits since they are not - /// written to an output file (by definition). The library also has - /// express logic to always query a codec for a pseudo-tag so allocating - /// a field bit for one is a waste. If codec wants to promote the notion - /// of a pseudo-tag being set or unset then it can do using - /// internal state flags without polluting the field bit space defined - /// for real tags. - ///
- public const short Pseudo = 0; - - /// - /// This value is used to signify custom tags. - /// - public const short Custom = 65; - - /// - /// This value is used as a base (starting) value for codec-private tags. - /// - public const short Codec = 66; - - /// - /// Last usable value for field bit. All tags values should be less than this value. - /// - public const short Last = (32 * SetLongs - 1); - } - #endregion - - #region FieldValue - /// - /// Holds a value of a Tiff tag. - /// - /// - /// Simply put, it is a wrapper around System.Object, that helps to deal with - /// unboxing and conversion of types a bit easier. - /// - /// Please take a look at: - /// http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx - /// - public struct FieldValue - { - private object m_value; - - internal FieldValue(object o) - { - m_value = o; - } - - static internal FieldValue[] FromParams(params object[] list) - { - FieldValue[] values = new FieldValue[list.Length]; - for (int i = 0; i < list.Length; i++) - { - if (list[i] is FieldValue) - values[i] = new FieldValue(((FieldValue)(list[i])).Value); - else - values[i] = new FieldValue(list[i]); - } - - return values; - } - - internal void Set(object o) - { - m_value = o; - } - - /// - /// Gets the value. - /// - /// The value. - public object Value - { - get { return m_value; } - } - - /// - /// Retrieves value converted to byte. - /// - /// The value converted to byte. - public byte ToByte() - { - return Convert.ToByte(m_value); - } - - /// - /// Retrieves value converted to short. - /// - /// The value converted to short. - public short ToShort() - { - return Convert.ToInt16(m_value); - } - - /// - /// Retrieves value converted to ushort. - /// - /// The value converted to ushort. - public ushort ToUShort() - { - return Convert.ToUInt16(m_value); - } - - /// - /// Retrieves value converted to int. - /// - /// The value converted to int. - public int ToInt() - { - return Convert.ToInt32(m_value); - } - - /// - /// Retrieves value converted to uint. - /// - /// The value converted to uint. - public uint ToUInt() - { - return Convert.ToUInt32(m_value); - } - - /// - /// Retrieves value converted to float. - /// - /// The value converted to float. - public float ToFloat() - { - return Convert.ToSingle(m_value); - } - - /// - /// Retrieves value converted to double. - /// - /// The value converted to double. - public double ToDouble() - { - return Convert.ToDouble(m_value); - } - - /// - /// Retrieves value converted to string. - /// - /// - /// A that represents this instance. - /// - /// If value is a byte array, then it gets converted to string using - /// Latin1 encoding encoder. - public override string ToString() - { - if (m_value is byte[]) - return Tiff.Latin1Encoding.GetString(m_value as byte[]); - - return Convert.ToString(m_value); - } - - /// - /// Retrieves value converted to byte array. - /// - /// Value converted to byte array. - /// - /// If value is byte array then it retrieved unaltered. - /// If value is array of short, ushort, int, uint, float or double values then this - /// array is converted to byte array - /// If value is a string then it gets converted to byte array using Latin1 encoding - /// encoder. - /// If value is of any other type then null is returned. - /// - public byte[] GetBytes() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is byte[]) - return m_value as byte[]; - else if (m_value is short[]) - { - short[] temp = m_value as short[]; - byte[] result = new byte[temp.Length * sizeof(short)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - else if (m_value is ushort[]) - { - ushort[] temp = m_value as ushort[]; - byte[] result = new byte[temp.Length * sizeof(ushort)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - else if (m_value is int[]) - { - int[] temp = m_value as int[]; - byte[] result = new byte[temp.Length * sizeof(int)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - else if (m_value is uint[]) - { - uint[] temp = m_value as uint[]; - byte[] result = new byte[temp.Length * sizeof(uint)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - else if (m_value is float[]) - { - float[] temp = m_value as float[]; - byte[] result = new byte[temp.Length * sizeof(float)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - else if (m_value is double[]) - { - double[] temp = m_value as double[]; - byte[] result = new byte[temp.Length * sizeof(double)]; - Buffer.BlockCopy(temp, 0, result, 0, result.Length); - return result; - } - } - else if (m_value is string) - { - return Tiff.Latin1Encoding.GetBytes(m_value as string); - } - - return null; - } - - /// - /// Retrieves value converted to array of bytes. - /// - /// Value converted to array of bytes. - /// If value is array of bytes then it retrieved unaltered. - /// If value is array of short, ushort, int or uint values then each element of - /// field value gets converted to byte and added to resulting array. - /// If value is string then it gets converted to byte[] using Latin1 encoding - /// encoder. - /// If value is of any other type then null is returned. - public byte[] ToByteArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is byte[]) - return m_value as byte[]; - else if (m_value is short[]) - { - short[] temp = m_value as short[]; - byte[] result = new byte[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (byte)temp[i]; - - return result; - } - else if (m_value is ushort[]) - { - ushort[] temp = m_value as ushort[]; - byte[] result = new byte[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (byte)temp[i]; - - return result; - } - else if (m_value is int[]) - { - int[] temp = m_value as int[]; - byte[] result = new byte[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (byte)temp[i]; - - return result; - } - else if (m_value is uint[]) - { - uint[] temp = m_value as uint[]; - byte[] result = new byte[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (byte)temp[i]; - - return result; - } - } - else if (m_value is string) - return Tiff.Latin1Encoding.GetBytes(m_value as string); - - return null; - } - - /// - /// Retrieves value converted to array of short values. - /// - /// Value converted to array of short values. - /// If value is array of short values then it retrieved unaltered. - /// If value is array of bytes then each pair of bytes is converted to short and - /// added to resulting array. If value contains odd amount of bytes, then null is - /// returned. - /// If value is array of ushort, int or uint values then each element of field value gets - /// converted to short and added to resulting array. - /// If value is of any other type then null is returned. - public short[] ToShortArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is short[]) - return m_value as short[]; - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(short) != 0) - return null; - - int totalShorts = temp.Length / sizeof(short); - short[] result = new short[totalShorts]; - - int byteOffset = 0; - for (int i = 0; i < totalShorts; i++) - { - short s = BitConverter.ToInt16(temp, byteOffset); - result[i] = s; - byteOffset += sizeof(short); - } - - return result; - } - else if (m_value is ushort[]) - { - ushort[] temp = m_value as ushort[]; - short[] result = new short[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (short)temp[i]; - - return result; - } - else if (m_value is int[]) - { - int[] temp = m_value as int[]; - short[] result = new short[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (short)temp[i]; - - return result; - } - else if (m_value is uint[]) - { - uint[] temp = m_value as uint[]; - short[] result = new short[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (short)temp[i]; - - return result; - } - } - - return null; - } - - /// - /// Retrieves value converted to array of ushort values. - /// - /// Value converted to array of ushort values. - /// If value is array of ushort values then it retrieved unaltered. - /// If value is array of bytes then each pair of bytes is converted to ushort and - /// added to resulting array. If value contains odd amount of bytes, then null is - /// returned. - /// If value is array of short, int or uint values then each element of field value gets - /// converted to ushort and added to resulting array. - /// If value is of any other type then null is returned. - public ushort[] ToUShortArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is ushort[]) - return m_value as ushort[]; - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(ushort) != 0) - return null; - - int totalUShorts = temp.Length / sizeof(ushort); - ushort[] result = new ushort[totalUShorts]; - - int byteOffset = 0; - for (int i = 0; i < totalUShorts; i++) - { - ushort s = BitConverter.ToUInt16(temp, byteOffset); - result[i] = s; - byteOffset += sizeof(ushort); - } - - return result; - } - else if (m_value is short[]) - { - short[] temp = m_value as short[]; - ushort[] result = new ushort[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (ushort)temp[i]; - - return result; - } - else if (m_value is int[]) - { - int[] temp = m_value as int[]; - ushort[] result = new ushort[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (ushort)temp[i]; - - return result; - } - else if (m_value is uint[]) - { - uint[] temp = m_value as uint[]; - ushort[] result = new ushort[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (ushort)temp[i]; - - return result; - } - } - - return null; - } - - /// - /// Retrieves value converted to array of int values. - /// - /// Value converted to array of int values. - /// If value is array of int values then it retrieved unaltered. - /// If value is array of bytes then each 4 bytes are converted to int and added to - /// resulting array. If value contains amount of bytes that can't be divided by 4 without - /// remainder, then null is returned. - /// If value is array of short, ushort or uint values then each element of - /// field value gets converted to int and added to resulting array. - /// If value is of any other type then null is returned. - public int[] ToIntArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is int[]) - return m_value as int[]; - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(int) != 0) - return null; - - int totalInts = temp.Length / sizeof(int); - int[] result = new int[totalInts]; - - int byteOffset = 0; - for (int i = 0; i < totalInts; i++) - { - int s = BitConverter.ToInt32(temp, byteOffset); - result[i] = s; - byteOffset += sizeof(int); - } - - return result; - } - else if (m_value is short[]) - { - short[] temp = m_value as short[]; - int[] result = new int[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (int)temp[i]; - - return result; - } - else if (m_value is ushort[]) - { - ushort[] temp = m_value as ushort[]; - int[] result = new int[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (int)temp[i]; - - return result; - } - else if (m_value is uint[]) - { - uint[] temp = m_value as uint[]; - int[] result = new int[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (int)temp[i]; - - return result; - } - } - - return null; - } - - /// - /// Retrieves value converted to array of uint values. - /// - /// Value converted to array of uint values. - /// If value is array of uint values then it retrieved unaltered. - /// If value is array of bytes then each 4 bytes are converted to uint and added to - /// resulting array. If value contains amount of bytes that can't be divided by 4 without - /// remainder, then null is returned. - /// If value is array of short, ushort or int values then each element of - /// field value gets converted to uint and added to resulting array. - /// If value is of any other type then null is returned. - public uint[] ToUIntArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is uint[]) - return m_value as uint[]; - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(uint) != 0) - return null; - - int totalUInts = temp.Length / sizeof(uint); - uint[] result = new uint[totalUInts]; - - int byteOffset = 0; - for (int i = 0; i < totalUInts; i++) - { - uint s = BitConverter.ToUInt32(temp, byteOffset); - result[i] = s; - byteOffset += sizeof(uint); - } - - return result; - } - else if (m_value is short[]) - { - short[] temp = m_value as short[]; - uint[] result = new uint[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (uint)temp[i]; - - return result; - } - else if (m_value is ushort[]) - { - ushort[] temp = m_value as ushort[]; - uint[] result = new uint[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (uint)temp[i]; - - return result; - } - else if (m_value is int[]) - { - int[] temp = m_value as int[]; - uint[] result = new uint[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (uint)temp[i]; - - return result; - } - } - - return null; - } - - /// - /// Retrieves value converted to array of float values. - /// - /// Value converted to array of float values. - /// If value is array of float values then it retrieved unaltered. - /// If value is array of bytes then each 4 bytes are converted to float and added to - /// resulting array. If value contains amount of bytes that can't be divided by 4 without - /// remainder, then null is returned. - /// If value is array of double values then each element of field value gets - /// converted to float and added to resulting array. - /// If value is of any other type then null is returned. - public float[] ToFloatArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is float[]) - return m_value as float[]; - else if (m_value is double[]) - { - double[] temp = m_value as double[]; - float[] result = new float[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (float)temp[i]; - - return result; - } - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(float) != 0) - return null; - - int tempPos = 0; - - int floatCount = temp.Length / sizeof(float); - float[] result = new float[floatCount]; - - for (int i = 0; i < floatCount; i++) - { - float f = BitConverter.ToSingle(temp, tempPos); - result[i] = f; - tempPos += sizeof(float); - } - - return result; - } - } - - return null; - } - - /// - /// Retrieves value converted to array of double values. - /// - /// Value converted to array of double values. - /// If value is array of double values then it retrieved unaltered. - /// If value is array of bytes then each 8 bytes are converted to double and added to - /// resulting array. If value contains amount of bytes that can't be divided by 8 without - /// remainder, then null is returned. - /// If value is array of float values then each element of field value gets - /// converted to double and added to resulting array. - /// If value is of any other type then null is returned. - public double[] ToDoubleArray() - { - if (m_value == null) - return null; - - Type t = m_value.GetType(); - if (t.IsArray) - { - if (m_value is double[]) - return m_value as double[]; - else if (m_value is float[]) - { - float[] temp = m_value as float[]; - double[] result = new double[temp.Length]; - for (int i = 0; i < temp.Length; i++) - result[i] = (double)temp[i]; - - return result; - } - else if (m_value is byte[]) - { - byte[] temp = m_value as byte[]; - if (temp.Length % sizeof(double) != 0) - return null; - - int tempPos = 0; - - int floatCount = temp.Length / sizeof(double); - double[] result = new double[floatCount]; - - for (int i = 0; i < floatCount; i++) - { - double d = BitConverter.ToDouble(temp, tempPos); - result[i] = d; - tempPos += sizeof(double); - } - - return result; - } - } - - return null; - } - } - #endregion - - #region JpegCodec - class JpegCodec : TiffCodec - { - public const int FIELD_JPEGTABLES = (FieldBit.Codec + 0); - public const int FIELD_RECVPARAMS = (FieldBit.Codec + 1); - public const int FIELD_SUBADDRESS = (FieldBit.Codec + 2); - public const int FIELD_RECVTIME = (FieldBit.Codec + 3); - public const int FIELD_FAXDCS = (FieldBit.Codec + 4); - - internal JpegCompressor m_compression; - internal JpegDecompressor m_decompression; - internal JpegCommonBase m_common; - - internal int m_h_sampling; /* luminance sampling factors */ - internal int m_v_sampling; - - /* pseudo-tag fields */ - internal byte[] m_jpegtables; /* JPEGTables tag value, or null */ - internal int m_jpegtables_length; /* number of bytes in same */ - internal int m_jpegquality; /* Compression quality level */ - internal JpegColorMode m_jpegcolormode; /* Auto RGB<=>YCbCr convert? */ - internal JpegTablesMode m_jpegtablesmode; /* What to put in JPEGTables */ - - internal bool m_ycbcrsampling_fetched; - - internal int m_recvparams; /* encoded Class 2 session params */ - internal string m_subaddress; /* subaddress string */ - internal int m_recvtime; /* time spent receiving (secs) */ - internal string m_faxdcs; /* encoded fax parameters (DCS, Table 2/T.30) */ - - private static TiffFieldInfo[] jpegFieldInfo = - { - new TiffFieldInfo(TiffTag.JpegTables, -3, -3, TiffType.Undefined, FIELD_JPEGTABLES, false, true, "JPEGTables"), - new TiffFieldInfo(TiffTag.JPEGQUALITY, 0, 0, TiffType.Any, FieldBit.Pseudo, true, false, ""), - new TiffFieldInfo(TiffTag.JPEGCOLORMODE, 0, 0, TiffType.Any, FieldBit.Pseudo, false, false, ""), - new TiffFieldInfo(TiffTag.JPEGTABLESMODE, 0, 0, TiffType.Any, FieldBit.Pseudo, false, false, ""), - /* Specific for JPEG in faxes */ - new TiffFieldInfo(TiffTag.FAXRECVPARAMS, 1, 1, TiffType.Long, FIELD_RECVPARAMS, true, false, "FaxRecvParams"), - new TiffFieldInfo(TiffTag.FAXSUBADDRESS, -1, -1, TiffType.ASCII, FIELD_SUBADDRESS, true, false, "FaxSubAddress"), - new TiffFieldInfo(TiffTag.FAXRECVTIME, 1, 1, TiffType.Long, FIELD_RECVTIME, true, false, "FaxRecvTime"), - new TiffFieldInfo(TiffTag.FAXDCS, -1, -1, TiffType.ASCII, FIELD_FAXDCS, true, false, "FaxDcs"), - }; - - private bool m_rawDecode; - private bool m_rawEncode; - - private TiffTagMethods m_tagMethods; - private TiffTagMethods m_parentTagMethods; - - private bool m_cinfo_initialized; - - private Photometric m_photometric; /* copy of PhotometricInterpretation */ - - private int m_bytesperline; /* decompressed bytes per scanline */ - /* pointers to intermediate buffers when processing downsampled data */ - private byte[][][] m_ds_buffer = new byte[JpegConstants.MaxComponents][][]; - private int m_scancount; /* number of "scanlines" accumulated */ - private int m_samplesperclump; - - public JpegCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - m_tagMethods = new JpegCodecTagMethods(); - } - - public override bool Init() - { - Debug.Assert(m_scheme == Compression.JPEG); - - /* - * Merge codec-specific tag information and override parent get/set - * field methods. - */ - m_tif.MergeFieldInfo(jpegFieldInfo, jpegFieldInfo.Length); - - /* - * Allocate state block so tag methods have storage to record values. - */ - m_compression = null; - m_decompression = null; - m_photometric = 0; - m_h_sampling = 0; - m_v_sampling = 0; - m_bytesperline = 0; - m_scancount = 0; - m_samplesperclump = 0; - m_recvtime = 0; - - m_parentTagMethods = m_tif.m_tagmethods; - m_tif.m_tagmethods = m_tagMethods; - - /* Default values for codec-specific fields */ - m_jpegtables = null; - m_jpegtables_length = 0; - m_jpegquality = 75; /* Default IJG quality */ - m_jpegcolormode = JpegColorMode.RGB; - m_jpegtablesmode = JpegTablesMode.Quant | JpegTablesMode.Huff; - - m_recvparams = 0; - m_subaddress = null; - m_faxdcs = null; - - m_ycbcrsampling_fetched = false; - - m_rawDecode = false; - m_rawEncode = false; - m_tif.m_flags |= TiffFlags.NoBitRev; // no bit reversal, please - - m_cinfo_initialized = false; - - /* - ** Create a JPEGTables field if no directory has yet been created. - ** We do this just to ensure that sufficient space is reserved for - ** the JPEGTables field. It will be properly created the right - ** size later. - */ - if (m_tif.m_diroff == 0) - { - const int SIZE_OF_JPEGTABLES = 2000; - - // The following line assumes incorrectly that all JPEG-in-TIFF - // files will have a JpegTables tag generated and causes - // null-filled JpegTables tags to be written when the JPEG data - // is placed with WriteRawStrip. The field bit should be - // set, anyway, later when actual JpegTables header is - // generated, so removing it here hopefully is harmless. - // - // m_tif.setFieldBit(FIELD_JPEGTABLES); - // - - m_jpegtables_length = SIZE_OF_JPEGTABLES; - m_jpegtables = new byte[m_jpegtables_length]; - } - - /* - * Mark the YCBCRSAMPLES as present even if it is not - * see: JPEGFixupTestSubsampling(). - */ - m_tif.setFieldBit(FieldBit.YCbCrSubsampling); - return true; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - /// - /// Setups the decoder part of the codec. - /// - /// - /// true if this codec successfully setup its decoder part and can decode data; - /// otherwise, false. - /// - /// - /// SetupDecode is called once before - /// . - public override bool SetupDecode() - { - return JPEGSetupDecode(); - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// - /// PreDecode is called after and before decoding. - /// - public override bool PreDecode(short plane) - { - return JPEGPreDecode(plane); - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - if (m_rawDecode) - return JPEGDecodeRaw(buffer, offset, count, plane); - - return JPEGDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - if (m_rawDecode) - return JPEGDecodeRaw(buffer, offset, count, plane); - - return JPEGDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - if (m_rawDecode) - return JPEGDecodeRaw(buffer, offset, count, plane); - - return JPEGDecode(buffer, offset, count, plane); - } - - /// - /// Setups the encoder part of the codec. - /// - /// - /// true if this codec successfully setup its encoder part and can encode data; - /// otherwise, false. - /// - /// - /// SetupEncode is called once before - /// . - public override bool SetupEncode() - { - return JPEGSetupEncode(); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - return JPEGPreEncode(plane); - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public override bool PostEncode() - { - return JPEGPostEncode(); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - if (m_rawEncode) - return JPEGEncodeRaw(buffer, offset, count, plane); - - return JPEGEncode(buffer, offset, count, plane); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - if (m_rawEncode) - return JPEGEncodeRaw(buffer, offset, count, plane); - - return JPEGEncode(buffer, offset, count, plane); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - if (m_rawEncode) - return JPEGEncodeRaw(buffer, offset, count, plane); - - return JPEGEncode(buffer, offset, count, plane); - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public override void Cleanup() - { - JPEGCleanup(); - } - - /// - /// Calculates and/or constrains a strip size. - /// - /// The proposed strip size (may be zero or negative). - /// A strip size to use. - public override int DefStripSize(int size) - { - return JPEGDefaultStripSize(size); - } - - /// - /// Calculate and/or constrains a tile size - /// - /// The proposed tile width upon the call / tile width to use after the call. - /// The proposed tile height upon the call / tile height to use after the call. - public override void DefTileSize(ref int width, ref int height) - { - JPEGDefaultTileSize(ref width, ref height); - } - - /* - * The JPEG library initialized used to be done in TIFFInitJPEG(), but - * now that we allow a TIFF file to be opened in update mode it is necessary - * to have some way of deciding whether compression or decompression is - * desired other than looking at tif.tif_mode. We accomplish this by - * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry. - * If so, we assume decompression is desired. - * - * This is tricky, because TIFFInitJPEG() is called while the directory is - * being read, and generally speaking the BYTECOUNTS tag won't have been read - * at that point. So we try to defer jpeg library initialization till we - * do have that tag ... basically any access that might require the compressor - * or decompressor that occurs after the reading of the directory. - * - * In an ideal world compressors or decompressors would be setup - * at the point where a single tile or strip was accessed (for read or write) - * so that stuff like update of missing tiles, or replacement of tiles could - * be done. However, we aren't trying to crack that nut just yet ... - * - * NFW, Feb 3rd, 2003. - */ - public bool InitializeLibJPEG(bool force_encode, bool force_decode) - { - int[] byte_counts = null; - bool data_is_empty = true; - bool decompress; - - if (m_cinfo_initialized) - { - if (force_encode && m_common.IsDecompressor) - TIFFjpeg_destroy(); - else if (force_decode && !m_common.IsDecompressor) - TIFFjpeg_destroy(); - else - return true; - - m_cinfo_initialized = false; - } - - /* - * Do we have tile data already? Make sure we initialize the - * the state in decompressor mode if we have tile data, even if we - * are not in read-only file access mode. - */ - FieldValue[] result = m_tif.GetField(TiffTag.TileByteCounts); - if (m_tif.IsTiled() && result != null) - { - byte_counts = result[0].ToIntArray(); - if (byte_counts != null) - data_is_empty = byte_counts[0] == 0; - } - - result = m_tif.GetField(TiffTag.StripByteCounts); - if (!m_tif.IsTiled() && result != null) - { - byte_counts = result[0].ToIntArray(); - if (byte_counts != null) - data_is_empty = byte_counts[0] == 0; - } - - if (force_decode) - decompress = true; - else if (force_encode) - decompress = false; - else if (m_tif.m_mode == Tiff.O_RDONLY) - decompress = true; - else if (data_is_empty) - decompress = false; - else - decompress = true; - - // Initialize LibJpeg.Net - if (decompress) - { - if (!TIFFjpeg_create_decompress()) - return false; - } - else - { - if (!TIFFjpeg_create_compress()) - return false; - } - - m_cinfo_initialized = true; - return true; - } - - public Tiff GetTiff() - { - return m_tif; - } - - public void JPEGResetUpsampled() - { - /* - * Mark whether returned data is up-sampled or not so TIFFStripSize - * and TIFFTileSize return values that reflect the true amount of - * data. - */ - m_tif.m_flags &= ~TiffFlags.UpSampled; - if (m_tif.m_dir.td_planarconfig == PlanarConfig.Contig) - { - if (m_tif.m_dir.td_photometric == Photometric.YCBCR && m_jpegcolormode == JpegColorMode.RGB) - m_tif.m_flags |= TiffFlags.UpSampled; - } - - /* - * Must recalculate cached tile size in case sampling state changed. - * Should we really be doing this now if image size isn't set? - */ - if (m_tif.m_tilesize > 0) - m_tif.m_tilesize = m_tif.IsTiled() ? m_tif.TileSize() : -1; - - if (m_tif.m_scanlinesize > 0) - m_tif.m_scanlinesize = m_tif.ScanlineSize(); - } - - /// - /// Set encoding state at the start of a strip or tile. - /// - private bool JPEGPreEncode(short s) - { - const string module = "JPEGPreEncode"; - int segment_width; - int segment_height; - bool downsampled_input; - - Debug.Assert(!m_common.IsDecompressor); - /* - * Set encoding parameters for this strip/tile. - */ - if (m_tif.IsTiled()) - { - segment_width = m_tif.m_dir.td_tilewidth; - segment_height = m_tif.m_dir.td_tilelength; - m_bytesperline = m_tif.TileRowSize(); - } - else - { - segment_width = m_tif.m_dir.td_imagewidth; - segment_height = m_tif.m_dir.td_imagelength - m_tif.m_row; - if (segment_height > m_tif.m_dir.td_rowsperstrip) - segment_height = m_tif.m_dir.td_rowsperstrip; - m_bytesperline = m_tif.oldScanlineSize(); - } - if (m_tif.m_dir.td_planarconfig == PlanarConfig.Separate && s > 0) - { - /* for PC 2, scale down the strip/tile size - * to match a downsampled component - */ - segment_width = Tiff.howMany(segment_width, m_h_sampling); - segment_height = Tiff.howMany(segment_height, m_v_sampling); - } - - if (segment_width > 65535 || segment_height > 65535) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Strip/tile too large for JPEG"); - return false; - } - - m_compression.Image_width = segment_width; - m_compression.Image_height = segment_height; - downsampled_input = false; - - if (m_tif.m_dir.td_planarconfig == PlanarConfig.Contig) - { - m_compression.Input_components = m_tif.m_dir.td_samplesperpixel; - if (m_photometric == Photometric.YCBCR) - { - if (m_jpegcolormode == JpegColorMode.RGB) - { - m_compression.In_color_space = ColorSpace.RGB; - } - else - { - m_compression.In_color_space = ColorSpace.YCbCr; - if (m_h_sampling != 1 || m_v_sampling != 1) - downsampled_input = true; - } - - if (!TIFFjpeg_set_colorspace(ColorSpace.YCbCr)) - return false; - - /* - * Set Y sampling factors; - * we assume jpeg_set_colorspace() set the rest to 1 - */ - m_compression.Component_info[0].H_samp_factor = m_h_sampling; - m_compression.Component_info[0].V_samp_factor = m_v_sampling; - } - else - { - m_compression.In_color_space = ColorSpace.Unknown; - if (!TIFFjpeg_set_colorspace(ColorSpace.Unknown)) - return false; - /* jpeg_set_colorspace set all sampling factors to 1 */ - } - } - else - { - m_compression.Input_components = 1; - m_compression.In_color_space = ColorSpace.Unknown; - if (!TIFFjpeg_set_colorspace(ColorSpace.Unknown)) - return false; - - m_compression.Component_info[0].Component_id = s; - /* jpeg_set_colorspace() set sampling factors to 1 */ - if (m_photometric == Photometric.YCBCR && s > 0) - { - m_compression.Component_info[0].Quant_tbl_no = 1; - m_compression.Component_info[0].Dc_tbl_no = 1; - m_compression.Component_info[0].Ac_tbl_no = 1; - } - } - - // ensure LibJpeg.Net won't write any extraneous markers - m_compression.Write_JFIF_header = false; - m_compression.Write_Adobe_marker = false; - - /* set up table handling correctly */ - if (!TIFFjpeg_set_quality(m_jpegquality, false)) - return false; - - if ((m_jpegtablesmode & JpegTablesMode.Quant) == 0) - { - unsuppress_quant_table(0); - unsuppress_quant_table(1); - } - - if ((m_jpegtablesmode & JpegTablesMode.Huff) != 0) - m_compression.Optimize_coding = false; - else - m_compression.Optimize_coding = true; - - if (downsampled_input) - { - // Need to use raw-data interface to LibJpeg.Net - m_compression.Raw_data_in = true; - m_rawEncode = true; - } - else - { - // Use normal interface to LibJpeg.Net - m_compression.Raw_data_in = false; - m_rawEncode = false; - } - - /* Start JPEG compressor */ - if (!TIFFjpeg_start_compress(false)) - return false; - - /* Allocate downsampled-data buffers if needed */ - if (downsampled_input) - { - if (!alloc_downsampled_buffers(m_compression.Component_info, m_compression.Num_components)) - return false; - } - - m_scancount = 0; - return true; - } - - private bool JPEGSetupEncode() - { - const string module = "JPEGSetupEncode"; - - InitializeLibJPEG(true, false); - - Debug.Assert(!m_common.IsDecompressor); - - /* - * Initialize all JPEG parameters to default values. - * Note that jpeg_set_defaults needs legal values for - * in_color_space and input_components. - */ - m_compression.In_color_space = ColorSpace.Unknown; - m_compression.Input_components = 1; - if (!TIFFjpeg_set_defaults()) - return false; - - /* Set per-file parameters */ - m_photometric = m_tif.m_dir.td_photometric; - switch (m_photometric) - { - case Photometric.YCBCR: - m_h_sampling = m_tif.m_dir.td_ycbcrsubsampling[0]; - m_v_sampling = m_tif.m_dir.td_ycbcrsubsampling[1]; - /* - * A ReferenceBlackWhite field *must* be present since the - * default value is inappropriate for YCbCr. Fill in the - * proper value if application didn't set it. - */ - FieldValue[] result = m_tif.GetField(TiffTag.REFERENCEBLACKWHITE); - if (result == null) - { - float[] refbw = new float[6]; - int top = 1 << m_tif.m_dir.td_bitspersample; - refbw[0] = 0; - refbw[1] = (float)(top - 1L); - refbw[2] = (float)(top >> 1); - refbw[3] = refbw[1]; - refbw[4] = refbw[2]; - refbw[5] = refbw[1]; - m_tif.SetField(TiffTag.REFERENCEBLACKWHITE, refbw); - } - break; - - /* disallowed by Tech Note */ - case Photometric.Palette: - case Photometric.Mask: - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "PhotometricInterpretation {0} not allowed for JPEG", m_photometric); - return false; - - default: - /* TIFF 6.0 forbids subsampling of all other color spaces */ - m_h_sampling = 1; - m_v_sampling = 1; - break; - } - - /* Verify miscellaneous parameters */ - - // This would need work if LibTiff.Net ever supports different - // depths for different components, or if LibJpeg.Net ever supports - // run-time selection of depth. Neither is imminent. - if (m_tif.m_dir.td_bitspersample != JpegConstants.BitsInSample) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "BitsPerSample {0} not allowed for JPEG", m_tif.m_dir.td_bitspersample); - return false; - } - - m_compression.Data_precision = m_tif.m_dir.td_bitspersample; - if (m_tif.IsTiled()) - { - if ((m_tif.m_dir.td_tilelength % (m_v_sampling * JpegConstants.DCTSize)) != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "JPEG tile height must be multiple of {0}", m_v_sampling * JpegConstants.DCTSize); - return false; - } - - if ((m_tif.m_dir.td_tilewidth % (m_h_sampling * JpegConstants.DCTSize)) != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "JPEG tile width must be multiple of {0}", m_h_sampling * JpegConstants.DCTSize); - return false; - } - } - else - { - if (m_tif.m_dir.td_rowsperstrip < m_tif.m_dir.td_imagelength && - (m_tif.m_dir.td_rowsperstrip % (m_v_sampling * JpegConstants.DCTSize)) != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "RowsPerStrip must be multiple of {0} for JPEG", m_v_sampling * JpegConstants.DCTSize); - return false; - } - } - - /* Create a JPEGTables field if appropriate */ - if ((m_jpegtablesmode & (JpegTablesMode.Quant | JpegTablesMode.Huff)) != 0) - { - bool startsWithZeroes = true; - if (m_jpegtables != null) - { - for (int i = 0; i < 8; i++) - { - if (m_jpegtables[i] != 0) - { - startsWithZeroes = false; - break; - } - } - } - else - { - startsWithZeroes = false; - } - - if (m_jpegtables == null || startsWithZeroes) - { - if (!prepare_JPEGTables()) - return false; - - /* Mark the field present */ - /* Can't use TIFFSetField since BeenWriting is already set! */ - m_tif.m_flags |= TiffFlags.DirtyDirect; - m_tif.setFieldBit(FIELD_JPEGTABLES); - } - } - else - { - /* We do not support application-supplied JPEGTables, */ - /* so mark the field not present */ - m_tif.clearFieldBit(FIELD_JPEGTABLES); - } - - /* Direct LibJpeg.Net output to LibTiff.Net's output buffer */ - TIFFjpeg_data_dest(); - - return true; - } - - /// - /// Finish up at the end of a strip or tile. - /// - /// - private bool JPEGPostEncode() - { - if (m_scancount > 0) - { - // Need to emit a partial bufferload of downsampled data. Pad the data vertically. - for (int ci = 0; ci < m_compression.Num_components; ci++) - { - int vsamp = m_compression.Component_info[ci].V_samp_factor; - int row_width = m_compression.Component_info[ci].Width_in_blocks * JpegConstants.DCTSize * sizeof(byte); - for (int ypos = m_scancount * vsamp; ypos < JpegConstants.DCTSize * vsamp; ypos++) - Buffer.BlockCopy(m_ds_buffer[ci][ypos - 1], 0, m_ds_buffer[ci][ypos], 0, row_width); - } - - int n = m_compression.Max_v_samp_factor * JpegConstants.DCTSize; - if (TIFFjpeg_write_raw_data(m_ds_buffer, n) != n) - return false; - } - - return TIFFjpeg_finish_compress(); - } - - private void JPEGCleanup() - { - m_tif.m_tagmethods = m_parentTagMethods; - - if (m_cinfo_initialized) - { - // release LibJpeg.Net resources - TIFFjpeg_destroy(); - } - } - - /* - * JPEG Decoding. - */ - - /* - * Set up for decoding a strip or tile. - */ - private bool JPEGPreDecode(short s) - { - TiffDirectory td = m_tif.m_dir; - const string module = "JPEGPreDecode"; - int segment_width; - int segment_height; - int ci; - - Debug.Assert(m_common.IsDecompressor); - - /* - * Reset decoder state from any previous strip/tile, - * in case application didn't read the whole strip. - */ - if (!TIFFjpeg_abort()) - return false; - - /* - * Read the header for this strip/tile. - */ - if (TIFFjpeg_read_header(true) != ReadResult.Header_Ok) - return false; - - /* - * Check image parameters and set decompression parameters. - */ - segment_width = td.td_imagewidth; - segment_height = td.td_imagelength - m_tif.m_row; - if (m_tif.IsTiled()) - { - segment_width = td.td_tilewidth; - segment_height = td.td_tilelength; - m_bytesperline = m_tif.TileRowSize(); - } - else - { - if (segment_height > td.td_rowsperstrip) - segment_height = td.td_rowsperstrip; - m_bytesperline = m_tif.oldScanlineSize(); - } - - if (td.td_planarconfig == PlanarConfig.Separate && s > 0) - { - /* - * For PC 2, scale down the expected strip/tile size - * to match a downsampled component - */ - segment_width = Tiff.howMany(segment_width, m_h_sampling); - segment_height = Tiff.howMany(segment_height, m_v_sampling); - } - - if (m_decompression.Image_width < segment_width || m_decompression.Image_height < segment_height) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Improper JPEG strip/tile size, expected {0}x{1}, got {2}x{3}", - segment_width, segment_height, m_decompression.Image_width, m_decompression.Image_height); - } - - if (m_decompression.Image_width > segment_width || m_decompression.Image_height > segment_height) - { - /* - * This case could be dangerous, if the strip or tile size has - * been reported as less than the amount of data jpeg will - * return, some potential security issues arise. Catch this - * case and error out. - */ - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "JPEG strip/tile size exceeds expected dimensions, expected {0}x{1}, got {2}x{3}", - segment_width, segment_height, m_decompression.Image_width, m_decompression.Image_height); - return false; - } - - if (m_decompression.Num_components != (td.td_planarconfig == PlanarConfig.Contig ? (int)td.td_samplesperpixel : 1)) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Improper JPEG component count"); - return false; - } - - if (m_decompression.Data_precision != td.td_bitspersample) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Improper JPEG data precision"); - return false; - } - - if (td.td_planarconfig == PlanarConfig.Contig) - { - /* Component 0 should have expected sampling factors */ - if (m_decompression.Comp_info[0].H_samp_factor != m_h_sampling || - m_decompression.Comp_info[0].V_samp_factor != m_v_sampling) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Improper JPEG sampling factors {0},{1}\nApparently should be {2},{3}.", - m_decompression.Comp_info[0].H_samp_factor, - m_decompression.Comp_info[0].V_samp_factor, m_h_sampling, m_v_sampling); - - /* - * There are potential security issues here - * for decoders that have already allocated - * buffers based on the expected sampling - * factors. Lets check the sampling factors - * dont exceed what we were expecting. - */ - if (m_decompression.Comp_info[0].H_samp_factor > m_h_sampling || - m_decompression.Comp_info[0].V_samp_factor > m_v_sampling) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "Cannot honour JPEG sampling factors that exceed those specified."); - return false; - } - - /* - * XXX: Files written by the Intergraph software - * has different sampling factors stored in the - * TIFF tags and in the JPEG structures. We will - * try to deduce Intergraph files by the presense - * of the tag 33918. - */ - if (m_tif.FindFieldInfo((TiffTag)33918, TiffType.Any) == null) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Decompressor will try reading with sampling {0},{1}.", - m_decompression.Comp_info[0].H_samp_factor, - m_decompression.Comp_info[0].V_samp_factor); - - m_h_sampling = m_decompression.Comp_info[0].H_samp_factor; - m_v_sampling = m_decompression.Comp_info[0].V_samp_factor; - } - } - - /* Rest should have sampling factors 1,1 */ - for (ci = 1; ci < m_decompression.Num_components; ci++) - { - if (m_decompression.Comp_info[ci].H_samp_factor != 1 || - m_decompression.Comp_info[ci].V_samp_factor != 1) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Improper JPEG sampling factors"); - return false; - } - } - } - else - { - /* PC 2's single component should have sampling factors 1,1 */ - if (m_decompression.Comp_info[0].H_samp_factor != 1 || - m_decompression.Comp_info[0].V_samp_factor != 1) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Improper JPEG sampling factors"); - return false; - } - } - - bool downsampled_output = false; - if (td.td_planarconfig == PlanarConfig.Contig && - m_photometric == Photometric.YCBCR && - m_jpegcolormode == JpegColorMode.RGB) - { - /* Convert YCbCr to RGB */ - m_decompression.Jpeg_color_space = ColorSpace.YCbCr; - m_decompression.Out_color_space = ColorSpace.RGB; - } - else - { - /* Suppress colorspace handling */ - m_decompression.Jpeg_color_space = ColorSpace.Unknown; - m_decompression.Out_color_space = ColorSpace.Unknown; - if (td.td_planarconfig == PlanarConfig.Contig && - (m_h_sampling != 1 || m_v_sampling != 1)) - { - downsampled_output = true; - } - /* XXX what about up-sampling? */ - } - - if (downsampled_output) - { - // Need to use raw-data interface to LibJpeg.Net - m_decompression.Raw_data_out = true; - m_rawDecode = true; - } - else - { - // Use normal interface to LibJpeg.Net - m_decompression.Raw_data_out = false; - m_rawDecode = false; - } - - /* Start JPEG decompressor */ - if (!TIFFjpeg_start_decompress()) - return false; - - /* Allocate downsampled-data buffers if needed */ - if (downsampled_output) - { - if (!alloc_downsampled_buffers(m_decompression.Comp_info, m_decompression.Num_components)) - return false; - - m_scancount = JpegConstants.DCTSize; /* mark buffer empty */ - } - - return true; - } - - private bool prepare_JPEGTables() - { - InitializeLibJPEG(false, false); - - /* Initialize quant tables for current quality setting */ - if (!TIFFjpeg_set_quality(m_jpegquality, false)) - return false; - - /* Mark only the tables we want for output */ - /* NB: chrominance tables are currently used only with YCbCr */ - if (!TIFFjpeg_suppress_tables(true)) - return false; - - if ((m_jpegtablesmode & JpegTablesMode.Quant) != 0) - { - unsuppress_quant_table(0); - if (m_photometric == Photometric.YCBCR) - unsuppress_quant_table(1); - } - - if ((m_jpegtablesmode & JpegTablesMode.Huff) != 0) - { - unsuppress_huff_table(0); - if (m_photometric == Photometric.YCBCR) - unsuppress_huff_table(1); - } - - // Direct LibJpeg.Net output into jpegtables - if (!TIFFjpeg_tables_dest()) - return false; - - /* Emit tables-only datastream */ - if (!TIFFjpeg_write_tables()) - return false; - - return true; - } - - private bool JPEGSetupDecode() - { - TiffDirectory td = m_tif.m_dir; - - InitializeLibJPEG(false, true); - - Debug.Assert(m_common.IsDecompressor); - - /* Read JPEGTables if it is present */ - if (m_tif.fieldSet(FIELD_JPEGTABLES)) - { - m_decompression.Src = new JpegTablesSource(this); - if (TIFFjpeg_read_header(false) != ReadResult.Header_Tables_Only) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field"); - return false; - } - } - - /* Grab parameters that are same for all strips/tiles */ - m_photometric = td.td_photometric; - switch (m_photometric) - { - case Photometric.YCBCR: - m_h_sampling = td.td_ycbcrsubsampling[0]; - m_v_sampling = td.td_ycbcrsubsampling[1]; - break; - default: - /* TIFF 6.0 forbids subsampling of all other color spaces */ - m_h_sampling = 1; - m_v_sampling = 1; - break; - } - - /* Set up for reading normal data */ - m_decompression.Src = new JpegStdSource(this); - m_tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmNone; /* override byte swapping */ - return true; - } - - private int TIFFjpeg_read_scanlines(byte[][] scanlines, int max_lines) - { - int n = 0; - try - { - n = m_decompression.jpeg_read_scanlines(scanlines, max_lines); - } - catch (Exception) - { - return -1; - } - - return n; - } - - /// - /// Decode a chunk of pixels. - /// "Standard" case: returned data is not downsampled. - /// - private bool JPEGDecode(byte[] buffer, int offset, int count, short plane) - { - int nrows = count / m_bytesperline; - if ((count % m_bytesperline) != 0) - Tiff.WarningExt(m_tif, m_tif.m_clientdata, m_tif.m_name, "fractional scanline not read"); - - if (nrows > (int)m_decompression.Image_height) - nrows = m_decompression.Image_height; - - // data is expected to be read in multiples of a scanline - if (nrows != 0) - { - byte[][] bufptr = new byte[1][]; - bufptr[0] = new byte[m_bytesperline]; - do - { - // In the 8bit case. We read directly into the TIFF buffer. - Array.Clear(bufptr[0], 0, m_bytesperline); - if (TIFFjpeg_read_scanlines(bufptr, 1) != 1) - return false; - - ++m_tif.m_row; - Buffer.BlockCopy(bufptr[0], 0, buffer, offset, m_bytesperline); - offset += m_bytesperline; - count -= m_bytesperline; - } - while (--nrows > 0); - } - - // Close down the decompressor if we've finished the strip or tile. - return m_decompression.Output_scanline < m_decompression.Output_height || TIFFjpeg_finish_decompress(); - } - - /// - /// Decode a chunk of pixels. - /// Returned data is downsampled per sampling factors. - /// - private bool JPEGDecodeRaw(byte[] buffer, int offset, int count, short plane) - { - // data is expected to be read in multiples of a scanline - int nrows = m_decompression.Image_height; - if (nrows != 0) - { - // Cb,Cr both have sampling factors 1, so this is correct - int clumps_per_line = m_decompression.Comp_info[1].Downsampled_width; - - do - { - // Reload downsampled-data buffer if needed - if (m_scancount >= JpegConstants.DCTSize) - { - int n = m_decompression.Max_v_samp_factor * JpegConstants.DCTSize; - if (TIFFjpeg_read_raw_data(m_ds_buffer, n) != n) - return false; - - m_scancount = 0; - } - - // Fastest way to unseparate data is to make one pass over the scanline for - // each row of each component. - int clumpoffset = 0; // first sample in clump - for (int ci = 0; ci < m_decompression.Num_components; ci++) - { - int hsamp = m_decompression.Comp_info[ci].H_samp_factor; - int vsamp = m_decompression.Comp_info[ci].V_samp_factor; - - for (int ypos = 0; ypos < vsamp; ypos++) - { - byte[] inBuf = m_ds_buffer[ci][m_scancount * vsamp + ypos]; - int inptr = 0; - - int outptr = offset + clumpoffset; - if (outptr >= buffer.Length) - break; - - if (hsamp == 1) - { - // fast path for at least Cb and Cr - for (int nclump = clumps_per_line; nclump-- > 0; ) - { - buffer[outptr] = inBuf[inptr]; - inptr++; - outptr += m_samplesperclump; - } - } - else - { - // general case - for (int nclump = clumps_per_line; nclump-- > 0; ) - { - for (int xpos = 0; xpos < hsamp; xpos++) - { - buffer[outptr + xpos] = inBuf[inptr]; - inptr++; - } - - outptr += m_samplesperclump; - } - } - - clumpoffset += hsamp; - } - } - - ++m_scancount; - m_tif.m_row += m_v_sampling; - - // increment/decrement of buffer and count is still incorrect, but should not matter - // TODO: resolve this - offset += m_bytesperline; - count -= m_bytesperline; - nrows -= m_v_sampling; - } - while (nrows > 0); - } - - // Close down the decompressor if done. - return m_decompression.Output_scanline < m_decompression.Output_height || TIFFjpeg_finish_decompress(); - } - - /// - /// Encode a chunk of pixels. - /// "Standard" case: incoming data is not downsampled. - /// - private bool JPEGEncode(byte[] buffer, int offset, int count, short plane) - { - // data is expected to be supplied in multiples of a scanline - int nrows = count / m_bytesperline; - if ((count % m_bytesperline) != 0) - Tiff.WarningExt(m_tif, m_tif.m_clientdata, m_tif.m_name, "fractional scanline discarded"); - - // The last strip will be limited to image size - if (!m_tif.IsTiled() && m_tif.m_row + nrows > m_tif.m_dir.td_imagelength) - nrows = m_tif.m_dir.td_imagelength - m_tif.m_row; - - byte[][] bufptr = new byte[1][]; - bufptr[0] = new byte[m_bytesperline]; - while (nrows-- > 0) - { - Buffer.BlockCopy(buffer, offset, bufptr[0], 0, m_bytesperline); - if (TIFFjpeg_write_scanlines(bufptr, 1) != 1) - return false; - - if (nrows > 0) - m_tif.m_row++; - - offset += m_bytesperline; - } - - return true; - } - - /// - /// Encode a chunk of pixels. - /// Incoming data is expected to be downsampled per sampling factors. - /// - private bool JPEGEncodeRaw(byte[] buffer, int offset, int count, short plane) - { - // data is expected to be supplied in multiples of a clumpline - // a clumpline is equivalent to v_sampling desubsampled scanlines - - // TODO: the following calculation of bytesperclumpline, should substitute - // calculation of bytesperline, except that it is per v_sampling lines - int bytesperclumpline = (((m_compression.Image_width + m_h_sampling - 1) / m_h_sampling) * - (m_h_sampling * m_v_sampling + 2) * m_compression.Data_precision + 7) / 8; - - int nrows = (count / bytesperclumpline) * m_v_sampling; - if ((count % bytesperclumpline) != 0) - Tiff.WarningExt(m_tif, m_tif.m_clientdata, m_tif.m_name, "fractional scanline discarded"); - - // Cb,Cr both have sampling factors 1, so this is correct - int clumps_per_line = m_compression.Component_info[1].Downsampled_width; - - while (nrows > 0) - { - // Fastest way to separate the data is to make one pass over the scanline for - // each row of each component. - int clumpoffset = 0; // first sample in clump - for (int ci = 0; ci < m_compression.Num_components; ci++) - { - JpegComponent compptr = m_compression.Component_info[ci]; - int hsamp = compptr.H_samp_factor; - int vsamp = compptr.V_samp_factor; - int padding = compptr.Width_in_blocks * JpegConstants.DCTSize - clumps_per_line * hsamp; - for (int ypos = 0; ypos < vsamp; ypos++) - { - int inptr = offset + clumpoffset; - - byte[] outbuf = m_ds_buffer[ci][m_scancount * vsamp + ypos]; - int outptr = 0; - - if (hsamp == 1) - { - // fast path for at least Cb and Cr - for (int nclump = clumps_per_line; nclump-- > 0; ) - { - outbuf[outptr] = buffer[inptr]; - outptr++; - inptr += m_samplesperclump; - } - } - else - { - // general case - for (int nclump = clumps_per_line; nclump-- > 0; ) - { - for (int xpos = 0; xpos < hsamp; xpos++) - { - outbuf[outptr] = buffer[inptr + xpos]; - outptr++; - } - - inptr += m_samplesperclump; - } - } - - // pad each scanline as needed - for (int xpos = 0; xpos < padding; xpos++) - { - outbuf[outptr] = outbuf[outptr - 1]; - outptr++; - } - - clumpoffset += hsamp; - } - } - - m_scancount++; - if (m_scancount >= JpegConstants.DCTSize) - { - int n = m_compression.Max_v_samp_factor * JpegConstants.DCTSize; - if (TIFFjpeg_write_raw_data(m_ds_buffer, n) != n) - return false; - - m_scancount = 0; - } - - m_tif.m_row += m_v_sampling; - offset += m_bytesperline; - nrows -= m_v_sampling; - } - - return true; - } - - private int JPEGDefaultStripSize(int s) - { - s = base.DefStripSize(s); - if (s < m_tif.m_dir.td_imagelength) - s = Tiff.roundUp(s, m_tif.m_dir.td_ycbcrsubsampling[1] * JpegConstants.DCTSize); - - return s; - } - - private void JPEGDefaultTileSize(ref int tw, ref int th) - { - base.DefTileSize(ref tw, ref th); - tw = Tiff.roundUp(tw, m_tif.m_dir.td_ycbcrsubsampling[0] * JpegConstants.DCTSize); - th = Tiff.roundUp(th, m_tif.m_dir.td_ycbcrsubsampling[1] * JpegConstants.DCTSize); - } - - /* - * Interface routines. This layer of routines exists - * primarily to limit side-effects from LibJpeg.Net exceptions. - * Also, normal/error returns are converted into return - * values per LibTiff.Net practice. - */ - private bool TIFFjpeg_create_compress() - { - /* initialize JPEG error handling */ - try - { - m_compression = new JpegCompressor(); - m_common = m_compression; - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_create_decompress() - { - /* initialize JPEG error handling */ - try - { - m_decompression = new JpegDecompressor(); - m_common = m_decompression; - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_set_defaults() - { - try - { - m_compression.jpeg_set_defaults(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_set_colorspace(ColorSpace colorspace) - { - try - { - m_compression.jpeg_set_colorspace(colorspace); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_set_quality(int quality, bool force_baseline) - { - try - { - m_compression.jpeg_set_quality(quality, force_baseline); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_suppress_tables(bool suppress) - { - try - { - m_compression.jpeg_suppress_tables(suppress); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_start_compress(bool write_all_tables) - { - try - { - m_compression.jpeg_start_compress(write_all_tables); - } - catch (Exception) - { - return false; - } - - return true; - } - - private int TIFFjpeg_write_scanlines(byte[][] scanlines, int num_lines) - { - int n = 0; - try - { - n = m_compression.jpeg_write_scanlines(scanlines, num_lines); - } - catch (Exception) - { - return -1; - } - - return n; - } - - private int TIFFjpeg_write_raw_data(byte[][][] data, int num_lines) - { - int n = 0; - try - { - n = m_compression.jpeg_write_raw_data(data, num_lines); - } - catch (Exception) - { - return -1; - } - - return n; - } - - private bool TIFFjpeg_finish_compress() - { - try - { - m_compression.jpeg_finish_compress(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_write_tables() - { - try - { - m_compression.jpeg_write_tables(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private ReadResult TIFFjpeg_read_header(bool require_image) - { - ReadResult res = ReadResult.Suspended; - try - { - res = m_decompression.jpeg_read_header(require_image); - } - catch (Exception) - { - return ReadResult.Suspended; - } - - return res; - } - - private bool TIFFjpeg_start_decompress() - { - try - { - m_decompression.jpeg_start_decompress(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private int TIFFjpeg_read_raw_data(byte[][][] data, int max_lines) - { - int n = 0; - try - { - n = m_decompression.jpeg_read_raw_data(data, max_lines); - } - catch (Exception) - { - return -1; - } - - return n; - } - - private bool TIFFjpeg_finish_decompress() - { - bool res = true; - try - { - res = m_decompression.jpeg_finish_decompress(); - } - catch (Exception) - { - return false; - } - - return res; - } - - private bool TIFFjpeg_abort() - { - try - { - m_common.jpeg_abort(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private bool TIFFjpeg_destroy() - { - try - { - m_common.jpeg_destroy(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private static byte[][] TIFFjpeg_alloc_sarray(int samplesperrow, int numrows) - { - byte[][] result = new byte[numrows][]; - for (int i = 0; i < numrows; i++) - result[i] = new byte[samplesperrow]; - - return result; - } - - /* - * Allocate downsampled-data buffers needed for downsampled I/O. - * We use values computed in jpeg_start_compress or jpeg_start_decompress. - * We use LibJpeg.Net's allocator so that buffers will be released automatically - * when done with strip/tile. - * This is also a handy place to compute samplesperclump, bytesperline. - */ - private bool alloc_downsampled_buffers(JpegComponent[] comp_info, int num_components) - { - int samples_per_clump = 0; - for (int ci = 0; ci < num_components; ci++) - { - JpegComponent compptr = comp_info[ci]; - samples_per_clump += compptr.H_samp_factor * compptr.V_samp_factor; - - byte[][] buf = TIFFjpeg_alloc_sarray( - compptr.Width_in_blocks * JpegConstants.DCTSize, - compptr.V_samp_factor * JpegConstants.DCTSize); - m_ds_buffer[ci] = buf; - } - - m_samplesperclump = samples_per_clump; - return true; - } - - private void unsuppress_quant_table(int tblno) - { - JpegQuantizationTable qtbl = m_compression.Quant_tbl_ptrs[tblno]; - if (qtbl != null) - qtbl.Sent_table = false; - } - - private void unsuppress_huff_table(int tblno) - { - JpegHuffmanTable htbl = m_compression.Dc_huff_tbl_ptrs[tblno]; - - if (htbl != null) - htbl.Sent_table = false; - - htbl = m_compression.Ac_huff_tbl_ptrs[tblno]; - if (htbl != null) - htbl.Sent_table = false; - } - - private void TIFFjpeg_data_dest() - { - m_compression.Dest = new JpegStdDestination(m_tif); - } - - private bool TIFFjpeg_tables_dest() - { - /* - * Allocate a working buffer for building tables. - * Initial size is 1000 bytes, which is usually adequate. - */ - m_jpegtables_length = 1000; - m_jpegtables = new byte[m_jpegtables_length]; - m_compression.Dest = new JpegTablesDestination(this); - return true; - } - } - #endregion - - #region JpegCodecTagMethods - class JpegCodecTagMethods : TiffTagMethods - { - public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) - { - JpegCodec sp = tif.m_currentCodec as JpegCodec; - Debug.Assert(sp != null); - - switch (tag) - { - case TiffTag.JpegTables: - int v32 = ap[0].ToInt(); - if (v32 == 0) - { - // XXX - return false; - } - - sp.m_jpegtables = new byte[v32]; - Buffer.BlockCopy(ap[1].ToByteArray(), 0, sp.m_jpegtables, 0, v32); - sp.m_jpegtables_length = v32; - tif.setFieldBit(JpegCodec.FIELD_JPEGTABLES); - break; - - case TiffTag.JPEGQUALITY: - sp.m_jpegquality = ap[0].ToInt(); - return true; // pseudo tag - - case TiffTag.JPEGCOLORMODE: - sp.m_jpegcolormode = (JpegColorMode)ap[0].ToShort(); - sp.JPEGResetUpsampled(); - return true; // pseudo tag - - case TiffTag.Photometric: - bool ret_value = base.SetField(tif, tag, ap); - sp.JPEGResetUpsampled(); - return ret_value; - - case TiffTag.JPEGTABLESMODE: - sp.m_jpegtablesmode = (JpegTablesMode)ap[0].ToShort(); - return true; // pseudo tag - - case TiffTag.YCBCRSUBSAMPLING: - // mark the fact that we have a real ycbcrsubsampling! - sp.m_ycbcrsampling_fetched = true; - // should we be recomputing upsampling info here? - return base.SetField(tif, tag, ap); - - case TiffTag.FAXRECVPARAMS: - sp.m_recvparams = ap[0].ToInt(); - break; - - case TiffTag.FAXSUBADDRESS: - Tiff.setString(out sp.m_subaddress, ap[0].ToString()); - break; - - case TiffTag.FAXRECVTIME: - sp.m_recvtime = ap[0].ToInt(); - break; - - case TiffTag.FAXDCS: - Tiff.setString(out sp.m_faxdcs, ap[0].ToString()); - break; - - default: - return base.SetField(tif, tag, ap); - } - - TiffFieldInfo fip = tif.FieldWithTag(tag); - if (fip != null) - tif.setFieldBit(fip.Bit); - else - return false; - - tif.m_flags |= TiffFlags.DirtyDirect; - return true; - } - - public override FieldValue[] GetField(Tiff tif, TiffTag tag) - { - JpegCodec sp = tif.m_currentCodec as JpegCodec; - Debug.Assert(sp != null); - - FieldValue[] result = null; - - switch (tag) - { - case TiffTag.JpegTables: - result = new FieldValue[2]; - result[0].Set(sp.m_jpegtables_length); - result[1].Set(sp.m_jpegtables); - break; - - case TiffTag.JPEGQUALITY: - result = new FieldValue[1]; - result[0].Set(sp.m_jpegquality); - break; - - case TiffTag.JPEGCOLORMODE: - result = new FieldValue[1]; - result[0].Set(sp.m_jpegcolormode); - break; - - case TiffTag.JPEGTABLESMODE: - result = new FieldValue[1]; - result[0].Set(sp.m_jpegtablesmode); - break; - - case TiffTag.YCBCRSUBSAMPLING: - JPEGFixupTestSubsampling(tif); - return base.GetField(tif, tag); - - case TiffTag.FAXRECVPARAMS: - result = new FieldValue[1]; - result[0].Set(sp.m_recvparams); - break; - - case TiffTag.FAXSUBADDRESS: - result = new FieldValue[1]; - result[0].Set(sp.m_subaddress); - break; - - case TiffTag.FAXRECVTIME: - result = new FieldValue[1]; - result[0].Set(sp.m_recvtime); - break; - - case TiffTag.FAXDCS: - result = new FieldValue[1]; - result[0].Set(sp.m_faxdcs); - break; - - default: - return base.GetField(tif, tag); - } - - return result; - } - - public override void PrintDir(Tiff tif, Stream fd, TiffPrintFlags flags) - { - JpegCodec sp = tif.m_currentCodec as JpegCodec; - Debug.Assert(sp != null); - - if (tif.fieldSet(JpegCodec.FIELD_JPEGTABLES)) - Tiff.fprintf(fd, " JPEG Tables: ({0} bytes)\n", sp.m_jpegtables_length); - - if (tif.fieldSet(JpegCodec.FIELD_RECVPARAMS)) - Tiff.fprintf(fd, " Fax Receive Parameters: {0,8:x}\n", sp.m_recvparams); - - if (tif.fieldSet(JpegCodec.FIELD_SUBADDRESS)) - Tiff.fprintf(fd, " Fax SubAddress: {0}\n", sp.m_subaddress); - - if (tif.fieldSet(JpegCodec.FIELD_RECVTIME)) - Tiff.fprintf(fd, " Fax Receive Time: {0} secs\n", sp.m_recvtime); - - if (tif.fieldSet(JpegCodec.FIELD_FAXDCS)) - Tiff.fprintf(fd, " Fax DCS: {0}\n", sp.m_faxdcs); - } - - /* - * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in - * the TIFF tags, but still use non-default (2,2) values within the jpeg - * data stream itself. In order for TIFF applications to work properly - * - for instance to get the strip buffer size right - it is imperative - * that the subsampling be available before we start reading the image - * data normally. This function will attempt to load the first strip in - * order to get the sampling values from the jpeg data stream. Various - * hacks are various places are done to ensure this function gets called - * before the td_ycbcrsubsampling values are used from the directory structure, - * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from - * TIFFStripSize(), and the printing code in tif_print.c. - * - * Note that JPEGPreDeocode() will produce a fairly loud warning when the - * discovered sampling does not match the default sampling (2,2) or whatever - * was actually in the tiff tags. - * - * Problems: - * o This code will cause one whole strip/tile of compressed data to be - * loaded just to get the tags right, even if the imagery is never read. - * It would be more efficient to just load a bit of the header, and - * initialize things from that. - * - * See the bug in bugzilla for details: - * - * http://bugzilla.remotesensing.org/show_bug.cgi?id=168 - * - * Frank Warmerdam, July 2002 - */ - private static void JPEGFixupTestSubsampling(Tiff tif) - { - if (Tiff.CHECK_JPEG_YCBCR_SUBSAMPLING) - { - JpegCodec sp = tif.m_currentCodec as JpegCodec; - Debug.Assert(sp != null); - - sp.InitializeLibJPEG(false, false); - - /* - * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags, - * and use a sampling schema other than the default 2,2. To handle - * this we actually have to scan the header of a strip or tile of - * jpeg data to get the sampling. - */ - if (!sp.m_common.IsDecompressor || sp.m_ycbcrsampling_fetched || - tif.m_dir.td_photometric != Photometric.YCBCR) - { - return; - } - - sp.m_ycbcrsampling_fetched = true; - if (tif.IsTiled()) - { - if (!tif.fillTile(0)) - return; - } - else - { - if (!tif.fillStrip(0)) - return; - } - - tif.SetField(TiffTag.YCBCRSUBSAMPLING, sp.m_h_sampling, sp.m_v_sampling); - - // We want to clear the loaded strip so the application has time - // to set JPEGCOLORMODE or other behavior modifiers. This essentially - // undoes the JPEGPreDecode triggers by FileStrip(). - tif.m_curstrip = -1; - } - } - } - #endregion - - #region JpegStdDestination - /// - /// JPEG library destination data manager. - /// These routines direct compressed data from LibJpeg.Net into the - /// LibTiff.Net output buffer. - /// - class JpegStdDestination : DestinationManager - { - private Tiff m_tif; - - public JpegStdDestination(Tiff tif) - { - m_tif = tif; - } - - public override void init_destination() - { - initInternalBuffer(m_tif.m_rawdata, 0); - } - - public override bool empty_output_buffer() - { - /* the entire buffer has been filled */ - m_tif.m_rawcc = m_tif.m_rawdatasize; - m_tif.flushData1(); - - initInternalBuffer(m_tif.m_rawdata, 0); - return true; - } - - public override void term_destination() - { - m_tif.m_rawcp = m_tif.m_rawdatasize - freeInBuffer; - m_tif.m_rawcc = m_tif.m_rawdatasize - freeInBuffer; - /* NB: LibTiff.Net does the final buffer flush */ - } - } - #endregion - - #region JpegStdSource - /// - /// JPEG library source data manager. - /// These routines supply compressed data to LibJpeg.Net - /// - class JpegStdSource : Jpeg_Source - { - static byte[] dummy_EOI = { 0xFF, (byte)JpegMarkerType.EOI }; - protected JpegCodec m_sp; - - public JpegStdSource(JpegCodec sp) - { - initInternalBuffer(null, 0); - m_sp = sp; - } - - public override void init_source() - { - Tiff tif = m_sp.GetTiff(); - initInternalBuffer(tif.m_rawdata, tif.m_rawcc); - } - - public override bool fill_input_buffer() - { - /* - * Should never get here since entire strip/tile is - * read into memory before the decompressor is called, - * and thus was supplied by init_source. - */ - - /* insert a fake EOI marker */ - initInternalBuffer(dummy_EOI, 2); - return true; - } - } - #endregion - - #region JpegTablesDestination - /// - /// Alternate destination manager for outputting to JPEGTables field. - /// - class JpegTablesDestination : DestinationManager - { - private JpegCodec m_sp; - - public JpegTablesDestination(JpegCodec sp) - { - m_sp = sp; - } - - public override void init_destination() - { - /* while building, jpegtables_length is allocated buffer size */ - initInternalBuffer(m_sp.m_jpegtables, 0); - } - - public override bool empty_output_buffer() - { - /* the entire buffer has been filled; enlarge it by 1000 bytes */ - byte[] newbuf = Tiff.Realloc(m_sp.m_jpegtables, m_sp.m_jpegtables_length + 1000); - - initInternalBuffer(newbuf, m_sp.m_jpegtables_length); - m_sp.m_jpegtables = newbuf; - m_sp.m_jpegtables_length += 1000; - return true; - } - - public override void term_destination() - { - /* set tables length to number of bytes actually emitted */ - m_sp.m_jpegtables_length -= freeInBuffer; - } - } - #endregion - - #region JpegTablesSource - /// - /// Alternate source manager for reading from JPEGTables. - /// We can share all the code except for the init routine. - /// - class JpegTablesSource : JpegStdSource - { - public JpegTablesSource(JpegCodec sp) - : base(sp) - { - } - - public override void init_source() - { - initInternalBuffer(m_sp.m_jpegtables, m_sp.m_jpegtables_length); - } - } - #endregion - - #region LZWCodec - class LZWCodec : CodecWithPredictor - { - /* - * Each strip of data is supposed to be terminated by a CODE_EOI. - * If the following #define is included, the decoder will also - * check for end-of-strip w/o seeing this code. This makes the - * library more robust, but also slower. - */ - private bool LZW_CHECKEOS = true; /* include checks for strips w/o EOI code */ - - /* - * The TIFF spec specifies that encoded bit - * strings range from 9 to 12 bits. - */ - private const short BITS_MIN = 9; /* start with 9 bits */ - private const short BITS_MAX = 12; /* max of 12 bit strings */ - - /* predefined codes */ - private const short CODE_CLEAR = 256; /* code to clear string table */ - private const short CODE_EOI = 257; /* end-of-information code */ - private const short CODE_FIRST = 258; /* first free code entry */ - private const short CODE_MAX = ((1 << BITS_MAX) - 1); - private const short CODE_MIN = ((1 << BITS_MIN) - 1); - - private const int HSIZE = 9001; /* 91% occupancy */ - private const int HSHIFT = (13 - 8); - /* NB: +1024 is for compatibility with old files */ - private const int CSIZE = (((1 << BITS_MAX) - 1) + 1024); - - private const int CHECK_GAP = 10000; /* enc_ratio check interval */ - - /* - * Decoding-specific state. - */ - private struct code_t - { - public int next; - public short length; /* string len, including this token */ - public byte value; /* data value */ - public byte firstchar; /* first token of string */ - }; - - /* - * Encoding-specific state. - */ - private struct hash_t - { - public int hash; - public short code; - }; - - private bool m_compatDecode; - - private short m_nbits; /* # of bits/code */ - private short m_maxcode; /* maximum code for base.nbits */ - private short m_free_ent; /* next free entry in hash table */ - private int m_nextdata; /* next bits of i/o */ - private int m_nextbits; /* # of valid bits in base.nextdata */ - - private int m_rw_mode; /* preserve rw_mode from init */ - - /* Decoding specific data */ - private int m_dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */ - private int m_dec_restart; /* restart count */ - private int m_dec_bitsleft; /* available bits in raw data */ - private bool m_oldStyleCodeFound; /* if true, old style LZW code found*/ - private int m_dec_codep; /* current recognized code */ - private int m_dec_oldcodep; /* previously recognized code */ - private int m_dec_free_entp; /* next free entry */ - private int m_dec_maxcodep; /* max available entry */ - private code_t[] m_dec_codetab; /* kept separate for small machines */ - - /* Encoding specific data */ - private int m_enc_oldcode; /* last code encountered */ - private int m_enc_checkpoint; /* point at which to clear table */ - private int m_enc_ratio; /* current compression ratio */ - private int m_enc_incount; /* (input) data bytes encoded */ - private int m_enc_outcount; /* encoded (output) bytes */ - private int m_enc_rawlimit; /* bound on tif_rawdata buffer */ - private hash_t[] m_enc_hashtab; /* kept separate for small machines */ - - public LZWCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - } - - public override bool Init() - { - Debug.Assert(m_scheme == Compression.LZW); - - m_dec_codetab = null; - m_oldStyleCodeFound = false; - m_enc_hashtab = null; - m_rw_mode = m_tif.m_mode; - m_compatDecode = false; - - /* - * Setup predictor setup. - */ - TIFFPredictorInit(null); - return true; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// - /// PreDecode is called after and before decoding. - /// - public override bool PreDecode(short plane) - { - return LZWPreDecode(plane); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - return LZWPreEncode(plane); - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public override bool PostEncode() - { - return LZWPostEncode(); - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public override void Cleanup() - { - LZWCleanup(); - m_tif.m_mode = m_rw_mode; - } - - // CodecWithPredictor overrides - - public override bool predictor_setupdecode() - { - return LZWSetupDecode(); - } - - public override bool predictor_decoderow(byte[] buffer, int offset, int count, short plane) - { - if (m_compatDecode) - return LZWDecodeCompat(buffer, offset, count, plane); - - return LZWDecode(buffer, offset, count, plane); - } - - public override bool predictor_decodestrip(byte[] buffer, int offset, int count, short plane) - { - if (m_compatDecode) - return LZWDecodeCompat(buffer, offset, count, plane); - - return LZWDecode(buffer, offset, count, plane); - } - - public override bool predictor_decodetile(byte[] buffer, int offset, int count, short plane) - { - if (m_compatDecode) - return LZWDecodeCompat(buffer, offset, count, plane); - - return LZWDecode(buffer, offset, count, plane); - } - - public override bool predictor_setupencode() - { - return LZWSetupEncode(); - } - - public override bool predictor_encoderow(byte[] buffer, int offset, int count, short plane) - { - return LZWEncode(buffer, offset, count, plane); - } - - public override bool predictor_encodestrip(byte[] buffer, int offset, int count, short plane) - { - return LZWEncode(buffer, offset, count, plane); - } - - public override bool predictor_encodetile(byte[] buffer, int offset, int count, short plane) - { - return LZWEncode(buffer, offset, count, plane); - } - - private bool LZWSetupDecode() - { - if (m_dec_codetab == null) - { - m_dec_codetab = new code_t[CSIZE]; - - /* - * Pre-load the table. - */ - int code = 255; - do - { - m_dec_codetab[code].value = (byte)code; - m_dec_codetab[code].firstchar = (byte)code; - m_dec_codetab[code].length = 1; - m_dec_codetab[code].next = -1; - } - while (code-- != 0); - - /* - * Zero-out the unused entries - */ - Array.Clear(m_dec_codetab, CODE_CLEAR, CODE_FIRST - CODE_CLEAR); - } - - return true; - } - - /* - * Setup state for decoding a strip. - */ - private bool LZWPreDecode(short s) - { - if (m_dec_codetab == null) - SetupDecode(); - - /* - * Check for old bit-reversed codes. - */ - if (m_tif.m_rawdata[0] == 0 && (m_tif.m_rawdata[1] & 0x1) != 0) - { - if (!m_oldStyleCodeFound) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, "Old-style LZW codes, convert file"); - m_compatDecode = true; - - /* - * If doing horizontal differencing, must - * re-setup the predictor logic since we - * switched the basic decoder methods... - */ - SetupDecode(); - m_oldStyleCodeFound = true; - } - - m_maxcode = CODE_MIN; - } - else - { - m_maxcode = CODE_MIN - 1; - m_oldStyleCodeFound = false; - } - - m_nbits = BITS_MIN; - m_nextbits = 0; - m_nextdata = 0; - - m_dec_restart = 0; - m_dec_nbitsmask = CODE_MIN; - m_dec_bitsleft = m_tif.m_rawcc << 3; - m_dec_free_entp = CODE_FIRST; - - /* - * Zero entries that are not yet filled in. We do - * this to guard against bogus input data that causes - * us to index into undefined entries. If you can - * come up with a way to safely bounds-check input codes - * while decoding then you can remove this operation. - */ - Array.Clear(m_dec_codetab, m_dec_free_entp, CSIZE - CODE_FIRST); - m_dec_oldcodep = -1; - m_dec_maxcodep = m_dec_nbitsmask - 1; - return true; - } - - private bool LZWDecode(byte[] buffer, int offset, int count, short plane) - { - Debug.Assert(m_dec_codetab != null); - - // Restart interrupted output operation. - if (m_dec_restart != 0) - { - int codep = m_dec_codep; - int residue = m_dec_codetab[codep].length - m_dec_restart; - if (residue > count) - { - // Residue from previous decode is sufficient to satisfy decode request. Skip - // to the start of the decoded string, place decoded values in the output - // buffer, and return. - m_dec_restart += count; - - do - { - codep = m_dec_codetab[codep].next; - } - while (--residue > count && codep != -1); - - if (codep != -1) - { - int tp = count; - do - { - tp--; - buffer[offset + tp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (--count != 0 && codep != -1); - } - - return true; - } - - // Residue satisfies only part of the decode request. - offset += residue; - count -= residue; - int ttp = 0; - do - { - --ttp; - int t = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - buffer[offset + ttp] = (byte)t; - } - while (--residue != 0 && codep != -1); - - m_dec_restart = 0; - } - - while (count > 0) - { - short code; - NextCode(out code, false); - if (code == CODE_EOI) - break; - - if (code == CODE_CLEAR) - { - m_dec_free_entp = CODE_FIRST; - Array.Clear(m_dec_codetab, m_dec_free_entp, CSIZE - CODE_FIRST); - - m_nbits = BITS_MIN; - m_dec_nbitsmask = CODE_MIN; - m_dec_maxcodep = m_dec_nbitsmask - 1; - NextCode(out code, false); - - if (code == CODE_EOI) - break; - - if (code == CODE_CLEAR) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - buffer[offset] = (byte)code; - offset++; - count--; - m_dec_oldcodep = code; - continue; - } - - int codep = code; - - // Add the new entry to the code table. - if (m_dec_free_entp < 0 || m_dec_free_entp >= CSIZE) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - m_dec_codetab[m_dec_free_entp].next = m_dec_oldcodep; - if (m_dec_codetab[m_dec_free_entp].next < 0 || m_dec_codetab[m_dec_free_entp].next >= CSIZE) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - m_dec_codetab[m_dec_free_entp].firstchar = m_dec_codetab[m_dec_codetab[m_dec_free_entp].next].firstchar; - m_dec_codetab[m_dec_free_entp].length = (short)(m_dec_codetab[m_dec_codetab[m_dec_free_entp].next].length + 1); - m_dec_codetab[m_dec_free_entp].value = (codep < m_dec_free_entp) ? m_dec_codetab[codep].firstchar : m_dec_codetab[m_dec_free_entp].firstchar; - - if (++m_dec_free_entp > m_dec_maxcodep) - { - if (++m_nbits > BITS_MAX) - { - // should not happen - m_nbits = BITS_MAX; - } - - m_dec_nbitsmask = MAXCODE(m_nbits); - m_dec_maxcodep = m_dec_nbitsmask - 1; - } - - m_dec_oldcodep = code; - if (code >= 256) - { - // Code maps to a string, copy string value to output (written in reverse). - if (m_dec_codetab[codep].length == 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Wrong length of decoded string: data probably corrupted at scanline {0}", - m_tif.m_row); - return false; - } - - if (m_dec_codetab[codep].length > count) - { - // String is too long for decode buffer, locate portion that will fit, - // copy to the decode buffer, and setup restart logic for the next - // decoding call. - m_dec_codep = code; - do - { - codep = m_dec_codetab[codep].next; - } - while (codep != -1 && m_dec_codetab[codep].length > count); - - if (codep != -1) - { - m_dec_restart = count; - int tp = count; - do - { - tp--; - buffer[offset + tp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (--count != 0 && codep != -1); - - if (codep != -1) - codeLoop(); - } - break; - } - - int len = m_dec_codetab[codep].length; - int ttp = len; - do - { - --ttp; - int t = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - buffer[offset + ttp] = (byte)t; - } - while (codep != -1 && ttp > 0); - - if (codep != -1) - { - codeLoop(); - break; - } - - offset += len; - count -= len; - } - else - { - buffer[offset] = (byte)code; - offset++; - count--; - } - } - - if (count > 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Not enough data at scanline {0} (short {1} bytes)", - m_tif.m_row, count); - return false; - } - - return true; - } - - private bool LZWDecodeCompat(byte[] buffer, int offset, int count, short plane) - { - // Restart interrupted output operation. - if (m_dec_restart != 0) - { - int residue; - - int codep = m_dec_codep; - residue = m_dec_codetab[codep].length - m_dec_restart; - if (residue > count) - { - // Residue from previous decode is sufficient to satisfy decode request. - // Skip to the start of the decoded string, place decoded values in the output - // buffer, and return. - m_dec_restart += count; - do - { - codep = m_dec_codetab[codep].next; - } - while (--residue > count); - - int tp = count; - do - { - --tp; - buffer[offset + tp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (--count != 0); - - return true; - } - - // Residue satisfies only part of the decode request. - offset += residue; - count -= residue; - int ttp = 0; - do - { - --ttp; - buffer[offset + ttp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (--residue != 0); - - m_dec_restart = 0; - } - - while (count > 0) - { - short code; - NextCode(out code, true); - if (code == CODE_EOI) - break; - - if (code == CODE_CLEAR) - { - m_dec_free_entp = CODE_FIRST; - Array.Clear(m_dec_codetab, m_dec_free_entp, CSIZE - CODE_FIRST); - - m_nbits = BITS_MIN; - m_dec_nbitsmask = CODE_MIN; - m_dec_maxcodep = m_dec_nbitsmask; - NextCode(out code, true); - - if (code == CODE_EOI) - break; - - if (code == CODE_CLEAR) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - buffer[offset] = (byte)code; - offset++; - count--; - m_dec_oldcodep = code; - continue; - } - - int codep = code; - - // Add the new entry to the code table. - if (m_dec_free_entp < 0 || m_dec_free_entp >= CSIZE) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecodeCompat: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - m_dec_codetab[m_dec_free_entp].next = m_dec_oldcodep; - if (m_dec_codetab[m_dec_free_entp].next < 0 || m_dec_codetab[m_dec_free_entp].next >= CSIZE) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecodeCompat: Corrupted LZW table at scanline {0}", m_tif.m_row); - return false; - } - - m_dec_codetab[m_dec_free_entp].firstchar = m_dec_codetab[m_dec_codetab[m_dec_free_entp].next].firstchar; - m_dec_codetab[m_dec_free_entp].length = (short)(m_dec_codetab[m_dec_codetab[m_dec_free_entp].next].length + 1); - m_dec_codetab[m_dec_free_entp].value = (codep < m_dec_free_entp) ? m_dec_codetab[codep].firstchar : m_dec_codetab[m_dec_free_entp].firstchar; - if (++m_dec_free_entp > m_dec_maxcodep) - { - if (++m_nbits > BITS_MAX) - { - // should not happen - m_nbits = BITS_MAX; - } - m_dec_nbitsmask = MAXCODE(m_nbits); - m_dec_maxcodep = m_dec_nbitsmask; - } - - m_dec_oldcodep = code; - if (code >= 256) - { - int op_orig = offset; - - // Code maps to a string, copy string value to output (written in reverse). - if (m_dec_codetab[codep].length == 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecodeCompat: Wrong length of decoded string: data probably corrupted at scanline {0}", - m_tif.m_row); - return false; - } - - if (m_dec_codetab[codep].length > count) - { - // String is too long for decode buffer, locate portion that will fit, - // copy to the decode buffer, and setup restart logic for the next - // decoding call. - m_dec_codep = code; - do - { - codep = m_dec_codetab[codep].next; - } - while (m_dec_codetab[codep].length > count); - - m_dec_restart = count; - int tp = count; - do - { - --tp; - buffer[offset + tp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (--count != 0); - - break; - } - - offset += m_dec_codetab[codep].length; - count -= m_dec_codetab[codep].length; - int ttp = offset; - do - { - --ttp; - buffer[ttp] = m_dec_codetab[codep].value; - codep = m_dec_codetab[codep].next; - } - while (codep != -1 && ttp > op_orig); - } - else - { - buffer[offset] = (byte)code; - offset++; - count--; - } - } - - if (count > 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecodeCompat: Not enough data at scanline {0} (short {1} bytes)", - m_tif.m_row, count); - return false; - } - - return true; - } - - private bool LZWSetupEncode() - { - m_enc_hashtab = new hash_t[HSIZE]; - return true; - } - - /* - * Reset encoding state at the start of a strip. - */ - private bool LZWPreEncode(short s) - { - if (m_enc_hashtab == null) - SetupEncode(); - - m_nbits = BITS_MIN; - m_maxcode = CODE_MIN; - m_free_ent = CODE_FIRST; - m_nextbits = 0; - m_nextdata = 0; - m_enc_checkpoint = CHECK_GAP; - m_enc_ratio = 0; - m_enc_incount = 0; - m_enc_outcount = 0; - - /* - * The 4 here insures there is space for 2 max-sized - * codes in LZWEncode and LZWPostDecode. - */ - m_enc_rawlimit = m_tif.m_rawdatasize - 1 - 4; - cl_hash(); /* clear hash table */ - m_enc_oldcode = -1; /* generates CODE_CLEAR in LZWEncode */ - return true; - } - - /* - * Finish off an encoded strip by flushing the last - * string and tacking on an End Of Information code. - */ - private bool LZWPostEncode() - { - if (m_tif.m_rawcp > m_enc_rawlimit) - { - m_tif.m_rawcc = m_tif.m_rawcp; - m_tif.flushData1(); - m_tif.m_rawcp = 0; - } - - if (m_enc_oldcode != -1) - { - PutNextCode(m_enc_oldcode); - m_enc_oldcode = -1; - } - - PutNextCode(CODE_EOI); - - if (m_nextbits > 0) - { - m_tif.m_rawdata[m_tif.m_rawcp] = (byte)(m_nextdata << (8 - m_nextbits)); - m_tif.m_rawcp++; - } - - m_tif.m_rawcc = m_tif.m_rawcp; - return true; - } - - /// - /// Encode a chunk of pixels. - /// - /// - /// Uses an open addressing double hashing (no chaining) on the prefix code/next character - /// combination. We do a variant of Knuth's algorithm D (vol. 3, sec. 6.4) along with - /// G. Knott's relatively-prime secondary probe. Here, the modular division first probe is - /// gives way to a faster exclusive-or manipulation. Also do block compression with an - /// adaptive reset, whereby the code table is cleared when the compression ratio - /// decreases, but after the table fills. The variable-length output codes are re-sized at - /// this point, and a CODE_CLEAR is generated for the decoder. - /// - private bool LZWEncode(byte[] buffer, int offset, int count, short plane) - { - Debug.Assert(m_enc_hashtab != null); - if (m_enc_oldcode == -1 && count > 0) - { - // NB: This is safe because it can only happen at the start of a strip where we - // know there is space in the data buffer. - PutNextCode(CODE_CLEAR); - m_enc_oldcode = buffer[offset]; - offset++; - count--; - m_enc_incount++; - } - - while (count > 0) - { - int c = buffer[offset]; - offset++; - count--; - m_enc_incount++; - int fcode = (c << BITS_MAX) + m_enc_oldcode; - int h = (c << HSHIFT) ^ m_enc_oldcode; // xor hashing - - // Check hash index for an overflow. - if (h >= HSIZE) - h -= HSIZE; - - if (m_enc_hashtab[h].hash == fcode) - { - m_enc_oldcode = m_enc_hashtab[h].code; - continue; - } - - bool hit = false; - - if (m_enc_hashtab[h].hash >= 0) - { - // Primary hash failed, check secondary hash. - int disp = HSIZE - h; - if (h == 0) - disp = 1; - do - { - h -= disp; - if (h < 0) - h += HSIZE; - - if (m_enc_hashtab[h].hash == fcode) - { - m_enc_oldcode = m_enc_hashtab[h].code; - hit = true; - break; - } - } - while (m_enc_hashtab[h].hash >= 0); - } - - if (!hit) - { - // New entry, emit code and add to table. - // Verify there is space in the buffer for the code and any potential Clear - // code that might be emitted below. The value of limit is setup so that there - // are at least 4 bytes free - room for 2 codes. - if (m_tif.m_rawcp > m_enc_rawlimit) - { - m_tif.m_rawcc = m_tif.m_rawcp; - m_tif.flushData1(); - m_tif.m_rawcp = 0; - } - - PutNextCode(m_enc_oldcode); - m_enc_oldcode = c; - m_enc_hashtab[h].code = m_free_ent; - m_free_ent++; - m_enc_hashtab[h].hash = fcode; - if (m_free_ent == CODE_MAX - 1) - { - // table is full, emit clear code and reset - cl_hash(); - m_enc_ratio = 0; - m_enc_incount = 0; - m_enc_outcount = 0; - m_free_ent = CODE_FIRST; - PutNextCode(CODE_CLEAR); - m_nbits = BITS_MIN; - m_maxcode = CODE_MIN; - } - else - { - // If the next entry is going to be too big for the code size, then - // increase it, if possible. - if (m_free_ent > m_maxcode) - { - m_nbits++; - Debug.Assert(m_nbits <= BITS_MAX); - m_maxcode = (short)MAXCODE(m_nbits); - } - else if (m_enc_incount >= m_enc_checkpoint) - { - // Check compression ratio and, if things seem to be slipping, clear - // the hash table and reset state. The compression ratio is - // a 24 + 8-bit fractional number. - m_enc_checkpoint = m_enc_incount + CHECK_GAP; - - int rat; - if (m_enc_incount > 0x007fffff) - { - // NB: shift will overflow - rat = m_enc_outcount >> 8; - rat = (rat == 0 ? 0x7fffffff : m_enc_incount / rat); - } - else - rat = (m_enc_incount << 8) / m_enc_outcount; - - if (rat <= m_enc_ratio) - { - cl_hash(); - m_enc_ratio = 0; - m_enc_incount = 0; - m_enc_outcount = 0; - m_free_ent = CODE_FIRST; - PutNextCode(CODE_CLEAR); - m_nbits = BITS_MIN; - m_maxcode = CODE_MIN; - } - else - m_enc_ratio = rat; - } - } - } - } - - return true; - } - - private void LZWCleanup() - { - m_dec_codetab = null; - m_enc_hashtab = null; - } - - private static int MAXCODE(int n) - { - return ((1 << n) - 1); - } - - private void PutNextCode(int c) - { - m_nextdata = (m_nextdata << m_nbits) | c; - m_nextbits += m_nbits; - m_tif.m_rawdata[m_tif.m_rawcp] = (byte)(m_nextdata >> (m_nextbits - 8)); - m_tif.m_rawcp++; - m_nextbits -= 8; - if (m_nextbits >= 8) - { - m_tif.m_rawdata[m_tif.m_rawcp] = (byte)(m_nextdata >> (m_nextbits - 8)); - m_tif.m_rawcp++; - m_nextbits -= 8; - } - - m_enc_outcount += m_nbits; - } - - /* - * Reset encoding hash table. - */ - private void cl_hash() - { - int hp = HSIZE - 1; - int i = HSIZE - 8; - - do - { - i -= 8; - m_enc_hashtab[hp - 7].hash = -1; - m_enc_hashtab[hp - 6].hash = -1; - m_enc_hashtab[hp - 5].hash = -1; - m_enc_hashtab[hp - 4].hash = -1; - m_enc_hashtab[hp - 3].hash = -1; - m_enc_hashtab[hp - 2].hash = -1; - m_enc_hashtab[hp - 1].hash = -1; - m_enc_hashtab[hp].hash = -1; - hp -= 8; - } - while (i >= 0); - - for (i += 8; i > 0; i--, hp--) - m_enc_hashtab[hp].hash = -1; - } - - private void NextCode(out short _code, bool compat) - { - if (LZW_CHECKEOS) - { - if (m_dec_bitsleft < m_nbits) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Strip {0} not terminated with EOI code", m_tif.m_curstrip); - _code = CODE_EOI; - } - else - { - if (compat) - GetNextCodeCompat(out _code); - else - GetNextCode(out _code); - - m_dec_bitsleft -= m_nbits; - } - } - else - { - if (compat) - GetNextCodeCompat(out _code); - else - GetNextCode(out _code); - } - } - - private void GetNextCode(out short code) - { - m_nextdata = (m_nextdata << 8) | m_tif.m_rawdata[m_tif.m_rawcp]; - m_tif.m_rawcp++; - m_nextbits += 8; - if (m_nextbits < m_nbits) - { - m_nextdata = (m_nextdata << 8) | m_tif.m_rawdata[m_tif.m_rawcp]; - m_tif.m_rawcp++; - m_nextbits += 8; - } - code = (short)((m_nextdata >> (m_nextbits - m_nbits)) & m_dec_nbitsmask); - m_nextbits -= m_nbits; - } - - private void GetNextCodeCompat(out short code) - { - m_nextdata |= m_tif.m_rawdata[m_tif.m_rawcp] << m_nextbits; - m_tif.m_rawcp++; - m_nextbits += 8; - if (m_nextbits < m_nbits) - { - m_nextdata |= m_tif.m_rawdata[m_tif.m_rawcp] << m_nextbits; - m_tif.m_rawcp++; - m_nextbits += 8; - } - code = (short)(m_nextdata & m_dec_nbitsmask); - m_nextdata >>= m_nbits; - m_nextbits -= m_nbits; - } - - private void codeLoop() - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "LZWDecode: Bogus encoding, loop in the code table; scanline {0}", m_tif.m_row); - } - } - #endregion - - #region OJpegCodec - class OJpegCodec : TiffCodec - { - internal const int FIELD_OJPEG_JPEGINTERCHANGEFORMAT = (FieldBit.Codec + 0); - internal const int FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH = (FieldBit.Codec + 1); - internal const int FIELD_OJPEG_JPEGQTABLES = (FieldBit.Codec + 2); - internal const int FIELD_OJPEG_JPEGDCTABLES = (FieldBit.Codec + 3); - internal const int FIELD_OJPEG_JPEGACTABLES = (FieldBit.Codec + 4); - internal const int FIELD_OJPEG_JPEGPROC = (FieldBit.Codec + 5); - internal const int FIELD_OJPEG_JPEGRESTARTINTERVAL = (FieldBit.Codec + 6); - internal const int FIELD_OJPEG_COUNT = 7; - - private const int OJPEG_BUFFER = 2048; - - private enum OJPEGStateInBufferSource - { - osibsNotSetYet, - osibsJpegInterchangeFormat, - osibsStrile, - osibsEof - } - - private enum OJPEGStateOutState - { - ososSoi, - - ososQTable0, - ososQTable1, - ososQTable2, - ososQTable3, - - ososDcTable0, - ososDcTable1, - ososDcTable2, - ososDcTable3, - - ososAcTable0, - ososAcTable1, - ososAcTable2, - ososAcTable3, - - ososDri, - ososSof, - ososSos, - ososCompressed, - ososRst, - ososEoi - } - - private static TiffFieldInfo[] ojpeg_field_info = - { - new TiffFieldInfo(TiffTag.JPEGIFOffset, 1, 1, TiffType.Long, FIELD_OJPEG_JPEGINTERCHANGEFORMAT, true, false, "JpegInterchangeFormat"), - new TiffFieldInfo(TiffTag.JPEGIFByteCount, 1, 1, TiffType.Long, FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH, true, false, "JpegInterchangeFormatLength"), - new TiffFieldInfo(TiffTag.JPEGQTables, -1, -1, TiffType.Long, FIELD_OJPEG_JPEGQTABLES, false, true, "JpegQTables"), - new TiffFieldInfo(TiffTag.JPEGDCTables, -1, -1, TiffType.Long, FIELD_OJPEG_JPEGDCTABLES, false, true, "JpegDcTables"), - new TiffFieldInfo(TiffTag.JPEGACTABLES, -1, -1, TiffType.Long, FIELD_OJPEG_JPEGACTABLES, false, true, "JpegAcTables"), - new TiffFieldInfo(TiffTag.JPEGProc, 1, 1, TiffType.Short, FIELD_OJPEG_JPEGPROC, false, false, "JpegProc"), - new TiffFieldInfo(TiffTag.JPEGRestartInterval, 1, 1, TiffType.Short, FIELD_OJPEG_JPEGRESTARTINTERVAL, false, false, "JpegRestartInterval"), - }; - - private struct SosEnd - { - public bool m_log; - public OJPEGStateInBufferSource m_in_buffer_source; - public uint m_in_buffer_next_strile; - public uint m_in_buffer_file_pos; - public uint m_in_buffer_file_togo; - } - - internal uint m_jpeg_interchange_format; - internal uint m_jpeg_interchange_format_length; - internal byte m_jpeg_proc; - - internal bool m_subsamplingcorrect_done; - internal bool m_subsampling_tag; - internal byte m_subsampling_hor; - internal byte m_subsampling_ver; - - internal byte m_qtable_offset_count; - internal byte m_dctable_offset_count; - internal byte m_actable_offset_count; - internal uint[] m_qtable_offset = new uint[3]; - internal uint[] m_dctable_offset = new uint[3]; - internal uint[] m_actable_offset = new uint[3]; - - internal ushort m_restart_interval; - - internal JpegDecompressor m_libjpeg_jpeg_decompress_struct; - - private TiffTagMethods m_tagMethods; - private TiffTagMethods m_parentTagMethods; - - private uint m_file_size; - private uint m_image_width; - private uint m_image_length; - private uint m_strile_width; - private uint m_strile_length; - private uint m_strile_length_total; - private byte m_samples_per_pixel; - private byte m_plane_sample_offset; - private byte m_samples_per_pixel_per_plane; - private bool m_subsamplingcorrect; - private bool m_subsampling_force_desubsampling_inside_decompression; - private byte[][] m_qtable = new byte[4][]; - private byte[][] m_dctable = new byte[4][]; - private byte[][] m_actable = new byte[4][]; - private byte m_restart_index; - private bool m_sof_log; - private byte m_sof_marker_id; - private uint m_sof_x; - private uint m_sof_y; - private byte[] m_sof_c = new byte[3]; - private byte[] m_sof_hv = new byte[3]; - private byte[] m_sof_tq = new byte[3]; - private byte[] m_sos_cs = new byte[3]; - private byte[] m_sos_tda = new byte[3]; - private SosEnd[] m_sos_end = new SosEnd[3]; - private bool m_readheader_done; - private bool m_writeheader_done; - private short m_write_cursample; - private uint m_write_curstrile; - private bool m_libjpeg_session_active; - private byte m_libjpeg_jpeg_query_style; - private Jpeg_Source m_libjpeg_jpeg_source_mgr; - private bool m_subsampling_convert_log; - private uint m_subsampling_convert_ylinelen; - private uint m_subsampling_convert_ylines; - private uint m_subsampling_convert_clinelen; - private uint m_subsampling_convert_clines; - private byte[][] m_subsampling_convert_ybuf; - private byte[][] m_subsampling_convert_cbbuf; - private byte[][] m_subsampling_convert_crbuf; - private byte[][][] m_subsampling_convert_ycbcrimage; - private uint m_subsampling_convert_clinelenout; - private uint m_subsampling_convert_state; - private uint m_bytes_per_line; /* if the codec outputs subsampled data, a 'line' in bytes_per_line */ - private uint m_lines_per_strile; /* and lines_per_strile means subsampling_ver desubsampled rows */ - private OJPEGStateInBufferSource m_in_buffer_source; - private uint m_in_buffer_next_strile; - private uint m_in_buffer_strile_count; - private uint m_in_buffer_file_pos; - private bool m_in_buffer_file_pos_log; - private uint m_in_buffer_file_togo; - private ushort m_in_buffer_togo; - private int m_in_buffer_cur; // index into m_in_buffer - private byte[] m_in_buffer = new byte[OJPEG_BUFFER]; - private OJPEGStateOutState m_out_state; - private byte[] m_out_buffer = new byte[OJPEG_BUFFER]; - private byte[] m_skip_buffer; - - public OJpegCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - m_tagMethods = new OJpegCodecTagMethods(); - } - - public override bool Init() - { - Debug.Assert(m_scheme == Compression.OJPEG); - - /* - * Merge codec-specific tag information. - */ - m_tif.MergeFieldInfo(ojpeg_field_info, ojpeg_field_info.Length); - - m_jpeg_proc = 1; - m_subsampling_hor = 2; - m_subsampling_ver = 2; - - m_tif.SetField(TiffTag.YCBCRSUBSAMPLING, 2, 2); - - /* tif tag methods */ - m_parentTagMethods = m_tif.m_tagmethods; - m_tif.m_tagmethods = m_tagMethods; - - /* Some OJPEG files don't have strip or tile offsets or bytecounts - * tags. Some others do, but have totally meaningless or corrupt - * values in these tags. In these cases, the JpegInterchangeFormat - * stream is reliable. In any case, this decoder reads the - * compressed data itself, from the most reliable locations, and - * we need to notify encapsulating LibTiff not to read raw strips - * or tiles for us. - */ - m_tif.m_flags |= TiffFlags.NoReadRaw; - return true; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - public Tiff GetTiff() - { - return m_tif; - } - - /// - /// Setups the decoder part of the codec. - /// - /// - /// true if this codec successfully setup its decoder part and can decode data; - /// otherwise, false. - /// - /// - /// SetupDecode is called once before - /// . - public override bool SetupDecode() - { - return OJPEGSetupDecode(); - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// - /// PreDecode is called after and before decoding. - /// - public override bool PreDecode(short plane) - { - return OJPEGPreDecode(plane); - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - return OJPEGDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - return OJPEGDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - return OJPEGDecode(buffer, offset, count, plane); - } - - /// - /// Setups the encoder part of the codec. - /// - /// - /// true if this codec successfully setup its encoder part and can encode data; - /// otherwise, false. - /// - /// - /// SetupEncode is called once before - /// . - public override bool SetupEncode() - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public override bool PostEncode() - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - return OJpegEncodeIsUnsupported(); - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public override void Cleanup() - { - OJPEGCleanup(); - } - - private bool OJPEGSetupDecode() - { - Tiff.WarningExt(m_tif.m_clientdata, "OJPEGSetupDecode", - "Depreciated and troublesome old-style JPEG compression mode, please convert to new-style JPEG compression and notify vendor of writing software"); - - return true; - } - - private bool OJPEGPreDecode(short s) - { - uint m; - if (!m_subsamplingcorrect_done) - OJPEGSubsamplingCorrect(); - - if (!m_readheader_done) - { - if (!OJPEGReadHeaderInfo()) - return false; - } - - if (!m_sos_end[s].m_log) - { - if (!OJPEGReadSecondarySos(s)) - return false; - } - - if (m_tif.IsTiled()) - m = (uint)m_tif.m_curtile; - else - m = (uint)m_tif.m_curstrip; - - if (m_writeheader_done && ((m_write_cursample != s) || (m_write_curstrile > m))) - { - if (m_libjpeg_session_active) - OJPEGLibjpegSessionAbort(); - m_writeheader_done = false; - } - - if (!m_writeheader_done) - { - m_plane_sample_offset = (byte)s; - m_write_cursample = s; - m_write_curstrile = (uint)(s * m_tif.m_dir.td_stripsperimage); - if (!m_in_buffer_file_pos_log || - (m_in_buffer_file_pos - m_in_buffer_togo != m_sos_end[s].m_in_buffer_file_pos)) - { - m_in_buffer_source = m_sos_end[s].m_in_buffer_source; - m_in_buffer_next_strile = m_sos_end[s].m_in_buffer_next_strile; - m_in_buffer_file_pos = m_sos_end[s].m_in_buffer_file_pos; - m_in_buffer_file_pos_log = false; - m_in_buffer_file_togo = m_sos_end[s].m_in_buffer_file_togo; - m_in_buffer_togo = 0; - m_in_buffer_cur = 0; - } - if (!OJPEGWriteHeaderInfo()) - return false; - } - - while (m_write_curstrile < m) - { - if (m_libjpeg_jpeg_query_style == 0) - { - if (!OJPEGPreDecodeSkipRaw()) - return false; - } - else - { - if (!OJPEGPreDecodeSkipScanlines()) - return false; - } - m_write_curstrile++; - } - - return true; - } - - private bool OJPEGDecode(byte[] buf, int offset, int cc, short s) - { - if (m_libjpeg_jpeg_query_style == 0) - { - if (!OJPEGDecodeRaw(buf, offset, cc)) - return false; - } - else - { - if (!OJPEGDecodeScanlines(buf, offset, cc)) - return false; - } - return true; - } - - private bool OJpegEncodeIsUnsupported() - { - Tiff.ErrorExt(m_tif.m_clientdata, "OJPEGSetupEncode", - "OJPEG encoding not supported; use new-style JPEG compression instead"); - - return false; - } - - private void OJPEGCleanup() - { - m_tif.m_tagmethods = m_parentTagMethods; - if (m_libjpeg_session_active) - OJPEGLibjpegSessionAbort(); - } - - private bool OJPEGPreDecodeSkipRaw() - { - uint m; - m = m_lines_per_strile; - if (m_subsampling_convert_state != 0) - { - if (m_subsampling_convert_clines - m_subsampling_convert_state >= m) - { - m_subsampling_convert_state += m; - if (m_subsampling_convert_state == m_subsampling_convert_clines) - m_subsampling_convert_state = 0; - return true; - } - m -= m_subsampling_convert_clines - m_subsampling_convert_state; - m_subsampling_convert_state = 0; - } - while (m >= m_subsampling_convert_clines) - { - if (jpeg_read_raw_data_encap(m_subsampling_ver * 8) == 0) - return false; - m -= m_subsampling_convert_clines; - } - if (m > 0) - { - if (jpeg_read_raw_data_encap(m_subsampling_ver * 8) == 0) - return false; - m_subsampling_convert_state = m; - } - return true; - } - - private bool OJPEGPreDecodeSkipScanlines() - { - uint m; - if (m_skip_buffer == null) - m_skip_buffer = new byte[m_bytes_per_line]; - - for (m = 0; m < m_lines_per_strile; m++) - { - if (jpeg_read_scanlines_encap(m_skip_buffer, 1) == 0) - return false; - } - return true; - } - - private bool OJPEGDecodeRaw(byte[] buf, int offset, int cc) - { - const string module = "OJPEGDecodeRaw"; - - if (cc % m_bytes_per_line != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Fractional scanline not read"); - return false; - } - - Debug.Assert(cc > 0); - int m = offset; - int n = cc; - do - { - if (m_subsampling_convert_state == 0) - { - if (jpeg_read_raw_data_encap(m_subsampling_ver * 8) == 0) - return false; - } - - uint oy = m_subsampling_convert_state * m_subsampling_ver * m_subsampling_convert_ylinelen; - uint ocb = m_subsampling_convert_state * m_subsampling_convert_clinelen; - uint ocr = m_subsampling_convert_state * m_subsampling_convert_clinelen; - - int i = 0; - int ii = 0; - int p = m; - for (uint q = 0; q < m_subsampling_convert_clinelenout; q++) - { - uint r = oy; - for (byte sy = 0; sy < m_subsampling_ver; sy++) - { - for (byte sx = 0; sx < m_subsampling_hor; sx++) - { - i = (int)(r / m_subsampling_convert_ylinelen); - ii = (int)(r % m_subsampling_convert_ylinelen); - r++; - buf[p++] = m_subsampling_convert_ybuf[i][ii]; - } - - r += m_subsampling_convert_ylinelen - m_subsampling_hor; - } - oy += m_subsampling_hor; - - i = (int)(ocb / m_subsampling_convert_clinelen); - ii = (int)(ocb % m_subsampling_convert_clinelen); - ocb++; - buf[p++] = m_subsampling_convert_cbbuf[i][ii]; - - i = (int)(ocr / m_subsampling_convert_clinelen); - ii = (int)(ocr % m_subsampling_convert_clinelen); - ocr++; - buf[p++] = m_subsampling_convert_crbuf[i][ii]; - } - m_subsampling_convert_state++; - if (m_subsampling_convert_state == m_subsampling_convert_clines) - m_subsampling_convert_state = 0; - m += (int)m_bytes_per_line; - n -= (int)m_bytes_per_line; - } while (n > 0); - return true; - } - - private bool OJPEGDecodeScanlines(byte[] buf, int offset, int cc) - { - const string module = "OJPEGDecodeScanlines"; - - if (cc % m_bytes_per_line != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Fractional scanline not read"); - return false; - } - - Debug.Assert(cc > 0); - - int m = offset; - byte[] temp = new byte[m_bytes_per_line]; - int n = cc; - do - { - if (jpeg_read_scanlines_encap(temp, 1) == 0) - return false; - - Buffer.BlockCopy(temp, 0, buf, m, temp.Length); - m += (int)m_bytes_per_line; - n -= (int)m_bytes_per_line; - } while (n > 0); - - return true; - } - - public void OJPEGSubsamplingCorrect() - { - const string module = "OJPEGSubsamplingCorrect"; - byte mh; - byte mv; - Debug.Assert(!m_subsamplingcorrect_done); - - if ((m_tif.m_dir.td_samplesperpixel != 3) || ((m_tif.m_dir.td_photometric != Photometric.YCBCR) && - (m_tif.m_dir.td_photometric != Photometric.ITULAB))) - { - if (m_subsampling_tag) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling tag not appropriate for this Photometric and/or SamplesPerPixel"); - } - - m_subsampling_hor = 1; - m_subsampling_ver = 1; - m_subsampling_force_desubsampling_inside_decompression = false; - } - else - { - m_subsamplingcorrect_done = true; - mh = m_subsampling_hor; - mv = m_subsampling_ver; - m_subsamplingcorrect = true; - OJPEGReadHeaderInfoSec(); - if (m_subsampling_force_desubsampling_inside_decompression) - { - m_subsampling_hor = 1; - m_subsampling_ver = 1; - } - m_subsamplingcorrect = false; - - if (((m_subsampling_hor != mh) || (m_subsampling_ver != mv)) && !m_subsampling_force_desubsampling_inside_decompression) - { - if (!m_subsampling_tag) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling tag is not set, yet subsampling inside JPEG data [{0},{1}] does not match default values [2,2]; assuming subsampling inside JPEG data is correct", - m_subsampling_hor, m_subsampling_ver); - } - else - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling inside JPEG data [{0},{1}] does not match subsampling tag values [{2},{3}]; assuming subsampling inside JPEG data is correct", - m_subsampling_hor, m_subsampling_ver, mh, mv); - } - } - - if (m_subsampling_force_desubsampling_inside_decompression) - { - if (!m_subsampling_tag) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling tag is not set, yet subsampling inside JPEG data does not match default values [2,2] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression"); - } - else - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling inside JPEG data does not match subsampling tag values [{0},{1}] (nor any other values allowed in TIFF); assuming subsampling inside JPEG data is correct and desubsampling inside JPEG decompression", - mh, mv); - } - } - - if (!m_subsampling_force_desubsampling_inside_decompression) - { - if (m_subsampling_hor < m_subsampling_ver) - { - Tiff.WarningExt(m_tif, m_tif.m_clientdata, module, - "Subsampling values [{0},{1}] are not allowed in TIFF", - m_subsampling_hor, m_subsampling_ver); - } - } - } - - m_subsamplingcorrect_done = true; - } - - private bool OJPEGReadHeaderInfo() - { - const string module = "OJPEGReadHeaderInfo"; - Debug.Assert(!m_readheader_done); - m_image_width = (uint)m_tif.m_dir.td_imagewidth; - m_image_length = (uint)m_tif.m_dir.td_imagelength; - if (m_tif.IsTiled()) - { - m_strile_width = (uint)m_tif.m_dir.td_tilewidth; - m_strile_length = (uint)m_tif.m_dir.td_tilelength; - m_strile_length_total = ((m_image_length + m_strile_length - 1) / m_strile_length) * m_strile_length; - } - else - { - m_strile_width = m_image_width; - m_strile_length = (uint)m_tif.m_dir.td_rowsperstrip; - m_strile_length_total = m_image_length; - } - m_samples_per_pixel = (byte)m_tif.m_dir.td_samplesperpixel; - if (m_samples_per_pixel == 1) - { - m_plane_sample_offset = 0; - m_samples_per_pixel_per_plane = m_samples_per_pixel; - m_subsampling_hor = 1; - m_subsampling_ver = 1; - } - else - { - if (m_samples_per_pixel != 3) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "SamplesPerPixel {0} not supported for this compression scheme", - m_samples_per_pixel); - return false; - } - - m_plane_sample_offset = 0; - if (m_tif.m_dir.td_planarconfig == PlanarConfig.Contig) - m_samples_per_pixel_per_plane = 3; - else - m_samples_per_pixel_per_plane = 1; - } - if (m_strile_length < m_image_length) - { - if (m_strile_length % (m_subsampling_ver * 8) != 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, - "Incompatible vertical subsampling and image strip/tile length"); - return false; - } - m_restart_interval = (ushort)(((m_strile_width + m_subsampling_hor * 8 - 1) / (m_subsampling_hor * 8)) * (m_strile_length / (m_subsampling_ver * 8))); - } - - if (!OJPEGReadHeaderInfoSec()) - return false; - - m_sos_end[0].m_log = true; - m_sos_end[0].m_in_buffer_source = m_in_buffer_source; - m_sos_end[0].m_in_buffer_next_strile = m_in_buffer_next_strile; - m_sos_end[0].m_in_buffer_file_pos = m_in_buffer_file_pos - m_in_buffer_togo; - m_sos_end[0].m_in_buffer_file_togo = m_in_buffer_file_togo + m_in_buffer_togo; - m_readheader_done = true; - return true; - } - - private bool OJPEGReadSecondarySos(short s) - { - Debug.Assert(s > 0); - Debug.Assert(s < 3); - Debug.Assert(m_sos_end[0].m_log); - Debug.Assert(!m_sos_end[s].m_log); - - m_plane_sample_offset = (byte)(s - 1); - while (!m_sos_end[m_plane_sample_offset].m_log) - m_plane_sample_offset--; - - m_in_buffer_source = m_sos_end[m_plane_sample_offset].m_in_buffer_source; - m_in_buffer_next_strile = m_sos_end[m_plane_sample_offset].m_in_buffer_next_strile; - m_in_buffer_file_pos = m_sos_end[m_plane_sample_offset].m_in_buffer_file_pos; - m_in_buffer_file_pos_log = false; - m_in_buffer_file_togo = m_sos_end[m_plane_sample_offset].m_in_buffer_file_togo; - m_in_buffer_togo = 0; - m_in_buffer_cur = 0; - - while (m_plane_sample_offset < s) - { - do - { - byte m; - if (!OJPEGReadByte(out m)) - return false; - - if (m == 255) - { - do - { - if (!OJPEGReadByte(out m)) - return false; - - if (m != 255) - break; - } while (true); - - if (m == (byte)JpegMarkerType.SOS) - break; - } - } while (true); - - m_plane_sample_offset++; - if (!OJPEGReadHeaderInfoSecStreamSos()) - return false; - - m_sos_end[m_plane_sample_offset].m_log = true; - m_sos_end[m_plane_sample_offset].m_in_buffer_source = m_in_buffer_source; - m_sos_end[m_plane_sample_offset].m_in_buffer_next_strile = m_in_buffer_next_strile; - m_sos_end[m_plane_sample_offset].m_in_buffer_file_pos = m_in_buffer_file_pos - m_in_buffer_togo; - m_sos_end[m_plane_sample_offset].m_in_buffer_file_togo = m_in_buffer_file_togo + m_in_buffer_togo; - } - - return true; - } - - private bool OJPEGWriteHeaderInfo() - { - Debug.Assert(!m_libjpeg_session_active); - - m_out_state = OJPEGStateOutState.ososSoi; - m_restart_index = 0; - - if (!jpeg_create_decompress_encap()) - return false; - - m_libjpeg_session_active = true; - m_libjpeg_jpeg_source_mgr = new OJpegSrcManager(this); - m_libjpeg_jpeg_decompress_struct.Src = m_libjpeg_jpeg_source_mgr; - - if (jpeg_read_header_encap(true) == ReadResult.Suspended) - return false; - - if (!m_subsampling_force_desubsampling_inside_decompression && (m_samples_per_pixel_per_plane > 1)) - { - m_libjpeg_jpeg_decompress_struct.Raw_data_out = true; - //#if JPEG_LIB_VERSION >= 70 - // libjpeg_jpeg_decompress_struct.do_fancy_upsampling=FALSE; - //#endif - m_libjpeg_jpeg_query_style = 0; - if (!m_subsampling_convert_log) - { - Debug.Assert(m_subsampling_convert_ybuf == null); - Debug.Assert(m_subsampling_convert_cbbuf == null); - Debug.Assert(m_subsampling_convert_crbuf == null); - Debug.Assert(m_subsampling_convert_ycbcrimage == null); - - m_subsampling_convert_ylinelen = (uint)((m_strile_width + m_subsampling_hor * 8 - 1) / (m_subsampling_hor * 8) * m_subsampling_hor * 8); - m_subsampling_convert_ylines = (uint)(m_subsampling_ver * 8); - m_subsampling_convert_clinelen = m_subsampling_convert_ylinelen / m_subsampling_hor; - m_subsampling_convert_clines = 8; - - m_subsampling_convert_ybuf = new byte[m_subsampling_convert_ylines][]; - for (int i = 0; i < m_subsampling_convert_ylines; i++) - m_subsampling_convert_ybuf[i] = new byte[m_subsampling_convert_ylinelen]; - - m_subsampling_convert_cbbuf = new byte[m_subsampling_convert_clines][]; - m_subsampling_convert_crbuf = new byte[m_subsampling_convert_clines][]; - for (int i = 0; i < m_subsampling_convert_clines; i++) - { - m_subsampling_convert_cbbuf[i] = new byte[m_subsampling_convert_clinelen]; - m_subsampling_convert_crbuf[i] = new byte[m_subsampling_convert_clinelen]; - } - - m_subsampling_convert_ycbcrimage = new byte[3][][]; - m_subsampling_convert_ycbcrimage[0] = new byte[m_subsampling_convert_ylines][]; - for (uint n = 0; n < m_subsampling_convert_ylines; n++) - m_subsampling_convert_ycbcrimage[0][n] = m_subsampling_convert_ybuf[n]; - - m_subsampling_convert_ycbcrimage[1] = new byte[m_subsampling_convert_clines][]; - for (uint n = 0; n < m_subsampling_convert_clines; n++) - m_subsampling_convert_ycbcrimage[1][n] = m_subsampling_convert_cbbuf[n]; - - m_subsampling_convert_ycbcrimage[2] = new byte[m_subsampling_convert_clines][]; - for (uint n = 0; n < m_subsampling_convert_clines; n++) - m_subsampling_convert_ycbcrimage[2][n] = m_subsampling_convert_crbuf[n]; - - m_subsampling_convert_clinelenout = ((m_strile_width + m_subsampling_hor - 1) / m_subsampling_hor); - m_subsampling_convert_state = 0; - m_bytes_per_line = (uint)(m_subsampling_convert_clinelenout * (m_subsampling_ver * m_subsampling_hor + 2)); - m_lines_per_strile = ((m_strile_length + m_subsampling_ver - 1) / m_subsampling_ver); - m_subsampling_convert_log = true; - } - } - else - { - m_libjpeg_jpeg_decompress_struct.Jpeg_color_space = ColorSpace.Unknown; - m_libjpeg_jpeg_decompress_struct.Out_color_space = ColorSpace.Unknown; - m_libjpeg_jpeg_query_style = 1; - m_bytes_per_line = m_samples_per_pixel_per_plane * m_strile_width; - m_lines_per_strile = m_strile_length; - } - - if (!jpeg_start_decompress_encap()) - return false; - - m_writeheader_done = true; - return true; - } - - private void OJPEGLibjpegSessionAbort() - { - Debug.Assert(m_libjpeg_session_active); - m_libjpeg_jpeg_decompress_struct.jpeg_destroy(); - m_libjpeg_session_active = false; - } - - private bool OJPEGReadHeaderInfoSec() - { - const string module = "OJPEGReadHeaderInfoSec"; - byte m; - ushort n; - byte o; - if (m_file_size == 0) - m_file_size = (uint)m_tif.GetStream().Size(m_tif.m_clientdata); - - if (m_jpeg_interchange_format != 0) - { - if (m_jpeg_interchange_format >= m_file_size) - { - m_jpeg_interchange_format = 0; - m_jpeg_interchange_format_length = 0; - } - else - { - if ((m_jpeg_interchange_format_length == 0) || (m_jpeg_interchange_format + m_jpeg_interchange_format_length > m_file_size)) - m_jpeg_interchange_format_length = m_file_size - m_jpeg_interchange_format; - } - } - - m_in_buffer_source = OJPEGStateInBufferSource.osibsNotSetYet; - m_in_buffer_next_strile = 0; - m_in_buffer_strile_count = (uint)m_tif.m_dir.td_nstrips; - m_in_buffer_file_togo = 0; - m_in_buffer_togo = 0; - - do - { - if (!OJPEGReadBytePeek(out m)) - return false; - - if (m != 255) - break; - - OJPEGReadByteAdvance(); - do - { - if (!OJPEGReadByte(out m)) - return false; - } while (m == 255); - - switch ((JpegMarkerType)m) - { - case JpegMarkerType.SOI: - /* this type of marker has no data, and should be skipped */ - break; - case JpegMarkerType.COM: - case JpegMarkerType.APP0: - case JpegMarkerType.APP1: - case JpegMarkerType.APP2: - case JpegMarkerType.APP3: - case JpegMarkerType.APP4: - case JpegMarkerType.APP5: - case JpegMarkerType.APP6: - case JpegMarkerType.APP7: - case JpegMarkerType.APP8: - case JpegMarkerType.APP9: - case JpegMarkerType.APP10: - case JpegMarkerType.APP11: - case JpegMarkerType.APP12: - case JpegMarkerType.APP13: - case JpegMarkerType.APP14: - case JpegMarkerType.APP15: - /* this type of marker has data, but it has no use to us (and no place here) and should be skipped */ - if (!OJPEGReadWord(out n)) - return false; - if (n < 2) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt JPEG data"); - return false; - } - if (n > 2) - OJPEGReadSkip((ushort)(n - 2)); - break; - case JpegMarkerType.DRI: - if (!OJPEGReadHeaderInfoSecStreamDri()) - return false; - break; - case JpegMarkerType.DQT: - if (!OJPEGReadHeaderInfoSecStreamDqt()) - return false; - break; - case JpegMarkerType.DHT: - if (!OJPEGReadHeaderInfoSecStreamDht()) - return false; - break; - case JpegMarkerType.SOF0: - case JpegMarkerType.SOF1: - case JpegMarkerType.SOF3: - if (!OJPEGReadHeaderInfoSecStreamSof(m)) - return false; - if (m_subsamplingcorrect) - return true; - break; - case JpegMarkerType.SOS: - if (m_subsamplingcorrect) - return true; - Debug.Assert(m_plane_sample_offset == 0); - if (!OJPEGReadHeaderInfoSecStreamSos()) - return false; - break; - default: - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Unknown marker type {0} in JPEG data", m); - return false; - } - } while (m != (byte)JpegMarkerType.SOS); - - if (m_subsamplingcorrect) - return true; - - if (!m_sof_log) - { - if (!OJPEGReadHeaderInfoSecTablesQTable()) - return false; - - m_sof_marker_id = (byte)JpegMarkerType.SOF0; - for (o = 0; o < m_samples_per_pixel; o++) - m_sof_c[o] = o; - - m_sof_hv[0] = (byte)((m_subsampling_hor << 4) | m_subsampling_ver); - for (o = 1; o < m_samples_per_pixel; o++) - m_sof_hv[o] = 17; - - m_sof_x = m_strile_width; - m_sof_y = m_strile_length_total; - m_sof_log = true; - - if (!OJPEGReadHeaderInfoSecTablesDcTable()) - return false; - - if (!OJPEGReadHeaderInfoSecTablesAcTable()) - return false; - - for (o = 1; o < m_samples_per_pixel; o++) - m_sos_cs[o] = o; - } - - return true; - } - - private bool OJPEGReadHeaderInfoSecStreamDri() - { - // this could easilly cause trouble in some cases... - // but no such cases have occured so far - const string module = "OJPEGReadHeaderInfoSecStreamDri"; - ushort m; - if (!OJPEGReadWord(out m)) - return false; - - if (m != 4) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DRI marker in JPEG data"); - return false; - } - - if (!OJPEGReadWord(out m)) - return false; - - m_restart_interval = m; - return true; - } - - private bool OJPEGReadHeaderInfoSecStreamDqt() - { - // this is a table marker, and it is to be saved as a whole for - // exact pushing on the jpeg stream later on - const string module = "OJPEGReadHeaderInfoSecStreamDqt"; - ushort m; - uint na; - byte[] nb; - byte o; - if (!OJPEGReadWord(out m)) - return false; - - if (m <= 2) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DQT marker in JPEG data"); - return false; - } - - if (m_subsamplingcorrect) - { - OJPEGReadSkip((ushort)(m - 2)); - } - else - { - m -= 2; - do - { - if (m < 65) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DQT marker in JPEG data"); - return false; - } - - na = 69; - nb = new byte[na]; - nb[0] = 255; - nb[1] = (byte)JpegMarkerType.DQT; - nb[2] = 0; - nb[3] = 67; - if (!OJPEGReadBlock(65, nb, 4)) - return false; - - o = (byte)(nb[4] & 15); - if (3 < o) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DQT marker in JPEG data"); - return false; - } - - m_qtable[o] = nb; - m -= 65; - } while (m > 0); - } - return true; - } - - private bool OJPEGReadHeaderInfoSecStreamDht() - { - // this is a table marker, and it is to be saved as a whole for - // exact pushing on the jpeg stream later on - // TODO: the following assumes there is only one table in - // this marker... but i'm not quite sure that assumption is - // guaranteed correct - const string module = "OJPEGReadHeaderInfoSecStreamDht"; - ushort m; - uint na; - byte[] nb; - byte o; - if (!OJPEGReadWord(out m)) - return false; - if (m <= 2) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DHT marker in JPEG data"); - return false; - } - if (m_subsamplingcorrect) - { - OJPEGReadSkip((ushort)(m - 2)); - } - else - { - na = (uint)(2 + m); - nb = new byte[na]; - nb[0] = 255; - nb[1] = (byte)JpegMarkerType.DHT; - nb[2] = (byte)(m >> 8); - nb[3] = (byte)(m & 255); - if (!OJPEGReadBlock((ushort)(m - 2), nb, 4)) - return false; - o = nb[4]; - if ((o & 240) == 0) - { - if (3 < o) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DHT marker in JPEG data"); - return false; - } - m_dctable[o] = nb; - } - else - { - if ((o & 240) != 16) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DHT marker in JPEG data"); - return false; - } - o &= 15; - if (3 < o) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt DHT marker in JPEG data"); - return false; - } - m_actable[o] = nb; - } - } - return true; - } - - private bool OJPEGReadHeaderInfoSecStreamSof(byte marker_id) - { - /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ - const string module = "OJPEGReadHeaderInfoSecStreamSof"; - ushort m; - ushort n; - byte o; - ushort p; - ushort q; - if (m_sof_log) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt JPEG data"); - return false; - } - if (!m_subsamplingcorrect) - m_sof_marker_id = marker_id; - /* Lf: data length */ - if (!OJPEGReadWord(out m)) - return false; - if (m < 11) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOF marker in JPEG data"); - return false; - } - m -= 8; - if (m % 3 != 0) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOF marker in JPEG data"); - return false; - } - n = (ushort)(m / 3); - if (!m_subsamplingcorrect) - { - if (n != m_samples_per_pixel) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected number of samples"); - return false; - } - } - /* P: Sample precision */ - if (!OJPEGReadByte(out o)) - return false; - if (o != 8) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected number of bits per sample"); - return false; - } - /* Y: Number of lines, X: Number of samples per line */ - if (m_subsamplingcorrect) - OJPEGReadSkip(4); - else - { - /* TODO: probably best to also add check on allowed upper bound, especially x, may cause buffer overflow otherwise i think */ - /* Y: Number of lines */ - if (!OJPEGReadWord(out p)) - return false; - if ((p < m_image_length) && (p < m_strile_length_total)) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected height"); - return false; - } - m_sof_y = p; - /* X: Number of samples per line */ - if (!OJPEGReadWord(out p)) - return false; - if ((p < m_image_width) && (p < m_strile_width)) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected width"); - return false; - } - m_sof_x = p; - } - /* Nf: Number of image components in frame */ - if (!OJPEGReadByte(out o)) - return false; - if (o != n) - { - if (!m_subsamplingcorrect) - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOF marker in JPEG data"); - return false; - } - /* per component stuff */ - /* TODO: double-check that flow implies that n cannot be as big as to make us overflow sof_c, sof_hv and sof_tq arrays */ - for (q = 0; q < n; q++) - { - /* C: Component identifier */ - if (!OJPEGReadByte(out o)) - return false; - if (!m_subsamplingcorrect) - m_sof_c[q] = o; - /* H: Horizontal sampling factor, and V: Vertical sampling factor */ - if (!OJPEGReadByte(out o)) - return false; - if (m_subsamplingcorrect) - { - if (q == 0) - { - m_subsampling_hor = (byte)(o >> 4); - m_subsampling_ver = (byte)(o & 15); - if (((m_subsampling_hor != 1) && (m_subsampling_hor != 2) && (m_subsampling_hor != 4)) || - ((m_subsampling_ver != 1) && (m_subsampling_ver != 2) && (m_subsampling_ver != 4))) - m_subsampling_force_desubsampling_inside_decompression = true; - } - else - { - if (o != 17) - m_subsampling_force_desubsampling_inside_decompression = true; - } - } - else - { - m_sof_hv[q] = o; - if (!m_subsampling_force_desubsampling_inside_decompression) - { - if (q == 0) - { - if (o != ((m_subsampling_hor << 4) | m_subsampling_ver)) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected subsampling values"); - return false; - } - } - else - { - if (o != 17) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "JPEG compressed data indicates unexpected subsampling values"); - return false; - } - } - } - } - /* Tq: Quantization table destination selector */ - if (!OJPEGReadByte(out o)) - return false; - if (!m_subsamplingcorrect) - m_sof_tq[q] = o; - } - if (!m_subsamplingcorrect) - m_sof_log = true; - return true; - } - - private bool OJPEGReadHeaderInfoSecStreamSos() - { - /* this marker needs to be checked, and part of its data needs to be saved for regeneration later on */ - const string module = "OJPEGReadHeaderInfoSecStreamSos"; - ushort m; - byte n; - byte o; - Debug.Assert(!m_subsamplingcorrect); - if (!m_sof_log) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOS marker in JPEG data"); - return false; - } - /* Ls */ - if (!OJPEGReadWord(out m)) - return false; - if (m != 6 + m_samples_per_pixel_per_plane * 2) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOS marker in JPEG data"); - return false; - } - /* Ns */ - if (!OJPEGReadByte(out n)) - return false; - if (n != m_samples_per_pixel_per_plane) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt SOS marker in JPEG data"); - return false; - } - /* Cs, Td, and Ta */ - for (o = 0; o < m_samples_per_pixel_per_plane; o++) - { - /* Cs */ - if (!OJPEGReadByte(out n)) - return false; - m_sos_cs[m_plane_sample_offset + o] = n; - /* Td and Ta */ - if (!OJPEGReadByte(out n)) - return false; - m_sos_tda[m_plane_sample_offset + o] = n; - } - /* skip Ss, Se, Ah, en Al -> no check, as per Tom Lane recommendation, as per LibJpeg source */ - OJPEGReadSkip(3); - return true; - } - - private bool OJPEGReadHeaderInfoSecTablesQTable() - { - const string module = "OJPEGReadHeaderInfoSecTablesQTable"; - byte m; - byte n; - uint oa; - byte[] ob; - uint p; - if (m_qtable_offset[0] == 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Missing JPEG tables"); - return false; - } - m_in_buffer_file_pos_log = false; - for (m = 0; m < m_samples_per_pixel; m++) - { - if ((m_qtable_offset[m] != 0) && ((m == 0) || (m_qtable_offset[m] != m_qtable_offset[m - 1]))) - { - for (n = 0; n < m - 1; n++) - { - if (m_qtable_offset[m] == m_qtable_offset[n]) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt JpegQTables tag value"); - return false; - } - } - oa = 69; - ob = new byte[oa]; - ob[0] = 255; - ob[1] = (byte)JpegMarkerType.DQT; - ob[2] = 0; - ob[3] = 67; - ob[4] = m; - TiffStream stream = m_tif.GetStream(); - stream.Seek(m_tif.m_clientdata, m_qtable_offset[m], SeekOrigin.Begin); - p = (uint)stream.Read(m_tif.m_clientdata, ob, 5, 64); - if (p != 64) - return false; - m_qtable[m] = ob; - m_sof_tq[m] = m; - } - else - m_sof_tq[m] = m_sof_tq[m - 1]; - } - return true; - } - - private bool OJPEGReadHeaderInfoSecTablesDcTable() - { - const string module = "OJPEGReadHeaderInfoSecTablesDcTable"; - byte m; - byte n; - byte[] o = new byte[16]; - uint p; - uint q; - uint ra; - byte[] rb; - if (m_dctable_offset[0] == 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Missing JPEG tables"); - return false; - } - m_in_buffer_file_pos_log = false; - for (m = 0; m < m_samples_per_pixel; m++) - { - if ((m_dctable_offset[m] != 0) && ((m == 0) || (m_dctable_offset[m] != m_dctable_offset[m - 1]))) - { - for (n = 0; n < m - 1; n++) - { - if (m_dctable_offset[m] == m_dctable_offset[n]) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt JpegDcTables tag value"); - return false; - } - } - - TiffStream stream = m_tif.GetStream(); - stream.Seek(m_tif.m_clientdata, m_dctable_offset[m], SeekOrigin.Begin); - p = (uint)stream.Read(m_tif.m_clientdata, o, 0, 16); - if (p != 16) - return false; - q = 0; - for (n = 0; n < 16; n++) - q += o[n]; - ra = 21 + q; - rb = new byte[ra]; - rb[0] = 255; - rb[1] = (byte)JpegMarkerType.DHT; - rb[2] = (byte)((19 + q) >> 8); - rb[3] = (byte)((19 + q) & 255); - rb[4] = m; - for (n = 0; n < 16; n++) - rb[5 + n] = o[n]; - - p = (uint)stream.Read(m_tif.m_clientdata, rb, 21, (int)q); - if (p != q) - return false; - m_dctable[m] = rb; - m_sos_tda[m] = (byte)(m << 4); - } - else - m_sos_tda[m] = m_sos_tda[m - 1]; - } - return true; - } - - private bool OJPEGReadHeaderInfoSecTablesAcTable() - { - const string module = "OJPEGReadHeaderInfoSecTablesAcTable"; - byte m; - byte n; - byte[] o = new byte[16]; - uint p; - uint q; - uint ra; - byte[] rb; - if (m_actable_offset[0] == 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Missing JPEG tables"); - return false; - } - m_in_buffer_file_pos_log = false; - for (m = 0; m < m_samples_per_pixel; m++) - { - if ((m_actable_offset[m] != 0) && ((m == 0) || (m_actable_offset[m] != m_actable_offset[m - 1]))) - { - for (n = 0; n < m - 1; n++) - { - if (m_actable_offset[m] == m_actable_offset[n]) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, module, "Corrupt JpegAcTables tag value"); - return false; - } - } - TiffStream stream = m_tif.GetStream(); - stream.Seek(m_tif.m_clientdata, m_actable_offset[m], SeekOrigin.Begin); - p = (uint)stream.Read(m_tif.m_clientdata, o, 0, 16); - if (p != 16) - return false; - q = 0; - for (n = 0; n < 16; n++) - q += o[n]; - ra = 21 + q; - rb = new byte[ra]; - rb[0] = 255; - rb[1] = (byte)JpegMarkerType.DHT; - rb[2] = (byte)((19 + q) >> 8); - rb[3] = (byte)((19 + q) & 255); - rb[4] = (byte)(16 | m); - for (n = 0; n < 16; n++) - rb[5 + n] = o[n]; - - p = (uint)stream.Read(m_tif.m_clientdata, rb, 21, (int)q); - if (p != q) - return false; - m_actable[m] = rb; - m_sos_tda[m] = (byte)(m_sos_tda[m] | m); - } - else - m_sos_tda[m] = (byte)(m_sos_tda[m] | (m_sos_tda[m - 1] & 15)); - } - return true; - } - - private bool OJPEGReadBufferFill() - { - ushort m; - int n; - /* TODO: double-check: when subsamplingcorrect is set, no call to TIFFErrorExt or TIFFWarningExt should be made - * in any other case, seek or read errors should be passed through */ - do - { - if (m_in_buffer_file_togo != 0) - { - TiffStream stream = m_tif.GetStream(); - if (!m_in_buffer_file_pos_log) - { - stream.Seek(m_tif.m_clientdata, m_in_buffer_file_pos, SeekOrigin.Begin); - m_in_buffer_file_pos_log = true; - } - m = OJPEG_BUFFER; - if (m > m_in_buffer_file_togo) - m = (ushort)m_in_buffer_file_togo; - - n = stream.Read(m_tif.m_clientdata, m_in_buffer, 0, (int)m); - if (n == 0) - return false; - Debug.Assert(n > 0); - Debug.Assert(n <= OJPEG_BUFFER); - Debug.Assert(n < 65536); - Debug.Assert((ushort)n <= m_in_buffer_file_togo); - m = (ushort)n; - m_in_buffer_togo = m; - m_in_buffer_cur = 0; - m_in_buffer_file_togo -= m; - m_in_buffer_file_pos += m; - break; - } - m_in_buffer_file_pos_log = false; - switch (m_in_buffer_source) - { - case OJPEGStateInBufferSource.osibsNotSetYet: - if (m_jpeg_interchange_format != 0) - { - m_in_buffer_file_pos = m_jpeg_interchange_format; - m_in_buffer_file_togo = m_jpeg_interchange_format_length; - } - m_in_buffer_source = OJPEGStateInBufferSource.osibsJpegInterchangeFormat; - break; - case OJPEGStateInBufferSource.osibsJpegInterchangeFormat: - m_in_buffer_source = OJPEGStateInBufferSource.osibsStrile; - goto case OJPEGStateInBufferSource.osibsStrile; - case OJPEGStateInBufferSource.osibsStrile: - if (m_in_buffer_next_strile == m_in_buffer_strile_count) - m_in_buffer_source = OJPEGStateInBufferSource.osibsEof; - else - { - if (m_tif.m_dir.td_stripoffset == null) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, "Strip offsets are missing"); - return false; - } - m_in_buffer_file_pos = m_tif.m_dir.td_stripoffset[m_in_buffer_next_strile]; - if (m_in_buffer_file_pos != 0) - { - if (m_in_buffer_file_pos >= m_file_size) - m_in_buffer_file_pos = 0; - else - { - m_in_buffer_file_togo = m_tif.m_dir.td_stripbytecount[m_in_buffer_next_strile]; - if (m_in_buffer_file_togo == 0) - m_in_buffer_file_pos = 0; - else if (m_in_buffer_file_pos + m_in_buffer_file_togo > m_file_size) - m_in_buffer_file_togo = m_file_size - m_in_buffer_file_pos; - } - } - m_in_buffer_next_strile++; - } - break; - default: - return false; - } - } while (true); - return true; - } - - private bool OJPEGReadByte(out byte b) - { - if (m_in_buffer_togo == 0) - { - if (!OJPEGReadBufferFill()) - { - b = 0; - return false; - } - - Debug.Assert(m_in_buffer_togo > 0); - } - - b = m_in_buffer[m_in_buffer_cur]; - m_in_buffer_cur++; - m_in_buffer_togo--; - return true; - } - - public bool OJPEGReadBytePeek(out byte b) - { - if (m_in_buffer_togo == 0) - { - if (!OJPEGReadBufferFill()) - { - b = 0; - return false; - } - - Debug.Assert(m_in_buffer_togo > 0); - } - - b = m_in_buffer[m_in_buffer_cur]; - return true; - } - - private void OJPEGReadByteAdvance() - { - Debug.Assert(m_in_buffer_togo > 0); - m_in_buffer_cur++; - m_in_buffer_togo--; - } - - private bool OJPEGReadWord(out ushort word) - { - word = 0; - byte m; - if (!OJPEGReadByte(out m)) - return false; - - word = (ushort)(m << 8); - if (!OJPEGReadByte(out m)) - return false; - - word |= m; - return true; - } - - public bool OJPEGReadBlock(ushort len, byte[] mem, int offset) - { - ushort mlen; - ushort n; - Debug.Assert(len > 0); - mlen = len; - int mmem = offset; - do - { - if (m_in_buffer_togo == 0) - { - if (!OJPEGReadBufferFill()) - return false; - Debug.Assert(m_in_buffer_togo > 0); - } - n = mlen; - if (n > m_in_buffer_togo) - n = m_in_buffer_togo; - - Buffer.BlockCopy(m_in_buffer, m_in_buffer_cur, mem, mmem, n); - m_in_buffer_cur += n; - m_in_buffer_togo -= n; - mlen -= n; - mmem += n; - } while (mlen > 0); - return true; - } - - private void OJPEGReadSkip(ushort len) - { - ushort m; - ushort n; - m = len; - n = m; - if (n > m_in_buffer_togo) - n = m_in_buffer_togo; - m_in_buffer_cur += n; - m_in_buffer_togo -= n; - m -= n; - if (m > 0) - { - Debug.Assert(m_in_buffer_togo == 0); - n = m; - if (n > m_in_buffer_file_togo) - n = (ushort)m_in_buffer_file_togo; - m_in_buffer_file_pos += n; - m_in_buffer_file_togo -= n; - m_in_buffer_file_pos_log = false; - /* we don't skip past jpeginterchangeformat/strile block... - * if that is asked from us, we're dealing with totally bazurk - * data anyway, and we've not seen this happening on any - * testfile, so we might as well likely cause some other - * meaningless error to be passed at some later time - */ - } - } - - internal bool OJPEGWriteStream(out byte[] mem, out uint len) - { - mem = null; - len = 0; - do - { - Debug.Assert(m_out_state <= OJPEGStateOutState.ososEoi); - switch (m_out_state) - { - case OJPEGStateOutState.ososSoi: - OJPEGWriteStreamSoi(out mem, out len); - break; - case OJPEGStateOutState.ososQTable0: - OJPEGWriteStreamQTable(0, out mem, out len); - break; - case OJPEGStateOutState.ososQTable1: - OJPEGWriteStreamQTable(1, out mem, out len); - break; - case OJPEGStateOutState.ososQTable2: - OJPEGWriteStreamQTable(2, out mem, out len); - break; - case OJPEGStateOutState.ososQTable3: - OJPEGWriteStreamQTable(3, out mem, out len); - break; - case OJPEGStateOutState.ososDcTable0: - OJPEGWriteStreamDcTable(0, out mem, out len); - break; - case OJPEGStateOutState.ososDcTable1: - OJPEGWriteStreamDcTable(1, out mem, out len); - break; - case OJPEGStateOutState.ososDcTable2: - OJPEGWriteStreamDcTable(2, out mem, out len); - break; - case OJPEGStateOutState.ososDcTable3: - OJPEGWriteStreamDcTable(3, out mem, out len); - break; - case OJPEGStateOutState.ososAcTable0: - OJPEGWriteStreamAcTable(0, out mem, out len); - break; - case OJPEGStateOutState.ososAcTable1: - OJPEGWriteStreamAcTable(1, out mem, out len); - break; - case OJPEGStateOutState.ososAcTable2: - OJPEGWriteStreamAcTable(2, out mem, out len); - break; - case OJPEGStateOutState.ososAcTable3: - OJPEGWriteStreamAcTable(3, out mem, out len); - break; - case OJPEGStateOutState.ososDri: - OJPEGWriteStreamDri(out mem, out len); - break; - case OJPEGStateOutState.ososSof: - OJPEGWriteStreamSof(out mem, out len); - break; - case OJPEGStateOutState.ososSos: - OJPEGWriteStreamSos(out mem, out len); - break; - case OJPEGStateOutState.ososCompressed: - if (!OJPEGWriteStreamCompressed(out mem, out len)) - return false; - break; - case OJPEGStateOutState.ososRst: - OJPEGWriteStreamRst(out mem, out len); - break; - case OJPEGStateOutState.ososEoi: - OJPEGWriteStreamEoi(out mem, out len); - break; - } - } while (len == 0); - return true; - } - - private void OJPEGWriteStreamSoi(out byte[] mem, out uint len) - { - Debug.Assert(OJPEG_BUFFER >= 2); - m_out_buffer[0] = 255; - m_out_buffer[1] = (byte)JpegMarkerType.SOI; - len = 2; - mem = m_out_buffer; - m_out_state++; - } - - private void OJPEGWriteStreamQTable(byte table_index, out byte[] mem, out uint len) - { - mem = null; - len = 0; - - if (m_qtable[table_index] != null) - { - mem = m_qtable[table_index]; - len = (uint)m_qtable[table_index].Length; - } - m_out_state++; - } - - private void OJPEGWriteStreamDcTable(byte table_index, out byte[] mem, out uint len) - { - mem = null; - len = 0; - - if (m_dctable[table_index] != null) - { - mem = m_dctable[table_index]; - len = (uint)m_dctable[table_index].Length; - } - m_out_state++; - } - - private void OJPEGWriteStreamAcTable(byte table_index, out byte[] mem, out uint len) - { - mem = null; - len = 0; - - if (m_actable[table_index] != null) - { - mem = m_actable[table_index]; - len = (uint)m_actable[table_index].Length; - } - m_out_state++; - } - - private void OJPEGWriteStreamDri(out byte[] mem, out uint len) - { - Debug.Assert(OJPEG_BUFFER >= 6); - mem = null; - len = 0; - - if (m_restart_interval != 0) - { - m_out_buffer[0] = 255; - m_out_buffer[1] = (byte)JpegMarkerType.DRI; - m_out_buffer[2] = 0; - m_out_buffer[3] = 4; - m_out_buffer[4] = (byte)(m_restart_interval >> 8); - m_out_buffer[5] = (byte)(m_restart_interval & 255); - len = 6; - mem = m_out_buffer; - } - m_out_state++; - } - - private void OJPEGWriteStreamSof(out byte[] mem, out uint len) - { - byte m; - Debug.Assert(OJPEG_BUFFER >= 2 + 8 + m_samples_per_pixel_per_plane * 3); - Debug.Assert(255 >= 8 + m_samples_per_pixel_per_plane * 3); - m_out_buffer[0] = 255; - m_out_buffer[1] = m_sof_marker_id; - /* Lf */ - m_out_buffer[2] = 0; - m_out_buffer[3] = (byte)(8 + m_samples_per_pixel_per_plane * 3); - /* P */ - m_out_buffer[4] = 8; - /* Y */ - m_out_buffer[5] = (byte)(m_sof_y >> 8); - m_out_buffer[6] = (byte)(m_sof_y & 255); - /* X */ - m_out_buffer[7] = (byte)(m_sof_x >> 8); - m_out_buffer[8] = (byte)(m_sof_x & 255); - /* Nf */ - m_out_buffer[9] = m_samples_per_pixel_per_plane; - for (m = 0; m < m_samples_per_pixel_per_plane; m++) - { - /* C */ - m_out_buffer[10 + m * 3] = m_sof_c[m_plane_sample_offset + m]; - /* H and V */ - m_out_buffer[10 + m * 3 + 1] = m_sof_hv[m_plane_sample_offset + m]; - /* Tq */ - m_out_buffer[10 + m * 3 + 2] = m_sof_tq[m_plane_sample_offset + m]; - } - len = (uint)(10 + m_samples_per_pixel_per_plane * 3); - mem = m_out_buffer; - m_out_state++; - } - - private void OJPEGWriteStreamSos(out byte[] mem, out uint len) - { - byte m; - Debug.Assert(OJPEG_BUFFER >= 2 + 6 + m_samples_per_pixel_per_plane * 2); - Debug.Assert(255 >= 6 + m_samples_per_pixel_per_plane * 2); - m_out_buffer[0] = 255; - m_out_buffer[1] = (byte)JpegMarkerType.SOS; - /* Ls */ - m_out_buffer[2] = 0; - m_out_buffer[3] = (byte)(6 + m_samples_per_pixel_per_plane * 2); - /* Ns */ - m_out_buffer[4] = m_samples_per_pixel_per_plane; - for (m = 0; m < m_samples_per_pixel_per_plane; m++) - { - /* Cs */ - m_out_buffer[5 + m * 2] = m_sos_cs[m_plane_sample_offset + m]; - /* Td and Ta */ - m_out_buffer[5 + m * 2 + 1] = m_sos_tda[m_plane_sample_offset + m]; - } - /* Ss */ - m_out_buffer[5 + m_samples_per_pixel_per_plane * 2] = 0; - /* Se */ - m_out_buffer[5 + m_samples_per_pixel_per_plane * 2 + 1] = 63; - /* Ah and Al */ - m_out_buffer[5 + m_samples_per_pixel_per_plane * 2 + 2] = 0; - len = (uint)(8 + m_samples_per_pixel_per_plane * 2); - mem = m_out_buffer; - m_out_state++; - } - - private bool OJPEGWriteStreamCompressed(out byte[] mem, out uint len) - { - mem = null; - len = 0; - - if (m_in_buffer_togo == 0) - { - if (!OJPEGReadBufferFill()) - return false; - Debug.Assert(m_in_buffer_togo > 0); - } - len = m_in_buffer_togo; - - if (m_in_buffer_cur == 0) - { - mem = m_in_buffer; - } - else - { - mem = new byte[len]; - Buffer.BlockCopy(m_in_buffer, m_in_buffer_cur, mem, 0, (int)len); - } - - m_in_buffer_togo = 0; - if (m_in_buffer_file_togo == 0) - { - switch (m_in_buffer_source) - { - case OJPEGStateInBufferSource.osibsStrile: - if (m_in_buffer_next_strile < m_in_buffer_strile_count) - m_out_state = OJPEGStateOutState.ososRst; - else - m_out_state = OJPEGStateOutState.ososEoi; - break; - case OJPEGStateInBufferSource.osibsEof: - m_out_state = OJPEGStateOutState.ososEoi; - break; - default: - break; - } - } - return true; - } - - private void OJPEGWriteStreamRst(out byte[] mem, out uint len) - { - Debug.Assert(OJPEG_BUFFER >= 2); - m_out_buffer[0] = 255; - m_out_buffer[1] = (byte)((byte)JpegMarkerType.RST0 + m_restart_index); - m_restart_index++; - if (m_restart_index == 8) - m_restart_index = 0; - len = 2; - mem = m_out_buffer; - m_out_state = OJPEGStateOutState.ososCompressed; - } - - private void OJPEGWriteStreamEoi(out byte[] mem, out uint len) - { - Debug.Assert(OJPEG_BUFFER >= 2); - m_out_buffer[0] = 255; - m_out_buffer[1] = (byte)JpegMarkerType.EOI; - len = 2; - mem = m_out_buffer; - } - - private bool jpeg_create_decompress_encap() - { - try - { - m_libjpeg_jpeg_decompress_struct = new JpegDecompressor(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private ReadResult jpeg_read_header_encap(bool require_image) - { - ReadResult res = ReadResult.Suspended; - try - { - res = m_libjpeg_jpeg_decompress_struct.jpeg_read_header(require_image); - } - catch (Exception) - { - return ReadResult.Suspended; - } - - return res; - } - - private bool jpeg_start_decompress_encap() - { - try - { - m_libjpeg_jpeg_decompress_struct.jpeg_start_decompress(); - } - catch (Exception) - { - return false; - } - - return true; - } - - private int jpeg_read_scanlines_encap(byte[] scanlines, int max_lines) - { - int n = 0; - try - { - byte[][] temp = new byte[1][]; - temp[0] = scanlines; - n = m_libjpeg_jpeg_decompress_struct.jpeg_read_scanlines(temp, max_lines); - } - catch (Exception) - { - return 0; - } - - return n; - } - - private int jpeg_read_raw_data_encap(int max_lines) - { - int n = 0; - try - { - n = m_libjpeg_jpeg_decompress_struct.jpeg_read_raw_data(m_subsampling_convert_ycbcrimage, max_lines); - } - catch (Exception) - { - return 0; - } - - return n; - } - } - #endregion - - #region OJpegCodecTagMethod - class OJpegCodecTagMethods : TiffTagMethods - { - public override bool SetField(Tiff tif, TiffTag tag, FieldValue[] ap) - { - const string module = "OJPEGVSetField"; - OJpegCodec sp = tif.m_currentCodec as OJpegCodec; - Debug.Assert(sp != null); - - uint ma; - uint[] mb; - uint n; - switch (tag) - { - case TiffTag.JPEGIFOffset: - sp.m_jpeg_interchange_format = ap[0].ToUInt(); - break; - case TiffTag.JPEGIFByteCount: - sp.m_jpeg_interchange_format_length = ap[0].ToUInt(); - break; - case TiffTag.YCBCRSUBSAMPLING: - sp.m_subsampling_tag = true; - sp.m_subsampling_hor = ap[0].ToByte(); - sp.m_subsampling_ver = ap[1].ToByte(); - tif.m_dir.td_ycbcrsubsampling[0] = sp.m_subsampling_hor; - tif.m_dir.td_ycbcrsubsampling[1] = sp.m_subsampling_ver; - break; - case TiffTag.JPEGQTables: - ma = ap[0].ToUInt(); - if (ma != 0) - { - if (ma > 3) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegQTables tag has incorrect count"); - return false; - } - sp.m_qtable_offset_count = (byte)ma; - mb = ap[1].ToUIntArray(); - for (n = 0; n < ma; n++) - sp.m_qtable_offset[n] = mb[n]; - } - break; - case TiffTag.JPEGDCTables: - ma = ap[0].ToUInt(); - if (ma != 0) - { - if (ma > 3) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegDcTables tag has incorrect count"); - return false; - } - sp.m_dctable_offset_count = (byte)ma; - mb = ap[1].ToUIntArray(); - for (n = 0; n < ma; n++) - sp.m_dctable_offset[n] = mb[n]; - } - break; - case TiffTag.JPEGACTABLES: - ma = ap[0].ToUInt(); - if (ma != 0) - { - if (ma > 3) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, "JpegAcTables tag has incorrect count"); - return false; - } - sp.m_actable_offset_count = (byte)ma; - mb = ap[1].ToUIntArray(); - for (n = 0; n < ma; n++) - sp.m_actable_offset[n] = mb[n]; - } - break; - case TiffTag.JPEGProc: - sp.m_jpeg_proc = ap[0].ToByte(); - break; - case TiffTag.JPEGRestartInterval: - sp.m_restart_interval = ap[0].ToUShort(); - break; - default: - return base.SetField(tif, tag, ap); - } - - TiffFieldInfo fip = tif.FieldWithTag(tag); - if (fip != null) - tif.setFieldBit(fip.Bit); - else - return false; - - tif.m_flags |= TiffFlags.DirtyDirect; - return true; - } - - public override FieldValue[] GetField(Tiff tif, TiffTag tag) - { - OJpegCodec sp = tif.m_currentCodec as OJpegCodec; - Debug.Assert(sp != null); - - FieldValue[] result = null; - - switch (tag) - { - case TiffTag.JPEGIFOffset: - result = new FieldValue[1]; - result[0].Set(sp.m_jpeg_interchange_format); - break; - case TiffTag.JPEGIFByteCount: - result = new FieldValue[1]; - result[0].Set(sp.m_jpeg_interchange_format_length); - break; - case TiffTag.YCBCRSUBSAMPLING: - if (!sp.m_subsamplingcorrect_done) - sp.OJPEGSubsamplingCorrect(); - - result = new FieldValue[2]; - result[0].Set(sp.m_subsampling_hor); - result[1].Set(sp.m_subsampling_ver); - break; - case TiffTag.JPEGQTables: - result = new FieldValue[2]; - result[0].Set(sp.m_qtable_offset_count); - result[1].Set(sp.m_qtable_offset); - break; - case TiffTag.JPEGDCTables: - result = new FieldValue[2]; - result[0].Set(sp.m_dctable_offset_count); - result[1].Set(sp.m_dctable_offset); - break; - case TiffTag.JPEGACTABLES: - result = new FieldValue[2]; - result[0].Set(sp.m_actable_offset_count); - result[1].Set(sp.m_actable_offset); - break; - case TiffTag.JPEGProc: - result = new FieldValue[1]; - result[0].Set(sp.m_jpeg_proc); - break; - case TiffTag.JPEGRestartInterval: - result = new FieldValue[1]; - result[0].Set(sp.m_restart_interval); - break; - default: - return base.GetField(tif, tag); - } - - return result; - } - - public override void PrintDir(Tiff tif, Stream fd, TiffPrintFlags flags) - { - OJpegCodec sp = tif.m_currentCodec as OJpegCodec; - Debug.Assert(sp != null); - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGINTERCHANGEFORMAT)) - Tiff.fprintf(fd, " JpegInterchangeFormat: {0}\n", sp.m_jpeg_interchange_format); - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGINTERCHANGEFORMATLENGTH)) - Tiff.fprintf(fd, " JpegInterchangeFormatLength: {0}\n", sp.m_jpeg_interchange_format_length); - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGQTABLES)) - { - Tiff.fprintf(fd, " JpegQTables:"); - for (byte m = 0; m < sp.m_qtable_offset_count; m++) - Tiff.fprintf(fd, " {0}", sp.m_qtable_offset[m]); - Tiff.fprintf(fd, "\n"); - } - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGDCTABLES)) - { - Tiff.fprintf(fd, " JpegDcTables:"); - for (byte m = 0; m < sp.m_dctable_offset_count; m++) - Tiff.fprintf(fd, " {0}", sp.m_dctable_offset[m]); - Tiff.fprintf(fd, "\n"); - } - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGACTABLES)) - { - Tiff.fprintf(fd, " JpegAcTables:"); - for (byte m = 0; m < sp.m_actable_offset_count; m++) - Tiff.fprintf(fd, " {0}", sp.m_actable_offset[m]); - Tiff.fprintf(fd, "\n"); - } - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGPROC)) - Tiff.fprintf(fd, " JpegProc: {0}\n", sp.m_jpeg_proc); - - if (tif.fieldSet(OJpegCodec.FIELD_OJPEG_JPEGRESTARTINTERVAL)) - Tiff.fprintf(fd, " JpegRestartInterval: {0}\n", sp.m_restart_interval); - } - } - #endregion - - #region OJpegSourceManager - class OJpegSrcManager : Jpeg_Source - { - protected OJpegCodec m_sp; - - public OJpegSrcManager(OJpegCodec sp) - { - initInternalBuffer(null, 0); - m_sp = sp; - } - - /// - /// Initializes this instance. - /// - public override void init_source() - { - } - - /// - /// Fills input buffer - /// - /// - /// true if operation succeed; otherwise, false - /// - public override bool fill_input_buffer() - { - Tiff tif = m_sp.GetTiff(); - byte[] mem = null; - uint len = 0; - if (!m_sp.OJPEGWriteStream(out mem, out len)) - Tiff.ErrorExt(tif, tif.m_clientdata, "LibJpeg", "Premature end of JPEG data"); - - initInternalBuffer(mem, (int)len); - return true; - } - - /// - /// Skip data - used to skip over a potentially large amount of - /// uninteresting data (such as an APPn marker). - /// - /// The number of bytes to skip. - /// Writers of suspendable-input applications must note that skip_input_data - /// is not granted the right to give a suspension return. If the skip extends - /// beyond the data currently in the buffer, the buffer can be marked empty so - /// that the next read will cause a fill_input_buffer call that can suspend. - /// Arranging for additional bytes to be discarded before reloading the input - /// buffer is the application writer's problem. - public override void skip_input_data(int num_bytes) - { - Tiff tif = m_sp.GetTiff(); - Tiff.ErrorExt(tif, tif.m_clientdata, "LibJpeg", "Unexpected error"); - } - - /// - /// This is the default resync_to_restart method for data source - /// managers to use if they don't have any better approach. - /// - /// An instance of - /// The desired - /// false if suspension is required. - /// That method assumes that no backtracking is possible. - /// Some data source managers may be able to back up, or may have - /// additional knowledge about the data which permits a more - /// intelligent recovery strategy; such managers would - /// presumably supply their own resync method.

- /// read_restart_marker calls resync_to_restart if it finds a marker other than - /// the restart marker it was expecting. (This code is *not* used unless - /// a nonzero restart interval has been declared.) cinfo.unread_marker is - /// the marker code actually found (might be anything, except 0 or FF). - /// The desired restart marker number (0..7) is passed as a parameter.

- /// This routine is supposed to apply whatever error recovery strategy seems - /// appropriate in order to position the input stream to the next data segment. - /// Note that cinfo.unread_marker is treated as a marker appearing before - /// the current data-source input point; usually it should be reset to zero - /// before returning.

- /// This implementation is substantially constrained by wanting to treat the - /// input as a data stream; this means we can't back up. Therefore, we have - /// only the following actions to work with:
- /// 1. Simply discard the marker and let the entropy decoder resume at next - /// byte of file.
- /// 2. Read forward until we find another marker, discarding intervening - /// data. (In theory we could look ahead within the current bufferload, - /// without having to discard data if we don't find the desired marker. - /// This idea is not implemented here, in part because it makes behavior - /// dependent on buffer size and chance buffer-boundary positions.)
- /// 3. Leave the marker unread (by failing to zero cinfo.unread_marker). - /// This will cause the entropy decoder to process an empty data segment, - /// inserting dummy zeroes, and then we will reprocess the marker.
- /// #2 is appropriate if we think the desired marker lies ahead, while #3 is - /// appropriate if the found marker is a future restart marker (indicating - /// that we have missed the desired restart marker, probably because it got - /// corrupted).
- /// We apply #2 or #3 if the found marker is a restart marker no more than - /// two counts behind or ahead of the expected one. We also apply #2 if the - /// found marker is not a legal JPEG marker code (it's certainly bogus data). - /// If the found marker is a restart marker more than 2 counts away, we do #1 - /// (too much risk that the marker is erroneous; with luck we will be able to - /// resync at some future point).
- /// For any valid non-restart JPEG marker, we apply #3. This keeps us from - /// overrunning the end of a scan. An implementation limited to single-scan - /// files might find it better to apply #2 for markers other than EOI, since - /// any other marker would have to be bogus data in that case.
- public override bool resync_to_restart(JpegDecompressor cinfo, int desired) - { - Tiff tif = m_sp.GetTiff(); - Tiff.ErrorExt(tif, tif.m_clientdata, "LibJpeg", "Unexpected error"); - return false; - } - - /// - /// Terminate source - called by jpeg_finish_decompress - /// after all data has been read. Often a no-op. - /// - /// NB: not called by jpeg_abort or jpeg_destroy; surrounding - /// application must deal with any cleanup that should happen even - /// for error exit. - public override void term_source() - { - } - } - #endregion - - #region PackBitsCodec - class PackBitsCodec : TiffCodec - { - private enum EncodingState - { - BASE, - LITERAL, - RUN, - LITERAL_RUN - }; - - private int m_rowsize; - - public PackBitsCodec(Tiff tif, Compression scheme, string name) - : base(tif, scheme, name) - { - } - - public override bool Init() - { - return true; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public override bool CanEncode - { - get - { - return true; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public override bool CanDecode - { - get - { - return true; - } - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - return PackBitsDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - return PackBitsDecode(buffer, offset, count, plane); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public override bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - return PackBitsDecode(buffer, offset, count, plane); - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// - /// PreEncode is called after and before encoding. - /// - public override bool PreEncode(short plane) - { - return PackBitsPreEncode(plane); - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - return PackBitsEncode(buffer, offset, count, plane); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - return PackBitsEncodeChunk(buffer, offset, count, plane); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public override bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - return PackBitsEncodeChunk(buffer, offset, count, plane); - } - - private bool PackBitsPreEncode(short s) - { - /* - * Calculate the scanline/tile-width size in bytes. - */ - if (m_tif.IsTiled()) - m_rowsize = m_tif.TileRowSize(); - else - m_rowsize = m_tif.ScanlineSize(); - return true; - } - - /* - * Encode a run of pixels. - */ - private bool PackBitsEncode(byte[] buf, int offset, int cc, short s) - { - int op = m_tif.m_rawcp; - EncodingState state = EncodingState.BASE; - int lastliteral = 0; - int bp = offset; - while (cc > 0) - { - /* - * Find the longest string of identical bytes. - */ - int b = buf[bp]; - bp++; - cc--; - int n = 1; - for (; cc > 0 && b == buf[bp]; cc--, bp++) - n++; - - bool stop = false; - while (!stop) - { - if (op + 2 >= m_tif.m_rawdatasize) - { - /* insure space for new data */ - /* - * Be careful about writing the last - * literal. Must write up to that point - * and then copy the remainder to the - * front of the buffer. - */ - if (state == EncodingState.LITERAL || state == EncodingState.LITERAL_RUN) - { - int slop = op - lastliteral; - m_tif.m_rawcc += lastliteral - m_tif.m_rawcp; - if (!m_tif.flushData1()) - return false; - op = m_tif.m_rawcp; - while (slop-- > 0) - { - m_tif.m_rawdata[op] = m_tif.m_rawdata[lastliteral]; - lastliteral++; - op++; - } - - lastliteral = m_tif.m_rawcp; - } - else - { - m_tif.m_rawcc += op - m_tif.m_rawcp; - if (!m_tif.flushData1()) - return false; - op = m_tif.m_rawcp; - } - } - - switch (state) - { - case EncodingState.BASE: - /* initial state, set run/literal */ - if (n > 1) - { - state = EncodingState.RUN; - if (n > 128) - { - int temp = -127; - m_tif.m_rawdata[op] = (byte)temp; - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - n -= 128; - continue; - } - - m_tif.m_rawdata[op] = (byte)(-n + 1); - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - } - else - { - lastliteral = op; - m_tif.m_rawdata[op] = 0; - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - state = EncodingState.LITERAL; - } - stop = true; - break; - - case EncodingState.LITERAL: - /* last object was literal string */ - if (n > 1) - { - state = EncodingState.LITERAL_RUN; - if (n > 128) - { - int temp = -127; - m_tif.m_rawdata[op] = (byte)temp; - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - n -= 128; - continue; - } - - m_tif.m_rawdata[op] = (byte)(-n + 1); /* encode run */ - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - } - else - { - /* extend literal */ - m_tif.m_rawdata[lastliteral]++; - if (m_tif.m_rawdata[lastliteral] == 127) - state = EncodingState.BASE; - - m_tif.m_rawdata[op] = (byte)b; - op++; - } - stop = true; - break; - - case EncodingState.RUN: - /* last object was run */ - if (n > 1) - { - if (n > 128) - { - int temp = -127; - m_tif.m_rawdata[op] = (byte)temp; - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - n -= 128; - continue; - } - - m_tif.m_rawdata[op] = (byte)(-n + 1); - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - } - else - { - lastliteral = op; - m_tif.m_rawdata[op] = 0; - op++; - m_tif.m_rawdata[op] = (byte)b; - op++; - state = EncodingState.LITERAL; - } - stop = true; - break; - - case EncodingState.LITERAL_RUN: - /* literal followed by a run */ - /* - * Check to see if previous run should - * be converted to a literal, in which - * case we convert literal-run-literal - * to a single literal. - */ - int atemp = -1; - if (n == 1 && m_tif.m_rawdata[op - 2] == (byte)atemp && m_tif.m_rawdata[lastliteral] < 126) - { - m_tif.m_rawdata[lastliteral] += 2; - state = (m_tif.m_rawdata[lastliteral] == 127 ? EncodingState.BASE : EncodingState.LITERAL); - m_tif.m_rawdata[op - 2] = m_tif.m_rawdata[op - 1]; /* replicate */ - } - else - state = EncodingState.RUN; - continue; - } - } - } - - m_tif.m_rawcc += op - m_tif.m_rawcp; - m_tif.m_rawcp = op; - return true; - } - - /// - /// Encode a rectangular chunk of pixels. We break it up into row-sized pieces to insure - /// that encoded runs do not span rows. Otherwise, there can be problems with the decoder - /// if data is read, for example, by scanlines when it was encoded by strips. - /// - private bool PackBitsEncodeChunk(byte[] buffer, int offset, int count, short plane) - { - while (count > 0) - { - int chunk = m_rowsize; - if (count < chunk) - chunk = count; - - if (!PackBitsEncode(buffer, offset, chunk, plane)) - return false; - - offset += chunk; - count -= chunk; - } - - return true; - } - - private bool PackBitsDecode(byte[] buffer, int offset, int count, short plane) - { - int bp = m_tif.m_rawcp; - int cc = m_tif.m_rawcc; - while (cc > 0 && count > 0) - { - int n = m_tif.m_rawdata[bp]; - bp++; - cc--; - - // Watch out for compilers that don't sign extend chars... - if (n >= 128) - n -= 256; - - if (n < 0) - { - // replicate next byte (-n + 1) times - if (n == -128) - { - // nop - continue; - } - - n = -n + 1; - if (count < n) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "PackBitsDecode: discarding {0} bytes to avoid buffer overrun", - n - count); - - n = count; - } - count -= n; - int b = m_tif.m_rawdata[bp]; - bp++; - cc--; - while (n-- > 0) - { - buffer[offset] = (byte)b; - offset++; - } - } - else - { - // copy next (n + 1) bytes literally - if (count < n + 1) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "PackBitsDecode: discarding {0} bytes to avoid buffer overrun", - n - count + 1); - - n = count - 1; - } - - Buffer.BlockCopy(m_tif.m_rawdata, bp, buffer, offset, ++n); - offset += n; - count -= n; - bp += n; - cc -= n; - } - } - - m_tif.m_rawcp = bp; - m_tif.m_rawcc = cc; - if (count > 0) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "PackBitsDecode: Not enough data for scanline {0}", m_tif.m_row); - return false; - } - - return true; - } - } - #endregion - - #region TagCompare - internal class TagCompare : IComparer - { - int IComparer.Compare(object x, object y) - { - TiffFieldInfo ta = x as TiffFieldInfo; - TiffFieldInfo tb = y as TiffFieldInfo; - - Debug.Assert(ta != null); - Debug.Assert(tb != null); - - if (ta.Tag != tb.Tag) - return ((int)ta.Tag - (int)tb.Tag); - - return (ta.Type == TiffType.Any) ? 0 : ((int)tb.Type - (int)ta.Type); - } - } - #endregion - - #region TiffCIELabToRGB - /// - /// CIE Lab 1976->RGB support - /// - class TiffCIELabToRGB - { - public const int CIELABTORGB_TABLE_RANGE = 1500; - - /// - /// Size of conversion table - /// - private int range; - - private float rstep; - private float gstep; - private float bstep; - - // Reference white point - private float X0; - private float Y0; - private float Z0; - - private TiffDisplay display; - - /// - /// Conversion of Yr to r - /// - private float[] Yr2r = new float[CIELABTORGB_TABLE_RANGE + 1]; - - /// - /// Conversion of Yg to g - /// - private float[] Yg2g = new float[CIELABTORGB_TABLE_RANGE + 1]; - - /// - /// Conversion of Yb to b - /// - private float[] Yb2b = new float[CIELABTORGB_TABLE_RANGE + 1]; - - /* - * Allocate conversion state structures and make look_up tables for - * the Yr,Yb,Yg <=> r,g,b conversions. - */ - public void Init(TiffDisplay refDisplay, float[] refWhite) - { - range = CIELABTORGB_TABLE_RANGE; - - display = refDisplay; - - /* Red */ - double gamma = 1.0 / display.d_gammaR; - rstep = (display.d_YCR - display.d_Y0R) / range; - for (int i = 0; i <= range; i++) - { - Yr2r[i] = display.d_Vrwr * ((float)Math.Pow((double)i / range, gamma)); - } - - /* Green */ - gamma = 1.0 / display.d_gammaG; - gstep = (display.d_YCR - display.d_Y0R) / range; - for (int i = 0; i <= range; i++) - { - Yg2g[i] = display.d_Vrwg * ((float)Math.Pow((double)i / range, gamma)); - } - - /* Blue */ - gamma = 1.0 / display.d_gammaB; - bstep = (display.d_YCR - display.d_Y0R) / range; - for (int i = 0; i <= range; i++) - { - Yb2b[i] = display.d_Vrwb * ((float)Math.Pow((double)i / range, gamma)); - } - - /* Init reference white point */ - X0 = refWhite[0]; - Y0 = refWhite[1]; - Z0 = refWhite[2]; - } - - /* - * Convert color value from the CIE L*a*b* 1976 space to CIE XYZ. - */ - public void CIELabToXYZ(int l, int a, int b, out float X, out float Y, out float Z) - { - float L = (float)l * 100.0F / 255.0F; - float cby; - - if (L < 8.856F) - { - Y = (L * Y0) / 903.292F; - cby = 7.787F * (Y / Y0) + 16.0F / 116.0F; - } - else - { - cby = (L + 16.0F) / 116.0F; - Y = Y0 * cby * cby * cby; - } - - float tmp = (float)a / 500.0F + cby; - if (tmp < 0.2069F) - X = X0 * (tmp - 0.13793F) / 7.787F; - else - X = X0 * tmp * tmp * tmp; - - tmp = cby - (float)b / 200.0F; - if (tmp < 0.2069F) - Z = Z0 * (tmp - 0.13793F) / 7.787F; - else - Z = Z0 * tmp * tmp * tmp; - } - - /* - * Convert color value from the XYZ space to RGB. - */ - public void XYZToRGB(float X, float Y, float Z, out int r, out int g, out int b) - { - /* Multiply through the matrix to get luminosity values. */ - float Yr = display.d_mat[0][0] * X + display.d_mat[0][1] * Y + display.d_mat[0][2] * Z; - float Yg = display.d_mat[1][0] * X + display.d_mat[1][1] * Y + display.d_mat[1][2] * Z; - float Yb = display.d_mat[2][0] * X + display.d_mat[2][1] * Y + display.d_mat[2][2] * Z; - - /* Clip input */ - Yr = Math.Max(Yr, display.d_Y0R); - Yg = Math.Max(Yg, display.d_Y0G); - Yb = Math.Max(Yb, display.d_Y0B); - - /* Avoid overflow in case of wrong input values */ - Yr = Math.Min(Yr, display.d_YCR); - Yg = Math.Min(Yg, display.d_YCG); - Yb = Math.Min(Yb, display.d_YCB); - - /* Turn luminosity to color value. */ - int i = (int)((Yr - display.d_Y0R) / rstep); - i = Math.Min(range, i); - r = rInt(Yr2r[i]); - - i = (int)((Yg - display.d_Y0G) / gstep); - i = Math.Min(range, i); - g = rInt(Yg2g[i]); - - i = (int)((Yb - display.d_Y0B) / bstep); - i = Math.Min(range, i); - b = rInt(Yb2b[i]); - - /* Clip output. */ - r = Math.Min(r, display.d_Vrwr); - g = Math.Min(g, display.d_Vrwg); - b = Math.Min(b, display.d_Vrwb); - } - - private static int rInt(float R) - { - return (int)(R > 0 ? (R + 0.5) : (R - 0.5)); - } - } - #endregion - - #region TiffCodec - /// - /// Base class for all codecs within the library. - /// - /// - /// A codec is a class that implements decoding, encoding, or decoding and encoding of a - /// compression algorithm. - /// - /// The library provides a collection of builtin codecs. More codecs may be registered - /// through calls to the library and/or the builtin implementations may be overridden. - /// - public class TiffCodec - { - /// - /// An instance of . - /// - protected Tiff m_tif; - - /// - /// Compression scheme this codec impelements. - /// - protected internal Compression m_scheme; - - /// - /// Codec name. - /// - protected internal string m_name; - - /// - /// Initializes a new instance of the class. - /// - /// An instance of class. - /// The compression scheme for the codec. - /// The name of the codec. - public TiffCodec(Tiff tif, Compression scheme, string name) - { - m_scheme = scheme; - m_tif = tif; - m_name = name; - } - - /// - /// Gets a value indicating whether this codec can encode data. - /// - /// - /// true if this codec can encode data; otherwise, false. - /// - public virtual bool CanEncode - { - get - { - return false; - } - } - - /// - /// Gets a value indicating whether this codec can decode data. - /// - /// - /// true if this codec can decode data; otherwise, false. - /// - public virtual bool CanDecode - { - get - { - return false; - } - } - - /// - /// Initializes this instance. - /// - /// true if initialized successfully - public virtual bool Init() - { - return true; - } - - /// - /// Setups the decoder part of the codec. - /// - /// - /// true if this codec successfully setup its decoder part and can decode data; - /// otherwise, false. - /// - /// - /// SetupDecode is called once before - /// . - public virtual bool SetupDecode() - { - return true; - } - - /// - /// Prepares the decoder part of the codec for a decoding. - /// - /// The zero-based sample plane index. - /// true if this codec successfully prepared its decoder part and ready - /// to decode data; otherwise, false. - /// - /// PreDecode is called after and before decoding. - /// - public virtual bool PreDecode(short plane) - { - return true; - } - - /// - /// Decodes one row of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public virtual bool DecodeRow(byte[] buffer, int offset, int count, short plane) - { - return noDecode("scanline"); - } - - /// - /// Decodes one strip of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public virtual bool DecodeStrip(byte[] buffer, int offset, int count, short plane) - { - return noDecode("strip"); - } - - /// - /// Decodes one tile of image data. - /// - /// The buffer to place decoded image data to. - /// The zero-based byte offset in at - /// which to begin storing decoded bytes. - /// The number of decoded bytes that should be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was decoded successfully; otherwise, false. - /// - public virtual bool DecodeTile(byte[] buffer, int offset, int count, short plane) - { - return noDecode("tile"); - } - - /// - /// Setups the encoder part of the codec. - /// - /// - /// true if this codec successfully setup its encoder part and can encode data; - /// otherwise, false. - /// - /// - /// SetupEncode is called once before - /// . - public virtual bool SetupEncode() - { - return true; - } - - /// - /// Prepares the encoder part of the codec for a encoding. - /// - /// The zero-based sample plane index. - /// true if this codec successfully prepared its encoder part and ready - /// to encode data; otherwise, false. - /// - /// PreEncode is called after and before encoding. - /// - public virtual bool PreEncode(short plane) - { - return true; - } - - /// - /// Performs any actions after encoding required by the codec. - /// - /// true if all post-encode actions succeeded; otherwise, false - /// - /// PostEncode is called after encoding and can be used to release any external - /// resources needed during encoding. - /// - public virtual bool PostEncode() - { - return true; - } - - /// - /// Encodes one row of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public virtual bool EncodeRow(byte[] buffer, int offset, int count, short plane) - { - return noEncode("scanline"); - } - - /// - /// Encodes one strip of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public virtual bool EncodeStrip(byte[] buffer, int offset, int count, short plane) - { - return noEncode("strip"); - } - - /// - /// Encodes one tile of image data. - /// - /// The buffer with image data to be encoded. - /// The zero-based byte offset in at - /// which to begin read image data. - /// The maximum number of encoded bytes that can be placed - /// to . - /// The zero-based sample plane index. - /// - /// true if image data was encoded successfully; otherwise, false. - /// - public virtual bool EncodeTile(byte[] buffer, int offset, int count, short plane) - { - return noEncode("tile"); - } - - /// - /// Flushes any internal data buffers and terminates current operation. - /// - public virtual void Close() - { - } - - /// - /// Seeks the specified row in the strip being processed. - /// - /// The row to seek. - /// true if specified row was successfully found; otherwise, false - public virtual bool Seek(int row) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Compression algorithm does not support random access"); - return false; - } - - /// - /// Cleanups the state of the codec. - /// - /// - /// Cleanup is called when codec is no longer needed (won't be used) and can be - /// used for example to restore tag methods that were substituted. - public virtual void Cleanup() - { - } - - /// - /// Calculates and/or constrains a strip size. - /// - /// The proposed strip size (may be zero or negative). - /// A strip size to use. - public virtual int DefStripSize(int size) - { - if (size < 1) - { - // If RowsPerStrip is unspecified, try to break the image up into strips that are - // approximately STRIP_SIZE_DEFAULT bytes long. - int scanline = m_tif.ScanlineSize(); - size = Tiff.STRIP_SIZE_DEFAULT / (scanline == 0 ? 1 : scanline); - if (size == 0) - { - // very wide images - size = 1; - } - } - - return size; - } - - /// - /// Calculate and/or constrains a tile size - /// - /// The proposed tile width upon the call / tile width to use after the call. - /// The proposed tile height upon the call / tile height to use after the call. - public virtual void DefTileSize(ref int width, ref int height) - { - if (width < 1) - width = 256; - - if (height < 1) - height = 256; - - // roundup to a multiple of 16 per the spec - if ((width & 0xf) != 0) - width = Tiff.roundUp(width, 16); - - if ((height & 0xf) != 0) - height = Tiff.roundUp(height, 16); - } - - private bool noEncode(string method) - { - TiffCodec c = m_tif.FindCodec(m_tif.m_dir.td_compression); - if (c != null) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "{0} {1} encoding is not implemented", c.m_name, method); - } - else - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Compression scheme {0} {1} encoding is not implemented", - m_tif.m_dir.td_compression, method); - } - - return false; - } - - private bool noDecode(string method) - { - TiffCodec c = m_tif.FindCodec(m_tif.m_dir.td_compression); - if (c != null) - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "{0} {1} decoding is not implemented", c.m_name, method); - } - else - { - Tiff.ErrorExt(m_tif, m_tif.m_clientdata, m_tif.m_name, - "Compression scheme {0} {1} decoding is not implemented", - m_tif.m_dir.td_compression, method); - } - - return false; - } - } - #endregion - - #region TiffDirectory - /// - /// Internal format of a TIFF directory entry. - /// - class TiffDirectory - { - /// - /// bit vector of fields that are set - /// - public int[] td_fieldsset = new int[FieldBit.SetLongs]; - - public int td_imagewidth; - public int td_imagelength; - public int td_imagedepth; - public int td_tilewidth; - public int td_tilelength; - public int td_tiledepth; - public FileType td_subfiletype; - public short td_bitspersample; - public SampleFormat td_sampleformat; - public Compression td_compression; - public Photometric td_photometric; - public Threshold td_threshholding; - public BitOrder td_fillorder; - public Orientation td_orientation; - public short td_samplesperpixel; - public int td_rowsperstrip; - public short td_minsamplevalue; - public short td_maxsamplevalue; - public double td_sminsamplevalue; - public double td_smaxsamplevalue; - public float td_xresolution; - public float td_yresolution; - public ResolutionUnit td_resolutionunit; - public PlanarConfig td_planarconfig; - public float td_xposition; - public float td_yposition; - public short[] td_pagenumber = new short[2]; - public short[][] td_colormap = { null, null, null }; - public short[] td_halftonehints = new short[2]; - public short td_extrasamples; - public ExtraSample[] td_sampleinfo; - public int td_stripsperimage; - - /// - /// size of offset and bytecount arrays - /// - public int td_nstrips; - public uint[] td_stripoffset; - public uint[] td_stripbytecount; - - /// - /// is the bytecount array sorted ascending? - /// - public bool td_stripbytecountsorted; - - public short td_nsubifd; - public int[] td_subifd; - - // YCbCr parameters - public short[] td_ycbcrsubsampling = new short[2]; - public YCbCrPosition td_ycbcrpositioning; - - // Colorimetry parameters - public float[] td_refblackwhite; - public short[][] td_transferfunction = { null, null, null }; - - // CMYK parameters - public int td_inknameslen; - public string td_inknames; - - public int td_customValueCount; - public TiffTagValue[] td_customValues; - - public TiffDirectory() - { - td_subfiletype = 0; - td_compression = 0; - td_photometric = 0; - td_planarconfig = 0; - - td_fillorder = BitOrder.BigEndian; - td_bitspersample = 1; - td_threshholding = Threshold.BILevel; - td_orientation = Orientation.TopLeft; - td_samplesperpixel = 1; - td_rowsperstrip = -1; - td_tiledepth = 1; - td_stripbytecountsorted = true; // Our own arrays always sorted. - td_resolutionunit = ResolutionUnit.Inch; - td_sampleformat = SampleFormat.UInt; - td_imagedepth = 1; - td_ycbcrsubsampling[0] = 2; - td_ycbcrsubsampling[1] = 2; - td_ycbcrpositioning = YCbCrPosition.Centered; - } - } - #endregion - - #region TiffDirEntry - /// - /// TIFF Image File Directories are comprised of a table of field - /// descriptors of the form shown below. The table is sorted in - /// ascending order by tag. The values associated with each entry are - /// disjoint and may appear anywhere in the file (so long as they are - /// placed on a word boundary). - /// - /// If the value is 4 bytes or less, then it is placed in the offset - /// field to save space. If the value is less than 4 bytes, it is - /// left-justified in the offset field. - /// - class TiffDirEntry - { - public const int SizeInBytes = 12; - - public TiffTag tdir_tag; - public TiffType tdir_type; - - /// - /// number of items; length in spec - /// - public int tdir_count; - - /// - /// byte offset to field data - /// - public uint tdir_offset; - - public new string ToString() - { - return tdir_tag.ToString() + ", " + tdir_type.ToString() + " " + - tdir_offset.ToString(CultureInfo.InvariantCulture); - } - } - #endregion - - #region TiffDisplay - /// - /// Structure for holding information about a display device. - /// - class TiffDisplay - { - /// - /// XYZ -> luminance matrix - /// - internal float[][] d_mat; - - // Light o/p for reference white - internal float d_YCR; - internal float d_YCG; - internal float d_YCB; - - // Pixel values for ref. white - internal int d_Vrwr; - internal int d_Vrwg; - internal int d_Vrwb; - - // Residual light for black pixel - internal float d_Y0R; - internal float d_Y0G; - internal float d_Y0B; - - // Gamma values for the three guns - internal float d_gammaR; - internal float d_gammaG; - internal float d_gammaB; - - public TiffDisplay() - { - } - - public TiffDisplay(float[] mat0, float[] mat1, float[] mat2, - float YCR, float YCG, float YCB, int Vrwr, int Vrwg, - int Vrwb, float Y0R, float Y0G, float Y0B, - float gammaR, float gammaG, float gammaB) - { - d_mat = new float[3][] { mat0, mat1, mat2 }; - d_YCR = YCR; - d_YCG = YCG; - d_YCB = YCB; - d_Vrwr = Vrwr; - d_Vrwg = Vrwg; - d_Vrwb = Vrwb; - d_Y0R = Y0R; - d_Y0G = Y0G; - d_Y0B = Y0B; - d_gammaR = gammaR; - d_gammaG = gammaG; - d_gammaB = gammaB; - } - } - #endregion - - #region TiffErrorHandler - /// - /// Default error handler implementation. - /// - /// - /// TiffErrorHandler provides error and warning handling methods that write an - /// error or a warning messages to the . - /// - /// Applications that desire to capture control in the event of an error or a warning should - /// set their custom error and warning handler using method. - /// - /// - public class TiffErrorHandler - { - /// - /// Handles an error by writing it text to the . - /// - /// An instance of the class. Can be null. - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - public virtual void ErrorHandler(Tiff tif, string method, string format, params object[] args) - { - using (TextWriter stderr = Console.Error) - { - if (method != null) - stderr.Write("{0}: ", method); - - stderr.Write(format, args); - stderr.Write("\n"); - } - } - - /// - /// Handles an error by writing it text to the . - /// - /// An instance of the class. Can be null. - /// A client data. - /// The method where an error is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which an error is detected. - /// - /// The parameter can be anything. Its value and meaning is - /// defined by an application and not the library. - /// - public virtual void ErrorHandlerExt(Tiff tif, object clientData, string method, string format, params object[] args) - { - } - - /// - /// Handles a warning by writing it text to the . - /// - /// An instance of the class. Can be null. - /// The method where a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - public virtual void WarningHandler(Tiff tif, string method, string format, params object[] args) - { - using (TextWriter stderr = Console.Error) - { - if (method != null) - stderr.Write("{0}: ", method); - - stderr.Write("Warning, "); - stderr.Write(format, args); - stderr.Write("\n"); - } - } - - /// - /// Handles a warning by writing it text to the . - /// - /// An instance of the class. Can be null. - /// A client data. - /// The method where a warning is detected. - /// A composite format string (see Remarks). - /// An object array that contains zero or more objects to format. - /// - /// The is a composite format string that uses the same format as - /// method. The parameter, if - /// not null, is printed before the message; it typically is used to identify the - /// method in which a warning is detected. - /// - /// The parameter can be anything. Its value and meaning is - /// defined by an application and not the library. - /// - public virtual void WarningHandlerExt(Tiff tif, object clientData, string method, string format, params object[] args) - { - } - } - #endregion - - #region TiffFieldInfo - /// - /// Represents a TIFF field information. - /// - /// - /// TiffFieldInfo describes a field. It provides information about field name, type, - /// number of values etc. - /// - public class TiffFieldInfo - { - private TiffTag m_tag; - private short m_readCount; - private short m_writeCount; - private TiffType m_type; - private short m_bit; - private bool m_okToChange; - private bool m_passCount; - private string m_name; - - /// - /// marker for variable length tags - /// - public const short Variable = -1; - - /// - /// marker for SamplesPerPixel-bound tags - /// - public const short Spp = -2; - - /// - /// marker for integer variable length tags - /// - public const short Variable2 = -3; - - /// - /// Initializes a new instance of the class. - /// - /// The tag to describe. - /// The number of values to read when reading field information or - /// one of , and . - /// The number of values to write when writing field information - /// or one of , and . - /// The type of the field value. - /// Index of the bit to use in "Set Fields Vector" when this instance - /// is merged into field info collection. Take a look at class. - /// If true, then it is permissible to set the tag's value even - /// after writing has commenced. - /// If true, then number of value elements should be passed to - /// method as second parameter (right after tag type AND - /// before value itself). - /// The name (description) of the tag this instance describes. - public TiffFieldInfo(TiffTag tag, short readCount, short writeCount, - TiffType type, short bit, bool okToChange, bool passCount, string name) - { - m_tag = tag; - m_readCount = readCount; - m_writeCount = writeCount; - m_type = type; - m_bit = bit; - m_okToChange = okToChange; - m_passCount = passCount; - m_name = name; - } - - /// - /// Returns a that represents this instance. - /// - /// - /// A that represents this instance. - /// - public override string ToString() - { - if (m_bit != FieldBit.Custom || m_name.Length == 0) - return m_tag.ToString(); - - return m_name; - } - - /// - /// The tag described by this instance. - /// - public TiffTag Tag - { - get { return m_tag; } - } - - /// - /// Number of values to read when reading field information or - /// one of , and . - /// - public short ReadCount - { - get { return m_readCount; } - } - - /// - /// Number of values to write when writing field information or - /// one of , and . - /// - public short WriteCount - { - get { return m_writeCount; } - } - - /// - /// Type of the field values. - /// - public TiffType Type - { - get { return m_type; } - } - - /// - /// Index of the bit to use in "Set Fields Vector" when this instance - /// is merged into field info collection. Take a look at class. - /// - public short Bit - { - get { return m_bit; } - } - - /// - /// If true, then it is permissible to set the tag's value even after writing has commenced. - /// - public bool OkToChange - { - get { return m_okToChange; } - } - - /// - /// If true, then number of value elements should be passed to - /// method as second parameter (right after tag type AND before values itself). - /// - public bool PassCount - { - get { return m_passCount; } - } - - /// - /// The name (or description) of the tag this instance describes. - /// - public string Name - { - get { return m_name; } - internal set { m_name = value; } - } - } - #endregion - - #region TiffFlags - [Flags] - enum TiffFlags - { - /// - /// Use BigEndian (most significant -> least) fill order - /// - BigEndian = 1, - /// - /// Use LittleEndian (least significant -> most) fill order - /// - LittleEndian = 2, - /// - /// natural bit fill order for machine - /// - FillOrder = 0x0003, - /// - /// current directory must be written - /// - DirtyDirect = 0x0008, - /// - /// data buffers setup - /// - BufferSetup = 0x0010, - /// - /// encoder/decoder setup done - /// - CoderSetup = 0x0020, - /// - /// written 1+ scanlines to file - /// - BeenWriting = 0x0040, - /// - /// byte swap file information - /// - Swab = 0x0080, - /// - /// inhibit bit reversal logic - /// - NoBitRev = 0x0100, - /// - /// my raw data buffer; free on close - /// - MyBuffer = 0x0200, - /// - /// file is tile, not strip- based - /// - IsTiled = 0x0400, - /// - /// need call to post-encode routine - /// - PostEncode = 0x1000, - /// - /// currently writing a subifd - /// - InSubIFD = 0x2000, - /// - /// library is doing data up-sampling - /// - UpSampled = 0x4000, - /// - /// enable strip chopping support - /// - StripChop = 0x8000, - /// - /// read header only, do not process the first directory - /// - HeaderOnly = 0x10000, - /// - /// skip reading of raw uncompressed image data - /// - NoReadRaw = 0x20000, - } - #endregion - - #region TiffHeader - struct TiffHeader - { - public const int TIFF_MAGIC_SIZE = 2; - public const int TIFF_VERSION_SIZE = 2; - public const int TIFF_DIROFFSET_SIZE = 4; - - public const int SizeInBytes = TIFF_MAGIC_SIZE + TIFF_VERSION_SIZE + TIFF_DIROFFSET_SIZE; - - /// - /// magic number (defines byte order) - /// - public short tiff_magic; - - /// - /// TIFF version number - /// - public short tiff_version; - - /// - /// byte offset to first directory - /// - public uint tiff_diroff; - } - #endregion - - #region TiffStream - /// - /// A stream used by the library for TIFF reading and writing. - /// - public class TiffStream - { - /// - /// Reads a sequence of bytes from the stream and advances the position within the stream - /// by the number of bytes read. - /// - /// A client data (by default, an underlying stream). - /// An array of bytes. When this method returns, the - /// contains the specified byte array with the values between - /// and ( + - 1) - /// replaced by the bytes read from the current source. - /// The zero-based byte offset in at which - /// to begin storing the data read from the current stream. - /// The maximum number of bytes to be read from the current stream. - /// The total number of bytes read into the . This can - /// be less than the number of bytes requested if that many bytes are not currently - /// available, or zero (0) if the end of the stream has been reached. - public virtual int Read(object clientData, byte[] buffer, int offset, int count) - { - Stream stream = clientData as Stream; - if (stream == null) - throw new ArgumentException("Can't get underlying stream to read from"); - - return stream.Read(buffer, offset, count); - } - - /// - /// Writes a sequence of bytes to the current stream and advances the current position - /// within this stream by the number of bytes written. - /// - /// A client data (by default, an underlying stream). - /// An array of bytes. This method copies - /// bytes from to the current stream. - /// The zero-based byte offset in at which - /// to begin copying bytes to the current stream. - /// The number of bytes to be written to the current stream. - public virtual void Write(object clientData, byte[] buffer, int offset, int count) - { - Stream stream = clientData as Stream; - if (stream == null) - throw new ArgumentException("Can't get underlying stream to write to"); - - stream.Write(buffer, offset, count); - } - - /// - /// Sets the position within the current stream. - /// - /// A client data (by default, an underlying stream). - /// A byte offset relative to the parameter. - /// A value of type indicating the - /// reference point used to obtain the new position. - /// The new position within the current stream. - public virtual long Seek(object clientData, long offset, SeekOrigin origin) - { - // we use this as a special code, so avoid accepting it - if (offset == -1) - return -1; // was 0xFFFFFFFF - - Stream stream = clientData as Stream; - if (stream == null) - throw new ArgumentException("Can't get underlying stream to seek in"); - - return stream.Seek(offset, origin); - } - - /// - /// Closes the current stream. - /// - /// A client data (by default, an underlying stream). - public virtual void Close(object clientData) - { - Stream stream = clientData as Stream; - if (stream == null) - throw new ArgumentException("Can't get underlying stream to close"); - - stream.Close(); - } - - /// - /// Gets the length in bytes of the stream. - /// - /// A client data (by default, an underlying stream). - /// The length of the stream in bytes. - public virtual long Size(object clientData) - { - Stream stream = clientData as Stream; - if (stream == null) - throw new ArgumentException("Can't get underlying stream to retrieve size from"); - - return stream.Length; - } - } - #endregion - - #region TiffTagMethods - /// - /// Tiff tag methods. - /// - public class TiffTagMethods - { - // - // These are used in the backwards compatibility code... - // - - /// - /// untyped data - /// - private const short DATATYPE_VOID = 0; - - /// - /// signed integer data - /// - private const short DATATYPE_INT = 1; - - /// - /// unsigned integer data - /// - private const short DATATYPE_UINT = 2; - - /// - /// IEEE floating point data - /// - private const short DATATYPE_IEEEFP = 3; - - /// - /// Sets the value(s) of a tag in a TIFF file/stream open for writing. - /// - /// An instance of the class. - /// The tag. - /// The tag value(s). - /// - /// true if tag value(s) were set successfully; otherwise, false. - /// - /// - public virtual bool SetField(Tiff tif, TiffTag tag, FieldValue[] value) - { - const string module = "vsetfield"; - - TiffDirectory td = tif.m_dir; - bool status = true; - int v32 = 0; - int v = 0; - - bool end = false; - bool badvalue = false; - bool badvalue32 = false; - - switch (tag) - { - case TiffTag.SubFileType: - td.td_subfiletype = (FileType)value[0].ToByte(); - break; - case TiffTag.ImageWidth: - td.td_imagewidth = value[0].ToInt(); - break; - case TiffTag.ImageLength: - td.td_imagelength = value[0].ToInt(); - break; - case TiffTag.BitsPerSample: - td.td_bitspersample = value[0].ToShort(); - // If the data require post-decoding processing to byte-swap samples, set it - // up here. Note that since tags are required to be ordered, compression code - // can override this behavior in the setup method if it wants to roll the post - // decoding work in with its normal work. - if ((tif.m_flags & TiffFlags.Swab) == TiffFlags.Swab) - { - if (td.td_bitspersample == 16) - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab16Bit; - else if (td.td_bitspersample == 24) - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab24Bit; - else if (td.td_bitspersample == 32) - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab32Bit; - else if (td.td_bitspersample == 64) - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab64Bit; - else if (td.td_bitspersample == 128) - { - // two 64's - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab64Bit; - } - } - break; - case TiffTag.Compression: - v = value[0].ToInt() & 0xffff; - Compression comp = (Compression)v; - // If we're changing the compression scheme, then notify the previous module - // so that it can cleanup any state it's setup. - if (tif.fieldSet(FieldBit.Compression)) - { - if (td.td_compression == comp) - break; - - tif.m_currentCodec.Cleanup(); - tif.m_flags &= ~TiffFlags.CoderSetup; - } - // Setup new compression scheme. - status = tif.setCompressionScheme(comp); - if (status) - td.td_compression = comp; - else - status = false; - break; - - case TiffTag.Photometric: - td.td_photometric = (Photometric)value[0].ToInt(); - break; - case TiffTag.Threshholding: - td.td_threshholding = (Threshold)value[0].ToByte(); - break; - case TiffTag.FillOrder: - v = value[0].ToInt(); - BitOrder fo = (BitOrder)v; - if (fo != BitOrder.LittleEndian && fo != BitOrder.BigEndian) - { - badvalue = true; - break; - } - - td.td_fillorder = fo; - break; - case TiffTag.Orientation: - v = value[0].ToInt(); - Orientation or = (Orientation)v; - if (or < Orientation.TopLeft || Orientation.LeftBottom < or) - { - badvalue = true; - break; - } - else - td.td_orientation = or; - break; - case TiffTag.SamplesPerPixel: - // XXX should cross check - e.g. if pallette, then 1 - v = value[0].ToInt(); - if (v == 0) - { - badvalue = true; - break; - } - - td.td_samplesperpixel = (short)v; - break; - case TiffTag.RowsPerStrip: - v32 = value[0].ToInt(); - if (v32 == 0) - { - badvalue32 = true; - break; - } - - td.td_rowsperstrip = v32; - if (!tif.fieldSet(FieldBit.TileDimensions)) - { - td.td_tilelength = v32; - td.td_tilewidth = td.td_imagewidth; - } - break; - case TiffTag.MinSampleValue: - td.td_minsamplevalue = value[0].ToShort(); - break; - case TiffTag.MaxSampleValue: - td.td_maxsamplevalue = value[0].ToShort(); - break; - case TiffTag.SMinSampleValue: - td.td_sminsamplevalue = value[0].ToDouble(); - break; - case TiffTag.SMaxSampleValue: - td.td_smaxsamplevalue = value[0].ToDouble(); - break; - case TiffTag.XResolution: - td.td_xresolution = value[0].ToFloat(); - break; - case TiffTag.YResolution: - td.td_yresolution = value[0].ToFloat(); - break; - case TiffTag.PlanarConfig: - v = value[0].ToInt(); - PlanarConfig pc = (PlanarConfig)v; - if (pc != PlanarConfig.Contig && pc != PlanarConfig.Separate) - { - badvalue = true; - break; - } - td.td_planarconfig = pc; - break; - case TiffTag.XPosition: - td.td_xposition = value[0].ToFloat(); - break; - case TiffTag.YPosition: - td.td_yposition = value[0].ToFloat(); - break; - case TiffTag.ResolutionUnit: - v = value[0].ToInt(); - ResolutionUnit ru = (ResolutionUnit)v; - if (ru < ResolutionUnit.None || ResolutionUnit.Centimeter < ru) - { - badvalue = true; - break; - } - - td.td_resolutionunit = ru; - break; - case TiffTag.PageNumber: - td.td_pagenumber[0] = value[0].ToShort(); - td.td_pagenumber[1] = value[1].ToShort(); - break; - case TiffTag.HalfToneHints: - td.td_halftonehints[0] = value[0].ToShort(); - td.td_halftonehints[1] = value[1].ToShort(); - break; - case TiffTag.Colormap: - v32 = 1 << td.td_bitspersample; - Tiff.setShortArray(out td.td_colormap[0], value[0].ToShortArray(), v32); - Tiff.setShortArray(out td.td_colormap[1], value[1].ToShortArray(), v32); - Tiff.setShortArray(out td.td_colormap[2], value[2].ToShortArray(), v32); - break; - case TiffTag.ExtraSamples: - if (!setExtraSamples(td, ref v, value)) - { - badvalue = true; - break; - } - - break; - case TiffTag.MATTEING: - if (value[0].ToShort() != 0) - td.td_extrasamples = 1; - else - td.td_extrasamples = 0; - - if (td.td_extrasamples != 0) - { - td.td_sampleinfo = new ExtraSample[1]; - td.td_sampleinfo[0] = ExtraSample.AssociatedAlpha; - } - break; - case TiffTag.TileWidth: - v32 = value[0].ToInt(); - if ((v32 % 16) != 0) - { - if (tif.m_mode != Tiff.O_RDONLY) - { - badvalue32 = true; - break; - } - - Tiff.WarningExt(tif, tif.m_clientdata, tif.m_name, - "Nonstandard tile width {0}, convert file", v32); - } - td.td_tilewidth = v32; - tif.m_flags |= TiffFlags.IsTiled; - break; - case TiffTag.TileLength: - v32 = value[0].ToInt(); - if ((v32 % 16) != 0) - { - if (tif.m_mode != Tiff.O_RDONLY) - { - badvalue32 = true; - break; - } - - Tiff.WarningExt(tif, tif.m_clientdata, tif.m_name, - "Nonstandard tile length {0}, convert file", v32); - } - td.td_tilelength = v32; - tif.m_flags |= TiffFlags.IsTiled; - break; - case TiffTag.TILEDEPTH: - v32 = value[0].ToInt(); - if (v32 == 0) - { - badvalue32 = true; - break; - } - - td.td_tiledepth = v32; - break; - case TiffTag.DATATYPE: - v = value[0].ToInt(); - SampleFormat sf = SampleFormat.UnTyped; - switch (v) - { - case DATATYPE_VOID: - sf = SampleFormat.UnTyped; - break; - case DATATYPE_INT: - sf = SampleFormat.Int; - break; - case DATATYPE_UINT: - sf = SampleFormat.UInt; - break; - case DATATYPE_IEEEFP: - sf = SampleFormat.IEEEFloat; - break; - default: - badvalue = true; - break; - } - - if (!badvalue) - td.td_sampleformat = sf; - - break; - case TiffTag.SampleFormat: - v = value[0].ToInt(); - sf = (SampleFormat)v; - if (sf < SampleFormat.UInt || SampleFormat.ComplexIEEEFloat < sf) - { - badvalue = true; - break; - } - - td.td_sampleformat = sf; - - // Try to fix up the Swab function for complex data. - if (td.td_sampleformat == SampleFormat.COMPLEXINT && - td.td_bitspersample == 32 && tif.m_postDecodeMethod == Tiff.PostDecodeMethodType.pdmSwab32Bit) - { - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab16Bit; - } - else if ((td.td_sampleformat == SampleFormat.COMPLEXINT || - td.td_sampleformat == SampleFormat.ComplexIEEEFloat) && - td.td_bitspersample == 64 && tif.m_postDecodeMethod == Tiff.PostDecodeMethodType.pdmSwab64Bit) - { - tif.m_postDecodeMethod = Tiff.PostDecodeMethodType.pdmSwab32Bit; - } - break; - case TiffTag.IMAGEDEPTH: - td.td_imagedepth = value[0].ToInt(); - break; - case TiffTag.SubImageDescriptor: - if ((tif.m_flags & TiffFlags.InSubIFD) != TiffFlags.InSubIFD) - { - td.td_nsubifd = value[0].ToShort(); - Tiff.setLongArray(out td.td_subifd, value[1].ToIntArray(), td.td_nsubifd); - } - else - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: Sorry, cannot nest SubIFDs", tif.m_name); - status = false; - } - break; - case TiffTag.YCBCRPOSITIONING: - td.td_ycbcrpositioning = (YCbCrPosition)value[0].ToByte(); - break; - case TiffTag.YCBCRSUBSAMPLING: - td.td_ycbcrsubsampling[0] = value[0].ToShort(); - td.td_ycbcrsubsampling[1] = value[1].ToShort(); - break; - case TiffTag.TransferFunction: - v = ((td.td_samplesperpixel - td.td_extrasamples) > 1 ? 3 : 1); - for (int i = 0; i < v; i++) - { - Tiff.setShortArray(out td.td_transferfunction[i], value[0].ToShortArray(), 1 << td.td_bitspersample); - } - break; - case TiffTag.REFERENCEBLACKWHITE: - // XXX should check for null range - Tiff.setFloatArray(out td.td_refblackwhite, value[0].ToFloatArray(), 6); - break; - case TiffTag.InkNames: - v = value[0].ToInt(); - string s = value[1].ToString(); - v = checkInkNamesString(tif, v, s); - status = v > 0; - if (v > 0) - { - setNString(out td.td_inknames, s, v); - td.td_inknameslen = v; - } - break; - default: - // This can happen if multiple images are open with - // different codecs which have private tags. The global tag - // information table may then have tags that are valid for - // one file but not the other. If the client tries to set a - // tag that is not valid for the image's codec then we'll - // arrive here. This happens, for example, when tiffcp is - // used to convert between compression schemes and - // codec-specific tags are blindly copied. - TiffFieldInfo fip = tif.FindFieldInfo(tag, TiffType.Any); - if (fip == null || fip.Bit != FieldBit.Custom) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: Invalid {1}tag \"{2}\" (not supported by codec)", - tif.m_name, Tiff.isPseudoTag(tag) ? "pseudo-" : "", - fip != null ? fip.Name : "Unknown"); - status = false; - break; - } - - // Find the existing entry for this custom value. - int tvIndex = -1; - for (int iCustom = 0; iCustom < td.td_customValueCount; iCustom++) - { - if (td.td_customValues[iCustom].info.Tag == tag) - { - td.td_customValues[iCustom].value = null; - break; - } - } - - // Grow the custom list if the entry was not found. - if (tvIndex == -1) - { - td.td_customValueCount++; - TiffTagValue[] new_customValues = Tiff.Realloc( - td.td_customValues, td.td_customValueCount - 1, td.td_customValueCount); - td.td_customValues = new_customValues; - - tvIndex = td.td_customValueCount - 1; - td.td_customValues[tvIndex].info = fip; - td.td_customValues[tvIndex].value = null; - td.td_customValues[tvIndex].count = 0; - } - - // Set custom value ... save a copy of the custom tag value. - int tv_size = Tiff.dataSize(fip.Type); - if (tv_size == 0) - { - status = false; - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: Bad field type {1} for \"{2}\"", - tif.m_name, fip.Type, fip.Name); - end = true; - break; - } - - int paramIndex = 0; - if (fip.PassCount) - { - if (fip.WriteCount == TiffFieldInfo.Variable2) - td.td_customValues[tvIndex].count = value[paramIndex++].ToInt(); - else - td.td_customValues[tvIndex].count = value[paramIndex++].ToInt(); - } - else if (fip.WriteCount == TiffFieldInfo.Variable || - fip.WriteCount == TiffFieldInfo.Variable2) - { - td.td_customValues[tvIndex].count = 1; - } - else if (fip.WriteCount == TiffFieldInfo.Spp) - { - td.td_customValues[tvIndex].count = td.td_samplesperpixel; - } - else - { - td.td_customValues[tvIndex].count = fip.WriteCount; - } - - if (fip.Type == TiffType.ASCII) - { - string ascii; - Tiff.setString(out ascii, value[paramIndex++].ToString()); - td.td_customValues[tvIndex].value = Tiff.Latin1Encoding.GetBytes(ascii); - } - else - { - td.td_customValues[tvIndex].value = new byte[tv_size * td.td_customValues[tvIndex].count]; - if ((fip.PassCount || - fip.WriteCount == TiffFieldInfo.Variable || - fip.WriteCount == TiffFieldInfo.Variable2 || - fip.WriteCount == TiffFieldInfo.Spp || - td.td_customValues[tvIndex].count > 1) && - fip.Tag != TiffTag.PageNumber && - fip.Tag != TiffTag.HalfToneHints && - fip.Tag != TiffTag.YCBCRSUBSAMPLING && - fip.Tag != TiffTag.DotRange) - { - byte[] apBytes = value[paramIndex++].GetBytes(); - //Buffer.BlockCopy(apBytes, 0, td.td_customValues[tvIndex].value, 0, apBytes.Length); - Buffer.BlockCopy(apBytes, 0, td.td_customValues[tvIndex].value, 0, td.td_customValues[tvIndex].value.Length); - } - else - { - // XXX: The following loop required to handle - // PageNumber, HalfToneHints, - // YCBCRSUBSAMPLING and DotRange tags. - // These tags are actually arrays and should be - // passed as arrays to SetField() function, but - // actually passed as a list of separate values. - // This behavior must be changed in the future! - - // Upd: This loop also processes some EXIF tags with - // Undefined type (like EXIF_FILESOURCE or EXIF_SCENETYPE) - // In this case input value is string-based, so - // in TiffType.Undefined case we use FieldValue.GetBytes()[0] - // construction instead of direct call of FieldValue.ToByte() method. - byte[] val = td.td_customValues[tvIndex].value; - int valPos = 0; - for (int i = 0; i < td.td_customValues[tvIndex].count; i++, valPos += tv_size) - { - switch (fip.Type) - { - case TiffType.Byte: - case TiffType.Undefined: - val[valPos] = value[paramIndex + i].GetBytes()[0]; - break; - case TiffType.SByte: - val[valPos] = value[paramIndex + i].ToByte(); - break; - case TiffType.Short: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToShort()), 0, val, valPos, tv_size); - break; - case TiffType.SShort: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToShort()), 0, val, valPos, tv_size); - break; - case TiffType.Long: - case TiffType.IFD: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToInt()), 0, val, valPos, tv_size); - break; - case TiffType.SLong: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToInt()), 0, val, valPos, tv_size); - break; - case TiffType.Rational: - case TiffType.SRational: - case TiffType.Float: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToFloat()), 0, val, valPos, tv_size); - break; - case TiffType.Double: - Buffer.BlockCopy(BitConverter.GetBytes(value[paramIndex + i].ToDouble()), 0, val, valPos, tv_size); - break; - default: - Array.Clear(val, valPos, tv_size); - status = false; - break; - } - } - } - } - break; - } - - if (!end && !badvalue && !badvalue32) - { - if (status) - { - tif.setFieldBit(tif.FieldWithTag(tag).Bit); - tif.m_flags |= TiffFlags.DirtyDirect; - } - } - - if (badvalue) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: Bad value {1} for \"{2}\" tag", - tif.m_name, v, tif.FieldWithTag(tag).Name); - return false; - } - - if (badvalue32) - { - Tiff.ErrorExt(tif, tif.m_clientdata, module, - "{0}: Bad value {1} for \"{2}\" tag", - tif.m_name, v32, tif.FieldWithTag(tag).Name); - return false; - } - - return status; - } - - /// - /// Gets the value(s) of a tag in an open TIFF file. - /// - /// An instance of the class. - /// The tag. - /// The value(s) of a tag in an open TIFF file/stream as array of - /// objects or null if there is no such tag set. - /// - public virtual FieldValue[] GetField(Tiff tif, TiffTag tag) - { - TiffDirectory td = tif.m_dir; - FieldValue[] result = null; - - switch (tag) - { - case TiffTag.SubFileType: - result = new FieldValue[1]; - result[0].Set(td.td_subfiletype); - break; - case TiffTag.ImageWidth: - result = new FieldValue[1]; - result[0].Set(td.td_imagewidth); - break; - case TiffTag.ImageLength: - result = new FieldValue[1]; - result[0].Set(td.td_imagelength); - break; - case TiffTag.BitsPerSample: - result = new FieldValue[1]; - result[0].Set(td.td_bitspersample); - break; - case TiffTag.Compression: - result = new FieldValue[1]; - result[0].Set(td.td_compression); - break; - case TiffTag.Photometric: - result = new FieldValue[1]; - result[0].Set(td.td_photometric); - break; - case TiffTag.Threshholding: - result = new FieldValue[1]; - result[0].Set(td.td_threshholding); - break; - case TiffTag.FillOrder: - result = new FieldValue[1]; - result[0].Set(td.td_fillorder); - break; - case TiffTag.Orientation: - result = new FieldValue[1]; - result[0].Set(td.td_orientation); - break; - case TiffTag.SamplesPerPixel: - result = new FieldValue[1]; - result[0].Set(td.td_samplesperpixel); - break; - case TiffTag.RowsPerStrip: - result = new FieldValue[1]; - result[0].Set(td.td_rowsperstrip); - break; - case TiffTag.MinSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_minsamplevalue); - break; - case TiffTag.MaxSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_maxsamplevalue); - break; - case TiffTag.SMinSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_sminsamplevalue); - break; - case TiffTag.SMaxSampleValue: - result = new FieldValue[1]; - result[0].Set(td.td_smaxsamplevalue); - break; - case TiffTag.XResolution: - result = new FieldValue[1]; - result[0].Set(td.td_xresolution); - break; - case TiffTag.YResolution: - result = new FieldValue[1]; - result[0].Set(td.td_yresolution); - break; - case TiffTag.PlanarConfig: - result = new FieldValue[1]; - result[0].Set(td.td_planarconfig); - break; - case TiffTag.XPosition: - result = new FieldValue[1]; - result[0].Set(td.td_xposition); - break; - case TiffTag.YPosition: - result = new FieldValue[1]; - result[0].Set(td.td_yposition); - break; - case TiffTag.ResolutionUnit: - result = new FieldValue[1]; - result[0].Set(td.td_resolutionunit); - break; - case TiffTag.PageNumber: - result = new FieldValue[2]; - result[0].Set(td.td_pagenumber[0]); - result[1].Set(td.td_pagenumber[1]); - break; - case TiffTag.HalfToneHints: - result = new FieldValue[2]; - result[0].Set(td.td_halftonehints[0]); - result[1].Set(td.td_halftonehints[1]); - break; - case TiffTag.Colormap: - result = new FieldValue[3]; - result[0].Set(td.td_colormap[0]); - result[1].Set(td.td_colormap[1]); - result[2].Set(td.td_colormap[2]); - break; - case TiffTag.StripOffsets: - case TiffTag.TileOffsets: - result = new FieldValue[1]; - result[0].Set(td.td_stripoffset); - break; - case TiffTag.StripByteCounts: - case TiffTag.TileByteCounts: - result = new FieldValue[1]; - result[0].Set(td.td_stripbytecount); - break; - case TiffTag.MATTEING: - result = new FieldValue[1]; - result[0].Set((td.td_extrasamples == 1 && td.td_sampleinfo[0] == ExtraSample.AssociatedAlpha)); - break; - case TiffTag.ExtraSamples: - result = new FieldValue[2]; - result[0].Set(td.td_extrasamples); - result[1].Set(td.td_sampleinfo); - break; - case TiffTag.TileWidth: - result = new FieldValue[1]; - result[0].Set(td.td_tilewidth); - break; - case TiffTag.TileLength: - result = new FieldValue[1]; - result[0].Set(td.td_tilelength); - break; - case TiffTag.TILEDEPTH: - result = new FieldValue[1]; - result[0].Set(td.td_tiledepth); - break; - case TiffTag.DATATYPE: - switch (td.td_sampleformat) - { - case SampleFormat.UInt: - result = new FieldValue[1]; - result[0].Set(DATATYPE_UINT); - break; - case SampleFormat.Int: - result = new FieldValue[1]; - result[0].Set(DATATYPE_INT); - break; - case SampleFormat.IEEEFloat: - result = new FieldValue[1]; - result[0].Set(DATATYPE_IEEEFP); - break; - case SampleFormat.UnTyped: - result = new FieldValue[1]; - result[0].Set(DATATYPE_VOID); - break; - } - break; - case TiffTag.SampleFormat: - result = new FieldValue[1]; - result[0].Set(td.td_sampleformat); - break; - case TiffTag.IMAGEDEPTH: - result = new FieldValue[1]; - result[0].Set(td.td_imagedepth); - break; - case TiffTag.SubImageDescriptor: - result = new FieldValue[2]; - result[0].Set(td.td_nsubifd); - result[1].Set(td.td_subifd); - break; - case TiffTag.YCBCRPOSITIONING: - result = new FieldValue[1]; - result[0].Set(td.td_ycbcrpositioning); - break; - case TiffTag.YCBCRSUBSAMPLING: - result = new FieldValue[2]; - result[0].Set(td.td_ycbcrsubsampling[0]); - result[1].Set(td.td_ycbcrsubsampling[1]); - break; - case TiffTag.TransferFunction: - result = new FieldValue[3]; - result[0].Set(td.td_transferfunction[0]); - if (td.td_samplesperpixel - td.td_extrasamples > 1) - { - result[1].Set(td.td_transferfunction[1]); - result[2].Set(td.td_transferfunction[2]); - } - break; - case TiffTag.REFERENCEBLACKWHITE: - if (td.td_refblackwhite != null) - { - result = new FieldValue[1]; - result[0].Set(td.td_refblackwhite); - } - break; - case TiffTag.InkNames: - result = new FieldValue[1]; - result[0].Set(td.td_inknames); - break; - default: - // This can happen if multiple images are open with - // different codecs which have private tags. The global tag - // information table may then have tags that are valid for - // one file but not the other. If the client tries to get a - // tag that is not valid for the image's codec then we'll - // arrive here. - TiffFieldInfo fip = tif.FindFieldInfo(tag, TiffType.Any); - if (fip == null || fip.Bit != FieldBit.Custom) - { - Tiff.ErrorExt(tif, tif.m_clientdata, "_TIFFVGetField", - "{0}: Invalid {1}tag \"{2}\" (not supported by codec)", - tif.m_name, Tiff.isPseudoTag(tag) ? "pseudo-" : "", - fip != null ? fip.Name : "Unknown"); - result = null; - break; - } - - // Do we have a custom value? - result = null; - for (int i = 0; i < td.td_customValueCount; i++) - { - TiffTagValue tv = td.td_customValues[i]; - if (tv.info.Tag != tag) - continue; - - if (fip.PassCount) - { - result = new FieldValue[2]; - - if (fip.ReadCount == TiffFieldInfo.Variable2) - { - result[0].Set(tv.count); - } - else - { - // Assume TiffFieldInfo.Variable - result[0].Set(tv.count); - } - - result[1].Set(tv.value); - } - else - { - if ((fip.Type == TiffType.ASCII || - fip.ReadCount == TiffFieldInfo.Variable || - fip.ReadCount == TiffFieldInfo.Variable2 || - fip.ReadCount == TiffFieldInfo.Spp || - tv.count > 1) && fip.Tag != TiffTag.PageNumber && - fip.Tag != TiffTag.HalfToneHints && - fip.Tag != TiffTag.YCBCRSUBSAMPLING && - fip.Tag != TiffTag.DotRange) - { - result = new FieldValue[1]; - byte[] value = tv.value; - - if (fip.Type == TiffType.ASCII && - tv.value.Length > 0 && - tv.value[tv.value.Length - 1] == 0) - { - // cut unwanted zero at the end - value = new byte[Math.Max(tv.value.Length - 1, 0)]; - Buffer.BlockCopy(tv.value, 0, value, 0, value.Length); - } - - result[0].Set(value); - } - else - { - result = new FieldValue[tv.count]; - byte[] val = tv.value; - int valPos = 0; - for (int j = 0; j < tv.count; j++, valPos += Tiff.dataSize(tv.info.Type)) - { - switch (fip.Type) - { - case TiffType.Byte: - case TiffType.Undefined: - case TiffType.SByte: - result[j].Set(val[valPos]); - break; - case TiffType.Short: - case TiffType.SShort: - result[j].Set(BitConverter.ToInt16(val, valPos)); - break; - case TiffType.Long: - case TiffType.IFD: - case TiffType.SLong: - result[j].Set(BitConverter.ToInt32(val, valPos)); - break; - case TiffType.Rational: - case TiffType.SRational: - case TiffType.Float: - result[j].Set(BitConverter.ToSingle(val, valPos)); - break; - case TiffType.Double: - result[j].Set(BitConverter.ToDouble(val, valPos)); - break; - default: - result = null; - break; - } - } - } - } - break; - } - break; - } - - return result; - } - - /// - /// Prints formatted description of the contents of the current directory to the - /// specified stream using specified print (formatting) options. - /// - /// An instance of the class. - /// The stream to print to. - /// The print (formatting) options. - public virtual void PrintDir(Tiff tif, Stream stream, TiffPrintFlags flags) - { - } - - /// - /// Install extra samples information. - /// - private static bool setExtraSamples(TiffDirectory td, ref int v, FieldValue[] ap) - { - // XXX: Unassociated alpha data == 999 is a known Corel Draw bug, see below - const short EXTRASAMPLE_COREL_UNASSALPHA = 999; - - v = ap[0].ToInt(); - if (v > td.td_samplesperpixel) - return false; - - byte[] va = ap[1].ToByteArray(); - if (v > 0 && va == null) - { - // typically missing param - return false; - } - - for (int i = 0; i < v; i++) - { - if ((ExtraSample)va[i] > ExtraSample.UnAssociatedAlpha) - { - // XXX: Corel Draw is known to produce incorrect - // ExtraSamples tags which must be patched here if we - // want to be able to open some of the damaged TIFF files: - if (i < v - 1) - { - short s = BitConverter.ToInt16(va, i); - if (s == EXTRASAMPLE_COREL_UNASSALPHA) - va[i] = (byte)ExtraSample.UnAssociatedAlpha; - } - else - return false; - } - } - - td.td_extrasamples = (short)v; - td.td_sampleinfo = new ExtraSample[td.td_extrasamples]; - for (int i = 0; i < td.td_extrasamples; i++) - td.td_sampleinfo[i] = (ExtraSample)va[i]; - - return true; - } - - private static int checkInkNamesString(Tiff tif, int slen, string s) - { - bool failed = false; - short i = tif.m_dir.td_samplesperpixel; - - if (slen > 0) - { - int endPos = slen; - int pos = 0; - - for (; i > 0; i--) - { - for (; s[pos] != '\0'; pos++) - { - if (pos >= endPos) - { - failed = true; - break; - } - } - - if (failed) - break; - - pos++; // skip \0 - } - - if (!failed) - return pos; - } - - Tiff.ErrorExt(tif, tif.m_clientdata, "TIFFSetField", - "{0}: Invalid InkNames value; expecting {1} names, found {2}", - tif.m_name, tif.m_dir.td_samplesperpixel, tif.m_dir.td_samplesperpixel - i); - return 0; - } - - private static void setNString(out string cpp, string cp, int n) - { - cpp = cp.Substring(0, n); - } - } - #endregion - - #region TiffTagValue - struct TiffTagValue - { - public TiffFieldInfo info; - public int count; - public byte[] value; - } - #endregion - - #region TiffYCbCrToRGB - /// - /// Convert color value from the YCbCr space to CIE XYZ. - /// The colorspace conversion algorithm comes from the IJG v5a code; - /// see below for more information on how it works. - /// - class TiffYCbCrToRGB - { - private const int clamptabOffset = 256; - private const int SHIFT = 16; - private const int ONE_HALF = 1 << (SHIFT - 1); - - /// - /// range clamping table - /// - private byte[] clamptab; - - private int[] Cr_r_tab; - private int[] Cb_b_tab; - private int[] Cr_g_tab; - private int[] Cb_g_tab; - private int[] Y_tab; - - public TiffYCbCrToRGB() - { - clamptab = new byte[4 * 256]; - Cr_r_tab = new int[256]; - Cb_b_tab = new int[256]; - Cr_g_tab = new int[256]; - Cb_g_tab = new int[256]; - Y_tab = new int[256]; - } - - /* - * Initialize the YCbCr->RGB conversion tables. The conversion - * is done according to the 6.0 spec: - * - * R = Y + Cr * (2 - 2 * LumaRed) - * B = Y + Cb * (2 - 2 * LumaBlue) - * G = Y - * - LumaBlue * Cb * (2 - 2 * LumaBlue) / LumaGreen - * - LumaRed * Cr * (2 - 2 * LumaRed) / LumaGreen - * - * To avoid floating point arithmetic the fractional constants that - * come out of the equations are represented as fixed point values - * in the range 0...2^16. We also eliminate multiplications by - * pre-calculating possible values indexed by Cb and Cr (this code - * assumes conversion is being done for 8-bit samples). - */ - public void Init(float[] luma, float[] refBlackWhite) - { - Array.Clear(clamptab, 0, 256); /* v < 0 => 0 */ - - for (int i = 0; i < 256; i++) - clamptab[clamptabOffset + i] = (byte)i; - - int start = clamptabOffset + 256; - int stop = start + 2 * 256; - - for (int i = start; i < stop; i++) - clamptab[i] = 255; /* v > 255 => 255 */ - - float LumaRed = luma[0]; - float LumaGreen = luma[1]; - float LumaBlue = luma[2]; - - float f1 = 2 - 2 * LumaRed; - int D1 = fix(f1); - - float f2 = LumaRed * f1 / LumaGreen; - int D2 = -fix(f2); - - float f3 = 2 - 2 * LumaBlue; - int D3 = fix(f3); - - float f4 = LumaBlue * f3 / LumaGreen; - int D4 = -fix(f4); - - /* - * i is the actual input pixel value in the range 0..255 - * Cb and Cr values are in the range -128..127 (actually - * they are in a range defined by the ReferenceBlackWhite - * tag) so there is some range shifting to do here when - * constructing tables indexed by the raw pixel data. - */ - for (int i = 0, x = -128; i < 256; i++, x++) - { - int Cr = code2V(x, refBlackWhite[4] - 128.0F, refBlackWhite[5] - 128.0F, 127); - int Cb = code2V(x, refBlackWhite[2] - 128.0F, refBlackWhite[3] - 128.0F, 127); - - Cr_r_tab[i] = (D1 * Cr + ONE_HALF) >> SHIFT; - Cb_b_tab[i] = (D3 * Cb + ONE_HALF) >> SHIFT; - Cr_g_tab[i] = D2 * Cr; - Cb_g_tab[i] = D4 * Cb + ONE_HALF; - Y_tab[i] = code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255); - } - } - - public void YCbCrtoRGB(int Y, int Cb, int Cr, out int r, out int g, out int b) - { - /* XXX: Only 8-bit YCbCr input supported for now */ - Y = hiClamp(Y, 255); - Cb = clamp(Cb, 0, 255); - Cr = clamp(Cr, 0, 255); - - r = clamptab[clamptabOffset + Y_tab[Y] + Cr_r_tab[Cr]]; - g = clamptab[clamptabOffset + Y_tab[Y] + ((Cb_g_tab[Cb] + Cr_g_tab[Cr]) >> SHIFT)]; - b = clamptab[clamptabOffset + Y_tab[Y] + Cb_b_tab[Cb]]; - } - - private static int fix(float x) - { - return (int)(x * (1L << SHIFT) + 0.5); - } - - private static int code2V(int c, float RB, float RW, float CR) - { - return (int)(((c - (int)RB) * CR) / ((int)(RW - RB) != 0 ? (RW - RB) : 1.0f)); - } - - private static int clamp(int f, int min, int max) - { - return (f < min ? min : f > max ? max : f); - } - - private static int hiClamp(int f, int max) - { - return (f > max ? max : f); - } - } - #endregion - - #endregion -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/PnmImage.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/PnmImage.cs deleted file mode 100644 index 96137cdf2c..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/PnmImage.cs +++ /dev/null @@ -1,721 +0,0 @@ - -// Please note, everything below this -// point was originally from a plugin -// for Paint.Net, the plugin is available here: -// http://forums.getpaint.net/index.php?/topic/17202-pnm-file-type-plugin/ -// -// -// The source has been modified for use in this library. -// -// This disclaimer was last -// modified on August 9, 2011. - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Drawing; -using ShaniSoft.IO.DataWriter; -using ShaniSoft.IO.DataReader; -using ShaniSoft.Drawing.PnmReader; -using ShaniSoft.Drawing.PnmWriter; - -namespace ShaniSoft -{ - - #region Drawing - namespace Drawing - { - - #region Pnm - public class Pnm - { - public static PnmType DetectType(Image im) - { - bool flag = true; - for (int i = 0; i < im.Height; i++) - { - for (int j = 0; j < im.Width; j++) - { - Color pixel = ((Bitmap)im).GetPixel(j, i); - if ((pixel.R != pixel.G) || (pixel.R != pixel.B)) - { - return PnmType.Ppm; - } - if (flag && ((((pixel.R > 0) || (pixel.R < 0xff)) || ((pixel.G > 0) || (pixel.G < 0xff))) || ((pixel.B > 0) || (pixel.B < 0xff)))) - { - flag = false; - } - } - } - if (!flag) - { - return PnmType.Pgm; - } - return PnmType.Pbm; - } - - public static Image ReadPnm(Stream inputStream) - { - char ch; - string str; - string magicWord = ((char)inputStream.ReadByte()).ToString() + ((char)inputStream.ReadByte()).ToString(); - inputStream.ReadByte(); - PnmEncoding pNMEncoding = PnmFactory.GetPNMEncoding(magicWord); - IPnmDataReader iPNMDataReader = PnmFactory.GetIPNMDataReader(inputStream, pNMEncoding); - if (iPNMDataReader == null) - { - throw new Exception("Currently only Binary and ASCII encoding is supported"); - } - IPnmReader iPNMReader = PnmFactory.GetIPNMReader(PnmFactory.GetPNMType(magicWord)); - if (iPNMReader == null) - { - throw new Exception("Currently only PBM, PGM and PNM Image Types are supported"); - } - do - { - str = iPNMDataReader.ReadLine(); - if (str.Length == 0) - { - ch = '#'; - } - else - { - ch = str.Substring(0, 1).ToCharArray(0, 1)[0]; - } - } - while (ch == '#'); - string[] strArray = str.Split(new char[] { ' ' }); - int width = int.Parse(strArray[0]); - int height = int.Parse(strArray[1]); - if (magicWord != "P1") - { - do - { - str = iPNMDataReader.ReadLine(); - if (str.Length == 0) - { - ch = '#'; - } - else - { - ch = str.Substring(0, 1).ToCharArray(0, 1)[0]; - } - } - while (ch == '#'); - if (int.Parse(str) != 0xff) - { - Console.WriteLine("Warning, max value for pixels in this image is not 255"); - } - } - return iPNMReader.ReadImageData(iPNMDataReader, width, height); - } - - public static void WritePnm(Stream fs, Image im, PnmEncoding encoding, PnmType ptype) - { - IPnmDataWriter iPNMDataWriter = PnmFactory.GetIPNMDataWriter(fs, encoding); - if (iPNMDataWriter == null) - { - throw new Exception("Currently only Binary and ASCII encoding is supported"); - } - try - { - iPNMDataWriter.WriteLine(PnmFactory.GetMagicWord(ptype, encoding)); - iPNMDataWriter.WriteLine(im.Width.ToString() + " " + im.Height.ToString()); - if (ptype != PnmType.Pbm) - { - iPNMDataWriter.WriteLine("255"); - } - PnmFactory.GetIPNMWriter(ptype).WriteImageData(iPNMDataWriter, im); - } - catch - { - throw; - } - } - } - #endregion - - #region PnmFactory - internal class PnmFactory - { - internal static IPnmDataReader GetIPNMDataReader(Stream fs, PnmEncoding encoding) - { - switch (encoding) - { - case PnmEncoding.BinaryEncoding: - return new BinaryDataReader(fs); - - case PnmEncoding.ASCIIEncoding: - return new ASCIIDataReader(fs); - } - return null; - } - - internal static IPnmDataWriter GetIPNMDataWriter(Stream fs, PnmEncoding encoding) - { - switch (encoding) - { - case PnmEncoding.BinaryEncoding: - return new BinaryDataWriter(fs); - - case PnmEncoding.ASCIIEncoding: - return new ASCIIDataWriter(fs); - } - return null; - } - - internal static IPnmReader GetIPNMReader(PnmType ptype) - { - switch (ptype) - { - case PnmType.Pbm: - return new PbmReader(); - - case PnmType.Pgm: - return new PgmReader(); - - case PnmType.Ppm: - return new PpmReader(); - } - return null; - } - - internal static IPnmWriter GetIPNMWriter(PnmType ptype) - { - switch (ptype) - { - case PnmType.Pbm: - return new PbmWriter(); - - case PnmType.Pgm: - return new PgmWriter(); - - case PnmType.Ppm: - return new PpmWriter(); - } - return null; - } - - internal static string GetMagicWord(PnmType ptype, PnmEncoding encoding) - { - if ((ptype == PnmType.Pgm) && (encoding == PnmEncoding.ASCIIEncoding)) - { - return "P2"; - } - if ((ptype != PnmType.Pgm) || (encoding != PnmEncoding.BinaryEncoding)) - { - if ((ptype == PnmType.Ppm) && (encoding == PnmEncoding.ASCIIEncoding)) - { - return "P3"; - } - if ((ptype == PnmType.Ppm) && (encoding == PnmEncoding.BinaryEncoding)) - { - return "P6"; - } - if ((ptype == PnmType.Pbm) && (encoding == PnmEncoding.ASCIIEncoding)) - { - return "P1"; - } - if ((ptype == PnmType.Pbm) && (encoding == PnmEncoding.BinaryEncoding)) - { - throw new Exception("PBM files are only written in ASCII encoding."); - } - } - return "P5"; - } - - internal static string GetMaxPixel(PnmType ptype) - { - if (ptype == PnmType.Pbm) - { - return "-1"; - } - return "255"; - } - - internal static PnmEncoding GetPNMEncoding(string MagicWord) - { - switch (MagicWord) - { - case "P1": - case "P2": - case "P3": - return PnmEncoding.ASCIIEncoding; - - case "P5": - case "P6": - return PnmEncoding.BinaryEncoding; - } - return PnmEncoding.BinaryEncoding; - } - - internal static PnmType GetPNMType(string MagicWord) - { - switch (MagicWord) - { - case "P1": - return PnmType.Pbm; - - case "P2": - case "P5": - return PnmType.Pgm; - - case "P6": - case "P3": - return PnmType.Ppm; - } - return PnmType.Pgm; - } - } - #endregion - - #region PnmType - public enum PnmType - { - Pbm, - Pgm, - Ppm - } - #endregion - - #region PnmEncoding - public enum PnmEncoding - { - BinaryEncoding, - ASCIIEncoding - } - #endregion - - - #region PnmReader - namespace PnmReader - { - - #region IPnmReader - internal abstract class IPnmReader - { - public abstract Image ReadImageData(IPnmDataReader dr, int width, int height); - } - #endregion - - #region PbmReader - internal class PbmReader : IPnmReader - { - public override Image ReadImageData(IPnmDataReader dr, int width, int height) - { - Image image; - try - { - int count = (dr is ASCIIDataReader) ? width : ((int)Math.Ceiling((double)(((double)width) / 8.0))); - Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); - System.Drawing.Imaging.BitmapData bitmapdata = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); - System.Drawing.Imaging.ColorPalette palette = bitmap.Palette; - palette.Entries[0] = Color.Black; - palette.Entries[1] = Color.White; - bitmap.Palette = palette; - byte[] data = new byte[height * bitmapdata.Stride]; - for (int i = 0; i < height; i++) - { - dr.Read(data, i * bitmapdata.Stride, count); - } - System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapdata.Scan0, data.Length); - bitmap.UnlockBits(bitmapdata); - image = bitmap; - } - catch - { - throw; - } - finally - { - dr.Close(); - } - return image; - } - } - #endregion - - #region PgmReader - internal class PgmReader : IPnmReader - { - public override Image ReadImageData(IPnmDataReader dr, int width, int height) - { - Image image; - try - { - Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); - System.Drawing.Imaging.BitmapData bitmapdata = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); - System.Drawing.Imaging.ColorPalette palette = bitmap.Palette; - for (int i = 0; i < palette.Entries.Length; i++) - { - palette.Entries[i] = Color.FromArgb(i, i, i); - } - bitmap.Palette = palette; - byte[] data = new byte[height * bitmapdata.Stride]; - for (int j = 0; j < height; j++) - { - dr.Read(data, j * bitmapdata.Stride, width); - } - System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapdata.Scan0, data.Length); - bitmap.UnlockBits(bitmapdata); - image = bitmap; - } - catch - { - throw; - } - finally - { - dr.Close(); - } - return image; - } - } - #endregion - - #region PpmReader - internal class PpmReader : IPnmReader - { - public override Image ReadImageData(IPnmDataReader dr, int width, int height) - { - Image image; - try - { - Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); - System.Drawing.Imaging.BitmapData bitmapdata = bitmap.LockBits(new Rectangle(0, 0, width, height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); - byte[] data = new byte[height * bitmapdata.Stride]; - for (int i = 0; i < height; i++) - { - dr.Read(data, i * bitmapdata.Stride, width * 3); - } - System.Runtime.InteropServices.Marshal.Copy(data, 0, bitmapdata.Scan0, data.Length); - bitmap.UnlockBits(bitmapdata); - image = bitmap; - } - catch - { - throw; - } - finally - { - dr.Close(); - } - return image; - } - } - #endregion - - } - #endregion - - #region PnmWriter - namespace PnmWriter - { - - #region IPnmWriter - internal abstract class IPnmWriter - { - public abstract void WriteImageData(IPnmDataWriter dw, Image im); - } - #endregion - - #region PbmWriter - internal class PbmWriter : IPnmWriter - { - public override void WriteImageData(IPnmDataWriter dw, Image im) - { - int num = 0; - for (int i = 0; i < im.Height; i++) - { - for (int j = 0; j < im.Width; j++) - { - Color pixel = ((Bitmap)im).GetPixel(j, i); - int num4 = (pixel.R + pixel.G) + pixel.B; - if (num4 > 0) - { - dw.WriteByte(1); - } - else - { - dw.WriteByte(0); - } - num++; - if ((dw is ASCIIDataWriter) && (num >= 0x22)) - { - num = 0; - dw.WriteLine(string.Empty); - } - } - } - dw.Close(); - } - } - #endregion - - #region PgmWriter - internal class PgmWriter : IPnmWriter - { - public override void WriteImageData(IPnmDataWriter dw, Image im) - { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < im.Height; i++) - { - for (int j = 0; j < im.Width; j++) - { - Color pixel = ((Bitmap)im).GetPixel(j, i); - int num3 = (int)(((pixel.R * 0.3) + (pixel.G * 0.59)) + (pixel.B * 0.11)); - if (dw is ASCIIDataWriter) - { - string str = num3.ToString(); - if ((builder.Length + str.Length) >= 70) - { - dw.WriteLine(string.Empty); - builder.Remove(0, builder.Length); - } - else - { - builder.Append(str); - } - } - dw.WriteByte((byte)num3); - } - } - dw.Close(); - } - } - #endregion - - #region PpmWriter - internal class PpmWriter : IPnmWriter - { - public override void WriteImageData(IPnmDataWriter dw, Image im) - { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < im.Height; i++) - { - for (int j = 0; j < im.Width; j++) - { - Color pixel = ((Bitmap)im).GetPixel(j, i); - if (dw is ASCIIDataWriter) - { - string str = string.Concat(new object[] { pixel.R, " ", pixel.G, " ", pixel.B, " " }); - if ((builder.Length + str.Length) >= 70) - { - dw.WriteLine(string.Empty); - builder.Remove(0, builder.Length); - } - else - { - builder.Append(str); - } - } - dw.WriteByte(pixel.R); - dw.WriteByte(pixel.G); - dw.WriteByte(pixel.B); - } - } - dw.Close(); - } - } - #endregion - - } - #endregion - - } - #endregion - - #region IO - namespace IO - { - - #region DataReader - namespace DataReader - { - - #region ASCIIDataReader - internal class ASCIIDataReader : IPnmDataReader - { - private StreamReader sr; - private System.Collections.Queue toks = new System.Collections.Queue(); - private char[] WhiteSpaces = new char[] { ' ', '\t', '\r', '\n' }; - - public ASCIIDataReader(Stream fs) - { - this.sr = new StreamReader(fs, Encoding.ASCII); - } - - public override void Close() - { - } - - public override int Read(byte[] data, int index, int count) - { - int num = 0; - try - { - while (num < count) - { - data[index + num] = this.ReadByte(); - num++; - } - } - catch - { - } - return num; - } - - public override byte ReadByte() - { - if ((this.toks != null) && (this.toks.Count > 0)) - { - return byte.Parse(this.toks.Dequeue().ToString()); - } - string str = this.sr.ReadLine(); - if (str == null) - { - throw new Exception("Unexpected end of file"); - } - foreach (string str2 in str.Split(this.WhiteSpaces)) - { - if (str2.Length > 0) - { - this.toks.Enqueue(str2); - } - } - return this.ReadByte(); - } - - public override string ReadLine() - { - return this.sr.ReadLine(); - } - } - #endregion - - #region BinaryDataReader - internal class BinaryDataReader : IPnmDataReader - { - private BinaryReader br; - private char EndLine = '\n'; - - public BinaryDataReader(Stream fs) - { - this.br = new BinaryReader(fs); - } - - public override void Close() - { - } - - public override int Read(byte[] data, int start, int length) - { - return this.br.Read(data, start, length); - } - - public override byte ReadByte() - { - return this.br.ReadByte(); - } - - public override string ReadLine() - { - StringBuilder builder = new StringBuilder(); - for (byte i = this.br.ReadByte(); i != this.EndLine; i = this.br.ReadByte()) - { - builder.Append(((char)i).ToString()); - } - return builder.ToString(); - } - } - #endregion - - #region IPnmDataReader - internal abstract class IPnmDataReader - { - public abstract void Close(); - public abstract int Read(byte[] data, int index, int count); - public abstract byte ReadByte(); - public abstract string ReadLine(); - } - #endregion - - } - #endregion - - #region DataWriter - namespace DataWriter - { - - #region ASCIIDataWriter - internal class ASCIIDataWriter : IPnmDataWriter - { - private StreamWriter sw; - - public ASCIIDataWriter(Stream fs) - { - this.sw = new StreamWriter(fs); - } - - public override void Close() - { - this.sw.Flush(); - } - - public override void WriteByte(byte data) - { - this.sw.Write(data.ToString() + " "); - } - - public override void WriteLine(string line) - { - this.sw.WriteLine(line); - } - } - #endregion - - #region BinaryDataWriter - internal class BinaryDataWriter : IPnmDataWriter - { - private BinaryWriter bw; - - public BinaryDataWriter(Stream fs) - { - this.bw = new BinaryWriter(fs); - } - - public override void Close() - { - this.bw.Flush(); - } - - public override void WriteByte(byte data) - { - this.bw.Write(data); - } - - public override void WriteLine(string line) - { - this.bw.Write(Encoding.ASCII.GetBytes(line + "\n")); - } - } - #endregion - - #region IPnmDataWriter - internal abstract class IPnmDataWriter - { - public abstract void Close(); - public abstract void WriteByte(byte data); - public abstract void WriteLine(string line); - } - #endregion - - } - #endregion - - } - #endregion - -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/TgaImage.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/TgaImage.cs deleted file mode 100644 index a226ca7c58..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Image Formats/TgaImage.cs +++ /dev/null @@ -1,1230 +0,0 @@ -// ========================================================== -// TargaImage -// -// Design and implementation by -// - David Polomis (paloma_sw@cox.net) -// -// -// This source code, along with any associated files, is licensed under -// The Code Project Open License (CPOL) 1.02 -// A copy of this license can be found at -// http://www.codeproject.com/info/cpol10.aspx -// -// -// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -// INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS -// FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR -// NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -// OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE -// DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY -// OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, -// REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN -// ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS -// AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. -// -// Use at your own risk! -// -// ========================================================== - - -using System; -using System.Collections.Generic; -using System.Collections; -using System.Text; -using System.IO; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; - -namespace Paloma -{ - #region TargaConstants - internal static class TargaConstants - { - internal const int HeaderByteLength = 18; - internal const int FooterByteLength = 26; - internal const int FooterSignatureOffsetFromEnd = 18; - internal const int FooterSignatureByteLength = 16; - internal const int FooterReservedCharByteLength = 1; - internal const int ExtensionAreaAuthorNameByteLength = 41; - internal const int ExtensionAreaAuthorCommentsByteLength = 324; - internal const int ExtensionAreaJobNameByteLength = 41; - internal const int ExtensionAreaSoftwareIDByteLength = 41; - internal const int ExtensionAreaSoftwareVersionLetterByteLength = 1; - internal const int ExtensionAreaColorCorrectionTableValueLength = 256; - internal const string TargaFooterASCIISignature = "TRUEVISION-XFILE"; - } - #endregion - - #region TGAFormat - internal enum TGAFormat - { - UNKNOWN = 0, - ORIGINAL_TGA = 100, - NEW_TGA = 200 - } - #endregion - - #region ColorMapType - internal enum ColorMapType : byte - { - NO_COLOR_MAP = 0, - COLOR_MAP_INCLUDED = 1 - } - #endregion - - #region ImageType - internal enum ImageType : byte - { - NO_IMAGE_DATA = 0, - UNCOMPRESSED_COLOR_MAPPED = 1, - UNCOMPRESSED_TRUE_COLOR = 2, - UNCOMPRESSED_BLACK_AND_WHITE = 3, - RUN_LENGTH_ENCODED_COLOR_MAPPED = 9, - RUN_LENGTH_ENCODED_TRUE_COLOR = 10, - RUN_LENGTH_ENCODED_BLACK_AND_WHITE = 11 - } - #endregion - - #region VerticalTransferOrder - internal enum VerticalTransferOrder - { - UNKNOWN = -1, - BOTTOM = 0, - TOP = 1 - } - #endregion - - #region HorizontalTransferOrder - internal enum HorizontalTransferOrder - { - UNKNOWN = -1, - RIGHT = 0, - LEFT = 1 - } - #endregion - - #region FirstPixelDestination - internal enum FirstPixelDestination - { - UNKNOWN = 0, - TOP_LEFT = 1, - TOP_RIGHT = 2, - BOTTOM_LEFT = 3, - BOTTOM_RIGHT = 4 - } - #endregion - - #region RLEPacketType - internal enum RLEPacketType - { - RAW = 0, - RUN_LENGTH = 1 - } - #endregion - - #region TargaImage - /// - /// Reads and loads a Truevision TGA Format image file. - /// - public class TargaImage : IDisposable - { - private TargaHeader objTargaHeader = null; - private TargaExtensionArea objTargaExtensionArea = null; - private TargaFooter objTargaFooter = null; - private Bitmap bmpTargaImage = null; - private TGAFormat eTGAFormat = TGAFormat.UNKNOWN; - private string strFileName = string.Empty; - private int intStride = 0; - private int intPadding = 0; - private GCHandle ImageByteHandle; - private System.Collections.Generic.List> rows = new System.Collections.Generic.List>(); - private System.Collections.Generic.List row = new System.Collections.Generic.List(); - private bool disposed = false; - public TargaImage() - { - this.objTargaFooter = new TargaFooter(); - this.objTargaHeader = new TargaHeader(); - this.objTargaExtensionArea = new TargaExtensionArea(); - this.bmpTargaImage = null; - } - internal TargaHeader Header - { - get { return this.objTargaHeader; } - } - internal TGAFormat Format - { - get { return this.eTGAFormat; } - } - public Bitmap Image - { - get { return this.bmpTargaImage; } - } - internal string FileName - { - get { return this.strFileName; } - } - internal int Stride - { - get { return this.intStride; } - } - internal int Padding - { - get { return this.intPadding; } - } - ~TargaImage() - { - Dispose(false); - } - - public TargaImage(Stream s) - : this() - { - using (BinaryReader binReader = new BinaryReader(s)) - { - this.LoadTGAFooterInfo(binReader); - this.LoadTGAHeaderInfo(binReader); - this.LoadTGAExtensionArea(binReader); - this.LoadTGAImage(binReader); - } - } - - /// - /// Loads the Targa Footer information from the file. - /// - /// A BinaryReader that points the loaded file byte stream. - private void LoadTGAFooterInfo(BinaryReader binReader) - { - binReader.BaseStream.Seek((TargaConstants.FooterSignatureOffsetFromEnd * -1), SeekOrigin.End); - string Signature = System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.FooterSignatureByteLength)).TrimEnd('\0'); - if (string.Compare(Signature, TargaConstants.TargaFooterASCIISignature) == 0) - { - this.eTGAFormat = TGAFormat.NEW_TGA; - binReader.BaseStream.Seek((TargaConstants.FooterByteLength * -1), SeekOrigin.End); - int ExtOffset = binReader.ReadInt32(); - int DevDirOff = binReader.ReadInt32(); - binReader.ReadBytes(TargaConstants.FooterSignatureByteLength); - string ResChar = System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.FooterReservedCharByteLength)).TrimEnd('\0'); - this.objTargaFooter.SetExtensionAreaOffset(ExtOffset); - this.objTargaFooter.SetDeveloperDirectoryOffset(DevDirOff); - this.objTargaFooter.SetSignature(Signature); - this.objTargaFooter.SetReservedCharacter(ResChar); - } - else - { - this.eTGAFormat = TGAFormat.ORIGINAL_TGA; - } - } - - - /// - /// Loads the Targa Header information from the file. - /// - /// A BinaryReader that points the loaded file byte stream. - private void LoadTGAHeaderInfo(BinaryReader binReader) - { - binReader.BaseStream.Seek(0, SeekOrigin.Begin); - this.objTargaHeader.SetImageIDLength(binReader.ReadByte()); - this.objTargaHeader.SetColorMapType((ColorMapType)binReader.ReadByte()); - this.objTargaHeader.SetImageType((ImageType)binReader.ReadByte()); - this.objTargaHeader.SetColorMapFirstEntryIndex(binReader.ReadInt16()); - this.objTargaHeader.SetColorMapLength(binReader.ReadInt16()); - this.objTargaHeader.SetColorMapEntrySize(binReader.ReadByte()); - this.objTargaHeader.SetXOrigin(binReader.ReadInt16()); - this.objTargaHeader.SetYOrigin(binReader.ReadInt16()); - this.objTargaHeader.SetWidth(binReader.ReadInt16()); - this.objTargaHeader.SetHeight(binReader.ReadInt16()); - byte pixeldepth = binReader.ReadByte(); - switch (pixeldepth) - { - case 8: - case 16: - case 24: - case 32: - this.objTargaHeader.SetPixelDepth(pixeldepth); - break; - - default: - this.ClearAll(); - throw new Exception("Targa Image only supports 8, 16, 24, or 32 bit pixel depths."); - } - - - byte ImageDescriptor = binReader.ReadByte(); - this.objTargaHeader.SetAttributeBits((byte)Utilities.GetBits(ImageDescriptor, 0, 4)); - - this.objTargaHeader.SetVerticalTransferOrder((VerticalTransferOrder)Utilities.GetBits(ImageDescriptor, 5, 1)); - this.objTargaHeader.SetHorizontalTransferOrder((HorizontalTransferOrder)Utilities.GetBits(ImageDescriptor, 4, 1)); - - if (this.objTargaHeader.ImageIDLength > 0) - { - byte[] ImageIDValueBytes = binReader.ReadBytes(this.objTargaHeader.ImageIDLength); - this.objTargaHeader.SetImageIDValue(System.Text.Encoding.ASCII.GetString(ImageIDValueBytes).TrimEnd('\0')); - } - if (this.objTargaHeader.ColorMapType == ColorMapType.COLOR_MAP_INCLUDED) - { - if (this.objTargaHeader.ImageType == ImageType.UNCOMPRESSED_COLOR_MAPPED || - this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_COLOR_MAPPED) - { - if (this.objTargaHeader.ColorMapLength > 0) - { - for (int i = 0; i < this.objTargaHeader.ColorMapLength; i++) - { - int a = 0; - int r = 0; - int g = 0; - int b = 0; - switch (this.objTargaHeader.ColorMapEntrySize) - { - case 15: - byte[] color15 = binReader.ReadBytes(2); - this.objTargaHeader.ColorMap.Add(Utilities.GetColorFrom2Bytes(color15[1], color15[0])); - break; - case 16: - byte[] color16 = binReader.ReadBytes(2); - this.objTargaHeader.ColorMap.Add(Utilities.GetColorFrom2Bytes(color16[1], color16[0])); - break; - case 24: - b = Convert.ToInt32(binReader.ReadByte()); - g = Convert.ToInt32(binReader.ReadByte()); - r = Convert.ToInt32(binReader.ReadByte()); - this.objTargaHeader.ColorMap.Add(System.Drawing.Color.FromArgb(r, g, b)); - break; - case 32: - a = Convert.ToInt32(binReader.ReadByte()); - b = Convert.ToInt32(binReader.ReadByte()); - g = Convert.ToInt32(binReader.ReadByte()); - r = Convert.ToInt32(binReader.ReadByte()); - this.objTargaHeader.ColorMap.Add(System.Drawing.Color.FromArgb(a, r, g, b)); - break; - default: - this.ClearAll(); - throw new Exception("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); - - } - } - } - else - { - throw new Exception("Image Type requires a Color Map and Color Map Length is zero."); - } - } - } - else - { - if (this.objTargaHeader.ImageType == ImageType.UNCOMPRESSED_COLOR_MAPPED || - this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_COLOR_MAPPED) - { - this.ClearAll(); - throw new Exception("Image Type requires a Color Map and there was not a Color Map included in the file."); - } - } - } - - - /// - /// Loads the Targa Extension Area from the file, if it exists. - /// - /// A BinaryReader that points the loaded file byte stream. - private void LoadTGAExtensionArea(BinaryReader binReader) - { - if (this.objTargaFooter.ExtensionAreaOffset > 0) - { - binReader.BaseStream.Seek(this.objTargaFooter.ExtensionAreaOffset, SeekOrigin.Begin); - this.objTargaExtensionArea.SetExtensionSize((int)(binReader.ReadInt16())); - this.objTargaExtensionArea.SetAuthorName(System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.ExtensionAreaAuthorNameByteLength)).TrimEnd('\0')); - this.objTargaExtensionArea.SetAuthorComments(System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.ExtensionAreaAuthorCommentsByteLength)).TrimEnd('\0')); - Int16 iMonth = binReader.ReadInt16(); - Int16 iDay = binReader.ReadInt16(); - Int16 iYear = binReader.ReadInt16(); - Int16 iHour = binReader.ReadInt16(); - Int16 iMinute = binReader.ReadInt16(); - Int16 iSecond = binReader.ReadInt16(); - DateTime dtstamp; - string strStamp = iMonth.ToString() + @"/" + iDay.ToString() + @"/" + iYear.ToString() + @" "; - strStamp += iHour.ToString() + @":" + iMinute.ToString() + @":" + iSecond.ToString(); - if (DateTime.TryParse(strStamp, out dtstamp) == true) - this.objTargaExtensionArea.SetDateTimeStamp(dtstamp); - this.objTargaExtensionArea.SetJobName(System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.ExtensionAreaJobNameByteLength)).TrimEnd('\0')); - iHour = binReader.ReadInt16(); - iMinute = binReader.ReadInt16(); - iSecond = binReader.ReadInt16(); - TimeSpan ts = new TimeSpan((int)iHour, (int)iMinute, (int)iSecond); - this.objTargaExtensionArea.SetJobTime(ts); - this.objTargaExtensionArea.SetSoftwareID(System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.ExtensionAreaSoftwareIDByteLength)).TrimEnd('\0')); - float iVersionNumber = (float)binReader.ReadInt16() / 100.0F; - string strVersionLetter = System.Text.Encoding.ASCII.GetString(binReader.ReadBytes(TargaConstants.ExtensionAreaSoftwareVersionLetterByteLength)).TrimEnd('\0'); - this.objTargaExtensionArea.SetSoftwareID(iVersionNumber.ToString(@"F2") + strVersionLetter); - int a = (int)binReader.ReadByte(); - int r = (int)binReader.ReadByte(); - int b = (int)binReader.ReadByte(); - int g = (int)binReader.ReadByte(); - this.objTargaExtensionArea.SetKeyColor(Color.FromArgb(a, r, g, b)); - this.objTargaExtensionArea.SetPixelAspectRatioNumerator((int)binReader.ReadInt16()); - this.objTargaExtensionArea.SetPixelAspectRatioDenominator((int)binReader.ReadInt16()); - this.objTargaExtensionArea.SetGammaNumerator((int)binReader.ReadInt16()); - this.objTargaExtensionArea.SetGammaDenominator((int)binReader.ReadInt16()); - this.objTargaExtensionArea.SetColorCorrectionOffset(binReader.ReadInt32()); - this.objTargaExtensionArea.SetPostageStampOffset(binReader.ReadInt32()); - this.objTargaExtensionArea.SetScanLineOffset(binReader.ReadInt32()); - this.objTargaExtensionArea.SetAttributesType((int)binReader.ReadByte()); - - if (this.objTargaExtensionArea.ScanLineOffset > 0) - { - binReader.BaseStream.Seek(this.objTargaExtensionArea.ScanLineOffset, SeekOrigin.Begin); - for (int i = 0; i < this.objTargaHeader.Height; i++) - { - this.objTargaExtensionArea.ScanLineTable.Add(binReader.ReadInt32()); - } - } - if (this.objTargaExtensionArea.ColorCorrectionOffset > 0) - { - binReader.BaseStream.Seek(this.objTargaExtensionArea.ColorCorrectionOffset, SeekOrigin.Begin); - for (int i = 0; i < TargaConstants.ExtensionAreaColorCorrectionTableValueLength; i++) - { - a = (int)binReader.ReadInt16(); - r = (int)binReader.ReadInt16(); - b = (int)binReader.ReadInt16(); - g = (int)binReader.ReadInt16(); - this.objTargaExtensionArea.ColorCorrectionTable.Add(Color.FromArgb(a, r, g, b)); - } - } - } - } - - /// - /// Reads the image data bytes from the file. Handles Uncompressed and RLE Compressed image data. - /// Uses FirstPixelDestination to properly align the image. - /// - /// A BinaryReader that points the loaded file byte stream. - /// An array of bytes representing the image data in the proper alignment. - private byte[] LoadImageBytes(BinaryReader binReader) - { - byte[] data = null; - if (this.objTargaHeader.ImageDataOffset > 0) - { - byte[] padding = new byte[this.intPadding]; - MemoryStream msData = null; - binReader.BaseStream.Seek(this.objTargaHeader.ImageDataOffset, SeekOrigin.Begin); - int intImageRowByteSize = (int)this.objTargaHeader.Width * ((int)this.objTargaHeader.BytesPerPixel); - int intImageByteSize = intImageRowByteSize * (int)this.objTargaHeader.Height; - if (this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_BLACK_AND_WHITE || - this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_COLOR_MAPPED || - this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_TRUE_COLOR) - { - - #region COMPRESSED - byte bRLEPacket = 0; - int intRLEPacketType = -1; - int intRLEPixelCount = 0; - byte[] bRunLengthPixel = null; - int intImageBytesRead = 0; - int intImageRowBytesRead = 0; - while (intImageBytesRead < intImageByteSize) - { - bRLEPacket = binReader.ReadByte(); - intRLEPacketType = Utilities.GetBits(bRLEPacket, 7, 1); - intRLEPixelCount = Utilities.GetBits(bRLEPacket, 0, 7) + 1; - if ((RLEPacketType)intRLEPacketType == RLEPacketType.RUN_LENGTH) - { - bRunLengthPixel = binReader.ReadBytes((int)this.objTargaHeader.BytesPerPixel); - - for (int i = 0; i < intRLEPixelCount; i++) - { - foreach (byte b in bRunLengthPixel) - row.Add(b); - intImageRowBytesRead += bRunLengthPixel.Length; - intImageBytesRead += bRunLengthPixel.Length; - if (intImageRowBytesRead == intImageRowByteSize) - { - rows.Add(row); - row = new System.Collections.Generic.List(); - intImageRowBytesRead = 0; - } - } - } - else if ((RLEPacketType)intRLEPacketType == RLEPacketType.RAW) - { - int intBytesToRead = intRLEPixelCount * (int)this.objTargaHeader.BytesPerPixel; - for (int i = 0; i < intBytesToRead; i++) - { - row.Add(binReader.ReadByte()); - intImageBytesRead++; - intImageRowBytesRead++; - if (intImageRowBytesRead == intImageRowByteSize) - { - rows.Add(row); - row = new System.Collections.Generic.List(); - intImageRowBytesRead = 0; - } - } - } - } - #endregion - - } - - else - { - #region NON-COMPRESSED - for (int i = 0; i < (int)this.objTargaHeader.Height; i++) - { - for (int j = 0; j < intImageRowByteSize; j++) - { - row.Add(binReader.ReadByte()); - } - rows.Add(row); - row = new System.Collections.Generic.List(); - } - #endregion - } - bool blnRowsReverse = false; - bool blnEachRowReverse = false; - switch (this.objTargaHeader.FirstPixelDestination) - { - case FirstPixelDestination.TOP_LEFT: - blnRowsReverse = false; - blnEachRowReverse = true; - break; - - case FirstPixelDestination.TOP_RIGHT: - blnRowsReverse = false; - blnEachRowReverse = false; - break; - - case FirstPixelDestination.BOTTOM_LEFT: - blnRowsReverse = true; - blnEachRowReverse = true; - break; - - case FirstPixelDestination.BOTTOM_RIGHT: - case FirstPixelDestination.UNKNOWN: - blnRowsReverse = true; - blnEachRowReverse = false; - - break; - } - using (msData = new MemoryStream()) - { - if (blnRowsReverse == true) - rows.Reverse(); - for (int i = 0; i < rows.Count; i++) - { - if (blnEachRowReverse == true) - rows[i].Reverse(); - byte[] brow = rows[i].ToArray(); - msData.Write(brow, 0, brow.Length); - msData.Write(padding, 0, padding.Length); - } - data = msData.ToArray(); - } - } - else - { - throw new Exception(@"Error, No image data in file."); - } - return data; - - } - - /// - /// Reads the image data bytes from the file and loads them into the Image Bitmap object. - /// Also loads the color map, if any, into the Image Bitmap. - /// - /// A BinaryReader that points the loaded file byte stream. - private void LoadTGAImage(BinaryReader binReader) - { - this.intStride = (((int)this.objTargaHeader.Width * (int)this.objTargaHeader.PixelDepth + 31) & ~31) >> 3; - this.intPadding = this.intStride - ((((int)this.objTargaHeader.Width * (int)this.objTargaHeader.PixelDepth) + 7) / 8); - byte[] bimagedata = this.LoadImageBytes(binReader); - this.ImageByteHandle = GCHandle.Alloc(bimagedata, GCHandleType.Pinned); - if (this.bmpTargaImage != null) - { - this.bmpTargaImage.Dispose(); - } - PixelFormat pf = this.GetPixelFormat(); - this.bmpTargaImage = new Bitmap((int)this.objTargaHeader.Width, (int)this.objTargaHeader.Height, this.intStride, pf, this.ImageByteHandle.AddrOfPinnedObject()); - this.LoadThumbnail(binReader, pf); - if (this.objTargaHeader.ColorMap.Count > 0) - { - ColorPalette pal = this.bmpTargaImage.Palette; - for (int i = 0; i < this.objTargaHeader.ColorMap.Count; i++) - { - if (this.objTargaExtensionArea.AttributesType == 0 || - this.objTargaExtensionArea.AttributesType == 1) - pal.Entries[i] = Color.FromArgb(255, this.objTargaHeader.ColorMap[i].R, this.objTargaHeader.ColorMap[i].G, this.objTargaHeader.ColorMap[i].B); - else - pal.Entries[i] = this.objTargaHeader.ColorMap[i]; - - } - this.bmpTargaImage.Palette = pal; - } - else - { - if (this.objTargaHeader.PixelDepth == 8 && (this.objTargaHeader.ImageType == ImageType.UNCOMPRESSED_BLACK_AND_WHITE || - this.objTargaHeader.ImageType == ImageType.RUN_LENGTH_ENCODED_BLACK_AND_WHITE)) - { - ColorPalette pal = this.bmpTargaImage.Palette; - for (int i = 0; i < 256; i++) - { - pal.Entries[i] = Color.FromArgb(i, i, i); - } - this.bmpTargaImage.Palette = pal; - } - } - } - - /// - /// Gets the PixelFormat to be used by the Image based on the Targa file's attributes - /// - /// - private PixelFormat GetPixelFormat() - { - PixelFormat pfTargaPixelFormat = PixelFormat.Undefined; - switch (this.objTargaHeader.PixelDepth) - { - case 8: - pfTargaPixelFormat = PixelFormat.Format8bppIndexed; - break; - - case 16: - if (this.Format == TGAFormat.NEW_TGA) - { - switch (this.objTargaExtensionArea.AttributesType) - { - case 0: - case 1: - case 2: - pfTargaPixelFormat = PixelFormat.Format16bppRgb555; - break; - - case 3: - pfTargaPixelFormat = PixelFormat.Format16bppArgb1555; - break; - } - } - else - { - pfTargaPixelFormat = PixelFormat.Format16bppRgb555; - } - break; - - case 24: - pfTargaPixelFormat = PixelFormat.Format24bppRgb; - break; - - case 32: - if (this.Format == TGAFormat.NEW_TGA) - { - switch (this.objTargaExtensionArea.AttributesType) - { - - case 1: - case 2: - pfTargaPixelFormat = PixelFormat.Format32bppRgb; - break; - - case 0: - case 3: - pfTargaPixelFormat = PixelFormat.Format32bppArgb; - break; - - case 4: - pfTargaPixelFormat = PixelFormat.Format32bppPArgb; - break; - } - } - else - { - pfTargaPixelFormat = PixelFormat.Format32bppRgb; - break; - } - break; - } - return pfTargaPixelFormat; - } - - - /// - /// Loads the thumbnail of the loaded image file, if any. - /// - /// A BinaryReader that points the loaded file byte stream. - /// A PixelFormat value indicating what pixel format to use when loading the thumbnail. - private void LoadThumbnail(BinaryReader binReader, PixelFormat pfPixelFormat) - { - if (this.objTargaExtensionArea.PostageStampOffset > 0) - { - binReader.BaseStream.Seek(this.objTargaExtensionArea.PostageStampOffset, SeekOrigin.Begin); - int iWidth = (int)binReader.ReadByte(); - int iHeight = (int)binReader.ReadByte(); - int intImageRowByteSize = iWidth * ((int)this.objTargaHeader.PixelDepth / 8); - int intImageByteSize = intImageRowByteSize * iHeight; - for (int i = 0; i < intImageByteSize; i++) - { - binReader.ReadByte(); - } - } - } - - /// - /// Clears out all objects and resources. - /// - private void ClearAll() - { - if (this.bmpTargaImage != null) - { - this.bmpTargaImage.Dispose(); - this.bmpTargaImage = null; - } - if (this.ImageByteHandle.IsAllocated) - this.ImageByteHandle.Free(); - - this.objTargaHeader = new TargaHeader(); - this.objTargaExtensionArea = new TargaExtensionArea(); - this.objTargaFooter = new TargaFooter(); - this.eTGAFormat = TGAFormat.UNKNOWN; - this.intStride = 0; - this.intPadding = 0; - this.rows.Clear(); - this.row.Clear(); - this.strFileName = string.Empty; - - } - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - - } - protected virtual void Dispose(bool disposing) - { - if (!this.disposed) - { - if (disposing) - { - if (this.bmpTargaImage != null) - { - this.bmpTargaImage.Dispose(); - } - if (this.ImageByteHandle != null) - { - if (this.ImageByteHandle.IsAllocated) - { - this.ImageByteHandle.Free(); - } - - } - } - } - disposed = true; - } - } - #endregion - - #region TargaHeader - internal class TargaHeader - { - private byte bImageIDLength = 0; - private ColorMapType eColorMapType = ColorMapType.NO_COLOR_MAP; - private ImageType eImageType = ImageType.NO_IMAGE_DATA; - private short sColorMapFirstEntryIndex = 0; - private short sColorMapLength = 0; - private byte bColorMapEntrySize = 0; - private short sXOrigin = 0; - private short sYOrigin = 0; - private short sWidth = 0; - private short sHeight = 0; - private byte bPixelDepth = 0; - private byte bImageDescriptor = 0; - private VerticalTransferOrder eVerticalTransferOrder = VerticalTransferOrder.UNKNOWN; - private HorizontalTransferOrder eHorizontalTransferOrder = HorizontalTransferOrder.UNKNOWN; - private byte bAttributeBits = 0; - private string strImageIDValue = string.Empty; - private System.Collections.Generic.List cColorMap = new List(); - - public byte ImageIDLength - { - get { return this.bImageIDLength; } - } - internal protected void SetImageIDLength(byte bImageIDLength) - { - this.bImageIDLength = bImageIDLength; - } - public ColorMapType ColorMapType - { - get { return this.eColorMapType; } - } - internal protected void SetColorMapType(ColorMapType eColorMapType) - { - this.eColorMapType = eColorMapType; - } - public ImageType ImageType - { - get { return this.eImageType; } - } - internal protected void SetImageType(ImageType eImageType) - { - this.eImageType = eImageType; - } - public short ColorMapFirstEntryIndex - { - get { return this.sColorMapFirstEntryIndex; } - } - internal protected void SetColorMapFirstEntryIndex(short sColorMapFirstEntryIndex) - { - this.sColorMapFirstEntryIndex = sColorMapFirstEntryIndex; - } - public short ColorMapLength - { - get { return this.sColorMapLength; } - } - internal protected void SetColorMapLength(short sColorMapLength) - { - this.sColorMapLength = sColorMapLength; - } - public byte ColorMapEntrySize - { - get { return this.bColorMapEntrySize; } - } - internal protected void SetColorMapEntrySize(byte bColorMapEntrySize) - { - this.bColorMapEntrySize = bColorMapEntrySize; - } - public short XOrigin - { - get { return this.sXOrigin; } - } - internal protected void SetXOrigin(short sXOrigin) - { - this.sXOrigin = sXOrigin; - } - public short YOrigin - { - get { return this.sYOrigin; } - } - internal protected void SetYOrigin(short sYOrigin) - { - this.sYOrigin = sYOrigin; - } - public short Width - { - get { return this.sWidth; } - } - internal protected void SetWidth(short sWidth) - { - this.sWidth = sWidth; - } - public short Height - { - get { return this.sHeight; } - } - internal protected void SetHeight(short sHeight) - { - this.sHeight = sHeight; - } - public byte PixelDepth - { - get { return this.bPixelDepth; } - } - internal protected void SetPixelDepth(byte bPixelDepth) - { - this.bPixelDepth = bPixelDepth; - } - internal protected byte ImageDescriptor - { - get { return this.bImageDescriptor; } - set { this.bImageDescriptor = value; } - } - public FirstPixelDestination FirstPixelDestination - { - get - { - if (this.eVerticalTransferOrder == VerticalTransferOrder.UNKNOWN || this.eHorizontalTransferOrder == HorizontalTransferOrder.UNKNOWN) - return FirstPixelDestination.UNKNOWN; - else if (this.eVerticalTransferOrder == VerticalTransferOrder.BOTTOM && this.eHorizontalTransferOrder == HorizontalTransferOrder.LEFT) - return FirstPixelDestination.BOTTOM_LEFT; - else if (this.eVerticalTransferOrder == VerticalTransferOrder.BOTTOM && this.eHorizontalTransferOrder == HorizontalTransferOrder.RIGHT) - return FirstPixelDestination.BOTTOM_RIGHT; - else if (this.eVerticalTransferOrder == VerticalTransferOrder.TOP && this.eHorizontalTransferOrder == HorizontalTransferOrder.LEFT) - return FirstPixelDestination.TOP_LEFT; - else - return FirstPixelDestination.TOP_RIGHT; - } - } - public VerticalTransferOrder VerticalTransferOrder - { - get { return this.eVerticalTransferOrder; } - } - internal protected void SetVerticalTransferOrder(VerticalTransferOrder eVerticalTransferOrder) - { - this.eVerticalTransferOrder = eVerticalTransferOrder; - } - public HorizontalTransferOrder HorizontalTransferOrder - { - get { return this.eHorizontalTransferOrder; } - } - internal protected void SetHorizontalTransferOrder(HorizontalTransferOrder eHorizontalTransferOrder) - { - this.eHorizontalTransferOrder = eHorizontalTransferOrder; - } - public byte AttributeBits - { - get { return this.bAttributeBits; } - } - internal protected void SetAttributeBits(byte bAttributeBits) - { - this.bAttributeBits = bAttributeBits; - } - public string ImageIDValue - { - get { return this.strImageIDValue; } - } - internal protected void SetImageIDValue(string strImageIDValue) - { - this.strImageIDValue = strImageIDValue; - } - public System.Collections.Generic.List ColorMap - { - get { return this.cColorMap; } - } - public int ImageDataOffset - { - get - { - int intImageDataOffset = TargaConstants.HeaderByteLength; - intImageDataOffset += this.bImageIDLength; - int Bytes = 0; - switch (this.bColorMapEntrySize) - { - case 15: - Bytes = 2; - break; - case 16: - Bytes = 2; - break; - case 24: - Bytes = 3; - break; - case 32: - Bytes = 4; - break; - } - intImageDataOffset += ((int)this.sColorMapLength * (int)Bytes); - return intImageDataOffset; - } - } - public int BytesPerPixel - { - get - { - return (int)this.bPixelDepth / 8; - } - } - } - #endregion - - #region TargaFooter - internal class TargaFooter - { - private int intExtensionAreaOffset = 0; - private int intDeveloperDirectoryOffset = 0; - private string strSignature = string.Empty; - private string strReservedCharacter = string.Empty; - public int ExtensionAreaOffset - { - get { return this.intExtensionAreaOffset; } - } - internal protected void SetExtensionAreaOffset(int intExtensionAreaOffset) - { - this.intExtensionAreaOffset = intExtensionAreaOffset; - } - public int DeveloperDirectoryOffset - { - get { return this.intDeveloperDirectoryOffset; } - } - internal protected void SetDeveloperDirectoryOffset(int intDeveloperDirectoryOffset) - { - this.intDeveloperDirectoryOffset = intDeveloperDirectoryOffset; - } - public string Signature - { - get { return this.strSignature; } - } - internal protected void SetSignature(string strSignature) - { - this.strSignature = strSignature; - } - public string ReservedCharacter - { - get { return this.strReservedCharacter; } - } - internal protected void SetReservedCharacter(string strReservedCharacter) - { - this.strReservedCharacter = strReservedCharacter; - } - public TargaFooter() { } - } - #endregion - - #region TargaExtensionArea - internal class TargaExtensionArea - { - int intExtensionSize = 0; - string strAuthorName = string.Empty; - string strAuthorComments = string.Empty; - DateTime dtDateTimeStamp = DateTime.Now; - string strJobName = string.Empty; - TimeSpan dtJobTime = TimeSpan.Zero; - string strSoftwareID = string.Empty; - string strSoftwareVersion = string.Empty; - Color cKeyColor = Color.Empty; - int intPixelAspectRatioNumerator = 0; - int intPixelAspectRatioDenominator = 0; - int intGammaNumerator = 0; - int intGammaDenominator = 0; - int intColorCorrectionOffset = 0; - int intPostageStampOffset = 0; - int intScanLineOffset = 0; - int intAttributesType = 0; - private System.Collections.Generic.List intScanLineTable = new List(); - private System.Collections.Generic.List cColorCorrectionTable = new List(); - public int ExtensionSize - { - get { return this.intExtensionSize; } - } - internal protected void SetExtensionSize(int intExtensionSize) - { - this.intExtensionSize = intExtensionSize; - } - public string AuthorName - { - get { return this.strAuthorName; } - } - internal protected void SetAuthorName(string strAuthorName) - { - this.strAuthorName = strAuthorName; - } - public string AuthorComments - { - get { return this.strAuthorComments; } - } - internal protected void SetAuthorComments(string strAuthorComments) - { - this.strAuthorComments = strAuthorComments; - } - public DateTime DateTimeStamp - { - get { return this.dtDateTimeStamp; } - } - internal protected void SetDateTimeStamp(DateTime dtDateTimeStamp) - { - this.dtDateTimeStamp = dtDateTimeStamp; - } - public string JobName - { - get { return this.strJobName; } - } - internal protected void SetJobName(string strJobName) - { - this.strJobName = strJobName; - } - public TimeSpan JobTime - { - get { return this.dtJobTime; } - } - internal protected void SetJobTime(TimeSpan dtJobTime) - { - this.dtJobTime = dtJobTime; - } - public string SoftwareID - { - get { return this.strSoftwareID; } - } - internal protected void SetSoftwareID(string strSoftwareID) - { - this.strSoftwareID = strSoftwareID; - } - public string SoftwareVersion - { - get { return this.strSoftwareVersion; } - } - internal protected void SetSoftwareVersion(string strSoftwareVersion) - { - this.strSoftwareVersion = strSoftwareVersion; - } - public Color KeyColor - { - get { return this.cKeyColor; } - } - internal protected void SetKeyColor(Color cKeyColor) - { - this.cKeyColor = cKeyColor; - } - public int PixelAspectRatioNumerator - { - get { return this.intPixelAspectRatioNumerator; } - } - internal protected void SetPixelAspectRatioNumerator(int intPixelAspectRatioNumerator) - { - this.intPixelAspectRatioNumerator = intPixelAspectRatioNumerator; - } - public int PixelAspectRatioDenominator - { - get { return this.intPixelAspectRatioDenominator; } - } - internal protected void SetPixelAspectRatioDenominator(int intPixelAspectRatioDenominator) - { - this.intPixelAspectRatioDenominator = intPixelAspectRatioDenominator; - } - public float PixelAspectRatio - { - get - { - if (this.intPixelAspectRatioDenominator > 0) - { - return (float)this.intPixelAspectRatioNumerator / (float)this.intPixelAspectRatioDenominator; - } - else - return 0.0F; - } - } - public int GammaNumerator - { - get { return this.intGammaNumerator; } - } - internal protected void SetGammaNumerator(int intGammaNumerator) - { - this.intGammaNumerator = intGammaNumerator; - } - public int GammaDenominator - { - get { return this.intGammaDenominator; } - } - internal protected void SetGammaDenominator(int intGammaDenominator) - { - this.intGammaDenominator = intGammaDenominator; - } - public float GammaRatio - { - get - { - if (this.intGammaDenominator > 0) - { - float ratio = (float)this.intGammaNumerator / (float)this.intGammaDenominator; - return (float)Math.Round(ratio, 1); - } - else - return 1.0F; - } - } - public int ColorCorrectionOffset - { - get { return this.intColorCorrectionOffset; } - } - internal protected void SetColorCorrectionOffset(int intColorCorrectionOffset) - { - this.intColorCorrectionOffset = intColorCorrectionOffset; - } - public int PostageStampOffset - { - get { return this.intPostageStampOffset; } - } - internal protected void SetPostageStampOffset(int intPostageStampOffset) - { - this.intPostageStampOffset = intPostageStampOffset; - } - public int ScanLineOffset - { - get { return this.intScanLineOffset; } - } - internal protected void SetScanLineOffset(int intScanLineOffset) - { - this.intScanLineOffset = intScanLineOffset; - } - public int AttributesType - { - get { return this.intAttributesType; } - } - internal protected void SetAttributesType(int intAttributesType) - { - this.intAttributesType = intAttributesType; - } - public System.Collections.Generic.List ScanLineTable - { - get { return this.intScanLineTable; } - } - public System.Collections.Generic.List ColorCorrectionTable - { - get { return this.cColorCorrectionTable; } - } - } - #endregion - - #region Utilities - internal static class Utilities - { - internal static int GetBits(byte b, int offset, int count) - { - return (b >> offset) & ((1 << count) - 1); - } - internal static Color GetColorFrom2Bytes(byte one, byte two) - { - int r1 = Utilities.GetBits(one, 2, 5); - int r = r1 << 3; - int bit = Utilities.GetBits(one, 0, 2); - int g1 = bit << 6; - bit = Utilities.GetBits(two, 5, 3); - int g2 = bit << 3; - int g = g1 + g2; - int b1 = Utilities.GetBits(two, 0, 5); - int b = b1 << 3; - int a1 = Utilities.GetBits(one, 7, 1); - int a = a1 * 255; - return Color.FromArgb(a, r, g, b); - } - internal static string GetIntBinaryString(Int32 n) - { - char[] b = new char[32]; - int pos = 31; - int i = 0; - - while (i < 32) - { - if ((n & (1 << i)) != 0) - { - b[pos] = '1'; - } - else - { - b[pos] = '0'; - } - pos--; - i++; - } - return new string(b); - } - internal static string GetInt16BinaryString(Int16 n) - { - char[] b = new char[16]; - int pos = 15; - int i = 0; - - while (i < 16) - { - if ((n & (1 << i)) != 0) - { - b[pos] = '1'; - } - else - { - b[pos] = '0'; - } - pos--; - i++; - } - return new string(b); - } - } - #endregion -} diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Orvid.Graphics.Dependancies.csproj b/Users/Orvid/Orvid.Graphics.Dependancies/Orvid.Graphics.Dependancies.csproj deleted file mode 100644 index 3587eab4cb..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Orvid.Graphics.Dependancies.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8} - Library - Properties - Orvid.Graphics.Dependancies - Orvid.Graphics.Dependancies - v4.7.1 - 512 - True - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - diff --git a/Users/Orvid/Orvid.Graphics.Dependancies/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Properties/AssemblyInfo.cs deleted file mode 100644 index 328d0a1166..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/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("Orvid.Graphics.Dependancies")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("Orvid.Graphics.Dependancies")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("ca6d3182-687c-4339-8ce8-98d6345a5adc")] - -// 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/Users/Orvid/Orvid.Graphics.Dependancies/Resizing Algorithms/Hqx.cs b/Users/Orvid/Orvid.Graphics.Dependancies/Resizing Algorithms/Hqx.cs deleted file mode 100644 index 77cecea084..0000000000 --- a/Users/Orvid/Orvid.Graphics.Dependancies/Resizing Algorithms/Hqx.cs +++ /dev/null @@ -1,11980 +0,0 @@ -/* - * Copyright © 2003 Maxim Stepin (maxst@hiend3d.com) - * - * Copyright © 2010 Cameron Zemek (grom@zeminvaders.net) - * - * Copyright © 2011 Tamme Schichler (tamme.schichler@googlemail.com) - * - * This file is part of hqxSharp. - * - * hqxSharp is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * hqxSharp is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with hqxSharp. If not, see . - */ - -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Drawing.Imaging; - -namespace Hqx -{ - /// - /// Provides access to hqxSharp, the extended port of the hqx pixel art magnification filter. - /// - /// - /// The main focus of hqxSharp lies on asset creation and use in tools; it is not necessarily intended as final output for real-time graphics. - /// This means that additional functionality (like alpha support and variable AYUV thresholds) and easier code are usually preferred over a small performance increase. - /// Calls to hqx methods are compatible with the corresponding hqxSharp methods and the default thresholds are those used in hqx. - /// - public static class HqxSharp - { - - #region Common - private const int Ymask = 0x00ff0000; - private const int Umask = 0x0000ff00; - private const int Vmask = 0x000000ff; - - /// - /// Compares two ARGB colors according to the provided Y, U, V and A thresholds. - /// - /// An ARGB color. - /// A second ARGB color. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Returns true if colors differ more than the thresholds permit, otherwise false. - private static bool Diff(uint c1, uint c2, uint trY, uint trU, uint trV, uint trA) - { - int YUV1 = (int)GetYuv(c1); - int YUV2 = (int)GetYuv(c2); - - return ((Math.Abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) || - (Math.Abs((YUV1 & Umask) - (YUV2 & Umask)) > trU) || - (Math.Abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV) || - (Math.Abs(((int)((uint)c1 >> 24) - (int)((uint)c2 >> 24))) > trA)); - } - #endregion - - #region Interpolation - private const uint Mask4 = 0xff000000; - private const uint Mask2 = 0x0000ff00; - private const uint Mask13 = 0x00ff00ff; - - // return statements: - // 1. line: green - // 2. line: red and blue - // 3. line: alpha - - private static uint Mix3To1(uint c1, uint c2) - { - //return (c1*3+c2) >> 2; - if (c1 == c2) - { - return c1; - - } - return ((((c1 & Mask2) * 3 + (c2 & Mask2)) >> 2) & Mask2) | - ((((c1 & Mask13) * 3 + (c2 & Mask13)) >> 2) & Mask13) | - ((((c1 & Mask4) >> 2) * 3 + ((c2 & Mask4) >> 2)) & Mask4); - } - - private static uint Mix2To1To1(uint c1, uint c2, uint c3) - { - //return (c1*2+c2+c3) >> 2; - return ((((c1 & Mask2) * 2 + (c2 & Mask2) + (c3 & Mask2)) >> 2) & Mask2) | - ((((c1 & Mask13) * 2 + (c2 & Mask13) + (c3 & Mask13)) >> 2) & Mask13) | - ((((c1 & Mask4) >> 2) * 2 + ((c2 & Mask4) >> 2) + ((c3 & Mask4) >> 2)) & Mask4); - } - - private static uint Mix7To1(uint c1, uint c2) - { - //return (c1*7+c2)/8; - if (c1 == c2) - { - return c1; - - } - return ((((c1 & Mask2) * 7 + (c2 & Mask2)) >> 3) & Mask2) | - ((((c1 & Mask13) * 7 + (c2 & Mask13)) >> 3) & Mask13) | - ((((c1 & Mask4) >> 3) * 7 + ((c2 & Mask4) >> 3)) & Mask4); - } - - private static uint Mix2To7To7(uint c1, uint c2, uint c3) - { - //return (c1*2+(c2+c3)*7)/16; - return ((((c1 & Mask2) * 2 + (c2 & Mask2) * 7 + (c3 & Mask2) * 7) >> 4) & Mask2) | - ((((c1 & Mask13) * 2 + (c2 & Mask13) * 7 + (c3 & Mask13) * 7) >> 4) & Mask13) | - ((((c1 & Mask4) >> 4) * 2 + ((c2 & Mask4) >> 4) * 7 + ((c3 & Mask4) >> 4) * 7) & Mask4); - } - - private static uint MixEven(uint c1, uint c2) - { - //return (c1+c2) >> 1; - if (c1 == c2) - { - return c1; - - } - return ((((c1 & Mask2) + (c2 & Mask2)) >> 1) & Mask2) | - ((((c1 & Mask13) + (c2 & Mask13)) >> 1) & Mask13) | - ((((c1 & Mask4) >> 1) + ((c2 & Mask4) >> 1)) & Mask4); - } - - private static uint Mix4To2To1(uint c1, uint c2, uint c3) - { - //return (c1*5+c2*2+c3)/8; - return ((((c1 & Mask2) * 5 + (c2 & Mask2) * 2 + (c3 & Mask2)) >> 3) & Mask2) | - ((((c1 & Mask13) * 5 + (c2 & Mask13) * 2 + (c3 & Mask13)) >> 3) & Mask13) | - ((((c1 & Mask4) >> 3) * 5 + ((c2 & Mask4) >> 3) * 2 + ((c3 & Mask4) >> 3)) & Mask4); - } - - private static uint Mix6To1To1(uint c1, uint c2, uint c3) - { - //return (c1*6+c2+c3)/8; - return ((((c1 & Mask2) * 6 + (c2 & Mask2) + (c3 & Mask2)) >> 3) & Mask2) | - ((((c1 & Mask13) * 6 + (c2 & Mask13) + (c3 & Mask13)) >> 3) & Mask13) | - ((((c1 & Mask4) >> 3) * 6 + ((c2 & Mask4) >> 3) + ((c3 & Mask4) >> 3)) & Mask4); - } - - private static uint Mix5To3(uint c1, uint c2) - { - //return (c1*5+c2*3)/8; - if (c1 == c2) - { - return c1; - - } - return ((((c1 & Mask2) * 5 + (c2 & Mask2) * 3) >> 3) & Mask2) | - ((((c1 & Mask13) * 5 + (c2 & Mask13) * 3) >> 3) & Mask13) | - ((((c1 & Mask4) >> 3) * 5 + ((c2 & Mask4) >> 3) * 3) & Mask4); - } - - private static uint Mix2To3To3(uint c1, uint c2, uint c3) - { - //return (c1*2+(c2+c3)*3)/8; - return ((((c1 & Mask2) * 2 + (c2 & Mask2) * 3 + (c3 & Mask2) * 3) >> 3) & Mask2) | - ((((c1 & Mask13) * 2 + (c2 & Mask13) * 3 + (c3 & Mask13) * 3) >> 3) & Mask13) | - ((((c1 & Mask4) >> 3) * 2 + ((c2 & Mask4) >> 3) * 3 + ((c3 & Mask4) >> 3) * 3) & Mask4); - } - - private static uint Mix14To1To1(uint c1, uint c2, uint c3) - { - //return (c1*14+c2+c3)/16; - return ((((c1 & Mask2) * 14 + (c2 & Mask2) + (c3 & Mask2)) >> 4) & Mask2) | - ((((c1 & Mask13) * 14 + (c2 & Mask13) + (c3 & Mask13)) >> 4) & Mask13) | - ((((c1 & Mask4) >> 4) * 14 + ((c2 & Mask4) >> 4) + ((c3 & Mask4) >> 4)) & Mask4); - } - #endregion - - #region RgbYuv - private const uint RgbMask = 0x00ffffff; - private static volatile int[] lookupTable; - private static int[] LookupTable - { - get - { - if (lookupTable == null) - Initialize(); - return lookupTable; - } - } - - /// - /// Gets whether the lookup table is ready. - /// - private static bool Initialized - { - get - { - return lookupTable != null; - } - } - - /// - /// Returns the 24bit YUV equivalent of the provided 24bit RGB color. - /// Any alpha component is dropped. - /// - /// A 24bit rgb color. - /// The corresponding 24bit YUV color. - private static int GetYuv(uint rgb) - { - return LookupTable[rgb & RgbMask]; - } - - /// - /// Calculates the lookup table. - /// - private static unsafe void Initialize() - { - var lTable = new int[0x1000000]; // 256 * 256 * 256 - fixed (int* lookupP = lTable) - { - byte* lP = (byte*)lookupP; - for (uint i = 0; i < lTable.Length; i++) - { - float r = (i & 0xff0000) >> 16; - float g = (i & 0x00ff00) >> 8; - float b = (i & 0x0000ff); - - lP++; //Skip alpha byte - *(lP++) = (byte)(.299 * r + .587 * g + .114 * b); - *(lP++) = (byte)((int)(-.169 * r - .331 * g + .5 * b) + 128); - *(lP++) = (byte)((int)(.5 * r - .419 * g - .081 * b) + 128); - } - } - lookupTable = lTable; - } - - /// - /// Releases the reference to the lookup table. - /// The table has to be calculated again for the next lookup. - /// - private static void UnloadLookupTable() - { - lookupTable = null; - } - #endregion - - #region Hq2x - /// - /// This is the extended C# port of the hq2x algorithm. - /// The image is scaled to twice its size. - /// - /// The source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - /// A new Bitmap instance that contains the source imagage scaled to twice its size. - public static unsafe Bitmap Scale2(Bitmap bitmap, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - - int Xres = bitmap.Width; - int Yres = bitmap.Height; - - Bitmap dest = new Bitmap(bitmap.Width * 2, bitmap.Height * 2); - - BitmapData bmpData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - BitmapData destData = dest.LockBits(new Rectangle(Point.Empty, dest.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - { - - uint* sp = (uint*)bmpData.Scan0.ToPointer(); - uint* dp = (uint*)destData.Scan0.ToPointer(); - - Scale2(sp, dp, Xres, Yres, trY, trU, trV, trA, wrapX, wrapY); - } - bitmap.UnlockBits(bmpData); - dest.UnlockBits(destData); - - return dest; - } - - /// - /// This is the extended C# port of the hq2x algorithm. - /// The destination image must be exactly twice as large in both dimensions as the source image. - /// - /// A pointer to the source image. - /// A pointer to the destination image. - /// The horizontal resolution of the source image. - /// The vertical resolution of the source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - public static unsafe void Scale2(uint* sp, uint* dp, int Xres, int Yres, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - //Don't shift trA, as it uses shift right instead of a mask for comparisons. - trY <<= 2 * 8; - trU <<= 1 * 8; - int dpL = Xres * 2; - - int prevline, nextline; - uint[] w = new uint[9]; - - for (int j = 0; j < Yres; j++) - { - if (j > 0) - { - prevline = -Xres; - } - else - { - if (wrapY) - { - prevline = Xres * (Yres - 1); - } - else - { - prevline = 0; - } - } - if (j < Yres - 1) - { - nextline = Xres; - } - else - { - if (wrapY) - { - nextline = -(Xres * (Yres - 1)); - } - else - { - nextline = 0; - } - } - - for (int i = 0; i < Xres; i++) - { - w[1] = *(sp + prevline); - w[4] = *sp; - w[7] = *(sp + nextline); - - if (i > 0) - { - w[0] = *(sp + prevline - 1); - w[3] = *(sp - 1); - w[6] = *(sp + nextline - 1); - } - else - { - if (wrapX) - { - w[0] = *(sp + prevline + Xres - 1); - w[3] = *(sp + Xres - 1); - w[6] = *(sp + nextline + Xres - 1); - } - else - { - w[0] = w[1]; - w[3] = w[4]; - w[6] = w[7]; - } - } - - if (i < Xres - 1) - { - w[2] = *(sp + prevline + 1); - w[5] = *(sp + 1); - w[8] = *(sp + nextline + 1); - } - else - { - if (wrapX) - { - w[2] = *(sp + prevline - Xres + 1); - w[5] = *(sp - Xres + 1); - w[8] = *(sp + nextline - Xres + 1); - } - else - { - w[2] = w[1]; - w[5] = w[4]; - w[8] = w[7]; - } - } - - int pattern = 0; - int flag = 1; - - for (int k = 0; k < 9; k++) - { - if (k == 4) continue; - - if (w[k] != w[4]) - { - if (Diff(w[4], w[k], trY, trU, trV, trA)) - pattern |= flag; - } - flag <<= 1; - } - - switch (pattern) - { - case 0: - case 1: - case 4: - case 32: - case 128: - case 5: - case 132: - case 160: - case 33: - case 129: - case 36: - case 133: - case 164: - case 161: - case 37: - case 165: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 2: - case 34: - case 130: - case 162: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 16: - case 17: - case 48: - case 49: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 64: - case 65: - case 68: - case 69: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 8: - case 12: - case 136: - case 140: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 3: - case 35: - case 131: - case 163: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 6: - case 38: - case 134: - case 166: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 20: - case 21: - case 52: - case 53: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 144: - case 145: - case 176: - case 177: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 192: - case 193: - case 196: - case 197: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 96: - case 97: - case 100: - case 101: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 40: - case 44: - case 168: - case 172: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 9: - case 13: - case 137: - case 141: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 18: - case 50: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 80: - case 81: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 72: - case 76: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 10: - case 138: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 66: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 24: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 7: - case 39: - case 135: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 148: - case 149: - case 180: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 224: - case 228: - case 225: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 41: - case 169: - case 45: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 22: - case 54: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 208: - case 209: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 104: - case 108: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 11: - case 139: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 19: - case 51: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *dp = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 146: - case 178: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - break; - } - case 84: - case 85: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + 1) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - break; - } - case 112: - case 113: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - break; - } - case 200: - case 204: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[7], w[5]); - } - break; - } - case 73: - case 77: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *dp = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - } - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 42: - case 170: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[7]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 14: - case 142: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[5]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 67: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 70: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 28: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 152: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 194: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 98: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 56: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 25: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 26: - case 31: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 82: - case 214: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 88: - case 248: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 74: - case 107: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 27: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 86: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 216: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 106: - { - *dp = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 30: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 210: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 120: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 75: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 29: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 198: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 184: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 99: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 57: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 71: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 156: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 226: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 60: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 195: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 102: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 153: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 58: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 83: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 92: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 202: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 78: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 154: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 114: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 89: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 90: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 55: - case 23: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - } - else - { - *dp = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 182: - case 150: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - break; - } - case 213: - case 212: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + 1) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - break; - } - case 241: - case 240: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - break; - } - case 236: - case 232: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[7], w[5]); - } - break; - } - case 109: - case 105: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - } - else - { - *dp = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - } - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 171: - case 43: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[7]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 143: - case 15: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = Mix3To1(w[4], w[5]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 124: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 203: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 62: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 211: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 118: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 217: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 110: - { - *dp = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 155: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 188: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 185: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 61: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 157: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 103: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 227: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 230: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 199: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 220: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 158: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 234: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 242: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 59: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 121: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 87: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 79: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 122: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 94: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 218: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 91: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 229: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 167: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 173: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 181: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 186: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 115: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 93: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 206: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 205: - case 201: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL) = Mix6To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 174: - case 46: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[0]); - } - else - { - *dp = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 179: - case 147: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 1) = Mix6To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 117: - case 116: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 1) = Mix6To1To1(w[4], w[5], w[7]); - } - break; - } - case 189: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 231: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 126: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 219: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 125: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - } - else - { - *dp = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - } - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 221: - { - *dp = Mix3To1(w[4], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + 1) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix3To1(w[4], w[6]); - break; - } - case 207: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = Mix3To1(w[4], w[5]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 238: - { - *dp = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix2To3To3(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[7], w[5]); - } - break; - } - case 190: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix4To2To1(w[4], w[5], w[7]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - break; - } - case 187: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *dp = Mix2To3To3(w[4], w[3], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[7]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 243: - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = Mix3To1(w[4], w[2]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix2To3To3(w[4], w[5], w[7]); - } - break; - } - case 119: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *dp = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - } - else - { - *dp = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 1) = Mix2To3To3(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 237: - case 233: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 175: - case 47: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 183: - case 151: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 245: - case 244: - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 250: - { - *dp = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 123: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 95: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 222: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 252: - { - *dp = Mix2To1To1(w[4], w[0], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 249: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix2To1To1(w[4], w[2], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 235: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix2To1To1(w[4], w[2], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 111: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[5]); - break; - } - case 63: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix2To1To1(w[4], w[8], w[7]); - break; - } - case 159: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 215: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix2To1To1(w[4], w[6], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 246: - { - *dp = Mix2To1To1(w[4], w[0], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 254: - { - *dp = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 253: - { - *dp = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 251: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 239: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[5]); - break; - } - case 127: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix2To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + 1) = Mix3To1(w[4], w[8]); - break; - } - case 191: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 223: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 247: - { - *dp = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - case 255: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *dp = Mix14To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - } - else - { - *(dp + 1) = Mix14To1To1(w[4], w[1], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix14To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + 1) = Mix14To1To1(w[4], w[5], w[7]); - } - break; - } - } - sp++; - dp += 2; - } - dp += dpL; - } - } - #endregion - - #region Hq3x - /// - /// This is the extended C# port of the hq3x algorithm. - /// The image is scaled to three times its size. - /// - /// The source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - /// A new Bitmap instance that contains the source imagage scaled to three times its size. - public static unsafe Bitmap Scale3(Bitmap bitmap, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - - int Xres = bitmap.Width; - int Yres = bitmap.Height; - - var dest = new Bitmap(bitmap.Width * 3, bitmap.Height * 3); - - var bmpData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - var destData = dest.LockBits(new Rectangle(Point.Empty, dest.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - { - - uint* sp = (uint*)bmpData.Scan0.ToPointer(); - uint* dp = (uint*)destData.Scan0.ToPointer(); - - Scale3(sp, dp, Xres, Yres, trY, trU, trV, trA, wrapX, wrapY); - } - bitmap.UnlockBits(bmpData); - dest.UnlockBits(destData); - - return dest; - } - - /// - /// This is the extended C# port of the hq3x algorithm. - /// The destination image must be exactly three times as large in both dimensions as the source image. - /// - /// A pointer to the source image. - /// A pointer to the destination image. - /// The horizontal resolution of the source image. - /// The vertical resolution of the source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - public static unsafe void Scale3(uint* sp, uint* dp, int Xres, int Yres, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - //Don't shift trA, as it uses shift right instead of a mask for comparisons. - trY <<= 2 * 8; - trU <<= 1 * 8; - int dpL = Xres * 3; - - int prevline, nextline; - var w = new uint[9]; - - for (int j = 0; j < Yres; j++) - { - if (j > 0) - { - prevline = -Xres; - } - else - { - if (wrapY) - { - prevline = Xres * (Yres - 1); - } - else - { - prevline = 0; - } - } - if (j < Yres - 1) - { - nextline = Xres; - } - else - { - if (wrapY) - { - nextline = -(Xres * (Yres - 1)); - } - else - { - nextline = 0; - } - } - - for (int i = 0; i < Xres; i++) - { - w[1] = *(sp + prevline); - w[4] = *sp; - w[7] = *(sp + nextline); - - if (i > 0) - { - w[0] = *(sp + prevline - 1); - w[3] = *(sp - 1); - w[6] = *(sp + nextline - 1); - } - else - { - if (wrapX) - { - w[0] = *(sp + prevline + Xres - 1); - w[3] = *(sp + Xres - 1); - w[6] = *(sp + nextline + Xres - 1); - } - else - { - w[0] = w[1]; - w[3] = w[4]; - w[6] = w[7]; - } - } - - if (i < Xres - 1) - { - w[2] = *(sp + prevline + 1); - w[5] = *(sp + 1); - w[8] = *(sp + nextline + 1); - } - else - { - if (wrapX) - { - w[2] = *(sp + prevline - Xres + 1); - w[5] = *(sp - Xres + 1); - w[8] = *(sp + nextline - Xres + 1); - } - else - { - w[2] = w[1]; - w[5] = w[4]; - w[8] = w[7]; - } - } - - int pattern = 0; - int flag = 1; - - for (int k = 0; k < 9; k++) - { - if (k == 4) continue; - - if (w[k] != w[4]) - { - if (Diff(w[4], w[k], trY, trU, trV, trA)) - pattern |= flag; - } - flag <<= 1; - } - - switch (pattern) - { - case 0: - case 1: - case 4: - case 32: - case 128: - case 5: - case 132: - case 160: - case 33: - case 129: - case 36: - case 133: - case 164: - case 161: - case 37: - case 165: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 2: - case 34: - case 130: - case 162: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 16: - case 17: - case 48: - case 49: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 64: - case 65: - case 68: - case 69: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 8: - case 12: - case 136: - case 140: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 3: - case 35: - case 131: - case 163: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 6: - case 38: - case 134: - case 166: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 20: - case 21: - case 52: - case 53: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 144: - case 145: - case 176: - case 177: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 192: - case 193: - case 196: - case 197: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 96: - case 97: - case 100: - case 101: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 40: - case 44: - case 168: - case 172: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 9: - case 13: - case 137: - case 141: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 18: - case 50: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 80: - case 81: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 72: - case 76: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 10: - case 138: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 66: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 24: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 7: - case 39: - case 135: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 148: - case 149: - case 180: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 224: - case 228: - case 225: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 41: - case 169: - case 45: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 22: - case 54: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 208: - case 209: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 104: - case 108: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 11: - case 139: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 19: - case 51: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 146: - case 178: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 84: - case 85: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - break; - } - case 112: - case 113: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - break; - } - case 200: - case 204: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 73: - case 77: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 42: - case 170: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 14: - case 142: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 67: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 70: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 28: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 152: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 194: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 98: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 56: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 25: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 26: - case 31: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 82: - case 214: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 88: - case 248: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 74: - case 107: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 27: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 86: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 216: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 106: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 30: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 210: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 120: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 75: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 29: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 198: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 184: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 99: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 57: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 71: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 156: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 226: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 60: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 195: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 102: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 153: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 58: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 83: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 92: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 202: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 78: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 154: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 114: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 89: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 90: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 55: - case 23: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 182: - case 150: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 213: - case 212: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - break; - } - case 241: - case 240: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - break; - } - case 236: - case 232: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 109: - case 105: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 171: - case 43: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 143: - case 15: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 124: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 203: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 62: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 211: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 118: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 217: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 110: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 155: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 188: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 185: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 61: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 157: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 103: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 227: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 230: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 199: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 220: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 158: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 234: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 242: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 59: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 121: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 87: - { - *(dp) = Mix3To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 79: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 122: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 94: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 218: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 91: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 229: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 167: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 173: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 181: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 186: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 115: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 93: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 206: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 205: - case 201: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 174: - case 46: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 179: - case 147: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 117: - case 116: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 189: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 231: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 126: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 219: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 125: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 221: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - break; - } - case 207: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 238: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - } - else - { - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 190: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - } - else - { - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[0]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - break; - } - case 187: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 243: - { - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + 2) = MixEven(w[5], w[7]); - } - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - break; - } - case 119: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 237: - case 233: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 175: - case 47: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - break; - } - case 183: - case 151: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 245: - case 244: - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 250: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 123: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 95: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 222: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 252: - { - *(dp) = Mix3To1(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 249: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 235: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 111: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 63: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 159: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 215: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 246: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 254: - { - *(dp) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 253: - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 251: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 239: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix3To1(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix3To1(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[5]); - break; - } - case 127: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To7To7(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To7To7(w[4], w[7], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - break; - } - case 191: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - break; - } - case 223: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = Mix2To7To7(w[4], w[3], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[3]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - *(dp + dpL + 2) = w[4]; - } - else - { - *(dp + 1) = Mix7To1(w[4], w[1]); - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix2To7To7(w[4], w[5], w[7]); - } - break; - } - case 247: - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - case 255: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[3], w[1]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - } - else - { - *(dp + 2) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix2To1To1(w[4], w[5], w[7]); - } - break; - } - } - sp++; - dp += 3; - } - dp += (dpL * 2); - } - } - #endregion - - #region Hq4x - /// - /// This is the extended C# port of the hq4x algorithm. - /// The image is scaled to four times its size. - /// - /// The source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - /// A new Bitmap instance that contains the source imagage scaled to four times its size. - public static unsafe Bitmap Scale4(Bitmap bitmap, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - - int Xres = bitmap.Width; - int Yres = bitmap.Height; - - var dest = new Bitmap(bitmap.Width * 4, bitmap.Height * 4); - - var bmpData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - var destData = dest.LockBits(new Rectangle(Point.Empty, dest.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - { - - uint* sp = (uint*)bmpData.Scan0.ToPointer(); - uint* dp = (uint*)destData.Scan0.ToPointer(); - - Scale4(sp, dp, Xres, Yres, trY, trU, trV, trA, wrapX, wrapY); - } - bitmap.UnlockBits(bmpData); - dest.UnlockBits(destData); - - return dest; - } - - /// - /// This is the extended C# port of the hq4x algorithm. - /// The destination image must be exactly four times as large in both dimensions as the source image. - /// - /// A pointer to the source image. - /// A pointer to the destination image. - /// The horizontal resolution of the source image. - /// The vertical resolution of the source image. - /// The Y (luminance) threshold. - /// The U (chrominance) threshold. - /// The V (chrominance) threshold. - /// The A (transparency) threshold. - /// Used for images that can be seamlessly repeated horizontally. - /// Used for images that can be seamlessly repeated vertically. - public static unsafe void Scale4(uint* sp, uint* dp, int Xres, int Yres, uint trY = 48, uint trU = 7, uint trV = 6, uint trA = 0, bool wrapX = false, bool wrapY = false) - { - //Don't shift trA, as it uses shift right instead of a mask for comparisons. - trY <<= 2 * 8; - trU <<= 1 * 8; - int dpL = Xres * 4; - - int prevline, nextline; - var w = new uint[9]; - - for (int j = 0; j < Yres; j++) - { - if (j > 0) - { - prevline = -Xres; - } - else - { - if (wrapY) - { - prevline = Xres * (Yres - 1); - } - else - { - prevline = 0; - } - } - if (j < Yres - 1) - { - nextline = Xres; - } - else - { - if (wrapY) - { - nextline = -(Xres * (Yres - 1)); - } - else - { - nextline = 0; - } - } - - for (int i = 0; i < Xres; i++) - { - w[1] = *(sp + prevline); - w[4] = *sp; - w[7] = *(sp + nextline); - - if (i > 0) - { - w[0] = *(sp + prevline - 1); - w[3] = *(sp - 1); - w[6] = *(sp + nextline - 1); - } - else - { - if (wrapX) - { - w[0] = *(sp + prevline + Xres - 1); - w[3] = *(sp + Xres - 1); - w[6] = *(sp + nextline + Xres - 1); - } - else - { - w[0] = w[1]; - w[3] = w[4]; - w[6] = w[7]; - } - } - - if (i < Xres - 1) - { - w[2] = *(sp + prevline + 1); - w[5] = *(sp + 1); - w[8] = *(sp + nextline + 1); - } - else - { - if (wrapX) - { - w[2] = *(sp + prevline - Xres + 1); - w[5] = *(sp - Xres + 1); - w[8] = *(sp + nextline - Xres + 1); - } - else - { - w[2] = w[1]; - w[5] = w[4]; - w[8] = w[7]; - } - } - - int pattern = 0; - int flag = 1; - - for (int k = 0; k < 9; k++) - { - if (k == 4) continue; - - if (w[k] != w[4]) - { - if (Diff(w[4], w[k], trY, trU, trV, trA)) - pattern |= flag; - } - flag <<= 1; - } - - switch (pattern) - { - case 0: - case 1: - case 4: - case 32: - case 128: - case 5: - case 132: - case 160: - case 33: - case 129: - case 36: - case 133: - case 164: - case 161: - case 37: - case 165: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 2: - case 34: - case 130: - case 162: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 16: - case 17: - case 48: - case 49: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 64: - case 65: - case 68: - case 69: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 8: - case 12: - case 136: - case 140: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 3: - case 35: - case 131: - case 163: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 6: - case 38: - case 134: - case 166: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 20: - case 21: - case 52: - case 53: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 144: - case 145: - case 176: - case 177: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 192: - case 193: - case 196: - case 197: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 96: - case 97: - case 100: - case 101: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 40: - case 44: - case 168: - case 172: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 9: - case 13: - case 137: - case 141: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 18: - case 50: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 80: - case 81: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 72: - case 76: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 10: - case 138: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 66: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 24: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 7: - case 39: - case 135: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 148: - case 149: - case 180: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 224: - case 228: - case 225: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 41: - case 169: - case 45: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 22: - case 54: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 208: - case 209: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 104: - case 108: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 11: - case 139: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 19: - case 51: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix5To3(w[1], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix2To1To1(w[5], w[4], w[1]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 146: - case 178: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - } - else - { - *(dp + 2) = Mix2To1To1(w[1], w[4], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix5To3(w[5], w[1]); - *(dp + dpL + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - break; - } - case 84: - case 85: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix5To3(w[5], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix2To1To1(w[7], w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 112: - case 113: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix2To1To1(w[5], w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 200: - case 204: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[3], w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 73: - case 77: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix5To3(w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix2To1To1(w[7], w[4], w[3]); - } - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 42: - case 170: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix2To1To1(w[1], w[4], w[3]); - *(dp + dpL) = Mix5To3(w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 14: - case 142: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix5To3(w[1], w[3]); - *(dp + 2) = Mix3To1(w[1], w[4]); - *(dp + 3) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[3], w[4], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 67: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 70: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 28: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 152: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 194: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 98: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 56: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 25: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 26: - case 31: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 82: - case 214: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 88: - case 248: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 74: - case 107: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 27: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 86: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 216: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 106: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 30: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 210: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 120: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 75: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 29: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 198: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 184: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 99: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 57: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 71: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 156: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 226: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 60: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 195: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 102: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 153: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 58: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 83: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 92: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 202: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 78: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 154: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 114: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - break; - } - case 89: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 90: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 55: - case 23: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix5To3(w[1], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix2To1To1(w[5], w[4], w[1]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 182: - case 150: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - } - else - { - *(dp + 2) = Mix2To1To1(w[1], w[4], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix5To3(w[5], w[1]); - *(dp + dpL + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - break; - } - case 213: - case 212: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix5To3(w[5], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix2To1To1(w[7], w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 241: - case 240: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix2To1To1(w[5], w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 236: - case 232: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[3], w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 109: - case 105: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix5To3(w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix2To1To1(w[7], w[4], w[3]); - } - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 171: - case 43: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix2To1To1(w[1], w[4], w[3]); - *(dp + dpL) = Mix5To3(w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 143: - case 15: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix5To3(w[1], w[3]); - *(dp + 2) = Mix3To1(w[1], w[4]); - *(dp + 3) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[3], w[4], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 124: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 203: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 62: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 211: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 118: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 217: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 110: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 155: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 188: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 185: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 61: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 157: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 103: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 227: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 230: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 199: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 220: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 158: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 234: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 242: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - break; - } - case 59: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 121: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 87: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 79: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 122: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 94: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 218: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 91: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL + 1) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 229: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 167: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 173: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 181: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 186: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 115: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - break; - } - case 93: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 206: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 205: - case 201: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - } - else - { - *(dp + dpL + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 174: - case 46: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[3]); - *(dp + dpL + 1) = w[4]; - } - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 179: - case 147: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - } - else - { - *(dp + 2) = Mix3To1(w[4], w[1]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 117: - case 116: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - } - else - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - break; - } - case 189: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 231: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 126: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 219: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 125: - { - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp) = Mix3To1(w[4], w[3]); - *(dp + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL) = Mix5To3(w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix2To1To1(w[7], w[4], w[3]); - } - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 221: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + 3) = Mix3To1(w[4], w[5]); - *(dp + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix5To3(w[5], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix2To1To1(w[7], w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 207: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix5To3(w[1], w[3]); - *(dp + 2) = Mix3To1(w[1], w[4]); - *(dp + 3) = Mix3To1(w[4], w[1]); - *(dp + dpL) = Mix2To1To1(w[3], w[4], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - } - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 238: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - } - else - { - *(dp + dpL + dpL) = Mix2To1To1(w[3], w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[7]); - } - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 190: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - } - else - { - *(dp + 2) = Mix2To1To1(w[1], w[4], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix5To3(w[5], w[1]); - *(dp + dpL + dpL + 3) = Mix3To1(w[5], w[4]); - *(dp + dpL + dpL + dpL + 3) = Mix3To1(w[4], w[5]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - break; - } - case 187: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = Mix2To1To1(w[1], w[4], w[3]); - *(dp + dpL) = Mix5To3(w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + dpL) = Mix3To1(w[3], w[4]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[3]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 243: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix2To1To1(w[5], w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix3To1(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[7], w[4]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 119: - { - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp) = Mix3To1(w[4], w[1]); - *(dp + 1) = Mix3To1(w[1], w[4]); - *(dp + 2) = Mix5To3(w[1], w[5]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix2To1To1(w[5], w[4], w[1]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 237: - case 233: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[5]); - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix6To1To1(w[4], w[5], w[1]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[1]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 175: - case 47: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix6To1To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - break; - } - case 183: - case 151: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 1) = Mix6To1To1(w[4], w[3], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[3]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 245: - case 244: - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[3]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[1]); - *(dp + dpL + 1) = Mix6To1To1(w[4], w[3], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 250: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - break; - } - case 123: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 95: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 222: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 252: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix4To2To1(w[4], w[1], w[0]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 249: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix4To2To1(w[4], w[1], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - break; - } - case 235: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix4To2To1(w[4], w[5], w[2]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 111: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix4To2To1(w[4], w[5], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 63: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix4To2To1(w[4], w[7], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 159: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix4To2To1(w[4], w[7], w[6]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 215: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix4To2To1(w[4], w[3], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 246: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix4To2To1(w[4], w[3], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 254: - { - *(dp) = Mix5To3(w[4], w[0]); - *(dp + 1) = Mix3To1(w[4], w[0]); - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = Mix3To1(w[4], w[0]); - *(dp + dpL + 1) = Mix7To1(w[4], w[0]); - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 253: - { - *(dp) = Mix5To3(w[4], w[1]); - *(dp + 1) = Mix5To3(w[4], w[1]); - *(dp + 2) = Mix5To3(w[4], w[1]); - *(dp + 3) = Mix5To3(w[4], w[1]); - *(dp + dpL) = Mix7To1(w[4], w[1]); - *(dp + dpL + 1) = Mix7To1(w[4], w[1]); - *(dp + dpL + 2) = Mix7To1(w[4], w[1]); - *(dp + dpL + 3) = Mix7To1(w[4], w[1]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 251: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = Mix3To1(w[4], w[2]); - *(dp + 3) = Mix5To3(w[4], w[2]); - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[2]); - *(dp + dpL + 3) = Mix3To1(w[4], w[2]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - break; - } - case 239: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - *(dp + 2) = Mix7To1(w[4], w[5]); - *(dp + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + 3) = Mix5To3(w[4], w[5]); - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = Mix7To1(w[4], w[5]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[5]); - break; - } - case 127: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 2) = w[4]; - *(dp + 3) = w[4]; - *(dp + dpL + 3) = w[4]; - } - else - { - *(dp + 2) = MixEven(w[1], w[4]); - *(dp + 3) = MixEven(w[1], w[5]); - *(dp + dpL + 3) = MixEven(w[5], w[4]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL) = w[4]; - *(dp + dpL + dpL + dpL + 1) = w[4]; - } - else - { - *(dp + dpL + dpL) = MixEven(w[3], w[4]); - *(dp + dpL + dpL + dpL) = MixEven(w[7], w[3]); - *(dp + dpL + dpL + dpL + 1) = MixEven(w[7], w[4]); - } - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[8]); - *(dp + dpL + dpL + 3) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 2) = Mix3To1(w[4], w[8]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[8]); - break; - } - case 191: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 2) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + 3) = Mix7To1(w[4], w[7]); - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 1) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 2) = Mix5To3(w[4], w[7]); - *(dp + dpL + dpL + dpL + 3) = Mix5To3(w[4], w[7]); - break; - } - case 223: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - *(dp + 1) = w[4]; - *(dp + dpL) = w[4]; - } - else - { - *(dp) = MixEven(w[1], w[3]); - *(dp + 1) = MixEven(w[1], w[4]); - *(dp + dpL) = MixEven(w[3], w[4]); - } - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix3To1(w[4], w[6]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[6]); - *(dp + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + 3) = MixEven(w[5], w[4]); - *(dp + dpL + dpL + dpL + 2) = MixEven(w[7], w[4]); - *(dp + dpL + dpL + dpL + 3) = MixEven(w[7], w[5]); - } - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[6]); - *(dp + dpL + dpL + dpL + 1) = Mix3To1(w[4], w[6]); - break; - } - case 247: - { - *(dp) = Mix5To3(w[4], w[3]); - *(dp + 1) = Mix7To1(w[4], w[3]); - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - *(dp + dpL + dpL + dpL) = Mix5To3(w[4], w[3]); - *(dp + dpL + dpL + dpL + 1) = Mix7To1(w[4], w[3]); - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - case 255: - { - if (Diff(w[3], w[1], trY, trU, trV, trA)) - { - *dp = w[4]; - } - else - { - *(dp) = Mix2To1To1(w[4], w[1], w[3]); - } - *(dp + 1) = w[4]; - *(dp + 2) = w[4]; - if (Diff(w[1], w[5], trY, trU, trV, trA)) - { - *(dp + 3) = w[4]; - } - else - { - *(dp + 3) = Mix2To1To1(w[4], w[1], w[5]); - } - *(dp + dpL) = w[4]; - *(dp + dpL + 1) = w[4]; - *(dp + dpL + 2) = w[4]; - *(dp + dpL + 3) = w[4]; - *(dp + dpL + dpL) = w[4]; - *(dp + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + 2) = w[4]; - *(dp + dpL + dpL + 3) = w[4]; - if (Diff(w[7], w[3], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL) = Mix2To1To1(w[4], w[7], w[3]); - } - *(dp + dpL + dpL + dpL + 1) = w[4]; - *(dp + dpL + dpL + dpL + 2) = w[4]; - if (Diff(w[5], w[7], trY, trU, trV, trA)) - { - *(dp + dpL + dpL + dpL + 3) = w[4]; - } - else - { - *(dp + dpL + dpL + dpL + 3) = Mix2To1To1(w[4], w[7], w[5]); - } - break; - } - } - sp++; - dp += 4; - } - dp += (dpL * 3); - } - } - #endregion - - } -} diff --git a/Users/Orvid/Orvid.Graphics/AnimatedImage.cs b/Users/Orvid/Orvid.Graphics/AnimatedImage.cs deleted file mode 100644 index 4cd0481d3d..0000000000 --- a/Users/Orvid/Orvid.Graphics/AnimatedImage.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics -{ - public class AnimatedImage : Shapes.Shape, IDisposable - { - public Image[] Frames; - private UInt32 curFrameIndex; - private bool loop = false; - public int Height { get { return Frames[0].Height; } } - public int Width { get { return Frames[0].Width; } } - - /// - /// This is in Milli-Seconds - /// - public int TimePerFrame { get; set; } - - public bool Loop - { - get - { - return loop; - } - set - { - loop = value; - } - } - - public UInt32 CurFrameIndex - { - get - { - return curFrameIndex; - } - set - { - SetCurrrentFrameIndex(value); - } - } - - public Image this[UInt32 val] - { - get - { - return GetFrame(val); - } - set - { - SetFrame(val, value); - } - } - - public void SetFrame(UInt32 indx, Image i) - { - if (indx < Frames.Length) - Frames[indx] = i; - throw new Exception("Specified Frame Doesn't Exist!"); - } - - public AnimatedImage() - { - Frames = new Image[0]; - } - - public AnimatedImage(Image[] images) - { - Frames = new Image[images.Length]; - Array.Copy(images, Frames, images.Length); - curFrameIndex = 0; - } - - public Image GetFrame(UInt32 indx) - { - if (indx < Frames.Length) - return Frames[indx]; - throw new Exception("Specified Frame Doesn't Exist!"); - } - - public void AddFrame(Image i) - { - Image[] tmp = new Image[Frames.Length + 1]; - Array.Copy(Frames, tmp, Frames.Length); - tmp[tmp.Length - 1] = i; - Frames = tmp; - curFrameIndex = 1; - } - - public void SetCurrrentFrameIndex(uint v) - { - if (v < Frames.Length - 1) - curFrameIndex = v; - else - throw new Exception("Specified Frame Non-Existant!"); - } - - public override void Draw() - { - Parent.Clear(new Pixel(true)); - Parent.DrawImage(new Vec2(this.X, this.Y), Frames[curFrameIndex]); - - if (curFrameIndex + 2 <= Frames.Length - 1) - { - curFrameIndex++; - curFrameIndex++; - } - else// if (loop) - { - curFrameIndex = 0; - } - - this.Modified = true; - } - - public void Dispose() - { - this.Frames = null; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/BoundingBox.cs b/Users/Orvid/Orvid.Graphics/BoundingBox.cs deleted file mode 100644 index 18095d0301..0000000000 --- a/Users/Orvid/Orvid.Graphics/BoundingBox.cs +++ /dev/null @@ -1,114 +0,0 @@ - -namespace Orvid.Graphics -{ - /// - /// The class that defines a bounding box. - /// - public class BoundingBox - { - /// - /// The right side of the BoundingBox. - /// - public int Right; - /// - /// The left side of the BoundingBox. - /// - public int Left; - /// - /// The top of the BoundingBox. - /// - public int Top; - /// - /// The bottom of the BoundingBox. - /// - public int Bottom; - - /// - /// Gets the Width of the BoundingBox. - /// - public int Width - { - get - { - return Right - Left; - } - } - - /// - /// Gets the Height of the BoundingBox. - /// - public int Height - { - get - { - return Top - Bottom; - } - } - - /// - /// The default constructor. - /// - /// The farthest left side of the bounding box. - /// The farthest right side of the bounding box. - /// The farthest up side of the bounding box. - /// The farthest down side of the bounding box. - public BoundingBox(int ileft, int iright, int itop, int ibottom) - { - this.Left = ileft; - this.Right = iright; - this.Top = itop; - this.Bottom = ibottom; - } - - /// - /// Returns true if the given point is inside the bounding box. - /// - /// The point to check. - /// True if the specified point is inside the bounding box. - public bool Contains(Vec2 p) - { - return IsInBounds(p); - } - - /// - /// Returns true if the given point is inside the bounding box. - /// - /// X location. - /// Y location. - /// True if the given point is inside the bounding box. - public bool Contains(int x, int y) - { - return IsInBounds(new Vec2(x, y)); - } - - /// - /// Returns true if the given point is inside the bounding box. - /// - /// X location. - /// Y location. - /// True if the given point is inside the bounding box. - public bool IsInBounds(int x, int y) - { - return IsInBounds(new Vec2(x, y)); - } - - /// - /// Returns true if the given point is inside the bounding box. - /// - /// The point to check. - /// True if the specified point is inside the bounding box. - public bool IsInBounds(Vec2 p) - { - //throw new Exception(); - return ((p.X < Right && p.X > Left) && (p.Y < Top && p.Y > Bottom)); - } - - /// - /// Lowers all values in the BoundingBox by the specified Vec2. - /// - public static BoundingBox operator -(BoundingBox b, Vec2 v) - { - return new BoundingBox(b.Left - v.X, b.Right - v.X, b.Top - v.Y, b.Bottom - v.Y); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Colors.cs b/Users/Orvid/Orvid.Graphics/Colors.cs deleted file mode 100644 index f84ef011aa..0000000000 --- a/Users/Orvid/Orvid.Graphics/Colors.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; - -namespace Orvid.Graphics -{ - public static class Colors - { - public static readonly Pixel AliceBlue = new Pixel(0xF0, 0xF8, 0xFF, 255); - public static readonly Pixel AntiqueWhite = new Pixel(0xFA, 0xEB, 0xD7, 255); - public static readonly Pixel Aqua = new Pixel(0, 0xFF, 0xFF, 255); - public static readonly Pixel Aquamarine = new Pixel(0x7F, 0xFF, 0xD4, 255); - public static readonly Pixel Azure = new Pixel(0xF0, 0xFF, 0xFF, 255); - public static readonly Pixel Beige = new Pixel(0xF5, 0xF5, 0xDC, 255); - public static readonly Pixel Bisque = new Pixel(0xFF, 0xE4, 0xC4, 255); - public static readonly Pixel Black = new Pixel(0x00, 0x00, 0x00, 255); - public static readonly Pixel BlanchedAlmond = new Pixel(0xFF, 0xEB, 0xCD, 255); - public static readonly Pixel Blue = new Pixel(0x00, 0x0, 0xFF, 255); - public static readonly Pixel BlueViolet = new Pixel(0x8A, 0x2B, 0xE2, 255); - public static readonly Pixel Brown = new Pixel(0xA5, 0x2A, 0x2A, 255); - public static readonly Pixel BurlyWood = new Pixel(0xDE, 0xB8, 0x87, 255); - public static readonly Pixel CadetBlue = new Pixel(0x5F, 0x9E, 0xA0, 255); - public static readonly Pixel Chartreuse = new Pixel(0x7F, 0xFF, 0x00, 255); - public static readonly Pixel Chocolate = new Pixel(0xD2, 0x69, 0x1E, 255); - public static readonly Pixel Coral = new Pixel(0xFF, 0x7F, 0x50, 255); - public static readonly Pixel CornflowerBlue = new Pixel(0x64, 0x95, 0xED, 255); - public static readonly Pixel Cornsilk = new Pixel(0xFF, 0xF8, 0xDC, 255); - public static readonly Pixel Crimson = new Pixel(0xDC, 0x14, 0x3C, 255); - public static readonly Pixel Cyan = new Pixel(0x00, 0xFF, 0xFF, 255); - public static readonly Pixel DarkBlue = new Pixel(0x00, 0x00, 0x8B, 255); - public static readonly Pixel DarkCyan = new Pixel(0x00, 0x8B, 0x8B, 255); - public static readonly Pixel DarkGoldenRod = new Pixel(0xB8, 0x86, 0x0B, 255); - public static readonly Pixel DarkGray = new Pixel(0xA9, 0xA9, 0xA9, 255); - public static readonly Pixel DarkGreen = new Pixel(0x00, 0x64, 0x00, 255); - public static readonly Pixel DarkKhaki = new Pixel(0xBD, 0xB7, 0x6B, 255); - public static readonly Pixel DarkMagenta = new Pixel(0x8B, 0x00, 0x8B, 255); - public static readonly Pixel DarkOliveGreen = new Pixel(0x55, 0x6B, 0x2F, 255); - public static readonly Pixel DarkOrange = new Pixel(0xFF, 0x8C, 0x00, 255); - public static readonly Pixel DarkOrchid = new Pixel(0x99, 0x32, 0xCC, 255); - public static readonly Pixel DarkRed = new Pixel(0x8B, 0x00, 0x00, 255); - public static readonly Pixel DarkSalmon = new Pixel(0xE9, 0x96, 0x7A, 255); - public static readonly Pixel DarkSeaGreen = new Pixel(0x8F, 0xBC, 0x8B, 255); - public static readonly Pixel DarkSlateBlue = new Pixel(0x48, 0x3D, 0x8B, 255); - public static readonly Pixel DarkSlateGrey = new Pixel(0x2F, 0x4F, 0x4F, 255); - public static readonly Pixel DarkTurquoise = new Pixel(0x00, 0xCE, 0xD1, 255); - public static readonly Pixel DarkViolet = new Pixel(0x94, 0x00, 0xD3, 255); - public static readonly Pixel DeepPink = new Pixel(0xFF, 0x14, 0x93, 255); - public static readonly Pixel DeepSkyBlue = new Pixel(0x00, 0xBF, 0xFF, 255); - public static readonly Pixel DimGrey = new Pixel(0x69, 0x69, 0x69, 255); - public static readonly Pixel DodgerBlue = new Pixel(0x1E, 0x90, 0xFF, 255); - public static readonly Pixel Firebrick = new Pixel(0xB2, 0x22, 0x22, 255); - public static readonly Pixel FloralWhite = new Pixel(0xFF, 0xFA, 0xF0, 255); - public static readonly Pixel Fuchsia = new Pixel(0xFF, 0x00, 0xFF, 255); - public static readonly Pixel Gainsboro = new Pixel(0xDC, 0xDC, 0xDC, 255); - public static readonly Pixel GhostWhite = new Pixel(0xF8, 0xF8, 0xFF, 255); - public static readonly Pixel Gold = new Pixel(0xFF, 0xD7, 0x00, 255); - public static readonly Pixel Goldenrod = new Pixel(0xDA, 0xA5, 0x20, 255); - public static readonly Pixel Gray = new Pixel(0x80, 0x80, 0x80, 255); - public static readonly Pixel Green = new Pixel(0x00, 0x80, 0x00, 255); - public static readonly Pixel GreenYellow = new Pixel(0xAD, 0xFF, 0x2F, 255); - public static readonly Pixel Honeydew = new Pixel(0xF0, 0xFF, 0xF0, 255); - public static readonly Pixel HotPink = new Pixel(0xFF, 0x69, 0xB4, 255); - public static readonly Pixel IndianRed = new Pixel(0xCD, 0x5C, 0x5C, 255); - public static readonly Pixel Indigo = new Pixel(0x4B, 0x00, 0x82, 255); - public static readonly Pixel Ivory = new Pixel(0xFF, 0xFF, 0xF0, 255); - public static readonly Pixel Khaki = new Pixel(0xF0, 0xE6, 0x8C, 255); - public static readonly Pixel Lavender = new Pixel(0xE6, 0xE6, 0xFA, 255); - public static readonly Pixel LavenderBlush = new Pixel(0x00, 0xF0, 0xF5, 255); - public static readonly Pixel LawnGreen = new Pixel(0x7C, 0xFC, 0x00, 255); - public static readonly Pixel LemonChiffon = new Pixel(0xFF, 0xFA, 0xCD, 255); - public static readonly Pixel LightBlue = new Pixel(0xAD, 0xD8, 0xE6, 255); - public static readonly Pixel LightCoral = new Pixel(0xF0, 0x80, 0x80, 255); - public static readonly Pixel LightCyan = new Pixel(0xE0, 0xFF, 0xFF, 255); - public static readonly Pixel LightGoldenrodYellow = new Pixel(0xFA, 0xFA, 0xD2, 255); - public static readonly Pixel LightGray = new Pixel(0xD3, 0xD3, 0xD3, 255); - public static readonly Pixel LightGreen = new Pixel(0x90, 0xEE, 0x90, 255); - public static readonly Pixel LightPink = new Pixel(0xFF, 0xB6, 0xC1, 255); - public static readonly Pixel LightSalmon = new Pixel(0xFF, 0xA0, 0x7A, 255); - public static readonly Pixel LightSeaGreen = new Pixel(0x20, 0xB2, 0xAA, 255); - public static readonly Pixel LightSkyBlue = new Pixel(0x87, 0xCE, 0xFA, 255); - public static readonly Pixel LightSlateGray = new Pixel(0x77, 0x88, 0x99, 255); - public static readonly Pixel LightSteelBlue = new Pixel(0xB0, 0xC4, 0xDE, 255); - public static readonly Pixel LightYellow = new Pixel(0xFF, 0xFF, 0xE0, 255); - public static readonly Pixel Lime = new Pixel(0x00, 0xFF, 0x00, 255); - public static readonly Pixel LimeGreen = new Pixel(0x32, 0xCD, 0x32, 255); - public static readonly Pixel Linen = new Pixel(0xFA, 0xF0, 0xE6, 255); - public static readonly Pixel Magenta = new Pixel(0xFF, 0x00, 0xFF, 255); - public static readonly Pixel Maroon = new Pixel(0x80, 0x00, 0x00, 255); - public static readonly Pixel MediumAquamarine = new Pixel(0x66, 0xCD, 0xAA, 255); - public static readonly Pixel MediumBlue = new Pixel(0x00, 0x00, 0xCD, 255); - public static readonly Pixel MediumOrchid = new Pixel(0xBA, 0x55, 0xD3, 255); - public static readonly Pixel MediumPurple = new Pixel(0x93, 0x70, 0xDB, 255); - public static readonly Pixel MediumSeaGreen = new Pixel(0x3C, 0xB3, 0x71, 255); - public static readonly Pixel MediumSlateBlue = new Pixel(0x7B, 0x69, 0xEE, 255); - public static readonly Pixel MediumSpringGreen = new Pixel(0x00, 0xFA, 0x9A, 255); - public static readonly Pixel MediumTurquoise = new Pixel(0x48, 0xD1, 0xCC, 255); - public static readonly Pixel MediumVioletRed = new Pixel(0xC7, 0x15, 0x85, 255); - public static readonly Pixel MidnightBlue = new Pixel(0x19, 0x19, 0x70, 255); - public static readonly Pixel MintCream = new Pixel(0xF5, 0xFF, 0xFA, 255); - public static readonly Pixel MintyRose = new Pixel(0xFF, 0xE4, 0xE1, 255); - public static readonly Pixel Moccasin = new Pixel(0xFF, 0xE4, 0xB5, 255); - public static readonly Pixel NavajoWhite = new Pixel(0xFF, 0xDE, 0xAD, 255); - public static readonly Pixel Navy = new Pixel(0x00, 0x00, 0x80, 255); - public static readonly Pixel OldLace = new Pixel(0xFD, 0xF5, 0xE6, 255); - public static readonly Pixel Olive = new Pixel(0x80, 0x80, 0x00, 255); - public static readonly Pixel OliveDrab = new Pixel(0x6B, 0x8E, 0x23, 255); - public static readonly Pixel Orange = new Pixel(0xFF, 0xA5, 0x00, 255); - public static readonly Pixel OrangeRed = new Pixel(0xFF, 0x45, 0x00, 255); - public static readonly Pixel Orchid = new Pixel(0xDA, 0x70, 0xD6, 255); - public static readonly Pixel PaleGoldenrod = new Pixel(0xEE, 0xE8, 0xAA, 255); - public static readonly Pixel PaleGreen = new Pixel(0x98, 0xFB, 0x98, 255); - public static readonly Pixel PaleTurquoise = new Pixel(0xAF, 0xEE, 0xEE, 255); - public static readonly Pixel PaleVioletRed = new Pixel(0xDB, 0x70, 0x93, 255); - public static readonly Pixel PapayaWhip = new Pixel(0xFF, 0xEF, 0xD5, 255); - public static readonly Pixel PeachPuff = new Pixel(0xFF, 0xDA, 0xB9, 255); - public static readonly Pixel Peru = new Pixel(0xCD, 0x85, 0x3F, 255); - public static readonly Pixel Pink = new Pixel(0xFF, 0xC0, 0xCB, 255); - public static readonly Pixel Plum = new Pixel(0xDD, 0xA0, 0xDD, 255); - public static readonly Pixel PowderBlue = new Pixel(0xB0, 0xE0, 0xE6, 255); - public static readonly Pixel Purple = new Pixel(0x80, 0x00, 0x80, 255); - public static readonly Pixel Red = new Pixel(0xFF, 0x00, 0x00, 255); - public static readonly Pixel RosyBrown = new Pixel(0xBC, 0x8F, 0x8F, 255); - public static readonly Pixel RoyalBlue = new Pixel(0x41, 0x69, 0xE1, 255); - public static readonly Pixel SaddleBrown = new Pixel(0x8B, 0x45, 0x13, 255); - public static readonly Pixel Salmon = new Pixel(0xFA, 0x80, 0x72, 255); - public static readonly Pixel SandyBrown = new Pixel(0xF4, 0xA4, 0x60, 255); - public static readonly Pixel SeaGreen = new Pixel(0x2E, 0x8B, 0x57, 255); - public static readonly Pixel SeaShell = new Pixel(0xFF, 0xF5, 0xEE, 255); - public static readonly Pixel Sienna = new Pixel(0xA0, 0x52, 0x2D, 255); - public static readonly Pixel Silver = new Pixel(0xC0, 0xC0, 0xC0, 255); - public static readonly Pixel SkyBlue = new Pixel(0x87, 0xCE, 0xEB, 255); - public static readonly Pixel SlateBlue = new Pixel(0x6A, 0x5A, 0xCD, 255); - public static readonly Pixel SlateGray = new Pixel(0x70, 0x80, 0x90, 255); - public static readonly Pixel Snow = new Pixel(0xFF, 0xFA, 0xFA, 255); - public static readonly Pixel SpringGreen = new Pixel(0x00, 0xFF, 0x7F, 255); - public static readonly Pixel SteelBlue = new Pixel(0x46, 0x82, 0xB4, 255); - public static readonly Pixel Tan = new Pixel(0xD2, 0xB4, 0x8C, 255); - public static readonly Pixel Teal = new Pixel(0x00, 0x80, 0x80, 255); - public static readonly Pixel Thistle = new Pixel(0xD8, 0xBF, 0xD8, 255); - public static readonly Pixel Tomato = new Pixel(0xFF, 0x63, 0x47, 255); - public static readonly Pixel Turquoise = new Pixel(0x40, 0xE0, 0xD0, 255); - public static readonly Pixel Violet = new Pixel(0xEE, 0x82, 0xEE, 255); - public static readonly Pixel Wheat = new Pixel(0xF5, 0xDe, 0xB3, 255); - public static readonly Pixel White = new Pixel(0xFF, 0xFF, 0xFF, 255); - public static readonly Pixel WhiteSmoke = new Pixel(0xF5, 0xF5, 0xF5, 255); - public static readonly Pixel Yellow = new Pixel(0xFF, 0xFF, 0x00, 255); - public static readonly Pixel YellowGreen = new Pixel(0x9A, 0xCD, 0x32, 255); - } -} diff --git a/Users/Orvid/Orvid.Graphics/EGAPallet.PNG b/Users/Orvid/Orvid.Graphics/EGAPallet.PNG deleted file mode 100644 index 7430d2484a..0000000000 Binary files a/Users/Orvid/Orvid.Graphics/EGAPallet.PNG and /dev/null differ diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/BWGreyscale.patch b/Users/Orvid/Orvid.Graphics/FontSupport/BWGreyscale.patch deleted file mode 100644 index 2c4ab60cf7..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/BWGreyscale.patch +++ /dev/null @@ -1,458 +0,0 @@ -Index: FontCharacter.cs -=================================================================== ---- FontCharacter.cs (revision 81403) -+++ FontCharacter.cs (working copy) -@@ -6,6 +6,150 @@ - { - public class FontCharacter - { -+ private class SingleForm -+ { -+ byte[] Data; -+ bool Filled; -+ Image LoadedImage; -+ byte Height; -+ byte Width; -+ UInt32 Bits; -+ -+ public SingleForm(byte[] data, byte height, byte width, UInt32 bits) -+ { -+ this.Data = data; -+ this.Filled = false; -+ this.Height = height; -+ this.Width = width; -+ this.Bits = bits; -+ } -+ -+ public Image GetCharacter() -+ { -+ if (Filled) -+ { -+ return LoadedImage; -+ } -+ else -+ { -+ LoadedImage = LoadFromBinary(Data, Height, Width, Bits); -+ Filled = true; -+ Data = null; -+ return LoadedImage; -+ } -+ } -+ -+ private byte ReadByte(bool[] data) -+ { -+ byte r = 0; -+ for (int i = 0; i < 8; i++) -+ { -+ if (!data[i]) // The data loading seems to invert the bools. -+ { -+ r <<= 1; -+ r += 1; -+ } -+ } -+ return r; -+ } -+ -+ private Image LoadFromBinary(byte[] data, byte height, byte width, uint bits) -+ { -+ #region LoadData -+ bool[] idata = new bool[data.Length * 8]; -+ int bitnum = 0; -+ for (int inc = 0; inc < data.Length; inc++) -+ { -+ if ((data[inc] & 1) == 1) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 2) == 2) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 4) == 4) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 8) == 8) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 16) == 16) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 32) == 32) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 64) == 64) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ if ((data[inc] & 128) == 128) -+ { -+ idata[bitnum] = true; -+ } -+ bitnum++; -+ } -+ #endregion -+ -+ bitnum = 0; -+ Image i = new Image(width, height); -+ -+ //for (uint y = 0; y < height; y++) -+ for (uint x = 0; x < width; x++) -+ { -+ //for (uint x = 0; x < width; x++) -+ for (uint y = 0; y < height; y++) -+ { -+ if (bitnum >= bits) -+ { -+ break; -+ } -+ if (idata[bitnum]) -+ { -+ bitnum++; -+ if (idata[bitnum]) -+ { -+ bitnum++; -+ i.SetPixel(x, y, Colors.Black); // Color the pixel white -+ } -+ else -+ { -+ bitnum++; -+ bool[] tmp = new bool[8]; -+ Array.Copy(idata, bitnum, tmp, 0, 8); -+ bitnum += 8; -+ byte greyscale = ReadByte(tmp); -+ i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255)); -+ } -+ } -+ else -+ { -+ bitnum++; -+ i.SetPixel(x, y, Colors.White); // Color the pixel black -+ } -+ } -+ if (bitnum >= bits) -+ { -+ break; -+ } -+ } -+ -+ return i; -+ } -+ } -+ - Image[] forms; - - public FontCharacter(Image character, FontFlag flags) -Index: OPFF.cs -=================================================================== ---- OPFF.cs (revision 81403) -+++ OPFF.cs (working copy) -@@ -14,6 +14,7 @@ - using System; - using System.Collections.Generic; - using System.Text; -+using System.IO; - - namespace Orvid.Graphics.FontSupport - { -@@ -25,6 +26,12 @@ - get { return name; } - } - -+ private UInt16 ver; -+ public UInt16 FileFormatVersion -+ { -+ get { return ver; } -+ } -+ - FontCharacterSet foundChars = new FontCharacterSet(); - - public OPFF(byte[] data) -@@ -55,7 +62,7 @@ - return r; - } - -- private UInt32 ReadInt32(byte[] data) -+ private UInt32 ReadUInt32(byte[] data) - { - UInt32 r = 0; - -@@ -70,6 +77,17 @@ - return r; - } - -+ private UInt16 ReadUInt16(byte[] data) -+ { -+ UInt16 r = 0; -+ -+ r += data[1]; -+ r <<= 8; -+ r += data[0]; -+ -+ return r; -+ } -+ - private void Load(byte[] data) - { - if (data[0] == 0xFF) // this means it's been compressed in LZMA format. -@@ -82,10 +100,19 @@ - - int curloc = 8; // There are 8 empty bytes at the start of the header. - -- byte[] datarr = new byte[256]; -+ byte[] datarr = new byte[2]; -+ Array.Copy(data, curloc, datarr, 0, 2); -+ curloc += 2; -+ ver = ReadUInt16(datarr); -+ if (ver > 47) -+ { -+ throw new Exception("Format version is to high!"); -+ } -+ -+ datarr = new byte[256]; - Array.Copy(data, curloc, datarr, 0, 256); - curloc += 256; -- name = new String(ASCIIEncoding.ASCII.GetChars(datarr)); -+ name = new String(ASCIIEncoding.ASCII.GetChars(datarr)).Replace("\0",""); - - datarr = new byte[8]; - Array.Copy(data, curloc, datarr, 0, 8); -@@ -106,15 +133,15 @@ - curloc++; - byte width = data[curloc]; - curloc++; -- int len = (Int32)Math.Ceiling((double)((width * height) / 8)); -+ datarr = new byte[4]; -+ Array.Copy(data, curloc, datarr, 0, 4); -+ curloc += 4; -+ int bits = (int)ReadUInt32(datarr); -+ int len = (Int32)Math.Ceiling((double)(bits / 8)); - datarr = new byte[len]; - Array.Copy(data, curloc, datarr, 0, len); - curloc += len; -- Image im = LoadFromBinary(datarr, height, width); -- if (prevCharNumber > ushort.MaxValue) -- { -- throw new Exception(); -- } -+ Image im = LoadFromBinary(datarr, height, width, bits); - foundChars.AddCharacter((int)prevCharNumber, im, flags); - } - else -@@ -123,31 +150,45 @@ - datarr = new byte[4]; - Array.Copy(data, curloc, datarr, 0, 4); - curloc += 4; -- prevCharNumber = ReadInt32(datarr); -- if (prevCharNumber > ushort.MaxValue) -- { -- throw new Exception(); -- } -+ prevCharNumber = ReadUInt32(datarr); - FontFlag flags = (FontFlag)data[curloc]; - curloc++; - byte height = data[curloc]; - curloc++; - byte width = data[curloc]; - curloc++; -- int len = (Int32)Math.Ceiling((double)((width * height) / 8)); -+ datarr = new byte[4]; -+ Array.Copy(data, curloc, datarr, 0, 4); -+ curloc += 4; -+ int bits = (int)ReadUInt32(datarr); -+ int len = (Int32)Math.Ceiling((double)(bits / 8)); - datarr = new byte[len]; - Array.Copy(data, curloc, datarr, 0, len); - curloc += len; -- Image im = LoadFromBinary(datarr, height, width); -+ Image im = LoadFromBinary(datarr, height, width, bits); - foundChars.AddCharacter((int)prevCharNumber, im, flags); - } - } - } - -- private Image LoadFromBinary(byte[] data, byte height, byte width) -+ private byte ReadByte(bool[] data) - { -+ byte r = 0; -+ for (int i = 0; i < 8; i++) -+ { -+ if (data[i]) // The data loading seems to invert the bools. -+ { -+ r |= (byte)(((byte)1) << i); -+ } -+ } -+ return r; -+ } -+ -+ private Image LoadFromBinary(byte[] data, byte height, byte width, int bits) -+ { - #region LoadData -- bool[] idata = new bool[height * width]; -+ //Array.Reverse(data); -+ bool[] idata = new bool[data.Length * 8]; - int bitnum = 0; - for (int inc = 0; inc < data.Length; inc++) - { -@@ -166,70 +207,139 @@ - // throw new Exception(); - //} - -- if (((byte)(data[inc] << 7) >> 7) == 1) -+ #region HighToLowBitLoading -+ if ((data[inc] & 128) == 128) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 6) >> 7) == 1) -+ if ((data[inc] & 64) == 64) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 5) >> 7) == 1) -+ if ((data[inc] & 32) == 32) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 4) >> 7) == 1) -+ if ((data[inc] & 16) == 16) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 3) >> 7) == 1) -+ if ((data[inc] & 8) == 8) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 2) >> 7) == 1) -+ if ((data[inc] & 4) == 4) - { - idata[bitnum] = true; - } - bitnum++; -- if (((byte)(data[inc] << 1) >> 7) == 1) -+ if ((data[inc] & 2) == 2) - { - idata[bitnum] = true; - } - bitnum++; -- if ((data[inc] >> 7) == 1) -+ if ((data[inc] & 1) == 1) - { - idata[bitnum] = true; - } - bitnum++; -+ #endregion -+ -+ #region LowToHighBitLoading -+ //if ((data[inc] & 1) == 1) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 2) == 2) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 4) == 4) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 8) == 8) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 16) == 16) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 32) == 32) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 64) == 64) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ //if ((data[inc] & 128) == 128) -+ //{ -+ // idata[bitnum] = true; -+ //} -+ //bitnum++; -+ #endregion -+ - } - #endregion - - bitnum = 0; - Image i = new Image(width, height); -+ //StreamWriter s = new StreamWriter(Path.GetFullPath("lg.txt")); - - //for (uint y = 0; y < height; y++) -+ //for (uint y = (uint)(height - 1); (y >= 0 && y != uint.MaxValue); y--) - for (uint x = 0; x < width; x++) -+ //for (uint x = (uint)(width - 1); (x >= 0 && x != uint.MaxValue); x--) - { - //for (uint x = 0; x < width; x++) -+ //for (uint x = (uint)(width - 1); (x >= 0 && x != uint.MaxValue); x--) - for (uint y = 0; y < height; y++) -+ //for (uint y = (uint)(height - 1); (y >= 0 && y != uint.MaxValue); y--) - { - if (idata[bitnum]) - { -- i.SetPixel(x, y, Colors.Black); // Color the pixel white -+ bitnum++; -+ if (idata[bitnum]) -+ { -+ bitnum++; -+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 00"); -+ i.SetPixel(x, y, Colors.Black); // Color the pixel black -+ } -+ else -+ { -+ bitnum++; -+ bool[] tmp = new bool[8]; -+ Array.Copy(idata, bitnum, tmp, 0, 8); -+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 01-" + (tmp[0] ? "1" : "0") + (tmp[1] ? "1" : "0") + (tmp[2] ? "1" : "0") + (tmp[3] ? "1" : "0") + (tmp[4] ? "1" : "0") + (tmp[5] ? "1" : "0") + (tmp[6] ? "1" : "0") + (tmp[7] ? "1" : "0")); -+ bitnum += 8; -+ byte greyscale = ReadByte(tmp); -+ i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255)); -+ } - } - else - { -- i.SetPixel(x, y, Colors.White); // Color the pixel black -+ bitnum++; -+ //s.WriteLine("Pixel at (" + x.ToString() + ", " + y.ToString() + ") is 1"); -+ i.SetPixel(x, y, Colors.White); - } -- bitnum++; - } - } -- -+ //s.Flush(); -+ //s.Close(); - return i; - } - diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Defaults/DefaultFontManager.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Defaults/DefaultFontManager.cs deleted file mode 100644 index 79dc1cf0ac..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Defaults/DefaultFontManager.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Orvid.Graphics.FontSupport -{ - /// - /// The default FontManager. - /// - public class DefaultFontManager : FontManager - { - - List Providers = new List(); - - - public DefaultFontManager() - { - Providers.Add(new bdf.BDFFont()); - //Providers.Add(2, new fnt.FntFont()); - } - - - public override string Name - { - get { return "Default Font Manager"; } - } - - public override FontMetrics GetFontMetrics(Font font) - { - return font.GetFontMetrics(); - } - - public override void DrawText(Image i, BoundingBox clip, AffineTransform trans, string s, Font f, Vec2 Loc, Pixel p) - { - f.Render(i, clip, trans, s, Loc, p); - } - - public override Font LoadFont(int format, Stream s) - { - if (format > Providers.Count) - { - throw new Exception("Unknown format!"); - } - - return Providers[format].LoadFont(s); - - throw new Exception("can't create font with format #'" + format.ToString() + "'"); - } - - public override Font[] Fonts - { - get - { - List all = new List(); - foreach (Font prv in Providers) - { - all.AddRange(prv.DefaultFonts); - } - return all.ToArray(); - } - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Font.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Font.cs deleted file mode 100644 index cbaef04139..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Font.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.FontSupport -{ - /// - /// The base type for a font. - /// - public abstract class Font - { - private static Dictionary LoadedFonts = new Dictionary(); - - public static Font GetFont(string name) - { - if (LoadedFonts.ContainsKey(name)) - { - return LoadedFonts[name]; - } - return null; - } - - public static Font LoadFont(Stream s, int format) - { - return FontManager.Instance.LoadFont(format, s); - } - - public abstract Font LoadFont(Stream s); - public abstract void Render(Image i, BoundingBox clip, AffineTransform trans, string text, Vec2 loc, Pixel color); - public abstract ITextRenderer GetTextRenderer(); - public abstract FontMetrics GetFontMetrics(); - public abstract bool IsSupportedType(Font f); - public abstract string ProviderName { get; } - public abstract List DefaultFonts { get; } - - /// - /// The name of the font. - /// - public string Name { get; private set; } - /// - /// The style of the font. - /// - public FontStyle Style { get; private set; } - /// - /// The point-size of the Font rounded to an int. - /// - public float Size { get; private set; } - - /// - /// This constructor should only be used - /// for initializing it as a loader. - /// - /// - internal Font(bool b) - { - - } - - /// - /// The default constructor. - /// - /// The name of the font. - /// The style of the font. - /// The point-size of the font. - public Font(string name, FontStyle style, int size) - { - this.Name = name; - this.Style = style; - this.Size = (float)size; - LoadedFonts.Add(name, this); - } - - /// - /// The default constructor. - /// - /// The name of the font. - /// The style of the font. - /// The point-size of the font. - public Font(string name, FontStyle style, double size) - { - this.Name = name; - this.Style = style; - this.Size = (float)size; - LoadedFonts.Add(name, this); - } - - /// - /// The default constructor. - /// - /// The name of the font. - /// The style of the font. - /// The point-size of the font. - public Font(string name, FontStyle style, float size) - { - this.Name = name; - this.Style = style; - this.Size = size; - LoadedFonts.Add(name, this); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/FontManager.cs b/Users/Orvid/Orvid.Graphics/FontSupport/FontManager.cs deleted file mode 100644 index 43b5892307..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/FontManager.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.IO; - -namespace Orvid.Graphics.FontSupport -{ - /// - /// This class represents a font manager. - /// It's a font manager's job to load, - /// draw, and keep track of fonts. - /// - public abstract class FontManager - { - /// - /// Current font manager. - /// - private static FontManager instance; - /// - /// The current font manager. - /// - public static FontManager Instance - { - get { return instance; } - } - - /// - /// The static constructor which sets-up the default font manager. - /// - static FontManager() - { - instance = new DefaultFontManager(); - } - - /// - /// The default constructor. - /// - public FontManager() - { - instance = this; - } - - /// - /// The name of the FontManager. - /// - public abstract string Name { get; } - /// - /// The known fonts. - /// - public abstract Font[] Fonts { get; } - /// - /// Get the FontMetrics for the specified font. - /// - /// Font to get the metrics for. - /// The FontMetrics for the specified font. - public abstract FontMetrics GetFontMetrics(Font font); - /// - /// Draw the specified Text, using the specified Font, - /// in the specified Color, within the specified Bounds, - /// at the specified Location, and on the specified image, - /// making sure to take the transform into account. - /// - /// The Image to draw on. - /// The BoundingBox to clip to. - /// The Transform to apply. - /// The String to draw. - /// The Font to draw in. - /// The Location to draw at. - /// The Color to draw in. - public abstract void DrawText(Image i, BoundingBox clip, AffineTransform trans, String s, Font f, Vec2 Loc, Pixel p); - /// - /// Loads a font from the specified stream. - /// - /// The format of the font. - /// The Stream to load from. - /// The loaded font. - public abstract Font LoadFont(int format, Stream s); -#warning TODO: Remove the need for the format parameter. - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/FontMetrics.cs b/Users/Orvid/Orvid.Graphics/FontSupport/FontMetrics.cs deleted file mode 100644 index 09dee5efb8..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/FontMetrics.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport -{ - public abstract class FontMetrics - { - protected Font font; - - protected FontMetrics(Font font) - { - this.font = font; - } - - public Font GetFont() - { - return font; - } - - public virtual int GetLeading() - { - return 0; - } - - public virtual int GetAscent() - { - return (int)font.Size; - } - - public virtual int GetDescent() - { - return 0; - } - - public virtual int GetHeight() - { - return GetLeading() + GetAscent() + GetDescent(); - } - - public virtual int GetMaxAscent() - { - return GetAscent(); - } - - public virtual int GetMaxDescent() - { - return GetDescent(); - } - - public virtual int GetMaxAdvance() - { - return -1; - } - - - public virtual int CharWidth(char ch) - { - if (ch < 256) - { - return GetWidths()[ch]; - } - char[] data = { ch }; - return CharsWidth(data, 0, 1); - } - - public int StringWidth(String str) - { - int len = str.Length; - char[] data = new char[len]; - Array.Copy(str.ToCharArray(), 0, data, 0,len); - return CharsWidth(data, 0, len); - } - - public abstract int[] CharsWidths(char[] chars, int start, int len); - - public virtual int CharsWidth(char[] data, int off, int len) - { - return StringWidth(new String(data, off, len)); - } - - public virtual int[] GetWidths() - { - int[] widths = new int[256]; - for (char ch = (char)0; ch < 256; ch++) - { - widths[ch] = CharWidth(ch); - } - return widths; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/FontStyle.cs b/Users/Orvid/Orvid.Graphics/FontSupport/FontStyle.cs deleted file mode 100644 index bf37f10f6f..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/FontStyle.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport -{ - /// - /// There can be up to 8 different flags. - /// - [Flags] - public enum FontStyle - { - Normal = 0, - Bold = 1, - Italic = 2, - Underline = 4, - Strikeout = 8, - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Interfaces/ITextRenderer.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Interfaces/ITextRenderer.cs deleted file mode 100644 index 5b9e3cfd44..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Interfaces/ITextRenderer.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport -{ - public abstract class ITextRenderer - { - public abstract void Render(Image i, BoundingBox clip, AffineTransform trans, string text, Vec2 loc, Pixel color); - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Old/Font.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Old/Font.cs deleted file mode 100644 index 0e5f97f769..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Old/Font.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.FontSupport.Old -{ - public abstract class Font - { - public abstract String Name { get; } - public abstract Image GetCharacter(Int32 charNumber, FontFlag flags); - } - - /// - /// There can be up to 8 different flags. - /// - [Flags] - public enum FontFlag - { - Normal = 0, - Bold = 1, - Italic = 2, - Underline = 4, - Strikeout = 8, - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacter.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacter.cs deleted file mode 100644 index 4a4a311fa3..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacter.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.FontSupport.Old -{ - public class FontCharacter - { - private class SingleForm - { - byte[] Data; - bool Filled; - Image LoadedImage; - byte Height; - byte Width; - UInt32 Bits; - - public SingleForm(byte[] data, byte height, byte width, UInt32 bits) - { - this.Data = data; - this.Filled = false; - this.Height = height; - this.Width = width; - this.Bits = bits; - } - - public Image GetCharacter() - { - if (Filled) - { - return LoadedImage; - } - else - { - LoadedImage = LoadFromBinary(Data, Height, Width, Bits); - Filled = true; - Data = null; - return LoadedImage; - } - } - - private byte ReadByte(bool[] data) - { - byte r = 0; - for (int i = 0; i < 8; i++) - { - if (!data[i]) // The data loading seems to invert the bools. - { - r <<= 1; - r += 1; - } - } - return r; - } - - private Image LoadFromBinary(byte[] data, byte height, byte width, uint bits) - { - #region LoadData - bool[] idata = new bool[data.Length * 8]; - int bitnum = 0; - for (int inc = 0; inc < data.Length; inc++) - { - if ((data[inc] & 1) == 1) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 2) == 2) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 4) == 4) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 8) == 8) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 16) == 16) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 32) == 32) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 64) == 64) - { - idata[bitnum] = true; - } - bitnum++; - if ((data[inc] & 128) == 128) - { - idata[bitnum] = true; - } - bitnum++; - } - #endregion - - bitnum = 0; - Image i = new Image(width, height); - - //for (uint y = 0; y < height; y++) - for (uint x = 0; x < width; x++) - { - //for (uint x = 0; x < width; x++) - for (uint y = 0; y < height; y++) - { - if (bitnum >= bits) - { - break; - } - if (idata[bitnum]) - { - bitnum++; - if (idata[bitnum]) - { - bitnum++; - i.SetPixel(x, y, Colors.Black); // Color the pixel white - } - else - { - bitnum++; - bool[] tmp = new bool[8]; - Array.Copy(idata, bitnum, tmp, 0, 8); - bitnum += 8; - byte greyscale = ReadByte(tmp); - i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255)); - } - } - else - { - bitnum++; - i.SetPixel(x, y, Colors.White); // Color the pixel black - } - } - if (bitnum >= bits) - { - break; - } - } - - return i; - } - } - - Image[] forms; - - public FontCharacter(Image character, FontFlag flags) - { - Int32 i = (Int32)flags; - forms = new Image[i + 1]; - forms[i] = character; - } - - public void AddForm(Image character, FontFlag flags) - { - Int32 i = (Int32)flags; - if (i > forms.Length - 1) - { - Image[] forms2 = new Image[i + 1]; - Array.Copy(forms, forms2, forms.Length); - forms = forms2; - } - forms[i] = character; - } - - public Image GetForm(FontFlag flags) - { - if ((Int32)flags < forms.Length) - { - return (forms[((Int32)flags)]); - } - else - { - return null; - } - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacterSet.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacterSet.cs deleted file mode 100644 index d59b18c8aa..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Old/FontCharacterSet.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.FontSupport.Old -{ - public class FontCharacterSet - { - FontCharacter[] foundChars = new FontCharacter[ushort.MaxValue]; - uint chars = 0; - - public void AddCharacter(int charNumber, Image ch, FontFlag flags) - { - if (foundChars[charNumber] == null) - { - foundChars[charNumber] = new FontCharacter(ch, flags); - } - else - { - foundChars[charNumber].AddForm(ch, flags); - } - chars++; - } - - public Image GetCharacter(int charNumber, FontFlag flags) - { - if (foundChars[charNumber] != null) - { - if (foundChars[charNumber].GetForm(flags) != null) - { - return foundChars[charNumber].GetForm(flags); - } - else - { - throw new Exception("Form Not Found!"); - } - } - else - { - throw new Exception("Character non-existant!"); - } - } - - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/Old/OPFF.cs b/Users/Orvid/Orvid.Graphics/FontSupport/Old/OPFF.cs deleted file mode 100644 index df4ae5aea9..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/Old/OPFF.cs +++ /dev/null @@ -1,226 +0,0 @@ -/* This file will eventually hold an implementation - * of the Orvid Precompiled Font Format. The use of - * this format is to provide a much easier to - * implement format for loading fonts. It is meant - * to eliminate the Pre-Rendering step required - * for most current font formats. It will achieve - * this by using a bit-based format, where each bit - * will represent a single pixel. It will also merge - * the multiple files required for Bold, Italic, and - * other such formatting, support, into a single - * file. - */ - -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Collections; - -namespace Orvid.Graphics.FontSupport.Old -{ - public class OPFF : Font - { - private class BinaryReader : System.IO.BinaryReader - { - private bool[] curByte = new bool[8]; - private byte curBitIndx = 0; - private BitArray ba; - - public BinaryReader(Stream s) : base(s) - { - ba = new BitArray(new byte[] { base.ReadByte() }); - ba.CopyTo(curByte, 0); - ba = null; - } - - public override bool ReadBoolean() - { - if (curBitIndx == 8) - { - ba = new BitArray(new byte[] { base.ReadByte() }); - ba.CopyTo(curByte, 0); - ba = null; - this.curBitIndx = 0; - } - - bool b = curByte[curBitIndx]; - curBitIndx++; - return b; - } - - public override byte ReadByte() - { - bool[] bar = new bool[8]; - byte i; - for (i = 0; i < 8; i++) - { - bar[i] = this.ReadBoolean(); - } - - byte b = 0; - byte bitIndex = 0; - for (i = 0; i < 8; i++) - { - if (bar[i]) - { - b |= (byte)(((byte)1) << bitIndex); - } - bitIndex++; - } - return b; - } - - public override byte[] ReadBytes(int count) - { - byte[] bytes = new byte[count]; - for (int i = 0; i < count; i++) - { - bytes[i] = this.ReadByte(); - } - return bytes; - } - - public override ushort ReadUInt16() - { - byte[] bytes = ReadBytes(2); - return BitConverter.ToUInt16(bytes, 0); - } - - public override uint ReadUInt32() - { - byte[] bytes = ReadBytes(4); - return BitConverter.ToUInt32(bytes, 0); - } - - public override ulong ReadUInt64() - { - byte[] bytes = ReadBytes(8); - return BitConverter.ToUInt64(bytes, 0); - } - } - - private string name; - public override string Name - { - get { return name; } - } - - private UInt16 ver; - public UInt16 FileFormatVersion - { - get { return ver; } - } - - FontCharacterSet foundChars = new FontCharacterSet(); - - public OPFF(byte[] data) - { - Load(data); - } - - private void Load(byte[] data) - { - if (data[0] == 0xFF) // this means it's been compressed in LZMA format. - { - byte[] tmp = new byte[data.Length - 1]; - Array.Copy(data, 1, tmp, 0, tmp.Length); - data = Orvid.Compression.LZMA.Decompress(tmp); - tmp = null; - } - MemoryStream m = new MemoryStream(data); - BinaryReader br = new BinaryReader(m); - br.ReadBytes(8); // There are 8 empty bytes at the start of the header. - byte[] datarr; - ver = br.ReadUInt16(); - if (ver > 47) - { - throw new Exception("Format version is to high!"); - } - - datarr = br.ReadBytes(256); - name = new String(ASCIIEncoding.ASCII.GetChars(datarr)).Replace("\0",""); - - UInt64 charsToRead = br.ReadUInt64(); - - UInt32 prevCharNumber = 0; - byte height, width; - FontFlag flags; - int bits, len; - Image im; - for (UInt64 i = 0; i < charsToRead; i++) - { - // Check if the character number is incremented from the last item. - if (br.ReadByte() == 255) // this means increment it. - { - //throw new Exception(); - prevCharNumber++; - flags = (FontFlag)br.ReadByte(); - height = br.ReadByte(); - width = br.ReadByte(); - bits = (int)br.ReadUInt32(); - len = (Int32)Math.Ceiling((double)(bits / 8)); - datarr = br.ReadBytes(len); - im = LoadFromBinary(datarr, height, width, bits); - foundChars.AddCharacter((int)prevCharNumber, im, flags); - } - else - { - prevCharNumber = br.ReadUInt32(); - flags = (FontFlag)br.ReadByte(); - height = br.ReadByte(); - width = br.ReadByte(); - bits = (int)br.ReadUInt32(); - len = (Int32)Math.Ceiling((double)(bits / 8)); - datarr = br.ReadBytes(len); - im = LoadFromBinary(datarr, height, width, bits); - foundChars.AddCharacter((int)prevCharNumber, im, flags); - } - } - } - - private Image LoadFromBinary(byte[] data, byte height, byte width, int bits) - { - MemoryStream m = new MemoryStream(data); - BinaryReader br = new BinaryReader(m); - Image i = new Image(width, height); - - for (uint x = 0; x < width; x++) - //for (uint y = 0; y < height; y++) - { - for (uint y = 0; y < height; y++) - //for (uint x = 0; x < width; x++) - { - //if (br.ReadBoolean()) - //{ - // if (br.ReadBoolean()) - // { - // i.SetPixel(x, y, Colors.Black); // Color the pixel black - // } - // else - // { - byte greyscale = br.ReadByte(); - if (greyscale != 255) - { - i.SetPixel(x, y, new Pixel(greyscale, greyscale, greyscale, 255)); // Color the pixel as greyscale - } - // } - //} - //else - //{ - // i.SetPixel(x, y, Colors.White); // Color the pixel white - //} - } - } - data = null; - br.Dispose(); - m.Dispose(); - return i; - } - - public override Image GetCharacter(Int32 charNumber, FontFlag flags) - { - return foundChars.GetCharacter(charNumber, flags); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/SupportClasses/AffineTransform.cs b/Users/Orvid/Orvid.Graphics/FontSupport/SupportClasses/AffineTransform.cs deleted file mode 100644 index 6cde60d851..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/SupportClasses/AffineTransform.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport -{ - public class AffineTransform - { - static double AffineEpsilon = 1e-14; - public double sx, shy, shx, sy, tx, ty; - - public AffineTransform(AffineTransform copyFrom) - { - sx = copyFrom.sx; - shy = copyFrom.shy; - shx = copyFrom.shx; - sy = copyFrom.sy; - tx = copyFrom.tx; - ty = copyFrom.ty; - } - - public AffineTransform(double v0, double v1, double v2, - double v3, double v4, double v5) - { - sx = v0; - shy = v1; - shx = v2; - sy = v3; - tx = v4; - ty = v5; - } - - public AffineTransform(double[] m) - { - sx = m[0]; - shy = m[1]; - shx = m[2]; - sy = m[3]; - tx = m[4]; - ty = m[5]; - } - - public static AffineTransform NewIdentity() - { - AffineTransform newAffine = new AffineTransform(1.0, 0.0, 0.0, 1.0, 0.0, 0.0); - - return newAffine; - } - - public static AffineTransform NewRotation(double angleRadians) - { - return new AffineTransform(Math.Cos(angleRadians), Math.Sin(angleRadians), -Math.Sin(angleRadians), Math.Cos(angleRadians), 0.0, 0.0); - } - - public static AffineTransform NewScaling(double scale) - { - return new AffineTransform(scale, 0.0, 0.0, scale, 0.0, 0.0); - } - - public static AffineTransform NewScaling(double x, double y) - { - return new AffineTransform(x, 0.0, 0.0, y, 0.0, 0.0); - } - - public static AffineTransform NewTranslation(double x, double y) - { - return new AffineTransform(1.0, 0.0, 0.0, 1.0, x, y); - } - - public static AffineTransform NewSkewing(double x, double y) - { - return new AffineTransform(1.0, Math.Tan(y), Math.Tan(x), 1.0, 0.0, 0.0); - } - - public void Identity() - { - sx = sy = 1.0; - shy = shx = tx = ty = 0.0; - } - - public void Translate(double x, double y) - { - tx += x; - ty += y; - } - - public void Rotate(double angleRadians) - { - double ca = Math.Cos(angleRadians); - double sa = Math.Sin(angleRadians); - double t0 = sx * ca - shy * sa; - double t2 = shx * ca - sy * sa; - double t4 = tx * ca - ty * sa; - shy = sx * sa + shy * ca; - sy = shx * sa + sy * ca; - ty = tx * sa + ty * ca; - sx = t0; - shx = t2; - tx = t4; - } - - public void Scale(double x, double y) - { - double mm0 = x; - double mm3 = y; - sx *= mm0; - shx *= mm0; - tx *= mm0; - shy *= mm3; - sy *= mm3; - ty *= mm3; - } - - public void Scale(double scaleAmount) - { - sx *= scaleAmount; - shx *= scaleAmount; - tx *= scaleAmount; - shy *= scaleAmount; - sy *= scaleAmount; - ty *= scaleAmount; - } - - void Multiply(AffineTransform m) - { - double t0 = sx * m.sx + shy * m.shx; - double t2 = shx * m.sx + sy * m.shx; - double t4 = tx * m.sx + ty * m.shx + m.tx; - shy = sx * m.shy + shy * m.sy; - sy = shx * m.shy + sy * m.sy; - ty = tx * m.shy + ty * m.sy + m.ty; - sx = t0; - shx = t2; - tx = t4; - } - - public void Invert() - { - double d = DeterminantReciprocal; - - double t0 = sy * d; - sy = sx * d; - shy = -shy * d; - shx = -shx * d; - - double t4 = -tx * t0 - ty * shx; - ty = -tx * shy - ty * sy; - - sx = t0; - tx = t4; - } - - public static AffineTransform operator *(AffineTransform a, AffineTransform b) - { - AffineTransform temp = new AffineTransform(a); - temp.Multiply(b); - return temp; - } - - public void Transform(ref double x, ref double y) - { - double tmp = x; - x = tmp * sx + y * shx + tx; - y = tmp * shy + y * sy + ty; - } - - public void Transform(ref Vec2d pointToTransform) - { - Transform(ref pointToTransform.X, ref pointToTransform.Y); - } - - public void InverseTransform(ref double x, ref double y) - { - double d = DeterminantReciprocal; - double a = (x - tx) * d; - double b = (y - ty) * d; - x = a * sy - b * shx; - y = b * sx - a * shy; - } - - private double DeterminantReciprocal - { - get { return 1.0 / (sx * sy - shy * shx); } - } - - - public double GetScale() - { - double x = 0.707106781 * sx + 0.707106781 * shx; - double y = 0.707106781 * shy + 0.707106781 * sy; - return Math.Sqrt(x * x + y * y); - } - - public bool IsValid(double epsilon) - { - return Math.Abs(sx) > epsilon && Math.Abs(sy) > epsilon; - } - - public double Rotation() - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - Transform(ref x1, ref y1); - Transform(ref x2, ref y2); - return Math.Atan2(y2 - y1, x2 - x1); - } - - public void Translation(out double dx, out double dy) - { - dx = tx; - dy = ty; - } - - public void Scaling(out double x, out double y) - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - AffineTransform t = new AffineTransform(this); - t *= NewRotation(-Rotation()); - t.Transform(ref x1, ref y1); - t.Transform(ref x2, ref y2); - x = x2 - x1; - y = y2 - y1; - } - - public void ScalingAbs(out double x, out double y) - { - x = Math.Sqrt(sx * sx + shx * shx); - y = Math.Sqrt(shy * shy + sy * sy); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFont.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFont.cs deleted file mode 100644 index 766c0c50c7..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFont.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - internal class BDFFont : Font - { - private BDFFontContainer bdfContainer; - private BDFFontMetrics metrics; - - /// - /// The internal constructor for initializing this - /// instance as a loader. - /// - internal BDFFont() : base(true) { } - - internal BDFFont(BDFFontContainer container) - : base(container.getFamily(), container.getStyle(), container.getSize()) - { - bdfContainer = container; - metrics = new BDFFontMetrics(this); - } - - internal BDFFontContainer getContainer() - { - return bdfContainer; - } - - public override System.Collections.Generic.List DefaultFonts - { - get - { - return new System.Collections.Generic.List(); - } - } - - public override string ProviderName - { - get - { - return "Default BDF Font Provider"; - } - } - - public override FontMetrics GetFontMetrics() - { - return metrics; - } - - public override ITextRenderer GetTextRenderer() - { - ITextRenderer renderer = new BDFTextRenderer(this.getContainer()); - return renderer; - } - - public override bool IsSupportedType(Font f) - { - return (f is BDFFont); - } - - public override void Render(Image i, BoundingBox clip, AffineTransform trans, string text, Vec2 loc, Pixel color) - { - GetTextRenderer().Render(i,clip,trans,text,loc,color); - } - - public override Font LoadFont(System.IO.Stream s) - { - BDFFontContainer container = BDFFontContainer.CreateFont(s); - return new BDFFont(container); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontContainer.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontContainer.cs deleted file mode 100644 index 888d5309e1..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontContainer.cs +++ /dev/null @@ -1,530 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class BDFFontContainer - { - public const int FOUNDRY = 0; - public const int FAMILY = 1; - public const int WEIGHT = 2; - public const int SLANT = 3; - public const int SWIDTH = 4; - public const int ADSTYL = 5; - public const int PIXELSIZE = 6; - public const int POINTSIZE = 7; - public const int HORIZONTAL = 8; - public const int VERTICAL = 9; - public const int SPACING = 10; - public const int AVERAGEWIDTH = 11; - public const int REGISTRY = 12; - public const int ENCODING = 13; - - private static Dictionary charMapper = new Dictionary(); - static BDFFontContainer() - { - - #region Setup charMapper - charMapper.Add(".undef", "\u0219"); - charMapper.Add(".null", "\u0000"); - charMapper.Add("space", "\u0020"); - charMapper.Add("exclam", "!"); - charMapper.Add("quotedbl", "\""); - charMapper.Add("numbersign", "#"); - charMapper.Add("dollar", "$"); - charMapper.Add("percent", "%"); - charMapper.Add("ampersand", "&"); - charMapper.Add("quotesingle", "'"); - charMapper.Add("parenleft", "("); - charMapper.Add("parenright", ")"); - charMapper.Add("asterisk", "*"); - charMapper.Add("plus", "+"); - charMapper.Add("comma", ","); - charMapper.Add("hyphen", "-"); - charMapper.Add("period", "."); - charMapper.Add("slash", "/"); - charMapper.Add("one", "1"); - charMapper.Add("two", "2"); - charMapper.Add("three", "3"); - charMapper.Add("four", "4"); - charMapper.Add("five", "5"); - charMapper.Add("six", "6"); - charMapper.Add("seven", "7"); - charMapper.Add("eight", "8"); - charMapper.Add("nine", "9"); - charMapper.Add("zero", "0"); - charMapper.Add("colon", ":"); - charMapper.Add("semicolon", ";"); - charMapper.Add("less", "<"); - charMapper.Add("equal", "="); - charMapper.Add("greater", ">"); - charMapper.Add("question", "?"); - charMapper.Add("at", "@"); - charMapper.Add("bracketleft", "["); - charMapper.Add("backslash", "\u005C"); - charMapper.Add("bracketright", "]"); - charMapper.Add("asciicircum", "^"); - charMapper.Add("underscore", "_"); - charMapper.Add("grave", "`"); - charMapper.Add("braceleft", "{"); - charMapper.Add("bar", "|"); - charMapper.Add("braceright", "}"); - charMapper.Add("asciitilde", "~"); - charMapper.Add("ltshade", "\u00B0"); - charMapper.Add("shade", "\u00B1"); - charMapper.Add("dkshade", "\u00B2"); - charMapper.Add("SF110000", "\u00B3"); - charMapper.Add("SF090000", "\u00B4"); - charMapper.Add("SF190000", "\u00B5"); - charMapper.Add("SF200000", "\u00B6"); - charMapper.Add("SF210000", "\u00B7"); - charMapper.Add("SF220000", "\u00B8"); - charMapper.Add("SF230000", "\u00B9"); - charMapper.Add("SF240000", "\u00BA"); - charMapper.Add("SF250000", "\u00BB"); - charMapper.Add("SF260000", "\u00BC"); - charMapper.Add("SF270000", "\u00BD"); - charMapper.Add("SF280000", "\u00BE"); - charMapper.Add("SF030000", "\u00BF"); - charMapper.Add("SF020000", "\u00C0"); - charMapper.Add("SF070000", "\u00C1"); - charMapper.Add("SF060000", "\u00C2"); - charMapper.Add("SF080000", "\u00C3"); - charMapper.Add("SF100000", "\u00C4"); - charMapper.Add("SF050000", "\u00C5"); - charMapper.Add("SF360000", "\u00C6"); - charMapper.Add("SF370000", "\u00C7"); - charMapper.Add("SF380000", "\u00C8"); - charMapper.Add("SF390000", "\u00C9"); - charMapper.Add("SF400000", "\u00CA"); - charMapper.Add("SF410000", "\u00CB"); - charMapper.Add("SF420000", "\u00CC"); - charMapper.Add("SF430000", "\u00CD"); - charMapper.Add("SF440000", "\u00CE"); - charMapper.Add("SF450000", "\u00CF"); - charMapper.Add("SF460000", "\u00D0"); - charMapper.Add("SF470000", "\u00D1"); - charMapper.Add("SF480000", "\u00D2"); - charMapper.Add("SF490000", "\u00D3"); - charMapper.Add("SF500000", "\u00D4"); - charMapper.Add("SF510000", "\u00D5"); - charMapper.Add("SF520000", "\u00D6"); - charMapper.Add("SF530000", "\u00D7"); - charMapper.Add("SF540000", "\u00D8"); - charMapper.Add("SF040000", "\u00D9"); - charMapper.Add("SF010000", "\u00DA"); - charMapper.Add("block", "\u00DB"); - charMapper.Add("dnblock", "\u00DC"); - charMapper.Add("lfblock", "\u00DD"); - charMapper.Add("rtblock", "\u00DE"); - charMapper.Add("upblock", "\u00DF"); - charMapper.Add("space0", "\u0000"); - charMapper.Add("vga1", "\u0001"); - charMapper.Add("vga2", "\u0002"); - charMapper.Add("vga3", "\u0003"); - charMapper.Add("vga4", "\u0004"); - charMapper.Add("vga5", "\u0005"); - charMapper.Add("vga6", "\u0006"); - charMapper.Add("vga7", "\u0007"); - charMapper.Add("vga8", "\u0008"); - charMapper.Add("vga9", "\u0009"); - charMapper.Add("vga10", "\u000A"); - charMapper.Add("vga11", "\u000B"); - charMapper.Add("vga12", "\u000C"); - charMapper.Add("vga13", "\u000D"); - charMapper.Add("vga14", "\u000E"); - charMapper.Add("vga15", "\u000F"); - charMapper.Add("righttriangle", "\u0010"); - charMapper.Add("lefttriangle", "\u0011"); - charMapper.Add("updownarrow", "\u0012"); - charMapper.Add("vga19", "\u0013"); - charMapper.Add("paragraph", "\u0014"); - charMapper.Add("section", "\u0015"); - charMapper.Add("vga22", "\u0016"); - charMapper.Add("vga23", "\u0017"); - charMapper.Add("uparrow", "\u0018"); - charMapper.Add("downarrow", "\u0019"); - charMapper.Add("vga26", "\u001A"); - charMapper.Add("vga27", "\u001B"); - charMapper.Add("vga28", "\u001C"); - charMapper.Add("vga29", "\u001D"); - charMapper.Add("vga30", "\u001E"); - charMapper.Add("vga31", "\u001F"); - charMapper.Add("apostrophe", "\u0027"); - charMapper.Add("minus", "\u002D"); - charMapper.Add("vga127", "\u007F"); - charMapper.Add("Ccedilla", "\u0080"); - charMapper.Add("udiaeresis", "\u0081"); - charMapper.Add("eacute", "\u0082"); - charMapper.Add("acircumflex", "\u0083"); - charMapper.Add("adiaeresis", "\u0084"); - charMapper.Add("agrave", "\u0085"); - charMapper.Add("aring", "\u0086"); - charMapper.Add("ccedilla", "\u0087"); - charMapper.Add("ecircumflex", "\u0088"); - charMapper.Add("ediaeresis", "\u0089"); - charMapper.Add("egrave", "\u008A"); - charMapper.Add("idiaeresis", "\u008B"); - charMapper.Add("icircumflex", "\u008C"); - charMapper.Add("igrave", "\u008D"); - charMapper.Add("Adiaeresis", "\u008E"); - charMapper.Add("Aring", "\u008F"); - charMapper.Add("Eacute", "\u0090"); - charMapper.Add("ae", "\u0091"); - charMapper.Add("AE", "\u0092"); - charMapper.Add("ocircumflex", "\u0093"); - charMapper.Add("odiaeresis", "\u0094"); - charMapper.Add("ograve", "\u0095"); - charMapper.Add("ucircumflex", "\u0096"); - charMapper.Add("ugrave", "\u0097"); - charMapper.Add("ydiaeresis", "\u0098"); - charMapper.Add("Odiaeresis", "\u0099"); - charMapper.Add("Udiaeresis", "\u009A"); - charMapper.Add("cent", "\u009B"); - charMapper.Add("sterling", "\u009C"); - charMapper.Add("yen", "\u009D"); - charMapper.Add("vga158", "\u009E"); - charMapper.Add("vga159", "\u009F"); - charMapper.Add("aacute", "\u00A0"); - charMapper.Add("iacute", "\u00A1"); - charMapper.Add("oacute", "\u00A2"); - charMapper.Add("uacute", "\u00A3"); - charMapper.Add("vga164", "\u00A4"); - charMapper.Add("vga165", "\u00A5"); - charMapper.Add("vga166", "\u00A6"); - charMapper.Add("vga167", "\u00A7"); - charMapper.Add("questiondown", "\u00A8"); - charMapper.Add("hook", "\u00A9"); - charMapper.Add("notsign", "\u00AA"); - charMapper.Add("onehalf", "\u00AB"); - charMapper.Add("onequarter", "\u00AC"); - charMapper.Add("exclamdown", "\u00AD"); - charMapper.Add("guillemotleft", "\u00AE"); - charMapper.Add("guillemotright", "\u00AF"); - charMapper.Add("raster1", "\u00B0"); - charMapper.Add("raster2", "\u00B1"); - charMapper.Add("raster3", "\u00B2"); - charMapper.Add("udline", "\u00B3"); - charMapper.Add("udlline", "\u00B4"); - charMapper.Add("udLline", "\u00B5"); - charMapper.Add("UDlline", "\u00B6"); - charMapper.Add("Dlline", "\u00B7"); - charMapper.Add("dLline", "\u00B8"); - charMapper.Add("UDLline", "\u00B9"); - charMapper.Add("UDline", "\u00BA"); - charMapper.Add("DLline", "\u00BB"); - charMapper.Add("ULline", "\u00BC"); - charMapper.Add("Ulline", "\u00BD"); - charMapper.Add("uLline", "\u00BE"); - charMapper.Add("dlline", "\u00BF"); - charMapper.Add("urlline", "\u00C1"); - charMapper.Add("rdlline", "\u00C2"); - charMapper.Add("urdline", "\u00C3"); - charMapper.Add("rlline", "\u00C4"); - charMapper.Add("urdlline", "\u00C5"); - charMapper.Add("uRdline", "\u00C6"); - charMapper.Add("UrDline", "\u00C7"); - charMapper.Add("URline", "\u00C8"); - charMapper.Add("RDline", "\u00C9"); - charMapper.Add("URLline", "\u00CA"); - charMapper.Add("RDLline", "\u00CB"); - charMapper.Add("URDline", "\u00CC"); - charMapper.Add("RLline", "\u00CD"); - charMapper.Add("URDLline", "\u00CE"); - charMapper.Add("uRLline", "\u00CF"); - charMapper.Add("Urlline", "\u00D0"); - charMapper.Add("RdLline", "\u00D1"); - charMapper.Add("rDlline", "\u00D2"); - charMapper.Add("Urline", "\u00D3"); - charMapper.Add("uRline", "\u00D4"); - charMapper.Add("Rdline", "\u00D5"); - charMapper.Add("rDline", "\u00D6"); - charMapper.Add("UrDlline", "\u00D7"); - charMapper.Add("uRdLline", "\u00D8"); - charMapper.Add("urline", "\u00D9"); - charMapper.Add("rdline", "\u00DA"); - charMapper.Add("fullblock", "\u00DB"); - charMapper.Add("bottomblock", "\u00DC"); - charMapper.Add("leftblock", "\u00DD"); - charMapper.Add("rightblock", "\u00DE"); - charMapper.Add("topblock", "\u00DF"); - charMapper.Add("vga224", "\u00E0"); - charMapper.Add("vga225", "\u00E1"); - charMapper.Add("vga226", "\u00E2"); - charMapper.Add("vga227", "\u00E3"); - charMapper.Add("vga228", "\u00E4"); - charMapper.Add("vga229", "\u00E5"); - charMapper.Add("vga230", "\u00E6"); - charMapper.Add("vga231", "\u00E7"); - charMapper.Add("vga232", "\u00E8"); - charMapper.Add("vga233", "\u00E9"); - charMapper.Add("vga234", "\u00EA"); - charMapper.Add("vga235", "\u00EB"); - charMapper.Add("vga236", "\u00EC"); - charMapper.Add("vga237", "\u00ED"); - charMapper.Add("vga238", "\u00EE"); - charMapper.Add("vga239", "\u00EF"); - charMapper.Add("isequal", "\u00F0"); - charMapper.Add("plusminus", "\u00F1"); - charMapper.Add("vga242", "\u00F2"); - charMapper.Add("vga243", "\u00F3"); - charMapper.Add("vga244", "\u00F4"); - charMapper.Add("vga245", "\u00F5"); - charMapper.Add("division", "\u00F6"); - charMapper.Add("vga247", "\u00F7"); - charMapper.Add("degree", "\u00F8"); - charMapper.Add("smalldot", "\u00F9"); - charMapper.Add("smallerdot", "\u00FA"); - charMapper.Add("vga251", "\u00FB"); - charMapper.Add("vga252", "\u00FC"); - charMapper.Add("twosuperior", "\u00FD"); - charMapper.Add("bullet", "\u00FE"); - charMapper.Add("space255", "\u00FF"); - charMapper.Add("currency", "\u00A4"); - charMapper.Add("brokenbar", "\u00A6"); - charMapper.Add("nonbreakingspace", "\u00A0"); - charMapper.Add("dieresis", "\u0308"); - charMapper.Add("copyright", "\u00A9"); - charMapper.Add("ordfeminine", "\u00AA"); - charMapper.Add("logicalnot", "\u00AC"); - #endregion - - } - - private FontStyle style = FontStyle.Normal; - - public static BDFFontContainer CreateFont(Stream r) - { - BDFParser parser = new BDFParser(r); - return parser.CreateFont(); - } - - public static int fill(int num) - { - return (1 << num + 1) - 1; - } - - - - private BDFParser.Rectangle boundingBox = new BDFParser.Rectangle(); - - private String[] comments; - - private int contentVersion; - - private int depth = 1; - - private String[] fontName; - - private BDFGlyph[] glyphMapper = new BDFGlyph[ushort.MaxValue]; - - private BDFGlyph NotDefGlyph; - - private Dictionary UnknownGlyphs = new Dictionary(); - - private BDFGlyph[] glyphs; - - private String[] properties; - - private BDFParser.Dimension resolution = new BDFParser.Dimension(); - - private BDFParser.Version version = new BDFParser.Version(); - - private String postScriptName; - - private int size; - - private String family; - - public BDFFontContainer(String[] name, FontStyle style, int size) - { - postScriptName = GetPostScriptName(name); - this.style = style; - this.size = size; - this.family = name[FAMILY]; - fontName = name; - } - - public String getName() - { - return postScriptName; - } - - public String getFamily() - { - return family; - } - - public BDFParser.Rectangle getBoundingBox() - { - return boundingBox; - } - - public FontStyle getStyle() - { - return style; - } - - public String[] getComments() - { - return comments; - } - - public int getContentVersion() - { - return contentVersion; - } - - public int getDepth() - { - return depth; - } - - public int getSize() - { - return size; - } - - public BDFMetrics getFontMetrics() - { - return new BDFMetrics(this); - } - - public BDFGlyph getGlyph(char ch) - { - BDFGlyph g = glyphMapper[(ushort)ch]; - if (g == null) - { - g = NotDefGlyph; - } - return g; - } - - public BDFGlyph[] getGlyphs() - { - return glyphs; - } - - public String[] getProperties() - { - return properties; - } - - public BDFParser.Dimension getResolution() - { - return resolution; - } - - public BDFParser.Version getVersion() - { - return version; - } - - public void setBoundingBox(int x, int y, int width, int height) - { - boundingBox.setBounds(x, y, width, height); - } - - public void setBoundingBox(BDFParser.Rectangle boundingBox) - { - this.boundingBox = boundingBox; - } - - public void setCharCount(int count) - { - glyphs = new BDFGlyph[count]; - } - - public void setComments(String[] comments) - { - this.comments = comments; - } - - public void setContentVersion(int version) - { - this.contentVersion = version; - } - - public void setDepth(int depth) - { - this.depth = depth; - } - - public void setGlyphs(BDFGlyph[] glyphs) - { - this.glyphs = glyphs; - for (int i = 0; i < glyphs.Length; i++) - { - glyphs[i].init(this); - if (glyphs[i].encoding != -1) - { - glyphMapper[glyphs[i].encoding] = glyphs[i]; - } - else - { - if (glyphs[i].name.ToLower() == ".notdef") - { - NotDefGlyph = glyphs[i]; - } - else - { - UnknownGlyphs.Add(glyphs[i].name, glyphs[i]); - } - } - } - } - - public void setMetricsSet(int set) - { - } - - public void setProperties(String[] properties) - { - this.properties = properties; - } - - public void setResolution(BDFParser.Dimension resolution) - { - this.resolution = resolution; - } - - public void setResolution(int xres, int yres) - { - resolution.setSize(xres, yres); - } - - public void setVersion(BDFParser.Version version) - { - this.version = version; - } - - public void setVersion(int major, int minor) - { - version.setVersion(major, minor); - } - - public static String GetPostScriptName(String[] str) - { - String strng = ""; - for (int i = 0; i < str.Length; i++) - { - strng += "-"; - strng += str[i]; - } - return strng; - } - - public override String ToString() - { - String styleStr = ((style & FontStyle.Bold) != 0 ? "Bold " : "") + ((style & FontStyle.Italic) != 0 ? "Italic" : ""); - - if ("" == styleStr) - { - styleStr = "Normal"; - } - - return "BDFFontContainer [name=" + fontName[FAMILY] + ", style=" + styleStr + ", size=" + size + "pt, depth=" + depth + "bpp]"; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontMetrics.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontMetrics.cs deleted file mode 100644 index a3aa61096b..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFFontMetrics.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - internal class BDFFontMetrics : FontMetrics - { - private readonly BDFMetrics metrics; - - public BDFFontMetrics(BDFFont font) - : base(font) - { - this.metrics = font.getContainer().getFontMetrics(); - } - - public override int GetHeight() - { - return metrics.getHeight(); - } - - public override int GetAscent() - { - return metrics.getAscent(); - } - - public override int GetDescent() - { - return metrics.getDescent(); - } - - public override int GetLeading() - { - return metrics.getLeading(); - } - - public override int GetMaxAdvance() - { - return metrics.getMaxAdvance(); - } - - public override int CharWidth(char ch) - { - return metrics.charWidth(ch); - } - - public override int[] CharsWidths(char[] chars, int start, int len) - { - return metrics.charsWidths(chars, start, len); - } - - public override int CharsWidth(char[] chars, int start, int len) - { - return metrics.charsWidth(chars, start, len); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFGlyph.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFGlyph.cs deleted file mode 100644 index 9d8b3cd620..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFGlyph.cs +++ /dev/null @@ -1,147 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class BDFGlyph - { - public String name; - public BDFParser.Rectangle bbx = new BDFParser.Rectangle(); - public int[] data; - public int encoding; - public String rawData; - private BDFFontContainer font; - public int[] decode(int depth, String data) - { - int[] result = new int[(data.Length / 2) * (8 / depth)]; - - - for (int i = 0, offset = 0; i < data.Length; i += 2, offset += (8 / depth)) - { - String cut = data.Substring(i, 2); - int value = int.Parse(cut, System.Globalization.NumberStyles.AllowHexSpecifier); - int[] bits = null; - switch (depth) - { - case 1: - bits = new int[] { - (value & 0x80) >> 7, - (value & 0x40) >> 6, - (value & 0x20) >> 5, - (value & 0x10) >> 4, - (value & 0x08) >> 3, - (value & 0x04) >> 2, - (value & 0x02) >> 1, - (value & 0x01), - }; - break; - case 2: - bits = new int[] { - (value & 0xC0) >> 6, - (value & 0x30) >> 4, - (value & 0x0C) >> 2, - (value & 0x03), - }; - break; - case 4: - bits = new int[] { - (value & 0xF0) >> 4, - (value & 0x0F), - }; - break; - case 8: - bits = new int[] { - value & 0xFF, - }; - break; - } - - for (int k = 0; k < bits.Length; k++) - result[offset + k] = bits[k]; - } - - return result; - } - - public BDFParser.Rectangle getBbx() - { - return new BDFParser.Rectangle(bbx); - } - - public BDFParser.Rectangle getBbx(BDFParser.Rectangle rec) - { - rec.x = bbx.x; - rec.y = bbx.y; - rec.width = bbx.width; - rec.height = bbx.height; - return rec; - } - - public void init(BDFFontContainer font) - { - this.font = font; - this.data = decode(getFont().getDepth(), rawData); - rawData = null; - } - - public void setBbx(BDFParser.Rectangle bbx) - { - this.bbx = bbx; - } - - public int[] getData() - { - return data; - } - - public void setRawData(String rawData) - { - this.rawData = rawData; - } - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public BDFFontContainer getFont() - { - return font; - } - - public BDFGlyph(String name) - { - this.name = name; - } - - public void setSWidth(int swx0, int swy0) - { - } - - private BDFParser.Dimension dsize = new BDFParser.Dimension(); - - public void setDWidth(int dwx0, int dwy0) - { - dsize.setSize(dwx0, dwy0); - } - - public BDFParser.Dimension getDWidth() - { - return dsize; - } - - public void setBBX(int x, int y, int width, int height) - { - bbx.setBounds(x, y, width, height); - } - - public override String ToString() - { - return "BDFGlyph[name=" + name + ", bbx=" + bbx + ", dsize=" + dsize + "]"; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFMetrics.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFMetrics.cs deleted file mode 100644 index 098d70425e..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFMetrics.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class BDFMetrics - { - private BDFFontContainer font; - private BDFParser.Rectangle box; - - public BDFMetrics(BDFFontContainer font) - { - this.font = font; - this.box = font.getBoundingBox(); - } - - public int getAscent() - { - return box.height - getDescent(); - } - - public int getDescent() - { - return Math.Abs(box.y); - } - - public int getLeading() - { - return Math.Abs(box.x); - } - - public int getMaxAdvance() - { - return box.width; - } - - public int getHeight() - { - return box.height; - } - - public int charWidth(char ch) - { - BDFGlyph g = font.getGlyph(ch); - if (g != null) - { - BDFParser.Rectangle r = g.getBbx(); - r.width = (r.width + 1) & ~1; - return r.width; - } - return 0; - } - - public int[] charsWidths(char[] chars, int start, int length) - { - int[] advances = new int[length]; - int adv_idx = 0; - - for (int i = start; i < start + length; i++) - { - BDFGlyph glyph = font.getGlyph(chars[i]); - if (adv_idx == 0) - { - advances[adv_idx++] = glyph.getDWidth().width; - } - else - { - advances[adv_idx++] = advances[adv_idx - 1] + glyph.getDWidth().width; - } - } - - return advances; - } - - public int charsWidth(char[] chars, int start, int end) - { - int total = 0; - int[] lengths = charsWidths(chars, start, end); - for (int i = 0; i < lengths.Length; i++) - total += lengths[i]; - - return total; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFParser.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFParser.cs deleted file mode 100644 index 8ce7ddc14c..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFParser.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections; -using System.IO; -using System.Text.RegularExpressions; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class BDFParser - { - #region Dep classes - public class Dimension - { - public int width, height; - public void setSize(int w, int h) - { - width = w; - height = h; - } - } - - public class Rectangle - { - public int x, y, width, height; - - public Rectangle() { } - public Rectangle(Rectangle rect) - { - setBounds(rect.x, rect.y, rect.width, rect.height); - } - - public void setBounds(int x, int y, int w, int h) - { - this.x = x; - this.y = y; - this.width = w; - this.height = h; - } - } - - public class Version - { - private int major; - private int minor; - - public Version() - { - } - - public void setVersion(int major, int minor) - { - this.major = major; - this.minor = minor; - } - - public int getMajor() - { - return major; - } - - public int getMinor() - { - return minor; - } - - public String toString() - { - return major + "." + minor; - } - } - #endregion - - StreamReader inStream; - - #region Actual Implementation - public BDFFontContainer CreateFont() - { - return LoadFont(); - } - - public BDFFontContainer LoadFont() - { - BDFFontContainer font = null; - int[] version = null; - List comments = new List(); - String[] fontName = null; - int[] size = null; - int[] bBox = null; - int contentVersion = 0; - int metrics = 0; - List properties = new List(); - List chars = new List(); - FontStyle style = FontStyle.Normal; - string s = ""; - - s = inStream.ReadLine(); - if (s.Substring(0, 9).ToLower() == "startfont") - { - version = new int[2]; - version[0] = int.Parse(s.Substring(10, 1)); - version[1] = int.Parse(s.Substring(12, 1)); - } - else - { - throw new Exception("Unable to find start of the font"); - } - while (!inStream.EndOfStream) - { - System.GC.Collect(); - s = inStream.ReadLine(); - if (s.Length > 4) - { - if (s.Substring(0, 4).ToLower() == "size") - { - string[] s2 = s.Substring(5).Split(new char[] { ' ' }); - size = new int[4]; - if (s2.Length == 3) - { - size[3] = 1; - } - else - { - size[3] = int.Parse(s2[3]); - } - size[0] = int.Parse(s2[0]); - size[1] = int.Parse(s2[1]); - size[2] = int.Parse(s2[2]); - continue; - } - else if (s.Substring(0, 4).ToLower() == "font") - { - if (s.Substring(4, 1) == " ") // font command - { - fontName = new string[14]; - String[] split = s.Trim().Split(new char[] { '-' }); - Array.Copy(split, 1, fontName, 0, split.Length - 2); - continue; - } - else if (s.Length > 15) - { - if (s.Substring(0, 15).ToLower() == "fontboundingbox") - { - string[] s2 = s.Substring(16).Split(new char[] { ' ' }); - bBox = new int[4]; - if (s2.Length != 4) - { - throw new Exception("Unknown formatting!"); - } - bBox[0] = int.Parse(s2[0]); - bBox[1] = int.Parse(s2[1]); - bBox[2] = int.Parse(s2[2]); - bBox[3] = int.Parse(s2[3]); - continue; - } - } - } - else if (s.Length > 5) - { - if (s.Substring(0, 5).ToLower() == "chars") - { - int chrs = int.Parse(s.Substring(6)); - StringBuilder sb; - - for (uint i = 0; i < chrs; i++) - { - System.GC.Collect(); - s = inStream.ReadLine(); - BDFGlyph g = null; - - if (s.Length < 9 || s.Substring(0, 9).ToLower() != "startchar") - { - throw new Exception("Expected StartChar, but didn't get it"); - } - g = new BDFGlyph(s.Substring(10)); - while (true) - { - s = inStream.ReadLine(); - if (s.Length > 3) - { - if (s.Substring(0, 3).ToLower() == "bbx") - { - string[] strs = s.Substring(4).Split(new char[] { ' ' }); - if (strs.Length != 4) - { - throw new Exception("Error when loading bbx!"); - } - g.setBBX(int.Parse(strs[2]), int.Parse(strs[3]), int.Parse(strs[0]), int.Parse(strs[1])); - continue; - } - else if (s.Length >= 6) - { - if (s.Substring(0, 6).ToLower() == "swidth") - { - string[] s2 = s.Substring(7).Split(new char[] { ' ' }); - if (s2.Length != 2) - { - throw new Exception("Error when loading swidth!"); - } - g.setSWidth(int.Parse(s2[0]), int.Parse(s2[1])); - continue; - } - else if (s.Substring(0, 6).ToLower() == "dwidth") - { - string[] s2 = s.Substring(7).Split(new char[] { ' ' }); - if (s2.Length != 2) - { - throw new Exception("Error when loading dwidth!"); - } - g.setDWidth(int.Parse(s2[0]), int.Parse(s2[1])); - continue; - } - else if (s.Substring(0, 6).ToLower() == "bitmap") - { - s = inStream.ReadLine(); - sb = new StringBuilder(200); - if (s.Length == 2) - { - while (s.Length == 2) - { - sb.Append(s); - s = inStream.ReadLine(); - } - } - else if (s.Length == 4) - { - while (s.Length == 4) - { - sb.Append(s); - s = inStream.ReadLine(); - } - } - else - { - throw new Exception("Unknown depth"); - } - - g.setRawData(sb.ToString()); - if (s.ToLower() != "endchar") - { - throw new Exception("Unknown end to the bitmap"); - } - break; - } - else if (s.Length > 7) - { - if (s.Substring(0, 7).ToLower() == "vvector") - { - // We don't take this into account. - continue; - } - else if (s.Substring(0, 7).ToLower() == "dwidth1") - { - // We don't take this into account. - continue; - } - else if (s.Substring(0, 7).ToLower() == "swidth1") - { - // We don't take this into account. - continue; - } - else if (s.Substring(0, 7).ToLower() == "endchar") - { - throw new Exception("ERROR: Character didn't include a bitmap!"); - } - else if (s.Length > 8) - { - if (s.Substring(0, 8).ToLower() == "encoding") - { - g.encoding = int.Parse(s.Substring(9)); - continue; - } - } - } - } - } - throw new Exception("Unknown Property"); - } - chars.Add(g); - } - - if (inStream.ReadLine().ToLower() != "endfont") - { - throw new Exception("Error when loading chars, missing endfont message."); - } - break; - } - else if (s.Length > 7) - { - if (s.Substring(0, 7).ToLower() == "comment") - { - comments.Add(s.Substring(9, (s.Length - 10))); - continue; - } - else if (s.Length > 10) - { - if (s.Substring(0, 10).ToLower() == "metricset") - { - metrics = int.Parse(s.Substring(11,1)); - continue; - } - else if (s.Length > 14) - { - if (s.Substring(0, 14).ToLower() == "contentversion") - { - contentVersion = int.Parse(s.Substring(15)); - continue; - } - else if (s.Length > 15) - { - if (s.Substring(0, 15).ToLower() == "startproperties") - { - int props = int.Parse(s.Substring(16)); - for (uint i = 0; i < props; i++) - { - properties.Add(inStream.ReadLine()); - } - s = inStream.ReadLine(); - if (s.ToLower() != "endproperties") - { - throw new Exception("An error occured while loading properties!"); - } - continue; - } - } - } - } - } - } - } - throw new Exception("Unknown command"); - } - - if ("i".Equals(fontName[BDFFontContainer.SLANT], StringComparison.InvariantCultureIgnoreCase) || - "o".Equals(fontName[BDFFontContainer.SLANT], StringComparison.InvariantCultureIgnoreCase)) - { - style = FontStyle.Italic; - } - if ("bold".Equals(fontName[BDFFontContainer.WEIGHT], StringComparison.InvariantCultureIgnoreCase)) - style |= FontStyle.Bold; - - font = new BDFFontContainer(fontName, style, size[0]); - font.setBoundingBox(bBox[0], bBox[1], bBox[2], bBox[3]); - font.setResolution(size[1], size[2]); - font.setComments(comments.ToArray()); - font.setProperties(properties.ToArray()); - - if (size != null && size.Length == 4) - font.setDepth(size[3]); - - font.setGlyphs(chars.ToArray()); - return font; - } - #endregion - - - public BDFParser(System.IO.Stream stream) - { - inStream = new StreamReader(stream, System.Text.ASCIIEncoding.ASCII); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFTextRenderer.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFTextRenderer.cs deleted file mode 100644 index ddd2d36128..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/BDFTextRenderer.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class BDFTextRenderer : ITextRenderer - { - private BDFFontContainer bdfFont; - - public BDFTextRenderer(BDFFontContainer BdfFont) - { - this.bdfFont = BdfFont; - } - - public override void Render(Image im, BoundingBox clip, AffineTransform tx, string text, Vec2 loc, Pixel color) - { - if (text == null || text.Length == 0) - return; - - int offset = 0, - x = 0, y = 0, - bdfFontDepth = bdfFont.getDepth(), - x_min = int.MaxValue, - y_min = int.MaxValue, - x_max = int.MinValue, - y_max = int.MinValue, - charsCount = text.Length, - fHeight, scan, fg_r, fg_g, - fg_b, bx, by, offsetLine, - fPixel, px, py, bg_r, - bg_g, bg_b, r, g, b - ; - int[] fData; - Vec2 src, dst; - BDFParser.Rectangle glyph_box = new BDFParser.Rectangle(); - BDFGlyph glyph; - Image img; - - if ((bdfFont != null) && (charsCount > 0)) - { - char[] chrs = text.ToCharArray(); - int mH = 0; - int mY = 0; - int mxY = 0; - int tW = 0; - int tH = 0; - for (uint m = 0; m < text.Length; m++) - { - glyph = bdfFont.getGlyph(chrs[m]); - glyph_box = glyph.getBbx(glyph_box); - if (glyph_box.height > mH) - { - mH = glyph_box.height + 2; - } - if (glyph_box.y < mY) - { - mY = glyph_box.y; - } - if (glyph_box.y > mxY) - { - mxY = glyph_box.y; - } - tW += glyph_box.width + glyph_box.x + 2; - } - - tH = mH + (mxY - mY); - y = mH + -mY; - img = new Image(tW, tH); - - - float f_max = (1 << bdfFontDepth) - 1; - if (f_max == 0) - f_max = 1; - - glyph_box = new BDFParser.Rectangle(); - src = new Vec2(); - dst = new Vec2(); - - for (int i = 0; i < charsCount; i++) - { - glyph = bdfFont.getGlyph(chrs[i]); - if (glyph == null) - { - continue; - } - - glyph_box = glyph.getBbx(glyph_box); - - fHeight = glyph_box.height; - fData = glyph.getData(); - scan = fData.Length / fHeight; - - fg_r = color.R; - fg_g = color.G; - fg_b = color.B; - - //box location - bx = x + offset + glyph_box.x; - by = y - fHeight - glyph_box.y; - - for (int k = 0; k < fHeight; k++) - { - offsetLine = k * scan; - for (int j = 0; j < scan; j++) - { - fPixel = fData[offsetLine + j]; - if (fPixel != 0) - { - - //pixel location - px = bx + j; - py = by + k; - - if (tx != null) - { - //src.setLocation(px, py); - //tx.transform(src, dst); -#warning TODO: Add support for this. - //px = dst.X; - //py = dst.Y; - } - - //clip - if (clip == null || clip.Contains(px, py)) - { - //compute color - Pixel bg_color = img.GetPixel((uint)px, (uint)py); - - bg_r = bg_color.R; - bg_g = bg_color.G; - bg_b = bg_color.B; - - //todo improve this pixel composition - - float alpha = fPixel / f_max; - - r = bg_r + ((int)((fg_r - bg_r) * alpha)) & 0xFF; - g = bg_g + ((int)((fg_g - bg_g) * alpha)) & 0xFF; - b = bg_b + ((int)((fg_b - bg_b) * alpha)) & 0xFF; - - Pixel nw = new Pixel((byte)r, (byte)g, (byte)b, 255); - - img.SetPixel((uint)px, (uint)py, nw); - - if (x_min > px) - x_min = px; - if (y_min > py) - y_min = py; - if (x_max < px) - x_max = px; - if (y_max < py) - y_max = py; - } - } - } - } - offset += glyph.getDWidth().width; - } - //img = ImageManipulator.Resize(img, new Vec2(img.Width * 8, img.Height * 8), ImageManipulator.ScalingAlgorithm.Bicubic); - //img = ImageManipulator.Resize(img, Vec2.Zero, ImageManipulator.ScalingAlgorithm.Hq2x); - //img = ImageManipulator.Resize(img, Vec2.Zero, ImageManipulator.ScalingAlgorithm.Hq4x); - im.DrawImage(loc, img); - } - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/StringBuilder.cs b/Users/Orvid/Orvid.Graphics/FontSupport/bdf/StringBuilder.cs deleted file mode 100644 index 59f464d516..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/bdf/StringBuilder.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.bdf -{ - public class StringBuilder - { - /// - /// The internal private copy of the string - /// - private char[] _storedString; - /// - /// The number of allocated characters - /// - private int lngAllocated; - /// - /// The number of used characters - /// - private int lngUsed; - /// - /// Number of characters to allocated with an increase - /// - private int lngAllocSize; - - /// - /// Get the length of the string - /// - public int Length - { - get { return lngUsed; } - } - - /// - /// The default constructor for the class - /// - /// Sets the allocation size to 1000 - public StringBuilder() - { - lngAllocSize = 1000; - lngAllocated = lngAllocSize; - _storedString = new char[lngAllocSize]; - } - - /// - /// The constructor used to set the initial value of the string - /// - /// Sets the allocation size to 1000 - public StringBuilder(string InitialValue) - { - lngAllocSize = 1000; - lngAllocated = lngAllocSize; - _storedString = new char[lngAllocSize]; - - Append(InitialValue); - } - - /// - /// Constructor used to define a custom allocation size - /// - /// The size of every allocation - public StringBuilder(int AllocationSize) - { - lngAllocSize = AllocationSize; - lngAllocated = lngAllocSize; - _storedString = new char[lngAllocSize]; - } - - /// - /// The constructor used to set the initial value of the string - /// - /// The initial value of the string - /// The size of every allocation - public StringBuilder(string InitialValue, int AllocationSize) - { - lngAllocSize = AllocationSize; - lngAllocated = lngAllocSize; - _storedString = new char[lngAllocSize]; - Append(InitialValue); - } - - /// - /// Append a string to the internal string - /// - /// The string to be appended - public void Append(string StringToAppend) - { - int lngLength; - int lngToAllocate; - - lngLength = StringToAppend.Length; - - if (lngLength > 0) - { - if (lngLength + lngUsed > lngAllocated) - { - throw new Exception(); - lngToAllocate = lngAllocSize * (1 + (lngUsed + lngLength - lngAllocated) / lngAllocSize); - lngAllocated += lngToAllocate; - - _storedString = ResizeArray(_storedString, lngAllocated); - } - int counter = 0; - foreach (char c in StringToAppend) - { - _storedString[lngUsed + counter] = c; - counter++; - } - - lngUsed += lngLength; - } - - } - - /// - /// Overwrite the string with the specified string - /// - /// The new string value of the string - public void Overwrite(string StringToWrite) - { - Clear(); - Append(StringToWrite); - } - - /// - /// Get the string - /// - /// The string that has been built - public override string ToString() - { - string returnString = new string(_storedString, 0, lngUsed); - return returnString; - } - - /// - /// Clear the string from memory - /// - public void Clear() - { - _storedString = null; - lngUsed = 0; - lngAllocated = lngAllocSize; - _storedString = new char[lngAllocSize]; - } - - /// - /// Resize the internal array - /// - /// The old array to resize - /// The new size of the expanded array - /// a New bigger array with all the contents of the old array - private char[] ResizeArray(System.Array oldArray, int newSize) - { - char[] newArray = new char[newSize]; - Array.Copy(oldArray, newArray, oldArray.Length); - - return newArray; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntFont.cs b/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntFont.cs deleted file mode 100644 index d8141923c8..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntFont.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.fnt -{ - internal class FntFont : Font - { - private FntLoader ldr; - private FntFontMetrics metrics; - - /// - /// The constructor for the loader. - /// - public FntFont() : base(true) { } - - public FntFont(FntLoader loadr) - : base(loadr.GetFamily(), loadr.GetStyle(), loadr.GetSize()) - { - ldr = loadr; - metrics = new FntFontMetrics(this); - } - - public FntLoader GetLoader() - { - return ldr; - } - - public Rectangle GetBounds() - { - Rectangle r = new Rectangle(); - r.SetBounds(0, ldr.Ascent, ldr.MaxWidth, ldr.PixHeight); - return r; - } - - public override FontMetrics GetFontMetrics() - { - return metrics; - } - - public override ITextRenderer GetTextRenderer() - { - return new FntTextRenderer(ldr); - } - - public override bool IsSupportedType(Font f) - { - return (f is FntFont); - } - - public override Font LoadFont(System.IO.Stream s) - { - FntLoader l = new FntLoader(); - l.Load(s); - return new FntFont(l); - } - - public override void Render(Image i, BoundingBox clip, AffineTransform trans, string text, Vec2 loc, Pixel color) - { - GetTextRenderer().Render(i,clip,trans,text,loc,color); - } - - public override string ProviderName - { - get - { - return "Default Fnt Font Provider"; - } - } - - public override System.Collections.Generic.List DefaultFonts - { - get - { - return new System.Collections.Generic.List(); - } - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntGlyph.cs b/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntGlyph.cs deleted file mode 100644 index 96d6305e35..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntGlyph.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.fnt -{ - internal enum FntGlyphType - { - Fixed, - Proportional, - ABCFixed, - ABCProportional, - Color1, - Color16, - Color256, - ColorRGB, - Version2, - } - - internal class FntGlyph - { - private Rectangle bounds; - public FntLoader Font; - public int Height; - public int Width; - public byte[] RawData; - public int[] Data; - public FntGlyphType Type; - - public Rectangle GetBounds() - { - return new Rectangle(bounds); - } - - /// - /// Processes the raw data into a usable form. - /// - public void Initialize() - { - bounds = new Rectangle(); - bounds.SetBounds(0,0,Width,Height); - switch (Type) - { - case FntGlyphType.Version2: - case FntGlyphType.Color1: - uint RowBytes = (uint)((Width + 7) >> 3); - uint RowBits = (uint)Math.Floor((double)Width * .125) + (uint)(Width % 8); - Data = new int[Height * Width]; - byte value; - for (int y = 0, im = 0; y < Height; y++) - { - for (int x = 0, xbits = 0; x < RowBytes; x++) - { - value = RawData[(y * RowBytes) + x]; - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x80) >> 7); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x40) >> 6); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x20) >> 5); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x10) >> 4); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x08) >> 3); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x04) >> 2); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x02) >> 1); - xbits++; - im++; - } - else - { - break; - } - if (xbits < RowBits) - { - Data[im] = (byte)((value & 0x01) ); - xbits++; - im++; - } - else - { - break; - } - } - } - break; - //case 2: - // bits = new int[] { - // (value & 0xC0) >> 6, - // (value & 0x30) >> 4, - // (value & 0x0C) >> 2, - // (value & 0x03), - //}; - // break; - //case 4: - // bits = new int[] { - // (value & 0xF0) >> 4, - // (value & 0x0F), - //}; - // break; - //case 8: - // bits = new int[] { - // value & 0xFF, - //}; - // break; - } - RawData = null; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntLoader.cs b/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntLoader.cs deleted file mode 100644 index 6c5c38affe..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntLoader.cs +++ /dev/null @@ -1,573 +0,0 @@ -// Reference: http://support.microsoft.com/kb/65123 -using System; -using System.IO; -using System.Collections.Generic; - -namespace Orvid.Graphics.FontSupport.fnt -{ - internal class FntLoader - { - #region Fields - /// - /// 2 bytes specifying the version (0200H or 0300H) of - /// the file. - /// - public ushort Version; - /// - /// 4 bytes specifying the total size of the file in - /// bytes. - /// - public uint FileSize; - /// - /// 60 bytes specifying copyright information. - /// - public string Copyright; - /// - /// 2 bytes specifying the type of font file. - /// - /// The low-order byte is exclusively for GDI use. If the - /// low-order bit of the WORD is zero, it is a bitmap - /// (raster) font file. If the low-order bit is 1, it is a - /// vector font file. The second bit is reserved and must - /// be zero. If no bits follow in the file and the bits are - /// located in memory at a fixed address specified in - /// dfBitsOffset, the third bit is set to 1; otherwise, the - /// bit is set to 0 (zero). The high-order bit of the low - /// byte is set if the font was realized by a device. The - /// remaining bits in the low byte are reserved and set to - /// zero. - /// - /// The high byte is reserved for device use and will - /// always be set to zero for GDI-realized standard fonts - /// Physical fonts with the high-order bit of the low byte - /// set may use this byte to describe themselves. GDI will - /// never inspect the high byte. - /// - public ushort Type; - /// - /// 2 bytes specifying the nominal point size at which - /// this character set looks best. - /// - public ushort PointSize; - /// - /// 2 bytes specifying the nominal vertical resolution - /// (dots-per-inch) at which this character set was - /// digitized. - /// - public ushort VertDpi; - /// - /// 2 bytes specifying the nominal horizontal resolution - /// (dots-per-inch) at which this character set was - /// digitized. - /// - public ushort HorizDpi; - /// - /// 2 bytes specifying the distance from the top of a - /// character definition cell to the baseline of the - /// typographical font. It is useful for aligning the - /// baselines of fonts of different heights. - /// - public ushort Ascent; - /// - /// Specifies the amount of leading inside the bounds set - /// by dfPixHeight. Accent marks may occur in this area. - /// This may be zero at the designer's option. - /// - public ushort InternalLeading; - /// - /// Specifies the amount of extra leading that the designer - /// requests the application add between rows. Since this - /// area is outside of the font proper, it contains no - /// marks and will not be altered by text output calls in - /// either the OPAQUE or TRANSPARENT mode. This may be zero - /// at the designer's option. - /// - public ushort ExternalLeading; - public bool IsItalic; - public bool IsUnderline; - public bool IsStrikeOut; - /// - /// 2 bytes specifying the weight of the characters in the - /// character definition data, on a scale of 1 to 1000. A - /// dfWeight of 400 specifies a regular weight. - /// - public ushort Weight; - /// - /// 1 byte specifying the character set defined by this - /// font. - /// - public byte CharSet; - /// - /// 2 bytes specifing the width. - /// - public ushort PixWidth; - /// - /// 2 bytes specifying the height of the character bitmap - /// (raster fonts), or the height of the grid on which a - /// vector font was digitized. - /// - public ushort PixHeight; - /// - /// Specifies the pitch and font family. The low bit is set - /// if the font is variable pitch. The high four bits give - /// the family name of the font. Font families describe in - /// a general way the look of a font. They are intended for - /// specifying fonts when the exact face name desired is - /// not available. The families are as follows: - /// - /// Family Description - /// ------ ----------- - /// FF_DONTCARE (0<<4) Don't care or don't know. - /// FF_ROMAN (1<<4) Proportionally spaced fonts with serifs. - /// FF_SWISS (2<<4) Proportionally spaced fonts without serifs. - /// FF_MODERN (3<<4) Fixed-pitch fonts. - /// FF_SCRIPT (4<<4) - /// FF_DECORATIVE (5<<4) - /// - public byte PitchAndFamily; - /// - /// 2 bytes specifying the width of characters in the font. - /// For fixed-pitch fonts, this is the same as dfPixWidth. - /// For variable-pitch fonts, this is the width of the - /// character "X." - /// - public ushort AvgWidth; - /// - /// 2 bytes specifying the maximum pixel width of any - /// character in the font. For fixed-pitch fonts, this is - /// simply dfPixWidth. - /// - public ushort MaxWidth; - /// - /// 1 byte specifying the first character code defined by - /// this font. Character definitions are stored only for - /// the characters actually present in a font. Therefore, - /// use this field when calculating indexes into either - /// dfBits or dfCharOffset. - /// - public byte FirstChar; - /// - /// 1 byte specifying the last character code defined by - /// this font. Note that all the characters with codes - /// between dfFirstChar and dfLastChar must be present in - /// the font character definitions. - /// - public byte LastChar; - /// - /// 1 byte specifying the character to substitute - /// whenever a string contains a character out of the - /// range. The character is given relative to dfFirstChar - /// so that dfDefaultChar is the actual value of the - /// character, less dfFirstChar. The dfDefaultChar should - /// indicate a special character that is not a space. - /// - public byte DefaultChar; - /// - /// 1 byte specifying the character that will define word - /// breaks. This character defines word breaks for word - /// wrapping and word spacing justification. The character - /// is given relative to dfFirstChar so that dfBreakChar is - /// the actual value of the character, less that of - /// dfFirstChar. The dfBreakChar is normally (32 - - /// dfFirstChar), which is an ASCII space. - /// - public byte BreakChar; - /// - /// 2 bytes specifying the number of bytes in each row of - /// the bitmap. This is always even, so that the rows start - /// on WORD boundaries. For vector fonts, this field has no - /// meaning. - /// - public ushort WidthBytes; - /// - /// 4 bytes specifying the offset in the file to the - /// null-terminated string giving the device name. - /// For a generic font, this value is zero. - /// - public uint Device; - /// - /// 4 bytes specifying the offset in the file to the - /// null-terminated string that names the face. - /// - public uint Face; - /// - /// 4 bytes specifying the absolute machine address of - /// the bitmap. This is set by GDI at load time. The - /// dfBitsPointer is guaranteed to be even. - /// - public uint BitsPointer; - /// - /// 4 bytes specifying the offset in the file to the - /// beginning of the bitmap information. If the 04H bit in - /// the dfType is set, then dfBitsOffset is an absolute - /// address of the bitmap (probably in ROM). - /// - /// For raster fonts, dfBitsOffset points to a sequence of - /// bytes that make up the bitmap of the font, whose height - /// is the height of the font, and whose width is the sum - /// of the widths of the characters in the font rounded up - /// to the next WORD boundary. - /// - /// For vector fonts, it points to a string of bytes or - /// words (depending on the size of the grid on which the - /// font was digitized) that specify the strokes for each - /// character of the font. The dfBitsOffset field must be - /// even. - /// - public uint BitsOffset; - /// - /// 4 bytes specifying the bits flags, which are additional - /// flags that define the format of the Glyph bitmap, as - /// follows: - /// - /// DFF_FIXED equ 0001h ; font is fixed pitch - /// DFF_PROPORTIONAL equ 0002h ; font is proportional pitch - /// DFF_ABCFIXED equ 0004h ; font is an ABC fixed font - /// DFF_ABCPROPORTIONAL equ 0008h ; font is an ABC pro-portional font - /// DFF_1COLOR equ 0010h ; font is one color - /// DFF_16COLOR equ 0020h ; font is 16 color - /// DFF_256COLOR equ 0040h ; font is 256 color - /// DFF_RGBCOLOR equ 0080h ; font is RGB color - /// - public uint Flags; - /// - /// 2 bytes specifying the global A space, if any. The - /// dfAspace is the distance from the current position to - /// the left edge of the bitmap. - /// - public ushort ASpace; - /// - /// 2 bytes specifying the global B space, if any. The - /// dfBspace is the width of the character. - /// - public ushort BSpace; - /// - /// 2 bytes specifying the global C space, if any. The - /// dfCspace is the distance from the right edge of the - /// bitmap to the new current position. The increment of a - /// character is the sum of the three spaces. These apply - /// to all glyphs and is the case for DFF_ABCFIXED. - /// - public ushort CSpace; - /// - /// 4 bytes specifying the offset to the color table for - /// color fonts, if any. The format of the bits is similar - /// to a DIB, but without the header. That is, the - /// characters are not split up into disjoint bytes. - /// Instead, they are left intact. If no color table is - /// needed, this entry is NULL. - /// - public uint ColorPointer; - - public FntGlyph[] Glyphs = new FntGlyph[255]; - public string DeviceName; - public string FaceName; - public FntGlyphType GlyphType; - public FntGlyph NotDefChar; - - private const byte FixedFlagMask = 1; - private const byte ProportionalFlagMask = 2; - private const byte ABCFixedFlagMask = 4; - private const byte ABCProportionalFlagMask = 8; - private const byte Color1FlagMask = 16; - private const byte Color16FlagMask = 32; - private const byte Color256FlagMask = 64; - private const byte ColorRGBFlagMask = 128; - #endregion - - - public FntLoader() - { - } - - public string GetFamily() - { - if (PitchAndFamily == 0) - { - return "None"; - } - else if (PitchAndFamily == (1<<4)) - { - return "Roman"; - } - else if (PitchAndFamily == (2<<4)) - { - return "Swiss"; - } - else if (PitchAndFamily == (3<<4)) - { - return "Modern"; - } - else if (PitchAndFamily == (4<<4)) - { - return "Script"; - } - else if (PitchAndFamily == (5<<4)) - { - return "Decorative"; - } - else - { - return "Unknown"; - } - } - - public Rectangle GetBounds() - { - Rectangle r = new Rectangle(); - r.SetBounds(this.CSpace, this.Ascent, this.MaxWidth, this.PixHeight); - return r; - } - - public int GetDepth() - { - switch (GlyphType) - { - case FntGlyphType.Version2: - case FntGlyphType.Color1: - return 1; - default: - return 900; - } - } - - public FontStyle GetStyle() - { - FontStyle f = FontStyle.Normal; - if (IsItalic) - f |= FontStyle.Italic; - if (IsStrikeOut) - f |= FontStyle.Strikeout; - if (IsUnderline) - f |= FontStyle.Underline; - if (Weight >= 800) - f |= FontStyle.Bold; - return f; - } - - public FntGlyph GetGlyph(char c) - { - if (((int)c) > 255) - return NotDefChar; - FntGlyph g = Glyphs[((int)c) - 1]; - if (g == null) - return NotDefChar; - return g; - } - - public int GetSize() - { - return PointSize; - } - - public void Load(Stream s) - { - BinaryReader br = new BinaryReader(s); - byte[] buf; - - - Version = br.ReadUInt16(); - if (Version != 0x0300 && Version != 0x0200) - { - throw new Exception("Unknown format version!"); - } - - FileSize = br.ReadUInt32(); - if (FileSize != s.Length) - { - throw new Exception("FileSize incorrect! Possible corrupt file?"); - } - - buf = br.ReadBytes(60); - Copyright = System.Text.ASCIIEncoding.ASCII.GetString(buf).Replace("\0", ""); - buf = null; - - Type = br.ReadUInt16(); - if ((Type & 1) == 1) - { - throw new Exception("Can't handle Vector FNT files."); - } - PointSize = br.ReadUInt16(); - VertDpi = br.ReadUInt16(); - HorizDpi = br.ReadUInt16(); - Ascent = br.ReadUInt16(); - InternalLeading = br.ReadUInt16(); - ExternalLeading = br.ReadUInt16(); - - if (br.ReadByte() != 0) - { - IsItalic = true; - } - else - { - IsItalic = false; - } - - if (br.ReadByte() != 0) - { - IsUnderline = true; - } - else - { - IsUnderline = false; - } - - if (br.ReadByte() != 0) - { - IsStrikeOut = true; - } - else - { - IsStrikeOut = false; - } - - Weight = br.ReadUInt16(); - CharSet = br.ReadByte(); - PixWidth = br.ReadUInt16(); - PixHeight = br.ReadUInt16(); - PitchAndFamily = br.ReadByte(); - AvgWidth = br.ReadUInt16(); - MaxWidth = br.ReadUInt16(); - FirstChar = br.ReadByte(); - LastChar = br.ReadByte(); - DefaultChar = br.ReadByte(); - BreakChar = br.ReadByte(); - WidthBytes = br.ReadUInt16(); - - long position; - string deviceName = ""; - char curChar = ' '; - - #region Read Device Name - Device = br.ReadUInt32(); - position = br.BaseStream.Position; - br.BaseStream.Position = Device; - br.BaseStream.Flush(); - while (curChar != '\u0000') - { - deviceName += curChar; - curChar = (char)br.ReadByte(); - } - br.BaseStream.Position = position; - br.BaseStream.Flush(); - DeviceName = deviceName.Substring(1); - #endregion - - #region Read Face Name - Face = br.ReadUInt32(); - deviceName = ""; // re-use the variable. - curChar = ' '; - position = br.BaseStream.Position; - br.BaseStream.Position = Face; - br.BaseStream.Flush(); - // loop while it's not the null terminator. - while (curChar != '\u0000') - { - deviceName += curChar; - curChar = (char)br.ReadByte(); - } - br.BaseStream.Position = position; - br.BaseStream.Flush(); - // account for the extra char we added. - FaceName = deviceName.Substring(1); - #endregion - - BitsPointer = br.ReadUInt32(); - BitsOffset = br.ReadUInt32(); - - br.ReadByte(); // Not used. - - if (Version == 0x0300) - { - Flags = br.ReadUInt32(); - ASpace = br.ReadUInt16(); - BSpace = br.ReadUInt16(); - CSpace = br.ReadUInt16(); - ColorPointer = br.ReadUInt32(); - - br.ReadBytes(16); // Not used. - } - - // Next is the character table. - List chars = new List(); - FntGlyph g; - uint nChars = (uint)((LastChar - FirstChar) + 2); - position = 0; - long loc; - int bytesToRead; - if (Version == 0x0200) - { - this.GlyphType = FntGlyphType.Version2; - for (uint c = 0; c < nChars; c++) - { - g = new FntGlyph(); - g.Width = br.ReadUInt16(); - g.Type = FntGlyphType.Version2; - g.Height = PixHeight; - g.Font = this; - - #region Read Data - loc = br.ReadUInt16(); - position = br.BaseStream.Position; - br.BaseStream.Position = loc; - br.BaseStream.Flush(); - bytesToRead = (int)(((g.Width + 7) >> 3) * (PixHeight)); - g.RawData = br.ReadBytes(bytesToRead); - br.BaseStream.Position = position; - br.BaseStream.Flush(); - #endregion - - chars.Add(g); - - } - } - - for (int i = 0; i < chars.Count; i++) - { - chars[i].Initialize(); - } - Array.Copy(chars.ToArray(), 0, Glyphs, FirstChar - 1, chars.Count - 1); - //Glyphs = chars; - NotDefChar = chars[chars.Count - 1]; - //throw new Exception(); - - //else // version == 0x0300 - //{ - // if ((Flags & FixedFlagMask) == FixedFlagMask || (Flags & ProportionalFlagMask) == ProportionalFlagMask) - // { - // FntGlyphType t; - // if ((Flags & FixedFlagMask) == FixedFlagMask) - // { - // t = FntGlyphType.Fixed; - // } - // else - // { - // t = FntGlyphType.Proportional; - // } - // for (uint c = 0; c < nChars; c++) - // { - // g = new FntGlyph(); - // g.Type = t; - - // } - // } - // else if ((Flags & ABCFixedFlagMask) == ABCFixedFlagMask || (Flags & ABCProportionalFlagMask) == ABCProportionalFlagMask) - // { - // for (uint c = 0; c < nChars; c++) - // { - - // } - // } - // else // A color flag. - // { - // for (uint c = 0; c < nChars; c++) - // { - - // } - // } - //} - - } - - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntMetrics.cs b/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntMetrics.cs deleted file mode 100644 index 526d89ed4d..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntMetrics.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.fnt -{ - internal class FntFontMetrics : FontMetrics - { - private Rectangle box; - - public FntFontMetrics(FntFont font) - : base(font) - { - this.box = font.GetBounds(); - } - - public override int GetHeight() - { - return box.Height; - } - - public override int GetAscent() - { - return Math.Abs(box.Y); - } - - public override int GetDescent() - { - return box.Height + Math.Abs(box.Y); - } - - public override int GetLeading() - { - return Math.Abs(box.X); - } - - public override int GetMaxAdvance() - { - return box.Width; - } - - public override int CharWidth(char ch) - { - FntGlyph g = ((FntFont)(font)).GetLoader().GetGlyph(ch); - if (g != null) - { - return (int)((g.Width + 1) & ~1); - } - return 0; - } - - public override int[] CharsWidths(char[] chars, int start, int len) - { - int[] advances = new int[len]; - int adv_idx = 0; - - for (int i = start; i < start + len; i++) - { - FntGlyph glyph = ((FntFont)(font)).GetLoader().GetGlyph(chars[i]); - if (adv_idx == 0) - { - advances[adv_idx++] = glyph.Width; - } - else - { - advances[adv_idx++] = advances[adv_idx - 1] + glyph.Width; - } - } - - return advances; - } - - public override int CharsWidth(char[] chars, int start, int len) - { - int total = 0; - int[] lengths = CharsWidths(chars, start, len); - for (int i = 0; i < lengths.Length; i++) - total += lengths[i]; - - return total; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntTextRenderer.cs b/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntTextRenderer.cs deleted file mode 100644 index d37cc97f4c..0000000000 --- a/Users/Orvid/Orvid.Graphics/FontSupport/fnt/FntTextRenderer.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System; - -namespace Orvid.Graphics.FontSupport.fnt -{ - internal class FntTextRenderer : ITextRenderer - { - private FntLoader ldr; - - public FntTextRenderer(FntLoader loadr) - { - this.ldr = loadr; - } - - public override void Render(Image im, BoundingBox clip, AffineTransform tx, string text, Vec2 loc, Pixel color) - { - if (text == null || text.Length == 0) - return; - - int offset = 0, - x = 0, y = 0, - FontDepth = ldr.GetDepth(), - x_min = int.MaxValue, - y_min = int.MaxValue, - x_max = int.MinValue, - y_max = int.MinValue, - charsCount = text.Length, - fHeight, scan, fg_r, fg_g, - fg_b, bx, by, offsetLine, - fPixel, px, py, bg_r, - bg_g, bg_b, r, g, b - ; - int[] fData; - Vec2 src, dst; - Rectangle glyph_box = new Rectangle(); - FntGlyph glyph; - Image img; - - if ((ldr != null) && (charsCount > 0)) - { - char[] chrs = text.ToCharArray(); - int mH = 0; - int mY = 0; - int mxY = 0; - int tW = 0; - int tH = 0; - for (uint m = 0; m < text.Length; m++) - { - glyph = ldr.GetGlyph(chrs[m]); - glyph_box = glyph.GetBounds(); - if (glyph_box.Height > mH) - { - mH = glyph_box.Height + 2; - } - if (glyph_box.Y < mY) - { - mY = glyph_box.Y; - } - if (glyph_box.Y > mxY) - { - mxY = glyph_box.Y; - } - tW += glyph_box.Width + glyph_box.X + 2; - } - - tH = mH + (mxY - mY); - y = mH + -mY; - img = new Image(tW, tH); - - - float f_max = (1 << FontDepth) - 1; - if (f_max == 0) - f_max = 1; - - glyph_box = new Rectangle(); - src = new Vec2(); - dst = new Vec2(); - - //throw new Exception(); - - for (int i = 0; i < charsCount; i++) - { - glyph = ldr.GetGlyph(chrs[i]); - //throw new Exception(); - if (glyph == null) - { - continue; - } - - glyph_box = glyph.GetBounds(); - - fHeight = glyph_box.Height; - fData = glyph.Data; - scan = fData.Length / fHeight; - - //throw new Exception(); - fg_r = color.R; - fg_g = color.G; - fg_b = color.B; - - //throw new Exception(); - //box location - bx = x + offset + glyph_box.X; - by = y - fHeight - glyph_box.Y; - - throw new Exception(); - for (int k = 0; k < fHeight; k++) - { - offsetLine = k * scan; - for (int j = 0; j < scan; j++) - { - fPixel = fData[offsetLine + j]; - if (fPixel != 0) - { - - //pixel location - px = bx + j; - py = by + k; - - if (tx != null) - { - //src.setLocation(px, py); - //tx.transform(src, dst); -#warning TODO: Add support for this. - //px = dst.X; - //py = dst.Y; - } - - //clip - if (clip == null || clip.Contains(px, py)) - { - //compute color - Pixel bg_color = img.GetPixel((uint)px, (uint)py); - - bg_r = bg_color.R; - bg_g = bg_color.G; - bg_b = bg_color.B; - - //todo improve this pixel composition - - float alpha = fPixel / f_max; - - r = bg_r + ((int)((fg_r - bg_r) * alpha)) & 0xFF; - g = bg_g + ((int)((fg_g - bg_g) * alpha)) & 0xFF; - b = bg_b + ((int)((fg_b - bg_b) * alpha)) & 0xFF; - - Pixel nw = new Pixel((byte)r, (byte)g, (byte)b, 255); - - img.SetPixel((uint)px, (uint)py, nw); - - if (x_min > px) - x_min = px; - if (y_min > py) - y_min = py; - if (x_max < px) - x_max = px; - if (y_max < py) - y_max = py; - } - } - } - } - offset += glyph.Width; - } - //img = ImageManipulator.Resize(img, new Vec2(img.Width * 8, img.Height * 8), ImageManipulator.ScalingAlgorithm.Bicubic); - //img = ImageManipulator.Resize(img, Vec2.Zero, ImageManipulator.ScalingAlgorithm.Hq2x); - //img = ImageManipulator.Resize(img, Vec2.Zero, ImageManipulator.ScalingAlgorithm.Hq4x); - img.FloodFill(new Vec2(3,3), new Pixel(true), Colors.Green); - im.DrawImage(loc, img); - } - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Image.cs b/Users/Orvid/Orvid.Graphics/Image.cs deleted file mode 100644 index ccd75b6f43..0000000000 --- a/Users/Orvid/Orvid.Graphics/Image.cs +++ /dev/null @@ -1,1101 +0,0 @@ -#define DebugDraw // If this is uncommented, all triangles will have a set-color border drawn. This is useful to debug polygon drawing code. -//#define SqrtWorks // Only uncomment this when the square-root works - -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics -{ - /// - /// This class is used to describe an image. - /// - public class Image : Shapes.Shape, IDisposable - { - /// - /// The raw data in the image. - /// - public Pixel[] Data; - /// - /// The height of the image. - /// - public int Height; - /// - /// The width of the image. - /// - public int Width; - - ///// - ///// Creates an image from a bitmap. - ///// - ///// The input bitmap. - //public Image(System.Drawing.Bitmap b) - //{ - // this.Width = b.Width; - // this.Height = b.Height; - // this.Data = new Pixel[(Height + 1) * (Width + 1)]; - // for (int height = 0; height < this.Height; height++) - // { - // for (int width = 0; width < this.Width; width++) - // { - // System.Drawing.Color pc = b.GetPixel(width, height); - // Pixel p = new Pixel(pc.R, pc.G, pc.B, pc.A); - // Data[((height * Width) + width)] = p; - // } - // } - //} - - /// - /// Creates a new image with the specified height and width. - /// - /// The height of the new image. - /// The width of the new image. - public Image(int width, int height) - { - this.Width = width; - this.Height = height; - this.Data = new Pixel[(Height + 1) * (Width + 1)]; - } - - public Image(Vec2 v) - : this(v.X, v.Y) - { - } - - /// - /// The default Destructor. - /// - ~Image() - { - this.Data = null; - } - - public void Dispose() - { - this.Data = null; - System.GC.Collect(); - } - - #region Clear - public virtual void Clear(Pixel color) - { - for (uint i = 0; i < Data.Length; i++) - { - Data[i] = color; - } - } - #endregion - - - - #region DON'T WORK!!! - - #region DrawElipse - /// - /// Draws and fills an elipse. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to draw in. - public void DrawElipse(Vec2 CenterPoint, int height, int width, Pixel color) - { - double angle = 0; - double range = (360 * (Math.PI / 180)); - double x = (width * Math.Cos(angle)); - double y = (height * Math.Sin(angle)); - do - { - int X = (int)(CenterPoint.X + x + 0.5); - int Y = (int)(CenterPoint.Y - y + 0.5); - SetPixel((uint)(X), (uint)(Y), color); - DrawLine(CenterPoint, new Vec2(X, Y), color); - angle += 0.001; - x = (width * Math.Cos(angle)); - y = (height * Math.Sin(angle)); - } - while (angle <= range); - } - - /// - /// Draws and fills an elipse. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to fill in. - /// The color to draw the border in. - public void DrawElipse(Vec2 CenterPoint, int height, int width, Pixel fillColor, Pixel borderColor) - { - DrawElipse(CenterPoint, height, width, fillColor); - DrawElipseOutline(CenterPoint, height, width, borderColor); - } - #endregion - - #region DrawElipseOutline - /// - /// Draws an elipse outline. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to draw in. - public void DrawElipseOutline(Vec2 CenterPoint, int height, int width, Pixel color) - { - DrawElipticalArc(CenterPoint, height, width, 0, 360, color); - } - #endregion - - #region DrawElipticalArc - /// - /// Draws an eliptical arc. - /// - /// The center-point of the elipse to use. - /// The height of the elipse to use. - /// The width of the elipse to use. - /// The angle to start drawing at. - /// The angle to stop drawing at. - /// The color to draw in. - public void DrawElipticalArc(Vec2 CenterPoint, int height, int width, int startAngle, int endAngle, Pixel color) - { - double angle = (((startAngle <= endAngle) ? startAngle : endAngle) * (Math.PI / 180)); - double range = (((endAngle > startAngle) ? endAngle : startAngle) * (Math.PI / 180)); - double x = (width * Math.Cos(angle)); - double y = (height * Math.Sin(angle)); - do - { - SetPixel((uint)((int)(CenterPoint.X + x + 0.5)), (uint)((int)(CenterPoint.Y - y + 0.5)), color); - angle += 0.001; - x = (width * Math.Cos(angle)); - y = (height * Math.Sin(angle)); - } - while (angle <= range); - } - #endregion - - #region DrawQuad - /// - /// Draws a quadrilateral with the specified points. - /// - /// The first point. - /// The second point. - /// The third point. - /// The fourth point. - /// The color to fill in the rectangle with. - /// The color to draw the border in. - public void DrawQuad(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, Pixel FillColor, Pixel BorderColor) - { - DrawPolygon(new Vec2[] { p1, p2, p3, p4 }, FillColor); - DrawPolygonOutline(new Vec2[] { p1, p2, p3, p4 }, BorderColor); - } - - /// - /// Draws a quadrilateral with the specified points. - /// - /// The first point. - /// The second point. - /// The third point. - /// The fourth point. - /// The color to draw in. - public void DrawQuad(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, Pixel color) - { - DrawPolygon(new Vec2[] { p1, p2, p3, p4 }, color); - } - #endregion - - #endregion - - - // This SHOULD work. (I can't guarantee it though.) - #region DrawCircle - /// - /// Draws a filled circle. - /// - /// The center of the circle. - /// The radius of the circle. - /// The color to draw in. - public void DrawCircle(Vec2 Center, int radius, Pixel color) - { -#if SqrtWorks - int x1; - int x2; - int rSquared = radius * radius; - int counter = (Center.Y + radius); - for (int count = (Center.Y - radius); count <= counter; count++) - { - int ySquared = (count - Center.Y) * (count - Center.Y); - double sqrt = Math.Sqrt(rSquared - ySquared) + 0.5; - x1 = (int)(Center.X + sqrt); - x2 = (int)(Center.X - sqrt); - Vec2 p1 = new Vec2(x1, count); - Vec2 p2 = new Vec2(x2, count); - DrawLine(p1, p2, color); - } - DrawCircleOutline(Center, radius, color); -#else - Vec2 tlcorn = new Vec2(Center.X - radius, Center.Y - radius); - Image i = new Image(radius * 2 + 2, radius * 2 + 2); - i.DrawCircleOutline(Center - tlcorn, radius, color); - i.FloodFill(Center - tlcorn, new Pixel(true), color); - DrawImage(tlcorn, i); -#endif - } - #endregion - - - #region DrawCircleOutline - /// - /// Draws the outline of a circle. - /// - /// The center of the circle. - /// The radius of the circle. - /// The color to draw with. - public void DrawCircleOutline(Vec2 Center, int radius, Pixel color) - { - int x = 0; - int y = radius; - int p = (5 - radius * 4) / 4; - - SetPixel((uint)(Center.X), (uint)(Center.Y + y), color); - SetPixel((uint)(Center.X), (uint)(Center.Y - y), color); - SetPixel((uint)(Center.X + y), (uint)(Center.Y), color); - SetPixel((uint)(Center.X - y), (uint)(Center.Y), color); - while (x < y) - { - x++; - if (p < 0) - { - p += 2 * x + 1; - } - else - { - y--; - p += 2 * (x - y) + 1; - } - if (x == y) - { - SetPixel((uint)(Center.X + x), (uint)(Center.Y + y), color); - SetPixel((uint)(Center.X - x), (uint)(Center.Y + y), color); - SetPixel((uint)(Center.X + x), (uint)(Center.Y - y), color); - SetPixel((uint)(Center.X - x), (uint)(Center.Y - y), color); - } - else - { - if (x < y) - { - SetPixel((uint)(Center.X + x), (uint)(Center.Y + y), color); - SetPixel((uint)(Center.X - x), (uint)(Center.Y + y), color); - SetPixel((uint)(Center.X + x), (uint)(Center.Y - y), color); - SetPixel((uint)(Center.X - x), (uint)(Center.Y - y), color); - SetPixel((uint)(Center.X + y), (uint)(Center.Y + x), color); - SetPixel((uint)(Center.X - y), (uint)(Center.Y + x), color); - SetPixel((uint)(Center.X + y), (uint)(Center.Y - x), color); - SetPixel((uint)(Center.X - y), (uint)(Center.Y - x), color); - } - } - } - } - #endregion - - #region DrawImage - /// - /// Draws the specified image, at the specified point. - /// - /// - /// - public void DrawImage(Vec2 loc, Image i) - { - Pixel value; - if (loc.X < 0) - { - if (loc.Y < 0) // Both X and Y are negative - { - for (uint y = (uint)i.Height; y >= 0 && y + loc.Y >= 0; y--) - { - for (uint x = (uint)i.Width; x >= 0 && x + loc.X >= 0; x--) - { - value = i.GetPixel(x, y); - if (!value.Empty) - SetPixel((uint)(x + loc.X), (uint)(y + loc.Y), value); - } - } - } - else // Only X is negative. - { - for (uint y = 0; y < i.Height && y + loc.Y < this.Height; y++) - { - for (uint x = (uint)i.Width; x >= 0 && x + loc.X >= 0; x--) - { - value = i.GetPixel(x, y); - if (!value.Empty) - SetPixel((uint)(x + loc.X), (uint)(y + loc.Y), value); - } - } - } - } - else - { - if (loc.Y < 0) // Only X Positive - { - for (uint y = (uint)i.Height; y >= 0 && y + loc.Y >= 0; y--) - { - for (uint x = 0; x < i.Width && x + loc.X < this.Width; x++) - { - value = i.GetPixel(x, y); - if (!value.Empty) - SetPixel((uint)(x + loc.X), (uint)(y + loc.Y), value); - } - } - } - else // Both positive - { - for (uint y = 0; y < i.Height && y + loc.Y < this.Height; y++) - { - for (uint x = 0; x < i.Width && x + loc.X < this.Width; x++) - { - value = i.GetPixel(x, y); - if (!value.Empty) - SetPixel((uint)(x + loc.X), (uint)(y + loc.Y), value); - } - } - } - } - } - #endregion - - #region DrawLine - /// - /// Draws a line between 2 points. - /// - /// The first point. - /// The first point. - /// The color to draw. - public void DrawLine(Vec2 Point1, Vec2 Point2, Pixel color) - { - int x0 = Point1.X; - int x1 = Point2.X; - int y0 = Point1.Y; - int y1 = Point2.Y; - bool steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0); - if (steep) - { - int x3 = y0; - y0 = x0; - x0 = x3; - int x4 = y1; - y1 = x1; - x1 = x4; - } - if (x0 > x1) - { - int x5 = x0; - x0 = x1; - x1 = x5; - int x6 = y0; - y0 = y1; - y1 = x6; - } - int deltax = x1 - x0; - int deltay = Math.Abs(y1 - y0); - int error = deltax / 2; - int ystep; - int y = y0; - if (y0 < y1) - { - ystep = 1; - } - else - { - ystep = -1; - } - for (int x = x0; x <= x1; x++) - { - if (steep) - { - SetPixel((uint)y, (uint)x, color); - } - else - { - SetPixel((uint)x, (uint)y, color); - } - error = error - deltay; - if (error < 0) - { - y = y + ystep; - error = error + deltax; - } - } - } - #endregion - - #region DrawLines - /// - /// Draws a set of connected lines. - /// - /// - /// An array of points to draw, in the order they need drawing. - /// - /// The color to draw. - public void DrawLines(Vec2[] Points, Pixel color) - { - int n = Points.Length; - if (n >= 2) - { - DrawLine(Points[0], Points[1], color); - - for (int count = 1; count < (n - 1); count++) - { - DrawLine(Points[count], Points[count + 1], color); - } - } - else - { - throw new Exception("Not enough points provided!"); - } - } - #endregion - - #region DrawPolygon - /// - /// Draws a polygon with the specified points. - /// - /// The points of the polygon. - /// The color to draw in. - public void DrawPolygon(Vec2[] points, Pixel color) - { - Vec2[] contour = points; - List result = new List(); - int cnt = 0; - #region Process - { -#warning TODO: Change these back to floats when their implemented fully. - double EPSILON = 0.0000000001f; - int n = contour.Length; - if (n < 3) - { - throw new Exception("Not enough Verticies!"); - } - int[] V = new int[n]; - int Area; - { - int n2 = contour.Length; - double A = 0.0f; - for (int p = n2 - 1, q = 0; q < n2; p = q++) - { - A += contour[p].X * contour[q].Y - contour[q].X * contour[p].Y; - } - Area = (Int32)(A * 0.5f); - } - if (0.0f < Area) - { - for (int v = 0; v < n; v++) - { - V[v] = v; - } - } - else - { - for (int v = 0; v < n; v++) - { - V[v] = (n - 1) - v; - } - } - int nv = n; - int count = 2 * nv; - for (int m = 0, v = nv - 1; nv > 2; ) - { - if (0 >= (count--)) - { - throw new Exception("Invalid polygon!"); - } - int u = v; - if (nv <= u) - { - u = 0; - } - v = u + 1; - if (nv <= v) - { - v = 0; - } - int w = v + 1; - if (nv <= w) - { - w = 0; - } - bool Snip; - { - int p; - double Ax, Ay, Bx, By, Cx, Cy, Px, Py; - Ax = contour[V[u]].X; - Ay = contour[V[u]].Y; - Bx = contour[V[v]].X; - By = contour[V[v]].Y; - Cx = contour[V[w]].X; - Cy = contour[V[w]].Y; - if (EPSILON > (((Bx - Ax) * (Cy - Ay)) - ((By - Ay) * (Cx - Ax)))) - { - Snip = false; - } - for (p = 0; p < nv; p++) - { - if ((p == u) || (p == v) || (p == w)) - { - continue; - } - Px = contour[V[p]].X; - Py = contour[V[p]].Y; - bool InsideTriangle; - { - double ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy; - double cCROSSap, bCROSScp, aCROSSbp; - ax = Cx - Bx; - ay = Cy - By; - bx = Ax - Cx; - by = Ay - Cy; - cx = Bx - Ax; - cy = By - Ay; - apx = Px - Ax; - apy = Py - Ay; - bpx = Px - Bx; - bpy = Py - By; - cpx = Px - Cx; - cpy = Py - Cy; - aCROSSbp = ax * bpy - ay * bpx; - cCROSSap = cx * apy - cy * apx; - bCROSScp = bx * cpy - by * cpx; - InsideTriangle = ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); - } - if (InsideTriangle) - { - Snip = false; - } - } - Snip = true; - } - if (Snip) - { - int a, b, c, s, t; - a = V[u]; - b = V[v]; - c = V[w]; - result.Add(contour[a]); - result.Add(contour[b]); - result.Add(contour[c]); - m++; - for (s = v, t = v + 1; t < nv; s++, t++) - { - V[s] = V[t]; - } - nv--; - count = 2 * nv; - } - } - } - #endregion - while (cnt < (result.Count / 3)) - { - DrawTriangle(result[(cnt * 3)], result[(cnt * 3) + 1], result[(cnt * 3) + 2], color); - cnt++; - } - } - #endregion - - #region DrawPolygonOutline - /// - /// Draws the outline of a polygon. - /// The last point connects to the first point. - /// - /// An array containing the points to draw. - /// The color to draw in. - public void DrawPolygonOutline(Vec2[] points, Pixel color) - { - Vec2[] pts = new Vec2[points.Length + 1]; - points.CopyTo(pts, 0); - pts[pts.Length - 1] = points[0]; - DrawLines(pts, color); - } - #endregion - - #region DrawRectangle - /// - /// This method fills in the space between - /// the 2 points specified in a rectangle. - /// - /// - /// The point that specifies the top left - /// corner of the rectangle being drawn. - /// - /// - /// The point that specifies the bottom right - /// corner of the rectangle being drawn. - /// - /// The color to draw. - public void DrawRectangle(Vec2 TopLeftCorner, Vec2 BottomRightCorner, Pixel color) - { - int height = BottomRightCorner.Y - TopLeftCorner.Y; - int width = BottomRightCorner.X - TopLeftCorner.X; - Image i = new Image(width, height); - i.Clear(color); - DrawImage(TopLeftCorner, i); - //DrawQuad(TopLeftCorner, new Vec2(BottomRightCorner.X, TopLeftCorner.Y), BottomRightCorner, new Vec2(TopLeftCorner.X, BottomRightCorner.Y), color); - } - #endregion - - #region DrawReverseRectangle - /// - /// This method fills in the space between - /// the 2 points specified in a rectangle. - /// - /// - /// The point that specifies the top right - /// corner of the rectangle being drawn. - /// - /// - /// The point that specifies the bottom left - /// corner of the rectangle being drawn. - /// - /// The color to draw. - public void ReverseDrawRectangle(Vec2 TopRightCorner, Vec2 BottomLeftCorner, Pixel color) - { - int height = BottomLeftCorner.Y - TopRightCorner.Y; - int width = TopRightCorner.X - BottomLeftCorner.X; - Image i = new Image(width, height); - i.Clear(color); - Vec2 TopLeftCorner = new Vec2(BottomLeftCorner.X, TopRightCorner.Y); - DrawImage(TopLeftCorner, i); - //DrawQuad(new Vec2(BottomLeftCorner.X, TopRightCorner.Y), TopRightCorner, new Vec2(TopRightCorner.X, BottomLeftCorner.Y), BottomLeftCorner, color); - } - #endregion - - #region DrawTriangle - /// - /// Draws a triangle and fills it in. - /// - /// The first point of the triangle. - /// The second point of the triangle. - /// The third point of the triangle. - /// The color to draw in. - public void DrawTriangle(Vec2 p1, Vec2 p2, Vec2 p3, Pixel color) - { - - int l; // The farthest left - int r; - int t; - int b; - #region Organize points - if (p1.Y > p2.Y && p1.Y > p3.Y) - { - t = p1.Y; - if (p2.Y < p3.Y) - { - b = p2.Y; - } - else - { - b = p3.Y; - } - } - else if (p2.Y > p1.Y && p2.Y > p3.Y) - { - t = p2.Y; - if (p1.Y < p3.Y) - { - b = p1.Y; - } - else - { - b = p3.Y; - } - } - else // This means p3 is the highest point - { - t = p3.Y; - if (p1.Y < p2.Y) - { - b = p1.Y; - } - else - { - b = p2.Y; - } - } - - // Now organize in the width direction. - if (p1.X > p3.X && p1.X > p2.X) - { - l = p1.X; - if (p2.X < p3.X) - { - r = p2.X; - } - else - { - r = p3.X; - } - } - else if (p2.X > p3.X && p2.X > p1.X) - { - l = p2.X; - if (p1.X < p3.X) - { - r = p1.X; - } - else - { - r = p3.X; - } - } - else - { - l = p3.X; - if (p2.X < p1.X) - { - r = p2.X; - } - else - { - r = p1.X; - } - } - #endregion - int h; - int w; - if (t - b + 1 > 0) - { - h = t - b + 1; - } - else - { - h = b - t + 1; - } - if (l - r + 1 > 0) - { - w = l - r + 1; - } - else - { - w = r - l + 1; - } - Image i = new Image(w, h); - // Get the location of the points within the image. - Vec2 p4 = new Vec2(p1.X - r, p1.Y - b); - Vec2 p5 = new Vec2(p2.X - r, p2.Y - b); - Vec2 p6 = new Vec2(p3.X - r, p3.Y - b); -#if DebugDraw - Pixel p9 = new Pixel(); - p9.B = 200; - i.DrawLine(p4, p5, p9); - i.DrawLine(p5, p6, p9); - i.DrawLine(p6, p4, p9); -#else - i.DrawLine(p4, p5, color); - i.DrawLine(p5, p6, color); - i.DrawLine(p6, p4, color); -#endif - Vec2 center = (p4 + p5 + p6) / 3; - i.FloodFill(center, new Pixel(true), color); - - /* - - NOTE TO SELF: Draw a line from each corner to the middle of the opposite line, - so as to fill in the holes that this flood fill method might leave, - when dealing with small angles. Some acute triangles have this problem. - - */ - Vec2 m1 = (p4 + p5) / 2; - Vec2 m2 = (p5 + p6) / 2; - Vec2 m3 = (p4 + p6) / 2; -#if DebugDraw - Pixel p50 = new Pixel(); - p50.B = 200; - i.DrawLine(p4, p5, p50); - i.DrawLine(p5, p6, p50); - i.DrawLine(p6, p4, p50); -#else - i.DrawLine(p6, m1, color); - i.DrawLine(p4, m2, color); - i.DrawLine(p5, m3, color); -#endif - - Vec2 v = new Vec2(r, b); - DrawImage(v, i); - } - - /// - /// Draws a triangle with the specified fill color, and the specified border color. - /// - /// The first point. - /// The second point. - /// The third point. - /// The color to fill the triangle with. - /// The color to draw the border of the triangle. - public void DrawTriangle(Vec2 p1, Vec2 p2, Vec2 p3, Pixel FillColor, Pixel BorderColor) - { - DrawTriangle(p1, p2, p3, FillColor); - DrawTriangleOutline(p1, p2, p3, BorderColor); - } - #endregion - - #region DrawTriangleOutline - /// - /// Draw a triangle's outline. - /// - /// The first point of the triangle. - /// The second point of the triangle. - /// The third point of the triangle. - /// The color to draw in. - public void DrawTriangleOutline(Vec2 p1, Vec2 p2, Vec2 p3, Pixel color) - { - DrawLines(new Vec2[] { p1, p2, p3, p1 }, color); - } - #endregion - - #region FloodFill - private bool[] Visiteds; - /// - /// Returns true if the given pixel has - /// been visited with the flood-fill algorithm. - /// - /// - /// - /// - public bool Visited(int y, int x) - { - if (x >= 0 && y >= 0 && y <= Height && x <= Width) - return Visiteds[((y * Width) + x)]; - return true; - } - - /// - /// Implements a flood fill algorithm. - /// - /// The point to start filling from. - /// The color to search for. - /// The color to change it to. - public void FloodFill(Vec2 startPoint, Pixel sColor, Pixel dColor) - { - int x = startPoint.X; - int y = startPoint.Y; - if ((GetPixel((uint)x, (uint)y).Empty) || GetPixel((uint)x, (uint)y) == sColor) - { - SetPixel((uint)x, (uint)y, dColor); - } - Stack q = new Stack(); - Visiteds = new bool[(Height + 1) * (Width + 1)]; - - #region Setup Start of queue - Pixel p; - Vec2 v; - p = GetPixel((uint)x + 1, (uint)y); - if ((p.Empty || p == sColor) && p != dColor) - { - v = new Vec2(x + 1, y); - q.Push(v); - Visiteds[((y * Width) + x + 1)] = true; - SetPixel((uint)x + 1, (uint)y, dColor); - } - p = GetPixel((uint)x, (uint)y + 1); - if ((p.Empty || p == sColor) && p != dColor) - { - v = new Vec2(x, y + 1); - q.Push(v); - Visiteds[(((y + 1) * Width) + x)] = true; - SetPixel((uint)x, (uint)y + 1, dColor); - } - p = GetPixel((uint)x - 1, (uint)y); - if ((p.Empty || p == sColor) && p != dColor) - { - v = new Vec2(x - 1, y); - q.Push(v); - Visiteds[((y * Width) + x - 1)] = true; - SetPixel((uint)(x - 1), (uint)y, dColor); - } - p = GetPixel((uint)x, (uint)y - 1); - if ((p.Empty || p == sColor) && p != dColor) - { - v = new Vec2(x, y - 1); - q.Push(v); - Visiteds[(((y - 1) * Width) + x)] = true; - SetPixel((uint)x, (uint)(y - 1), dColor); - } - #endregion - - while (q.Count > 0) - { - v = q.Pop(); - x = v.X; - y = v.Y; - #region Check - - p = GetPixel((uint)x + 1, (uint)y); - if (p != dColor && (p.Empty || p == sColor)) - { - v = new Vec2(x + 1, y); - if (x >= 0 && !(Visited(y, x + 1))) - { - q.Push(v); - Visiteds[((y * Width) + x + 1)] = true; - SetPixel((uint)x + 1, (uint)y, dColor); - } - } - p = GetPixel((uint)x, (uint)y + 1); - if (p != dColor && (p.Empty || p == sColor)) - { - v = new Vec2(x, y + 1); - if (x >= 0 && !(Visited(y + 1, x))) - { - q.Push(v); - Visiteds[(((y + 1) * Width) + x)] = true; - SetPixel((uint)x, (uint)y + 1, dColor); - } - } - p = GetPixel((uint)x - 1, (uint)y); - if (p != dColor && (p.Empty || p == sColor)) - { - v = new Vec2(x - 1, y); - if (x >= 0 && !(Visited(y, x - 1))) - { - q.Push(v); - Visiteds[((y * Width) + x - 1)] = true; - SetPixel((uint)x - 1, (uint)y, dColor); - } - } - p = GetPixel((uint)x, (uint)y - 1); - if (p != dColor && (p.Empty || p == sColor)) - { - v = new Vec2(x, y - 1); - if (!(Visited(y - 1, x))) - { - q.Push(v); - Visiteds[(((y - 1) * Width) + x)] = true; - SetPixel((uint)x, (uint)y - 1, dColor); - } - } - #endregion - } - // And finally empty the visiteds array. - Visiteds = new bool[0]; - } - #endregion - - #region SubImage - /// - /// Gets a sub-image of this image, - /// from the specified location, - /// of the specified size. - /// - /// The location of the image to pull. - /// The size of the image to pull. - /// The sub-image obtained. - public Image SubImage(Vec2 loc, Vec2 size) - { - Image i = new Image(size); - for (int y = loc.Y; y < (loc.Y + size.Y); y++) - { - for (int x = loc.X; x < (loc.X + size.X); x++) - { - i.SetPixel((uint)(x - loc.X), (uint)(y - loc.Y), this.GetPixel((uint)x, (uint)y)); - } - } - return i; - } - #endregion - - - /// - /// Get's the pixel a the specified location. - /// - /// The width position of the pixel. - /// The height position of the pixel. - /// The Pixel at the specified position. - public virtual Pixel GetPixel(uint x, uint y) - { - if (/*x > 0 &&*/ x < Width /*&& y > 0 */&& y < Height) - return Data[(y * Width) + x]; - else - return new Pixel(true); - } - - //public List Modified = new List(); - - /// - /// Set's the pixel at the specified location, - /// to the specified pixel. - /// - /// The width position of the pixel. - /// The height position of the pixel. - /// The pixel to set to. - public virtual void SetPixel(uint x, uint y, Pixel p) - { - //Modified.Add(new Vec2(width, height)); - if (p.A != 255) - { - if (p.A != 0) - { - double r1 = ((double)p.A / 255); - double r2 = 1.0d - r1; - Pixel cur = Data[((y * Width) + x)]; - //throw new Exception(); - - Data[((y * Width) + x)] = new Pixel((byte)((p.R * r1) + (cur.R * r2)), (byte)((p.G * r1) + (cur.G * r2)), (byte)((p.B * r1) + (cur.B * r2)), 255); - } - // else nothing gets drawn. - } - else - { - Data[((y * Width) + x)] = p; - } - } - - public void DrawString(Vec2 loc, String s, FontSupport.Font f, int stringHeight, FontSupport.FontStyle flags, Pixel color) - { - FontSupport.FontManager.Instance.DrawText(this, null, null, s, f, loc, color); - } - - public override void Draw() - { - Parent.DrawImage(new Vec2(base.X, base.Y), this); - } - - #region Operators - public static explicit operator System.Drawing.Bitmap(Image i) - { - System.Drawing.Bitmap b = new System.Drawing.Bitmap(i.Width, i.Height); - System.Drawing.Imaging.BitmapData bd = b.LockBits(new System.Drawing.Rectangle(0, 0, i.Width, i.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - int bytes = Math.Abs(bd.Stride) * bd.Height; - byte[] rgbValues = new byte[bytes]; - System.Runtime.InteropServices.Marshal.Copy(bd.Scan0, rgbValues, 0, bytes); - uint len = (uint)(i.Height * i.Width); - for (uint d = 0, ind = 0; d < len; d++) - { - rgbValues[ind] = i.Data[d].B; - ind++; - rgbValues[ind] = i.Data[d].G; - ind++; - rgbValues[ind] = i.Data[d].R; - ind++; - rgbValues[ind] = i.Data[d].A; - ind++; - } - System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, bd.Scan0, bytes); - rgbValues = null; - b.UnlockBits(bd); - return b; - } - - public static explicit operator Image(System.Drawing.Bitmap b) - { - Image i = new Image(b.Width, b.Height); - for (uint x = 0; x < b.Width; x++) - { - for (uint y = 0; y < b.Height; y++) - { - i.SetPixel(x, y, b.GetPixel((int)x, (int)y)); - } - } - return i; - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/BmpSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/BmpSupport.cs deleted file mode 100644 index 6e8d750d8e..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/BmpSupport.cs +++ /dev/null @@ -1,639 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class BmpImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - BmpInternals.BmpEncoder b = new BmpInternals.BmpEncoder(); - b.Encode(i, dest); - } - - public override Image Load(Stream s) - { - BmpInternals.BmpDecoder b = new BmpInternals.BmpDecoder(); - return b.Decode(s); - } - - // Please note, everything below this - // point was originally from the ImageTools - // Library, available here: - // http://imagetools.codeplex.com/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - #region Internals - private static class BmpInternals - { - #region BmpDecoder - public class BmpDecoder - { - /// - /// The mask for the red part of the color for 16 bit rgb bitmaps. - /// - private const int Rgb16RMask = 0x00007C00; - /// - /// The mask for the green part of the color for 16 bit rgb bitmaps. - /// - private const int Rgb16GMask = 0x000003E0; - /// - /// The mask for the blue part of the color for 16 bit rgb bitmaps. - /// - private const int Rgb16BMask = 0x0000001F; - - private Stream _stream; - private BmpFileHeader _fileHeader; - private BmpInfoHeader _infoHeader; - - /// - /// Decodes the image from the specified _stream and sets - /// the data to image. - /// - /// The image, where the data should be set to. - /// Cannot be null (Nothing in Visual Basic). - /// The _stream, where the image should be - /// decoded from. Cannot be null (Nothing in Visual Basic). - /// - /// is null (Nothing in Visual Basic). - /// - or - - /// is null (Nothing in Visual Basic). - /// - public Image Decode(Stream stream) - { - _stream = stream; - - try - { - ReadFileHeader(); - ReadInfoHeader(); - - int colorMapSize = -1; - - if (_infoHeader.ClrUsed == 0) - { - if (_infoHeader.BitsPerPixel == 1 || - _infoHeader.BitsPerPixel == 4 || - _infoHeader.BitsPerPixel == 8) - { - colorMapSize = (int)Math.Pow(2, _infoHeader.BitsPerPixel) * 4; - } - } - else - { - colorMapSize = _infoHeader.ClrUsed * 4; - } - - byte[] palette = null; - if (colorMapSize > 0) - { - palette = new byte[colorMapSize]; - - _stream.Read(palette, 0, colorMapSize); - } - - byte[] imageData = new byte[_infoHeader.Width * _infoHeader.Height * 4]; - - switch (_infoHeader.Compression) - { - case BmpCompression.RGB: - if (_infoHeader.HeaderSize != 40) - { - throw new Exception("Header Size value '" + _infoHeader.HeaderSize.ToString() + "' is not valid."); - } - - if (_infoHeader.BitsPerPixel == 32) - { - ReadRgb32(imageData, _infoHeader.Width, _infoHeader.Height); - } - else if (_infoHeader.BitsPerPixel == 24) - { - ReadRgb24(imageData, _infoHeader.Width, _infoHeader.Height); - } - else if (_infoHeader.BitsPerPixel == 16) - { - ReadRgb16(imageData, _infoHeader.Width, _infoHeader.Height); - } - else if (_infoHeader.BitsPerPixel <= 8) - { - ReadRgbPalette(imageData, palette, - _infoHeader.ImageSize, - _infoHeader.Width, - _infoHeader.Height, - _infoHeader.BitsPerPixel); - } - break; - default: - throw new NotSupportedException("Does not support this kind of bitmap files."); - } - - Image i = new Image(_infoHeader.Width, _infoHeader.Height); - int indx = 0; - byte r, g, b, a; - for (uint y = 0; y < i.Height; y++) - { - for (uint x = 0; x < i.Width; x++) - { - r = imageData[indx]; - indx++; - g = imageData[indx]; - indx++; - b = imageData[indx]; - indx++; - a = imageData[indx]; - indx++; - i.SetPixel(x, y, new Pixel(r, g, b, a)); - } - } - imageData = null; - System.GC.Collect(); - return i; - } - catch (IndexOutOfRangeException e) - { - throw new Exception("Bitmap does not have a valid format.", e); - } - } - - private void ReadRgbPalette(byte[] imageData, byte[] colors, int size, int width, int height, int bits) - { - // Pixels per byte (bits per pixel) - int ppb = 8 / bits; - - int arrayWidth = (width + ppb - 1) / ppb; - - // Bit mask - int mask = (0xFF >> (8 - bits)); - - byte[] data = new byte[size]; - _stream.Read(data, 0, size); - - // Rows are aligned on 4 byte boundaries - int alignment = arrayWidth % 4; - if (alignment != 0) - { - alignment = 4 - alignment; - } - - int offset, row, rowOffset, colOffset, arrayOffset; - - for (int y = 0; y < height; y++) - { - rowOffset = y * (arrayWidth + alignment); - - for (int x = 0; x < arrayWidth; x++) - { - offset = rowOffset + x; - - // Revert the y value, because bitmaps are saved from down to top - row = Invert(y, height); - - colOffset = x * ppb; - - for (int shift = 0; shift < ppb && (colOffset + shift) < width; shift++) - { - int colorIndex = ((data[offset]) >> (8 - bits - (shift * bits))) & mask; - - arrayOffset = (row * width + (colOffset + shift)) * 4; - imageData[arrayOffset + 0] = colors[colorIndex * 4 + 2]; - imageData[arrayOffset + 1] = colors[colorIndex * 4 + 1]; - imageData[arrayOffset + 2] = colors[colorIndex * 4 + 0]; - - imageData[arrayOffset + 3] = (byte)255; - - } - } - } - } - - private void ReadRgb16(byte[] imageData, int width, int height) - { - byte r, g, b; - - int scaleR = 256 / 32; - int scaleG = 256 / 64; - - int alignment = 0; - byte[] data = GetImageArray(width, height, 2, ref alignment); - - int offset, row, rowOffset, arrayOffset; - - for (int y = 0; y < height; y++) - { - rowOffset = y * (width * 2 + alignment); - - // Revert the y value, because bitmaps are saved from down to top - row = Invert(y, height); - - for (int x = 0; x < width; x++) - { - offset = rowOffset + x * 2; - - short temp = BitConverter.ToInt16(data, offset); - - r = (byte)(((temp & Rgb16RMask) >> 11) * scaleR); - g = (byte)(((temp & Rgb16GMask) >> 5) * scaleG); - b = (byte)(((temp & Rgb16BMask)) * scaleR); - - arrayOffset = (row * width + x) * 4; - imageData[arrayOffset + 0] = r; - imageData[arrayOffset + 1] = g; - imageData[arrayOffset + 2] = b; - - imageData[arrayOffset + 3] = (byte)255; - } - } - } - - private void ReadRgb24(byte[] imageData, int width, int height) - { - int alignment = 0; - byte[] data = GetImageArray(width, height, 3, ref alignment); - - int offset, row, rowOffset, arrayOffset; - - for (int y = 0; y < height; y++) - { - rowOffset = y * (width * 3 + alignment); - - // Revert the y value, because bitmaps are saved from down to top - row = Invert(y, height); - - for (int x = 0; x < width; x++) - { - offset = rowOffset + x * 3; - - arrayOffset = (row * width + x) * 4; - imageData[arrayOffset + 0] = data[offset + 2]; - imageData[arrayOffset + 1] = data[offset + 1]; - imageData[arrayOffset + 2] = data[offset + 0]; - - imageData[arrayOffset + 3] = (byte)255; - } - } - } - - private void ReadRgb32(byte[] imageData, int width, int height) - { - int alignment = 0; - byte[] data = GetImageArray(width, height, 4, ref alignment); - - int offset, row, rowOffset, arrayOffset; - - for (int y = 0; y < height; y++) - { - rowOffset = y * (width * 4 + alignment); - - // Revert the y value, because bitmaps are saved from down to top - row = Invert(y, height); - - for (int x = 0; x < width; x++) - { - offset = rowOffset + x * 4; - - arrayOffset = (row * width + x) * 4; - imageData[arrayOffset + 0] = data[offset + 2]; - imageData[arrayOffset + 1] = data[offset + 1]; - imageData[arrayOffset + 2] = data[offset + 0]; - - imageData[arrayOffset + 3] = (byte)255; - } - } - } - - private static int Invert(int y, int height) - { - int row = 0; - - if (height > 0) - { - row = (height - y - 1); - } - else - { - row = y; - } - - return row; - } - - private byte[] GetImageArray(int width, int height, int bytes, ref int alignment) - { - int dataWidth = width; - - alignment = (width * bytes) % 4; - if (alignment != 0) - { - alignment = 4 - alignment; - } - - int size = (dataWidth * bytes + alignment) * height; - - byte[] data = new byte[size]; - _stream.Read(data, 0, size); - - return data; - } - - private void ReadInfoHeader() - { - byte[] data = new byte[BmpInfoHeader.Size]; - - _stream.Read(data, 0, BmpInfoHeader.Size); - - _infoHeader = new BmpInfoHeader(); - _infoHeader.HeaderSize = BitConverter.ToInt32(data, 0); - _infoHeader.Width = BitConverter.ToInt32(data, 4); - _infoHeader.Height = BitConverter.ToInt32(data, 8); - _infoHeader.Planes = BitConverter.ToInt16(data, 12); - _infoHeader.BitsPerPixel = BitConverter.ToInt16(data, 14); - _infoHeader.ImageSize = BitConverter.ToInt32(data, 20); - _infoHeader.XPelsPerMeter = BitConverter.ToInt32(data, 24); - _infoHeader.YPelsPerMeter = BitConverter.ToInt32(data, 28); - _infoHeader.ClrUsed = BitConverter.ToInt32(data, 32); - _infoHeader.ClrImportant = BitConverter.ToInt32(data, 36); - _infoHeader.Compression = (BmpCompression)BitConverter.ToInt32(data, 16); - } - - private void ReadFileHeader() - { - byte[] data = new byte[BmpFileHeader.Size]; - - _stream.Read(data, 0, BmpFileHeader.Size); - - _fileHeader = new BmpFileHeader(); - _fileHeader.Type = BitConverter.ToInt16(data, 0); - _fileHeader.FileSize = BitConverter.ToInt32(data, 2); - _fileHeader.Reserved = BitConverter.ToInt32(data, 6); - _fileHeader.Offset = BitConverter.ToInt32(data, 10); - } - - } - #endregion - - #region BmpEncoder - public class BmpEncoder - { - public void Encode(Image image, Stream stream) - { - int rowWidth = image.Width; - - int amount = (image.Width * 3) % 4; - if (amount != 0) - { - rowWidth += 4 - amount; - } - - BinaryWriter writer = new BinaryWriter(stream); - - BmpFileHeader fileHeader = new BmpFileHeader(); - fileHeader.Type = 19778; - fileHeader.Offset = 54; - fileHeader.FileSize = 54 + image.Height * rowWidth * 3; - Write(writer, fileHeader); - - BmpInfoHeader infoHeader = new BmpInfoHeader(); - infoHeader.HeaderSize = 40; - infoHeader.Height = image.Height; - infoHeader.Width = image.Width; - infoHeader.BitsPerPixel = 24; - infoHeader.Planes = 1; - infoHeader.Compression = BmpCompression.RGB; - infoHeader.ImageSize = image.Height * rowWidth * 3; - infoHeader.ClrUsed = 0; - infoHeader.ClrImportant = 0; - Write(writer, infoHeader); - - WriteImage(writer, image); - - writer.Flush(); - } - - private static void WriteImage(BinaryWriter writer, Image image) - { - int amount = (image.Width * 3) % 4, offset = 0; - if (amount != 0) - { - amount = 4 - amount; - } - - byte[] data = ConvertPixelArrayToByteArray(image.Data); - - for (int y = image.Height - 1; y >= 0; y--) - { - for (int x = 0; x < image.Width; x++) - { - offset = (y * image.Width + x) * 4; - - writer.Write(data[offset + 2]); - writer.Write(data[offset + 1]); - writer.Write(data[offset + 0]); - } - - for (int i = 0; i < amount; i++) - { - writer.Write((byte)0); - } - } - } - - private static byte[] ConvertPixelArrayToByteArray(Pixel[] a) - { - byte[] b = new byte[a.Length * 4]; - - int indx = 0; - Pixel p; - for (uint i = 0; i < a.Length; i++) - { - p = a[i]; - b[indx] = p.R; - indx++; - b[indx] = p.G; - indx++; - b[indx] = p.B; - indx++; - b[indx] = p.A; - indx++; - } - - return b; - } - - private static void Write(BinaryWriter writer, BmpFileHeader fileHeader) - { - writer.Write(fileHeader.Type); - writer.Write(fileHeader.FileSize); - writer.Write(fileHeader.Reserved); - writer.Write(fileHeader.Offset); - } - - private static void Write(BinaryWriter writer, BmpInfoHeader infoHeader) - { - writer.Write(infoHeader.HeaderSize); - writer.Write(infoHeader.Width); - writer.Write(infoHeader.Height); - writer.Write(infoHeader.Planes); - writer.Write(infoHeader.BitsPerPixel); - writer.Write((int)infoHeader.Compression); - writer.Write(infoHeader.ImageSize); - writer.Write(infoHeader.XPelsPerMeter); - writer.Write(infoHeader.YPelsPerMeter); - writer.Write(infoHeader.ClrUsed); - writer.Write(infoHeader.ClrImportant); - } - } - #endregion - - #region BitmapCompression - private enum BmpCompression : int - { - /// - /// Each image row has a multiple of four elements. If the - /// row has less elements, zeros will be added at the right side. - /// The format depends on the number of bits, stored in the info header. - /// If the number of bits are one, four or eight each pixel data is - /// a index to the palette. If the number of bits are sixteen, - /// twenty-four or thirtee-two each pixel contains a color. - /// - RGB = 0, - /// - /// Two bytes are one data record. If the first byte is not zero, the - /// next two half bytes will be repeated as much as the value of the first byte. - /// If the first byte is zero, the record has different meanings, depending - /// on the second byte. If the second byte is zero, it is the end of the row, - /// if it is one, it is the end of the image. - /// Not supported at the moment. - /// - RLE8 = 1, - /// - /// Two bytes are one data record. If the first byte is not zero, the - /// next byte will be repeated as much as the value of the first byte. - /// If the first byte is zero, the record has different meanings, depending - /// on the second byte. If the second byte is zero, it is the end of the row, - /// if it is one, it is the end of the image. - /// Not supported at the moment. - /// - RLE4 = 2, - /// - /// Each image row has a multiple of four elements. If the - /// row has less elements, zeros will be added at the right side. - /// Not supported at the moment. - /// - BitFields = 3, - /// - /// The bitmap contains a JPG image. - /// Not supported at the moment. - /// - JPEG = 4, - /// - /// The bitmap contains a PNG image. - /// Not supported at the moment. - /// - PNG = 5 - } - #endregion - - #region BmpFileHeader - private class BmpFileHeader - { - /// - /// Defines of the data structure in the bitmap file. - /// - public const int Size = 14; - - /// - /// The magic number used to identify the bitmap file: 0x42 0x4D - /// (Hex code points for B and M) - /// - public short Type; - /// - /// The size of the bitmap file in bytes. - /// - public int FileSize; - /// - /// Reserved; actual value depends on the application - /// that creates the image. - /// - public int Reserved; - /// - /// The offset, i.e. starting address, of the byte where - /// the bitmap data can be found. - /// - public int Offset; - } - #endregion - - #region BmpInfoHeader - private class BmpInfoHeader - { - /// - /// Defines of the data structure in the bitmap file. - /// - public const int Size = 40; - - /// - /// The size of this header (40 bytes) - /// - public int HeaderSize; - /// - /// The bitmap width in pixels (signed integer). - /// - public int Width; - /// - /// The bitmap height in pixels (signed integer). - /// - public int Height; - /// - /// The number of color planes being used. Must be set to 1. - /// - public short Planes; - /// - /// The number of bits per pixel, which is the color depth of the image. - /// Typical values are 1, 4, 8, 16, 24 and 32. - /// - public short BitsPerPixel; - /// - /// The compression method being used. - /// See the next table for a list of possible values. - /// - public BmpCompression Compression; - /// - /// The image size. This is the size of the raw bitmap data (see below), - /// and should not be confused with the file size. - /// - public int ImageSize; - /// - /// The horizontal resolution of the image. - /// (pixel per meter, signed integer) - /// - public int XPelsPerMeter; - /// - /// The vertical resolution of the image. - /// (pixel per meter, signed integer) - /// - public int YPelsPerMeter; - /// - /// The number of colors in the color palette, - /// or 0 to default to 2^n. - /// - public int ClrUsed; - /// - /// The number of important colors used, - /// or 0 when every color is important; generally ignored. - /// - public int ClrImportant; - } - #endregion - - } - #endregion - - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/DdsSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/DdsSupport.cs deleted file mode 100644 index 312b794b3f..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/DdsSupport.cs +++ /dev/null @@ -1,1654 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using Orvid.Graphics; - -namespace Orvid.Graphics.ImageFormats -{ - public class DdsImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - //byte[] b = DDS.Encode((System.Drawing.Bitmap)i, "dxt5"); - //dest.Write(b, 0, b.Length); - //b = null; - } - - public override Image Load(Stream s) - { - DDSImage im = new DDSImage(s); - return im.BitmapImage; - } - } -} - -#region Internals -// Please note, everything below this -// point was originally from -// http://sourceforge.net/projects/igaeditor/ -// -// -// The source has been modified for use in this library, -// the modifications include extending functionality. -// -// The extended functionality is licensed seperately from -// the rest of this file. Permission for it's use have been -// granted only for use in Cosmos, and products created -// using the Cosmos toolkit. It is not allowed to be used -// in any other way, shape, or form. -// -// -// This disclaimer and license was last -// modified on August 10, 2011. - -namespace Orvid.Graphics.ImageFormats -{ - public class DDSImage - { - #region PixelFormat - private enum PixelFormat - { - /// - /// 32-bit image, with 8-bit red, green, blue and alpha. - /// - ARGB, - /// - /// 24-bit image with 8-bit red, green, blue. - /// - RGB, - /// - /// 16-bit DXT-1 compression, 1-bit alpha. - /// - DXT1, - /// - /// DXT-2 Compression - /// - DXT2, - /// - /// DXT-3 Compression - /// - DXT3, - /// - /// DXT-4 Compression - /// - DXT4, - /// - /// DXT-5 Compression - /// - DXT5, - /// - /// 3DC Compression - /// - THREEDC, - /// - /// ATI1n Compression - /// - ATI1N, - LUMINANCE, - LUMINANCE_ALPHA, - RXGB, - A16B16G16R16, - R16F, - G16R16F, - A16B16G16R16F, - R32F, - G32R32F, - A32B32G32R32F, - /// - /// Unknown pixel format. - /// - UNKNOWN - } - #endregion - - private static byte[] DDS_HEADER = Convert.FromBase64String("RERTIA=="); - - // fourccs - private const uint FOURCC_DXT1 = 827611204; - private const uint FOURCC_DXT2 = 844388420; - private const uint FOURCC_DXT3 = 861165636; - private const uint FOURCC_DXT4 = 877942852; - private const uint FOURCC_DXT5 = 894720068; - private const uint FOURCC_ATI1 = 826889281; - private const uint FOURCC_ATI2 = 843666497; - private const uint FOURCC_RXGB = 1111971922; - private const uint FOURCC_DOLLARNULL = 36; - private const uint FOURCC_oNULL = 111; - private const uint FOURCC_pNULL = 112; - private const uint FOURCC_qNULL = 113; - private const uint FOURCC_rNULL = 114; - private const uint FOURCC_sNULL = 115; - private const uint FOURCC_tNULL = 116; - - - // other defines - private const uint DDS_LINEARSIZE = 524288; - private const uint DDS_PITCH = 8; - private const uint DDS_FOURCC = 4; - private const uint DDS_LUMINANCE = 131072; - private const uint DDS_ALPHAPIXELS = 1; - - // headers - // DDSURFACEDESC2 structure - private byte[] signature; - private uint size1; - private uint flags1; - private uint height; - private uint width; - private uint linearsize; - private uint depth; - private uint mipmapcount; - private uint alphabitdepth; - // DDPIXELFORMAT structure - private uint size2; - private uint flags2; - private uint fourcc; - private uint rgbbitcount; - private uint rbitmask; - private uint bbitmask; - private uint gbitmask; - private uint alphabitmask; - - // DDCAPS2 structure - private uint ddscaps1; - private uint ddscaps2; - private uint ddscaps3; - private uint ddscaps4; - // end DDCAPS2 structure - private uint texturestage; - // end DDSURFACEDESC2 structure - - private PixelFormat CompFormat; - private uint blocksize; - - private uint bpp; - private uint bps; - private uint sizeofplane; - private uint compsize; - private byte[] compdata; - private byte[] rawidata; - private bool Has16BitComponents = false; - private BinaryReader br; - private Image img; - - public Image BitmapImage { get { return this.img; } } - - /// - /// Constructs a new DDSImage object using the given byte array, which - /// contains the raw DDS file. - /// - /// A byte[] containing the DDS file. - public DDSImage(Stream ms) - { - br = new BinaryReader(ms); - this.signature = br.ReadBytes(4); - - if (!IsByteArrayEqual(this.signature, DDS_HEADER)) - { - System.Console.WriteLine("Got header of '" + ASCIIEncoding.ASCII.GetString(this.signature, 0, this.signature.Length) + "'."); - - throw new Exception("Not a dds File!"); - } - - //System.Console.WriteLine("Got dds header okay"); - - // now read in the rest - this.size1 = br.ReadUInt32(); - this.flags1 = br.ReadUInt32(); - this.height = br.ReadUInt32(); - this.width = br.ReadUInt32(); - this.linearsize = br.ReadUInt32(); - this.depth = br.ReadUInt32(); - this.mipmapcount = br.ReadUInt32(); - this.alphabitdepth = br.ReadUInt32(); - - // skip next 10 uints - for (int x = 0; x < 10; x++) - { - br.ReadUInt32(); - } - - this.size2 = br.ReadUInt32(); - this.flags2 = br.ReadUInt32(); - this.fourcc = br.ReadUInt32(); - this.rgbbitcount = br.ReadUInt32(); - this.rbitmask = br.ReadUInt32(); - this.gbitmask = br.ReadUInt32(); - this.bbitmask = br.ReadUInt32(); - this.alphabitmask = br.ReadUInt32(); - this.ddscaps1 = br.ReadUInt32(); - this.ddscaps2 = br.ReadUInt32(); - this.ddscaps3 = br.ReadUInt32(); - this.ddscaps4 = br.ReadUInt32(); - this.texturestage = br.ReadUInt32(); - - - // patches for stuff - if (this.depth == 0) - { - this.depth = 1; - } - - if ((this.flags2 & DDS_FOURCC) > 0) - { - blocksize = ((this.width + 3) / 4) * ((this.height + 3) / 4) * this.depth; - - switch (this.fourcc) - { - case FOURCC_DXT1: - CompFormat = PixelFormat.DXT1; - blocksize *= 8; - break; - - case FOURCC_DXT2: - CompFormat = PixelFormat.DXT2; - blocksize *= 16; - break; - - case FOURCC_DXT3: - CompFormat = PixelFormat.DXT3; - blocksize *= 16; - break; - - case FOURCC_DXT4: - CompFormat = PixelFormat.DXT4; - blocksize *= 16; - break; - - case FOURCC_DXT5: - CompFormat = PixelFormat.DXT5; - blocksize *= 16; - break; - - case FOURCC_ATI1: - CompFormat = PixelFormat.ATI1N; - blocksize *= 8; - break; - - case FOURCC_ATI2: - CompFormat = PixelFormat.THREEDC; - blocksize *= 16; - break; - - case FOURCC_RXGB: - CompFormat = PixelFormat.RXGB; - blocksize *= 16; - break; - - case FOURCC_DOLLARNULL: - CompFormat = PixelFormat.A16B16G16R16; - blocksize = this.width * this.height * this.depth * 8; - break; - - case FOURCC_oNULL: - CompFormat = PixelFormat.R16F; - blocksize = this.width * this.height * this.depth * 2; - break; - - case FOURCC_pNULL: - CompFormat = PixelFormat.G16R16F; - blocksize = this.width * this.height * this.depth * 4; - break; - - case FOURCC_qNULL: - CompFormat = PixelFormat.A16B16G16R16F; - blocksize = this.width * this.height * this.depth * 8; - break; - - case FOURCC_rNULL: - CompFormat = PixelFormat.R32F; - blocksize = this.width * this.height * this.depth * 4; - break; - - case FOURCC_sNULL: - CompFormat = PixelFormat.G32R32F; - blocksize = this.width * this.height * this.depth * 8; - break; - - case FOURCC_tNULL: - CompFormat = PixelFormat.A32B32G32R32F; - blocksize = this.width * this.height * this.depth * 16; - break; - - default: - CompFormat = PixelFormat.UNKNOWN; - blocksize *= 16; - break; - } // switch - } - else - { - // uncompressed image - if ((this.flags2 & DDS_LUMINANCE) > 0) - { - if ((this.flags2 & DDS_ALPHAPIXELS) > 0) - { - CompFormat = PixelFormat.LUMINANCE_ALPHA; - } - else - { - CompFormat = PixelFormat.LUMINANCE; - } - } - else - { - if ((this.flags2 & DDS_ALPHAPIXELS) > 0) - { - CompFormat = PixelFormat.ARGB; - } - else - { - CompFormat = PixelFormat.RGB; - } - } - - blocksize = (this.width * this.height * this.depth * (this.rgbbitcount >> 3)); - } - - if (CompFormat == PixelFormat.UNKNOWN) - { - throw new Exception("Invalid Header Format!"); - return; - } - - if ((this.flags1 & (DDS_LINEARSIZE | DDS_PITCH)) == 0 - || this.linearsize == 0) - { - this.flags1 |= DDS_LINEARSIZE; - this.linearsize = blocksize; - } - - - // get image data - this.ReadData(); - - // allocate bitmap - this.bpp = this.PixelFormatToBpp(this.CompFormat); - this.bps = this.width * this.bpp * this.PixelFormatToBpc(this.CompFormat); - this.sizeofplane = this.bps * this.height; - this.rawidata = new byte[this.width * this.height * 4]; - - Check16BitComponents(); - - // decompress - switch (this.CompFormat) - { - case PixelFormat.ARGB: - case PixelFormat.RGB: - case PixelFormat.LUMINANCE: - case PixelFormat.LUMINANCE_ALPHA: - this.DecompressARGB(); - break; - - case PixelFormat.DXT1: - this.DecompressDXT1(); - break; - - case PixelFormat.DXT2: - this.DecompressDXT3(); - //this.CorrectPreMult(); - break; - - case PixelFormat.DXT3: - this.DecompressDXT3(); - break; - - case PixelFormat.DXT4: - this.DecompressDXT5(); - //this.CorrectPreMult(); - break; - - case PixelFormat.DXT5: - this.DecompressDXT5(); - break; - - case PixelFormat.THREEDC: - this.Decompress3Dc(); - break; - - case PixelFormat.ATI1N: - //throw new Exception(); - this.DecompressAti1n(); - break; - - case PixelFormat.A16B16G16R16: - this.DecompressA16B16G16R16(); - break; - - case PixelFormat.R16F: - case PixelFormat.G16R16F: - case PixelFormat.A16B16G16R16F: - case PixelFormat.R32F: - case PixelFormat.G32R32F: - case PixelFormat.A32B32G32R32F: - this.DecompressFloat(); - break; - - default: - //throw new Exception("Unknown file format!"); - break; - } - - this.img = new Image((int)this.width, (int)this.height); - - //try - //{ - // now fill bitmap with raw image datas. - uint pos = 0; - for (int y = 0; y < this.height; y++) - { - for (int x = 0; x < this.width; x++) - { - // draw - this.img.SetPixel((uint)x, (uint)y, new Pixel(this.rawidata[pos], this.rawidata[pos + 1], this.rawidata[pos + 2], this.rawidata[pos + 3])); - pos += 4; - } - } - //} - //catch { } - - // cleanup - this.rawidata = null; - this.compdata = null; - - } - - #region Support Methods - private void CorrectPreMult() - { - for (uint i = 0; i < this.rawidata.Length; i += 4) - { - if (this.rawidata[i + 3] != 0) // Cannot divide by 0. - { - this.rawidata[i] = (byte)((uint)(this.rawidata[i] << 8) / this.rawidata[i + 3]); - this.rawidata[i + 1] = (byte)((uint)(this.rawidata[i + 1] << 8) / this.rawidata[i + 3]); - this.rawidata[i + 2] = (byte)((uint)(this.rawidata[i + 2] << 8) / this.rawidata[i + 3]); - } - } - } - - private void Check16BitComponents() - { - if (this.rgbbitcount != 32) - { - Has16BitComponents = false; - } - - // a2b10g10r10 format - if (this.rbitmask == 0x3FF00000 && this.gbitmask == 0x000FFC00 && this.bbitmask == 0x000003FF && this.alphabitmask == 0xC0000000) - { - Has16BitComponents = true; - } - // a2r10g10b10 format - else if (this.rbitmask == 0x000003FF && this.gbitmask == 0x000FFC00 && this.bbitmask == 0x3FF00000 && this.alphabitmask == 0xC0000000) - { - Has16BitComponents = true; - } - else - { - Has16BitComponents = false; - } - return; - } - - private static bool IsByteArrayEqual(byte[] arg0, byte[] arg1) - { - if (arg0.Length != arg1.Length) - { - return false; - } - - for (int x = 0; x < arg0.Length; x++) - { - if (arg0[x] != arg1[x]) - { - return false; - } - } - - return true; - } - - // iCompFormatToBpp - private uint PixelFormatToBpp(PixelFormat pf) - { - switch (pf) - { - case PixelFormat.LUMINANCE: - case PixelFormat.LUMINANCE_ALPHA: - case PixelFormat.ARGB: - case PixelFormat.RGB: - return this.rgbbitcount / 8; - - case PixelFormat.THREEDC: - case PixelFormat.RXGB: - return 3; - - case PixelFormat.ATI1N: - return 1; - - case PixelFormat.R16F: - return 2; - - case PixelFormat.A16B16G16R16: - case PixelFormat.A16B16G16R16F: - case PixelFormat.G32R32F: - return 8; - - case PixelFormat.A32B32G32R32F: - return 16; - - default: - return 4; - } - } - - // iCompFormatToBpc - private uint PixelFormatToBpc(PixelFormat pf) - { - switch (pf) - { - case PixelFormat.R16F: - case PixelFormat.G16R16F: - case PixelFormat.A16B16G16R16F: - return 4; - - case PixelFormat.R32F: - case PixelFormat.G32R32F: - case PixelFormat.A32B32G32R32F: - return 4; - - case PixelFormat.A16B16G16R16: - return 2; - - default: - return 1; - } - } - - // iCompFormatToChannelCount - private uint PixelFormatToChannelCount(PixelFormat pf) - { - switch (pf) - { - case PixelFormat.RGB: - case PixelFormat.THREEDC: - case PixelFormat.RXGB: - return 3; - - case PixelFormat.LUMINANCE: - case PixelFormat.R16F: - case PixelFormat.R32F: - case PixelFormat.ATI1N: - return 1; - - case PixelFormat.LUMINANCE_ALPHA: - case PixelFormat.G16R16F: - case PixelFormat.G32R32F: - return 2; - - default: - return 4; - } - } - - private void ReadData() - { - this.compdata = null; - - if ((this.flags1 & DDS_LINEARSIZE) > 1) - { - this.compdata = this.br.ReadBytes((int)this.linearsize); - this.compsize = (uint)this.compdata.Length; - } - else - { - this.bps = this.width * (this.rgbbitcount / 8); - this.compsize = this.bps * this.height * this.depth; - this.compdata = new byte[this.compsize]; - - MemoryStream mem = new MemoryStream((int)this.compsize); - - - byte[] temp; - for (int z = 0; z < this.depth; z++) - { - for (int y = 0; y < this.height; y++) - { - temp = this.br.ReadBytes((int)this.bps); - mem.Write(temp, 0, temp.Length); - } - } - mem.Seek(0, SeekOrigin.Begin); - - mem.Read(this.compdata, 0, this.compdata.Length); - mem.Close(); - } - } - - private void GetBitsFromMask(uint Mask, out byte ShiftLeft, out byte ShiftRight) - { - uint Temp, i; - if (Mask == 0) - { - ShiftLeft = ShiftRight = 0; - return; - } - Temp = Mask; - for (i = 0; i < 32; i++, Temp >>= 1) - { - if ((Temp & 1) > 0) - break; - } - ShiftRight = (byte)i; - for (i = 0; i < 8; i++, Temp >>= 1) - { - if (!((Temp & 1) > 0)) - break; - } - ShiftLeft = (byte)(8 - i); - return; - } - - private uint CountBitsFromMask(uint Mask) - { - uint i, TestBit = 0x01, Count = 0; - bool FoundBit = false; - - for (i = 0; i < 32; i++, TestBit <<= 1) - { - if ((Mask & TestBit) > 0) - { - if (!FoundBit) - FoundBit = true; - Count++; - } - else if (FoundBit) - return Count; - } - - return Count; - } - #endregion - - - #region 3Dc - private void Decompress3Dc() - { - int x, y, z, i, j, k, t1, t2; - int t, tx, ty; - //double d; - //double r, g, b; - int TempLoc = 0, Temp2Loc = 0; - byte[] XColours = new byte[8], YColours = new byte[8]; - uint bitmask, bitmask2, Offset, CurrOffset; - - - Offset = 0; - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y += 4) - { - for (x = 0; x < width; x += 4) - { - Temp2Loc = TempLoc + 8; - - //Read Y palette - t1 = YColours[0] = compdata[TempLoc]; - t2 = YColours[1] = compdata[TempLoc + 1]; - TempLoc += 2; - if (t1 > t2) - { - for (i = 2; i < 8; ++i) - { - YColours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 7); - } - } - else - { - for (i = 2; i < 6; ++i) - { - YColours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 5); - } - YColours[6] = 0; - YColours[7] = 255; - } - - // Read X palette - t1 = XColours[0] = compdata[Temp2Loc]; - t2 = XColours[1] = compdata[Temp2Loc + 1]; - Temp2Loc += 2; - if (t1 > t2) - { - for (i = 2; i < 8; ++i) - { - XColours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 7); - } - } - else - { - for (i = 2; i < 6; ++i) - { - XColours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 5); - } - XColours[6] = 0; - XColours[7] = 255; - } - - //decompress pixel data - CurrOffset = Offset; - for (k = 0; k < 4; k += 2) - { - // First three bytes - bitmask = (compdata[TempLoc]) | ((uint)(compdata[TempLoc + 1]) << 8) | ((uint)(compdata[TempLoc + 2]) << 16); - bitmask2 = (compdata[Temp2Loc]) | ((uint)(compdata[Temp2Loc + 1]) << 8) | ((uint)(compdata[Temp2Loc + 2]) << 16); - for (j = 0; j < 2; j++) - { - // only put pixels out < height - if ((y + k + j) < height) - { - for (i = 0; i < 4; i++) - { - // only put pixels out < width - if (((x + i) < width)) - { - - t1 = (int)(CurrOffset + ((x + i) * 4)); - rawidata[t1 + 1] = YColours[bitmask & 7]; - rawidata[t1 + 0] = XColours[bitmask2 & 7]; - tx = XColours[bitmask2 & 7]; - ty = YColours[bitmask & 7]; - - //calculate b (z) component ((r/255)^2 + (g/255)^2 + (b/255)^2 = 1 - //d = (double)255 * Math.Sqrt(((double)tx / 255) + ((double)ty / 255)); - //if (d > 255) - //{ - // rawidata[t1 + 2] = (byte)((d - 255) + 127); - // //rawidata[t1 ] = (byte)(rawidata[t1 ] + 127); - // //rawidata[t1 + 1] = (byte)((255 - rawidata[t1 + 1]) + 127); - //} - //else - //{ - // rawidata[t1 + 2] = (byte)(d); - //} - //rawidata[t1 + 2] = (d > 255 ? (byte)((d - 255) + 128) : (byte)d); - - //if (rawidata[t1 + 2] == 0 && d != 0) - //{ - // throw new Exception(); - //} - - //r = XColours[bitmask2 & 7]; - //g = YColours[bitmask & 7]; - //b = (d > 255 ? (byte)255 : (byte)d); - //if ((((r / 255) * (r / 255)) + ((g / 255) * (g / 255)) + ((b / 255) * (b / 255))) != 1) - //{ - //throw new Exception(); - //rawidata[t1 + 2] = 127; - //} - - t = (int)(127 * 128 - ((tx - 127) * (tx - 128)) - ((ty - 127) * (ty - 128))); - if (t > 0) - { - //rawidata[t1 + 2] = 0x7F; - rawidata[t1 + 2] = (byte)(Math.Sqrt(t) + 128);// > 255 ? (byte)255 : (Math.Sqrt(t) + 128)); - } - else - { - rawidata[t1 + 2] = 0x7F; - } - rawidata[t1 + 3] = 255; - } - bitmask >>= 3; - bitmask2 >>= 3; - } - CurrOffset += width * 4; - } - } - TempLoc += 3; - Temp2Loc += 3; - } - TempLoc += 8; - } - Offset += this.width * 16; - } - } - } - #endregion - - #region Ati1n - private void DecompressAti1n() - { - int x, y, z, i, j, k, t1, t2; - uint TempLoc = 0; - byte[] Colours = new byte[8]; - uint bitmask, Offset, CurrOffset; - - Offset = 0; - for (z = 0; z < depth; z++) - { - for (y = 0; y < height; y += 4) - { - for (x = 0; x < width; x += 4) - { - //Read palette - t1 = Colours[0] = compdata[TempLoc]; - t2 = Colours[1] = compdata[TempLoc + 1]; - TempLoc += 2; - if (t1 > t2) - { - for (i = 2; i < 8; ++i) - { - Colours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 7); - } - } - else - { - for (i = 2; i < 6; ++i) - { - Colours[i] = (byte)(t1 + ((t2 - t1) * (i - 1)) / 5); - } - Colours[6] = 0; - Colours[7] = 255; - } - - //decompress pixel data - CurrOffset = Offset; - for (k = 0; k < 4; k += 2) - { - // First three bytes - bitmask = ((compdata[TempLoc]) | ((uint)(compdata[TempLoc + 1]) << 8) | ((uint)(compdata[TempLoc + 2]) << 16)); - for (j = 0; j < 2; j++) - { - // only put pixels out < height - if ((y + k + j) < height) - { - for (i = 0; i < 4; i++) - { - // only put pixels out < width - if (((x + i) < width)) - { - t1 = (byte)(CurrOffset + ((x + i) * 4)); - rawidata[t1 ] = Colours[bitmask & 0x07]; - rawidata[t1 + 1] = Colours[bitmask & 0x07]; - rawidata[t1 + 2] = Colours[bitmask & 0x07]; - rawidata[t1 + 3] = 255; - } - bitmask >>= 3; - } - CurrOffset += width * 4; - } - } - TempLoc += 3; - } - } - Offset += this.width * 16; - } - } - } - #endregion - - // #region RXGB - // ILboolean DecompressRXGB() - //{ - // int x, y, z, i, j, k, Select; - // ILubyte *Temp; - // Color565 *color_0, *color_1; - // Color8888 colours[4], *col; - // ILuint bitmask, Offset; - // ILubyte alphas[8], *alphamask; - // ILuint bits; - - // if (!CompData) - // return IL_FALSE; - - // Temp = CompData; - // for (z = 0; z < Depth; z++) { - // for (y = 0; y < Height; y += 4) { - // for (x = 0; x < Width; x += 4) { - // if (y >= Height || x >= Width) - // break; - // alphas[0] = Temp[0]; - // alphas[1] = Temp[1]; - // alphamask = Temp + 2; - // Temp += 8; - // color_0 = ((Color565*)Temp); - // color_1 = ((Color565*)(Temp+2)); - // bitmask = ((ILuint*)Temp)[1]; - // Temp += 8; - - // colours[0].r = color_0->nRed << 3; - // colours[0].g = color_0->nGreen << 2; - // colours[0].b = color_0->nBlue << 3; - // colours[0].a = 0xFF; - - // colours[1].r = color_1->nRed << 3; - // colours[1].g = color_1->nGreen << 2; - // colours[1].b = color_1->nBlue << 3; - // colours[1].a = 0xFF; - - // // Four-color block: derive the other two colors. - // // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3 - // // These 2-bit codes correspond to the 2-bit fields - // // stored in the 64-bit block. - // colours[2].b = (2 * colours[0].b + colours[1].b + 1) / 3; - // colours[2].g = (2 * colours[0].g + colours[1].g + 1) / 3; - // colours[2].r = (2 * colours[0].r + colours[1].r + 1) / 3; - // colours[2].a = 0xFF; - - // colours[3].b = (colours[0].b + 2 * colours[1].b + 1) / 3; - // colours[3].g = (colours[0].g + 2 * colours[1].g + 1) / 3; - // colours[3].r = (colours[0].r + 2 * colours[1].r + 1) / 3; - // colours[3].a = 0xFF; - - // k = 0; - // for (j = 0; j < 4; j++) { - // for (i = 0; i < 4; i++, k++) { - - // Select = (bitmask & (0x03 << k*2)) >> k*2; - // col = &colours[Select]; - - // // only put pixels out < width or height - // if (((x + i) < Width) && ((y + j) < Height)) { - // Offset = z * Image->SizeOfPlane + (y + j) * Image->Bps + (x + i) * Image->Bpp; - // Image->Data[Offset + 0] = col->r; - // Image->Data[Offset + 1] = col->g; - // Image->Data[Offset + 2] = col->b; - // } - // } - // } - - // // 8-alpha or 6-alpha block? - // if (alphas[0] > alphas[1]) { - // // 8-alpha block: derive the other six alphas. - // // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated. - // alphas[2] = (6 * alphas[0] + 1 * alphas[1] + 3) / 7; // bit code 010 - // alphas[3] = (5 * alphas[0] + 2 * alphas[1] + 3) / 7; // bit code 011 - // alphas[4] = (4 * alphas[0] + 3 * alphas[1] + 3) / 7; // bit code 100 - // alphas[5] = (3 * alphas[0] + 4 * alphas[1] + 3) / 7; // bit code 101 - // alphas[6] = (2 * alphas[0] + 5 * alphas[1] + 3) / 7; // bit code 110 - // alphas[7] = (1 * alphas[0] + 6 * alphas[1] + 3) / 7; // bit code 111 - // } - // else { - // // 6-alpha block. - // // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated. - // alphas[2] = (4 * alphas[0] + 1 * alphas[1] + 2) / 5; // Bit code 010 - // alphas[3] = (3 * alphas[0] + 2 * alphas[1] + 2) / 5; // Bit code 011 - // alphas[4] = (2 * alphas[0] + 3 * alphas[1] + 2) / 5; // Bit code 100 - // alphas[5] = (1 * alphas[0] + 4 * alphas[1] + 2) / 5; // Bit code 101 - // alphas[6] = 0x00; // Bit code 110 - // alphas[7] = 0xFF; // Bit code 111 - // } - - // // Note: Have to separate the next two loops, - // // it operates on a 6-byte system. - // // First three bytes - // bits = *((ILint*)alphamask); - // for (j = 0; j < 2; j++) { - // for (i = 0; i < 4; i++) { - // // only put pixels out < width or height - // if (((x + i) < Width) && ((y + j) < Height)) { - // Offset = z * Image->SizeOfPlane + (y + j) * Image->Bps + (x + i) * Image->Bpp + 0; - // Image->Data[Offset] = alphas[bits & 0x07]; - // } - // bits >>= 3; - // } - // } - - // // Last three bytes - // bits = *((ILint*)&alphamask[3]); - // for (j = 2; j < 4; j++) { - // for (i = 0; i < 4; i++) { - // // only put pixels out < width or height - // if (((x + i) < Width) && ((y + j) < Height)) { - // Offset = z * Image->SizeOfPlane + (y + j) * Image->Bps + (x + i) * Image->Bpp + 0; - // Image->Data[Offset] = alphas[bits & 0x07]; - // } - // bits >>= 3; - // } - // } - // } - // } - // } - - // return IL_TRUE; - //} - // #endregion - - #region Float - private void DecompressFloat() - { - uint i, j, Size; - - switch (this.CompFormat) - { - case PixelFormat.R32F: // Red float, green = blue = max - Size = this.width * this.height * 4; - for (i = 0, j = 0; i < Size; i += 4, j += 4) - { - rawidata[i] = (byte)((BitConverter.ToSingle(compdata, (int)j)) * 255); - rawidata[i + 1] = 255; - rawidata[i + 2] = 255; - rawidata[i + 3] = 255; - } - return; - - case PixelFormat.A32B32G32R32F: // Direct copy of float RGBA data - Size = this.width * this.height * 4; - for (i = 0, j = 0; i < Size; i += 4, j += 16) - { - rawidata[i] = (byte)((BitConverter.ToSingle(compdata, (int)j)) * 255); - rawidata[i + 1] = (byte)((BitConverter.ToSingle(compdata, (int)j + 4)) * 255); - rawidata[i + 2] = (byte)((BitConverter.ToSingle(compdata, (int)j + 8)) * 255); ; - rawidata[i + 3] = (byte)((BitConverter.ToSingle(compdata, (int)j + 12)) * 255); ; - } - - return; - case PixelFormat.G32R32F: // Red double, green float, blue = max - Size = this.width * this.height * 4; - for (i = 0, j = 0; i < Size; i += 4, j += 8) - { - rawidata[i] = (byte)((BitConverter.ToSingle(compdata, (int)j)) * 255); - rawidata[i + 1] = (byte)((BitConverter.ToSingle(compdata, (int)j + 4)) * 255); - rawidata[i + 2] = 255; - rawidata[i + 3] = 255; - } - return; - - case PixelFormat.R16F: // Red float, green = blue = max - iConvR16ToFloat32(); - return; - - case PixelFormat.A16B16G16R16F: // Just convert from half to float. - iConvFloat16ToFloat32(); - return; - - case PixelFormat.G16R16F: // Convert from half to float, set blue = max. - iConvG16R16ToFloat32(); - return; - - default: - throw new Exception("Unknown Float Type!"); - } - } - - private float[] compFloatData; - - private void iConvFloat16ToFloat32() - { - uint flen = (uint)Math.Ceiling((double)(compdata.Length / 2)); - compFloatData = new float[flen]; - for (uint i = 0, cloc = 0; i < flen; i++, cloc += 2) - { - compFloatData[i] = (float)Half.ToHalf(compdata, (int)cloc); - } - - DecompressFloatData(); - } - - private void DecompressFloatData() - { - uint Size = this.width * this.height * 4; - for (uint i = 0, j = 0; i < Size; i += 4, j += 4) - { - rawidata[i] = (byte)((compFloatData[j]) * 255); - rawidata[i + 1] = (byte)((compFloatData[j + 1]) * 255); - rawidata[i + 2] = (byte)((compFloatData[j + 2]) * 255); - rawidata[i + 3] = (byte)((compFloatData[j + 3]) * 255); - } - compFloatData = null; - } - - private void iConvG16R16ToFloat32() - { - uint flen = (uint)Math.Ceiling((double)(compdata.Length / 2)); - compFloatData = new float[flen]; - for (uint i = 0, cloc = 0; i < flen; i += 4, cloc += 4) - { - compFloatData[i] = (float)Half.ToHalf(compdata, (int)cloc); - compFloatData[i + 1] = (float)Half.ToHalf(compdata, (int)cloc + 2); - compFloatData[i + 2] = 1.0f; - compFloatData[i + 3] = 1.0f; - } - - DecompressFloatData(); - } - - private void iConvR16ToFloat32() - { - uint flen = (uint)Math.Ceiling((double)(compdata.Length / 2)); - compFloatData = new float[flen]; - for (uint i = 0, cloc = 0; i < flen; i += 4, cloc += 2) - { - compFloatData[i] = (float)Half.ToHalf(compdata, (int)cloc); - compFloatData[i + 1] = 1.0f; - compFloatData[i + 2] = 1.0f; - compFloatData[i + 3] = 1.0f; - } - - DecompressFloatData(); - } - #endregion - - #region A16B16G16R16 - private void DecompressA16B16G16R16() - { - uint curloc = 0; - for (uint i = 0; i < compdata.Length; i += 8) - { - rawidata[curloc] = compdata[i + 0]; - rawidata[curloc + 1] = compdata[i + 2]; - rawidata[curloc + 2] = compdata[i + 4]; - rawidata[curloc + 3] = compdata[i + 6]; - - curloc += 4; - } - } - #endregion - - #region ARGB - private void DecompressARGB() - { - if (CompFormat == PixelFormat.LUMINANCE) - { - byte ReadI = 0; - uint i, curloc = 0; - this.rawidata = new byte[this.compdata.Length * 4]; - for (i = 0; i < this.compdata.Length; i += 1) - { - ReadI = compdata[i]; - this.rawidata[curloc] = ReadI; - this.rawidata[curloc + 1] = ReadI; - this.rawidata[curloc + 2] = ReadI; - this.rawidata[curloc + 3] = 0xff; - curloc += 4; - } - return; - } - else if (CompFormat == PixelFormat.LUMINANCE_ALPHA) - { - if (this.bpp == 2) - { - byte ReadI = 0; - uint i, curloc = 0; - for (i = 0; i < this.compdata.Length; i += 2) - { - ReadI = compdata[i]; - this.rawidata[curloc] = (byte)ReadI; - this.rawidata[curloc + 1] = (byte)ReadI; - this.rawidata[curloc + 2] = (byte)ReadI; - this.rawidata[curloc + 3] = compdata[i + 1]; - curloc += 4; - } - } - else if (this.bpp == 1) - { - byte ReadI = 0; - uint i, curloc = 0; - for (i = 0; i < this.compdata.Length; i++) - { - ReadI = (byte)((compdata[i] & 15) << 4); - this.rawidata[curloc] = ReadI; - this.rawidata[curloc + 1] = ReadI; - this.rawidata[curloc + 2] = ReadI; - this.rawidata[curloc + 3] = (byte)(compdata[i] & 240); - curloc += 4; - } - } - else - { - throw new Exception("Unknown Luminance-Alpha Type!"); - } - return; - } - else - { - uint ReadI = 0, TempBpp, i; - byte RedL, RedR; - byte GreenL, GreenR; - byte BlueL, BlueR; - byte AlphaL, AlphaR; - uint curloc = 0; - - if (Has16BitComponents) - { - DecompressARGB16(); - return; - } - - - GetBitsFromMask(rbitmask, out RedL, out RedR); - GetBitsFromMask(gbitmask, out GreenL, out GreenR); - GetBitsFromMask(bbitmask, out BlueL, out BlueR); - GetBitsFromMask(alphabitmask, out AlphaL, out AlphaR); - TempBpp = rgbbitcount / 8; - - for (i = 0; i < this.compdata.Length; i += this.bpp) - { - if (this.bpp == 4) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8) | (uint)(compdata[i + 2] << 16) | (uint)(compdata[i + 3] << 24); - } - else if (this.bpp == 3) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8) | (uint)(compdata[i + 2] << 16); - } - else if (this.bpp == 2) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8); - } - else if (this.bpp == 1) - { - ReadI = compdata[i]; - } - else - { - throw new Exception("Un-recognized bit depth!"); - } - - - this.rawidata[curloc] = (byte)(((ReadI & rbitmask) >> RedR) << RedL); - this.rawidata[curloc + 1] = (byte)(((ReadI & gbitmask) >> GreenR) << GreenL); - this.rawidata[curloc + 2] = (byte)(((ReadI & bbitmask) >> BlueR) << BlueL); - - if (this.alphabitmask > 0) - { - this.rawidata[curloc + 3] = (byte)(((ReadI & alphabitmask) >> AlphaR) << AlphaL); - if (AlphaL >= 7) - { - this.rawidata[curloc + 3] = (byte)(this.rawidata[curloc + 3] > 0 ? 0xFF : 0x00); - } - else if (AlphaL >= 4) - { - this.rawidata[curloc + 3] = (byte)(this.rawidata[curloc + 3] | (this.rawidata[curloc + 3] >> 4)); - } - } - else - { - this.rawidata[curloc + 3] = 0xff; - } - - curloc += 4; - } - } - } - #endregion - - #region ARGB16 - private void DecompressARGB16() - { - uint ReadI = 0, i; - byte RedL, RedR; - byte GreenL, GreenR; - byte BlueL, BlueR; - byte AlphaL, AlphaR; - uint curloc = 0; - - - GetBitsFromMask(rbitmask, out RedL, out RedR); - GetBitsFromMask(gbitmask, out GreenL, out GreenR); - GetBitsFromMask(bbitmask, out BlueL, out BlueR); - GetBitsFromMask(alphabitmask, out AlphaL, out AlphaR); - RedL = (byte)(RedL + (16 - CountBitsFromMask(rbitmask))); - GreenL = (byte)(GreenL + (16 - CountBitsFromMask(gbitmask))); - BlueL = (byte)(BlueL + (16 - CountBitsFromMask(bbitmask))); - AlphaL = (byte)(AlphaL + (16 - CountBitsFromMask(alphabitmask))); - - - for (i = 0; i < this.compdata.Length; i += this.bpp) - { - if (this.bpp == 4) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8) | (uint)(compdata[i + 2] << 16) | (uint)(compdata[i + 3] << 24); - } - else if (this.bpp == 3) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8) | (uint)(compdata[i + 2] << 16); - } - else if (this.bpp == 2) - { - ReadI = compdata[i] | (uint)(compdata[i + 1] << 8); - } - else if (this.bpp == 1) - { - ReadI = compdata[i]; - } - else - { - throw new Exception("Un-recognized bit depth!"); - } - - - this.rawidata[curloc + 2] = (byte)((ReadI & rbitmask) >> (RedR + 2));// << RedL); - this.rawidata[curloc + 1] = (byte)((ReadI & gbitmask) >> (GreenR + 2));// << GreenL); - this.rawidata[curloc] = (byte)((ReadI & bbitmask) >> (BlueR + 2));// << BlueL); - - if (this.alphabitmask > 0) - { - this.rawidata[curloc + 3] = (byte)(((ReadI & alphabitmask) >> AlphaR) << 6); - if (AlphaL >= 7) - { - this.rawidata[curloc + 3] = (byte)(this.rawidata[curloc + 3] > 0 ? 0xFF : 0x00); - } - else if (AlphaL >= 4) - { - this.rawidata[curloc + 3] = (byte)(this.rawidata[curloc + 3] | (this.rawidata[curloc + 3] >> 4)); - } - } - else - { - this.rawidata[curloc + 3] = 0xff; - } - - //throw new Exception(); - curloc += 4; - - } - } - #endregion - - #region Dxt1 - private void DecompressDXT1() - { - // DXT1 decompressor - Pixel[] colours = new Pixel[4]; - ushort colour0, colour1; - uint bitmask, offset; - int i, j, k, x, y, z, Select; - - - MemoryStream mem = new MemoryStream(this.compdata.Length); - mem.Write(this.compdata, 0, this.compdata.Length); - mem.Seek(0, SeekOrigin.Begin); - BinaryReader r = new BinaryReader(mem); - - colours[0].A = 255; - colours[1].A = 255; - colours[2].A = 255; - - for (z = 0; z < this.depth; z++) - { - for (y = 0; y < this.height; y += 4) - { - for (x = 0; x < this.width; x += 4) - { - colour0 = r.ReadUInt16(); - colour1 = r.ReadUInt16(); - - this.ReadColour(colour0, ref colours[0]); - this.ReadColour(colour1, ref colours[1]); - - bitmask = r.ReadUInt32(); - - if (colour0 > colour1) - { - // Four-color block: derive the other two colors. - // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3 - // These 2-bit codes correspond to the 2-bit fields - // stored in the 64-bit block. - colours[2].B = (byte)((2 * colours[0].B + colours[1].B + 1) / 3); - colours[2].G = (byte)((2 * colours[0].G + colours[1].G + 1) / 3); - colours[2].R = (byte)((2 * colours[0].R + colours[1].R + 1) / 3); - - colours[3].B = (byte)((colours[0].B + 2 * colours[1].B + 1) / 3); - colours[3].G = (byte)((colours[0].G + 2 * colours[1].G + 1) / 3); - colours[3].R = (byte)((colours[0].R + 2 * colours[1].R + 1) / 3); - colours[3].A = 0xFF; - } - else - { - // Three-color block: derive the other color. - // 00 = color_0, 01 = color_1, 10 = color_2, - // 11 = transparent. - // These 2-bit codes correspond to the 2-bit fields - // stored in the 64-bit block. - colours[2].B = (byte)((colours[0].B + colours[1].B) / 2); - colours[2].G = (byte)((colours[0].G + colours[1].G) / 2); - colours[2].R = (byte)((colours[0].R + colours[1].R) / 2); - - colours[3].B = 0; - colours[3].G = 0; - colours[3].R = 0; - colours[3].A = 0; - } - - - for (j = 0, k = 0; j < 4; j++) - { - for (i = 0; i < 4; i++, k++) - { - Select = (int)((bitmask & (0x03 << k * 2)) >> k * 2); - if (((x + i) < this.width) && ((y + j) < this.height)) - { - offset = (uint)(z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp); - this.rawidata[offset] = (byte)colours[Select].R; - this.rawidata[offset + 1] = (byte)colours[Select].G; - this.rawidata[offset + 2] = (byte)colours[Select].B; - this.rawidata[offset + 3] = (byte)colours[Select].A; - } - } - } - } - } - } - } - #endregion - - #region Dxt3 - private void DecompressDXT3() - { - Pixel[] colours = new Pixel[4]; - uint bitmask, offset; - int i, j, k, x, y, z, Select; - ushort word, colour0, colour1; - byte[] alpha; //temp; - - MemoryStream mem = new MemoryStream(this.compdata.Length); - mem.Write(this.compdata, 0, this.compdata.Length); - mem.Seek(0, SeekOrigin.Begin); - BinaryReader r = new BinaryReader(mem); - - for (z = 0; z < this.depth; z++) - { - for (y = 0; y < this.height; y += 4) - { - for (x = 0; x < this.width; x += 4) - { - alpha = r.ReadBytes(8); - - colour0 = r.ReadUInt16(); - colour1 = r.ReadUInt16(); - this.ReadColour(colour0, ref colours[0]); - this.ReadColour(colour1, ref colours[1]); - - bitmask = r.ReadUInt32(); - - colours[2].B = (byte)((2 * colours[0].B + colours[1].B + 1) / 3); - colours[2].G = (byte)((2 * colours[0].G + colours[1].G + 1) / 3); - colours[2].R = (byte)((2 * colours[0].R + colours[1].R + 1) / 3); - - colours[3].B = (byte)((colours[0].B + 2 * colours[1].B + 1) / 3); - colours[3].G = (byte)((colours[0].G + 2 * colours[1].G + 1) / 3); - colours[3].R = (byte)((colours[0].R + 2 * colours[1].R + 1) / 3); - - for (j = 0, k = 0; j < 4; j++) - { - for (i = 0; i < 4; k++, i++) - { - Select = (int)((bitmask & (0x03 << k * 2)) >> k * 2); - - if (((x + i) < this.width) && ((y + j) < this.height)) - { - offset = (uint)(z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp); - this.rawidata[offset] = (byte)colours[Select].R; - this.rawidata[offset + 1] = (byte)colours[Select].G; - this.rawidata[offset + 2] = (byte)colours[Select].B; - } - } - } - - for (j = 0; j < 4; j++) - { - word = (ushort)(alpha[2 * j] + 256 * alpha[2 * j + 1]); - for (i = 0; i < 4; i++) - { - if (((x + i) < this.width) && ((y + j) < this.height)) - { - offset = (uint)(z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp + 3); - this.rawidata[offset] = (byte)(word & 0x0F); - this.rawidata[offset] = (byte)(this.rawidata[offset] | (this.rawidata[offset] << 4)); - } - word >>= 4; - } - } - } - } - } - } - #endregion - - #region Dxt5 - private void DecompressDXT5() - { - uint x, y, z, i, j, Select, bitmask, Offset, bits; - Pixel[] Colors = new Pixel[4]; - byte[] Alphas = new byte[8]; - byte[] alphaMask = new byte[6]; - int k; - - MemoryStream mem = new MemoryStream(this.compdata.Length); - mem.Write(this.compdata, 0, this.compdata.Length); - mem.Seek(0, SeekOrigin.Begin); - BinaryReader r = new BinaryReader(mem); - for (z = 0; z < this.depth; z++) - { - for (y = 0; y < this.height; y += 4) - { - for (x = 0; x < this.width; x += 4) - { - if (y >= this.height || x >= this.width) - break; - Alphas[0] = r.ReadByte(); - Alphas[1] = r.ReadByte(); - alphaMask = r.ReadBytes(6); - - ReadColour(r.ReadUInt16(), ref Colors[0]); - ReadColour(r.ReadUInt16(), ref Colors[1]); - bitmask = r.ReadUInt32(); - - // Four-color block: derive the other two colors. - // 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3 - // These 2-bit codes correspond to the 2-bit fields - // stored in the 64-bit block. - Colors[2].B = (byte)((2 * Colors[0].B + Colors[1].B + 1) / 3); - Colors[2].G = (byte)((2 * Colors[0].G + Colors[1].G + 1) / 3); - Colors[2].R = (byte)((2 * Colors[0].R + Colors[1].R + 1) / 3); - - Colors[3].B = (byte)((Colors[0].B + 2 * Colors[1].B + 1) / 3); - Colors[3].G = (byte)((Colors[0].G + 2 * Colors[1].G + 1) / 3); - Colors[3].R = (byte)((Colors[0].R + 2 * Colors[1].R + 1) / 3); - - k = 0; - for (j = 0; j < 4; j++) - { - for (i = 0; i < 4; i++, k++) - { - - Select = (uint)((bitmask & (0x03 << k * 2)) >> k * 2); - - // only put pixels out < width or height - if (((x + i) < this.width) && ((y + j) < this.height)) - { - Offset = z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp; - this.rawidata[Offset + 0] = Colors[Select].R; - this.rawidata[Offset + 1] = Colors[Select].G; - this.rawidata[Offset + 2] = Colors[Select].B; - } - } - } - - // 8-alpha or 6-alpha block? - if (Alphas[0] > Alphas[1]) - { - // 8-alpha block: derive the other six alphas. - // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated. - Alphas[2] = (byte)((6 * Alphas[0] + 1 * Alphas[1] + 3) / 7); // bit code 010 - Alphas[3] = (byte)((5 * Alphas[0] + 2 * Alphas[1] + 3) / 7); // bit code 011 - Alphas[4] = (byte)((4 * Alphas[0] + 3 * Alphas[1] + 3) / 7); // bit code 100 - Alphas[5] = (byte)((3 * Alphas[0] + 4 * Alphas[1] + 3) / 7); // bit code 101 - Alphas[6] = (byte)((2 * Alphas[0] + 5 * Alphas[1] + 3) / 7); // bit code 110 - Alphas[7] = (byte)((1 * Alphas[0] + 6 * Alphas[1] + 3) / 7); // bit code 111 - } - else - { - // 6-alpha block. - // Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated. - Alphas[2] = (byte)((4 * Alphas[0] + 1 * Alphas[1] + 2) / 5); // Bit code 010 - Alphas[3] = (byte)((3 * Alphas[0] + 2 * Alphas[1] + 2) / 5); // Bit code 011 - Alphas[4] = (byte)((2 * Alphas[0] + 3 * Alphas[1] + 2) / 5); // Bit code 100 - Alphas[5] = (byte)((1 * Alphas[0] + 4 * Alphas[1] + 2) / 5); // Bit code 101 - Alphas[6] = 0x00; // Bit code 110 - Alphas[7] = 0xFF; // Bit code 111 - } - - // Note: Have to separate the next two loops, - // it operates on a 6-byte system. - - // First three bytes - //bits = *((ILint*)alphamask); - bits = (uint)(alphaMask[0]) | (uint)(alphaMask[1] << 8) | (uint)(alphaMask[2] << 16); - for (j = 0; j < 2; j++) - { - for (i = 0; i < 4; i++) - { - // only put pixels out < width or height - if (((x + i) < this.width) && ((y + j) < this.height)) - { - Offset = z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp + 3; - this.rawidata[Offset] = Alphas[bits & 0x07]; - } - bits >>= 3; - } - } - - // Last three bytes - //bits = *((ILint*)&alphamask[3]); - bits = (uint)(alphaMask[3]) | (uint)(alphaMask[4] << 8) | (uint)(alphaMask[5] << 16); - for (j = 2; j < 4; j++) - { - for (i = 0; i < 4; i++) - { - // only put pixels out < width or height - if (((x + i) < this.width) && ((y + j) < this.height)) - { - Offset = z * this.sizeofplane + (y + j) * this.bps + (x + i) * this.bpp + 3; - this.rawidata[Offset] = Alphas[bits & 0x07]; - } - bits >>= 3; - } - } - } - } - } - - } - #endregion - - - private void ReadColour(ushort Data, ref Pixel op) - { - byte r, g, b; - - b = (byte)(Data & 0x1f); - g = (byte)((Data & 0x7E0) >> 5); - r = (byte)((Data & 0xF800) >> 11); - - op.R = (byte)(r * 255 / 31); - op.G = (byte)(g * 255 / 63); - op.B = (byte)(b * 255 / 31); - } - } -} - -#endregion diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/FormatManager.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/FormatManager.cs deleted file mode 100644 index 24ddfdebac..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/FormatManager.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.ImageFormats -{ - public class FormatManager - { - internal List Formats = new List(); - public FormatManager() - { - Formats.Add(new BmpImage()); - Formats.Add(new OIFImage()); - Formats.Add(new PngImage()); - Formats.Add(new VbpImage()); - Formats.Add(new JpegImage()); - Formats.Add(new TiffImage()); - Formats.Add(new TgaImage()); - Formats.Add(new XpmImage()); - Formats.Add(new PnmFamilyImage()); - Formats.Add(new DdsImage()); - Formats.Add(new PcxImage()); - } - - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/GifDecoder.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/GifDecoder.cs deleted file mode 100644 index e611155cac..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/GifDecoder.cs +++ /dev/null @@ -1,864 +0,0 @@ -#pragma warning disable 675 // Bitwise-or operator used on a sign-extended operand - -#region Java Info -/** - * Class GifDecoder - Decodes a GIF file into one or more frames. - *
- * Example:
- *    GifDecoder d = new GifDecoder();
- *    d.read("sample.gif");
- *    int n = d.getFrameCount();
- *    for (int i = 0; i < n; i++) {
- *       BufferedImage frame = d.getFrame(i);  // frame i
- *       int t = d.getDelay(i);  // display duration of frame in milliseconds
- *       // do something with frame
- *    }
- * 
- * No copyright asserted on the source code of this class. May be used for - * any purpose, however, refer to the Unisys LZW patent for any additional - * restrictions. Please forward any corrections to kweiner@fmsware.com. - * - * @author Kevin Weiner, FM Software; LZW decoder adapted from John Cristy's ImageMagick. - * @version 1.03 November 2003 - * - */ -#endregion - -using System; -using System.Collections; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; - -namespace Aga.Controls -{ - public class GifFrame - { - private Image _image; - public Image Image - { - get { return _image; } - } - - private int _delay; - public int Delay - { - get { return _delay; } - } - - public GifFrame(Image im, int del) - { - _image = im; - _delay = del; - } - } - - public class GifDecoder - { - public const int StatusOK = 0;//File read status: No errors. - public const int StatusFormatError = 1; //File read status: Error decoding file (may be partially decoded) - public const int StatusOpenError = 2; //Unable to open source. - - private Stream inStream; - private int status; - - private int width; // full image width - private int height; // full image height - private bool gctFlag; // global color table used - private int gctSize; // size of global color table - private int loopCount = 1; // iterations; 0 = repeat forever - - private int[] gct; // global color table - private int[] lct; // local color table - private int[] act; // active color table - - private int bgIndex; // background color index - private int bgColor; // background color - private int lastBgColor; // previous bg color - private int pixelAspect; // pixel aspect ratio - - private bool lctFlag; // local color table flag - private bool interlace; // interlace flag - private int lctSize; // local color table size - - private int ix, iy, iw, ih; // current image rectangle - private Rectangle lastRect; // last image rect - private Image image; // current frame - private Bitmap bitmap; - private Image lastImage; // previous frame - - private byte[] block = new byte[256]; // current data block - private int blockSize = 0; // block size - - // last graphic control extension info - private int dispose = 0; - // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev - private int lastDispose = 0; - private bool transparency = false; // use transparent color - private int delay = 0; // delay in milliseconds - private int transIndex; // transparent color index - - private const int MaxStackSize = 4096; - // max decoder pixel stack size - - // LZW decoder working arrays - private short[] prefix; - private byte[] suffix; - private byte[] pixelStack; - private byte[] pixels; - - private ArrayList frames; // frames read from current file - private int frameCount; - private bool _makeTransparent; - - /** - * Gets the number of frames read from file. - * @return frame count - */ - public int FrameCount - { - get - { - return frameCount; - } - } - - /** - * Gets the first (or only) image read. - * - * @return BufferedImage containing first frame, or null if none. - */ - public Image Image - { - get - { - return GetFrame(0).Image; - } - } - - /** - * Gets the "Netscape" iteration count, if any. - * A count of 0 means repeat indefinitiely. - * - * @return iteration count if one was specified, else 1. - */ - public int LoopCount - { - get - { - return loopCount; - } - } - - public GifDecoder(Stream stream, bool makeTransparent) - { - _makeTransparent = makeTransparent; - if (Read(stream) != 0) - throw new InvalidOperationException(); - } - - /** - * Creates new frame image from current data (and previous - * frames as specified by their disposition codes). - */ - private int[] GetPixels(Bitmap bitmap) - { - int [] pixels = new int [ 3 * image.Width * image.Height ]; - int count = 0; - for (int th = 0; th < image.Height; th++) - { - for (int tw = 0; tw < image.Width; tw++) - { - Color color = bitmap.GetPixel(tw, th); - pixels[count] = color.R; - count++; - pixels[count] = color.G; - count++; - pixels[count] = color.B; - count++; - } - } - return pixels; - } - - private void SetPixels(int[] pixels) - { - int count = 0; - for (int th = 0; th < image.Height; th++) - { - for (int tw = 0; tw < image.Width; tw++) - { - Color color = Color.FromArgb( pixels[count++] ); - bitmap.SetPixel( tw, th, color ); - } - } - if (_makeTransparent) - bitmap.MakeTransparent(bitmap.GetPixel(0, 0)); - } - - private void SetPixels() - { - // expose destination image's pixels as int array - // int[] dest = - // (( int ) image.getRaster().getDataBuffer()).getData(); - int[] dest = GetPixels( bitmap ); - - // fill in starting image contents based on last image's dispose code - if (lastDispose > 0) - { - if (lastDispose == 3) - { - // use image before last - int n = frameCount - 2; - if (n > 0) - { - lastImage = GetFrame(n - 1).Image; - } - else - { - lastImage = null; - } - } - - if (lastImage != null) - { - // int[] prev = - // ((DataBufferInt) lastImage.getRaster().getDataBuffer()).getData(); - int[] prev = GetPixels( new Bitmap( lastImage ) ); - Array.Copy(prev, 0, dest, 0, width * height); - // copy pixels - - if (lastDispose == 2) - { - // fill last image rect area with background color - Graphics g = Graphics.FromImage( image ); - Color c = Color.Empty; - if (transparency) - { - c = Color.FromArgb( 0, 0, 0, 0 ); // assume background is transparent - } - else - { - c = Color.FromArgb( lastBgColor ) ; - // c = new Color(lastBgColor); // use given background color - } - Brush brush = new SolidBrush( c ); - g.FillRectangle( brush, lastRect ); - brush.Dispose(); - g.Dispose(); - } - } - } - - // copy each source line to the appropriate place in the destination - int pass = 1; - int inc = 8; - int iline = 0; - for (int i = 0; i < ih; i++) - { - int line = i; - if (interlace) - { - if (iline >= ih) - { - pass++; - switch (pass) - { - case 2 : - iline = 4; - break; - case 3 : - iline = 2; - inc = 4; - break; - case 4 : - iline = 1; - inc = 2; - break; - } - } - line = iline; - iline += inc; - } - line += iy; - if (line < height) - { - int k = line * width; - int dx = k + ix; // start of line in dest - int dlim = dx + iw; // end of dest line - if ((k + width) < dlim) - { - dlim = k + width; // past dest edge - } - int sx = i * iw; // start of line in source - while (dx < dlim) - { - // map color and insert in destination - int index = ((int) pixels[sx++]) & 0xff; - int c = act[index]; - if (c != 0) - { - dest[dx] = c; - } - dx++; - } - } - } - SetPixels( dest ); - } - - /** - * Gets the image contents of frame n. - * - * @return BufferedImage representation of frame. - */ - public GifFrame GetFrame(int n) - { - if ((n >= 0) && (n < frameCount)) - return (GifFrame)frames[n]; - else - throw new ArgumentOutOfRangeException(); - } - - /** - * Gets image size. - * - * @return GIF image dimensions - */ - public Size FrameSize - { - get - { - return new Size(width, height); - } - } - - /** - * Reads GIF image from stream - * - * @param BufferedInputStream containing GIF file. - * @return read status code (0 = no errors) - */ - private int Read( Stream inStream ) - { - Init(); - if ( inStream != null) - { - this.inStream = inStream; - ReadHeader(); - if (!Error()) - { - ReadContents(); - if (frameCount < 0) - { - status = StatusFormatError; - } - } - inStream.Close(); - } - else - { - status = StatusOpenError; - } - return status; - } - - - /** - * Decodes LZW image data into pixel array. - * Adapted from John Cristy's ImageMagick. - */ - private void DecodeImageData() - { - int NullCode = -1; - int npix = iw * ih; - int available, - clear, - code_mask, - code_size, - end_of_information, - in_code, - old_code, - bits, - code, - count, - i, - datum, - data_size, - first, - top, - bi, - pi; - - if ((pixels == null) || (pixels.Length < npix)) - { - pixels = new byte[npix]; // allocate new pixel array - } - if (prefix == null) prefix = new short[MaxStackSize]; - if (suffix == null) suffix = new byte[MaxStackSize]; - if (pixelStack == null) pixelStack = new byte[MaxStackSize + 1]; - - // Initialize GIF data stream decoder. - - data_size = Read(); - clear = 1 << data_size; - end_of_information = clear + 1; - available = clear + 2; - old_code = NullCode; - code_size = data_size + 1; - code_mask = (1 << code_size) - 1; - for (code = 0; code < clear; code++) - { - prefix[code] = 0; - suffix[code] = (byte) code; - } - - // Decode GIF pixel stream. - - datum = bits = count = first = top = pi = bi = 0; - - for (i = 0; i < npix;) - { - if (top == 0) - { - if (bits < code_size) - { - // Load bytes until there are enough bits for a code. - if (count == 0) - { - // Read a new data block. - count = ReadBlock(); - if (count <= 0) - break; - bi = 0; - } - datum += (((int) block[bi]) & 0xff) << bits; - bits += 8; - bi++; - count--; - continue; - } - - // Get the next code. - - code = datum & code_mask; - datum >>= code_size; - bits -= code_size; - - // Interpret the code - - if ((code > available) || (code == end_of_information)) - break; - if (code == clear) - { - // Reset decoder. - code_size = data_size + 1; - code_mask = (1 << code_size) - 1; - available = clear + 2; - old_code = NullCode; - continue; - } - if (old_code == NullCode) - { - pixelStack[top++] = suffix[code]; - old_code = code; - first = code; - continue; - } - in_code = code; - if (code == available) - { - pixelStack[top++] = (byte) first; - code = old_code; - } - while (code > clear) - { - pixelStack[top++] = suffix[code]; - code = prefix[code]; - } - first = ((int) suffix[code]) & 0xff; - - // Add a new string to the string table, - - if (available >= MaxStackSize) - break; - pixelStack[top++] = (byte) first; - prefix[available] = (short) old_code; - suffix[available] = (byte) first; - available++; - if (((available & code_mask) == 0) - && (available < MaxStackSize)) - { - code_size++; - code_mask += available; - } - old_code = in_code; - } - - // Pop a pixel off the pixel stack. - - top--; - pixels[pi++] = pixelStack[top]; - i++; - } - - for (i = pi; i < npix; i++) - { - pixels[i] = 0; // clear missing pixels - } - - } - - /** - * Returns true if an error was encountered during reading/decoding - */ - private bool Error() - { - return status != StatusOK; - } - - /** - * Initializes or re-initializes reader - */ - private void Init() - { - status = StatusOK; - frameCount = 0; - frames = new ArrayList(); - gct = null; - lct = null; - } - - /** - * Reads a single byte from the input stream. - */ - private int Read() - { - int curByte = 0; - try - { - curByte = inStream.ReadByte(); - } - catch (IOException) - { - status = StatusFormatError; - } - return curByte; - } - - /** - * Reads next variable length block from input. - * - * @return number of bytes stored in "buffer" - */ - private int ReadBlock() - { - blockSize = Read(); - int n = 0; - if (blockSize > 0) - { - try - { - int count = 0; - while (n < blockSize) - { - count = inStream.Read(block, n, blockSize - n); - if (count == -1) - break; - n += count; - } - } - catch (IOException) - { - } - - if (n < blockSize) - { - status = StatusFormatError; - } - } - return n; - } - - /** - * Reads color table as 256 RGB integer values - * - * @param ncolors int number of colors to read - * @return int array containing 256 colors (packed ARGB with full alpha) - */ - private int[] ReadColorTable(int ncolors) - { - int nbytes = 3 * ncolors; - int[] tab = null; - byte[] c = new byte[nbytes]; - int n = 0; - try - { - n = inStream.Read(c, 0, c.Length ); - } - catch (IOException) - { - } - if (n < nbytes) - { - status = StatusFormatError; - } - else - { - tab = new int[256]; // max size to avoid bounds checks - int i = 0; - int j = 0; - while (i < ncolors) - { - int r = ((int) c[j++]) & 0xff; - int g = ((int) c[j++]) & 0xff; - int b = ((int) c[j++]) & 0xff; - tab[i++] = ( int ) ( 0xff000000 | (r << 16) | (g << 8) | b ); - } - } - return tab; - } - - /** - * Main file parser. Reads GIF content blocks. - */ - private void ReadContents() - { - // read GIF file content blocks - bool done = false; - while (!(done || Error())) - { - int code = Read(); - switch (code) - { - - case 0x2C : // image separator - ReadImage(); - break; - - case 0x21 : // extension - code = Read(); - switch (code) - { - case 0xf9 : // graphics control extension - ReadGraphicControlExt(); - break; - - case 0xff : // application extension - ReadBlock(); - String app = ""; - for (int i = 0; i < 11; i++) - { - app += (char) block[i]; - } - if (app.Equals("NETSCAPE2.0")) - { - ReadNetscapeExt(); - } - else - Skip(); // don't care - break; - - default : // uninteresting extension - Skip(); - break; - } - break; - - case 0x3b : // terminator - done = true; - break; - - case 0x00 : // bad byte, but keep going and see what happens - break; - - default : - status = StatusFormatError; - break; - } - } - } - - /** - * Reads Graphics Control Extension values - */ - private void ReadGraphicControlExt() - { - Read(); // block size - int packed = Read(); // packed fields - dispose = (packed & 0x1c) >> 2; // disposal method - if (dispose == 0) - { - dispose = 1; // elect to keep old image if discretionary - } - transparency = (packed & 1) != 0; - delay = ReadShort() * 10; // delay in milliseconds - transIndex = Read(); // transparent color index - Read(); // block terminator - } - - /** - * Reads GIF file header information. - */ - private void ReadHeader() - { - String id = ""; - for (int i = 0; i < 6; i++) - { - id += (char) Read(); - } - if (!id.StartsWith("GIF")) - { - status = StatusFormatError; - return; - } - - ReadLSD(); - if (gctFlag && !Error()) - { - gct = ReadColorTable(gctSize); - bgColor = gct[bgIndex]; - } - } - - /** - * Reads next frame image - */ - private void ReadImage() - { - ix = ReadShort(); // (sub)image position & size - iy = ReadShort(); - iw = ReadShort(); - ih = ReadShort(); - - int packed = Read(); - lctFlag = (packed & 0x80) != 0; // 1 - local color table flag - interlace = (packed & 0x40) != 0; // 2 - interlace flag - // 3 - sort flag - // 4-5 - reserved - lctSize = 2 << (packed & 7); // 6-8 - local color table size - - if (lctFlag) - { - lct = ReadColorTable(lctSize); // read table - act = lct; // make local table active - } - else - { - act = gct; // make global table active - if (bgIndex == transIndex) - bgColor = 0; - } - int save = 0; - if (transparency) - { - save = act[transIndex]; - act[transIndex] = 0; // set transparent color if specified - } - - if (act == null) - { - status = StatusFormatError; // no color table defined - } - - if (Error()) return; - - DecodeImageData(); // decode pixel data - Skip(); - - if (Error()) return; - - frameCount++; - - // create new image to receive frame data - // image = - // new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE); - - bitmap = new Bitmap( width, height ); - image = bitmap; - SetPixels(); // transfer pixel data to image - - frames.Add(new GifFrame(bitmap, delay)); // add image to frame list - - if (transparency) - { - act[transIndex] = save; - } - ResetFrame(); - - } - - /** - * Reads Logical Screen Descriptor - */ - private void ReadLSD() - { - - // logical screen size - width = ReadShort(); - height = ReadShort(); - - // packed fields - int packed = Read(); - gctFlag = (packed & 0x80) != 0; // 1 : global color table flag - // 2-4 : color resolution - // 5 : gct sort flag - gctSize = 2 << (packed & 7); // 6-8 : gct size - - bgIndex = Read(); // background color index - pixelAspect = Read(); // pixel aspect ratio - } - - /** - * Reads Netscape extenstion to obtain iteration count - */ - private void ReadNetscapeExt() - { - do - { - ReadBlock(); - if (block[0] == 1) - { - // loop count sub-block - int b1 = ((int) block[1]) & 0xff; - int b2 = ((int) block[2]) & 0xff; - loopCount = (b2 << 8) | b1; - } - } while ((blockSize > 0) && !Error()); - } - - /** - * Reads next 16-bit value, LSB first - */ - private int ReadShort() - { - // read 16-bit value, LSB first - return Read() | (Read() << 8); - } - - /** - * Resets frame state for reading next image. - */ - private void ResetFrame() - { - lastDispose = dispose; - lastRect = new Rectangle(ix, iy, iw, ih); - lastImage = image; - lastBgColor = bgColor; - // int dispose = 0; - lct = null; - } - - /** - * Skips variable length blocks up to and including - * next zero length block. - */ - private void Skip() - { - do - { - ReadBlock(); - } while ((blockSize > 0) && !Error()); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/GifSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/GifSupport.cs deleted file mode 100644 index 27caa7db2f..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/GifSupport.cs +++ /dev/null @@ -1,649 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public static class GifSupport - { - public static AnimatedImage Load(Stream s) - { - GifDecoder g = new GifDecoder(); - return g.DecodeImage(s); - } - - - // Please note, everything below this - // point was originally from the ImageTools - // Library, available here: - // http://imagetools.codeplex.com/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - - - #region Internals - - #region DisposalMethod - /// - /// Specifies, what to do with the last image - /// in an animation sequence. - /// - private enum DisposalMethod : int - { - /// - /// No disposal specified. The decoder is not - /// required to take any action. - /// - Unspecified = 0, - /// - /// Do not dispose. The graphic is to be left in place. - /// - NotDispose = 1, - /// - /// Restore to background color. - /// The area used by the graphic must be restored to - /// the background color. - /// - RestoreToBackground = 2, - /// - /// Restore to previous. The decoder is required to - /// restore the area overwritten by the - /// graphic with what was there prior to rendering the graphic. - /// - RestoreToPrevious = 3 - } - #endregion - - #region GifDecoder - private class GifDecoder - { - private const byte ExtensionIntroducer = 0x21; - private const byte Terminator = 0; - private const byte ImageLabel = 0x2C; - private const byte EndIntroducer = 0x3B; - private const byte ApplicationExtensionLabel = 0xFF; - private const byte CommentLabel = 0xFE; - private const byte ImageDescriptorLabel = 0x2C; - private const byte PlainTextLabel = 0x01; - private const byte GraphicControlLabel = 0xF9; - private AnimatedImage _image; - private Stream _stream; - private GifLogicalScreenDescriptor _logicalScreenDescriptor; - private byte[] _globalColorTable; - private byte[] _currentFrame; - private GifGraphicsControlExtension _graphicsControl; - - - public AnimatedImage DecodeImage(Stream stream) - { - _image = new AnimatedImage(); - - _stream = stream; - _stream.Seek(6, SeekOrigin.Current); - - ReadLogicalScreenDescriptor(); - - if (_logicalScreenDescriptor.GlobalColorTableFlag == true) - { - _globalColorTable = new byte[_logicalScreenDescriptor.GlobalColorTableSize * 3]; - - // Read the global color table from the stream - stream.Read(_globalColorTable, 0, _globalColorTable.Length); - } - - int nextFlag = stream.ReadByte(); - while (nextFlag != 0) - { - if (nextFlag == ImageLabel) - { - ReadFrame(); - } - else if (nextFlag == ExtensionIntroducer) - { - int gcl = stream.ReadByte(); - switch (gcl) - { - case GraphicControlLabel: - ReadGraphicalControlExtension(); - break; - case CommentLabel: - ReadComments(); - break; - case ApplicationExtensionLabel: - Skip(12); - break; - case PlainTextLabel: - Skip(13); - break; - } - } - else if (nextFlag == EndIntroducer) - { - break; - } - nextFlag = stream.ReadByte(); - } - return _image; - } - - private void ReadGraphicalControlExtension() - { - byte[] buffer = new byte[6]; - - _stream.Read(buffer, 0, buffer.Length); - - byte packed = buffer[1]; - - _graphicsControl = new GifGraphicsControlExtension(); - _graphicsControl.DelayTime = BitConverter.ToInt16(buffer, 2); - _graphicsControl.TransparencyIndex = buffer[4]; - _graphicsControl.TransparencyFlag = (packed & 0x01) == 1; - _graphicsControl.DisposalMethod = (DisposalMethod)((packed & 0x1C) >> 2); - } - - private GifImageDescriptor ReadImageDescriptor() - { - byte[] buffer = new byte[9]; - - _stream.Read(buffer, 0, buffer.Length); - - byte packed = buffer[8]; - - GifImageDescriptor imageDescriptor = new GifImageDescriptor(); - imageDescriptor.Left = BitConverter.ToInt16(buffer, 0); - imageDescriptor.Top = BitConverter.ToInt16(buffer, 2); - imageDescriptor.Width = BitConverter.ToInt16(buffer, 4); - imageDescriptor.Height = BitConverter.ToInt16(buffer, 6); - imageDescriptor.LocalColorTableFlag = ((packed & 0x80) >> 7) == 1; - imageDescriptor.LocalColorTableSize = 2 << (packed & 0x07); - imageDescriptor.InterlaceFlag = ((packed & 0x40) >> 6) == 1; - - return imageDescriptor; - } - - private void ReadLogicalScreenDescriptor() - { - byte[] buffer = new byte[7]; - - _stream.Read(buffer, 0, buffer.Length); - - byte packed = buffer[4]; - - _logicalScreenDescriptor = new GifLogicalScreenDescriptor(); - _logicalScreenDescriptor.Width = BitConverter.ToInt16(buffer, 0); - _logicalScreenDescriptor.Height = BitConverter.ToInt16(buffer, 2); - _logicalScreenDescriptor.Background = buffer[5]; - _logicalScreenDescriptor.GlobalColorTableFlag = ((packed & 0x80) >> 7) == 1; - _logicalScreenDescriptor.GlobalColorTableSize = 2 << (packed & 0x07); - } - - private void Skip(int length) - { - _stream.Seek(length, SeekOrigin.Current); - - int flag = 0; - - while ((flag = _stream.ReadByte()) != 0) - { - _stream.Seek(flag, SeekOrigin.Current); - } - } - - private void ReadComments() - { - int flag = 0; - - while ((flag = _stream.ReadByte()) != 0) - { - byte[] buffer = new byte[flag]; - _stream.Read(buffer, 0, flag); - } - } - - private void ReadFrame() - { - GifImageDescriptor imageDescriptor = ReadImageDescriptor(); - - byte[] localColorTable = ReadFrameLocalColorTable(imageDescriptor); - - byte[] indices = ReadFrameIndices(imageDescriptor); - - // Determine the color table for this frame. If there is a local one, use it - // otherwise use the global color table. - byte[] colorTable = localColorTable != null ? localColorTable : _globalColorTable; - - ReadFrameColors(indices, colorTable, imageDescriptor); - - int blockSize = _stream.ReadByte(); - if (blockSize > 0) - { - _stream.Seek(blockSize, SeekOrigin.Current); - } - } - - private byte[] ReadFrameIndices(GifImageDescriptor imageDescriptor) - { - int dataSize = _stream.ReadByte(); - - LZWDecoder lzwDecoder = new LZWDecoder(_stream); - - byte[] indices = lzwDecoder.DecodePixels(imageDescriptor.Width, imageDescriptor.Height, dataSize); - return indices; - } - - private byte[] ReadFrameLocalColorTable(GifImageDescriptor imageDescriptor) - { - byte[] localColorTable = null; - - if (imageDescriptor.LocalColorTableFlag == true) - { - localColorTable = new byte[imageDescriptor.LocalColorTableSize * 3]; - - _stream.Read(localColorTable, 0, localColorTable.Length); - } - - return localColorTable; - } - - private void ReadFrameColors(byte[] indices, byte[] colorTable, GifImageDescriptor descriptor) - { - int imageWidth = _logicalScreenDescriptor.Width; - int imageHeight = _logicalScreenDescriptor.Height; - - if (_currentFrame == null) - { - _currentFrame = new byte[imageWidth * imageHeight * 4]; - } - - byte[] lastFrame = null; - - if (_graphicsControl != null && - _graphicsControl.DisposalMethod == DisposalMethod.RestoreToPrevious) - { - lastFrame = new byte[imageWidth * imageHeight * 4]; - - Array.Copy(_currentFrame, lastFrame, lastFrame.Length); - } - - int offset = 0, i = 0, index = -1; - - int iPass = 0; // the interlace pass - int iInc = 8; // the interlacing line increment - int iY = 0; // the current interlaced line - int writeY = 0; // the target y offset to write to - - for (int y = descriptor.Top; y < descriptor.Top + descriptor.Height; y++) - { - // Check if this image is interlaced. - if (descriptor.InterlaceFlag) - { - // If so then we read lines at predetermined offsets. - // When an entire image height worth of offset lines has been read we consider this a pass. - // With each pass the number of offset lines changes and the starting line changes. - if (iY >= descriptor.Height) - { - iPass++; - switch (iPass) - { - case 1: - iY = 4; - break; - case 2: - iY = 2; - iInc = 4; - break; - case 3: - iY = 1; - iInc = 2; - break; - } - } - - writeY = iY + descriptor.Top; - - iY += iInc; - } - else - { - writeY = y; - } - - for (int x = descriptor.Left; x < descriptor.Left + descriptor.Width; x++) - { - offset = writeY * imageWidth + x; - - index = indices[i]; - - if (_graphicsControl == null || - _graphicsControl.TransparencyFlag == false || - _graphicsControl.TransparencyIndex != index) - { - _currentFrame[offset * 4 + 0] = colorTable[index * 3 + 0]; - _currentFrame[offset * 4 + 1] = colorTable[index * 3 + 1]; - _currentFrame[offset * 4 + 2] = colorTable[index * 3 + 2]; - _currentFrame[offset * 4 + 3] = (byte)255; - } - - i++; - } - } - - byte[] pixels = new byte[imageWidth * imageHeight * 4]; - - Array.Copy(_currentFrame, pixels, pixels.Length); - _currentFrame = new byte[imageWidth * imageHeight * 4]; - Image frame = new Image(imageWidth, imageHeight); - - int indx = 0; - byte r, g, b, a; - for (uint y = 0; y < frame.Height; y++) - { - for (uint x = 0; x < frame.Width; x++) - { - r = pixels[indx]; - indx++; - g = pixels[indx]; - indx++; - b = pixels[indx]; - indx++; - a = pixels[indx]; - indx++; - frame.SetPixel(x, y, new Pixel(r, g, b, a)); - } - } - pixels = null; - System.GC.Collect(); - _image.AddFrame(frame); - - - if (_graphicsControl != null) - { - if (_graphicsControl.DelayTime > 0) - { - _image.TimePerFrame = _graphicsControl.DelayTime; - } - - if (_graphicsControl.DisposalMethod == DisposalMethod.RestoreToBackground) - { - Image im = new Image(imageWidth, imageHeight); - im.Clear(new Pixel(true)); - _image.AddFrame(im); - _image.Loop = false; - - } - else if (_graphicsControl.DisposalMethod == DisposalMethod.RestoreToPrevious) - { - _image.Loop = true; - } - } - } - } - #endregion - - #region GifImageDescriptor - private sealed class GifImageDescriptor - { - /// - /// Column number, in pixels, of the left edge of the image, - /// with respect to the left edge of the Logical Screen. - /// Leftmost column of the Logical Screen is 0. - /// - public short Left; - /// - /// Row number, in pixels, of the top edge of the image with - /// respect to the top edge of the Logical Screen. - /// Top row of the Logical Screen is 0. - /// - public short Top; - /// - /// Width of the image in pixels. - /// - public short Width; - /// - /// Height of the image in pixels. - /// - public short Height; - /// - /// Indicates the presence of a Local Color Table immediately - /// following this Image Descriptor. - /// - public bool LocalColorTableFlag; - /// - /// If the Local Color Table Flag is set to 1, the value in this field - /// is used to calculate the number of bytes contained in the Local Color Table. - /// - public int LocalColorTableSize; - /// - /// Indicates if the image is interlaced. An image is interlaced - /// in a four-pass interlace pattern. - /// - public bool InterlaceFlag; - } - #endregion - - #region GifLogicalScreenDescriptor - private sealed class GifLogicalScreenDescriptor - { - /// - /// Width, in pixels, of the Logical Screen where the images will - /// be rendered in the displaying device. - /// - public short Width; - /// - /// Height, in pixels, of the Logical Screen where the images will be - /// rendered in the displaying device. - /// - public short Height; - /// - /// Index into the Global Color Table for the Background Color. - /// The Background Color is the color used for those - /// pixels on the screen that are not covered by an image. - /// - public byte Background; - /// - /// Flag indicating the presence of a Global Color Table; - /// if the flag is set, the Global Color Table will immediately - /// follow the Logical Screen Descriptor. - /// - public bool GlobalColorTableFlag; - /// - /// If the Global Color Table Flag is set to 1, - /// the value in this field is used to calculate the number of - /// bytes contained in the Global Color Table. - /// - public int GlobalColorTableSize; - } - #endregion - - #region GifGraphicsControlExtension - private sealed class GifGraphicsControlExtension - { - /// - /// Indicates the way in which the graphic is to be treated after being displayed. - /// - public DisposalMethod DisposalMethod; - /// - /// Indicates whether a transparency index is given in the Transparent Index field. - /// (This field is the least significant bit of the byte.) - /// - public bool TransparencyFlag; - /// - /// The Transparency Index is such that when encountered, the corresponding pixel - /// of the display device is not modified and processing goes on to the next pixel. - /// - public int TransparencyIndex; - /// - /// If not 0, this field specifies the number of hundredths (1/100) of a second to - /// wait before continuing with the processing of the Data Stream. - /// The clock starts ticking immediately after the graphic is rendered. - /// This field may be used in conjunction with the User Input Flag field. - /// - public int DelayTime; - } - #endregion - - #region LZWDecoder - private sealed class LZWDecoder - { - private const int StackSize = 4096; - private const int NullCode = -1; - - private Stream _stream; - - /// - /// Initializes a new instance of the class - /// and sets the stream, where the compressed data should be read from. - /// - /// The stream. where to read from. - /// is null - /// (Nothing in Visual Basic). - public LZWDecoder(Stream stream) - { - _stream = stream; - } - - /// - /// Decodes and uncompresses all pixel indices from the stream. - /// - /// The width of the pixel index array. - /// The height of the pixel index array. - /// Size of the data. - /// The decoded and uncompressed array. - public byte[] DecodePixels(int width, int height, int dataSize) - { - byte[] pixels = new byte[width * height]; - int clearCode = 1 << dataSize; - if (dataSize == Int32.MaxValue) - { - throw new ArgumentOutOfRangeException("dataSize", "Must be less than Int32.MaxValue"); - } - int codeSize = dataSize + 1; - int endCode = clearCode + 1; - int availableCode = clearCode + 2; - #region Jillzhangs Code (Not From Me) see: http://giflib.codeplex.com/ - int code = NullCode; - int old_code = NullCode; - int code_mask = (1 << codeSize) - 1; - int bits = 0; - int[] prefix = new int[StackSize]; - int[] suffix = new int[StackSize]; - int[] pixelStatck = new int[StackSize + 1]; - int top = 0; - int count = 0; - int bi = 0; - int xyz = 0; - int data = 0; - int first = 0; - int inCode = NullCode; - for (code = 0; code < clearCode; code++) - { - prefix[code] = 0; - suffix[code] = (byte)code; - } - - byte[] buffer = null; - while (xyz < pixels.Length) - { - if (top == 0) - { - if (bits < codeSize) - { - if (count == 0) - { - buffer = ReadBlock(); - count = buffer.Length; - if (count == 0) - { - break; - } - bi = 0; - } - data += buffer[bi] << bits; - bits += 8; - bi++; - count--; - continue; - } - code = data & code_mask; - data >>= codeSize; - bits -= codeSize; - if (code > availableCode || code == endCode) - { - break; - } - if (code == clearCode) - { - codeSize = dataSize + 1; - code_mask = (1 << codeSize) - 1; - availableCode = clearCode + 2; - old_code = NullCode; - continue; - } - if (old_code == NullCode) - { - pixelStatck[top++] = suffix[code]; - old_code = code; - first = code; - continue; - } - inCode = code; - if (code == availableCode) - { - pixelStatck[top++] = (byte)first; - code = old_code; - } - while (code > clearCode) - { - pixelStatck[top++] = suffix[code]; - code = prefix[code]; - } - first = suffix[code]; - if (availableCode > StackSize) - { - break; - } - pixelStatck[top++] = suffix[code]; - prefix[availableCode] = old_code; - suffix[availableCode] = first; - availableCode++; - if (availableCode == code_mask + 1 && availableCode < StackSize) - { - codeSize++; - code_mask = (1 << codeSize) - 1; - } - old_code = inCode; - } - top--; - pixels[xyz++] = (byte)pixelStatck[top]; - } - - #endregion - - return pixels; - } - - private byte[] ReadBlock() - { - int blockSize = _stream.ReadByte(); - return ReadBytes(blockSize); - } - - private byte[] ReadBytes(int length) - { - byte[] buffer = new byte[length]; - _stream.Read(buffer, 0, length); - return buffer; - } - } - #endregion - - #endregion - } - -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs deleted file mode 100644 index 982bff00a8..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - /// - /// This class represents any Image format, - /// and should be the base type for all drivers. - /// - public abstract class ImageFormat - { - /// - /// Save an image to the specified stream. - /// - /// The image to save. - /// The Stream to write to. - public abstract void Save(Image i, Stream dest); - /// - /// Load an image from the specified stream. - /// - /// The Stream to load from. - /// The loaded Image. - public abstract Image Load(Stream s); - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/JpegSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/JpegSupport.cs deleted file mode 100644 index 94ab97620b..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/JpegSupport.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using BitMiracle.LibJpeg; - -namespace Orvid.Graphics.ImageFormats -{ - public class JpegImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - BitMiracle.LibJpeg.JpegImage j = BitMiracle.LibJpeg.JpegImage.FromBitmap((System.Drawing.Bitmap)i); - CompressionParameters c = new CompressionParameters(); - c.Quality = 100; - c.SimpleProgressive = false; - j.WriteJpeg(dest, c); - j.Dispose(); - System.GC.Collect(); - } - - public override Image Load(Stream s) - { - BitMiracle.LibJpeg.JpegImage j = new BitMiracle.LibJpeg.JpegImage(s); - Image i = (Image)j.ToBitmap(); - j.Dispose(); - System.GC.Collect(); - return i; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs deleted file mode 100644 index 50c73457e3..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class OIFImage : ImageFormat - { - - public override void Save(Image i, System.IO.Stream dest) - { - MemoryStream m = new MemoryStream(); - m.WriteByte(0); -#warning Change this next byte to 255 if you update Image with UInt64 for width and height. - m.WriteByte(0); - m.WriteByte(0); - m.WriteByte(0); // Write the 8 empty bytes at the start of the file. - m.WriteByte(0); - m.WriteByte(0); - m.WriteByte(0); - m.WriteByte(0); - - byte[] dat = BitConverter.GetBytes(i.Height); // Write the height. - m.Write(dat, 0, dat.Length); - dat = BitConverter.GetBytes(i.Width); // Write the width. - m.Write(dat, 0, dat.Length); - - // Now to write the actual data. - Pixel p; - for (uint x = 0; x < i.Width; x++) - { - for (uint y = 0; y < i.Height; y++) - { - p = i.GetPixel(x, y); - m.WriteByte(p.R); - m.WriteByte(p.G); - m.WriteByte(p.B); - m.WriteByte(p.A); - } - } - dat = Orvid.Compression.LZMA.Compress(m.GetBuffer()); - dest.WriteByte(255); - dest.Write(dat, 0, dat.Length); - } - - private UInt32 ReadUInt32(byte[] data) - { - UInt32 r = 0; - - r += data[3]; - r <<= 8; - r += data[2]; - r <<= 8; - r += data[1]; - r <<= 8; - r += data[0]; - - return r; - } - - public override Image Load(System.IO.Stream s) - { - - if (s.ReadByte() == 255) - { - byte[] buf = new byte[s.Length - 1]; - s.Read(buf, 0, buf.Length); - s = new MemoryStream(Orvid.Compression.LZMA.Decompress(buf)); - } - else - { - s.Position = 0; - } - byte[] tmp = new byte[8]; - s.Read(tmp, 0, 8); // skip the 8 empty bytes at the start of the file. - tmp = new byte[4]; - s.Read(tmp, 0, 4); - uint Height = ReadUInt32(tmp); // Read the Height. - s.Read(tmp, 0, 4); - uint Width = ReadUInt32(tmp); // Read the Width. - Image i = new Image((int)Width, (int)Height); - byte r, g, b, a; - for (uint x = 0; x < Width; x++) - { - for (uint y = 0; y < Height; y++) - { - r = (byte)s.ReadByte(); - g = (byte)s.ReadByte(); - b = (byte)s.ReadByte(); - a = (byte)s.ReadByte(); - i.SetPixel(x, y, new Pixel(r, g, b, a)); - } - } - return i; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/PcxSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/PcxSupport.cs deleted file mode 100644 index 6522952c4d..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/PcxSupport.cs +++ /dev/null @@ -1,877 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class PcxImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - PcxInternals.Save(i, dest); - } - - public override Image Load(Stream s) - { - return PcxInternals.Load(s); - } - - - // Please note, everything below this - // point was originally from a plugin - // for Paint.Net, the plugin is available here: - // http://forums.getpaint.net/index.php?/topic/2135-pcx-plug-in/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - - #region Internals - private static class PcxInternals - { - - #region REALLLLYYY Doesn't Work :P - //private class pcx_t - //{ - // public char manufacturer; - // public char version; - // public char encoding; - // public char bits_per_pixel; - // public short xmin, ymin, xmax, ymax; - // public short hres, vres; - // public int[] palette = new int[48]; - // public char reserved; - // public char color_planes; - // public short bytes_per_line; - // public short palette_type; - // public byte[] filler = new byte[58]; - // public byte[] data; - - // public pcx_t(byte[] raw) - // { - // manufacturer = (char)raw[0]; - // version = (char)raw[1]; - // encoding = (char)raw[2]; - // bits_per_pixel = (char)raw[3]; - // xmin = (short)((raw[4] + (raw[5] << 8)) & 0xff); - // ymin = (short)((raw[6] + (raw[7] << 8)) & 0xff); - // xmax = (short)((raw[8] + (raw[9] << 8)) & 0xff); - // ymax = (short)((raw[10] + (raw[11] << 8)) & 0xff); - // hres = (short)((raw[12] + (raw[13] << 8)) & 0xff); - // vres = (short)((raw[14] + (raw[15] << 8)) & 0xff); - // for (int i = 0; i < 48; i++) - // palette[i] = (raw[16 + i] & 0xff); - // reserved = (char)raw[64]; - // color_planes = (char)raw[65]; - // bytes_per_line = (short)((raw[66] + (raw[67] << 8)) & 0xff); - // palette_type = (short)((raw[68] + (raw[69] << 8)) & 0xff); - // for (int i = 0; i < 58; i++) - // filler[i] = raw[70 + i]; - // data = new byte[raw.Length - 128]; - // for (int i = 0; i < raw.Length - 128; i++) - // data[i] = raw[128 + i]; - // } - //} - - //private static byte[] imageData; - //private static int imageWidth, imageHeight; - //public static Image Load(Stream s) - //{ - // int[] palette, pic, ot, pix; - // int k, x, y, len = 0, dataByte, runLength; - // byte[] raw; - // pcx_t pcx; - - // raw = new byte[s.Length]; - // s.Read(raw, 0, (int)s.Length); - - - // pcx = new pcx_t(raw); - // raw = pcx.data; - - // if (pcx.manufacturer != 0x0a || pcx.version != 5 || pcx.encoding != 1 || pcx.bits_per_pixel != 8 || pcx.xmax >= 640 || pcx.ymax >= 480) - // { - // throw new Exception("Bad Pcx Data!"); - // } - - // palette = new int[768]; - // for (int i = 0; i < 768; i++) - // { - // if ((uint)(len - 128 - 768 + i) < pcx.data.Length) - // { - // palette[i] = pcx.data[len - 128 - 768 + i] & 0xff; - // } - // } - - // imageWidth = pcx.xmax + 1; - // imageHeight = pcx.ymax + 1; - - // ot = new int[(pcx.ymax + 1) * (pcx.xmax + 1)]; - // pic = ot; - // pix = ot; - // int pixcount = 0; - // int rawcount = 0; - - // for (y = 0; y <= pcx.ymax; y++, pixcount += pcx.xmax + 1) - // { - // for (x = 0; x <= pcx.xmax; ) - // { - // dataByte = raw[rawcount++]; - - // if ((dataByte & 0xC0) == 0xC0) - // { - // runLength = dataByte & 0x3F; - // dataByte = raw[rawcount++]; - // } - // else - // runLength = 1; - - // while (runLength-- > 0) - // pix[pixcount + x++] = dataByte & 0xff; - // } - // } - - // Image im = new Image(imageWidth, imageHeight); - // imageData = new byte[imageWidth * imageHeight * 4]; - - // //convert to rgb format - // for (k = 0; k < (imageWidth * imageHeight); k++) - // { - // imageData[k * 4] = (byte)palette[pic[k] * 3]; - // imageData[k * 4 + 1] = (byte)palette[pic[k] * 3 + 1]; - // imageData[k * 4 + 2] = (byte)palette[pic[k] * 3 + 2]; - // imageData[k * 4 + 3] = 0xff; - // } - // uint ndx = 0; - // for (uint yloc = 0; yloc < imageHeight; yloc++) - // { - // for (uint xloc = 0; xloc < imageWidth; xloc++) - // { - // im.SetPixel(xloc, yloc, new Pixel(imageData[ndx], imageData[ndx + 1], imageData[ndx + 2], imageData[ndx + 3])); - // ndx += 4; - // } - // } - - // return im; - //} - #endregion - - - #region Load - public static Image Load(Stream input) - { - PcxPalette palette = null; - uint[] numArray = null; - Image im; - PcxHeader header = new PcxHeader(input); - - #region Checks - if (header.id != PcxId.ZSoftPCX) - { - throw new FormatException("Not a PCX file."); - } - if (((header.version != PcxVersion.Version3_0) && (header.version != PcxVersion.Version2_8_Palette)) && ((header.version != PcxVersion.Version2_8_DefaultPalette) && (header.version != PcxVersion.Version2_5))) - { - throw new FormatException("Unsupported PCX version: " + header.version.ToString()); - } - if (((header.bitsPerPixel != 1) && (header.bitsPerPixel != 2)) && ((header.bitsPerPixel != 4) && (header.bitsPerPixel != 8))) - { - throw new FormatException("Unsupported PCX bits per pixel: " + header.bitsPerPixel.ToString() + " bits per pixel"); - } - int width = (header.xMax - header.xMin) + 1; - int height = (header.yMax - header.yMin) + 1; - if (((width < 0) || (height < 0)) || ((width > 0xffff) || (height > 0xffff))) - { - throw new FormatException("Invalid image dimensions: (" + header.xMin.ToString() + "," + header.yMin.ToString() + ")-(" + header.xMax.ToString() + "," + header.yMax.ToString() + ")"); - } - int num3 = (header.bytesPerLine * 8) / header.bitsPerPixel; - int BitDepth = header.bitsPerPixel * header.nPlanes; - if ((((BitDepth != 1) && (BitDepth != 2)) && ((BitDepth != 4) && (BitDepth != 8))) && (BitDepth != 0x18)) - { - throw new FormatException("Unsupported PCX bit depth: " + BitDepth.ToString()); - } - #endregion - - #region Load Palette - while (true) - { - if (BitDepth == 1) - { - palette = PcxPalette.FromEgaPalette(PcxPalette.MONO_PALETTE); - break; - } - if (BitDepth >= 8) - { - if (BitDepth == 8) - { - long position = input.Position; - input.Seek(-769L, SeekOrigin.End); - if (input.ReadByte() != 12) - { - throw new FormatException("PCX palette marker not present in file"); - } - palette = new PcxPalette(input, 0x100); - input.Seek(position, SeekOrigin.Begin); - } - else - { - palette = new PcxPalette(0x100); - } - break; - } - switch (header.version) - { - case PcxVersion.Version2_5: - case PcxVersion.Version2_8_DefaultPalette: - if (BitDepth == 2) - { - numArray = PcxPalette.CGA_PALETTE; - palette = PcxPalette.FromEgaPalette(numArray); - } - break; - - default: - numArray = new uint[0]; - palette = PcxPalette.FromColorMap(header.colorMap); - break; - } - if (numArray == null) - { - numArray = PcxPalette.EGA_PALETTE; - } - break; - } - #endregion - - im = new Image(width, height); - uint[] array = new uint[width]; - for (int y = 0; y < height; y++) - { - PcxByteReader byteReader = (header.encoding == PcxEncoding.RunLengthEncoded) ? ((PcxByteReader)new PcxRleByteReader(input)) : ((PcxByteReader)new PcxRawByteReader(input)); - PcxIndexReader indxReader = new PcxIndexReader(byteReader, header.bitsPerPixel); - for (int j = 0; j < header.nPlanes; j++) - { - for (int m = 0; m < num3; m++) - { - uint num10 = indxReader.ReadIndex(); - if (m < width) - { - array[m] |= num10 << (j * header.bitsPerPixel); - } - } - } - for (int x = 0; x < width; x++) - { - Pixel bgra; - uint TempC = array[x]; - if (BitDepth == 24) - { - byte r = (byte)(TempC & 0xff); - byte g = (byte)((TempC >> 8) & 0xff); - byte b = (byte)((TempC >> 16) & 0xff); - bgra = new Pixel(r, g, b, 255); - } - else - { - bgra = palette[TempC]; - } - im.SetPixel((uint)x, (uint)y, bgra); - } - } - return im; - } - #endregion - - #region Save - public static void Save(Image bitmap, Stream output) - { - //if ((bitmap.Palette.Entries.Length == 0) || (bitmap.Palette.Entries.Length > 0x100)) - //{ - // throw new FormatException("Unsupported palette size"); - //} - //PcxPalette palette = new PcxPalette(bitmap.Palette); - //PcxHeader header = new PcxHeader - //{ - // version = PcxVersion.Version3_0, - // encoding = token.RleCompress ? PcxEncoding.RunLengthEncoded : PcxEncoding.None, - // bitsPerPixel = (palette.Size == 0x10) ? ((byte)4) : ((palette.Size == 0x100) ? ((byte)8) : ((byte)0)), - // xMin = 0, - // yMin = 0, - // xMax = (ushort)(bitmap.Width - 1), - // yMax = (ushort)(bitmap.Height - 1), - // hDpi = (ushort)bitmap.HorizontalResolution, - // vDpi = (ushort)bitmap.VerticalResolution, - // nPlanes = 1, - // bytesPerLine = (ushort)(bitmap.Width + (((bitmap.Width % 2) == 1) ? 1 : 0)), - // paletteInfo = PcxPaletteType.Indexed - //}; - //if (palette.Size == 0x10) - //{ - // header.colorMap = palette.ToColorMap(); - //} - //header.Write(output); - //int num = (header.bytesPerLine * 8) / header.bitsPerPixel; - // for (int i = 0; i < bitmap.Height; i++) - // { - // byte[] destination = new byte[bitmap.Width]; - // byte* numPtr = (byte*)(bitmapdata.Scan0.ToPointer() + (i * bitmapdata.Stride)); - // Marshal.Copy(new IntPtr((void*)numPtr), destination, 0, bitmap.Width); - // PcxByteWriter writer = (header.encoding == PcxEncoding.RunLengthEncoded) ? ((PcxByteWriter)new PcxRleByteWriter(output)) : ((PcxByteWriter)new PcxRawByteWriter(output)); - // PcxIndexWriter writer2 = new PcxIndexWriter(writer, header.bitsPerPixel); - // for (int j = 0; j < num; j++) - // { - // if (j < bitmap.Width) - // { - // writer2.WriteIndex(destination[j]); - // } - // else - // { - // writer2.WriteIndex(0); - // } - // } - // writer2.Flush(); - // writer.Flush(); - // } - //if (palette.Size == 0x100) - //{ - // output.WriteByte(12); - // palette.Write(output); - //} - } - #endregion - - - #region PcxByteReader - private abstract class PcxByteReader - { - protected PcxByteReader() - { - } - - public abstract byte ReadByte(); - } - #endregion - - #region PcxByteWriter - private abstract class PcxByteWriter - { - protected PcxByteWriter() - { - } - - public abstract void Flush(); - public abstract void WriteByte(byte value); - } - #endregion - - #region PcxHeader - private class PcxHeader - { - public byte bitsPerPixel; - public ushort bytesPerLine; - public byte[] colorMap; - public PcxEncoding encoding; - public byte[] filler; - public ushort hDpi; - public PcxId id; - public byte nPlanes; - public PcxPaletteType paletteInfo; - public byte reserved; - public ushort vDpi; - public PcxVersion version; - public ushort xMax; - public ushort xMin; - public ushort yMax; - public ushort yMin; - - public PcxHeader() - { - this.id = PcxId.ZSoftPCX; - this.version = PcxVersion.Version3_0; - this.encoding = PcxEncoding.RunLengthEncoded; - this.colorMap = new byte[0x30]; - this.filler = new byte[0x3a]; - } - - public PcxHeader(Stream input) - { - this.id = PcxId.ZSoftPCX; - this.version = PcxVersion.Version3_0; - this.encoding = PcxEncoding.RunLengthEncoded; - this.colorMap = new byte[0x30]; - this.filler = new byte[0x3a]; - this.id = (PcxId)this.ReadByte(input); - this.version = (PcxVersion)this.ReadByte(input); - this.encoding = (PcxEncoding)this.ReadByte(input); - this.bitsPerPixel = this.ReadByte(input); - this.xMin = this.ReadUInt16(input); - this.yMin = this.ReadUInt16(input); - this.xMax = this.ReadUInt16(input); - this.yMax = this.ReadUInt16(input); - this.hDpi = this.ReadUInt16(input); - this.vDpi = this.ReadUInt16(input); - for (int i = 0; i < this.colorMap.Length; i++) - { - this.colorMap[i] = this.ReadByte(input); - } - this.reserved = this.ReadByte(input); - this.nPlanes = this.ReadByte(input); - this.bytesPerLine = this.ReadUInt16(input); - this.paletteInfo = (PcxPaletteType)((byte)this.ReadUInt16(input)); - for (int j = 0; j < this.filler.Length; j++) - { - this.filler[j] = this.ReadByte(input); - } - } - - private byte ReadByte(Stream input) - { - int num = input.ReadByte(); - if (num == -1) - { - throw new EndOfStreamException(); - } - return (byte)num; - } - - private ushort ReadUInt16(Stream input) - { - int num = BitConverter.ToUInt16(new byte[] { (byte)input.ReadByte(), (byte)input.ReadByte() }, 0); - if (num == -1) - { - throw new EndOfStreamException(); - } - return (ushort)num; - } - - public void Write(Stream output) - { - output.WriteByte((byte)this.id); - output.WriteByte((byte)this.version); - output.WriteByte((byte)this.encoding); - output.WriteByte(this.bitsPerPixel); - output.Write(BitConverter.GetBytes((ushort)this.xMin), 0, 2); - output.Write(BitConverter.GetBytes((ushort)this.yMin), 0, 2); - output.Write(BitConverter.GetBytes((ushort)this.xMax), 0, 2); - output.Write(BitConverter.GetBytes((ushort)this.yMax), 0, 2); - output.Write(BitConverter.GetBytes((ushort)this.hDpi), 0, 2); - output.Write(BitConverter.GetBytes((ushort)this.vDpi), 0, 2); - for (int i = 0; i < this.colorMap.Length; i++) - { - output.WriteByte(this.colorMap[i]); - } - output.WriteByte(this.reserved); - output.WriteByte(this.nPlanes); - output.Write(BitConverter.GetBytes((ushort)this.bytesPerLine), 0, 2); - output.Write(BitConverter.GetBytes((ushort)1), 0, 2); - for (int j = 0; j < this.filler.Length; j++) - { - output.WriteByte(this.filler[j]); - } - } - } - #endregion - - #region PcxIndexReader - private class PcxIndexReader - { - private uint m_bitMask; - private uint m_bitsPerPixel; - private uint m_bitsRemaining; - private uint m_byteRead; - private PcxByteReader m_reader; - - public PcxIndexReader(PcxByteReader reader, uint bitsPerPixel) - { - if (((bitsPerPixel != 1) && (bitsPerPixel != 2)) && ((bitsPerPixel != 4) && (bitsPerPixel != 8))) - { - throw new ArgumentException("bitsPerPixel must be 1, 2, 4 or 8", "bitsPerPixel"); - } - this.m_reader = reader; - this.m_bitsPerPixel = bitsPerPixel; - this.m_bitMask = 1; - for (uint i = this.m_bitsPerPixel; i > 0; i--) - { - this.m_bitMask = this.m_bitMask << 1; - } - this.m_bitMask--; - } - - public uint ReadIndex() - { - if (this.m_bitsRemaining == 0) - { - this.m_byteRead = this.m_reader.ReadByte(); - this.m_bitsRemaining = 8; - } - uint num = (this.m_byteRead >> (int)(8 - this.m_bitsPerPixel)) & this.m_bitMask; - this.m_byteRead = this.m_byteRead << (int)this.m_bitsPerPixel; - this.m_bitsRemaining -= this.m_bitsPerPixel; - return num; - } - } - #endregion - - #region PcxIndexWriter - private class PcxIndexWriter - { - private uint m_bitMask; - private uint m_bitsPerPixel; - private uint m_bitsUsed; - private uint m_byteAccumulated; - private PcxByteWriter m_writer; - - public PcxIndexWriter(PcxByteWriter writer, uint bitsPerPixel) - { - if (((bitsPerPixel != 1) && (bitsPerPixel != 2)) && ((bitsPerPixel != 4) && (bitsPerPixel != 8))) - { - throw new ArgumentException("bitsPerPixel must be 1, 2, 4 or 8", "bitsPerPixel"); - } - this.m_writer = writer; - this.m_bitsPerPixel = bitsPerPixel; - this.m_bitMask = 1; - for (uint i = this.m_bitsPerPixel; i > 0; i--) - { - this.m_bitMask = this.m_bitMask << 1; - } - this.m_bitMask--; - } - - public void Flush() - { - if (this.m_bitsUsed > 0) - { - this.m_writer.WriteByte((byte)this.m_byteAccumulated); - this.m_bitsUsed = 0; - } - } - - public void WriteIndex(uint index) - { - this.m_byteAccumulated = (this.m_byteAccumulated << (int)this.m_bitsPerPixel) | (index & this.m_bitMask); - this.m_bitsUsed += this.m_bitsPerPixel; - if (this.m_bitsUsed == 8) - { - this.Flush(); - } - } - } - #endregion - - #region PcxPalette - private class PcxPalette - { - public static readonly uint[] CGA_PALETTE = new uint[] - { - 0, 0xaaaa, 0xaa00aa, 0xaaaaaa, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - }; - public static readonly uint[] EGA_PALETTE = new uint[] - { - 0, 0xa8, 0xa800, 0xa8a8, - 0xa80000, 0xa800a8, 0xa85400, 0xa8a8a8, - 0x545454, 0x5454fe, 0x54fe54, 0x54fefe, - 0xfe5454, 0xfe54fe, 0xfefe54, 0xfefefe - }; - private Pixel[] m_palette; - public static readonly uint[] MONO_PALETTE; - - static PcxPalette() - { - uint[] numArray = new uint[0x10]; - numArray[1] = 0xffffff; - MONO_PALETTE = numArray; - } - - public PcxPalette(uint size) - { - if ((size != 0x10) && (size != 0x100)) - { - throw new FormatException("Unsupported palette size"); - } - this.m_palette = new Pixel[size]; - } - - public PcxPalette(Stream input, int size) - { - if ((size != 0x10) && (size != 0x100)) - { - throw new FormatException("Unsupported palette size"); - } - this.m_palette = new Pixel[size]; - for (int i = 0; i < this.m_palette.Length; i++) - { - int num2 = input.ReadByte(); - if (num2 == -1) - { - throw new EndOfStreamException(); - } - int num3 = input.ReadByte(); - if (num3 == -1) - { - throw new EndOfStreamException(); - } - int num4 = input.ReadByte(); - if (num4 == -1) - { - throw new EndOfStreamException(); - } - this.m_palette[i] = new Pixel((byte)num2, (byte)num3, (byte)num4, 0xff); - } - } - - public static PcxPalette FromColorMap(byte[] colorMap) - { - if (colorMap == null) - { - throw new ArgumentNullException("colorMap"); - } - if (colorMap.Length != 48) - { - throw new FormatException("Trying to read an unsupported palette size from a header ColorMap"); - } - PcxPalette palette = new PcxPalette(16); - uint num = 0; - for (uint i = 0; i < 16; i++) - { - byte r = colorMap[num]; - num++; - byte g = colorMap[num]; - num++; - byte b = colorMap[num]; - num++; - palette[i] = new Pixel(r, g, b, 255); - } - return palette; - } - - public static PcxPalette FromEgaPalette(uint[] egaPalette) - { - if (egaPalette == null) - { - throw new ArgumentNullException("egaPalette"); - } - if (egaPalette.Length != 0x10) - { - throw new FormatException("Trying to read an unsupported palette size from a header ColorMap"); - } - PcxPalette palette = new PcxPalette(0x10); - for (uint i = 0; i < 0x10; i++) - { - byte r = (byte)((egaPalette[i] >> 16) & 0xff); - byte g = (byte)((egaPalette[i] >> 8) & 0xff); - byte b = (byte)(egaPalette[i] & 0xff); - palette[i] = new Pixel(r, g, b, 255); - } - return palette; - } - - public byte[] ToColorMap() - { - if (this.m_palette.Length != 0x10) - { - throw new FormatException("Trying to write an unsupported palette size to a header ColorMap"); - } - byte[] buffer = new byte[0x30]; - uint num = 0; - for (int i = 0; i < 0x10; i++) - { - Pixel bgra = this.m_palette[i]; - buffer[num++] = bgra.R; - buffer[num++] = bgra.G; - buffer[num++] = bgra.B; - } - return buffer; - } - - public void Write(Stream output) - { - for (int i = 0; i < this.m_palette.Length; i++) - { - Pixel bgra = this.m_palette[i]; - output.WriteByte(bgra.R); - output.WriteByte(bgra.G); - output.WriteByte(bgra.B); - } - } - - public Pixel this[uint index] - { - get - { - return this.m_palette[index]; - } - set - { - this.m_palette[index] = value; - } - } - - public uint Size - { - get - { - return (uint)this.m_palette.Length; - } - } - } - #endregion - - #region PcxRawByteReader - private class PcxRawByteReader : PcxByteReader - { - private Stream m_stream; - - public PcxRawByteReader(Stream stream) - { - this.m_stream = stream; - } - - public override byte ReadByte() - { - return (byte)this.m_stream.ReadByte(); - } - } - #endregion - - #region PcxRawByteWriter - private class PcxRawByteWriter : PcxByteWriter - { - private Stream m_stream; - - public PcxRawByteWriter(Stream stream) - { - this.m_stream = stream; - } - - public override void Flush() - { - } - - public override void WriteByte(byte value) - { - this.m_stream.WriteByte(value); - } - } - #endregion - - #region PcxRleByteReader - private class PcxRleByteReader : PcxByteReader - { - private uint m_count; - private byte m_rleValue; - private Stream m_stream; - - public PcxRleByteReader(Stream input) - { - this.m_stream = input; - } - - public override byte ReadByte() - { - if (this.m_count > 0) - { - this.m_count--; - return this.m_rleValue; - } - byte num = (byte)this.m_stream.ReadByte(); - if ((num & 192) == 192) - { - this.m_count = (uint)(num & 63); - this.m_rleValue = (byte)this.m_stream.ReadByte(); - this.m_count--; - return this.m_rleValue; - } - return num; - } - } - #endregion - - #region PcxRleByteWriter - private class PcxRleByteWriter : PcxByteWriter - { - private uint m_count; - private byte m_lastValue; - private Stream m_stream; - - public PcxRleByteWriter(Stream output) - { - this.m_stream = output; - } - - public override void Flush() - { - if (this.m_count != 0) - { - if ((this.m_count > 1) || ((this.m_count == 1) && ((this.m_lastValue & 0xc0) == 0xc0))) - { - this.m_stream.WriteByte((byte)(0xc0 | this.m_count)); - this.m_stream.WriteByte(this.m_lastValue); - this.m_count = 0; - } - else - { - this.m_stream.WriteByte(this.m_lastValue); - this.m_count = 0; - } - } - } - - public override void WriteByte(byte value) - { - if (((this.m_count == 0) || (this.m_count == 0x3f)) || (value != this.m_lastValue)) - { - this.Flush(); - this.m_lastValue = value; - this.m_count = 1; - } - else - { - this.m_count++; - } - } - } - #endregion - - #region PcxVersion - private enum PcxVersion : byte - { - Version2_5 = 0, - Version2_8_DefaultPalette = 3, - Version2_8_Palette = 2, - Version3_0 = 5 - } - #endregion - - #region PcxPaletteType - private enum PcxPaletteType : byte - { - Grayscale = 2, - Indexed = 1 - } - #endregion - - #region PcxEncoding - private enum PcxEncoding : byte - { - None = 0, - RunLengthEncoded = 1 - } - #endregion - - #region PcxId - private enum PcxId : byte - { - ZSoftPCX = 10 - } - #endregion - - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/PngSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/PngSupport.cs deleted file mode 100644 index f2bfdb2894..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/PngSupport.cs +++ /dev/null @@ -1,1304 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using Orvid.Compression.Streams; -using Orvid.Compression.Checksums; - -namespace Orvid.Graphics.ImageFormats -{ - public class PngImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - PngEncoder p = new PngEncoder(); - p.Encode(i, dest); - } - - public override Image Load(Stream s) - { - PngDecoder p = new PngDecoder(); - return p.Decode(s); - } - - // Please note, everything below this - // point was originally from the ImageTools - // Library, available here: - // http://imagetools.codeplex.com/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - #region Encoder - /// - /// Image encoder for writing image data to a stream in png format. - /// - private class PngEncoder - { - private const int MaxBlockSize = 0xFFFF; - private Stream _stream; - private Image _image; - - /// - /// Gets or sets a value indicating whether this encoder - /// will write the image uncompressed the stream. - /// - /// - /// true if the image should be written uncompressed to - /// the stream; otherwise, false. - /// - public bool IsWritingUncompressed { get; set; } - - /// - /// Gets or sets a value indicating whether this instance is writing - /// gamma information to the stream. The default value is false. - /// - /// - /// true if this instance is writing gamma - /// information to the stream.; otherwise, false. - /// - public bool IsWritingGamma { get; set; } - - /// - /// Gets or sets the gamma value, that will be written - /// the the stream, when the property - /// is set to true. The default value is 2.2f. - /// - /// The gamma value of the image. - public double Gamma { get; set; } - - /// - /// Gets the default file extension for this encoder. - /// - /// The default file extension for this encoder. - public string Extension - { - get { return "PNG"; } - } - - /// - /// Initializes a new instance of the class. - /// - public PngEncoder() - { - Gamma = 2.2f; - } - - /// - /// Indicates if the image encoder supports the specified - /// file extension. - /// - /// The file extension. - /// true, if the encoder supports the specified - /// extensions; otherwise false. - /// - /// - /// is null (Nothing in Visual Basic). - /// is a string - /// of length zero or contains only blanks. - public bool IsSupportedFileExtension(string extension) - { - string extensionAsUpper = extension.ToUpper(System.Globalization.CultureInfo.CurrentCulture); - return extensionAsUpper == "PNG"; - } - - public void Encode(Image image, Stream stream) - { - _image = image; - _stream = stream; - // Write the png header. - stream.Write( - new byte[] - { - 0x89, 0x50, 0x4E, 0x47, - 0x0D, 0x0A, 0x1A, 0x0A - }, 0, 8); - - PngHeader header = new PngHeader(); - header.Width = image.Width; - header.Height = image.Height; - header.ColorType = 6; - header.BitDepth = 8; - header.FilterMethod = 0; - header.CompressionMethod = 0; - header.InterlaceMethod = 0; - - WriteHeaderChunk(header); - - WritePhysicsChunk(); - WriteGammaChunk(); - - if (IsWritingUncompressed) - { - WriteDataChunksFast(); - } - else - { - WriteDataChunks(); - } - WriteEndChunk(); - - stream.Flush(); - } - - private void WritePhysicsChunk() - { - //if (_image.DensityX > 0 && _image.DensityY > 0) - { -#warning TODO: Un-Comment this when DPI is supported in Orvid.Graphics.Image - //int dpmX = (int)Math.Round(_image.DensityX * 39.3700787d); - //int dpmY = (int)Math.Round(_image.DensityY * 39.3700787d); - - // DPI isn't currently supported, - // so used 75 as the default. - int dpmX = 2953; - int dpmY = 2953; - - byte[] chunkData = new byte[9]; - - WriteInteger(chunkData, 0, dpmX); - WriteInteger(chunkData, 4, dpmY); - - chunkData[8] = 1; - - WriteChunk(PngChunkTypes.Physical, chunkData); - } - } - - private void WriteGammaChunk() - { - if (IsWritingGamma) - { - int gammeValue = (int)(Gamma * 100000f); - - byte[] fourByteData = new byte[4]; - - byte[] size = BitConverter.GetBytes(gammeValue); - fourByteData[0] = size[3]; fourByteData[1] = size[2]; fourByteData[2] = size[1]; fourByteData[3] = size[0]; - - WriteChunk(PngChunkTypes.Gamma, fourByteData); - } - } - - private void WriteDataChunksFast() - { - byte[] pixels = ConvertPixelArrayToByteArray(_image.Data); - - // Convert the pixel array to a new array for adding - // the filter byte. - // -------------------------------------------------- - byte[] data = new byte[_image.Width * _image.Height * 4 + _image.Height]; - - int rowLength = _image.Width * 4 + 1; - - for (int y = 0; y < _image.Height; y++) - { - data[y * rowLength] = 0; - - Array.Copy(pixels, y * _image.Width * 4, data, y * rowLength + 1, _image.Width * 4); - } - // -------------------------------------------------- - - Adler32 adler32 = new Adler32(); - adler32.Update(data); - - using (MemoryStream tempStream = new MemoryStream()) - { - int remainder = data.Length; - - int blockCount; - if ((data.Length % MaxBlockSize) == 0) - { - blockCount = data.Length / MaxBlockSize; - } - else - { - blockCount = (data.Length / MaxBlockSize) + 1; - } - - // Write headers - tempStream.WriteByte(0x78); - tempStream.WriteByte(0xDA); - - for (int i = 0; i < blockCount; i++) - { - // Write the length - ushort length = (ushort)((remainder < MaxBlockSize) ? remainder : MaxBlockSize); - - if (length == remainder) - { - tempStream.WriteByte(0x01); - } - else - { - tempStream.WriteByte(0x00); - } - - tempStream.Write(BitConverter.GetBytes(length), 0, 2); - - // Write one's compliment of length - tempStream.Write(BitConverter.GetBytes((ushort)~length), 0, 2); - - // Write blocks - tempStream.Write(data, (int)(i * MaxBlockSize), length); - - // Next block - remainder -= MaxBlockSize; - } - - WriteInteger(tempStream, (int)adler32.Value); - - tempStream.Seek(0, SeekOrigin.Begin); - - byte[] zipData = new byte[tempStream.Length]; - tempStream.Read(zipData, 0, (int)tempStream.Length); - - WriteChunk(PngChunkTypes.Data, zipData); - } - } - - private byte[] ConvertPixelArrayToByteArray(Pixel[] a) - { - byte[] b = new byte[a.Length * 4]; - - int indx = 0; - Pixel p; - for (uint i = 0; i < a.Length; i++) - { - p = a[i]; - b[indx] = p.R; - indx++; - b[indx] = p.G; - indx++; - b[indx] = p.B; - indx++; - b[indx] = p.A; - indx++; - } - - return b; - } - - private void WriteDataChunks() - { - byte[] pixels = ConvertPixelArrayToByteArray(_image.Data); - - byte[] data = new byte[_image.Width * _image.Height * 4 + _image.Height]; - - int rowLength = _image.Width * 4 + 1; - - for (int y = 0; y < _image.Height; y++) - { - byte compression = 0; - if (y > 0) - { - compression = 2; - } - data[y * rowLength] = compression; - - for (int x = 0; x < _image.Width; x++) - { - // Calculate the offset for the new array. - int dataOffset = y * rowLength + x * 4 + 1; - - // Calculate the offset for the original pixel array. - int pixelOffset = (y * _image.Width + x) * 4; - - data[dataOffset + 0] = pixels[pixelOffset + 0]; - data[dataOffset + 1] = pixels[pixelOffset + 1]; - data[dataOffset + 2] = pixels[pixelOffset + 2]; - data[dataOffset + 3] = pixels[pixelOffset + 3]; - - if (y > 0) - { - int lastOffset = ((y - 1) * _image.Width + x) * 4; - - data[dataOffset + 0] -= pixels[lastOffset + 0]; - data[dataOffset + 1] -= pixels[lastOffset + 1]; - data[dataOffset + 2] -= pixels[lastOffset + 2]; - data[dataOffset + 3] -= pixels[lastOffset + 3]; - } - } - } - - byte[] buffer = null; - int bufferLength = 0; - - MemoryStream memoryStream = null; - try - { - memoryStream = new MemoryStream(); - using (DeflaterOutputStream zStream = new DeflaterOutputStream(memoryStream)) - { - memoryStream = null; - - zStream.Write(data, 0, data.Length); - zStream.Flush(); - zStream.Finish(); - - bufferLength = (int)memoryStream.Length; - buffer = memoryStream.GetBuffer(); - } - } - finally - { - if (memoryStream != null) - { - memoryStream.Dispose(); - } - } - - int numChunks = bufferLength / MaxBlockSize; - - if (bufferLength % MaxBlockSize != 0) - { - numChunks++; - } - - for (int i = 0; i < numChunks; i++) - { - int length = bufferLength - i * MaxBlockSize; - - if (length > MaxBlockSize) - { - length = MaxBlockSize; - } - - WriteChunk(PngChunkTypes.Data, buffer, i * MaxBlockSize, length); - } - } - - private void WriteEndChunk() - { - WriteChunk(PngChunkTypes.End, null); - } - - private void WriteHeaderChunk(PngHeader header) - { - byte[] chunkData = new byte[13]; - - WriteInteger(chunkData, 0, header.Width); - WriteInteger(chunkData, 4, header.Height); - - chunkData[8] = header.BitDepth; - chunkData[9] = header.ColorType; - chunkData[10] = header.CompressionMethod; - chunkData[11] = header.FilterMethod; - chunkData[12] = header.InterlaceMethod; - - WriteChunk(PngChunkTypes.Header, chunkData); - } - - private void WriteChunk(string type, byte[] data) - { - WriteChunk(type, data, 0, data != null ? data.Length : 0); - } - - private void WriteChunk(string type, byte[] data, int offset, int length) - { - WriteInteger(_stream, length); - - byte[] typeArray = new byte[4]; - typeArray[0] = (byte)type[0]; - typeArray[1] = (byte)type[1]; - typeArray[2] = (byte)type[2]; - typeArray[3] = (byte)type[3]; - - _stream.Write(typeArray, 0, 4); - - if (data != null) - { - _stream.Write(data, offset, length); - } - - Crc32 crc32 = new Crc32(); - crc32.Update(typeArray); - - if (data != null) - { - crc32.Update(data, offset, length); - } - - WriteInteger(_stream, (uint)crc32.Value); - } - - private static void WriteInteger(byte[] data, int offset, int value) - { - byte[] buffer = BitConverter.GetBytes(value); - - Array.Reverse(buffer); - Array.Copy(buffer, 0, data, offset, 4); - } - - private static void WriteInteger(Stream stream, int value) - { - byte[] buffer = BitConverter.GetBytes(value); - - Array.Reverse(buffer); - - stream.Write(buffer, 0, 4); - } - - private static void WriteInteger(Stream stream, uint value) - { - byte[] buffer = BitConverter.GetBytes(value); - - Array.Reverse(buffer); - - stream.Write(buffer, 0, 4); - } - } - #endregion - - #region Decoder - private class PngDecoder - { - private static readonly Dictionary _colorTypes = new Dictionary(); - private Stream _stream; - private PngHeader _header; - - static PngDecoder() - { - _colorTypes.Add(0, - new PngColorTypeInformation(1, new int[] { 1, 2, 4, 8 }, - (p, a) => new GrayscaleReader(false))); - - _colorTypes.Add(2, - new PngColorTypeInformation(3, new int[] { 8 }, - (p, a) => new TrueColorReader(false))); - - _colorTypes.Add(3, - new PngColorTypeInformation(1, new int[] { 1, 2, 4, 8 }, - (p, a) => new PaletteIndexReader(p, a))); - - _colorTypes.Add(4, - new PngColorTypeInformation(2, new int[] { 8 }, - (p, a) => new GrayscaleReader(true))); - - _colorTypes.Add(6, - new PngColorTypeInformation(4, new int[] { 8 }, - (p, a) => new TrueColorReader(true))); - } - - #region IImageDecoder Members - - /// - /// Gets the size of the header for this image type. - /// - /// The size of the header. - public int HeaderSize - { - get { return 8; } - } - - /// - /// Indicates if the image decoder supports the specified - /// file extension. - /// - /// The file extension. - /// - /// true, if the decoder supports the specified - /// extensions; otherwise false. - /// - /// - /// is null (Nothing in Visual Basic). - /// is a string - /// of length zero or contains only blanks. - public bool IsSupportedFileExtension(string extension) - { - string extensionAsUpper = extension.ToUpper(System.Globalization.CultureInfo.CurrentCulture); - return extensionAsUpper == "PNG"; - } - - /// - /// Indicates if the image decoder supports the specified - /// file header. - /// - /// The file header. - /// - /// true, if the decoder supports the specified - /// file header; otherwise false. - /// - /// - /// is null (Nothing in Visual Basic). - public bool IsSupportedFileFormat(byte[] header) - { - bool isPng = false; - - if (header.Length >= 8) - { - isPng = - header[0] == 0x89 && - header[1] == 0x50 && // P - header[2] == 0x4E && // N - header[3] == 0x47 && // G - header[4] == 0x0D && // CR - header[5] == 0x0A && // LF - header[6] == 0x1A && // EOF - header[7] == 0x0A; // LF - } - - return isPng; - } - - /// - /// Decodes the image from the specified stream and sets - /// the data to image. - /// - /// The image, where the data should be set to. - /// Cannot be null (Nothing in Visual Basic). - /// The stream, where the image should be - /// decoded from. Cannot be null (Nothing in Visual Basic). - /// - /// is null (Nothing in Visual Basic). - /// - or - - /// is null (Nothing in Visual Basic). - /// - public Image Decode(Stream stream) - { - _stream = stream; - _stream.Seek(8, SeekOrigin.Current); - - bool isEndChunckReached = false; - - PngChunk currentChunk = null; - - byte[] palette = null; - byte[] paletteAlpha = null; - - using (MemoryStream dataStream = new MemoryStream()) - { - while ((currentChunk = ReadChunk()) != null) - { - if (isEndChunckReached) - { - throw new Exception("Image does not end with end chunk."); - } - - if (currentChunk.Type == PngChunkTypes.Header) - { - ReadHeaderChunk(currentChunk.Data); - - ValidateHeader(); - } - else if (currentChunk.Type == PngChunkTypes.Physical) - { - ReadPhysicalChunk(currentChunk.Data); - } - else if (currentChunk.Type == PngChunkTypes.Data) - { - dataStream.Write(currentChunk.Data, 0, currentChunk.Data.Length); - } - else if (currentChunk.Type == PngChunkTypes.Palette) - { - palette = currentChunk.Data; - } - else if (currentChunk.Type == PngChunkTypes.PaletteAlpha) - { - paletteAlpha = currentChunk.Data; - } - else if (currentChunk.Type == PngChunkTypes.Text) - { - ReadTextChunk(currentChunk.Data); - } - else if (currentChunk.Type == PngChunkTypes.End) - { - isEndChunckReached = true; - } - } - - byte[] pixels = new byte[_header.Width * _header.Height * 4]; - - PngColorTypeInformation colorTypeInformation = _colorTypes[_header.ColorType]; - - if (colorTypeInformation != null) - { - ColorReader colorReader = colorTypeInformation.CreateColorReader(palette, paletteAlpha); - - ReadScanlines(dataStream, pixels, colorReader, colorTypeInformation); - } - Image i = new Image(_header.Width, _header.Height); - int indx = 0; - byte r, g, b, a; - for (uint y = 0; y < i.Height; y++) - { - for (uint x = 0; x < i.Width; x++) - { - r = pixels[indx]; - indx++; - g = pixels[indx]; - indx++; - b = pixels[indx]; - indx++; - a = pixels[indx]; - indx++; - i.SetPixel(x, y, new Pixel(r, g, b, a)); - } - } - pixels = null; - System.GC.Collect(); - return i; - } - } - - private void ReadPhysicalChunk(byte[] data) - { - Array.Reverse(data, 0, 4); - Array.Reverse(data, 4, 4); - - //_image.DensityX = BitConverter.ToInt32(data, 0) / 39.3700787d; - //_image.DensityY = BitConverter.ToInt32(data, 4) / 39.3700787d; - } - - private int CalculateScanlineLength(PngColorTypeInformation colorTypeInformation) - { - int scanlineLength = (_header.Width * _header.BitDepth * colorTypeInformation.ChannelsPerColor); - - int amount = scanlineLength % 8; - if (amount != 0) - { - scanlineLength += 8 - amount; - } - - return scanlineLength / 8; - } - - private int CalculateScanlineStep(PngColorTypeInformation colorTypeInformation) - { - int scanlineStep = 1; - - if (_header.BitDepth >= 8) - { - scanlineStep = (colorTypeInformation.ChannelsPerColor * _header.BitDepth) / 8; - } - - return scanlineStep; - } - - private void ReadScanlines(MemoryStream dataStream, byte[] pixels, ColorReader colorReader, PngColorTypeInformation colorTypeInformation) - { - dataStream.Position = 0; - - int scanlineLength = CalculateScanlineLength(colorTypeInformation); - - int scanlineStep = CalculateScanlineStep(colorTypeInformation); - - byte[] lastScanline = new byte[scanlineLength]; - byte[] currScanline = new byte[scanlineLength]; - - byte a = 0; - byte b = 0; - byte c = 0; - - int row = 0, filter = 0, column = -1; - - using (DeflaterInputStream compressedStream = new DeflaterInputStream(dataStream)) - { - int readByte = 0; - while ((readByte = compressedStream.ReadByte()) >= 0) - { - if (column == -1) - { - filter = readByte; - - column++; - } - else - { - currScanline[column] = (byte)readByte; - - if (column >= scanlineStep) - { - a = currScanline[column - scanlineStep]; - c = lastScanline[column - scanlineStep]; - } - else - { - a = 0; - c = 0; - } - - b = lastScanline[column]; - - if (filter == 1) - { - currScanline[column] = (byte)(currScanline[column] + a); - } - else if (filter == 2) - { - currScanline[column] = (byte)(currScanline[column] + b); - } - else if (filter == 3) - { - currScanline[column] = (byte)(currScanline[column] + (byte)Math.Floor((double)((a + b) / 2))); - } - else if (filter == 4) - { - currScanline[column] = (byte)(currScanline[column] + PaethPredicator(a, b, c)); - } - - column++; - - if (column == scanlineLength) - { - colorReader.ReadScanline(currScanline, pixels, _header); - - column = -1; - row++; - - Swap(ref currScanline, ref lastScanline); - } - } - } - } - } - - /// - /// Swaps two references. - /// - /// The type of the references to swap. - /// The first reference. - /// The second reference. - private static void Swap(ref TRef lhs, ref TRef rhs) where TRef : class - { - TRef tmp = lhs; - lhs = rhs; - rhs = tmp; - } - - private static byte PaethPredicator(byte a, byte b, byte c) - { - byte predicator = 0; - - int p = a + b - c; - int pa = Math.Abs(p - a); - int pb = Math.Abs(p - b); - int pc = Math.Abs(p - c); - - if (pa <= pb && pa <= pc) - { - predicator = a; - } - else if (pb <= pc) - { - predicator = b; - } - else - { - predicator = c; - } - - return predicator; - } - - private void ReadTextChunk(byte[] data) - { - //int zeroIndex = 0; - - //for (int i = 0; i < data.Length; i++) - //{ - // if (data[i] == (byte)0) - // { - // zeroIndex = i; - // break; - // } - //} - - //string name = Encoding.Unicode.GetString(data, 0, zeroIndex); - //string value = Encoding.Unicode.GetString(data, zeroIndex + 1, data.Length - zeroIndex - 1); - - //_image.Properties.Add(new ImageProperty(name, value)); - } - - private void ReadHeaderChunk(byte[] data) - { - _header = new PngHeader(); - - Array.Reverse(data, 0, 4); - Array.Reverse(data, 4, 4); - - _header.Width = BitConverter.ToInt32(data, 0); - _header.Height = BitConverter.ToInt32(data, 4); - - _header.BitDepth = data[8]; - _header.ColorType = data[9]; - _header.FilterMethod = data[11]; - _header.InterlaceMethod = data[12]; - _header.CompressionMethod = data[10]; - } - - private void ValidateHeader() - { - if (!_colorTypes.ContainsKey(_header.ColorType)) - { - throw new Exception("Color type is not supported or not valid."); - } - - bool found = false; - foreach (int i in _colorTypes[_header.ColorType].SupportedBitDepths) - { - if (i == _header.BitDepth) - { - found = true; - continue; - } - } - if (!found) - { - throw new Exception("Bit depth is not supported or not valid."); - } - - if (_header.FilterMethod != 0) - { - throw new Exception("The png specification only defines 0 as filter method."); - } - - if (_header.InterlaceMethod != 0) - { - throw new Exception("Interlacing is not supported."); - } - } - - private PngChunk ReadChunk() - { - PngChunk chunk = new PngChunk(); - - if (ReadChunkLength(chunk) == 0) - { - return null; - } - - byte[] typeBuffer = ReadChunkType(chunk); - - ReadChunkData(chunk); - ReadChunkCrc(chunk, typeBuffer); - - return chunk; - } - - private void ReadChunkCrc(PngChunk chunk, byte[] typeBuffer) - { - // byte[] crcBuffer = new byte[4]; - - _stream.Position += 4; - // if (numBytes >= 1 && numBytes <= 3) - // { - // throw new Exception("Image stream is not valid!"); - // } - - // Array.Reverse(crcBuffer); - - // chunk.Crc = BitConverter.ToUInt32(crcBuffer, 0); - - // Crc32 crc = new Crc32(); - // crc.Update(typeBuffer); - // crc.Update(chunk.Data); - - // if (crc.Value != chunk.Crc) - // { - // throw new Exception("CRC Error. PNG Image chunk is corrupt!"); - // } - } - - private void ReadChunkData(PngChunk chunk) - { - chunk.Data = new byte[chunk.Length]; - - _stream.Read(chunk.Data, 0, chunk.Length); - } - - private byte[] ReadChunkType(PngChunk chunk) - { - byte[] typeBuffer = new byte[4]; - - int numBytes = _stream.Read(typeBuffer, 0, 4); - if (numBytes >= 1 && numBytes <= 3) - { - throw new Exception("Image stream is not valid!"); - } - - char[] chars = new char[4]; - chars[0] = (char)typeBuffer[0]; - chars[1] = (char)typeBuffer[1]; - chars[2] = (char)typeBuffer[2]; - chars[3] = (char)typeBuffer[3]; - - chunk.Type = new string(chars); - - return typeBuffer; - } - - private int ReadChunkLength(PngChunk chunk) - { - byte[] lengthBuffer = new byte[4]; - - int numBytes = _stream.Read(lengthBuffer, 0, 4); - if (numBytes >= 1 && numBytes <= 3) - { - throw new Exception("Image stream is not valid!"); - } - - Array.Reverse(lengthBuffer); - - chunk.Length = BitConverter.ToInt32(lengthBuffer, 0); - - return numBytes; - } - - #endregion - } - #endregion - - #region ColorReaders - - #region ColorReader - /// - /// Interface for color readers, which are responsible for reading - /// different color formats from a png file. - /// - private abstract class ColorReader - { - protected byte[] ToArrayByBitsLength(byte[] bytes, int bits) - { - byte[] result = null; - if (bits < 8) - { - result = new byte[bytes.Length * 8 / bits]; - int factor = (int)Math.Pow(2, bits) - 1; - int mask = (0xFF >> (8 - bits)); - int resultOffset = 0; - for (int i = 0; i < bytes.Length; i++) - { - for (int shift = 0; shift < 8; shift += bits) - { - int colorIndex = (((bytes[i]) >> (8 - bits - shift)) & mask) * (255 / factor); - result[resultOffset] = (byte)colorIndex; - resultOffset++; - } - } - } - else { result = bytes; } - return result; - } - - public abstract void ReadScanline(byte[] scanline, byte[] pixels, PngHeader header); - } - #endregion - - #region GrayscaleReader - /// - /// Color reader for reading grayscale colors from a PNG file. - /// - private sealed class GrayscaleReader : ColorReader - { - private int _row; - private bool _useAlpha; - public GrayscaleReader(bool useAlpha) - { - _useAlpha = useAlpha; - } - public override void ReadScanline(byte[] scanline, byte[] pixels, PngHeader header) - { - int offset = 0; - byte[] newScanline = ToArrayByBitsLength(scanline, header.BitDepth); - if (_useAlpha) - { - for (int x = 0; x < header.Width / 2; x++) - { - offset = (_row * header.Width + x) * 4; - pixels[offset + 0] = newScanline[x * 2]; - pixels[offset + 1] = newScanline[x * 2]; - pixels[offset + 2] = newScanline[x * 2]; - pixels[offset + 3] = newScanline[x * 2 + 1]; - } - } - else - { - for (int x = 0; x < header.Width; x++) - { - offset = (_row * header.Width + x) * 4; - pixels[offset + 0] = newScanline[x]; - pixels[offset + 1] = newScanline[x]; - pixels[offset + 2] = newScanline[x]; - pixels[offset + 3] = (byte)255; - } - } - _row++; - } - } - #endregion - - #region PaletteIndexReader - /// - /// A color reader for reading palette indices from the PNG file. - /// - private sealed class PaletteIndexReader : ColorReader - { - private int _row; - private byte[] _palette; - private byte[] _paletteAlpha; - public PaletteIndexReader(byte[] palette, byte[] paletteAlpha) - { - _palette = palette; - _paletteAlpha = paletteAlpha; - } - public override void ReadScanline(byte[] scanline, byte[] pixels, PngHeader header) - { - byte[] newScanline = ToArrayByBitsLength(scanline, header.BitDepth); - - int offset = 0, index = 0; - - if (_paletteAlpha != null && _paletteAlpha.Length > 0) - { - for (int i = 0; i < header.Width; i++) - { - index = newScanline[i]; - offset = (_row * header.Width + i) * 4; - pixels[offset + 0] = _palette[index * 3]; - pixels[offset + 1] = _palette[index * 3 + 1]; - pixels[offset + 2] = _palette[index * 3 + 2]; - pixels[offset + 3] = _paletteAlpha.Length > index ? _paletteAlpha[index] : (byte)255; - } - } - else - { - for (int i = 0; i < header.Width; i++) - { - index = newScanline[i]; - offset = (_row * header.Width + i) * 4; - pixels[offset + 0] = _palette[index * 3]; - pixels[offset + 1] = _palette[index * 3 + 1]; - pixels[offset + 2] = _palette[index * 3 + 2]; - pixels[offset + 3] = (byte)255; - } - } - _row++; - } - } - #endregion - - #region TrueColorReader - /// - /// Color reader for reading truecolors from a PNG file. Only colors - /// with 24 or 32 bit (3 or 4 bytes) per pixel are supported at the moment. - /// - sealed class TrueColorReader : ColorReader - { - private int _row; - private bool _useAlpha; - public TrueColorReader(bool useAlpha) - { - _useAlpha = useAlpha; - } - public override void ReadScanline(byte[] scanline, byte[] pixels, PngHeader header) - { - int offset = 0; - byte[] newScanline = ToArrayByBitsLength(scanline, header.BitDepth); - if (_useAlpha) - { - Array.Copy(newScanline, 0, pixels, _row * header.Width * 4, newScanline.Length); - } - else - { - for (int x = 0; x < newScanline.Length / 3; x++) - { - offset = (_row * header.Width + x) * 4; - pixels[offset + 0] = newScanline[x * 3]; - pixels[offset + 1] = newScanline[x * 3 + 1]; - pixels[offset + 2] = newScanline[x * 3 + 2]; - pixels[offset + 3] = (byte)255; - } - } - _row++; - } - } - #endregion - - #endregion - - #region PngChunkTypes - /// - /// Contains a list of possible chunk type identifier. - /// - private static class PngChunkTypes - { - /// - /// The first chunk in a png file. Can only exists once. Contains - /// common information like the width and the height of the image or - /// the used compression method. - /// - public const string Header = "IHDR"; - /// - /// The PLTE chunk contains from 1 to 256 palette entries, each a three byte - /// series in the RGB format. - /// - public const string Palette = "PLTE"; - /// - /// The IDAT chunk contains the actual image data. The image can contains more - /// than one chunk of this type. All chunks together are the whole image. - /// - public const string Data = "IDAT"; - /// - /// This chunk must appear last. It marks the end of the PNG datastream. - /// The chunk's data field is empty. - /// - public const string End = "IEND"; - /// - /// This chunk specifies that the image uses simple transparency: - /// either alpha values associated with palette entries (for indexed-color images) - /// or a single transparent color (for grayscale and truecolor images). - /// - public const string PaletteAlpha = "tRNS"; - /// - /// Textual information that the encoder wishes to record with the image can be stored in - /// tEXt chunks. Each tEXt chunk contains a keyword and a text string. - /// - public const string Text = "tEXt"; - /// - /// This chunk specifies the relationship between the image samples and the desired - /// display output intensity. - /// - public const string Gamma = "gAMA"; - /// - /// The pHYs chunk specifies the intended pixel size or aspect ratio for display of the image. - /// - public const string Physical = "pHYs"; - } - #endregion - - #region PngChunk - /// - /// Stores header information about a chunk. - /// - private sealed class PngChunk - { - /// - /// An unsigned integer giving the number of bytes in the chunk's - /// data field. The length counts only the data field, not itself, - /// the chunk type code, or the CRC. Zero is a valid length - /// - public int Length; - /// - /// A chunk type as string with 4 chars. - /// - public string Type; - /// - /// The data bytes appropriate to the chunk type, if any. - /// This field can be of zero length. - /// - public byte[] Data; - ///// - ///// A CRC (Cyclic Redundancy Check) calculated on the preceding bytes in the chunk, - ///// including the chunk type code and chunk data fields, but not including the length field. - ///// The CRC is always present, even for chunks containing no data - ///// - //public uint Crc; - } - #endregion - - #region PngColorTypeInformation - /// - /// Contains information that are required when loading a png with a specific color type. - /// - private sealed class PngColorTypeInformation - { - /// - /// Gets an array with the bit depths that are supported for the color type - /// where this object is created for. - /// - /// The supported bit depths that can be used in combination with this color type. - public int[] SupportedBitDepths { get; private set; } - - /// - /// Gets a function that is used the create the color reader for the color type where - /// this object is created for. - /// - /// The factory function to create the color type. - public Func ScanlineReaderFactory { get; private set; } - - /// - /// Gets a factor that is used when iterating through the scanlines. - /// - /// The scanline factor. - public int ChannelsPerColor { get; private set; } - - /// - /// Initializes a new instance of the class with - /// the scanline factory, the function to create the color reader and the supported bit depths. - /// - /// The scanline factor. - /// The supported bit depths. - /// The factory to create the color reader. - public PngColorTypeInformation(int scanlineFactor, int[] supportedBitDepths, Func scanlineReaderFactory) - { - ChannelsPerColor = scanlineFactor; - ScanlineReaderFactory = scanlineReaderFactory; - - SupportedBitDepths = supportedBitDepths; - } - - /// - /// Creates the color reader for the color type where this object is create for. - /// - /// The palette of the image. Can be null when no palette is used. - /// The alpha palette of the image. Can be null when - /// no palette is used for the image or when the image has no alpha. - /// The color reader for the image. - public ColorReader CreateColorReader(byte[] palette, byte[] paletteAlpha) - { - return ScanlineReaderFactory(palette, paletteAlpha); - } - } - #endregion - - #region PngHeader - /// - /// Represents the png header chunk. - /// - private sealed class PngHeader - { - /// - /// The dimension in x-direction of the image in pixels. - /// - public int Width; - /// - /// The dimension in y-direction of the image in pixels. - /// - public int Height; - /// - /// Bit depth is a single-byte integer giving the number of bits per sample - /// or per palette index (not per pixel). Valid values are 1, 2, 4, 8, and 16, - /// although not all values are allowed for all color types. - /// - public byte BitDepth; - /// - /// Color type is a integer that describes the interpretation of the - /// image data. Color type codes represent sums of the following values: - /// 1 (palette used), 2 (color used), and 4 (alpha channel used). - /// - public byte ColorType; - /// - /// Indicates the method used to compress the image data. At present, - /// only compression method 0 (deflate/inflate compression with a sliding - /// window of at most 32768 bytes) is defined. - /// - public byte CompressionMethod; - /// - /// Indicates the preprocessing method applied to the image - /// data before compression. At present, only filter method 0 - /// (adaptive filtering with five basic filter types) is defined. - /// - public byte FilterMethod; - /// - /// Indicates the transmission order of the image data. - /// Two values are currently defined: 0 (no interlace) or 1 (Adam7 interlace). - /// - public byte InterlaceMethod; - } - #endregion - - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/PnmFamilySupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/PnmFamilySupport.cs deleted file mode 100644 index ccbd0ac434..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/PnmFamilySupport.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using ShaniSoft.Drawing; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class PnmFamilyImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - Pnm.WritePnm(dest, (System.Drawing.Bitmap)i, PnmEncoding.BinaryEncoding, Pnm.DetectType((System.Drawing.Bitmap)i)); - } - - public override Image Load(Stream s) - { - return (Image)Pnm.ReadPnm(s); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/TgaSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/TgaSupport.cs deleted file mode 100644 index ef19c2d30c..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/TgaSupport.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class TgaImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - dest.WriteByte(0); // Write No Image ID - dest.WriteByte(0); // Write No Color-Map - dest.WriteByte(2); // Write Image Type (Uncompressed- True Color) - byte[] dat = new byte[5]; - dest.Write(dat, 0, 5); // Write Color-Map Spec - - dest.WriteByte(0); - dest.WriteByte(0); // Write X-Origin - dest.WriteByte(0); - dest.WriteByte(0); // Write Y-Origin - dat = BitConverter.GetBytes((UInt16)i.Width); - dest.Write(dat, 0, 2); // Write the Width - dat = BitConverter.GetBytes((UInt16)i.Height); - dest.Write(dat, 0, 2); // Write the Height - dest.WriteByte(32); // Write the Color-Depth - - byte ImageDescriptor = 0; - ImageDescriptor |= 8; // Set 8-Bit Alpha data. - ImageDescriptor |= (byte)(1 << 5); // Set Top-Left Image origin - dest.WriteByte(ImageDescriptor); // Write Image Descriptor Byte - - UInt32 len = (uint)(i.Width * i.Height); - Pixel p; - for (int loc = 0; loc < len; loc++) // Write the Image Data. - { - p = i.Data[loc]; - dest.WriteByte(p.B); - dest.WriteByte(p.G); - dest.WriteByte(p.R); - dest.WriteByte(p.A); - } - } - - public override Image Load(Stream s) - { - Paloma.TargaImage t = new Paloma.TargaImage(s); - Image i = (Image)t.Image; - t.Dispose(); - return i; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/TiffSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/TiffSupport.cs deleted file mode 100644 index 3a83fa3896..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/TiffSupport.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using BitMiracle.LibTiff; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class TiffImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { -#warning TODO: Fix - throw new Exception("This Currently Doesn't Work!"); - //Tiff tif = Tiff.OpenForWrite(dest); - //tif.SetField(TiffTag.ImageWidth, i.Width); - //tif.SetField(TiffTag.ImageLength, i.Height); - //tif.SetField(TiffTag.Compression, BitMiracle.LibTiff.Compression.LZW); - //tif.SetField(TiffTag.Photometric, Photometric.RGB); - //tif.SetField(TiffTag.RowsPerStrip, i.Height); - //tif.SetField(TiffTag.BitsPerSample, 8); - //tif.SetField(TiffTag.SamplesPerPixel, 4); - //tif.SetField(TiffTag.PlanarConfig, PlanarConfig.Contig); - //byte[] raster = new byte[i.Height * i.Width * 4]; - //uint loc = 0; - //Pixel p; - //for (uint y = 0; y < i.Height; y++) - //{ - // for (uint x = 0; x < i.Width; x++) - // { - // p = i.GetPixel(x, y); - // raster[loc] = p.R; - // loc++; - // raster[loc] = p.G; - // loc++; - // raster[loc] = p.B; - // loc++; - // raster[loc] = p.A; - // loc++; - // } - //} - //int stride = raster.Length / i.Height; - //for (int i2 = 0, offset = 0; i2 < i.Height; i2++) - //{ - // tif.WriteScanline(raster, offset, i2, 0); - // offset += stride; - //} - } - - public override Image Load(Stream s) - { - Tiff tif = Tiff.Open(s); - FieldValue[] value = tif.GetField(TiffTag.ImageWidth); - int width = value[0].ToInt(); - value = tif.GetField(TiffTag.ImageLength); - int height = value[0].ToInt(); - int[] raster = new int[height * width]; - tif.ReadRGBAImage(width, height, raster); - Image i = new Image(width, height); - int rgba, rasterOffset; - byte r, g, b, a; - for (uint y = 0; y < i.Height; y++) - { - rasterOffset = (int)(y * i.Width); - for (uint x = 0; x < i.Width; x++) - { - rgba = raster[rasterOffset++]; - r = (byte)(rgba & 0xff); - g = (byte)((rgba >> 8) & 0xff); - b = (byte)((rgba >> 16) & 0xff); - a = (byte)((rgba >> 24) & 0xff); - i.SetPixel(x, y, new Pixel(r, g, b, a)); - } - } - // Need to flip the image. - Image i2 = new Image(width, height); - uint y2 = 0; - for (uint y = (uint)(i.Height - 1); y >= 0 && y < i.Height; y--) - { - for (uint x = 0; x < i.Width; x++) - { - i2.SetPixel(x, y2, i.GetPixel(x, y)); - } - y2++; - } - i.Dispose(); - return i2; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/VbpSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/VbpSupport.cs deleted file mode 100644 index 6c68454609..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/VbpSupport.cs +++ /dev/null @@ -1,270 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace Orvid.Graphics.ImageFormats -{ - public class VbpImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - VbpFile.WriteBitmap(i, dest); - } - - public override Image Load(Stream s) - { - return VbpFile.ReadBitmap(s); - } - - - // Please note, everything below this - // point was originally from a plugin - // for Paint.Net, the plugin is available here: - // http://forums.getpaint.net/index.php?/topic/14711-vantage-preview-images-vbp/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - - #region VbpFile - private static class VbpFile - { - private static Dictionary _colorTable5Bit = new Dictionary(); - private static Dictionary _colorTable8Bit = new Dictionary(); - - static VbpFile() - { - for (uint i = 0; i <= 0xff; i++) - { - _colorTable8Bit[i] = (uint)(((double)i) / 8.2); - if (i > 0) - { - if (_colorTable8Bit[i - 1] != _colorTable8Bit[i]) - { - _colorTable5Bit[_colorTable8Bit[i]] = i; - } - } - else - { - _colorTable5Bit[0] = 0; - } - } - } - - private static int GetShift(uint mask) - { - int num = 0; - uint num2 = mask; - if ((num2 & 1) == 0) - { - do - { - num++; - num2 = num2 >> 1; - } - while ((num2 & 1) == 0); - } - return num; - } - - public static Image ReadBitmap(Stream input) - { - Image i = new Image(160, 120); - VbpFileHeader fileHeader = ReadFileHeader(input); - VbpInformationHeader infoHeader = ReadInfoHeader(input); - if (infoHeader.Compression == IH_Compression.BI_BITFIELDS) - { - i = ReadBitmapData(input, fileHeader, infoHeader); - } - return i; - } - - static Image ReadBitmapData(Stream input, VbpFileHeader fileHeader, VbpInformationHeader infoHeader) - { - input.Position = fileHeader.OffBits; - int count = (infoHeader.Width * infoHeader.Height) * 2; - byte[] buffer = new byte[count]; - input.Read(buffer, 0, count); - Image bitmap = new Image(infoHeader.Width, infoHeader.Height); - int shift = GetShift(infoHeader.ColorMask.R); - int num3 = GetShift(infoHeader.ColorMask.G); - int num4 = GetShift(infoHeader.ColorMask.B); - int num5 = 0; - for (int i = 0; i < infoHeader.Height; i++) - { - for (int j = 0; j < infoHeader.Width; j++) - { - ushort num8 = BitConverter.ToUInt16(buffer, num5++ * 2); - ushort red = (ushort)_colorTable5Bit[(num8 & infoHeader.ColorMask.R) >> shift]; - ushort green = (ushort)_colorTable5Bit[(num8 & infoHeader.ColorMask.G) >> num3]; - ushort blue = (ushort)_colorTable5Bit[(num8 & infoHeader.ColorMask.B) >> num4]; - Pixel color = new Pixel((byte)red, (byte)green, (byte)blue, 255); - bitmap.SetPixel((uint)j, (uint)i, color); - } - } - return bitmap; - } - - static VbpFileHeader ReadFileHeader(Stream input) - { - input.Position = 0L; - byte[] buffer = new byte[14]; - input.Read(buffer, 0, 14); - VbpFileHeader header = new VbpFileHeader - { - Type = new char[] { (char)buffer[0], (char)buffer[1] } - }; - if ((header.Type[0] != 'B') || (header.Type[1] != 'M')) - { - throw new Exception("Wrong Filetype!"); - } - header.Size = BitConverter.ToUInt32(buffer, 2); - header.Reserved = BitConverter.ToUInt32(buffer, 6); - header.OffBits = BitConverter.ToUInt32(buffer, 10); - return header; - } - - static VbpInformationHeader ReadInfoHeader(Stream input) - { - input.Position = 14L; - byte[] buffer = new byte[40]; - input.Read(buffer, 0, 40); - VbpInformationHeader header = new VbpInformationHeader - { - Size = BitConverter.ToUInt32(buffer, 0), - Width = BitConverter.ToInt32(buffer, 4), - Height = BitConverter.ToInt32(buffer, 8), - Planes = BitConverter.ToUInt16(buffer, 12), - BitCount = BitConverter.ToUInt16(buffer, 14) - }; - uint num = BitConverter.ToUInt32(buffer, 0x10); - header.Compression = (IH_Compression)num; - header.SizeImage = BitConverter.ToUInt32(buffer, 20); - header.XPelsPerMeter = BitConverter.ToInt32(buffer, 0x18); - header.YPelsPerMeter = BitConverter.ToInt32(buffer, 0x1c); - header.ClrUsed = BitConverter.ToUInt32(buffer, 0x20); - header.ClrImportant = BitConverter.ToUInt32(buffer, 0x24); - if (header.Compression != IH_Compression.BI_BITFIELDS) - { - throw new Exception("Wrong Filetype!"); - } - input.Position = 0x36L; - buffer = new byte[0x10]; - input.Read(buffer, 0, 0x10); - header.ColorMask.R = BitConverter.ToUInt32(buffer, 0); - header.ColorMask.G = BitConverter.ToUInt32(buffer, 4); - header.ColorMask.B = BitConverter.ToUInt32(buffer, 8); - header.ColorMask.Mask = BitConverter.ToUInt32(buffer, 12); - return header; - } - - public static void WriteBitmap(Image input, Stream output) - { - WriteFileHeader(output, input); - WriteInfoHeader(output, input); - WriteBitmapData(output, input); - } - - static void WriteBitmapData(Stream output, Image input) - { - int num = 10; - int num2 = 5; - int num3 = 0; - for (int i = 0; i < input.Height; i++) - { - for (int j = 0; j < input.Width; j++) - { - Pixel pixel = input.GetPixel((uint)j, (uint)i); - ushort num6 = (ushort)(_colorTable8Bit[pixel.B] << (num3 & 0x1f)); - ushort num7 = (ushort)(_colorTable8Bit[pixel.G] << (num2 & 0x1f)); - ushort num8 = (ushort)(_colorTable8Bit[pixel.R] << (num & 0x1f)); - ushort num9 = (ushort)(((0x8000 | num8) | num7) | num6); - output.Write(BitConverter.GetBytes(num9), 0, 2); - } - } - } - - private static void WriteBytes(char[] values, int count, Stream output) - { - for (int i = 0; i < count; i++) - { - output.WriteByte((byte)values[i]); - } - } - - static void WriteFileHeader(Stream output, Image image) - { - WriteBytes(new char[] { 'B', 'M' }, 2, output); - uint num = (uint)(((image.Width * image.Height) * 2) + 70); - output.Write(BitConverter.GetBytes(num), 0, 4); - output.Write(BitConverter.GetBytes((uint)0), 0, 4); - output.Write(BitConverter.GetBytes((uint)70), 0, 4); - } - - private static void WriteInfoHeader(Stream output, Image input) - { - output.Write(BitConverter.GetBytes((uint)0x38), 0, 4); - output.Write(BitConverter.GetBytes(input.Width), 0, 4); - output.Write(BitConverter.GetBytes(input.Height), 0, 4); - output.Write(BitConverter.GetBytes((ushort)1), 0, 2); - output.Write(BitConverter.GetBytes((ushort)0x10), 0, 2); - output.Write(BitConverter.GetBytes((uint)3), 0, 4); - output.Write(BitConverter.GetBytes((uint)0x62), 0, 4); - output.Write(BitConverter.GetBytes(0x2e20), 0, 4); - output.Write(BitConverter.GetBytes(0x2e20), 0, 4); - output.Write(BitConverter.GetBytes((uint)0), 0, 4); - output.Write(BitConverter.GetBytes((uint)0), 0, 4); - output.Write(BitConverter.GetBytes((uint)0x7c00), 0, 4); - output.Write(BitConverter.GetBytes((uint)0x3e0), 0, 4); - output.Write(BitConverter.GetBytes((uint)0x1f), 0, 4); - output.Write(BitConverter.GetBytes((uint)0x8000), 0, 4); - } - - public struct IH_ColorMask - { - public uint R; - public uint G; - public uint B; - public uint Mask; - } - - public enum IH_Compression - { - BI_RGB, - BI_RLE8, - BI_RLE4, - BI_BITFIELDS - } - - public struct VbpFileHeader - { - public char[] Type; - public uint Size; - public uint Reserved; - public uint OffBits; - } - - public struct VbpInformationHeader - { - public uint Size; - public int Width; - public int Height; - public ushort Planes; - public ushort BitCount; - public VbpFile.IH_Compression Compression; - public uint SizeImage; - public int XPelsPerMeter; - public int YPelsPerMeter; - public uint ClrUsed; - public uint ClrImportant; - public VbpFile.IH_ColorMask ColorMask; - } - } - #endregion - - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageFormats/XpmSupport.cs b/Users/Orvid/Orvid.Graphics/ImageFormats/XpmSupport.cs deleted file mode 100644 index 5818f8f439..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageFormats/XpmSupport.cs +++ /dev/null @@ -1,292 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace Orvid.Graphics.ImageFormats -{ - public class XpmImage : ImageFormat - { - public override void Save(Image i, Stream dest) - { - XpmInternals.Save(i, dest); - } - - public override Image Load(Stream s) - { - return XpmInternals.Load(s); - } - - - // Please note, everything below this - // point was originally from a plugin - // for Paint.Net, the plugin is available here: - // http://forums.getpaint.net/index.php?/topic/14512-xpm-file-type-plugin/ - // - // - // The source has been modified for use in this library. - // - // This disclaimer was last - // modified on August 9, 2011. - - - #region Internals - private static class XpmInternals - { - - #region Support Methods - private static int ColorHash(Pixel colour) - { - int num = 0; - if (colour.A > 0) - { - num = (((((0xff - colour.R) * 0x100) * 0x100) + ((0xff - colour.G) * 0x100)) + (0xff - colour.B)) + 1; - } - return num; - } - - private static void IncrementChars(byte[] ascii) - { - ascii[0] = (byte)(ascii[0] + 1); - for (int i = 0; i < ascii.Length; i++) - { - if (ascii[i] > 0x7e) - { - ascii[i + 1] = (byte)(ascii[i + 1] + 1); - ascii[i] = 0x20; - } - } - for (int j = 0; j < ascii.Length; j++) - { - if ((ascii[j] == 0x22) || (ascii[j] == 0x5c)) - { - ascii[j] = (byte)(ascii[j] + 1); - } - } - } - - private static bool ReadLine(Stream input, out string line) - { - byte[] bytes = new byte[512]; - for (int i = 0; i < 512; i++) - { - int num2 = input.ReadByte(); - switch (num2) - { - case -1: - line = ""; - return true; - - case 10: - case 13: - line = Encoding.ASCII.GetString(bytes); - return false; - } - bytes[i] = (byte)num2; - } - line = Encoding.ASCII.GetString(bytes); - return false; - } - - private static void WriteASCII(string text, Stream output) - { - byte[] bytes = Encoding.ASCII.GetBytes(text); - output.Write(bytes, 0, bytes.Length); - output.Flush(); - } - #endregion - - #region Load - public static Image Load(Stream input) - { - string str; - if (ReadLine(input, out str) || (str.Trim().Substring(0, 6).CompareTo("/* XPM") != 0)) - { - throw new Exception("No valid XPM header found"); - } - do - { - if (ReadLine(input, out str)) - { - throw new Exception("Cannot find the values section of the file"); - } - } - while (str.Trim().Substring(0, 1).CompareTo("\"") != 0); - char[] separator = new char[] { ' ', '\t', '"' }; - string[] strArray = str.Split(separator); - if (strArray.Length < 6) - { - throw new Exception("Invalid values section of the file"); - } - int width = Convert.ToInt32(strArray[1]); - int height = Convert.ToInt32(strArray[2]); - int num3 = Convert.ToInt32(strArray[3]); - int length = Convert.ToInt32(strArray[4]); - Image image = new Image(width, height); - do - { - if (ReadLine(input, out str)) - { - throw new Exception("Cannot find the color section of the file"); - } - } - while (str.Trim().Substring(0, 1).CompareTo("\"") != 0); - Dictionary dictionary = new Dictionary(); - for (int i = 0; i < num3; i++) - { - string str2 = str.Trim(); - string key = str2.Substring(1, length); - strArray = str2.Substring(length + 1).Split(separator); - if (strArray.Length < 4) - { - throw new Exception("Invalid color entry"); - } - if (strArray[1].CompareTo("c") != 0) - { - throw new Exception("Non color type found, unhandled"); - } - if (strArray[2].CompareTo("None") == 0) - { - Pixel color = new Pixel(true); - dictionary.Add(key, color); - } - else - { - if (strArray[2].Substring(0, 1).CompareTo("#") != 0) - { - throw new Exception("Non RGB color type found, unhandled"); - } - byte red = (byte)Convert.ToInt32(strArray[2].Substring(1, 2), 0x10); - byte green = (byte)Convert.ToInt32(strArray[2].Substring(3, 2), 0x10); - byte blue = (byte)Convert.ToInt32(strArray[2].Substring(5, 2), 0x10); - Pixel color2 = new Pixel(red, green, blue, 255); - dictionary.Add(key, color2); - } - if (ReadLine(input, out str)) - { - throw new Exception("Corrupt color section in the file"); - } - } - do - { - if (ReadLine(input, out str)) - { - throw new Exception("Cannot find the pixel section of the file"); - } - } - while (str.Trim().Substring(0, 1).CompareTo("\"") != 0); - for (int j = 0; j < height; j++) - { - string str4 = str.Trim(); - if (str4.Substring(1).IndexOf('"') != (width * length)) - { - throw new Exception("Corrupt pixel entry in the file"); - } - int startIndex = 1; - int x = 0; - while (x < width) - { - Pixel color3; - string str5 = str4.Substring(startIndex, length); - if (!dictionary.TryGetValue(str5, out color3)) - { - throw new Exception("Unknown pixel value - weird"); - } - image.SetPixel((uint)x, (uint)j, color3); - x++; - startIndex += length; - } - if (ReadLine(input, out str)) - { - throw new Exception("Corrupt pixel section in the file"); - } - } - return image; - } - #endregion - - #region Save - public static void Save(Image img, Stream dest) - { - WriteASCII("/* XPM */\nstatic char * pixmap[] = {\n", dest); - int height = img.Height; - int width = img.Width; - SortedList list = new SortedList(); - int num3 = 0; - for (int i = 0; i < width; i++) - { - for (int m = 0; m < width; m++) - { - Pixel pixel = img.GetPixel((uint)i, (uint)m); - int key = ColorHash(pixel); - if (!list.ContainsKey(key)) - { - list.Add(key, pixel); - num3++; - } - } - } - int num7 = 0; - int num8 = 0; - while (num8 < list.Count) - { - num8 += 93; - num7++; - } - WriteASCII("/* width height num_colors chars_per_pixel */\n", dest); - WriteASCII("\"" + width.ToString() + " " + height.ToString() + " " + num3.ToString() + " " + num7.ToString() + "\",\n", dest); - Dictionary dictionary = new Dictionary(); - byte[] ascii = new byte[num7]; - for (int j = 0; j < num7; j++) - { - ascii[j] = 0x20; - } - ascii[0] = 0x1f; - WriteASCII("/* colors */\n", dest); - foreach (KeyValuePair pair in list) - { - IncrementChars(ascii); - string str2 = Encoding.ASCII.GetString(ascii); - Pixel color2 = pair.Value; - if (color2.A > 0) - { - WriteASCII("\"" + str2 + " c #" + color2.R.ToString("x").PadLeft(2, '0') + color2.G.ToString("x").PadLeft(2, '0') + color2.B.ToString("x").PadLeft(2, '0') + "\",\n", dest); - } - else - { - WriteASCII("\"" + str2 + " c None\",\n", dest); - } - dictionary.Add(pair.Key, str2); - } - WriteASCII("/* pixels */\n", dest); - for (int k = 0; k < height; k++) - { - string str5 = "\""; - for (int n = 0; n < width; n++) - { - string str6; - int num13 = ColorHash(img.GetPixel((uint)n, (uint)k)); - if (!dictionary.TryGetValue(num13, out str6)) - { - throw new Exception("Colour missing from the stringList, weird"); - } - str5 = str5 + str6; - } - if (k == (height - 1)) - { - str5 = str5 + "\"\n"; - } - else - { - str5 = str5 + "\",\n"; - } - WriteASCII(str5, dest); - } - WriteASCII("};\n", dest); - } - #endregion - - } - #endregion - } -} diff --git a/Users/Orvid/Orvid.Graphics/ImageManipulator.cs b/Users/Orvid/Orvid.Graphics/ImageManipulator.cs deleted file mode 100644 index b971532a6f..0000000000 --- a/Users/Orvid/Orvid.Graphics/ImageManipulator.cs +++ /dev/null @@ -1,520 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics -{ - public static class ImageManipulator - { - - #region AntiAlias - /// - /// Run a basic Anti-Aliasing Algorithm on the specified image. - /// - /// The image to Anti-Alias. - /// The Anti-Aliased Image. - public static Image AntiAlias(Image i) - { - Image o = new Image(i.Width, i.Height); - - for (uint y = 0; y < i.Height; y++) - { - for (uint x = 0; x < i.Width; x++) - { - uint R = 0, G = 0, B = 0; - byte divBy = 0; - Pixel p = i.GetPixel(x, y); - R += p.R; - G += p.G; - B += p.B; - divBy++; - - p = i.GetPixel(x - 1, y - 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x, y - 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x + 1, y - 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x - 1, y); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x + 1, y); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x - 1, y + 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x, y + 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - p = i.GetPixel(x + 1, y + 1); - if (!p.Empty) - { - R += p.R; - G += p.G; - B += p.B; - divBy++; - } - - o.SetPixel(x, y, new Pixel(((byte)(R / divBy)), ((byte)(G / divBy)), ((byte)(B / divBy)), 255)); - } - } - i.Dispose(); - return o; - } - #endregion - - #region Resize - - #region Enum - public enum ScalingAlgorithm - { - NearestNeighbor, // 0.201676 Seconds - Bilinear, // 1.079586 Seconds - Bicubic, // 3.162943 Seconds - //Bell, - //Box, - //Catmull_Rom, - //Cosine, - //Cubic_Convolution, - //Cubic_Spline, - //Hermite, - //Lanczos3, - //Lanczos8, - //Mitchell, - //Quadratic, - //Quadratic_BSpline, - //Triangle, - Hq2x, - Hq3x, - Hq4x, - //Lq2x, - //Lq3x, - //Lq4x, - //Scale2x, - //Scale3x, - } - #endregion - - /// - /// Resizes an image using the given algorithm. - /// - /// Input image. - /// Output size. (If Applicable) - /// Scaling method. - /// The resized image. - public static Image Resize(Image i, Vec2 outSize, ScalingAlgorithm method = ScalingAlgorithm.NearestNeighbor) - { - Image o; - - switch (method) - { - case ScalingAlgorithm.NearestNeighbor: - o = ResizeNearestNeighbor(i, outSize); - break; - - case ScalingAlgorithm.Bilinear: - o = ResizeBilinear(i, outSize); - break; - - case ScalingAlgorithm.Bicubic: - o = ResizeBicubic(i, outSize); - break; - - case ScalingAlgorithm.Hq2x: - o = ResizeHq2x(i); - break; - - case ScalingAlgorithm.Hq3x: - o = ResizeHq3x(i); - break; - - case ScalingAlgorithm.Hq4x: - o = ResizeHq4x(i); - break; - - default: - o = ResizeNearestNeighbor(i, outSize); - break; - } - - return o; - } - - #region The Actual Scaling Algorithms - - - #region Nearest Neighbor - private static Image ResizeNearestNeighbor(Image i, Vec2 outSize) - { - Image o = new Image(outSize.X, outSize.Y); - - double x_ratio = i.Width / o.Width; - double y_ratio = i.Height / o.Height; - uint px, py; - for (uint y = 0; y < o.Height; y++) - { - for (uint x = 0; x < o.Width; x++) - { - px = (uint)Math.Floor(x * x_ratio); - py = (uint)Math.Floor(y * y_ratio); - o.SetPixel(x, y, i.GetPixel(px, py)); - } - } - - return o; - } - #endregion - - #region Bi-Linear - private static Image ResizeBilinear(Image i, Vec2 outSize) - { - Image o = new Image(outSize.X, outSize.Y); - - Pixel a, b, c, d; - uint x, y; - double x_ratio = ((double)(i.Width - 1)) / o.Width; - double y_ratio = ((double)(i.Height - 1)) / o.Height; - double x_diff, y_diff, red, green, blue, alpha; - bool usea, useb, usec, used; - for (uint ypos = 0; ypos < o.Height; ypos++) - { - for (uint xpos = 0; xpos < o.Width; xpos++) - { - x = (uint)(x_ratio * xpos); - y = (uint)(y_ratio * ypos); - x_diff = (x_ratio * xpos) - x; - y_diff = (y_ratio * ypos) - y; - - // Get the pixels, and set if they should be used. - a = i.GetPixel(x, y); - usea = (a.Empty ? false : true); - b = i.GetPixel(x + 1, y); - useb = (b.Empty ? false : true); - c = i.GetPixel(x, y + 1); - usec = (c.Empty ? false : true); - d = i.GetPixel(x + 1, y + 1); - used = (d.Empty ? false : true); - - red = green = blue = alpha = 0; - - // Alpha - if (usea) - red += (a.R) * (1 - x_diff) * (1 - y_diff); - if (useb) - red += (b.R) * (x_diff) * (1 - y_diff); - if (usec) - red += (c.R) * (y_diff) * (1 - x_diff); - if (used) - red += (d.R) * (x_diff * y_diff); - - // Green - if (usea) - green += (a.G) * (1 - x_diff) * (1 - y_diff); - if (useb) - green += (b.G) * (x_diff) * (1 - y_diff); - if (usec) - green += (c.G) * (y_diff) * (1 - x_diff); - if (used) - green += (d.G) * (x_diff * y_diff); - - // Blue - if (usea) - blue += (a.B) * (1 - x_diff) * (1 - y_diff); - if (useb) - blue += (b.B) * (x_diff) * (1 - y_diff); - if (usec) - blue += (c.B) * (y_diff) * (1 - x_diff); - if (used) - blue += (d.B) * (x_diff * y_diff); - - // Alpha - if (usea) - alpha += (a.A) * (1 - x_diff) * (1 - y_diff); - if (useb) - alpha += (b.A) * (x_diff) * (1 - y_diff); - if (usec) - alpha += (c.A) * (y_diff) * (1 - x_diff); - if (used) - alpha += (d.A) * (x_diff * y_diff); - - - o.SetPixel(xpos, ypos, new Pixel((byte)red, (byte)green, (byte)blue, (byte)alpha)); - } - } - - return o; - } - #endregion - - #region Bi-Cubic - private static Image ResizeBicubic(Image i, Vec2 outSize) - { - Image o = new Image(outSize.X, outSize.Y); - - int height = i.Height, - width = i.Width, - newHeight = o.Height, - newWidth = o.Width, - ymax = height - 1, - xmax = width - 1, - ox1, oy1, ox2, oy2; - double xFactor = (double)width / newWidth, - yFactor = (double)height / newHeight, - ox, oy, dx, dy, k1, k2, r, g, b, a, - x8, a2, b2, c2, d2, xm1, xp1, xp2; - for (int y = 0; y < newHeight; y++) - { - oy = (double)y * yFactor - 0.5f; - oy1 = (int)oy; - dy = oy - (double)oy1; - - for (int x = 0; x < newWidth; x++) - { - ox = (double)x * xFactor - 0.5f; - ox1 = (int)ox; - dx = ox - (double)ox1; - - r = g = b = a = 0; - - for (int n = -1; n < 3; n++) - { - x8 = dy - (double)n; - if (x8 > 2.0) - { - k1 = 0.0; - } - else - { - xm1 = x8 - 1.0; - xp1 = x8 + 1.0; - xp2 = x8 + 2.0; - a2 = (xp2 <= 0.0) ? 0.0 : xp2 * xp2 * xp2; - b2 = (xp1 <= 0.0) ? 0.0 : xp1 * xp1 * xp1; - c2 = (x8 <= 0.0) ? 0.0 : x8 * x8 * x8; - d2 = (xm1 <= 0.0) ? 0.0 : xm1 * xm1 * xm1; - k1 = (0.16666666666666666667 * (a2 - (4.0 * b2) + (6.0 * c2) - (4.0 * d2))); - } - - - oy2 = oy1 + n; - if (oy2 < 0) - oy2 = 0; - if (oy2 > ymax) - oy2 = ymax; - - for (int m = -1; m < 3; m++) - { - x8 = (double)m - dx; - if (x8 > 2.0) - { - k2 = 0.0; - } - else - { - xm1 = x8 - 1.0; - xp1 = x8 + 1.0; - xp2 = x8 + 2.0; - a2 = (xp2 <= 0.0) ? 0.0 : xp2 * xp2 * xp2; - b2 = (xp1 <= 0.0) ? 0.0 : xp1 * xp1 * xp1; - c2 = (x8 <= 0.0) ? 0.0 : x8 * x8 * x8; - d2 = (xm1 <= 0.0) ? 0.0 : xm1 * xm1 * xm1; - k2 = k1 * (0.16666666666666666667 * (a2 - (4.0 * b2) + (6.0 * c2) - (4.0 * d2))); - } - - ox2 = ox1 + m; - if (ox2 < 0) - ox2 = 0; - if (ox2 > xmax) - ox2 = xmax; - - Pixel srcPixel = i.GetPixel((uint)ox2, (uint)oy2); - - r += k2 * srcPixel.R; - g += k2 * srcPixel.G; - b += k2 * srcPixel.B; - a += k2 * srcPixel.A; - } - } - o.SetPixel((uint)x, (uint)y, new Pixel((byte)r, (byte)g, (byte)b, (byte)a)); - } - } - - return o; - } - #endregion - - #region Hqx - - #region 2x - private static Image ResizeHq2x(Image i) - { - return (Image)Hqx.HqxSharp.Scale2((System.Drawing.Bitmap)i); - } - #endregion - - #region 3x - private static Image ResizeHq3x(Image i) - { - return (Image)Hqx.HqxSharp.Scale3((System.Drawing.Bitmap)i); - } - #endregion - - #region 4x - private static Image ResizeHq4x(Image i) - { - return (Image)Hqx.HqxSharp.Scale4((System.Drawing.Bitmap)i); - } - #endregion - - #endregion - - #endregion - - #endregion - - #region Greyscale - public static Image ConvertToGreyscale(Image i) - { - Image i2 = new Image(i.Width, i.Height); - - uint Len = (uint)(i.Height * i.Width); - byte b; - Pixel p; - for (uint t = 0; t < Len; t++) - { - p = i.Data[t]; - b = (byte)((0.2125 * p.R) + (0.7154 * p.G) + (0.0721 * p.B)); - i2.Data[t] = new Pixel(b, b, b, 255); - } - - return i2; - } - #endregion - - #region Invert Colors - public static Image InvertColors(Image i) - { - Image i2 = new Image(i.Width, i.Height); - - uint Len = (uint)(i.Height * i.Width); - Pixel p; - for (uint t = 0; t < Len; t++) - { - p = i.Data[t]; - i2.Data[t] = new Pixel((byte)(255 - p.R), (byte)(255 - p.G), (byte)(255 - p.B), 255); - } - - return i2; - } - #endregion - - #region ReverseRGB - public static Image ReverseRGB(Image i) - { - Image i2 = new Image(i.Width, i.Height); - - uint Len = (uint)(i.Height * i.Width); - Pixel p; - for (uint t = 0; t < Len; t++) - { - p = i.Data[t]; - i2.Data[t] = new Pixel(p.B, p.G, p.R, 255); - } - - return i2; - } - #endregion - - #region AddNoise - public enum NoiseGenerationMethod - { - Additive, - SaltAndPepper, - } - public static Image AddNoise(Image i, BoundingBox bounds, int strength = 10, NoiseGenerationMethod method = NoiseGenerationMethod.Additive) - { - Image im = null; - switch (method) - { - case NoiseGenerationMethod.Additive: - im = AddAdditiveNoise(i, bounds, strength); - break; - - //case NoiseGenerationMethod.SaltAndPepper: - // im = AddSaltAndPepperNoise(i, bounds); - // break; - } - return im; - } - - private static Image AddAdditiveNoise(Image i, BoundingBox b, int strength) - { - Random r = new Random(0); - uint startY = (uint)b.Top; - uint stopY = (uint)(startY + b.Height); - - uint startX = (uint)b.Left; - uint stopX = (uint)(startX + b.Width); - - Pixel p; - for (uint y = startY; y < stopY; y++) - { - for (uint x = startX; x < stopX; x++) - { - p = i.GetPixel(x, y); - i.SetPixel(x, y, new Pixel((byte)Math.Max(0, Math.Min(255, p.R + (r.NextDouble() * strength - strength))), (byte)Math.Max(0, Math.Min(255, p.G + (r.NextDouble() * strength - strength))), (byte)Math.Max(0, Math.Min(255, p.B + (r.NextDouble() * strength - strength))), 255)); - } - } - return i; - } - - #endregion - - } -} diff --git a/Users/Orvid/Orvid.Graphics/MiImage.cs b/Users/Orvid/Orvid.Graphics/MiImage.cs deleted file mode 100644 index 4b7b248d4b..0000000000 --- a/Users/Orvid/Orvid.Graphics/MiImage.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics -{ - /// - /// A Multi-Image Image, - /// This clas was created specifically for - /// The Tiff File Format. - /// - public class MiImage : Shapes.Shape - { - private Image[] Images; - private UInt32 CurIndx; - /// - /// The Active index of the MiImage, - /// This is the index of the Image - /// that gets drawn when Draw() is called. - /// - public UInt32 ActiveIndex - { - get - { - return CurIndx; - } - set - { - SetActiveIndex(value); - } - } - - /// - /// The default contructor for a MiImage. - /// - /// The First Image to add to the MiImage. - public MiImage(Image init) - { - Images = new Image[] { init }; - CurIndx = 0; - } - - /// - /// Create a new MiImage from an Image Array. - /// - /// The image array to create the MiImage from. - public MiImage(Image[] images) - { - Images = new Image[images.Length]; - Array.Copy(images, Images, images.Length); - CurIndx = 0; - } - - /// - /// Get the image at the specified index. - /// - /// The index of the image to get. - /// The image at the specified Index. - public Image GetImage(UInt32 indx) - { - if (indx < Images.Length) - return Images[indx]; - throw new Exception("No Image at specified Index!"); - } - - /// - /// Set's the active index to the specified value. - /// - /// What to set the active index to. - public void SetActiveIndex(UInt32 indx) - { - if (indx < Images.Length) - CurIndx = indx; - throw new Exception("No Image at specified Index!"); - } - - /// - /// Adds the specified image at the end of the MiImage. - /// - /// The image to add. - public void AppendImage(Image i) - { - Image[] tmp = new Image[Images.Length + 1]; - Array.Copy(Images, tmp, Images.Length); - tmp[tmp.Length - 1] = i; - Images = tmp; - } - - public override void Draw() - { - Parent.DrawImage(new Vec2(base.X, base.Y), Images[CurIndx]); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj b/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj deleted file mode 100644 index 6a44346654..0000000000 --- a/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj +++ /dev/null @@ -1,116 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Library - Properties - Orvid.Graphics - Orvid.Graphics - v4.7.1 - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - Code - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - {931E9514-6750-4700-8B20-364DD1B78038} - Orvid.Compression - - - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8} - Orvid.Graphics.Dependancies - - - - - - - - diff --git a/Users/Orvid/Orvid.Graphics/Pixel.cs b/Users/Orvid/Orvid.Graphics/Pixel.cs deleted file mode 100644 index f81fc4b9ec..0000000000 --- a/Users/Orvid/Orvid.Graphics/Pixel.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; - -namespace Orvid.Graphics -{ - /// - /// This class describes a single pixel. - /// - public struct Pixel - { - /// - /// The byte that describes the amount of Red in the pixel. - /// - public byte R; - /// - /// The byte that describes the amount of Green in the pixel. - /// - public byte G; - /// - /// The byte that describes the amount of Blue in the pixel. - /// - public byte B; - /// - /// The byte that describes the transparency of the pixel. - /// - public byte A; - /// - /// This tells if the pixel is empty, and should be ignored. - /// - public bool Empty - { - get - { - return (A + R + B + G == 0); - } - } - - public uint ToUInt() - { - return unchecked((uint)((R << 24) | (G << 16) | (B << 8) | (A))); - } - - //public Pixel() - // : this(true) - //{ - //} - - public Pixel(byte r, byte g, byte b, byte a) - { - this.R = r; - this.G = g; - this.B = b; - this.A = a; - } - - public Pixel(bool empty) - { - this.R = 0; - this.G = 0; - this.B = 0; - this.A = 0; - } - - public static implicit operator System.Drawing.Color(Pixel a) - { - return System.Drawing.Color.FromArgb(a.A, a.R, a.G, a.B); - } - - public static implicit operator Pixel(System.Drawing.Color a) - { - return new Pixel(a.R, a.G, a.B, a.A); - } - - public static bool operator !=(Pixel a, Pixel b) - { - //if (!(a is Pixel) || !(b is Pixel)) - //{ - // if (!(a is Pixel) && !(b is Pixel)) - // return false; - // return true; - //} - //else - //{ - if (a.A != b.A || a.B != b.B || a.G != b.G || a.R != b.R) - return true; - return false; - //} - } - - public static bool operator !=(Pixel a, int b) - { - return (a.A != b && a.B != b && a.G != b && a.R != b); - } - - public static bool operator ==(Pixel a, int b) - { - return (a.A == b && a.B == b && a.G == b && a.R == b); - } - - public static bool operator ==(Pixel a, Pixel b) - { - - //if (!(a is Pixel) || !(b is Pixel)) - //{ - // if (!(a is Pixel) && !(b is Pixel)) - // return true; - // return false; - //} - //else - //{ - if (a.A != b.A || a.B != b.B || a.G != b.G || a.R != b.R) - return false; - return true; - //} - } - - public override bool Equals(object obj) - { - return (this == (Pixel)obj); - } - - public override int GetHashCode() - { - return 0; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Properties/AssemblyInfo.cs b/Users/Orvid/Orvid.Graphics/Properties/AssemblyInfo.cs deleted file mode 100644 index 054a66a58c..0000000000 --- a/Users/Orvid/Orvid.Graphics/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("Orvid.Graphics")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("Orvid.Graphics")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("9c25fbc0-506d-461c-b7a8-ee151af0ac8c")] - -// 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/Users/Orvid/Orvid.Graphics/Rectangle.cs b/Users/Orvid/Orvid.Graphics/Rectangle.cs deleted file mode 100644 index ea2dc578ce..0000000000 --- a/Users/Orvid/Orvid.Graphics/Rectangle.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; - -namespace Orvid.Graphics -{ - public class Rectangle - { - private int x, y, width, height; - - public int Height - { - get { return height; } - set { height = value; } - } - - public int Width - { - get { return width; } - set { width = value; } - } - - public int X - { - get { return x; } - set { x = value; } - } - - public int Y - { - get { return y; } - set { y = value; } - } - - public Rectangle() { } - public Rectangle(Rectangle rect) - { - SetBounds(rect.X, rect.Y, rect.Width, rect.Height); - } - - public void SetBounds(int x, int y, int w, int h) - { - this.x = x; - this.y = y; - this.width = w; - this.height = h; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Shapes/Shape.cs b/Users/Orvid/Orvid.Graphics/Shapes/Shape.cs deleted file mode 100644 index 26dba5345d..0000000000 --- a/Users/Orvid/Orvid.Graphics/Shapes/Shape.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Orvid.Graphics.Shapes -{ - public abstract class Shape - { - private int x; - public Int32 X - { - get - { - return x; - } - set - { - Modified = true; - x = value; - } - } - private int y; - public Int32 Y - { - get - { - return y; - } - set - { - Modified = true; - y = value; - } - } - private bool modified = true; - public bool Modified - { - get - { - return modified; - } - internal set - { - modified = value; - if (modified) - { - Parent.Modified = true; - } - } - } - public ShapedImage Parent { get; set; } - public abstract void Draw(); - } -} diff --git a/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs b/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs deleted file mode 100644 index ce949289f6..0000000000 --- a/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.Shapes -{ - public class ShapedImage : Image - { - public bool Modified { get; set; } - public List Shapes = new List(); - - public ShapedImage(int width, int height) : base(width, height) - { - } - - public Image Render() - { - if (Modified) - { - this.Clear(new Pixel(true)); - foreach (Shape s in Shapes) - { - s.Draw(); - } - this.Modified = false; - } - return this; - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/Shapes/Square.cs b/Users/Orvid/Orvid.Graphics/Shapes/Square.cs deleted file mode 100644 index 650a67771c..0000000000 --- a/Users/Orvid/Orvid.Graphics/Shapes/Square.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Orvid.Graphics.Shapes -{ - public class Square : Shape - { - private Image i; - private Pixel fillColor = new Pixel(255, 255, 255, 255); // Initialize white. - public Pixel FillColor - { - get - { - return fillColor; - } - set - { - if (fillColor != value) - { - Modified = true; - fillColor = value; - } - } - } - private Pixel borderColor = new Pixel(0, 0, 0, 255); // Initialize black. - public Pixel BorderColor - { - get - { - return borderColor; - } - set - { - if (borderColor != value) - { - Modified = true; - borderColor = value; - } - } - } - private int size; - public Int32 Size - { - get - { - return size; - } - set - { - if (size != value) - { - Modified = true; - size = value; - i = new Image(this.Size, this.Size); - } - } - } - - public Square(int x, int y, ShapedImage parent, int size) - { - this.X = x; - this.Y = y; - this.Parent = parent; - this.Parent.Shapes.Add(this); - this.Size = size; - this.i = new Image(this.Size, this.Size); - } - - public override void Draw() - { - if (Modified) - { - i.Clear(this.FillColor); - i.DrawLines(new Vec2[] { new Vec2(0, 0), new Vec2(Size, 0), new Vec2(Size, Size), new Vec2(0, Size), new Vec2(0, 0) }, BorderColor); - Modified = false; - } - Parent.DrawImage(new Vec2(X, Y), i); - } - } -} diff --git a/Users/Orvid/Orvid.Graphics/VGAPallet.png b/Users/Orvid/Orvid.Graphics/VGAPallet.png deleted file mode 100644 index b45813e9c5..0000000000 Binary files a/Users/Orvid/Orvid.Graphics/VGAPallet.png and /dev/null differ diff --git a/Users/Orvid/Orvid.Graphics/Vec2.cs b/Users/Orvid/Orvid.Graphics/Vec2.cs deleted file mode 100644 index 9dbca7ddb8..0000000000 --- a/Users/Orvid/Orvid.Graphics/Vec2.cs +++ /dev/null @@ -1,138 +0,0 @@ -// I dislike empty xml comments, so I disable that warning. -#pragma warning disable 1591 - -using System; - -namespace Orvid.Graphics -{ - /// - /// This is a 2d vector. aka. A point on a 2d plane. - /// - public class Vec2 - { - public static Vec2 Zero = new Vec2(0, 0); - - /// - /// The X position. - /// - public int X; - /// - /// The Y position. - /// - public int Y; - - /// - /// The default constructor. - /// - public Vec2() { } - - /// - /// The default constructor. - /// - /// The X position. - /// The Y position. - public Vec2(int x, int y) - { - this.X = x; - this.Y = y; - } - - public static Vec2 operator -(Vec2 v) - { - Vec2 vec = new Vec2(); - vec.X = -v.X; - vec.Y = -v.Y; - return vec; - } - - public static Vec2 operator -(Vec2 a, Vec2 b) - { - Vec2 v = new Vec2(); - v.X = a.X - b.X; - v.Y = a.Y - b.Y; - return v; - } - - public static Vec2 operator -(Vec2 a, int b) - { - Vec2 v = new Vec2(); - v.X = a.X - b; - v.Y = a.Y - b; - return v; - } - - public static Vec2 operator +(Vec2 a, Vec2 b) - { - Vec2 v = new Vec2(); - v.X = a.X + b.X; - v.Y = a.Y + b.Y; - return v; - } - - public static Vec2 operator /(Vec2 a, Vec2 b) - { - Vec2 v = new Vec2(); - v.X = a.X / b.X; - v.Y = a.Y / b.Y; - return v; - } - - public static Vec2 operator /(Vec2 a, int b) - { - Vec2 v = new Vec2(); - v.X = (Int32)(a.X / b); - v.Y = (Int32)(a.Y / b); - return v; - } - - public static Vec2 operator /(Vec2 v, float s) - { - Vec2 vec = new Vec2(); - // Division of floats can be expensive, - // so we multiply instead, as it's much cheaper. - float num = 1f / s; - vec.X = (Int32)(v.X * num); - vec.Y = (Int32)(v.Y * num); - return vec; - } - - public static Vec2 operator /(float s, Vec2 v) - { - Vec2 vec = new Vec2(); - vec.X = (Int32)(s / v.X); - vec.Y = (Int32)(s / v.Y); - return vec; - } - - public static bool operator !=(Vec2 a, Vec2 b) - { - if (a.X != b.X || a.Y != b.Y) - return true; - return false; - } - - public static bool operator ==(Vec2 a, Vec2 b) - { - if (a.X != b.X || a.Y != b.Y) - return false; - return true; - } - - public Vec2 Double() - { - return new Vec2(this.X * 2, this.Y * 2); - } - - public override bool Equals(object obj) - { - return (this == (Vec2)obj); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - } -} -// And restore the warning. -#pragma warning restore 1591 \ No newline at end of file diff --git a/Users/Orvid/Orvid.Graphics/Vec2d.cs b/Users/Orvid/Orvid.Graphics/Vec2d.cs deleted file mode 100644 index 29e9f4e2b6..0000000000 --- a/Users/Orvid/Orvid.Graphics/Vec2d.cs +++ /dev/null @@ -1,138 +0,0 @@ -// I dislike empty xml comments, so I disable that warning. -#pragma warning disable 1591 - -using System; - -namespace Orvid.Graphics -{ - /// - /// This is a 2d vector. aka. A point on a 2d plane. - /// - public class Vec2d - { - public static Vec2d Zero = new Vec2d(0, 0); - - /// - /// The X position. - /// - public double X; - /// - /// The Y position. - /// - public double Y; - - /// - /// The default constructor. - /// - public Vec2d() { } - - /// - /// The default constructor. - /// - /// The X position. - /// The Y position. - public Vec2d(double x, double y) - { - this.X = x; - this.Y = y; - } - - public static Vec2d operator -(Vec2d v) - { - Vec2d vec = new Vec2d(); - vec.X = -v.X; - vec.Y = -v.Y; - return vec; - } - - public static Vec2d operator -(Vec2d a, Vec2d b) - { - Vec2d v = new Vec2d(); - v.X = a.X - b.X; - v.Y = a.Y - b.Y; - return v; - } - - public static Vec2d operator -(Vec2d a, double b) - { - Vec2d v = new Vec2d(); - v.X = a.X - b; - v.Y = a.Y - b; - return v; - } - - public static Vec2d operator +(Vec2d a, Vec2d b) - { - Vec2d v = new Vec2d(); - v.X = a.X + b.X; - v.Y = a.Y + b.Y; - return v; - } - - public static Vec2d operator /(Vec2d a, Vec2d b) - { - Vec2d v = new Vec2d(); - v.X = a.X / b.X; - v.Y = a.Y / b.Y; - return v; - } - - public static Vec2d operator /(Vec2d v, double s) - { - Vec2d vec = new Vec2d(); - // Division of doubles can be expensive, - // so we multiply instead, as it's much cheaper. - double num = 1f / s; - vec.X = v.X * num; - vec.Y = v.Y * num; - return vec; - } - - public static Vec2d operator /(double s, Vec2d v) - { - Vec2d vec = new Vec2d(); - vec.X = s / v.X; - vec.Y = s / v.Y; - return vec; - } - - public static bool operator !=(Vec2d a, Vec2d b) - { - if (a.X != b.X || a.Y != b.Y) - return true; - return false; - } - - public static bool operator ==(Vec2d a, Vec2d b) - { - if (a.X != b.X || a.Y != b.Y) - return false; - return true; - } - - public static implicit operator Vec2(Vec2d a) - { - Vec2 v = new Vec2(); - v.X = (int)a.X; - v.Y = (int)a.Y; - return v; - } - - public Vec2d Double() - { - return new Vec2d(this.X * 2, this.Y * 2); - } - - public override bool Equals(object obj) - { - return (this == (Vec2d)obj); - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - } -} -// And restore the warning. -#pragma warning restore 1591 diff --git a/Users/Orvid/Orvid.sln b/Users/Orvid/Orvid.sln deleted file mode 100644 index c149b24dc7..0000000000 --- a/Users/Orvid/Orvid.sln +++ /dev/null @@ -1,308 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "OrvidTest", "OrvidTestOS\OrvidTest.Cosmos", "{02C67056-795C-4DFE-BE83-989E6A16DEE3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrvidKernel", "OrvidTestOS\OrvidKernel.csproj", "{2E14EED0-F7E9-4E7C-AA21-6E519C28457D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics.Dependancies", "Orvid.Graphics.Dependancies\Orvid.Graphics.Dependancies.csproj", "{6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics.Cosmos", "Orvid.Graphics.Cosmos\Orvid.Graphics.Cosmos.csproj", "{167D46D2-F0F2-4F59-BA0F-2452941E0450}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics", "Orvid.Graphics\Orvid.Graphics.csproj", "{C9E995CF-CB65-4410-A7D2-63EBBE02AABB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Concurrent", "Orvid.Concurrent\Orvid.Concurrent.csproj", "{FC0B18FE-6D0A-481C-8007-2138A88D0DB3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Compression", "Orvid.Compression\Orvid.Compression.csproj", "{931E9514-6750-4700-8B20-364DD1B78038}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OForms", "OForms\OForms.csproj", "{039E2C8F-E73C-48AF-B249-FC953072D9A0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageManipulatorTester", "ImageManipulatorTester\ImageManipulatorTester.csproj", "{1A36573D-5EC1-4EA7-B65C-1AAA537292B7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlugViewer", "PlugViewer\PlugViewer.csproj", "{2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}" -EndProject -Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "StructTest", "StructTest\StructTest.Cosmos", "{FC6EE0B6-0E66-43E9-BFBA-9908DE788936}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructTestKernel", "StructTest\StructTestKernel.csproj", "{086FC210-C2E9-4536-8235-9285929F904A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CharMapGenerator", "Utils\CharMapGenerator\CharMapGenerator.csproj", "{4D7BE49B-BFD2-4586-A411-5EFC82621291}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utils", "Utils", "{2EAB2950-80E9-421E-B6EE-9F8970B90CE9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Testers", "Testers", "{D94C5D8B-D42B-43C8-B0B7-E1593D639FED}" - ProjectSection(SolutionItems) = preProject - StructTest\SecondaryKernel.cs = StructTest\SecondaryKernel.cs - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestBed", "TestBed\TestBed.csproj", "{D399715F-C947-4C07-94DF-E7E86C469EF1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kernels", "Kernels", "{BD5E0870-A4F7-4048-8FB0-6DD332AFF25D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StructTest", "StructTest", "{55F1D089-785A-4B4E-BD45-3BEB26877CB7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cosmos", "Cosmos", "{7A36C045-17E7-4965-8B1C-043EB757D3C8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.IL2CPU.Plugs", "..\..\IL2CPU\Cosmos.IL2CPU.Plugs\Cosmos.IL2CPU.Plugs.csproj", "{C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Assembler.X86", "..\..\Compiler\Cosmos.Compiler.Assembler.X86\Cosmos.Compiler.Assembler.X86.csproj", "{94D079E4-3C66-486A-8407-EA6EC049FF53}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Assembler", "..\..\Compiler\Cosmos.Compiler.Assembler\Cosmos.Compiler.Assembler.csproj", "{1116130E-28E0-428A-A597-F4B3B676C0CA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.System", "..\..\Kernel\System\Cosmos.System\Cosmos.System.csproj", "{DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.System.Plugs", "..\source\Cosmos.System.Plugs\Cosmos.System.Plugs.csproj", "{7C64B97F-516D-4A6D-B9E1-3FE48F561409}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Core", "..\..\Kernel\System\Hardware\Core\Cosmos.Core\Cosmos.Core.csproj", "{5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Core.Plugs", "..\..\Kernel\System\Hardware\Core\Cosmos.Core.Plugs\Cosmos.Core.Plugs.csproj", "{D9A87AAD-FCC9-4517-B31D-E904DAD00784}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Hardware", "..\..\Kernel\System\Hardware\Cosmos.Hardware\Cosmos.Hardware.csproj", "{6A991D03-1435-4005-9809-B8BACDF3B021}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.Kernel.Plugs", "..\source\Cosmos.Debug.Kernel.Plugs\Cosmos.Debug.Kernel.Plugs.csproj", "{B97A2956-C363-47F2-A6AA-B4FCCFF4D315}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Common", "..\source\Cosmos.Common\Cosmos.Common.csproj", "{1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.Kernel", "..\source\Cosmos.Debug.Kernel\Cosmos.Debug.Kernel.csproj", "{61607F1E-58F9-41CF-972F-128384F3E115}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.XSharp", "..\..\Compiler\Cosmos.Compiler.XSharp\Cosmos.Compiler.XSharp.csproj", "{453F2952-FD48-477F-889B-B3C6963C9850}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.IL2CPU", "..\source\Cosmos.IL2CPU\Cosmos.IL2CPU.csproj", "{239E33A7-F0C3-4801-85CA-4D8F89A31DC0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.IL2CPU.X86", "..\source\Cosmos.IL2CPU.X86\Cosmos.IL2CPU.X86.csproj", "{63F7BFB9-419E-4965-B580-304B9C9FA7D8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.DebugStub", "..\source\Cosmos.Debug.DebugStub\Cosmos.Debug.DebugStub.csproj", "{A7F3F078-CF99-4018-9A35-2D6DC9517ADB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Build.MSBuild", "..\source\Cosmos.Build.MSBuild\Cosmos.Build.MSBuild.csproj", "{BC6AE974-1F18-4A19-A956-5062E4D3FD53}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IL2CPU Tester", "IL2CPU Tester", "{68E71759-5EAF-4BBA-90D8-CED9D5AAD741}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestKernel", "IL2CPU Tester\TestKernel\TestKernel.csproj", "{B75AE496-E7AC-4EC4-9904-43D6B84D9705}" -EndProject -Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "Tester", "IL2CPU Tester\Tester\Tester.Cosmos", "{7F0794F7-4516-46BB-AE77-DBA713DCD63C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RawILTests", "IL2CPU Tester\RawILTests\RawILTests.csproj", "{59E2210F-3F41-42DF-8B26-9CAE87273562}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsTests", "IL2CPU Tester\CsTests\CsTests.csproj", "{7CEE0541-0107-47F3-B422-70C55E81CE42}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Extensions", "Orvid.Extensions\Orvid.Extensions.csproj", "{70BC12ED-553D-4EE0-B350-D2FACF3EA90A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IL2CPURunner", "IL2CPURunner\IL2CPURunner.csproj", "{56655226-BAC2-4192-9B9B-E9B81F93C244}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Build.Common", "..\source\Cosmos.Build.Common\Cosmos.Build.Common.csproj", "{0462E82B-8C29-41A9-8265-9C89038ADB29}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.Common", "..\source\Cosmos.Debug.Common\Cosmos.Debug.Common.csproj", "{AB24E403-54F3-4F67-B5E0-119A7227AAC1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestRunner", "TestRunner", "{B03AD376-0CC6-40AB-A26A-850CA03D7AF1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestRunnerKernel", "TestRunner\TestRunnerKernel.csproj", "{408DE7FA-C3A0-44A2-AA32-2F421EBE9025}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.Consts", "..\..\IL2CPU\Cosmos.IL2CPU.Debug\Cosmos.Debug.Consts.csproj", "{9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {02C67056-795C-4DFE-BE83-989E6A16DEE3}.Debug|x86.ActiveCfg = Debug|x86 - {02C67056-795C-4DFE-BE83-989E6A16DEE3}.Debug|x86.Build.0 = Debug|x86 - {02C67056-795C-4DFE-BE83-989E6A16DEE3}.Release|x86.ActiveCfg = Release|x86 - {02C67056-795C-4DFE-BE83-989E6A16DEE3}.Release|x86.Build.0 = Release|x86 - {2E14EED0-F7E9-4E7C-AA21-6E519C28457D}.Debug|x86.ActiveCfg = Debug|x86 - {2E14EED0-F7E9-4E7C-AA21-6E519C28457D}.Debug|x86.Build.0 = Debug|x86 - {2E14EED0-F7E9-4E7C-AA21-6E519C28457D}.Release|x86.ActiveCfg = Release|x86 - {2E14EED0-F7E9-4E7C-AA21-6E519C28457D}.Release|x86.Build.0 = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|x86.ActiveCfg = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|x86.Build.0 = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|x86.ActiveCfg = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|x86.Build.0 = Release|x86 - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|x86.ActiveCfg = Debug|x86 - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|x86.Build.0 = Debug|x86 - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|x86.ActiveCfg = Release|x86 - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|x86.Build.0 = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|x86.ActiveCfg = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|x86.Build.0 = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|x86.ActiveCfg = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|x86.Build.0 = Release|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Debug|x86.ActiveCfg = Debug|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Debug|x86.Build.0 = Debug|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Release|x86.ActiveCfg = Release|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Release|x86.Build.0 = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|x86.ActiveCfg = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|x86.Build.0 = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|x86.ActiveCfg = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|x86.Build.0 = Release|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|x86.ActiveCfg = Debug|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|x86.Build.0 = Debug|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|x86.ActiveCfg = Release|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|x86.Build.0 = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|x86.ActiveCfg = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|x86.Build.0 = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|x86.ActiveCfg = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|x86.Build.0 = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.Build.0 = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.Build.0 = Release|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Debug|x86.ActiveCfg = Debug|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Debug|x86.Build.0 = Debug|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Release|x86.ActiveCfg = Release|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Release|x86.Build.0 = Release|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|x86.ActiveCfg = Debug|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|x86.Build.0 = Debug|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Release|x86.ActiveCfg = Release|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Release|x86.Build.0 = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|x86.ActiveCfg = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|x86.Build.0 = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|x86.ActiveCfg = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|x86.Build.0 = Release|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|x86.ActiveCfg = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|x86.Build.0 = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|x86.ActiveCfg = Release|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|x86.Build.0 = Release|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|x86.ActiveCfg = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|x86.Build.0 = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|x86.ActiveCfg = Debug|Any CPU - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|x86.Build.0 = Debug|Any CPU - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|x86.ActiveCfg = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|x86.Build.0 = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|x86.ActiveCfg = Debug|Any CPU - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|x86.Build.0 = Debug|Any CPU - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|x86.ActiveCfg = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|x86.Build.0 = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|x86.ActiveCfg = Debug|Any CPU - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|x86.Build.0 = Debug|Any CPU - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|x86.ActiveCfg = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|x86.Build.0 = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|x86.ActiveCfg = Debug|Any CPU - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|x86.Build.0 = Debug|Any CPU - {7C64B97F-516D-4A6D-B9E1-3FE48F561409}.Debug|x86.ActiveCfg = Debug|x86 - {7C64B97F-516D-4A6D-B9E1-3FE48F561409}.Debug|x86.Build.0 = Debug|x86 - {7C64B97F-516D-4A6D-B9E1-3FE48F561409}.Release|x86.ActiveCfg = Debug|Any CPU - {7C64B97F-516D-4A6D-B9E1-3FE48F561409}.Release|x86.Build.0 = Debug|Any CPU - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|x86.ActiveCfg = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|x86.Build.0 = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|x86.ActiveCfg = Debug|Any CPU - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|x86.Build.0 = Debug|Any CPU - {D9A87AAD-FCC9-4517-B31D-E904DAD00784}.Debug|x86.ActiveCfg = Debug|x86 - {D9A87AAD-FCC9-4517-B31D-E904DAD00784}.Debug|x86.Build.0 = Debug|x86 - {D9A87AAD-FCC9-4517-B31D-E904DAD00784}.Release|x86.ActiveCfg = Debug|Any CPU - {D9A87AAD-FCC9-4517-B31D-E904DAD00784}.Release|x86.Build.0 = Debug|Any CPU - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|x86.ActiveCfg = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|x86.Build.0 = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|x86.ActiveCfg = Debug|Any CPU - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|x86.Build.0 = Debug|Any CPU - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315}.Debug|x86.ActiveCfg = Debug|x86 - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315}.Debug|x86.Build.0 = Debug|x86 - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315}.Release|x86.ActiveCfg = Debug|Any CPU - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315}.Release|x86.Build.0 = Debug|Any CPU - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|x86.ActiveCfg = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|x86.Build.0 = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|x86.ActiveCfg = Debug|Any CPU - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|x86.Build.0 = Debug|Any CPU - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|x86.ActiveCfg = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|x86.Build.0 = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|x86.ActiveCfg = Debug|Any CPU - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|x86.Build.0 = Debug|Any CPU - {453F2952-FD48-477F-889B-B3C6963C9850}.Debug|x86.ActiveCfg = Debug|x86 - {453F2952-FD48-477F-889B-B3C6963C9850}.Debug|x86.Build.0 = Debug|x86 - {453F2952-FD48-477F-889B-B3C6963C9850}.Release|x86.ActiveCfg = Debug|Any CPU - {453F2952-FD48-477F-889B-B3C6963C9850}.Release|x86.Build.0 = Debug|Any CPU - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0}.Debug|x86.ActiveCfg = Debug|x86 - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0}.Debug|x86.Build.0 = Debug|x86 - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0}.Release|x86.ActiveCfg = Debug|Any CPU - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0}.Release|x86.Build.0 = Debug|Any CPU - {63F7BFB9-419E-4965-B580-304B9C9FA7D8}.Debug|x86.ActiveCfg = Debug|x86 - {63F7BFB9-419E-4965-B580-304B9C9FA7D8}.Debug|x86.Build.0 = Debug|x86 - {63F7BFB9-419E-4965-B580-304B9C9FA7D8}.Release|x86.ActiveCfg = Debug|Any CPU - {63F7BFB9-419E-4965-B580-304B9C9FA7D8}.Release|x86.Build.0 = Debug|Any CPU - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB}.Debug|x86.ActiveCfg = Debug|x86 - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB}.Debug|x86.Build.0 = Debug|x86 - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB}.Release|x86.ActiveCfg = Debug|Any CPU - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB}.Release|x86.Build.0 = Debug|Any CPU - {BC6AE974-1F18-4A19-A956-5062E4D3FD53}.Debug|x86.ActiveCfg = Debug|x86 - {BC6AE974-1F18-4A19-A956-5062E4D3FD53}.Debug|x86.Build.0 = Debug|x86 - {BC6AE974-1F18-4A19-A956-5062E4D3FD53}.Release|x86.ActiveCfg = Debug|Any CPU - {BC6AE974-1F18-4A19-A956-5062E4D3FD53}.Release|x86.Build.0 = Debug|Any CPU - {B75AE496-E7AC-4EC4-9904-43D6B84D9705}.Debug|x86.ActiveCfg = Debug|x86 - {B75AE496-E7AC-4EC4-9904-43D6B84D9705}.Debug|x86.Build.0 = Debug|x86 - {B75AE496-E7AC-4EC4-9904-43D6B84D9705}.Release|x86.ActiveCfg = Release|x86 - {B75AE496-E7AC-4EC4-9904-43D6B84D9705}.Release|x86.Build.0 = Release|x86 - {7F0794F7-4516-46BB-AE77-DBA713DCD63C}.Debug|x86.ActiveCfg = Debug|x86 - {7F0794F7-4516-46BB-AE77-DBA713DCD63C}.Debug|x86.Build.0 = Debug|x86 - {7F0794F7-4516-46BB-AE77-DBA713DCD63C}.Release|x86.ActiveCfg = Release|x86 - {7F0794F7-4516-46BB-AE77-DBA713DCD63C}.Release|x86.Build.0 = Release|x86 - {59E2210F-3F41-42DF-8B26-9CAE87273562}.Debug|x86.ActiveCfg = Debug|x86 - {59E2210F-3F41-42DF-8B26-9CAE87273562}.Debug|x86.Build.0 = Debug|x86 - {59E2210F-3F41-42DF-8B26-9CAE87273562}.Release|x86.ActiveCfg = Release|x86 - {59E2210F-3F41-42DF-8B26-9CAE87273562}.Release|x86.Build.0 = Release|x86 - {7CEE0541-0107-47F3-B422-70C55E81CE42}.Debug|x86.ActiveCfg = Debug|x86 - {7CEE0541-0107-47F3-B422-70C55E81CE42}.Debug|x86.Build.0 = Debug|x86 - {7CEE0541-0107-47F3-B422-70C55E81CE42}.Release|x86.ActiveCfg = Release|x86 - {7CEE0541-0107-47F3-B422-70C55E81CE42}.Release|x86.Build.0 = Release|x86 - {70BC12ED-553D-4EE0-B350-D2FACF3EA90A}.Debug|x86.ActiveCfg = Debug|x86 - {70BC12ED-553D-4EE0-B350-D2FACF3EA90A}.Debug|x86.Build.0 = Debug|x86 - {70BC12ED-553D-4EE0-B350-D2FACF3EA90A}.Release|x86.ActiveCfg = Release|x86 - {70BC12ED-553D-4EE0-B350-D2FACF3EA90A}.Release|x86.Build.0 = Release|x86 - {56655226-BAC2-4192-9B9B-E9B81F93C244}.Debug|x86.ActiveCfg = Debug|x86 - {56655226-BAC2-4192-9B9B-E9B81F93C244}.Debug|x86.Build.0 = Debug|x86 - {56655226-BAC2-4192-9B9B-E9B81F93C244}.Release|x86.ActiveCfg = Debug|x86 - {56655226-BAC2-4192-9B9B-E9B81F93C244}.Release|x86.Build.0 = Debug|x86 - {0462E82B-8C29-41A9-8265-9C89038ADB29}.Debug|x86.ActiveCfg = Debug|x86 - {0462E82B-8C29-41A9-8265-9C89038ADB29}.Debug|x86.Build.0 = Debug|x86 - {0462E82B-8C29-41A9-8265-9C89038ADB29}.Release|x86.ActiveCfg = Debug|Any CPU - {0462E82B-8C29-41A9-8265-9C89038ADB29}.Release|x86.Build.0 = Debug|Any CPU - {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Debug|x86.ActiveCfg = Debug|x86 - {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Debug|x86.Build.0 = Debug|x86 - {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Release|x86.ActiveCfg = Debug|Any CPU - {AB24E403-54F3-4F67-B5E0-119A7227AAC1}.Release|x86.Build.0 = Debug|Any CPU - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025}.Debug|x86.ActiveCfg = Debug|x86 - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025}.Debug|x86.Build.0 = Debug|x86 - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025}.Release|x86.ActiveCfg = Release|x86 - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025}.Release|x86.Build.0 = Release|x86 - {9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}.Debug|x86.ActiveCfg = Debug|x86 - {9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}.Debug|x86.Build.0 = Debug|x86 - {9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}.Release|x86.ActiveCfg = Debug|Any CPU - {9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2}.Release|x86.Build.0 = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7} = {D94C5D8B-D42B-43C8-B0B7-E1593D639FED} - {D399715F-C947-4C07-94DF-E7E86C469EF1} = {D94C5D8B-D42B-43C8-B0B7-E1593D639FED} - {56655226-BAC2-4192-9B9B-E9B81F93C244} = {D94C5D8B-D42B-43C8-B0B7-E1593D639FED} - {4D7BE49B-BFD2-4586-A411-5EFC82621291} = {2EAB2950-80E9-421E-B6EE-9F8970B90CE9} - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF} = {2EAB2950-80E9-421E-B6EE-9F8970B90CE9} - {55F1D089-785A-4B4E-BD45-3BEB26877CB7} = {BD5E0870-A4F7-4048-8FB0-6DD332AFF25D} - {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} = {BD5E0870-A4F7-4048-8FB0-6DD332AFF25D} - {B03AD376-0CC6-40AB-A26A-850CA03D7AF1} = {BD5E0870-A4F7-4048-8FB0-6DD332AFF25D} - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936} = {55F1D089-785A-4B4E-BD45-3BEB26877CB7} - {086FC210-C2E9-4536-8235-9285929F904A} = {55F1D089-785A-4B4E-BD45-3BEB26877CB7} - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {94D079E4-3C66-486A-8407-EA6EC049FF53} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {1116130E-28E0-428A-A597-F4B3B676C0CA} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {7C64B97F-516D-4A6D-B9E1-3FE48F561409} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {D9A87AAD-FCC9-4517-B31D-E904DAD00784} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {6A991D03-1435-4005-9809-B8BACDF3B021} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {61607F1E-58F9-41CF-972F-128384F3E115} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {453F2952-FD48-477F-889B-B3C6963C9850} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {63F7BFB9-419E-4965-B580-304B9C9FA7D8} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {BC6AE974-1F18-4A19-A956-5062E4D3FD53} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {0462E82B-8C29-41A9-8265-9C89038ADB29} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {AB24E403-54F3-4F67-B5E0-119A7227AAC1} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {9998B4EA-385E-4DA2-8905-2BBEB5B2C6E2} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {B75AE496-E7AC-4EC4-9904-43D6B84D9705} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {7F0794F7-4516-46BB-AE77-DBA713DCD63C} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {59E2210F-3F41-42DF-8B26-9CAE87273562} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {7CEE0541-0107-47F3-B422-70C55E81CE42} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025} = {B03AD376-0CC6-40AB-A26A-850CA03D7AF1} - {0DBE9DF9-45AB-4A3C-AC13-D0240C03012D} = {B03AD376-0CC6-40AB-A26A-850CA03D7AF1} - EndGlobalSection -EndGlobal diff --git a/Users/Orvid/OrvidTestOS/AsmMouse.cs b/Users/Orvid/OrvidTestOS/AsmMouse.cs deleted file mode 100644 index ebdb9ab3c9..0000000000 --- a/Users/Orvid/OrvidTestOS/AsmMouse.cs +++ /dev/null @@ -1,484 +0,0 @@ -//#define ASMMouse - -#if ASMMouse -//#define DebugMouse - -using System; -using System.Collections.Generic; -using System.Text; -using IL2CPU.API; -using Cosmos.Compiler.Assembler; -using Cosmos.Compiler.Assembler.X86; -using Cosmos.Core; - -namespace Cosmos.Hardware -{ - class AsmMouse - { - - #region Native mouse implementation - #region EnableMouseASM - private class EnableMouseASM : AssemblerMethod - { - - public override void AssembleNew(object aAssembler, object aMethodInfo) - { - XS.Mov(XSRegisters.BL, 0xa8); - - XS.Call("send_mouse_cmd"); - - XS.Call("mouse_read"); - - XS.Noop(); - - XS.Mov(XSRegisters.BL, 0x20); - - XS.Call("send_mouse_cmd"); - - XS.Call("mouse_read"); - - XS.Or(XSRegisters.AL, 3); - - XS.Mov(XSRegisters.BL, 0x60); - - XS.Push(XSRegisters.EAX); - - XS.Call("send_mouse_cmd"); - - XS.Pop(XSRegisters.EAX); - - XS.Call("mouse_write"); - - XS.Noop(); - - XS.Mov(XSRegisters.BL, 0xd4); - - XS.Call("send_mouse_cmd"); - - XS.Mov(XSRegisters.AL, 0xf4); - - XS.Call("mouse_write"); - - XS.Call("mouse_read"); - - #region mouse_read - XS.Label("mouse_read"); - { - XS.Push(XSRegisters.ECX); - - XS.Push(XSRegisters.EDX); - - XS.Mov(XSRegisters.ECX, 0xffff); - - XS.Label("mouse_read_loop"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - - XS.Test(XSRegisters.AL, 1); - - XS.Jump(ConditionalTestEnum.NotZero, "mouse_read_ready"); - - new Loop - { - DestinationLabel = "mouse_read_loop" - }; - - XS.Mov(XSRegisters.AH, 1); - - XS.Jump("mouse_read_exit"); - } - - XS.Label("mouse_read_ready"); - { - XS.Push(XSRegisters.ECX); - - XS.Mov(XSRegisters.ECX, 32); - } - - XS.Label("mouse_read_delay"); - { - new Loop - { - DestinationLabel = "mouse_read_delay" - }; - - XS.Pop(XSRegisters.ECX); - - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x60, - Size = 8 - }; - - XS.Xor(XSRegisters.AH, XSRegisters.RegistersEnum.AH); - } - - XS.Label("mouse_read_exit"); - { - XS.Pop(XSRegisters.EDX); - - XS.Pop(XSRegisters.ECX); - - XS.Return(); - } - } - #endregion - - #region mouse_write - XS.Label("mouse_write"); - { - XS.Push(XSRegisters.ECX); - - XS.Push(XSRegisters.EDX); - - XS.Mov(XSRegisters.BH, XSRegisters.RegistersEnum.AL); - - XS.Mov(XSRegisters.ECX, 0xffff); - - XS.Label("mouse_write_loop1"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - - XS.Test(XSRegisters.AL, 32); - - XS.Jump(ConditionalTestEnum.Zero, "mouse_write_ok1"); - - new Loop - { - DestinationLabel = "mouse_write_loop1" - }; - - XS.Mov(XSRegisters.AH, 1); - - XS.Jump("mouse_write_exit"); - } - - XS.Label("mouse_write_ok1"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x60, - Size = 8 - }; - - XS.Mov(XSRegisters.ECX, 0xffff); - } - - XS.Label("mouse_write_loop"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - - XS.Test(XSRegisters.AL, 2); - - XS.Jump(ConditionalTestEnum.Zero, "mouse_write_ok"); - - new Loop - { - DestinationLabel = "mouse_write_loop" - }; - - XS.Mov(XSRegisters.AH, 1); - - XS.Jump("mouse_write_exit"); - } - - XS.Label("mouse_write_ok"); - { - XS.Mov(XSRegisters.AL, XSRegisters.RegistersEnum.BH); - - new Out2Port - { - DestinationValue = 0x60, - SourceReg = RegistersEnum.AL, - Size = 8 - }; - - XS.Mov(XSRegisters.ECX, 0xffff); - } - - XS.Label("mouse_write_loop3"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - - XS.Test(XSRegisters.AL, 2); - - XS.Jump(ConditionalTestEnum.Zero, "mouse_write_ok3"); - - new Loop - { - DestinationLabel = "mouse_write_loop3" - }; - - XS.Mov(XSRegisters.AH, 1); - - XS.Jump("mouse_write_exit"); - } - - XS.Label("mouse_write_ok3"); - { - XS.Mov(XSRegisters.AH, 0x08); - } - - XS.Label("mouse_write_loop4"); - { - XS.Mov(XSRegisters.ECX, 0xffff); - } - - XS.Label("mouse_write_loop5"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - - XS.Test(XSRegisters.AL, 1); - - XS.Jump(ConditionalTestEnum.NotZero, "mouse_write_ok4"); - - new Loop - { - DestinationLabel = "mouse_write_loop5" - }; - - XS.Dec(XSRegisters.AH); - - XS.Jump(ConditionalTestEnum.NotZero, "mouse_write_loop4"); - } - - XS.Label("mouse_write_ok4"); - { - XS.Xor(XSRegisters.AH, XSRegisters.RegistersEnum.AH); - } - - XS.Label("mouse_write_exit"); - { - XS.Pop(XSRegisters.EDX); - - XS.Pop(XSRegisters.ECX); - - XS.Return(); - } - } - #endregion - - #region send_mouse_cmd - XS.Label("send_mouse_cmd"); - { - - XS.Mov(XSRegisters.ECX, 0xffff); - - XS.Label("mouse_cmd_wait"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - XS.Test(XSRegisters.AL, 2); - XS.Jump(ConditionalTestEnum.Zero, "mouse_cmd_send"); - new Loop - { - DestinationLabel = "mouse_cmd_wait" - }; - XS.Jump("mouse_cmd_error"); - } - - XS.Label("mouse_cmd_send"); - { - XS.Mov(XSRegisters.AL, XSRegisters.RegistersEnum.BL); - new Out2Port - { -#if DebugMouse - SourceValue = 0x64, - DestinationReg = RegistersEnum.AL, -#else - DestinationValue = 0x64, - SourceReg = RegistersEnum.AL, -#endif - Size = 8 - }; - XS.Mov(XSRegisters.ECX, 0xffff); - } - - XS.Label("mouse_cmd_accept"); - { - new In2Port - { - DestinationReg = RegistersEnum.AL, - SourceValue = 0x64, - Size = 8 - }; - XS.Test(XSRegisters.AL, 0x02); - XS.Jump(ConditionalTestEnum.Zero, "mouse_cmd_ok"); - new Loop - { - DestinationLabel = "mouse_cmd_accept" - }; - } - - XS.Label("mouse_cmd_error"); - { - XS.Mov(XSRegisters.AH, 0x01); - XS.Jump("mouse_cmd_exit"); - } - - XS.Label("mouse_cmd_ok"); - { - XS.Xor(XSRegisters.AH, XSRegisters.RegistersEnum.AH); - } - - XS.Label("mouse_cmd_exit"); - { - XS.Return(); - } - } - #endregion - - } - } - #endregion - - private static class InternalMouseEnable - { - public static void EnableMouse() { } - } - - [Plug(Target = typeof(global::Cosmos.Hardware.AsmMouse.InternalMouseEnable))] - private static class InternalMousePlugged - { - [PlugMethod(Assembler = typeof(global::Cosmos.Hardware.AsmMouse.EnableMouseASM))] - public static void EnableMouse() { } - } - - #endregion - - private IOPort p60 = new IOPort(0x60); - private IOPort p64 = new IOPort(0x64); - /// - /// The X location of the mouse. - /// - public int X; - /// - /// The Y location of the mouse. - /// - public int Y; - /// - /// The state the mouse is currently in. - /// - public MouseState Buttons; - - /// - /// This is the required call to start - /// the mouse receiving interrupts. - /// - public void Initialize() - { - AsmMouse.InternalMouseEnable.EnableMouse(); - Cosmos.Core.INTs.SetIrqHandler(12, new INTs.InterruptDelegate(HandleMouse)); - } - - /// - /// The possible states of a mouse. - /// - public enum MouseState - { - /// - /// No button is pressed. - /// - None = 0, - /// - /// The left mouse button is pressed. - /// - Left = 1, - /// - /// The right mouse button is pressed. - /// - Right = 2, - /// - /// The middle mouse button is pressed. - /// - Middle = 4 - } - - private byte mouse_cycle = 0; - private int[] mouse_byte = new int[4]; - - - /// - /// This is the default mouse handling code. - /// - /// - public void HandleMouse(ref INTs.IRQContext context) - { - switch (mouse_cycle) - { - case 0: - mouse_byte[0] = p60.Byte; - - if ((mouse_byte[0] & 0x8) == 0x8) - mouse_cycle++; - - break; - case 1: - mouse_byte[1] = p60.Byte; - mouse_cycle++; - break; - case 2: - mouse_byte[2] = p60.Byte; - mouse_cycle = 0; - - if ((mouse_byte[0] & 0x10) == 0x10) - X -= mouse_byte[1] ^ 0xff; - else - X += mouse_byte[1]; - - if ((mouse_byte[0] & 0x20) == 0x20) - Y += mouse_byte[2] ^ 0xff; - else - Y -= mouse_byte[2]; - - if (X < 0) - X = 0; - else if (X > 319) - X = 319; - - if (Y < 0) - Y = 0; - else if (Y > 199) - Y = 199; - - Buttons = (MouseState)(mouse_byte[0] & 0x7); - - break; - } - } - - } -} - -#endif \ No newline at end of file diff --git a/Users/Orvid/OrvidTestOS/GuessOS.cs b/Users/Orvid/OrvidTestOS/GuessOS.cs deleted file mode 100644 index 604e073e20..0000000000 --- a/Users/Orvid/OrvidTestOS/GuessOS.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using Cosmos.Hardware; -using Orvid.Graphics; - -namespace GuessKernel -{ - public class GuessOS : Sys.Kernel - { - public static int Tick = 0; - public static Monitor s = new Monitor(); - public static Keyboard k = new Keyboard(); - public static Mouse m = new Mouse(); - - public GuessOS() - { - - } - - protected override void BeforeRun() - { - m.Initialize(); - } - - public static uint MouseX - { - get - { - return s.MouseX; - } - set - { - s.MouseX = value; - } - } - - public static uint MouseY - { - get - { - return s.MouseY; - } - set - { - s.MouseY = value; - } - } - - /// - /// This is used to draw a small flashing square in - /// the top right corner of the screen. - /// - private bool OddRefresh = false; - - private bool HadCharPrev = false; - - protected override void Run() - { - Console.WriteLine("This is just a test."); - - Vec2 v; - s.Taskbar.Clear(new Pixel(0,255,0,255)); - - //#region Draw myself a palette reference - //uint i = 0; - //for (uint height = 0; height < 16; height++) - //{ - // for (uint width = 0; width < 16; width++) - // { - // s.Taskbar.SetPixel((width * 4 + 1), (height * 4 + 1), i); - // s.Taskbar.SetPixel((width * 4 + 1), (height * 4 + 2), i); - // s.Taskbar.SetPixel((width * 4 + 1), (height * 4 + 3), i); - // s.Taskbar.SetPixel((width * 4 + 1), (height * 4 + 4), i); - // s.Taskbar.SetPixel((width * 4 + 2), (height * 4 + 1), i); - // s.Taskbar.SetPixel((width * 4 + 2), (height * 4 + 2), i); - // s.Taskbar.SetPixel((width * 4 + 2), (height * 4 + 3), i); - // s.Taskbar.SetPixel((width * 4 + 2), (height * 4 + 4), i); - // s.Taskbar.SetPixel((width * 4 + 3), (height * 4 + 1), i); - // s.Taskbar.SetPixel((width * 4 + 3), (height * 4 + 2), i); - // s.Taskbar.SetPixel((width * 4 + 3), (height * 4 + 3), i); - // s.Taskbar.SetPixel((width * 4 + 3), (height * 4 + 4), i); - // s.Taskbar.SetPixel((width * 4 + 4), (height * 4 + 1), i); - // s.Taskbar.SetPixel((width * 4 + 4), (height * 4 + 2), i); - // s.Taskbar.SetPixel((width * 4 + 4), (height * 4 + 3), i); - // s.Taskbar.SetPixel((width * 4 + 4), (height * 4 + 4), i); - // i++; - // } - //} - //s.Taskbar.SetPixel(1, 1, 255); - //s.Taskbar.SetPixel(1, 2, 255); - //s.Taskbar.SetPixel(1, 3, 255); - //s.Taskbar.SetPixel(1, 4, 255); - //s.Taskbar.SetPixel(2, 1, 255); - //s.Taskbar.SetPixel(2, 2, 255); - //s.Taskbar.SetPixel(2, 3, 255); - //s.Taskbar.SetPixel(2, 4, 255); - //s.Taskbar.SetPixel(3, 1, 255); - //s.Taskbar.SetPixel(3, 2, 255); - //s.Taskbar.SetPixel(3, 3, 255); - //s.Taskbar.SetPixel(3, 4, 255); - //s.Taskbar.SetPixel(4, 1, 255); - //s.Taskbar.SetPixel(4, 2, 255); - //s.Taskbar.SetPixel(4, 3, 255); - //s.Taskbar.SetPixel(4, 4, 255); - //#endregion - - v = new Vec2(150, 100); - s.Taskbar.DrawCircleOutline(v, 10, new Pixel(0, 0, 128, 255)); - - //int i1 = 4; - //int i2 = 9; - //int i3 = 5; - //double i1r = Sqrt(i1); - //double i2r = Sqrt(i2); - //double i3r = Sqrt(i3); - //Cosmos.System.Global.Console.WriteLine("The Square root of 4 is: '" + i1r.ToString() + "'"); - //Cosmos.System.Global.Console.WriteLine("The Square root of 9 is: '" + i2r.ToString() + "'"); - //Cosmos.System.Global.Console.WriteLine("The Square root of 5 is: '" + i3r.ToString() + "'"); - - //Vec2 lp = new Vec2(175, 50); - //Vec2 rp = new Vec2(225, 50); - //Vec2 tp = new Vec2(200, 150); - //s.Taskbar.DrawTriangle(lp, rp, tp, 4); - //lp = new Vec2(185, 50); - //rp = new Vec2(235, 50); - //tp = new Vec2(210, 150); - //s.Taskbar.DrawTriangle(lp, rp, tp, 4); - - //s.Taskbar.DrawPolygon(new Vec2[] { new Vec2(100, 50), new Vec2(150, 50), new Vec2(175, 75), new Vec2(175, 125), new Vec2(150, 150), new Vec2(100, 150), new Vec2(75, 125), new Vec2(75, 75) }, (uint)4); - - while (true) - { - Console.WriteLine("This is just a test."); - Tick++; - MouseX = (uint)m.X; - MouseY = (uint)m.Y; - //m.HandleMouse(); - - if (OddRefresh) - { - s.Taskbar.SetPixel(312, 4, Colors.Black); - s.Taskbar.SetPixel(313, 4, Colors.Black); - s.Taskbar.SetPixel(312, 5, Colors.Black); - s.Taskbar.SetPixel(313, 5, Colors.Black); - OddRefresh = false; - } - else - { - s.Taskbar.SetPixel(312, 4, new Pixel(0,255,0,255)); - s.Taskbar.SetPixel(313, 4, new Pixel(0,255,0,255)); - s.Taskbar.SetPixel(312, 5, new Pixel(0,255,0,255)); - s.Taskbar.SetPixel(313, 5, new Pixel(0,255,0,255)); - OddRefresh = true; - } - - - //OButton b = new OButton(); - //b.Color = 31; - //b.Location = new Vec2(150, 100); - //b.Size = new Vec2(75, 20); - //b.Draw(); - - char c; - if (k.GetChar(out c)) - { - v = new Vec2(150, 100); - s.Taskbar.DrawCircleOutline(v, 20, new Pixel(255, 0, 0, 255)); - ProcessKeyboard(c); - HadCharPrev = true; - } - else if (HadCharPrev) - { - v = new Vec2(150, 100); - s.Taskbar.DrawCircleOutline(v, 20, new Pixel(0, 255, 0, 255)); - HadCharPrev = false; - } - chrsProcd = 0; - - if (m.Buttons != Mouse.MouseState.None) - { - v = new Vec2(150, 100); - s.Taskbar.DrawCircleOutline(v, 30, new Pixel(255, 0, 0, 255)); - } - else - { - v = new Vec2(150, 100); - s.Taskbar.DrawCircleOutline(v, 30, new Pixel(0, 255, 0, 255)); - } - - //for (uint height = 0; height < s.s.PixelHeight; height++) - // for (uint width = 0; width < s.s.PixelWidth; width++) - // s.SetPixel(height, width, (byte)(width + height)); - - //s.DrawPolygon(new Vec2[] { new Vec2(100, 50), new Vec2(150, 50), new Vec2(175, 75), new Vec2(175, 125), new Vec2(150, 150), new Vec2(100, 150), new Vec2(75, 125), new Vec2(75, 75) }, (uint)4); - //s.DrawPolygonOutline(new Vec2[] { new Vec2(400, 50), new Vec2(450, 50), new Vec2(475, 75), new Vec2(475, 125), new Vec2(450, 150), new Vec2(400, 150), new Vec2(375, 125), new Vec2(375, 75) }, (uint)4); - //s.DrawTriangle(new Vec2(75,100), new Vec2(75,75), new Vec2(25,100), (uint)216); - //v = new Vec2(100, 100); - //s.Taskbar.DrawCircle(v, 20, (uint)16); - //s.DrawCircleOutline(new Vec2(150, 100), 20, (uint)8); - //s.DrawCircleOutline(new Vec2(Mouse.X, Mouse.Y), 15, (uint)16); - //s.Taskbar.DrawElipticalArc(v, 30, 10, 10, 300, (uint)90); - //s.Taskbar.DrawReverseRectangle(new Vec2(120, 80), new Vec2(80, 140), (uint)238); - - - - //s.DrawLine(new Vec2(30, 30), new Vec2(80, 80), 9); - //s.DrawElipse(new Vec2(150, 50), 10, 10, 8); - - - // And finally, update the screen - s.Update(); - } - } - - #region Process keyboard - private int chrsProcd = 0; - private void ProcessKeyboard(char c) - { - - if (c == 72 || c == 'w') // Up arrow - { - if (MouseY > 0) - { - MouseY--; - // The following can be used to create - // the appearance that the mouse is in - // multiple places at once. - - //DrawCursor(); - } - } - else if (c == 80 || c == 's') // Down arrow - { - if (MouseY < s.Height - 4) - { - MouseY++; - //DrawCursor(); - } - } - else if (c == 75 || c == 'a') // Left arrow - { - if (MouseX > 0) - { - MouseX--; - //DrawCursor(); - } - } - else if (c == 77 || c == 'd') // Right arrow - { - if (MouseX < s.Width - 4) - { - MouseX++; - //DrawCursor(); - } - } - - // The following allows for processing multiple - // characters per tick. - if (chrsProcd < 7) - { - char c2; - if (k.GetChar(out c2)) - { - chrsProcd++; - ProcessKeyboard(c2); - } - } - } - #endregion - } -} \ No newline at end of file diff --git a/Users/Orvid/OrvidTestOS/Mouse.cs b/Users/Orvid/OrvidTestOS/Mouse.cs deleted file mode 100644 index 14d2b481e0..0000000000 --- a/Users/Orvid/OrvidTestOS/Mouse.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using CPUBus = Cosmos.Core_Plugs.IOPortImpl; -using Cosmos.Core; -using GuessKernel; -//using Cosmos.Kernel; - -namespace Cosmos.Hardware -{ - /// - /// This class describes the mouse. - /// - public class Mouse - { - private Cosmos.Core.IOGroup.Mouse g = new Core.IOGroup.Mouse(); - - /// - /// The X location of the mouse. - /// - public uint X; - /// - /// The Y location of the mouse. - /// - public uint Y; - /// - /// The state the mouse is currently in. - /// - public MouseState Buttons; - - /// - /// This is the required call to start - /// the mouse receiving interrupts. - /// - public void Initialize() - { - Cosmos.Core_Plugs.IOPortImpl.Read8(0X60); - g.p60.Byte = 0x20; - byte statusByte = Read(); - byte modstatusByte = (byte)(((statusByte >> 2) << 1) + 1); // Enable status byte 2 - byte final = (byte)(((modstatusByte >> 5) << 1) + ((modstatusByte << 4) >> 4)); // Disable status byte 5 - g.p60.Byte = 0x60; - Write(final); - - - //Enable the auxiliary mouse device - WaitSignal(); - g.p64.Byte = 0xA8; - - //Tell the mouse to use default settings - Write(0xF6); - Read(); //Acknowledge - - //Set Remote Mode - Write(0xF0); - Read(); //Acknowledge - - - ////Enable the auxiliary mouse device - //WaitSignal(); - //g.p64.Byte = 0xA8; - - ////// enable interrupt - //WaitSignal(); - //g.p64.Byte = 0x20; - //WaitData(); - //byte tmpst = g.p60.Byte; - //tmpst = (byte)(((tmpst >> 2) << 1) + 1); - //byte status = (byte)(((tmpst >> 5) << 1) + ((byte)(tmpst << 4) >> 4)); - ////byte status = (byte)(g.p60.Byte | 2); - //WaitSignal(); - //g.p64.Byte = 0x60; - //WaitSignal(); - //g.p60.Byte = status; - - ////Tell the mouse to use default settings - //Write(0xF6); - //Read(); //Acknowledge - - ////Set Remote Mode - //Write(0xF0); - //Read(); //Acknowledge - } - - private byte Read() - { - WaitData(); - return g.p60.Byte; - } - - private void Write(byte b) - { - //Wait to be able to send a command - WaitSignal(); - //Tell the mouse we are sending a command - g.p64.Byte = 0xD4; - //Wait for the final part - WaitSignal(); - //Finally write - g.p60.Byte = b; - } - - public bool TimedOut = false; - public bool TimedOut2 = false; - public bool TimedOut3 = false; - public bool TimedOut4 = false; - public bool TimedOut5 = false; - - private void WaitData() - { - for (int i = 0; i < 100000 && ((g.p64.Byte & 1) != 1); i++) - { - if (i == 99999) - { - if (!TimedOut) - TimedOut = true; - else if (!TimedOut2) - TimedOut2 = true; - else if (!TimedOut3) - TimedOut3 = true; - else if (!TimedOut4) - TimedOut3 = true; - else if (!TimedOut5) - TimedOut3 = true; - } - } - } - - private void WaitSignal() - { - for (int i = 0; i < 100000 && ((g.p64.Byte & 2) != 0); i++) - { - } - } - - /// - /// The possible states of a mouse. - /// - public enum MouseState - { - /// - /// No button is pressed. - /// - None = 0, - /// - /// The left mouse button is pressed. - /// - Left = 1, - /// - /// The right mouse button is pressed. - /// - Right = 2, - /// - /// The middle mouse button is pressed. - /// - Middle = 4 - } - - private byte[] mouse_byte = new byte[4]; - - public void HandleMouse() - { - Write(0xEB); - uint i = Read(); - if (i != 0xFA) // this means it didn't respond with an acknowledge - { - if (i == 0xFE) // The mouse send back 'Resend' - TimedOut4 = true; - else - { - TimedOut3 = true; - } - } - else - { - TimedOut4 = false; - - #region Read Bytes - mouse_byte[0] = Read(); - mouse_byte[1] = Read(); - mouse_byte[2] = Read(); - #endregion - - #region Process Bytes - X += mouse_byte[1]; - Y += mouse_byte[2]; - - - if (X < 0) - { - X = 0; - } - else if (X > 319) - { - X = 319; - } - - if (Y < 0) - { - Y = 0; - } - else if (Y > 199) - { - Y = 199; - } - - if ((mouse_byte[0] & 1) == 1) - { - Buttons = MouseState.Left; - } - else if ((mouse_byte[0] & 2) == 1) - { - Buttons = MouseState.Right; - } - else if ((mouse_byte[0] & 3) == 1) - { - Buttons = MouseState.Middle; - } - #endregion - - //Console.WriteLine("X: " + X + " Y: " + Y); - if (GuessOS.MouseX != X || GuessOS.MouseY != Y) - { - GuessOS.MouseX = X; - GuessOS.MouseY = Y; - Cosmos.System.Global.Console.WriteLine("X: " + X + " Y: " + Y); - } - } - } - } -} diff --git a/Users/Orvid/OrvidTestOS/OrvidKernel.csproj b/Users/Orvid/OrvidTestOS/OrvidKernel.csproj deleted file mode 100644 index 7b1dfc47aa..0000000000 --- a/Users/Orvid/OrvidTestOS/OrvidKernel.csproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {2E14EED0-F7E9-4E7C-AA21-6E519C28457D} - Library - Properties - GuessKernel - OrvidKernel - v4.7.1 - 512 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - IL2CPU.API - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {D9A87AAD-FCC9-4517-B31D-E904DAD00784} - Cosmos.Core_Plugs - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.Hardware - - - {167D46D2-F0F2-4F59-BA0F-2452941E0450} - Orvid.Graphics.Cosmos - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - diff --git a/Users/Orvid/OrvidTestOS/OrvidTest.Cosmos b/Users/Orvid/OrvidTestOS/OrvidTest.Cosmos deleted file mode 100644 index 5bd7163d68..0000000000 --- a/Users/Orvid/OrvidTestOS/OrvidTest.Cosmos +++ /dev/null @@ -1,72 +0,0 @@ - - - - Debug - 2.0 - {02c67056-795c-4dfe-be83-989e6a16dee3} - false - OrvidTest - elf - OrvidTest - - - true - bin\Debug\ - MicrosoftNET - False - False - None - User - VMWare - Workstation - False - All - D:\Documents and Settings\Orvid\Desktop\Cosmos\Trunk\source2\Users\Orvid\StructTest\bin\Debug\StructTest.obj - - - true - bin\Debug\ - MicrosoftNET - False - False - None - User - VMWare - Workstation - false - - - - Orvid.Graphics.Cosmos - {167d46d2-f0f2-4f59-ba0f-2452941e0450} - True - - - Orvid.Graphics - {c9e995cf-cb65-4410-a7d2-63ebbe02aabb} - True - - - OrvidKernel - {2e14eed0-f7e9-4e7c-aa21-6e519c28457d} - True - - - - - Cosmos.Core_Plugs - Cosmos.Core_Plugs.dll - ..\..\..\..\..\..\Users\Orvid\AppData\Roaming\Cosmos User Kit\Kernel\Cosmos.Core_Plugs.dll - True - - - Cosmos.System_Plugs - Cosmos.System_Plugs.dll - ..\..\..\..\..\..\Users\Orvid\AppData\Roaming\Cosmos User Kit\Kernel\Cosmos.System_Plugs.dll - True - - - - - - \ No newline at end of file diff --git a/Users/Orvid/OrvidTestOS/Plugs.cs b/Users/Orvid/OrvidTestOS/Plugs.cs deleted file mode 100644 index e6e0b11a84..0000000000 --- a/Users/Orvid/OrvidTestOS/Plugs.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using IL2CPU.API; - -namespace GuessKernel -{ - [Plug(Target = typeof(global::System.Environment))] - class EnvironmentImpl - { - public static int TickCount - { - get - { - return GuessOS.Tick; - } - } - } -} diff --git a/Users/Orvid/OrvidTestOS/Properties/AssemblyInfo.cs b/Users/Orvid/OrvidTestOS/Properties/AssemblyInfo.cs deleted file mode 100644 index ebb4d96406..0000000000 --- a/Users/Orvid/OrvidTestOS/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("OrvidKernel")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("OrvidKernel")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("fda525fd-911e-4afc-9396-46e48d2cc477")] - -// 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/Users/Orvid/OrvidTestOS/VGAScreenExtra.cs b/Users/Orvid/OrvidTestOS/VGAScreenExtra.cs deleted file mode 100644 index 1b3e931fb0..0000000000 --- a/Users/Orvid/OrvidTestOS/VGAScreenExtra.cs +++ /dev/null @@ -1,500 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware; -using Orvid.Graphics; - -namespace GuessKernel -{ - public class VGAScreenExtra - { - #region InternalVGAScreen - internal class InternalVGAScreen - { - private const byte NumSeqRegs = 5; - private const byte NumCRTCRegs = 25; - private const byte NumGCRegs = 9; - private const byte NumACRegs = 21; - internal readonly Cosmos.Core.IOGroup.VGA mIO = new Cosmos.Core.IOGroup.VGA(); - public int Height { private set; get; } - public int Width { private set; get; } - public int Colors { private set; get; } - - public void Clear(int color) - { - for (uint i = 0; i < Height * Width; i++) - { - mIO.VGAMemoryBlock[i] = (byte)(color & 0xFF); - } - } - - #region WriteVGARegisters - private void WriteVGARegisters(byte[] registers) - { - int xIdx = 0; - byte i; - - /* write MISCELLANEOUS reg */ - mIO.MiscellaneousOutput_Write.Byte = registers[xIdx]; - xIdx++; - /* write SEQUENCER regs */ - for (i = 0; i < NumSeqRegs; i++) - { - mIO.Sequencer_Index.Byte = i; - mIO.Sequencer_Data.Byte = registers[xIdx]; - xIdx++; - } - /* unlock CRTC registers */ - mIO.CRTController_Index.Byte = 0x03; - mIO.CRTController_Data.Byte = (byte)(mIO.CRTController_Data.Byte | 0x80); - mIO.CRTController_Index.Byte = 0x11; - mIO.CRTController_Data.Byte = (byte)(mIO.CRTController_Data.Byte & 0x7F); - - /* make sure they remain unlocked */ - registers[0x03] |= 0x80; - registers[0x11] &= 0x7f; - - /* write CRTC regs */ - for (i = 0; i < NumCRTCRegs; i++) - { - mIO.CRTController_Index.Byte = i; - mIO.CRTController_Data.Byte = registers[xIdx]; - xIdx++; - } - /* write GRAPHICS CONTROLLER regs */ - for (i = 0; i < NumGCRegs; i++) - { - mIO.GraphicsController_Index.Byte = i; - mIO.GraphicsController_Data.Byte = registers[xIdx]; - xIdx++; - } - /* write ATTRIBUTE CONTROLLER regs */ - for (i = 0; i < NumACRegs; i++) - { - var xDoSomething = mIO.Instat_Read.Byte; - mIO.AttributeController_Index.Byte = i; - mIO.AttributeController_Write.Byte = registers[xIdx]; - xIdx++; - } - /* lock 16-color palette and unblank display */ - var xNothing = mIO.Instat_Read.Byte; - mIO.AttributeController_Index.Byte = 0x20; - } - #endregion - - #region 320x200x8 - public void SetMode320x200x8() - { - WriteVGARegisters(g_320x200x256); - Height = 200; - Width = 320; - Colors = 256; - } - - private static byte[] g_320x200x256 = new byte[] - { - /* MISC */ - 0x63, - /* SEQ */ - 0x03, 0x01, 0x0F, 0x00, 0x0E, - /* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, - 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, - 0xFF, - /* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, - 0xFF, - /* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x41, 0x00, 0x0F, 0x00, 0x00 - }; - #endregion - - #region Palette Operations - public void SetPaletteEntry(int index, System.Drawing.Color color) - { - SetPaletteEntry(index, color.R, color.G, color.B); - } - - public void SetPalette(int index, byte[] pallete) - { - mIO.DACIndex_Write.Byte = (byte)index; - for (int i = 0; i < pallete.Length; i++) - mIO.DAC_Data.Byte = (byte)(pallete[i] >> 2); - } - - public void SetPaletteEntry(int index, byte r, byte g, byte b) - { - mIO.DACIndex_Write.Byte = (byte)index; - mIO.DAC_Data.Byte = (byte)(r >> 2); - mIO.DAC_Data.Byte = (byte)(g >> 2); - mIO.DAC_Data.Byte = (byte)(b >> 2); - } - #endregion - - } - #endregion - - internal InternalVGAScreen s = new InternalVGAScreen(); - public Image BackBuffer = new Image(320, 200); - private Monitor m = new Monitor(320, 200); - - public void Update() - { - //for (int i = 0; i < BackBuffer.Modified.Count; i++) - //{ - // Vec2 v = BackBuffer.Modified[i]; - // uint color = BackBuffer.GetPixel((uint)v.X, (uint)v.Y); - // mIO.VGAMemoryBlock[(uint)(v.Y * 320) + (uint)v.X] = (byte)(BackBuffer.Data[((v.Y * BackBuffer.Width) + v.X)] & 0xFF); - //} - DrawCursor(); - m.CurrentDriver.Update(BackBuffer); - // Now we need to restore what was behind the mouse. - Vec2 v = new Vec2((int)GuessOS.MouseX, (int)GuessOS.MouseY); - DrawImage(v, behindMouseImage); - } - - #region DrawCursor - /// - /// This image contains everything that is behind the mouse. - /// - private Image behindMouseImage = new Image(4, 4); // This means max mouse size is 4x4 - private Image Mouse = new Image(4, 4); - private void DrawCursor() - { - #region SaveBehindMouse - behindMouseImage.SetPixel(0, 0, BackBuffer.GetPixel(GuessOS.MouseX, GuessOS.MouseY)); - behindMouseImage.SetPixel(1, 0, BackBuffer.GetPixel(GuessOS.MouseX + 1, GuessOS.MouseY)); - behindMouseImage.SetPixel(2, 0, BackBuffer.GetPixel(GuessOS.MouseX + 2, GuessOS.MouseY)); - behindMouseImage.SetPixel(3, 0, BackBuffer.GetPixel(GuessOS.MouseX + 3, GuessOS.MouseY)); - behindMouseImage.SetPixel(0, 1, BackBuffer.GetPixel(GuessOS.MouseX, GuessOS.MouseY + 1)); - behindMouseImage.SetPixel(1, 1, BackBuffer.GetPixel(GuessOS.MouseX + 1, GuessOS.MouseY + 1)); - behindMouseImage.SetPixel(2, 1, BackBuffer.GetPixel(GuessOS.MouseX + 2, GuessOS.MouseY + 1)); - behindMouseImage.SetPixel(3, 1, BackBuffer.GetPixel(GuessOS.MouseX + 3, GuessOS.MouseY + 1)); - behindMouseImage.SetPixel(0, 2, BackBuffer.GetPixel(GuessOS.MouseX, GuessOS.MouseY + 2)); - behindMouseImage.SetPixel(1, 2, BackBuffer.GetPixel(GuessOS.MouseX + 1, GuessOS.MouseY + 2)); - behindMouseImage.SetPixel(2, 2, BackBuffer.GetPixel(GuessOS.MouseX + 2, GuessOS.MouseY + 2)); - behindMouseImage.SetPixel(3, 2, BackBuffer.GetPixel(GuessOS.MouseX + 3, GuessOS.MouseY + 2)); - behindMouseImage.SetPixel(0, 3, BackBuffer.GetPixel(GuessOS.MouseX, GuessOS.MouseY + 3)); - behindMouseImage.SetPixel(1, 3, BackBuffer.GetPixel(GuessOS.MouseX + 1, GuessOS.MouseY + 3)); - behindMouseImage.SetPixel(2, 3, BackBuffer.GetPixel(GuessOS.MouseX + 2, GuessOS.MouseY + 3)); - behindMouseImage.SetPixel(3, 3, BackBuffer.GetPixel(GuessOS.MouseX + 3, GuessOS.MouseY + 3)); - #endregion - - #region Draw Mouse - Vec2 v = new Vec2((int)GuessOS.MouseX, (int)GuessOS.MouseY); - DrawImage(v, Mouse); - #endregion - } - #endregion - - public VGAScreenExtra() - { - s.Clear(1); - - - // Now we need to setup the mouse - // The color 255 is black, and 1 is white. - Mouse.SetPixel(0, 0, 255); - Mouse.SetPixel(1, 0, 255); - Mouse.SetPixel(2, 0, 255); - Mouse.SetPixel(3, 0, 255); - Mouse.SetPixel(0, 1, 255); - Mouse.SetPixel(1, 1, 1); - Mouse.SetPixel(2, 1, 1); - Mouse.SetPixel(3, 1, 255); - Mouse.SetPixel(0, 2, 255); - Mouse.SetPixel(1, 2, 1); - Mouse.SetPixel(2, 2, 1); - Mouse.SetPixel(3, 2, 255); - Mouse.SetPixel(0, 3, 255); - Mouse.SetPixel(1, 3, 255); - Mouse.SetPixel(2, 3, 255); - Mouse.SetPixel(3, 3, 255); - - //this.DrawCircleOutline(new Vec2(150, 100), 20, 8); - //this.DrawTriangle(new Vec2(50, 50), new Vec2(150,50), new Vec2(100,150), 8); - } - - public void SetPixel(uint x, uint y, uint c) - { - BackBuffer.SetPixel(x, y, c); - } - - public void GetPixel(uint x, uint y) - { - BackBuffer.GetPixel(x, y); - } - - public void Clear(uint c) - { - BackBuffer.Clear(c); - } - - //public void WriteToConsole(string s) - //{ - // BackBuffer.WriteToConsole(s); - //} - - #region DrawPolygon - /// - /// Draws a polygon with the specified points. - /// - /// The points of the polygon. - /// The color to draw in. - public void DrawPolygon(Vec2[] points, uint color) - { - BackBuffer.DrawPolygon(points, color); - } - #endregion - - #region DrawPolygonOutline - /// - /// Draws the outline of a polygon. - /// The last point connects to the first point. - /// - /// An array containing the points to draw. - /// The color to draw in. - public void DrawPolygonOutline(Vec2[] points, uint color) - { - BackBuffer.DrawPolygonOutline(points, color); - } - #endregion - - #region DrawImage - /// - /// Draws the specified image, at the specified point. - /// - /// - /// - public void DrawImage(Vec2 loc, Image i) - { - BackBuffer.DrawImage(loc, i); - } - #endregion - - #region DrawTriangle - /// - /// Draws a triangle and fills it in. - /// - /// The first point of the triangle. - /// The second point of the triangle. - /// The third point of the triangle. - /// The color to draw in. - public void DrawTriangle(Vec2 p1, Vec2 p2, Vec2 p3, uint color) - { - BackBuffer.DrawTriangle(p1, p2, p3, color); - } - - /// - /// Draws a triangle with the specified fill color, and the specified border color. - /// - /// The first point. - /// The second point. - /// The third point. - /// The color to fill the tirangle with. - /// The color to draw the border of the triangle. - public void DrawTriangle(Vec2 p1, Vec2 p2, Vec2 p3, uint FillColor, uint BorderColor) - { - BackBuffer.DrawTriangle(p1, p2, p3, FillColor); - BackBuffer.DrawTriangleOutline(p1, p2, p3, BorderColor); - } - #endregion - - #region DrawTriangleOutline - /// - /// Draw a triangle's outline. - /// - /// The first point of the triangle. - /// The second point of the triangle. - /// The third point of the triangle. - /// The color to draw in. - public void DrawTriangleOutline(Vec2 p1, Vec2 p2, Vec2 p3, uint color) - { - BackBuffer.DrawLines(new Vec2[] { p1, p2, p3, p1 }, color); - } - #endregion - - #region DrawElipse - /// - /// Draws and fills an elipse. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to draw in. - public void DrawElipse(Vec2 CenterPoint, int height, int width, uint color) - { - BackBuffer.DrawElipse(CenterPoint, height, width, color); - } - - /// - /// Draws and fills an elipse. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to fill in. - /// The color to draw the border in. - public void DrawElipse(Vec2 CenterPoint, int height, int width, uint fillColor, uint borderColor) - { - BackBuffer.DrawElipse(CenterPoint, height, width, fillColor); - BackBuffer.DrawElipseOutline(CenterPoint, height, width, borderColor); - } - #endregion - - #region DrawElipseOutline - /// - /// Draws an elipse outline. - /// - /// The center of the elipse - /// The height of the elipse. - /// The width of the elipse. - /// The color to draw in. - public void DrawElipseOutline(Vec2 CenterPoint, int height, int width, uint color) - { - BackBuffer.DrawElipticalArc(CenterPoint, height, width, 0, 360, color); - } - #endregion - - #region DrawElipticalArc - /// - /// Draws an eliptical arc. - /// - /// The center-point of the elipse to use. - /// The height of the elipse to use. - /// The width of the elipse to use. - /// The angle to start drawing at. - /// The angle to stop drawing at. - /// The color to draw in. - public void DrawElipticalArc(Vec2 CenterPoint, int height, int width, int startAngle, int endAngle, uint color) - { - BackBuffer.DrawElipticalArc(CenterPoint, height, width, startAngle, endAngle, color); - } - #endregion - - #region DrawCircle - /// - /// Draws a filled circle. - /// - /// The center of the circle. - /// The radius of the circle. - /// The color to draw in. - public void DrawCircle(Vec2 Center, int radius, uint color) - { - BackBuffer.DrawCircle(Center, radius, color); - } - #endregion - - #region DrawCircleOutline - /// - /// Draws the outline of a circle. - /// - /// The center of the circle. - /// The radius of the circle. - /// The color to draw with. - public void DrawCircleOutline(Vec2 Center, int radius, uint color) - { - BackBuffer.DrawCircleOutline(Center, radius, color); - } - #endregion - - #region DrawLine - /// - /// Draws a line between 2 points. - /// - /// The first point. - /// The first point. - /// The color to draw. - public void DrawLine(Vec2 Point1, Vec2 Point2, uint color) - { - BackBuffer.DrawLine(Point1, Point2, color); - } - #endregion - - #region DrawLines - /// - /// Draws a set of connected lines. - /// - /// - /// An array of points to draw, in the order they need drawing. - /// - /// The color to draw. - public void DrawLines(Vec2[] Points, uint color) - { - BackBuffer.DrawLines(Points, color); - } - #endregion - - #region DrawRectangle - /// - /// Draws a rectangle with the specified points. - /// - /// The first point. - /// The second point. - /// The third point. - /// The fourth point. - /// The color to fill in the rectangle with. - /// The color to draw the border in. - public void DrawRectangle(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, uint FillColor, uint BorderColor) - { - BackBuffer.DrawPolygon(new Vec2[] { p1, p2, p3, p4 }, FillColor); - BackBuffer.DrawPolygonOutline(new Vec2[] { p1, p2, p3, p4 }, BorderColor); - } - - /// - /// Draws a rectangle with the specified points. - /// - /// The first point. - /// The second point. - /// The third point. - /// The fourth point. - /// The color to draw in. - public void DrawRectangle(Vec2 p1, Vec2 p2, Vec2 p3, Vec2 p4, uint color) - { - BackBuffer.DrawPolygon(new Vec2[] { p1, p2, p3, p4 }, color); - } - - /// - /// This method fills in the space between - /// the 2 points specified in a rectangle. - /// - /// - /// The point that specifies the top left - /// corner of the rectangle being drawn. - /// - /// - /// The point that specifies the bottom right - /// corner of the rectangle being drawn. - /// - /// The color to draw. - public void DrawRectangle(Vec2 TopLeftCorner, Vec2 BottomRightCorner, uint color) - { - BackBuffer.DrawRectangle(TopLeftCorner, new Vec2(BottomRightCorner.X, TopLeftCorner.Y), BottomRightCorner, new Vec2(TopLeftCorner.X, BottomRightCorner.Y), color); - } - #endregion - - #region DrawReverseRectangle - /// - /// This method fills in the space between - /// the 2 points specified in a rectangle. - /// - /// - /// The point that specifies the top right - /// corner of the rectangle being drawn. - /// - /// - /// The point that specifies the bottom left - /// corner of the rectangle being drawn. - /// - /// The color to draw. - public void ReverseDrawRectangle(Vec2 TopRightCorner, Vec2 BottomLeftCorner, uint color) - { - BackBuffer.DrawRectangle(new Vec2(BottomLeftCorner.X, TopRightCorner.Y), TopRightCorner, new Vec2(TopRightCorner.X, BottomLeftCorner.Y), BottomLeftCorner, color); - } - #endregion - - } -} diff --git a/Users/Orvid/OtherStuff/ONLIntegration.patch b/Users/Orvid/OtherStuff/ONLIntegration.patch deleted file mode 100644 index 6b4d6cc778..0000000000 --- a/Users/Orvid/OtherStuff/ONLIntegration.patch +++ /dev/null @@ -1,769 +0,0 @@ -Index: Setup2/Cosmos.iss -=================================================================== ---- Setup2/Cosmos.iss (revision 79470) -+++ Setup2/Cosmos.iss (working copy) -@@ -236,6 +236,13 @@ - Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{3b72bb68-7363-45a2-9eba-55c8d5f36e36}; ValueType: string; ValueName: Class; ValueData: Cosmos.VS.Package.VMPage - Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{3b72bb68-7363-45a2-9eba-55c8d5f36e36}; ValueType: string; ValueName: CodeBase; ValueData: {app}\build\vsip\cosmos.vs.package.dll - Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{3b72bb68-7363-45a2-9eba-55c8d5f36e36}; ValueType: string; ValueName: ThreadingModel; ValueData: Both -+; ExternalLibs configuration page -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: none; Flags: uninsdeletekey -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: string; ValueName: ; ValueData: Cosmos.VS.Package.ExternalLibPage -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: string; ValueName: InprocServer32; ValueData: {sys}\MSCOREE.DLL -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: string; ValueName: Class; ValueData: Cosmos.VS.Package.ExternalLibPage -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: string; ValueName: CodeBase; ValueData: {app}\build\vsip\cosmos.vs.package.dll -+Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\CLSID\{{6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8}; ValueType: string; ValueName: ThreadingModel; ValueData: Both - - ; project type factory - Root: HKLM; SubKey: Software\Microsoft\VisualStudio\10.0\Projects\{{471ec4bb-e47e-4229-a789-d1f5f83b52d4}; ValueType: none; Flags: uninsdeletekey -Index: source2/Build/Cosmos.Build.Common/Cosmos.Build.Common.csproj -=================================================================== ---- source2/Build/Cosmos.Build.Common/Cosmos.Build.Common.csproj (revision 79470) -+++ source2/Build/Cosmos.Build.Common/Cosmos.Build.Common.csproj (working copy) -@@ -73,6 +73,7 @@ - - - -+ - - - -Index: source2/Build/Cosmos.Build.MSBuild/Cosmos.targets -=================================================================== ---- source2/Build/Cosmos.Build.MSBuild/Cosmos.targets (revision 79470) -+++ source2/Build/Cosmos.Build.MSBuild/Cosmos.targets (working copy) -@@ -47,6 +47,7 @@ - - - - ConfigurationBase.cs - -+ -+ UserControl -+ -+ -+ ExteralLibPage.cs -+ - - UserControl - -@@ -157,6 +163,9 @@ - - - -+ -+ ExteralLibPage.cs -+ - - true - -@@ -234,9 +243,9 @@ - - Templates\Projects\CosmosProject %28C#%29 - -- -- Templates\Projects\CosmosProject %28C#%29 -- -+ -+ Templates\Projects\CosmosProject %28C#%29 -+ - - Templates\Projects\Cosmos - -@@ -246,27 +255,27 @@ - - Templates\Projects\Cosmos - -- -- Templates\Projects\CosmosProject %28C#%29 -- -- -- Templates\Projects\CosmosProject %28C#%29 -- -- -- Templates\Projects\CosmosProject %28F#%29 -- -- -- Templates\Projects\CosmosProject %28F#%29 -- -- -- Templates\Projects\CosmosProject %28F#%29 -- -- -- Templates\Projects\CosmosProject %28F#%29 -- -- -- Templates\Projects\CosmosProject %28F#%29 -- -+ -+ Templates\Projects\CosmosProject %28C#%29 -+ -+ -+ Templates\Projects\CosmosProject %28C#%29 -+ -+ -+ Templates\Projects\CosmosProject %28F#%29 -+ -+ -+ Templates\Projects\CosmosProject %28F#%29 -+ -+ -+ Templates\Projects\CosmosProject %28F#%29 -+ -+ -+ Templates\Projects\CosmosProject %28F#%29 -+ -+ -+ Templates\Projects\CosmosProject %28F#%29 -+ - - BuildPage.cs - -Index: source2/VSIP/Cosmos.VS.Package/DebugPage.Designer.cs -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/DebugPage.Designer.cs (revision 79470) -+++ source2/VSIP/Cosmos.VS.Package/DebugPage.Designer.cs (working copy) -@@ -33,10 +33,8 @@ - // - // panelSubPage - // -- this.panelSubPage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) -- | System.Windows.Forms.AnchorStyles.Left) -- | System.Windows.Forms.AnchorStyles.Right))); - this.panelSubPage.AutoScroll = true; -+ this.panelSubPage.Dock = System.Windows.Forms.DockStyle.Fill; - this.panelSubPage.Location = new System.Drawing.Point(0, 41); - this.panelSubPage.Margin = new System.Windows.Forms.Padding(0); - this.panelSubPage.Name = "panelSubPage"; -@@ -50,7 +48,7 @@ - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.panelSubPage); - this.Controls.Add(this.labelNoConfig); -- this.Font = new System.Drawing.Font("Segoe UI", 8.25F); -+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F); - this.Name = "DebugPage"; - this.Title = "Debug"; - this.Controls.SetChildIndex(this.labelNoConfig, 0); -Index: source2/VSIP/Cosmos.VS.Package/DebugPage.resx -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/DebugPage.resx (revision 79470) -+++ source2/VSIP/Cosmos.VS.Package/DebugPage.resx (working copy) -@@ -112,9 +112,9 @@ - 2.0 - - -- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 -+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - -- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 -+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - -\ No newline at end of file -Index: source2/VSIP/Cosmos.VS.Package/ExteralLibPage.cs -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/ExteralLibPage.cs (revision 0) -+++ source2/VSIP/Cosmos.VS.Package/ExteralLibPage.cs (revision 0) -@@ -0,0 +1,156 @@ -+using System; -+using System.Collections.Generic; -+using System.ComponentModel; -+using System.Drawing; -+using System.Data; -+using System.Text; -+using System.Windows.Forms; -+using Cosmos.Build.Common; -+ -+namespace Cosmos.VS.Package -+{ -+ public partial class ExternalLibPage : CustomPropertyPage -+ { -+ List ExternalLibraries = new List(); -+ -+ public ExternalLibPage() -+ { -+ InitializeComponent(); -+ } -+ -+ protected ExternalLibsProperties mProps = new ExternalLibsProperties(); -+ public override PropertiesBase Properties -+ { -+ get { return mProps; } -+ } -+ -+ private List ConvertToList(String str) -+ { -+ if (str != null && str != "" && str != "\r\n" && str != "\r" && str != "\n") -+ { -+ return new List(str.Split("~~~~~~".ToCharArray())); -+ } -+ else -+ { -+ return new List(); -+ } -+ } -+ -+ private String ConvertFromList(List lst) -+ { -+ string externalLibsForArgs = ""; -+ bool first = true; -+ foreach (string s in lst) -+ { -+ if (!first) -+ { -+ externalLibsForArgs += "~~~~~~"; // That's 6 of them, this separates the libs. -+ } -+ externalLibsForArgs += s; -+ } -+ return externalLibsForArgs; -+ } -+ -+ protected override void FillProperties() -+ { -+ base.FillProperties(); -+ mProps.Reset(); -+ -+ mProps.SetProperty("ExternalLibsForArgs", GetConfigProperty("ExternalLibsForArgs")); -+ ExternalLibraries = ConvertToList(mProps.ExternalLibraries); -+ foreach (string s in ExternalLibraries) -+ { -+ ExternalLibsListBox.Items.Add(s); -+ } -+ } -+ -+ #region Relative Path -+ private string GetRelativePath(string fullPath) -+ { -+ string fromDirectory = Project.FullName.Substring(0, (Project.FullName.Length - Project.FileName.Length)); -+ -+ if (fullPath == null) -+ throw new ArgumentNullException("fullPath"); -+ -+ bool isRooted = (System.IO.Path.IsPathRooted(fromDirectory) && System.IO.Path.IsPathRooted(fullPath)); -+ -+ if (isRooted) -+ { -+ bool isDifferentRoot = (string.Compare(System.IO.Path.GetPathRoot(fromDirectory), System.IO.Path.GetPathRoot(fullPath), true) != 0); -+ -+ if (isDifferentRoot) -+ return fullPath; -+ } -+ -+ List relativePath = new List(); -+ string[] fromDirectories = fromDirectory.Split(System.IO.Path.DirectorySeparatorChar); -+ -+ string[] toDirectories = fullPath.Split(System.IO.Path.DirectorySeparatorChar); -+ -+ int length = Math.Min(fromDirectories.Length, toDirectories.Length); -+ -+ int lastCommonRoot = -1; -+ -+ // find common root -+ for (int x = 0; x < length; x++) -+ { -+ if (string.Compare(fromDirectories[x], toDirectories[x], true) != 0) -+ break; -+ -+ lastCommonRoot = x; -+ } -+ -+ if (lastCommonRoot == -1) -+ return fullPath; -+ -+ // add relative folders in from path -+ for (int x = lastCommonRoot + 1; x < fromDirectories.Length; x++) -+ { -+ if (fromDirectories[x].Length > 0) -+ relativePath.Add(".."); -+ } -+ -+ // add to folders to path -+ for (int x = lastCommonRoot + 1; x < toDirectories.Length; x++) -+ { -+ relativePath.Add(toDirectories[x]); -+ } -+ -+ // create relative path -+ string[] relativeParts = new string[relativePath.Count]; -+ relativePath.CopyTo(relativeParts, 0); -+ -+ string newPath = string.Join(System.IO.Path.DirectorySeparatorChar.ToString(), relativeParts); -+ -+ return newPath; -+ } -+ #endregion -+ -+ private void AddButton_Click(object sender, EventArgs e) -+ { -+ if (openFileDialog1.ShowDialog() == DialogResult.OK) -+ { -+ if (!ExternalLibraries.Contains(openFileDialog1.FileName)) -+ { -+ string fpath = GetRelativePath(openFileDialog1.FileName); -+ ExternalLibraries.Add(fpath); -+ ExternalLibsListBox.Items.Add(fpath); -+ mProps.ExternalLibraries = ConvertFromList(ExternalLibraries); -+ IsDirty = true; -+ } -+ } -+ } -+ -+ private void RemoveButton_Click(object sender, EventArgs e) -+ { -+ if (ExternalLibsListBox.SelectedIndex > -1) -+ { -+ ExternalLibraries.Remove((string)ExternalLibsListBox.Items[ExternalLibsListBox.SelectedIndex]); -+ ExternalLibsListBox.Items.Remove(ExternalLibsListBox.Items[ExternalLibsListBox.SelectedIndex]); -+ mProps.ExternalLibraries = ConvertFromList(ExternalLibraries); -+ IsDirty = true; -+ } -+ } -+ -+ } -+} -Index: source2/VSIP/Cosmos.VS.Package/ExteralLibPage.Designer.cs -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/ExteralLibPage.Designer.cs (revision 0) -+++ source2/VSIP/Cosmos.VS.Package/ExteralLibPage.Designer.cs (revision 0) -@@ -0,0 +1,172 @@ -+namespace Cosmos.VS.Package -+{ -+ partial class ExternalLibPage -+ { -+ /// -+ /// Required designer variable. -+ /// -+ private System.ComponentModel.IContainer components = null; -+ -+ /// -+ /// Clean up any resources being used. -+ /// -+ /// true if managed resources should be disposed; otherwise, false. -+ protected override void Dispose(bool disposing) -+ { -+ if (disposing && (components != null)) -+ { -+ components.Dispose(); -+ } -+ base.Dispose(disposing); -+ } -+ -+ #region Component Designer generated code -+ -+ /// -+ /// Required method for Designer support - do not modify -+ /// the contents of this method with the code editor. -+ /// -+ private void InitializeComponent() -+ { -+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); -+ this.splitContainer1 = new System.Windows.Forms.SplitContainer(); -+ this.AddButton = new System.Windows.Forms.Button(); -+ this.splitContainer2 = new System.Windows.Forms.SplitContainer(); -+ this.RemoveButton = new System.Windows.Forms.Button(); -+ this.ExternalLibsListBox = new System.Windows.Forms.ListBox(); -+ this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); -+ this.tableLayoutPanel1.SuspendLayout(); -+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); -+ this.splitContainer1.Panel1.SuspendLayout(); -+ this.splitContainer1.Panel2.SuspendLayout(); -+ this.splitContainer1.SuspendLayout(); -+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); -+ this.splitContainer2.Panel1.SuspendLayout(); -+ this.splitContainer2.SuspendLayout(); -+ this.SuspendLayout(); -+ // -+ // tableLayoutPanel1 -+ // -+ this.tableLayoutPanel1.ColumnCount = 2; -+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); -+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 75F)); -+ this.tableLayoutPanel1.Controls.Add(this.splitContainer1, 1, 0); -+ this.tableLayoutPanel1.Controls.Add(this.ExternalLibsListBox, 0, 0); -+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); -+ this.tableLayoutPanel1.Name = "tableLayoutPanel1"; -+ this.tableLayoutPanel1.RowCount = 1; -+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); -+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); -+ this.tableLayoutPanel1.Size = new System.Drawing.Size(439, 245); -+ this.tableLayoutPanel1.TabIndex = 0; -+ // -+ // splitContainer1 -+ // -+ this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.splitContainer1.IsSplitterFixed = true; -+ this.splitContainer1.Location = new System.Drawing.Point(364, 0); -+ this.splitContainer1.Margin = new System.Windows.Forms.Padding(0); -+ this.splitContainer1.Name = "splitContainer1"; -+ this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; -+ // -+ // splitContainer1.Panel1 -+ // -+ this.splitContainer1.Panel1.Controls.Add(this.AddButton); -+ // -+ // splitContainer1.Panel2 -+ // -+ this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); -+ this.splitContainer1.Size = new System.Drawing.Size(75, 245); -+ this.splitContainer1.SplitterDistance = 25; -+ this.splitContainer1.SplitterWidth = 1; -+ this.splitContainer1.TabIndex = 0; -+ this.splitContainer1.TabStop = false; -+ // -+ // AddButton -+ // -+ this.AddButton.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.AddButton.Location = new System.Drawing.Point(0, 0); -+ this.AddButton.Name = "AddButton"; -+ this.AddButton.Size = new System.Drawing.Size(75, 25); -+ this.AddButton.TabIndex = 0; -+ this.AddButton.Text = "Add"; -+ this.AddButton.UseVisualStyleBackColor = true; -+ this.AddButton.Click += new System.EventHandler(this.AddButton_Click); -+ // -+ // splitContainer2 -+ // -+ this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.splitContainer2.IsSplitterFixed = true; -+ this.splitContainer2.Location = new System.Drawing.Point(0, 0); -+ this.splitContainer2.Margin = new System.Windows.Forms.Padding(0); -+ this.splitContainer2.Name = "splitContainer2"; -+ this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal; -+ // -+ // splitContainer2.Panel1 -+ // -+ this.splitContainer2.Panel1.Controls.Add(this.RemoveButton); -+ this.splitContainer2.Size = new System.Drawing.Size(75, 219); -+ this.splitContainer2.SplitterDistance = 25; -+ this.splitContainer2.SplitterWidth = 1; -+ this.splitContainer2.TabIndex = 0; -+ this.splitContainer2.TabStop = false; -+ // -+ // RemoveButton -+ // -+ this.RemoveButton.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.RemoveButton.Location = new System.Drawing.Point(0, 0); -+ this.RemoveButton.Name = "RemoveButton"; -+ this.RemoveButton.Size = new System.Drawing.Size(75, 25); -+ this.RemoveButton.TabIndex = 0; -+ this.RemoveButton.Text = "Remove"; -+ this.RemoveButton.UseVisualStyleBackColor = true; -+ this.RemoveButton.Click += new System.EventHandler(this.RemoveButton_Click); -+ // -+ // ExternalLibsListBox -+ // -+ this.ExternalLibsListBox.Dock = System.Windows.Forms.DockStyle.Fill; -+ this.ExternalLibsListBox.FormattingEnabled = true; -+ this.ExternalLibsListBox.Location = new System.Drawing.Point(3, 3); -+ this.ExternalLibsListBox.Name = "ExternalLibsListBox"; -+ this.ExternalLibsListBox.Size = new System.Drawing.Size(358, 239); -+ this.ExternalLibsListBox.TabIndex = 1; -+ // -+ // openFileDialog1 -+ // -+ this.openFileDialog1.Filter = "Object Files (*.obj) |*.obj"; -+ // -+ // ExternalLibPage -+ // -+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); -+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; -+ this.Controls.Add(this.tableLayoutPanel1); -+ this.Margin = new System.Windows.Forms.Padding(0); -+ this.Name = "ExternalLibPage"; -+ this.Size = new System.Drawing.Size(439, 245); -+ this.Title = "External Libraries"; -+ this.tableLayoutPanel1.ResumeLayout(false); -+ this.splitContainer1.Panel1.ResumeLayout(false); -+ this.splitContainer1.Panel2.ResumeLayout(false); -+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); -+ this.splitContainer1.ResumeLayout(false); -+ this.splitContainer2.Panel1.ResumeLayout(false); -+ ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); -+ this.splitContainer2.ResumeLayout(false); -+ this.ResumeLayout(false); -+ -+ } -+ -+ #endregion -+ -+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; -+ private System.Windows.Forms.SplitContainer splitContainer1; -+ private System.Windows.Forms.Button AddButton; -+ private System.Windows.Forms.SplitContainer splitContainer2; -+ private System.Windows.Forms.Button RemoveButton; -+ private System.Windows.Forms.ListBox ExternalLibsListBox; -+ private System.Windows.Forms.OpenFileDialog openFileDialog1; -+ -+ -+ } -+} -Index: source2/VSIP/Cosmos.VS.Package/ExteralLibPage.resx -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/ExteralLibPage.resx (revision 0) -+++ source2/VSIP/Cosmos.VS.Package/ExteralLibPage.resx (revision 0) -@@ -0,0 +1,126 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ text/microsoft-resx -+ -+ -+ 2.0 -+ -+ -+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 -+ -+ -+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 -+ -+ -+ 17, 17 -+ -+ -+ 25 -+ -+ -\ No newline at end of file -Index: source2/VSIP/Cosmos.VS.Package/Guids.cs -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/Guids.cs (revision 79470) -+++ source2/VSIP/Cosmos.VS.Package/Guids.cs (working copy) -@@ -10,7 +10,8 @@ - // These GUIDs are also used in the .iss, as are the prop page names. If you change names - // or GUIDs you need to update the .iss as well. - public const string BuildPage = "d33a2d29-c4fd-4e12-a510-4c01a14d63e1"; -- public const string DebugPage = "39801176-289f-405f-9425-2931a2c03912"; -+ public const string DebugPage = "39801176-289f-405f-9425-2931a2c03912"; -+ public const string ExternalLibPage = "6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8"; - public const string VMPage = "3b72bb68-7363-45a2-9eba-55c8d5f36e36"; - - public static readonly Guid guidProjectCmdSet = new Guid(guidProjectCmdSetString); -Index: source2/VSIP/Cosmos.VS.Package/VSProjectNode.cs -=================================================================== ---- source2/VSIP/Cosmos.VS.Package/VSProjectNode.cs (revision 79470) -+++ source2/VSIP/Cosmos.VS.Package/VSProjectNode.cs (working copy) -@@ -11,7 +11,7 @@ - public class VSProjectNode : ProjectNode - { - internal static int imageIndex; -- public override int ImageIndex -+ public override int ImageIndex - { - get { return imageIndex; } - } -@@ -44,9 +44,9 @@ - - public override MSBuildResult Build(uint vsopts, string config, IVsOutputWindowPane output, string target) - { -- // remove it, no really function in it Trivalik -+ // remove it, no really function in it Trivalik - //var xReferenceContainer = GetReferenceContainer(); -- -+ - return base.Build(vsopts, config, output, target); - } - -@@ -69,18 +69,19 @@ - { - uiThreadCallback(MSBuildResult.Successful, "Skipped"); - output.OutputStringThreadSafe("Project skipped, as it's not necessary for running"); -+ output.OutputStringThreadSafe("\r\n"); - return; - } - } - } -- } -+ } - base.BuildAsync(vsopts, config, output, target, uiThreadCallback); - } - - protected override MSBuildResult InvokeMsBuild(string target) - { -- // if the project is not set as startup project, don't build the iso -- -+ // if the project is not set as startup project, don't build the iso -+ - return base.InvokeMsBuild(target); - } - -@@ -113,13 +114,15 @@ - LogUtility.LogString("Entering Cosmos.VS.Package.VSProjectNode.GetConfigurationIndependentPropertyPages()"); - try - { -- return new Guid[] { -- // typeof(PropPageEnvironment).GUID, -- //typeof(PropPageTest).GUID, -- typeof(BuildPage).GUID, -- typeof(DebugPage).GUID, -- typeof(VMPage).GUID, -- }; -+ return new Guid[] -+ { -+ // typeof(PropPageEnvironment).GUID, -+ //typeof(PropPageTest).GUID, -+ typeof(BuildPage).GUID, -+ typeof(DebugPage).GUID, -+ typeof(VMPage).GUID, -+ new Guid("6F41DDF7-6BF2-46D0-96DC-3FEC494B8EE8"), // ExternalLibPage -+ }; - } - finally - { -@@ -142,8 +145,7 @@ - get { return "CosmosProjectType"; } - } - -- public override void AddFileFromTemplate( -- string source, string target) -+ public override void AddFileFromTemplate(string source, string target) - { - LogUtility.LogString("Entering Cosmos.VS.Package.VSProjectNode.AddFileFromTemplate('{0}', '{1}')", source, target); - try diff --git a/Users/Orvid/OtherStuff/TimesNewRoman.opff b/Users/Orvid/OtherStuff/TimesNewRoman.opff deleted file mode 100644 index addcd1916e..0000000000 Binary files a/Users/Orvid/OtherStuff/TimesNewRoman.opff and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Constants.cs b/Users/Orvid/PlugViewer/Constants.cs deleted file mode 100644 index 8e615c06d2..0000000000 --- a/Users/Orvid/PlugViewer/Constants.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace PlugViewer -{ - internal static class Constants - { - public const int PropertyIcon = 52; - public const int ReadOnlyPropertyIcon = 56; - public const int ConstantIcon = 6; - public const int EventIcon = 20; - public const int EnumValueIcon = ConstantIcon; - - public const int NamespaceIcon = 46; - public const int ModuleIcon = 37; - public const int AssemblyIcon = 0; - public const int WarningIcon = 72; - public const int ErrorIcon = 19; - - - public const int MethodOverride_Public = 42; - public const int MethodOverride_Private = 44; - public const int MethodOverride_Protected = 45; - public const int MethodOverride_Internal = 43; - - public const int MethodVirtual_Public = MethodOverride_Public; - public const int MethodVirtual_Private = MethodOverride_Private; - public const int MethodVirtual_Protected = MethodOverride_Protected; - public const int MethodVirtual_Internal = MethodOverride_Internal; - - public const int Method_Public = 38; - public const int Method_Private = 40; - public const int Method_Protected = 41; - public const int Method_Internal = 39; - - public const int Interface_Public = 29; - public const int Interface_Private = 31; - public const int Interface_Protected = 32; - public const int Interface_Internal = 30; - - public const int InterfaceImpl_Public = 33; - public const int InterfaceImpl_Private = 35; - public const int InterfaceImpl_Protected = 36; - public const int InterfaceImpl_Internal = 34; - - public const int Enum_Public = 11; - public const int Enum_Private = 13; - public const int Enum_Protected = 14; - public const int Enum_Internal = 12; - - public const int Struct_Public = 60; - public const int Struct_Private = 62; - public const int Struct_Protected = 63; - public const int Struct_Internal = 61; - - public const int Field_Public = 25; - public const int Field_Private = 27; - public const int Field_Protected = 28; - public const int Field_Internal = 26; - - public const int Class_Public = 2; - public const int Class_Private = 4; - public const int Class_Protected = 5; - public const int Class_Internal = 3; - } -} diff --git a/Users/Orvid/PlugViewer/Errors/BaseError.cs b/Users/Orvid/PlugViewer/Errors/BaseError.cs deleted file mode 100644 index 2ebd7dc573..0000000000 --- a/Users/Orvid/PlugViewer/Errors/BaseError.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; - -namespace PlugViewer.Errors -{ - /// - /// The base class for all errors. - /// - public abstract class BaseError - { - /// - /// The type of node this error can apply to. - /// - public abstract TreeNodeType AppliesTo { get; } - /// - /// Evaluate the given node. - /// - /// The node to evaluate. - public abstract void EvaluateNode(OTreeNode node); - /// - /// Gets the name of the error. - /// - public abstract string Name { get; } - /// - /// Gets the description of the error, - /// and how it applies in the current situation. - /// - public abstract string Description { get; } - } -} diff --git a/Users/Orvid/PlugViewer/Errors/InternalCallImplError.cs b/Users/Orvid/PlugViewer/Errors/InternalCallImplError.cs deleted file mode 100644 index abf50386ac..0000000000 --- a/Users/Orvid/PlugViewer/Errors/InternalCallImplError.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; -using System.Reflection; - -namespace PlugViewer.Errors -{ - internal class InternalCallImplError : BaseError - { - public override TreeNodeType AppliesTo - { - get { return TreeNodeType.Method; } - } - - public override void EvaluateNode(OTreeNode node) - { - MethodInfo m = (MethodInfo)node.Definition; - MethodImplAttributes xImplFlags = m.GetMethodImplementationFlags(); - if ((xImplFlags & MethodImplAttributes.InternalCall) != 0) - { -#if DebugErrors - Log.WriteLine(NameBuilder.BuildMethodName(m) + " ~ Method Implementation: Internal Call"); -#endif - node.SelectedImageIndex = Constants.ErrorIcon; - node.ImageIndex = Constants.ErrorIcon; - node.Errors.Add(this); - } - } - - public override string Name - { - get { return "Internal Call Implementation Error"; } - } - - public override string Description - { - get { return "This method is implemented internally, and can't be compiled by IL2CPU."; } - } - } -} diff --git a/Users/Orvid/PlugViewer/Errors/NativeImplError.cs b/Users/Orvid/PlugViewer/Errors/NativeImplError.cs deleted file mode 100644 index 9543a4f43e..0000000000 --- a/Users/Orvid/PlugViewer/Errors/NativeImplError.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; -using System.Reflection; - -namespace PlugViewer.Errors -{ - internal class NativeImplError : BaseError - { - public override TreeNodeType AppliesTo - { - get { return TreeNodeType.Method; } - } - - public override void EvaluateNode(OTreeNode node) - { - MethodInfo m = (MethodInfo)node.Definition; - MethodImplAttributes xImplFlags = m.GetMethodImplementationFlags(); - if ((xImplFlags & MethodImplAttributes.Native) != 0) - { -#if DebugErrors - Log.WriteLine(NameBuilder.BuildMethodName(m) + " ~ Method Implementation: Native"); -#endif - node.SelectedImageIndex = Constants.ErrorIcon; - node.ImageIndex = Constants.ErrorIcon; - node.Errors.Add(this); - } - } - - public override string Name - { - get { return "Native Implementation Error"; } - } - - public override string Description - { - get { return "This method is implemented natively, and can't be compiled by IL2CPU."; } - } - } -} diff --git a/Users/Orvid/PlugViewer/Errors/PInvokeError.cs b/Users/Orvid/PlugViewer/Errors/PInvokeError.cs deleted file mode 100644 index ff94f430b0..0000000000 --- a/Users/Orvid/PlugViewer/Errors/PInvokeError.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; -using System.Reflection; - -namespace PlugViewer.Errors -{ - internal class PInvokeError : BaseError - { - public override TreeNodeType AppliesTo - { - get { return TreeNodeType.Method; } - } - - public override void EvaluateNode(OTreeNode node) - { - MethodInfo m = (MethodInfo)node.Definition; - if ((m.Attributes & MethodAttributes.PinvokeImpl) != 0) - { -#if DebugErrors - Log.WriteLine(NameBuilder.BuildMethodName(m) + " ~ PInvoke Impl"); -#endif - node.SelectedImageIndex = Constants.ErrorIcon; - node.ImageIndex = Constants.ErrorIcon; - node.Errors.Add(this); - } - } - - public override string Name - { - get { return "PInvoke Error"; } - } - - public override string Description - { - get { return "This method is a PInvoke Implementation."; } - } - } -} diff --git a/Users/Orvid/PlugViewer/Errors/UnmanagedImplError.cs b/Users/Orvid/PlugViewer/Errors/UnmanagedImplError.cs deleted file mode 100644 index d41c191e1a..0000000000 --- a/Users/Orvid/PlugViewer/Errors/UnmanagedImplError.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; -using System.Reflection; - -namespace PlugViewer.Errors -{ - internal class UnmanagedImplError : BaseError - { - public override TreeNodeType AppliesTo - { - get { return TreeNodeType.Method; } - } - - public override void EvaluateNode(OTreeNode node) - { - MethodInfo m = (MethodInfo)node.Definition; - MethodImplAttributes xImplFlags = m.GetMethodImplementationFlags(); - if ((xImplFlags & MethodImplAttributes.Unmanaged) != 0) - { -#if DebugErrors - Log.WriteLine(NameBuilder.BuildMethodName(m) + " ~ Method Implementation: Unmanaged"); -#endif - node.SelectedImageIndex = Constants.ErrorIcon; - node.ImageIndex = Constants.ErrorIcon; - node.Errors.Add(this); - } - } - - public override string Name - { - get { return "Unmanaged Implementation Error"; } - } - - public override string Description - { - get { return "This method is Unmanaged, and can't be compiled by IL2CPU."; } - } - } -} diff --git a/Users/Orvid/PlugViewer/Log.cs b/Users/Orvid/PlugViewer/Log.cs deleted file mode 100644 index 181eb683f6..0000000000 --- a/Users/Orvid/PlugViewer/Log.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; - -namespace PlugViewer -{ - public static class Log - { - private static StreamWriter streamWriter = new StreamWriter(System.Windows.Forms.Application.StartupPath + "\\log.txt"); - - public static void WriteLine(string s) - { - streamWriter.WriteLine(s); - } - - public static void Close() - { - streamWriter.Flush(); - streamWriter.Close(); - streamWriter.Dispose(); - } - } -} diff --git a/Users/Orvid/PlugViewer/MainForm.Designer.cs b/Users/Orvid/PlugViewer/MainForm.Designer.cs deleted file mode 100644 index d38c97aadc..0000000000 --- a/Users/Orvid/PlugViewer/MainForm.Designer.cs +++ /dev/null @@ -1,237 +0,0 @@ -namespace PlugViewer -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.treeView1 = new System.Windows.Forms.TreeView(); - this.imageList1 = new System.Windows.Forms.ImageList(this.components); - this.Rtb = new System.Windows.Forms.RichTextBox(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.menuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(0, 24); - this.splitContainer1.Name = "splitContainer1"; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.treeView1); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.Rtb); - this.splitContainer1.Size = new System.Drawing.Size(627, 478); - this.splitContainer1.SplitterDistance = 209; - this.splitContainer1.TabIndex = 1; - this.splitContainer1.TabStop = false; - // - // treeView1 - // - this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.ImageIndex = 0; - this.treeView1.ImageList = this.imageList1; - this.treeView1.Location = new System.Drawing.Point(0, 0); - this.treeView1.Name = "treeView1"; - this.treeView1.SelectedImageIndex = 0; - this.treeView1.ShowNodeToolTips = true; - this.treeView1.Size = new System.Drawing.Size(209, 478); - this.treeView1.TabIndex = 0; - this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); - // - // imageList1 - // - this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); - this.imageList1.TransparentColor = System.Drawing.Color.Fuchsia; - this.imageList1.Images.SetKeyName(0, "Assembly.bmp"); - this.imageList1.Images.SetKeyName(1, "BrokenReference.bmp"); - this.imageList1.Images.SetKeyName(2, "Class.bmp"); - this.imageList1.Images.SetKeyName(3, "Class_Internal.bmp"); - this.imageList1.Images.SetKeyName(4, "Class_Private.bmp"); - this.imageList1.Images.SetKeyName(5, "Class_Protected.bmp"); - this.imageList1.Images.SetKeyName(6, "Constant.bmp"); - this.imageList1.Images.SetKeyName(7, "Delegate.bmp"); - this.imageList1.Images.SetKeyName(8, "Delegate_Friend.bmp"); - this.imageList1.Images.SetKeyName(9, "Delegate_Private.bmp"); - this.imageList1.Images.SetKeyName(10, "Delegate_Protected.bmp"); - this.imageList1.Images.SetKeyName(11, "Enum.bmp"); - this.imageList1.Images.SetKeyName(12, "Enum_Internal.bmp"); - this.imageList1.Images.SetKeyName(13, "Enum_Private.bmp"); - this.imageList1.Images.SetKeyName(14, "Enum_Protected.bmp"); - this.imageList1.Images.SetKeyName(15, "EnumItem.bmp"); - this.imageList1.Images.SetKeyName(16, "EnumItem_Internal.bmp"); - this.imageList1.Images.SetKeyName(17, "EnumItem_Private.bmp"); - this.imageList1.Images.SetKeyName(18, "EnumItem_Protected.bmp"); - this.imageList1.Images.SetKeyName(19, "Error.bmp"); - this.imageList1.Images.SetKeyName(20, "Event.bmp"); - this.imageList1.Images.SetKeyName(21, "Exception.bmp"); - this.imageList1.Images.SetKeyName(22, "Exception_Internal.bmp"); - this.imageList1.Images.SetKeyName(23, "Exception_Private.bmp"); - this.imageList1.Images.SetKeyName(24, "Exception_Protected.bmp"); - this.imageList1.Images.SetKeyName(25, "Field.bmp"); - this.imageList1.Images.SetKeyName(26, "Field_Internal.bmp"); - this.imageList1.Images.SetKeyName(27, "Field_Private.bmp"); - this.imageList1.Images.SetKeyName(28, "Field_Protected.bmp"); - this.imageList1.Images.SetKeyName(29, "Interface.bmp"); - this.imageList1.Images.SetKeyName(30, "Interface_Internal.bmp"); - this.imageList1.Images.SetKeyName(31, "Interface_Private.bmp"); - this.imageList1.Images.SetKeyName(32, "Interface_Protected.bmp"); - this.imageList1.Images.SetKeyName(33, "InterfaceImpl.bmp"); - this.imageList1.Images.SetKeyName(34, "InterfaceImpl_Internal.bmp"); - this.imageList1.Images.SetKeyName(35, "InterfaceImpl_Private.bmp"); - this.imageList1.Images.SetKeyName(36, "InterfaceImpl_Protected.bmp"); - this.imageList1.Images.SetKeyName(37, "Library.bmp"); - this.imageList1.Images.SetKeyName(38, "Method.bmp"); - this.imageList1.Images.SetKeyName(39, "Method_Internal.bmp"); - this.imageList1.Images.SetKeyName(40, "Method_Private.bmp"); - this.imageList1.Images.SetKeyName(41, "Method_Protected.bmp"); - this.imageList1.Images.SetKeyName(42, "MethodOverload.bmp"); - this.imageList1.Images.SetKeyName(43, "MethodOverload_Internal.bmp"); - this.imageList1.Images.SetKeyName(44, "MethodOverload_Private.bmp"); - this.imageList1.Images.SetKeyName(45, "MethodOverload_Protected.bmp"); - this.imageList1.Images.SetKeyName(46, "Namespace.bmp"); - this.imageList1.Images.SetKeyName(47, "Operator.bmp"); - this.imageList1.Images.SetKeyName(48, "Operator_Internal.bmp"); - this.imageList1.Images.SetKeyName(49, "Operator_Private.bmp"); - this.imageList1.Images.SetKeyName(50, "Operator_Protected.bmp"); - this.imageList1.Images.SetKeyName(51, "Plug.png"); - this.imageList1.Images.SetKeyName(52, "Properties.bmp"); - this.imageList1.Images.SetKeyName(53, "Properties_Internal.bmp"); - this.imageList1.Images.SetKeyName(54, "Properties_Private.bmp"); - this.imageList1.Images.SetKeyName(55, "Properties_Protected.bmp"); - this.imageList1.Images.SetKeyName(56, "Properties-ReadOnly.bmp"); - this.imageList1.Images.SetKeyName(57, "Properties-ReadOnly_Internal.bmp"); - this.imageList1.Images.SetKeyName(58, "Properties-ReadOnly_Private.bmp"); - this.imageList1.Images.SetKeyName(59, "Properties-ReadOnly_Protected.bmp"); - this.imageList1.Images.SetKeyName(60, "Structure.bmp"); - this.imageList1.Images.SetKeyName(61, "Structure_Internal.bmp"); - this.imageList1.Images.SetKeyName(62, "Structure_Private.bmp"); - this.imageList1.Images.SetKeyName(63, "Structure_Protected.bmp"); - this.imageList1.Images.SetKeyName(64, "Union.bmp"); - this.imageList1.Images.SetKeyName(65, "Union_Internal.bmp"); - this.imageList1.Images.SetKeyName(66, "Union_Private.bmp"); - this.imageList1.Images.SetKeyName(67, "Union_Protected.bmp"); - this.imageList1.Images.SetKeyName(68, "ValueType.bmp"); - this.imageList1.Images.SetKeyName(69, "ValueType_Internal.bmp"); - this.imageList1.Images.SetKeyName(70, "ValueType_Private.bmp"); - this.imageList1.Images.SetKeyName(71, "ValueType_Protected.bmp"); - this.imageList1.Images.SetKeyName(72, "Warning.bmp"); - // - // Rtb - // - this.Rtb.Dock = System.Windows.Forms.DockStyle.Fill; - this.Rtb.Location = new System.Drawing.Point(0, 0); - this.Rtb.Name = "Rtb"; - this.Rtb.Size = new System.Drawing.Size(414, 478); - this.Rtb.TabIndex = 0; - this.Rtb.Text = ""; - // - // openFileDialog1 - // - this.openFileDialog1.Filter = ".Net Dll |*.dll;*.exe"; - this.openFileDialog1.Multiselect = true; - // - // menuStrip1 - // - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Size = new System.Drawing.Size(627, 24); - this.menuStrip1.TabIndex = 2; - this.menuStrip1.Text = "menuStrip1"; - this.menuStrip1.Items.Add(fileToolStripMenuItem); - this.menuStrip1.Items.Add(debugToolStripMenuItem); - // - // fileToolStripMenuItem - // - this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.openToolStripMenuItem}); - this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(35, 20); - this.fileToolStripMenuItem.Text = "File"; - // - // openToolStripMenuItem - // - this.openToolStripMenuItem.Name = "openToolStripMenuItem"; - this.openToolStripMenuItem.Size = new System.Drawing.Size(111, 22); - this.openToolStripMenuItem.Text = "Open"; - this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); - // - // debugToolStripMenuItem - // - this.debugToolStripMenuItem.Name = "debugToolStripMenuItem"; - this.debugToolStripMenuItem.Size = new System.Drawing.Size(50, 20); - this.debugToolStripMenuItem.Text = "Debug"; - // - // MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(627, 502); - this.Controls.Add(this.splitContainer1); - this.Controls.Add(this.menuStrip1); - this.MainMenuStrip = this.menuStrip1; - this.Name = "MainForm"; - this.Text = "Cosmos Plug Viewer"; - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.TreeView treeView1; - private System.Windows.Forms.ImageList imageList1; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.MenuStrip menuStrip1; - private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem; - private System.Windows.Forms.RichTextBox Rtb; - } -} - diff --git a/Users/Orvid/PlugViewer/MainForm.cs b/Users/Orvid/PlugViewer/MainForm.cs deleted file mode 100644 index 48a46cab85..0000000000 --- a/Users/Orvid/PlugViewer/MainForm.cs +++ /dev/null @@ -1,586 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Reflection; -using System.IO; -using PlugViewer.TreeViewNodes; - -namespace PlugViewer -{ - public partial class MainForm : Form - { - public MainForm() - { - InitializeComponent(); - treeView1.TreeViewNodeSorter = new TreeViewSorter(); - } - - private void AddAssemblyToView(Assembly a) - { - if (a != null) - { - PlugTemplateDumper.Dump(a); - try - { - TreeNode nd = new AssemblyTreeNode(a); - treeView1.Nodes.Add(nd); - foreach (Module md in a.GetModules()) - { - LoadModule(nd, md); - } - treeView1.Sort(); - } - catch {} - } - } - - #region LoadModule - private void LoadModule(TreeNode parent, Module md) - { - ModuleTreeNode tn = new ModuleTreeNode(md); - parent.Nodes.Add(tn); - foreach (Type t in md.GetTypes()) - { - if (!tn.Namespaces.ContainsKey((t.Namespace == null ? "-" : t.Namespace))) - { - TreeNode tnd = new NamespaceTreeNode((t.Namespace == null ? "-" : t.Namespace)); - tn.Nodes.Add(tnd); - tn.Namespaces.Add((t.Namespace == null ? "-" : t.Namespace), tnd); - } - LoadType(tn.Namespaces[(t.Namespace == null ? "-" : t.Namespace)], t); - } - } - #endregion - - #region LoadType - private void LoadType(TreeNode parentNode, Type type) - { - if (!type.IsEnum && !type.IsInterface && !type.IsValueType && type.IsClass) - { - TreeNode node; - if (type.IsPublic) - { - node = new ClassTreeNode(type, ClassType.Class, Access.Public); - parentNode.Nodes.Add(node); - } - else if (type.IsNestedPrivate) - { - node = new ClassTreeNode(type, ClassType.Class, Access.Private); - parentNode.Nodes.Add(node); - } - else if (type.IsNestedFamORAssem) - { - node = new ClassTreeNode(type, ClassType.Class, Access.Internal); - parentNode.Nodes.Add(node); - } - else - { - // It must be Protected. - node = new ClassTreeNode(type, ClassType.Class, Access.Protected); - parentNode.Nodes.Add(node); - } - - - //TreeNode node = (treeView1.Nodes.Find(type.FullName, true))[0]; - foreach (Type ntd in type.GetNestedTypes()) - { - LoadType(node, ntd); - } - foreach (MethodInfo md in type.GetMethods()) - { - LoadMethod(node, md); - } - foreach (Type ntd in type.GetInterfaces()) - { - LoadImplementedInterface(node, ntd); - } - foreach (EventInfo ed in type.GetEvents()) - { - LoadEvent(node, ed); - } - foreach (PropertyInfo pd in type.GetProperties()) - { - LoadProperty(node, pd); - } - foreach (FieldInfo fd in type.GetFields()) - { - LoadField(node, fd); - } - } - else if (type.IsEnum) - { - LoadEnum(parentNode, type); - } - else if (type.IsInterface) - { - LoadInterface(parentNode, type.GetElementType()); - } - else if (type.IsValueType) - { - LoadStruct(parentNode, type); - } - else - { - throw new Exception(); - } - } - #endregion - - /// - /// Checks if the method is part of an event or property definition. - /// - /// - /// - private bool ShouldLoadMethod(MethodInfo method) - { - string s; - if (method.Name.Length <= 4) // Too short to be one of things being tested - { - return true; - } - else if (method.Name.Length < 7) // only check add, get, and set - { - s = method.Name.Substring(0,4); - if (s == "add_" || s == "get_" || s == "set_") - { - return false; - } - return true; - } - else // Check add, remove, get, and set - { - s = method.Name.Substring(0, 4); - if (s == "add_" || s == "get_" || s == "set_") - { - return false; - } - else if (method.Name.Substring(0, 7) == "remove_") - { - return false; - } - return true; - } - - } - - private void LoadMethod(TreeNode parentNode, MethodInfo method) - { - string dispkey = NameBuilder.BuildMethodDisplayName(method); - TreeNode tn; - // Check that the method isn't part of a property or event definition. - if (ShouldLoadMethod(method)) - { - if (method.IsVirtual) - { - if (method.GetMethodBody() != null) // The method is an override - { - if (method.IsPublic) - { - tn = new MethodTreeNode(method, MethodType.OverrideMethod, Access.Public); - parentNode.Nodes.Add(tn); - } - else if (method.IsPrivate) - { - tn = new MethodTreeNode(method, MethodType.OverrideMethod, Access.Private); - parentNode.Nodes.Add(tn); - } - else if (method.IsFamilyOrAssembly) - { - tn = new MethodTreeNode(method, MethodType.OverrideMethod, Access.Internal); - parentNode.Nodes.Add(tn); - } - else - { - // It must be protected. - tn = new MethodTreeNode(method, MethodType.OverrideMethod, Access.Protected); - parentNode.Nodes.Add(tn); - } - } - else // The method is virtual, but not an override. - { - if (method.IsPublic) - { - tn = new MethodTreeNode(method, MethodType.VirtualMethod, Access.Public); - parentNode.Nodes.Add(tn); - } - else if (method.IsPrivate) - { - tn = new MethodTreeNode(method, MethodType.VirtualMethod, Access.Private); - parentNode.Nodes.Add(tn); - } - else if (method.IsFamilyOrAssembly) - { - tn = new MethodTreeNode(method, MethodType.VirtualMethod, Access.Internal); - parentNode.Nodes.Add(tn); - } - else - { - // It must be protected. - tn = new MethodTreeNode(method, MethodType.VirtualMethod, Access.Protected); - parentNode.Nodes.Add(tn); - } - } - } - else // The method is a regular method - { - if (method.IsPublic) - { - tn = new MethodTreeNode(method, MethodType.BasicMethod, Access.Public); - parentNode.Nodes.Add(tn); - } - else if (method.IsPrivate) - { - tn = new MethodTreeNode(method, MethodType.BasicMethod, Access.Private); - parentNode.Nodes.Add(tn); - } - else if (method.IsFamilyOrAssembly) - { - tn = new MethodTreeNode(method, MethodType.BasicMethod, Access.Internal); - parentNode.Nodes.Add(tn); - } - else - { - // It must be protected. - tn = new MethodTreeNode(method, MethodType.BasicMethod, Access.Protected); - parentNode.Nodes.Add(tn); - } - } - } - } - - #region LoadImplementedInterface - private void LoadImplementedInterface(TreeNode parentNode, Type intface) - { - TreeNode node; - if (intface.IsPublic) - { - node = new ClassTreeNode(intface, ClassType.ImplementedInterface, Access.Public); - parentNode.Nodes.Add(node); - } - else if (intface.IsNestedPrivate) - { - node = new ClassTreeNode(intface, ClassType.ImplementedInterface, Access.Private); - parentNode.Nodes.Add(node); - } - else if (intface.IsNestedFamORAssem) - { - node = new ClassTreeNode(intface, ClassType.ImplementedInterface, Access.Internal); - parentNode.Nodes.Add(node); - } - else - { - // It must be protected. - node = new ClassTreeNode(intface, ClassType.ImplementedInterface, Access.Protected); - parentNode.Nodes.Add(node); - } - - foreach (Type ntd in intface.GetNestedTypes()) - { - LoadType(node, ntd); - } - foreach (MethodInfo md in intface.GetMethods()) - { - LoadMethod(node, md); - } - foreach (Type ntd in intface.GetInterfaces()) - { - LoadImplementedInterface(node, ntd); - } - foreach (EventInfo ed in intface.GetEvents()) - { - LoadEvent(node, ed); - } - foreach (PropertyInfo pd in intface.GetProperties()) - { - LoadProperty(node, pd); - } - foreach (FieldInfo fd in intface.GetFields()) - { - LoadField(node, fd); - } - } - #endregion - - #region LoadInterface - private void LoadInterface(TreeNode parentNode, Type intface) - { - TreeNode node; - if (intface.IsPublic) - { - node = new ClassTreeNode(intface, ClassType.Interface, Access.Public); - parentNode.Nodes.Add(node); - } - else if (intface.IsNestedPrivate) - { - node = new ClassTreeNode(intface, ClassType.Interface, Access.Private); - parentNode.Nodes.Add(node); - } - else if (intface.IsNestedFamORAssem) - { - node = new ClassTreeNode(intface, ClassType.Interface, Access.Internal); - parentNode.Nodes.Add(node); - } - else - { - // It must be protected. - node = new ClassTreeNode(intface, ClassType.Interface, Access.Protected); - parentNode.Nodes.Add(node); - } - - foreach (Type ntd in intface.GetNestedTypes()) - { - LoadType(node, ntd); - } - foreach (MethodInfo md in intface.GetMethods()) - { - LoadMethod(node, md); - } - foreach (Type ntd in intface.GetInterfaces()) - { - LoadImplementedInterface(node, ntd); - } - foreach (EventInfo ed in intface.GetEvents()) - { - LoadEvent(node, ed); - } - foreach (PropertyInfo pd in intface.GetProperties()) - { - LoadProperty(node, pd); - } - foreach (FieldInfo fd in intface.GetFields()) - { - LoadField(node, fd); - } - } - #endregion - - #region LoadEvent - private void LoadEvent(TreeNode parentNode, EventInfo evnt) - { - TreeNode n = new EventTreeNode(evnt); - parentNode.Nodes.Add(n); - } - #endregion - - #region LoadProperty - private void LoadProperty(TreeNode parentNode, PropertyInfo ptd) - { - TreeNode n; - if (ptd.CanWrite) - { - n = new PropertyTreeNode(ptd, true); - parentNode.Nodes.Add(n); - } - else - { - n = new PropertyTreeNode(ptd, false); - parentNode.Nodes.Add(n); - } - } - #endregion - - //private void LoadConstant(TreeNode parentNode, PropertyInfo ptd) - //{ - // //TreeNode tr = new FieldTreeNode(fd, Access.Protected, false); - // //parentNode.Nodes.Add(tr); - // parentNode.Nodes.Add(ptd.FullName, ptd.Name, Constants.ConstantIcon, Constants.ConstantIcon); - //} - - #region LoadEnum - private void LoadEnum(TreeNode parentNode, Type td) - { - TreeNode enode; - TreeNode tr; - if (td.IsPublic) - { - enode = new ClassTreeNode(td, ClassType.Enum, Access.Public); - parentNode.Nodes.Add(enode); - } - else if (td.IsNestedPrivate) - { - enode = new ClassTreeNode(td, ClassType.Enum, Access.Private); - parentNode.Nodes.Add(enode); - } - else if (td.IsNestedFamORAssem) - { - enode = new ClassTreeNode(td, ClassType.Enum, Access.Internal); - parentNode.Nodes.Add(enode); - } - else - { - // It must be protected. - enode = new ClassTreeNode(td, ClassType.Enum, Access.Protected); - parentNode.Nodes.Add(enode); - } - // Now we get to load it's values. - foreach (FieldInfo fd in td.GetFields()) - { - // We don't want to show "value__" because it's automatically added - // by the compiler. - if (fd.Name != "value__") - { - tr = new FieldTreeNode(fd, Access.Public, true); - enode.Nodes.Add(tr); - } - } - } - #endregion - - #region LoadStruct - private void LoadStruct(TreeNode parentNode, Type td) - { - TreeNode node; - if (td.IsPublic) - { - node = new ClassTreeNode(td, ClassType.Struct, Access.Public); - parentNode.Nodes.Add(node); - } - else if (td.IsNestedPrivate) - { - node = new ClassTreeNode(td, ClassType.Struct, Access.Private); - parentNode.Nodes.Add(node); - } - else if (td.IsNestedFamORAssem) - { - node = new ClassTreeNode(td, ClassType.Struct, Access.Internal); - parentNode.Nodes.Add(node); - } - else - { - // It must be protected. - node = new ClassTreeNode(td, ClassType.Struct, Access.Protected); - parentNode.Nodes.Add(node); - } - - - foreach (Type ntd in td.GetNestedTypes()) - { - LoadType(node, ntd); - } - foreach (MethodInfo md in td.GetMethods()) - { - LoadMethod(node, md); - } - foreach (Type ntd in td.GetInterfaces()) - { - LoadImplementedInterface(node, ntd); - } - foreach (EventInfo ed in td.GetEvents()) - { - LoadEvent(node, ed); - } - foreach (PropertyInfo pd in td.GetProperties()) - { - LoadProperty(node, pd); - } - foreach (FieldInfo fd in td.GetFields()) - { - LoadField(node, fd); - } - } - #endregion - - #region LoadField - private void LoadField(TreeNode parentNode, FieldInfo fd) - { - TreeNode tr; - if (fd.IsLiteral) - { - tr = new FieldTreeNode(fd, Access.Public, true); - parentNode.Nodes.Add(tr); - } - else if (fd.IsPublic) - { - tr = new FieldTreeNode(fd, Access.Public, false); - parentNode.Nodes.Add(tr); - } - else if (fd.IsPrivate) - { - tr = new FieldTreeNode(fd, Access.Private, false); - parentNode.Nodes.Add(tr); - } - else if (fd.IsFamilyOrAssembly) - { - tr = new FieldTreeNode(fd, Access.Internal, false); - parentNode.Nodes.Add(tr); - } - else - { - // It must be protected. - tr = new FieldTreeNode(fd, Access.Protected, false); - parentNode.Nodes.Add(tr); - } - } - #endregion - - private void OpenDll(string loc) - { - Assembly asmb = null; - try - { - asmb = Assembly.LoadFrom(loc); - } - catch { } - AddAssemblyToView(asmb); - } - - private void openToolStripMenuItem_Click(object sender, EventArgs e) - { - if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - foreach (string str in openFileDialog1.FileNames) - { - OpenDll(str); - } - TestRunner.RunTests(); - } - } - - private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) - { - OTreeNode n = (OTreeNode)e.Node; - n.ShowNodeInfo(Rtb); - - bool hErr = false; - bool hWarn = false; - int ErrSelStart = 0; - int WarnSelStart = 0; - if (n.Errors.Count > 0) - { - ErrSelStart = Rtb.Text.Length - 1; - foreach (Errors.BaseError er in n.Errors) - { - Rtb.Text += er.Name + ": " + er.Description + "\r\n"; - } - hErr = true; - } - if (n.Warnings.Count > 0) - { - WarnSelStart = Rtb.Text.Length - 1; - foreach (Warnings.BaseWarning b in n.Warnings) - { - Rtb.Text += b.Name + ": " + b.Description + "\r\n"; - } - hWarn = true; - } - if (hErr) - { - Rtb.SelectionStart = ErrSelStart; - Rtb.SelectionLength = Rtb.Text.Length - Rtb.SelectionStart; - Rtb.SelectionColor = System.Drawing.Color.FromArgb(0xff, 0x00, 0x00); - Rtb.SelectionLength = 0; - } - if (hWarn) - { - Rtb.SelectionStart = WarnSelStart; - Rtb.SelectionLength = Rtb.Text.Length - Rtb.SelectionStart; - Rtb.SelectionColor = System.Drawing.Color.FromArgb(0xff, 0x99, 0x00); - Rtb.SelectionLength = 0; - } - } - } -} diff --git a/Users/Orvid/PlugViewer/MainForm.resx b/Users/Orvid/PlugViewer/MainForm.resx deleted file mode 100644 index 3dce3a7435..0000000000 --- a/Users/Orvid/PlugViewer/MainForm.resx +++ /dev/null @@ -1,1077 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 126, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC6 - 2wAAAk1TRnQBSQFMAgEBSQEAAUoBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABMAEBAgABAQEAARgGAAHk0gABMgHKAe8BAAG/Ae4BAAHEAfcBAAHGAfgBAAHGAfkBAAHRAf8BAAHX - Af8BAAHMAf4BAAHTAf8BAAHHAfwBAAHGAfgBAAHFAfgBAAHOAf8BAAHVAf+WAAEeAcYB6wEAAcsB9wEB - Ad8B/wEAAdkB/wEAAeAB/wEAAekB/wERARkBIAGrAS8BPwE1AdAB7gEAAegB/wEAAdkB/wEAAeQB/wED - AecB/wEAAecB/5kAAQIBxgHsAQwB5QH/AQAB1wH/AQAB3gH/AQAB6AH/AQcCAAE9AgABHAGqAcIBAAHw - Af8BAAH4Af8BAgH5Af8BBQH9Af8BEgGuAc6aAAHDAegBDgHfAfwBBwHkAf8BAAHZAf8BAAHsAf8BAAHT - AecBAAG3AcQBAAHtAf8BAAH1Af8BAAH5Af8BEgH+Af8BAAH5Af+fAAEDAc4B7AEOAe0B/wEAAd8B/wEA - AeoB/wEGAdYB8wEbAZIBrQEAAfoB/wEAAfQB/wENAfQB/wEGAv8BEAG3AdOfAAEFAcwB6AEKAeMB+AEF - AesB/wEAAfwB/wEZAaABqQE9ATsBSQETAbcBvgECAfIB+gEQAf4B/wEAAfwB/6UAAQIB0gHqAQoB9AH/ - AQAC/wEkAXcBggFyARQBIgE/AWYBcAEGAfsB/wEFAv8BDgG9AdWmAAHSAekBDAH2Af8BAAL/AR8BPQFF - AWoBAAEPAUQBUwFjARIC/wEAAv+rAAEEAesB+wEGAv8BEwIAAVUBAAEEAU4BOwFJAQMC/wEOAc4B3qwA - AeUB8gEJAv8BCAIAAToBAAEDAUwBTwFaAQAC/7EAAQMB9wH/AQYB2wHeAQEBrwGyAQkC/wEHAeQB6rIA - AeMB6gEJAv8BHQL/AQAC/7cAARQB8wH1AS0C/wECAekB7LsAAv+9AAG5Av/hAAGtAVgBJycAAZwBhQF1 - AZYBfwFtAZABdwFnAYkBcAFeAYIBagFXAXwBYwFPJAABIgFuAY9IAAGNAS0BjA8AAeQBpwFWAdkBpAF4 - AaUBSQEYFQABjQEtAYwJAAHCAasBoAHeAdEBygHaAcwBxAHWAccBvgHSAcEBuAHOAbsBsgHLAbcBqwF7 - AWIBTx4AAVoBvAHdAV0ByAHoASIBbgGPFQABjQEtAYwqAAGNAS0BjAHeAXMB3gGNAS0BjAkAAeQBpwFW - Af8B6gHFAf4B4QG0Ad0BqwGAAaQBRgEVDwABjQEtAYwB3gFzAd4BjQEtAYwGAAHLAbcBrAHqAeMB3wHZ - Ac4ByAFYAUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVQwAAY0BLQGMDwABWgG8Ad0BaAHYAfgBLwHA - Ae4BLgGAAaMPAAGNAS0BjAHeAXMB3gGNAS0BjCQAAZ8BNQGeAeoBkAHqAeQBhAHkAeABdwHeAY0BLQGM - AwAB5QGqAVkB/gH5AdsB/wHwAckB/gHnAb4B/gHhAbQB3gGsAYEBpAFGARUJAAGfATUBngHqAZAB6gHk - AYQB5AHgAXcB3gGNAS0BjAMAAdQBwwG7AeoB4wHfAVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLSAcABuAGH - AW8BXQkAAY0BLQGMAd4BcwHeAY0BLQGMDAABWgG8Ad0BaAHYAfgBLgGAAaMPAAGfATUBngHqAZAB6gHk - AYQB5AHgAXcB3gGNAS0BjBIAAZkBMwoAAdMBZQHSAfYBrAH2AfEBoQHwAesBlAHrAecBiAHlAeEBewHg - AY0BLQGMAeUBqgFbAf8B/gHjAf8B+AHWAf8B8AHJAf4B6AG+Ae8BxwGWAa8BVwElBgAB0wFlAdIB9gGs - AfYB8QGhAfAB6wGUAesB5wGIAeUB4QF7AeABjQEtAYwB3QHQAckB6gHjAd8B6gHjAd8B6gHjAd8B6gHj - Ad8B4gHXAdIB1gHHAb4BjQF1AWMGAAGfATUBngHqAZAB6gHkAYQB5AHgAXcB3gGNAS0BjAYAAV8BqQHI - ATIBzwH/AWgB2AH4AS8BwAHuAS4BgAGjCQAB0wFlAdIB9gGsAfYB8QGhAfAB6wGUAesB5wGIAeUB4QF7 - AeABjQEtAYwMAAG1AWMBNQHjAZ8BSQGZATMEAAHlAXAB5AH7AbkB+wH6AbcB+gH2AbAB9gHyAaUB8wHt - AZkB7QHcAWUB2wYAAeUBqgFZAf8B/gHjAf8B9wHWAfMB1QGmAeMBowFPAboBYwEdAwAB5QFwAeQB+wG5 - AfsB+gG3AfoB9gGwAfYB8gGlAfMB7QGZAe0B3AFlAdsGAAHUAcUBuwGiAY4BgQHdAdAByQHdAdAByQGN - AXYBZAGOAXYBZAYAAdMBZQHSAfYBrAH2AfEBoQHwAesBlAHrAecBiAHlAeEBewHgAY0BLQGMAX8BuAHT - AZYB2wHuAWgB2AH4AVoBvAHdAVoBvAHdAS8BwAHuAS4BgAGjAwAB5QFwAeQB+wG5AfsB+gG3AfoB9gGw - AfYB8gGlAfMB7QGZAe0B3AFlAdsMAAG1AWMBNQHvAbMBawHpAagBWQHiAZ8BSQGZATMEAAHlAXAB5AH7 - AbkC+wG5AfsB+AGyAfgB3AFlAdsMAAHjAacBVgH2AesBygHiAaIBTAHlAaMBTwHiAZ8BSQGZATMEAAHl - AXAB5AH7AbkC+wG5AfsB+AGyAfgB3AFlAdsJAAHZAcwBxAGYAYcBewMAAcoBjgFtAcsBtwGsAYgBcwFk - AwAB5QFwAeQB+wG5AfsB+gG3AfoB9gGwAfYB8gGlAfMB7QGZAe0B3AFlAdsDAAF/AbgB0wGuAesB9QGs - AfUB/gEfAWsBjAFaAbwB3QEyAc8B/wEuAYABowGZATMEAAHlAXAB5AH7AbkC+wG5AfsB+AGyAfgB3AFl - AdsMAAG1AWMBNQH7AccBjgH1Ab0BfgHvAbMBawHoAakBWQHjAZ8BSQGZATMEAAHcAWUB2wH7AbkB+wHl - AXAB5A8AAboBaQE2AeYBrAFbAfABtQFvAe8BswFrAegBqQFZAeMBnwFJAZkBMwQAAdwBZQHbAfsBuQH7 - AeUBcAHkDAAB3gHRAcoB6gHjAd8BowGTAYoBrgGaAZAB1gHGAb0BkQF8AW4B4AHBAbEDAAHlAXAB5AH7 - AbkC+wG5AfsB+AGyAfgB3AFlAdsJAAF/AbgB0wGqAdwB4QFoAdgB+AFoAdgB+AE4AYUBpgGrAbcBqgHj - AZ8BSQGZATMEAAHcAWUB2wH7AbkB+wHlAXAB5AwAAdgBmwFbAf8BzQGZAf8BzQGZAfsBxwGOAfYBvgF+ - Ae8BswFsAegBqQFZAeMBnwFJAZkBMwQAAeUBcAHkDwAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY4B9gG+ - AX4B7wGzAWwB6AGpAVkB4wGfAUkBmQEzBAAB5QFwAeQSAAHeAdEBygHSAcABuAHNAboBsQG2AaQBmgHs - AdUBtwHjAZ8BSQGZATMEAAHcAWUB2wH7AbkB+wHlAXAB5AwAAbMBqQGQAX8BuAHTAXUBrwHLAV8BqQHI - AagCvwHvAbMBbAHoAakBWQHjAZ8BSQGZATMEAAHlAXAB5BIAAdgBmwFbAf8BzQGZAf8BzQGZAfsBxwGO - AfUBvgF+Ae8BswFsAegBqAFZAeMBnwFJAZkBMxYAAdgBmwFbAf8BzQGZAf8BzQGZAfsBxwGOAfUBvgF+ - Ae8BswFsAegBqAFZAeMBnwFJAZkBMxMAAekBxAGfAf8B5QHJAf8B4gHDAfsB3wG9AfoB1QGrAe8BswFs - AegBqQFZAeMBnwFJAZkBMwQAAeUBcAHkEgAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY4B9QG+AX4B7wGz - AWwB6AGoAVkB4wGfAUkBmQEzGQAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY8B9gG+AX4B7wGzAWwB6AGo - AVkB4wGfAUgBmQEzFgAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY8B9gG+AX4B7wGzAWwB6AGoAVkB4wGf - AUgBmQEzEwAB3AGlAWwB/wHNAZkB/wHNAZkB+wHHAY4B9QG+AX4B7wGzAWwB6AGoAVkB4wGfAUkBmQEz - GQAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY8B9gG+AX4B7wGzAWwB6AGoAVkB4wGfAUgBmQEzGQAB2AGb - AVsB/wHNAZkB/wHNAZkB/AHHAY4B9gG9AX4B7wGzAWsByQFzAUMbAAHYAZsBWwH/Ac0BmQH/Ac0BmQH8 - AccBjgH2Ab0BfgHvAbMBawHJAXMBQxgAAdwBpQFsAf8BzQGZAf8BzQGZAfsBxwGPAfYBvgF+Ae8BswFs - AegBqAFZAeMBnwFIAZkBMxkAAdgBmwFbAf8BzQGZAf8BzQGZAfwBxwGOAfYBvQF+Ae8BswFrAckBcwFD - HgAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY4B2AGbAVshAAHYAZsBWwH/Ac0BmQH/Ac0BmQH7AccBjgHY - AZsBWx4AAdgBmwFbAf8BzQGZAf8BzQGZAfwBxwGOAfYBvQF+Ae8BswFrAckBcwFDHgAB2AGbAVsB/wHN - AZkB/wHNAZkB+wHHAY4B2AGbAVskAAHYAZsBWwH/Ac0BmQHYAZsBWycAAdgBmwFbAf8BzQGZAdgBmwFb - JAAB2AGbAVsB/wHNAZkB/wHNAZkB+wHHAY4B2AGbAVskAAHYAZsBWwH/Ac0BmQHYAZsBWyoAAdgBmwFb - LQAB2AGbAVsqAAHYAZsBWwH/Ac0BmQHYAZsBWyoAAdgBmwFbjQAB2AGbAVuBAAGtAVgBJycAAZwBhQF1 - AZYBfwFtAZABdwFnAYkBcAFeAYIBagFXAXwBYwFPJAABIgFuAY9aAAHkAacBVgHZAaQBeAGlAUkBGCEA - AcIBqwGgAd4B0QHKAdoBzAHEAdYBxwG+AdIBwQG4Ac4BuwGyAcsBtwGrAXsBYgFPHgABWgG8Ad0BXQHI - AegBIgFuAY9CAAGZATMQAAHkAacBVgH/AeoBxQH+AeEBtAHdAasBgAGkAUYBFR4AAcsBtwGsAeoB4wHf - AdkBzgHIAVgBSwFBAdkBzgHIAdkBzgHIAc4BuwGyAYEBaAFVHgABWgG8Ad0BaAHYAfgBLwHAAe4BLgGA - AaM8AAG1AWMBNQHpAakBWQGZATMKAAHlAaoBWQH+AfkB2wH/AfAByQH+AecBvgH+AeEBtAHfAa4BgwGk - AUYBFRsAAdQBwwG7AeoB4wHfAVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLSAcABuAGHAW8BXR4AAVoBvAHd - AWgB2AH4AS4BgAGjPAABtQFjATUB+QHDAYkB8QG2AXEB6QGoAVkBmQEzBwAB5QGqAVsB/wH+AeMB/wH4 - AdYB/wHwAckB/gHoAb4B+wHfAbQBrwFYASYMAAGZATMNAAHdAdAByQHqAeMB3wHqAeMB3wHqAeMB3wHq - AeMB3wHiAdcB0gHWAccBvgGNAXUBYwkAAZkBMxAAAV8BqQHIATIBzwH/AWgB2AH4AS8BwAHuAS4BgAGj - KgABDgF4AZ4JAAHYAZsBWwH/Ac0BmQH/Ac0BmQH5AcQBiAHxAbYBcQHoAagBWgGZATMHAAHlAaoBWQH/ - Af4B4wH/AfcB1gH7AeUBuwHkAaUBUgwAAbUBYwE1AekBqQFZAZkBMw0AAdQBxQG7AbQBngGQAd0B0AHJ - Ad0B0AHJAY0BdgFkAY4BdgFkCQABtQFjATUB6QGpAVkBmQEzCgABfwG4AdMBlgHbAe4BaAHYAfgBWgG8 - Ad0BWgG8Ad0BLwHAAe4BLgGAAaMMAAGZATMWAAEOAXgBngEvAb4B7wEMAWIBgQkAAdgBmwFbAf8BzQGZ - Af8BzQGZAfkBxAGJAfEBtgFxAekBqAFZAZkBMwcAAeQBqAFWAf8B/gHjAeEBowFODAABtQFjATUB+QHD - AYkB8QG2AXEB6QGoAVkBmQEzCgAB2QHMAcQBvAGnAZgGAAHLAbcBrAGXAYABbwYAAbUBYwE1AfkBwwGJ - AfEBtgFxAekBqAFZAZkBMwcAAX8BuAHTAa4B6wH1AawB9QH+AR8BawGMAVoBvAHdATIBzwH/AS4BgAGj - CQABtQFjATUB6QGpAVkBmQEzEAABDgF4AZ4BWAHPAfIBQgHGAfEBLgG9Ae8BDAFiAYEBrQGUAYMBnwGE - AXEBlQF6AWcB2AGbAVsB/wHNAZkB/wHNAZkB+QHDAYkByQFzAUMMAAHlAa0BXgE/AYABhwkAAdgBmwFb - Af8BzQGZAf8BzQGZAfkBxAGIAfEBtgFxAegBqAFaAZkBMwcAAd4B0QHKAeoB4wHfAdUBxQG8Ac4BvAGz - AdYBxgG9AaEBigF6AwAB2AGbAVsB/wHNAZkB/wHNAZkB+QHEAYgB8QG2AXEB6AGoAVoBmQEzBwABfwG4 - AdMBsgHsAfUBaAHYAfgBaAHYAfgBOAGFAaYJAAG1AWMBNQH5AcMBiQHxAbYBcQHpAagBWQGZATMKAAEU - AaoB4QGCAd8B9QFsAdYB8wFWAc4B8gFAAcQB8AEsAbwB7wEMAWIBgQkAAdgBmwFbAf8BzQGZAckBcwFD - DwABDgF4AZ4BLwG+Ae8BDAFiAYEJAAHYAZsBWwH/Ac0BmQH/Ac0BmQH5AcQBiQHxAbYBcQHpAagBWQGZ - ATMHAAHeAdEBygG9AawBpQG4AacBnwG2AaQBmgkAAdgBmwFbAf8BzQGZAf8BzQGZAfkBxAGJAfEBtgFx - AekBqAFZAZkBMwcAAX8BuAHTAXUBrwHLAV8BqQHICQAB2AGbAVsB/wHNAZkB/wHNAZkB+QHEAYgB8QG2 - AXEB6AGoAVoBmQEzCgABFAGqAeEBfwHeAfUBagHXAfMBVAHNAfIBPgHEAfEBKgG8Ae8BDAFiAYEJAAHY - AZsBWw8AAQ4BeAGeAVgBzwHyAUIBxgHxAS4BvQHvAQwBYgGBAa0BlAGDAZ8BhAFxAZUBegFnAdgBmwFb - Af8BzQGZAf8BzQGZAfkBwwGJAckBcwFDCQABDgF4AZ4BWAHPAfIBQgHGAfEBLgG9Ae8BDAFiAYEBrQGU - AYMBnwGEAXEBlQF6AWcB2AGbAVsB/wHNAZkB/wHNAZkB+QHDAYkByQFzAUMMAAEOAXgBngEvAb4B7wEM - AWIBgQkAAdgBmwFbAf8BzQGZAf8BzQGZAfkBxAGJAfEBtgFxAekBqAFZAZkBMwoAARQBqgHhAX4B3gH0 - AWgB1gHzAVIBzAHyARcBmAHIGwABFAGqAeEBggHfAfUBbAHWAfMBVgHOAfIBQAHEAfABLAG8Ae8BDAFi - AYEJAAHYAZsBWwH/Ac0BmQHJAXMBQwkAARQBqgHhAYIB3wH1AWwB1gHzAVYBzgHyAUABxAHwASwBvAHv - AQwBYgGBCQAB2AGbAVsB/wHNAZkByQFzAUMMAAEOAXgBngFYAc8B8gFCAcYB8QEuAb0B7wEMAWIBgQGt - AZQBgwGfAYQBcQGVAXoBZwHYAZsBWwH/Ac0BmQH/Ac0BmQH5AcMBiQHJAXMBQw8AARQBqgHhAXwB3QH1 - ARcBmAHIIQABFAGqAeEBfwHeAfUBagHXAfMBVAHNAfIBPgHEAfEBKgG8Ae8BDAFiAYEJAAHYAZsBWw8A - ARQBqgHhAX8B3gH1AWoB1wHzAVQBzQHyAT4BxAHxASoBvAHvAQwBYgGBCQAB2AGbAVsMAAEUAaoB4QGC - Ad8B9QFsAdYB8wFWAc4B8gFAAcQB8AEsAbwB7wEMAWIBgQkAAdgBmwFbAf8BzQGZAckBcwFDFQABFAGq - AeEnAAEUAaoB4QF+Ad4B9AFoAdYB8wFSAcwB8gEXAZgByCEAARQBqgHhAX4B3gH0AWgB1gHzAVIBzAHy - ARcBmAHIHgABFAGqAeEBfwHeAfUBagHXAfMBVAHNAfIBPgHEAfEBKgG8Ae8BDAFiAYEJAAHYAZsBW0UA - ARQBqgHhAXwB3QH1ARcBmAHIJwABFAGqAeEBfAHdAfUBFwGYAcgkAAEUAaoB4QF+Ad4B9AFoAdYB8wFS - AcwB8gEXAZgByFcAARQBqgHhLQABFAGqAeEqAAEUAaoB4QF8Ad0B9QEXAZgByLoAARQBqgHhMAABmQEz - JQABrQFYAScGAAGZATMfAAGcAYUBdQGWAX8BbQGQAXcBZwGJAXABXgGCAWoBVwF8AWMBTyQAASIBbgGP - BgABmQEzKwAByQFzAUMB4wGfAUkBmQEzHwAB5AGnAVYB2QGkAXgBpQFIARcBwQFoATgB4wGfAUkBmQEz - GQABwgGrAaAB3gHRAcoB2gHMAcQB1gHHAb4B0gHBAbgBzgG7AbIBywG3AasBewFiAU8eAAFaAbwB3QFd - AcgB6AEiAW4BjwHeAcQBtQHjAZ8BSQGZATMlAAHJAXMBQwHxAbYBcQHoAagBWgHjAZ8BSQGZATMZAAHk - AacBVgH/AeoBxQH+AeEBtAHZAZ8BcAGkAUUBEwHaAZMBSgHjAZ8BSQGZATMWAAHLAbcBrAHqAeMB3wHZ - Ac4ByAFYAUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVQHYAbEBnhsAAVoBvAHdAWgB2AH4AS8BwAHu - AS4BgAGjAewBuQF6AeMBnwFJAZkBMx8AAdgBmwFbAf8BzQGZAfkBwwGJAfEBtgFxAekBqQFZAeMBnwFJ - AZkBMxMAAeUBqgFZAf4B+QHbAf8B8AHJAf4B5wG+Af4B4QG0Ad8BqQF5AaQBRQETAekBqQFZAeMBnwFJ - AZkBMxMAAdQBwwG7AeoB4wHfAVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLSAcABuAGHAW8BXQH0AdoBugGZ - ATMZAAFaAbwB3QFoAdgB+AEuAYABowHrAdkBwQHxAbYBcQHpAakBWQHjAZ8BSQGZATMfAAHYAZsBWwH/ - Ac0BmQH5AcMBiQHxAbYBcQHoAagBWQHjAZ8BSQGZATMEAAGNAS0BjAkAAeUBqgFbAf8B/gHjAf8B+AHW - Af8B8AHJAf4B6AG+AfsB2QGoAa8BVwEkAfEBtgFxAegBqAFZAeMBnwFJAZkBMwQAAY0BLQGMCQAB3QHQ - AckB6gHjAd8B6gHjAd8B6gHjAd8B6gHjAd8B4gHXAdIB1gHHAb4BjQF1AWMB9gHeAcAB4wGfAUkBmQEz - BAABjQEtAYwMAAFfAakByAEyAc8B/wFoAdgB+AEvAcAB7gEuAYABowHfAdYBxAHyAb0BfwHoAagBWQHj - AZ8BSQGZATMEAAGNAS0BjBgAAdgBmwFbAf8BzQGZAfkBwwGJAfEBtgFxAckBcwFDAwABjQEtAYwB3gFz - Ad4BjQEtAYwJAAHlAaoBWQH/Af4B4wH/AfcB1gH2AeEBuAHjAaMBTwHwAbQBbgH5AcMBiQHxAbYBcQHJ - AXMBQwMAAY0BLQGMAd4BcwHeAY0BLQGMCQAB1AHFAbsBtAGeAZAB3QHQAckB3QHQAckBjQF2AWQBjgF2 - AWQB8gHYAb4B8QG2AXEByQFzAUMDAAGNAS0BjAHeAXMB3gGNAS0BjAYAAX8BuAHTAZYB2wHuAWgB2AH4 - AVoBvAHdAVoBvAHdAS8BwAHuAS4BgAGjAfoBzwGgAfEBtgFxAckBcwFDAwABjQEtAYwB3gFzAd4BjQEt - AYwPAAEOAXgBngEMAWIBgQMAAdgBmwFbAf8BzQGZAckBcwFDAwABnwE1AZ4B6gGQAeoB5AGEAeQB4AF3 - Ad4BjQEtAYwJAAHiAacBVgHhAe0B1wHfAaEBTQMAAdgBmwFbAf8BzQGZAckBcwFDAwABnwE1AZ4B6gGQ - AeoB5AGEAeQB4AF3Ad4BjQEtAYwGAAHZAcwBxAG8AacBmAEOAXgBngEMAWIBgQHLAbcBrAGXAYABbwH5 - Ad0BwQHJAXMBQwMAAZ8BNQGeAeoBkAHqAeQBhAHkAeABdwHeAY0BLQGMAwABfwG4AdMBrgHrAfUBrAH1 - Af4BHwFrAYwBWgG8Ad0BMgHPAf8BLgGAAaMB/wHXAa0ByQFzAUMDAAGfATUBngHqAZAB6gHkAYQB5AHg - AXcB3gGNAS0BjAkAAQ4BeAGeAS0BvQHvARgBswHtAQwBYgGBAwAB2AGbAVsDAAHTAWUB0gH2AawB9gHx - AaEB8AHrAZQB6wHnAYgB5QHhAXsB4AGNAS0BjAYAASUBfAGTAeABqwFeAUcBrQHEAQwBYgGBAwAB2AGb - AVsDAAHTAWUB0gH2AawB9gHxAaEB8AHrAZQB6wHnAYgB5QHhAXsB4AGNAS0BjAMAAd4B0QHKAeoB4wHf - AcsBtwGsAcIBqwGgAdYBxgG9AaEBigF6Ae0B0AGyAwAB0wFlAdIB9gGsAfYB8QGhAfAB6wGUAesB5wGI - AeUB4QF7AeABjQEtAYwDAAF/AbgB0wGZAd4B6wFoAdgB+AFoAdgB+AE4AYUBpgMAAdgBmwFbAwAB0wFl - AdIB9gGsAfYB8QGhAfAB6wGUAesB5wGIAeUB4QF7AeABjQEtAYwDAAEOAXgBngFcAdEB8wFDAcYB8QEs - Ab0B7wEYAbMB7QEMAWIBgQMAAeUBcAHkAfsBuQH7AfoBtwH6AfYBsAH2AfIBpQHzAe0BmQHtAdwBZQHb - BgABDgF4AZ4BXAHRAfMBQwHGAfEBLAG9Ae8BGAGzAe0BDAFiAYEDAAHlAXAB5AH7AbkB+wH6AbcB+gH2 - AbAB9gHyAaUB8wHtAZkB7QHcAWUB2wYAAeAB7AHxAd4B0QHKAdIBwAG4Ac0BugGxAcsBtwGsAdEB4AHm - AwAB5QFwAeQB+wG5AfsB+gG3AfoB9gGwAfYB8gGlAfMB7QGZAe0B3AFlAdsGAAFAAZUBtgF/AbgB0wF1 - Aa8BywFfAakByAG4Ad8B8AEMAWIBgQMAAeUBcAHkAfsBuQH7AfoBtwH6AfYBsAH2AfIBpQHzAe0BmQHt - AdwBZQHbAwABEAF9AaUBiwHjAfUBdQHaAfQBXAHQAfMBRAHGAfEBLAG9Ae8BGAG0Ae0BDAFiAYEDAAHl - AXAB5AH7AbkC+wG5AfsB+AGyAfgB3AFlAdsGAAEQAX0BpQGLAeMB9QF1AdoB9AFcAdAB8wFEAcYB8QEs - Ab0B7wEYAbQB7QEMAWIBgQMAAeUBcAHkAfsBuQL7AbkB+wH4AbIB+AHcAWUB2wYAARABfQGlAYsB4wH1 - Aa4B6QH5AbIB6QH5AacB5AH4AZwB4AH3ARgBtAHtAQwBYgGBAwAB5QFwAeQB+wG5AvsBuQH7AfgBsgH4 - AdwBZQHbBgABEAF9AaUBqwHrAfgBxQHvAfoBugHrAfoBvwHsAfoBZgHPAfMBGAG0Ae0BDAFiAYEDAAHl - AXAB5AH7AbkC+wG5AfsB+AGyAfgB3AFlAdsGAAEVAacB3QGeAesB9wGLAeMB9QF1AdoB8wFcAdAB8wFD - AcYB8QEsAbwB7wEYAbQB7QEMAWIBgQMAAdwBZQHbAfsBuQH7AeUBcAHkCQABFQGnAd0BngHrAfcBiwHj - AfUBdQHaAfMBXAHQAfMBQwHGAfEBLAG8Ae8BGAG0Ae0BDAFiAYEDAAHcAWUB2wH7AbkB+wHlAXAB5AkA - ARUBpwHdAZ4B6wH3AYsB4wH1AXUB2gHzAVwB0AHzAUMBxgHxASwBvAHvARgBtAHtAQwBYgGBAwAB3AFl - AdsB+wG5AfsB5QFwAeQJAAEVAacB3QGeAesB9wGLAeMB9QF1AdoB8wFcAdAB8wFDAcYB8QEsAbwB7wEY - AbQB7QEMAWIBgQMAAdwBZQHbAfsBuQH7AeUBcAHkDAABFAGqAeEBnQHrAfYBiwHjAfUBdAHaAfQBXAHQ - AfIBQwHGAfEBLAG8Ae8BGAGzAe0BDAFiAYEDAAHlAXAB5A8AARQBqgHhAZ0B6wH2AYsB4wH1AXQB2gH0 - AVwB0AHyAUMBxgHxASwBvAHvARgBswHtAQwBYgGBAwAB5QFwAeQPAAEUAaoB4QGdAesB9gGLAeMB9QF0 - AdoB9AFcAdAB8gFDAcYB8QEsAbwB7wEYAbMB7QEMAWIBgQMAAeUBcAHkDwABFAGqAeEBnQHrAfYBiwHj - AfUBdAHaAfQBXAHQAfIBQwHGAfEBLAG8Ae8BGAGzAe0BDAFiAYEDAAHlAXAB5BIAARQBqgHhAZ4B6gH2 - AYsB4wH1AXQB2gHzAVwB0QHzAUMBxwHxARcBmAHIGwABFAGqAeEBngHqAfYBiwHjAfUBdAHaAfMBXAHR - AfMBQwHHAfEBFwGYAcgbAAEUAaoB4QGeAeoB9gGLAeMB9QF0AdoB8wFcAdEB8wFDAccB8QEXAZgByBsA - ARQBqgHhAZ4B6gH2AYsB4wH1AXQB2gHzAVwB0QHzAUMBxwHxARcBmAHIHgABFAGqAeEBnQHrAfYBiwHj - AfUBdQHbAfQBFwGYAcghAAEUAaoB4QGdAesB9gGLAeMB9QF1AdsB9AEXAZgByCEAARQBqgHhAZ0B6wH2 - AYsB4wH1AXUB2wH0ARcBmAHIIQABFAGqAeEBnQHrAfYBiwHjAfUBdQHbAfQBFwGYAcgkAAEUAaoB4QGd - AeoB9gEXAZgByCcAARQBqgHhAZ0B6gH2ARcBmAHIJwABFAGqAeEBnQHqAfYBFwGYAcgnAAEUAaoB4QGd - AeoB9gEXAZgByCoAARQBqgHhLQABFAGqAeEtAAEUAaoB4S0AARQBqgHhbAABrQFYAScnAAGcAYUBdQGW - AX8BbQGQAXcBZwGJAXABXgGCAWoBVwF8AWMBTycAASIBbgGPVwAB5AGnAVYB2QGkAXgBpQFJARghAAG9 - AaYBmgHeAdEBygHaAcwBxAHWAccBvgHSAcEBuAHOAbsBsgHLAbcBqwF7AWIBTyEAAVoBvAHdAV0ByAHo - ASIBbgGPUQAB4AGjAVEB6wHTAawB/gHhAbQB0AGcAW8BpAFGARUeAAG/AaoBngHqAeMB3wHZAc4ByAFY - AUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVSEAAVoBvAHdAWgB2AH4AS8BwAHuAS4BgAGjSwAB5AGp - AVcB+wHyAdEB/wHwAckB/gHnAb4B/gHhAbQB3wGuAYMBpAFGARUbAAHHAbQBqgHqAeMB3wFYAUsBQQFY - AUsBQQFYAUsBQQHiAdcC0gHAAbgBhwFvAV0hAAFaAbwB3QFoAdgB+AEuAYABo04AAeMBqAFYAfQB8AHT - Af8B+AHWAf8B8AHJAf4B6AG+AfsB3wG0Aa8BWAEmGwABzgG/AbYB6gHjAd8B6gHjAd8B6gHjAd8B6gHj - Ad8B4gHXAdIB1gHHAb4BjQF1AWMeAAFfAakByAEyAc8B/wFoAdgB+AEvAcAB7gEuAYABo04AAeQBqQFY - Af4B+gHcAf8B9wHWAesB0gGmAeQBpQFSIQABzQG9AbIBqgGUAYUByQG5AbAByQG5AbABjQF2AWQBjgF2 - AWQeAAF/AbgB0wGVAdgB6QFoAdgB+AFaAbwB3QFaAbwB3QEvAcAB7gEuAYABo04AAeMBpwFVAfgB9AHX - AeABoQFMJAAB2QHMAcQBsAGbAYsGAAHLAbcBrAGXAYABbx4AAX8BuAHTAa0B6AHwAawB9QH+AR8BawGM - AVoBvAHdATIBzwH/AS4BgAGjGwABQQFcAXIzAAHkAasBXCcAAd4B0QHKAdMByAHAAbwBpwGaAbUBngGR - AdYBxgG9AaEBigF6IQABfwG4AdMBrAHlAe0BaAHYAfgBaAHYAfgBOAGFAaYPAAFeAXUBhAkAAUoBYQFw - AS4BqQHWASMBNQFHDwABQQGCAUwYAAFBAVwBci0AAXUBhAGRAd4B0QHKAdIBwAG4Ac0BugGxAcsBtwGs - IQABQQFcAXIDAAF/AbgB0wF1Aa8BywFfAakByA8AAY8BpAGsAYYB0wHlAUsBYQFwAwABSgFhAXABYQHB - Ad4BTAFhAW8BKQG2AekBFQEnATMBEAEsAToBFwEpATUDAAE9AXQBQwFLAacBYQkAAV4BdQGECQABSgFh - AXABLgGpAdYBIwE1AUcPAAFBAYIBTAkAAV4BdQGECQABSgFhAXABLgGpAdYBIwE1AUcPAAFBAYIBTAkA - AV4BdQGECQABSgFhAXABLgGpAdYBIwE1AUcPAAFBAYIBTAkAAY8BpAGsAYMB4QH2AUsBYQFwAXoBzQHi - AUwBYQFvAWUB0gHyAUUBXQFxATIBsgHfAR0BmQHIARoBiAGzAR8BUwFtAU8BhAFYAUwBrAFkBgABjwGk - AawBhgHTAeUBSwFhAXADAAFKAWEBcAFhAcEB3gFMAWEBbwEpAbYB6QEVAScBMwEQASwBOgEXASkBNQMA - AT0BdAFDAUsBpwFhBgABjwGkAawBhgHTAeUBSwFhAXADAAFKAWEBcAFhAcEB3gFMAWEBbwEpAbYB6QEV - AScBMwEQASwBOgEXASkBNQMAAT0BdAFDAUsBpwFhBgABjwGkAawBhgHTAeUBSwFhAXADAAFKAWEBcAFh - AcEB3gFMAWEBbwEpAbYB6QEVAScBMwEQASwBOgEXASkBNQMAAT0BdAFDAUsBpwFhDAABjwGkAawBgwHh - AfYBSwFhAXABgwHhAfYBPAFZAXMBZQHSAfIBUAHJAe8BOwG/AesBJwGyAeQBHAGjAdYBZAGVAW4BUwG0 - AWwJAAGPAaQBrAGDAeEB9gFLAWEBcAF6Ac0B4gFMAWEBbwFlAdIB8gFFAV0BcQEyAbIB3wEdAZkByAEa - AYgBswEfAVMBbQFPAYQBWAFMAawBZAkAAY8BpAGsAYMB4QH2AUsBYQFwAXoBzQHiAUwBYQFvAWUB0gHy - AUUBXQFxATIBsgHfAR0BmQHIARoBiAGzAR8BUwFtAU8BhAFYAUwBrAFkCQABjwGkAawBgwHhAfYBSwFh - AXABegHNAeIBTAFhAW8BZQHSAfIBRQFdAXEBMgGyAd8BHQGZAcgBGgGIAbMBHwFTAW0BTwGEAVgBTAGs - AWQPAAGPAaQBrAGDAeEB9gFAAVsBcgGDAeEB9gF3AdsB9AFlAdIB8gFQAckB7wE7Ab8B6wEpAbYB6QF2 - AaUBgwFdAcABeAwAAY8BpAGsAYMB4QH2AUsBYQFwAYMB4QH2ATwBWQFzAWUB0gHyAVAByQHvATsBvwHr - AScBsgHkARwBowHWAWQBlQFuAVMBtAFsDAABjwGkAawBgwHhAfYBSwFhAXABgwHhAfYBPAFZAXMBZQHS - AfIBUAHJAe8BOwG/AesBJwGyAeQBHAGjAdYBZAGVAW4BUwG0AWwMAAGPAaQBrAGDAeEB9gFLAWEBcAGD - AeEB9gE8AVkBcwFlAdIB8gFQAckB7wE7Ab8B6wEnAbIB5AEcAaMB1gFkAZUBbgFTAbQBbBIAAY8BpAGs - AYMB4QH2AYMB4QH2AYMB4QH2AXcB2wH0AWUB0gHyAV8BsgHPAXoBiwGWAa4BwQGmAZMB0wGaDwABjwGk - AawBgwHhAfYBQAFbAXIBgwHhAfYBdwHbAfQBZQHSAfIBUAHJAe8BOwG/AesBKQG2AekBdgGlAYMBXQHA - AXgPAAGPAaQBrAGDAeEB9gFAAVsBcgGDAeEB9gF3AdsB9AFlAdIB8gFQAckB7wE7Ab8B6wEpAbYB6QF2 - AaUBgwFdAcABeA8AAY8BpAGsAYMB4QH2AUABWwFyAYMB4QH2AXcB2wH0AWUB0gHyAVAByQHvATsBvwHr - ASkBtgHpAXYBpQGDAV0BwAF4FQABjwGkAawBjAGhAakBiAGcAaUBgwGWAaABfgGQAZoBegGLAZYBvwHI - Ac0BmQG4AZwBrgHBAaYSAAGPAaQBrAGDAeEB9gGDAeEB9gGDAeEB9gF3AdsB9AFlAdIB8gFfAbIBzwF6 - AYsBlgGuAcEBpgGTAdMBmhIAAY8BpAGsAYMB4QH2AYMB4QH2AYMB4QH2AXcB2wH0AWUB0gHyAV8BsgHP - AXoBiwGWAa4BwQGmAZMB0wGaEgABjwGkAawBgwHhAfYBgwHhAfYBgwHhAfYBdwHbAfQBZQHSAfIBXwGy - Ac8BegGLAZYBrgHBAaYBkwHTAZpFAAGPAaQBrAGMAaEBqQGIAZwBpQGDAZYBoAF+AZABmgF6AYsBlgG/ - AcgBzQGZAbgBnAGuAcEBphUAAY8BpAGsAYwBoQGpAYgBnAGlAYMBlgGgAX4BkAGaAXoBiwGWAb8ByAHN - AZkBuAGcAa4BwQGmFQABjwGkAawBjAGhAakBiAGcAaUBgwGWAaABfgGQAZoBegGLAZYBvwHIAc0BmQG4 - AZwBrgHBAaZOAAGtAVgBJycAAZwBhQF1AZYBfwFtAZABdwFnAYkBcAFeAYIBagFXAXwBYwFPJwABIgFu - AY8MAAGTAXsBagFgAUYBMgFjAUkBNQFjAUkBNQFjAUkBNQFjAUkBNQFjAUkBNQFjAUkBNQFjAUkBNQFj - AUkBNQFjAUkBNQFoAU4BOicAAeQBpwFWAdkBpAF4AaUBSQEYIQABvQGmAZoB3gHRAcoB2gHMAcQB1gHH - Ab4B0gHBAbgBzgG7AbIBywG3AasBewFiAU8hAAFaAbwB3QFdAcgB6AEiAW4BjwkAAZcBgAFvAfwB/gH8 - AecB5gHkAecB4gHcAeYB3AHUAeUB1gHLAeQBzwHBAeMBygG4AeMBxQGxAeIBwgGsAccBqgGYAWgBTgE6 - DAABkwF7AWoBYAFGATIBYwFJATUBYwFJATUBYwFJATUBYwFJATUBYwFJATUBcQFSATYB4AGjAVEB6wHT - AawB/gHhAbQB0AGcAW8BpAFGARUJAAGTAXsBagFgAUYBMgFjAUkBNQFjAUkBNQFjAUkBNQFjAUkBNQFf - AU8BQgG/AaoBngHqAeMB3wHZAc4ByAFYAUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVQMAAZMBewFq - AWABRgEyAWMBSQE1AWMBSQE1AWMBSQE1AWMBSQE1AWMBSQE1AWMBSQE1AWMBSQE1AWMBSQE1AVoBvAHd - AWgB2AH4AS8BwAHuAS4BgAGjBgABnAGFAXQB/AH+AfwBsAGbAYwBqgGUAYUB+wH1Ae8BtgGhAZIBsAGa - AYwBqwGVAYUBpQGPAX8B9gHbAcgBxwGqAZgBaAFOAToMAAGXAYABbwH8Af4B/AHnAeYB5AHnAeIB3AHm - AdwB1AHlAdYBywHkAc8BwQHkAakBVwH7AfIB0QH/AfAByQH+AecBvgH+AeEBtAHfAa4BgwGkAUYBFQYA - AZcBgAFvAfwB/gH8AecB5gHkAecB4gHcAeYB3AHUAeUB1gHLAfAB5AHdAccBtAGqAeoB4wHfAVgBSwFB - AVgBSwFBAVgBSwFBAeIB1wLSAcABuAGHAW8BXQMAAZcBgAFvAfwB/gH8AecB5gHkAecB4gHcAeYB3AHU - AeUB1gHLAeQBzwHBAeMBygG4AeMBxQKxAa8BqAFaAbwB3QFoAdgB+AEuAYABowkAAaABigF6AfwB/gL8 - Af4C/AH+AfwB+wH6AfcB+wH1Ae8B+gHvAeYB+QHoAdwB9wHhAdEB9gHbAsgBrgGcAWgBTgE6DAABnAGF - AXQB/AH+AfwBsAGbAYwBqgGUAYUB+wH1Ae8BtgGhAZIBsAGaAYwB4wGoAVgB9AHwAdMB/wH4AdYB/wHw - AckB/gHoAb4B+wHfAbQBrwFYASYGAAGcAYUBdAH8Af4B/AGwAZsBjAGqAZQBhQH7AfUB7wG2AaEBkgHT - AcYBvwHOAb8BtgHqAeMB3wHqAeMB3wHqAeMB3wHqAeMB3wHiAdcB0gHWAccBvgGNAXUBYwMAAZwBhQF0 - AfwB/gH8AbABmwGMAaoBlAGFAfsB9QHvAbYBoQGSAbABmgGMAasBlQGFAZUBlwGUAV8BqQHIATIBzwH/ - AWgB2AH4AS8BwAHuAS4BgAGjBgABpQGPAX8B/AH+AfwBsAGbAYwBqgGUAYUB+wH6AfcBtQGhAZIBsAGb - AYwBqgGUAYUBpAGPAX4B9wHhAdEByAGyAaIBaAFOAToMAAGgAYoBegH8Af4C/AH+AvwB/gH8AfsB+gH3 - AfsB9QHvAfoB7wHmAfYB3wHLAeQBqQFYAf4B+gHcAf8B9wHWAesB0gGmAeQBpQFSCQABoAGKAXoB/AH+ - AvwB/gL8Af4B/AH7AfoB9wH7AfUB7wH6Ae8B5gHtAd8B1gHNAb0BsgGqAZQBhQHJAbkBsAHJAbkBsAGN - AXYBZAGOAXYBZAYAAaABigF6AfwB/gL8Af4C/AH+AfwB+wH6AfcB+wH1Ae8B+gHvAeYB+QHoAdwBfwG4 - AdMBlQHYAekBaAHYAfgBWgG8Ad0BWgG8Ad0BLwHAAe4BLgGAAaMDAAGqAZUBhQH8Af4C/AH+AvwB/gL8 - Af4C/AH+AfwB+wH6AfcB+wH1AfAB+gHxAekB+QHoAd0BygG4AasBaAFOAToMAAGlAY8BfwH8Af4B/AGw - AZsBjAGqAZQBhQH7AfoB9wG1AaEBkgGwAZsBjAGqAZQBhQGqAZABdwHjAacBVQH4AfQB1wHgAaEBTAwA - AaUBjwF/AfwB/gH8AbABmwGMAaoBlAGFAfsB+gH3AbUBoQGSAbABmwGMAdQByQHCAdkBzAHEAbABmwGL - AfEB7wHuAeQB4AHdAcsBtwGsAZcBgAFvBgABpQGPAX8B/AH+AfwBsAGbAYwBqgGUAYUB+wH6AfcBtQGh - AZIBsAGbAYwBqgGUAYUBfwG4AdMBrQHoAfABrAH1Af4BHwFrAYwBWgG8Ad0BMgHPAf8BLgGAAaMDAAGv - AZsBiwH8Af4B/AHbAcsBwQHlAdoB0QH8Af4B/AHcAcoBwQHcAcoBwQGwAa0BrAFBAVwBcgH6AfMB7AHU - AckBwQFqAVEBPQwAAaoBlQGFAfwB/gL8Af4C/AH+AvwB/gL8Af4B/AH7AfoB9wH7AfUB8AH6AfEB6QH2 - Ad8BzAHkAasBXAGEAWABOwwAAaoBlQGFAfwB/gL8Af4C/AH+AvwB/gL8Af4B/AH7AfoB9wH7AfUB8AHe - AdEBygHTAcgBwAG8AacBmgG1AZ4BkQHWAcYBvQGhAYoBegYAAaoBlQGFAfwB/gL8Af4C/AH+AvwB/gL8 - Af4B/AH7AfoB9wH7AfUB8AHHAdoB4QF/AbgB0wGsAeUB7QFoAdgB+AFoAdgB+AE4AYUBpgYAAbQBoAGR - AfwB/gH8AeIC6QFeAXUBhAHfAeQB5QH8Af4B/AHCAcoBzgFKAWEBcAEuAakB1gEjATUBRwHCAb4BuQF/ - AWkBWAkAAUEBggFMAa8BmwGLAfwB/gH8AdsBywHBAeUB2gHRAfwB/gH8AdwBygHBAdwBygHBAbABrQGs - AUEBXAFyAfoB8wHsAdQByQHBAWoBUQE9DAABrwGbAYsB/AH+AfwB2wHLAcEB5QHaAdEB/AH+AfwB3AHK - AcEB3AHKAcEBsAGtAawBdQGEAZEB3gHRAcoB0gHAAbgBzQG6AbEBywG3AawJAAGvAZsBiwH8Af4B/AHb - AcsBwQHlAdoB0QH8Af4B/AHcAcoBwQHcAcoBwQGwAa0BrAFBAVwBcgHHAdsB4wF/AbgB0wF1Aa8BywFf - AakByAkAAd8BnQF9AfEBygG3AY8BpAGsAYYB0wHlAUsBYQFwAacBkgGJAUoBYQFwAWEBwQHeAUwBYQFv - ASkBtgHpARUBJwEzARABLAE6ARcBKQE1AwABPQF0AUMBSwGnAWEBtAGgAZEB/AH+AfwB4gLpAV4BdQGE - Ad8B5AHlAfwB/gH8AcIBygHOAUoBYQFwAS4BqQHWASMBNQFHAcIBvgG5AX8BaQFYCQABQQGCAUwBtAGg - AZEB/AH+AfwB4gLpAV4BdQGEAd8B5AHlAfwB/gH8AcIBygHOAUoBYQFwAS4BqQHWASMBNQFHAZEBjgGL - AV8BTwFCCQABQQGCAUwBtAGgAZEB/AH+AfwB4gLpAV4BdQGEAd8B5AHlAfwB/gH8AcIBygHOAUoBYQFw - AS4BqQHWASMBNQFHAcIBvgG5AX8BaQFYCQABQQGCAUwB3wGdAX0B/wHFAaQB5QHJAbkBjwGkAawBgwHh - AfYBSwFhAXABegHNAeIBTAFhAW8BZQHSAfIBRQFdAXEBMgGyAd8BHQGZAcgBGgGIAbMBHwFTAW0BTwGE - AVgBTAGsAWQB3wGdAX0B8QHKAbcBjwGkAawBhgHTAeUBSwFhAXABpwGSAYkBSgFhAXABYQHBAd4BTAFh - AW8BKQG2AekBFQEnATMBEAEsAToBFwEpATUDAAE9AXQBQwFLAacBYQHfAZ0BfQHxAcoBtwGPAaQBrAGG - AdMB5QFLAWEBcAGnAZIBiQFKAWEBcAFhAcEB3gFMAWEBbwEpAbYB6QEVAScBMwEQASwBOgEXASkBNQMA - AT0BdAFDAUsBpwFhAd8BnQF9AfEBygG3AY8BpAGsAYYB0wHlAUsBYQFwAacBkgGJAUoBYQFwAWEBwQHe - AUwBYQFvASkBtgHpARUBJwEzARABLAE6ARcBKQE1AwABPQF0AUMBSwGnAWEB3wGdAX0B3wGdAX0B3wGd - AX0B2gG6AaoBjwGkAawBgwHhAfYBSwFhAXABgwHhAfYBPAFZAXMBZQHSAfIBUAHJAe8BOwG/AesBJwGy - AeQBHAGjAdYBZAGVAW4BUwG0AWwB3wGdAX0B/wHFAaQB5QHJAbkBjwGkAawBgwHhAfYBSwFhAXABegHN - AeIBTAFhAW8BZQHSAfIBRQFdAXEBMgGyAd8BHQGZAcgBGgGIAbMBHwFTAW0BTwGEAVgBTAGsAWQB3wGd - AX0B/wHFAaQB5QHJAbkBjwGkAawBgwHhAfYBSwFhAXABegHNAeIBTAFhAW8BZQHSAfIBRQFdAXEBMgGy - Ad8BHQGZAcgBGgGIAbMBHwFTAW0BTwGEAVgBTAGsAWQB3wGdAX0B/wHFAaQB5QHJAbkBjwGkAawBgwHh - AfYBSwFhAXABegHNAeIBTAFhAW8BZQHSAfIBRQFdAXEBMgGyAd8BHQGZAcgBGgGIAbMBHwFTAW0BTwGE - AVgBTAGsAWQPAAGPAaQBrAGDAeEB9gFAAVsBcgGDAeEB9gF3AdsB9AFlAdIB8gFQAckB7wE7Ab8B6wEp - AbYB6QF2AaUBgwFdAcABeAHfAZ0BfQHfAZ0BfQHfAZ0BfQHaAboBqgGPAaQBrAGDAeEB9gFLAWEBcAGD - AeEB9gE8AVkBcwFlAdIB8gFQAckB7wE7Ab8B6wEnAbIB5AEcAaMB1gFkAZUBbgFTAbQBbAHfAZ0BfQHf - AZ0BfQHfAZ0BfQHaAboBqgGPAaQBrAGDAeEB9gFLAWEBcAGDAeEB9gE8AVkBcwFlAdIB8gFQAckB7wE7 - Ab8B6wEnAbIB5AEcAaMB1gFkAZUBbgFTAbQBbAHfAZ0BfQHfAZ0BfQHfAZ0BfQHaAboBqgGPAaQBrAGD - AeEB9gFLAWEBcAGDAeEB9gE8AVkBcwFlAdIB8gFQAckB7wE7Ab8B6wEnAbIB5AEcAaMB1gFkAZUBbgFT - AbQBbBIAAY8BpAGsAYMB4QH2AYMB4QH2AYMB4QH2AXcB2wH0AWUB0gHyAV8BsgHPAXoBiwGWAa4BwQGm - AZMB0wGaDwABjwGkAawBgwHhAfYBQAFbAXIBgwHhAfYBdwHbAfQBZQHSAfIBUAHJAe8BOwG/AesBKQG2 - AekBdgGlAYMBXQHAAXgPAAGPAaQBrAGDAeEB9gFAAVsBcgGDAeEB9gF3AdsB9AFlAdIB8gFQAckB7wE7 - Ab8B6wEpAbYB6QF2AaUBgwFdAcABeA8AAY8BpAGsAYMB4QH2AUABWwFyAYMB4QH2AXcB2wH0AWUB0gHy - AVAByQHvATsBvwHrASkBtgHpAXYBpQGDAV0BwAF4FQABjwGkAawBjAGhAakBiAGcAaUBgwGWAaABfgGQ - AZoBegGLAZYBvwHIAc0BmQG4AZwBrgHBAaYSAAGPAaQBrAGDAeEB9gGDAeEB9gGDAeEB9gF3AdsB9AFl - AdIB8gFfAbIBzwF6AYsBlgGuAcEBpgGTAdMBmhIAAY8BpAGsAYMB4QH2AYMB4QH2AYMB4QH2AXcB2wH0 - AWUB0gHyAV8BsgHPAXoBiwGWAa4BwQGmAZMB0wGaEgABjwGkAawBgwHhAfYBgwHhAfYBgwHhAfYBdwHb - AfQBZQHSAfIBXwGyAc8BegGLAZYBrgHBAaYBkwHTAZpFAAGPAaQBrAGMAaEBqQGIAZwBpQGDAZYBoAF+ - AZABmgF6AYsBlgG/AcgBzQGZAbgBnAGuAcEBphUAAY8BpAGsAYwBoQGpAYgBnAGlAYMBlgGgAX4BkAGa - AXoBiwGWAb8ByAHNAZkBuAGcAa4BwQGmFQABjwGkAawBjAGhAakBiAGcAaUBgwGWAaABfgGQAZoBegGL - AZYBvwHIAc0BmQG4AZwBrgHBAaYJAAGtAVgBJycAAZwBhQF1AZYBfwFtAZABdwFnAYkBcAFeAYIBagFX - AXwBYwFPJAABIgFuAY9aAAHkAacBVgHZAaQBeAGlAUkBGCEAAb0BpgGaAd4B0QHKAdoBzAHEAdYBxwG+ - AdIBwQG4Ac4BuwGyAcsBtwGrAXsBYgFPHgABWgG8Ad0BXQHIAegBIgFuAY9UAAHgAaMBUQHrAdMBrAH+ - AeEBtAHQAZwBbwGkAUYBFR4AAb8BqgGeAeoB4wHfAdkBzgHIAVgBSwFBAdkBzgHIAdkBzgHIAc4BuwGy - AYEBaAFVHgABWgG8Ad0BaAHYAfgBLwHAAe4BLgGAAaMxAAH/BQAB/wIAAf8CAAH/AgAB/w0AAeQBqQFX - AfsB8gHRAf8B8AHJAf4B5wG+Af4B4QG0Ad8BrgGDAaQBRgEVGwABxwG0AaoB6gHjAd8BWAFLAUEBWAFL - AUEBWAFLAUEB4gHXAtIBwAG4AYcBbwFdHgABWgG8Ad0BaAHYAfgBLgGAAaMxAAH/AgAB/wUAAf8WAAHj - AagBWAH0AfAB0wH/AfgB1gH/AfAByQH+AegBvgH7Ad8BtAGvAVgBJhsAAc4BvwG2AeoB4wHfAeoB4wHf - AeoB4wHfAeoB4wHfAeIB1wHSAdYBxwG+AY0BdQFjGwABXwGpAcgBMgHPAf8BaAHYAfgBLwHAAe4BLgGA - AaMrAAH/AgAB/wUAAf8EAA//CQAB5AGpAVgB/gH6AdwB/wH3AdYB6wHSAaYB5AGlAVIhAAHNAb0BsgGq - AZQBhQHJAbkBsAHJAbkBsAGNAXYBZAGOAXYBZBsAAX8BuAHTAZUB2AHpAWgB2AH4AVoBvAHdAVoBvAHd - AS8BwAHuAS4BgAGjKAAB/wIAAf8FAAH/BAAP/wwAAeMBpwFVAfgB9AHXAeABoQFMJAAB2QHMAcQBsAGb - AYsGAAHLAbcBrAGXAYABbxsAAX8BuAHTAa0B6AHwAawB9QH+AR8BawGMAVoBvAHdATIBzwH/AS4BgAGj - KAAB/wIAAf8FAAH/AgAB/x8AAeQBqwFcJwAB3gHRAcoB0wHIAcABvAGnAZoBtQGeAZEB1gHGAb0BoQGK - AXoeAAF/AbgB0wGsAeUB7QFoAdgB+AFoAdgB+AE4AYUBpisAAf8CAAH/BQAB/wIAAf8CAAH/AgAB/wIA - Af9DAAHeAdEBygHSAcABuAHNAboBsQHLAbcBrCQAAX8BuAHTAXUBrwHLAV8BqQHILgAB/wIAAf8FAAH/ - AgAB/wIAAf8CAAH/AgAB/6oAAf8CAAH/BQAB/wIAAf+zAAH/AgAB/wUAAf8EAA//owAB/wIAAf8FAAH/ - BAAP/6YAAf8CAAH/BQAB/7kAAf8FAAH/AgAB/wIAAf8CAAH//wCRAAGcAYUBdQGWAX8BbQGQAXcBZwGJ - AXABXgGCAWoBVwF8AWMBTyQAASIBbgGPhAABwgGrAaAB3gHRAcoB2gHMAcQB1gHHAb4B0gHBAbgBzgG7 - AbIBywG3AasBewFiAU8GAAGaATYBmRUAAVoBvAHdAV0ByAHoASIBbgGPDwABmgE2AZlvAAHLAbcBrAHq - AeMB3wHZAc4ByAFYAUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVQMAAdMBZQHSAaMBPgGiAY0BLQGM - EgABWgG8Ad0BaAHYAfgBLwHAAe4BLgGAAaMJAAHTAWUB0gGjAT4BogGNAS0BjGwAAdQBwwG7AeoB4wHf - AVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLSAcABuAGHAW8BXQHTAWUB0gHZAW0B2AGkAT4BowGcATgBmwGN - AS0BjA8AAVoBvAHdAWgB2AH4AS4BgAGjCQAB0wFlAdIB2QFtAdgBpAE+AaMBnAE4AZsBjQEtAYwYAAOI - AzMJAAMzA4g8AAHdAdAByQHqAeMB3wHqAeMB3wHqAeMB3wHqAeMB3wHiAdcB0gHWAccBvgGNAXUBYwHb - AW4B2gHcAXAB2wGkAT4BowGkAT4BowGhATwBoAwAAV8BqQHIATIBzwH/AWgB2AH4AS8BwAHuAS4BgAGj - AwAB1AFnAdMB2wFuAdoB3AFwAdsBpAE+AaMBpAE+AaMBoQE8AaAVAAOIAwoPAAMKA4g8AAHiAdcB0gGr - AZYBiAHOAb8BtgHOAb8BtgGNAXYBZAGOAXYBZAHHAWoBvgHcAXAB2wHrAYsB6gH7AZgB+gGkAT4BowGk - AT4BowkAAX8BuAHTAZYB2wHuAWgB2AH4AVoBvAHdAVoBvAHdAS8BwAHuAS4BgAGjAdMBZQHSAdwBcAHb - AesBiwHqAfsBmAH6AaQBPgGjAaQBPgGjFQADTQMKDwADCgNNPAAB4gHXAdIBqwGWAYgBvALdAcQByQHD - AdYBxgG9AZcBgAFvAc8BbgHKAewBkAHrAfsBmAH6AfsBmAH6AfsBmAH6AaoBRQGpCQABfwG4AdMBrgHr - AfUBrAH1Af4BHwFrAYwBWgG8Ad0BMgHPAf8BLgGAAaMB1gFsAdUB7AGQAesB+wGYAfoB+wGYAfoB+wGY - AfoBqgFFAakVAANNAwoPAAMKA008AAHeAdEBygHqAeMB3wGrAZYBiAGhAYoBegHiAdcB0gGhAYoBegHc - AXAB2wH6AbEB+gH7AaYB+gH7AZgB+gHcAXAB2wMAAZoBNgGZCQABfwG4AdMBsgHsAfUBaAHYAfgBaAHY - AfgBOAGFAaYDAAHcAXAB2wH6AbEB+gH7AaYB+gH7AZgB+gHcAXAB2wMAAZoBNgGZEgADChUAAwo/AAHe - AdEBygHSAcABuAHOAbsBsgHLAbcBrAGpAdgB2QHIAb4C3AFwAdsB+gGtAfoB3AFwAdsDAAHTAWUB0gGj - AT4BogGNAS0BjAkAAX8BuAHTAXUBrwHLAV8BqQHICQAB3AFwAdsB+gGtAfoB3AFwAdsDAAHTAWUB0gGj - AT4BogGNAS0BjAwAAwoDZBUAA2QDClEAAdwBcAHbAwAB0wFlAdIB2QFtAdgBpAE+AaMBnAE4AZsBjQEt - AYwbAAHcAXAB2wMAAdMBZQHSAdkBbQHYAaQBPgGjAZwBOAGbAY0BLQGMDAADMxUAAzNCAAGrAfAB9wGr - AeUB6QGsAtUBrAHEAcEBrQG1AawBrgGkAZgDAAHUAWcB0wHbAW4B2gHYAXEB3AGkAT4BowGkAT4BowGh - ATwBoAkAAasB8AH3AasB5QHpAawC1QGsAcQBwQGtAbUBrAGuAaQBmAMAAdQBZwHTAdsBbgHaAdgBcQHc - AaQBPgGjAaQBPgGjAaEBPAGgDAADTQMzDwADMwNNVwAB0wFlAdIB3AFwAdsB6wGLAeoB+wGYAfoBpAE+ - AaMBpAE+AaMeAAHTAWUB0gHcAXAB2wHrAYsB6gH7AZgB+gGkAT4BowGkAT4BowwAA00DMw8AAzMDTUgA - AasB8AH3AawC1QGuAbQBrAGuAZkBigMAAdYBbAHVAewBkAHrAfsBmAH6AfsBmAH6AfsBmAH6AaoBRQGp - DwABqwHwAfcBrALVAa4BtAGsAa4BmQGKAwAB1gFsAdUB7AGQAesB+wGYAfoB+wGYAfoB+wGYAfoBqgFF - AakMAAOIAzMPAAMzA4hXAAHcAXAB2wH6AbEB+gH7AaYB+gH7AZgB+gHcAXAB2yEAAdwBcAHbAfoBsQH6 - AfsBpgH6AfsBmAH6AdwBcAHbEgADiAMzCQADMwOIXQAB3AFwAdsB+gGtAfoB3AFwAdsnAAHcAXAB2wH6 - Aa0B+gHcAXAB24oAAdwBcAHbLQAB3AFwAdtsAAGcAYUBdQGWAX8BbQGQAXcBZwGJAXABXgGCAWoBVwF8 - AWMBTyQAASIBbgGPQgABmgE2AZkYAAGtAVgBJyQAAcIBqwGgAd4B0QHKAdoBzAHEAdYBxwG+AdIBwQG4 - Ac4BuwGyAcsBtwGrAXsBYgFPHgABWgG8Ad0BXQHIAegBIgFuAY8nAAGrAfAB9wGrAeIB5QGsAc4BzAGt - AbsBtQGuAacBnAYAAdMBZQHSAaMBPgGiAY0BLQGMEgAB5AGnAVYB2QGkAXgBpQFJARgPAAGaATYBmQ8A - AcsBtwGsAeoB4wHfAdkBzgHIAVgBSwFBAdkBzgHIAdkBzgHIAc4BuwGyAYEBaAFVHgABWgG8Ad0BaAHY - AfgBLwHAAe4BLgGAAaM2AAHTAWUB0gHZAW0B2AGkAT4BowGcATgBmwGNAS0BjAwAAeQBpwFWAfQB6AHE - Af4B4QG0AdYBpwF8AaMBRQEUCQAB0wFlAdIBowE+AaIBjQEtAYwMAAHUAcMBuwHqAeMB3wFYAUsBQQFY - AUsBQQFYAUsBQQHiAdcC0gHAAbgBhwFvAV0eAAFaAbwB3QFoAdgB+AEuAYABoyEAAasB8AH3AasB5QHp - AawC1QGsAcQBwQGtAbUBrAGuAaQBmAMAAdQBZwHTAdsBbgHaAdwBcAHbAaQBPgGjAaQBPgGjAaEBPAGg - CQAB5QGqAVkB/gH5AdsB/wHwAckB/gHnAb4B/gHhAbQB3wGuAYMBpAFGARUDAAHTAWUB0gHZAW0B2AGk - AT4BowGcATgBmwGNAS0BjAkAAd0B0AHJAeoB4wHfAeoB4wHfAeoB4wHfAeoB4wHfAeIB1wHSAdYBxwG+ - AY0BdQFjGwABXwGpAcgBMgHPAf8BaAHYAfgBLwHAAe4BLgGAAaMzAAHTAWUB0gHcAXAB2wHrAYsB6gH7 - AZgB+gGkAT4BowGkAT4BowkAAeMBqgFbAfQB+wHgAf8B+AHWAf8B8AHJAf4B6AG+AfIB1QGoAa8BWAEm - AdQBZwHTAdsBbgHaAdwBcAHbAaQBPgGjAaQBPgGjAaEBPAGgDAAB4gHXAdIBtAGeAZAB3QHQAckB3QHQ - AckBjQF2AWQBjgF2AWQPAAFyASQBcQkAAX8BuAHTAZYB2wHuAWgB2AH4AVoBvAHdAVoBvAHdAS8BwAHu - AS4BgAGjDwABcgEkAXEPAAGrAfAB9wGsAtUBrgG0AawBrgGZAYoDAAHWAWwB1QHsAZAB6wH7AZgB+gH7 - AZgB+gH7AZgB+gGqAUUBqQwAAeUBqgFZAf8B/gHjAf8B9wHWAfsB5QG7AeQBpQFSAwAB0wFlAdIB3AFw - AdsB6wGLAeoB+wGYAfoBpAE+AaMBpAE+AaMMAAHiAdcB0gG8AacBmAYAAdYBxgG9AZcBgAFvDAABqQFQ - AagBgAEwAX8BdQEnAXUGAAF/AbgB0wGuAesB9QGsAfUB/gEfAWsBjAFaAbwB3QEyAc8B/wEuAYABowwA - AakBUAGoAYABMAF/AXUBJwF1GwAB3AFwAdsB+gGxAfoB+wGmAfoB+wGYAfoB3AFwAdsDAAGaATYBmQwA - AeIBpwFWAfUB+QHeAeEBogFOBgAB1gFsAdUB7AGQAesB+wGYAfoB+wGYAfoB+wGYAfoBqgFFAakMAAHe - AdEBygHqAeMB3wHLAbcBrAHCAasBoAHiAdcB0gGhAYoBegkAAaoBUAGpAcwBZwHLAX4BLgF+AZYBOAGV - AXsBKwF6BgABfwG4AdMBsgHsAfUBaAHYAfgBaAHYAfgBOAGFAaYMAAGqAVABqQHMAWcBywF+AS4BfgGW - ATgBlQF7ASsBehIAAasB8AH3AasB4gHlAcgBvgLcAXAB2wH6Aa0B+gHcAXAB2wMAAdMBZQHSAaMBPgGi - AY0BLQGMDAAB5gGtAV8JAAHcAXAB2wH6AbEB+gH7AaYB+gH7AZgB+gHcAXAB2wMAAZoBNgGZDAAB3gHR - AcoB0gHAAbgBzgG7AbIBywG3AawJAAGpAVABqAHTAWsB0gHUAW4B0wF/ATABfgGfATwBnwGOATUBjQF9 - AS0BfAYAAX8BuAHTAXUBrwHLAV8BqQHIDAABqQFQAagB0wFrAdIB1AFuAdMBfwEwAX4BnwE8AZ8BjgE1 - AY0BfQEtAXwbAAHcAXAB2wMAAdMBZQHSAdkBbQHYAaQBPgGjAZwBOAGbAY0BLQGMDwABqwHwAfcBqwHi - AeUByAG+AtwBcAHbAfoBrQH6AdwBcAHbAwAB0wFlAdIBowE+AaIBjQEtAYwbAAGqAVIBqQHSAWoB0QHV - AW8B1QG9AXABvAHeAZgB3QGPAUYBjgGdATwBnAF+AS4BfhgAAaoBUgGpAdIBagHRAdUBbwHVAb0BcAG8 - Ad4BmAHdAY8BRgGOAZ0BPAGcAX4BLgF+CQABqwHwAfcBqwHlAekBrALVAawBxAHBAa0BtQGsAa4BpAGY - AwAB1AFnAdMB2wFuAdoB2AFxAdwBpAE+AaMBpAE+AaMBoQE8AaAbAAHcAXAB2wMAAdMBZQHSAdkBbQHY - AaQBPgGjAZwBOAGbAY0BLQGMAwABqwHwAfcBqwHlAekBrALVAawBxAHBAa0BtQGsAa4BpAGYAwABqAFP - AacB0gFtAdEBvAFvAbsB7wGlAe4B+wGfAfoB7wGdAe4BlwFSAZYBfAEuAXwDAAGrAfAB9wGrAeUB6QGs - AtUBrAHEAcEBrQG1AawBrgGkAZgDAAGoAU8BpwHSAW0B0QG8AW8BuwHvAaUB7gH7AZ8B+gHvAZ0B7gGX - AVIBlgF8AS4BfB4AAdMBZQHSAdwBcAHbAesBiwHqAfsBmAH6AaQBPgGjAaQBPgGjCQABqwHwAfcBqwHl - AekBrALVAawBxAHBAa0BtQGsAa4BpAGYAwAB1AFnAdMB2wFuAdoB2AFxAdwBpAE+AaMBpAE+AaMBoQE8 - AaAYAAGnAVABpgG8AW8BuwHvAaUB7gH7AZsB+gH7AZgB+gH7AZkB+gHnAZgB5gGRAU4BkBgAAacBUAGm - AbwBbwG7Ae8BpQHuAfsBmwH6AfsBmAH6AfsBmQH6AecBmAHmAZEBTgGQDwABqwHwAfcBrALVAa4BtAGs - Aa4BmQGKAwAB1gFsAdUB7AGQAesB+wGYAfoB+wGYAfoB+wGYAfoBqgFFAakeAAHTAWUB0gHcAXAB2wHr - AYsB6gH7AZgB+gGkAT4BowGkAT4BowkAAasB8AH3AawC1QGuAbQBrAGuAZkBigMAAc8BiAHPAeIBrwHi - AfsBqwH6AfsBmAH6AfsBmAH6AeoBkAHpAc8BiAHPDAABqwHwAfcBrALVAa4BtAGsAa4BmQGKAwABzwGI - Ac8B4gGvAeIB+wGrAfoB+wGYAfoB+wGYAfoB6gGQAekBzwGIAc8hAAHcAXAB2wH6AbEB+gH7AaYB+gH7 - AZgB+gHcAXAB2xIAAasB8AH3AawC1QGuAbQBrAGuAZkBigMAAdYBbAHVAewBkAHrAfsBmAH6AfsBmAH6 - AfsBmAH6AaoBRQGpGwABzwGIAc8B7gG+Ae4B+wGuAfoB7AGRAesBzwGIAc8hAAHPAYgBzwHuAb4B7gH7 - Aa4B+gHsAZEB6wHPAYgBzycAAdwBcAHbAfoBrQH6AdwBcAHbJAAB3AFwAdsB+gGxAfoB+wGmAfoB+wGY - AfoB3AFwAdshAAHPAYgBzwHjAawB4wHPAYgBzycAAc8BiAHPAeMBrAHjAc8BiAHPLQAB3AFwAdsqAAHc - AXAB2wH6Aa0B+gHcAXAB2ycAAc8BiAHPLQABzwGIAc9gAAHcAXAB2xIAASIBbgGPjQABrQFYAScqAAFa - AbwB3QFdAcgB6AEiAW4BjyEAAc8BawFsAckBaAFpAbIBWwFcAX8CPwFuAZIBogFqAYsBnAFZAXYBhwFD - AVgBaQEoATUBQwF0AZwBigFwAZYBhgFeAYEBdAFHAWQBWwErAUABOzwAAeQBpwFWAdkBpAF4AaUBSQEY - JwABWgG8Ad0BaAHYAfgBLwHAAe4BLgGAAaMeAAHQAW0BbgHoAY4BjwHmAYkBigG2AlsBcQGWAaYBWAHF - AeEBTQG+Ad0BTQG+Ad0BWwG6AdsBdwGfAY0BaAHQAZcBXgHMAZEBXgHMAZEBagHLAZsBPgFsAV82AAHk - AacBVgH/AeoBxQH+AeEBtAHdAasBgAGkAUYBFSQAAVoBvAHdAWgB2AH4AS4BgAGjIQAB0gFxAXIBpgJs - AaABYwFkAYwCSwF0AZsBrAFiAaMBvQFXAZgBtAFNAY0BqwFLAYABnAF6AaUBkgFtAbIBkgFiAakBiQFY - AaABgQFUAZIBeQE7AbwBfQE+AWwBXyQAAXIBJAFxCQAB5QGqAVkB/gH5AdsB/wHwAckB/gHnAb4B/gHh - AbQB3wGuAYMBpAFGARUeAAFfAakByAEyAc8B/wFoAdgB+AEvAcAB7gEuAYABox4AAdYBeAF5AfYBqgGr - AfABnQGeAcsCaAF3AaEBsQFjAdMB8wFcAdAB8wFVAc0B8gFbAboB2wF+AaoBlQF0AeIBqAFuAeEBpQFn - Ad8BoQFqAcsBmwE7AbwBfQE+AWwBXyEAAakBUAGoAYABMAF/AXUBJwF1BgAB5QGqAVsB/wH+AeMB/wH4 - AdYB/wHwAckB/gHoAb4B+wHfAbQBrwFYASYPAAFyASQBcQkAAX8BuAHTAZYB2wHuAWgB2AH4AVoBvAHd - AVoBvAHdAS8BwAHuAS4BgAGjGwAB2gGCAYMBwwJ/AbwBdAF1AaQCWQF8AaYBtwFpAaYBvQFfAZwBtAFV - AZABrAFLAYABnAGDAbABmwFzAbMBlAFpAaoBjAFfAaEBhQFUAZIBeQE7AbwBfQFAAW4BYR4AAaoBUAGp - AcwBZwHLAX4BLgF+AZYBOAGVAXsBKwF6BgAB5QGqAVkB/wH+AeMB/wH3AdYB+wHlAbsB5AGlAVIPAAGp - AVABqAGAATABfwF1AScBdQYAAX8BuAHTAa4B6wH1AawB9QH+AR8BawGMAVoBvAHdATIBzwH/AS4BgAGj - GwAB3wGKAYsB/QG5AbsB+QGwAbEBzgFuAW0BfwGsAb0BfgHeAfUBeAHcAfQBcQHZAfQBWwG6AdsBhgG1 - AZ8BjAHnAbQBhwHlAbABgAHkAa4BagHLAZsBOwG8AX0BQwFyAWUGAAGrAfAB9wGrAeIB5QGsAc4BzAGt - AbsBtQGuAacBnAYAAakBUAGoAdMBawHSAdQBbgHTAX8BMAF+AZ8BPAGfAY4BNQGNAX0BLQF8BgAB5AGo - AVYB/wH+AeMB4gGjAU8PAAGqAVABqQHMAWcBywF+AS4BfgGWATgBlQF7ASsBegYAAX8BuAHTAbIB7AH1 - AWgB2AH4AWgB2AH4ATgBhQGmHgAB4wGTAZQB/wG9Ab4B/QG3AbkBzwFxAXABgwGyAcMBiwHjAfUBhQHh - AfQBfgHeAfQBWwG6AdsBigG7AaMBlwHoAbkBkgHnAbYBjAHmAbMBagHLAZsBOwG8AX0BRwF2AWgYAAGq - AVIBqQHSAWoB0QHVAW8B1QG9AXABvAHeAZgB3QGPAUYBjgGdATwBnAF+AS4BfgYAAbEB5gLjAa0BXgG4 - AcIBqwGtAbsBtQGuAacBnAYAAakBUAGoAdMBawHSAdQBbgHTAX8BMAF+AZ8BPAGfAY4BNQGNAX0BLQF8 - BgABfwG4AdMBdQGvAcsBXwGpAcgSAAGkAYoBewGPAXQBYwGIAW0BWwYAAecBmwGcAf8BvQG+Af8BvQG+ - AdEBdAFzAYgBtwHJAZYB5wH2AZEB5gH2AYoB4wH1AVsBugHbAY8BwQGpAaEB6gG/AZ0B6gG8AZYB6AG4 - AWoBywGbATsBvAF9AUsBewFrAwABqwHwAfcBqwHlAekBrALVAawBxAHBAa0BtQGsAa4BpAGYAwABqAFP - AacB0gFtAdEBvAFvAbsB7wGlAe4B+wGfAfoB7wGdAe4BlwFSAZYBfAEuAXwYAAGqAVIBqQHSAWoB0QHV - AW8B1QG9AXABvAHeAZgB3QGPAUYBjgGdATwBnAF+AS4BfgYAAbMBngGPAakBlAGFEgABvwGoAZsBxQGy - AacB0wHFAb8ByAG5AbABjgFzAWEDAAHsAaQBpQH/Ab0BvgH/Ab0BvgHSAnYBiwG8Ac4BnwHrAfYBmwHq - AfYBlgHnAfYBWwG6AdsBkwHGAa0BqQHrAcIBpgHrAcABoQHqAb8BagHLAZsBOwG8AX0BTwGAAXAYAAGn - AVABpgG8AW8BuwHvAaUB7gH7AZsB+gH7AZgB+gH7AZkB+gHnAZgB5gGRAU4BkAMAAasB8AH3AasB5QHp - AawC1QGsAcQBwQGtAbUBrAGuAaQBmAMAAagBTwGnAdIBbQHRAbwBbwG7Ae8BpQHuAfsBnwH6Ae8BnQHu - AZcBUgGWAXwBLgF8AwAB1QHEAbwB2QHKAcIBxgGxAaUBqQGUAYUBuwGnAZkBpAGOAX0BigFyAWABcwFZ - AUUBuAGhAZQBxAGtAaEJAAHLAb8BtgGIAW0BWwHwAawBrQHNAoUBxQF6AXsBrAJdAY0BwAHSAXgBrQG+ - AW8BogG1AWYBlwGsAUsBgAGcAZUBygGwAYABtQGaAXcBrAGTAW4BowGLAVQBkgF5ATsBvAF9AVQBhAFz - CQABqwHwAfcBrALVAa4BtAGsAa4BmQGKAwABzwGIAc8B4gGvAeIB+wGrAfoB+wGYAfoB+wGYAfoB6gGQ - AekBzwGIAc8bAAGnAVABpgG8AW8BuwHvAaUB7gH7AZsB+gH7AZgB+gH7AZkB+gHnAZgB5gGRAU4BkAMA - AeIB1wHRAfcB9AHyAdkBygHCAbMBngGPAbIBnQGPAZ4BiAF3AYYBbgFbAXABVwFCAdIBvwG3AbIBmwGM - CQAB1AHHAcABjwF1AWMB9AGzAbQB/wG9Ab4B/wG9Ab4B0wJ5AY8BwwHVAasB8AH3AasB8AH3AagB7wH3 - AVsBugHbAZcBzAGyAbQB7gHIAbQB7gHIAbEB7QHGAWoBywGbATsBvAF9AVkBigF4GwABzwGIAc8B7gG+ - Ae4B+wGuAfoB7AGRAesBzwGIAc8PAAGrAfAB9wGsAtUBrgG0AawBrgGZAYoDAAHPAYgBzwHiAa8B4gH7 - AasB+gH7AZgB+gH7AZgB+gHqAZAB6QHPAYgBzwkAAeIB1wHRAdUBxAG7DwAByQG3Aa0BpQGPAX4JAAHC - Aa8BowGnAY0BfQH1AbYBtwH1AbYBtwHtAacBqQHPAnEBjwHDAdUBhQG0AccBegGkAbQBcAGVAaYBagGL - AZwBlwHMAbIBjQG/AagBgQGtAZgBdgGfAY0BcAGWAYYBOwG8AX0BXgGQAX0eAAHPAYgBzwHjAawB4wHP - AYgBzyQAAc8BiAHPAe4BvgHuAfsBrgH6AewBkQHrAc8BiAHPJAAB1AHHAb8BpQGPAX4BsgGbAY0BxAGs - AaEBwQGpAZwGAAHWAaIBnQGSAX0BbQHlAeAB3AHNAZkBngGRAbIBuQGQAXwBbQHlAeAB3AP/AWoBiwGc - AZYBtAGjAYsBcQF6AeQB3QHfA/8BcAGWAYYBZAGVAYEhAAHPAYgBzyoAAc8BiAHPAeMBrAHjAc8BiAHP - KgABzgG8AbIB0wHBAbgBvwGpAZwMAAHGAZkBkgGVAX0BbgH0AewB6AHLAZEBlgGMAasBswGGAYMBfQH0 - AewB6AHiAfMB9QFqAYsBnAMAAYUBfgF/AfIB6QHtAeQB8gHpAXABlgGGUQABzwGIAc/VAAEiAW4Bj10A - Aa0BWAEnJwABnAGFAXUBlgF/AW0BkAF3AWcBiQFwAV4BggFqAVcBfAFjAU8hAAFaAbwB3QFdAcgB6AEi - AW4Bj1cAAeQBpwFWAdkBpAF4AaUBSQEYIQABwgGrAaAB3gHRAcoB2gHMAcQB1gHHAb4B0gHBAbgBzgG7 - AbIBywG3AasBewFiAU8eAAFaAbwB3QFoAdgB+AEvAcAB7gEuAYABo1EAAeQBpwFWAf8B6gHFAf4B4QG0 - Ad0BqwGAAaQBRgEVHgABywG3AawB6gHjAd8B2QHOAcgBWAFLAUEB2QHOAcgB2QHOAcgBzgG7AbIBgQFo - AVUeAAFaAbwB3QFoAdgB+AEuAYABo1EAAeUBqgFZAf4B+QHbAf8B8AHJAf4B5wG+Af4B4QG0Ad8BrgGD - AaQBRgEVGwAB1AHDAbsB6gHjAd8BWAFLAUEBWAFLAUEBWAFLAUEB4gHXAtIBwAG4AYcBbwFdGwABXwGp - AcgBMgHPAf8BaAHYAfgBLwHAAe4BLgGAAaNOAAHlAaoBWwH/Af4B4wH/AfgB1gH/AfAByQH+AegBvgH7 - Ad8BtAGvAVgBJhsAAd0B0AHJAeoB4wHfAeoB4wHfAeoB4wHfAeoB4wHfAeIB1wHSAdYBxwG+AY0BdQFj - GAABfwG4AdMBlgHbAe4BaAHYAfgBWgG8Ad0BWgG8Ad0BLwHAAe4BLgGAAaM8AAGkAYoBewGPAXQBYwGI - AW0BWwkAAeUBqgFZAf8B/gHjAf8B9wHWAfsB5QG7AeQBpQFSIQAB1AHFAbsBtAGeAZAB3QHQAckB3QHQ - AckBjQF2AWQBjgF2AWQbAAF/AbgB0wGuAesB9QGsAfUB/gEfAWsBjAFaAbwB3QEyAc8B/wEuAYABoyEA - AbMBngGPAakBlAGFEgABvwGoAZsBxQGyAacB0wHFAb8ByAG5AbABjgFzAWEJAAHkAagBVgH/Af4B4wHi - AaMBTyQAAdkBzAHEAbwBpwGYBgABywG3AawBlwGAAW8eAAF/AbgB0wGyAewB9QFoAdgB+AFoAdgB+AE4 - AYUBpiEAAdUBxAG8AdkBygHCAcYBsQGlAakBlAGFAbsBpwGZAaQBjgF9AYoBcgFgAXMBWQFFAbgBoQGU - AcQBrQGhCQABywG/AbYBiAFtAVsJAAHmAa0BXycAAd4B0QHKAeoB4wHfAcsBtwGsAcIBqwGgAdYBxgG9 - AaEBigF6IQABfwG4AdMBdQGvAcsBXwGpAcgSAAGkAYoBewGPAXQBYwGIAW0BWwkAAeIB1wHRAfcB9AHy - AdkBygHCAbMBngGPAbIBnQGPAZ4BiAF3AYYBbgFbAXABVwFCAdIBvwG3AbIBmwGMCQAB1AHHAcABjwF1 - AWMeAAGkAYoBewGPAXQBYwGIAW0BWw8AAd4B0QHKAdIBwAG4Ac0BugGxAcsBtwGsDwABpAGKAXsBjwF0 - AWMBiAFtAVsMAAGzAZ4BjwGpAZQBhRIAAb8BqAGbAcUBsgGnAdMBxQG/AcgBuQGwAY4BcwFhCQAB4gHX - AdEB1QHEAbsPAAHJAbcBrQGlAY8BfgkAAcIBrwGjAacBjQF9AwABswGeAY8BqQGUAYUSAAG/AagBmwHF - AbIBpwHTAcUBvwHIAbkBsAGOAXMBYQwAAbMBngGPAakBlAGFEgABvwGoAZsBxQGyAacB0wHFAb8ByAG5 - AbABjgFzAWEGAAHVAcQBvAHZAcoBwgHGAbEBpQGpAZQBhQG7AacBmQGkAY4BfQGKAXIBYAFzAVkBRQG4 - AaEBlAHEAa0BoQkAAcsBvwG2AYgBbQFbHgAB1AHHAb8BpQGPAX4BsgGbAY0BxAGsAaEBwQGpAZwDAAHV - AcQBvAHZAcoBwgHGAbEBpQGpAZQBhQG7AacBmQGkAY4BfQGKAXIBYAFzAVkBRQG4AaEBlAHEAa0BoQkA - AcsBvwG2AYgBbQFbBgAB1QHEAbwB2QHKAcIBxgGxAaUBqQGUAYUBuwGnAZkBpAGOAX0BigFyAWABcwFZ - AUUBuAGhAZQBxAGtAaEJAAHLAb8BtgGIAW0BWwMAAeIB1wHRAfcB9AHyAdkBygHCAbMBngGPAbIBnQGP - AZ4BiAF3AYYBbgFbAXABVwFCAdIBvwG3AbIBmwGMCQAB1AHHAcABjwF1AWMhAAHOAbwBsgHTAcEBuAG/ - AakBnAYAAeIB1wHRAfcB9AHyAdkBygHCAbMBngGPAbIBnQGPAZ4BiAF3AYYBbgFbAXABVwFCAdIBvwG3 - AbIBmwGMCQAB1AHHAcABjwF1AWMGAAHiAdcB0QH3AfQB8gHZAcoBwgGzAZ4BjwGyAZ0BjwGeAYgBdwGG - AW4BWwFwAVcBQgHSAb8BtwGyAZsBjAkAAdQBxwHAAY8BdQFjBgAB4gHXAdEB1QHEAbsPAAHJAbcBrQGl - AY8BfgkAAcIBrwGjAacBjQF9MwAB4gHXAdEB1QHEAbsPAAHJAbcBrQGlAY8BfgkAAcIBrwGjAacBjQF9 - CQAB4gHXAdEB1QHEAbsPAAHJAbcBrQGlAY8BfgkAAcIBrwGjAacBjQF9HgAB1AHHAb8BpQGPAX4BsgGb - AY0BxAGsAaEBwQGpAZxOAAHUAccBvwGlAY8BfgGyAZsBjQHEAawBoQHBAakBnCQAAdQBxwG/AaUBjwF+ - AbIBmwGNAcQBrAGhAcEBqQGcJAABzgG8AbIB0wHBAbgBvwGpAZxUAAHOAbwBsgHTAcEBuAG/AakBnCoA - Ac4BvAGyAdMBwQG4Ab8BqQGczwABIgFuAY9dAAGtAVgBJycAAZwBhQF1AZYBfwFtAZABdwFnAYkBcAFe - AYIBagFXAXwBYwFPIQABWgG8Ad0BXQHIAegBIgFuAY9XAAHkAacBVgHZAaQBeAGlAUkBGCEAAcIBqwGg - Ad4B0QHKAdoBzAHEAdYBxwG+AdIBwQG4Ac4BuwGyAcsBtwGrAXsBYgFPHgABWgG8Ad0BaAHYAfgBLwHA - Ae4BLgGAAaNRAAHkAacBVgH/AeoBxQH+AeEBtAHdAasBgAGkAUYBFR4AAcsBtwGsAeoB4wHfAdkBzgHI - AVgBSwFBAdkBzgHIAdkBzgHIAc4BuwGyAYEBaAFVHgABWgG8Ad0BaAHYAfgBLgGAAaNRAAHlAaoBWQH+ - AfkB2wH/AfAByQH+AecBvgH+AeEBtAHfAa4BgwGkAUYBFRsAAdQBwwG7AeoB4wHfAVgBSwFBAVgBSwFB - AVgBSwFBAeIB1wLSAcABuAGHAW8BXRsAAV8BqQHIATIBzwH/AWgB2AH4AS8BwAHuAS4BgAGjDAABmQEz - QAAB5QGqAVsB/wH+AeMB/wH4AdYB/wHwAckB/gHoAb4B+wHfAbQBrwFYASYbAAHdAdAByQHqAeMB3wHq - AeMB3wHqAeMB3wHqAeMB3wHiAdcB0gHWAccBvgGNAXUBYxgAAX8BuAHTAZYB2wHuAWgB2AH4AVoBvAHd - AVoBvAHdAS8BwAHuAS4BgAGjBgAB1wGaAVoBmQEzAQABmQEzLgABpAGKAXsBjwF0AWMBiAFtAVsJAAHl - AaoBWQH/Af4B4wH/AfcB1gH7AeUBuwHkAaUBUiEAAdQBxQG7AbQBngGQAd0B0AHJAd0B0AHJAY0BdgFk - AY4BdgFkGwABfwG4AdMBrgHrAfUBrAH1Af4BHwFrAYwBWgG8Ad0BMgHPAf8BLgGAAaMDAAHXAZoBWgHY - AZsBWwGZATMBAAGZATMBAAGZATMQAAGzAZ4BjwGpAZQBhRIAAb8BqAGbAcUBsgGnAdMBxQG/AcgBuQGw - AY4BcwFhCQAB5AGoAVYB/wH+AeMB4gGjAU8kAAHZAcwBxAG8AacBmAYAAcsBtwGsAZcBgAFvHgABfwG4 - AdMBsgHsAfUBaAHYAfgBaAHYAfgBOAGFAaYDAAHYAZsBXAHYAZsBWwHYAZsBWwGZATMBAAGZATMBAAGZ - ATMBAAGZATMKAAHVAcQBvAHZAcoBwgHGAbEBpQGpAZQBhQG7AacBmQGkAY4BfQGKAXIBYAFzAVkBRQG4 - AaEBlAHEAa0BoQkAAcsBvwG2AYgBbQFbCQAB5gGtAV8nAAHeAdEBygHqAeMB3wHLAbcBrAHCAasBoAHW - AcYBvQGhAYoBeiEAAX8BuAHTAXUBrwHLAV8BqQHIBgAB2AGbAVsB2AGbAVsB6QG0AXwB/AHWAa8BtQFj - ATUBmQEzAQABmQEzAQABmQEzBwAB4gHXAdEB9wH0AfIB2QHKAcIBswGeAY8BsgGdAY8BngGIAXcBhgFu - AVsBcAFXAUIB0gG/AbcBsgGbAYwJAAHUAccBwAGPAXUBYx4AAaQBigF7AY8BdAFjAYgBbQFbDwAB3gHR - AcoB0gHAAbgBzQG6AbEBywG3AawPAAGkAYoBewGPAXQBYwGIAW0BWxsAAdgBmwFbAeoBtwGCAfsB2AGy - Af4B0QGjAfsB2AGyAa8BVwEoAZkBMwEAAZkBMwoAAeIB1wHRAdUBxAG7DwAByQG3Aa0BpQGPAX4JAAHC - Aa8BowGnAY0BfQMAAbMBngGPAakBlAGFEgABvwGoAZsBxQGyAacB0wHFAb8ByAG5AbABjgFzAWEMAAGz - AZ4BjwGpAZQBhRIAAb8BqAGbAcUBsgGnAdMBxQG/AcgBuQGwAY4BcwFhGAAB5wGzAXwB8QHDAZEB/gHP - AZ0B/wHNAZkB/gHQAZ8B+wHYAbIBqQFOAR4BmQEzIgAB1AHHAb8BpQGPAX4BsgGbAY0BxAGsAaEBwQGp - AZwDAAHVAcQBvAHZAcoBwgHGAbEBpQGpAZQBhQG7AacBmQGkAY4BfQGKAXIBYAFzAVkBRQG4AaEBlAHE - Aa0BoQkAAcsBvwG2AYgBbQFbBgAB1QHEAbwB2QHKAcIBxgGxAaUBqQGUAYUBuwGnAZkBpAGOAX0BigFy - AWABcwFZAUUBuAGhAZQBxAGtAaEJAAHLAb8BtgGIAW0BWxgAAeUBsgF7AfQBwAGLAf8BzQGZAf8BzQGZ - Af4B0AGhAfIByQGdAbABWgEpJAABzgG8AbIB0wHBAbgBvwGpAZwGAAHiAdcB0QH3AfQB8gHZAcoBwgGz - AZ4BjwGyAZ0BjwGeAYgBdwGGAW4BWwFwAVcBQgHSAb8BtwGyAZsBjAkAAdQBxwHAAY8BdQFjBgAB4gHX - AdEB9wH0AfIB2QHKAcIBswGeAY8BsgGdAY8BngGIAXcBhgFuAVsBcAFXAUIB0gG/AbcBsgGbAYwJAAHU - AccBwAGPAXUBYxsAAeQBsAF5AfYBxAGQAf8BzQGZAfMBwgGOAeMBsAF5OQAB4gHXAdEB1QHEAbsPAAHJ - AbcBrQGlAY8BfgkAAcIBrwGjAacBjQF9CQAB4gHXAdEB1QHEAbsPAAHJAbcBrQGlAY8BfgkAAcIBrwGj - AacBjQF9HgAB4wGvAXgB7gG9AYoB4wGwAXlUAAHUAccBvwGlAY8BfgGyAZsBjQHEAawBoQHBAakBnCQA - AdQBxwG/AaUBjwF+AbIBmwGNAcQBrAGhAcEBqQGcJAAB5QGyAX1aAAHOAbwBsgHTAcEBuAG/AakBnCoA - Ac4BvAGyAdMBwQG4Ab8BqQGc/wAzAAGtAVgBJyQAAZwBhQF1AZYBfwFtAZABdwFnAYkBcAFeAYIBagFX - AXwBYwFPJwABIgFuAY9aAAHkAacBVgHZAaQBeAGlAUkBGB4AAcIBqwGgAd4B0QHKAdoBzAHEAdYBxwG+ - AdIBwQG4Ac4BuwGyAcsBtwGrAXsBYgFPIQABWgG8Ad0BXQHIAegBIgFuAY9UAAHkAacBVgH/AeoBxQH+ - AeEBtAHdAasBgAGkAUYBFRsAAcsBtwGsAeoB4wHfAdkBzgHIAVgBSwFBAdkBzgHIAdkBzgHIAc4BuwGy - AYEBaAFVIQABWgG8Ad0BaAHYAfgBLwHAAe4BLgGAAaMzAAGZATMZAAHlAaoBWQH+AfkB2wH/AfAByQH+ - AecBvgH+AeEBtAHfAa4BgwGkAUYBFRgAAdQBwwG7AeoB4wHfAVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLS - AcABuAGHAW8BXSEAAVoBvAHdAWgB2AH4AS4BgAGjMwAB1wGaAVoBmQEzAQABmQEzFgAB5QGqAVsB/wH+ - AeMB/wH4AdYB/wHwAckB/gHoAb4B+wHfAbQBrwFYASYJAAGZATMNAAHdAdAByQHqAeMB3wHqAeMB3wHq - AeMB3wHqAeMB3wHiAdcB0gHWAccBvgGNAXUBYwYAAZkBMxYAAV8BqQHIATIBzwH/AWgB2AH4AS8BwAHu - AS4BgAGjLQAB1wGaAVoB2AGbAVsBmQEzAQABmQEzAQABmQEzFgAB5QGqAVkB/wH+AeMB/wH3AdYB+wHl - AbsB5AGlAVIJAAHXAZoBWgGZATMBAAGZATMNAAHUAcUBuwG0AZ4BkAHdAdAByQHdAdAByQGNAXYBZAGO - AXYBZAYAAdcBmgFaAZkBMwEAAZkBMxAAAX8BuAHTAZYB2wHuAWgB2AH4AVoBvAHdAVoBvAHdAS8BwAHu - AS4BgAGjAYcBbwFdAYEBaQFWAX0BZAFRAXgBXwFLAXMBWgFGAW8BVgFBAWsBUQE9AWgBTQE5DwAB2AGb - AVwB2AGbAVsB2AGbAVsBmQEzAQABmQEzAQABmQEzAQABmQEzFgAB5AGoAVYB/wH+AeMB4gGjAU8JAAHX - AZoBWgHYAZsBWwGZATMBAAGZATMBAAGZATMKAAHZAcwBxAG8AacBmAYAAcsBtwGsAZcBgAFvAwAB1wGa - AVoB2AGbAVsBmQEzAQABmQEzAQABmQEzDQABfwG4AdMBrgHrAfUBrAH1Af4BHwFrAYwBWgG8Ad0BMgHP - Af8BLgGAAaMB/QH3AfQB/AH1AfIB/AHzAfAB+wHyAe0B+wHxAesB+wHvAekB+QHtAecBbAFRAT0PAAHY - AZsBWwHYAZsBWwHpAbQBfAH8AdYBrwG1AWMBNQGZATMBAAGZATMBAAGZATMWAAHmAa0BXwkAAdgBmwFc - AdgBmwFbAdgBmwFbAZkBMwEAAZkBMwEAAZkBMwEAAZkBMwcAAd4B0QHKAeoB4wHfAcsBtwGsAcIBqwGg - AdYBxgG9AaEBigF6AdgBmwFcAdgBmwFbAdgBmwFbAZkBMwEAAZkBMwEAAZkBMwEAAZkBMw0AAX8BuAHT - AbIB7AH1AWgB2AH4AWgB2AH4ATgBhQGmAZgBsgG9Af0B+AH2AZcBgAFvAYoBcgFgAX4BZQFRAXMBWQFF - AfsB8AHsAfoB7wHpAW8BVgFBDwAB2AGbAVsB6gG3AYIB+wHYAbIB/gHRAaMB+wHYAbIBrwFXASgBmQEz - AQABmQEzIgAB2AGbAVsB2AGbAVsB6QG0AXwB/AHWAa8BtQFjATUBmQEzAQABmQEzAQABmQEzBwAB3gHR - AcoB0gHAAbgBzQG6AbEBywG3AawDAAHYAZsBWwHYAZsBWwHpAbQBfAH8AdYBrwG1AWMBNQGZATMBAAGZ - ATMBAAGZATMNAAF/AbgB0wF1Aa8BywFfAakByAMAAbwBpAGVAf4B+gH4Af0B+AH2AfwB9wH0AfwB9QHy - AfsB8wHwAfsB8gHuAfoB8AHrAXMBWQFHDwAB5wGzAXwB8QHDAZEB/gHPAZ0B/wHNAZkB/gHQAZ8B+wHY - AbIBqQFOAR4BmQEzIgAB2AGbAVsB6gG3AYIB+wHYAbIB/gHRAaMB+wHYAbIBrwFXASgBmQEzAQABmQEz - FgAB2AGbAVsB6gG3AYIB+wHYAbIB/gHRAaMB+wHYAbIBrwFXASgBmQEzAQABmQEzBwABqwHwAfcBqwHi - AeUBrAHOAcwBrQG7AbUBrgGnAZwDAAHCAaoBnQH+AfsB+QGXAYABbwGKAXIBYAF+AWUBUgFzAVkBRQFp - AU8BOgH7AfIB7QF4AV8BSxIAAeUBsgF7AfQBwAGLAf8BzQGZAf8BzQGZAf4B0AGhAfIByQGdAbABWgEp - IQAB5wGzAXwB8QHDAZEB/gHPAZ0B/wHNAZkB/gHQAZ8B+wHYAbIBqQFOAR4BmQEzFgAB5wGzAXwB8QHD - AZEB/gHPAZ0B/wHNAZkB/gHQAZ8B+wHYAbIBqQFOAR4BmQEzGQABxgGxAaUB/gH8AfsB/gH7AfoB/gH5 - AfgB/QH5AfYB/QH3AfQB/AH2AfIB/AH0AfABfQFkAVEVAAHkAbABeQH2AcQBkAH/Ac0BmQHzAcIBjgHj - AbABeScAAeUBsgF7AfQBwAGLAf8BzQGZAf8BzQGZAf4B0AGhAfIByQGdAbABWgEpGAAB5QGyAXsB9AHA - AYsB/wHNAZkB/wHNAZkB/gHQAaEB8gHJAZ0BsAFaASkDAAGrAfAB9wGrAeUB6QGsAtUBrAHEAcEBrQG1 - AawBrgGkAZgDAAHNAbkBrgH/Af0B/AGXAYABbwGKAXMBYAF+AWUBUgH9AfgB9gH8AfcB9AH8AfUB8gGC - AWkBVhgAAeMBrwF4Ae4BvQGKAeMBsAF5LQAB5AGwAXkB9gHEAZAB/wHNAZkB8wHCAY4B4wGwAXkeAAHk - AbABeQH2AcQBkAH/Ac0BmQHzAcIBjgHjAbABeRsAAdMBwgG5Af8E/gH9Af8C/AH9AfoB+QH9AfoB+AH9 - AfgB9gH8AfYB9AGHAW4BXRsAAeUBsgF9MwAB4wGvAXgB7gG9AYoB4wGwAXkkAAHjAa8BeAHuAb0BigHj - AbABeQ8AAasB8AH3AawC1QGuAbQBrAGuAZkBigMAAdkBygHDAdMBwQG4AcwBuQGuAccBsQGlAcEBqgGd - AbwBowGWAbYBnAGNAa8BlQGFAaoBjwF+VAAB5QGyAX0qAAHlAbIBff8AnAABYAGUAaeEAAGcAYUBdQGW - AX8BbQGQAXcBZwGJAXABXgGCAWoBVwF8AWMBTyQAAaQBuQHAAZABvQHvASABggGtVAABrQFYAScnAAHC - AasBoAHeAdEBygHaAcwBxAHWAccBvgHSAcEBuAHOAbsBsgHLAbcBqwF7AWIBTyQAAZIBxgHwAYIBhwHh - AR0BeAGfLQABqQGPAX4BhwFvAV0BgQFpAVYBfQFkAVEBeAFfAUsBcwFaAUYBbwFWAUEBawFRAT0BaAFN - ATkGAAHkAacBVgHZAaQBeAGlAUkBGCQAAcsBtwGsAeoB4wHfAdkBzgHIAVgBSwFBAdkBzgHIAdkBzgHI - Ac4BuwGyAYEBaAFVJAABnwG+AcoBdgHRAfoBggGHAeEBHwFvAZUqAAGwAZUBhQH9AfcB9AH8AfUB8gH8 - AfMB8AH7AfIB7QH7AfEB6wH7Ae8B6QH5Ae0B5wFsAVEBPQMAAeQBpwFWAf8B6gHFAf4B4QG0Ad0BqwGA - AaQBRgEVIQAB1AHDAbsB6gHjAd8BWAFLAUEBWAFLAUEBWAFLAUEB4gHXAtIBwAG4AYcBbwFdJwABkAG4 - AcYBdgHRAfoBggGHAeEBIgFoAYwnAAG2AZsBjgH9AfgB9gGXAYABbwGKAXIBYAF+AWUBUQFzAVkBRQH7 - AfAB7AH6Ae8B6QFvAVYBQQHlAaoBWQH+AfkB2wH/AfAByQH+AecBvgH+AeEBtAHfAa4BgwGkAUYBFR4A - Ad0B0AHJAeoB4wHfAeoB4wHfAeoB4wHfAeoB4wHfAeIB1wHSAdYBxwG+AY0BdQFjIQABYAGXAa4BUwGD - AZcBRgFsAXkBXAGCAYwBdgHRAfoBggGHAeEBKQFPAWskAAG8AaQBlQH+AfoB+AH9AfgB9gH8AfcB9AH8 - AfUB8gH7AfMB8AH7AfIB7gH6AfAB6wFzAVkBRwHlAaoBWwH/Af4B4wH/AfgB1gH/AfAByQH+AegBvgH7 - Ad8BtAGvAVgBJgGpAY8BfgGHAW8BXQGBAWkBVgF9AWQBUQF4AV8BSwFzAVoBRgFvAVYBQQFrAVEBPQFo - AU0BOQYAAdQBxQG7AbQBngGQAd0B0AHJAd0B0AHJAY0BdgFkAY4BdgFkAYkBcgFgAYEBaQFWAX0BZAFR - AXgBXwFLAXMBWgFGAW8BVgFBAWsBUQE9AWgBTQE5DAABWQHIAecBfwHkAf8BfwHkAf8BlAHMAfIBkAG9 - Ae8BgQGgAekBggGHAeEBMAFHAV4PAAGrAfAB9wGrAeIB5QGsAc4BzAGtAbsBtQGuAacBnAMAAcIBqgGd - Af4B+wH5AZcBgAFvAYoBcgFgAX4BZQFSAXMBWQFFAWkBTwE6AfsB8gHtAXgBXwFLAwAB5QGqAVkB/wH+ - AeMB/wH3AdYB+wHlAbsB5AGlAVIDAAGwAZUBhQH9AfcB9AH8AfUB8gH8AfMB8AH7AfIB7QH7AfEB6wH7 - Ae8B6QH5Ae0B5wFsAVEBPQYAAdkBzAHEAbwBpwGYBgABywG3AawBlwGAAW8B8gHrAeYB/AH1AfIB/AHz - AfAB+wHyAe0B+wHxAesB+wHvAekB+QHtAecBbAFRAT0PAAFZAcgB5wHZAfIB/gFuAcAB9QGCAYcB4QFG - AYsBoCcAAcYBsQGlAf4B/AH7Af4B+wH6Af4B+QH4Af0B+QH2Af0B9wH0AfwB9gHyAfwB9AHwAX0BZAFR - BgAB5AGoAVYB/wH+AeMB4gGjAU8GAAG2AZsBjgH9AfgB9gGXAYABbwGKAXIBYAF+AWUBUQFzAVkBRQH7 - AfAB7AH6Ae8B6QFvAVYBQQYAAd4B0QHKAeoB4wHfAcsBtwGsAcIBqwGgAdYBxgG9AaEBigF6Af0B+AH2 - AZcBgAFvAYoBcgFgAX4BZQFRAXMBWQFFAfsB8AHsAfoB7wHpAW8BVgFBDwABWQHIAecBsAHkAfwBdgHR - AfoBfwGwAeoBggGHAeEBSgF6AYgPAAGrAfAB9wGrAeUB6QGsAtUBrAHEAcEBrQG1AawBrgGkAZgDAAHN - AbkBrgH/Af0B/AGXAYABbwGKAXMBYAF+AWUBUgH9AfgB9gH8AfcB9AH8AfUB8gGCAWkBVgkAAeYBrQFf - CQABvAGkAZUB/gH6AfgB/QH4AfYB/AH3AfQB/AH1AfIB+wHzAfAB+wHyAe4B+gHwAesBcwFZAUcJAAHe - AdEBygHSAcABuAHNAboBsQHLAbcBrAG4AaABkQH+AfoB+AH9AfgB9gH8AfcB9AH8AfUB8gH7AfMB8AH7 - AfIB7gH6AfAB6wFzAVkBRxIAAVkByAHnAdkB8gH+AXYB0QH6AX4BqgHpAYIBhwHhAUgBYgFqIQAB0wHC - AbkB/wT+Af0B/wL8Af0B+gH5Af0B+gH4Af0B+AH2AfwB9gH0AYcBbgFdAwABqwHwAfcBqwHiAeUBrAHO - AcwBrQG7AbUBrgGnAZwDAAHCAaoBnQH+AfsB+QGXAYABbwGKAXIBYAF+AWUBUgFzAVkBRQFpAU8BOgH7 - AfIB7QF4AV8BSwMAAasB8AH3AasB4gHlAawBzgHMAa0BuwG1Aa4BpwGcAwABwgGqAZ0B/gH7AfkBlwGA - AW8BigFyAWABfgFlAVIBcwFZAUUBaQFPAToB+wHyAe0BeAFfAUsSAAFZAcgB5wGwAeQB/AF/AeQB/wGJ - AcIB7gF8AaUB6AGCAYcB4QFLAVMBWA8AAasB8AH3AawC1QGuAbQBrAGuAZkBigMAAdkBygHDAdMBwQG4 - AcwBuQGuAccBsQGlAcEBqgGdAbwBowGWAbYBnAGNAa8BlQGFAaoBjwF+FQABxgGxAaUB/gH8AfsB/gH7 - AfoB/gH5AfgB/QH5AfYB/QH3AfQB/AH2AfIB/AH0AfABfQFkAVEVAAHGAbEBpQH+AfwB+wH+AfsB+gH+ - AfkB+AH9AfkB9gH9AfcB9AH8AfYB8gH8AfQB8AF9AWQBURUAAY4BzAHdAYkB0AHnAYkBzwHmAYIBxQHd - AXgBsgHIAWoBlwGsOQABqwHwAfcBqwHlAekBrALVAawBxAHBAa0BtQGsAa4BpAGYAwABzQG5Aa4B/wH9 - AfwBlwGAAW8BigFzAWABfgFlAVIB/QH4AfYB/AH3AfQB/AH1AfIBggFpAVYBqwHwAfcBqwHlAekBrALV - AawBxAHBAa0BtQGsAa4BpAGYAwABzQG5Aa4B/wH9AfwBlwGAAW8BigFzAWABfgFlAVIB/QH4AfYB/AH3 - AfQB/AH1AfIBggFpAVZ1AAHTAcIBuQH/BP4B/QH/AvwB/QH6AfkB/QH6AfgB/QH4AfYB/AH2AfQBhwFu - AV0VAAHTAcIBuQH/BP4B/QH/AvwB/QH6AfkB/QH6AfgB/QH4AfYB/AH2AfQBhwFuAV1mAAGrAfAB9wGs - AtUBrgG0AawBrgGZAYoDAAHZAcoBwwHTAcEBuAHMAbkBrgHHAbEBpQHBAaoBnQG8AaMBlgG2AZwBjQGv - AZUBhQGqAY8BfgYAAasB8AH3AawC1QGuAbQBrAGuAZkBigMAAdkBygHDAdMBwQG4AcwBuQGuAccBsQGl - AcEBqgGdAbwBowGWAbYBnAGNAa8BlQGFAaoBjwF+4QABrQFYASckAAGcAYUBdQGWAX8BbQGQAXcBZwGJ - AXABXgGCAWoBVwF8AWMBTycAASIBbgGPPAABxQGvAaMBpAGNAX4BnwGIAXcBmgGCAXIBlAF9AWwBjgF3 - AWUBiQFyAWABhQFrAVkBfwFnAVMBggFmAU0B5AGnAVYB2QGkAXgBpQFJARgeAAHCAasBoAHeAdEBygHa - AcwBxAHWAccBvgHSAcEBuAHOAbsBsgHLAbcBqwF7AWIBTyEAAVoBvAHdAV0ByAHoASIBbgGPGwABIwE9 - AZMBGwEwAXcBFAEqAW4BEwEuAX8SAAHIAbQBqQH8AfYB8gH7AfMB7gH6AfAB6wH6Ae0B5wH5AeoB4wH4 - AecB4AH3AeQB2wHzAdkBxgHjAaYBVQHvAdYBrwH+AeEBtAHdAasBgAGkAUYBFQYAAcUBrwGjAaQBjQF+ - AZ8BiAF3AZoBggFyAZQBfQFsAY4BdwFlAacBlQGIAcsBtwGsAeoB4wHfAdkBzgHIAVgBSwFBAdkBzgHI - AdkBzgHIAc4BuwGyAYEBaAFVAwABxQGvAaMBpAGNAX4BnwGIAXcBmgGCAXIBlAF9AWwBjgF3AWUBiQFy - AWABhQFrAVkBfwFnAVMBewFiAU4BWgG8Ad0BaAHYAfgBLwHAAe4BLgGAAaMSAAEuAU0BqwEcAUEBuAEM - ATwB0AEDATkB4QECATYB2wEGATMBvAEIASoBlgELASUBfAwAAc0BuQGuAf0B+AH1AYkBcgFgAYkBcgFg - AYkBcgFgAfoB7QHmAYkBcgFgAYkBcgFgAeIBpwFVAf0B9QHWAf8B8AHJAf4B5wG+Af4B4QG0Ad8BrgGD - AaQBRgEVAwAByAG0AakB/AH2AfIB+wHzAe4B+gHwAesB+gHtAecB+QHqAeMB+gHtAegB1AHDAbsB6gHj - Ad8BWAFLAUEBWAFLAUEBWAFLAUEB4gHXAtIBwAG4AYcBbwFdAwAByAG0AakB/AH2AfIB+wHzAe4B+gHw - AesB+gHtAecB+QHqAeMB+AHnAeAB9wHkAdsB9gHhAdcBvwHDAcQBWgG8Ad0BaAHYAfgBLgGAAaMSAAE7 - AVoBugEcAUwB3QEJAUMB+gEGAUEB+QFHAXMB+gFGAXEB9gEAATgB7AEAATYB4wEFAS8BtQEIASQBfQkA - AdEBvwG2Af0B+QH3AcQBvQHLAZsBlwG7AcUBvwHQAfoB7wHqAcUBywHEAZUBrAGZAeMBqQFaAf4B+wHe - Af8B+AHWAf8B8AHJAf4B6AG+AfsB3wG0Aa8BWAEmAwABzQG5Aa4B/QH4AfUBiQFyAWABiQFyAWABiQFy - AWAB+gHtAeYBvQGwAaYB3QHQAckB6gHjAd8B6gHjAd8B6gHjAd8B6gHjAd8B4gHXAdIB1gHHAb4BjQF1 - AWMDAAHNAbkBrgH9AfgB9QGJAXIBYAGJAXIBYAGJAXIBYAH6Ae0B5gGJAXIBYAGJAXIBYAGBAYMBfgFL - AZYBtwEyAc8B/wFoAdgB+AEvAcAB7gEuAYABowwAAVABawHGAS4BWgHjAR0BUgH9ARoBUAH9AVYBfwH8 - Bv4BWQGAAfoBAAE7Ae8BAAE3AeQBBQEvAbYBCwElAXsGAAHVAcUBvAH+AfsB+gFTAUoBiQGVAZoB2gFS - AUoBiAH7AfIB7QFIAXABTQFiAb8BaQFZAXQBSwHkAakBWAHxAe0B0AH/AfcB1gH7AeUBuwHkAaUBUgYA - AdEBvwG2Af0B+QH3AcQBvQHLAZsBlwG7AcUBvwHQAfoB7wHqAcUBywHEAeUB6QHjAdQBxQG7AbQBngGQ - Ad0B0AHJAd0B0AHJAY0BdgFkAY4BdgFkBgAB0QG/AbYB/QH5AfcBxAG9AcsBmwGXAbsBxQG/AdAB+gHv - AeoBxQHLAcQBlQGsAZkBWwGeAbwBlQHZAeoBaAHYAfgBWgG8Ad0BWgG8Ad0BLwHAAe4BLgGAAaMJAAFN - AXAB2QEsAV8B/wEtAWEB/wEtAV8B/wFjAYkH/gFQAXkB+wEDAT8B+QEAAToB7gEAATYB5AEJASoBlgYA - AdkBywHDAf4B/AH7AcYBwQHUAW8BaQGdAZoBkQGwAfwB8wHwAZsBpwGcAYABnAGEAbkBwAG4AfUB4AHP - AeEBpQFTAf8B/gHjAeIBowFPCQAB1QHFAbwB/gH7AfoBUwFKAYkBlQGaAdoBUgFKAYgB+wHyAe0BSAFw - AU0BsQHfAbQB2QHMAcQBvAGnAZgB4wHdAdkDAAHLAbcBrAGXAYABbwYAAdUBxQG8Af4B+wH6AVMBSgGJ - AZUBmgHaAVIBSgGIAfsB8gHtAUgBcAFNAWIBvwFpAVsBngG8Aa0B6QHyAawB9QH+AR8BawGMAVoBvAHd - ATIBzwH/AS4BgAGjBgABcAGIAdUBSwFyAe4BPwFtAf8BQQFvAf8BPgFtAf8BOQFqAf8BagGOAf8BYgGH - Af4BGwFSAfwBDQFIAfsBAAE9AfgBAAE5AeoBBgEzAb0BFAEuAX8DAAHdAdEByQH/Av0B/gH8AfsB/QH7 - AfkB/QH4AfYB/QH2AfMB/AH0Ae8B+wHwAesB+gHuAekB+QHrAeQBogGFAW0B4QGpAVsBaQJ0AT8BYgF+ - AToBXAF4AwAB2QHLAcMB/gH8AfsBxgHBAdQBbwFpAZ0BmgGRAbAB/AHzAfABmwGnAZwBwAHOAcIB3gHR - AcoB1gHHAb8BywG3AawBwgGrAaABxAGuAaMBoQGKAXoGAAHZAcsBwwH+AfwB+wHGAcEB1AFvAWkBnQGa - AZEBsAH8AfMB8AGbAacBnAGAAZwBhAGhAb4BxQFbAZ4BvAGnAd8B5gFoAdgB+AFoAdgB+AE4AYUBpgkA - AYEBlAHRAVEBeAH7AVIBfAH/AVUBfwH/AVIBfAH/AV4BhQH/Bv4BPQFtAf0BGAFQAfsBCgFFAfkBAAE7 - AfMBAgE2Ad0BFAEqAW4DAAHiAdcB0QHdAdAByQHYAcgBwQHTAcIBuQHPAbsBsgHKAbUBqgHFAa8BpAHB - AaoBngG+AaUBmAG5AZ8BkQG0AZkBiwFkAcgB5wFZAcMB5QFPAb0B4gFEAbcB4AE5AVoBdwHdAdEByQH/ - Av0B/gH8AfsB/QH7AfkB/QH4AfYB/QH2AfMB/AH0Ae8B+wHwAesB9wHxAe0B3gHRAcoB0gHAAbgBzQG6 - AbEBywG3AawB0QHZAd4BOgFcAXgDAAHdAdEByQH/Av0B/gH8AfsB/QH7AfkB/QH4AfYB/QH2AfMB/AH0 - Ae8B+wHwAesB+gHuAekBxgHXAd4BWwGeAbwBVgGZAbgBSwGWAbcBcwGkAb8BOgFcAXgGAAGKAZsB1AFg - AYYB+wFlAYoB/wFoAY4B/wFmAYwB/wGVAa8B/wb+AXkBmgH/ASEBVwH9AREBSQH7AQIBPgH4AQMBOQHi - ARsBMQF2GAABTgG8AeIBjgHgAfEBhQHbAe8BpgGMAXoBmwGBAW4BlQF6AWcBWgHDAeUBUAG+AeMBPAFe - AXoB4gHXAdEB3QHQAckB2AHIAcEB0wHCAbkBzwG7AbIBygG1AaoBxQGvAaQBwQGqAZ4BvgGlAZgB7gHn - AeQB7AHmAeIBsgHkAfMBrAHhAfIBTwG9AeIBRAG3AeABOQFaAXcB4gHXAdEB3QHQAckB2AHIAcEB0wHC - AbkBzwG7AbIBygG1AaoBxQGvAaQBwQGqAZ4BvgGlAZgBuQGfAZEBtAGZAYsBZAHIAecBWQHDAeUBTwG9 - AeIBRAG3AeABOQFaAXcDAAGKAZ4B3AF5AZYB8gF4AZoB/wF8AZwB/wF5AZkB/wGxAcQB/wb+AaIBuAH+ - ASgBXAH+ARcBTwH7AQcBQQH4AQwBOwHQASMBPgGTGAABUAG+AeMBmAHmAfQBjwHhAfIBhQHcAe8BfAHW - Ae0BcgHRAeoBZwHKAekBXAHFAeUBQAFiAX0VAAFOAbwB4gGOAeAB8QGFAdsB7wGmAYwBegGbAYEBbgGV - AXoBZwFaAcMB5QFQAb4B4wE8AV4BehUAAU4BvAHiAY4B4AHxAYUB2wHvAaYBjAF6AZsBgQFuAZUBegFn - AVoBwwHlAVABvgHjATwBXgF6AwABpwG2AeUBjQGiAeUBhwGlAf8BjQGoAf8BiAGjAf8BxQHTB/4BtQHH - Af4BLAFfAf8BGwFSAfwBCQFDAfoBHAFBAbgbAAFQAb4B4wGfAesB9gGZAeYB9AGnAYsBegGcAYEBbwGV - AXoBZwFzAdEB6wFpAcsB6QFDAWYBgRUAAVABvgHjAZgB5gH0AY8B4QHyAYUB3AHvAXwB1gHtAXIB0QHq - AWcBygHpAVwBxQHlAUABYgF9FQABUAG+AeMBmAHmAfQBjwHhAfIBhQHcAe8BfAHWAe0BcgHRAeoBZwHK - AekBXAHFAeUBQAFiAX0GAAGXAacB3QGUAaoB8QGZAbIB/wGNAagB/wGpAb4B/wb+AYMBoQH/AS4BYgH/ - ARwBUwH9ARwBTAHcAS4BTAGsGwABUAG+AeMBpgHtAfcBoAHrAfUBmQHnAfQBkQHjAfIBiQHeAfEBfwHY - Ae4BdQHSAesBRwFsAYYVAAFQAb4B4wGfAesB9gGZAeYB9AGnAYsBegGcAYEBbwGVAXoBZwFzAdEB6wFp - AcsB6QFDAWYBgRUAAVABvgHjAZ8B6wH2AZkB5gH0AacBiwF6AZwBgQFvAZUBegFnAXMB0QHrAWkBywHp - AUMBZgGBCQABmwGqAd0BlQGrAfEBhwGlAf8BeAGaAf8BZAGLAf8BUgF8Af8BPwFtAf8BLQFhAf8BLgFa - AeMBOgFZAbshAAFQAb4B4wFQAb4B4wFPAb0B4gFJAbgB3gFBAbAB2AE4AakB0gExAaIBzBgAAVABvgHj - AaYB7QH3AaAB6wH1AZkB5wH0AZEB4wHyAYkB3gHxAX8B2AHuAXUB0gHrAUcBbAGGFQABUAG+AeMBpgHt - AfcBoAHrAfUBmQHnAfQBkQHjAfIBiQHeAfEBfwHYAe4BdQHSAesBRwFsAYYMAAGXAacB3QGNAaMB5QF5 - AZYB8gFgAYYB+wFQAXoB+wFMAXMB7gFNAXAB2AFQAWsBxlQAAVABvgHjAVABvgHjAU8BvQHiAUkBuAHe - AUEBsAHYATgBqQHSATEBogHMGwABUAG+AeMBUAG+AeMBTwG9AeIBSQG4Ad4BQQGwAdgBOAGpAdIBMQGi - AcwSAAGdAa0B4AGKAZ4B3AGKAZsB1AGBAZQB0QFwAYkB1QFkAXoBugFkAXoBuucAAa0BWAEnJwABnAGF - AXUBlgF/AW0BkAF3AWcBiQFwAV4BggFqAVcBfAFjAU+BAAHkAacBVgHZAaQBeAGlAUkBGCEAAcIBqwGg - Ad4B0QHKAdoBzAHEAdYBxwG+AdIBwQG4Ac4BuwGyAcsBtwGrAXsBYgFPJAABIgFuAY8PAAHFAa8BowGk - AY0BfgGfAYgBdwGaAYIBcgGUAX0BbAGOAXcBZQGJAXIBYAGFAWsBWQF/AWcBUwF7AWIBTgF2AV0BSSQA - AeQBpwFWAf8B6gHFAf4B4QG0Ad0BqwGAAaQBRgEVHgABywG3AawB6gHjAd8B2QHOAcgBWAFLAUEB2QHO - AcgB2QHOAcgBzgG7AbIBgQFoAVUhAAFaAbwB3QFdAcgB6AEiAW4BjwwAAcgBtAGpAfwB9gHyAfsB8wHu - AfoB8AHrAfoB7QHnAfkB6gHjAfgB5wHgAfcB5AHbAfYB4QHXAfUB3gHTAXwBYwFPIQAB5QGqAVkB/gH5 - AdsB/wHwAckB/gHnAb4B/gHhAbQB3wGuAYMBpAFGARUbAAHUAcMBuwHqAeMB3wFYAUsBQQFYAUsBQQFY - AUsBQQHiAdcC0gHAAbgBhwFvAV0hAAFaAbwB3QFoAdgB+AEvAcAB7gEuAYABowkAAc0BuQGuAf0B+AH1 - AYkBcgFgAYkBcgFgAYkBcgFgAfoB7QHmAYkBcgFgAYkBcgFgAYkBcgFgAfYB4QHWAYEBaQFWEgABXgGI - AZ8BWAGAAZkBUgF5AZEBTAFxAYsBRQFpAYQB4AGmAVgB5gHqAdIB/wH4AdYB/wHwAckB/gHoAb4B+wHf - AbQBrwFYASYMAAFeAYgBnwFYAYABmQFSAXkBkQFMAXEBiwGXAasBugHdAdAByQHqAeMB3wHqAeMB3wHq - AeMB3wHqAeMB3wHiAdcB0gHWAccBvgGNAXUBYyEAAVoBvAHdAWgB2AH4AS4BgAGjDAAB0QG/AbYB/QH5 - AfcBxAG9AcsBmwGXAbsBxQG/AdAB+gHvAeoBxQHLAcQBlQGsAZkBxQHKAcIB9wHjAdoBhwFvAV0PAAFJ - AbgB3wGDAdsB7wF5AdQB7AFvAc8B6gFkAcgB5wFZAcMB5QFfAbkB0AHgAagBWAHmAekB0gH/AfcB1gH7 - AeUBuwHkAaUBUgwAAUkBuAHfAYMB2wHvAXkB1AHsAW8BzwHqAWQByAHnAVkBwwHlAa8BzwHZAdQBxQG7 - AbQBngGQAd0B0AHJAd0B0AHJAY0BdgFkAY4BdgFkDAABXgGIAZ8BWAGAAZkBUgF5AZEBTAFxAYsBRQFp - AYQBbwGJAZ4BtQHNAdkBSwGWAbcBMgHPAf8BaAHYAfgBLwHAAe4BLgGAAaMJAAHVAcUBvAH+AfsB+gFT - AUoBiQGVAZoB2gFSAUoBiAH7AfIB7QFIAXABTQFiAb8BaQFIAW8BTQH4AeYB3QGNAXYBZA8AAU4BvAHi - AY4B4AHxAYUB2wHvAaYBjAF6AZsBgQFuAZUBegFnAVoBwwHlAWABugHRAeABpQFUAf8B/gHjAeIBowFP - DwABTgG8AeIBjgHgAfEBhQHbAe8BpgGMAXoBmwGBAW4BlQF6AWcBtQHbAecB2QHMAcQBvAGnAZgGAAHL - AbcBrAGXAYABbwkAAUkBuAHfAYMB2wHvAXkB1AHsAW8BzwHqAWQByAHnAVkBwwHlAcgB6gH2AVsBngG8 - AYUBzQHiAWgB2AH4AVoBvAHdAVoBvAHdAS8BwAHuAS4BgAGjBgAB2QHLAcMB/gH8AfsBxgHBAdQBbwFp - AZ0BmgGRAbAB/AHzAfABmwGnAZwBgAGcAYQBuQHAAbgB+AHpAeEBkwF8AWsPAAFQAb4B4wGYAeYB9AGP - AeEB8gGFAdwB7wF8AdYB7QFyAdEB6gFnAcoB6QFcAcUB5QFRAWgBdgHmAa0BXxIAAVABvgHjAZgB5gH0 - AY8B4QHyAYUB3AHvAXwB1gHtAXIB0QHqAb8B6QH2Ad4B0QHKAeoB4wHfAcsBtwGsAcIBqwGgAdYBxgG9 - AaEBigF6CQABTgG8AeIBjgHgAfEBhQHbAe8BpgGMAXoBmwGBAW4BlQF6AWcBywHsAfgBWwGeAbwBmgHb - AegBrAH1Af4BHwFrAYwBWgG8Ad0BMgHPAf8BLgGAAaMGAAHdAdEByQH/Av0B/gH8AfsB/QH7AfkB/QH4 - AfYB/QH2AfMB/AH0Ae8B+wHwAesB+gHuAekB+QHrAeQBmwGDAXMBTAFxAYsBRQFpAYQBPwFiAX4BOgFc - AXgDAAFQAb4B4wGfAesB9gGZAeYB9AGnAYsBegGcAYEBbwGVAXoBZwFzAdEB6wFpAcsB6QFDAWYBgQFS - AXkBkQFMAXEBiwFFAWkBhAE/AWIBfgE6AVwBeAYAAVABvgHjAZ8B6wH2AZkB5gH0AacBiwF6AZwBgQFv - AZUBegFnAXMB0QHrAbwB3gHoAd4B0QHKAdIBwAG4Ac0BugGxAcsBtwGsAasBtgG/AWsBhQGaBgABUAG+ - AeMBmAHmAfQBjwHhAfIBhQHcAe8BfAHWAe0BcgHRAeoBqgHhAfMBtAHbAesBWwGeAbwBsgHsAfUBaAHY - AfgBaAHYAfgBOAGFAaYJAAHiAdcB0QHdAdAByQHYAcgBwQHTAcIBuQHPAbsBsgHKAbUBqgHFAa8BpAHB - AaoBngG+AaUBmAG5AZ8BkQG0AZkBiwFkAcgB5wFZAcMB5QFPAb0B4gFEAbcB4AE5AVoBdwFQAb4B4wGm - Ae0B9wGgAesB9QGZAecB9AGRAeMB8gGJAd4B8QF/AdgB7gF1AdIB6wFHAWwBhgFvAc8B6gFkAcgB5wFZ - AcMB5QFPAb0B4gFEAbcB4AE5AVoBdwMAAVABvgHjAaYB7QH3AaAB6wH1AZkB5wH0AZEB4wHyAYkB3gHx - AX8B2AHuAXUB0gHrAZgBrQG7AcIB6wH2Ab4B6AH1AbkB5gH1AU8BvQHiAUQBtwHgATkBWgF3AwABUAG+ - AeMBnwHrAfYBmQHmAfQBpwGLAXoBnAGBAW8BlQF6AWcBcwHRAesBqwHiAfMBtwHTAeEBWwGeAbwBVgGZ - AbgBSwGWAbcBmQHEAdkBkAGkAbMbAAFOAbwB4gGOAeAB8QGFAdsB7wGmAYwBegGbAYEBbgGVAXoBZwFa - AcMB5QFQAb4B4wE8AV4BegMAAVABvgHjAVABvgHjAU8BvQHiAUkBuAHeAUEBsAHYATgBqQHSATEBogHM - AWkBvwHZAaYBjAF6AZsBgQFuAZUBegFnAVoBwwHlAVABvgHjATwBXgF6BgABUAG+AeMBUAG+AeMBTwG9 - AeIBSQG4Ad4BQQGwAdgBOAGpAdIBMQGiAcwBaQG/AdkBpgGMAXoBmwGBAW4BlQF6AWcBWgHDAeUBUAG+ - AeMBPAFeAXoDAAFQAb4B4wGmAe0B9wGgAesB9QGZAecB9AGRAeMB8gGJAd4B8QF/AdgB7gF1AdIB6wF1 - AZEBpAHCAesB9gG+AegB9QG5AeYB9QF7Ac4B6QFEAbcB4AE5AVoBdxgAAVABvgHjAZgB5gH0AY8B4QHy - AYUB3AHvAXwB1gHtAXIB0QHqAWcBygHpAVwBxQHlAUABYgF9EgABUAG+AeMBmAHmAfQBjwHhAfIBhQHc - Ae8BfAHWAe0BcgHRAeoBZwHKAekBXAHFAeUBQAFiAX0VAAFQAb4B4wGYAeYB9AGPAeEB8gGFAdwB7wF8 - AdYB7QFyAdEB6gFnAcoB6QFcAcUB5QFAAWIBfQYAAVABvgHjAVABvgHjAU8BvQHiAUkBuAHeAUEBsAHY - ATgBqQHSATEBogHMAWkBvwHZAaYBjAF6AZsBgQFuAZUBegFnAVoBwwHlAVABvgHjATwBXgF6GAABUAG+ - AeMBnwHrAfYBmQHmAfQBpwGLAXoBnAGBAW8BlQF6AWcBcwHRAesBaQHLAekBQwFmAYESAAFQAb4B4wGf - AesB9gGZAeYB9AGnAYsBegGcAYEBbwGVAXoBZwFzAdEB6wFpAcsB6QFDAWYBgRUAAVABvgHjAZ8B6wH2 - AZkB5gH0AacBiwF6AZwBgQFvAZUBegFnAXMB0QHrAWkBywHpAUMBZgGBFQABUAG+AeMBmAHmAfQBjwHh - AfIBhQHcAe8BfAHWAe0BcgHRAeoBZwHKAekBXAHFAeUBQAFiAX0YAAFQAb4B4wGmAe0B9wGgAesB9QGZ - AecB9AGRAeMB8gGJAd4B8QF/AdgB7gF1AdIB6wFHAWwBhhIAAVABvgHjAaYB7QH3AaAB6wH1AZkB5wH0 - AZEB4wHyAYkB3gHxAX8B2AHuAXUB0gHrAUcBbAGGFQABUAG+AeMBpgHtAfcBoAHrAfUBmQHnAfQBkQHj - AfIBiQHeAfEBfwHYAe4BdQHSAesBRwFsAYYVAAFQAb4B4wGfAesB9gGZAeYB9AGnAYsBegGcAYEBbwGV - AXoBZwFzAdEB6wFpAcsB6QFDAWYBgRsAAVABvgHjAVABvgHjAU8BvQHiAUkBuAHeAUEBsAHYATgBqQHS - ATEBogHMGAABUAG+AeMBUAG+AeMBTwG9AeIBSQG4Ad4BQQGwAdgBOAGpAdIBMQGiAcwbAAFQAb4B4wFQ - Ab4B4wFPAb0B4gFJAbgB3gFBAbAB2AE4AakB0gExAaIBzBgAAVABvgHjAaYB7QH3AaAB6wH1AZkB5wH0 - AZEB4wHyAYkB3gHxAX8B2AHuAXUB0gHrAUcBbAGGqAABUAG+AeMBUAG+AeMBTwG9AeIBSQG4Ad4BQQGw - AdgBOAGpAdIBMQGiAcw/AAGtAVgBJycAAZwBhQF1AZYBfwFtAZABdwFnAYkBcAFeAYIBagFXAXwBYwFP - JAABIgFuAY9aAAHkAacBVgHRAZoBbQGkAUcBFQGRAWwBVQGKAXIBYAGFAW0BWgGAAWcBVQF7AWMBTwF3 - AV4BSgFzAVkBRQFvAVUBQQFrAVEBPAFoAU4BOAMAAcIBqwGgAd4B0QHKAdoBzAHEAdYBxwG+AdIBwQG4 - Ac4BuwGyAcsBtwGrAXsBYgFPAYABZwFVAXsBYwFPAXcBXgFKAXMBWQFFAW8BVQFBAWsBUQE8AWgBTgE4 - CQABWgG8Ad0BXQHIAegBIgFuAY8BgAF3AW4BigFyAWABhQFtAVoBgAFnAVUBewFjAU8BdwFeAUoBcwFZ - AUUBbwFVAUEBawFRATwBaAFOATg2AAHiAaUBVAH9AegBwwH+AeEBtAHbAagBfQGkAUUBFAHRAbMBpQHX - AckBwQHTAcIBuAHNAbsBsAHLAaABsgGaATYBmQGzAYwBlwG6AaEBlAG2AZ0BjgFnAU0BOAHLAbcBrAHq - AeMB3wHZAc4ByAFYAUsBQQHZAc4ByAHZAc4ByAHOAbsBsgGBAWgBVQHTAcIBuAHNAbsBsAHLAaABsgGa - ATYBmQGzAYwBlwG6AaEBlAG2AZ0BjgFnAU0BOAMAAcMBrQGgAVoBvAHdAWgB2AH4AS8BwAHuAS4BgAGj - Ad0BzwHJAdcByQHBAdMBwgG4Ac0BuwGwAcsBoAGyAZoBNgGZAbMBjAGXAboBoQGUAbYBnQGOAWcBTQE4 - BgABXgGIAZ8BWAGAAZkBUgF5AZEBTAFxAYsBRQFpAYQBPwFiAX4BOgFcAXgVAAHlAaoBWQH3Ae8B0AH/ - AfAByQH+AecBvgH+AeEBtAHdAasBfwGkAUUBFAHcAc4BxwHWAccBvgHRAaoBvAHTAWUB0gGjAT4BogGN - AS0BjAG2AZIBlgG5AaABkwFpAU8BOwHUAcMBuwHsAeUB4QFYAUsBQQFYAUsBQQFYAUsBQQHiAdcC0gHA - AbgBhwFvAV0B1gHHAb4B0QGqAbwB0wFlAdIBowE+AaIBjQEtAYwBtgGSAZYBuQGgAZMBaQFPATsDAAGd - AqEBWgG8Ad0BaAHYAfgBLgGAAaMByQHMAcsB4QHUAc4B3AHOAccB1gHHAb4B0QGqAbwB0wFlAdIBowE+ - AaIBjQEtAYwBtgGSAZYBuQGgAZMBaQFPATsDAAFJAbgB3wGDAdsB7wF5AdQB7AFvAc8B6gFkAcgB5wFZ - AcMB5QFPAb0B4gFEAbcB4AE5AVoBdxIAAeUBqgFbAfgB9QHYAf8B+AHWAf8B8AHJAf4B6AG+AfIB2AGt - Aa4BVwElAa0BowGXAdYBpgHJAdMBZQHSAdkBbQHYAaQBPgGjAZwBOAGbAY0BLQGMAb0BpAGXAWwBUgFA - Ad0B0AHJAe0B5wHjAewB5QHhAewB5QHhAewB5QHhAeIB1wHSAdYBxwG+AY0BdQFjAdYBpgHJAdMBZQHS - AdkBbQHYAaQBPgGjAZwBOAGbAY0BLQGMAb0BpAGXAWwBUgFAAwABXwGpAcgBMgHPAf8BaAHYAfgBLwHA - Ae4BLgGAAaMBlQGuAbEBrQGjAZcB1gGmAckB0wFlAdIB2QFtAdgBpAE+AaMBnAE4AZsBjQEtAYwBvQGk - AZcBbAFSAUADAAFOAbwB4gGOAeAB8QGFAdsB7wGmAYwBegGbAYEBbgGVAXoBZwFaAcMB5QFQAb4B4wE8 - AV4BehUAAeMBqAFXAf8B/gHjAf8B9wHWAfkB4wG5AeMBpAFSAeQBvgGRAeIB2AHSAdQBZwHTAdsBbgHa - AdwBcAHbAaQBPgGjAaQBPgGjAaEBPAGgAcABqAGcAW8BVQFBAwAB1AHFAbsBtAGeAZAB0gHAAbgBzQG6 - AbEBjQF2AWQBjgF2AWQB0wHHAb4B1AFnAdMB2wFuAdoB3AFwAdsBpAE+AaMBpAE+AaMBoQE8AaABwAGo - AZwBbwFVAUEBfwG4AdMBkQHVAeYBaAHYAfgBWgG8Ad0BWgG8Ad0BLwHAAe4BLgGAAaMB4gHYAdIB1AFn - AdMB2wFuAdoB3AFwAdsBpAE+AaMBpAE+AaMBoQE8AaABwAGoAZwBbwFVAUEDAAFQAb4B4wGYAeYB9AGP - AeEB8gGFAdwB7wF8AdYB7QFyAdEB6gFnAcoB6QFcAcUB5QFAAWIBfRUAAc8BtQGjAeIBpwFWAfUB+QHe - AeEBowFOAb8BqwGFAa4BpQGZAeYB3gHZAdMBZQHSAdwBcAHbAesBiwHqAfsBmAH6AaQBPgGjAaQBPgGj - AcQBrQGhAXIBWAFEAwAB2QHMAcQBvAGnAZgB1QLrAdUB4gHgAdYBxgG9AZcBgAFvAd4B1AHOAdMBZQHS - AdwBcAHbAesBiwHqAfsBmAH6AaQBPgGjAaQBPgGjAcQBrQGhAXIBWAFEAX8BuAHTAakB5AHtAawB9QH+ - AR8BawGMAVoBvAHdATIBzwH/AS4BgAGjAeYB3gHZAdMBZQHSAdwBcAHbAesBiwHqAfsBmAH6AaQBPgGj - AaQBPgGjAcQBrQGhAXIBWAFEAwABUAG+AeMBnwHrAfYBmQHmAfQBpwGLAXoBnAGBAW8BlQF6AWcBcwHR - AesBaQHLAekBQwFmAYEBUgF5AZEBTAFxAYsBRQFpAYQBPwFiAX4BOgFcAXgGAAHQAb0BtAH7AfQB6gHm - Aa0BXgH0AeIBywH1AfIB8AHxAeoB6AHqAeMB3wHSAW0B1gHsAZAB6wH7AZgB+gH7AZgB+gH7AZgB+gGq - AUUBqQHHAbIBpgF1AVsBSAMAAd4B0QHKAeoB4wHfAcsBtwGsAcIBqwGgAcwBvQG0AaEBigF6AeoB4wHf - AdIBbQHWAewBkAHrAfsBmAH6AfsBmAH6AfsBmAH6AaoBRQGpAccBsgGmAXUBWwFIAwABfwG4AdMBsgHs - AfUBaAHYAfgBaAHYAfgBOAGFAaYBrgHPAd8B6gHjAd8B0gFtAdYB7AGQAesB+wGYAfoB+wGYAfoB+wGY - AfoBqgFFAakBxwGyAaYBdQFbAUgDAAFQAb4B4wGmAe0B9wGgAesB9QGZAecB9AGRAeMB8gGJAd4B8QF/ - AdgB7gF1AdIB6wFHAWwBhgFvAc8B6gFkAcgB5wFZAcMB5QFPAb0B4gFEAbcB4AE5AVoBdwMAAdIBwQG3 - A/8BqwHiAeYBrAHPAc4BrQG6AbMBrgGmAZoB7wHoAeYB3AFwAdsB+gGxAfoB+wGmAfoB+wGYAfoB3AFw - AdsB2gG0AcUBywG2AasBeQFfAUsDAAHpAeIC3gHRAcoB0gHAAbgBzQG6AbEBywG3AawB3AHZAdMB7wHo - AeYB3AFwAdsB+gGxAfoB+wGmAfoB+wGYAfoB3AFwAdsB2gG0AcUBywG2AasBeQFfAUsDAAGwAb8BxAF/ - AbgB0wF1Aa8BywFfAakByAGTAb4BzwGuAaYBmgHvAegB5gHcAXAB2wH6AbEB+gH7AaYB+gH7AZgB+gHc - AXAB2wHaAbQBxQHLAbYBqwF5AV8BSwYAAVABvgHjAVABvgHjAU8BvQHiAUkBuAHeAUEBsAHYATgBqQHS - ATEBogHMAWkBvwHZAaYBjAF6AZsBgQFuAZUBegFnAVoBwwHlAVABvgHjATwBXgF6AwAB1QHFAbwJ/wH8 - AvoB+AH1AfQB8wHuAesB8AHZAegB3AFwAdsB+gGtAfoB3AFwAdsB4gG8AdEB0wHDAbkBzgG7AbEBewFj - AU8DAAHVAcUBvAn/AfwC+gH4AfUB9AHzAe4B6wHwAdkB6AHcAXAB2wH6Aa0B+gHcAXAB2wHiAbwB0QHT - AcMBuQHOAbsBsQF7AWMBTwMAAdUBxQG8Cf8B/AL6AfgB9QH0AfMB7gHrAfAB2QHoAdwBcAHbAfoBrQH6 - AdwBcAHbAeIBvAHRAdMBwwG5Ac4BuwGxAXsBYwFPFQABUAG+AeMBmAHmAfQBjwHhAfIBhQHcAe8BfAHW - Ae0BcgHRAeoBZwHKAekBXAHFAeUBQAFiAX0DAAHYAckBwQn/A/4B+wH6AfkB9gHzAfIB8QHsAeoB7gHX - AeUB3AFwAdsB6QHDAd0B3AHPAcgB1wHIAcAB0gHBAbgBfwFmAVQDAAHYAckBwQn/A/4B+wH6AfkB9gHz - AfIB8QHsAeoB7gHXAeUB3AFwAdsB6QHDAd0B3AHPAcgB1wHIAcAB0gHBAbgBfwFmAVQDAAHYAckBwQn/ - A/4B+wH6AfkB9gHzAfIB8QHsAeoB7gHXAeUB3AFwAdsB6QHDAd0B3AHPAcgB1wHIAcAB0gHBAbgBfwFm - AVQVAAFQAb4B4wGfAesB9gGZAeYB9AGnAYsBegGcAYEBbwGVAXoBZwFzAdEB6wFpAcsB6QFDAWYBgQYA - AdgByAHAAdUBxAG7AdIBwAG2Ac8BvAGxAcwBuAGtAckBtAGpAccBsAGlAcMBrQGgAcIBqQGdAb8BpwGa - AbwBowGWAbkBnwGSAbYBnAGNCQAB2AHIAcAB1QHEAbsB0gHAAbYBzwG8AbEBzAG4Aa0ByQG0AakBxwGw - AaUBwwGtAaABwgGpAZ0BvwGnAZoBvAGjAZYBuQGfAZIBtgGcAY0JAAHYAcgBwAHVAcQBuwHSAcABtgHP - AbwBsQHMAbgBrQHJAbQBqQHHAbABpQHDAa0BoAHCAakBnQG/AacBmgG8AaMBlgG5AZ8BkgG2AZwBjRgA - AVABvgHjAaYB7QH3AaAB6wH1AZkB5wH0AZEB4wHyAYkB3gHxAX8B2AHuAXUB0gHrAUcBbAGGDwAB0gHB - AbcBswGhAZQJAAG6AaEBkwGDAWsBWBsAAdIBwQG3AbMBoQGUCQABugGhAZMBgwFrAVgbAAHSAcEBtwGz - AaEBlAkAAboBoQGTAYMBawFYJAABUAG+AeMBUAG+AeMBTwG9AeIBSQG4Ad4BQQGwAdgBOAGpAdIBMQGi - AcwSAAHWAcYBvQGwAZ4BkAkAAb4BpQGYAYgBcQFfGwAB1gHGAb0BsAGeAZAJAAG+AaUBmAGIAXEBXxsA - AdYBxgG9AbABngGQCQABvgGlAZgBiAFxAV9OAAHEAbUBqgG7AakBnQG1AaMBlQGgAYoBegGXAYABcCEA - AcQBtQGqAbsBqQGdAbUBowGVAaABigF6AZcBgAFwIQABxAG1AaoBuwGpAZ0BtQGjAZUBoAGKAXoBlwGA - AXBUAAHQAb0BswHMAbcBrQHHAbEBpycAAdABvQGzAcwBtwGtAccBsQGnJwAB0AG9AbMBzAG3Aa0BxwGx - AadFAAGcAYUBdQGWAX8BbQGQAXcBZwGJAXABXgGCAWoBVwF8AWMBTyQAASIBbgGPhAABwgGrAaAB3gHR - AcoB2gHMAcQB1gHHAb4B0gHBAbgBzgG7AbIBywG3AasBewFiAU8MAAGZATMQAAFaAbwB3QFdAcgB6AEi - AW4BjxUAAZkBM0AAAZ8BiQF4AZoBgwFyAZQBfQFsAZABdwFmAYoBcgFgAYUBbQFaAYABZwFVAXsBYwFP - AXcBXgFKAXMBWQFFAW8BVQFBAWsBUQE8AWgBTgE4AwABywG3AawB6gHjAd8B2QHOAcgBWAFLAUEB2QHO - AcgB2QHOAcgBzgG7AbIBgQFoAVUJAAG1AWMBNQHYAZsBWwGZATMNAAFaAbwB3QFoAdgB+AEvAcAB7gEu - AYABow8AAbUBYwE1AdgBmwFbAZkBMzoAAcMBrQGgAfIB7QHrAewB5QHiAecB3gHZAeIB1gHRAd0BzwHJ - AdcByQHBAdMBwgG4Ac0BuwGwAcsBoAGyAZoBNgGZAbMBjAGXAboBoQGUAbYBnQGOAWcBTQE4AdQBwwG7 - AeoB4wHfAVgBSwFBAVgBSwFBAVgBSwFBAeIB1wLSAcABuAGHAW8BXQGXAYABbwGXAYABbwHYAZsBWwH/ - Ac0BmQHpAbQBfAHYAZsBWwGZATMKAAFaAbwB3QFoAdgB+AEuAYABowkAAZcBgAFvAZcBgAFvAdgBmwFb - Af8BzQGZAekBtAF8AdgBmwFbAZkBMxAAAYgBcAFdAYMBagFYAX4BZQFSAXoBYAFOAXUBXAFIAXEBVwFD - AW0BUwE+AWoBTwE7AWcBSwE3DAABxgGvAaMB9gHyAvEB7AHoAesB4wHgAeYB3AHWAeEB1AHOAdwBzgHH - AdYBxwG+AdEBqgG8AdMBZQHSAaMBPgGiAY0BLQGMAbYBkgGWAbkBoAGTAWkBTwE7Ad0B0AHJAeoB4wHf - AeoB4wHfAeoB4wHfAeoB4wHfAeIB1wHSAdYBxwG+AY0BdQFjAZcBgAFvBgAB2AGbAVsB/wHNAZkB6QG0 - AXwB2AGbAVsBmQEzBAABXwGpAcgBMgHPAf8BaAHYAfgBLwHAAe4BLgGAAaMGAAGXAYABbwYAAdgBmwFb - Af8BzQGZAekBtAF8AdgBmwFbAZkBMwoAAa8BlgGHAekB4AHcAeMB2gHTAd4B0wHMAdoBzAHEAdUBxQG8 - AdABvgG1AcsBuAGsAcYBsQGmAcMBqwGfAWgBTgE5CQAByAGzAacB+QH3AfYBqwHlAeoBrAHWAdcBrAHF - AcEBrQGzAaoBrQGjAZcB1gGmAckB0wFlAdIB2QFtAdgBpAE+AaMBnAE4AZsBjQEtAYwBvQGkAZcBbAFS - AUADAAHUAcUBuwG0AZ4BkAHdAdAByQHdAdAByQGNAXYBZAGOAXYBZAMAAZcBgAFvCQAB2AGbAVsB/wHN - AZkByQFzAUMDAAF/AbgB0wGWAdsB7gFoAdgB+AFaAbwB3QFaAbwB3QEvAcAB7gEuAYABowMAAZcBgAFv - CQAB2AGbAVsB/wHNAZkByQFzAUMMAAGzAZoBiwHuAegB5QHpAeEB3AHjAdkB1AHfAdIBzAHaAcwBxAHV - AcUBvAHQAb4BtQHMAbgBrQHGAbEBpQFtAVMBPgkAAcsBtgGrAfwC+wH4AfUB9AHzAe4C7QHnAeMB6AHg - AdsB4gHYAdIB1AFnAdMB2wFuAdoB3AFwAdsBpAE+AaMBpAE+AaMBoQE8AaABwAGoAZwBbwFVAUEDAAHZ - AcwBxAG8AacBmAYAAcsBtwGsAZcBgAFvAwABlwGAAW8MAAHYAZsBWwYAAX8BuAHTAa4B6wH1AawB9QH+ - AR8BawGMAVoBvAHdATIBzwH/AS4BgAGjAwABlwGAAW8MAAHYAZsBWw8AAbcBngGQAfMB7wHsAe4B6AHk - AegB4AHcAX4BZQFSAW4BVAFAAWMBSAEzAdUBxQG8AdABvgG0AcsBuAGsAXMBWgFGCQABzQG5Aa8BrAHm - AeoBrAHXAdgBrAHGAcMBrQG1Aa0BrgGlAZkB5gHeAdkB0wFlAdIB3AFwAdsB6wGLAeoB+wGYAfoBpAE+ - AaMBpAE+AaMBxAGtAaEBcgFYAUQDAAHeAdEBygHqAeMB3wHLAbcBrAHCAasBoAHWAcYBvQGhAYoBegMA - AZcBgAFvCQABjQEtAYwMAAF/AbgB0wGyAewB9QFoAdgB+AFoAdgB+AE4AYUBpgYAAZcBgAFvCQABjQEt - AYwSAAG8AaMBlgH4AfYB9AHzAe8B7QHvAegB5AHpAeAB3AHjAdkB0wHfAdMBywHaAcwBxQHVAcUBvAHQ - Ab4BtQF6AWABTgkAAdABvQG0A/8B/gL9AfoB+AH3AfUB8gHwAfEB6gHoAeoB4wHfAdIBbQHWAewBkAHr - AfsBmAH6AfsBmAH6AfsBmAH6AaoBRQGpAccBsgGmAXUBWwFIBgAB3gHRAcoB0gHAAbgBzQG6AbEBywG3 - AawGAAGXAYABbwYAAbMBPAGyAdwBcAHbAY0BLQGMDAABfwG4AdMBdQGvAcsBXwGpAcgBZAGrAcgGAAGX - AYABbwYAAbMBPAGyAdwBcAHbAY0BLQGMDwABwQGpAZ0B/AL7AfgB9gL0Ae8B7AF+AWYBUgFuAVQBPwFj - AUgBMwHeAdMBzAHaAcwBxAHVAcUBvAGAAWgBVQkAAdIBwQG3A/8BqwHiAeYBrAHPAc4BrQG6AbMBrgGm - AZoB7wHoAeYB3AFwAdsB+gGxAfoB+wGmAfoB+wGYAfoB3AFwAdsB2gG0AcUBywG2AasBeQFfAUsGAAEO - AXgBngFPAcsB8QE0AcAB7wEvAb4B7wEMAWIBgQGXAYABbwGXAYABbwGXAYABbwHZAWwB2AH6Aa0B+gH7 - AZgB+gHcAXAB2wGNAS0BjAkAAQ4BeAGeAU8BywHxATQBwAHvAS8BvgHvAQwBYgGBAZcBgAFvAZcBgAFv - AZcBgAFvAdkBbAHYAfoBrQH6AfsBmAH6AdwBcAHbAY0BLQGMDAABxQGvAaMD/wH8AvsB+QH2AfUB9AHv - AewB7gHnAeQB6QHhAdsB5AHZAdMB3gHSAcwB2gHMAcUBiAFwAV0JAAHVAcUBvAn/AfwC+gH4AfUB9AHz - Ae4B6wHwAdkB6AHcAXAB2wH6Aa0B+gHcAXAB2wHiAbwB0QHTAcMBuQHOAbsBsQF7AWMBTwMAARQBqgHh - AYUB4QH1AWsB1wH0AVABywHxATQBwAHwAR0BtQHuAQwBYgGBCQAB0wFlAdIB+gGtAfoB+wGYAfoB3AFw - AdsBjQEtAYwDAAEUAaoB4QGFAeEB9QFrAdcB9AFQAcsB8QE0AcAB8AEdAbUB7gEMAWIBgQkAAdMBZQHS - AfoBrQH6AfsBmAH6AdwBcAHbAY0BLQGMCQAByQG0AaoG/wH8AfsB+gH4AfUB9AHzAe8B7AHuAecB5QHo - AeAB3AHjAdkB1AHfAdMBzAGOAXcBZgkAAdgByQHBCf8D/gH7AfoB+QH2AfMB8gHxAewB6gHuAdcB5QHc - AXAB2wHpAcMB3QHcAc8ByAHXAcgBwAHSAcEBuAF/AWYBVAYAARQBqgHhAYYB4QH1AWwB1gHzAVABywHy - ATUBwAHwARwBtQHtAQwBYgGBCQAB0wFlAdIB+gGtAfoB0wFlAdIJAAEUAaoB4QGGAeEB9QFsAdYB8wFQ - AcsB8gE1AcAB8AEcAbUB7QEMAWIBgQkAAdMBZQHSAfoBrQH6AdMBZQHSDwAByQG0AakBxAGtAaIBvwGo - AZsBuwGiAZMBtQGcAY4BsgGYAYkBrQGUAYQBqAGPAX8BowGKAXkPAAHYAcgBwAHVAcQBuwHSAcABtgHP - AbwBsQHMAbgBrQHJAbQBqQHHAbABpQHDAa0BoAHCAakBnQG/AacBmgG8AaMBlgG5AZ8BkgG2AZwBjQwA - ARQBqgHhAYUB4AH1AWwB1gHzAVABywHyATQBwAHvAR0BtQHtAQwBYgGBCQAB0wFlAdIPAAEUAaoB4QGF - AeAB9QFsAdYB8wFQAcsB8gE0AcAB7wEdAbUB7QEMAWIBgQkAAdMBZQHSRQAB0gHBAbcBswGhAZQJAAG6 - AaEBkwGDAWsBWBgAARQBqgHhAYYB4QH0AWsB1gH0AVABywHxARcBmAHIIQABFAGqAeEBhgHhAfQBawHW - AfQBUAHLAfEBFwGYAchUAAHWAcYBvQGwAZ4BkAkAAb4BpQGYAYgBcQFfGwABFAGqAeEBhQHhAfUBFwGY - AcgnAAEUAaoB4QGFAeEB9QEXAZgByFoAAcQBtQGqAbsBqQGdAbUBowGVAaABigF6AZcBgAFwIQABFAGq - AeEtAAEUAaoB4WAAAdABvQGzAcwBtwGtAccBsQGnUQABDQF6AZUBDwF8AZcBDQF5AZQBCgF4AZQBCgF5 - AZQBDQF6AZQBDgF6AZUBDgF6AZVFAAGtAVgBJ10AAREBswHZAQ0B0wHpAQEBxAHpAQEB0AHpAQsBiwGq - AS8BkAGwAQIBzQHpAQEBvgHpAQQB0QHpARgBlwG2JwABmQEzFgAB5AGnAVYB2QGkAXgBpQFJARgSAAGZ - ATNGAAE4AcoB5QE0AfoB/gEUAfIB/wEAAfIB/wEDAVIBVAEgAUIBRgEAAekB/wECAdoB/wESAeQB7QEv - AYQBmyQAAbUBYwE1AdgBmwFbAZkBMxAAAeQBpwFWAf8B6gHFAf4B4QG0Ad0BqwGAAaQBRgEVDAABtQFj - ATUB2AGbAVsBmQEzQwABfAHeAe8BNgHSAecBVQL/AQgB/QH/AQEBxwHXAQIBugHOAQAB6QH/ARIB8gH/ - ARwBnwG2AYQBrwG7GwABlwGAAW8BlwGAAW8B2AGbAVsB/wHNAZkB6QG0AXwB2AGbAVsBmQEzCgAB5QGq - AVkB/gH5AdsB/wHwAckB/gHnAb4B/gHhAbQB3wGuAYMBpAFGARUBlwGAAW8BlwGAAW8B2AGbAVsB/wHN - AZkB6QG0AXwB2AGbAVsBmQEzFgABdQFbAUYBbgFVAUEBagFQATsBZgFLATcBYwFIATMBYwFIATMBYwFI - ATMBYwFIATMBYwFIATMSAAE5AcwB5QF7AfkB+wE4Av8BOwF+AYEBKQFdAWgBAAHdAfUBDwHwAfQBLQGF - AZweAAGXAYABbwYAAdgBmwFbAf8BzQGZAekBtAF8AdgBmwFbAZkBMwcAAeUBqgFbAf8B/gHjAf8B+AHW - Af8B8AHJAf4B6AG+AfsB3wG0Aa8BWAEmAZcBgAFvBgAB2AGbAVsB/wHNAZkB6QG0AXwB2AGbAVsBmQEz - EAABhQFtAVoB7QHmAeMBvwGnAZoBuAGfAZABsgGXAYgBqwGQAYABpQGJAXkBoAGEAXIBmwGAAW4BlgF8 - AWkBYwFIATMPAAGBAd4B7gFFAdIB6AERAfkB+wFVAVABYQFVAVABYQEBAeMB7AEWAbEBxgFiAZoBqh4A - AZcBgAFvCQAB2AGbAVsB/wHNAZkByQFzAUMMAAHlAaoBWQH/Af4B4wH/AfcB1gH7AeUBuwHkAaUBUgMA - AZcBgAFvCQAB2AGbAVsB/wHNAZkByQFzAUMDAAHOAbsBsAG2AZwBjQGkAYsBfQYAAY4BdgFkAfIB7QHq - Ae4B5gHiAekB4AHcAeQB2QHUAd8B0gHLAdoBywHDAdUBxQG8AdEBvgG0AZoBfwFsAWMBSAEzEgABNAHG - Ad8BGwHsAfMBSQIAAUkDAAHpAf8BKQGFAZsBWgFUAUgBZQFKATYBZQFKATYYAAGXAYABbwwAAdgBmwFb - EgAB5AGoAVYB+wH8AeEB4gGjAU8GAAGXAYABbwwAAdgBmwFbBgAB3AHNAcUBxwGxAaUBtgGcAY4BxwGx - AaUBqgGOAX4BlwGAAW8B9gHyAfEB8gHtAeoB7QHmAeMB6AHgAdwB5AHZAdMB3wHSAcsB2gHMAcMB1QHF - AbwBnQGDAXEBYwFIATMPAAGIAXEBXgF/AdYB5AE+AdgB7QFPAXkBdQE7AXEBbQE9Aa8BugE9AYABkAGf - AYgBeAGYAYABbwGYAYABbwFlAUoBNgkAAQ4BeAGeCQABlwGAAW8JAAGNAS0BjBgAAd8BqgFcCQABlwGA - AW8JAAGNAS0BjAkAAe4B5wHkAdsBzQHGAckBuAGvBgABoAGKAXoB+QH3AvYB8gHxAfIB7QHqAe0B5wHj - AekB4AHcAeQB2QHUAd8B0gHMAdoBzAHDAaIBhwF1AWMBSAEzAc0BuwGyAbMBmwGPAacBjgF9BgABkAF4 - AWYB6wHtAe4BOAHKAeQBPgH3AfsBKQL/ASkBjAKhAbQBtgHWAcYBvgHPAb4BtAGYAYABbwFlAUoBNgYA - AQ4BeAGeARwBtgHuAQ4BeAGeBgABlwGAAW8GAAGzATwBsgHcAXAB2wGNAS0BjBIAAQ4BeAGeARwBtgHu - AQ4BeAGeBgABlwGAAW8GAAGzATwBsgHcAXAB2wGNAS0BjBUAAakBlAGEAf0B+wH8AfkC9wH2AfMB8AHy - Ae0B6gHtAecB4wHpAeAB3AHkAdkB1AHfAdIBzAGmAYwBewFlAUoBNQHZAcwBxAHGAbEBpQGzAZsBjwHG - AbEBpQGnAY4BfQGYAYABbwH1AfMB8QGLAdgB5wEyAdQB6gEuAesB7wFAAYsBnwHdAdEBywHZAcwBxAHW - AcYBvgGYAYABbwFlAUoBNgMAAQ4BeAGeAU8BywHxATQBwAHvAS8BvgHvAQwBYgGBAZcBgAFvAZcBgAFv - AZcBgAFvAdkBbAHYAfoBrQH6AfsBmAH6AdwBcAHbAY0BLQGMDAABDgF4AZ4BTwHLAfEBNAHAAe8BLwG+ - Ae8BDAFiAYEBlwGAAW8BlwGAAW8BlwGAAW8B2QFsAdgB+gGtAfoB+wGYAfoB3AFwAdsBjQEtAYwSAAGy - AZ0BjgP/AvwB+wH6AfgB9wH2AfIB8QHyAe0B6gHuAecB4wHpAeAB2wHkAdkB1AHfAdIBywFpAU4BOgHt - AeYB4wHZAcwBxAHMAbgBrQYAAZ8BiAF4AfgB9wH2AfAB8gHxAVcBzwHlAV4BxwHVAd4B2gHYAeIB2AHT - Ad0B0QHLAdkBzAHEAZ8BiAF4AWUBSgE2ARQBqgHhAYUB4QH1AWsB1wH0AVABywHxATQBwAHwAR0BtQHu - AQwBYgGBCQAB0wFlAdIB+gGtAfoB+wGYAfoB3AFwAdsBjQEtAYwGAAEUAaoB4QGFAeEB9QFrAdcB9AFQ - AcsB8QE0AcAB8AEdAbUB7gEMAWIBgQkAAdMBZQHSAfoBrQH6AfsBmAH6AdwBcAHbAY0BLQGMEgABtgGh - AZMBrgGaAYsBpwGRAYEBnwGJAXkBlwGAAW8BjwF3AWUBhwFvAV0BfwFnAVMBeAFfAUwSAAGtAZYBhwH/ - AvwB+AH3AfYB9QHzAfEB7wLuAe0B5gHjAecB3wHcAeIB2AHTAd0B0QHLAacBjgF9AWUBSgE2AwABFAGq - AeEBhgHhAfUBbAHWAfMBUAHLAfIBNQHAAfABHAG1Ae0BDAFiAYEJAAHTAWUB0gH6Aa0B+gHTAWUB0gwA - ARQBqgHhAYYB4QH1AWwB1gHzAVABywHyATUBwAHwARwBtQHtAQwBYgGBCQAB0wFlAdIB+gGtAfoB0wFl - AdJCAAGzAZsBjwP/A/sB+AH3AfYB9QHzAfEB7wLuAe0B5gHjAecB3wHcAeIB2AHTAd0B0QHLAWUBSgE2 - BgABFAGqAeEBhQHgAfUBbAHWAfMBUAHLAfIBNAHAAe8BHQG1Ae0BDAFiAYEJAAHTAWUB0hIAARQBqgHh - AYUB4AH1AWwB1gHzAVABywHyATQBwAHvAR0BtQHtAQwBYgGBCQAB0wFlAdJIAAG1AaEBlQGtAZYBhwGn - AY4BfQGfAYgBeAGYAYABbwGQAXgBZgGIAXEBXgGAAWgBVgF1AVsBSAwAARQBqgHhAYYB4QH0AWsB1gH0 - AVABywHxARcBmAHIJAABFAGqAeEBhgHhAfQBawHWAfQBUAHLAfEBFwGYAciBAAEUAaoB4QGFAeEB9QEX - AZgByCoAARQBqgHhAYUB4QH1ARcBmAHIhwABFAGqAeEwAAEUAaoB4RsAAUIBTQE+BwABPgMAASgDAAFA - AwABMAEBAgABAQEAAQEFAAGAAQkWAAP/AQAC/wcAAQMHAAEDBgABgAEDBgABgAEHBgABwAEHBgABwAEP - BgAB4AEPBgAB4AEfBgAB8AEfBgAB8AE/BgAB+AE/BgAB+AF/BgAB/AF/BgAB/gH/BgAB/gH/BgAC/wHv - Af8BgQH/Ae8C/wH3AccB9wEAAf8BxwH3Af8B4wGDAeMBAAH3AcMB4wH/AcEBAQHBAQAB4wHHAcEB+wGA - AQEBgAEAAcEBgwGAAfEBAQGBAQEBgQGAAgEB4AGDAcABgwGRAQEBAAGDAcABRwHAAUcBgAGDAYABRwGA - AS8BgAEvAcABRwGAAS8BwAEfAcABHwGAAS8BwAEfAeABDwHgAQ8BwAEfAeABDwHwAR8B8AEfAeABDwHw - AR8B+AE/AfgBPwHwAR8B+AE/AfwBfwH8AX8B+AE/AfwBfwH+Af8B/gH/AfwBfwH+Bf8B/gX/Ae8B/wGB - Af8B7wP/AccB/wEAAf8BxwL/Ae8BgwH/AQAB/wHDAv8BxwEBAf8BAAH/AccC/wGDAQEB7wEAAe8BgwH/ - AfcBAQGDAccBgQHHAQEB7wHjAYABxwGDAZkBgwEBAccBwAEBAecBAQGBAQECgwGAAuMBgAHDAYABxwEB - AcABdwHAAQEBwAEBAeMBgAHgAf8BgAHjAYAB4wHAAQEB8QH/AcABdwHAAXcBgAHjAfsB/wHgAf8B4AH/ - AcABdwL/AfEB/wHxAf8B4AP/AfsB/wH7Af8B8Qf/AfsB/wH9Af8B7QH/AYEB/wHtAf8B+AH/AcAB/wEA - Af8BwAH/AfABfwGAAX8BAAF/AcABfwHgAT8BAAE/AQABPwHAAT8B8AEXAQABFwEAARcBgAEXAfgBIwGA - ASMBgAEjAQABIwHkAUEBxAFBAYABQQEAAUEBwgGAAcIDgAGCAYABgQEBAYEBAQGBAQEBgQEBAQABgwEA - AYMBAAGDAQABgwEAAUcBAAFHAQABRwEAAUcBgAEvAYABLwGAAS8BgAEvAcABfwHAAX8BwAF/AcABfwHg - Af8B4AH/AeAB/wHgAf8B8QH/AfEB/wHxAf8B8QH/AfsB/wH7Af8B+wH/AfsE/wHfAf8BAwH/Ae8D/wGP - Af4BAQH/AccD/wEHAf4BAQH/AcMC/wH+AQMB/gEBAf8BxwL/Af4BAwH+AQEB/wGDA/8BBwH/AQMB/wEB - A/8BjwH/ATMB/wEBAf8BfwH/Ad8B/wEDAf8BgwHuAT4B/wF/Af8BBwH/AUcBxAEEAe4BPgHuAT4B7gE+ - AeABAAHEAQQBxAEEAcQBBAHwAQAB4AEAAeABAAHgAQAB+AEAAfABAAHwAQAB8AEAAfwBAAH4AQAB+AEA - AfgBAAH+AQAB/AEAAfwBAAH8AQAC/wH+AQAB/gEAAf4BAAP/Ad8B/wEDAf8B7wEAAQ8B/wGPAf4BAQH/ - AccBAAEPAQABBwEAAQEBAAEDAQABDwEAAQMBAAEBAQABBwEAAQ8BAAEDAQABAQEAAQMBAAEPAQABBwEA - AQMBAAEBAQABDwEAAQ8BAAEDAQABAQEAAQ8BAAEPAQABAwEAAQMBAAEOAQABDwEAAQcBAAEHAQABBAEA - AQ4BAAEOAQABDgMAAQQBAAEEAQABBAgAAfgHAAH8AQAB+AEAAfgBAAH4AQAB/gEAAfwBAAH8AQAB/AEA - Av8B/gEAAf4BAAH+AQAB7wH/AYEB/wHvA/8BxwHtAQAB/wHHAf8B/AEPAYAB7gEAAe0BwwHtAfgBBwEB - AYIBAAHuAcQB7gHwAQMBAQHuAQABggGDAYIB4AEBAYAB7QGBAe4BAQHuAeABAQHHAf8BgAHtAQAB7QHg - AQMB7wH/AYEB/wGDAf8BAAEHAcABAQHDAf8BxwH/AQABBwL/AcABAQHAAQEB4AEDAesF/wHgAQEB3QGB - AesB/wHrAf8B4AEBAd4B/wHdAYEB3QGBAfABAwHfAX8B3gH/Ad4B/wH4AQcB7wH/Ad8BfwHfAX8B/AEP - Av8B7wH/Ae8D/wGBAf8B7wX/AQAB3wHHAd8D/wHtAQABjwHDAY8C/wHAAe4BAAEHAccBBwH5Ac8B/wGC - AQABBwGCAQcB8wHnAf8B7gGAAQcBAAEHAfMB5wHAAe0BgAEHAQABBwHzAecC/wGAAQsBggELAvcC/wHA - AREBxwERAecB8wHAAQEB/wGgAf8BoAL3Av8B4AFAAeABQAHzAecB6wL/AcAB/wHAAfMB5wHdAYEB+AFA - AfgBQAHzAecB3gL/AcEB/wHBAfkBzwHfAX8B/wHjAf8B4wL/Ae8C/wH3Af8B9wT/AYEB/wHvAv8B3wHv - Af8BAAH/AccB/wHBAY8BxwHfAQAB/wHDAv8BBwGDAY8BAAH/AccB/wECAQcBAQEHAQAB/wGDAf8B/gEH - AQABBwGBAfcBAQH3AcIBBwGCAQcBmQHjAQEB4wH+AQsBxgEHAYEBwQGDAcEB+AERAe4BCwHDAYABxwGA - Af8BoAH4AREB/wEAAf8BAAHgAUAB/wGgAYEBAAGBAQAB/wHAAeABQAH/AQAB/wEAAfgBQAH/AcAB4QEB - AeEBAQH/AcEB+AFAAf8BgwH/AYMB/wHjAf8BwQH/AccB/wHHAf8B9wH/AeMB/wHvAf8B7wP/AfcB7wX/ - Ae8B/wHHAf8BAAEDAv8BxwH/AcMB/wEAAQEC/wGDAf8BxwH/AgAB/wH3AQEB/wGDAf8CAAH/AeMBAQH3 - AQEB/wIAAf8BwQGDAeMBAQH/AgABwQGAAccBwQGDAeMCAAH/AQABwQGAAccBwQIAAYEBAAH/AQABgAMA - Af8BAAGBBQAB4QEBAf8FAAH/AYMB4QEBAYADAAH/AccB/wGDAc8CgAEAAf8B7wH/AccB/wHBAcABEAP/ - Ae8B/wHjBv8B7wP/Ae8B/wGBAf8BxwP/AccB/wEAAf8BwwP/AYMB/wEAAf8BxwP/AQEB/wEAAf8BgwL/ - AcEBAQH/AQAB/wEBAf8BgwGAAYMB/wGBAf8BAQH/AgABxwH/AZkB/wGDAf8CAAHvAccBgQHjAccB4wIA - AZ8BgwHDAcEBzwHBAwABAQGAAQABgAEcAYMFAAGAARwB/wGABAABzwGcAf8BwQIAAYABAAH/AcEC/wGf - AQEBzwGAAf8B4wP/AYMB/wHBBf8BxwH/AeMB7wP/Ae8B/wGBAf8BxwP/AccB/wEAAf8BwwP/AYMB/wEA - Af8BxwP/AQEB/wEAAf8BgwHfAv8BAQH/AQAB/wEBAY8B/wHjAYMB/wGBAf8BAQEHAc8BwQHHAf8BmQH/ - AYIBAwGAARwB7wH/AYEB/wHGAQEBgAEcAf8BxwHDAeMB/gEBAc8BnAGfAYMBzwHBAf4BAQH/AcEBAAE5 - AYABHAH/AQEB/wHjAQABOQGAARwB/wGDAv8BnwE5Ac8BnAH/AccD/wGDAf8BwQH/Ae8D/wHHAf8B4wz/ - AfcB/wGBAf8B9wP/AeMB/wEAAf8B4wP/AcEB/wEAAf8B4QL/AX8BgAH/AQAB/wHjAf8B/gE/AYAB7wEA - Ad8BwQH/AfwBHwHBAccBgQGPAYABAAH4AQ8B4wGDAZkBBwGAAQAB+AEHAfcBAQGAAQMBwAEAAfgBBwH/ - AQABwgEBAeIBAAH4AQcB/wEAAf4BAQGCAQAB/AEHAf8BAAH+AQEB/gEAAf4BDwH/AYAB/wEBAQIBAAH/ - AR8B/wHBAf8BgwH+AQAB/wG/Af8B4wH/AccBwgEAA/8B9wH/Ae8Q/wH7Bf8BwAH/AfED/wHvAf8BgAF/ - AfgB/wH+AQABxwH/AYABfwH4AX8B/gEAAYMB/wGAAX8B/AE/Af4BAAEBAf8BgAF/AfABHwH+AwABwAEA - AfABDwGCAQABggEAAcwBAAH4AT8B/gEAAcYBAAHAAQAB+AEfAQIBAAHuAQAB4AEAAfwBDwH+AQABggEA - AYIBAAH8AQcBwgEAAf4BAAH+AQAB/gEHAv8BAgEAAQIBAAT/Af4BAAH+AQAE/wHCAQABwgEACf8B7wH/ - AQMB/wHvAv8BAAEHAf4BAQH/AccB/AE/AQABAwEAAQEBAAEDAfABDwEAAQEBAAEBAQABBwHgAQcBAAEB - AQABAQEAAQMBwAEDAQABAwEAAQMBAAEBAcABAwEAAQcBAAETAQABAQGAAQEBAAEBAQABAwEAAQMBgAEB - AwABAQEAAQEBgAEBAf4FAAGAAQEB/gEAAf4BAAH+AQABgAEDAf4BAAH+AQAB/gEAAcABAwH+AQAB/gEA - Af4BAAHgAQcB/wEBAf4BAAH+AQAB8AEPA/8BAQH/AQEB+AEPCf8BvwH+AQcF/wEfAfwBAwH/Ad8BAAEf - Af4BDwH8AQMB/wGPAQABHwH8AQcB/AEDAf8BhwEAAR8BgAEHAYABAwH/AY8BAAEfAQABDwEAAQcBgAEH - AQABHwEAAR8BAAFnAQABAwEAAR8BAAE/AQABBwEAAQMBAAEBAQABAwEAAQMBAAEHAwABAQEAAQEBAAED - Af4BAAGAAQEBgAEBAQABAQH+AQAB/AEBAfwBAQGAAQEB/gEAAfwBAQH8AQEB/AEBAf4BAAH8AQEB/AEB - AfwBAQH/AQEB/gEDAf4BAwH8AQEG/wH+AQMC/wHvAf8BgQH/Ae8D/wHAAQEBAAEBAcABAQL/AYADAAGA - AQABwAF/BAABgAEAAYABPwQAAYABAAGAAT8BgAEAAYADAAGAAT8BgAEAAYADAAGAAQEBgAEAAYABAAGA - AQABgAEAAYABAAGAAQABgAEAAcABAAGAAQABgAEAAYABAAH+AQABgAEAAYABAAGAAQAB/gEAAcABAQHA - AQEBwAEBAf4BAAH5Ac8B+QHPAfkBzwH/AQEB+QHPAfkBzwH5Ac8C/wH8AR8B/AEfAfwBHwL/Af4BPwH+ - AT8B/gE/Av8BgQH/Ae8F/wEAAfcBxwH3Av8BwAEBAQAB4wHDAeMC/wGAAgABAQHHAQEB8AEHAYACAAFg - AYMBYAHgAQMBgAEAAYEBcQEBAXEB4AEDAYABAAGZAXsBAQF7AeABAwGAAQABgQF3AYMBdwHgAQMBgAEA - AcMBYwHDAWMB4AEDAYABAAHAAQEBwAEBAeABAwGAAQABgAHgAYAC4AEDAYABAAHAAXEBwAFxAfABBwHA - AQEB4AE7AeABOwL/AfkBzwHwAX8B8AF/Av8B+QHPAfgB/wH4A/8B/AEfAf0B/wH9A/8B/gE/Av8B+AEH - Av8B9wP/AfABAwH/Ae8B4wH3Av8B8AEDAf8BxwHBAeMC/wHwAQMB/gEDAYABAQH8AQEB+AEHAf4BwQGA - AWAB+AEAAfgBBwH+AeMBwQFxARgBAAH8AQEB/gH3AeMBewIAAfgBAAHuAe8B9wF3ARgBAAEYAQABxgHH - AeMBYwH4AwABgAEDAcABAQH4AQABGAEAAQEBwQGAAeAB/AEBAfgBAAGAAeMBwAFxAv8B+AEAAcABdwHg - ATsC/wH8AQEB4AH/AfABfwT/AfEB/wH4Bf8B+wH/Af0B/ws= - - - - 231, 17 - - - 361, 17 - - - 25 - - \ No newline at end of file diff --git a/Users/Orvid/PlugViewer/NameBuilder.cs b/Users/Orvid/PlugViewer/NameBuilder.cs deleted file mode 100644 index 6ee028195e..0000000000 --- a/Users/Orvid/PlugViewer/NameBuilder.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Runtime.InteropServices; - -namespace PlugViewer -{ - public static class NameBuilder - { - public static string BuildMethodName(MethodInfo m) - { - return m.ReturnType.Name + "\t\t" + BuildMethodDisplayName(m); - } - - public static string BuildMethodDisplayName(MethodInfo m) - { - StringBuilder sb = new StringBuilder(); - sb.Append(m.Name); - sb.Append("("); - int cnt = 0; - bool optional = false; - string defValue = ""; - ParameterInfo[] prms = m.GetParameters(); - while (cnt < prms.Length) - { - if (cnt > 0) - { - sb.Append(", "); - } - ParameterInfo pd = prms[cnt]; - foreach (object c in pd.GetCustomAttributes(true)) - { - if (c is OutAttribute) - { - sb.Append("out "); - } - else if (c is InAttribute) - { - sb.Append("in "); - } - else if (c is OptionalAttribute) - { - optional = true; - } - else if (c is DefaultParameterValueAttribute) - { - DefaultParameterValueAttribute d = (DefaultParameterValueAttribute)c; - String s = d.Value.ToString(); - Object o = d.Value; - switch (s) - { - case "System.SByte": - defValue = ((SByte)o).ToString(); - break; - case "System.Int16": - defValue = ((Int16)o).ToString(); - break; - case "System.Int32": - defValue = ((Int32)o).ToString(); - break; - case "System.Int64": - defValue = ((Int64)o).ToString(); - break; - case "System.Byte": - defValue = ((Byte)o).ToString(); - break; - case "System.UInt16": - defValue = ((UInt16)o).ToString(); - break; - case "System.UInt32": - defValue = ((UInt32)o).ToString(); - break; - case "System.UInt64": - defValue = ((UInt64)o).ToString(); - break; - case "System.Decimal": - defValue = ((Decimal)o).ToString(); - break; - case "System.Double": - defValue = ((Double)o).ToString(); - break; - case "System.Single": - defValue = ((Single)o).ToString(); - break; - case "System.String": - defValue = "\"" + ((String)o).ToString() + "\""; - break; - case "System.Char": - defValue = "'" + ((Char)o).ToString() + "'"; - break; - - default: - //if (c.ConstructorArguments[0].Type.Resolve().IsEnum) - //{ - - //} - defValue = "Default Value was of a custom type. Unable to serialize."; - break; - } - } - } - sb.Append(pd.ParameterType.Name); - sb.Append(" "); - sb.Append(pd.Name); - if (optional) - { - sb.Append(" = "); - sb.Append(defValue); - optional = false; - } - cnt++; - } - sb.Append(")"); - //throw new Exception(); - return sb.ToString(); - } - - } -} diff --git a/Users/Orvid/PlugViewer/Orvid.sln b/Users/Orvid/PlugViewer/Orvid.sln deleted file mode 100644 index ece4751ff9..0000000000 --- a/Users/Orvid/PlugViewer/Orvid.sln +++ /dev/null @@ -1,60 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlugViewer", "PlugViewer.csproj", "{2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|Any CPU.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.Build.0 = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|Any CPU.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|Mixed Platforms.Build.0 = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7} = {D94C5D8B-D42B-43C8-B0B7-E1593D639FED} - {D399715F-C947-4C07-94DF-E7E86C469EF1} = {D94C5D8B-D42B-43C8-B0B7-E1593D639FED} - {4D7BE49B-BFD2-4586-A411-5EFC82621291} = {2EAB2950-80E9-421E-B6EE-9F8970B90CE9} - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF} = {2EAB2950-80E9-421E-B6EE-9F8970B90CE9} - {55F1D089-785A-4B4E-BD45-3BEB26877CB7} = {BD5E0870-A4F7-4048-8FB0-6DD332AFF25D} - {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} = {BD5E0870-A4F7-4048-8FB0-6DD332AFF25D} - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936} = {55F1D089-785A-4B4E-BD45-3BEB26877CB7} - {086FC210-C2E9-4536-8235-9285929F904A} = {55F1D089-785A-4B4E-BD45-3BEB26877CB7} - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {94D079E4-3C66-486A-8407-EA6EC049FF53} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {1116130E-28E0-428A-A597-F4B3B676C0CA} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {7C64B97F-516D-4A6D-B9E1-3FE48F561409} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {D9A87AAD-FCC9-4517-B31D-E904DAD00784} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {6A991D03-1435-4005-9809-B8BACDF3B021} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {B97A2956-C363-47F2-A6AA-B4FCCFF4D315} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {61607F1E-58F9-41CF-972F-128384F3E115} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {453F2952-FD48-477F-889B-B3C6963C9850} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {63F7BFB9-419E-4965-B580-304B9C9FA7D8} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {A7F3F078-CF99-4018-9A35-2D6DC9517ADB} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {BC6AE974-1F18-4A19-A956-5062E4D3FD53} = {7A36C045-17E7-4965-8B1C-043EB757D3C8} - {B75AE496-E7AC-4EC4-9904-43D6B84D9705} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {7F0794F7-4516-46BB-AE77-DBA713DCD63C} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {59E2210F-3F41-42DF-8B26-9CAE87273562} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - {7CEE0541-0107-47F3-B422-70C55E81CE42} = {68E71759-5EAF-4BBA-90D8-CED9D5AAD741} - EndGlobalSection -EndGlobal diff --git a/Users/Orvid/PlugViewer/PlugTemplateDumper.cs b/Users/Orvid/PlugViewer/PlugTemplateDumper.cs deleted file mode 100644 index acf763fc3f..0000000000 --- a/Users/Orvid/PlugViewer/PlugTemplateDumper.cs +++ /dev/null @@ -1,160 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Text; -using System.IO; -using System.Windows.Forms; - -namespace PlugViewer -{ - public static class PlugTemplateDumper - { - public static void Dump(Assembly asm) - { - const MethodImplAttributes BadFlags = MethodImplAttributes.InternalCall | MethodImplAttributes.Native | MethodImplAttributes.Unmanaged; - bool TypeNeedsPlugs = false; - bool firstParam = true; - string str = ""; - string genParams = ""; - string curDir = Application.StartupPath + "\\PlugTemplates\\" + asm.GetName().Name + "\\"; - if (!Directory.Exists(Application.StartupPath + "\\PlugTemplates\\")) - { - Directory.CreateDirectory(Application.StartupPath + "\\PlugTemplates\\"); - } - StreamWriter strm = null; // Only set to null to appease the compiler. - foreach (Type t in asm.GetTypes()) - { - if (t.BaseType != null && t.BaseType.FullName != "System.MulticastDelegate") - { - foreach (MethodInfo m in t.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.DeclaredOnly)) - { - if ((m.GetMethodImplementationFlags() & BadFlags) != 0 || (m.Attributes & MethodAttributes.PinvokeImpl) != 0) - { - if (!TypeNeedsPlugs) - { - if (!Directory.Exists(curDir)) - { - Directory.CreateDirectory(curDir); - } - if (t.Namespace != null) - { - if (!Directory.Exists(curDir + t.Namespace.Replace('.', '\\') + "\\")) - { - Directory.CreateDirectory(curDir + t.Namespace.Replace('.', '\\') + "\\"); - } - } - genParams = ""; - str = ""; - if (t.IsGenericTypeDefinition) - { - genParams = "<"; - str = "<"; // This will be used for the typeof target. - firstParam = true; - foreach (Type T in t.GetGenericArguments()) - { - if (!firstParam) - { - genParams += ", "; - str += ", "; - } - genParams += T.Name; - str += "object"; - } - genParams += ">"; - str += ">"; - } - if (t.Namespace != null) - { - strm = new StreamWriter(curDir + t.Namespace.Replace('.', '\\') + "\\" + t.Name + "Impl.cs"); - } - else - { - strm = new StreamWriter(curDir + "\\" + t.Name + "Impl.cs"); - } - strm.WriteLine("namespace Cosmos.Plugs"); - strm.WriteLine("{"); - strm.WriteLine("\t[IL2CPU.API.Plug(Target = typeof(" + t.Namespace + "." + t.Name + str + "), TargetFramework = IL2CPU.API.FrameworkVersion.v4_0)]"); - strm.WriteLine("\tpublic static class " + t.FullName.Replace('.', '_') + "Impl" + genParams); - strm.WriteLine("\t{"); - TypeNeedsPlugs = true; - } - strm.WriteLine(); - str = ""; - firstParam = true; - if (!m.IsStatic) - { - if (t.IsValueType && !t.IsEnum) // aka, a struct, instance members are references. - { - str += "ref " + t.FullName.Replace('&', '*') + " aThis"; - } - else // Something else, instance members aren't references. - { - str += t.FullName.Replace('&', '*') + " aThis"; - } - firstParam = false; - } - if (m.ContainsGenericParameters) - { - foreach (ParameterInfo p in m.GetParameters()) - { - if (!firstParam) - { - str += ", "; - } - if (p.ParameterType.IsGenericType || p.ParameterType.IsGenericParameter || p.ParameterType.IsGenericTypeDefinition) - { - str += p.ParameterType.Name + " " + p.Name; - } - else - { - if (p.ParameterType.FullName != null) - { - str += p.ParameterType.FullName.Replace('&', '*') + " " + p.Name; - } - else - { - str += p.ParameterType.Name.Replace('&', '*') + " " + p.Name; - } - } - firstParam = false; - } - } - else - { - foreach (ParameterInfo p in m.GetParameters()) - { - if (!firstParam) - { - str += ", "; - } - str += p.ParameterType.FullName.Replace('&', '*') + " " + p.Name; - firstParam = false; - } - } - if (m.ReturnType.IsGenericParameter || m.ReturnType.IsGenericType) - { - strm.WriteLine("\t\tpublic static " + m.ReturnType.Name + " " + m.Name + "(" + str + ")"); - } - else - { - strm.WriteLine("\t\tpublic static " + m.ReturnType.FullName.Replace('&', '*') + " " + m.Name + "(" + str + ")"); - } - strm.WriteLine("\t\t{"); - strm.WriteLine("\t\t\tthrow new System.NotImplementedException(\"Method '" + t.FullName + "." + m.Name + "' has not been implemented!\");"); - strm.WriteLine("\t\t}"); - } - } - if (TypeNeedsPlugs) - { - strm.WriteLine("\t}"); - strm.WriteLine("}"); - strm.Flush(); - strm.Close(); - } - TypeNeedsPlugs = false; - } - } - } - - } -} diff --git a/Users/Orvid/PlugViewer/PlugViewer.csproj b/Users/Orvid/PlugViewer/PlugViewer.csproj deleted file mode 100644 index df0c35f86d..0000000000 --- a/Users/Orvid/PlugViewer/PlugViewer.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF} - WinExe - Properties - PlugViewer - PlugViewer - v4.7.1 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - Form - - - MainForm.cs - - - - - - - - - - - - - - - - - - - - MainForm.cs - - - - - - - - diff --git a/Users/Orvid/PlugViewer/Program.cs b/Users/Orvid/PlugViewer/Program.cs deleted file mode 100644 index ac992ea7ff..0000000000 --- a/Users/Orvid/PlugViewer/Program.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace PlugViewer -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); - Log.Close(); - } - } -} diff --git a/Users/Orvid/PlugViewer/Properties/AssemblyInfo.cs b/Users/Orvid/PlugViewer/Properties/AssemblyInfo.cs deleted file mode 100644 index 717f620db6..0000000000 --- a/Users/Orvid/PlugViewer/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("PlugViewer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("PlugViewer")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("4b271663-85f8-4f85-9e58-bed3eaaa6659")] - -// 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/Users/Orvid/PlugViewer/Readme.txt b/Users/Orvid/PlugViewer/Readme.txt deleted file mode 100644 index a191985f69..0000000000 --- a/Users/Orvid/PlugViewer/Readme.txt +++ /dev/null @@ -1,28 +0,0 @@ - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Debug Definitions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There are various debug definitions you can enable by defining the constants globally. - -#define DebugTreeNodeLoading ~ Enables log messages from the tree node loading. -#define DebugErrors ~ Enables log messages from all errors. -#define DebugWarnings ~ Enables log messages from all warnings. - - -The next 2 can be enabled by simply un-commenting the defines in TestRunner.cs, -rather than defining them globally. - -#define DebugErrorLoading ~ Enables logging when loading Errors. -#define DebugWarningsLoading ~ Enables logging when loading Warnings. - - - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Notes on Errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When creating an error, make sure to set the icon of the method to the error icon. - - - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Notes on Warnings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When creating a warning, make sure to first check that an error wasn't -already triggered, before setting the icon index to the warning icon. \ No newline at end of file diff --git a/Users/Orvid/PlugViewer/Resources/Assembly.bmp b/Users/Orvid/PlugViewer/Resources/Assembly.bmp deleted file mode 100644 index 7ad283ce3c..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Assembly.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/BrokenReference.bmp b/Users/Orvid/PlugViewer/Resources/BrokenReference.bmp deleted file mode 100644 index 322979a3f8..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/BrokenReference.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Class.bmp b/Users/Orvid/PlugViewer/Resources/Class.bmp deleted file mode 100644 index e16c213f03..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Class.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Class_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Class_Internal.bmp deleted file mode 100644 index 1e466e8ce1..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Class_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Class_Private.bmp b/Users/Orvid/PlugViewer/Resources/Class_Private.bmp deleted file mode 100644 index 1cf6f293c6..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Class_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Class_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Class_Protected.bmp deleted file mode 100644 index 780c8a0d45..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Class_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Constant.bmp b/Users/Orvid/PlugViewer/Resources/Constant.bmp deleted file mode 100644 index ec116a1f01..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Constant.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Delegate.bmp b/Users/Orvid/PlugViewer/Resources/Delegate.bmp deleted file mode 100644 index 93daea7efe..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Delegate.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Delegate_Friend.bmp b/Users/Orvid/PlugViewer/Resources/Delegate_Friend.bmp deleted file mode 100644 index 1f0e93f21e..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Delegate_Friend.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Delegate_Private.bmp b/Users/Orvid/PlugViewer/Resources/Delegate_Private.bmp deleted file mode 100644 index 13343787d2..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Delegate_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Delegate_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Delegate_Protected.bmp deleted file mode 100644 index 67ea8a666c..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Delegate_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Enum.bmp b/Users/Orvid/PlugViewer/Resources/Enum.bmp deleted file mode 100644 index 9f549ec6f4..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Enum.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/EnumItem.bmp b/Users/Orvid/PlugViewer/Resources/EnumItem.bmp deleted file mode 100644 index c4a75b98d0..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/EnumItem.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/EnumItem_Internal.bmp b/Users/Orvid/PlugViewer/Resources/EnumItem_Internal.bmp deleted file mode 100644 index 8fa0dbc35b..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/EnumItem_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/EnumItem_Private.bmp b/Users/Orvid/PlugViewer/Resources/EnumItem_Private.bmp deleted file mode 100644 index 315e3b02a1..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/EnumItem_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/EnumItem_Protected.bmp b/Users/Orvid/PlugViewer/Resources/EnumItem_Protected.bmp deleted file mode 100644 index 61d6acc577..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/EnumItem_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Enum_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Enum_Internal.bmp deleted file mode 100644 index e43e19ae8d..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Enum_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Enum_Private.bmp b/Users/Orvid/PlugViewer/Resources/Enum_Private.bmp deleted file mode 100644 index 092ecb539f..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Enum_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Enum_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Enum_Protected.bmp deleted file mode 100644 index 6778926565..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Enum_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Error.bmp b/Users/Orvid/PlugViewer/Resources/Error.bmp deleted file mode 100644 index 9f78a99aed..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Error.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Event.bmp b/Users/Orvid/PlugViewer/Resources/Event.bmp deleted file mode 100644 index eac0b7e5fd..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Event.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Exception.bmp b/Users/Orvid/PlugViewer/Resources/Exception.bmp deleted file mode 100644 index ee8c42d871..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Exception.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Exception_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Exception_Internal.bmp deleted file mode 100644 index 5811483634..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Exception_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Exception_Private.bmp b/Users/Orvid/PlugViewer/Resources/Exception_Private.bmp deleted file mode 100644 index 628a24b5f9..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Exception_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Exception_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Exception_Protected.bmp deleted file mode 100644 index 9560e2ad67..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Exception_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Field.bmp b/Users/Orvid/PlugViewer/Resources/Field.bmp deleted file mode 100644 index 184289ef82..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Field.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Field_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Field_Internal.bmp deleted file mode 100644 index 38c0fd863b..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Field_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Field_Private.bmp b/Users/Orvid/PlugViewer/Resources/Field_Private.bmp deleted file mode 100644 index 0d26241656..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Field_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Field_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Field_Protected.bmp deleted file mode 100644 index 673e85e1ab..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Field_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Interface.bmp b/Users/Orvid/PlugViewer/Resources/Interface.bmp deleted file mode 100644 index d9a58576da..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Interface.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/InterfaceImpl.bmp b/Users/Orvid/PlugViewer/Resources/InterfaceImpl.bmp deleted file mode 100644 index 34b6aadb7a..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/InterfaceImpl.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Internal.bmp b/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Internal.bmp deleted file mode 100644 index f3de175af9..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Private.bmp b/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Private.bmp deleted file mode 100644 index a9a330dd4b..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Protected.bmp b/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Protected.bmp deleted file mode 100644 index 6613ac2f51..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/InterfaceImpl_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Interface_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Interface_Internal.bmp deleted file mode 100644 index 90181157c1..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Interface_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Interface_Private.bmp b/Users/Orvid/PlugViewer/Resources/Interface_Private.bmp deleted file mode 100644 index 1bcc0b3cf7..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Interface_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Interface_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Interface_Protected.bmp deleted file mode 100644 index fcbaa35aee..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Interface_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Library.bmp b/Users/Orvid/PlugViewer/Resources/Library.bmp deleted file mode 100644 index 432aa5cb5b..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Library.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Method.bmp b/Users/Orvid/PlugViewer/Resources/Method.bmp deleted file mode 100644 index b83e52037f..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Method.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/MethodOverload.bmp b/Users/Orvid/PlugViewer/Resources/MethodOverload.bmp deleted file mode 100644 index 5687cc731a..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/MethodOverload.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/MethodOverload_Internal.bmp b/Users/Orvid/PlugViewer/Resources/MethodOverload_Internal.bmp deleted file mode 100644 index dc5bc51932..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/MethodOverload_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/MethodOverload_Private.bmp b/Users/Orvid/PlugViewer/Resources/MethodOverload_Private.bmp deleted file mode 100644 index c1f1b461a9..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/MethodOverload_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/MethodOverload_Protected.bmp b/Users/Orvid/PlugViewer/Resources/MethodOverload_Protected.bmp deleted file mode 100644 index 10e6e6cdc7..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/MethodOverload_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Method_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Method_Internal.bmp deleted file mode 100644 index e517d31c5d..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Method_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Method_Private.bmp b/Users/Orvid/PlugViewer/Resources/Method_Private.bmp deleted file mode 100644 index 871fb04848..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Method_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Method_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Method_Protected.bmp deleted file mode 100644 index ac1084f5bf..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Method_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Namespace.bmp b/Users/Orvid/PlugViewer/Resources/Namespace.bmp deleted file mode 100644 index 9ef026a49e..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Namespace.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Operator.bmp b/Users/Orvid/PlugViewer/Resources/Operator.bmp deleted file mode 100644 index e54478d280..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Operator.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Operator_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Operator_Internal.bmp deleted file mode 100644 index ec752b8eea..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Operator_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Operator_Private.bmp b/Users/Orvid/PlugViewer/Resources/Operator_Private.bmp deleted file mode 100644 index e32b6c9c66..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Operator_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Operator_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Operator_Protected.bmp deleted file mode 100644 index 0a52b506d3..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Operator_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Plug.png b/Users/Orvid/PlugViewer/Resources/Plug.png deleted file mode 100644 index baf98ca732..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Plug.png and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly.bmp b/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly.bmp deleted file mode 100644 index 2b1c21525e..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Internal.bmp deleted file mode 100644 index dd0bb58808..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Private.bmp b/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Private.bmp deleted file mode 100644 index d04cb93256..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Protected.bmp deleted file mode 100644 index be5f27d502..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties-ReadOnly_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties.bmp b/Users/Orvid/PlugViewer/Resources/Properties.bmp deleted file mode 100644 index bb4f66311e..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Properties_Internal.bmp deleted file mode 100644 index d39fd8e7b9..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties_Private.bmp b/Users/Orvid/PlugViewer/Resources/Properties_Private.bmp deleted file mode 100644 index 072151fbb9..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Properties_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Properties_Protected.bmp deleted file mode 100644 index 476d9fe5f3..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Properties_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Structure.bmp b/Users/Orvid/PlugViewer/Resources/Structure.bmp deleted file mode 100644 index 6ea54e4c5b..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Structure.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Structure_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Structure_Internal.bmp deleted file mode 100644 index 010c546521..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Structure_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Structure_Private.bmp b/Users/Orvid/PlugViewer/Resources/Structure_Private.bmp deleted file mode 100644 index c44f70900f..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Structure_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Structure_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Structure_Protected.bmp deleted file mode 100644 index 9fd09b5955..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Structure_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Union.bmp b/Users/Orvid/PlugViewer/Resources/Union.bmp deleted file mode 100644 index 08bf4e3f04..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Union.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Union_Internal.bmp b/Users/Orvid/PlugViewer/Resources/Union_Internal.bmp deleted file mode 100644 index 317cc9c85f..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Union_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Union_Private.bmp b/Users/Orvid/PlugViewer/Resources/Union_Private.bmp deleted file mode 100644 index f427a1efe7..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Union_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Union_Protected.bmp b/Users/Orvid/PlugViewer/Resources/Union_Protected.bmp deleted file mode 100644 index 48d70c30a6..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Union_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/ValueType.bmp b/Users/Orvid/PlugViewer/Resources/ValueType.bmp deleted file mode 100644 index cd5e58165a..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/ValueType.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/ValueType_Internal.bmp b/Users/Orvid/PlugViewer/Resources/ValueType_Internal.bmp deleted file mode 100644 index ff176489f6..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/ValueType_Internal.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/ValueType_Private.bmp b/Users/Orvid/PlugViewer/Resources/ValueType_Private.bmp deleted file mode 100644 index 6f34c72b5d..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/ValueType_Private.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/ValueType_Protected.bmp b/Users/Orvid/PlugViewer/Resources/ValueType_Protected.bmp deleted file mode 100644 index f4cd738495..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/ValueType_Protected.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/Resources/Warning.bmp b/Users/Orvid/PlugViewer/Resources/Warning.bmp deleted file mode 100644 index 6eb824e614..0000000000 Binary files a/Users/Orvid/PlugViewer/Resources/Warning.bmp and /dev/null differ diff --git a/Users/Orvid/PlugViewer/TestRunner.cs b/Users/Orvid/PlugViewer/TestRunner.cs deleted file mode 100644 index a4e9d10e96..0000000000 --- a/Users/Orvid/PlugViewer/TestRunner.cs +++ /dev/null @@ -1,87 +0,0 @@ -//#define DebugErrorLoading -//#define DebugWarningLoading - -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using PlugViewer.Warnings; -using PlugViewer.Errors; -using PlugViewer.TreeViewNodes; - -namespace PlugViewer -{ - public static class TestRunner - { - public static List FoundErrors = new List(); - public static List FoundWarnings = new List(); - - private interface ITest - { - void Test(); - } - private class CTest : ITest - { - public void Test() { } - } - - private static void Test() - { - ITest i = new CTest(); - i.Test(); - } - - static TestRunner() - { - Assembly a = Assembly.GetAssembly(typeof(TestRunner)); - Type[] tps = a.GetTypes(); - foreach (Type t in tps) - { - if (t.BaseType == typeof(BaseError)) - { -#if DebugErrorLoading - Log.WriteLine("Loaded Error: '" + t.Name + "'"); -#endif - FoundErrors.Add((BaseError)Activator.CreateInstance(t)); - } - else if (t.BaseType == typeof(BaseWarning)) - { -#if DebugWarningLoading - Log.WriteLine("Loaded Warning: '" + t.Name + "'"); -#endif - FoundWarnings.Add((BaseWarning)Activator.CreateInstance(t)); - } - } - tps = null; - System.GC.Collect(); - } - - public static void RunTests() - { - for (byte b = 0; b < 8; b++) - { - foreach (OTreeNode n in OTreeNode.TreeNodes[b]) - { - n.Errors = new List(); - n.Warnings = new List(); - } - } - - foreach (BaseError e in FoundErrors) - { - foreach (OTreeNode n in OTreeNode.TreeNodes[(byte)e.AppliesTo]) - { - e.EvaluateNode(n); - } - } - foreach (BaseWarning w in FoundWarnings) - { - foreach (OTreeNode n in OTreeNode.TreeNodes[(byte)w.AppliesTo]) - { - w.EvaluateNode(n); - } - } - } - - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/AssemblyTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/AssemblyTreeNode.cs deleted file mode 100644 index ca508d98b4..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/AssemblyTreeNode.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Reflection; - -namespace PlugViewer.TreeViewNodes -{ - internal class AssemblyTreeNode : OTreeNode - { - public AssemblyTreeNode(Assembly definition) : base(TreeNodeType.Assembly) - { - this.def = definition; - this.SelectedImageIndex = Constants.AssemblyIcon; - this.ImageIndex = Constants.AssemblyIcon; - this.Text = definition.GetName().Name; -#if DebugTreeNodeLoading - Log.WriteLine("Assembly '" + this.Text + "' Was loaded successfully."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Assembly; } - } - - private Assembly def; - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - rtb.Text = - "Assembly '" + def.GetName().Name + "' contains:\r\n" + - def.GetModules().Length.ToString() + " Modules.\r\n"; - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/ClassTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/ClassTreeNode.cs deleted file mode 100644 index 3e018ce304..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/ClassTreeNode.cs +++ /dev/null @@ -1,269 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - internal enum ClassType - { - Class, - Enum, - Interface, - Struct, - ImplementedInterface, - Exception, - Operator, - } - - internal enum Access - { - Public, - Private, - Protected, - Internal, - } - - internal class ClassTreeNode : OTreeNode - { - public ClassTreeNode(Type definition, ClassType type, Access access) : base(TreeNodeType.Class) - { - this.def = definition; - this.acc = access; - this.tp = type; - this.Text = definition.Name; - switch (type) - { - case ClassType.Class: - { - switch (access) - { - case Access.Public: - this.SelectedImageIndex = Constants.Class_Public; - this.ImageIndex = Constants.Class_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.Class_Private; - this.ImageIndex = Constants.Class_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.Class_Protected; - this.ImageIndex = Constants.Class_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.Class_Internal; - this.ImageIndex = Constants.Class_Internal; - break; - } - break; - } - case ClassType.Struct: - { - switch (access) - { - case Access.Public: - this.SelectedImageIndex = Constants.Struct_Public; - this.ImageIndex = Constants.Struct_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.Struct_Private; - this.ImageIndex = Constants.Struct_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.Struct_Protected; - this.ImageIndex = Constants.Struct_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.Struct_Internal; - this.ImageIndex = Constants.Struct_Internal; - break; - } - break; - } - case ClassType.Enum: - { - switch (access) - { - case Access.Public: - this.SelectedImageIndex = Constants.Enum_Public; - this.ImageIndex = Constants.Enum_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.Enum_Private; - this.ImageIndex = Constants.Enum_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.Enum_Protected; - this.ImageIndex = Constants.Enum_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.Enum_Internal; - this.ImageIndex = Constants.Enum_Internal; - break; - } - break; - } - case ClassType.Interface: - { - - switch (access) - { - case Access.Public: - this.SelectedImageIndex = Constants.Interface_Public; - this.ImageIndex = Constants.Interface_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.Interface_Private; - this.ImageIndex = Constants.Interface_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.Interface_Protected; - this.ImageIndex = Constants.Interface_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.Interface_Internal; - this.ImageIndex = Constants.Interface_Internal; - break; - } - break; - } - case ClassType.ImplementedInterface: - { - - switch (access) - { - case Access.Public: - this.SelectedImageIndex = Constants.InterfaceImpl_Public; - this.ImageIndex = Constants.InterfaceImpl_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.InterfaceImpl_Private; - this.ImageIndex = Constants.InterfaceImpl_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.InterfaceImpl_Protected; - this.ImageIndex = Constants.InterfaceImpl_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.InterfaceImpl_Internal; - this.ImageIndex = Constants.InterfaceImpl_Internal; - break; - } - break; - } - - } -#if DebugTreeNodeLoading - Log.WriteLine("Type '" + this.Text + "' was loaded."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Class; } - } - - private Type def; - private ClassType tp; - private Access acc; - - public ClassType TypeOfClass - { - get { return tp; } - } - - public Access AccessModifier - { - get { return acc; } - } - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - switch (tp) - { - case ClassType.Class: - { - sb.AppendLine("Type '" + def.Name + "' contains:"); - sb.AppendLine(def.GetNestedTypes().Length.ToString() + " Nested Types,"); - sb.AppendLine(def.GetProperties().Length.ToString() + " Properties,"); - sb.AppendLine(def.GetMethods().Length.ToString() + " Methods,"); - sb.AppendLine(def.GetFields().Length.ToString() + " Fields,"); - sb.AppendLine(def.GetEvents().Length.ToString() + " Events,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Attributes,"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine("Implements " + def.GetInterfaces().Length.ToString() + " Interfaces,"); - sb.AppendLine("and has an access modifier of '" + acc.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case ClassType.Enum: - { - sb.AppendLine("Enum '" + def.Name + "' contains:"); - sb.AppendLine((def.GetFields().Length - 1).ToString() + " Values,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Attributes,"); - sb.AppendLine("and has an access modifier of '" + acc.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case ClassType.Interface: - { - sb.AppendLine("Interface '" + def.Name + "' contains:"); - sb.AppendLine(def.GetNestedTypes().Length.ToString() + " Nested Types,"); - sb.AppendLine(def.GetProperties().Length.ToString() + " Properties,"); - sb.AppendLine(def.GetMethods().Length.ToString() + " Methods,"); - sb.AppendLine(def.GetFields().Length.ToString() + " Fields,"); - sb.AppendLine(def.GetEvents().Length.ToString() + " Events,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Attributes,"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine("Implements " + def.GetInterfaces().Length.ToString() + " Interfaces,"); - sb.AppendLine("and has an access modifier of '" + acc.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case ClassType.ImplementedInterface: - { - sb.AppendLine("Implemented Interface '" + def.Name + "' contains:"); - sb.AppendLine(def.GetNestedTypes().Length.ToString() + " Nested Types,"); - sb.AppendLine(def.GetProperties().Length.ToString() + " Properties,"); - sb.AppendLine(def.GetMethods().Length.ToString() + " Methods,"); - sb.AppendLine(def.GetFields().Length.ToString() + " Fields,"); - sb.AppendLine(def.GetEvents().Length.ToString() + " Events,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Attributes,"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine("and has an access modifier of '" + acc.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case ClassType.Struct: - { - sb.AppendLine("Struct '" + def.Name + "' contains:"); - sb.AppendLine(def.GetNestedTypes().Length.ToString() + " Nested Types,"); - sb.AppendLine(def.GetProperties().Length.ToString() + " Properties,"); - sb.AppendLine(def.GetMethods().Length.ToString() + " Methods,"); - sb.AppendLine(def.GetFields().Length.ToString() + " Fields,"); - sb.AppendLine(def.GetEvents().Length.ToString() + " Events,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Attributes,"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine("Implements " + def.GetInterfaces().Length.ToString() + " Interfaces,"); - sb.AppendLine("and has an access modifier of '" + acc.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - } - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/EventTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/EventTreeNode.cs deleted file mode 100644 index afb37982d0..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/EventTreeNode.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using System.Reflection; - -namespace PlugViewer.TreeViewNodes -{ - internal class EventTreeNode : OTreeNode - { - public EventTreeNode(EventInfo definition) : base(TreeNodeType.Event) - { - this.def = definition; - this.SelectedImageIndex = Constants.EventIcon; - this.ImageIndex = Constants.EventIcon; - this.Text = definition.Name; -#if DebugTreeNodeLoading - Log.WriteLine("Event '" + this.Text + "' was loaded."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Event; } - } - - private EventInfo def; - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("Event '" + def.Name + "'"); - sb.AppendLine(); - sb.AppendLine(); - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/FieldTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/FieldTreeNode.cs deleted file mode 100644 index 78dcd2591b..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/FieldTreeNode.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - internal class FieldTreeNode : OTreeNode - { - public FieldTreeNode(FieldInfo definition, Access mAccess, bool Constant) : base(TreeNodeType.Field) - { - this.def = definition; - acc = mAccess; - sconst = Constant; - this.Text = definition.Name; - if (!Constant) - { - switch (acc) - { - case Access.Public: - this.SelectedImageIndex = Constants.Field_Public; - this.ImageIndex = Constants.Field_Public; - break; - - case Access.Private: - this.SelectedImageIndex = Constants.Field_Private; - this.ImageIndex = Constants.Field_Private; - break; - - case Access.Protected: - this.SelectedImageIndex = Constants.Field_Protected; - this.ImageIndex = Constants.Field_Protected; - break; - - case Access.Internal: - this.SelectedImageIndex = Constants.Field_Internal; - this.ImageIndex = Constants.Field_Internal; - break; - } -#if DebugTreeNodeLoading - Log.WriteLine("Field '" + this.Text + "' was loaded."); -#endif - } - else - { - this.SelectedImageIndex = Constants.ConstantIcon; - this.ImageIndex = Constants.ConstantIcon; -#if DebugTreeNodeLoading - Log.WriteLine("Constant '" + this.Text + "' was loaded."); -#endif - } - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Module; } - } - - private FieldInfo def; - private Access acc; - private bool sconst; - - public bool IsConstant - { - get { return sconst; } - } - - public Access AccessModifier - { - get { return acc; } - } - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - if (!sconst) - { - sb.AppendLine("Field '" + def.Name + "'"); - sb.AppendLine("Has an access modifier of '" + acc.ToString() + "'"); - } - else - { - sb.AppendLine("Constant '" + def.Name + "'"); - } - sb.AppendLine(); - sb.AppendLine(); - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/MethodTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/MethodTreeNode.cs deleted file mode 100644 index f21ee49b5c..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/MethodTreeNode.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - public enum MethodType - { - BasicMethod, - VirtualMethod, - OverrideMethod, - } - - internal class MethodTreeNode : OTreeNode - { - public MethodTreeNode(MethodInfo definition, MethodType mType, Access mAccess) : base(TreeNodeType.Method) - { - this.def = definition; - this.Text = NameBuilder.BuildMethodDisplayName(definition); - this.mType = mType; - this.acc = mAccess; - switch (mType) - { - case MethodType.BasicMethod: - { - switch (mAccess) - { - case Access.Public: - this.SelectedImageIndex = Constants.Method_Public; - this.ImageIndex = Constants.Method_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.Method_Private; - this.ImageIndex = Constants.Method_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.Method_Protected; - this.ImageIndex = Constants.Method_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.Method_Internal; - this.ImageIndex = Constants.Method_Internal; - break; - } - } - break; - case MethodType.OverrideMethod: - { - - switch (mAccess) - { - case Access.Public: - this.SelectedImageIndex = Constants.MethodOverride_Public; - this.ImageIndex = Constants.MethodOverride_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.MethodOverride_Private; - this.ImageIndex = Constants.MethodOverride_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.MethodOverride_Protected; - this.ImageIndex = Constants.MethodOverride_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.MethodOverride_Internal; - this.ImageIndex = Constants.MethodOverride_Internal; - break; - } - } - break; - case MethodType.VirtualMethod: - { - - switch (mAccess) - { - case Access.Public: - this.SelectedImageIndex = Constants.MethodVirtual_Public; - this.ImageIndex = Constants.MethodVirtual_Public; - break; - case Access.Private: - this.SelectedImageIndex = Constants.MethodVirtual_Private; - this.ImageIndex = Constants.MethodVirtual_Private; - break; - case Access.Protected: - this.SelectedImageIndex = Constants.MethodVirtual_Protected; - this.ImageIndex = Constants.MethodVirtual_Protected; - break; - case Access.Internal: - this.SelectedImageIndex = Constants.MethodVirtual_Internal; - this.ImageIndex = Constants.MethodVirtual_Internal; - break; - } - } - break; - } -#if DebugTreeNodeLoading - Log.WriteLine("Method '" + this.Text + "' was loaded."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Method; } - } - - private MethodInfo def; - private MethodType mType; - private Access acc; - - public Access AccessModifier - { - get { return acc; } - } - - public MethodType TypeOfMethod - { - get { return mType; } - } - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - switch (mType) - { - case MethodType.BasicMethod: - { - sb.AppendLine("Basic Method '" + this.Text + "' contains:"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine(def.GetParameters().Length.ToString() + " Parameters,"); - //sb.AppendLine(def.SecurityDeclarations.Count.ToString() + " Security Declarations,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Custom Attributes,"); - if (def.GetMethodBody() != null) - { - sb.AppendLine(def.GetMethodBody().GetILAsByteArray().Length.ToString() + " Instructions,"); - sb.AppendLine(def.GetMethodBody().ExceptionHandlingClauses.Count.ToString() + " Exception Handlers,"); - sb.AppendLine(def.GetMethodBody().LocalVariables.Count.ToString() + " Variables,"); - } - else - { - sb.AppendLine("Doesn't have a body."); - } - sb.AppendLine("Has a calling convention of '" + def.CallingConvention.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case MethodType.OverrideMethod: - { - sb.AppendLine("Override Method '" + this.Text + "' contains:"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine(def.GetParameters().Length.ToString() + " Parameters,"); - //sb.AppendLine(def.SecurityDeclarations.Count.ToString() + " Security Declarations,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Custom Attributes,"); - if (def.GetMethodBody() != null) - { - sb.AppendLine(def.GetMethodBody().GetILAsByteArray().Length.ToString() + " Instructions,"); - sb.AppendLine(def.GetMethodBody().ExceptionHandlingClauses.Count.ToString() + " Exception Handlers,"); - sb.AppendLine(def.GetMethodBody().LocalVariables.Count.ToString() + " Variables,"); - } - else - { - sb.AppendLine("Doesn't have a body."); - } - //sb.AppendLine("Overrides " + def..Resolve().Overrides.Count.ToString() + " methods,"); - sb.AppendLine("Has a calling convention of '" + def.CallingConvention.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - case MethodType.VirtualMethod: - { - sb.AppendLine("Virtual Method '" + this.Text + "' contains:"); - sb.AppendLine(def.GetGenericArguments().Length.ToString() + " Generic Parameters,"); - sb.AppendLine(def.GetParameters().Length.ToString() + " Parameters,"); - //sb.AppendLine(def.SecurityDeclarations.Count.ToString() + " Security Declarations,"); - sb.AppendLine(def.GetCustomAttributes(true).Length.ToString() + " Custom Attributes,"); - if (def.GetMethodBody() != null) - { - sb.AppendLine(def.GetMethodBody().GetILAsByteArray().Length.ToString() + " Instructions,"); - sb.AppendLine(def.GetMethodBody().ExceptionHandlingClauses.Count.ToString() + " Exception Handlers,"); - sb.AppendLine(def.GetMethodBody().LocalVariables.Count.ToString() + " Variables,"); - } - else - { - sb.AppendLine("Doesn't have a body."); - } - sb.AppendLine("Has a calling convention of '" + def.CallingConvention.ToString() + "'"); - sb.AppendLine(); - sb.AppendLine(); - } - break; - } - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/ModuleTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/ModuleTreeNode.cs deleted file mode 100644 index b570d2b09f..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/ModuleTreeNode.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - internal class ModuleTreeNode : OTreeNode - { - public Dictionary Namespaces = new Dictionary(); - - public ModuleTreeNode(Module definition) : base(TreeNodeType.Module) - { - this.def = definition; - this.SelectedImageIndex = Constants.ModuleIcon; - this.ImageIndex = Constants.ModuleIcon; - this.Text = definition.Name; -#if DebugTreeNodeLoading - Log.WriteLine("Module '" + this.Text + "' was loaded."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Module; } - } - - private Module def; - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("Module '" + def.Name + "' contains:"); - sb.AppendLine(def.GetTypes().Length.ToString() + " Types,"); - sb.AppendLine(Namespaces.Count.ToString() + " Namespaces,"); - //sb.AppendLine(def.Resources.Count.ToString() + " Resources,"); - //sb.AppendLine("and " + (def.EntryPoint != null ? "does " : "doesn't ") + "contain an entry point."); - sb.AppendLine(); - sb.AppendLine(); - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/NamespaceTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/NamespaceTreeNode.cs deleted file mode 100644 index 4170027d7c..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/NamespaceTreeNode.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - internal class NamespaceTreeNode : OTreeNode - { - public NamespaceTreeNode(string name) : base(TreeNodeType.Namespace) - { - this.SelectedImageIndex = Constants.NamespaceIcon; - this.ImageIndex = Constants.NamespaceIcon; - this.Text = name; -#if DebugTreeNodeLoading - Log.WriteLine("Namespace '" + this.Text + "' was discovered."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Namespace; } - } - - public override object Definition - { - get { return null; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("Namespace '" + this.Text + "'"); - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/OTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/OTreeNode.cs deleted file mode 100644 index 9ca0824091..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/OTreeNode.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - public abstract class OTreeNode : TreeNode - { - public static List[] TreeNodes; - static OTreeNode() - { - TreeNodes = new List[8]; - for (byte b = 0; b < 8; b++) - { - TreeNodes[b] = new List(); - } - } - public OTreeNode(TreeNodeType t) - { - TreeNodes[(byte)t].Add(this); - } - public List Errors = new List(); - public List Warnings = new List(); - public abstract TreeNodeType Type { get; } - public abstract object Definition { get; } - public abstract void ShowNodeInfo(RichTextBox itemPanel); - } - - public enum TreeNodeType : byte - { - Assembly = 0, - Module = 1, - Namespace = 2, - Class = 3, - Method = 4, - Event = 5, - Property = 6, - Field = 7, - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewNodes/PropertyTreeNode.cs b/Users/Orvid/PlugViewer/TreeViewNodes/PropertyTreeNode.cs deleted file mode 100644 index e779adcd31..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewNodes/PropertyTreeNode.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Windows.Forms; - -namespace PlugViewer.TreeViewNodes -{ - internal class PropertyTreeNode : OTreeNode - { - public PropertyTreeNode(PropertyInfo definition, bool writable) : base(TreeNodeType.Property) - { - this.wrtble = writable; - this.def = definition; - if (this.wrtble) - { - this.SelectedImageIndex = Constants.PropertyIcon; - this.ImageIndex = Constants.PropertyIcon; - } - else - { - this.SelectedImageIndex = Constants.ReadOnlyPropertyIcon; - this.ImageIndex = Constants.ReadOnlyPropertyIcon; - } - this.Text = definition.Name; -#if DebugTreeNodeLoading - Log.WriteLine("Property '" + this.Text + "' was loaded."); -#endif - } - - public override TreeNodeType Type - { - get { return TreeNodeType.Event; } - } - - private PropertyInfo def; - private bool wrtble; - - public bool ReadOnly - { - get { return !wrtble; } - } - - public override object Definition - { - get { return (object)def; } - } - - public override void ShowNodeInfo(RichTextBox rtb) - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("Property '" + def.Name + "' is " + (wrtble ? "Writable" : "Read-Only")); - sb.AppendLine(); - sb.AppendLine(); - - rtb.Text = sb.ToString(); - } - } -} diff --git a/Users/Orvid/PlugViewer/TreeViewSorter.cs b/Users/Orvid/PlugViewer/TreeViewSorter.cs deleted file mode 100644 index a900cdff55..0000000000 --- a/Users/Orvid/PlugViewer/TreeViewSorter.cs +++ /dev/null @@ -1,127 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; -using PlugViewer.TreeViewNodes; - -namespace PlugViewer -{ - class TreeViewSorter : IComparer, System.Collections.IComparer - { - private StringComparer sc = StringComparer.CurrentCulture; - - public int Compare(TreeNode x, TreeNode y) - { - OTreeNode ox = (OTreeNode)x; - OTreeNode oy = (OTreeNode)y; - if (ox.Type == TreeNodeType.Assembly && oy.Type == TreeNodeType.Assembly) - { - return 0; - } - else if (ox.Type == TreeNodeType.Namespace && oy.Type == TreeNodeType.Namespace) - { - return sc.Compare(ox.Text, oy.Text); - } - else if (ox.Type == TreeNodeType.Module && oy.Type == TreeNodeType.Module) - { - return sc.Compare(ox.Text, oy.Text); - } - else - { - int xVal, yVal; - - #region Setup x - if (ox.Type == TreeNodeType.Field) - { - xVal = 10; - } - else if (ox.Type == TreeNodeType.Event) - { - xVal = 20; - } - else if (ox.Type == TreeNodeType.Property) - { - xVal = 30; - } - else if (ox.Type == TreeNodeType.Method) - { - xVal = 40; - } - else if (ox.Type == TreeNodeType.Class) - { - xVal = 50; - } - else if (ox.Type == TreeNodeType.Namespace) - { - xVal = 60; - } - else if (ox.Type == TreeNodeType.Module) - { - xVal = 70; - } - else if (ox.Type == TreeNodeType.Assembly) - { - xVal = 80; - } - else - { - xVal = 90; - } - #endregion - - #region Setup y - if (oy.Type == TreeNodeType.Field) - { - yVal = 10; - } - else if (oy.Type == TreeNodeType.Event) - { - yVal = 20; - } - else if (oy.Type == TreeNodeType.Property) - { - yVal = 30; - } - else if (oy.Type == TreeNodeType.Method) - { - yVal = 40; - } - else if (oy.Type == TreeNodeType.Class) - { - yVal = 50; - } - else if (oy.Type == TreeNodeType.Namespace) - { - yVal = 60; - } - else if (oy.Type == TreeNodeType.Module) - { - yVal = 70; - } - else if (oy.Type == TreeNodeType.Assembly) - { - yVal = 80; - } - else - { - yVal = 90; - } - #endregion - - if (xVal == yVal) - { - return sc.Compare(ox.Text, oy.Text); - } - else - { - return (xVal > yVal ? -1 : 1); - } - } - } - - int System.Collections.IComparer.Compare(object x, object y) - { - return this.Compare((TreeNode)x, (TreeNode)y); - } - } -} diff --git a/Users/Orvid/PlugViewer/Warnings/BaseWarning.cs b/Users/Orvid/PlugViewer/Warnings/BaseWarning.cs deleted file mode 100644 index 429c7b1978..0000000000 --- a/Users/Orvid/PlugViewer/Warnings/BaseWarning.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; - -namespace PlugViewer.Warnings -{ - /// - /// The base class for all Warnings. - /// - public abstract class BaseWarning - { - /// - /// The type of node this warning can apply to. - /// - public abstract TreeNodeType AppliesTo { get; } - /// - /// Evaluate the given node. - /// - /// The node to evaluate. - public abstract void EvaluateNode(OTreeNode node); - /// - /// Gets the name of the warning. - /// - public abstract string Name { get; } - /// - /// Gets the description of the warning, - /// and how it applies in the current situation. - /// - public abstract string Description { get; } - } -} diff --git a/Users/Orvid/PlugViewer/Warnings/InterfaceUsageWarning.cs b/Users/Orvid/PlugViewer/Warnings/InterfaceUsageWarning.cs deleted file mode 100644 index d9e98c2bef..0000000000 --- a/Users/Orvid/PlugViewer/Warnings/InterfaceUsageWarning.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using PlugViewer.TreeViewNodes; -using System.Reflection; - -namespace PlugViewer.Warnings -{ - internal class InterfaceUsageWarning : BaseWarning - { - public override TreeNodeType AppliesTo - { - get { return TreeNodeType.Method; } - } - - public override void EvaluateNode(OTreeNode node) - { - MethodInfo m = (MethodInfo)node.Definition; - if (m.GetMethodBody() != null) - { - foreach (LocalVariableInfo i in m.GetMethodBody().LocalVariables) - { - if (!i.LocalType.IsGenericParameter && !i.LocalType.IsGenericType) - { - if (i.LocalType.IsArray) - { - if (i.LocalType.GetElementType().IsGenericParameter || i.LocalType.GetElementType().IsGenericType) - { - continue; - } - } - if (i.LocalType.IsInterface) - { -#if DebugWarnings - Log.WriteLine("Warning: " + NameBuilder.BuildMethodName(m) + " Uses an interface"); -#endif - if (node.SelectedImageIndex != Constants.ErrorIcon) - { - node.SelectedImageIndex = Constants.WarningIcon; - node.ImageIndex = Constants.WarningIcon; - } - node.Warnings.Add(this); - return; - } - } - } - } - } - - public override string Name - { - get { return "Interface Usage Warning"; } - } - - public override string Description - { - get { return "This method utalizes Interfaces. Interfaces are not currently supported by IL2CPU."; } - } - } -} diff --git a/Users/Orvid/StructTest/Kernel.cs b/Users/Orvid/StructTest/Kernel.cs deleted file mode 100644 index 8baf215e80..0000000000 --- a/Users/Orvid/StructTest/Kernel.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace CrashTest -{ - public class scrn - { - public void DrwCrcle(Vec2 v, int i, uint c) - { - Sys.Global.Console.WriteLine("value of v: " + v.X + ", " + v.Y); - } - } - - public class Kernel : Sys.Kernel - { - public static scrn s = new scrn(); - - public Kernel() - { - base.ClearScreen = false; - } - - protected override void BeforeRun() - { - s.DrwCrcle(new Vec2(150, 100), 20, 30); - } - - protected override void Run() - { - } - } - - #region Vec2 - public struct Vec2 - { - public int X; - public int Y; - public Vec2(int x, int y) - { - this.X = x; - this.Y = y; - } - } - #endregion -} diff --git a/Users/Orvid/StructTest/Logger.cs b/Users/Orvid/StructTest/Logger.cs deleted file mode 100644 index 5e7ef3bf7f..0000000000 --- a/Users/Orvid/StructTest/Logger.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware; -using Cosmos.Core; - -namespace StructTest -{ - /// - /// Enables logging to a Com Port. - /// - public class Logger - { - private readonly Cosmos.Core.IOGroup.COM iop; - - /// - /// The default constructor. - /// - /// This should be either 1, 2, 3, or 4. - public Logger(byte comPort) - { - iop = new Cosmos.Core.IOGroup.COM(comPort); - Initialize(); - } - - private void Initialize() - { - iop.InterruptEnable.Byte = 0x00; - iop.LineControl.Byte = 0x80; - iop.Data.Byte = 0x03; - iop.InterruptEnable.Byte = 0x00; - iop.LineControl.Byte = 0x03; - iop.FIFOControl.Byte = 0xC7; - iop.ModemControl.Byte = 0x0B; - } - - public void WriteLine(string s) - { - WriteString(s + "\r\n"); - } - - private int IsTransmitEmpty() - { - return iop.LineStatus.Byte & 0x20; - } - - /// - /// Writes the specified byte to the Log. - /// - /// The byte to write. - public void WriteData(byte b) - { - // Empty loop, will allow us to timeout - for (uint i = 0; i < 1000 && (IsTransmitEmpty() == 0); i++) ; - iop.Data.Byte = b; - } - - /// - /// Writes the specified string to the Log. - /// - /// The string to write. - public void WriteString(string s) - { - for (int i = 0; i < s.Length; i++) - { - WriteData((byte)s[i]); - } - } - - } -} diff --git a/Users/Orvid/StructTest/MultiBoot.cs b/Users/Orvid/StructTest/MultiBoot.cs deleted file mode 100644 index 9080759a91..0000000000 --- a/Users/Orvid/StructTest/MultiBoot.cs +++ /dev/null @@ -1,167 +0,0 @@ -using Cosmos.Core; -using System; -using System.Runtime.InteropServices; - -namespace Cosmos.Core -{ - // Must be static, memory management requires this - // Note we cannot allocate anything here, must wrap it very simply - public static class MultiBoot - { - [StructLayout(LayoutKind.Explicit, Size = 88)] - public struct Header - { - public const uint FLAGS_MEM = 0x00000001; - public const uint FLAGS_BOOT = 0x00000002; - public const uint FLAGS_CMDLINE = 0x00000004; - public const uint FLAGS_MODULES = 0x00000008; - public const uint FLAGS_AOUT = 0x00000010; - public const uint FLAGS_ELF = 0x00000020; - public const uint FLAGS_MMAP = 0x00000040; - public const uint FLAGS_DRIVES = 0x00000080; - public const uint FLAGS_CONFIG = 0x00000100; - public const uint FLAGS_LOADER = 0x00000200; - public const uint FLAGS_APM = 0x00000400; - public const uint FLAGS_VBE = 0x00000800; - - [FieldOffset(0)] - public uint flags; - [FieldOffset(4)] - public uint mem_lower; // Valid if (flags & 0x00000001) - [FieldOffset(8)] - public uint mem_upper; // Valid if (flags & 0x00000001) - [FieldOffset(12)] - public uint boot_device; // Valid if (flags & 0x00000002) - [FieldOffset(16)] - public uint cmdline; // Valid if (flags & 0x00000004) - [FieldOffset(20)] - public uint mods_count; // Valid if (flags & 0x00000008) - [FieldOffset(24)] - public uint mods_addr; // Valid if (flags & 0x00000008) - [FieldOffset(28)] - public AOUT aout; // Valid if (flags & 0x00000010) - [FieldOffset(28)] - public ELF elf; // Valid if (flags & 0x00000020) - [FieldOffset(44)] - public uint mmap_length; // Valid if (flags & 0x00000040) - [FieldOffset(48)] - public uint mmap_address; // Valid if (flags & 0x00000040) - [FieldOffset(52)] - public uint drives_length; // Valid if (flags & 0x00000080) - [FieldOffset(56)] - public uint drives_address; // Valid if (flags & 0x00000080) - [FieldOffset(60)] - public uint config_table; // Valid if (flags & 0x00000100) - [FieldOffset(64)] - public uint boot_loader_name; // Valid if (flags & 0x00000200) - [FieldOffset(68)] - public uint apm_table; // Valid if (flags & 0x00000400) - [FieldOffset(72)] - public uint vbe_control_info; // Valid if (flags & 0x00000800) - [FieldOffset(76)] - public uint vbe_mode_info; // Valid if (flags & 0x00000800) - [FieldOffset(80)] - public ushort vbe_mode; // Valid if (flags & 0x00000800) - [FieldOffset(82)] - public ushort vbe_interface_seg; // Valid if (flags & 0x00000800) - [FieldOffset(84)] - public ushort vbe_interface_off; // Valid if (flags & 0x00000800) - [FieldOffset(86)] - public ushort vbe_interface_len; // Valid if (flags & 0x00000800) - } - [StructLayout(LayoutKind.Explicit, Size = 16)] - public struct Module - { - [FieldOffset(0)] - public uint mod_start; - [FieldOffset(4)] - public uint mod_end; - [FieldOffset(8)] - public uint cmdline; - [FieldOffset(12)] - public uint reserved; - } - [StructLayout(LayoutKind.Explicit, Size = 16)] - public struct AOUT - { - [FieldOffset(0)] - public uint tabsize; - [FieldOffset(4)] - public uint strsize; - [FieldOffset(8)] - public uint address; - [FieldOffset(12)] - public uint reserved; - } - [StructLayout(LayoutKind.Explicit, Size = 16)] - public struct ELF - { - [FieldOffset(0)] - public uint num; - [FieldOffset(4)] - public uint size; - [FieldOffset(8)] - public uint address; - [FieldOffset(12)] - public uint shndx; - } - [StructLayout(LayoutKind.Explicit, Size = 24)] - public struct Memory - { - public const uint TYPE_RESERVED = 0; - public const uint TYPE_AVAILABLE = 1; - public const uint TYPE_ACPI_RECLAIMABLE = 2; - public const uint TYPE_ACPI_HIBERNATION = 3; - - [FieldOffset(0)] - public uint size; - [FieldOffset(4)] - public ulong address; - [FieldOffset(12)] - public ulong length; - [FieldOffset(20)] - public uint type; - } - [StructLayout(LayoutKind.Explicit)] - public struct Drive - { - public const byte MODE_CHS = 0; - public const byte MODE_LBA = 1; - - [FieldOffset(0)] - public uint size; - [FieldOffset(4)] - public byte number; - [FieldOffset(5)] - public byte mode; - [FieldOffset(6)] - public ushort cylinders; - [FieldOffset(8)] - public byte heads; - [FieldOffset(9)] - public byte sectors; - } - [StructLayout(LayoutKind.Explicit, Size = 20)] - public struct APM - { - [FieldOffset(0)] - public ushort version; - [FieldOffset(2)] - public ushort cseg; - [FieldOffset(4)] - public uint offset; - [FieldOffset(8)] - public ushort cseg_16; - [FieldOffset(10)] - public ushort dseg; - [FieldOffset(12)] - public ushort flags; - [FieldOffset(14)] - public ushort cseg_len; - [FieldOffset(16)] - public ushort cseg_16_len; - [FieldOffset(18)] - public ushort dseg_len; - } - } -} diff --git a/Users/Orvid/StructTest/Program.cs b/Users/Orvid/StructTest/Program.cs deleted file mode 100644 index 8347187383..0000000000 --- a/Users/Orvid/StructTest/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace StructTest -{ - public static class Program - { - public static void Main() - { - Kernel k = new Kernel(); - k.DoRun(); - } - - } -} diff --git a/Users/Orvid/StructTest/RAM.cs b/Users/Orvid/StructTest/RAM.cs deleted file mode 100644 index 3186ba5dc0..0000000000 --- a/Users/Orvid/StructTest/RAM.cs +++ /dev/null @@ -1,286 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Core -{ - public unsafe static class RAM - { - private static StructTest.Logger log = new StructTest.Logger(2); - private const uint CONVENTIONAL_MEMORY_SIZE = 640 * 1024; - private const ulong DEFAULT_SMALLEST_PAGE_SIZE = 4096; - - private static byte[] TreeData = null; // replace with below direct pointer when allocated manually - - private static ulong SmallestPageSize = DEFAULT_SMALLEST_PAGE_SIZE; - private static int OrderToSmallestPage = 0; - private static byte* Tree = null; - private static ulong TreeSize = 0; - private static byte* Pages = null; - private static ulong PagesSize = 0; - - public static void Initialize() - { - MultiBoot.Header* header = (MultiBoot.Header*)CPU.GetMultiBootInfo(); - MultiBoot.Memory* memory = (MultiBoot.Memory*)header->mmap_address; - uint memoryEntrySize = 0; - uint memoryEntryCount = 0; - if (header->mmap_length > 0) - { - memoryEntrySize = memory->size + 4; - memoryEntryCount = header->mmap_length / memoryEntrySize; - } - // if (memoryEntrySize == 0 || memoryEntryCount == 0) throw some kind of kernel error, no memory map - log.WriteLine("RAM > MMAP Entry: Size=" + memoryEntrySize + ", Count=" + memoryEntryCount); - ulong endOfKernel = CPU.GetEndOfKernel(); - - ulong kernelSize = 0; - ulong availableAddress = 0; - ulong availableSize = 0; - MultiBoot.Memory* memoryIterator = memory; - for (uint memoryEntry = 0; memoryEntry < memoryEntryCount; memoryEntry++, memoryIterator++) - { - // Don't need these checks, if we're only grabbing the region the kernel is allocated in for now - // if (memoryIterator->address + memoryIterator->length <= CONVENTIONAL_MEMORY_SIZE) continue; - // if (memoryIterator->type != MultiBoot.Memory.TYPE_AVAILABLE) continue; - if (endOfKernel >= memoryIterator->address) - { - if (endOfKernel <= (memoryIterator->address + memoryIterator->length)) - { - availableAddress = memoryIterator->address; - availableSize = memoryIterator->length; - kernelSize = endOfKernel - memoryIterator->address; - availableAddress += kernelSize; - availableSize -= kernelSize; - break; - } - } - } - // if (availableSize == 0) throw some kind of kernel error, should not happen... kernel not found in available memory? - // if (availableSize < PageSize + 1) throw some kind of kernel error, there isn't at least 1 smallest size page (plus tree byte) available after kernel - log.WriteLine("RAM > MMAP Available: Address=" + ToHex(availableAddress, 64) + ", Length=" + ToHex(availableSize, 64) + ", Kernel=" + ToHex(kernelSize, 64)); - ulong shiftMask = SmallestPageSize; - log.WriteLine("ShiftMask BeforeLoop: " + shiftMask.ToString()); - byte shiftMaskBit = 0; - while ((shiftMask & ((ulong)1 << shiftMaskBit)) == 0) - { - log.WriteLine("ShiftMask: " + shiftMask.ToString()); - shiftMask |= ((ulong)1 << shiftMaskBit); - shiftMaskBit++; - } - ulong availableShift = availableSize & (~shiftMask); - log.WriteLine("AvailableShift: " + availableShift.ToString()); - PagesSize = SmallestPageSize; - while (availableShift != 0) - { - availableShift >>= 1; - availableShift &= ~shiftMask; - TreeSize <<= 1; - TreeSize |= 0x01; - PagesSize <<= 1; - OrderToSmallestPage += 1; - } - log.WriteLine("out:" + TreeSize.ToString() + ":" + PagesSize.ToString()); - while ((TreeSize + PagesSize) > availableSize) - { - TreeSize >>= 1; - PagesSize >>= 1; - --OrderToSmallestPage; - } - log.WriteLine("RAM > Binary Heap: Order=" + ToHex((byte)OrderToSmallestPage, 8) + ", Size=" + ToHex(TreeSize, 64) + ", Paged=" + ToHex(PagesSize, 64)); - TreeData = new byte[TreeSize]; // Replaced by putting directly in memory before paged memory, init to 0's to initialize correctly - fixed (byte* treePtr = TreeData) Tree = treePtr; - Pages = Tree + TreeSize; - // After this point, the allocation tree is ready for use, slightly CPU inefficient initialization is okay, but alloc/dealloc must be fast - // Code after this needs to be replaced with optimized ASM plugs - - log.WriteLine("RAM> Starts: Tree=" + ToHex((ulong)Tree, 64) + ", Pages=" + ToHex((ulong)Pages, 64)); - - // Let's find a page to handle 4000 bytes, should be 1 page, of the smallest size (4096) - // For testing timing, make sure to remove all console outputs (averages around 100 per second unoptimized) - int rtcSec = Cosmos.Hardware.RTC.Second; - ulong offset = 0; - byte* allocatedPage = null; - log.WriteLine("RAM> Smallest Page Allocs Per Second: "); - while (rtcSec == Cosmos.Hardware.RTC.Second) ; - rtcSec = Cosmos.Hardware.RTC.Second; - log.WriteLine("RAM> Smallest Page Allocs Per Second: "); - int allocsPerSecond = 0; - while (rtcSec == Cosmos.Hardware.RTC.Second) - { - offset = 0; - allocatedPage = RequestPage(1, OrderToSmallestPage, Tree, ref offset); - offset = 0; - ReleasePage(allocatedPage, OrderToSmallestPage, Tree, ref offset); - allocsPerSecond++; - } - log.WriteLine("RAM> Smallest Page Allocs Per Second: " + allocsPerSecond); - - /* - ulong offset1 = 0; - byte* allocatedPage1 = RequestPage(4000, OrderToSmallestPage, Tree, ref offset1); - ulong allocatedPageAddress1 = (ulong)allocatedPage1; - Console.WriteLine("Allocated 4000 bytes @ " + ToHex(allocatedPageAddress1, 64)); - - ulong offset2 = 0; - byte* allocatedPage2 = RequestPage(6000, OrderToSmallestPage, Tree, ref offset2); - ulong allocatedPageAddress2 = (ulong)allocatedPage2; - Console.WriteLine("Allocated 6000 bytes @ " + ToHex(allocatedPageAddress2, 64)); - - ulong offset3 = 0; - byte* allocatedPage3 = RequestPage(4000, OrderToSmallestPage, Tree, ref offset3); - ulong allocatedPageAddress3 = (ulong)allocatedPage3; - Console.WriteLine("Allocated 4000 bytes @ " + ToHex(allocatedPageAddress3, 64)); - - offset2 = 0; - if (ReleasePage(allocatedPage2, OrderToSmallestPage, Tree, ref offset2)) Console.WriteLine("Released 6000 bytes"); - - offset1 = 0; - if (ReleasePage(allocatedPage1, OrderToSmallestPage, Tree, ref offset1)) Console.WriteLine("Released 4000 bytes"); - - offset3 = 0; - if (ReleasePage(allocatedPage3, OrderToSmallestPage, Tree, ref offset3)) Console.WriteLine("Released 4000 bytes"); - */ - } - - public static byte* RequestPage(ulong pSize, int pOrder, byte* pTreeNode, ref ulong pOffset) - { - if ((*pTreeNode & 0x01) != 0) return null; // If this node is allocated already, it is fully used, return null - if (pOrder > 0 && pSize <= (SmallestPageSize << (pOrder - 1))) // If this occurs, we are gaurenteed to NOT be on the last order, and can use a smaller order - { - *pTreeNode |= 0x02; // If not already split, it is now, we checked if whole page is allocated already, so we can split it here - byte* allocatedPage = RequestPage(pSize, pOrder - 1, pTreeNode + 1, ref pOffset); // Call recursively, to work with right child node - if (allocatedPage == null) // If nothing is available in the right, we'll check the left (this needs to be adjusted for single branching support later) - { - pOffset += (SmallestPageSize << (pOrder - 1)); // Add to offset, by half of current order size, to get half way through for split - allocatedPage = RequestPage(pSize, pOrder - 1, pTreeNode + ((ulong)2 << (pOrder - 1)), ref pOffset); // Call recursively, to work with left child node - if (allocatedPage == null) pOffset -= (SmallestPageSize << (pOrder - 1)); // If no page is found, we need to subtract from offset what we added earlier - } - return allocatedPage; // Whether we find a page or not, this side of the branch has been checked, so step backward - } - if ((*pTreeNode & 0x02) != 0) return null; // If we get here, we had right size, but it is already split for another allocation, step backward - //Console.WriteLine("RAM> RequestPage: Size=" + ToHex(pSize, 32) + ", Order: " + ToHex((byte)pOrder, 8) + ", Node=" + ToHex((ulong)pTreeNode, 64) + ", Page=" + ToHex((ulong)(Pages + pOffset), 64)); - *pTreeNode |= 0x01; // Getting here means we've fulfilled requirements and found a page somewhere, so we're going to mark it allocated now - return Pages + pOffset; // Return the physical address based on the offset we kept track of, this beats using a mini stack - } - public static bool ReleasePage(byte* pPage, int pOrder, byte* pTreeNode, ref ulong pOffset) - { - if (*pTreeNode == 0) return false; - if ((*pTreeNode & 0x01) != 0) // This node is allocated - { - if (pPage == Pages + pOffset) // If this is the page for the allocation, set the node unallocated and return true - { - //Console.WriteLine("RAM> ReleasePage: Size=" + ToHex((SmallestPageSize << pOrder), 32) + ", Order: " + ToHex((byte)pOrder, 8) + ", Node=" + ToHex((ulong)pTreeNode, 64)); - *pTreeNode ^= 0x01; - return true; - } - return false; // Node is allocated, but it's not this page, should not happen - } - if (pOrder == 0) return false; // should not happen - // If we get here, this node must be split, first check if it's down the right branch - byte* rightSiblingNode = pTreeNode + 1; - byte* leftSiblingNode = pTreeNode + ((ulong)2 << (pOrder - 1)); - if (pPage < (Pages + pOffset + (SmallestPageSize << (pOrder - 1)))) - { - if (ReleasePage(pPage, pOrder - 1, rightSiblingNode, ref pOffset)) - { - // This should always happen, we already confirmed the page is in the right branch somewhere - // Time to compact if our left branch sibling is also unused - if (*rightSiblingNode == 0 && *leftSiblingNode == 0) - { - //Console.WriteLine("RAM> CompactPage: Size=" + ToHex((SmallestPageSize << pOrder), 32) + ", Order: " + ToHex((byte)pOrder, 8)); - *pTreeNode ^= 0x02; // Compact by removing split, if the sibling is also unused - } - return true; - } - // We should not get here, this means the page could not be found, possibly bad page pointer? - // At this point we have verified that the page address is somewhere in the left side, but not at a proper page address - return false; - } - pOffset += (SmallestPageSize << (pOrder - 1)); // If we get here, it's following the left, so we gotta add half a node size to the offset - if (!ReleasePage(pPage, pOrder - 1, leftSiblingNode, ref pOffset)) - { - pOffset -= (SmallestPageSize << (pOrder - 1)); // shouldn't happen - return false; - } - if (*rightSiblingNode == 0 && *leftSiblingNode == 0) - { - //Console.WriteLine("RAM> CompactPage: Size=" + ToHex((SmallestPageSize << pOrder), 32) + ", Order: " + ToHex((byte)pOrder, 8)); - *pTreeNode ^= 0x02; // Compact by removing split, if the sibling is also unused - } - return true; - } - - - - public static string ToHex(ulong aNumber, byte aBits) - { - string ret = ""; - ulong xValue = aNumber; - byte xCurrentBits = aBits; - ret += "0x"; - while (xCurrentBits >= 4) - { - xCurrentBits -= 4; - byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF); - string xDigitString = null; - switch (xCurrentDigit) - { - case 0: - xDigitString = "0"; - goto default; - case 1: - xDigitString = "1"; - goto default; - case 2: - xDigitString = "2"; - goto default; - case 3: - xDigitString = "3"; - goto default; - case 4: - xDigitString = "4"; - goto default; - case 5: - xDigitString = "5"; - goto default; - case 6: - xDigitString = "6"; - goto default; - case 7: - xDigitString = "7"; - goto default; - case 8: - xDigitString = "8"; - goto default; - case 9: - xDigitString = "9"; - goto default; - case 10: - xDigitString = "A"; - goto default; - case 11: - xDigitString = "B"; - goto default; - case 12: - xDigitString = "C"; - goto default; - case 13: - xDigitString = "D"; - goto default; - case 14: - xDigitString = "E"; - goto default; - case 15: - xDigitString = "F"; - goto default; - default: - ret += xDigitString; - break; - } - } - return ret; - } - } -} diff --git a/Users/Orvid/StructTest/SecondaryKernel.cs b/Users/Orvid/StructTest/SecondaryKernel.cs deleted file mode 100644 index bad9209259..0000000000 --- a/Users/Orvid/StructTest/SecondaryKernel.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; -//using Math = Cosmos.System_Plugs.MathImpl; -using System.Text; -using Sys = Cosmos.System; -using Orvid.Graphics; - -namespace StructTest -{ - public class Kernel : Sys.Kernel - { - - public Kernel() - { - base.ClearScreen = true; - - } - - protected override void BeforeRun() - { - Console.WriteLine("Hello, and welcome to the TestOS by Orvid."); - Console.WriteLine("To see a list of supported commands, type '?'"); - } - - - public void DoRun() - { - this.Run(); - } - - protected override void Run() - { - //Cosmos.Core.RAM.Initialize(); - //double d = 40.23; - //double d2 = 93.210; - //double d3 = -412.569; - //double d4 = 0.45912; - //Console.WriteLine("Dividing 40.23 by 40.23: " + (d / d).ToString() + " (1)"); - //Console.WriteLine("Dividing 40.23 by 93.210: " + (d / d2).ToString() + " (0.431606050852913)"); - //Console.WriteLine("Dividing 40.23 by -412.569: " + (d / d3).ToString() + " (-0.097510961802753)"); - //Console.WriteLine("Dividing 40.23 by 0.45912: " + (d / d4).ToString() + " (87.6241505488761)"); - //Console.WriteLine("Dividing 93.210 by 40.23: " + (d2 / d).ToString() + " (2.31692766592095)"); - //Console.WriteLine("Dividing 93.210 by 93.210: " + (d2 / d2).ToString() + " (1)"); - //Console.WriteLine("Dividing 93.210 by -412.569: " + (d2 / d3).ToString() + " (-0.22592584513136)"); - //Console.WriteLine("Dividing 93.210 by 0.45912: " + (d2 / d4).ToString() + " (203.018818609514)"); - //Console.WriteLine("Dividing -412.569 by 40.23: " + (d3 / d).ToString() + " (-10.255257270693)"); - //Console.WriteLine("Dividing -412.569 by 93.210: " + (d3 / d2).ToString() + " (-4.42623109108465)"); - //Console.WriteLine("Dividing -412.569 by -412.569: " + (d3 / d3).ToString() + " (1)"); - //Console.WriteLine("Dividing -412.569 by 0.45912: " + (d3 / d4).ToString() + " (-898.608207004705)"); - //Console.WriteLine("Dividing 0.45912 by 40.23: " + (d4 / d).ToString() + " (0.0114123788217748)"); - //Console.WriteLine("Dividing 0.45912 by 93.210: " + (d4 / d2).ToString() + " (0.00492565175410364)"); - //Console.WriteLine("Dividing 0.45912 by -412.569: " + (d4 / d3).ToString() + " (-0.00111283203536863)"); - //Console.WriteLine("Dividing 0.45912 by 0.45912: " + (d4 / d4).ToString() + " (1)"); - - - //Cosmos.Hardware.Drivers.PCI.Video.VMWareSVGAII v = new Cosmos.Hardware.Drivers.PCI.Video.VMWareSVGAII(); - //v.Clear(0x00000000); - //v.Fill(30, 30, 30, 30, 0x88888888); - //v.Update(0, 0, 800, 600); - //Monitor m = new Monitor(); - //byte r = 255; - //sbyte r = -128; - //char r = '\u0127'; - //ushort r = 65535; - //short r = -32768; - //uint r = 4294967295; - //int r = -2147483648; - //ulong r = 18446744073709551615; - int r = -131; - //float r = 123.7f; - //double r = 123.7; - //double d; - //d = 0; - //if (d > 39.0d) - //{ - // Console.WriteLine("Greater"); - //} - //else - //{ - // Console.WriteLine("Less Than"); - //} - Console.WriteLine("Just one more test."); - Console.WriteLine("Raw Byte: " + r.ToString()); - Console.WriteLine("Byte->Byte: " + (unchecked((byte)r)).ToString()); - Console.WriteLine("Byte->SByte: " + (unchecked((sbyte)r)).ToString()); - Console.WriteLine("Byte->Char: " + (unchecked((char)r)).ToString()); - Console.WriteLine("Byte->UShort: " + (unchecked((ushort)r)).ToString()); - Console.WriteLine("Byte->Short: " + (unchecked((short)r)).ToString()); - Console.WriteLine("Byte->UInt: " + (unchecked((uint)r)).ToString()); - Console.WriteLine("Byte->Int: " + (unchecked((int)r)).ToString()); - Console.WriteLine("Byte->ULong: " + (unchecked((ulong)r)).ToString()); - Console.WriteLine("Byte->Long: " + (unchecked((long)r)).ToString()); - Console.WriteLine("Byte->Float: " + (unchecked((float)r)).ToString()); - Console.WriteLine("Byte->Double: " + (unchecked((double)r)).ToString()); - Console.WriteLine("Byte->Decimal: " + (unchecked((decimal)r)).ToString()); - while (true) - { - //m.Update(); - //Console.WriteLine(Cosmos.Hardware.RTC.Hour.ToString() + ":" + Cosmos.Hardware.RTC.Minute.ToString() + ":" + Cosmos.Hardware.RTC.Second.ToString()); - } - } - } -} diff --git a/Users/Orvid/StructTest/StructTest.Cosmos b/Users/Orvid/StructTest/StructTest.Cosmos deleted file mode 100644 index dc095e0901..0000000000 --- a/Users/Orvid/StructTest/StructTest.Cosmos +++ /dev/null @@ -1,70 +0,0 @@ - - - - Debug - 2.0 - {fc6ee0b6-0e66-43e9-bfba-9908de788936} - false - StructTest - elf - StructTest - - - true - bin\Debug\ - MicrosoftNET - False - True - Source - User - VMWare - Player - True - All - - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - Cosmos.System_Plugs - {7c64b97f-516d-4a6d-b9e1-3fe48f561409} - True - - - Orvid.Graphics - {c9e995cf-cb65-4410-a7d2-63ebbe02aabb} - True - - - StructTestKernel - {086fc210-c2e9-4536-8235-9285929f904a} - True - - - - - Cosmos.Core_Plugs - Cosmos.Core_Plugs.dll - ..\..\..\..\..\..\..\Application Data\Cosmos User Kit\Kernel\Cosmos.Core_Plugs.dll - True - - - Cosmos.Debug.Kernel.Plugs - Cosmos.Debug.Kernel.Plugs.dll - ..\..\..\..\..\..\..\Application Data\Cosmos User Kit\Kernel\Cosmos.Debug.Kernel.Plugs.dll - True - - - - \ No newline at end of file diff --git a/Users/Orvid/StructTest/StructTest.sln b/Users/Orvid/StructTest/StructTest.sln deleted file mode 100644 index 24cb1e9882..0000000000 --- a/Users/Orvid/StructTest/StructTest.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{471EC4BB-E47E-4229-A789-D1F5F83B52D4}") = "StructTest", "StructTest.Cosmos", "{FC6EE0B6-0E66-43E9-BFBA-9908DE788936}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructTestKernel", "StructTestKernel.csproj", "{086FC210-C2E9-4536-8235-9285929F904A}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Debug|Any CPU.ActiveCfg = Debug|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Debug|x86.ActiveCfg = Debug|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Debug|x86.Build.0 = Debug|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Release|Any CPU.ActiveCfg = Release|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Release|x86.ActiveCfg = Release|x86 - {FC6EE0B6-0E66-43E9-BFBA-9908DE788936}.Release|x86.Build.0 = Release|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|x86.ActiveCfg = Debug|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Debug|x86.Build.0 = Debug|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {086FC210-C2E9-4536-8235-9285929F904A}.Release|Any CPU.Build.0 = Release|Any CPU - {086FC210-C2E9-4536-8235-9285929F904A}.Release|x86.ActiveCfg = Release|x86 - {086FC210-C2E9-4536-8235-9285929F904A}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Users/Orvid/StructTest/StructTestKernel.csproj b/Users/Orvid/StructTest/StructTestKernel.csproj deleted file mode 100644 index 60ec73ec20..0000000000 --- a/Users/Orvid/StructTest/StructTestKernel.csproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {086FC210-C2E9-4536-8235-9285929F904A} - Exe - Properties - StructTest - StructTestKernel - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - StructTest.Program - - - - - - - - - - - - - - - - {7C64B97F-516D-4A6D-B9E1-3FE48F561409} - Cosmos.System_Plugs - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.Hardware - - - {167D46D2-F0F2-4F59-BA0F-2452941E0450} - Orvid.Graphics.Cosmos - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - \ No newline at end of file diff --git a/Users/Orvid/TestBed/ExitButton.cs b/Users/Orvid/TestBed/ExitButton.cs deleted file mode 100644 index ac5bcf0b96..0000000000 --- a/Users/Orvid/TestBed/ExitButton.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using Orvid.Graphics; -using Forms = System.Windows.Forms; - -namespace TestBed -{ - - internal class ExitButton - { - #region Events - public event ObjectClick Click; - public event ObjectClick MouseEnter; - public event ObjectClick MouseLeave; - public event ObjectClick MouseDown; - public event ObjectClick MouseUp; - #endregion - - public int X; - public int Y; - public Vec2 Size; - private Vec2 iSize; - private Image i; - public Image parent; - public Forms.Form parForm; - public ObjectEvents evnts; - public BoundingBox bounds; - - public ExitButton(Vec2 loc, Vec2 size, Image parent, Forms.Form parf) - { - if (size.X == 0 || size.Y == 0) - { - throw new Exception("No dimention of size can be zero!"); - } - this.X = loc.X; - this.Y = loc.Y; - this.Size = size; - this.iSize = new Vec2(size.X - 1, size.Y - 1); - this.parent = parent; - this.parForm = parf; - this.bounds = new BoundingBox(this.X, this.X + Size.X, this.Y + Size.Y, this.Y); - Click = new ObjectClick(this.ExitButtonClicked); - MouseEnter = new ObjectClick(this.ExitButtonEnter); - MouseLeave = new ObjectClick(this.ExitButtonLeave); - MouseDown = new ObjectClick(this.ExitButtonMouseDown); - MouseUp = new ObjectClick(this.ExitButtonMouseUp); - evnts = new ObjectEvents( - new ObjectClick(Click), - new ObjectClick(MouseEnter), - new ObjectClick(MouseLeave), - new ObjectClick(MouseDown), - new ObjectClick(MouseUp), - new DrawMethod(Draw), - bounds); - i = new Image(size); - this.DrawDefault(); - } - - - - - public void Draw() - { - parent.DrawImage(new Vec2(X, Y), i); - } - - #region Event Methods - - private void ExitButtonMouseUp(object sender, Forms.MouseEventArgs e) - { - if (bounds.IsInBounds(new Vec2(e.X, e.Y))) - { - this.DrawMouseOver(); - } - else - { - this.DrawDefault(); - } - } - - private void ExitButtonMouseDown(object sender, Forms.MouseEventArgs e) - { - this.DrawMouseDown(); - } - - private void ExitButtonClicked(object sender, Forms.MouseEventArgs e) - { - parForm.Close(); - } - - private void ExitButtonEnter(object sender, Forms.MouseEventArgs e) - { - this.DrawMouseOver(); - } - - private void ExitButtonLeave(object sender, Forms.MouseEventArgs e) - { - this.DrawDefault(); - } - #endregion - - #region Draw Methods - public Pixel OverOutline = Colors.Green; - public Pixel OverFill = Colors.Beige; - public Pixel DownOutline = Colors.Green; - public Pixel DownFill = Colors.Blue; - public Pixel NormalOutline = Colors.Green; - public Pixel NormalFill = Colors.Red; - - private void DrawMouseDown() - { - i.DrawRectangle(new Vec2(0, 0), new Vec2(iSize.X, Size.Y), DownFill); - i.DrawPolygonOutline(new Vec2[] { - new Vec2(0,0), - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, DownOutline); - i.DrawLine(new Vec2(0, 0), new Vec2(iSize.X, iSize.Y), DownOutline); - i.DrawLine(new Vec2(0, iSize.Y), new Vec2(iSize.X, 0), DownOutline); - this.Draw(); - } - - private void DrawMouseOver() - { - i.DrawRectangle(new Vec2(0, 0), new Vec2(iSize.X, Size.Y), OverFill); - i.DrawPolygonOutline(new Vec2[] { - new Vec2(0,0), - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, OverOutline); - i.DrawLine(new Vec2(0, 0), new Vec2(iSize.X, iSize.Y), OverOutline); - i.DrawLine(new Vec2(0, iSize.Y), new Vec2(iSize.X, 0), OverOutline); - this.Draw(); - } - - private void DrawDefault() - { - i.DrawRectangle(new Vec2(0, 0), new Vec2(iSize.X, iSize.Y), NormalFill); - i.DrawPolygonOutline(new Vec2[] { - new Vec2(0,0), - new Vec2(iSize.X,0), - new Vec2(iSize.X,iSize.Y), - new Vec2(0,iSize.Y) }, NormalOutline); - i.DrawLine(new Vec2(0, 0), new Vec2(iSize.X, iSize.Y), NormalOutline); - i.DrawLine(new Vec2(0, iSize.Y), new Vec2(iSize.X, 0), NormalOutline); - this.Draw(); - } - #endregion - - } - -} diff --git a/Users/Orvid/TestBed/Form1.Designer.cs b/Users/Orvid/TestBed/Form1.Designer.cs deleted file mode 100644 index fa4d35cd9b..0000000000 --- a/Users/Orvid/TestBed/Form1.Designer.cs +++ /dev/null @@ -1,68 +0,0 @@ -namespace TestBed -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // pictureBox1 - // - this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill; - this.pictureBox1.Location = new System.Drawing.Point(0, 0); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(DesktopWidth, DesktopHeight); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.pictureBox1.TabIndex = 0; - this.pictureBox1.TabStop = false; - this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); - this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown); - this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove); - this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp); - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(DesktopWidth, DesktopHeight); - this.Controls.Add(this.pictureBox1); - this.Name = "Form1"; - this.Text = "Form1"; - this.Load += new System.EventHandler(this.Form1_Load); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.PictureBox pictureBox1; - } -} - diff --git a/Users/Orvid/TestBed/Form1.cs b/Users/Orvid/TestBed/Form1.cs deleted file mode 100644 index e9c64f45a7..0000000000 --- a/Users/Orvid/TestBed/Form1.cs +++ /dev/null @@ -1,327 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using Drawing = System.Drawing; -using System.Text; -using Forms = System.Windows.Forms; -using Orvid.Graphics; -using OForms; -using OForms.Controls; -using OForms.Windows; - -namespace TestBed -{ - public partial class Form1 : Forms.Form - { - private const int DesktopWidth = 640; - private const int DesktopHeight = 480; - List Objects = new List(); - Image i = new Image(DesktopWidth, DesktopHeight); - WindowManager windowManager = new WindowManager(new Vec2(DesktopWidth, DesktopHeight)); - //Orvid.Graphics.FontSupport.Font fnt; - Window w1; - - public Form1() - { - InitializeComponent(); - //System.IO.StreamReader sr = new System.IO.StreamReader("Vera-10.bdf"); - //Orvid.Graphics.FontSupport.FontManager.Instance.LoadFont(1, sr.BaseStream); - //System.IO.StreamReader sr = new System.IO.StreamReader("MS-Sans-Serif_24.FNT"); - //fnt = Orvid.Graphics.FontSupport.FontManager.Instance.LoadFont(2, sr.BaseStream); - } - - void bt_Click(Vec2 loc, MouseButtons buttons) - { - //if (w1.CurrentState == OForms.Windows.WindowState.Normal) - //{ - // windowManager.MaximizeWindow(w1); - //} - //else - //{ - // windowManager.RestoreWindow(w1); - //} - Window w = new Window(new Vec2(130, 30), new Vec2(120, 80), "Test Window 3"); - w.ClearColor = Colors.Blue; - windowManager.AddWindow(w); - } - - #region Mouse Functions - /// - /// This image contains everything that is behind the mouse. - /// - private Image behindMouseImage = new Image(5, 5); // This means max mouse size is 4x4 - private Image MouseImage; - public uint MouseX = 0; - public uint MouseY = 0; - private void DrawCursor() - { - - #region SaveBehindMouse - - behindMouseImage.SetPixel(0, 0, i.GetPixel(MouseX, MouseY)); - behindMouseImage.SetPixel(1, 0, i.GetPixel(MouseX + 1, MouseY)); - behindMouseImage.SetPixel(2, 0, i.GetPixel(MouseX + 2, MouseY)); - behindMouseImage.SetPixel(0, 1, i.GetPixel(MouseX, MouseY + 1)); - behindMouseImage.SetPixel(0, 2, i.GetPixel(MouseX, MouseY + 2)); - behindMouseImage.SetPixel(1, 1, i.GetPixel(MouseX + 1, MouseY + 1)); - behindMouseImage.SetPixel(2, 2, i.GetPixel(MouseX + 2, MouseY + 2)); - behindMouseImage.SetPixel(3, 3, i.GetPixel(MouseX + 3, MouseY + 3)); - behindMouseImage.SetPixel(4, 4, i.GetPixel(MouseX + 4, MouseY + 4)); - - #region Old Block Mouse - //behindMouseImage.SetPixel(0, 0, i.GetPixel(MouseX, MouseY)); - //behindMouseImage.SetPixel(1, 0, i.GetPixel(MouseX + 1, MouseY)); - //behindMouseImage.SetPixel(2, 0, i.GetPixel(MouseX + 2, MouseY)); - //behindMouseImage.SetPixel(3, 0, i.GetPixel(MouseX + 3, MouseY)); - //behindMouseImage.SetPixel(4, 0, i.GetPixel(MouseX + 4, MouseY)); - - //behindMouseImage.SetPixel(0, 1, i.GetPixel(MouseX, MouseY + 1)); - //behindMouseImage.SetPixel(1, 1, i.GetPixel(MouseX + 1, MouseY + 1)); - //behindMouseImage.SetPixel(2, 1, i.GetPixel(MouseX + 2, MouseY + 1)); - //behindMouseImage.SetPixel(3, 1, i.GetPixel(MouseX + 3, MouseY + 1)); - //behindMouseImage.SetPixel(4, 1, i.GetPixel(MouseX + 4, MouseY + 1)); - - //behindMouseImage.SetPixel(0, 2, i.GetPixel(MouseX, MouseY + 2)); - //behindMouseImage.SetPixel(1, 2, i.GetPixel(MouseX + 1, MouseY + 2)); - //behindMouseImage.SetPixel(2, 2, i.GetPixel(MouseX + 2, MouseY + 2)); - //behindMouseImage.SetPixel(3, 2, i.GetPixel(MouseX + 3, MouseY + 2)); - //behindMouseImage.SetPixel(4, 2, i.GetPixel(MouseX + 4, MouseY + 2)); - - //behindMouseImage.SetPixel(0, 3, i.GetPixel(MouseX, MouseY + 3)); - //behindMouseImage.SetPixel(1, 3, i.GetPixel(MouseX + 1, MouseY + 3)); - //behindMouseImage.SetPixel(2, 3, i.GetPixel(MouseX + 2, MouseY + 3)); - //behindMouseImage.SetPixel(3, 3, i.GetPixel(MouseX + 3, MouseY + 3)); - //behindMouseImage.SetPixel(4, 3, i.GetPixel(MouseX + 4, MouseY + 3)); - - //behindMouseImage.SetPixel(0, 4, i.GetPixel(MouseX, MouseY + 4)); - //behindMouseImage.SetPixel(1, 4, i.GetPixel(MouseX + 1, MouseY + 4)); - //behindMouseImage.SetPixel(2, 4, i.GetPixel(MouseX + 2, MouseY + 4)); - //behindMouseImage.SetPixel(3, 4, i.GetPixel(MouseX + 3, MouseY + 4)); - //behindMouseImage.SetPixel(4, 4, i.GetPixel(MouseX + 4, MouseY + 4)); - #endregion - - #endregion - - #region Draw Mouse - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, MouseImage); - #endregion - - } - - private void SetMouseDown() - { - MouseImage.SetPixel(0, 0, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(1, 0, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(2, 0, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(0, 1, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(0, 2, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(1, 1, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(2, 2, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(3, 3, new Pixel(128, 128, 128, 255)); - MouseImage.SetPixel(4, 4, new Pixel(128, 128, 128, 255)); - } - - private void SetMouseUp() - { - MouseImage.SetPixel(0, 0, Colors.Black); - MouseImage.SetPixel(1, 0, Colors.Black); - MouseImage.SetPixel(2, 0, Colors.Black); - MouseImage.SetPixel(0, 1, Colors.Black); - MouseImage.SetPixel(0, 2, Colors.Black); - MouseImage.SetPixel(1, 1, Colors.Black); - MouseImage.SetPixel(2, 2, Colors.Black); - MouseImage.SetPixel(3, 3, Colors.Black); - MouseImage.SetPixel(4, 4, Colors.Black); - } - - private void InitializeMouse() - { - MouseImage = new Image(5, 5); - // Now we need to setup the mouse - MouseImage.SetPixel(0, 0, Colors.Black); - MouseImage.SetPixel(1, 0, Colors.Black); - MouseImage.SetPixel(2, 0, Colors.Black); - MouseImage.SetPixel(0, 1, Colors.Black); - MouseImage.SetPixel(0, 2, Colors.Black); - MouseImage.SetPixel(1, 1, Colors.Black); - MouseImage.SetPixel(2, 2, Colors.Black); - MouseImage.SetPixel(3, 3, Colors.Black); - MouseImage.SetPixel(4, 4, Colors.Black); - - // Old mouse - //MouseImage.SetPixel(0, 0, Colors.Black); - //MouseImage.SetPixel(1, 0, Colors.Black); - //MouseImage.SetPixel(2, 0, Colors.Black); - //MouseImage.SetPixel(3, 0, Colors.Black); - //MouseImage.SetPixel(0, 1, Colors.Black); - //MouseImage.SetPixel(1, 1, Colors.White); - //MouseImage.SetPixel(2, 1, Colors.White); - //MouseImage.SetPixel(3, 1, Colors.Black); - //MouseImage.SetPixel(0, 2, Colors.Black); - //MouseImage.SetPixel(1, 2, Colors.White); - //MouseImage.SetPixel(2, 2, Colors.White); - //MouseImage.SetPixel(3, 2, Colors.Black); - //MouseImage.SetPixel(0, 3, Colors.Black); - //MouseImage.SetPixel(1, 3, Colors.Black); - //MouseImage.SetPixel(2, 3, Colors.Black); - //MouseImage.SetPixel(3, 3, Colors.Black); - } - #endregion - - private void Form1_Load(object sender, EventArgs e) - { - w1 = new Window(new Vec2(30, 30), new Vec2(120, 80), "Test Window 1"); - w1.ClearColor = Colors.Green; - Button bt = new Button(new Vec2(10, 10), new Vec2(30, 10)); - bt.Click += new MouseEvent(bt_Click); - bt.Parent = w1; - w1.Controls.Add(bt); - Window w2 = new Window(new Vec2(80, 30), new Vec2(120, 80), "Test Window 2"); - w2.ClearColor = Colors.Red; - Window w3 = new Window(new Vec2(130, 30), new Vec2(120, 80), "Test Window 3"); - w3.ClearColor = Colors.Blue; - windowManager.AddWindow(w1); - windowManager.AddWindow(w2); - windowManager.AddWindow(w3); - windowManager.BringWindowToFront(w1); - - InitializeMouse(); - Forms.Cursor.Hide(); - - i.Clear(Colors.White); - - //i.DrawString(new Vec2(30, 30), "T", fnt, 20, Orvid.Graphics.FontSupport.FontStyle.Normal, Colors.Black); - - // Draw exit button. - ExitButton b = new ExitButton(new Vec2(DesktopWidth - 21, 1), new Vec2(20, 20), i, this); - Objects.Add(b.evnts); - - - DrawCursor(); - pictureBox1.Image = (System.Drawing.Bitmap)i; - pictureBox1.Refresh(); - // Now we need to restore what was behind the mouse. - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, behindMouseImage); - } - - private void pictureBox1_Click(object sender, EventArgs e) - { - foreach (ObjectEvents o in Objects) - { - if (o.Bounds.IsInBounds(new Vec2((int)MouseX, (int)MouseY))) - { - o.MouseClick(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - } - - windowManager.HandleMouseClick(new Vec2((int)MouseX, (int)MouseY), OForms.MouseButtons.Left, i); - - DrawCursor(); - pictureBox1.Image = (System.Drawing.Bitmap)i; - pictureBox1.Refresh(); - // Now we need to restore what was behind the mouse. - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, behindMouseImage); - } - - private void pictureBox1_MouseMove(object sender, Forms.MouseEventArgs e) - { - MouseX = (uint)e.X; - MouseY = (uint)e.Y; - if (MouseX >= i.Width - 5) - { - MouseX = (uint)(i.Width - 6); - } - if (MouseY >= i.Height - 5) - { - MouseY = (uint)(i.Height - 6); - } - - - windowManager.HandleMouseMove(new Vec2((int)MouseX, (int)MouseY), Utils.GetButtons(e.Button), i); - - - foreach (ObjectEvents c in Objects) - { - if (!c.IsIn) - { - if (c.Bounds.IsInBounds(new Vec2(e.X, e.Y))) - { - c.IsIn = true; - if (c.IsMouseDown) - { - c.MouseDown(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - else - { - c.MouseEnter(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - } - } - else - { - if (!c.Bounds.IsInBounds(new Vec2(e.X, e.Y))) - { - c.IsIn = false; - c.MouseLeave(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - } - } - - DrawCursor(); - pictureBox1.Image = (System.Drawing.Bitmap)i; - pictureBox1.Refresh(); - // Now we need to restore what was behind the mouse. - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, behindMouseImage); - } - - private void pictureBox1_MouseDown(object sender, Forms.MouseEventArgs e) - { - windowManager.HandleMouseDown(new Vec2(e.X, e.Y), Utils.GetButtons(e.Button), i); - - foreach (ObjectEvents c in Objects) - { - if (c.Bounds.IsInBounds(new Vec2(e.X, e.Y))) - { - c.IsMouseDown = true; - c.MouseDown(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - } - - SetMouseDown(); - DrawCursor(); - pictureBox1.Image = (System.Drawing.Bitmap)i; - pictureBox1.Refresh(); - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, behindMouseImage); - } - - private void pictureBox1_MouseUp(object sender, Forms.MouseEventArgs e) - { - windowManager.HandleMouseUp(new Vec2(e.X, e.Y), Utils.GetButtons(e.Button), i); - - foreach (ObjectEvents c in Objects) - { - if (c.IsMouseDown) - { - c.IsMouseDown = false; - c.MouseUp(sender, new Forms.MouseEventArgs(Forms.MouseButtons.Left, 1, (int)MouseX, (int)MouseY, 0)); - } - } - - - SetMouseUp(); - DrawCursor(); - pictureBox1.Image = (System.Drawing.Bitmap)i; - pictureBox1.Refresh(); - Vec2 v = new Vec2((int)MouseX, (int)MouseY); - i.DrawImage(v, behindMouseImage); - } - - } - -} diff --git a/Users/Orvid/TestBed/Form1.resx b/Users/Orvid/TestBed/Form1.resx deleted file mode 100644 index 61bc649ba0..0000000000 --- a/Users/Orvid/TestBed/Form1.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - \ No newline at end of file diff --git a/Users/Orvid/TestBed/MS-Sans-Serif_24.FNT b/Users/Orvid/TestBed/MS-Sans-Serif_24.FNT deleted file mode 100644 index b82576d945..0000000000 Binary files a/Users/Orvid/TestBed/MS-Sans-Serif_24.FNT and /dev/null differ diff --git a/Users/Orvid/TestBed/ObjectEvents.cs b/Users/Orvid/TestBed/ObjectEvents.cs deleted file mode 100644 index 79ca5991b2..0000000000 --- a/Users/Orvid/TestBed/ObjectEvents.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using Orvid.Graphics; -using Forms = System.Windows.Forms; - -namespace TestBed -{ - - internal delegate void ObjectClick(object sender, Forms.MouseEventArgs e); - internal delegate void DrawMethod(); - - internal class ObjectEvents - { - public BoundingBox Bounds; - public ObjectClick MouseClick; - public ObjectClick MouseEnter; - public ObjectClick MouseLeave; - public ObjectClick MouseDown; - public ObjectClick MouseUp; - public DrawMethod Draw; - public bool IsIn; - public bool IsMouseDown; - public ObjectEvents(ObjectClick onClick, ObjectClick onEnter, ObjectClick onLeave, ObjectClick onMouseDown, ObjectClick onMouseUp, DrawMethod drawMethod, BoundingBox b) - { - this.MouseClick = onClick; - this.MouseEnter = onEnter; - this.MouseLeave = onLeave; - this.MouseDown = onMouseDown; - this.MouseUp = onMouseUp; - this.Draw = drawMethod; - this.IsIn = false; - this.IsMouseDown = false; - this.Bounds = b; - } - } -} diff --git a/Users/Orvid/TestBed/Program.cs b/Users/Orvid/TestBed/Program.cs deleted file mode 100644 index fd5d90395e..0000000000 --- a/Users/Orvid/TestBed/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace TestBed -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} diff --git a/Users/Orvid/TestBed/Properties/AssemblyInfo.cs b/Users/Orvid/TestBed/Properties/AssemblyInfo.cs deleted file mode 100644 index af6fe456aa..0000000000 --- a/Users/Orvid/TestBed/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("TestBed")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestBed")] -[assembly: AssemblyCopyright("Copyright © 2011")] -[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("fdc5cc9b-b87b-4319-a25e-7b7c246cbe67")] - -// 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/Users/Orvid/TestBed/Properties/Resources.Designer.cs b/Users/Orvid/TestBed/Properties/Resources.Designer.cs deleted file mode 100644 index fd0f6204d7..0000000000 --- a/Users/Orvid/TestBed/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.235 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace TestBed.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TestBed.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/Users/Orvid/TestBed/Properties/Resources.resx b/Users/Orvid/TestBed/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/Users/Orvid/TestBed/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Users/Orvid/TestBed/TestBed.csproj b/Users/Orvid/TestBed/TestBed.csproj deleted file mode 100644 index 3d4633d8db..0000000000 --- a/Users/Orvid/TestBed/TestBed.csproj +++ /dev/null @@ -1,94 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D399715F-C947-4C07-94DF-E7E86C469EF1} - WinExe - Properties - TestBed - TestBed - v4.7.1 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - Form - - - Form1.cs - - - - - - - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - - - {039E2C8F-E73C-48AF-B249-FC953072D9A0} - OForms - - - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB} - Orvid.Graphics - - - - - PreserveNewest - - - PreserveNewest - - - - - diff --git a/Users/Orvid/TestBed/TestBed.sln b/Users/Orvid/TestBed/TestBed.sln deleted file mode 100644 index f1fcd0e3d6..0000000000 --- a/Users/Orvid/TestBed/TestBed.sln +++ /dev/null @@ -1,214 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C# Express 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestBed", "TestBed.csproj", "{D399715F-C947-4C07-94DF-E7E86C469EF1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics", "..\Orvid.Graphics\Orvid.Graphics.csproj", "{C9E995CF-CB65-4410-A7D2-63EBBE02AABB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Compression", "..\Orvid.Compression\Orvid.Compression.csproj", "{931E9514-6750-4700-8B20-364DD1B78038}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Assembler", "..\..\..\Compiler\Cosmos.Compiler.Assembler\Cosmos.Compiler.Assembler.csproj", "{1116130E-28E0-428A-A597-F4B3B676C0CA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Compiler.Assembler.X86", "..\..\..\Compiler\Cosmos.Compiler.Assembler.X86\Cosmos.Compiler.Assembler.X86.csproj", "{94D079E4-3C66-486A-8407-EA6EC049FF53}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Core", "..\..\source\Cosmos.Core\Cosmos.Core.csproj", "{5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Debug.Kernel", "..\..\source\Cosmos.Debug.Kernel\Cosmos.Debug.Kernel.csproj", "{61607F1E-58F9-41CF-972F-128384F3E115}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Common", "..\..\source\Cosmos.Common\Cosmos.Common.csproj", "{1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.IL2CPU.Plugs", "..\..\source\Cosmos.IL2CPU.Plugs\Cosmos.IL2CPU.Plugs.csproj", "{C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.System", "..\..\source\Cosmos.System\Cosmos.System.csproj", "{DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cosmos.Hardware", "..\..\source\Cosmos.Hardware\Cosmos.Hardware.csproj", "{6A991D03-1435-4005-9809-B8BACDF3B021}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TTF2OPFF Converter", "..\..\..\Tools\TTF2OPFF Converter\TTF2OPFF Converter.csproj", "{D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageManipulatorTester", "..\ImageManipulatorTester\ImageManipulatorTester.csproj", "{1A36573D-5EC1-4EA7-B65C-1AAA537292B7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics.Dependancies", "..\Orvid.Graphics.Dependancies\Orvid.Graphics.Dependancies.csproj", "{6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlugViewer", "..\PlugViewer\PlugViewer.csproj", "{2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OForms", "..\OForms\OForms.csproj", "{039E2C8F-E73C-48AF-B249-FC953072D9A0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CharMapGenerator", "..\Utils\CharMapGenerator\CharMapGenerator.csproj", "{4D7BE49B-BFD2-4586-A411-5EFC82621291}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "File2ByteArray Converter", "..\..\..\Tools\File2ByteArray Converter\File2ByteArray Converter.csproj", "{9C96A7B5-19E5-4923-9569-DB9454E69C82}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Graphics.Cosmos", "..\Orvid.Graphics.Cosmos\Orvid.Graphics.Cosmos.csproj", "{167D46D2-F0F2-4F59-BA0F-2452941E0450}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orvid.Concurrent", "..\Orvid.Concurrent\Orvid.Concurrent.csproj", "{FC0B18FE-6D0A-481C-8007-2138A88D0DB3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|Any CPU.Build.0 = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|x86.ActiveCfg = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Debug|x86.Build.0 = Debug|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|Any CPU.ActiveCfg = Release|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|Any CPU.Build.0 = Release|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|x86.ActiveCfg = Release|x86 - {D399715F-C947-4C07-94DF-E7E86C469EF1}.Release|x86.Build.0 = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|Any CPU.Build.0 = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|x86.ActiveCfg = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Debug|x86.Build.0 = Debug|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|Any CPU.ActiveCfg = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|Any CPU.Build.0 = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|x86.ActiveCfg = Release|x86 - {C9E995CF-CB65-4410-A7D2-63EBBE02AABB}.Release|x86.Build.0 = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|Any CPU.ActiveCfg = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|Any CPU.Build.0 = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|x86.ActiveCfg = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Debug|x86.Build.0 = Debug|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|Any CPU.ActiveCfg = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|Any CPU.Build.0 = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|x86.ActiveCfg = Release|x86 - {931E9514-6750-4700-8B20-364DD1B78038}.Release|x86.Build.0 = Release|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|Any CPU.Build.0 = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|x86.ActiveCfg = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Debug|x86.Build.0 = Debug|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|Any CPU.Build.0 = Release|Any CPU - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|x86.ActiveCfg = Release|x86 - {1116130E-28E0-428A-A597-F4B3B676C0CA}.Release|x86.Build.0 = Release|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|Any CPU.ActiveCfg = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|Any CPU.Build.0 = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|x86.ActiveCfg = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Debug|x86.Build.0 = Debug|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|Any CPU.Build.0 = Release|Any CPU - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|x86.ActiveCfg = Release|x86 - {94D079E4-3C66-486A-8407-EA6EC049FF53}.Release|x86.Build.0 = Release|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|Any CPU.Build.0 = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|x86.ActiveCfg = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Debug|x86.Build.0 = Debug|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|Any CPU.Build.0 = Release|Any CPU - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|x86.ActiveCfg = Release|x86 - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6}.Release|x86.Build.0 = Release|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|Any CPU.ActiveCfg = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|Any CPU.Build.0 = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|x86.ActiveCfg = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Debug|x86.Build.0 = Debug|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|Any CPU.Build.0 = Release|Any CPU - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|x86.ActiveCfg = Release|x86 - {61607F1E-58F9-41CF-972F-128384F3E115}.Release|x86.Build.0 = Release|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|Any CPU.Build.0 = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|x86.ActiveCfg = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Debug|x86.Build.0 = Debug|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|Any CPU.Build.0 = Release|Any CPU - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|x86.ActiveCfg = Release|x86 - {1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}.Release|x86.Build.0 = Release|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|Any CPU.Build.0 = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|x86.ActiveCfg = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Debug|x86.Build.0 = Debug|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|Any CPU.Build.0 = Release|Any CPU - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|x86.ActiveCfg = Release|x86 - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E}.Release|x86.Build.0 = Release|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|Any CPU.ActiveCfg = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|Any CPU.Build.0 = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|x86.ActiveCfg = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Debug|x86.Build.0 = Debug|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|Any CPU.Build.0 = Release|Any CPU - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|x86.ActiveCfg = Release|x86 - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5}.Release|x86.Build.0 = Release|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|Any CPU.ActiveCfg = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|Any CPU.Build.0 = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|x86.ActiveCfg = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Debug|x86.Build.0 = Debug|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|Any CPU.Build.0 = Release|Any CPU - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|x86.ActiveCfg = Release|x86 - {6A991D03-1435-4005-9809-B8BACDF3B021}.Release|x86.Build.0 = Release|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Debug|Any CPU.Build.0 = Debug|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Debug|x86.ActiveCfg = Debug|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Debug|x86.Build.0 = Debug|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Release|Any CPU.ActiveCfg = Release|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Release|Any CPU.Build.0 = Release|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Release|x86.ActiveCfg = Release|x86 - {D3E61B1B-154A-4AA6-9EE9-0E0003073AD5}.Release|x86.Build.0 = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|Any CPU.Build.0 = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|x86.ActiveCfg = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Debug|x86.Build.0 = Debug|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|Any CPU.ActiveCfg = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|Any CPU.Build.0 = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|x86.ActiveCfg = Release|x86 - {1A36573D-5EC1-4EA7-B65C-1AAA537292B7}.Release|x86.Build.0 = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|Any CPU.ActiveCfg = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|Any CPU.Build.0 = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|x86.ActiveCfg = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Debug|x86.Build.0 = Debug|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|Any CPU.ActiveCfg = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|Any CPU.Build.0 = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|x86.ActiveCfg = Release|x86 - {6B3ABC85-0A7B-4941-A4BE-BE5A5BE3D3F8}.Release|x86.Build.0 = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|Any CPU.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|Any CPU.Build.0 = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.ActiveCfg = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Debug|x86.Build.0 = Debug|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|Any CPU.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|Any CPU.Build.0 = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.ActiveCfg = Release|x86 - {2B45BB4D-8AE3-4AC5-B1E9-9F93C847F2CF}.Release|x86.Build.0 = Release|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|x86.ActiveCfg = Debug|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Debug|x86.Build.0 = Debug|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|Any CPU.Build.0 = Release|Any CPU - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|x86.ActiveCfg = Release|x86 - {039E2C8F-E73C-48AF-B249-FC953072D9A0}.Release|x86.Build.0 = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|Any CPU.ActiveCfg = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|Any CPU.Build.0 = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|x86.ActiveCfg = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Debug|x86.Build.0 = Debug|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|Any CPU.ActiveCfg = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|Any CPU.Build.0 = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|x86.ActiveCfg = Release|x86 - {4D7BE49B-BFD2-4586-A411-5EFC82621291}.Release|x86.Build.0 = Release|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Debug|Any CPU.ActiveCfg = Debug|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Debug|Any CPU.Build.0 = Debug|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Debug|x86.ActiveCfg = Debug|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Debug|x86.Build.0 = Debug|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Release|Any CPU.ActiveCfg = Release|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Release|Any CPU.Build.0 = Release|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Release|x86.ActiveCfg = Release|x86 - {9C96A7B5-19E5-4923-9569-DB9454E69C82}.Release|x86.Build.0 = Release|x86 - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|Any CPU.Build.0 = Debug|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|x86.ActiveCfg = Debug|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Debug|x86.Build.0 = Debug|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|Any CPU.ActiveCfg = Release|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|Any CPU.Build.0 = Release|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|x86.ActiveCfg = Release|Any CPU - {167D46D2-F0F2-4F59-BA0F-2452941E0450}.Release|x86.Build.0 = Release|Any CPU - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Debug|Any CPU.ActiveCfg = Debug|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Debug|x86.ActiveCfg = Debug|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Debug|x86.Build.0 = Debug|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Release|Any CPU.ActiveCfg = Release|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Release|x86.ActiveCfg = Release|x86 - {FC0B18FE-6D0A-481C-8007-2138A88D0DB3}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Users/Orvid/TestBed/Utils.cs b/Users/Orvid/TestBed/Utils.cs deleted file mode 100644 index bbfb63fa0c..0000000000 --- a/Users/Orvid/TestBed/Utils.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using Forms = System.Windows.Forms; - -namespace TestBed -{ - public static class Utils - { - - /// - /// Converts a System.Windows.Forms.MouseButtons to OForms.MouseButtons - /// - /// Object to convert. - /// Converted buttons. - public static OForms.MouseButtons GetButtons(Forms.MouseButtons b) - { - OForms.MouseButtons buttons = OForms.MouseButtons.None; - - if (b.HasFlag(Forms.MouseButtons.Left)) - { - buttons |= OForms.MouseButtons.Left; - } - else if (b.HasFlag(Forms.MouseButtons.Middle)) - { - buttons |= OForms.MouseButtons.Middle; - } - else if (b.HasFlag(Forms.MouseButtons.Right)) - { - buttons |= OForms.MouseButtons.Right; - } - else if (b.HasFlag(Forms.MouseButtons.XButton1)) - { - buttons |= OForms.MouseButtons.XButton1; - } - else if (b.HasFlag(Forms.MouseButtons.XButton2)) - { - buttons |= OForms.MouseButtons.XButton2; - } - - return buttons; - } - } -} diff --git a/Users/Orvid/TestBed/Vera-10.bdf b/Users/Orvid/TestBed/Vera-10.bdf deleted file mode 100644 index af56e4d932..0000000000 --- a/Users/Orvid/TestBed/Vera-10.bdf +++ /dev/null @@ -1,3483 +0,0 @@ -STARTFONT 2.1 -FONT -FontForge-Bitstream Vera Sans-Book-R-Normal-Sans--10-100-72-72-P-59-ISO10646-1 -SIZE 10 72 72 -FONTBOUNDINGBOX 13 9 -1 -3 -COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" -STARTPROPERTIES 27 -FONT_NAME "BitstreamVeraSans-Roman" -FONT_ASCENT 8 -FONT_DESCENT 2 -UNDERLINE_POSITION -213 -UNDERLINE_THICKNESS 143 -QUAD_WIDTH 10 -X_HEIGHT 6 -CAP_HEIGHT 4 -FONTNAME_REGISTRY "" -FAMILY_NAME "Bitstream Vera Sans" -FOUNDRY "FontForge" -WEIGHT_NAME "Book" -SETWIDTH_NAME "Normal" -SLANT "R" -ADD_STYLE_NAME "Sans-" -PIXEL_SIZE 10 -POINT_SIZE 100 -RESOLUTION_X 72 -RESOLUTION_Y 72 -RESOLUTION 72 -SPACING "P" -AVERAGE_WIDTH 59 -CHARSET_REGISTRY "ISO10646" -CHARSET_ENCODING "-1" -CHARSET_COLLECTIONS "ASCII ISO8859-9 ISO10646-1" -FULL_NAME "Bitstream Vera Sans" -COPYRIGHT "Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved." -ENDPROPERTIES -CHARS 268 -STARTCHAR space -ENCODING 32 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclam -ENCODING 33 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 1 7 1 0 -BITMAP -80 -80 -80 -80 -00 -00 -80 -ENDCHAR -STARTCHAR quotedbl -ENCODING 34 -SWIDTH 459 0 -DWIDTH 5 0 -BBX 3 3 1 4 -BITMAP -A0 -A0 -A0 -ENDCHAR -STARTCHAR numbersign -ENCODING 35 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -20 -28 -FC -48 -FC -50 -50 -ENDCHAR -STARTCHAR dollar -ENCODING 36 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -F0 -C0 -C0 -70 -50 -F0 -ENDCHAR -STARTCHAR percent -ENCODING 37 -SWIDTH 950 0 -DWIDTH 10 0 -BBX 9 7 0 0 -BITMAP -6200 -9400 -9400 -6800 -1780 -1480 -2300 -ENDCHAR -STARTCHAR ampersand -ENCODING 38 -SWIDTH 779 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -70 -80 -40 -E4 -94 -88 -F4 -ENDCHAR -STARTCHAR quotesingle -ENCODING 39 -SWIDTH 274 0 -DWIDTH 3 0 -BBX 1 3 1 4 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR parenleft -ENCODING 40 -SWIDTH 390 0 -DWIDTH 4 0 -BBX 2 8 1 -1 -BITMAP -40 -80 -80 -80 -80 -80 -80 -40 -ENDCHAR -STARTCHAR parenright -ENCODING 41 -SWIDTH 390 0 -DWIDTH 4 0 -BBX 2 8 1 -1 -BITMAP -80 -80 -40 -40 -40 -40 -80 -80 -ENDCHAR -STARTCHAR asterisk -ENCODING 42 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 5 5 0 2 -BITMAP -20 -A8 -70 -F0 -20 -ENDCHAR -STARTCHAR plus -ENCODING 43 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 6 1 0 -BITMAP -10 -10 -10 -FC -10 -10 -ENDCHAR -STARTCHAR comma -ENCODING 44 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 2 1 -1 -BITMAP -80 -80 -ENDCHAR -STARTCHAR hyphen -ENCODING 45 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 1 0 2 -BITMAP -E0 -ENDCHAR -STARTCHAR period -ENCODING 46 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 1 1 0 -BITMAP -80 -ENDCHAR -STARTCHAR slash -ENCODING 47 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 3 8 0 -1 -BITMAP -20 -20 -20 -40 -40 -40 -80 -80 -ENDCHAR -STARTCHAR zero -ENCODING 48 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -60 -90 -90 -88 -88 -90 -70 -ENDCHAR -STARTCHAR one -ENCODING 49 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -20 -20 -20 -20 -20 -F0 -ENDCHAR -STARTCHAR two -ENCODING 50 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -10 -10 -10 -20 -40 -F0 -ENDCHAR -STARTCHAR three -ENCODING 51 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -E0 -10 -10 -60 -10 -10 -F0 -ENDCHAR -STARTCHAR four -ENCODING 52 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -18 -28 -28 -48 -88 -78 -08 -ENDCHAR -STARTCHAR five -ENCODING 53 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -80 -80 -70 -10 -10 -F0 -ENDCHAR -STARTCHAR six -ENCODING 54 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -30 -C0 -80 -F0 -88 -88 -70 -ENDCHAR -STARTCHAR seven -ENCODING 55 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -10 -10 -20 -20 -40 -40 -ENDCHAR -STARTCHAR eight -ENCODING 56 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -60 -90 -90 -60 -90 -88 -F0 -ENDCHAR -STARTCHAR nine -ENCODING 57 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -60 -90 -90 -98 -70 -10 -E0 -ENDCHAR -STARTCHAR colon -ENCODING 58 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 1 5 1 0 -BITMAP -80 -00 -00 -00 -80 -ENDCHAR -STARTCHAR semicolon -ENCODING 59 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 1 6 1 -1 -BITMAP -80 -00 -00 -00 -80 -80 -ENDCHAR -STARTCHAR less -ENCODING 60 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 4 1 1 -BITMAP -0C -70 -C0 -38 -ENDCHAR -STARTCHAR equal -ENCODING 61 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 3 1 1 -BITMAP -FC -00 -78 -ENDCHAR -STARTCHAR greater -ENCODING 62 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 4 1 1 -BITMAP -C0 -38 -0C -70 -ENDCHAR -STARTCHAR question -ENCODING 63 -SWIDTH 530 0 -DWIDTH 5 0 -BBX 2 7 2 0 -BITMAP -C0 -40 -40 -80 -80 -00 -80 -ENDCHAR -STARTCHAR at -ENCODING 64 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 9 8 0 -2 -BITMAP -3F00 -4080 -5E80 -9280 -9280 -4F00 -2100 -1E00 -ENDCHAR -STARTCHAR A -ENCODING 65 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR B -ENCODING 66 -SWIDTH 686 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -F0 -88 -88 -F0 -88 -88 -F0 -ENDCHAR -STARTCHAR C -ENCODING 67 -SWIDTH 698 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -30 -C0 -80 -80 -80 -80 -78 -ENDCHAR -STARTCHAR D -ENCODING 68 -SWIDTH 770 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -F0 -88 -84 -84 -84 -8C -F8 -ENDCHAR -STARTCHAR E -ENCODING 69 -SWIDTH 631 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -F0 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR F -ENCODING 70 -SWIDTH 575 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -F0 -80 -80 -F0 -80 -80 -80 -ENDCHAR -STARTCHAR G -ENCODING 71 -SWIDTH 774 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -CC -80 -80 -8C -84 -78 -ENDCHAR -STARTCHAR H -ENCODING 72 -SWIDTH 751 0 -DWIDTH 8 0 -BBX 5 7 1 0 -BITMAP -88 -88 -88 -F8 -88 -88 -88 -ENDCHAR -STARTCHAR I -ENCODING 73 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 1 7 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR J -ENCODING 74 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 3 9 -1 -2 -BITMAP -20 -20 -20 -20 -20 -20 -20 -20 -C0 -ENDCHAR -STARTCHAR K -ENCODING 75 -SWIDTH 655 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -90 -A0 -C0 -A0 -90 -88 -ENDCHAR -STARTCHAR L -ENCODING 76 -SWIDTH 557 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -F0 -ENDCHAR -STARTCHAR M -ENCODING 77 -SWIDTH 862 0 -DWIDTH 9 0 -BBX 7 7 1 0 -BITMAP -86 -CA -CA -AA -B2 -92 -82 -ENDCHAR -STARTCHAR N -ENCODING 78 -SWIDTH 748 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -C8 -C8 -A8 -98 -98 -88 -ENDCHAR -STARTCHAR O -ENCODING 79 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR P -ENCODING 80 -SWIDTH 603 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -E0 -90 -88 -90 -E0 -80 -80 -ENDCHAR -STARTCHAR Q -ENCODING 81 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 -1 -BITMAP -30 -C8 -84 -84 -84 -84 -78 -08 -ENDCHAR -STARTCHAR R -ENCODING 82 -SWIDTH 694 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -E0 -90 -88 -F0 -90 -88 -88 -ENDCHAR -STARTCHAR S -ENCODING 83 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -70 -80 -80 -F0 -18 -08 -F0 -ENDCHAR -STARTCHAR T -ENCODING 84 -SWIDTH 610 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -FC -20 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR U -ENCODING 85 -SWIDTH 731 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR V -ENCODING 86 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 7 7 0 0 -BITMAP -82 -44 -44 -48 -28 -28 -10 -ENDCHAR -STARTCHAR W -ENCODING 87 -SWIDTH 988 0 -DWIDTH 10 0 -BBX 9 7 0 0 -BITMAP -8880 -4C80 -4C80 -5480 -5500 -3300 -2300 -ENDCHAR -STARTCHAR X -ENCODING 88 -SWIDTH 685 0 -DWIDTH 7 0 -BBX 5 7 1 0 -BITMAP -88 -90 -50 -20 -50 -90 -88 -ENDCHAR -STARTCHAR Y -ENCODING 89 -SWIDTH 610 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -84 -48 -30 -30 -20 -20 -20 -ENDCHAR -STARTCHAR Z -ENCODING 90 -SWIDTH 685 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -7C -04 -08 -10 -20 -40 -FC -ENDCHAR -STARTCHAR bracketleft -ENCODING 91 -SWIDTH 390 0 -DWIDTH 4 0 -BBX 2 8 1 -1 -BITMAP -C0 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR backslash -ENCODING 92 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 3 8 0 -1 -BITMAP -80 -80 -40 -40 -40 -20 -20 -20 -ENDCHAR -STARTCHAR bracketright -ENCODING 93 -SWIDTH 390 0 -DWIDTH 4 0 -BBX 2 8 1 -1 -BITMAP -C0 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR asciicircum -ENCODING 94 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 3 1 4 -BITMAP -30 -68 -84 -ENDCHAR -STARTCHAR underscore -ENCODING 95 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 -3 -BITMAP -E0 -ENDCHAR -STARTCHAR grave -ENCODING 96 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 3 5 -BITMAP -00 -ENDCHAR -STARTCHAR a -ENCODING 97 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR b -ENCODING 98 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -80 -80 -F0 -88 -88 -88 -F0 -ENDCHAR -STARTCHAR c -ENCODING 99 -SWIDTH 549 0 -DWIDTH 5 0 -BBX 5 5 0 0 -BITMAP -78 -40 -80 -40 -78 -ENDCHAR -STARTCHAR d -ENCODING 100 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -08 -08 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR e -ENCODING 101 -SWIDTH 615 0 -DWIDTH 6 0 -BBX 5 5 1 0 -BITMAP -F0 -90 -F8 -80 -70 -ENDCHAR -STARTCHAR f -ENCODING 102 -SWIDTH 352 0 -DWIDTH 4 0 -BBX 4 7 0 0 -BITMAP -70 -40 -E0 -40 -40 -40 -40 -ENDCHAR -STARTCHAR g -ENCODING 103 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 0 -2 -BITMAP -78 -48 -88 -48 -78 -08 -70 -ENDCHAR -STARTCHAR h -ENCODING 104 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -80 -F0 -90 -90 -90 -90 -ENDCHAR -STARTCHAR i -ENCODING 105 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 1 7 1 0 -BITMAP -80 -00 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR j -ENCODING 106 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 2 9 0 -2 -BITMAP -40 -00 -40 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR k -ENCODING 107 -SWIDTH 579 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -80 -80 -90 -A0 -C0 -A0 -90 -ENDCHAR -STARTCHAR l -ENCODING 108 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 1 7 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR m -ENCODING 109 -SWIDTH 974 0 -DWIDTH 10 0 -BBX 8 5 1 0 -BITMAP -F6 -99 -91 -91 -91 -ENDCHAR -STARTCHAR n -ENCODING 110 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -F0 -90 -90 -90 -90 -ENDCHAR -STARTCHAR o -ENCODING 111 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR p -ENCODING 112 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 1 -2 -BITMAP -F0 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR q -ENCODING 113 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 0 -2 -BITMAP -78 -48 -88 -48 -78 -08 -08 -ENDCHAR -STARTCHAR r -ENCODING 114 -SWIDTH 411 0 -DWIDTH 4 0 -BBX 3 5 1 0 -BITMAP -E0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR s -ENCODING 115 -SWIDTH 520 0 -DWIDTH 5 0 -BBX 5 5 0 0 -BITMAP -70 -80 -70 -08 -70 -ENDCHAR -STARTCHAR t -ENCODING 116 -SWIDTH 392 0 -DWIDTH 4 0 -BBX 4 6 0 0 -BITMAP -40 -F0 -40 -40 -40 -70 -ENDCHAR -STARTCHAR u -ENCODING 117 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR v -ENCODING 118 -SWIDTH 591 0 -DWIDTH 6 0 -BBX 5 5 0 0 -BITMAP -88 -48 -48 -30 -30 -ENDCHAR -STARTCHAR w -ENCODING 119 -SWIDTH 817 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -30 -B4 -B4 -CC -48 -ENDCHAR -STARTCHAR x -ENCODING 120 -SWIDTH 591 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -90 -60 -40 -E0 -90 -ENDCHAR -STARTCHAR y -ENCODING 121 -SWIDTH 591 0 -DWIDTH 6 0 -BBX 4 7 1 -2 -BITMAP -10 -90 -A0 -60 -60 -40 -C0 -ENDCHAR -STARTCHAR z -ENCODING 122 -SWIDTH 524 0 -DWIDTH 5 0 -BBX 5 5 0 0 -BITMAP -78 -10 -20 -40 -F8 -ENDCHAR -STARTCHAR braceleft -ENCODING 123 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -30 -20 -20 -20 -C0 -20 -20 -20 -ENDCHAR -STARTCHAR bar -ENCODING 124 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 1 9 1 -2 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR braceright -ENCODING 125 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -C0 -40 -20 -20 -30 -20 -20 -00 -40 -ENDCHAR -STARTCHAR asciitilde -ENCODING 126 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 2 1 2 -BITMAP -40 -BC -ENDCHAR -STARTCHAR nonbreakingspace -ENCODING 160 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR exclamdown -ENCODING 161 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 1 7 1 0 -BITMAP -80 -00 -00 -80 -80 -80 -80 -ENDCHAR -STARTCHAR cent -ENCODING 162 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 -1 -BITMAP -20 -70 -A0 -A0 -A0 -70 -20 -ENDCHAR -STARTCHAR sterling -ENCODING 163 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -30 -40 -40 -40 -60 -40 -F0 -ENDCHAR -STARTCHAR currency -ENCODING 164 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 4 1 1 -BITMAP -F0 -90 -90 -F0 -ENDCHAR -STARTCHAR yen -ENCODING 165 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -84 -48 -28 -7C -7C -10 -10 -ENDCHAR -STARTCHAR brokenbar -ENCODING 166 -SWIDTH 336 0 -DWIDTH 3 0 -BBX 1 8 1 -2 -BITMAP -80 -80 -80 -00 -80 -80 -80 -80 -ENDCHAR -STARTCHAR section -ENCODING 167 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 4 8 0 -1 -BITMAP -30 -40 -60 -90 -50 -30 -10 -70 -ENDCHAR -STARTCHAR dieresis -ENCODING 168 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 6 -BITMAP -A0 -ENDCHAR -STARTCHAR copyright -ENCODING 169 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 7 7 1 0 -BITMAP -18 -66 -B2 -A2 -A2 -5A -3C -ENDCHAR -STARTCHAR ordfeminine -ENCODING 170 -SWIDTH 471 0 -DWIDTH 5 0 -BBX 4 5 0 2 -BITMAP -60 -10 -F0 -70 -70 -ENDCHAR -STARTCHAR guillemotleft -ENCODING 171 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -50 -A0 -50 -ENDCHAR -STARTCHAR logicalnot -ENCODING 172 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 3 1 1 -BITMAP -FC -04 -04 -ENDCHAR -STARTCHAR sfthyphen -ENCODING 173 -SWIDTH 360 0 -DWIDTH 4 0 -BBX 3 1 0 2 -BITMAP -E0 -ENDCHAR -STARTCHAR registered -ENCODING 174 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 7 7 1 0 -BITMAP -18 -66 -BA -BA -AA -42 -3C -ENDCHAR -STARTCHAR macron -ENCODING 175 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 6 -BITMAP -E0 -ENDCHAR -STARTCHAR degree -ENCODING 176 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 4 1 3 -BITMAP -40 -A0 -A0 -40 -ENDCHAR -STARTCHAR plusminus -ENCODING 177 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 6 1 0 -BITMAP -10 -10 -FC -10 -00 -FC -ENDCHAR -STARTCHAR twosuperior -ENCODING 178 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 3 5 0 2 -BITMAP -60 -20 -20 -C0 -40 -ENDCHAR -STARTCHAR threesuperior -ENCODING 179 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 3 5 0 2 -BITMAP -60 -20 -20 -A0 -40 -ENDCHAR -STARTCHAR acute -ENCODING 180 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR mu -ENCODING 181 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 5 7 1 -2 -BITMAP -90 -90 -90 -90 -E8 -80 -80 -ENDCHAR -STARTCHAR paragraph -ENCODING 182 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 4 8 1 -1 -BITMAP -70 -F0 -F0 -F0 -30 -30 -30 -30 -ENDCHAR -STARTCHAR periodcentered -ENCODING 183 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR cedilla -ENCODING 184 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 2 1 1 -2 -BITMAP -C0 -ENDCHAR -STARTCHAR onesuperior -ENCODING 185 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 1 3 1 4 -BITMAP -80 -80 -80 -ENDCHAR -STARTCHAR ordmasculine -ENCODING 186 -SWIDTH 471 0 -DWIDTH 5 0 -BBX 4 5 0 2 -BITMAP -60 -90 -90 -70 -70 -ENDCHAR -STARTCHAR guillemotright -ENCODING 187 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 4 3 1 1 -BITMAP -A0 -50 -A0 -ENDCHAR -STARTCHAR onequarter -ENCODING 188 -SWIDTH 969 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -84 -84 -88 -11 -17 -25 -43 -ENDCHAR -STARTCHAR onehalf -ENCODING 189 -SWIDTH 969 0 -DWIDTH 10 0 -BBX 8 7 1 0 -BITMAP -84 -84 -88 -16 -11 -22 -47 -ENDCHAR -STARTCHAR threequarters -ENCODING 190 -SWIDTH 969 0 -DWIDTH 10 0 -BBX 9 7 0 0 -BITMAP -6000 -2200 -2400 -A880 -4B80 -1280 -2180 -ENDCHAR -STARTCHAR questiondown -ENCODING 191 -SWIDTH 530 0 -DWIDTH 5 0 -BBX 4 7 1 0 -BITMAP -40 -00 -40 -40 -80 -80 -F0 -ENDCHAR -STARTCHAR Agrave -ENCODING 192 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -10 -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR Aacute -ENCODING 193 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -10 -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR Acircumflex -ENCODING 194 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -38 -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR Atilde -ENCODING 195 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -10 -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR Adieresis -ENCODING 196 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -28 -10 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR Aring -ENCODING 197 -SWIDTH 684 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -38 -30 -30 -28 -48 -44 -7C -84 -ENDCHAR -STARTCHAR AE -ENCODING 198 -SWIDTH 974 0 -DWIDTH 10 0 -BBX 9 7 0 0 -BITMAP -1F80 -2800 -2800 -2F80 -4800 -7800 -8F80 -ENDCHAR -STARTCHAR Ccedilla -ENCODING 199 -SWIDTH 698 0 -DWIDTH 7 0 -BBX 5 9 1 -2 -BITMAP -30 -C0 -80 -80 -80 -80 -78 -10 -30 -ENDCHAR -STARTCHAR Egrave -ENCODING 200 -SWIDTH 631 0 -DWIDTH 6 0 -BBX 5 8 1 0 -BITMAP -20 -F0 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR Eacute -ENCODING 201 -SWIDTH 631 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -F0 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR Ecircumflex -ENCODING 202 -SWIDTH 631 0 -DWIDTH 6 0 -BBX 5 8 1 0 -BITMAP -60 -F0 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR Edieresis -ENCODING 203 -SWIDTH 631 0 -DWIDTH 6 0 -BBX 5 8 1 0 -BITMAP -50 -F0 -80 -80 -F0 -80 -80 -F8 -ENDCHAR -STARTCHAR Igrave -ENCODING 204 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 1 8 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Iacute -ENCODING 205 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 1 8 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Icircumflex -ENCODING 206 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 3 8 0 0 -BITMAP -E0 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR Idieresis -ENCODING 207 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 3 8 0 0 -BITMAP -A0 -40 -40 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR Eth -ENCODING 208 -SWIDTH 774 0 -DWIDTH 8 0 -BBX 7 7 0 0 -BITMAP -78 -44 -42 -F2 -42 -46 -7C -ENDCHAR -STARTCHAR Ntilde -ENCODING 209 -SWIDTH 748 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -C8 -C8 -A8 -98 -98 -88 -ENDCHAR -STARTCHAR Ograve -ENCODING 210 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -20 -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Oacute -ENCODING 211 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -20 -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Ocircumflex -ENCODING 212 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -30 -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Otilde -ENCODING 213 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -70 -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR Odieresis -ENCODING 214 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -50 -30 -C8 -84 -84 -84 -84 -78 -ENDCHAR -STARTCHAR multiply -ENCODING 215 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 5 5 2 0 -BITMAP -90 -60 -60 -90 -08 -ENDCHAR -STARTCHAR Oslash -ENCODING 216 -SWIDTH 787 0 -DWIDTH 8 0 -BBX 6 7 1 0 -BITMAP -34 -C8 -94 -A4 -E4 -C4 -F8 -ENDCHAR -STARTCHAR Ugrave -ENCODING 217 -SWIDTH 731 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -20 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Uacute -ENCODING 218 -SWIDTH 731 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -20 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Ucircumflex -ENCODING 219 -SWIDTH 731 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -70 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Udieresis -ENCODING 220 -SWIDTH 731 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -50 -88 -88 -88 -88 -88 -88 -70 -ENDCHAR -STARTCHAR Yacute -ENCODING 221 -SWIDTH 610 0 -DWIDTH 6 0 -BBX 6 8 0 0 -BITMAP -20 -84 -48 -30 -30 -20 -20 -20 -ENDCHAR -STARTCHAR Thorn -ENCODING 222 -SWIDTH 604 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -80 -80 -F0 -88 -90 -E0 -80 -ENDCHAR -STARTCHAR germandbls -ENCODING 223 -SWIDTH 629 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -60 -90 -A0 -A0 -90 -88 -F0 -ENDCHAR -STARTCHAR agrave -ENCODING 224 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR aacute -ENCODING 225 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR acircumflex -ENCODING 226 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -30 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR atilde -ENCODING 227 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -60 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR adieresis -ENCODING 228 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -50 -00 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR aring -ENCODING 229 -SWIDTH 612 0 -DWIDTH 6 0 -BBX 5 8 0 0 -BITMAP -30 -50 -20 -70 -08 -78 -88 -78 -ENDCHAR -STARTCHAR ae -ENCODING 230 -SWIDTH 981 0 -DWIDTH 10 0 -BBX 9 5 0 0 -BITMAP -7700 -0880 -7F80 -8800 -7780 -ENDCHAR -STARTCHAR ccedilla -ENCODING 231 -SWIDTH 549 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -78 -40 -80 -40 -78 -10 -30 -ENDCHAR -STARTCHAR egrave -ENCODING 232 -SWIDTH 615 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -40 -00 -F0 -90 -F8 -80 -70 -ENDCHAR -STARTCHAR eacute -ENCODING 233 -SWIDTH 615 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -20 -00 -F0 -90 -F8 -80 -70 -ENDCHAR -STARTCHAR ecircumflex -ENCODING 234 -SWIDTH 615 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -60 -00 -F0 -90 -F8 -80 -70 -ENDCHAR -STARTCHAR edieresis -ENCODING 235 -SWIDTH 615 0 -DWIDTH 6 0 -BBX 5 7 1 0 -BITMAP -50 -00 -F0 -90 -F8 -80 -70 -ENDCHAR -STARTCHAR igrave -ENCODING 236 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 2 7 0 0 -BITMAP -80 -00 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR iacute -ENCODING 237 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 1 7 1 0 -BITMAP -80 -00 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR icircumflex -ENCODING 238 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 2 7 0 0 -BITMAP -C0 -00 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR idieresis -ENCODING 239 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 3 7 0 0 -BITMAP -A0 -00 -40 -40 -40 -40 -40 -ENDCHAR -STARTCHAR eth -ENCODING 240 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -38 -50 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR ntilde -ENCODING 241 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -30 -00 -F0 -90 -90 -90 -90 -ENDCHAR -STARTCHAR ograve -ENCODING 242 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -00 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR oacute -ENCODING 243 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -10 -00 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR ocircumflex -ENCODING 244 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -30 -00 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR otilde -ENCODING 245 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -20 -10 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR odieresis -ENCODING 246 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -30 -00 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR divide -ENCODING 247 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 4 1 1 -BITMAP -10 -00 -FC -10 -ENDCHAR -STARTCHAR oslash -ENCODING 248 -SWIDTH 611 0 -DWIDTH 6 0 -BBX 4 5 1 0 -BITMAP -F0 -90 -F0 -90 -F0 -ENDCHAR -STARTCHAR ugrave -ENCODING 249 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -40 -00 -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR uacute -ENCODING 250 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -20 -00 -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR ucircumflex -ENCODING 251 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -00 -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR udieresis -ENCODING 252 -SWIDTH 633 0 -DWIDTH 6 0 -BBX 4 7 1 0 -BITMAP -60 -00 -90 -90 -90 -90 -F0 -ENDCHAR -STARTCHAR yacute -ENCODING 253 -SWIDTH 591 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -20 -00 -10 -90 -A0 -60 -60 -40 -C0 -ENDCHAR -STARTCHAR thorn -ENCODING 254 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 9 1 -2 -BITMAP -80 -80 -F0 -88 -88 -88 -F0 -80 -80 -ENDCHAR -STARTCHAR ydieresis -ENCODING 255 -SWIDTH 591 0 -DWIDTH 6 0 -BBX 4 9 1 -2 -BITMAP -A0 -00 -10 -90 -A0 -60 -60 -40 -C0 -ENDCHAR -STARTCHAR Cacute -ENCODING 262 -SWIDTH 698 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -20 -30 -C0 -80 -80 -80 -80 -78 -ENDCHAR -STARTCHAR cacute -ENCODING 263 -SWIDTH 549 0 -DWIDTH 5 0 -BBX 5 7 0 0 -BITMAP -10 -00 -78 -40 -80 -40 -78 -ENDCHAR -STARTCHAR Ccaron -ENCODING 268 -SWIDTH 698 0 -DWIDTH 7 0 -BBX 5 8 1 0 -BITMAP -30 -30 -C0 -80 -80 -80 -80 -78 -ENDCHAR -STARTCHAR ccaron -ENCODING 269 -SWIDTH 549 0 -DWIDTH 5 0 -BBX 5 7 0 0 -BITMAP -30 -00 -78 -40 -80 -40 -78 -ENDCHAR -STARTCHAR dcroat -ENCODING 273 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -08 -08 -78 -48 -88 -48 -78 -ENDCHAR -STARTCHAR Gbreve -ENCODING 286 -SWIDTH 774 0 -DWIDTH 8 0 -BBX 6 8 1 0 -BITMAP -30 -30 -CC -80 -80 -8C -84 -78 -ENDCHAR -STARTCHAR gbreve -ENCODING 287 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 9 0 -2 -BITMAP -30 -00 -78 -48 -88 -48 -78 -08 -70 -ENDCHAR -STARTCHAR Idotaccent -ENCODING 304 -SWIDTH 294 0 -DWIDTH 3 0 -BBX 1 8 1 0 -BITMAP -80 -80 -80 -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR dotlessi -ENCODING 305 -SWIDTH 277 0 -DWIDTH 3 0 -BBX 1 5 1 0 -BITMAP -80 -80 -80 -80 -80 -ENDCHAR -STARTCHAR Lslash -ENCODING 321 -SWIDTH 562 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -40 -40 -50 -60 -C0 -40 -78 -ENDCHAR -STARTCHAR lslash -ENCODING 322 -SWIDTH 284 0 -DWIDTH 3 0 -BBX 2 7 1 0 -BITMAP -80 -80 -C0 -80 -80 -80 -80 -ENDCHAR -STARTCHAR OE -ENCODING 338 -SWIDTH 1069 0 -DWIDTH 11 0 -BBX 9 7 1 0 -BITMAP -3F80 -C800 -8800 -8F80 -8800 -8800 -7F80 -ENDCHAR -STARTCHAR oe -ENCODING 339 -SWIDTH 1022 0 -DWIDTH 10 0 -BBX 9 5 0 0 -BITMAP -7F80 -4C80 -8F80 -4C00 -7F80 -ENDCHAR -STARTCHAR Scedilla -ENCODING 350 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 9 1 -2 -BITMAP -70 -80 -80 -F0 -18 -08 -F0 -20 -60 -ENDCHAR -STARTCHAR scedilla -ENCODING 351 -SWIDTH 520 0 -DWIDTH 5 0 -BBX 5 7 0 -2 -BITMAP -70 -80 -70 -08 -70 -00 -20 -ENDCHAR -STARTCHAR Scaron -ENCODING 352 -SWIDTH 634 0 -DWIDTH 6 0 -BBX 5 8 1 0 -BITMAP -60 -70 -80 -80 -F0 -18 -08 -F0 -ENDCHAR -STARTCHAR scaron -ENCODING 353 -SWIDTH 520 0 -DWIDTH 5 0 -BBX 5 7 0 0 -BITMAP -10 -20 -70 -80 -70 -08 -70 -ENDCHAR -STARTCHAR Ydieresis -ENCODING 376 -SWIDTH 610 0 -DWIDTH 6 0 -BBX 6 8 0 0 -BITMAP -30 -84 -48 -30 -30 -20 -20 -20 -ENDCHAR -STARTCHAR Zcaron -ENCODING 381 -SWIDTH 685 0 -DWIDTH 7 0 -BBX 6 8 0 0 -BITMAP -10 -7C -04 -08 -10 -20 -40 -FC -ENDCHAR -STARTCHAR zcaron -ENCODING 382 -SWIDTH 524 0 -DWIDTH 5 0 -BBX 5 7 0 0 -BITMAP -10 -20 -78 -10 -20 -40 -F8 -ENDCHAR -STARTCHAR florin -ENCODING 402 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 6 9 0 -2 -BITMAP -0C -10 -10 -38 -10 -20 -20 -20 -C0 -ENDCHAR -STARTCHAR circumflex -ENCODING 710 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR caron -ENCODING 711 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 2 2 1 5 -BITMAP -80 -40 -ENDCHAR -STARTCHAR breve -ENCODING 728 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 6 -BITMAP -E0 -ENDCHAR -STARTCHAR dotaccent -ENCODING 729 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR ring -ENCODING 730 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 3 1 5 -BITMAP -E0 -A0 -40 -ENDCHAR -STARTCHAR ogonek -ENCODING 731 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 -2 -BITMAP -80 -ENDCHAR -STARTCHAR tilde -ENCODING 732 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 6 -BITMAP -E0 -ENDCHAR -STARTCHAR hungarumlaut -ENCODING 733 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 3 6 -BITMAP -80 -ENDCHAR -STARTCHAR Omega -ENCODING 937 -SWIDTH 764 0 -DWIDTH 8 0 -BBX 7 7 0 0 -BITMAP -18 -64 -42 -82 -42 -44 -EE -ENDCHAR -STARTCHAR pi -ENCODING 960 -SWIDTH 588 0 -DWIDTH 6 0 -BBX 6 5 0 0 -BITMAP -FC -C8 -50 -50 -18 -ENDCHAR -STARTCHAR endash -ENCODING 8211 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 5 1 0 2 -BITMAP -F8 -ENDCHAR -STARTCHAR emdash -ENCODING 8212 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 10 1 0 2 -BITMAP -FFC0 -ENDCHAR -STARTCHAR quoteleft -ENCODING 8216 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 2 1 4 -BITMAP -80 -80 -ENDCHAR -STARTCHAR quoteright -ENCODING 8217 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 2 1 5 -BITMAP -80 -80 -ENDCHAR -STARTCHAR quotesinglbase -ENCODING 8218 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 2 1 -1 -BITMAP -80 -80 -ENDCHAR -STARTCHAR quotedblleft -ENCODING 8220 -SWIDTH 518 0 -DWIDTH 5 0 -BBX 3 3 1 4 -BITMAP -20 -A0 -A0 -ENDCHAR -STARTCHAR quotedblright -ENCODING 8221 -SWIDTH 518 0 -DWIDTH 5 0 -BBX 3 2 1 5 -BITMAP -A0 -A0 -ENDCHAR -STARTCHAR quotedblbase -ENCODING 8222 -SWIDTH 518 0 -DWIDTH 5 0 -BBX 3 2 1 -1 -BITMAP -A0 -A0 -ENDCHAR -STARTCHAR dagger -ENCODING 8224 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -F8 -20 -20 -20 -20 -20 -ENDCHAR -STARTCHAR daggerdbl -ENCODING 8225 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 5 8 0 -1 -BITMAP -20 -20 -F8 -20 -20 -F8 -20 -20 -ENDCHAR -STARTCHAR bullet -ENCODING 8226 -SWIDTH 589 0 -DWIDTH 6 0 -BBX 3 3 1 2 -BITMAP -60 -E0 -60 -ENDCHAR -STARTCHAR ellipsis -ENCODING 8230 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 8 1 1 0 -BITMAP -91 -ENDCHAR -STARTCHAR perthousand -ENCODING 8240 -SWIDTH 1341 0 -DWIDTH 13 0 -BBX 13 7 0 0 -BITMAP -6200 -9400 -9400 -6800 -17F0 -14C8 -2330 -ENDCHAR -STARTCHAR guilsinglleft -ENCODING 8249 -SWIDTH 399 0 -DWIDTH 4 0 -BBX 2 3 1 1 -BITMAP -40 -80 -40 -ENDCHAR -STARTCHAR guilsinglright -ENCODING 8250 -SWIDTH 399 0 -DWIDTH 4 0 -BBX 2 3 1 1 -BITMAP -80 -40 -80 -ENDCHAR -STARTCHAR Euro -ENCODING 8364 -SWIDTH 636 0 -DWIDTH 6 0 -BBX 6 7 0 0 -BITMAP -18 -64 -40 -70 -F0 -40 -38 -ENDCHAR -STARTCHAR trademark -ENCODING 8482 -SWIDTH 1000 0 -DWIDTH 10 0 -BBX 7 3 1 4 -BITMAP -F2 -5E -52 -ENDCHAR -STARTCHAR partialdiff -ENCODING 8706 -SWIDTH 517 0 -DWIDTH 5 0 -BBX 5 6 0 0 -BITMAP -30 -10 -28 -58 -90 -60 -ENDCHAR -STARTCHAR Delta -ENCODING 8710 -SWIDTH 668 0 -DWIDTH 7 0 -BBX 6 7 0 0 -BITMAP -10 -30 -28 -48 -44 -44 -FC -ENDCHAR -STARTCHAR product -ENCODING 8719 -SWIDTH 756 0 -DWIDTH 8 0 -BBX 6 9 1 -2 -BITMAP -FC -84 -84 -84 -84 -84 -84 -84 -84 -ENDCHAR -STARTCHAR summation -ENCODING 8721 -SWIDTH 673 0 -DWIDTH 7 0 -BBX 6 9 0 -2 -BITMAP -FC -40 -20 -10 -08 -10 -20 -40 -FC -ENDCHAR -STARTCHAR minus -ENCODING 8722 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 1 1 2 -BITMAP -FC -ENDCHAR -STARTCHAR fraction -ENCODING 8725 -SWIDTH 166 0 -DWIDTH 2 0 -BBX 4 5 -1 1 -BITMAP -10 -20 -40 -40 -80 -ENDCHAR -STARTCHAR periodcentered -ENCODING 8729 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 1 1 3 -BITMAP -80 -ENDCHAR -STARTCHAR radical -ENCODING 8730 -SWIDTH 637 0 -DWIDTH 6 0 -BBX 4 6 1 0 -BITMAP -10 -10 -A0 -A0 -60 -40 -ENDCHAR -STARTCHAR infinity -ENCODING 8734 -SWIDTH 833 0 -DWIDTH 8 0 -BBX 6 3 1 1 -BITMAP -FC -24 -FC -ENDCHAR -STARTCHAR integral -ENCODING 8747 -SWIDTH 520 0 -DWIDTH 5 0 -BBX 4 9 1 -2 -BITMAP -30 -40 -40 -40 -40 -40 -40 -40 -80 -ENDCHAR -STARTCHAR approxequal -ENCODING 8776 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 3 1 1 -BITMAP -FC -60 -1C -ENDCHAR -STARTCHAR notequal -ENCODING 8800 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -08 -FC -20 -58 -40 -ENDCHAR -STARTCHAR lessequal -ENCODING 8804 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -1C -E0 -38 -04 -FC -ENDCHAR -STARTCHAR greaterequal -ENCODING 8805 -SWIDTH 837 0 -DWIDTH 8 0 -BBX 6 5 1 0 -BITMAP -E0 -1C -38 -C0 -FC -ENDCHAR -STARTCHAR lozenge -ENCODING 9674 -SWIDTH 494 0 -DWIDTH 5 0 -BBX 5 9 0 -2 -BITMAP -20 -60 -50 -90 -88 -90 -50 -60 -20 -ENDCHAR -STARTCHAR fi -ENCODING 64257 -SWIDTH 629 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -78 -40 -F8 -48 -48 -48 -48 -ENDCHAR -STARTCHAR fl -ENCODING 64258 -SWIDTH 629 0 -DWIDTH 6 0 -BBX 5 7 0 0 -BITMAP -78 -48 -E8 -48 -48 -48 -48 -ENDCHAR -STARTCHAR .notdef -ENCODING -1 -SWIDTH 600 0 -DWIDTH 6 0 -BBX 5 8 0 -2 -BITMAP -F8 -88 -88 -88 -88 -88 -88 -F8 -ENDCHAR -STARTCHAR .null -ENCODING -1 -SWIDTH 0 0 -DWIDTH 0 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR nonmarkingreturn -ENCODING -1 -SWIDTH 317 0 -DWIDTH 3 0 -BBX 1 1 0 0 -BITMAP -00 -ENDCHAR -STARTCHAR c6459 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 1 1 6 -BITMAP -A0 -ENDCHAR -STARTCHAR c6460 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR c6461 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 2 1 5 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR c6462 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 3 5 -BITMAP -00 -ENDCHAR -STARTCHAR c6463 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -STARTCHAR c6466 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 2 1 5 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR c6467 -ENCODING -1 -SWIDTH 400 0 -DWIDTH 4 0 -BBX 3 4 0 3 -BITMAP -20 -60 -A0 -60 -ENDCHAR -STARTCHAR c6468 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 3 2 1 5 -BITMAP -A0 -40 -ENDCHAR -STARTCHAR c6469 -ENCODING -1 -SWIDTH 500 0 -DWIDTH 5 0 -BBX 1 1 2 6 -BITMAP -80 -ENDCHAR -ENDFONT diff --git a/Users/Orvid/TestRunner/Kernel.cs b/Users/Orvid/TestRunner/Kernel.cs deleted file mode 100644 index 83cbc77e9b..0000000000 --- a/Users/Orvid/TestRunner/Kernel.cs +++ /dev/null @@ -1,2528 +0,0 @@ -// Disable some warning, because although they should work, they might not. -#pragma warning disable 1718 -using System; -using Cosmos.Hardware; - -namespace TestRunner -{ - public class TestRunnerKernel : Cosmos.System.Kernel - { - public Logger log = new Logger(2); - - public TestRunnerKernel() - { - base.ClearScreen = true; - } - protected override void BeforeRun() { } - - - protected override void Run() - { - Console.WriteLine("Starting Tests. " + CurrentTime()); - log.WriteString("Starting Tests. " + CurrentTime() + "\r\n\r\n"); - - #region Test the Logger - Console.WriteLine("Starting Tests of Logger. " + CurrentTime()); - log.WriteString("Starting Tests of Logger. " + CurrentTime() + "\r\n"); - log.WriteString(GTN() + "255 as Byte:"); - log.WriteData((byte)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as SByte:"); - log.WriteData(unchecked((sbyte)0xFF)); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as UShort:"); - log.WriteData((ushort)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as Short:"); - log.WriteData((short)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as UInt:"); - log.WriteData((uint)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as Int:"); - log.WriteData((int)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as ULong:"); - log.WriteData((ulong)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as Long:"); - log.WriteData((long)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as Float:"); - log.WriteData((float)0xFF); - log.WriteString("\r\n"); - log.WriteString(GTN() + "255 as Double:"); - log.WriteData((double)0xFF); - log.WriteString("\r\n"); - log.WriteString("Finished Testing Logger. " + CurrentTime() + "\r\n\r\n"); - Console.WriteLine("Finished Testing Logger. " + CurrentTime()); - #endregion - - #region Test the Operators - - #region Byte - { - Console.WriteLine("Testing Byte Comparisons. " + CurrentTime()); - log.WriteString("Starting Byte Comparison Tests. " + CurrentTime() + "\r\n"); - byte zero = 0; - byte one = 1; - - #region Variable to Variable - log.WriteString("Starting Byte Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Byte-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Byte-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Byte-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Byte-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Byte-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Byte-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Byte-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Byte-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Byte-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Byte-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Byte-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Byte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Byte-Var-Var)\r\n"); - } - log.WriteString("Finished Byte Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Byte Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Byte-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Byte-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Byte-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Byte-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Byte-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Byte-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Byte-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Byte-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Byte-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Byte-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Byte-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Byte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Byte-Var-Const)\r\n"); - } - log.WriteString("Finished Byte Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Byte Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Byte-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Byte-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Byte-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Byte-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Byte-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Byte-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Byte-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Byte-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Byte-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Byte-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Byte-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Byte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Byte-Const-Var)\r\n"); - } - log.WriteString("Finished Byte Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Byte Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Byte Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region SByte - { - Console.WriteLine("Testing SByte Comparisons. " + CurrentTime()); - log.WriteString("Starting SByte Comparison Tests. " + CurrentTime() + "\r\n"); - sbyte zero = 0; - sbyte one = 1; - - #region Variable to Variable - log.WriteString("Starting SByte Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (SByte-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (SByte-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (SByte-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (SByte-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (SByte-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (SByte-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (SByte-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (SByte-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (SByte-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (SByte-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (SByte-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (SByte-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (SByte-Var-Var)\r\n"); - } - log.WriteString("Finished SByte Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting SByte Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (SByte-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (SByte-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (SByte-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (SByte-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (SByte-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (SByte-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (SByte-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (SByte-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (SByte-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (SByte-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (SByte-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (SByte-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (SByte-Var-Const)\r\n"); - } - log.WriteString("Finished SByte Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting SByte Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (SByte-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (SByte-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (SByte-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (SByte-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (SByte-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (SByte-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (SByte-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (SByte-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (SByte-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (SByte-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (SByte-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (SByte-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (SByte-Const-Var)\r\n"); - } - log.WriteString("Finished SByte Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing SByte Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing SByte Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region UShort - { - Console.WriteLine("Testing UShort Comparisons. " + CurrentTime()); - log.WriteString("Starting UShort Comparison Tests. " + CurrentTime() + "\r\n"); - ushort zero = 0; - ushort one = 1; - - #region Variable to Variable - log.WriteString("Starting UShort Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UShort-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UShort-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UShort-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UShort-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UShort-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UShort-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UShort-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UShort-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UShort-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UShort-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UShort-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (UShort-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UShort-Var-Var)\r\n"); - } - log.WriteString("Finished UShort Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting UShort Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UShort-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UShort-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UShort-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UShort-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UShort-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UShort-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UShort-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UShort-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UShort-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UShort-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UShort-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (UShort-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UShort-Var-Const)\r\n"); - } - log.WriteString("Finished UShort Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting UShort Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UShort-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UShort-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UShort-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UShort-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UShort-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UShort-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UShort-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UShort-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UShort-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UShort-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UShort-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (UShort-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UShort-Const-Var)\r\n"); - } - log.WriteString("Finished UShort Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing UShort Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing UShort Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region Short - { - Console.WriteLine("Testing Short Comparisons. " + CurrentTime()); - log.WriteString("Starting Short Comparison Tests. " + CurrentTime() + "\r\n"); - short zero = 0; - short one = 1; - - #region Variable to Variable - log.WriteString("Starting Short Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Short-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Short-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Short-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Short-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Short-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Short-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Short-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Short-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Short-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Short-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Short-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Short-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Short-Var-Var)\r\n"); - } - log.WriteString("Finished Short Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Short Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Short-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Short-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Short-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Short-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Short-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Short-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Short-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Short-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Short-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Short-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Short-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Short-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Short-Var-Const)\r\n"); - } - log.WriteString("Finished Short Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Short Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Short-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Short-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Short-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Short-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Short-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Short-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Short-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Short-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Short-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Short-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Short-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Short-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Short-Const-Var)\r\n"); - } - log.WriteString("Finished Short Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Short Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Short Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region UInt - { - Console.WriteLine("Testing UInt Comparisons. " + CurrentTime()); - log.WriteString("Starting UInt Comparison Tests. " + CurrentTime() + "\r\n"); - uint zero = 0; - uint one = 1; - - #region Variable to Variable - log.WriteString("Starting UInt Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UInt-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UInt-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UInt-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UInt-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UInt-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UInt-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UInt-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UInt-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UInt-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UInt-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UInt-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (UInt-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UInt-Var-Var)\r\n"); - } - log.WriteString("Finished UInt Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting UInt Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UInt-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UInt-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UInt-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UInt-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UInt-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UInt-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UInt-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UInt-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UInt-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UInt-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UInt-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (UInt-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UInt-Var-Const)\r\n"); - } - log.WriteString("Finished UInt Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting UInt Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (UInt-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (UInt-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (UInt-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (UInt-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (UInt-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (UInt-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (UInt-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (UInt-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (UInt-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (UInt-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (UInt-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (UInt-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (UInt-Const-Var)\r\n"); - } - log.WriteString("Finished UInt Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing UInt Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing UInt Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region Int - { - Console.WriteLine("Testing Int Comparisons. " + CurrentTime()); - log.WriteString("Starting Int Comparison Tests. " + CurrentTime() + "\r\n"); - int zero = 0; - int one = 1; - - #region Variable to Variable - log.WriteString("Starting Int Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Int-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Int-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Int-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Int-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Int-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Int-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Int-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Int-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Int-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Int-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Int-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Int-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Int-Var-Var)\r\n"); - } - log.WriteString("Finished Int Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Int Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Int-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Int-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Int-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Int-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Int-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Int-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Int-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Int-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Int-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Int-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Int-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Int-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Int-Var-Const)\r\n"); - } - log.WriteString("Finished Int Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Int Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Int-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Int-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Int-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Int-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Int-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Int-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Int-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Int-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Int-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Int-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Int-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Int-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Int-Const-Var)\r\n"); - } - log.WriteString("Finished Int Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Int Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Int Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region ULong - { - Console.WriteLine("Testing ULong Comparisons. " + CurrentTime()); - log.WriteString("Starting ULong Comparison Tests. " + CurrentTime() + "\r\n"); - ulong zero = 0; - ulong one = 1; - - #region Variable to Variable - log.WriteString("Starting ULong Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (ULong-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (ULong-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (ULong-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (ULong-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (ULong-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (ULong-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (ULong-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (ULong-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (ULong-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (ULong-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (ULong-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (ULong-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (ULong-Var-Var)\r\n"); - } - log.WriteString("Finished ULong Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting ULong Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (ULong-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (ULong-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (ULong-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (ULong-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (ULong-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (ULong-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (ULong-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (ULong-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (ULong-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (ULong-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (ULong-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (ULong-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (ULong-Var-Const)\r\n"); - } - log.WriteString("Finished ULong Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting ULong Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (ULong-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (ULong-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (ULong-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (ULong-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (ULong-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (ULong-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (ULong-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (ULong-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (ULong-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (ULong-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (ULong-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (ULong-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (ULong-Const-Var)\r\n"); - } - log.WriteString("Finished ULong Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing ULong Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing ULong Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region Long - { - Console.WriteLine("Testing Long Comparisons. " + CurrentTime()); - log.WriteString("Starting Long Comparison Tests. " + CurrentTime() + "\r\n"); - long zero = 0; - long one = 1; - - #region Variable to Variable - log.WriteString("Starting Long Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Long-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Long-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Long-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Long-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Long-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Long-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Long-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Long-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Long-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Long-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Long-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Long-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Long-Var-Var)\r\n"); - } - log.WriteString("Finished Long Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Long Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Long-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Long-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Long-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Long-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Long-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Long-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Long-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Long-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Long-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Long-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Long-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Long-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Long-Var-Const)\r\n"); - } - log.WriteString("Finished Long Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Long Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Long-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Long-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Long-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Long-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Long-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Long-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Long-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Long-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Long-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Long-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Long-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Long-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Long-Const-Var)\r\n"); - } - log.WriteString("Finished Long Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Long Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Long Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region Float - { - Console.WriteLine("Testing Float Comparisons. " + CurrentTime()); - log.WriteString("Starting Float Comparison Tests. " + CurrentTime() + "\r\n"); - float zero = 0; - float one = 1; - - #region Variable to Variable - log.WriteString("Starting Float Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Float-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Float-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Float-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Float-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Float-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Float-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Float-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Float-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Float-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Float-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Float-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Float-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Float-Var-Var)\r\n"); - } - log.WriteString("Finished Float Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Float Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Float-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Float-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Float-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Float-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Float-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Float-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Float-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Float-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Float-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Float-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Float-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Float-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Float-Var-Const)\r\n"); - } - log.WriteString("Finished Float Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Float Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Float-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Float-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Float-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Float-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Float-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Float-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Float-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Float-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Float-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Float-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Float-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Float-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Float-Const-Var)\r\n"); - } - log.WriteString("Finished Float Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Float Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Float Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #region Double - { - Console.WriteLine("Testing Double Comparisons. " + CurrentTime()); - log.WriteString("Starting Double Comparison Tests. " + CurrentTime() + "\r\n"); - double zero = 0; - double one = 1; - - #region Variable to Variable - log.WriteString("Starting Double Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - { - if (zero != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Double-Var-Var)\r\n"); - - if (one != zero) - log.WriteString(GTN() + "Pass: one != zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Double-Var-Var)\r\n"); - } - { - if (zero == zero) - log.WriteString(GTN() + "Pass: zero == zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Double-Var-Var)\r\n"); - - if (one == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Double-Var-Var)\r\n"); - } - { - if (zero > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Double-Var-Var)\r\n"); - - if (one > zero) - log.WriteString(GTN() + "Pass: one > zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Double-Var-Var)\r\n"); - } - { - if (zero >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Double-Var-Var)\r\n"); - - if (one >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Double-Var-Var)\r\n"); - } - { - if (zero < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Double-Var-Var)\r\n"); - - if (one < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Double-Var-Var)\r\n"); - } - { - if (zero <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Double-Var-Var)\r\n"); - - if (one <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Double-Var-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Double-Var-Var)\r\n"); - } - log.WriteString("Finished Double Comparison Tests (Var to Var). " + CurrentTime() + "\r\n"); - #endregion - - #region Variable to Constant - log.WriteString("Starting Double Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - { - if (zero != 0) - log.WriteString(GTN() + "FAILURE: zero != zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Double-Var-Const)\r\n"); - - if (one != 0) - log.WriteString(GTN() + "Pass: one != zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Double-Var-Const)\r\n"); - } - { - if (zero == 0) - log.WriteString(GTN() + "Pass: zero == zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Double-Var-Const)\r\n"); - - if (one == 0) - log.WriteString(GTN() + "FAILURE: one == zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Double-Var-Const)\r\n"); - } - { - if (zero > 0) - log.WriteString(GTN() + "FAILURE: zero > zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Double-Var-Const)\r\n"); - - if (one > 0) - log.WriteString(GTN() + "Pass: one > zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Double-Var-Const)\r\n"); - } - { - if (zero >= 0) - log.WriteString(GTN() + "Pass: zero >= zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Double-Var-Const)\r\n"); - - if (one >= 0) - log.WriteString(GTN() + "Pass: one >= zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Double-Var-Const)\r\n"); - } - { - if (zero < 0) - log.WriteString(GTN() + "FAILURE: zero < zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Double-Var-Const)\r\n"); - - if (one < 0) - log.WriteString(GTN() + "FAILURE: one < zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Double-Var-Const)\r\n"); - } - { - if (zero <= 0) - log.WriteString(GTN() + "Pass: zero <= zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Double-Var-Const)\r\n"); - - if (one <= 0) - log.WriteString(GTN() + "FAILURE: one <= zero (Double-Var-Const)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Double-Var-Const)\r\n"); - } - log.WriteString("Finished Double Comparison Tests (Var to Const). " + CurrentTime() + "\r\n"); - #endregion - - #region Constant to Variable - log.WriteString("Starting Double Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - { - if (0 != zero) - log.WriteString(GTN() + "FAILURE: zero != zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero != zero (Double-Const-Var)\r\n"); - - if (1 != zero) - log.WriteString(GTN() + "Pass: one != zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one != zero (Double-Const-Var)\r\n"); - } - { - if (0 == zero) - log.WriteString(GTN() + "Pass: zero == zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero == zero (Double-Const-Var)\r\n"); - - if (1 == zero) - log.WriteString(GTN() + "FAILURE: one == zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one == zero (Double-Const-Var)\r\n"); - } - { - if (0 > zero) - log.WriteString(GTN() + "FAILURE: zero > zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero > zero (Double-Const-Var)\r\n"); - - if (1 > zero) - log.WriteString(GTN() + "Pass: one > zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one > zero (Double-Const-Var)\r\n"); - } - { - if (0 >= zero) - log.WriteString(GTN() + "Pass: zero >= zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero >= zero (Double-Const-Var)\r\n"); - - if (1 >= zero) - log.WriteString(GTN() + "Pass: one >= zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: one >= zero (Double-Const-Var)\r\n"); - } - { - if (0 < zero) - log.WriteString(GTN() + "FAILURE: zero < zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: zero < zero (Double-Const-Var)\r\n"); - - if (1 < zero) - log.WriteString(GTN() + "FAILURE: one < zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one < zero (Double-Const-Var)\r\n"); - } - { - if (0 <= zero) - log.WriteString(GTN() + "Pass: zero <= zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "FAILURE: zero <= zero (Double-Const-Var)\r\n"); - - if (1 <= zero) - log.WriteString(GTN() + "FAILURE: one <= zero (Double-Const-Var)\r\n"); - else - log.WriteString(GTN() + "Pass: one <= zero (Double-Const-Var)\r\n"); - } - log.WriteString("Finished Double Comparison Tests (Const to Var). " + CurrentTime() + "\r\n"); - #endregion - - Console.WriteLine("Finished Testing Double Comparisons. " + CurrentTime()); - log.WriteString("Finished Testing Double Comparisons. " + CurrentTime() + "\r\n\r\n"); - } - #endregion - - #endregion - - #region Test the System.Math Plug - { - // We have to compare via strings, because of the nature of doubles. - Console.WriteLine("Starting Tests for System.Math. " + CurrentTime()); - log.WriteLine("Starting Tests for System.Math " + CurrentTime()); - double d = 40.23; - double d2 = 93.210; - double d3 = -412.569; - double d4 = 0.45912; - - if (Math.Abs(d3) == 412.569) - log.WriteLine(GTN() + "Pass: System.Math.Abs(double)"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Abs(double) Got: '" + Math.Abs(d3).ToString() + "' expected '412.569'"); - - if (Math.Abs(-419.102f) == 419.102f) - log.WriteLine(GTN() + "Pass: System.Math.Abs(float)"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Abs(float) Got: '" + Math.Abs(-419.102f).ToString() + "' expected '419.102'"); - - if (Math.Acos(d4).ToString() == "1.09379195562398") - log.WriteLine(GTN() + "Pass: System.Math.Acos"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Acos Got: '" + Math.Acos(d4).ToString() + "' expected '1.09379195562398'"); - - if (Math.Asin(d4).ToString() == "0.477004371170913") - log.WriteLine(GTN() + "Pass: System.Math.Asin"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Asin Got: '" + Math.Asin(d4).ToString() + "' expected '0.477004371170913'"); - - if (Math.Atan(d4).ToString() == "0.430412185787624") - log.WriteLine(GTN() + "Pass: System.Math.Atan"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Atan Got: '" + Math.Atan(d4).ToString() + "' expected '0.430412185787624'"); - - if (Math.Atan2(d, d2).ToString() == "0.40745269951331") - log.WriteLine(GTN() + "Pass: System.Math.Atan2"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Atan2 Got: '" + Math.Atan2(d, d2).ToString() + "' expected '0.40745269951331'"); - - if (Math.Ceiling(d) == 41) - log.WriteLine(GTN() + "Pass: System.Math.Ceiling"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Ceiling Got: '" + Math.Ceiling(d).ToString() + "' expected '41'"); - - if (Math.Cos(d).ToString() == "-0.819244231260389") - log.WriteLine(GTN() + "Pass: System.Math.Cos"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Cos Got: '" + Math.Cos(d).ToString() + "' expected '-0.819244231260389'"); - - if (Math.Cosh(d).ToString() == "1.48127949589163E+17") - log.WriteLine(GTN() + "Pass: System.Math.Cosh"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Cosh Got: '" + Math.Cosh(d).ToString() + "' expected '1.48127949589163E+17'"); - - if (Math.Exp(d).ToString() == "2.96255899178325E+17") - log.WriteLine(GTN() + "Pass: System.Math.Exp"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Exp Got: '" + Math.Exp(d).ToString() + "' expected '2.96255899178325E+17'"); - - if (Math.Floor(d) == 40) - log.WriteLine(GTN() + "Pass: System.Math.Floor"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Floor Got: '" + Math.Floor(d).ToString() + "' expected '40'"); - - if (Math.Log(d).ToString() == "3.6946129859617") - log.WriteLine(GTN() + "Pass: System.Math.Log(double)"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Log(double) Got: '" + Math.Log(d).ToString() + "' expected '3.6946129859617'"); - - if (Math.Log(d, d2).ToString() == "0.814714687928411") - log.WriteLine(GTN() + "Pass: System.Math.Log(double, double)"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Log(double, double) Got: '" + Math.Log(d, d2).ToString() + "' expected '0.814714687928411'"); - - if (Math.Log10(d).ToString() == "1.60455003257126") - log.WriteLine(GTN() + "Pass: System.Math.Log10"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Log10 Got: '" + Math.Log10(d).ToString() + "' expected '1.60455003257126'"); - - if (Math.Pow(d, d2).ToString() == "3.63168804144286E+149") - log.WriteLine(GTN() + "Pass: System.Math.Pow"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Pow Got: '" + Math.Pow(d, d2).ToString() + "' expected '3.63168804144286E+149'"); - - if (Math.Round(d) == 40) - log.WriteLine(GTN() + "Pass: System.Math.Round"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Round Got: '" + Math.Round(d).ToString() + "' expected '40'"); - - if (Math.Sinh(d).ToString() == "1.48127949589163E+17") - log.WriteLine(GTN() + "Pass: System.Math.Sinh"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Sinh Got: '" + Math.Sinh(d).ToString() + "' expected '1.48127949589163E+17'"); - - if (Math.Sqrt(d).ToString() == "6.34271235355979") - log.WriteLine(GTN() + "Pass: System.Math.Sqrt"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Sqrt Got: '" + Math.Sqrt(d).ToString() + "' expected '6.34271235355979'"); - - if (Math.Tan(d).ToString() == "-0.699968013575042") - log.WriteLine(GTN() + "Pass: System.Math.Tan"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Tan Got: '" + Math.Tan(d).ToString() + "' expected '-0.699968013575042'"); - - if (Math.Tanh(d) == 1) - log.WriteLine(GTN() + "Pass: System.Math.Tanh"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Tanh Got: '" + Math.Tanh(d).ToString() + "' expected '1'"); - - if (Math.Truncate(d) == 40) - log.WriteLine(GTN() + "Pass: System.Math.Truncate"); - else - log.WriteLine(GTN() + "FAILURE: System.Math.Truncate Got: '" + Math.Truncate(d).ToString() + "' expected '40'"); - - Console.WriteLine("Finished Testing System.Math. " + CurrentTime()); - log.WriteLine("Finished Testing System.Math " + CurrentTime() + "\r\n"); - } - #endregion - - log.WriteString("Testing Finished. " + CurrentTime()); - Console.WriteLine("Tests Finished. " + CurrentTime()); - while (true) - { - - } - } - - private static uint LastTestNum = 0; - - /// - /// Gets the test number, including '.' and ' '. - /// - /// - private static string GTN() - { - return (++LastTestNum).ToString() + ". "; - } - - private static string CurrentTime() - { - string sf = "("; - switch (RTC.DayOfTheWeek) - { - case 1: - sf += "Sunday "; - break; - case 2: - sf += "Monday "; - break; - case 3: - sf += "Tuesday "; - break; - case 4: - sf += "Wednesday "; - break; - case 5: - sf += "Thursday "; - break; - case 6: - sf += "Friday "; - break; - case 7: - sf += "Saturday "; - break; - } - switch (RTC.Month) - { - case 1: - sf += "January "; - break; - case 2: - sf += "February "; - break; - case 3: - sf += "March "; - break; - case 4: - sf += "April "; - break; - case 5: - sf += "May "; - break; - case 6: - sf += "June "; - break; - case 7: - sf += "July "; - break; - case 8: - sf += "August "; - break; - case 9: - sf += "September "; - break; - case 10: - sf += "October "; - break; - case 11: - sf += "November "; - break; - case 12: - sf += "December "; - break; - } - sf += RTC.DayOfTheMonth.ToString() + ", "; - sf += RTC.Century.ToString() + RTC.Year.ToString() + " "; - sf += RTC.Hour.ToString() + ":"; - sf += RTC.Minute.ToString() + ":"; - sf += RTC.Second.ToString() + ")"; - return sf; - } - } -} diff --git a/Users/Orvid/TestRunner/Logger.cs b/Users/Orvid/TestRunner/Logger.cs deleted file mode 100644 index bd1fa8481f..0000000000 --- a/Users/Orvid/TestRunner/Logger.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware; -using Cosmos.Core; - -namespace TestRunner -{ - /// - /// Enables logging to a Com Port. - /// - public class Logger - { - private readonly Cosmos.Core.IOGroup.COM iop; - - /// - /// The default constructor. - /// - /// This should be either 1, 2, 3, or 4. - public Logger(byte comPort) - { - iop = new Cosmos.Core.IOGroup.COM(comPort); - Initialize(); - } - - private void Initialize() - { - iop.InterruptEnable.Byte = 0x00; - iop.LineControl.Byte = 0x80; - iop.Data.Byte = 0x03; - iop.InterruptEnable.Byte = 0x00; - iop.LineControl.Byte = 0x03; - iop.FIFOControl.Byte = 0xC7; - iop.ModemControl.Byte = 0x0B; - } - - private int IsTransmitEmpty() - { - return iop.LineStatus.Byte & 0x20; - } - - #region Write Data - - /// - /// Writes the specified byte to the Log. - /// - /// The byte to write. - public void WriteData(byte b) - { - // Empty loop, will allow us to timeout - for (uint i = 0; i < 1000 && (IsTransmitEmpty() == 0); i++) ; - iop.Data.Byte = b; - } - - /// - /// Writes the specified sbyte to the Log. - /// - /// The sbyte to write. - public void WriteData(sbyte b) - { - WriteData(unchecked((byte)b)); - } - - /// - /// Writes the specified ushort to the Log. - /// - /// The ushort to write. - public void WriteData(ushort s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - } - - /// - /// Writes the specified short to the Log. - /// - /// The short to write. - public void WriteData(short s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - } - - /// - /// Writes the specified uint to the Log. - /// - /// The uint to write. - public void WriteData(uint s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - WriteData(unchecked((byte)((s >> 16) & 0xFF))); - WriteData(unchecked((byte)((s >> 24) & 0xFF))); - } - - /// - /// Writes the specified int to the Log. - /// - /// The int to write. - public void WriteData(int s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - WriteData(unchecked((byte)((s >> 16) & 0xFF))); - WriteData(unchecked((byte)((s >> 24) & 0xFF))); - } - - /// - /// Writes the specified ulong to the Log. - /// - /// The ulong to write. - public void WriteData(ulong s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - WriteData(unchecked((byte)((s >> 16) & 0xFF))); - WriteData(unchecked((byte)((s >> 24) & 0xFF))); - WriteData(unchecked((byte)((s >> 32) & 0xFF))); - WriteData(unchecked((byte)((s >> 40) & 0xFF))); - WriteData(unchecked((byte)((s >> 48) & 0xFF))); - WriteData(unchecked((byte)((s >> 56) & 0xFF))); - } - - /// - /// Writes the specified long to the Log. - /// - /// The long to write. - public void WriteData(long s) - { - WriteData(unchecked((byte)(s & 0xFF))); - WriteData(unchecked((byte)((s >> 8) & 0xFF))); - WriteData(unchecked((byte)((s >> 16) & 0xFF))); - WriteData(unchecked((byte)((s >> 24) & 0xFF))); - WriteData(unchecked((byte)((s >> 32) & 0xFF))); - WriteData(unchecked((byte)((s >> 40) & 0xFF))); - WriteData(unchecked((byte)((s >> 48) & 0xFF))); - WriteData(unchecked((byte)((s >> 56) & 0xFF))); - } - - /// - /// Writes the specified float to the Log. - /// - /// The float to write. - public void WriteData(float b) - { - byte[] s = BitConverter.GetBytes(b); - WriteData(s[0]); - WriteData(s[1]); - WriteData(s[2]); - WriteData(s[3]); - } - - /// - /// Writes the specified double to the Log. - /// - /// The double to write. - public void WriteData(double b) - { - byte[] s = BitConverter.GetBytes(b); - WriteData(s[0]); - WriteData(s[1]); - WriteData(s[2]); - WriteData(s[3]); - WriteData(s[4]); - WriteData(s[5]); - WriteData(s[6]); - WriteData(s[7]); - } - - #endregion - - - /// - /// Writes the specified string to the Log, followed by EOL. - /// - /// The string to write. - public void WriteLine(string s) - { - WriteString(s + "\r\n"); - } - - /// - /// Writes the specified string to the Log. - /// - /// The string to write. - public void WriteString(string s) - { - for (int i = 0; i < s.Length; i++) - { - WriteData((byte)s[i]); - } - } - - } -} diff --git a/Users/Orvid/TestRunner/TestRunner.Cosmos b/Users/Orvid/TestRunner/TestRunner.Cosmos deleted file mode 100644 index 6fb7d178fe..0000000000 --- a/Users/Orvid/TestRunner/TestRunner.Cosmos +++ /dev/null @@ -1,62 +0,0 @@ - - - - Debug - 2.0 - {0dbe9df9-45ab-4a3c-ac13-d0240c03012d} - false - TestRunner - elf - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - false - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - Cosmos.System_Plugs - {7c64b97f-516d-4a6d-b9e1-3fe48f561409} - True - - - TestRunnerKernel - {408de7fa-c3a0-44a2-aa32-2f421ebe9025} - True - - - - - Cosmos.Core_Plugs - Cosmos.Core_Plugs.dll - ..\..\..\..\..\..\..\Application Data\Cosmos User Kit\Kernel\Cosmos.Core_Plugs.dll - True - - - Cosmos.Debug.Kernel.Plugs - Cosmos.Debug.Kernel.Plugs.dll - ..\..\..\..\..\..\..\Application Data\Cosmos User Kit\Kernel\Cosmos.Debug.Kernel.Plugs.dll - True - - - - \ No newline at end of file diff --git a/Users/Orvid/TestRunner/TestRunnerKernel.csproj b/Users/Orvid/TestRunner/TestRunnerKernel.csproj deleted file mode 100644 index 9e832b1322..0000000000 --- a/Users/Orvid/TestRunner/TestRunnerKernel.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {408DE7FA-C3A0-44A2-AA32-2F421EBE9025} - Library - Properties - TestRunner - TestRunner - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - {7C64B97F-516D-4A6D-B9E1-3FE48F561409} - Cosmos.System_Plugs - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.Hardware - - - - - \ No newline at end of file diff --git a/Users/Orvid/Utils/CharMapGenerator/CharMapGenerator.csproj b/Users/Orvid/Utils/CharMapGenerator/CharMapGenerator.csproj deleted file mode 100644 index 22641d9f22..0000000000 --- a/Users/Orvid/Utils/CharMapGenerator/CharMapGenerator.csproj +++ /dev/null @@ -1,56 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {4D7BE49B-BFD2-4586-A411-5EFC82621291} - Exe - Properties - CharMapGenerator - CharMapGenerator - v4.7.1 - Client - 512 - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - diff --git a/Users/Orvid/Utils/CharMapGenerator/Program.cs b/Users/Orvid/Utils/CharMapGenerator/Program.cs deleted file mode 100644 index 535af11806..0000000000 --- a/Users/Orvid/Utils/CharMapGenerator/Program.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; - -namespace CharMapGenerator -{ - class Program - { - static void Main(string[] args) - { - StreamReader sr = new StreamReader("mappings"); - StreamWriter sw = new StreamWriter("Out.txt"); - - string s; - string[] s2; - while (true) - { - s = sr.ReadLine(); - if (s == null) - { - break; - } - if (!s.StartsWith("#")) - { - s2 = s.Split(new char[] { '=' }); - if (s2.Length != 2) - { - if (s2.Length == 3 && s2[1] == "" && s2[2] == "" && s2[0] == "equal") - { - s2 = new string[] { s2[0], "=" }; - } - else - { - throw new Exception("Unable to split properly!"); - } - } - if (s2[1] == "\"") - { - s2[1] = "\\\""; - } - sw.WriteLine("charMapper.Add(\"" + s2[0] + "\", \"" + s2[1] + "\");"); - } - else - { - continue; - } - } - - sr.Close(); - sr.Dispose(); - sw.Flush(); - sw.Close(); - sw.Dispose(); - - } - } -} diff --git a/Users/Orvid/Utils/CharMapGenerator/Properties/AssemblyInfo.cs b/Users/Orvid/Utils/CharMapGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index f0c8cbaeaa..0000000000 --- a/Users/Orvid/Utils/CharMapGenerator/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("CharMapGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Orvid Corp.")] -[assembly: AssemblyProduct("CharMapGenerator")] -[assembly: AssemblyCopyright("Copyright © Orvid Corp. 2011")] -[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("3eed3da9-ee49-45b6-a146-111063721e55")] - -// 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/Users/Orvid/Utils/CharMapGenerator/mappings b/Users/Orvid/Utils/CharMapGenerator/mappings deleted file mode 100644 index 161cffc875..0000000000 --- a/Users/Orvid/Utils/CharMapGenerator/mappings +++ /dev/null @@ -1,262 +0,0 @@ -.undef=\u0219 -.null=\u0000 -space=\u0020 -exclam=! -quotedbl=" -numbersign=# -dollar=$ -percent=% -ampersand=& -quotesingle=' -parenleft=( -parenright=) -asterisk=* -plus=+ -comma=, -hyphen=- -period=. -slash=/ -one=1 -two=2 -three=3 -four=4 -five=5 -six=6 -seven=7 -eight=8 -nine=9 -zero=0 -colon=: -semicolon=; -less=< -equal== -greater=> -question=? -at=@ -bracketleft=[ -backslash=\u005C -bracketright=] -asciicircum=^ -underscore=_ -grave=` -braceleft={ -bar=| -braceright=} -asciitilde=~ -ltshade=\u00B0 -shade=\u00B1 -dkshade=\u00B2 -SF110000=\u00B3 -SF090000=\u00B4 -SF190000=\u00B5 -SF200000=\u00B6 -SF210000=\u00B7 -SF220000=\u00B8 -SF230000=\u00B9 -SF240000=\u00BA -SF250000=\u00BB -SF260000=\u00BC -SF270000=\u00BD -SF280000=\u00BE -SF030000=\u00BF -SF020000=\u00C0 -SF070000=\u00C1 -SF060000=\u00C2 -SF080000=\u00C3 -SF100000=\u00C4 -SF050000=\u00C5 -SF360000=\u00C6 -SF370000=\u00C7 -SF380000=\u00C8 -SF390000=\u00C9 -SF400000=\u00CA -SF410000=\u00CB -SF420000=\u00CC -SF430000=\u00CD -SF440000=\u00CE -SF450000=\u00CF -SF460000=\u00D0 -SF470000=\u00D1 -SF480000=\u00D2 -SF490000=\u00D3 -SF500000=\u00D4 -SF510000=\u00D5 -SF520000=\u00D6 -SF530000=\u00D7 -SF540000=\u00D8 -SF040000=\u00D9 -SF010000=\u00DA -block=\u00DB -dnblock=\u00DC -lfblock=\u00DD -rtblock=\u00DE -upblock=\u00DF -space0=\u0000 -vga1=\u0001 -vga2=\u0002 -vga3=\u0003 -vga4=\u0004 -vga5=\u0005 -vga6=\u0006 -vga7=\u0007 -vga8=\u0008 -vga9=\u0009 -vga10=\u000A -vga11=\u000B -vga12=\u000C -vga13=\u000D -vga14=\u000E -vga15=\u000F -righttriangle=\u0010 -lefttriangle=\u0011 -updownarrow=\u0012 -vga19=\u0013 -paragraph=\u0014 -section=\u0015 -vga22=\u0016 -vga23=\u0017 -uparrow=\u0018 -downarrow=\u0019 -vga26=\u001A -vga27=\u001B -vga28=\u001C -vga29=\u001D -vga30=\u001E -vga31=\u001F -apostrophe=\u0027 -minus=\u002D -vga127=\u007F -Ccedilla=\u0080 -udiaeresis=\u0081 -eacute=\u0082 -acircumflex=\u0083 -adiaeresis=\u0084 -agrave=\u0085 -aring=\u0086 -ccedilla=\u0087 -ecircumflex=\u0088 -ediaeresis=\u0089 -egrave=\u008A -idiaeresis=\u008B -icircumflex=\u008C -igrave=\u008D -Adiaeresis=\u008E -Aring=\u008F -Eacute=\u0090 -ae=\u0091 -AE=\u0092 -ocircumflex=\u0093 -odiaeresis=\u0094 -ograve=\u0095 -ucircumflex=\u0096 -ugrave=\u0097 -ydiaeresis=\u0098 -Odiaeresis=\u0099 -Udiaeresis=\u009A -cent=\u009B -sterling=\u009C -yen=\u009D -vga158=\u009E -vga159=\u009F -aacute=\u00A0 -iacute=\u00A1 -oacute=\u00A2 -uacute=\u00A3 -vga164=\u00A4 -vga165=\u00A5 -vga166=\u00A6 -vga167=\u00A7 -questiondown=\u00A8 -hook=\u00A9 -notsign=\u00AA -onehalf=\u00AB -onequarter=\u00AC -exclamdown=\u00AD -guillemotleft=\u00AE -guillemotright=\u00AF -raster1=\u00B0 -raster2=\u00B1 -raster3=\u00B2 -udline=\u00B3 -udlline=\u00B4 -udLline=\u00B5 -UDlline=\u00B6 -Dlline=\u00B7 -dLline=\u00B8 -UDLline=\u00B9 -UDline=\u00BA -DLline=\u00BB -ULline=\u00BC -Ulline=\u00BD -uLline=\u00BE -dlline=\u00BF -urlline=\u00C1 -rdlline=\u00C2 -urdline=\u00C3 -rlline=\u00C4 -urdlline=\u00C5 -uRdline=\u00C6 -UrDline=\u00C7 -URline=\u00C8 -RDline=\u00C9 -URLline=\u00CA -RDLline=\u00CB -URDline=\u00CC -RLline=\u00CD -URDLline=\u00CE -uRLline=\u00CF -Urlline=\u00D0 -RdLline=\u00D1 -rDlline=\u00D2 -Urline=\u00D3 -uRline=\u00D4 -Rdline=\u00D5 -rDline=\u00D6 -UrDlline=\u00D7 -uRdLline=\u00D8 -urline=\u00D9 -rdline=\u00DA -fullblock=\u00DB -bottomblock=\u00DC -leftblock=\u00DD -rightblock=\u00DE -topblock=\u00DF -vga224=\u00E0 -vga225=\u00E1 -vga226=\u00E2 -vga227=\u00E3 -vga228=\u00E4 -vga229=\u00E5 -vga230=\u00E6 -vga231=\u00E7 -vga232=\u00E8 -vga233=\u00E9 -vga234=\u00EA -vga235=\u00EB -vga236=\u00EC -vga237=\u00ED -vga238=\u00EE -vga239=\u00EF -isequal=\u00F0 -plusminus=\u00F1 -vga242=\u00F2 -vga243=\u00F3 -vga244=\u00F4 -vga245=\u00F5 -division=\u00F6 -vga247=\u00F7 -degree=\u00F8 -smalldot=\u00F9 -smallerdot=\u00FA -vga251=\u00FB -vga252=\u00FC -twosuperior=\u00FD -bullet=\u00FE -space255=\u00FF -currency=\u00A4 -nonbreakingspace=\u00A0 -brokenbar=\u00A6 -dieresis=\u0308 -copyright=\u00A9 -ordfeminine=\u00AA -logicalnot=\u00AC diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/GeneralIntegerImpl.Test.csproj b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/GeneralIntegerImpl.Test.csproj deleted file mode 100644 index a581f94354..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/GeneralIntegerImpl.Test.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - Debug - x86 - - - 2.0 - {20E93EC6-9F53-4EE3-8062-1DF038B35631} - Library - Properties - GeneralIntegerImpl.Test - GeneralIntegerImpl.Test - v4.7.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - x86 - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - x86 - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - 3.5 - - - - - False - - - - - - - - - - - {B1CDFDE6-0565-4E9C-A03B-E60911992E3B} - GeneralIntegerImpl - - - - - diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/Properties/AssemblyInfo.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/Properties/AssemblyInfo.cs deleted file mode 100644 index 6487ffa566..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +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("GeneralIntegerImpl.Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GeneralIntegerImpl.Test")] -[assembly: AssemblyCopyright("Copyright © 2011")] -[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("326a4113-bb9e-40dc-a286-cbd716fc7004")] - -// 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.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt16.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt16.cs deleted file mode 100644 index ed4aeff52d..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt16.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace GeneralIntegerImpl.Test -{ - [TestClass] - public class UnitTestOfInt16 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("+1")); - - // Parse -1 - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("-1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("-0")); - - // Parse Int16.MinValue - Assert.AreEqual(-32768, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("-32768")); - - // Parse Int16.MaxValue - Assert.AreEqual(32767, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("32767")); - - // Parse +Int16.MaxValue - Assert.AreEqual(32767, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("+32767")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 32768 - //short.Parse("32768"); - Assert.AreEqual(32768, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("32768")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -32769 - //short.Parse("-32769"); - Assert.AreEqual(-32769, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("-32769")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //short.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - short result; - string strValue = "2A"; - Assert.AreEqual(false, short.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - return; - } - - [TestMethod] - public void FormatSupport() - { - // Parse Exponent - short result; - Assert.AreEqual(true, short.TryParse("1E0", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(1, result); - Assert.AreEqual(true, short.TryParse("1E1", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(10, result); - - Assert.AreEqual(1, short.Parse("1E0", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("1E0")); - - Assert.AreEqual(1, short.Parse("1E1", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(10, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("1E1")); - - // Parse 1.0 - Assert.AreEqual(1, short.Parse("1.0", System.Globalization.NumberStyles.AllowDecimalPoint)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int16Impl.Parse("1.0")); - - return; - } - } - - [TestClass] - public class UnitTestOfUInt16 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("+1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("-0")); - - // Parse UInt16.MaxValue - Assert.AreEqual(65535, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("65535")); - - // Parse +UInt16.MaxValue - Assert.AreEqual(65535, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("+65535")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 65536 - //ushort.Parse("65536"); - Assert.AreEqual(65536, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("65536")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -1 - //short.Parse("-1"); - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("-1")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //ushort.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - ushort result; - Assert.AreEqual(false, ushort.TryParse("2A", out result)); - Assert.AreEqual(0, result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt16Impl.TryParse("2A", out result)); - Assert.AreEqual(0, result); - - return; - } - } -} diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt32.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt32.cs deleted file mode 100644 index 6b2793ad53..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt32.cs +++ /dev/null @@ -1,202 +0,0 @@ -using System; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace GeneralIntegerImpl.Test -{ - [TestClass] - public class UnitTestOfInt32 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("+1")); - - // Parse -1 - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("-1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("-0")); - - // Parse Int32.MinValue - Assert.AreEqual(-2147483648, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("-2147483648")); - - // Parse Int32.MaxValue - Assert.AreEqual(2147483647, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("2147483647")); - - // Parse +Int32.MaxValue - Assert.AreEqual(2147483647, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("+2147483647")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 2147483648 - //short.Parse("2147483648"); - Assert.AreEqual(2147483648, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("2147483648")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -2147483649 - //short.Parse("-2147483649"); - Assert.AreEqual(-2147483649, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("-2147483649")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //int.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - int result; - string strValue = "2A"; - Assert.AreEqual(false, int.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - return; - } - - [TestMethod] - public void FormatSupport() - { - // Parse Exponent - short result; - Assert.AreEqual(true, short.TryParse("1E0", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(1, result); - Assert.AreEqual(true, short.TryParse("1E1", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(10, result); - - Assert.AreEqual(1, short.Parse("1E0", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("1E0")); - - Assert.AreEqual(1, short.Parse("1E1", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(10, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("1E1")); - - // Parse 1.0 - Assert.AreEqual(1, short.Parse("1.0", System.Globalization.NumberStyles.AllowDecimalPoint)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int32Impl.Parse("1.0")); - - return; - } - } - - [TestClass] - public class UnitTestOfUInt32 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("+1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("-0")); - - // Parse UInt32.MaxValue - Assert.AreEqual(4294967295, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("4294967295")); - - // Parse +UInt32.MaxValue - Assert.AreEqual(4294967295, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("+4294967295")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 4294967296 - //uint.Parse("4294967296"); - Assert.AreEqual(4294967296, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("4294967296")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -1 - //short.Parse("-1"); - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("-1")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //uint.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - uint result; - Assert.AreEqual(false, uint.TryParse("2A", out result)); - // Can not pass, since Int32.0 != UInt32.0, :( - // Assert.AreEqual(0, result); - Assert.IsTrue(0 == result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt32Impl.TryParse("2A", out result)); - // Can not pass, since Int32.0 != UInt32.0, :( - // Assert.AreEqual(0, result); - Assert.IsTrue(0 == result); - - return; - } - } -} diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt8.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt8.cs deleted file mode 100644 index 56581d3a31..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.Test/UnitTestOfInt8.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace GeneralIntegerImpl.Test -{ - [TestClass] - public class UnitTestOfInt8 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("+1")); - - // Parse -1 - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("-1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("-0")); - - // Parse Int8.MinValue - Assert.AreEqual(-128, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("-128")); - - // Parse Int8.MaxValue - Assert.AreEqual(127, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("127")); - - // Parse +Int8.MaxValue - Assert.AreEqual(127, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("+127")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 128 - //sbyte.Parse("128"); - Assert.AreEqual(128, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("128")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -129 - //sbyte.Parse("-129"); - Assert.AreEqual(-129, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("-129")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //sbyte.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - sbyte result; - string strValue = "2A"; - Assert.AreEqual(false, sbyte.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.TryParse(strValue, out result)); - Assert.AreEqual(0, result); - - return; - } - - [TestMethod] - public void FormatSupport() - { - // Parse Exponent - sbyte result; - Assert.AreEqual(true, sbyte.TryParse("1E0", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(1, result); - Assert.AreEqual(true, sbyte.TryParse("1E1", System.Globalization.NumberStyles.AllowExponent, null, out result)); - Assert.AreEqual(10, result); - - Assert.AreEqual(1, sbyte.Parse("1E0", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("1E0")); - - Assert.AreEqual(1, sbyte.Parse("1E1", System.Globalization.NumberStyles.AllowExponent)); - Assert.AreEqual(10, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("1E1")); - - // Parse 1.0 - Assert.AreEqual(1, sbyte.Parse("1.0", System.Globalization.NumberStyles.AllowDecimalPoint)); - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("1.0")); - - return; - } - } - - [TestClass] - public class UnitTestOfUInt8 - { - [TestMethod] - public void ParseSpecialValues() - { - // Parse 1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("1")); - - // Parse +1 - Assert.AreEqual(1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("+1")); - - // Parse 0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("0")); - - // Parse +0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("+0")); - - // Parse -0 - Assert.AreEqual(0, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("-0")); - - // Parse UInt8.MaxValue - Assert.AreEqual(255, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("255")); - - // Parse +UInt8.MaxValue - Assert.AreEqual(255, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("+255")); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseOverflowValue() - { - // Parse 256 - //sbyte.Parse("256"); - Assert.AreEqual(256, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("256")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.OverflowException))] - public void ParseUnderflowValue() - { - // Parse -1 - //sbyte.Parse("-1"); - Assert.AreEqual(-1, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.Parse("-1")); - Assert.Fail("Should generate System.OverflowException"); - - return; - } - - [TestMethod] - [ExpectedException(typeof(System.FormatException))] - public void ParseInvalidValue() - { - // Parse 2A - //sbyte.Parse("2A"); - Cosmos.IL2CPU.IL.CustomImplementations.System.Int8Impl.Parse("2A"); - Assert.Fail("Should generate System.FormatException"); - - return; - } - - [TestMethod] - public void TryParseInvalidValue() - { - // Parse 2A - byte result; - Assert.AreEqual(false, byte.TryParse("2A", out result)); - Assert.AreEqual(0, result); - - Assert.AreEqual(false, Cosmos.IL2CPU.IL.CustomImplementations.System.UInt8Impl.TryParse("2A", out result)); - Assert.AreEqual(0, result); - - return; - } - } -} diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.cs deleted file mode 100644 index 95960c396b..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.cs +++ /dev/null @@ -1,423 +0,0 @@ -using System; -using System.Globalization; -using System.Text; -using IL2CPU.API; - -namespace Cosmos.IL2CPU.IL.CustomImplementations.System -{ - [Plug(Target = typeof(sbyte))] - public static class Int8Impl - { - public static string ToString(ref sbyte aThis) - { - bool bNegative = false; - - sbyte aValue = aThis; - - if (aValue < 0) - { - bNegative = true; - aValue *= -1; - } - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out sbyte result) - { - // Todo, consider how to implemente style and provider - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out sbyte result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch(Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static sbyte Parse(string s) - { - Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s); - - if (result > sbyte.MaxValue || result < sbyte.MinValue) - { - throw new OverflowException(); - } - - return (sbyte)result; - } - } - - [Plug(Target = typeof(byte))] - public static class UInt8Impl - { - public static string ToString(ref byte aThis) - { - byte aValue = aThis; - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out byte result) - { - // Todo, consider how to implemente style and provider - // Exponent, "1E0", "1e3"... - // Decimal point "1.0", "3.5" - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out byte result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch (Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static byte Parse(string s) - { - UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s); - - if (result > byte.MaxValue) - { - throw new OverflowException(); - } - - return (byte)result; - } - } - - [Plug(Target = typeof(short))] - public static class Int16Impl - { - public static string ToString(ref short aThis) - { - bool bNegative = false; - - short aValue = aThis; - - if (aValue < 0) - { - bNegative = true; - aValue *= -1; - } - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out short result) - { - // Todo, consider how to implemente style and provider - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out short result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch (Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static short Parse(string s) - { - Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s); - - if (result > short.MaxValue || result < short.MinValue) - { - throw new OverflowException(); - } - - return (short)result; - } - } - - [Plug(Target = typeof(ushort))] - public static class UInt16Impl - { - public static string ToString(ref ushort aThis) - { - ushort aValue = aThis; - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out ushort result) - { - // Todo, consider how to implemente style and provider - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out ushort result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch (Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static ushort Parse(string s) - { - UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s); - - if (result > ushort.MaxValue) - { - throw new OverflowException(); - } - - return (ushort)result; - } - } - - [Plug(Target = typeof(int))] - public static class Int32Impl - { - public static string ToString(ref int aThis) - { - bool bNegative = false; - - int aValue = aThis; - - if (aValue < 0) - { - bNegative = true; - aValue *= -1; - } - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out short result) - { - // Todo, consider how to implemente style and provider - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out int result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch (Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static int Parse(string s) - { - Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s); - - if (result > int.MaxValue || result < int.MinValue) - { - throw new OverflowException(); - } - - return (int)result; - } - } - - [Plug(Target = typeof(uint))] - public static class UInt32Impl - { - public static string ToString(ref uint aThis) - { - uint aValue = aThis; - - return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false); - } - - public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out uint result) - { - // Todo, consider how to implemente style and provider - throw new NotImplementedException(); - - //return TryParse(s, out result); - } - - public static bool TryParse(string s, out uint result) - { - bool bCanParse = false; - result = 0; - - try - { - result = Parse(s); - bCanParse = true; - } - catch (Exception) - { - // Something wrong - } - - return bCanParse; - } - - public static uint Parse(string s) - { - UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s); - - if (result > uint.MaxValue) - { - throw new OverflowException(); - } - - return (uint)result; - } - } - - internal static class GeneralIntegerImplByUInt64 - { - internal static Int64 ParseSignedInteger(string s) - { - bool bNegative; - Int64 result = (Int64)ParseInteger(s, out bNegative); - - if (bNegative) - result *= -1; - - return result; - } - - internal static UInt64 ParseUnsignedInteger(string s) - { - bool bNegative; - UInt64 result = ParseInteger(s, out bNegative); - - if (bNegative && result != 0) - { - throw new OverflowException(); - } - - return result; - } - - /// - /// ParseInteger - /// Sole algorithm implementation of "integer Parse(string)" - /// - /// - /// - /// - private static UInt64 ParseInteger(string s, out bool bNegative) - { - UInt64 result = 0; - - int nParseStartPos = 0; - bNegative = false; - - if (s.Length >= 1) - { - if (s[0] == '+') - { - nParseStartPos = 1; - } - else if (s[0] == '-') - { - nParseStartPos = 1; - bNegative = true; - } - } - - for (int i = nParseStartPos; i < s.Length; i++) - { - sbyte ind = (sbyte)(s[i] - '0'); - if (ind < 0 || ind > 9) - { - throw new FormatException("Digit " + s[i] + " not found"); - } - - result = (result * 10) + (UInt64)ind; - } - - return result; - } - - /// - /// ToString - /// Sole algorithm implementation of "string ToString(integer)" - /// - /// - /// - /// - internal static string ToString(UInt64 aValue, bool bIsNegative) - { - char[] xResultChars = new char[21]; // 64 bit UInteger convert to string, with sign symble, max length is 21. - int xCurrentPos = xResultChars.Length - 1; - while (aValue > 0) - { - byte xPos = (byte)(aValue % 10); - aValue /= 10; - xResultChars[xCurrentPos] = (char)('0' + xPos); - xCurrentPos -= 1; - } - - if (bIsNegative) - { - xResultChars[xCurrentPos] = '-'; - xCurrentPos -= 1; - } - - return new String(xResultChars, xCurrentPos + 1, xResultChars.Length - xCurrentPos - 1); - } - } -} diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.csproj b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.csproj deleted file mode 100644 index 37b15363a0..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/GeneralIntegerImpl.csproj +++ /dev/null @@ -1,40 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {B1CDFDE6-0565-4E9C-A03B-E60911992E3B} - Library - Properties - GeneralIntegerImpl - GeneralIntegerImpl - v4.7.1 - 512 - - - - - - - - - - - - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - IL2CPU.API - - - - - diff --git a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/Properties/AssemblyInfo.cs b/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/Properties/AssemblyInfo.cs deleted file mode 100644 index 7197681626..0000000000 --- a/Users/Pegasusplus/Cosmos.IL2CPU.Plugs/GeneralIntegerImpl/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("GeneralIntegerImpl")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GeneralIntegerImpl")] -[assembly: AssemblyCopyright("Copyright © 2011")] -[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("3aefa4be-d51d-4dfe-8e97-95f01c5ca105")] - -// 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/Users/ReadMe.txt b/Users/ReadMe.txt deleted file mode 100644 index 96d6a602d1..0000000000 --- a/Users/ReadMe.txt +++ /dev/null @@ -1,4 +0,0 @@ -This directory and all sub directories are user directories and not part of Cosmos itself. - -They are provided for convenience of sharing test and working code. As github allows distributed repos, we may -move these out in the future. diff --git a/Users/SSchocke/SSchockeTest/AssemblyInfo.cs b/Users/SSchocke/SSchockeTest/AssemblyInfo.cs deleted file mode 100644 index 6848b03ade..0000000000 --- a/Users/SSchocke/SSchockeTest/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -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("Package Name")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Company")] -[assembly: AssemblyProduct("Package Name")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] -[assembly: NeutralResourcesLanguage("en-US")] - -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - - - diff --git a/Users/SSchocke/SSchockeTest/Kernel.cs b/Users/SSchocke/SSchockeTest/Kernel.cs deleted file mode 100644 index bd3900e6f5..0000000000 --- a/Users/SSchocke/SSchockeTest/Kernel.cs +++ /dev/null @@ -1,633 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; -using Cosmos.Core; -using System.Net; -using Cosmos.Hardware; -using Cosmos.Hardware.Drivers.PCI.Network; -using Cosmos.System.Network; -using IPv4 = Cosmos.System.Network.IPv4; - -namespace SSchockeTest -{ - public class Kernel : Sys.Kernel - { - public Kernel() - { - ClearScreen = false; - } - //public class DictIntComparer : IEqualityComparer - //{ - // public bool Equals(int x, int y) - // { - // return x == y; - // } - - // public int GetHashCode(int obj) - // { - // return obj; - // } - //} - - //private Dictionary testDict; - //private DictIntComparer testDictComparer; - - //public class IntMap : Map - //{ - // protected override bool keysEqual(int key1, int key2) - // { - // return (key1 == key2); - // } - //} - //public class StringMap : Map - //{ - // protected override bool keysEqual(string key1, string key2) - // { - // return (key1 == key2); - // } - //} - - //public float Pow(float x, float y) - //{ - // if (y == 0) - // { - // return 1; - // } - // else if (y == 1) - // { - // return x; - // } - // else - // { - // float xResult = x; - - // for (int i = 2; i <= y; i++) - // { - // xResult = xResult * x; - // } - - // return xResult; - // } - //} - //private float Sqrt(float d) - //{ - // if ((d < 0) || (float.IsNaN(d) == true) || (float.IsNegativeInfinity(d) == true)) - // { - // return float.NaN; - // } - // if (float.IsPositiveInfinity(d) == true) - // { - // return float.PositiveInfinity; - // } - // if (d == 0) - // { - // return 0; - // } - // if (d == 1) - // { - // return 1; - // } - - // string strD = d.ToString(); - // int D = strD.Length; - // int n = 0; - // float x; - // if ((D % 2) == 0) - // { - // n = (D - 2) / 2; - // x = 6.0f * Pow(10f, n); - // } - // else - // { - // n = (D - 1) / 2; - // x = 2.0f * Pow(10f, n); - // } - // int precision = (strD.Length > 6 ? strD.Length : 6); - - // return x; - //} - - //internal class BaseClass - //{ - // public int baseField; - - // internal BaseClass() - // { - // initFields(); - // } - - // protected virtual void initFields() - // { - // baseField = 1; - // } - //} - //internal class SubClass : BaseClass - //{ - // public int subField; - - // internal SubClass() - // : base() - // { - // } - - // protected override void initFields() - // { - // base.initFields(); - // subField = 2; - // } - //} - //internal class SubSubClass : SubClass - //{ - // public int subsubField; - - // internal SubSubClass() - // :base() - // { - // } - - // protected override void initFields() - // { - // base.initFields(); - // subsubField = 3; - // } - //} - - protected override void BeforeRun() - { - Console.WriteLine("SSchocke Test Playground"); - - Console.WriteLine("Finding network devices..."); - AMDPCNetII.FindAll(); - - NetworkDevice nic = NetworkDevice.Devices[0]; - - IPv4.Address myIP = new IPv4.Address(192, 168, 1, 51); - IPv4.Address mySubnet = new IPv4.Address(255, 255, 255, 0); - IPv4.Address myGateway = new IPv4.Address(192, 168, 1, 1); - IPv4.Config myConfig = new IPv4.Config(myIP, mySubnet, myGateway); - - NetworkStack.ConfigIP(nic, myConfig); - nic.Enable(); - - Console.WriteLine("Init Done... Starting main loop"); - } - - protected override void Run() - { - //SubSubClass instance = new SubSubClass(); - - //Console.WriteLine("BaseClass.field = " + instance.baseField); - //Console.WriteLine("SubClass.field = " + instance.subField); - //Console.WriteLine("SubSubClass.field = " + instance.subsubField); - - //Stop(); - - //RunSqrtTest(); - //FloatingPointTest(); - //MapTest(); - //UInt64Test(10, 20); - //DoubleTest(10.0, 20.0); - //TestDoubleSupport(); - //while (true) - //{ - // NetworkStack.Update(); - //} - - //Stop(); - } - - private static void TestDoubleSupport() - { - double val = Double.PositiveInfinity; - if (Double.IsPositiveInfinity(val) == true) - { - Console.WriteLine("Double.IsPositiveInfinity() returns true"); - } - else - { - Console.WriteLine("Double.IsPositiveInfinity() returns false"); - } - if (Double.IsInfinity(val) == true) - { - Console.WriteLine("Double.IsInfinity() returns true"); - } - else - { - Console.WriteLine("Double.IsInfinity() returns false"); - } - val = Double.NegativeInfinity; - if (Double.IsNegativeInfinity(val) == true) - { - Console.WriteLine("Double.IsNegativeInfinity() returns true"); - } - else - { - Console.WriteLine("Double.IsNegativeInfinity() returns false"); - } - if (Double.IsInfinity(val) == true) - { - Console.WriteLine("Double.IsInfinity() returns true"); - } - else - { - Console.WriteLine("Double.IsInfinity() returns false"); - } - } - - //private void UInt64Test(UInt64 paramVal1, UInt64 paramVal2) - //{ - // UInt64 val1, val2, val3, val4, val5; - - // Console.WriteLine("UInt64 testing"); - // val1 = 1; - // val2 = 2; - // val3 = 3; - // val4 = 4; - // val5 = paramVal1 * paramVal2; - - // Console.WriteLine("paramVal1 = " + paramVal1.ToString()); - // Console.WriteLine("paramVal2 = " + paramVal2.ToString()); - // Console.WriteLine("val1 = " + val1.ToString()); - // Console.WriteLine("val2 = " + val2.ToString()); - // Console.WriteLine("val3 = " + val3.ToString()); - // Console.WriteLine("val4 = " + val4.ToString()); - // Console.WriteLine("val5 = " + val5.ToString()); - - // Stop(); - //} - - //private void DoubleTest(Double paramVal1, Double paramVal2) - //{ - // Double val1, val2, val3, val4, val5; - - // Console.WriteLine("Double testing"); - // val1 = 1; - // val2 = 2; - // val3 = 3; - // val4 = 4; - // val5 = paramVal1 * paramVal2; - - // Console.WriteLine("paramVal1 = " + paramVal1.ToString()); - // Console.WriteLine("paramVal2 = " + paramVal2.ToString()); - // Console.WriteLine("val1 = " + val1.ToString()); - // Console.WriteLine("val2 = " + val2.ToString()); - // Console.WriteLine("val3 = " + val3.ToString()); - // Console.WriteLine("val4 = " + val4.ToString()); - // Console.WriteLine("val5 = " + val5.ToString()); - - // Stop(); - //} - - //private string FtoA(float val) - //{ - // if (val == 0.0f) return "0.0"; - // if (Single.IsNaN(val) == true) return "NaN"; - // if (Single.IsPositiveInfinity(val) == true) return "Infinity"; - // if (Single.IsNegativeInfinity(val) == true) return "-Infinity"; - - // byte[] singleBytes = BitConverter.GetBytes(val); - // Int32 hexVal = BitConverter.ToInt32(singleBytes, 0); - // Int32 mantissa, intPart = 0, fracPart = 0; - // Int32 exp2; - - // exp2 = ((hexVal >> 23) & 0xFF) - 127; - // mantissa = (hexVal & 0xFFFFFF) | 0x800000; - - // if (exp2 >= 31) - // { - // return "Single Overrange"; - // } - // else if (exp2 < -23) - // { - // return "Single Underrange"; - // } - // else if (exp2 >= 23) - // { - // intPart = mantissa << (exp2 - 23); - // } - // else if (exp2 >= 0) - // { - // intPart = mantissa >> (23 - exp2); - // fracPart = (mantissa << (exp2 + 1)) & 0xFFFFFF; - // } - // else - // { - // fracPart = (mantissa & 0xFFFFFF) >> (-(exp2 + 1)); - // } - - // string result = ""; - // if (hexVal < 0) - // { - // result += "-"; - // } - // result += ((UInt32)intPart).ToString(); - // int used_digits = ((UInt32)intPart).ToString().Length; - // result += "."; - // if (fracPart == 0) - // { - // result += "0"; - // return result; - // } - - // if (used_digits >= 7) - // { - // used_digits = 6; - // } - // for (int m = used_digits; m < 7; m++) - // { - // fracPart = (fracPart << 3) + (fracPart << 1); - // char p = (char)((fracPart >> 24) + '0'); - // result += p; - - // fracPart &= 0xFFFFFF; - // } - // fracPart = (fracPart << 3) + (fracPart << 1); - // char remain = (char)((fracPart >> 24) + '0'); - // if ((remain > '5') && (result[result.Length - 1] > '0')) - // { - // char[] answer = result.ToCharArray(); - // int digitPos = answer.Length - 1; - // char digit = result[digitPos]; - // answer[digitPos] = (char)(digit + 1); - // while (answer[digitPos] > '9') - // { - // answer[digitPos] = '0'; - // digitPos--; - // digit = result[digitPos]; - // if (digit == '.') - // { - // digitPos--; - // digit = result[digitPos]; - // } - // answer[digitPos] = (char)(digit + 1); - // } - - // result = new String(answer); - // } - - // while (result[result.Length - 1] == '0') - // { - // result = result.Substring(0, result.Length - 1); - // } - - // return result; - //} - //private string DtoA(double val) - //{ - // if (val == 0.0f) return "0.0"; - // if (Double.IsNaN(val) == true) return "NaN"; - // if (Double.IsPositiveInfinity(val) == true) return "Infinity"; - // if (Double.IsNegativeInfinity(val) == true) return "-Infinity"; - - // byte[] doubleBytes = BitConverter.GetBytes(val); - // Int64 hexVal = BitConverter.ToInt64(doubleBytes, 0); - // Int64 mantissa, intPart = 0, fracPart = 0; - // Int32 exp2; - - // exp2 = (int)((hexVal >> 52) & 0x07FF) - 1023; - // mantissa = (hexVal & 0x1FFFFFFFFFFFFF) | 0x10000000000000; - - // if (exp2 >= 63) - // { - // return "Double Overrange"; - // } - // else if (exp2 < -52) - // { - // return "Double Underrange"; - // } - // else if (exp2 >= 52) - // { - // intPart = mantissa << (exp2 - 52); - // } - // else if (exp2 >= 0) - // { - // intPart = mantissa >> (52 - exp2); - // fracPart = (mantissa << (exp2 + 1)) & 0x1FFFFFFFFFFFFF; - // } - // else - // { - // fracPart = (mantissa & 0x1FFFFFFFFFFFFF) >> (-(exp2 + 1)); - // } - - // string result = ""; - // if (hexVal < 0) - // { - // result += "-"; - // } - // result += ((UInt64)intPart).ToString(); - // int used_digits = ((UInt64)intPart).ToString().Length; - // result += "."; - // if (fracPart == 0) - // { - // result += "0"; - // return result; - // } - - // if (used_digits >= 15) - // { - // used_digits = 14; - // } - // for (int m = used_digits; m < 15; m++) - // { - // fracPart = (fracPart << 3) + (fracPart << 1); - // char p = (char)(((fracPart >> 53) & 0xFF) + '0'); - // result += p; - - // fracPart &= 0x1FFFFFFFFFFFFF; - // } - // fracPart = (fracPart << 3) + (fracPart << 1); - // char remain = (char)((fracPart >> 53) + '0'); - // if ((remain > '5') && (result[result.Length - 1] > '0')) - // { - // char[] answer = result.ToCharArray(); - // int digitPos = answer.Length - 1; - // char digit = result[digitPos]; - // answer[digitPos] = (char)(digit + 1); - // while (answer[digitPos] > '9') - // { - // answer[digitPos] = '0'; - // digitPos--; - // digit = result[digitPos]; - // if (digit == '.') - // { - // digitPos--; - // digit = result[digitPos]; - // } - // answer[digitPos] = (char)(digit + 1); - // } - - // result = new String(answer); - // } - - // while (result[result.Length - 1] == '0') - // { - // result = result.Substring(0, result.Length - 1); - // } - - // return result; - //} - - //private void MapTest() - //{ - // Console.WriteLine("Map test"); - // var testMap = new IntMap(); - // Console.WriteLine("Map Item Count = " + testMap.Count); - // testMap.Add(1, "Hello"); - // Console.WriteLine("Map Item Count = " + testMap.Count); - // testMap.Add(2, "Hello Again"); - // Console.WriteLine("Map Item Count = " + testMap.Count); - // testMap.Add(3, "Goodbye"); - // Console.WriteLine("Map Item Count = " + testMap.Count); - // for (int j = 4; j < 20; j++) - // { - // testMap.Add(j, "Test " + j.ToString()); - // } - // Console.WriteLine("Map Item Count = " + testMap.Count); - - // int[] keys = testMap.Keys; - // for (int i = 0; i < keys.Length; i++) - // { - // Console.WriteLine(testMap[keys[i]]); - // } - - // Console.ReadLine(); - - // testMap.Remove(10); - // testMap.Remove(19); - // Console.WriteLine("Map Item Count = " + testMap.Count); - - // keys = testMap.Keys; - // for (int i = 0; i < keys.Length; i++) - // { - // Console.WriteLine(testMap[keys[i]]); - // } - - // Console.WriteLine("Map test"); - // var testMap2 = new StringMap(); - // Console.WriteLine("Map Item Count = " + testMap2.Count); - // testMap2.Add("a", 0.1f); - // testMap2.Add("b", 0.2f); - // testMap2.Add("c", 0.3f); - // Console.WriteLine("Map Item Count = " + testMap2.Count); - - // Console.WriteLine("a=" + testMap2["a"].ToString() + ",b=" + testMap2["b"].ToString() + ",c=" + testMap2["c"].ToString()); - // Stop(); - //} - - //private void FloatingPointTest() - //{ - // float flt; - // double dbl; - - // Console.WriteLine("Float Test Values"); - // //flt = 0.0f; - // //for (int i = 0; i < 10; i++) - // //{ - // // flt = i / 10.0f; - // // Console.WriteLine((i / 10).ToString() + "." + (i % 10).ToString() + " = " + FtoA(flt) + ", " + flt.ToString()); - // // if ((i % 10) == 9) - // // { - // // Console.WriteLine(); - // // //Console.ReadLine(); - // // } - // //} - // //flt = 1234.1234f; - // //Console.WriteLine("1234.1234 = " + FtoA(flt) + ", " + flt.ToString()); - // //flt = 100.0f; - // //Console.WriteLine("100.0 = " + FtoA(flt) + ", " + flt.ToString()); - // //flt = 0.0067f; - // //Console.WriteLine("0.0067 = " + FtoA(flt) + ", " + flt.ToString()); - // //flt = 1897654321.123456f; - // //Console.WriteLine("1897654321.123456 = " + FtoA(flt) + ", " + flt.ToString()); - // //flt = -223344.332211f; - // //Console.WriteLine("-223344.332211 = " + FtoA(flt) + ", " + flt.ToString()); - // flt = Single.NaN; - // Console.WriteLine("Single.NaN = " + FtoA(flt) + ", " + flt.ToString()); - // flt = Single.PositiveInfinity; - // Console.WriteLine("Single.PositiveInfinity = " + FtoA(flt) + ", " + flt.ToString()); - // flt = Single.NegativeInfinity; - // Console.WriteLine("Single.NegativeInfinity = " + FtoA(flt) + ", " + flt.ToString()); - - // Console.ReadLine(); - // Console.Clear(); - - // Console.WriteLine("Double Test Values"); - // //for (int i = 0; i < 10; i++) - // //{ - // // dbl = i / 10.0; - // // Console.WriteLine((i / 10).ToString() + "." + (i % 10).ToString() + " = " + DtoA(dbl) + ", " + dbl.ToString()); - // // if ((i % 10) == 9) - // // { - // // Console.WriteLine(); - // // //Console.ReadLine(); - // // } - // //} - // //dbl = 0.1; - // //Console.WriteLine("0.1 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 0.6; - // //Console.WriteLine("0.6 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 1.0; - // //Console.WriteLine("1.0 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 1234.1234; - // //Console.WriteLine("1234.1234 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 100.0; - // //Console.WriteLine("100.0 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 0.0067; - // //Console.WriteLine("0.0067 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = 1897654321.123456; - // //Console.WriteLine("1897654321.123456 = " + DtoA(dbl) + ", " + dbl.ToString()); - // //dbl = -223344.332211; - // //Console.WriteLine("-223344.332211 = " + DtoA(dbl) + ", " + dbl.ToString()); - // dbl = Double.NaN; - // Console.WriteLine("Double.NaN = " + DtoA(dbl) + ", " + dbl.ToString()); - // dbl = Double.PositiveInfinity; - // Console.WriteLine("Double.PositiveInfinity = " + DtoA(dbl) + ", " + dbl.ToString()); - // dbl = Double.NegativeInfinity; - // Console.WriteLine("Double.NegativeInfinity = " + DtoA(dbl) + ", " + dbl.ToString()); - - // Stop(); - //} - - //private void RunSqrtTest() - //{ - // Console.WriteLine("Calculating Square Root of 125348"); - // float x = Sqrt(125348.0f); - // Console.WriteLine("x = " + x.ToString()); - // Stop(); - //} - - //private void InitDictionaryTest() - //{ - // //testDictComparer = new DictIntComparer(); - // //testDict = new Dictionary(testDictComparer); - //} - //private void RunDictionaryTest() - //{ - // //Console.WriteLine("Dictionary Count: " + testDict.Count); - // //Console.WriteLine("Add 1"); - // //testDict.Add(1, "Hello"); - // //Console.WriteLine("Add 2"); - // //testDict.Add(2, "Hello Again"); - // //Console.WriteLine("Add 3"); - // //testDict.Add(3, "Goodbye"); - // //Console.WriteLine("Add Done"); - - // //testDictComparer.Equals(1, 2); - // //testDictComparer.GetHashCode(3); - //} - - ////protected override void BeforeRun() - ////{ - //// Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - ////} - - ////protected override void Run() - ////{ - //// Console.Write("Input: "); - //// var input = Console.ReadLine(); - //// Console.Write("Text typed: "); - //// Console.WriteLine(input); - ////} - } -} diff --git a/Users/SSchocke/SSchockeTest/Map.cs b/Users/SSchocke/SSchockeTest/Map.cs deleted file mode 100644 index d130a3872f..0000000000 --- a/Users/SSchocke/SSchockeTest/Map.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SSchockeTest -{ - public abstract class Map - { - private int capacity; - private int count; - private TKey[] keys; - private TValue[] values; - - public Map() - : this(8) - { } - - public Map(int initialCapacity) - { - count = 0; - capacity = initialCapacity; - keys = new TKey[capacity]; - values = new TValue[capacity]; - } - - public void Add(TKey key, TValue value) - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - if (ContainsKey(key) == true) - { - throw new ArgumentException("Key already exists", "key"); - } - - if (count == capacity) - { - growStorage(); - } - - keys[count] = key; - values[count] = value; - count++; - } - - public void Clear() - { - count = 0; - keys = new TKey[capacity]; - values = new TValue[capacity]; - } - - public bool ContainsKey(TKey key) - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - for (int i = 0; i < count; i++) - { - if (keysEqual(key, keys[i]) == true) - { - return true; - } - } - - return false; - } - - public bool ContainsValue(TValue value) - { - throw new NotImplementedException("We really need to have RuntimeHelpers.Equals() for this"); - } - - public void Remove(TKey key) - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - int i = 0; - while ((i < count) && (keysEqual(key, keys[i]) == false)) - { - i++; - } - if (i < count - 1) - { - Array.Copy(keys, i + 1, keys, i, count - i - 1); - Array.Copy(values, i + 1, values, i, count - i - 1); - } - count--; - } - - public bool TryGetValue(TKey key, out TValue value) - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - for (int i = 0; i < count; i++) - { - if (keysEqual(key, keys[i]) == true) - { - value = values[i]; - return true; - } - } - - value = default(TValue); - return false; - } - - public int Count - { - get { return count; } - } - - public TValue this[TKey key] - { - get - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - for (int i = 0; i < count; i++) - { - if (keysEqual(key, keys[i]) == true) - { - return values[i]; - } - } - - throw new KeyNotFoundException("Key does not exist in this collection"); - } - set - { - if (key == null) - { - throw new ArgumentNullException("key"); - } - - for (int i = 0; i < count; i++) - { - if (keysEqual(key, keys[i]) == true) - { - values[i] = value; - return; - } - } - - Add(key, value); - } - } - - public TKey[] Keys - { - get - { - TKey[] usedKeys = new TKey[count]; - Array.Copy(keys, usedKeys, count); - - return usedKeys; - } - } - public TValue[] Values - { - get - { - TValue[] usedValues = new TValue[count]; - Array.Copy(values, usedValues, count); - - return usedValues; - } - } - - protected abstract bool keysEqual(TKey key1, TKey key2); - - private void growStorage() - { - capacity *= 2; - - TKey[] newKeys = new TKey[capacity]; - TValue[] newValues = new TValue[capacity]; - Array.Copy(keys, newKeys, count); - Array.Copy(values, newValues, count); - - keys = newKeys; - values = newValues; - } - } -} diff --git a/Users/SSchocke/SSchockeTest/SSchockeTest.csproj b/Users/SSchocke/SSchockeTest/SSchockeTest.csproj deleted file mode 100644 index 3ff16db0bd..0000000000 --- a/Users/SSchocke/SSchockeTest/SSchockeTest.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {0AAD9114-6F08-4344-A282-CD6BC77595E5} - Library - Properties - SSchockeTest - SSchockeTest - 512 - SAK - SAK - SAK - SAK - v4.7.1 - - - - - ..\..\source\Cosmos.Hardware\bin\Debug\Cosmos.Debug.Kernel.dll - - - - - - - - - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - IL2CPU.API - - - {DA50B9B2-0E95-4F0D-A3C8-79FC549301B5} - Cosmos.System - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {6A991D03-1435-4005-9809-B8BACDF3B021} - Cosmos.HAL - - - - - diff --git a/Users/SSchocke/SSchockeTest/SSchockeTestBoot.Cosmos b/Users/SSchocke/SSchockeTest/SSchockeTestBoot.Cosmos deleted file mode 100644 index 6d709d7089..0000000000 --- a/Users/SSchocke/SSchockeTest/SSchockeTestBoot.Cosmos +++ /dev/null @@ -1,52 +0,0 @@ - - - - Debug - 2.0 - {4527d60e-25f4-4617-b463-7cda3c219097} - false - SSchockeTestBoot - elf - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - MicrosoftNET - False - False - Source - User - VMWare - Player - false - False - - - true - bin\Release\ - MicrosoftNET - False - False - None - User - VMWare - Player - false - - - - SSchockeTest - {2ac69ca7-215f-4667-a046-0aa0b76c6526} - - - - - - - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 9bd6b4741b..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,54 +0,0 @@ -version: 0.20150918.{build} -image: Visual Studio 2017 -configuration: Debug-CI -platform: Any CPU -shallow_clone: true -clone_folder: c:\Cosmos - -init: -- cmd: | - git clone https://github.com/CosmosOS/IL2CPU.git c:\IL2CPU --depth 1 - -build_script: -- cmd: | - rem %APPVEYOR_BUILD_FOLDER% - - msbuild Build.sln /t:Restore;Build /maxcpucount /verbosity:normal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - dotnet publish ..\IL2CPU\source\IL2CPU -r win7-x86 -o "c:\CosmosRun\Build\IL2CPU\" - - xcopy /Y "Build\syslinux\*.*" "c:\CosmosRun\Build\ISO\" - xcopy /Y /S "Build\VMware\*" "c:\CosmosRun\Build\VMware\" - xcopy /Y /S "Build\Tools" "c:\CosmosRun\Build\Tools\" - xcopy /Y "..\IL2CPU\source\Cosmos.Core.DebugStub\*.xs" "c:\CosmosRun\XSharp\DebugStub\" - xcopy /Y /S "Resources\Bochs\*.*" "%ProgramFiles(x86)%\Bochs-2.6.8\" - - reg add HKLM\SOFTWARE\WOW6432Node\Cosmos /v UserKit /d c:\CosmosRun\ - reg add HKCR\BochsConfigFile\shell\Run\command /ve /d "\"C:\Program Files (x86)\Bochs-2.6.8\Bochs.exe\" -q -f \"%1\"" - -#test: off -# assemblies: -# - Cosmos.Core.Memory.Test.dll -# - DebugCompiler.dll -# - Cosmos.TestRunner.UnitTest.dll - -test_script: -- cmd: dotnet test Tests\Cosmos.TestRunner.UnitTest\Cosmos.TestRunner.UnitTest.csproj --logger "trx;LogFileName=c:\Cosmos\TestResult.xml" - -on_finish: -- ps: | - $wc = New-Object 'System.Net.WebClient' - $wc.UploadFile("https://ci.appveyor.com/api/testresults/mstest/$($env:APPVEYOR_JOB_ID)", "c:\Cosmos\TestResult.xml") - -notifications: -- provider: Webhook - url: https://webhooks.gitter.im/e/d5c57ffb9a04b1b180be - on_build_success: true - on_build_failure: true - on_build_status_changed: true - -matrix: - fast_finish: true - -artifacts: - - path: '**\TestResult.xml' diff --git a/global.json b/global.json index c51cd7b41e..bf4c1dc9ec 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "msbuild-sdks": { - "Microsoft.Build.Traversal": "1.0.45" + "Microsoft.Build.NoTargets": "1.0.88" } } diff --git a/install-VS2017.bat b/install-VS2017.bat deleted file mode 100644 index 63b4cc3dcd..0000000000 --- a/install-VS2017.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off - -if not exist "%ProgramFiles(x86)%" ( - set "ProgramFiles(x86)=%ProgramFiles%" -) - -set "VSWhere=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" - -:MSBuild -echo Looking for MSBuild -for /f "usebackq delims=" %%i in (`^""%VSWhere%" -latest -version "[15.0,16.0)" -products * -requires "Microsoft.Component.MSBuild" -property "installationPath"^"`) do ( - set InstallDir=%%i -) - -set "MSBuild=%InstallDir%\MSBuild\15.0\Bin\MSBuild.exe" - -if not exist "%MSBuild%" ( - echo MSBuild not found. Please make sure Visual Studio 15.2+ is installed. - pause - goto:eof -) - -echo Building Builder.sln -"%MSBuild%" Builder.sln /nologo /maxcpucount /nodeReuse:false /verbosity:minimal /t:Restore;Build - -start "Cosmos Builder" "source\Cosmos.Build.Builder\bin\Debug\net471\Cosmos.Build.Builder.exe" "-VSPATH=%InstallDir%" %* diff --git a/install-VS2022.bat b/install-VS2022.bat new file mode 100644 index 0000000000..7d6b7ee776 --- /dev/null +++ b/install-VS2022.bat @@ -0,0 +1,53 @@ +@echo off +setlocal +for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j + +if "%version%" == "6.1" goto seven + +:start +cd /D "%~dp0" + +if not exist "%ProgramFiles(x86)%" ( + set "ProgramFiles(x86)=%ProgramFiles%" +) + +set "VSWhere=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" + +:MSBuild +echo Looking for MSBuild +for /f "usebackq delims=" %%i in (`^""%VSWhere%" -latest -prerelease -version "[17.0,18.0)" -products * -requires "Microsoft.Component.MSBuild" -property "installationPath"^"`) do ( + set InstallDir=%%i +) + +set "MSBuild=%InstallDir%\MSBuild\Current\Bin\MSBuild.exe" + +if not exist "%MSBuild%" ( + echo MSBuild not found. Please make sure Visual Studio 16.0+ is installed. + pause + goto:eof +) + +echo Building Builder.sln +"%MSBuild%" Builder.sln /nologo /maxcpucount /nodeReuse:false /verbosity:minimal /t:Restore;Build +if %ERRORLEVEL% neq 0 ( + echo Failed to build Cosmos Builder. Exiting... + exit /b %ERRORLEVEL% +) + +start "Cosmos Builder" "source\Cosmos.Build.Builder\bin\Debug\Cosmos.Build.Builder.exe" +exit + +:seven +echo Detected Windows 7! Checking for update KB3140245... + +for /f "delims=" %%i in ("wmic qfe | find /c ""KB3140245""") do set update=%%i +if "%update%" == "0" ( + echo "The update KB3140245 isn't installed on your computer! It is mandatory on Windows 7 to install it in order to build Cosmos." + pause +) + +reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:32 +reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f /reg:64 +reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:32 +reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f /reg:64 +goto start \ No newline at end of file diff --git a/source/Archive/Cosmos.Assembler.Nasm/Assembler.cs b/source/Archive/Cosmos.Assembler.Nasm/Assembler.cs deleted file mode 100644 index 5875141d6f..0000000000 --- a/source/Archive/Cosmos.Assembler.Nasm/Assembler.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Assembler.Nasm { - public class Assembler { - public void Add(string aCode) { - } - } -} diff --git a/source/Archive/Cosmos.Assembler.Nasm/Cosmos.Assembler.Nasm.csproj b/source/Archive/Cosmos.Assembler.Nasm/Cosmos.Assembler.Nasm.csproj deleted file mode 100644 index 70987e372e..0000000000 --- a/source/Archive/Cosmos.Assembler.Nasm/Cosmos.Assembler.Nasm.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - Debug - x86 - 8.0.30703 - 2.0 - {D5321EC7-9F27-4713-A7EC-9BED3ACA8D9F} - Library - Properties - XSharp.Assembler.Nasm - XSharp.Assembler.Nasm - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.Assembler.Nasm/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Assembler.Nasm/Properties/AssemblyInfo.cs deleted file mode 100644 index 84e7d84ef7..0000000000 --- a/source/Archive/Cosmos.Assembler.Nasm/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("Cosmos.Assembler.Nasm")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.Assembler.Nasm")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[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("40e8d0d4-136b-461d-81b6-0170163b6bed")] - -// 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/source/Archive/Cosmos.Drivers/Cosmos.Drivers.csproj b/source/Archive/Cosmos.Drivers/Cosmos.Drivers.csproj deleted file mode 100644 index 37698fca65..0000000000 --- a/source/Archive/Cosmos.Drivers/Cosmos.Drivers.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - Debug - x86 - 9.0.21022 - 2.0 - {E7863305-209C-46ED-9C58-7D0F67DB3B48} - Library - Properties - Cosmos.Drivers - Cosmos.Drivers - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - diff --git a/source/Archive/Cosmos.Drivers/Driver.cs b/source/Archive/Cosmos.Drivers/Driver.cs deleted file mode 100644 index f5b913b3b0..0000000000 --- a/source/Archive/Cosmos.Drivers/Driver.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Drivers -{ - /// - /// Represents a generic device driver. - /// - public abstract class Driver - { - public abstract void Initialise(HardwareManager manager); - - } -} diff --git a/source/Archive/Cosmos.Drivers/HardwareManager.cs b/source/Archive/Cosmos.Drivers/HardwareManager.cs deleted file mode 100644 index 12e857962a..0000000000 --- a/source/Archive/Cosmos.Drivers/HardwareManager.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Drivers -{ - public abstract class HardwareManager - { - public abstract void GetDMAChannel(); - // Todo... - } -} diff --git a/source/Archive/Cosmos.Drivers/PCI/PCIDriver.cs b/source/Archive/Cosmos.Drivers/PCI/PCIDriver.cs deleted file mode 100644 index d3da80841e..0000000000 --- a/source/Archive/Cosmos.Drivers/PCI/PCIDriver.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Drivers.PCI -{ - /// - /// Represents a generic PCI driver. - /// - public abstract class PCIDriver : Driver - { - } -} diff --git a/source/Archive/Cosmos.Drivers/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Drivers/Properties/AssemblyInfo.cs deleted file mode 100644 index a24306b40e..0000000000 --- a/source/Archive/Cosmos.Drivers/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("Cosmos.Drivers")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.Drivers")] -[assembly: AssemblyCopyright("Copyright © 2008")] -[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("870296b1-493d-4599-a10d-d85ade6a1f9c")] - -// 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/source/Archive/Cosmos.Drivers/Properties/Resources.Designer.cs b/source/Archive/Cosmos.Drivers/Properties/Resources.Designer.cs deleted file mode 100644 index c90c23fe64..0000000000 --- a/source/Archive/Cosmos.Drivers/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1433 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Cosmos.Drivers.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cosmos.Drivers.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/source/Archive/Cosmos.Drivers/Properties/Resources.resx b/source/Archive/Cosmos.Drivers/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/source/Archive/Cosmos.Drivers/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Drivers/Properties/Settings.Designer.cs b/source/Archive/Cosmos.Drivers/Properties/Settings.Designer.cs deleted file mode 100644 index 1647d09d7f..0000000000 --- a/source/Archive/Cosmos.Drivers/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1433 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Cosmos.Drivers.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/source/Archive/Cosmos.Drivers/Storage/FileSystem.cs b/source/Archive/Cosmos.Drivers/Storage/FileSystem.cs deleted file mode 100644 index b21f122242..0000000000 --- a/source/Archive/Cosmos.Drivers/Storage/FileSystem.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Drivers.Storage -{ - /// - /// Represents a file system. - /// - public abstract class FileSystem - { - /// - /// Determines if the specified device - /// implements this filesystem. - /// - /// - /// - public abstract bool Identify(Storage target); - - /// - /// Reads the specified bytes. - /// - /// - /// - /// - /// - /// - public abstract long Read(byte[] buffer, long offset, long length, params string[] filename); - - /// - /// Writes out bytes. - /// - /// - /// - /// - /// - /// - public abstract long Write(byte[] buffer, long offset, long length, params string[] filename); - - } -} diff --git a/source/Archive/Cosmos.Drivers/Storage/Storage.cs b/source/Archive/Cosmos.Drivers/Storage/Storage.cs deleted file mode 100644 index aabf5f2743..0000000000 --- a/source/Archive/Cosmos.Drivers/Storage/Storage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Drivers.Storage -{ - /// - /// Represents a file system. - /// - public abstract class Storage : Driver - { - public abstract void Read(byte[] data, long offset, long count); - public abstract void Write(byte[] data, long offset, long count); - - public void Write(byte[] data, long offset) - { - Write(data, offset, data.Length); - } - } -} diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/Cosmos.Hardware.SMBIOS.csproj b/source/Archive/Cosmos.Hardware.SMBIOS/Cosmos.Hardware.SMBIOS.csproj deleted file mode 100644 index 4a738379f2..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/Cosmos.Hardware.SMBIOS.csproj +++ /dev/null @@ -1,92 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {B2F76E27-EAE1-4ECF-8A33-77B2CFBB9367} - Library - Properties - Cosmos.Hardware.SMBIOS - Cosmos.Hardware.SMBIOS - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - {A1F83D9F-2D44-4264-A08B-416797123018} - Cosmos.Kernel - - - {819DB8FC-5DA1-461F-83C9-2F5C88088C94} - Cosmos.Sys - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Hardware.SMBIOS/Properties/AssemblyInfo.cs deleted file mode 100644 index d1321d2faf..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/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( "SMBIOS Driver" )] -[assembly: AssemblyDescription( "SMBIOS Driver for Cosmos OS" )] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany( "" )] -[assembly: AssemblyProduct( "SMBIOS Driver" )] -[assembly: AssemblyCopyright( "Licensed under the terms of the New BSD License. Author: Gero Landmann ( gero@myzeug.de )" )] -[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("e770b54b-1eab-44ca-ac11-4ef24b0bdf19")] - -// 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.8.0")] -[assembly: AssemblyFileVersion("0.1.8.0")] diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseInfo.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseInfo.cs deleted file mode 100644 index 62b7b6badd..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; - -using Cosmos.Kernel; - -namespace Cosmos.Hardware.SMBIOS -{ - public abstract class BaseInfo : IHardwareType - { - #region IHardwareType Members - - public byte HardwareType { get; protected set; } - - public ushort Handle { get; protected set; } - - #endregion - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseTable.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseTable.cs deleted file mode 100644 index 99edb1658b..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/BaseTable.cs +++ /dev/null @@ -1,134 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; - -using Cosmos.Kernel; - -namespace Cosmos.Hardware.SMBIOS -{ - public class BaseTable - { - private uint BaseAddress; - public uint EndAddress; - - public ushort Handle; - - public byte TableType; - public byte TableLength; - - public List Strings; - - private uint NextAddress; - - private Cosmos.Kernel.MemoryAddressSpace Memory; - - public Cosmos.Kernel.MemoryAddressSpace Data; - - public byte SMBIOSMinorVersion; - - public BaseTable( uint BaseAddress, byte SMBIOSMinorVersion ) - { - this.BaseAddress = BaseAddress; - this.SMBIOSMinorVersion = SMBIOSMinorVersion; - Memory = new MemoryAddressSpace( 0, 0 ); - NextAddress = BaseAddress; - } - - public bool ReadData() - { - - TableType = GetNextByte(); - TableLength = GetNextByte(); - Handle = GetNextWord(); - - NextAddress = BaseAddress; - Data = new MemoryAddressSpace( BaseAddress, TableLength ); - - GetStrings( BaseAddress + TableLength ); - - EndAddress = NextAddress; - - return true; - } - - private byte GetNextByte() - { - byte tmp = Memory.Read8Unchecked( NextAddress ); - NextAddress += 1; - return tmp; - } - - private ushort GetNextWord() - { - ushort tmp = Memory.Read16Unchecked( NextAddress ); - NextAddress += 2; - return tmp; - } - - private uint GetNextDWord() - { - uint tmp = Memory.Read32Unchecked( NextAddress ); - NextAddress += 4; - return tmp; - } - - private ulong GetNextQWord() - { - ulong tmp = Memory.Read64Unchecked( NextAddress ); - NextAddress += 8; - return tmp; - } - - public string GetString( int number ) - { - if( number == 0 ) - return ""; - - if( number - 1 > Strings.Count ) - { - //Console.Write( " BaseTable: Tried to get string not in table #" ); - //Console.WriteLine( number ); - } - else - { - //Console.Write( " BaseTable: Getting string #" ); - //Console.WriteLine( number ); - return Strings[ number - 1 ]; - } - - return ""; - - } - private void GetStrings( uint offset ) - { - NextAddress = offset; - byte chr = GetNextByte(); - byte counter = 0; - string str = ""; - - if( Strings == null ) - Strings = new List(); - - do - { - while( chr > 0 ) - { - str = str + ( char )chr; - counter++; - if( counter > 63 ) - break; - chr = GetNextByte(); - } - Strings.Add( str ); - - str = ""; - counter = 0; - chr = GetNextByte(); - } while( chr > 0 ); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/BIOSInformation.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/BIOSInformation.cs deleted file mode 100644 index 34f6fad75f..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/BIOSInformation.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware.SMBIOS.Table -{ - public class BIOSTable : BaseInfo, IBIOSInformation - { - #region IBIOSInformation Members - - public string Vendor { get; private set; } - public string BIOSVersion { get; private set; } - public ushort BIOSStartingAddressSegment { get; private set; } - public string BIOSReleaseDate { get; private set; } - public byte BIOSROMSize { get; private set; } - public ulong BIOSCharacteristics { get; private set; } - public int BIOSCharacteristicsExtensionByteCount { get; private set; } - public byte[] BIOSCharacteristicsExtensionBytes { get; private set; } - public byte SystemBIOSMajorRelease { get; private set; } - public byte SystemBIOSMinorRelease { get; private set; } - public byte EmbeddedControllerFirmwareMajorRelease { get; private set; } - public byte EmbeddedControllerFirmwareMinorRelease { get; private set; } - #endregion - - public BIOSTable( BaseTable bt ) - { - if( bt.TableType != 0 ) - //throw new ArgumentException( "Wrong TableType" ); - return; - HardwareType = bt.TableType; - Handle = bt.Handle; - - if( bt.SMBIOSMinorVersion >= 0 ) - { - Vendor = bt.GetString( bt.Data.Read8Unchecked( 0x04 ) ); - BIOSVersion = bt.GetString( bt.Data.Read8Unchecked( 0x05 ) ); - BIOSStartingAddressSegment = bt.Data.Read16Unchecked( 0x08 ); - BIOSReleaseDate = bt.GetString( bt.Data.Read8Unchecked( 0x08 ) ); - BIOSROMSize = bt.Data.Read8Unchecked( 0x09 ); - BIOSCharacteristics = bt.Data.Read64Unchecked( 0x0A ); - - BIOSCharacteristicsExtensionByteCount = (int)bt.TableLength - 0x13; - BIOSCharacteristicsExtensionBytes = new byte[ BIOSCharacteristicsExtensionByteCount ]; - - for( uint i = 0; i < BIOSCharacteristicsExtensionByteCount; i++ ) - bt.Data.Read8Unchecked( 0x12 + i ); - - SystemBIOSMajorRelease = bt.Data.Read8Unchecked( 0x14 ); - SystemBIOSMinorRelease = bt.Data.Read8Unchecked( 0x15 ); - EmbeddedControllerFirmwareMajorRelease = bt.Data.Read8Unchecked( 0x16 ); - EmbeddedControllerFirmwareMinorRelease = bt.Data.Read8Unchecked( 0x17 ); - } - - } - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/ProcessorInformation.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/ProcessorInformation.cs deleted file mode 100644 index ffaf4eb50d..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Classes/ProcessorInformation.cs +++ /dev/null @@ -1,104 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware.SMBIOS.Table -{ - public class ProcessorInformation : BaseInfo, IProcessorInformation - { - - public string SocketDesignation { get; private set; } - public byte ProcessorType { get; private set; } - public byte ProcessorFamily { get; private set; } - public string ProcessorManufacturer { get; private set; } - public ulong ProcessorID { get; private set; } - public string ProcessorVersion { get; private set; } - public byte Voltage { get; private set; } - public ushort ExternalClock { get; private set; } - public ushort MaxSpeed { get; private set; } - public ushort CurrentSpeed { get; private set; } - public byte Status { get; private set; } - public byte ProcessorUpgrade { get; private set; } - public ushort L1CacheHandle { get; private set; } - public ushort L2CacheHandle { get; private set; } - public ushort L3CacheHandle { get; private set; } - public string SerialNumber { get; private set; } - public string AssetTag { get; private set; } - public string PartNumber { get; private set; } - public byte CoreCount { get; private set; } - public byte CoreEnabled { get; private set; } - public byte ThreadCount { get; private set; } - public ushort ProcessorCharacteristics { get; private set; } - public ushort ProcessorFamily2 { get; private set; } - - public ProcessorInformation( BaseTable bt ) - { - if( bt.TableType != (int) TableTypes.ProcessorInformation ) - return; - - if( bt.SMBIOSMinorVersion >= 0 ) - { - Handle = bt.Handle; - HardwareType = bt.TableType; - SocketDesignation = bt.GetString( bt.Data.Read8Unchecked( 0x04 ) ); - ProcessorType = bt.Data.Read8Unchecked( 0x05 ); - ProcessorFamily = bt.Data.Read8Unchecked( 0x06 ); - ProcessorManufacturer = bt.GetString( bt.Data.Read8Unchecked( 0x07 ) ); - ProcessorID = bt.Data.Read64Unchecked( 0x08 ); - ProcessorVersion = bt.GetString( bt.Data.Read8Unchecked( 0x10 ) ); - Voltage = bt.Data.Read8Unchecked( 0x11 ); - ExternalClock = bt.Data.Read16Unchecked( 0x12 ); - MaxSpeed = bt.Data.Read16Unchecked( 0x14 ); - CurrentSpeed = bt.Data.Read16Unchecked( 0x16 ); - Status = bt.Data.Read8Unchecked( 0x18 ); - ProcessorUpgrade = bt.Data.Read8Unchecked( 0x19 ); - } - else return; - - if( bt.SMBIOSMinorVersion >= 1 ) - { - L1CacheHandle = bt.Data.Read16Unchecked( 0x1A ); - L2CacheHandle = bt.Data.Read16Unchecked( 0x1C ); - L3CacheHandle = bt.Data.Read16Unchecked( 0x1E ); - } - else return; - - if( bt.SMBIOSMinorVersion >= 3 ) - { - - SerialNumber = bt.GetString( bt.Data.Read8Unchecked( 0x20 ) ); - AssetTag = bt.GetString( bt.Data.Read8Unchecked( 0x21 ) ); - PartNumber = bt.GetString( bt.Data.Read8Unchecked( 0x22 ) ); - } - else return; - - if( bt.SMBIOSMinorVersion >= 5 ) - { - - CoreCount = bt.Data.Read8Unchecked( 0x23 ); - CoreEnabled = bt.Data.Read8Unchecked( 0x24 ); - ThreadCount = bt.Data.Read8Unchecked( 0x25 ); - ProcessorCharacteristics = bt.Data.Read16Unchecked( 0x26 ); - } - else return; - - if( bt.SMBIOSMinorVersion >= 6 ) - { - ProcessorFamily2 = bt.Data.Read16Unchecked( 0x28 ); - } - else return; - - } - - public override string ToString() - { - return base.ToString(); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Enums/TableTypes.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Enums/TableTypes.cs deleted file mode 100644 index e58d4abf1f..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Enums/TableTypes.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; - -using Cosmos.Kernel; - -namespace Cosmos.Hardware.SMBIOS -{ - /// - /// - /// - public enum TableTypes : int - { - BIOSInformation = 0, - SystemInformation = 1, - BaseBoardInformation = 2, - SystemEnclosure = 3, - ProcessorInformation = 4, - CacheInformation = 7, - PortConnectorInformation = 8, - SystemSlots = 9, - OEMStrings = 11, - SystemConfigurationOptions = 12, - BIOSLanguageInformation = 13, - GroupAssociations = 14, - SystemEventLog = 15, - PhysicalMemoryArray = 16, - MemoryDevice = 17, - MemoryErrorInformation32Bit = 18, - MemoryArrayMappedAddress = 19, - MemoryDeviceMappedAddress = 20, - BuiltInPointingDevice = 21, - PortableBattery = 22, - SystemReset = 23, - HardwareSecurity = 24, - SystemPowerControls = 25, - VoltageProbe = 26, - CoolingDevice = 27, - TemperatureProbe = 28, - ElectricalCurrentProbe = 29, - OutOfBandRemoteAccess = 30, - BootIntegrityServicesEntryPoint = 31, - SystemBootInformation = 32, - MemoryErrorInformation64Bit = 33, - ManagementDevice = 34, - ManagementDeviceComponent = 35, - ManagementDeviceThresholdData = 36, - MemoryChannel = 37, - IPMIDeviceInformation = 38, - SystemPowerSupply = 39, - AdditionalInformation = 40, - OnboardDevicesExtendedInformation = 41, - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IBIOSInformation.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IBIOSInformation.cs deleted file mode 100644 index 7d04c96574..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IBIOSInformation.cs +++ /dev/null @@ -1,28 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ - -namespace Cosmos.Hardware.SMBIOS -{ - /// - /// Early intefacedefinition to get smbios working. - /// changes definitly! - /// - public interface IBIOSInformation : IHardwareType - { - string Vendor { get; } - string BIOSVersion { get; } - ushort BIOSStartingAddressSegment { get; } - string BIOSReleaseDate { get; } - byte BIOSROMSize { get; } - ulong BIOSCharacteristics { get; } - int BIOSCharacteristicsExtensionByteCount { get; } - byte[] BIOSCharacteristicsExtensionBytes { get; } - byte SystemBIOSMajorRelease { get; } - byte SystemBIOSMinorRelease { get; } - byte EmbeddedControllerFirmwareMajorRelease { get; } - byte EmbeddedControllerFirmwareMinorRelease { get; } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IHardwareType.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IHardwareType.cs deleted file mode 100644 index d0ccfd106d..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IHardwareType.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ - -namespace Cosmos.Hardware.SMBIOS -{ - /// - /// - /// - public interface IHardwareType - { - /// - /// - /// - byte HardwareType { get; } - ushort Handle { get; } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IProcessorInformation.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IProcessorInformation.cs deleted file mode 100644 index e1e699c910..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/Interfaces/IProcessorInformation.cs +++ /dev/null @@ -1,39 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ - -namespace Cosmos.Hardware.SMBIOS -{ - /// - /// Early intefacedefinition to get smbios working. - /// changes definitly! - /// - public interface IProcessorInformation : IHardwareType - { - string SocketDesignation { get; } - byte ProcessorType { get; } - byte ProcessorFamily { get; } - string ProcessorManufacturer { get; } - ulong ProcessorID { get; } - string ProcessorVersion { get; } - byte Voltage { get; } - ushort ExternalClock { get; } - ushort MaxSpeed { get; } - ushort CurrentSpeed { get; } - byte Status { get; } - byte ProcessorUpgrade { get; } - ushort L1CacheHandle { get; } - ushort L2CacheHandle { get; } - ushort L3CacheHandle { get; } - string SerialNumber { get; } - string AssetTag { get; } - string PartNumber { get; } - byte CoreCount { get; } - byte CoreEnabled { get; } - byte ThreadCount { get; } - ushort ProcessorCharacteristics { get; } - ushort ProcessorFamily2 { get; } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/SMBIOS Base.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/SMBIOS Base.cs deleted file mode 100644 index c7e9b09db7..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/SMBIOS Base.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware.SMBIOS -{ - public class SMBIOS_Data - { - //4 Byte string - public byte[] AnchorString; - - public byte EntryPointStructureChecksum; - public byte EntryPointLength; - public byte SMBIOSMajorVersion; - public byte SMBIOSMinorVersion; - public ushort MaximumStructureSize; - public byte EntryPointRevision; - - //5 Byte string - public byte[] FormattedArea; - - //5 Byte string - public byte[] IntermediateAnchorString; - - public byte IntermediateChecksum; - public ushort StructureTableLength; - public uint StructureTableAddress; - public ushort NumberOfSMBIOSStructures; - public byte SMBIOSBCDRevision; - - public SMBIOS_Data() - { - - AnchorString = new byte[ 4 ]; - FormattedArea = new byte[ 5 ]; - IntermediateAnchorString = new byte[ 5 ]; - } - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/TableFactory.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/TableFactory.cs deleted file mode 100644 index 22cf545cf8..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS Tables/TableFactory.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* Licensed under the terms of the New BSD License. -* -* Authors: -* Gero Landmann (gero_dev) -*/ - -using Cosmos.Hardware.SMBIOS.Table; - -namespace Cosmos.Hardware.SMBIOS -{ - public static class TableFactory - { - - /// - /// Creates the table. - /// - /// The bt. - /// - public static BaseInfo CreateTable( BaseTable bt ) - { - switch( (TableTypes)(int)bt.TableType ) - { - - //BIOS Information (Type 0) - case TableTypes.BIOSInformation: - return new BIOSTable( bt ); - - //Processor Information (Type 4) - case TableTypes.ProcessorInformation: - return new ProcessorInformation( bt ); - - default: - return null; - } - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS.cs b/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS.cs deleted file mode 100644 index e33d3dfd5c..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/SMBIOS.cs +++ /dev/null @@ -1,232 +0,0 @@ - /* Licensed under the terms of the New BSD License. - * - * Authors: - * Gero Landmann (gero_dev) - */ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware.SMBIOS -{ - public class SMBIOS - { - public uint SMBBIOSAddress; - public bool HasSMBIOS; - public uint Signature; - public SMBIOS_Data SMBIOS_Data; - - public List TableList; - - //private Dictionary> TypeBasedList; - //private Dictionary HandleBasedList; - - public List HardwareList; - - public bool CheckSMBIOS() - { - HasSMBIOS = false; - //0x000F0000 Start - - //0x000F69E0 VMWare - //0x000FFF30 VirtualBox - - //0x000FFFFF End - SMBBIOSAddress = 0x000F0000; - - Cosmos.Kernel.MemoryAddressSpace Memory = new Cosmos.Kernel.MemoryAddressSpace( 0, 0 ); - - while( SMBBIOSAddress <= 0x000FFFFF ) - { - //if( Memory.Get32( SMBBIOSAddress ) == ( uint )0x5F534D5F || // "_SM_" - // Memory.Get32( SMBBIOSAddress ) == ( uint )0x5F4D535F ) // "_MS_" indianess - if( Memory.Read8Unchecked( SMBBIOSAddress ) == ( byte )0x5F ) // - if( Memory.Read8Unchecked( SMBBIOSAddress + 1 ) == ( byte )0x53 ) - if( Memory.Read8Unchecked( SMBBIOSAddress + 2 ) == ( byte )0x4D ) - if( Memory.Read8Unchecked( SMBBIOSAddress + 3 ) == ( byte )0x5F ) - { - - Signature = Memory.Read32Unchecked( SMBBIOSAddress ); - HasSMBIOS = true; - break; - } - - SMBBIOSAddress++; - } - - return HasSMBIOS; - } - - public int ReadTables() - { - if( TableList == null ) - TableList = new List(); - else if( TableList.Count > 0 ) - return TableList.Count; - - if( SMBIOS_Data.NumberOfSMBIOSStructures == 0 ) - return 0; - - BaseTable bsd; - - uint NextAddress = SMBIOS_Data.StructureTableAddress; - - for( int i = 0; i < SMBIOS_Data.NumberOfSMBIOSStructures; i++ ) - { - bsd = new BaseTable( NextAddress, SMBIOS_Data.SMBIOSMinorVersion ); - if( bsd.ReadData() == false || bsd.TableType == 127) - { - //Something went wrong or we finished - break; - } - - NextAddress = bsd.EndAddress; - TableList.Add( bsd ); - } - - - - return SMBIOS_Data.NumberOfSMBIOSStructures; - - } - - //public T GetInterface() where T : IHardwareType - //{ - // Console.WriteLine( " [GetInterface] Start" ); - // BaseInfo ht; - // for( int i = 0; i < HardwareList.Count; i++ ) - // { - // ht = HardwareList[ i ]; - // if( ht is T ) - // return (T)((object)ht); - // } - // Console.WriteLine( " [GetInterface] End" ); - // throw new Exception( "Interface not found" ); - //} - - //public List GetHardwareDescriptorByType( byte Type ) - //{ - // return TypeBasedList[ Type ]; - //} - - //public IHardwareType GetHardwareDescriptorByHandle( ushort Handle ) - //{ - // return HandleBasedList[ Handle ]; - //} - - public List GetHardwareDescriptorByType( TableTypes Type ) - { - //Console.WriteLine( " [GetHardwareDescriptorByType] Start" ); - List tmp = new List(); - - BaseInfo ht; - - for( int i = 0; i < HardwareList.Count; i++ ) - { - ht = HardwareList[ i ]; - if( ht.HardwareType == (byte)Type ) - tmp.Add( ht ); - } - //Console.WriteLine( " [GetHardwareDescriptorByType] End" ); - return tmp; - } - - public IHardwareType GetHardwareDescriptorByHandle( ushort Handle ) - { - //Console.WriteLine( " [GetHardwareDescriptorByHandle] Start" ); - BaseInfo ht; - - for( int i = 0; i < HardwareList.Count; i++ ) - { - ht = HardwareList[ i ]; - if( ht.Handle == Handle ) - return ht; - } - //Console.WriteLine( " [GetHardwareDescriptorByHandle] End" ); - return null; - } - - public void InterpretData() - { - //if( TypeBasedList == null ) - // TypeBasedList = new Dictionary>(); - - //if( HandleBasedList == null ) - // HandleBasedList = new Dictionary(); - - if( HardwareList == null ) - HardwareList = new List(); - BaseTable bt; - BaseInfo ht; - for( int i = 0; i < TableList.Count; i++ ) - { - - bt = TableList[ i ]; - - ht = TableFactory.CreateTable( bt ); - - if( ht == null ) - continue; - - HardwareList.Add( ht ); - - - //if( TypeBasedList.ContainsKey( ht.HardwareType ) == false ) - // TypeBasedList.Add( ht.HardwareType, new List() ); - - //TypeBasedList[ ht.HardwareType ].Add( ht ); - //HandleBasedList.Add( bt.Handle, ht ); - - } - } - - - public bool GetSMBIOS_Data() - { - if( HasSMBIOS == false && CheckSMBIOS() == false ) - return false; - - Cosmos.Kernel.MemoryAddressSpace Memory = new Cosmos.Kernel.MemoryAddressSpace( SMBBIOSAddress, 32 ); - - SMBIOS_Data = new SMBIOS_Data(); - - //4 Byte array - SMBIOS_Data.AnchorString[ 0 ] = Memory.Read8Unchecked( 0 ); - SMBIOS_Data.AnchorString[ 1 ] = Memory.Read8Unchecked( 1 ); - SMBIOS_Data.AnchorString[ 2 ] = Memory.Read8Unchecked( 2 ); - SMBIOS_Data.AnchorString[ 3 ] = Memory.Read8Unchecked( 3 ); - - SMBIOS_Data.EntryPointStructureChecksum = Memory.Read8Unchecked( 4 ); - SMBIOS_Data.EntryPointLength = Memory.Read8Unchecked( 5 ); - SMBIOS_Data.SMBIOSMajorVersion = Memory.Read8Unchecked( 6 ); - SMBIOS_Data.SMBIOSMinorVersion = Memory.Read8Unchecked( 7 ); - SMBIOS_Data.MaximumStructureSize = Memory.Read16Unchecked( 8 ); - - SMBIOS_Data.EntryPointRevision = Memory.Read8Unchecked( 10 ); - - //5 Byte array - SMBIOS_Data.FormattedArea[ 0 ] = Memory.Read8Unchecked( 11 ); - SMBIOS_Data.FormattedArea[ 1 ] = Memory.Read8Unchecked( 12 ); - SMBIOS_Data.FormattedArea[ 2 ] = Memory.Read8Unchecked( 13 ); - SMBIOS_Data.FormattedArea[ 3 ] = Memory.Read8Unchecked( 14 ); - SMBIOS_Data.FormattedArea[ 4 ] = Memory.Read8Unchecked( 15 ); - - //5 Byte array - SMBIOS_Data.IntermediateAnchorString[ 0 ] = Memory.Read8Unchecked( 16 ); - SMBIOS_Data.IntermediateAnchorString[ 1 ] = Memory.Read8Unchecked( 17 ); - SMBIOS_Data.IntermediateAnchorString[ 2 ] = Memory.Read8Unchecked( 18 ); - SMBIOS_Data.IntermediateAnchorString[ 3 ] = Memory.Read8Unchecked( 19 ); - SMBIOS_Data.IntermediateAnchorString[ 4 ] = Memory.Read8Unchecked( 20 ); - - SMBIOS_Data.IntermediateChecksum = Memory.Read8Unchecked( 21 ); - SMBIOS_Data.StructureTableLength = Memory.Read16Unchecked( 22 ); - SMBIOS_Data.StructureTableAddress = Memory.Read32Unchecked( 24 ); - SMBIOS_Data.NumberOfSMBIOSStructures = Memory.Read16Unchecked( 28 ); - SMBIOS_Data.SMBIOSBCDRevision = Memory.Read8Unchecked( 30 ); - - return true; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/TODO.txt b/source/Archive/Cosmos.Hardware.SMBIOS/TODO.txt deleted file mode 100644 index 24356af693..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/TODO.txt +++ /dev/null @@ -1,11 +0,0 @@ -SMBIOS Driver TODO list: - -- Implement enums -- refactor interfaces -- use IStream instead of memoryreader -- documentation -- check coding guidelines -- helper ToString functions -- make only interfaces accessable -- store interfaces and get rid of BaseInfo.cs as abstract base class -- change to on-demand reading? does the bios data move or change in memory at runtime? \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware.SMBIOS/TestProgram.cs b/source/Archive/Cosmos.Hardware.SMBIOS/TestProgram.cs deleted file mode 100644 index 47cd2cce90..0000000000 --- a/source/Archive/Cosmos.Hardware.SMBIOS/TestProgram.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -using Cosmos.Hardware.SMBIOS.Table; - -namespace Cosmos.Hardware.SMBIOS -{ - public class TestProgram - { - public static void DumpBytes( uint from, uint count, uint column ) - { - Cosmos.Kernel.MemoryAddressSpace Memory = new Cosmos.Kernel.MemoryAddressSpace( 0, 0 ); - - uint j = 0; - - for( uint i = 0; i < count; i++ ) - { - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( Memory.Read8Unchecked( from + i ), 2 ) ); - Console.Write( " " ); - j++; - if( j == column ) - { - Console.WriteLine( "" ); - j = 0; - } - } - } - - - public static void Init() - { - // prevent interrupts from being enabled for now. - bool xTest = true; - if (xTest) - { - var xBoot = new Cosmos.Sys.Boot(); - xBoot.Execute(); - } - - SMBIOS a = new SMBIOS(); - - if( a.CheckSMBIOS() ) - { - a.GetSMBIOS_Data(); - - Console.Write( " SMBios found at: 0x" ); - //Console.Write(Cosmos.Kernel.HexExtension.ToHex(a.SMBBIOSAddress, 8)); - Console.Write( " Version: " ); - Console.Write(a.SMBIOS_Data.SMBIOSMajorVersion); - Console.Write( "." ); - Console.WriteLine(a.SMBIOS_Data.SMBIOSMinorVersion); - - Console.Write( " Signature: " ); - //Console.WriteLine( Cosmos.Kernel.HexExtension.ToHex( a.Signature ) ); - - Console.WriteLine( " SMBIOS dump: " ); - - DumpBytes( a.SMBBIOSAddress, 32, 16 ); - Console.WriteLine( "" ); - - //Console.Write( " SMBIOS anchor: " ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.AnchorString[ 0 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.AnchorString[ 1 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.AnchorString[ 2 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.AnchorString[ 3 ] ) ); - - //Console.Write( " DMI anchor: " ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.IntermediateAnchorString[ 0 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.IntermediateAnchorString[ 1 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.IntermediateAnchorString[ 2 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.IntermediateAnchorString[ 3 ] ) ); - //Console.Write( Cosmos.Kernel.HexExtension.ToHex( a.SMBIOS_Data.IntermediateAnchorString[ 4 ] ) ); - - Console.Write( " Number of tables:" ); - Console.Write( a.SMBIOS_Data.NumberOfSMBIOSStructures ); - - Console.WriteLine( "" ); - Console.Write( a.SMBIOS_Data.StructureTableLength ); - Console.WriteLine( " bytes of data" ); - - Console.Write( " Reading " ); - Console.Write(" tables... " ); - int read = a.ReadTables(); - Console.Write( read ); - Console.WriteLine( " tables read." ); - - Console.WriteLine( " Found Hardware Types:" ); - for( int i = 0; i < a.TableList.Count; i++ ) - { - Console.Write( a.TableList[ i ].TableType ); - Console.Write( " " ); - } - Console.WriteLine( "" ); - - Console.Write( " Interpreting data... " ); - a.InterpretData(); - Console.WriteLine( " done." ); - - - List lst = a.GetHardwareDescriptorByType( TableTypes.BIOSInformation ); - BIOSTable biosinfo; - if( lst.Count > 0 ) - { - BaseInfo ht = lst[ 0 ]; - biosinfo = ( BIOSTable )ht; - Console.WriteLine( " BIOS Information: " ); - Console.Write( " Vendor: " ); - Console.WriteLine( biosinfo.Vendor ); - } - - - ProcessorInformation CPUInfo; - lst = a.GetHardwareDescriptorByType( TableTypes.ProcessorInformation ); - - if( lst.Count > 0 ) - { - CPUInfo = ( ProcessorInformation )lst[ 0 ]; - if( CPUInfo == null ) - Console.WriteLine( " No CPU Information." ); - else - { - Console.WriteLine( " CPU Information: " ); - Console.Write( " CurrentSpeed: " ); - Console.Write( CPUInfo.CurrentSpeed ); - Console.Write( " MHz Core Count: " ); - Console.WriteLine( CPUInfo.CoreCount ); - Console.WriteLine( CPUInfo.ProcessorManufacturer ); - } - } - - - - } - Console.WriteLine( "Press a key to shutdown..." ); - Console.Read(); - - - Console.WriteLine("Done"); - Cosmos.Sys.Deboot.ShutDown(); - } - } -} diff --git a/source/Archive/Cosmos.Hardware/ACPIManager.cs b/source/Archive/Cosmos.Hardware/ACPIManager.cs deleted file mode 100644 index 199f3af999..0000000000 --- a/source/Archive/Cosmos.Hardware/ACPIManager.cs +++ /dev/null @@ -1,342 +0,0 @@ - -using Cosmos.Kernel; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.InteropServices; - -namespace Cosmos.Hardware2 -{ - public static class ACPIManager - { - public static bool Enabled = false; - public static bool Found = false; - public static RSD Rsd; - public static uint[] ACPITable; - - public static int Version - { - get - { - if (Found) - return Rsd.Revision; - else - return 0; - } - } - - [StructLayout(LayoutKind.Explicit)] public struct RSD - { - [FieldOffset(0)] public int Signature0; - [FieldOffset(4)] public int Signature1; - - [FieldOffset(8)] public byte Checksum; - - [FieldOffset(9)] private byte OemID0; - [FieldOffset(10)] private byte OemID1; - [FieldOffset(11)] private byte OemID2; - [FieldOffset(12)] private byte OemID3; - [FieldOffset(13)] private byte OemID4; - [FieldOffset(14)] private byte OemID5; - - [FieldOffset(15)] public byte Revision; - [FieldOffset(16)] public uint RsdtAddress; - - public string Signature - { - get - { - return ""; // Signature0.ToHex(8) + Signature1.ToHex(8); - } - } - public string OemID - { - get - { - return "" + (char)OemID0 + (char)OemID1 + (char)OemID2 + (char)OemID3 + (char)OemID4 + (char)OemID5; - } - } - } - - [StructLayout(LayoutKind.Explicit)] public struct acpi_gen_regaddr - { - [FieldOffset(0)] public byte space_id; - [FieldOffset(1)] public byte bit_width; - [FieldOffset(2)] public byte bit_offset; - [FieldOffset(3)] public byte resv; - [FieldOffset(4)] public uint addrl; - [FieldOffset(8)] public uint addrh; - } - - [StructLayout(LayoutKind.Explicit)] public struct acpi_table_header - { - [FieldOffset(0)] public byte signature0; - [FieldOffset(1)] public byte signature1; - [FieldOffset(2)] public byte signature2; - [FieldOffset(3)] public byte signature3; - - [FieldOffset(4)] public uint length; - [FieldOffset(8)] public byte revision; - [FieldOffset(9)] public byte checksum; - - [FieldOffset(10)] byte oem_id0; - [FieldOffset(11)] byte oem_id1; - [FieldOffset(12)] byte oem_id2; - [FieldOffset(13)] byte oem_id3; - [FieldOffset(14)] byte oem_id4; - [FieldOffset(15)] byte oem_id5; - - [FieldOffset(16)] byte oem_table_id0; - [FieldOffset(17)] byte oem_table_id1; - [FieldOffset(18)] byte oem_table_id2; - [FieldOffset(19)] byte oem_table_id3; - [FieldOffset(20)] byte oem_table_id4; - [FieldOffset(21)] byte oem_table_id5; - [FieldOffset(22)] byte oem_table_id6; - [FieldOffset(23)] byte oem_table_id7; - - [FieldOffset(24)] public uint oem_revision; - [FieldOffset(28)] public uint asl_compiler_id; - [FieldOffset(32)] public uint asl_compiler_revision; - - - public string Signature - { - get - { - return "" + (char)signature0 + (char)signature1 + (char)signature2 + (char)signature3; - } - } - public string OemID - { - get - { - return "" + (char)oem_id0 + (char)oem_id1 + (char)oem_id2 + (char)oem_id3 + (char)oem_id4 + (char)oem_id5; - } - } - public string OemTable - { - get - { - return "" + (char)oem_table_id0 + (char)oem_table_id1 + (char)oem_table_id2 + (char)oem_table_id3 + (char)oem_table_id4 + (char)oem_table_id5 + (char)oem_table_id6 + (char)oem_table_id7; - } - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct Fadt - { - public acpi_table_header header; - - public uint firmware_ctrl; - public uint dsdt; - public byte model; - public byte preferred_pm_profile; - public ushort sci_int; - public uint smi_cmd; - public byte acpi_enable; - public byte acpi_disable; - public byte s4bios_req; - public byte pstate_cnt; - public uint pm1a_evt_blk; - public uint pm1b_evt_blk; - public uint pm1a_cnt_blk; - public uint pm1b_cnt_blk; - public uint pm2_cnt_blk; - public uint pm_tmr_blk; - public uint gpe0_blk; - public uint gpe1_blk; - public byte pm1_evt_len; - public byte pm1_cnt_len; - public byte pm2_cnt_len; - public byte pm_tmr_len; - public byte gpe0_blk_len; - public byte gpe1_blk_len; - public byte gpe1_base; - public byte cst_cnt; - public ushort p_lvl2_lat; - public ushort p_lvl3_lat; - public ushort flush_size; - public ushort flush_stride; - public byte duty_offset; - public byte duty_width; - public byte day_alrm; - public byte mon_alrm; - public byte century; - public ushort iapc_boot_arch; - public byte res2; - public uint flags; - public acpi_gen_regaddr reset_reg; - public byte reset_value; - public byte res3; - public byte res4; - public byte res5; - public uint x_firmware_ctl_l; - public uint x_firmware_ctl_h; - public uint x_dsdt_l; - public uint x_dsdt_h; - public acpi_gen_regaddr x_pm1a_evt_blk; - public acpi_gen_regaddr x_pm1b_evt_blk; - public acpi_gen_regaddr x_pm1a_cnt_blk; - public acpi_gen_regaddr x_pm1b_cnt_blk; - public acpi_gen_regaddr x_pm2_cnt_blk; - public acpi_gen_regaddr x_pm_tmr_blk; - public acpi_gen_regaddr x_gpe0_blk; - public acpi_gen_regaddr x_gpe1_blk; - } - - public unsafe static void Init() - { - Console.Write("Looking for ACPI..."); - - uint rsdp = RSDPAddress(); - - if (rsdp != 0) - { - Rsd = *((RSD*)rsdp); - - - Found = true; - - //Console.WriteLine("Found Version " + Rsd.Revision + " (" + Rsd.OemID + ") @ " + rsdp.ToHex(8)); - - acpi_table_header* Rsdt = (acpi_table_header*)Rsd.RsdtAddress; - uint i = Rsdt->length; - i = (i - 36) / 4; - - Console.WriteLine(i + " entrys found"); - - ACPITable = new uint[i]; - - uint rsdt = Rsd.RsdtAddress; - for (int j = 0; j < i; j++) - { - ACPITable[j] = *(uint*)(rsdt + 36 +j*4); - acpi_table_header* header = (acpi_table_header*)ACPITable[j]; - - - } - Console.Read(); - - } - else - { - Console.WriteLine("Not Found"); - } - - } - - public static unsafe uint RSDPAddress() - { - Console.Write("searching for acpi...searching BIOS..."); - // check bios - for (uint addr = 0xE0000; addr < 0x100000; addr += 4) - if (CheckForRSDP(addr)) - return addr; - - Console.Write("searching EBD..."); - - // check extended bios - uint ebda_address = *((uint*)0x040E); - - ebda_address = (ebda_address * 0x10) & 0x000fffff; - - for (uint addr = ebda_address; addr < ebda_address + 1024; addr += 4) - if (CheckForRSDP(addr)) - return addr; - - // not found - return 0; - } - - public static unsafe bool CheckForRSDP(uint addr) - { - // check signature - byte* ch = (byte*)addr; - - if (*(ch++) != (byte)'R') return false; - if (*(ch++) != (byte)'S') return false; - if (*(ch++) != (byte)'D') return false; - if (*(ch++) != (byte)' ') return false; - if (*(ch++) != (byte)'P') return false; - if (*(ch++) != (byte)'T') return false; - if (*(ch++) != (byte)'R') return false; - if (*(ch++) != (byte)' ') return false; - - // check checksum - byte sum = 0; - byte* check = (byte*)addr; - - for (int i = 0; i < 20; i++) - sum += *(check++); - - return (sum == 0); - } - - // checks for a given header and validates checksum - public static unsafe bool acpiCheckHeader(int ptr, string sig) - { - byte* b = (byte*)ptr; - - for (int i = 0; i < sig.Length; i++) - if (*(b++) != (byte)sig[i]) - return false; - - byte* checkPtr = (byte*)ptr; - int len = *(&ptr + 1); - byte check = 0; - - while (0 < len--) - check += *(checkPtr++); - - return (check == 0); - } - - - - public static unsafe bool acpiEnable() - { - /* - // check if acpi is enabled - if ( (CPUBus.Read16((unsigned int) PM1a_CNT) & SCI_EN) == 0 ) - { - // check if acpi can be enabled - if (SMI_CMD != 0 && ACPI_ENABLE != 0) - { - outb((unsigned int) SMI_CMD, ACPI_ENABLE); // send acpi enable command - // give 3 seconds time to enable acpi - int i; - for (i=0; i<300; i++ ) - { - if ( (inw((unsigned int) PM1a_CNT) &SCI_EN) == 1 ) - break; - sleep(10); - } - if (PM1b_CNT != 0) - for (; i<300; i++ ) - { - if ( (inw((unsigned int) PM1b_CNT) &SCI_EN) == 1 ) - break; - sleep(10); - } - if (i<300) { - wrstr("enabled acpi.\n"); - return 0; - } else { - wrstr("couldn't enable acpi.\n"); - return -1; - } - } else { - wrstr("no known way to enable acpi.\n"); - return -1; - } - } else { - //wrstr("acpi was already enabled.\n"); - return 0; - }*/ - return false; - } - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/ATA.cs b/source/Archive/Cosmos.Hardware/ATA.cs deleted file mode 100644 index e949c7ad7b..0000000000 --- a/source/Archive/Cosmos.Hardware/ATA.cs +++ /dev/null @@ -1,454 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Storage.ATA -{ - public class ATA : BlockDevice - { - //private static readonly ushort[] mControllerAddresses1 = new ushort[] { - // 0x1F0, - // 0x170 - //}; - //private static readonly ushort[] mControllerAddresses2 = new ushort[] { - //0x3F0, - // 0x370 - //}; - private static ushort GetControllerAddress1(int aIndex) - { - if (aIndex == 0) - { - return 0x1F0; - } - else - { - return 0x170; - } - } - - private static ushort GetControllerAddress2(int aIndex) - { - if (aIndex == 0) - { - return 0x3F0; - } - else - { - return 0x370; - } - } - - private static int GetControllerAddressCount() - { - return 2; - } - private static string[] mControllerNumbers = new string[] { "First", "Second", "Third", "Fourth" }; - private static string[] mControllerChannels = new string[] { "Primary", "Secondary" }; - private static string[] mDriveNames = new string[] { "Master", "Slave" }; - private const byte ATA_DELAY_DEFAULT = 5; - private const byte ATA_DATA = 0; - private const byte ATA_ERROR = 1; - private const byte ATA_SECTORCOUNT = 2; - private const byte ATA_SECTORNUMBER = 3; - private const byte ATA_CYLINDERLOW = 4; - private const byte ATA_CYLINDERHIGH = 5; - private const byte ATA_DRIVEHEAD = 6; - private const byte ATA_STATUS = 7; - private const byte ATA_COMMAND = 8; - - private const byte IDE_STATUSREG_ERR = 0x00000001; - private const byte IDE_STATUSREG_IDX = 0x00000002; - private const byte IDE_STATUSREG_CORR = 0x00000004; - private const byte IDE_STATUSREG_DRQ = 0x00000008; - private const byte IDE_STATUSREG_DSC = 0x00000010; - private const byte IDE_STATUSREG_DWF = 0x00000020; - private const byte IDE_STATUSREG_DRDY = 0x00000040; - private const byte IDE_STATUSREG_BSY = 0x00000080; - private const byte IDE_ERRORREG_ABRT = 0x00000004; - - private const uint Timeout = 60; - - private enum ATA_Commands : byte - { - Nop = 0x00, - CfaRequestExtErrCode = 0x03, - DeviceReset = 0x08, - Recalibrate = 0x10, - ReadSectors = 0x20, - ReadSectorsExt = 0x24, - ReadDmaExt = 0x25, - ReadDmaQueuedExt = 0x26, - ReadMultipleExt = 0x29, - WriteSectors = 0x30, - WriteSectorsExt = 0x34, - WriteDmaExt = 0x35, - WriteDmaQueuedExt = 0x36, - CfaWriteSectorsWoErase = 0x38, - WriteMultipleExt = 0x39, - WriteVerify = 0x3C, - ReadVerifySectors = 0x40, - ReadVerifySectorsExt = 0x42, - FormatTrack = 0x50, - Seek = 0x70, - CfaTranslateSector = 0x87, - ExecuteDeviceDiagnostic = 0x90, - InitializeDriveParameters = 0x91, - InitializeDeviceParameters = 0x91, - StandbyImmediate2 = 0x94, - IdleImmediate2 = 0x95, - Standby2 = 0x96, - Idle2 = 0x97, - CheckPowerMode2 = 0x98, - Sleep2 = 0x99, - Packet = 0xA0, - IdentifyDevicePacket = 0xA1, - IdentifyPacketDevice = 0xA1, - Smart = 0xB0, - CfaEraseSectors = 0xC0, - ReadMultiple = 0xC4, - WriteMultiple = 0xC5, - SetMultipleMode = 0xC6, - ReadDmaQueued = 0xC7, - ReadDma = 0xC8, - WriteDma = 0xCA, - WriteDmaQueued = 0xCC, - CfaWriteMultipleWoErase = 0xCD, - StandbyImmediate1 = 0xE0, - IdleImmediate1 = 0xE1, - Standby1 = 0xE2, - Idle1 = 0xE3, - ReadBuffer = 0xE4, - CheckPowerMode1 = 0xE5, - Sleep1 = 0xE6, - FlushCache = 0xE7, - WriteBuffer = 0xE8, - FlushCacheExt = 0xEA, - IdentifyDevice = 0xEC, - SetFeatures = 0xEF, - } - private enum DeviceControlBits : byte - { - /// - /// High Order Byte (48-bit LBA) - /// - HighOrderByte = 0x80, - /// - /// Soft reset - /// - CB_DC_SRST = 0x04,// soft reset - /// - /// Disable interrupts - /// - CB_DC_NIEN = 0x02 // disable interrupts - - } - - private readonly string mName; - private readonly byte mControllerIndex; - private readonly ushort mController; - private readonly ushort mController2; - private readonly ushort mController_Data; - private readonly ushort mController_Error; - private readonly ushort mController_FeatureReg; - private readonly ushort mController_SectorCount; - private readonly ushort mController_SectorNumber; - private readonly ushort mController_CylinderLow; - private readonly ushort mController_CylinderHigh; - private readonly ushort mController_DeviceHead; - private readonly ushort mController_PrimaryStatus; - private readonly ushort mController_Command; - private readonly ushort mController_AlternateStatus; - private readonly ushort mController_DeviceControl; - private readonly ushort mController_DeviceAddress; - private readonly bool mIsPrimary; - /* -#define CB_DATA 0 // data reg in/out pio_base_addr1+0 -#define CB_ERR 1 // error in pio_base_addr1+1 -#define CB_FR 1 // feature reg out pio_base_addr1+1 -#define CB_SC 2 // sector count in/out pio_base_addr1+2 -#define CB_SN 3 // sector number in/out pio_base_addr1+3 -#define CB_CL 4 // cylinder low in/out pio_base_addr1+4 -#define CB_CH 5 // cylinder high in/out pio_base_addr1+5 -#define CB_DH 6 // device head in/out pio_base_addr1+6 -#define CB_STAT 7 // primary status in pio_base_addr1+7 -#define CB_CMD 7 // command out pio_base_addr1+7 -#define CB_ASTAT 8 // alternate status in pio_base_addr2+6 -#define CB_DC 8 // device control out pio_base_addr2+6 -#define CB_DA 9 // device address in pio_base_addr2+7*/ - private readonly byte mDrive; - private ATA(string aName, byte aController, byte aDrive) - { - mName = aName; - mControllerIndex = aController; - mController = GetControllerAddress1(aController); - mController2 = GetControllerAddress2(aController); - mType = DeviceType.Storage; - mDrive = aDrive; - mController_Data = mController; - mIsPrimary = aController == 0; - mController_Error = (ushort)(mController + 1); - mController_FeatureReg = (ushort)(mController + 1); - mController_SectorCount = (ushort)(mController + 2); - mController_SectorNumber = (ushort)(mController + 3); - mController_CylinderLow = (ushort)(mController + 4); - mController_CylinderHigh = (ushort)(mController + 5); - mController_DeviceHead = (ushort)(mController + 6); - mController_PrimaryStatus = (ushort)(mController + 7); - mController_Command = (ushort)(mController + 7); - mController_AlternateStatus = (ushort)(mController2 + 6); - mController_DeviceControl = (ushort)(mController2 + 6); - mController_DeviceAddress = (ushort)(mController2 + 7); - IOWriteByte(mController_DeviceControl, 0); - mBlockCount = GetBlockCount(); - } - - private uint GetBlockCount() - { - IOWriteByte(mController_DeviceHead, (byte)((mDrive << 4) + (1 << 6))); - //uint xTimeout = Timeout; - while ((IOReadByte(mController_Command) & IDE_STATUSREG_DRDY) == 0) - { - ; ; ; - //xTimeout--; - } - if ((IOReadByte(mController_Command) & IDE_STATUSREG_DRDY) == 0) - { - throw new Exception("[ATA#1] GetBlockCount failed!"); - } - IOWriteByte(mController_Command, 0xF8); - //xTimeout = Timeout; - while ((IOReadByte(mController_Command) & IDE_STATUSREG_BSY) != 0) - { - //CPU.Halt(); - //xTimeout--; - ; ; ; - } - if ((IOReadByte(mController_Command) & IDE_STATUSREG_BSY) != 0) - { - throw new Exception("[ATA#2] GetBlockCount failed!"); - } - uint xResult = IOReadByte(mController_SectorNumber); - xResult += (uint)IOReadByte(mController_CylinderLow) << 8; - xResult += (uint)IOReadByte(mController_CylinderHigh) << 16; - xResult += (uint)(IOReadByte(mController_DeviceHead) & 0xF) << 8; - return xResult; - } - - public static void HandleInterruptSecondary() - { - mSecondaryInterruptCount++; - IOReadByte((ushort)(GetControllerAddress1(0) + 7)); - } - - private static uint mSecondaryInterruptCount; - - public static void HandleInterruptPrimary() - { - mPrimaryInterruptCount++; - IOReadByte((ushort)(GetControllerAddress1(1) + 7)); - } - - private static uint mPrimaryInterruptCount; - - public static void Initialize() - { - for (byte xControllerBaseAIdx = 0; xControllerBaseAIdx < GetControllerAddressCount(); xControllerBaseAIdx++) - { - var xOldValue = IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)); - IOWriteByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS), (byte)(xOldValue | 0x4)); - IOWriteByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS), xOldValue); - - for (byte xDrive = 0; xDrive < 2; xDrive++) - { - IOWriteByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_DRIVEHEAD), - (byte)((xControllerBaseAIdx << 4) | 0xA0 | (xDrive << 4))); - Console.Write(" Drive " + xDrive); - // we should wait 400ns - IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)); - IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)); - IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)); - IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)); - // end wait 400ns - if (IOReadByte((ushort)(GetControllerAddress1(xControllerBaseAIdx) + ATA_STATUS)) == 0x50) - { - ATA xATA = xATA = new ATA(String.Concat(mControllerNumbers[xControllerBaseAIdx], " ", mDriveNames[xDrive]), xControllerBaseAIdx, xDrive); - Device.Add(xATA); - } - } - } - } - - public override uint BlockSize - { - get - { - return 512; - } - } - - private readonly ulong mBlockCount; - - public override ulong BlockCount - { - get - { - return mBlockCount; - } - } - /* -#define CB_DATA 0 // data reg in/out pio_base_addr1+0 -#define CB_ERR 1 // error in pio_base_addr1+1 -#define CB_FR 1 // feature reg out pio_base_addr1+1 -#define CB_SC 2 // sector count in/out pio_base_addr1+2 -#define CB_SN 3 // sector number in/out pio_base_addr1+3 -#define CB_CL 4 // cylinder low in/out pio_base_addr1+4 -#define CB_CH 5 // cylinder high in/out pio_base_addr1+5 -#define CB_DH 6 // device head in/out pio_base_addr1+6 -#define CB_STAT 7 // primary status in pio_base_addr1+7 -#define CB_CMD 7 // command out pio_base_addr1+7 -#define CB_ASTAT 8 // alternate status in pio_base_addr2+6 -#define CB_DC 8 // device control out pio_base_addr2+6 -#define CB_DA 9 // device address in pio_base_addr2+7*/ - public override void ReadBlock(ulong aBlock, byte[] aBuffer) - { - // 1) Read the status register of the primary or the secondary IDE controller. - // 2) The BSY and DRQ bits must be zero if the controller is ready. - uint xSleepCount = Timeout; - while (((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != 0) && xSleepCount > 0) - { - //CPU.Halt(); - // xSleepCount--; - ; ; ; - } - if (((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != 0) && xSleepCount > 0) - { - throw new Exception("[ATA#2] Read failed"); - } - //3) Set the DEV bit to 0 for Drive0 and to 1 for Drive1 on the selected IDE controller using - // the Device/Head register and wait for approximately 400 nanoseconds using some NOP perhaps. - IOWriteByte(mController_DeviceHead, (byte)(mDrive << 4)); - //4) Read the status register again. - //5) The BSY and DRQ bits must be 0 again for you to know that the IDE controller and the selected IDE drive are ready. - xSleepCount = Timeout; - while (((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != 0) && xSleepCount > 0) - { - //CPU.Halt(); - //xSleepCount--; - ; ; ; - } - if (((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != 0) && xSleepCount > 0) - { - throw new Exception("[ATA#5] Read failed"); - } - // 6) Write the LBA28 address to the designated IDE registers. - IOWriteByte(mController_SectorNumber, (byte)aBlock); - IOWriteByte(mController_CylinderLow, (byte)(aBlock >> 8)); - IOWriteByte(mController_CylinderHigh, (byte)(aBlock >> 16)); - IOWriteByte(mController_DeviceHead, (byte)(0xE0 | (mDrive << 4) | ((byte)((aBlock >> 24) & 0x0F)))); - // 7) Set the Sector count using the Sector Count register. - IOWriteByte(mController_SectorCount, 1); - //8) Issue the Read Sector(s) command. - IOWriteByte(mController_Command, 0x20); - // 9) Read the Error register. If the ABRT bit is set then the Read Sector(s) command - // is not supported for that IDE drive. If the ABRT bit is not set, continue to the next step. - if ((IOReadByte(mController_Error) & IDE_ERRORREG_ABRT) == IDE_ERRORREG_ABRT) - { - throw new Exception("[ATA#9] Read failed"); - } - // 10) If you want to receive interrupts after reading each sector, clear the nIEN bit in the - // Device Control register. If you do not clear this bit then interrupts will not be generated - // after the reading of each sector which might cause an infinite loop if you are waiting for them. - // The Primary IDE Controller will generate IRQ14 and the secondary IDE controller generates IRQ 15. - IOWriteByte(mController_DeviceControl, 0); // receive interrupts... - // 11) Read the Alternate Status Register (you may even ignore the value that is read) - IOReadByte(mController_AlternateStatus); - // 12) Read the Status register for the selected IDE Controller. - IOReadByte(mController_Command); - //13) Whenever a sector of data is ready to be read from the Data Register, the BSY bit - // in the status register will be set to 0 and DRQ to 1 so you might want to wait until - // those bits are set to the mentioned values before attempting to read from the drive. - xSleepCount = Timeout; - while (((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != IDE_STATUSREG_DRQ) && xSleepCount != 0) - { - //xSleepCount--; - //CPU.Halt(); - ; ; ; - } - if ((IOReadByte(mController_Command) & (IDE_STATUSREG_BSY | IDE_STATUSREG_DRQ)) != IDE_STATUSREG_DRQ) - { - throw new Exception("[ATA#13] Read failed"); - } - //14) Read one sector from the IDE Controller 16-bits at a time using the IN or the INSW instructions. - for (uint i = 0; i < 256; i++) - { - ushort xValue = IOReadWord(mController); - aBuffer[i * 2] = (byte)xValue; - aBuffer[(i * 2) + 1] = (byte)(xValue >> 8); - } - // 15) See if you have to read one more sector. If yes, repeat from step 11 again. - //16) If you don't need to read any more sectors, read the Alternate Status Register and ignore the byte that you read. - IOReadByte(mController_AlternateStatus); - //17) Read the status register. When the status register is read, the IDE Controller will negate - // the INTRQ and you will not have pending IRQs waiting to be detected. This is a MUST to read - // the status register when you are done reading from IDE ports. - IOReadByte(mController_Command); - } - - public override void WriteBlock(ulong aBlock, byte[] aContents) - { - uint xSleepCount = Timeout; - while (((IOReadByte(mController_Command) & 0x80) == 0x80) && xSleepCount > 0) - { - //CPU.Halt(); - //xSleepCount--; - ; ; ; - } - if (xSleepCount == 0) - { - throw new Exception("[ATA|WriteBlockNew] Failed 1"); - } - IOWriteByte(mController_FeatureReg, 0); - IOWriteByte(mController_SectorCount, 1); - IOWriteByte(mController_SectorNumber, (byte)aBlock); - IOWriteByte(mController_CylinderLow, (byte)(aBlock >> 8)); - IOWriteByte(mController_CylinderHigh, (byte)(aBlock >> 16)); - IOWriteByte(mController_DeviceHead, (byte)(0xE0 | (mDrive << 4) | (byte)(aBlock >> 24))); - IOWriteByte(mController_DeviceControl, 0); // receive interrupts... - IOWriteByte(mController_Command, 0x30); - xSleepCount = Timeout; - while (((IOReadByte(mController_Command) & 0x80) == 0x80) && xSleepCount > 0) - { - //CPU.Halt(); - //xSleepCount--; - ; ; ; - } - if (xSleepCount == 0) - { - throw new Exception("[ATA|WriteBlockNew] Failed 2"); - } - xSleepCount = Timeout; - while (((IOReadByte(mController_AlternateStatus) & 0x8) == 0x8) && xSleepCount > 0) - { - //CPU.Halt(); - //xSleepCount--; - ; ; ; - } - if (xSleepCount == 0) - { - throw new Exception("[ATA|WriteBlockNew] Failed 3"); - } - for (int i = 0; i < 256; i++) - { - IOWriteWord(mController_Data, (ushort)((aContents[i * 2]) | (aContents[i * 2 + 1] << 8))); - } - } - - public override string Name - { - get - { - return mName; - } - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Components/DACak4531.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Components/DACak4531.cs deleted file mode 100644 index 25a28f70cd..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Components/DACak4531.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Components -{ - class DACak4531 : Cosmos.Hardware2.Audio.Devices.Generic.Components.DACEntity - { - public DACak4531() : base() { } - - public enum Bit : byte - { - LeftMasterVol = 0x00, //master volume left - RightMasterVol = 0x01, //master volume right - LeftVoiceVol= 0x02, // channel volume left - RightVoiceVol = 0x03, //channel volume right - LeftFMVol = 0x04, //FM volume left - RightFMVol = 0x05,//FM volume right - LeftCDVol = 0x06, //CD Volume left - RightCDVol = 0x07, - MonoLeft = 0x0c, //Mono volume left - MonoRight= 0x0d, //Mono volume right - MonoOutVol= 0x0f, //Mono out volume - Sw1Out=0x10, //Mixer output chooser 1 - Sw2Out = 0x11, //Mixer output chooser 2 - Sw1In = 0x12, - Sw2In = 0x13, - Reset=0x16, - Clock=0x17, - Ad=0x18 - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/ES1370.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/ES1370.cs deleted file mode 100644 index 2ab774e79a..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/ES1370.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.Audio.Devices.ES1370.Registers; -using Cosmos.Hardware2.Audio.Devices.ES1370.Components; -using Cosmos.Hardware2.Audio.Devices.ES1370.Managers; -namespace Cosmos.Hardware2.Audio.Devices.ES1370 -{ - /// - /// Driver for the soundcard Ensoniq 1370 AudioPCI (testing for QEMU audio emulation) - /// It should work also in Ensoniq 1371 all revision. - /// - public class ES1370 : GenericSoundCard - { - private InterruptStatusRegister isr; - private ControlRegister cr; - private SerialInterfaceRegister sir; - private UARTInterfaceRegister uir; - public int[] FixedRatesSupported={5512, 11025, 22050, 44100}; - public const int SRClock = 1411200; - public const int minClockDen=29; - public const int maxClockDen=353; - public const int clockStep=1; - public const byte DACPage = 0x0c; - public const byte UARTPage = 0x0e; - public const byte UART1Page = 0x0f; - public const byte DAC1SMPREG =0x70; - public const byte DAC2SMPREG=0x74; - public const byte DAC1VolSMPREG=0x7c; - public const byte DAC2VolSMPREG=0x7e; - public const byte TruncNumSMPREG=0x00; - public const byte INTRegsSMPREG=0x01; - public const byte AccumFrac=0x02; - public const byte VFreqFrac = 0x03; - - public ES1370(PCIDevice device) : base(device) - { - isr=(InterruptStatusRegister.Load(getMemReference())); - sir = (SerialInterfaceRegister.Load(getMemReference())); - uir = (UARTInterfaceRegister.Load(getMemReference())); - cr=(ControlRegister.Load(getMemReference())); - //dacs.Add(new AK(new DACak4531(), cr.DAC1Enabled,(byte)MainRegister.Bit.SerialIntContr,MainRegister.Bit.Dac1FrameAddr, (byte)MainRegister.Bit.Dac1FrameSize)); - //dacs.Add(new DACManager(new DACak4531(), cr.DAC2Enabled, (byte)MainRegister.Bit.SerialIntContr, (byte)MainRegister.Bit.Dac2FrameAddr, (byte)MainRegister.Bit.Dac2FrameSize)); - } - /// - /// Retrieve all Ensoniq AudioPCI 1370 cards found on computer. - /// - /// - public static List FindAll() - { - List found = new List(); - - foreach (PCIDevice device in Cosmos.Hardware2.PCIBus.Devices) - { - Console.WriteLine("VendorID: " + device.VendorID + " - DeviceID: " + device.DeviceID); - if (device.VendorID == 0x10EC && device.DeviceID == 0x8139) - found.Add(new ES1370(device)); - } - - return found; - } - - #region Power Management - public override bool Enable() - { - cr.PowerEnabled=true; - return cr.PowerEnabled; - } - - public override bool Disable() - { - cr.PowerEnabled = false; - return cr.PowerEnabled; - } - - public void InitializeDriver() - { - //Cosmos.Hardware2.Interrupts.IRQ05 = new Cosmos.Hardware2.Interrupts.InterruptDelegate(this.HandleAudioInterrupt); - //Cosmos.Hardware2.Interrupts.AddIRQHandler(5, this.HandleAudioInterrupt); - } - - #endregion - - public string Name - { - get { return "Generic ES1370 Audio device"; } - } - - - - #region Interrupt (IRQ) - /// - /// (Should be) Called when the PCI audio card raises an Interrupt. - /// - //public void HandleAudioInterrupt(ref IRQContext aContext) - //{ - // Console.Write("IRQ detected: "); - // if (isr.IsCodecBusyIntEnabled) - // Console.WriteLine("Codec busy Interrupt! "); - // if(isr.IsCodecStatusIntEnabled) - // Console.WriteLine("Codec Enabled Interrupt! "); - // if (isr.IsCodecWriteInProgressEnabled) - // Console.WriteLine("Codec WriteInProgress Interrupt!"); - // if (isr.IsDAC1InterruptEnabled) - // Console.WriteLine("DAC1 Interrupt!"); - // if (isr.IsDAC2InterruptEnabled) - // Console.WriteLine("DAC2 Interrupt!"); - // if (isr.IsUARTInterruptEnabled) - // Console.WriteLine("UART Interrupt!"); - // if (isr.IsMCCBIntEnabled) - // Console.WriteLine("MCCB Interrupt!"); - // this.ResetAllIRQ(); - - //} - - private void ResetAllIRQ() - { - //Setting a bit to 1 will reset it. So we write 16 one's to reset entire getISR(). - isr.ISR = 0xFFFF; - } - - /// - /// The IRQMaskRegister determines what kind of events which cause IRQ to be raised. - /// - #endregion - #region Debugging - - public void DumpRegisters() - { - Console.WriteLine("Control Register: " + cr.ToString()); - Console.WriteLine("Status Register: " + isr.ToString()); - } - #endregion - -#region I/O Helper routine - private void setDataOnDACCodec(AK4531Manager dacManager){ } - private byte getMemPageValueByNum(byte num) - { - return getMemReference().Read8((UInt32)(Registers.MainRegister.Bit.MemPageAddr+(byte)((num) & 0x0f))); - } - - private void setMemPageValueByNum(byte num, byte value) - { - getMemReference().Write8((UInt32)(Registers.MainRegister.Bit.MemPageAddr + (byte)((num) & 0x0f)), value); - } - private int getDAC2DividendRatio(int num) - { - int offset = (((num) & 0x1fff) << 16); - return getMemReference().Read8((UInt32)(Registers.MainRegister.Bit.Control + (byte)offset)); - } - private void setDAC2ClockInDividendRatio(int num,byte value) - { - int offset = (((num) >> 16) & 0x1fff); - getMemReference().Write8((UInt32)(Registers.MainRegister.Bit.Control + (byte)offset),value); - } - private int getDAC1ClockDividendRatio(byte num) - { - int offset = (((num) & 0x03) << 12); - return getMemReference().Read8((UInt32)(((Registers.MainRegister.Bit.Control) + (byte)offset))); - } - - private void setVoiceCodeFromCCBNum(byte num, byte value) - { - int offset = (((num) >> 5) & 0x03); - getMemReference().Write8((UInt32)(Registers.MainRegister.Bit.Status + (byte)offset), value); - } - - private void setTxUARTInterruptInFromNum(int num, byte value){ - byte offset = (byte)(((num) >> 5) & 0x03); - getMemReference().Write8((UInt32)(MainRegister.Bit.UartInfo + (byte)offset), value); - } - private byte getTxUARTInterruptOutFromNum(byte num) - { - byte offset = (byte)(((num) & 0x03 ) << 5); - return getMemReference().Read8((UInt32)(MainRegister.Bit.UartInfo + (byte)offset)); - } - private byte controlOutFromNum(byte num) - { - return getMemReference().Read8((UInt32)(MainRegister.Bit.UartInfo + (byte)((num) & 0x03))); - } - - private int SRClockDivideByNum(int n) - { - return (SRClock / n - 2); - } - -#endregion - private void preparePlayBackOnDac(AK4531Manager dacManager) - { - //dacManager.setDACStateEnabled(true); - - } - public override void playStream(PCMStream pcmStream) - { - for (int count = 0; count < pcmStream.getData().Length; count++) - { - - } - } - - - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Managers/AK4531Manager.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Managers/AK4531Manager.cs deleted file mode 100644 index efc7a4e6f6..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Managers/AK4531Manager.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Managers -{ - class AK4531Manager : Cosmos.Hardware2.Audio.Devices.Generic.Managers.DACManager - { - private Kernel.MemoryAddressSpace xMem; - //private char[] buffer; - //bool dacEnabled; - public AK4531Manager(Cosmos.Hardware2.Audio.Devices.ES1370.Components.DACak4531 dacEntity, Kernel.MemoryAddressSpace aMem, byte dacPage,byte dacAddress, byte dacByteSize) : base(dacEntity) - { - xMem = aMem; - } - - protected override bool setDacActiveState(bool state) - { - return false; - - } - } - } diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/CommandRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/CommandRegister.cs deleted file mode 100644 index 8cad4d2618..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/CommandRegister.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class CommandRegister{ - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/ControlRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/ControlRegister.cs deleted file mode 100644 index e742a34e5f..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/ControlRegister.cs +++ /dev/null @@ -1,213 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class ControlRegister - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static ControlRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new ControlRegister(aMem); - } - - private ControlRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - /// - /// Get or Sets the 8 bits in the Control Register. - /// - public byte CONTROL - { - get - { - return xMem.Read8((UInt32)Registers.MainRegister.Bit.Control); - } - set - { - xMem.Write8((UInt32)Registers.MainRegister.Bit.Control, value); - } - } - - #endregion - - #region Register Data - - public bool PowerEnabled - { - get - { - return !GetBit(BitPosition.SERRDis); - } - set - { - SetBit(BitValue.SERRDis, !value); - } - } - - public bool CodecEnabled - { - get - { - return GetBit(BitPosition.CodecEn); - } - set - { - SetBit(BitValue.CodecEn, value); - } - } - - public bool DAC1Enabled - { - get - { - return GetBit(BitPosition.DAC1En); - } - set - { - SetBit(BitValue.DAC1En, value); - } - } - - public bool DAC2Enabled - { - get - { - return GetBit(BitPosition.DAC2En); - } - set - { - SetBit(BitValue.DAC2En, value); - } - } - - public bool UARTEnabled - { - get - { - return GetBit(BitPosition.UARTEn); - } - set - { - SetBit(BitValue.UARTEn, value); - } - } - public bool MemoryBusRequestEnabled - { - get - { - return GetBit(BitPosition.BREQEn); - } - set - { - SetBit(BitValue.BREQEn, value); - } - } - - public ClockSourceType ClockSourceTypeSelected - { - get - { - if (GetBit(BitPosition.MSBB)) - return ClockSourceType.MPEGClock; - else - return ClockSourceType.GenClock; - } - set - { - if (value.Equals(ClockSourceType.GenClock)) - SetBit(BitValue.MSBB, true); - else - SetBit(BitValue.MSBB, false); - } - } - - public MPEGDataType MPEGDataTypeSelected - { - get - { - if (GetBit(BitPosition.MSFMTSEL)) - return MPEGDataType.I2S; - else - return MPEGDataType.SONY; - } - set - { - if (value.Equals(MPEGDataType.I2S)) - SetBit(BitValue.MSFMTSEL, true); - else - SetBit(BitValue.MSFMTSEL, false); - } - } - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.CONTROL, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.CONTROL = (byte)(this.CONTROL | (byte)bit); - else - this.CONTROL = (byte)(this.CONTROL & ~(byte)bit); - } - - public override string ToString() - { - return this.CONTROL.ToBinary(8); - } - - #endregion - - } - #region Bits - - [Flags] - public enum BitPosition : byte - { - SERRDis = 0, - CodecEn = 1, - UARTEn = 3, - DAC2En = 5, - DAC1En = 6, - BREQEn = 7, //memory bus request enable - MSBB = 14, //clock source for DAC: gen (0) - MPEG(1) - MSFMTSEL = 15 //MPEG data SONY(0)/I2S(1) - } - - [Flags] - public enum BitValue : uint - { - SERRDis = BinaryHelper.BitPos.BIT0, - CodecEn = BinaryHelper.BitPos.BIT1, - UARTEn = BinaryHelper.BitPos.BIT3, - DAC2En = BinaryHelper.BitPos.BIT5, - DAC1En = BinaryHelper.BitPos.BIT6, - BREQEn = BinaryHelper.BitPos.BIT7, - MSBB = BinaryHelper.BitPos.BIT14, - MSFMTSEL = BinaryHelper.BitPos.BIT15 - } - - public enum ClockSourceType : uint - { - GenClock = 0, - MPEGClock = 1 - } - - public enum MPEGDataType : uint - { - SONY = 0, - I2S = 1 - } - #endregion -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/InterruptStatusRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/InterruptStatusRegister.cs deleted file mode 100644 index 9d20742bd5..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/InterruptStatusRegister.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - /// - /// The InterruptStatusRegister is used to indicate why an IRQ was raised. Used in conjunction with the InterruptMaskRegister. - /// - class InterruptStatusRegister - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static InterruptStatusRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new InterruptStatusRegister(aMem); - } - - private InterruptStatusRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - public UInt16 ISR - { - get - { - return xMem.Read16((UInt32)Registers.MainRegister.Bit.Status); - } - set - { - xMem.Write16((UInt32)Registers.MainRegister.Bit.Status, value); - } - } - - public override string ToString() - { - return this.ISR.ToBinary(16); - } - - #endregion - - #region Data - public bool IsDAC1InterruptEnabled - { - get { return GetBit(BitPosition.IsDAC1IntEn); } - set { SetBit(BitValue.IsDAC1IntEn, value); } - } - - public bool IsDAC2InterruptEnabled - { - get { return GetBit(BitPosition.IsDAC2IntEn); } - set { SetBit(BitValue.IsDAC2IntEn, value); } - } - - public bool IsUARTInterruptEnabled - { - get { return GetBit(BitPosition.IsUARTIntEn); } - set { SetBit(BitValue.IsUARTIntEn, value); } - } - - public bool IsCodecWriteInProgressEnabled - { - get { return GetBit(BitPosition.IsCodecWIPIntEn); } - set { SetBit(BitValue.IsCodecWIPIntEn, value); } - } - - public bool IsCodecBusyIntEnabled - { - get { return GetBit(BitPosition.IsCodecBusyIntEn); } - set { SetBit(BitValue.IsCodecBusyIntEn, value); } - } - - public bool IsCodecStatusIntEnabled - { - get { return GetBit(BitPosition.IsCodecStatIntEn); } - set { SetBit(BitValue.IsCodecStatIntEn, value); } - } - - public bool IsMCCBIntEnabled - { - get { return GetBit(BitPosition.IsMCCBIntEn); } - set { SetBit(BitValue.IsMCCBIntEn, value); } - } - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.ISR, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.ISR = (byte)(this.ISR | (byte)bit); - else - this.ISR = (byte)(this.ISR & ~(byte)bit); - - } - - #endregion - - #region Bits - - [Flags] - public enum BitPosition : byte - { - IsDAC2IntEn = 1, - IsDAC1IntEn = 2, - IsUARTIntEn = 3, - IsMCCBIntEn = 4, - IsCodecWIPIntEn = 8, - IsCodecBusyIntEn = 9, - IsCodecStatIntEn = 10 - } - - public enum BitValue : uint - { - IsDAC2IntEn = BinaryHelper.BitPos.BIT1, - IsDAC1IntEn = BinaryHelper.BitPos.BIT2, - IsUARTIntEn = BinaryHelper.BitPos.BIT3, - IsMCCBIntEn = BinaryHelper.BitPos.BIT4, - IsCodecWIPIntEn = BinaryHelper.BitPos.BIT8, - IsCodecBusyIntEn = BinaryHelper.BitPos.BIT9, - IsCodecStatIntEn = BinaryHelper.BitPos.BIT10 - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/MainRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/MainRegister.cs deleted file mode 100644 index 9ce80bd5ee..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/MainRegister.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class MainRegister - { - public enum Bit:byte - { - Control = 0x00, - Status = 0x04, - UartData=0x08, - UartInfo=0x09, - Codec = 0x10, - UartRes=0x0a, - MemPageAddr=0x0c, - SerialIntContr=0x20, - Dac1SampleCount=0x24, - Dac2Samplecount=0x28, - Dac1FrameAddr=0x30, - UartFIFO=0x30, - Dac1FrameSize=0x34, - Dac2FrameAddr = 0x38, - PhantomFrame=0x38, - Dac2FrameSize=0x3c, - PhantomSize=0x3c - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/SerialInterfaceRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/SerialInterfaceRegister.cs deleted file mode 100644 index f6b4dadf65..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/SerialInterfaceRegister.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class SerialInterfaceRegister - { - Kernel.MemoryAddressSpace xMem; - public static SerialInterfaceRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new SerialInterfaceRegister(aMem); - } - - private SerialInterfaceRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - #region Bits - - [Flags] - public enum BitPosition : byte - { - DAC2Mode = 14, - DAC1Mode = 13, - DAC2PlayMode=12, - DAC1PlayMode=11, - DAC2IntEn=9, - DAC1IntEn = 8, - DAC1ForceReloadCnt=7, - DAC2OnStopMode=6 - } - - [Flags] - public enum BitValue : uint - { - DAC2Mode = BinaryHelper.BitPos.BIT14, - DAC1Mode = BinaryHelper.BitPos.BIT13, - DAC2PlayMode = BinaryHelper.BitPos.BIT12, - DAC1PlayMode = BinaryHelper.BitPos.BIT11, - DAC2IntEn = BinaryHelper.BitPos.BIT9, - DAC1IntEn = BinaryHelper.BitPos.BIT8, - DAC1ForceReloadCnt = BinaryHelper.BitPos.BIT7, - DAC2OnStopMode = BinaryHelper.BitPos.BIT6 - } - #endregion - - public byte SERIAL - { - get - { - return xMem.Read8((UInt32)Registers.MainRegister.Bit.SerialIntContr); - } - set - { - xMem.Write8((UInt32)Registers.MainRegister.Bit.SerialIntContr, value); - } - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UARTInterfaceRegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UARTInterfaceRegister.cs deleted file mode 100644 index 7448e22089..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UARTInterfaceRegister.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class UARTInterfaceRegister - { - Kernel.MemoryAddressSpace xMem; - public static UARTInterfaceRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new UARTInterfaceRegister(aMem); - } - - private UARTInterfaceRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UartFIFORegister.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UartFIFORegister.cs deleted file mode 100644 index dc348811a6..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/ES1370/Registers/UartFIFORegister.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.ES1370.Registers -{ - class UartFIFORegister - { - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/ADCEntity.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/ADCEntity.cs deleted file mode 100644 index e584b9e01b..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/ADCEntity.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.Generic.Components -{ - public abstract class ADCEntity - { - //private ADCEntity adcEntity; - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/DACEntity.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/DACEntity.cs deleted file mode 100644 index 95848a1ebc..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/DACEntity.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.Generic.Components -{ - public abstract class DACEntity - { - public DACEntity() { } - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/UARTEntity.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/UARTEntity.cs deleted file mode 100644 index 246d0450c5..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Components/UARTEntity.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.Generic.Components -{ - public abstract class UARTEntity - { - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/GenericSoundCard.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/GenericSoundCard.cs deleted file mode 100644 index e21880db3b..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/GenericSoundCard.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware2.Audio.Devices.Generic.Managers; -namespace Cosmos.Hardware2.Audio.Devices -{ - public abstract class GenericSoundCard - { - #region Construction - private PCIDevice pciCard; - private Cosmos.Kernel.MemoryAddressSpace mem; - protected List dacs; - protected List adcs; - protected List uarts; - - #endregion - - public GenericSoundCard(PCIDevice device){ - if (device == null) - throw new ArgumentException("PCI Device is null. Unable to get "+this.GetType()+" card"); - pciCard = device; - mem = device.GetAddressSpace(1) as Cosmos.Kernel.MemoryAddressSpace; - - dacs = new List(); - adcs = new List(); - uarts = new List(); - } - public PCIDevice PCICard { get { return pciCard; } private set { ;} } - #region Power and Initilization - public abstract bool Disable(); - public abstract bool Enable(); - #endregion - public abstract void playStream(PCMStream pcmStream); - #region Helpers - protected Cosmos.Kernel.MemoryAddressSpace getMemReference() - { - return mem; - } - #endregion - - } -} - diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/ADCManager.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/ADCManager.cs deleted file mode 100644 index f4c3add825..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/ADCManager.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.Generic.Managers -{ - public class ADCManager { } - -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/DACManager.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/DACManager.cs deleted file mode 100644 index e73b08fe30..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/DACManager.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio.Devices.Generic.Managers -{ - public abstract class DACManager - { - protected Cosmos.Hardware2.Audio.Devices.Generic.Components.DACEntity dacEntity; - public DACManager(Cosmos.Hardware2.Audio.Devices.Generic.Components.DACEntity dacEntity) - { - this.dacEntity = dacEntity; - } - protected abstract bool setDacActiveState(bool state); - } - -} diff --git a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/UARTManager.cs b/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/UARTManager.cs deleted file mode 100644 index 1e53e76719..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/Devices/Generic/Managers/UARTManager.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -namespace Cosmos.Hardware2.Audio.Devices.Generic.Managers -{ - public class UARTManager - { - //private Cosmos.Hardware2.Audio.Devices.Generic.Components.UARTEntity uartEntity; - } -} diff --git a/source/Archive/Cosmos.Hardware/Audio/PCMStream.cs b/source/Archive/Cosmos.Hardware/Audio/PCMStream.cs deleted file mode 100644 index 87e7c21b29..0000000000 --- a/source/Archive/Cosmos.Hardware/Audio/PCMStream.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Audio -{ - public class PCMStream - { - double freq; - char[] data; - public PCMStream(double freq, char[] data) - { - this.freq = freq; - this.data = data; - } - public char[] getData() - { - return data; - } - public double getFreq() - { - return freq; - } - } -} diff --git a/source/Archive/Cosmos.Hardware/BinaryHelper.cs b/source/Archive/Cosmos.Hardware/BinaryHelper.cs deleted file mode 100644 index bcb90d5660..0000000000 --- a/source/Archive/Cosmos.Hardware/BinaryHelper.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 -{ - /// - /// Contains various helpermethods to make bitfiddling easier. - /// - public class BinaryHelper - { - /// - /// Bitwise checks it the given bit is set in the data. - /// - /// The zero-based position of a bit. I.e. bit 1 is the second bit. - /// Returns TRUE if bit is set. - public static bool CheckBit(UInt16 data, ushort bit) - { - //A single bit is LEFT SHIFTED the number a given number of bits. - //and bitwise AND'ed together with the data. - //So the initial value is : 0000 0000. - //Left shifting a bit 3 bits: 0000 0100 - //And'ed together with the data: 0101 0101 AND 0000 01000 => 0000 0100 (which is greater than zero - so bit is set). - - ushort mask = (ushort)(1 << (ushort)bit); - return (data & mask) != 0; - } - - public static bool CheckBit(UInt32 data, ushort bit) - { - UInt32 mask = (UInt32)(1 << (int)bit); - return (data & mask) != 0; - } - - public static bool CheckBit(byte data, byte bit) - { - byte mask = (byte)(1 << bit); - return (data & mask) != 0; - } - - /// - /// Changes the value in the given position. Change bitvalue from low to high, or high to low. - /// Returns the same byte, but with one bit changed. - /// - public static byte FlipBit(byte data, ushort bitposition) - { - byte mask = (byte)(1 << bitposition); - if (CheckBit(data, bitposition)) - return (byte)(data & ~mask); - else - return (byte)(data | mask); - } - - public static UInt32 FlipBit(UInt32 data, ushort bitposition) - { - UInt32 mask = (UInt32)(1 << bitposition); - if (CheckBit(data, bitposition)) - return (UInt32)(data & ~mask); - else - return (UInt32)(data | mask); - } - - - /// - /// Retrieves a byte of data from somewhere inside a 32 bit number. An offset is used to indicate where in - /// the 32 bit number to start extracting 8 bits. - /// - /// - /// - /// - public static byte GetByteFrom32bit(UInt32 data, byte offset) - { - if (offset > 24) - throw new ArgumentException("Offset can not move outside the 32 bit range"); - - data = data >> offset; - return (byte)data; - } - - /// - /// Returns the HEX value of a given bitnumber - /// - [Flags] - public enum BitPos : uint - { - BIT0 = 0x1, - BIT1 = 0x2, - BIT2 = 0x4, - BIT3 = 0x8, - BIT4 = 0x10, - BIT5 = 0x20, - BIT6 = 0x40, - BIT7 = 0x80, - BIT8 = 0x100, - BIT9 = 0x200, - BIT10 = 0x400, - BIT11 = 0x800, - BIT12 = 0x1000, - BIT13 = 0x2000, - BIT14 = 0x4000, - BIT15 = 0x8000, - BIT16 = 0x10000, - BIT17 = 0x20000, - BIT18 = 0x40000, - BIT19 = 0x80000, - BIT20 = 0x100000, - BIT21 = 0x200000, - BIT22 = 0x400000, - BIT23 = 0x800000, - BIT24 = 0x1000000, - BIT25 = 0x2000000, - BIT26 = 0x4000000, - BIT27 = 0x8000000, - BIT28 = 0x10000000, - BIT29 = 0x20000000, - BIT30 = 0x40000000, - BIT31 = 0x80000000 - } - } -} diff --git a/source/Archive/Cosmos.Hardware/BlockDevice.cs b/source/Archive/Cosmos.Hardware/BlockDevice.cs deleted file mode 100644 index 2aacd0d63f..0000000000 --- a/source/Archive/Cosmos.Hardware/BlockDevice.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - public abstract class BlockDevice : Device { - protected BlockDevice() { - mType = DeviceType.Storage; - } - - public abstract uint BlockSize { - get; - } - - public abstract ulong BlockCount - { - get; - } - - public abstract void ReadBlock(ulong aBlock, - byte[] aContents); - - public abstract void WriteBlock(ulong aBlock, - byte[] aContents); - - /// - /// Tells whether this storage device is already used by for example a FS implementation or a partitioning implementation. - /// - public virtual bool Used { - get; - set; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/Cosmos.Hardware2.csproj b/source/Archive/Cosmos.Hardware/Cosmos.Hardware2.csproj deleted file mode 100644 index cd6aeb9e74..0000000000 --- a/source/Archive/Cosmos.Hardware/Cosmos.Hardware2.csproj +++ /dev/null @@ -1,130 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {CE50FE98-9AC4-4B4D-ADC7-31F6DCD28755} - Library - Properties - Cosmos.Hardware2 - Cosmos.Hardware2 - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {A1F83D9F-2D44-4264-A08B-416797123018} - Cosmos.Kernel - - - - - diff --git a/source/Archive/Cosmos.Hardware/Device.cs b/source/Archive/Cosmos.Hardware/Device.cs deleted file mode 100644 index 43119da99f..0000000000 --- a/source/Archive/Cosmos.Hardware/Device.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - // This is the base class for all hardware devices. Hardware devices - // are defined here as abstracts and overridden in specific implementations - // later - public abstract class Device:Hardware { - public enum DeviceType { - Unknown, - Other, - Keyboard, - Mouse, - Storage, - Network - }; - - public delegate void InitializeDriver(); - - private static List mDriverInits; - public static void AddDriverInit(InitializeDriver aInit) - { - if(mDriverInits==null) - { - mDriverInits = new List(4); - } - mDriverInits.Add(aInit); - } - - public static void DriversInit() - { - for (int d = 0; d < mDriverInits.Count; d++) - { - InitializeDriver dlgt = mDriverInits[d]; - dlgt(); - } - } - - public Device() { - } - - static protected List mDevices = new List(16); - static public List Devices { - get { - return mDevices; - } - } - - static public void Add(Device aDevice) - { - if (aDevice == null) - { - throw new ArgumentNullException("aDevice"); - } - Console.WriteLine("Adding device"); - mDevices.Add(aDevice); - } - - public static string DeviceTypeToString(DeviceType aType) { - switch (aType) { - case DeviceType.Keyboard: - return "Keyboard"; - case DeviceType.Mouse: - return "Mouse"; - case DeviceType.Storage: - return "Storage"; - case DeviceType.Other: - return "Other"; - case DeviceType.Unknown: - return "Unknown"; - case DeviceType.Network: - return "Network"; - default: - return ""; - } - } - - public static Device FindFirst(DeviceType aType) { - for (int i = 0; i < mDevices.Count; i++) { - var xDevice = mDevices[i]; - if (xDevice.Type == aType) { - return xDevice; - } - } - return null; - } - - static public List Find(DeviceType aType) { - var xResult = new List(); - for (int i = 0; i < mDevices.Count;i++){ - var xDevice = mDevices[i]; - if (xDevice.Type == aType) { - xResult.Add(xDevice); - } - } - return xResult; - } - - protected DeviceType mType; - public DeviceType Type { - get { - return mType; - } - } - - public abstract string Name { - get; - } - - private bool _Enabled = false; - public bool IsEnabled - { - get - { - return _Enabled; - } - } - public virtual bool Enable() - { - _Enabled = true; - return true; - } - - public virtual bool Disable() - { - _Enabled = false; - return true; - } - } -} diff --git a/source/Archive/Cosmos.Hardware/DeviceSerial.cs b/source/Archive/Cosmos.Hardware/DeviceSerial.cs deleted file mode 100644 index 767db58b92..0000000000 --- a/source/Archive/Cosmos.Hardware/DeviceSerial.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - // This class is currently intended for 'slow' serial devices - // like the keyboard, mouse etc. - // May need to change or add another class in the future - // for higher speed serial devices. However I suspect - // higher speed serial devices will use a block transfer - // type. - public abstract class DeviceSerial : Device { - public delegate void ByteReceivedDelegate(byte aValue); - public ByteReceivedDelegate ByteReceived; - } -} diff --git a/source/Archive/Cosmos.Hardware/Enums.cs b/source/Archive/Cosmos.Hardware/Enums.cs deleted file mode 100644 index 53cd2a319a..0000000000 --- a/source/Archive/Cosmos.Hardware/Enums.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2 { - public enum EFlagsEnum : uint { - Carry = 1, - Parity = 1 << 2, - AuxilliaryCarry = 1 << 4, - Zero = 1 << 6, - Sign = 1 << 7, - Trap = 1 << 8, - InterruptEnable = 1 << 9, - Direction = 1 << 10, - Overflow = 1 << 11, - NestedTag = 1 << 14, - Resume = 1 << 16, - Virtual8086Mode = 1 << 17, - AlignmentCheck = 1 << 18, - VirtualInterrupt = 1 << 19, - VirtualInterruptPending = 1 << 20, - ID = 1 << 21 - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/Global.cs b/source/Archive/Cosmos.Hardware/Global.cs deleted file mode 100644 index 6ee552dabf..0000000000 --- a/source/Archive/Cosmos.Hardware/Global.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2 { - public class Global2 { - public static void Init() { - //Console.WriteLine(" Init Serial"); - //Serial.InitSerial(0); // MtW: disabled, screws up debugging - //PIT.Initialize(Tick); - - //Doku: See ACPIManager class - //Console.WriteLine(" Init ACPI"); - //ACPIManager.Init(); - - //Console.WriteLine(" Init PCIBus"); - //PCIBus.Init(); - - //Console.WriteLine(" Init Mouse"); - //Mouse.Initialize(); - // New - //Console.WriteLine(" Init ATA"); - //Storage.ATA.ATA.Initialize(); - //Device.Add(new PC.Bus.CPU.Keyboard()); - - //Network.Devices.RTL8139.RTL8139.InitDriver(); - //Network.Devices.AMDPCNetII.AMDPCNet.InitDriver(); - //Network.Devices.ViaRhine.VT6102.InitDriver(); - - //Console.WriteLine(" Init Device Drivers"); - //Device.DriversInit(); - } - - public static uint TickCount { - get; - private set; - } - - private static void Tick(object aSender, EventArgs aEventArgs) { - TickCount++; - } - - // DO NOT USE, try to keep the kernel tickless - // note: if you do use it, first enable PIT in code again.. - public static void Sleep_Old(uint aMSec) { - //Cosmos.Debug.Debugger.SendNumber("PC", "Sleep", aMSec, 32); - CPU.Halt();//At least one hlt even if aMSec is 0 - if (aMSec > 0) - { - uint xStart = TickCount; - uint xEnd = xStart + aMSec; - while (TickCount < xEnd) - { - CPU.Halt(); - } - } - //Cosmos.Debug.Debugger.SendMessage("PC", "Sleeping done"); - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Hardware.cs b/source/Archive/Cosmos.Hardware/Hardware.cs deleted file mode 100644 index fc3379dfba..0000000000 --- a/source/Archive/Cosmos.Hardware/Hardware.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - public class Hardware { - //Dont want non hardware members to be able to call this - but need to expose it for future hardware..... - //TODO: Remove these when all old hardware is ported - protected static void IOWriteByte(ushort aPort, byte aData) { } - protected static byte IOReadByte(ushort aPort) { return 0; } - protected static void IOWriteWord(ushort aPort, ushort aData) { } - protected static ushort IOReadWord(ushort aPort) { return 0; } - } -} diff --git a/source/Archive/Cosmos.Hardware/Mouse.cs b/source/Archive/Cosmos.Hardware/Mouse.cs deleted file mode 100644 index 143838a8c6..0000000000 --- a/source/Archive/Cosmos.Hardware/Mouse.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2 -{ - public static class Mouse - { - public static int X, Y; - public static MouseState Buttons; - - public static void Initialize() - { - - ////enable mouse - //WaitSignal(); - //CPUBus.Write8(0x64, 0xA8); - - //// enable interrupt - //WaitSignal(); - //CPUBus.Write8(0x64, 0x20); - //WaitData(); - //byte status = (byte)(CPUBus.Read8(0x60) | 2); - //WaitSignal(); - //CPUBus.Write8(0x64, 0x60); - //WaitSignal(); - //CPUBus.Write8(0x60, status); - - ////default - //Write(0xF6); - //Read(); //Acknowledge - - ////Enable the mouse - //Write(0xF4); - //Read(); //Acknowledge - - //Interrupts.AddIRQHandler(12, new Interrupts.InterruptDelegate(HandleMouse)); - - } - - private static byte Read() - { - WaitData(); - return CPUBus.Read8(0x60); - } - - private static void Write(byte b) - { - //Wait to be able to send a command - WaitSignal(); - //Tell the mouse we are sending a command - CPUBus.Write8(0x64, 0xD4); - //Wait for the final part - WaitSignal(); - //Finally write - CPUBus.Write8(0x60, b); - } - - private static void WaitData() - { - for (int i = 0; i < 1000 & ((CPUBus.Read8(0x64) & 1) == 1); i++) - ; - } - - private static void WaitSignal() - { - for (int i = 0; i < 1000 & ((CPUBus.Read8(0x64) & 2) != 0); i++) - ; - } - - public enum MouseState - { - None=0, - Left=1, - Right =2, - Middle =4 - } - - private static byte mouse_cycle =0; - private static int[] mouse_byte = new int[4]; - - // public static void HandleMouse(ref IRQContext context) - // { - // switch (mouse_cycle) - // { - // case 0: - // mouse_byte[0] = CPUBus.Read8(0x60); - - // if ((mouse_byte[0] & 0x8) == 0x8) - // mouse_cycle++; - - // break; - // case 1: - // mouse_byte[1] = CPUBus.Read8(0x60); - // mouse_cycle++; - // break; - // case 2: - // mouse_byte[2] = CPUBus.Read8(0x60); - // mouse_cycle = 0; - - // if ((mouse_byte[0] & 0x10) == 0x10) - // X -= mouse_byte[1] ^ 0xff; - // else - // X += mouse_byte[1]; - - // if ((mouse_byte[0] & 0x20) == 0x20) - // Y += mouse_byte[2] ^ 0xff; - // else - // Y -= mouse_byte[2]; - - // if (X < 0) - // X = 0; - // else if (X > 319) - // X = 319; - - // if (Y < 0) - // Y = 0; - // else if (Y > 199) - // Y = 199; - - // Buttons = (MouseState)(mouse_byte[0] & 0x7); - - // break; - // } - // } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/AMDPCNetII/AMDPCNet.cs b/source/Archive/Cosmos.Hardware/Network/Devices/AMDPCNetII/AMDPCNet.cs deleted file mode 100644 index dbd5eb6296..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/AMDPCNetII/AMDPCNet.cs +++ /dev/null @@ -1,416 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.Kernel; -using Cosmos.Kernel.ManagedMemory; - -namespace Cosmos.Hardware2.Network.Devices.AMDPCNetII -{ - public class AMDPCNet : NetworkDevice - { - protected PCIDevice pciCard; - protected IOAddressSpace io; - protected MACAddress mac; - protected bool mInitDone; - - protected List mRxBuffers; - protected List mTxBuffers; - private ManagedMemorySpace mTxDescriptor; - private ManagedMemorySpace mRxDescriptor; - private ManagedMemorySpace mInitBlock; - protected Queue mRecvBuffer; - protected Queue mTransmitBuffer; - private int mNextTXDesc; - - // Initialize a new instance of the AMD PCNet device driver - public AMDPCNet(PCIDevice device) - { - if (device == null) - { - throw new ArgumentException("PCI Device is null. Unable to get AMD PCNet card"); - } - pciCard = device; - - // We are handling this device - pciCard.Claimed = true; - - // Setup interrupt handling - //Interrupts.IRQ09 += HandleNetworkInterrupt; - //Interrupts.AddIRQHandler(device.InterruptLine, HandleNetworkInterrupt); - - // Get IO Address from PCI Bus - io = (Kernel.IOAddressSpace)pciCard.GetAddressSpace(0); - // Enable the card - pciCard.EnableDevice(); - // Set the device into 32-bit mode - io.Write32(0x10, 0); - - // Get the EEPROM MAC Address and set it as the devices MAC - byte[] eeprom_mac = new byte[6]; - UInt32 result = io.Read32(0x00); - eeprom_mac[0] = BinaryHelper.GetByteFrom32bit(result, 0); - eeprom_mac[1] = BinaryHelper.GetByteFrom32bit(result, 8); - eeprom_mac[2] = BinaryHelper.GetByteFrom32bit(result, 16); - eeprom_mac[3] = BinaryHelper.GetByteFrom32bit(result, 24); - result = io.Read32(0x04); - eeprom_mac[4] = BinaryHelper.GetByteFrom32bit(result, 0); - eeprom_mac[5] = BinaryHelper.GetByteFrom32bit(result, 8); - - mac = new MACAddress(eeprom_mac); - - // Allocate 32 bytes for the 28 byte Initialization block that has to be aligned to a 4 byte boundary - //UInt32 address = Heap.MemAlloc(0x20); - //mInitBlock = new ManagedUInt32Array(7); // 7 UInt32's, aligned on a 4byte boundary - mInitBlock = new ManagedMemorySpace(28, 4); - /*Console.Write("Allocated 32 bytes for initialization block @ 0x" + address.ToHex(8)); - Console.WriteLine("(Aligned to 0x" + aligned_address.ToHex(8) + ")");*/ - - // Allocate 80 uints for the 16 RX and TX Descriptor rings. These addresses have to be aligned on a 16-byte boundary - mTxDescriptor = new ManagedMemorySpace(256, 16); - mRxDescriptor = new ManagedMemorySpace(256, 16); - /*Console.Write("Allocated 320 bytes for RX ring descriptors @ 0x" + rd_address.ToHex(8)); - Console.WriteLine("(Aligned to 0x" + mRxDescriptorAddress.ToHex(8) + ")"); - Console.Write("Allocated 320 bytes for TX ring descriptors @ 0x" + tx_address.ToHex(8)); - Console.WriteLine("(Aligned to 0x" + mTxDescriptorAddress.ToHex(8) + ")");*/ - - // Fill in the Initialization block - mInitBlock.Write32(0x00, (0x4 << 28) | (0x4 << 20)); - mInitBlock.Write32(0x04, (uint)(eeprom_mac[0] | (eeprom_mac[1] << 8) | (eeprom_mac[2] << 16) | (eeprom_mac[3] << 24))); - mInitBlock.Write32(0x08, (uint)(eeprom_mac[4] | (eeprom_mac[5] << 8))); - mInitBlock.Write32(0x0C, 0x0); - mInitBlock.Write32(0x10, 0x0); - mInitBlock.Write32(0x14, mRxDescriptor.Offset); - mInitBlock.Write32(0x18, mTxDescriptor.Offset); - - // Write the Initialization blocks address to the registers on the card - InitializationBlockAddress = mInitBlock.Offset; - // Set the device to PCNet-PCI II Controller mode (full 32-bit mode) - SoftwareStyleRegister = 0x03; - - /* Initialize the RX and TX buffers, and set up the RX and TX descriptors to point - to the buffers. Also, mark the RX descriptors as being owned by the card so data - can be received in them */ - mRxBuffers = new List(); - mTxBuffers = new List(); - for (uint rxd = 0; rxd < 16; rxd++) - { - uint xOffset = rxd * 16; - - ManagedMemorySpace buffer = new ManagedMemorySpace(2048); - mRxDescriptor.Write32(xOffset + 8, buffer.Offset); - UInt16 buffer_len = (UInt16)(~buffer.Size); - buffer_len++; - UInt32 flags = (UInt32)(buffer_len & 0x0FFF) | 0xF000 | 0x80000000; - mRxDescriptor.Write32(xOffset + 4, flags); - mRxBuffers.Add(buffer); - } - for (uint txd = 0; txd < 16; txd++) - { - uint xOffset = txd * 16; - - ManagedMemorySpace buffer = new ManagedMemorySpace(2048); - mTxDescriptor.Write32(xOffset + 8, buffer.Offset); - mTxBuffers.Add(buffer); - } - - // Set TX Descriptor 0 as the first one to use... Increment this when we use one to use them in a circular fashion - mNextTXDesc = 0; - - // Setup our Receive and Transmit Queues - mTransmitBuffer = new Queue(); - mRecvBuffer = new Queue(); - } - - public static void InitDriver() - { - Device.AddDriverInit(FindAll); - } - - /// - /// Retrieve all AMD PCNet network cards found on computer. - /// - /// List of all AMD PCNet cards - public static void FindAll() - { - Console.WriteLine("Scanning for AMD PCNet cards..."); - foreach (PCIDevice device in Cosmos.Hardware2.PCIBus.Devices) - { - if ((device.VendorID == 0x1022) && (device.DeviceID == 0x2000) && (device.Claimed == false)) - { - AMDPCNet nic = new AMDPCNet(device); - - Console.WriteLine("Found AMD PCNet NIC on PCI " + device.Bus + ":" + device.Slot + ":" + device.Function); - Console.WriteLine("NIC IRQ: " + device.InterruptLine); - Console.WriteLine("NIC MAC Address: " + nic.MACAddress.ToString()); - - NetworkDevice.Add(nic); - } - } - } - - //protected void HandleNetworkInterrupt(ref IRQContext aContext) - //{ - // UInt32 cur_status = StatusRegister; - - // if ((cur_status & 0x100) != 0) - // { - // mInitDone = true; - // } - // if ((cur_status & 0x200) != 0) - // { - // if (mTransmitBuffer.Count > 0) - // { - // byte[] data = mTransmitBuffer.Peek(); - // if (SendBytes(ref data) == true) - // { - // mTransmitBuffer.Dequeue(); - // } - // } - // } - // if ((cur_status & 0x400) != 0) - // { - // ReadRawData(); - // } - - // StatusRegister = cur_status; - //} - - public bool InitDone - { - get - { - return mInitDone; - } - } - public bool Started - { - get - { - if ((StatusRegister & 0x02) != 0) - { - return true; - } - - return false; - } - } - - #region Register Access Properties - protected UInt32 StatusRegister - { - get - { - io.Write32(0x14, 0); - return io.Read32(0x10); - } - set - { - io.Write32(0x14, 0); - io.Write32(0x10, value); - } - } - protected UInt32 ModeRegister - { - get - { - io.Write32(0x14, 15); - return io.Read32(0x10); - } - set - { - io.Write32(0x14, 15); - io.Write32(0x10, value); - } - } - protected UInt32 BurstBusControlRegister - { - get - { - io.Write32(0x14, 18); - - return io.Read32(0x1C); - } - set - { - io.Write32(0x14, 18); - io.Write32(0x1C, value); - } - } - protected UInt32 SoftwareStyleRegister - { - get - { - io.Write32(0x14, 20); - - return io.Read32(0x1C); - } - set - { - io.Write32(0x14, 20); - io.Write32(0x1C, value); - } - } - protected UInt32 InitializationBlockAddress - { - get - { - UInt32 result; - - io.Write32(0x14, 1); - result = io.Read32(0x10); - io.Write32(0x14, 2); - result |= (io.Read32(0x10) << 16); - - return result; - } - set - { - io.Write32(0x14, 1); - io.Write32(0x10, (value & 0xFFFF)); - io.Write32(0x14, 2); - io.Write32(0x10, (value >> 16)); - } - } - #endregion - - #region Network Device Implementation - public override MACAddress MACAddress - { - get { return mac; } - } - - public override bool Enable() - { - StatusRegister = 0x43; - - return base.Enable(); - } - - public override bool QueueBytes(byte[] buffer, int offset, int length) - { - byte[] data = new byte[length]; - for (int b = 0; b < length; b++) - { - data[b] = buffer[b + offset]; - } - - if (SendBytes(ref data) == false) - { - mTransmitBuffer.Enqueue(data); - } - - return true; - } - - public override bool ReceiveBytes(byte[] buffer, int offset, int max) - { - throw new NotImplementedException(); - } - - public override bool Ready - { - get { return this.Started; } - } - - public override byte[] ReceivePacket() - { - if (mRecvBuffer.Count < 1) - { - return null; - } - - byte[] data = mRecvBuffer.Dequeue(); - return data; - } - - public override int BytesAvailable() - { - if (mRecvBuffer.Count < 1) - { - return 0; - } - - return mRecvBuffer.Peek().Length; - } - - public override bool IsSendBufferFull() - { - return false; - } - - public override bool IsReceiveBufferFull() - { - return false; - } - - public override string Name - { - get { return "Generic AMD PCNet Network device"; } - } - #endregion - - #region Helper Functions - protected bool SendBytes(ref byte[] aData) - { - int txd = mNextTXDesc++; - if (mNextTXDesc >= 16) - { - mNextTXDesc = 0; - } - - uint xOffset = (uint)(txd * 16); - UInt32 status = mTxDescriptor.Read32(xOffset + 4); - if ((status & 0x80000000) == 0) - { - for (uint b = 0; b < aData.Length; b++) - { - mTxBuffers[txd][b] = aData[b]; - } - UInt16 buffer_len = (UInt16)(aData.Length < 64 ? 64 : aData.Length); - buffer_len = (UInt16)(~buffer_len); - buffer_len++; - - UInt32 flags = (UInt32)(buffer_len & 0x0FFF) | 0x0300F000 | 0x80000000; - - mTxDescriptor.Write32(xOffset + 4, flags); - return true; - } - - return false; - } - - private void ReadRawData() - { - uint status; - UInt16 recv_size; - byte[] recv_data; - - for (int rxd = 0; rxd < 16; rxd++) - { - uint xOffset = (uint)(rxd * 16); - status = mRxDescriptor.Read32(xOffset + 4); - if ((status & 0x80000000) == 0) - { - recv_size = (UInt16)(mRxDescriptor[xOffset + 0] & 0xFFF); - recv_data = new byte[recv_size]; - for (uint b = 0; b < recv_size; b++) - { - recv_data[b] = mRxBuffers[rxd][b]; - } - - if (DataReceived != null) - { - DataReceived(recv_data); - } - else - { - mRecvBuffer.Enqueue(recv_data); - } - - mRxDescriptor.Write32(xOffset + 4, status | 0x80000000); - } - } - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs deleted file mode 100644 index 8d844a7ecc..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139/RTL8139.cs +++ /dev/null @@ -1,408 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.Network; -using Cosmos.Kernel; -using Cosmos.Kernel.ManagedMemory; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139 -{ - public class RTL8139 : NetworkDevice - { - protected PCIDevice pciCard; - protected AddressSpace io; - protected MACAddress mac; - protected bool mInitDone; - - protected ManagedMemorySpace rxBuffer; - protected int rxBufferOffset; - protected UInt16 capr; - - protected Queue mRecvBuffer; - protected Queue mTransmitBuffer; - private int mNextTXDesc; - - const UInt16 RxBufferSize = 32768; - - public RTL8139(PCIDevice device) - { - if (device == null) { - throw new ArgumentException("PCI Device is null. Unable to get Realtek 8139 card"); - } - pciCard = device; - - // We are handling this device - pciCard.Claimed = true; - - // Setup interrupt handling - //Interrupts.IRQ11 += HandleNetworkInterrupt; - //Interrupts.AddIRQHandler(device.InterruptLine, HandleNetworkInterrupt); - - // Get IO Address from PCI Bus - io = pciCard.GetAddressSpace(0); - - // Enable the card - pciCard.EnableDevice(); - - // Turn on the card - io.Write8(0x52, 0x01); - - //Do a software reset - SoftwareReset(); - - // Get the MAC Address - byte[] eeprom_mac = new byte[6]; - for (uint b = 0; b < 6; b++) - { - eeprom_mac[b] = io.Read8(b); - } - - this.mac = new MACAddress(eeprom_mac); - - // Get a receive buffer and assign it to the card - rxBuffer = new ManagedMemorySpace(RxBufferSize + 2048 + 16, 4); - - RBStartRegister = rxBuffer.Offset; - - // Setup receive Configuration - RecvConfigRegister = 0xF381; - // Setup Transmit Configuration - TransmitConfigRegister = 0x3000300; - - // Setup Interrupts - IntMaskRegister = 0x7F; - IntStatusRegister = 0xFFFF; - - // Setup our Receive and Transmit Queues - mRecvBuffer = new Queue(); - mTransmitBuffer = new Queue(); - } - - public static void InitDriver() - { - Device.AddDriverInit(FindAll); - } - - public static void FindAll() - { - Console.WriteLine("Scanning for Realtek 8139 cards..."); - for(int i = 0; i < PCIBus.Devices.Length; i++) - { - var xDevice = PCIBus.Devices[i]; - //DebugWriteLine("VendorID: " + device.VendorID + " - DeviceID: " + device.DeviceID); - if ((xDevice.VendorID == 0x10EC) && (xDevice.DeviceID == 0x8139) && (xDevice.Claimed == false)) - { - RTL8139 nic = new RTL8139(xDevice); - NetworkDevice.Add(nic); - } - } - } - - //protected void HandleNetworkInterrupt(ref IRQContext aContext) - //{ - // UInt16 cur_status = IntStatusRegister; - - // //Console.WriteLine("RTL8139 Interrupt: ISR=" + cur_status.ToString()); - // if ((cur_status & 0x01) != 0) - // { - // while ((CommandRegister & 0x01) == 0) - // { - // //UInt32 packetHeader = BitConverter.ToUInt32(rxBuffer, rxBufferOffset + capr); - // UInt32 packetHeader = rxBuffer.Read32(capr); - // UInt16 packetLen = (UInt16)(packetHeader >> 16); - // if ((packetHeader & 0x3E) != 0x00) - // { - // CommandRegister = 0x04; // TX Only; - // capr = CurBufferAddressRegister; - // CommandRegister = 0x0C; // RX and TX Enabled - // } - // else if ((packetHeader & 0x01) == 0x01) - // { - // ReadRawData(packetLen); - // } - - // CurAddressPointerReadRegister = (UInt16)(capr - 0x10); - // } - // } - // if ((cur_status & 0x10) != 0) - // { - // CurAddressPointerReadRegister = (UInt16)(CurBufferAddressRegister - 0x10); - // cur_status = (UInt16)(cur_status | 0x01); - // } - - // IntStatusRegister = cur_status; - //} - - #region Register Access - protected UInt32 RBStartRegister - { - get { return io.Read32(0x30); } - set { io.Write32(0x30, value); } - } - internal UInt32 RecvConfigRegister - { - get { return io.Read32(0x44); } - set { io.Write32(0x44, value); } - } - internal UInt16 CurAddressPointerReadRegister - { - get { return io.Read16(0x38); } - set { io.Write16(0x38, value); } - } - internal UInt16 CurBufferAddressRegister - { - get { return io.Read16(0x3A); } - set { io.Write16(0x3A, value); } - } - - internal UInt16 IntMaskRegister - { - get { return io.Read16(0x3C); } - set { io.Write16(0x3C, value); } - } - internal UInt16 IntStatusRegister - { - get { return io.Read16(0x3E); } - set { io.Write16(0x3E, value); } - } - - internal byte CommandRegister - { - get { return io.Read8(0x37); } - set { io.Write8(0x37, value); } - } - protected byte MediaStatusRegister - { - get { return io.Read8(0x58); } - set { io.Write8(0x58, value); } - } - - protected byte Config1Register - { - get { return io.Read8(0x52); } - set { io.Write8(0x52, value); } - } - - internal UInt32 TransmitConfigRegister - { - get { return io.Read32(0x40); } - set { io.Write32(0x40, value); } - } - - internal UInt32 TransmitAddress1Register - { - get { return io.Read32(0x20); } - set { io.Write32(0x20, value); } - } - internal UInt32 TransmitAddress2Register - { - get { return io.Read32(0x24); } - set { io.Write32(0x24, value); } - } - internal UInt32 TransmitAddress3Register - { - get { return io.Read32(0x28); } - set { io.Write32(0x28, value); } - } - internal UInt32 TransmitAddress4Register - { - get { return io.Read32(0x2C); } - set { io.Write32(0x2C, value); } - } - internal UInt32 TransmitDescriptor1Register - { - get { return io.Read32(0x10); } - set { io.Write32(0x10, value); } - } - internal UInt32 TransmitDescriptor2Register - { - get { return io.Read32(0x14); } - set { io.Write32(0x14, value); } - } - internal UInt32 TransmitDescriptor3Register - { - get { return io.Read32(0x18); } - set { io.Write32(0x18, value); } - } - internal UInt32 TransmitDescriptor4Register - { - get { return io.Read32(0x1C); } - set { io.Write32(0x1C, value); } - } - #endregion - - protected bool CmdBufferEmpty - { - get { return ((CommandRegister & 0x01) == 0x01); } - } - - #region Network Device Implementation - public override MACAddress MACAddress - { - get { return this.mac; } - } - - public override bool Enable() - { - // Enable Receiving and Transmitting of data - CommandRegister = 0x0C; - - while (this.Ready == false) - { } - - return base.Enable(); - } - - public override bool Ready - { - get { return ((Config1Register & 0x20) == 0); } - } - - public override bool QueueBytes(byte[] buffer, int offset, int length) - { - byte[] data = new byte[length]; - for (int b = 0; b < length; b++) - { - data[b] = buffer[b + offset]; - } - - Console.WriteLine("Try sending"); - - if (SendBytes(ref data) == false) - { - Console.WriteLine("Queuing"); - mTransmitBuffer.Enqueue(data); - } - - return true; - } - - public override bool ReceiveBytes(byte[] buffer, int offset, int max) - { - throw new NotImplementedException(); - } - - public override byte[] ReceivePacket() - { - if (mRecvBuffer.Count < 1) - { - return null; - } - - byte[] data = mRecvBuffer.Dequeue(); - return data; - } - - public override int BytesAvailable() - { - if (mRecvBuffer.Count < 1) - { - return 0; - } - - return mRecvBuffer.Peek().Length; - } - - public override bool IsSendBufferFull() - { - return false; - } - - public override bool IsReceiveBufferFull() - { - return false; - } - - public override string Name - { - get { return "Realtek 8139 Chipset NIC"; } - } - #endregion - - #region Helper Functions - private void ReadRawData(UInt16 packetLen) - { - int recv_size = packetLen - 4; - byte[] recv_data = new byte[recv_size]; - for (uint b = 0; b < recv_size; b++) - { - recv_data[b] = rxBuffer[(uint)(capr + 4 + b)]; - } - if (DataReceived != null) - { - DataReceived(recv_data); - } - else - { - if (mRecvBuffer == null) - { - } - - mRecvBuffer.Enqueue(recv_data); - } - - capr += (UInt16)((packetLen + 4 + 3) & 0xFFFFFFFC); - if (capr > RxBufferSize) - { - capr -= RxBufferSize; - } - } - - protected void SoftwareReset() - { - CommandRegister = 0x10; - while ((CommandRegister & 0x10) != 0) - { } - } - - protected bool SendBytes(ref byte[] aData) - { - int txd = mNextTXDesc++; - if (mNextTXDesc >= 4) - { - mNextTXDesc = 0; - } - - ManagedMemorySpace txBuffer; - if (aData.Length < 64) - { - txBuffer = new ManagedMemorySpace(64); - for (uint b = 0; b < aData.Length; b++) - { - txBuffer[b] = aData[b]; - } - } - else - { - txBuffer = new ManagedMemorySpace(aData); - } - - switch (txd) - { - case 0: - TransmitAddress1Register = txBuffer.Offset; - TransmitDescriptor1Register = txBuffer.Size; - break; - case 1: - TransmitAddress2Register = txBuffer.Offset; - TransmitDescriptor2Register = txBuffer.Size; - break; - case 2: - TransmitAddress3Register = txBuffer.Offset; - TransmitDescriptor3Register = txBuffer.Size; - break; - case 3: - TransmitAddress4Register = txBuffer.Offset; - TransmitDescriptor4Register = txBuffer.Size; - break; - default: - return false; - } - - return true; - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/BinaryHelper.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/BinaryHelper.cs deleted file mode 100644 index 1a6e5a95d6..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/BinaryHelper.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware.Network.Devices.RTL8139 -{ - /// - /// Contains various helpermethods to make bitfiddling easier. - /// - public class BinaryHelper - { - /// - /// Bitwise checks it the given bit is set in the data. - /// - /// The zero-based position of a bit. I.e. bit 1 is the second bit. - /// Returns TRUE if bit is set. - public static bool CheckBit(UInt16 data, ushort bit) - { - //A single bit is LEFT SHIFTED the number a given number of bits. - //and bitwise AND'ed together with the data. - //So the initial value is : 0000 0000. - //Left shifting a bit 3 bits: 0000 0100 - //And'ed together with the data: 0101 0101 AND 0000 01000 => 0000 0100 (which is greater than zero - so bit is set). - - ushort mask = (ushort)(1 << (ushort)bit); - return (data & mask) != 0; - } - - public static bool CheckBit(UInt32 data, ushort bit) - { - UInt32 mask = (UInt32)(1 << (int)bit); - return (data & mask) != 0; - } - - public static bool CheckBit(byte data, byte bit) - { - byte mask = (byte)(1 << bit); - return (data & mask) != 0; - } - - /// - /// Changes the value in the given position. Change bitvalue from low to high, or high to low. - /// Returns the same byte, but with one bit changed. - /// - public static byte FlipBit(byte data, ushort bitposition) - { - byte mask = (byte)(1 << bitposition); - if (CheckBit(data, bitposition)) - return (byte)(data & ~mask); - else - return (byte)(data | mask); - } - - public static UInt32 FlipBit(UInt32 data, ushort bitposition) - { - UInt32 mask = (UInt32)(1 << bitposition); - if (CheckBit(data, bitposition)) - return (UInt32)(data & ~mask); - else - return (UInt32)(data | mask); - } - - - /// - /// Retrieves a byte of data from somewhere inside a 32 bit number. An offset is used to indicate where in - /// the 32 bit number to start extracting 8 bits. - /// - /// - /// - /// - public static byte GetByteFrom32bit(UInt32 data, byte offset) - { - if (offset > 24) - throw new ArgumentException("Offset can not move outside the 32 bit range"); - - data = data >> offset; - return (byte)data; - } - - /// - /// Returns the HEX value of a given bitnumber - /// - [Flags] - public enum BitPos : uint - { - BIT0 = 0x1, - BIT1 = 0x2, - BIT2 = 0x4, - BIT3 = 0x8, - BIT4 = 0x10, - BIT5 = 0x20, - BIT6 = 0x40, - BIT7 = 0x80, - BIT8 = 0x100, - BIT9 = 0x200, - BIT10 = 0x400, - BIT11 = 0x800, - BIT12 = 0x1000, - BIT13 = 0x2000, - BIT14 = 0x4000, - BIT15 = 0x8000, - BIT16 = 0x10000, - BIT17 = 0x20000, - BIT18 = 0x40000, - BIT19 = 0x80000, - BIT20 = 0x100000, - BIT21 = 0x200000, - BIT22 = 0x400000, - BIT23 = 0x800000, - BIT24 = 0x1000000, - BIT25 = 0x2000000, - BIT26 = 0x4000000, - BIT27 = 0x8000000, - BIT28 = 0x10000000, - BIT29 = 0x20000000, - BIT30 = 0x40000000, - BIT31 = 0x80000000 - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Packet.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Packet.cs deleted file mode 100644 index 55e223112b..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Packet.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139 -{ - /// - /// A network Packet used when transferring data over a network. - /// Consists of a body (with the data) and a head (with info about the packet) - /// - [Obsolete("Use Ethernet2Frame instead.")] - public class Packet - { - private PacketHeader head; - private byte[] body; - public PacketHeader Head { get; private set; } - - public Packet(PacketHeader newhead, byte[] data) - { - head = newhead; - body = data; - } - - public byte[] PacketBody - { - get - { - return body; - } - //return new byte[10]; //TODO: Redo this completely! Hardcoded to some bogus value now. - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/PacketHeader.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/PacketHeader.cs deleted file mode 100644 index 48ba9cb036..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/PacketHeader.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139 -{ - /// - /// The packethead consists of two bytes (i.e. 16 bits). - /// A PacketHead contains information about a network Packet, and its transfer. - /// - [Obsolete("Use Ethernet2Frame instead.")] - public class PacketHeader - { - private UInt16 head; - - public PacketHeader(UInt16 data) - { - head = data; - } - - public ushort PacketLength - { - get {return 2048;} //TODO: Get from packet? - //private set; - } - - public bool IsReceiveOk() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.ROK); - } - - public bool IsFrameAlignmentError() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.FAE); - } - - public bool IsCRCError() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.CRC); - } - - public bool IsLongPacket() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.LONG); - } - - public bool IsRuntPacket() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.RUNT); - } - - public bool IsInvalidSymbolError() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.ISE); - } - - public bool IsBroadcastAddress() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.BAR); - } - - public bool IsPhysicalAddressMatch() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.PAM); - } - - public bool IsMulticastAddress() - { - return BinaryHelper.CheckBit(head, (ushort)PacketHeadBit.MAR); - } - - private enum PacketHeadBit : ushort - { - ROK = 0x00, //Receive OK - FAE = 0x01, //Frame Alignment Error - CRC = 0x02, //CRC Error - LONG = 0x03,//Long packet - set to 1 when packet over 4k bytes - RUNT = 0x04,//Runt packet received (smaller than 64 bytes) - ISE = 0x05, //Invalid Symbol Error (Only 100BASE-TX). - BAR = 0x0D, //Broadcast Address Received - PAM = 0x0E, //Physical Address Matched - MAR = 0x0F //Multicast Address Received - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/RTL8139_Old.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/RTL8139_Old.cs deleted file mode 100644 index 2efed800fd..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/RTL8139_Old.cs +++ /dev/null @@ -1,663 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2.Network; -using Cosmos.Hardware2.Network.Devices.RTL8139.Register; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Hardware2; -using Cosmos.Kernel; -using Cosmos.Hardware2.Network.TCPIPModel.PhysicalLayer.Ethernet2; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139 -{ - /// - /// Driver for networkcards using the RTL8139 chip. - /// Some documentation can be found at: http://www.osdev.org/wiki/RTL8139 - /// - public class RTL8139_Old : NetworkDevice { - protected PCIDevice pciCard; - protected Kernel.MemoryAddressSpace mem; - protected Register.ValueTypeRegisters valueReg; - protected Register.InterruptMaskRegister imr; - protected Register.InterruptStatusRegister isr; - protected byte[] TxBuffer0; - protected byte[] TxBuffer1; - protected byte[] TxBuffer2; - protected byte[] TxBuffer3; - protected byte[] RxBuffer; - protected ushort RxBufferIdx = 0; - private const ushort RxBufferSize = 34832; - //TODO: Remove this later, should also be a prop to be proper but since it - // will be removed later... - public static bool DebugOutput = true; - - // Writing out to the console is slow and often other interrupts come in - // before its done. So this allows us to turn it on and off - protected static void DebugWriteLine(string aText) { - //if (DebugOutput) { -// Console.WriteLine(aText); - //} - } - protected static void DebugWrite(string aText) { - // if (DebugOutput) { - DebugWriteLine(aText); -// } - } - - public RTL8139_Old(PCIDevice device) - { - if (device == null) { - throw new ArgumentException("PCI Device is null. Unable to get RTL8139 card"); - } - pciCard = device; - mem = device.GetAddressSpace(1) as Kernel.MemoryAddressSpace; - valueReg = Register.ValueTypeRegisters.Load(mem); - imr = Register.InterruptMaskRegister.Load(mem); - isr = Register.InterruptStatusRegister.Load(mem); - } - - /// - /// Retrieve all Realtek 8139 network cards found on computer. - /// - /// - public static List FindAll() - { - List found = new List(); - foreach (PCIDevice device in Cosmos.Hardware2.PCIBus.Devices) { - //DebugWriteLine("VendorID: " + device.VendorID + " - DeviceID: " + device.DeviceID); - if (device.VendorID == 0x10EC && device.DeviceID == 0x8139) - found.Add(new RTL8139_Old(device)); - } - return found; - } - - #region Power and Initilization - - /// - /// Performs additional hardware initilization - /// - public void InitializeDriver() - { - mBuffer=new Queue(16); - //Turn on Tx and Rx - EnableTransmit(); - EnableReceive(); - //Initialize buffers - InitTransmitBuffer(); - InitReceiveBuffer(); - - //Setting Transmit configuration - var tcr = Register.TransmitConfigurationRegister.Load(mem); - tcr.Init(); - SetEarlyTxThreshold(1024); - - //Setting Receive configuration - var rcr = Register.ReceiveConfigurationRegister.Load(mem); - rcr.Init(); - rcr.PromiscuousMode = true; - - //Enable IRQ Interrupt - //Cosmos.Hardware2.Interrupts.IRQ11 += HandleNetworkInterrupt; - //Interrupts.AddIRQHandler(pciCard.InterruptLine, HandleNetworkInterrupt); - - InitIRQMaskRegister(); - mInstance = this; - //DebugWriteLine("Listening for IRQ" + pciCard.InterruptLine + "."); - - } - - private static RTL8139_Old mInstance; - /// - /// Initialize the Receive Buffer. The RBSTART register consists of 4 bytes (32-bits at 0x30h to 0x33h) which should contain - /// the address of a buffer to save incoming data to. - /// - private void InitReceiveBuffer() - { - //Prepare a buffer area - //UInt16 bufferSize = (1024 * 16) + (4 * 4); //last 4 bytes used for CRC - RxBuffer = new byte[RxBufferSize]; - RxBufferIdx = 3 & (~3); - - //Write the address of the buffer area to the RBSTART - valueReg.RBSTART = GetMemoryAddress(ref RxBuffer); - } - - private void InitTransmitBuffer() - { - //Initialize Tx Buffers - - TxBuffer0 = new byte[2048]; - TxBuffer1 = new byte[2048]; - TxBuffer2 = new byte[2048]; - TxBuffer3 = new byte[2048]; - - valueReg.TSAD0 = GetMemoryAddress(ref TxBuffer0); - valueReg.TSAD1 = GetMemoryAddress(ref TxBuffer1); - valueReg.TSAD2 = GetMemoryAddress(ref TxBuffer2); - valueReg.TSAD3 = GetMemoryAddress(ref TxBuffer3); - } - - /// - /// Enables RTL network card by setting CONFIG_1 register. - /// - /// - public override bool Enable() - { - var config1 = Register.ConfigurationRegister1.Load(mem); - config1.PowerEnabled = true; //Uncertain if this is needed - - bool pci_enable = base.Enable(); //enables PCI card as well - if (pci_enable == true) - { - InitializeDriver(); - } - - return pci_enable; - } - - public override bool Disable() - { - var config1 = Register.ConfigurationRegister1.Load(mem); - config1.PowerEnabled = false; - - return base.Disable(); - } - - /// - /// Performs an internal system hardware reset of the network card. - /// - public void SoftReset() - { - //Tell RTL chip to issue a Reset` - var cr = Register.CommandRegister.Load(mem); - cr.Reset = true; - - //Wait while RST bit is active - while (cr.Reset) - { - DebugWriteLine("Reset in progress"); - } - } - - #endregion - - #region Operational properties - - /// - /// Changes the Loopback mode. - /// - /// True to enable Loopback. False for normal operation. - public bool LoopbackMode - { - get - { - var tcr = Register.TransmitConfigurationRegister.Load(mem); - return tcr.LoopbackMode; - } - set - { - var tcr = Register.TransmitConfigurationRegister.Load(mem); - tcr.LoopbackMode = value; - } - } - - private ReceiveConfigurationRegister mRCR; - public ReceiveConfigurationRegister RCR - { - get - { - return mRCR; - } - } - - public bool PromiscuousMode - { - get - { - return RCR.PromiscuousMode; - } - set - { - RCR.PromiscuousMode = value; - } - - } - - public override string Name - { - get { return "Generic RTL8139 Network device"; } - } - - public override MACAddress MACAddress - { - get - { - return valueReg.Mac; - } - } - public override bool Ready - { - get { return this.IsEnabled; } - } - - /// - /// Returns a text with the hardware revision model. F.instance RTL8139C+ or RTL8139. - /// - public string HardwareRevision - { - get - { - var tcr = Register.TransmitConfigurationRegister.Load(mem); - return Register.TransmitConfigurationRegister.GetHardwareRevision(tcr.GetHWVERID()); - } - private set { ;} - } - - public PCIDevice PCICard { get { return pciCard; } private set { ;} } - - - /// - /// A general purpose timer. Writing to this will reset timer. NB: Timer does not work in Qemu. - /// - public UInt32 TimerCount - { - get - { - return mem.Read32((byte)Register.MainRegister.Bit.Timer); - } - set - { - //Reset timer - mem.Write32((byte)Register.MainRegister.Bit.Timer, 0); - } - } - - - #endregion - - #region Receive data - - /// - /// Enable the NIC to be able to Receive data. - /// - private void EnableReceive() - { - var cr = Register.CommandRegister.Load(mem); - //outportl(0x44, 0xf | (1 << 7)); // (1 << 7) is the WRAP bit, 0xf is AB+AM+APM+AAP - mRCR = ReceiveConfigurationRegister.Load(mem); - cr.RxEnabled = true; - } - - public Queue mBuffer; - - public byte[] ReadReceiveBuffer() - { - List receivedBytes = new List(); -//DebugUtil.WriteBinary("RTL8139", "RxBuffer", RxBuffer); - DebugWriteLine("RxBuffer is at address " + GetMemoryAddress(ref RxBuffer)); - DebugWriteLine("Received data from address " + valueReg.CurrentAddressOfPacketRead + " to address " + valueReg.CurrentBufferAddress); - - //The data to be read is in the RxBuffer, but offset by the CBR. - - UInt16 readPointer = valueReg.CurrentAddressOfPacketRead; - UInt16 writtenPointer = valueReg.CurrentBufferAddress; - readPointer += 20; - for (int i = 0; i < writtenPointer; i++) { - //while (readPointer != writtenPointer) - //{ - receivedBytes.Add(RxBuffer[readPointer]); - - //if (readPointer == 0xFFF0) - // readPointer = 0; - //else - readPointer++; - } - var xResult = receivedBytes.ToArray(); - if (DataReceived != null) - { - DataReceived(xResult); - } - //Update the CAPR so that the RTL8139 knows that we've read the data. - //DebugWriteLine("Setting CAPR to " + readPointer + ". CBR is " + writtenPointer); - valueReg.CurrentAddressOfPacketRead = (UInt16)(readPointer - 16); //TODO: Figure out if 16 is the correct value. For now it works. RxBufferOverflow is no longer thrown. - - return xResult; - } - - public override bool QueueBytes(byte[] buffer, int offset, int length) - { - TransmitBytes(buffer); - - return true; - } - - public override bool ReceiveBytes(byte[] buffer, int offset, int max) - { - throw new NotImplementedException(); - } - - public override byte[] ReceivePacket() - { - throw new NotImplementedException(); - } - - public override int BytesAvailable() - { - throw new NotImplementedException(); - } - - public override bool IsReceiveBufferFull() - { - throw new NotImplementedException(); - } - - public bool IsReceiveBufferEmpty() - { - var cr = Register.CommandRegister.Load(mem); - return cr.RxBufferEmpty; - } - - #endregion - - #region Transmit data - - /// - /// Enable the NIC to be able to Transmit data. - /// - private void EnableTransmit() - { - var cr = Register.CommandRegister.Load(mem); - cr.TxEnabled = true; - } - - public override bool IsSendBufferFull() - { - throw new NotImplementedException(); - } - - /// - /// Transmits the byte array out onto the network wire. - /// - /// - /// - public bool TransmitBytes(byte[] aData) - { - //TODO: Do NOT set all registers! This works, but is not efficient! - TxBuffer0 = aData; - TxBuffer1 = aData; - TxBuffer2 = aData; - TxBuffer3 = aData; - WriteAddressToPCI(ref TxBuffer0, (byte)Register.MainRegister.Bit.TSAD0); - WriteAddressToPCI(ref TxBuffer1, (byte)Register.MainRegister.Bit.TSAD1); - WriteAddressToPCI(ref TxBuffer2, (byte)Register.MainRegister.Bit.TSAD2); - WriteAddressToPCI(ref TxBuffer3, (byte)Register.MainRegister.Bit.TSAD3); - - var tsd = Register.TransmitStatusDescriptor.Load(mem); - //DebugWriteLine("Telling NIC to send " + aData.Length + " bytes."); - tsd.Size = aData.Length; - tsd.OWN = false; //Begins sending - causes QEMU to DIE (Frode, 29.july)! - - Register.TransmitStatusDescriptor.IncrementTSDescriptor(); - return true; - } - - /// - /// Converts the frame into a byte array, and sends it using TransmitBytes. - /// - /// - /// - public bool TransmitFrame(Ethernet2Frame frame) - { - return this.TransmitBytes(frame.RawBytes()); - } - - #endregion - - #region Interrupt (IRQ) - - private void HandleReceiveInterrupt() { - //var xStatus = isr.ISR; - mem.Write32((uint)MainRegister.Bit.Cfg9346, - 0xc0); - Console.WriteLine("RTL8139 Interrupt Recvd"); - while ((mem.Read8((uint)MainRegister.Bit.ChipCmd) & 0x01) == 0) { - //DebugUtil.WriteBinary("RTL8139", - // "Full RxBuffer", - // RxBuffer); - // iterate while buffer is not empty - uint xStatus = BitConverter.ToUInt32(RxBuffer, - RxBufferIdx); - uint xLen = xStatus >> 16; - if (xLen == 0xFFF0) { - break; - } - if (xLen == 0) { - break; - } - /* check for: - * * Invalid Symbol error (100b-tx) = 0x20 - * * runt packet = 0x10 - * * long packet (>4k) = 0x8 - * * CRC error = 0x4 - * * frame alignment error = 0x2 - */ - if ((xStatus & 0x3E) != 0) { - // handle error - mem.Write8((uint)MainRegister.Bit.ChipCmd, 0x4); // only TX enabled - // set up rx mode/configuration - RCR.RCR = (UInt32)(ReceiveConfigurationRegister.BitValue.RBLEN0 | ReceiveConfigurationRegister.BitValue.MXDMA0 | ReceiveConfigurationRegister.BitValue.MXDMA1 | ReceiveConfigurationRegister.BitValue.AB | ReceiveConfigurationRegister.BitValue.AM | ReceiveConfigurationRegister.BitValue.APM); - - RxBufferIdx = valueReg.CurrentBufferAddress; - valueReg.CurrentAddressOfPacketRead = (ushort)RxBufferIdx; - - mem.Write8((uint)MainRegister.Bit.ChipCmd, 0xC); // both TX and RX enabled - - RCR.RCR = (UInt32)(ReceiveConfigurationRegister.BitValue.RBLEN0 | ReceiveConfigurationRegister.BitValue.MXDMA0 | ReceiveConfigurationRegister.BitValue.MXDMA1 | ReceiveConfigurationRegister.BitValue.AB | ReceiveConfigurationRegister.BitValue.AM | ReceiveConfigurationRegister.BitValue.APM); - - // Enable interrupts - imr.IMR = 0x7F; - break; - } else { - xLen -= 4; - RxBufferIdx += 4; - var xBuff = new byte[xLen]; - for (uint i = 0; i < xLen; i++) { - xBuff[i] = RxBuffer[i + RxBufferIdx]; - } - mBuffer.Enqueue(xBuff); - if (DataReceived != null) - { - DataReceived(xBuff); - } - - RxBufferIdx += (ushort)((xLen + 4 + 3) & 0xFFFFFFFC); - if (RxBufferIdx > RxBufferSize) { - RxBufferIdx -= RxBufferSize; - } - } - valueReg.CurrentAddressOfPacketRead = (ushort)(RxBufferIdx - 16); -// break; - } - mem.Write32((uint)MainRegister.Bit.Cfg9346, - 0x0); - } - - /// - /// (Should be) Called when the PCI network card raises an Interrupt. - /// - //public static void HandleNetworkInterrupt(ref IRQContext aContext) - //{ - // if (mInstance.isr.ReceiveOK) - // { - // DebugWriteLine("IRQ detected: Receive OK"); - // mInstance.HandleReceiveInterrupt(); - // } - - // if (mInstance.isr.ReceiveError) - // DebugWriteLine("IRQ detected: Receive ERROR"); - - // if (mInstance.isr.TransmitOK) - // DebugWriteLine("IRQ detected: Transmit OK"); - - // if (mInstance.imr.TransmitError & mInstance.isr.TransmitError) - // DebugWriteLine("IRQ detected: Transmit Error"); - - // if (mInstance.imr.RxBufferOverflow & mInstance.isr.RxBufferOverflow) - // DebugWriteLine("IRQ detected: RxBufferOverflow"); - - // if (mInstance.imr.RxFifoOverflow & mInstance.isr.RxFifoOverflow) - // DebugWriteLine("IRQ detected: RxFIFOOverflow"); - - // if (mInstance.imr.CableLengthChange & mInstance.isr.CableLengthChange) - // DebugWriteLine("IRQ detected: Cable Length Change"); - - // if (mInstance.imr.PacketUnderrun & mInstance.isr.PacketUnderrun) - // DebugWriteLine("IRQ detected: Packet Underrun"); - - // if (mInstance.imr.SoftwareInterrupt & mInstance.isr.SoftwareInterrupt) - // DebugWriteLine("IRQ detected: Software Interrupt"); - - // if (mInstance.imr.TxDescriptorUnavailable & mInstance.isr.TxDescriptorUnavailable) - // DebugWriteLine("IRQ detected: TxDescriptorUnavailable"); - - // if (mInstance.imr.SystemError & mInstance.isr.SystemError) - // DebugWriteLine("IRQ detected: System Error!"); - - - // mInstance.ResetAllIRQ(); - // //Console.ReadLine(); - - //} - - private void ResetAllIRQ() - { - //Setting a bit to 1 will reset it. So we write 16 one's to reset entire ISR. - isr.ISR = isr.ISR; - } - - /// - /// The IRQMaskRegister determines what kind of events which cause IRQ to be raised. - /// - private void InitIRQMaskRegister() - { - //Note; The reference driver from Realtek sets mask = 0x7F (all bits high). - imr.IMR = 0x7F; - //imr.IMR = 0xFFFF; //Listen for all IRQ events -/* imr.ReceiveOK = true; - imr.ReceiveError = true; - imr.TransmitOK = true; - imr.TransmitError = true; - imr.CableLengthChange = true; - imr.SystemError = true; - imr.TimeOut = true; - */ } - - #endregion - - #region Debugging - - public void DisplayDebugInfo() - { - var cr = Register.CommandRegister.Load(mem); - var msr = Register.MediaStatusRegister.Load(mem); - - DebugWriteLine("Tx enabled?: " + cr.TxEnabled.ToString()); - DebugWriteLine("Rx enabled?: " + cr.RxEnabled.ToString()); - DebugWriteLine("Speed 10Mb?: " + msr.Speed10MB.ToString()); - DebugWriteLine("Link OK?: " + (!msr.LinkStatusInverse).ToString()); - DebugWriteLine("CBR (byte count): " + valueReg.CurrentBufferAddress.ToString()); - DebugWriteLine("IMR: " + imr.ToString()); - DebugWriteLine("ISR: " + isr.ToString()); - } - - public void DumpRegisters() - { - DebugWriteLine("Command Register: " + Register.CommandRegister.Load(mem).ToString()); - DebugWriteLine("Config1 Register: " + Register.ConfigurationRegister1.Load(mem).ToString()); - DebugWriteLine("Media S Register: " + Register.MediaStatusRegister.Load(mem).ToString()); - DebugWriteLine("Interrupt Mask R: " + Register.InterruptMaskRegister.Load(mem).ToString()); - DebugWriteLine("Interrupt Status: " + Register.InterruptStatusRegister.Load(mem).ToString()); - DebugWriteLine("Rx Configuration: " + Register.ReceiveConfigurationRegister.Load(mem).ToString()); - DebugWriteLine("Tx Configuration: " + Register.TransmitConfigurationRegister.Load(mem).ToString()); - DebugWriteLine("Tx Status Descr.: " + Register.TransmitStatusDescriptor.Load(mem).ToString()); - DebugWriteLine("Tx Start Address: " + valueReg.TransmitStartAddress.ToString()); - DebugWriteLine("Current Descrip.: " + Register.TransmitStatusDescriptor.GetCurrentTSDescriptor().ToString()); - } - - - //Just for testing - public void DisplayReadBuffer() - { - //byte[] readData = this.ReadReceiveBuffer(); - - //DebugWriteLine("Read buffer contains " + readData.Length + " bytes."); - //DebugWriteLine("---------------------------------"); - - //foreach (byte b in readData) - // DebugWrite(b.ToHex() + ":"); - //DebugWriteLine(""); - - //DebugWriteLine("---------------------------------"); - } - - #endregion - - #region Misc - /// - /// The Early TX Threshold specifies the threshold level in Tx FIFO register before transmission begins. - /// The bytecount should not exceed 2048(2k bytes). - /// The bytecount also needs to be dividable by 32. - /// If bytecount 0 is set then NIC will use 8 bytes as threshold - /// - /// Number zero or a number dividable by 32. - private void SetEarlyTxThreshold(uint bytecount) - { - //TODO: This method should be in TransmitStatusDescriptors.cs - if (bytecount != 0 & (bytecount % 32 > 0)) - throw new ArgumentException("Early TX Threshold must be 0 or dividable by 32"); - - //Each of the four Transmit Status Descriptors (TSD) has its own EarlyTxThreshold. - - //UInt32 address = pciCard.BaseAddress1 + (byte)Register.MainRegister.Bit.RxEarlyCnt; - //var xMem = new Kernel.MemoryAddressSpace(address, 1); - //xMem.Write8(0, (byte)bytecount); - - mem.Write8((byte)Register.MainRegister.Bit.RxEarlyCnt, (byte)bytecount); - } - - /// - /// Takes a byte array, and a memory address. - /// The memoryaddress of the begining of the bytearray is written to the memory address. - /// - /// - /// - private void WriteAddressToPCI(ref byte[] bytearray, byte addressOffset) - { - - /* The data in the bytearray contains the actual bytes we want to transfer to the network. - * This bytearray must be in a continous memoryarea on the computer. - * We then write the address of this memoryarea to the network card. - * The address is stored in the Transmit Start Address which corresponds to the Transmit Status Descriptor we are currently using (0-3). - */ - - //var xMem = new Kernel.MemoryAddressSpace(address, 1); - //xMem.Write32(0, GetMemoryAddress(ref bytearray)); - - mem.Write32(addressOffset, GetMemoryAddress(ref bytearray)); - } - - /// - /// Get the 32-bit address where the bytearray is stored. - /// - private unsafe UInt32 GetMemoryAddress(ref byte[] bytearray) - { - fixed (byte* bodystart = bytearray) - { - return (UInt32)bodystart; - } - } - - #endregion - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/CommandRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/CommandRegister.cs deleted file mode 100644 index 7512c75807..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/CommandRegister.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// The CommandRegister is used for issuing commands to the RTL8139. - /// Used for performing Software Reset, or enabling transmitter and receiver. - /// 1 Byte wide. Only one 4 bits used. (Bit 1, 5, 6, 7 not used) - /// Offset 0x37h from the base memory. - /// - public class CommandRegister - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static CommandRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new CommandRegister(aMem); - } - - private CommandRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - /// - /// Get or Sets the 8 bits in the Command Register. - /// - /// - public byte CR - { - get - { - return xMem.Read8((UInt32)Register.MainRegister.Bit.ChipCmd); - } - set - { - xMem.Write8((UInt32)Register.MainRegister.Bit.ChipCmd, value); - } - } - - #endregion - - #region Register data - - public bool Reset - { - get { return GetBit(BitPosition.RST); } - set { SetBit(BitValue.RST, value); } - } - - public bool RxEnabled - { - get { return GetBit(BitPosition.RE); } - set { SetBit(BitValue.RE, value); } - } - - public bool TxEnabled - { - get { return GetBit(BitPosition.TE); } - set { SetBit(BitValue.TE, value); } - } - - public bool RxBufferEmpty - { - get { return GetBit(BitPosition.BUFE); } - private set { ; } - } - // add bit 7, WRAP, for circular buffer - - - #endregion - - public override string ToString() - { - return this.CR.ToBinary(8); - } - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.CR, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.CR = (byte)(this.CR | (byte)bit); - else - this.CR = (byte)(this.CR & ~(byte)bit); - } - - #endregion - - #region Bits - - /// - /// Bits used to issue commands to the RTL. Used in conjunction with register CHIPCMD (0x37h) - /// - public enum BitPosition : byte - { - BUFE = 0, //Buffer Empty, read-only - TE = 2, //Transmitter Enable - RE = 3, //Receiver Enable - RST = 4 //Software Reset - } - - public enum BitValue : uint - { - BUFE = BinaryHelper.BitPos.BIT0, - TE = BinaryHelper.BitPos.BIT2, - RE = BinaryHelper.BitPos.BIT3, - RST = BinaryHelper.BitPos.BIT4 - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ConfigurationRegister1.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ConfigurationRegister1.cs deleted file mode 100644 index f35bdc6c91..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ConfigurationRegister1.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - class ConfigurationRegister1 - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static ConfigurationRegister1 Load(Kernel.MemoryAddressSpace aMem) - { - return new ConfigurationRegister1(aMem); - } - - private ConfigurationRegister1(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - /// - /// Get or Sets the 8 bits in the Config_1 Register. - /// - public byte CONFIG1 - { - get - { - return xMem.Read8((UInt32)Register.MainRegister.Bit.Config1); - } - set - { - xMem.Write8((UInt32)Register.MainRegister.Bit.Config1, value); - } - } - - #endregion - - #region Register Data - - public bool PowerEnabled - { - get { return GetBit(BitPosition.PMEN); } - set { SetBit(BitValue.PMEN, value); } - } - - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.CONFIG1, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.CONFIG1 = (byte)(this.CONFIG1 | (byte)bit); - else - this.CONFIG1 = (byte)(this.CONFIG1 & ~(byte)bit); - } - - public override string ToString() - { - return this.CONFIG1.ToBinary(8); - } - - #endregion - - #region Bits - - [Flags] - public enum BitPosition : byte - { - PMEN = 0, //Power Management Enable - VPD = 1, //Enable Vital Product Data - IOMAP = 2, //I/O Mapping - MEMMAP = 3, //Memory mapping - LWACT = 4, //LWake Active Mode - DVRLOAD = 5,//Driver Load - LEDS0 = 6, - LEDS1 = 7 - } - - [Flags] - public enum BitValue : uint - { - PMEN = BinaryHelper.BitPos.BIT0, - VPD = BinaryHelper.BitPos.BIT1, - IOMAP = BinaryHelper.BitPos.BIT2, - MEMMAP = BinaryHelper.BitPos.BIT3, - LWACT = BinaryHelper.BitPos.BIT4, - DVRLOAD = BinaryHelper.BitPos.BIT5, - LEDS0 = BinaryHelper.BitPos.BIT6, - LEDS1 = BinaryHelper.BitPos.BIT7 - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/EarlyRxStatusRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/EarlyRxStatusRegister.cs deleted file mode 100644 index 7a4ccbe093..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/EarlyRxStatusRegister.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// The Early Receive Status Register (ERSR) is used as an indicator when incoming data is received. - /// Is 1 byte wide, but only 4 bits used. - /// Offset 0x36h from main memory. - /// - public class EarlyRxStatusRegister - { - private byte ersr; - public EarlyRxStatusRegister(byte data) - { - ersr = data; - } - - public bool IsEarlyRXOkay() - { - return BinaryHelper.CheckBit((ushort)ersr, (ushort)Bit.EROK); - } - - public bool IsEarlyRXOverwrite() - { - return BinaryHelper.CheckBit((ushort)ersr, (ushort)Bit.EROVW); - } - - public bool IsEarlyRXBadPacket() - { - return BinaryHelper.CheckBit((ushort)ersr, (ushort)Bit.ERBAD); - } - - public bool IsEarlyRXGoodPacket() - { - return BinaryHelper.CheckBit((ushort)ersr, (ushort)Bit.ERGOOD); - } - - public enum Bit : ushort - { - /// - /// Early RX OK. Initial value 0. Set when Rx byte count exceeds Rx threshold. - /// When whole packet is received the ROK or RER is set in ISR, and this bit is cleared. - /// - EROK = 0x00, - /// - /// Early Rx Overwrite. Set when local address pointer is equal to CAPR. In the early mode - /// this is different from buffer overflow. - /// - EROVW = 0x01, - /// - /// Set when a packet is completely received, but the packet is bad. - /// - ERBAD = 0x02, - /// - /// Set when packet is completely received, and the packet is good. - /// - ERGOOD = 0x03 - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptMaskRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptMaskRegister.cs deleted file mode 100644 index a8549596b6..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptMaskRegister.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// This register masks the interrupts that can be generated from the InterruptStatusRegister (ISR). - /// Setting a bit to 1 will enable a corresponding bit in ISR to cause an interrupt. - /// During a hardware reset all bits are set to 0. - /// Offset 0x3C - 0x3D from base memory. - /// 16 bit wide. - /// - public class InterruptMaskRegister - { - - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static InterruptMaskRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new InterruptMaskRegister(aMem); - } - - private InterruptMaskRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - public UInt16 IMR - { - get - { - return xMem.Read16((UInt32)Register.MainRegister.Bit.IntrMask); - } - set - { - xMem.Write16((UInt32)Register.MainRegister.Bit.IntrMask, value); - } - } - - public override string ToString() - { - return this.IMR.ToBinary(16); - } - - #endregion - - #region Data - - public bool ReceiveOK - { - get { return GetBit(BitPosition.ROK); } - set { SetBit(BitValue.ROK, value); } - } - - public bool ReceiveError - { - get { return GetBit(BitPosition.RER); } - set { SetBit(BitValue.RER, value); } - } - - public bool TransmitOK - { - get { return GetBit(BitPosition.TOK); } - set { SetBit(BitValue.TOK, value); } - } - - public bool TransmitError - { - get { return GetBit(BitPosition.TER); } - set { SetBit(BitValue.TER, value); } - } - - public bool RxBufferOverflow - { - get { return GetBit(BitPosition.RXOVW); } - set { SetBit(BitValue.RXOVW, value); } - } - - public bool PacketUnderrun - { - get { return GetBit(BitPosition.PUNLC); } - set { SetBit(BitValue.PUNLC, value); } - } - - public bool RxFifoOverflow - { - get { return GetBit(BitPosition.FOVW); } - set { SetBit(BitValue.FOVW, value); } - } - - public bool TxDescriptorUnavailable - { - get { return GetBit(BitPosition.TDU); } - set { SetBit(BitValue.TDU, value); } - } - - public bool SoftwareInterrupt - { - get { return GetBit(BitPosition.SWINT); } - set { SetBit(BitValue.SWINT, value); } - } - - public bool CableLengthChange - { - get { return GetBit(BitPosition.LENCHG); } - set { SetBit(BitValue.LENCHG, value); } - } - - public bool TimeOut - { - get { return GetBit(BitPosition.TIMEOUT); } - set { SetBit(BitValue.TIMEOUT, value); } - } - - public bool SystemError - { - get { return GetBit(BitPosition.SERR); } - set { SetBit(BitValue.SERR, value); } - } - - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.IMR, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.IMR = (byte)(this.IMR | (byte)bit); - else - this.IMR = (byte)(this.IMR & ~(byte)bit); - } - - #endregion - - #region Bits - - [Flags] - public enum BitPosition : byte - { - ROK = 0, //Receive (Rx) OK - RER = 1, //Receive (Rx) Error - TOK = 2, //Transmit (Tx) OK - TER = 3, //Transmit (Tx) Error - RXOVW = 4, //Rx Buffer Overflow - PUNLC = 5, //Packed Underrun/Link Change - FOVW = 6, //FIFO Overflow - TDU = 7, //Tx Descriptor Unavailable - SWINT = 8, //Software Interrupt - LENCHG = 13, //Cable Length Changed - TIMEOUT = 14, //Raised when TCTR register matches TimeInt register - SERR = 15 //System Error. Might cause a reset. - } - - public enum BitValue : uint - { - ROK = BinaryHelper.BitPos.BIT0, - RER = BinaryHelper.BitPos.BIT1, - TOK = BinaryHelper.BitPos.BIT2, - TER = BinaryHelper.BitPos.BIT3, - RXOVW = BinaryHelper.BitPos.BIT4, - PUNLC = BinaryHelper.BitPos.BIT5, - FOVW = BinaryHelper.BitPos.BIT6, - TDU = BinaryHelper.BitPos.BIT7, - SWINT = BinaryHelper.BitPos.BIT8, - LENCHG = BinaryHelper.BitPos.BIT13, - TIMEOUT = BinaryHelper.BitPos.BIT14, - SERR = BinaryHelper.BitPos.BIT15 - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptStatusRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptStatusRegister.cs deleted file mode 100644 index f7135bab33..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/InterruptStatusRegister.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// The InterruptStatusRegister is used to indicate why an IRQ was raised. Used in conjunction with the InterruptMaskRegister. - /// Offset 0x3E - 0x3F from base memory. - /// 16 bit wide. - /// - public class InterruptStatusRegister - { - - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static InterruptStatusRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new InterruptStatusRegister(aMem); - } - - private InterruptStatusRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - public UInt16 ISR - { - get - { - return xMem.Read16((UInt32)Register.MainRegister.Bit.IntrStatus); - } - set - { - xMem.Write16((UInt32)Register.MainRegister.Bit.IntrStatus, value); - } - } - - public override string ToString() - { - return this.ISR.ToBinary(16); - } - - #endregion - - #region Data - - public bool ReceiveOK - { - get { return GetBit(BitPosition.ROK); } - set { SetBit(BitValue.ROK, value); } - } - - public bool ReceiveError - { - get { return GetBit(BitPosition.RER); } - set { SetBit(BitValue.RER, value); } - } - - public bool TransmitOK - { - get { return GetBit(BitPosition.TOK); } - set { SetBit(BitValue.TOK, value); } - } - - public bool TransmitError - { - get { return GetBit(BitPosition.TER); } - set { SetBit(BitValue.TER, value); } - } - - public bool RxBufferOverflow - { - get { return GetBit(BitPosition.RXOVW); } - set { SetBit(BitValue.RXOVW, value); } - } - - public bool PacketUnderrun - { - get { return GetBit(BitPosition.PUNLC); } - set { SetBit(BitValue.PUNLC, value); } - } - - public bool RxFifoOverflow - { - get { return GetBit(BitPosition.FOVW); } - set { SetBit(BitValue.FOVW, value); } - } - - public bool TxDescriptorUnavailable - { - get { return GetBit(BitPosition.TDU); } - set { SetBit(BitValue.TDU, value); } - } - - public bool SoftwareInterrupt - { - get { return GetBit(BitPosition.SWINT); } - set { SetBit(BitValue.SWINT, value); } - } - - public bool CableLengthChange - { - get { return GetBit(BitPosition.LENCHG); } - set { SetBit(BitValue.LENCHG, value); } - } - - public bool TimeOut - { - get { return GetBit(BitPosition.TIMEOUT); } - set { SetBit(BitValue.TIMEOUT, value); } - } - - public bool SystemError - { - get { return GetBit(BitPosition.SERR); } - set { SetBit(BitValue.SERR, value); } - } - - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.ISR, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.ISR = (byte)(this.ISR | (byte)bit); - else - this.ISR = (byte)(this.ISR & ~(byte)bit); - } - - #endregion - - #region Bits - - [Flags] - public enum BitPosition : byte - { - ROK = 0, //Receive (Rx) OK - RER = 1, //Receive (Rx) Error - TOK = 2, //Transmit (Tx) OK - TER = 3, //Transmit (Tx) Error - RXOVW = 4, //Rx Buffer Overflow - PUNLC = 5, //Packed Underrun/Link Change - FOVW = 6, //FIFO Overflow - TDU = 7, //Tx Descriptor Unavailable - SWINT = 8, //Software Interrupt - LENCHG = 13, //Cable Length Changed - TIMEOUT = 14, //Raised when TCTR register matches TimeInt register - SERR = 15 //System Error. Might cause a reset. - } - - public enum BitValue : uint - { - ROK = BinaryHelper.BitPos.BIT0, - RER = BinaryHelper.BitPos.BIT1, - TOK = BinaryHelper.BitPos.BIT2, - TER = BinaryHelper.BitPos.BIT3, - RXOVW = BinaryHelper.BitPos.BIT4, - PUNLC = BinaryHelper.BitPos.BIT5, - FOVW = BinaryHelper.BitPos.BIT6, - TDU = BinaryHelper.BitPos.BIT7, - SWINT = BinaryHelper.BitPos.BIT8, - LENCHG = BinaryHelper.BitPos.BIT13, - TIMEOUT = BinaryHelper.BitPos.BIT14, - SERR = BinaryHelper.BitPos.BIT15 - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MainRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MainRegister.cs deleted file mode 100644 index c1a033561d..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MainRegister.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Hardware2.Network; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - class MainRegister - { - public enum Bit : byte - { - MAC0 = 0x00, // Ethernet hardware address - MAR0 = 0x08, // Multicast filter - TSD0 = 0x10, // Transmit status (Four 32bit registers) - TSD1 = 0x14, - TSD2 = 0x18, - TSD3 = 0x1C, - TSAD0 = 0x20, // Tx descriptors (also four 32bit) - TSAD1 = 0x24, - TSAD2 = 0x28, - TSAD3 = 0x2C, - RxBuf = 0x30, - RxEarlyCnt = 0x34, - RxEarlyStatus = 0x36, - ChipCmd = 0x37, - RxBufPtr = 0x38, // Current Address of Packet Read - RxBufAddr = 0x3A, // Current Buffer Address - IntrMask = 0x3C, - IntrStatus = 0x3E, - TxConfig = 0x40, - RxConfig = 0x44, - Timer = 0x48, // A general-purpose counter - RxMissed = 0x4C, // 24 bits valid, write clears - Cfg9346 = 0x50, - Config0 = 0x51, - Config1 = 0x52, - FlashReg = 0x54, - MSR = 0x58, - //GPPinData = 0x58, - GPPinDir = 0x59, - MII_SMI = 0x5A, - HltClk = 0x5B, - MultiIntr = 0x5C, - TxSummary = 0x60, - MII_BMCR = 0x62, - MII_BMSR = 0x64, - NWayAdvert = 0x66, - NWayLPAR = 0x68, - NWayExpansion = 0x6A - } - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MediaStatusRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MediaStatusRegister.cs deleted file mode 100644 index d5087fc077..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/MediaStatusRegister.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -//using System.Linq; -using System.Text; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - public class MediaStatusRegister - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - public static MediaStatusRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new MediaStatusRegister(aMem); - } - - private MediaStatusRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - /// - /// Get or Sets the 8 bits in the Media Status Register. - /// - public byte MSR - { - get - { - return xMem.Read8((UInt32)Register.MainRegister.Bit.MSR); - } - set - { - xMem.Write8((UInt32)Register.MainRegister.Bit.MSR, value); - } - } - - #endregion - - #region Register data - - - /// - /// Returns inverse of Link Status in Basic Mode Status Register (false means Link OK, true means Link Fail). - /// - public bool LinkStatusInverse - { - get { return GetBit(BitPosition.LINKB); } - private set { ; } - } - - /// - /// True = 10Mb, False = 100Mb - /// - public bool Speed10MB - { - get { return GetBit(BitPosition.SPEED10); } - private set { ; } - } - - public bool AuxPowerPresent - { - get { return GetBit(BitPosition.AUXSTATUS); } - private set { ; } - } - - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.MSR, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.MSR = (byte)(this.MSR | (byte)bit); - else - this.MSR = (byte)(this.MSR & ~(byte)bit); - } - - public override string ToString() - { - return this.MSR.ToBinary(8); - } - - #endregion - - #region Bits - - [Flags] - public enum BitPosition : byte - { - RXPF = 0, - TXPF = 1, - LINKB = 2, - SPEED10 = 3, - AUXSTATUS = 4, - RXFCE = 6, - TXFCE = 7 - } - - [Flags] - public enum BitValue : uint - { - RXPF = BinaryHelper.BitPos.BIT0, - TXPF = BinaryHelper.BitPos.BIT1, - LINKB = BinaryHelper.BitPos.BIT2, - SPEED10 = BinaryHelper.BitPos.BIT3, - AUXSTATUS = BinaryHelper.BitPos.BIT4, - RXFCE = BinaryHelper.BitPos.BIT6, - TXFCE = BinaryHelper.BitPos.BIT7 - } - #endregion - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ReceiveConfigurationRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ReceiveConfigurationRegister.cs deleted file mode 100644 index 470da0f4a2..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ReceiveConfigurationRegister.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// Receive Configuration Register is used to set receive configuration. - /// Offset 44h from main memory. - /// Is 32 bits wide. - /// - public class ReceiveConfigurationRegister - { - private Kernel.MemoryAddressSpace xMem; - - public static ReceiveConfigurationRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new ReceiveConfigurationRegister(aMem); - } - - private ReceiveConfigurationRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - public void Init() - { - UInt32 data = (UInt32)(BitValue.RBLEN0 | BitValue.MXDMA0 | BitValue.MXDMA1 | BitValue.AB | BitValue.AM | BitValue.APM); - this.RCR = data; - } - - /// - /// Get or Sets all 32 bits in Receive Configuration Register - /// - public UInt32 RCR - { - get - { - return xMem.Read32((UInt32)Register.MainRegister.Bit.RxConfig); - } - set - { - xMem.Write32((UInt32)Register.MainRegister.Bit.RxConfig, value); - } - } - - public override string ToString() - { - return this.RCR.ToBinary(32); - } - - /// - /// Gets or Sets the promiscuous mode. When Promisuous mode set ALL detected packets on network are put into Receive buffer, not - /// just the packets sent directly to us. - /// - public bool PromiscuousMode - { - get - { - return BinaryHelper.CheckBit(this.RCR, 0); - } - set - { - this.RCR = BinaryHelper.FlipBit(this.RCR, 0); - } - } - - /// - /// Enables the Rx buffer to act as a ring buffer: if a packet is being written near - /// the end of the buffer and the RTL8139 knows you've already handled data before this - /// (thanks to CAPR), the packet will continue at the beginning of the buffer. - /// - public bool Wrap - { - get - { - return BinaryHelper.CheckBit(RCR, - 7); - } - set - { - RCR = BinaryHelper.FlipBit(RCR, - 7); - } - } - - public enum BitValue : uint - { - /// - /// Accept Physical Address Packets. 0 rejects, 1 accepts. - /// - AAP = BinaryHelper.BitPos.BIT0, - /// - /// Accept Physical Match Packets. 0 rejects, 1 accepts. - /// - APM = BinaryHelper.BitPos.BIT1, - /// - /// Accept Multicast Packets. 0 rejects, 1 accepts. - /// - AM = BinaryHelper.BitPos.BIT2, - /// - /// Accept Broadcast Packets. 0 rejects, 1 accepts. - /// - AB = BinaryHelper.BitPos.BIT3, - /// - /// Accept Runt Packets (packets smaller than 64 bytes - but over 8 bytes.) - /// - AR = BinaryHelper.BitPos.BIT4, - /// - /// Accept Error Packets (Packets with CRC error, alignment error and/or collided fragments). - /// - AER = BinaryHelper.BitPos.BIT5, - /// - /// EEPROM used. 0 = 9346, 1 = 9356. - /// - EEPROM = BinaryHelper.BitPos.BIT6, - /// - /// (Only C mode) 0: Wrap incoming packet to beginning of next RxBuffer. - /// 1: Overflow packet even after coming to end of buffer. - /// - WRAP = BinaryHelper.BitPos.BIT7, - /// - /// Three bits wide. - /// Max DMA Burst Size per Rx DMA Burst. 010 = 64 bytes, 011 = 128 bytes, 100 = 256 bytes. - /// - MXDMA0 = BinaryHelper.BitPos.BIT8, - MXDMA1 = BinaryHelper.BitPos.BIT9, - MXDMA2 = BinaryHelper.BitPos.BIT10, - /// - /// RxBuffer Length. - /// 00 = 8k + 16 byte - /// 01 = 16k + 16 byte - /// 10 = 32k + 16 byte - /// 11 = 64k + 16 byte - /// - RBLEN0 = BinaryHelper.BitPos.BIT11, - RBLEN1 = BinaryHelper.BitPos.BIT12, - /// - /// Rx FIFO Threshold. Three bits wide. - /// When received byte count matches this level the incoming data will - /// be transferred from FIFO to host memory. - /// See 8139C+ specs for valid values. - /// - RXFTH0 = BinaryHelper.BitPos.BIT13, - /// - /// Receive Error Packets Larger than 8 bytes. Yes if 1. If 0 (default) then - /// 64-byte error packets are received. Also depends on AER or AR bits. - /// - RER8 = BinaryHelper.BitPos.BIT16, - /// - /// Multiple Early Interrupt Select. 1 bit wide. - /// - MULERINT = BinaryHelper.BitPos.BIT17, - /// - /// Early Rx Threshold. 4 bits wide. - /// - ERTH0 = BinaryHelper.BitPos.BIT24 - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitConfigurationRegister.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitConfigurationRegister.cs deleted file mode 100644 index 44c1cb86fc..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitConfigurationRegister.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// The TransmitConfigurationRegister (TCR) defines transmit configuration. It controls functions as - /// loopback, heartbeat, auto transmit padding, Programmable Interframe Gap, Fill and Drain thresholds - /// and maximum DMS burst size. - /// Is 32 bits wide. Offset 0x40h-0x43h from main memory. - /// - public class TransmitConfigurationRegister - { - private Kernel.MemoryAddressSpace xMem; - - private TransmitConfigurationRegister(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - public static TransmitConfigurationRegister Load(Kernel.MemoryAddressSpace aMem) - { - return new TransmitConfigurationRegister(aMem); - } - - public void Init() - { - //Set Interframe Gap and Max Burst Size (to 128 bytes) - UInt32 data = (UInt32)(BitValue.IFG0 | BitValue.IFG1 | BitValue.MAXDMA0 | BitValue.MAXDMA1); - this.TCR = data; - } - - /// - /// Get or Sets all 32 bits in Transmit Configuration Register - /// - public UInt32 TCR - { - get - { - return xMem.Read32Unchecked((UInt32)Register.MainRegister.Bit.TxConfig); - } - private set - { - xMem.Write32Unchecked((UInt32)Register.MainRegister.Bit.TxConfig, value); - } - } - - /// - /// Retrieves a number which indicates the Hardware Revision ID of the RTL card. - /// - /// - public byte GetHWVERID() - { - byte mask = 249; // 1111 1001 - byte hwverid = BinaryHelper.GetByteFrom32bit(this.TCR, (byte)(23)); - return (byte)(mask & hwverid); - } - - - public override string ToString() - { - return this.TCR.ToBinary(32); - } - - public bool LoopbackMode - { - get - { - UInt32 data = this.TCR; - bool low = BinaryHelper.CheckBit(data, 17); - bool high = BinaryHelper.CheckBit(data, 18); - - if (low != high) - throw new Exception("Loopback bits are mismatched in RTL drivers TCR PCI register!"); - - if (low && high) - return true; - else - return false; - } - set - { - UInt32 data = this.TCR; - if (value) //turn ON - data = (UInt32)(data | (uint)BitValue.LBK0 | (uint)BitValue.LBK1); - else //turn OFF - data = (UInt32)(data & (uint)~BitValue.LBK0 & (uint)~BitValue.LBK1); - - this.TCR = data; - } - } - - public enum BitValue : uint - { - /// - /// Setting to 1 will cause RTL8139 to retransmit packet. Only allowed in transmit abort state. - /// - CLRABT = BinaryHelper.BitPos.BIT0, - /// - /// Tx Retry Count - 4 bits wide. Tx retry count in multiple of 16. Retries = 16 + (TXRR * 16) times. - /// - TXRR = BinaryHelper.BitPos.BIT4, - /// - /// Max DMA Burst Size per Tx DMA Burst. Se documentation for value details. - /// - MAXDMA0 = BinaryHelper.BitPos.BIT8, - MAXDMA1 = BinaryHelper.BitPos.BIT9, - MAXDMA2 = BinaryHelper.BitPos.BIT10, - /// - /// Append CRC. 0 = CRC is appended. 1 = CRC not appended. - /// - CRC = BinaryHelper.BitPos.BIT16, - /// - /// Loopback test. 00 is normal. 11 is loopback mode. - /// - LBK0 = BinaryHelper.BitPos.BIT17, - LBK1 = BinaryHelper.BitPos.BIT18, - /// - /// Revisision. If this bit is 1 then the network card is RTL8139 rev.G. All other revisions have bit set to 0. - /// - REVG = BinaryHelper.BitPos.BIT23, - /// - /// Interframe Gap Time. Adjusts time between frames. 9.6 micro sec for 10Mbps. 0,96 micro sec for 100Mbps. - /// Only 0xFF is valid according to IEEE 802.3 standard. Two bits wide. - /// - IFG0 = BinaryHelper.BitPos.BIT24, - IFG1 = BinaryHelper.BitPos.BIT25, - /// - /// Hardware Version ID. 5 bits wide (6 with bit 23). See separate method to convert to string. - /// - HWVERID = BinaryHelper.BitPos.BIT26 - } - - /// - /// Get the hardware revision. F.instance RTL8139A or RTL8139C+. - /// - /// Must be the byte from bit 23 to bit 30 in the TCR! Bit 24 and 25 must be 0. - /// - public static string GetHardwareRevision(byte hwverid) - { - switch (hwverid) - { - case 192: //11000000 - return "RTL8139"; - case 224: //11100000 - return "RTL8139A"; - case 225: //11100001 - return "RTL8139A-G"; - case 232: //11101000 - return "RTL8139C"; - case 233: //11101001 - return "RTL8139C+"; - case 240: //11110000 - return "RTL8139B"; - case 248: //11111000 - return "RTL8130"; - default: - return "Unknown RTL813xxx revision (" + hwverid + ")"; - } - - } - - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitStatusDescriptor.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitStatusDescriptor.cs deleted file mode 100644 index 71c01f34f6..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/TransmitStatusDescriptor.cs +++ /dev/null @@ -1,226 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - /// - /// Transmit Status Register is used to describe how the process of transmitting data is going/gone. - /// The RTL8139 contains four of these descriptors. - /// Located at 0x10h, 0x14h, 0x18h and 0x1Ch, each is 4 bytes wide. - /// NB! All Write access to this register has to be in double-word (i.e 32-bit) chuncks. - /// - public class TransmitStatusDescriptor - { - #region Constructor - - private Kernel.MemoryAddressSpace xMem; - - public static TransmitStatusDescriptor Load(Kernel.MemoryAddressSpace aMem) - { - return new TransmitStatusDescriptor(aMem); - } - - private TransmitStatusDescriptor(Kernel.MemoryAddressSpace aMem) - { - xMem = aMem; - } - - /// - /// Used to get the 32 bit value stored in the TransmitStatusDescriptor. - /// - private UInt32 TSD - { - get - { - UInt32 address; - switch (GetCurrentTSDescriptor()) - { - case 0: - address = (UInt32)Register.MainRegister.Bit.TSD0; - break; - case 1: - address = (UInt32)Register.MainRegister.Bit.TSD1; - break; - case 2: - address = (UInt32)Register.MainRegister.Bit.TSD2; - break; - case 3: - address = (UInt32)Register.MainRegister.Bit.TSD3; - break; - default: - throw new Exception("Problem with Transmit Status Descriptor"); - - } - - return xMem.Read32(address); - } - set - { - UInt32 address; - switch (GetCurrentTSDescriptor()) - { - case 0: - address = (UInt32)Register.MainRegister.Bit.TSD0; - break; - case 1: - address = (UInt32)Register.MainRegister.Bit.TSD1; - break; - case 2: - address = (UInt32)Register.MainRegister.Bit.TSD2; - break; - case 3: - address = (UInt32)Register.MainRegister.Bit.TSD3; - break; - default: - throw new Exception("Problem with Transmit Status Descriptor"); - } - - xMem.Write32(address, value); - } - } - - #endregion - - #region Register data - - /// - /// The total size in bytes of the data in the descriptor. Must not be longer then 1792 bytes (0x700h), this - /// will set Tx queue invalid. - /// - public int Size - { - get - { - UInt16 mask = 8191; // 0001 1111 1111 1111 - return (int)(this.TSD & mask); - } - set - { - if (value > 1792) - throw new ArgumentOutOfRangeException("Tried to set Size to " + value.ToString() + ". The Size in the TransmitStatusDescriptor in RTL8139 can not be over 1792 bytes."); - - UInt32 data = this.TSD; - - //First AND all 13 SIZE bits to zero. Then OR together with the correct size. - UInt32 zeromask = 524287; //1111 1111 1111 1111 1110 0000 0000 0000 - data = data & zeromask; - data = (UInt32)(data | (UInt32)value); - - this.TSD = data; - } - } - - /// - /// Clearing (set to false) the OWN bit in the Transmit Status Descriptor will start poring the data from the - /// buffer into the FIFO buffer on the PCI card. The data then moves from the FIFO to the network cable. - /// - public bool OWN - { - get { return GetBit(BitPosition.OWN); } - set { SetBit(BitValue.OWN, value); } - } - - #endregion - - #region Accessors - - private bool GetBit(BitPosition bit) - { - return BinaryHelper.CheckBit(this.TSD, (byte)bit); - } - - private void SetBit(BitValue bit, bool value) - { - if (value) - this.TSD = (byte)(this.TSD | (byte)bit); - else - this.TSD = (byte)(this.TSD & ~(byte)bit); - } - - public override string ToString() - { - return this.TSD.ToBinary(32); - } - - #endregion - - #region Bits - - public enum BitPosition - { - SIZE = 0, - OWN = 13, - TUN = 14, - TOK = 15, - ERTXTH0 = 16, - ERTXTH1 = 17, - ERTXTH2 = 18, - ERTXTH3 = 19, - ERTXTH4 = 20, - ERTXTH5 = 21, - NCC0 = 24, - NCC1 = 25, - NCC2 = 26, - NCC3 = 27, - CDH = 28, - OWC = 29, - TABT = 30, - CRS = 31 - } - - public enum BitValue : uint - { - SIZE = BinaryHelper.BitPos.BIT0, //13 bit long. Must not contain value over 0x700h - OWN = BinaryHelper.BitPos.BIT13, //Set to 1 when transmit complete. Defaults to 1. - TUN = BinaryHelper.BitPos.BIT14, //Transmit FIFO Underrun. Is set to 1 if TxFIFO was exhausted during transmition. - TOK = BinaryHelper.BitPos.BIT15, //Transmit OK. - ERTXTH0 = BinaryHelper.BitPos.BIT16, //Early TX Threshold 0-5 - ERTXTH1 = BinaryHelper.BitPos.BIT17, - ERTXTH2 = BinaryHelper.BitPos.BIT18, - ERTXTH3 = BinaryHelper.BitPos.BIT19, - ERTXTH4 = BinaryHelper.BitPos.BIT20, - ERTXTH5 = BinaryHelper.BitPos.BIT21, - NCC0 = BinaryHelper.BitPos.BIT24, //Number of Collision Count 0-3 - NCC1 = BinaryHelper.BitPos.BIT25, - NCC2 = BinaryHelper.BitPos.BIT26, - NCC3 = BinaryHelper.BitPos.BIT27, - CDH = BinaryHelper.BitPos.BIT28, //CD Heart Beat. Cleared in 100Mbps mode. - OWC = BinaryHelper.BitPos.BIT29, //Out of Window Collision - TABT = BinaryHelper.BitPos.BIT30, //Transmition aborted - CRS = BinaryHelper.BitPos.BIT31 //Carrier Sense Lost - } - - #endregion - - #region Transmit Descriptors - - private static byte currentTSDescriptor = 0; - /// - /// Increments to the next Transmit Status Descriptor to use. - /// There are four TSD's which are used in round-robin. - /// - /// - public static void IncrementTSDescriptor() - { - const byte NumberOfDescriptors = 4; - if (currentTSDescriptor == (NumberOfDescriptors - 1)) - currentTSDescriptor = 0; - else - currentTSDescriptor++; - } - - public static byte GetCurrentTSDescriptor() - { - return currentTSDescriptor; - } - - #endregion - - - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ValueTypeRegisters.cs b/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ValueTypeRegisters.cs deleted file mode 100644 index 3970b1ae39..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/RTL8139Old/Register/ValueTypeRegisters.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -//using System.Linq; -using System.Text; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Hardware2.Network.Devices.RTL8139.Register; - -namespace Cosmos.Hardware2.Network.Devices.RTL8139.Register -{ - - /// - /// The registers in the RTL 8139 can be divided in two types. The first type are the registers where each bit has - /// a meaning, and where it is common to change specific bits. F.instance the CommandRegister where you have a Reset bit. - /// - /// The other type of registers are the ones who contain values. Like a 32-bit pointer to an address, or a counter - /// of some sort. Here we never set individual bits, but treat the entire 8, 16 or 32 bits as one logical unit. - /// - /// This class contains accessor to valuetype registers. - /// - public class ValueTypeRegisters - { - #region Constructor - - Kernel.MemoryAddressSpace xMem; - public static ValueTypeRegisters Load(Kernel.MemoryAddressSpace aMem) - { - return new ValueTypeRegisters(aMem); - } - - private ValueTypeRegisters(Kernel.MemoryAddressSpace aMem) - { - this.xMem = aMem; - } - - #endregion - - - #region MAC address - - - public MACAddress Mac - { - get - { - byte[] b = new byte[6]; - - for (byte i = 0; i < 6; i++) - b[i] = xMem.Read8Unchecked((UInt32)MainRegister.Bit.MAC0 + i); - - return new MACAddress(b); - } - set - { - //TODO: Fix - only permitted to write with 4 byte access. I.e. use Write32. - for (byte b = 0; b < 6; b++) - xMem.Write8Unchecked((UInt32)MainRegister.Bit.MAC0 + b, value.bytes[b]); - } - } - - - #endregion - - #region MAR - Multicast - - public byte[] Mar - { - get - { - byte[] b = new byte[6]; - - for (byte i = 0; i < 6; i++) - b[i] = xMem.Read8Unchecked((UInt32)MainRegister.Bit.MAR0 + i); - - return b; - } - set - { - //TODO: Fix - only allowed to do 32 bit write - for (byte b = 0; b < 6; b++) - xMem.Write8Unchecked((UInt32)MainRegister.Bit.MAR0 + b, value[b]); - } - } - - #endregion - - - //TSAD - #region Transmit Start Address of Descriptors - - public UInt32 TSAD0 - { - get { return xMem.Read32((UInt32)MainRegister.Bit.TSAD0); } - set { xMem.Write32((UInt32)MainRegister.Bit.TSAD0, value); } - } - - public UInt32 TSAD1 - { - get { return xMem.Read32((UInt32)MainRegister.Bit.TSAD1); } - set { xMem.Write32((UInt32)MainRegister.Bit.TSAD1, value); } - } - - public UInt32 TSAD2 - { - get { return xMem.Read32((UInt32)MainRegister.Bit.TSAD2); } - set { xMem.Write32((UInt32)MainRegister.Bit.TSAD2, value); } - } - - public UInt32 TSAD3 - { - get { return xMem.Read32((UInt32)MainRegister.Bit.TSAD3); } - set { xMem.Write32((UInt32)MainRegister.Bit.TSAD3, value); } - } - - /// - /// Returns the actual address in the current - /// - public UInt32 TransmitStartAddress - { - get - { - //TODO: Usee properties above (TSAD0, TSAD1 etc...). - UInt32 address = 0; - switch (Register.TransmitStatusDescriptor.GetCurrentTSDescriptor()) - { - case 0: - address = (UInt32)MainRegister.Bit.TSAD0; - break; - case 1: - address = (UInt32)MainRegister.Bit.TSAD1; - break; - case 2: - address = (UInt32)MainRegister.Bit.TSAD2; - break; - case 3: - address = (UInt32)MainRegister.Bit.TSAD3; - break; - default: - throw new Exception("Illegal Transmit Status Descriptor"); - } - - return xMem.Read32(address); - } - private set { ;} - - } - - #endregion - - //RBSTART - public UInt32 RBSTART - { - get { return xMem.Read32((UInt32)MainRegister.Bit.RxBuf); } - set { xMem.Write32((UInt32)MainRegister.Bit.RxBuf, value); } - } - - /// - /// The address in the RxBuffer that the driver has read up to. - /// Also known as: CAPR / Current Address Pointer Read - /// - public UInt16 CurrentAddressOfPacketRead - { - get { return xMem.Read16((UInt32)MainRegister.Bit.RxBufPtr); } - set { xMem.Write16((UInt32)MainRegister.Bit.RxBufPtr, value); } - } - - /// - /// The CBR contains the address of the last byte in the RXBuffer. - /// Also known as: CBR/CBP/Current Buffer Address/Buffer Write Pointer/Received byte count - /// - public UInt16 CurrentBufferAddress - { - get { return xMem.Read16((UInt32)MainRegister.Bit.RxBufAddr); } - private set { ;} - } - - //TCTR - - //MPC - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/Devices/ViaRhine/VT6102.cs b/source/Archive/Cosmos.Hardware/Network/Devices/ViaRhine/VT6102.cs deleted file mode 100644 index 675cda5720..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/Devices/ViaRhine/VT6102.cs +++ /dev/null @@ -1,338 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.Devices.ViaRhine -{ - public class VT6102 : NetworkDevice - { - protected PCIDevice pciCard; - protected IOAddressSpace io; - protected MACAddress mac; - - protected List mRxBuffers; - private ManagedMemorySpace mRxDescriptors; - private ManagedMemorySpace mTxDescriptors; - protected Queue mRecvBuffer; - protected Queue mTransmitBuffer; - private int mNextTXDesc; - - public VT6102(PCIDevice device) - { - if (device == null) - { - throw new ArgumentException("PCI Device is null. Unable to get VIA Rhine-II card"); - } - pciCard = device; - - // We are handling this device - pciCard.Claimed = true; - - // Setup interrupt handling - //Interrupts.IRQ10 += HandleNetworkInterrupt; - //Interrupts.AddIRQHandler(device.InterruptLine, HandleNetworkInterrupt); - - // Get IO Address from PCI Bus - io = pciCard.GetAddressSpace(0) as Kernel.IOAddressSpace; - - // Enable the card - pciCard.EnableDevice(); - - // Get the EEPROM MAC Address and set it as the devices MAC - byte[] eeprom_mac = new byte[6]; - UInt32 result = io.Read32(0x00); - eeprom_mac[0] = BinaryHelper.GetByteFrom32bit(result, 0); - eeprom_mac[1] = BinaryHelper.GetByteFrom32bit(result, 8); - eeprom_mac[2] = BinaryHelper.GetByteFrom32bit(result, 16); - eeprom_mac[3] = BinaryHelper.GetByteFrom32bit(result, 24); - result = io.Read32(0x04); - eeprom_mac[4] = BinaryHelper.GetByteFrom32bit(result, 0); - eeprom_mac[5] = BinaryHelper.GetByteFrom32bit(result, 8); - - mac = new MACAddress(eeprom_mac); - - // Software Reset device - SoftwareReset(); - - // Configure Receive Config - ReceiveConfigRegister = 0x1C; - // Configure Transmit Config - TransmitConfigRegister = 0x04; - - // Setup RX Descriptors - mRxDescriptors = new ManagedMemorySpace(256, 16); - - // Setup TX Descriptors - mTxDescriptors = new ManagedMemorySpace(256, 16); - - /* Initialize the RX and TX buffers, and set up the RX descriptors to point - to the buffers. Also, mark the RX descriptors as being owned by the card so data - can be received in them */ - mRxBuffers = new List(); - for (uint rxd = 0; rxd < 16; rxd++) - { - uint xOffset = rxd * 16; - - ManagedMemorySpace buffer = new ManagedMemorySpace(2048); - mRxDescriptors.Write32(xOffset + 12, mRxDescriptors.Offset + xOffset + 16); - mRxDescriptors.Write32(xOffset + 8, buffer.Offset); - mRxDescriptors.Write32(xOffset + 4, buffer.Size); - mRxDescriptors.Write32(xOffset, 0x80000000); - mRxBuffers.Add(buffer); - } - mRxDescriptors.Write32(252, mRxDescriptors.Offset); - for (uint txd = 0; txd < 16; txd++) - { - uint xOffset = txd * 16; - - mTxDescriptors.Write32(xOffset + 12, mTxDescriptors.Offset + xOffset + 16); - mTxDescriptors.Write32(xOffset + 8, 0); - mTxDescriptors.Write32(xOffset + 4, 0); - mTxDescriptors.Write32(xOffset, 0); - } - mTxDescriptors.Write32(252, mTxDescriptors.Offset); - - mNextTXDesc = 0; - - RxDescAddressRegister = mRxDescriptors.Offset; - TxDescAddressRegister = mTxDescriptors.Offset; - - // Setup and clear interrupts - IntMaskRegister = 0xFFFF; - IntStatusRegister = 0xFFFF; - - // Setup our Receive and Transmit Queues - mTransmitBuffer = new Queue(); - mRecvBuffer = new Queue(); - } - - private void SoftwareReset() - { - io.Write16(0x08, 0x8000); - while ((io.Read16(0x08) & 0x8000) != 0) - { - // Wait for device to reset - } - } - - public static void InitDriver() - { - Device.AddDriverInit(FindAll); - } - - /// - /// Retrieve all VIA Rhine-II network cards found on computer. - /// - /// List of all VIA Rhine-II cards - public static void FindAll() - { - Console.WriteLine("Scanning for VIA Rhine-II cards..."); - foreach (PCIDevice device in Cosmos.Hardware2.PCIBus.Devices) - { - if ((device.VendorID == 0x1106) && (device.DeviceID == 0x3065) && (device.Claimed == false)) - { - VT6102 nic = new VT6102(device); - - Console.WriteLine("Found VIA Rhine-II NIC on PCI " + device.Bus + ":" + device.Slot + ":" + device.Function); - Console.WriteLine("NIC IRQ: " + device.InterruptLine); - Console.WriteLine("NIC MAC Address: " + nic.MACAddress.ToString()); - - NetworkDevice.Add(nic); - } - } - } - - //protected void HandleNetworkInterrupt(ref IRQContext aContext) - //{ - // UInt16 cur_status = IntStatusRegister; - - // if ((cur_status & 0x01) != 0) - // { - // ReadRawData(); - // } - - // IntStatusRegister = cur_status; - //} - - #region Register Access - protected UInt16 CommandRegister - { - get { return io.Read16(0x08); } - set { io.Write16(0x08, value); } - } - protected UInt16 IntStatusRegister - { - get { return io.Read16(0x0C); } - set { io.Write16(0x0C, value); } - } - protected UInt16 IntMaskRegister - { - get { return io.Read16(0x0E); } - set { io.Write16(0x0E, value); } - } - protected byte ReceiveConfigRegister - { - get { return io.Read8(0x06); } - set { io.Write8(0x06, value); } - } - protected byte TransmitConfigRegister - { - get { return io.Read8(0x07); } - set { io.Write8(0x07, value); } - } - protected UInt32 RxDescAddressRegister - { - get { return io.Read32(0x18); } - set { io.Write32(0x18, value); } - } - protected UInt32 TxDescAddressRegister - { - get { return io.Read32(0x1C); } - set { io.Write32(0x1C, value); } - } - #endregion - - #region Network Device Implementation - public override MACAddress MACAddress - { - get { return this.mac; } - } - - public override bool Enable() - { - // Set start,rxon and txon bit on card - CommandRegister = 0x1A; - - return base.Enable(); - } - public override bool Ready - { - get { return ((CommandRegister & 0x02) != 0); } - } - - public override bool QueueBytes(byte[] buffer, int offset, int length) - { - byte[] data = new byte[length]; - for (int b = 0; b < length; b++) - { - data[b] = buffer[b + offset]; - } - - if (SendBytes(ref data) == false) - { - mTransmitBuffer.Enqueue(data); - } - - return true; - } - - public override bool ReceiveBytes(byte[] buffer, int offset, int max) - { - throw new NotImplementedException(); - } - - public override byte[] ReceivePacket() - { - if (mRecvBuffer.Count < 1) - { - return null; - } - - byte[] data = mRecvBuffer.Dequeue(); - return data; - } - - public override int BytesAvailable() - { - if (mRecvBuffer.Count < 1) - { - return 0; - } - - return mRecvBuffer.Peek().Length; - } - - public override bool IsSendBufferFull() - { - return false; - } - - public override bool IsReceiveBufferFull() - { - return false; - } - - public override string Name - { - get { return "VIA Rhine-II Ethernet Adapter"; } - } - #endregion - - #region Helper Functions - protected bool SendBytes(ref byte[] aData) - { - int txd = mNextTXDesc++; - if (mNextTXDesc >= 16) - { - mNextTXDesc = 0; - } - - uint xOffset = (uint)(txd * 16); - UInt32 status = mTxDescriptors.Read32(xOffset); - ManagedMemorySpace txBuffer = new ManagedMemorySpace(aData); - if (((txBuffer.Offset % 4) != 0) || (txBuffer.Size < 64) ) - { - txBuffer = new ManagedMemorySpace((uint)(aData.Length < 64 ? 64 : aData.Length), 4); - for (uint b = 0; b < aData.Length; b++) - { - txBuffer[b] = aData[b]; - } - } - if ((status & 0x80000000) == 0) - { - mTxDescriptors.Write32(xOffset + 8, txBuffer.Offset); - mTxDescriptors.Write32(xOffset + 4, txBuffer.Size | 0x600000 ); - - mTxDescriptors.Write32(xOffset, status | 0x80000000); - return true; - } - - return false; - } - - private void ReadRawData() - { - uint status; - UInt16 recv_size; - byte[] recv_data; - - for (int rxd = 0; rxd < 16; rxd++) - { - uint xOffset = (uint)(rxd * 16); - status = mRxDescriptors.Read32(xOffset); - if ((status & 0x80000000) == 0) - { - recv_size = (UInt16)((status & 0xFFFF0000) >> 16); - recv_data = new byte[recv_size]; - for (uint b = 0; b < recv_size; b++) - { - recv_data[b] = mRxBuffers[rxd][b]; - } - - if (DataReceived != null) - { - DataReceived(recv_data); - } - else - { - mRecvBuffer.Enqueue(recv_data); - } - - mRxDescriptors.Write32(xOffset, status | 0x80000000); - } - } - } - #endregion - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/MACAddress.cs b/source/Archive/Cosmos.Hardware/Network/MACAddress.cs deleted file mode 100644 index 1162c18200..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/MACAddress.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network -{ - public class MACAddress : IComparable - { - public static MACAddress Broadcast; - public static MACAddress None; - - static MACAddress() { - var xBroadcastArray = new byte[6]; - xBroadcastArray[0] = 0xFF; - xBroadcastArray[1] = 0xFF; - xBroadcastArray[2] = 0xFF; - xBroadcastArray[3] = 0xFF; - xBroadcastArray[4] = 0xFF; - xBroadcastArray[5] = 0xFF; - Broadcast = new MACAddress(xBroadcastArray); - var xNoneArray = new byte[6]; - xNoneArray[0] = 0xFF; - xNoneArray[1] = 0xFF; - xNoneArray[2] = 0xFF; - xNoneArray[3] = 0xFF; - xNoneArray[4] = 0xFF; - xNoneArray[5] = 0xFF; - None = new MACAddress(xNoneArray); - } - - public byte[] bytes = new byte[6]; - - public MACAddress(byte[] address) - { - if (address == null || address.Length != 6) - throw new ArgumentException("MACAddress is null or has wrong length", "address"); - - bytes[0] = address[0]; - bytes[1] = address[1]; - bytes[2] = address[2]; - bytes[3] = address[3]; - bytes[4] = address[4]; - bytes[5] = address[5]; - - } - - /// - /// Create a MAC address from a byte buffer starting at the specified offset - /// - /// byte buffer - /// offset in buffer to start from - public MACAddress(byte[] buffer, int offset) - { - if (buffer == null || buffer.Length < (offset + 6)) - throw new ArgumentException("buffer does not contain enough data starting at offset", "buffer"); - - bytes[0] = buffer[offset]; - bytes[1] = buffer[offset + 1]; - bytes[2] = buffer[offset + 2]; - bytes[3] = buffer[offset + 3]; - bytes[4] = buffer[offset + 4]; - bytes[5] = buffer[offset + 5]; - } - - public MACAddress(MACAddress m) : this(m.bytes) - { - } - - - public bool IsValid() - { - return bytes != null && bytes.Length ==6; - } - - public int CompareTo(object obj) - { - if (obj is MACAddress) - { - MACAddress other = (MACAddress)obj; - int i = 0; - i = bytes[0].CompareTo(other.bytes[0]); - if (i != 0) return i; - i = bytes[1].CompareTo(other.bytes[1]); - if (i != 0) return i; - i = bytes[2].CompareTo(other.bytes[2]); - if (i != 0) return i; - i = bytes[3].CompareTo(other.bytes[3]); - if (i != 0) return i; - i = bytes[4].CompareTo(other.bytes[4]); - if (i != 0) return i; - i = bytes[5].CompareTo(other.bytes[5]); - if (i != 0) return i; - - return 0; - } - else - throw new ArgumentException("obj is not a MACAddress", "obj"); - } - - public override bool Equals(object obj) - { - if (obj is MACAddress) - { - MACAddress other = (MACAddress)obj; - - return bytes[0] == other.bytes[0] && - bytes[1] == other.bytes[1] && - bytes[2] == other.bytes[2] && - bytes[3] == other.bytes[3] && - bytes[4] == other.bytes[4] && - bytes[5] == other.bytes[5]; - } - else - throw new ArgumentException("obj is not a MACAddress", "obj"); - } - - public override int GetHashCode() - { - return (GetType().AssemblyQualifiedName + "|" + this.ToString()).GetHashCode(); - } - - public UInt64 ToNumber() - { - return (UInt64)((bytes[0] << 40) | (bytes[1] << 32) | (bytes[2] << 24) | (bytes[3] << 16) | - (bytes[4] << 8) | (bytes[5] << 0)); - } - - private static void PutByte(char[] aChars, int aIndex, byte aByte) - { - string xChars = "0123456789ABCDEF"; - aChars[aIndex + 0] = xChars[(aByte >> 4) & 0xF]; - aChars[aIndex + 1] = xChars[aByte & 0xF]; - } - - public override string ToString() - { - // mac address consists of 6 2chars pairs, delimited by : - var xChars = new char[17]; - PutByte(xChars, 0, bytes[0]); - xChars[2] = ':'; - PutByte(xChars, 3, bytes[1]); - xChars[5] = ':'; - PutByte(xChars, 6, bytes[2]); - xChars[8] = ':'; - PutByte(xChars, 9, bytes[3]); - xChars[11] = ':'; - PutByte(xChars, 12, bytes[4]); - xChars[14] = ':'; - PutByte(xChars, 15, bytes[5]); - return new String(xChars); - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/NetworkDevice.cs b/source/Archive/Cosmos.Hardware/Network/NetworkDevice.cs deleted file mode 100644 index 523c22e76f..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/NetworkDevice.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2.Network -{ - public delegate void DataReceivedHandler(byte[] packetData); - - public abstract class NetworkDevice : Device - { - protected NetworkDevice() - { - mType = DeviceType.Network; - } - - public abstract MACAddress MACAddress - { - get; - } - - public abstract bool Ready - { - get; - } - - public DataReceivedHandler DataReceived; - - public virtual bool QueueBytes(byte[] buffer) - { - return QueueBytes(buffer, 0, buffer.Length); - } - - public abstract bool QueueBytes(byte[] buffer, int offset, int length); - - public abstract bool ReceiveBytes(byte[] buffer, int offset, int max); - public abstract byte[] ReceivePacket(); - - public abstract int BytesAvailable(); - - public abstract bool IsSendBufferFull(); - public abstract bool IsReceiveBufferFull(); - - public static List NetworkDevices - { - get - { - List netDevices = new List(); - - for (int d = 0; d < Devices.Count; d++) - { - Device dev = Devices[d]; - if (dev.Type == DeviceType.Network) - { - netDevices.Add((NetworkDevice)dev); - } - } - - return netDevices; - } - } - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/Ethernet2Frame.cs b/source/Archive/Cosmos.Hardware/Network/TCPIPModel/Ethernet2Frame.cs deleted file mode 100644 index 00c68a62f0..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/Ethernet2Frame.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -//using System.Linq; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.TCPIPModel.PhysicalLayer.Ethernet2 -{ - public class Ethernet2Frame - { - public Ethernet2Frame() - { - } - - private MACAddress xDestination = null; - /// - /// The MAC address of the network card to receive the frame. - /// - public MACAddress Destination - { - get { return xDestination; } - set { xDestination = value; } - } - - private MACAddress xSource = null; - /// - /// The MAC address of the network card sending the frame.. - /// - public MACAddress Source - { - get { return xSource; } - set { xSource = value; } - } - - /// - /// Describes what kind of packet is inside the frame. Typically 0x0800 for IPv4 or 0x0806 for ARP. - /// See http://en.wikipedia.org/wiki/EtherType for types. - /// - public byte[] EtherType - { - get - { - byte[] type = new byte[2]; - type[0] = 0x08; //Hardcoded to IP - type[1] = 0x00; - return type; - } - private set { ;} - } - - private byte[] xPayload; - /// - /// The actual data inside the frame, in raw byte format. F.instance an IPv4 or IPv6 packet. - /// - public byte[] Payload - { - get { return xPayload; } - set { xPayload = value; } - } - - /// - /// - /// - public UInt32 CRC32 { get; set; } - - //public byte InterframeGap { get; set; } - - /// - /// The entire frame as bytes. - /// - /// - public byte[] RawBytes() - { - List xBytes = new List(); - - //foreach (byte dest in this.Destination.bytes) - // xBytes.Add(dest); - for (int i = 0; i < this.Destination.bytes.Length; i++) - xBytes.Add(this.Destination.bytes[i]); - - //foreach (byte src in this.Source.bytes) - // xBytes.Add(src); - for (int s = 0; s < this.Source.bytes.Length; s++) - xBytes.Add(this.Source.bytes[s]); - - xBytes.Add(this.EtherType[0]); - xBytes.Add(this.EtherType[1]); - - if (this.Payload != null) - { - //xBytes.AddRange(this.Payload); - for (int i = 0; i < this.Payload.Length; i++) - { - xBytes.Add(this.Payload[i]); - } - } - - return xBytes.ToArray(); - } - - public override string ToString() - { - //Outputs frame as Wireshark displays it - - StringBuilder sb = new StringBuilder(); - sb.Append("---- Ethernet II Frame ----"); - sb.Append(Environment.NewLine); - sb.Append("Destination: " + this.Destination.ToString()); - sb.Append(Environment.NewLine); - sb.Append("Source: " + this.Source.ToString()); - sb.Append(Environment.NewLine); - //sb.Append("Type: 0x" + this.EtherType[0].ToHex() + this.EtherType[1].ToHex()); - sb.Append(Environment.NewLine); - sb.Append("Payload size: " + this.Payload.Length); - sb.Append(Environment.NewLine); - sb.Append("--------------------"); - sb.Append(Environment.NewLine); - - return sb.ToString(); - } - - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Address.cs b/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Address.cs deleted file mode 100644 index e3b22c3b6a..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Address.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections.Generic; -//using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.Network.TCPIPModel.NetworkLayer.IPv4 -{ - //Kudzu - Frode I planned to use the existing stuff in System.Net for parsing URLS, but - // the problem is it crashes right now. - [Obsolete("Soon to be replaced by System.Net.IPAddress")] - public class IPv4Address - { - private byte[] address = new byte[4]; - - public IPv4Address(byte aFirst, byte aSecond, byte aThird, byte aFourth) - { - address[0] = aFirst; - address[1] = aSecond; - address[2] = aThird; - address[3] = aFourth; - } - - //TODO: Uncomment - doesn't work in Cosmos yet. FL, 08.apr'08. - public static IPv4Address Parse(string adr) - { - - string[] fragments = adr.Split('.'); - if (fragments.Length == 4) - { - byte first = byte.Parse(fragments[0]); - byte second = byte.Parse(fragments[1]); - byte third = byte.Parse(fragments[2]); - byte fourth = byte.Parse(fragments[3]); - return new IPv4Address(first, second, third, fourth); - } - else - { - return null; - } - } - - public bool IsLoopbackAddress() - { - if (address[0] == 127) - return true; - else - return false; - } - - public bool IsBroadcastAddress() - { - //TODO: Check if the address is a BroadcastAddress. - - throw new NotImplementedException(); - } - - public override string ToString() - { - return - address[0] + - "." + - address[1] + - "." + - address[2] + - "." + - address[3]; - } - - public byte[] ToByteArray() - { - return address; - } - - public UInt32 To32BitNumber() - { - return (UInt32)((address[0] << 0) | (address[1] << 4) | (address[2] << 8) | (address[3] << 16)); - } - - } -} diff --git a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Packet.cs b/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Packet.cs deleted file mode 100644 index f586927554..0000000000 --- a/source/Archive/Cosmos.Hardware/Network/TCPIPModel/IPv4Packet.cs +++ /dev/null @@ -1,449 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.Network.TCPIPModel.NetworkLayer.IPv4 -{ - //See http://en.wikipedia.org/wiki/IPv4#Header - [Obsolete("Use Cosmos.Sys.IP4Packet instead")] - public class IPv4Packet - { - #region Constructor etc. - - public IPv4Packet() - { - } - - public static IPv4Packet Load(byte[] data) - { - throw new NotImplementedException("Can't parse incoming IPv4 packets yet"); - - //TODO: Get the correct bits and bytes... - //TODO: Maybe some endinan conversions are needed. - //var p = new IPv4Packet(); - //p.Version = data[0]; - //p.HeaderLength = data[1]; - //etc... - - //return p; - } - - - public override string ToString() - { - //Outputs the IP packet like Wireshark displays it - StringBuilder sb = new StringBuilder(); - sb.Append("----- IPv4 Packet -----"); - sb.Append(Environment.NewLine); - sb.Append("Version: " + this.Version); - sb.Append(Environment.NewLine); - sb.Append("Header length: " + this.HeaderLength + " (" + this.HeaderLength * 4 + " bytes)"); - sb.Append(Environment.NewLine); - //sb.Append("Type of Service/DiffServ: 0x" + this.TypeOfService.ToHex()); - sb.Append(Environment.NewLine); - sb.Append("Total length: " + this.TotalLength + " bytes"); - sb.Append(Environment.NewLine); - //sb.Append("Identification: 0x" + this.Identification.ToHex() + " (" + this.Identification + ")"); - sb.Append(Environment.NewLine); - //sb.Append("Flags: 0x" + ((byte)(this.FragmentFlags)).ToHex()); - sb.Append(Environment.NewLine); - sb.Append("Fragment offset: " + this.FragmentOffset); - sb.Append(Environment.NewLine); - sb.Append("Time to live: " + this.TimeToLive); - sb.Append(Environment.NewLine); - //sb.Append("Protocol: " + this.Protocol + " (0x" + ((byte)(this.Protocol)).ToHex() + ")"); - sb.Append(Environment.NewLine); - //sb.Append("Header checksum: 0x" + this.HeaderChecksum.ToHex() + " [unknown]"); - sb.Append(Environment.NewLine); - sb.Append("Source: " + this.SourceAddress); - sb.Append(Environment.NewLine); - sb.Append("Destination: " + this.DestinationAddress); - sb.Append(Environment.NewLine); - sb.Append("Data size: " + this.Data.Count + " bytes"); - sb.Append(Environment.NewLine); - sb.Append("--------------------"); - sb.Append(Environment.NewLine); - return sb.ToString(); - } - - #endregion - - #region Calculations - - public UInt16 CalculateHeaderChecksum() - { - UInt16 checksum = 0; - List words = new List(); - - byte[] header = this.GetHeaderBytes(); - - //Assemble the bytes into 16-bit words - for (int index = 0; index < header.Length; index += 2) - { - UInt16 word = (UInt16)(header[index + 1] + (header[index] << 8)); - words.Add(word); - } - - //Reset the existing checksum in the header to 0. - words[5] = 0; - - //Add together the 16-bit words - UInt32 total = 0; - for (int i = 0; i < words.Count; i++) - { - total = total + words[i]; - if (total > UInt16.MaxValue) - { - total = total - UInt16.MaxValue; //move carry - } - } - - //Invert the bits - checksum = (UInt16)~total; - - return checksum; - } - - /// - /// Internet Header Length (IHL) tells the number of 32-bit words in the header. - /// Minimum length is 5 words. Maximum is 15 words when Options are set. - /// - /// - public byte CalculateHeaderLength() - { - return 5; //TODO, include Options - } - - public byte CalculateTotalLength() - { - byte header = (byte)(CalculateHeaderLength() * (byte)4); - byte body; - - if (this.Data != null) - body = (byte)this.Data.Count; - else - body = 0; - - return (byte)(header + body); - } - - #endregion - - #region Packet Header - - private byte[] GetHeaderBytes() - { - //TODO - the following things don't work (because of endianism) - // Identification + Flags + Fragment Offset - // Header Checksum - - List bytes = new List(); - List fields = new List(); - - //Add the packetsections together into 32-bit words - //UInt32 field1 = 0; - UInt32 xVersion = (UInt32)(this.Version << 28); - UInt32 xHeaderLength = (UInt32)(this.HeaderLength << 24); - UInt32 xTypeOfService = (UInt32)(this.TypeOfService << 16); - UInt32 xTotalLength = (UInt32)(this.TotalLength << 0); - //field1 = ; - fields.Add(HostToNetwork(xVersion + xHeaderLength + xTypeOfService + xTotalLength)); - - //UInt32 field2 = (UInt32)((this.Identification << 16) | ((byte)(this.FragmentFlags)) << 12 | (this.FragmentOffset << 1)); - UInt32 field2 = 0; - UInt32 Identity = (UInt32)(this.Identification << 16); - UInt32 Flags = (UInt32)((byte)(this.FragmentFlags)) << 14; - UInt32 Offset = (UInt32)((this.FragmentOffset) & (UInt16)0xFF); - field2 = Identity + Flags + Offset; - fields.Add(HostToNetwork(field2)); - - //UInt32 field3 = (UInt32)((this.TimeToLive << 0) | (((byte)(this.Protocol)) << 8) | (UInt16)(this.HeaderChecksum << 16)); - UInt32 xTimeToLive = (UInt32)(this.TimeToLive << 24); - UInt32 xProtocol = (UInt32)((byte)this.Protocol << 16); - UInt32 xHeaderChecksum = (UInt32)(this.HeaderChecksum << 0); - //Console.WriteLine("Field3: " + field3.ToBinary(32)); - fields.Add(HostToNetwork(xTimeToLive + xProtocol + xHeaderChecksum)); - - //Split the 32-bit words into bytes - for (int i = 0; i < fields.Count; i++) - { - bytes.Add((byte)(fields[i] >> 0)); - bytes.Add((byte)(fields[i] >> 8)); - bytes.Add((byte)(fields[i] >> 16)); - bytes.Add((byte)(fields[i] >> 24)); - } - - //Source and Destination - foreach (byte b in SourceAddress.ToByteArray()) - bytes.Add(b); - - foreach (byte b in DestinationAddress.ToByteArray()) - bytes.Add(b); - - //TODO - Options field - - return bytes.ToArray(); - - } - - public byte Version - { - get { return 4;} - private set { ;} - } - - private byte mHeaderLength = 0; - /// - /// The number of 32-bit words in the header. Does not include the length of the data. Use TotalLength for that. - /// Remember to multiply by four to get the byte count. - /// - public byte HeaderLength - { - get { return mHeaderLength; } - set { mHeaderLength = value; } - } - - private byte mTypeOfService = 0; - public byte TypeOfService - { - get { return mTypeOfService; } - set { mTypeOfService = value;} - } - - private UInt16 mTotalLength = 0; - public UInt16 TotalLength - { - get { return mTotalLength; } - set { mTotalLength = value;} - } - - private UInt16 mIdentification = 0; - public UInt16 Identification - { - get { return mIdentification; } - set { mIdentification = value;} - } - - private Fragmentation mFragmentFlags; - public Fragmentation FragmentFlags - { - get { return mFragmentFlags; } - set { mFragmentFlags = value;} - } - - public UInt16 mFragmentOffset = 0; - public UInt16 FragmentOffset - { - get { return mFragmentOffset; } - set - { - //TODO - only 13 bits, not all 16. - mFragmentOffset = value; - } - } - - private byte mTimeToLive = 0xFF; - public byte TimeToLive - { - get { return mTimeToLive; } - set { mTimeToLive = value;} - } - - private Protocols mProtocol; - public Protocols Protocol - { - get { return mProtocol; } - set { mProtocol = value ;} - } - - private UInt16 mHeaderChecksum = 0; - public UInt16 HeaderChecksum - { - get { return mHeaderChecksum; } - set { mHeaderChecksum = value;} - } - - private IPv4Address mSourceAddress; - public IPv4Address SourceAddress - { - get { return mSourceAddress; } - set { mSourceAddress = value;} - } - - private IPv4Address mDestinationAddress; - public IPv4Address DestinationAddress - { - get { return mDestinationAddress; } - set { mDestinationAddress = value;} - } - - public UInt32 Options - { - get { throw new NotImplementedException(); } - set { ;} - } - - #endregion - - #region Packet Body - - private List mData = new List(0); - public List Data - { - get { return mData; } - set { mData = value;} - } - - - /// - /// Returns the entire packet as a byte array. - /// The header is using big-endian for the bytes. - /// - public byte[] RawBytes() - { - List bytes = new List(); - - // Header - foreach (byte b in GetHeaderBytes()) - { - bytes.Add(b); - } - - // Main body of the packet - if (this.Data != null) - { - foreach (byte b in this.Data.ToArray()) - { - bytes.Add(b); - } - } - - return bytes.ToArray(); - } - - #endregion - - #region Misc - - /// - /// Reverses a string. - /// - private string Reverse(string s) - { - char[] c = s.ToCharArray(); - string ts = string.Empty; - - for (int i = c.Length - 1; i >= 0; i--) - ts += c[i].ToString(); - - return ts; - } - - /// - /// Converts the four bytes in a 32-bit word into using big-endian instead of little-endian. - /// The four bytes retains their position, but the bits inside each of the bytes are reversed in order. - /// - /// - /// - //private UInt32 ConvertToBigEndian(UInt32 n) - //{ - // string bin = n.ToBinary(); - // bin = bin.PadLeft(32, '0'); - // //while (bin.Length < 32) - // // bin = "0" + bin; - - // string first = Reverse(bin.Substring(0, 8)); - // string second = Reverse(bin.Substring(8, 8)); - // string third = Reverse(bin.Substring(16, 8)); - // string fourth = Reverse(bin.Substring(24, 8)); - - // //Console.WriteLine("Little-endian: " + bin + " (as value: " + bin.FromBinary()); - // bin = first + second + third + fourth; - // //Console.WriteLine("Big-endian: " + bin + " (as value: " + bin.FromBinary()); - - // return bin.FromBinary(); - //} - - //public short HostToNetworkOrder(short host) - //{ - // throw new NotImplementedException(); - //} - - //private static int HostToNetworkOrder(int n) - //{ - // string bin = n.ToBinary(); - // bin = bin.PadLeft(32, '0'); - - // string first = bin.Substring(0, 8); - // string second = bin.Substring(8, 8); - // string third = bin.Substring(16, 8); - // string fourth = bin.Substring(24, 8); - - // bin = fourth + third + second + first; - - // return (int)bin.FromBinary(); - //} - - public static long HostToNetworkOrder(int data) - { - int xResult = 0; - byte xTemp = 0; - - xTemp = (byte)data; - xResult = xTemp << 24; - - xTemp = (byte)(data >> 8); - xResult += xTemp << 16; - - xTemp = (byte)(data >> 16); - xResult += xTemp << 8; - - xTemp = (byte)(data >> 24); - xResult += xTemp; - - return xResult; - } - - private static ushort HostToNetwork(ushort aValue) - { - return (ushort)((aValue << 8) | ((aValue >> 8) & 0xFF)); - } - - private static uint HostToNetwork(uint aValue) - { - return (uint)(((HostToNetwork((ushort)aValue) & 0xffff) << 0x10) | (HostToNetwork((ushort)(aValue >> 0x10)) & 0xffff)); - } - - //public long HostToNetworkOrder(long host) - //{ - // throw new NotImplementedException(); - //} - - #endregion - - #region Enumerations - - [Flags] - public enum Fragmentation : int - { - MoreFragments = 0, - DoNotFragment = 1, - Reserved = 2 - } - - public enum Protocols - { - ICMP = 1, - IGMP = 2, - TCP = 6, - UDP = 17, - OSPF = 89, - SCTP = 132 - } - - #endregion - - - } -} diff --git a/source/Archive/Cosmos.Hardware/OldTempDictionary.cs b/source/Archive/Cosmos.Hardware/OldTempDictionary.cs deleted file mode 100644 index 6f202b4503..0000000000 --- a/source/Archive/Cosmos.Hardware/OldTempDictionary.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 -{ - public class TempDictionary - { - private List items = new List(); - - public class DictionaryItem - { - UInt32 key; - - public UInt32 Key - { - get { return key; } - set { key = value; } - } - - Value _value; - - public Value Value - { - get { return _value; } - set { value = this._value; } - } - - public DictionaryItem(UInt32 key, Value avalue) - { - this.key = key; - this._value = avalue; - } - } - - public Value this[UInt32 key] - { - get - { - Value res; - TryGetValue(key, out res); - return res; - } - set - { - TrySetValue(key, value); - } - } - - public void Add(UInt32 key, Value value) - { - items.Add(new TempDictionary.DictionaryItem(key, value)); - } - - public bool TryGetValue(UInt32 key, out Value value) - { - for (int i = 0; i < items.Count; i++) - { - if (items[i].Key == key) - { - value = items[i].Value; - return true; - } - } - value = default(Value); - return false; - } - - public bool ContainsKey(UInt32 key) - { - for (int i = 0; i < items.Count; i++) - { - if (items[i].Key == key) - { - return true; - } - } - - return false; - } - - public bool TrySetValue(UInt32 key, Value value) - { - for (int i = 0; i < items.Count; i++) - { - if (items[i].Key == key) - { - items[i].Value = value; - return true; - } - } - return false; - } - - public void Remove(UInt32 key) - { - for (int i = 0; i < items.Count; i++) - { - if (items[i].Key == key) - { - items.RemoveAt(i); - break; - } - } - } - } -} diff --git a/source/Archive/Cosmos.Hardware/PCIBus.cs b/source/Archive/Cosmos.Hardware/PCIBus.cs deleted file mode 100644 index a7c0759d42..0000000000 --- a/source/Archive/Cosmos.Hardware/PCIBus.cs +++ /dev/null @@ -1,6967 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2 { - - public class PCIBus { - //TODO: Change to Dictionary when the IL2CPU bug is fixed - public class DeviceID { - UInt32 key; - - public UInt32 Key { - get { return key; } - set { key = value; } - } - - String value; - - public String Value { - get { return value; } - set { this.value = value; } - } - - public DeviceID(UInt32 pkey, String pvalue) { - key = pkey; - value = pvalue; - } - } - - //Dont make static. We dont want all the strings loaded in RAM - // all the time. - public class DeviceIDs { - protected TempDictionary mVendors = new TempDictionary(); - protected TempDictionary mDevices = new TempDictionary(); - - public DeviceIDs() - { - // Current QEMU hardware - mVendors.Add(0x8086, "Intel Corporation"); - // 1237 440FX - 82441FX PMC [Natoma] - // 7000 82371SB PIIX3 ISA [Natoma/Triton II] - // 7010 82371SB PIIX3 IDE [Natoma/Triton II] - // 7113 82371AB/EB/MB PIIX4 ACPI - // Need to check sub attr - maybe we have this: - // 15ad 1976 Virtual Machine Chipset - mVendors.Add(0x1013, "Cirrus Logic"); - // 00b8 GD 5446 - mVendors.Add(0x10EC, "Realtek Semiconductor"); - //8139 RTL-8029(AS) - //0357 000a TTP-Monitoring Card V2.0 - //1025 005a TravelMate 290 - //1025 8920 ALN-325 - //1025 8921 ALN-325 - //103c 006a NX9500 - //1043 1045 L8400B or L3C/S notebook - //1043 8109 P5P800-MX Mainboard - //1071 8160 MIM2000 - //10bd 0320 EP-320X-R - //10ec 8139 RT8139 - //10f7 8338 Panasonic CF-Y5 laptop - //1113 ec01 FNC-0107TX - //1186 1300 DFE-538TX - //1186 1320 SN5200 - //1186 8139 DRN-32TX - //11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter - //1259 2500 AT-2500TX - //1259 2503 AT-2500TX/ACPI - //1429 d010 ND010 - //1432 9130 EN-9130TX - //1436 8139 RT8139 - //144d c00c P30/P35 notebook - //1458 e000 GA-7VM400M/7VT600 Motherboard - //1462 788c 865PE Neo2-V Mainboard - //146c 1439 FE-1439TX - //1489 6001 GF100TXRII - //1489 6002 GF100TXRA - //149c 139a LFE-8139ATX - //149c 8139 LFE-8139TX - //14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet - //1565 2300 P4TSV Onboard LAN (RTL8100B) - //1695 9001 Onboard RTL8101L 10/100 MBit - //1799 5000 F5D5000 PCI Card/Desktop Network PCI Card - //1904 8139 RTL8139D Fast Ethernet Adapter - //2646 0001 EtheRx - //8e2e 7000 KF-230TX - //8e2e 7100 KF-230TX/2 - //a0a0 0007 ALN-325C - - mVendors.Add(0x1274, "Ensoniq"); - - //Found on ESX Server: - mVendors.Add(0x15AD, "VMware Inc."); - mVendors.Add(0x1000, "LSI Logic 53C810 Device"); - mVendors.Add(0x1022, "Advanced Micro Devices"); - - #region PCIHelper - - #region Fill vendors - - //lines of this region are generated with PCIHelper - - // Source: http://www.pcidatabase.com/vendors.php?sort=id - - - //For now it is too slow to add all vendors - /* - mVendors.Add(0x0033, "Paradyne Corp."); - mVendors.Add(0x003D, "master"); - mVendors.Add(0x0070, "Hauppauge Computer Works Inc."); - mVendors.Add(0x0100, "Ncipher Corp. Ltd"); - mVendors.Add(0x0123, "General Dynamics"); - mVendors.Add(0x0315, "SK - Electronics Co., Ltd."); - mVendors.Add(0x0A89, "BREA Technologies Inc."); - mVendors.Add(0x0E11, "Compaq Computer Corp."); - mVendors.Add(0x1000, "LSI Logic 53C810 Device"); - mVendors.Add(0x1001, "Kolter Electronic - Germany"); - mVendors.Add(0x1002, "ATI"); - mVendors.Add(0x1003, "ULSI"); - mVendors.Add(0x1004, "VLSI Technology"); - mVendors.Add(0x1006, "Reply Group"); - mVendors.Add(0x1007, "Netframe Systems Inc."); - mVendors.Add(0x1008, "Epson"); - mVendors.Add(0x100A, "Phoenix Technologies Ltd."); - mVendors.Add(0x100B, "National Semiconductors"); - mVendors.Add(0x100C, "Tseng Labs"); - mVendors.Add(0x100D, "AST Research"); - mVendors.Add(0x100E, "Weitek"); - mVendors.Add(0x1010, "Video Logic Ltd."); - mVendors.Add(0x1011, "Digital Equipment Corporation"); - mVendors.Add(0x1012, "Micronics Computers Inc."); - mVendors.Add(0x1013, "Cirrus Logic"); - mVendors.Add(0x1014, "International Business Machines Corp."); - mVendors.Add(0x1016, "Fujitsu ICL Computers"); - mVendors.Add(0x1017, "Spea Software AG"); - mVendors.Add(0x1018, "Unisys Systems"); - mVendors.Add(0x1019, "Elitegroup Computer System"); - mVendors.Add(0x101A, "NCR Corporation"); - mVendors.Add(0x101B, "Vitesse Semiconductor"); - mVendors.Add(0x101E, "American Megatrends Inc."); - mVendors.Add(0x101F, "PictureTel Corp."); - mVendors.Add(0x1020, "Hitachi Computer Electronics"); - mVendors.Add(0x1021, "Oki Electric Industry"); - mVendors.Add(0x1022, "Advanced Micro Devices"); - mVendors.Add(0x1023, "TRIDENT MICRO"); - mVendors.Add(0x1025, "Acer Incorporated"); - mVendors.Add(0x1028, "Dell Computer Corporation"); - mVendors.Add(0x102A, "LSI Logic Headland Division"); - mVendors.Add(0x102B, "Matrox Electronic Systems Ltd."); - mVendors.Add(0x102C, "Asiliant (Chips And Technologies)"); - mVendors.Add(0x102D, "Wyse Technologies"); - mVendors.Add(0x102E, "Olivetti Advanced Technology"); - mVendors.Add(0x102F, "Toshiba America"); - mVendors.Add(0x1030, "TMC Research"); - mVendors.Add(0x1031, "miro Computer Products AG"); - mVendors.Add(0x1033, "NEC Electronics"); - mVendors.Add(0x1034, "Burndy Corporation"); - mVendors.Add(0x1036, "Future Domain"); - mVendors.Add(0x1037, "Hitachi Micro Systems Inc"); - mVendors.Add(0x1038, "AMP Incorporated"); - mVendors.Add(0x1039, "Silicon Integrated Systems"); - mVendors.Add(0x103A, "Seiko Epson Corporation"); - mVendors.Add(0x103B, "Tatung Corp. Of America"); - mVendors.Add(0x103C, "Hewlett-Packard Company"); - mVendors.Add(0x103E, "Solliday Engineering"); - mVendors.Add(0x103F, "Logic Modeling"); - mVendors.Add(0x1041, "Computrend"); - mVendors.Add(0x1043, "Asustek Computer Inc."); - mVendors.Add(0x1044, "Distributed Processing Tech"); - mVendors.Add(0x1045, "OPTi Inc."); - mVendors.Add(0x1046, "IPC Corporation LTD"); - mVendors.Add(0x1047, "Genoa Systems Corp."); - mVendors.Add(0x1048, "ELSA GmbH"); - mVendors.Add(0x1049, "Fountain Technology"); - mVendors.Add(0x104A, "STMicroelectronics"); - mVendors.Add(0x104B, "Mylex / Buslogic"); - mVendors.Add(0x104C, "Texas Instruments"); - mVendors.Add(0x104D, "Sony Corporation"); - mVendors.Add(0x104E, "Oak Technology"); - mVendors.Add(0x104F, "Co-Time Computer Ltd."); - mVendors.Add(0x1050, "Winbond Electronics Corp."); - mVendors.Add(0x1051, "Anigma Corp."); - mVendors.Add(0x1053, "Young Micro Systems"); - mVendors.Add(0x1054, "Hitachi Ltd"); - mVendors.Add(0x1055, "Standard Microsystems Corp."); - mVendors.Add(0x1056, "ICL"); - mVendors.Add(0x1057, "Motorola"); - mVendors.Add(0x1058, "Electronics & Telecommunication Res"); - mVendors.Add(0x1059, "Kontron Canada"); - mVendors.Add(0x105A, "Promise Technology"); - mVendors.Add(0x105B, "Foxconn International Inc."); - mVendors.Add(0x105C, "Wipro Infotech Limited"); - mVendors.Add(0x105D, "Number Nine Visual Technology"); - mVendors.Add(0x105E, "Vtech Engineering Canada Ltd."); - mVendors.Add(0x105F, "Infotronic America Inc."); - mVendors.Add(0x1060, "United Microelectronics"); - mVendors.Add(0x1061, "8x8 Inc."); - mVendors.Add(0x1062, "Maspar Computer Corp."); - mVendors.Add(0x1063, "Ocean Office Automation"); - mVendors.Add(0x1064, "Alcatel Cit"); - mVendors.Add(0x1065, "Texas Microsystems"); - mVendors.Add(0x1066, "Picopower Technology"); - mVendors.Add(0x1067, "Mitsubishi Electronics"); - mVendors.Add(0x1068, "Diversified Technology"); - mVendors.Add(0x106A, "Aten Research Inc."); - mVendors.Add(0x106B, "Apple Computer Inc."); - mVendors.Add(0x106C, "Hyundai Electronics America"); - mVendors.Add(0x106D, "Sequent Computer Systems"); - mVendors.Add(0x106E, "DFI Inc."); - mVendors.Add(0x106F, "City Gate Development LTD"); - mVendors.Add(0x1070, "Daewoo Telecom Ltd."); - mVendors.Add(0x1071, "Mitac"); - mVendors.Add(0x1072, "GIT Co. Ltd."); - mVendors.Add(0x1073, "Yamaha Corporation"); - mVendors.Add(0x1074, "Nexgen Microsystems"); - mVendors.Add(0x1075, "Advanced Integration Research"); - mVendors.Add(0x1077, "QLogic Corporation"); - mVendors.Add(0x1078, "Cyrix Corporation"); - mVendors.Add(0x1079, "I-Bus"); - mVendors.Add(0x107A, "Networth"); - mVendors.Add(0x107B, "Gateway 2000"); - mVendors.Add(0x107C, "Goldstar Co. Ltd."); - mVendors.Add(0x107D, "Leadtek Research"); - mVendors.Add(0x107E, "Testernec"); - mVendors.Add(0x107F, "Data Technology Corporation"); - mVendors.Add(0x1080, "Cypress Semiconductor"); - mVendors.Add(0x1081, "Radius Inc."); - mVendors.Add(0x1082, "EFA Corporation Of America"); - mVendors.Add(0x1083, "Forex Computer Corporation"); - mVendors.Add(0x1084, "Parador"); - mVendors.Add(0x1085, "Tulip Computers Int'l BV"); - mVendors.Add(0x1086, "J. Bond Computer Systems"); - mVendors.Add(0x1087, "Cache Computer"); - mVendors.Add(0x1088, "Microcomputer Systems (M) Son"); - mVendors.Add(0x1089, "Data General Corporation"); - mVendors.Add(0x108A, "SBS Operations"); - mVendors.Add(0x108C, "Oakleigh Systems Inc."); - mVendors.Add(0x108D, "Olicom"); - mVendors.Add(0x108E, "Sun Microsystems"); - mVendors.Add(0x108F, "Systemsoft Corporation"); - mVendors.Add(0x1090, "Encore Computer Corporation"); - mVendors.Add(0x1091, "Intergraph Corporation"); - mVendors.Add(0x1092, "Diamond Computer Systems"); - mVendors.Add(0x1093, "National Instruments"); - mVendors.Add(0x1094, "First Int'l Computers"); - mVendors.Add(0x1095, "Silicon Image, Inc."); - mVendors.Add(0x1096, "Alacron"); - mVendors.Add(0x1097, "Appian Graphics"); - mVendors.Add(0x1098, "Quantum Designs Ltd."); - mVendors.Add(0x1099, "Samsung Electronics Co. Ltd."); - mVendors.Add(0x109A, "Packard Bell"); - mVendors.Add(0x109B, "Gemlight Computer Ltd."); - mVendors.Add(0x109C, "Megachips Corporation"); - mVendors.Add(0x109D, "Zida Technologies Ltd."); - mVendors.Add(0x109E, "Brooktree Corporation"); - mVendors.Add(0x109F, "Trigem Computer Inc."); - mVendors.Add(0x10A0, "Meidensha Corporation"); - mVendors.Add(0x10A1, "Juko Electronics Inc. Ltd."); - mVendors.Add(0x10A2, "Quantum Corporation"); - mVendors.Add(0x10A3, "Everex Systems Inc."); - mVendors.Add(0x10A4, "Globe Manufacturing Sales"); - mVendors.Add(0x10A5, "Racal Interlan"); - mVendors.Add(0x10A8, "Sierra Semiconductor"); - mVendors.Add(0x10A9, "Silicon Graphics"); - mVendors.Add(0x10AB, "Digicom"); - mVendors.Add(0x10AC, "Honeywell IASD"); - mVendors.Add(0x10AD, "Winbond Systems Labs"); - mVendors.Add(0x10AE, "Cornerstone Technology"); - mVendors.Add(0x10AF, "Micro Computer Systems Inc."); - mVendors.Add(0x10B0, "CardExpert Technology"); - mVendors.Add(0x10B1, "Cabletron Systems Inc."); - mVendors.Add(0x10B2, "Raytheon Company"); - mVendors.Add(0x10B3, "Databook Inc."); - mVendors.Add(0x10B4, "STB Systems"); - mVendors.Add(0x10B5, "PLX Technology Inc."); - mVendors.Add(0x10B6, "Madge Networks"); - mVendors.Add(0x10B7, "3Com Corporation"); - mVendors.Add(0x10B8, "Standard Microsystems Corporation"); - mVendors.Add(0x10B9, "Ali Corporation"); - mVendors.Add(0x10BA, "Mitsubishi Electronics Corp."); - mVendors.Add(0x10BB, "Dapha Electronics Corporation"); - mVendors.Add(0x10BC, "Advanced Logic Research Inc."); - mVendors.Add(0x10BD, "Surecom Technology"); - mVendors.Add(0x10BE, "Tsenglabs International Corp."); - mVendors.Add(0x10BF, "MOST Corp."); - mVendors.Add(0x10C0, "Boca Research Inc."); - mVendors.Add(0x10C1, "ICM Corp. Ltd."); - mVendors.Add(0x10C2, "Auspex Systems Inc."); - mVendors.Add(0x10C3, "Samsung Semiconductors"); - mVendors.Add(0x10C4, "Award Software Int'l Inc."); - mVendors.Add(0x10C5, "Xerox Corporation"); - mVendors.Add(0x10C6, "Rambus Inc."); - mVendors.Add(0x10C8, "Neomagic Corporation"); - mVendors.Add(0x10C9, "Dataexpert Corporation"); - mVendors.Add(0x10CA, "Fujitsu Siemens"); - mVendors.Add(0x10CB, "Omron Corporation"); - mVendors.Add(0x10CD, "Advanced System Products"); - mVendors.Add(0x10CF, "Fujitsu Ltd."); - mVendors.Add(0x10D1, "Future+ Systems"); - mVendors.Add(0x10D2, "Molex Incorporated"); - mVendors.Add(0x10D3, "Jabil Circuit Inc."); - mVendors.Add(0x10D4, "Hualon Microelectronics"); - mVendors.Add(0x10D5, "Autologic Inc."); - mVendors.Add(0x10D6, "Cetia"); - mVendors.Add(0x10D7, "BCM Advanced Research"); - mVendors.Add(0x10D8, "Advanced Peripherals Labs"); - mVendors.Add(0x10D9, "Macronix International Co. Ltd."); - mVendors.Add(0x10DB, "Rohm Research"); - mVendors.Add(0x10DC, "CERN-European Lab. for Particle Physics"); - mVendors.Add(0x10DD, "Evans & Sutherland"); - mVendors.Add(0x10DE, "NVIDIA"); - mVendors.Add(0x10DF, "Emulex Corporation"); - mVendors.Add(0x10E1, "Tekram Technology Corp. Ltd."); - mVendors.Add(0x10E2, "Aptix Corporation"); - mVendors.Add(0x10E3, "Tundra Semiconductor Corp."); - mVendors.Add(0x10E4, "Tandem Computers"); - mVendors.Add(0x10E5, "Micro Industries Corporation"); - mVendors.Add(0x10E6, "Gainbery Computer Products Inc."); - mVendors.Add(0x10E7, "Vadem"); - mVendors.Add(0x10E8, "Applied Micro Circuits Corp."); - mVendors.Add(0x10E9, "Alps Electronic Corp. Ltd."); - mVendors.Add(0x10EA, "Tvia, Inc."); - mVendors.Add(0x10EB, "Artist Graphics"); - mVendors.Add(0x10EC, "Realtek Semiconductor"); - mVendors.Add(0x10ED, "Ascii Corporation"); - mVendors.Add(0x10EE, "Xilinx Corporation"); - mVendors.Add(0x10EF, "Racore Computer Products"); - mVendors.Add(0x10F0, "Curtiss-Wright Controls Embedded Computing"); - mVendors.Add(0x10F1, "Tyan Computer"); - mVendors.Add(0x10F2, "Achme Computer Inc. - GONE !!!!"); - mVendors.Add(0x10F3, "Alaris Inc."); - mVendors.Add(0x10F4, "S-Mos Systems"); - mVendors.Add(0x10F5, "NKK Corporation"); - mVendors.Add(0x10F6, "Creative Electronic Systems SA"); - mVendors.Add(0x10F7, "Matsushita Electric Industrial Corp."); - mVendors.Add(0x10F8, "Altos India Ltd."); - mVendors.Add(0x10F9, "PC Direct"); - mVendors.Add(0x10FA, "Truevision"); - mVendors.Add(0x10FB, "Thesys Microelectronic's"); - mVendors.Add(0x10FC, "I-O Data Device Inc."); - mVendors.Add(0x10FD, "Soyo Technology Corp. Ltd."); - mVendors.Add(0x10FE, "Fast Electronic GmbH"); - mVendors.Add(0x10FF, "Ncube"); - mVendors.Add(0x1100, "Jazz Multimedia"); - mVendors.Add(0x1101, "Initio Corporation"); - mVendors.Add(0x1102, "Creative Technology LTD."); - mVendors.Add(0x1103, "Triones Technologies Inc. (HighPoint)"); - mVendors.Add(0x1104, "Rasterops"); - mVendors.Add(0x1105, "Sigma Designs Inc."); - mVendors.Add(0x1106, "VIA Technology"); - mVendors.Add(0x1107, "Stratus Computer"); - mVendors.Add(0x1108, "Proteon Inc."); - mVendors.Add(0x1109, "Adaptec/Cogent Data Technologies"); - mVendors.Add(0x110A, "Siemens Nixdorf AG"); - mVendors.Add(0x110B, "Chromatic Research Inc"); - mVendors.Add(0x110C, "Mini-Max Technology Inc."); - mVendors.Add(0x110D, "ZNYX Corporation"); - mVendors.Add(0x110E, "CPU Technology"); - mVendors.Add(0x110F, "Ross Technology"); - mVendors.Add(0x1112, "Osicom Technologies Inc."); - mVendors.Add(0x1113, "Accton Technology Corporation"); - mVendors.Add(0x1114, "Atmel Corp."); - mVendors.Add(0x1116, "Data Translation, Inc."); - mVendors.Add(0x1117, "Datacube Inc."); - mVendors.Add(0x1118, "Berg Electronics"); - mVendors.Add(0x1119, "ICP vortex Computersysteme GmbH"); - mVendors.Add(0x111A, "Efficent Networks"); - mVendors.Add(0x111C, "Tricord Systems Inc."); - mVendors.Add(0x111D, "Integrated Device Technology Inc."); - mVendors.Add(0x111F, "Precision Digital Images"); - mVendors.Add(0x1120, "EMC Corp."); - mVendors.Add(0x1121, "Zilog"); - mVendors.Add(0x1123, "Excellent Design Inc."); - mVendors.Add(0x1124, "Leutron Vision AG"); - mVendors.Add(0x1125, "Eurocore/Vigra"); - mVendors.Add(0x1127, "FORE Systems"); - mVendors.Add(0x1129, "Firmworks"); - mVendors.Add(0x112A, "Hermes Electronics Co. Ltd."); - mVendors.Add(0x112C, "Zenith Data Systems"); - mVendors.Add(0x112D, "Ravicad"); - mVendors.Add(0x112E, "Infomedia"); - mVendors.Add(0x1130, "Computervision"); - mVendors.Add(0x1131, "Philips Semiconductors"); - mVendors.Add(0x1132, "Mitel Corp."); - mVendors.Add(0x1133, "Eicon Networks Corporation"); - mVendors.Add(0x1134, "Mercury Computer Systems Inc."); - mVendors.Add(0x1135, "Fuji Xerox Co Ltd"); - mVendors.Add(0x1136, "Momentum Data Systems"); - mVendors.Add(0x1137, "Cisco Systems Inc"); - mVendors.Add(0x1138, "Ziatech Corporation"); - mVendors.Add(0x1139, "Dynamic Pictures Inc"); - mVendors.Add(0x113A, "FWB Inc"); - mVendors.Add(0x113B, "Network Computing Devices"); - mVendors.Add(0x113C, "Cyclone Microsystems Inc."); - mVendors.Add(0x113D, "Leading Edge Products Inc"); - mVendors.Add(0x113E, "Sanyo Electric Co"); - mVendors.Add(0x113F, "Equinox Systems"); - mVendors.Add(0x1140, "Intervoice Inc"); - mVendors.Add(0x1141, "Crest Microsystem Inc"); - mVendors.Add(0x1142, "Alliance Semiconductor"); - mVendors.Add(0x1143, "Netpower Inc"); - mVendors.Add(0x1144, "Cincinnati Milacron"); - mVendors.Add(0x1145, "Workbit Corp"); - mVendors.Add(0x1146, "Force Computers"); - mVendors.Add(0x1147, "Interface Corp"); - mVendors.Add(0x1148, "Marvell Semiconductor Germany GmbH"); - mVendors.Add(0x1149, "Win System Corporation"); - mVendors.Add(0x114A, "VMIC"); - mVendors.Add(0x114B, "Canopus corporation"); - mVendors.Add(0x114C, "Annabooks"); - mVendors.Add(0x114D, "IC Corporation"); - mVendors.Add(0x114E, "Nikon Systems Inc"); - mVendors.Add(0x114F, "Digi International"); - mVendors.Add(0x1150, "Thinking Machines Corporation"); - mVendors.Add(0x1151, "JAE Electronics Inc."); - mVendors.Add(0x1153, "Land Win Electronic Corp"); - mVendors.Add(0x1154, "Melco Inc"); - mVendors.Add(0x1155, "Pine Technology Ltd"); - mVendors.Add(0x1156, "Periscope Engineering"); - mVendors.Add(0x1157, "Avsys Corporation"); - mVendors.Add(0x1158, "Voarx R&D Inc"); - mVendors.Add(0x1159, "Mutech"); - mVendors.Add(0x115A, "Harlequin Ltd"); - mVendors.Add(0x115B, "Parallax Graphics"); - mVendors.Add(0x115C, "Photron Ltd."); - mVendors.Add(0x115D, "Xircom"); - mVendors.Add(0x115E, "Peer Protocols Inc"); - mVendors.Add(0x115F, "Maxtor Corporation"); - mVendors.Add(0x1160, "Megasoft Inc"); - mVendors.Add(0x1161, "PFU Ltd"); - mVendors.Add(0x1162, "OA Laboratory Co Ltd"); - mVendors.Add(0x1163, "Rendition Inc"); - mVendors.Add(0x1164, "Advanced Peripherals Tech"); - mVendors.Add(0x1165, "Imagraph Corporation"); - mVendors.Add(0x1166, "Broadcom / ServerWorks"); - mVendors.Add(0x1167, "Mutoh Industries Inc"); - mVendors.Add(0x1168, "Thine Electronics Inc"); - mVendors.Add(0x1169, "Centre f/Dev. of Adv. Computing"); - mVendors.Add(0x116A, "Polaris Communications"); - mVendors.Add(0x116B, "Connectware Inc"); - mVendors.Add(0x116C, "Intelligent Resources"); - mVendors.Add(0x116E, "Electronics for Imaging"); - mVendors.Add(0x1170, "Inventec Corporation"); - mVendors.Add(0x1172, "Altera Corporation"); - mVendors.Add(0x1173, "Adobe Systems"); - mVendors.Add(0x1174, "Bridgeport Machines"); - mVendors.Add(0x1175, "Mitron Computer Inc."); - mVendors.Add(0x1176, "SBE"); - mVendors.Add(0x1177, "Silicon Engineering"); - mVendors.Add(0x1178, "Alfa Inc"); - mVendors.Add(0x1179, "Toshiba America Info Systems"); - mVendors.Add(0x117A, "A-Trend Technology"); - mVendors.Add(0x117B, "LG (Lucky Goldstar) Electronics Inc."); - mVendors.Add(0x117C, "Atto Technology"); - mVendors.Add(0x117D, "Becton & Dickinson"); - mVendors.Add(0x117E, "T/R Systems"); - mVendors.Add(0x117F, "Integrated Circuit Systems"); - mVendors.Add(0x1180, "Ricoh Company, Ltd."); - mVendors.Add(0x1183, "Fujikura Ltd"); - mVendors.Add(0x1184, "Forks Inc"); - mVendors.Add(0x1185, "Dataworld"); - mVendors.Add(0x1186, "D-Link System Inc"); - mVendors.Add(0x1187, "Advanced Technology Laboratories"); - mVendors.Add(0x1188, "Shima Seiki Manufacturing Ltd."); - mVendors.Add(0x1189, "Matsushita Electronics"); - mVendors.Add(0x118A, "Hilevel Technology"); - mVendors.Add(0x118B, "Hypertec Pty Ltd"); - mVendors.Add(0x118C, "Corollary Inc"); - mVendors.Add(0x118D, "BitFlow Inc"); - mVendors.Add(0x118E, "Hermstedt AG"); - mVendors.Add(0x118F, "Green Logic"); - mVendors.Add(0x1190, "Tripace"); - mVendors.Add(0x1191, "Acard Technology Corp."); - mVendors.Add(0x1192, "Densan Co. Ltd"); - mVendors.Add(0x1194, "Toucan Technology"); - mVendors.Add(0x1195, "Ratoc System Inc"); - mVendors.Add(0x1196, "Hytec Electronics Ltd"); - mVendors.Add(0x1197, "Gage Applied Technologies"); - mVendors.Add(0x1198, "Lambda Systems Inc"); - mVendors.Add(0x1199, "Attachmate Corp."); - mVendors.Add(0x119A, "Mind/Share Inc."); - mVendors.Add(0x119B, "Omega Micro Inc."); - mVendors.Add(0x119C, "Information Technology Inst."); - mVendors.Add(0x119D, "Bug Sapporo Japan"); - mVendors.Add(0x119E, "Fujitsu Microelectronics Ltd."); - mVendors.Add(0x119F, "Bull Hn Information Systems"); - mVendors.Add(0x11A1, "Hamamatsu Photonics K.K."); - mVendors.Add(0x11A2, "Sierra Research and Technology"); - mVendors.Add(0x11A3, "Deuretzbacher GmbH & Co. Eng. KG"); - mVendors.Add(0x11A4, "Barco"); - mVendors.Add(0x11A5, "MicroUnity Systems Engineering Inc."); - mVendors.Add(0x11A6, "Pure Data"); - mVendors.Add(0x11A7, "Power Computing Corp."); - mVendors.Add(0x11A8, "Systech Corp."); - mVendors.Add(0x11A9, "InnoSys Inc."); - mVendors.Add(0x11AA, "Actel"); - mVendors.Add(0x11AB, "Marvell Semiconductor"); - mVendors.Add(0x11AC, "Canon Information Systems"); - mVendors.Add(0x11AD, "Lite-On Technology Corp."); - mVendors.Add(0x11AE, "Scitex Corporation Ltd"); - mVendors.Add(0x11AF, "Avid Technology Inc."); - mVendors.Add(0x11B0, "Quicklogic Corp"); - mVendors.Add(0x11B1, "Apricot Computers"); - mVendors.Add(0x11B2, "Eastman Kodak"); - mVendors.Add(0x11B3, "Barr Systems Inc."); - mVendors.Add(0x11B4, "Leitch Technology International"); - mVendors.Add(0x11B5, "Radstone Technology Ltd."); - mVendors.Add(0x11B6, "United Video Corp"); - mVendors.Add(0x11B7, "Motorola"); - mVendors.Add(0x11B8, "Xpoint Technologies Inc"); - mVendors.Add(0x11B9, "Pathlight Technology Inc."); - mVendors.Add(0x11BA, "Videotron Corp"); - mVendors.Add(0x11BB, "Pyramid Technology"); - mVendors.Add(0x11BC, "Network Peripherals Inc"); - mVendors.Add(0x11BD, "Pinnacle Systems Inc."); - mVendors.Add(0x11BE, "International Microcircuits Inc"); - mVendors.Add(0x11BF, "Astrodesign Inc."); - mVendors.Add(0x11C1, "Agere Systems"); - mVendors.Add(0x11C2, "Sand Microelectronics"); - mVendors.Add(0x11C4, "Document Technologies Ind."); - mVendors.Add(0x11C5, "Shiva Corporatin"); - mVendors.Add(0x11C6, "Dainippon Screen Mfg. Co"); - mVendors.Add(0x11C7, "D.C.M. Data Systems"); - mVendors.Add(0x11C8, "Dolphin Interconnect Solutions"); - mVendors.Add(0x11C9, "MAGMA"); - mVendors.Add(0x11CA, "LSI Systems Inc"); - mVendors.Add(0x11CB, "Specialix International Ltd."); - mVendors.Add(0x11CC, "Michels & Kleberhoff Computer GmbH"); - mVendors.Add(0x11CD, "HAL Computer Systems Inc."); - mVendors.Add(0x11CE, "Primary Rate Inc"); - mVendors.Add(0x11CF, "Pioneer Electronic Corporation"); - mVendors.Add(0x11D0, "BAE SYSTEMS - Manassas"); - mVendors.Add(0x11D1, "AuraVision Corporation"); - mVendors.Add(0x11D2, "Intercom Inc."); - mVendors.Add(0x11D3, "Trancell Systems Inc"); - mVendors.Add(0x11D4, "Analog Devices, Inc."); - mVendors.Add(0x11D5, "Tahoma Technology"); - mVendors.Add(0x11D6, "Tekelec Technologies"); - mVendors.Add(0x11D7, "TRENTON Technology, Inc."); - mVendors.Add(0x11D8, "Image Technologies Development"); - mVendors.Add(0x11D9, "Tec Corporation"); - mVendors.Add(0x11DA, "Novell"); - mVendors.Add(0x11DB, "Sega Enterprises Ltd"); - mVendors.Add(0x11DC, "Questra Corp"); - mVendors.Add(0x11DD, "Crosfield Electronics Ltd"); - mVendors.Add(0x11DE, "Zoran Corporation"); - mVendors.Add(0x11E1, "Gec Plessey Semi Inc"); - mVendors.Add(0x11E2, "Samsung Information Systems America"); - mVendors.Add(0x11E3, "Quicklogic Corp"); - mVendors.Add(0x11E4, "Second Wave Inc"); - mVendors.Add(0x11E5, "IIX Consulting"); - mVendors.Add(0x11E6, "Mitsui-Zosen System Research"); - mVendors.Add(0x11E8, "Digital Processing Systems Inc"); - mVendors.Add(0x11E9, "Highwater Designs Ltd"); - mVendors.Add(0x11EA, "Elsag Bailey"); - mVendors.Add(0x11EB, "Formation, Inc"); - mVendors.Add(0x11EC, "Coreco Inc"); - mVendors.Add(0x11ED, "Mediamatics"); - mVendors.Add(0x11EE, "Dome Imaging Systems Inc"); - mVendors.Add(0x11EF, "Nicolet Technologies BV"); - mVendors.Add(0x11F0, "Compu-Shack GmbH"); - mVendors.Add(0x11F2, "Picture Tel Japan KK"); - mVendors.Add(0x11F3, "Keithley Metrabyte"); - mVendors.Add(0x11F4, "Kinetic Systems Corporation"); - mVendors.Add(0x11F5, "Computing Devices Intl"); - mVendors.Add(0x11F6, "Powermatic Data Systems Ltd"); - mVendors.Add(0x11F7, "Scientific Atlanta"); - mVendors.Add(0x11F8, "PMC-Sierra Inc."); - mVendors.Add(0x11F9, "I-Cube Inc"); - mVendors.Add(0x11FA, "Kasan Electronics Co Ltd"); - mVendors.Add(0x11FB, "Datel Inc"); - mVendors.Add(0x11FD, "High Street Consultants"); - mVendors.Add(0x11FE, "Comtrol Corp"); - mVendors.Add(0x11FF, "Scion Corp"); - mVendors.Add(0x1200, "CSS Corp"); - mVendors.Add(0x1201, "Vista Controls Corp"); - mVendors.Add(0x1202, "Network General Corp"); - mVendors.Add(0x1203, "Bayer Corporation Agfa Div"); - mVendors.Add(0x1204, "Lattice Semiconductor Corp"); - mVendors.Add(0x1205, "Array Corp"); - mVendors.Add(0x1206, "Amdahl Corp"); - mVendors.Add(0x1208, "Parsytec GmbH"); - mVendors.Add(0x1209, "Sci Systems Inc"); - mVendors.Add(0x120A, "Synaptel"); - mVendors.Add(0x120B, "Adaptive Solutions"); - mVendors.Add(0x120D, "Compression Labs Inc."); - mVendors.Add(0x120E, "Cyclades Corporation"); - mVendors.Add(0x120F, "Essential Communications"); - mVendors.Add(0x1210, "Hyperparallel Technologies"); - mVendors.Add(0x1211, "Braintech Inc"); - mVendors.Add(0x1213, "Applied Intelligent Systems Inc"); - mVendors.Add(0x1214, "Performance Technologies Inc"); - mVendors.Add(0x1215, "Interware Co Ltd"); - mVendors.Add(0x1216, "Purup-Eskofot A/S"); - mVendors.Add(0x1217, "O2Micro Inc"); - mVendors.Add(0x1218, "Hybricon Corp"); - mVendors.Add(0x1219, "First Virtual Corp"); - mVendors.Add(0x121A, "3dfx Interactive Inc"); - mVendors.Add(0x121B, "Advanced Telecommunications Modules"); - mVendors.Add(0x121C, "Nippon Texa Co Ltd"); - mVendors.Add(0x121D, "Lippert Automationstechnik GmbH"); - mVendors.Add(0x121E, "CSPI"); - mVendors.Add(0x121F, "Arcus Technology Inc"); - mVendors.Add(0x1220, "Ariel Corporation"); - mVendors.Add(0x1221, "Contec Microelectronics Europe BV"); - mVendors.Add(0x1222, "Ancor Communications Inc"); - mVendors.Add(0x1223, "Emerson Network Power, Embedded Computing"); - mVendors.Add(0x1224, "Interactive Images"); - mVendors.Add(0x1225, "Power I/O Inc."); - mVendors.Add(0x1227, "Tech-Source"); - mVendors.Add(0x1228, "Norsk Elektro Optikk A/S"); - mVendors.Add(0x1229, "Data Kinesis Inc."); - mVendors.Add(0x122A, "Integrated Telecom"); - mVendors.Add(0x122B, "LG Industrial Systems Co. Ltd."); - mVendors.Add(0x122C, "sci-worx GmbH"); - mVendors.Add(0x122D, "Aztech System Ltd"); - mVendors.Add(0x122E, "Xyratex"); - mVendors.Add(0x122F, "Andrew Corp."); - mVendors.Add(0x1230, "Fishcamp Engineering"); - mVendors.Add(0x1231, "Woodward McCoach Inc."); - mVendors.Add(0x1233, "Bus-Tech Inc."); - mVendors.Add(0x1234, "Technical Corp"); - mVendors.Add(0x1236, "Sigma Designs, Inc"); - mVendors.Add(0x1237, "Alta Technology Corp."); - mVendors.Add(0x1238, "Adtran"); - mVendors.Add(0x1239, "The 3DO Company"); - mVendors.Add(0x123A, "Visicom Laboratories Inc."); - mVendors.Add(0x123B, "Seeq Technology Inc."); - mVendors.Add(0x123C, "Century Systems Inc."); - mVendors.Add(0x123D, "Engineering Design Team Inc."); - mVendors.Add(0x123F, "C-Cube Microsystems"); - mVendors.Add(0x1240, "Marathon Technologies Corp."); - mVendors.Add(0x1241, "DSC Communications"); - mVendors.Add(0x1242, "JNI Corporation"); - mVendors.Add(0x1243, "Delphax"); - mVendors.Add(0x1244, "AVM AUDIOVISUELLES MKTG & Computer GmbH"); - mVendors.Add(0x1245, "APD S.A."); - mVendors.Add(0x1246, "Dipix Technologies Inc"); - mVendors.Add(0x1247, "Xylon Research Inc."); - mVendors.Add(0x1248, "Central Data Corp."); - mVendors.Add(0x1249, "Samsung Electronics Co. Ltd."); - mVendors.Add(0x124A, "AEG Electrocom GmbH"); - mVendors.Add(0x124C, "Solitron Technologies Inc."); - mVendors.Add(0x124D, "Stallion Technologies"); - mVendors.Add(0x124E, "Cylink"); - mVendors.Add(0x124F, "Infortrend Technology Inc"); - mVendors.Add(0x1250, "Hitachi Microcomputer System Ltd."); - mVendors.Add(0x1251, "VLSI Solution OY"); - mVendors.Add(0x1253, "Guzik Technical Enterprises"); - mVendors.Add(0x1254, "Linear Systems Ltd."); - mVendors.Add(0x1255, "Optibase Ltd."); - mVendors.Add(0x1256, "Perceptive Solutions Inc."); - mVendors.Add(0x1257, "Vertex Networks Inc."); - mVendors.Add(0x1258, "Gilbarco Inc."); - mVendors.Add(0x1259, "Allied Telesyn International"); - mVendors.Add(0x125A, "ABB Power Systems"); - mVendors.Add(0x125B, "Asix Electronics Corp."); - mVendors.Add(0x125C, "Aurora Technologies Inc."); - mVendors.Add(0x125D, "ESS Technology"); - mVendors.Add(0x125E, "Specialvideo Engineering SRL"); - mVendors.Add(0x125F, "Concurrent Technologies Inc."); - mVendors.Add(0x1260, "Intersil Corporation"); - mVendors.Add(0x1261, "Matsushita-Kotobuki Electronics Indu"); - mVendors.Add(0x1262, "ES Computer Co. Ltd."); - mVendors.Add(0x1263, "Sonic Solutions"); - mVendors.Add(0x1264, "Aval Nagasaki Corp."); - mVendors.Add(0x1265, "Casio Computer Co. Ltd."); - mVendors.Add(0x1266, "Microdyne Corp."); - mVendors.Add(0x1267, "S.A. Telecommunications"); - mVendors.Add(0x1268, "Tektronix"); - mVendors.Add(0x1269, "Thomson-CSF/TTM"); - mVendors.Add(0x126A, "Lexmark International Inc."); - mVendors.Add(0x126B, "Adax Inc."); - mVendors.Add(0x126C, "Nortel Networks Corp."); - mVendors.Add(0x126D, "Splash Technology Inc."); - mVendors.Add(0x126E, "Sumitomo Metal Industries Ltd."); - mVendors.Add(0x126F, "Silicon Motion"); - mVendors.Add(0x1270, "Olympus Optical Co. Ltd."); - mVendors.Add(0x1271, "GW Instruments"); - mVendors.Add(0x1272, "Telematics International"); - mVendors.Add(0x1273, "Hughes Network Systems"); - mVendors.Add(0x1274, "Ensoniq"); - mVendors.Add(0x1275, "Network Appliance"); - mVendors.Add(0x1276, "Switched Network Technologies Inc."); - mVendors.Add(0x1277, "Comstream"); - mVendors.Add(0x1278, "Transtech Parallel Systems"); - mVendors.Add(0x1279, "Transmeta Corp."); - mVendors.Add(0x127B, "Pixera Corp"); - mVendors.Add(0x127C, "Crosspoint Solutions Inc."); - mVendors.Add(0x127D, "Vela Research LP"); - mVendors.Add(0x127E, "Winnov L.P."); - mVendors.Add(0x127F, "Fujifilm"); - mVendors.Add(0x1280, "Photoscript Group Ltd."); - mVendors.Add(0x1281, "Yokogawa Electronic Corp."); - mVendors.Add(0x1282, "Davicom Semiconductor Inc."); - mVendors.Add(0x1283, "chandresh.j.mehta"); - mVendors.Add(0x1285, "Platform Technologies Inc."); - mVendors.Add(0x1286, "MAZeT GmbH"); - mVendors.Add(0x1287, "LuxSonor Inc."); - mVendors.Add(0x1288, "Timestep Corp."); - mVendors.Add(0x1289, "AVC Technology Inc."); - mVendors.Add(0x128A, "Asante Technologies Inc."); - mVendors.Add(0x128B, "Transwitch Corp."); - mVendors.Add(0x128C, "Retix Corp."); - mVendors.Add(0x128D, "G2 Networks Inc."); - mVendors.Add(0x128F, "Tateno Dennou Inc."); - mVendors.Add(0x1290, "Sord Computer Corp."); - mVendors.Add(0x1291, "NCS Computer Italia"); - mVendors.Add(0x1292, "Tritech Microelectronics Intl PTE"); - mVendors.Add(0x1293, "Media Reality Technology"); - mVendors.Add(0x1294, "Rhetorex Inc."); - mVendors.Add(0x1295, "Imagenation Corp."); - mVendors.Add(0x1296, "Kofax Image Products"); - mVendors.Add(0x1297, "Shuttle Computer"); - mVendors.Add(0x1298, "Spellcaster Telecommunications Inc."); - mVendors.Add(0x1299, "Knowledge Technology Laboratories"); - mVendors.Add(0x129A, "VMETRO Inc."); - mVendors.Add(0x129B, "Image Access"); - mVendors.Add(0x129D, "CompCore Multimedia Inc."); - mVendors.Add(0x129E, "Victor Co. of Japan Ltd."); - mVendors.Add(0x129F, "OEC Medical Systems Inc."); - mVendors.Add(0x12A0, "Allen Bradley Co."); - mVendors.Add(0x12A1, "Simpact Inc"); - mVendors.Add(0x12A2, "NewGen Systems Corp."); - mVendors.Add(0x12A3, "Lucent Technologies AMR"); - mVendors.Add(0x12A4, "NTT Electronics Technology Co."); - mVendors.Add(0x12A5, "Vision Dynamics Ltd."); - mVendors.Add(0x12A6, "Scalable Networks Inc."); - mVendors.Add(0x12A7, "AMO GmbH"); - mVendors.Add(0x12A8, "News Datacom"); - mVendors.Add(0x12A9, "Xiotech Corp."); - mVendors.Add(0x12AA, "SDL Communications Inc."); - mVendors.Add(0x12AB, "Yuan Yuan Enterprise Co. Ltd."); - mVendors.Add(0x12AC, "MeasureX Corp."); - mVendors.Add(0x12AD, "Multidata GmbH"); - mVendors.Add(0x12AE, "Alteon Networks Inc."); - mVendors.Add(0x12AF, "TDK USA Corp."); - mVendors.Add(0x12B0, "Jorge Scientific Corp."); - mVendors.Add(0x12B1, "GammaLink"); - mVendors.Add(0x12B2, "General Signal Networks"); - mVendors.Add(0x12B3, "Inter-Face Co. Ltd."); - mVendors.Add(0x12B4, "Future Tel Inc."); - mVendors.Add(0x12B5, "Granite Systems Inc."); - mVendors.Add(0x12B7, "Acumen"); - mVendors.Add(0x12B8, "Korg"); - mVendors.Add(0x12B9, "3Com Corporation"); - mVendors.Add(0x12BA, "Bittware, Inc"); - mVendors.Add(0x12BB, "Nippon Unisoft Corp."); - mVendors.Add(0x12BC, "Array Microsystems"); - mVendors.Add(0x12BD, "Computerm Corp."); - mVendors.Add(0x12BF, "Fujifilm Microdevices"); - mVendors.Add(0x12C0, "Infimed"); - mVendors.Add(0x12C1, "GMM Research Corp."); - mVendors.Add(0x12C2, "Mentec Ltd."); - mVendors.Add(0x12C3, "Holtek Microelectronics Inc."); - mVendors.Add(0x12C4, "Connect Tech Inc."); - mVendors.Add(0x12C5, "Picture Elements Inc."); - mVendors.Add(0x12C6, "Mitani Corp."); - mVendors.Add(0x12C7, "Dialogic Corp."); - mVendors.Add(0x12C8, "G Force Co. Ltd."); - mVendors.Add(0x12C9, "Gigi Operations"); - mVendors.Add(0x12CA, "Integrated Computing Engines, Inc."); - mVendors.Add(0x12CB, "Antex Electronics Corp."); - mVendors.Add(0x12CC, "Pluto Technologies International"); - mVendors.Add(0x12CD, "Aims Lab"); - mVendors.Add(0x12CE, "Netspeed Inc."); - mVendors.Add(0x12CF, "Prophet Systems Inc."); - mVendors.Add(0x12D0, "GDE Systems Inc."); - mVendors.Add(0x12D1, "PsiTech"); - mVendors.Add(0x12D3, "Vingmed Sound A/S"); - mVendors.Add(0x12D4, "Ulticom, Inc."); - mVendors.Add(0x12D5, "Equator Technologies"); - mVendors.Add(0x12D6, "Analogic Corp."); - mVendors.Add(0x12D7, "Biotronic SRL"); - mVendors.Add(0x12D8, "Pericom Semiconductor"); - mVendors.Add(0x12D9, "Aculab Plc."); - mVendors.Add(0x12DA, "TrueTime"); - mVendors.Add(0x12DB, "Annapolis Micro Systems Inc."); - mVendors.Add(0x12DC, "Symicron Computer Communication Ltd."); - mVendors.Add(0x12DD, "Management Graphics Inc."); - mVendors.Add(0x12DE, "Rainbow Technologies"); - mVendors.Add(0x12DF, "SBS Technologies Inc."); - mVendors.Add(0x12E0, "Chase Research PLC"); - mVendors.Add(0x12E1, "Nintendo Co. Ltd."); - mVendors.Add(0x12E2, "Datum Inc. Bancomm-Timing Division"); - mVendors.Add(0x12E3, "Imation Corp. - Medical Imaging Syst"); - mVendors.Add(0x12E4, "Brooktrout Technology Inc."); - mVendors.Add(0x12E6, "Cirel Systems"); - mVendors.Add(0x12E7, "Sebring Systems Inc"); - mVendors.Add(0x12E8, "CRISC Corp."); - mVendors.Add(0x12E9, "GE Spacenet"); - mVendors.Add(0x12EB, "Aureal Semiconductor"); - mVendors.Add(0x12EC, "3A International Inc."); - mVendors.Add(0x12ED, "Optivision Inc."); - mVendors.Add(0x12EE, "Orange Micro, Inc."); - mVendors.Add(0x12EF, "Vienna Systems"); - mVendors.Add(0x12F0, "Pentek"); - mVendors.Add(0x12F1, "Sorenson Vision Inc."); - mVendors.Add(0x12F2, "Gammagraphx Inc."); - mVendors.Add(0x12F4, "Megatel"); - mVendors.Add(0x12F5, "Forks"); - mVendors.Add(0x12F7, "Cognex"); - mVendors.Add(0x12F8, "Electronic-Design GmbH"); - mVendors.Add(0x12F9, "FourFold Technologies"); - mVendors.Add(0x12FB, "Spectrum Signal Processing"); - mVendors.Add(0x12FC, "Capital Equipment Corp"); - mVendors.Add(0x12FE, "esd Electronic System Design GmbH"); - mVendors.Add(0x1303, "Innovative Integration"); - mVendors.Add(0x1304, "Juniper Networks Inc."); - mVendors.Add(0x1307, "ComputerBoards"); - mVendors.Add(0x1308, "Jato Technologies Inc."); - mVendors.Add(0x130A, "Mitsubishi Electric Microcomputer"); - mVendors.Add(0x130B, "Colorgraphic Communications Corp"); - mVendors.Add(0x130F, "Advanet Inc."); - mVendors.Add(0x1310, "Gespac"); - mVendors.Add(0x1312, "Robotic Vision Systems Incorporated"); - mVendors.Add(0x1313, "Yaskawa Electric Co."); - mVendors.Add(0x1316, "Teradyne Inc."); - mVendors.Add(0x1317, "ADMtek Inc"); - mVendors.Add(0x1318, "Packet Engines, Inc."); - mVendors.Add(0x1319, "Forte Media"); - mVendors.Add(0x131F, "SIIG"); - mVendors.Add(0x1325, "Salix Technologies Inc"); - mVendors.Add(0x1326, "Seachange International"); - mVendors.Add(0x1328, "CIFELLI SYSTEMS CORPORATION"); - mVendors.Add(0x1331, "RadiSys Corporation"); - mVendors.Add(0x1332, "VMetro"); - mVendors.Add(0x1335, "Videomail Inc."); - mVendors.Add(0x133D, "Prisa Networks"); - mVendors.Add(0x133F, "SCM Microsystems"); - mVendors.Add(0x1342, "Promax Systems Inc"); - mVendors.Add(0x1344, "Micron Technology, Inc."); - mVendors.Add(0x1347, "Spectracom Corporation"); - mVendors.Add(0x134A, "DTC Technology Corp."); - mVendors.Add(0x134B, "ARK Research Corp."); - mVendors.Add(0x134C, "Chori Joho System Co. Ltd"); - mVendors.Add(0x134D, "PCTEL Inc."); - mVendors.Add(0x135A, "Brain Boxes Limited"); - mVendors.Add(0x135B, "Giganet Inc."); - mVendors.Add(0x135C, "Quatech Inc"); - mVendors.Add(0x135D, "ABB Network Partner AB"); - mVendors.Add(0x135E, "Sealevel Systems Inc."); - mVendors.Add(0x135F, "I-Data International A-S"); - mVendors.Add(0x1360, "Meinberg Funkuhren GmbH & Co. KG"); - mVendors.Add(0x1361, "Soliton Systems K.K."); - mVendors.Add(0x1363, "Phoenix Technologies Ltd"); - mVendors.Add(0x1365, "Hypercope Corp."); - mVendors.Add(0x1366, "Teijin Seiki Co. Ltd."); - mVendors.Add(0x1367, "Hitachi Zosen Corporation"); - mVendors.Add(0x1368, "Skyware Corporation"); - mVendors.Add(0x1369, "Digigram"); - mVendors.Add(0x136B, "Kawasaki Steel Corporation"); - mVendors.Add(0x136C, "Adtek System Science Co Ltd"); - mVendors.Add(0x1375, "Boeing - Sunnyvale"); - mVendors.Add(0x137A, "Mark Of The Unicorn Inc"); - mVendors.Add(0x137B, "PPT Vision"); - mVendors.Add(0x137C, "Iwatsu Electric Co Ltd"); - mVendors.Add(0x137D, "Dynachip Corporation"); - mVendors.Add(0x137E, "Patriot Scientific Corp."); - mVendors.Add(0x1380, "Sanritz Automation Co LTC"); - mVendors.Add(0x1381, "Brains Co. Ltd"); - mVendors.Add(0x1382, "Marian - Electronic & Software"); - mVendors.Add(0x1384, "Stellar Semiconductor Inc"); - mVendors.Add(0x1385, "Netgear"); - mVendors.Add(0x1387, "Curtiss-Wright Controls Embedded Computing"); - mVendors.Add(0x1388, "Hitachi Information Technology Co Ltd"); - mVendors.Add(0x1389, "Applicom International"); - mVendors.Add(0x138B, "Tokimec Inc"); - mVendors.Add(0x138E, "Basler GMBH"); - mVendors.Add(0x138F, "Patapsco Designs Inc"); - mVendors.Add(0x1390, "Concept Development Inc."); - mVendors.Add(0x1393, "Moxa Technologies Co Ltd"); - mVendors.Add(0x1394, "Level One Communications"); - mVendors.Add(0x1395, "Ambicom Inc"); - mVendors.Add(0x1396, "Cipher Systems Inc"); - mVendors.Add(0x1397, "Cologne Chip Designs GmbH"); - mVendors.Add(0x1398, "Clarion Co. Ltd"); - mVendors.Add(0x139A, "Alacritech Inc"); - mVendors.Add(0x139D, "Xstreams PLC/ EPL Limited"); - mVendors.Add(0x139E, "Echostar Data Networks"); - mVendors.Add(0x13A0, "Crystal Group Inc"); - mVendors.Add(0x13A1, "Kawasaki Heavy Industries Ltd"); - mVendors.Add(0x13A3, "HI-FN Inc."); - mVendors.Add(0x13A4, "Rascom Inc"); - mVendors.Add(0x13A7, "amc330"); - mVendors.Add(0x13A8, "Exar Corp."); - mVendors.Add(0x13A9, "Siemens Medical Solutions"); - mVendors.Add(0x13AA, "Nortel Networks - BWA Division"); - mVendors.Add(0x13AF, "T.Sqware"); - mVendors.Add(0x13B1, "Tamura Corporation"); - mVendors.Add(0x13B4, "Wellbean Co Inc"); - mVendors.Add(0x13B5, "ARM Ltd"); - mVendors.Add(0x13B6, "DLoG GMBH"); - mVendors.Add(0x13B8, "Nokia Telecommunications OY"); - mVendors.Add(0x13BD, "Sharp Corporation"); - mVendors.Add(0x13BF, "Sharewave Inc"); - mVendors.Add(0x13C0, "Microgate Corp."); - mVendors.Add(0x13C1, "3ware Inc."); - mVendors.Add(0x13C2, "Technotrend Systemtechnik GMBH"); - mVendors.Add(0x13C3, "Janz Computer AG"); - mVendors.Add(0x13C7, "Blue Chip Technology Ltd"); - mVendors.Add(0x13CC, "Metheus Corporation"); - mVendors.Add(0x13CF, "Studio Audio & Video Ltd"); - mVendors.Add(0x13D0, "B2C2 Inc"); - mVendors.Add(0x13D1, "AboCom Systems, Inc"); - mVendors.Add(0x13D4, "Graphics Microsystems Inc"); - mVendors.Add(0x13D6, "K.I. Technology Co Ltd"); - mVendors.Add(0x13D7, "Toshiba Engineering Corporation"); - mVendors.Add(0x13D8, "Phobos Corporation"); - mVendors.Add(0x13D9, "Apex Inc"); - mVendors.Add(0x13DC, "Netboost Corporation"); - mVendors.Add(0x13DE, "ABB Robotics Products AB"); - mVendors.Add(0x13DF, "E-Tech Inc."); - mVendors.Add(0x13E0, "GVC Corporation"); - mVendors.Add(0x13E3, "Nest Inc"); - mVendors.Add(0x13E4, "Calculex Inc"); - mVendors.Add(0x13E5, "Telesoft Design Ltd"); - mVendors.Add(0x13E9, "Intraserver Technology Inc"); - mVendors.Add(0x13EA, "Dallas Semiconductor"); - mVendors.Add(0x13F0, "IC Plus Corporation"); - mVendors.Add(0x13F1, "OCE - Industries S.A."); - mVendors.Add(0x13F4, "Troika Networks Inc"); - mVendors.Add(0x13F6, "C-Media Electronics Inc."); - mVendors.Add(0x13F9, "NTT Advanced Technology Corp."); - mVendors.Add(0x13FA, "Pentland Systems Ltd."); - mVendors.Add(0x13FB, "Aydin Corp"); - mVendors.Add(0x13FD, "Micro Science Inc"); - mVendors.Add(0x13FE, "Advantech Co., Ltd."); - mVendors.Add(0x13FF, "Silicon Spice Inc."); - mVendors.Add(0x1400, "ArtX Inc"); - mVendors.Add(0x1402, "Meilhaus Electronic GmbH Germany"); - mVendors.Add(0x1404, "Fundamental Software Inc"); - mVendors.Add(0x1406, "Oce Print Logics Technologies S.A."); - mVendors.Add(0x1407, "Lava Computer MFG Inc."); - mVendors.Add(0x1408, "Aloka Co. Ltd"); - mVendors.Add(0x1409, "SUNIX Co., Ltd."); - mVendors.Add(0x140A, "DSP Research Inc"); - mVendors.Add(0x140B, "Ramix Inc"); - mVendors.Add(0x140D, "Matsushita Electric Works Ltd"); - mVendors.Add(0x140F, "Salient Systems Corp"); - mVendors.Add(0x1412, "IC Ensemble, Inc."); - mVendors.Add(0x1413, "Addonics"); - mVendors.Add(0x1415, "Oxford Semiconductor Ltd"); - mVendors.Add(0x1418, "Kyushu Electronics Systems Inc"); - mVendors.Add(0x1419, "Excel Switching Corp"); - mVendors.Add(0x141B, "Zoom Telephonics Inc"); - mVendors.Add(0x141E, "Fanuc Co. Ltd"); - mVendors.Add(0x141F, "Visiontech Ltd"); - mVendors.Add(0x1420, "Psion Dacom PLC"); - mVendors.Add(0x1425, "ASIC Designers Inc"); - mVendors.Add(0x1428, "Edec Co Ltd"); - mVendors.Add(0x1429, "Unex Technology Corp."); - mVendors.Add(0x142A, "Kingmax Technology Inc"); - mVendors.Add(0x142B, "Radiolan"); - mVendors.Add(0x142C, "Minton Optic Industry Co Ltd"); - mVendors.Add(0x142D, "Pixstream Inc"); - mVendors.Add(0x1430, "ITT Aerospace/Communications Division"); - mVendors.Add(0x1433, "Eltec Elektronik AG"); - mVendors.Add(0x1435, "RTD Embedded Technologies, Inc."); - mVendors.Add(0x1436, "CIS Technology Inc"); - mVendors.Add(0x1437, "Nissin Inc Co"); - mVendors.Add(0x1438, "Atmel-Dream"); - mVendors.Add(0x143F, "Lightwell Co Ltd - Zax Division"); - mVendors.Add(0x1441, "Agie SA."); - mVendors.Add(0x1443, "Unibrain S.A."); - mVendors.Add(0x1445, "Logical Co Ltd"); - mVendors.Add(0x1446, "Graphin Co. Ltd"); - mVendors.Add(0x1447, "Aim GMBH"); - mVendors.Add(0x1448, "Alesis Studio"); - mVendors.Add(0x144A, "ADLINK Technology Inc"); - mVendors.Add(0x144B, "Loronix Information Systems, Inc."); - mVendors.Add(0x144D, "sanyo"); - mVendors.Add(0x1450, "Octave Communications Ind."); - mVendors.Add(0x1451, "SP3D Chip Design GMBH"); - mVendors.Add(0x1453, "Mycom Inc"); - mVendors.Add(0x1458, "Giga-Byte Technologies"); - mVendors.Add(0x145C, "Cryptek"); - mVendors.Add(0x145F, "Baldor Electric Company"); - mVendors.Add(0x1460, "Dynarc Inc"); - mVendors.Add(0x1462, "Micro-Star International Co Ltd"); - mVendors.Add(0x1463, "Fast Corporation"); - mVendors.Add(0x1464, "Interactive Circuits & Systems Ltd"); - mVendors.Add(0x1468, "Ambit Microsystems Corp."); - mVendors.Add(0x1469, "Cleveland Motion Controls"); - mVendors.Add(0x146C, "Ruby Tech Corp."); - mVendors.Add(0x146D, "Tachyon Inc."); - mVendors.Add(0x146E, "WMS Gaming"); - mVendors.Add(0x1471, "Integrated Telecom Express Inc"); - mVendors.Add(0x1473, "Zapex Technologies Inc"); - mVendors.Add(0x1474, "Doug Carson & Associates"); - mVendors.Add(0x1477, "Net Insight"); - mVendors.Add(0x1478, "Diatrend Corporation"); - mVendors.Add(0x147B, "Abit Computer Corp."); - mVendors.Add(0x147F, "Nihon Unisys Ltd."); - mVendors.Add(0x1482, "Isytec - Integrierte Systemtechnik Gmbh"); - mVendors.Add(0x1483, "Labway Coporation"); - mVendors.Add(0x1485, "Erma - Electronic GMBH"); - mVendors.Add(0x1489, "KYE Systems Corporation"); - mVendors.Add(0x148A, "Opto 22"); - mVendors.Add(0x148B, "Innomedialogic Inc."); - mVendors.Add(0x148C, "C.P. Technology Co. Ltd"); - mVendors.Add(0x148D, "Digicom Systems Inc."); - mVendors.Add(0x148E, "OSI Plus Corporation"); - mVendors.Add(0x148F, "Plant Equipment Inc."); - mVendors.Add(0x1490, "TC Labs Pty Ltd."); - mVendors.Add(0x1493, "Maker Communications"); - mVendors.Add(0x1495, "Tokai Communications Industry Co. Ltd"); - mVendors.Add(0x1496, "Joytech Computer Co. Ltd."); - mVendors.Add(0x1497, "SMA Technologie AG"); - mVendors.Add(0x1498, "Tews Technologies"); - mVendors.Add(0x1499, "Micro-Technology Co Ltd"); - mVendors.Add(0x149A, "Andor Technology Ltd"); - mVendors.Add(0x149B, "Seiko Instruments Inc"); - mVendors.Add(0x149E, "Mapletree Networks Inc."); - mVendors.Add(0x149F, "Lectron Co Ltd"); - mVendors.Add(0x14A0, "Softing GMBH"); - mVendors.Add(0x14A2, "Millennium Engineering Inc"); - mVendors.Add(0x14A4, "GVC/BCM Advanced Research"); - mVendors.Add(0x14A9, "Hivertec Inc."); - mVendors.Add(0x14AB, "Mentor Graphics Corp."); - mVendors.Add(0x14B1, "Nextcom K.K."); - mVendors.Add(0x14B3, "Xpeed Inc."); - mVendors.Add(0x14B4, "Philips Business Electronics B.V."); - mVendors.Add(0x14B5, "Creamware GmbH"); - mVendors.Add(0x14B6, "Quantum Data Corp."); - mVendors.Add(0x14B7, "Proxim Inc."); - mVendors.Add(0x14B9, "Aironet Wireless Communication"); - mVendors.Add(0x14BA, "Internix Inc."); - mVendors.Add(0x14BB, "Semtech Corporation"); - mVendors.Add(0x14BE, "L3 Communications"); - mVendors.Add(0x14C0, "Compal Electronics, Inc."); - mVendors.Add(0x14C1, "Myricom Inc."); - mVendors.Add(0x14C2, "DTK Computer"); - mVendors.Add(0x14C4, "Iwasaki Information Systems Co Ltd"); - mVendors.Add(0x14C5, "ABB Automation Products AB"); - mVendors.Add(0x14C6, "Data Race Inc"); - mVendors.Add(0x14C7, "Modular Technology Ltd."); - mVendors.Add(0x14C8, "Turbocomm Tech Inc"); - mVendors.Add(0x14C9, "Odin Telesystems Inc"); - mVendors.Add(0x14CB, "Billionton Systems Inc./Cadmus Micro Inc"); - mVendors.Add(0x14CD, "Universal Scientific Ind."); - mVendors.Add(0x14CF, "TEK Microsystems Inc."); - mVendors.Add(0x14D4, "Panacom Technology Corporation"); - mVendors.Add(0x14D5, "Nitsuko Corporation"); - mVendors.Add(0x14D6, "Accusys Inc"); - mVendors.Add(0x14D7, "Hirakawa Hewtech Corp"); - mVendors.Add(0x14D8, "Hopf Elektronik GMBH"); - mVendors.Add(0x14D9, "Alpha Processor Inc"); - mVendors.Add(0x14DB, "Avlab Technology Inc."); - mVendors.Add(0x14DC, "Amplicon Liveline Limited"); - mVendors.Add(0x14DD, "Imodl Inc."); - mVendors.Add(0x14DE, "Applied Integration Corporation"); - mVendors.Add(0x14E3, "Amtelco"); - mVendors.Add(0x14E4, "Broadcom Corporation"); - mVendors.Add(0x14EA, "Planex Communications, Inc."); - mVendors.Add(0x14EB, "Seiko Epson Corporation"); - mVendors.Add(0x14EC, "Acqiris"); - mVendors.Add(0x14ED, "Datakinetics Ltd"); - mVendors.Add(0x14EF, "Carry Computer Eng. Co Ltd"); - mVendors.Add(0x14F1, "Conexant Systems, Inc."); - mVendors.Add(0x14F2, "Mobility Electronics, Inc."); - mVendors.Add(0x14F4, "Tokyo Electronic Industry Co. Ltd."); - mVendors.Add(0x14F5, "Sopac Ltd"); - mVendors.Add(0x14F6, "Coyote Technologies LLC"); - mVendors.Add(0x14F7, "Wolf Technology Inc"); - mVendors.Add(0x14F8, "Audiocodes Inc"); - mVendors.Add(0x14F9, "AG Communications"); - mVendors.Add(0x14FB, "Transas Marine (UK) Ltd"); - mVendors.Add(0x14FC, "Quadrics Ltd"); - mVendors.Add(0x14FD, "Silex Technology Inc."); - mVendors.Add(0x14FE, "Archtek Telecom Corp."); - mVendors.Add(0x14FF, "Twinhead International Corp."); - mVendors.Add(0x1501, "Banksoft Canada Ltd"); - mVendors.Add(0x1502, "Mitsubishi Electric Logistics Support Co"); - mVendors.Add(0x1503, "Kawasaki LSI USA Inc"); - mVendors.Add(0x1504, "Kaiser Electronics"); - mVendors.Add(0x1506, "Chameleon Systems Inc"); - mVendors.Add(0x1507, "Htec Ltd."); - mVendors.Add(0x1509, "First International Computer Inc"); - mVendors.Add(0x150B, "Yamashita Systems Corp"); - mVendors.Add(0x150C, "Kyopal Co Ltd"); - mVendors.Add(0x150D, "Warpspped Inc"); - mVendors.Add(0x150E, "C-Port Corporation"); - mVendors.Add(0x150F, "Intec GMBH"); - mVendors.Add(0x1510, "Behavior Tech Computer Corp"); - mVendors.Add(0x1511, "Centillium Technology Corp"); - mVendors.Add(0x1512, "Rosun Technologies Inc"); - mVendors.Add(0x1513, "Raychem"); - mVendors.Add(0x1514, "TFL LAN Inc"); - mVendors.Add(0x1515, "ICS Advent"); - mVendors.Add(0x1516, "Myson Technology Inc"); - mVendors.Add(0x1517, "Echotek Corporation"); - mVendors.Add(0x1518, "Kontron Modular Computers GmbH (PEP Modular Computers GMBH)"); - mVendors.Add(0x1519, "Telefon Aktiebolaget LM Ericsson"); - mVendors.Add(0x151A, "Globetek Inc."); - mVendors.Add(0x151B, "Combox Ltd"); - mVendors.Add(0x151C, "Digital Audio Labs Inc"); - mVendors.Add(0x151D, "Fujitsu Computer Products Of America"); - mVendors.Add(0x151E, "Matrix Corp."); - mVendors.Add(0x151F, "Topic Semiconductor Corp"); - mVendors.Add(0x1520, "Chaplet System Inc"); - mVendors.Add(0x1521, "Bell Corporation"); - mVendors.Add(0x1522, "Mainpine Limited"); - mVendors.Add(0x1523, "Music Semiconductors"); - mVendors.Add(0x1524, "ENE Technology Inc"); - mVendors.Add(0x1525, "Impact Technologies"); - mVendors.Add(0x1526, "ISS Inc"); - mVendors.Add(0x1527, "Solectron"); - mVendors.Add(0x1528, "Acksys"); - mVendors.Add(0x1529, "American Microsystems Inc"); - mVendors.Add(0x152A, "Quickturn Design Systems"); - mVendors.Add(0x152B, "Flytech Technology Co Ltd"); - mVendors.Add(0x152C, "Macraigor Systems LLC"); - mVendors.Add(0x152D, "Quanta Computer Inc"); - mVendors.Add(0x152E, "Melec Inc"); - mVendors.Add(0x152F, "Philips - Crypto"); - mVendors.Add(0x1532, "Echelon Corporation"); - mVendors.Add(0x1533, "Baltimore"); - mVendors.Add(0x1534, "Road Corporation"); - mVendors.Add(0x1535, "Evergreen Technologies Inc"); - mVendors.Add(0x1537, "Datalex Communcations"); - mVendors.Add(0x1538, "Aralion Inc."); - mVendors.Add(0x1539, "Atelier Informatiques et Electronique Et"); - mVendors.Add(0x153A, "ONO Sokki"); - mVendors.Add(0x153B, "Terratec Electronic GMBH"); - mVendors.Add(0x153C, "Antal Electronic"); - mVendors.Add(0x153D, "Filanet Corporation"); - mVendors.Add(0x153E, "Techwell Inc"); - mVendors.Add(0x153F, "MIPS Technologies, Inc"); - mVendors.Add(0x1540, "Provideo Multimedia Co Ltd"); - mVendors.Add(0x1541, "Telocity Inc."); - mVendors.Add(0x1542, "Vivid Technology Inc"); - mVendors.Add(0x1543, "Silicon Laboratories"); - mVendors.Add(0x1544, "DCM Technologies Ltd."); - mVendors.Add(0x1545, "VisionTek"); - mVendors.Add(0x1546, "IOI Technology Corp."); - mVendors.Add(0x1547, "Mitutoyo Corporation"); - mVendors.Add(0x1548, "Jet Propulsion Laboratory"); - mVendors.Add(0x1549, "Interconnect Systems Solutions"); - mVendors.Add(0x154A, "Max Technologies Inc."); - mVendors.Add(0x154B, "Computex Co Ltd"); - mVendors.Add(0x154C, "Visual Technology Inc."); - mVendors.Add(0x154D, "PAN International Industrial Corp"); - mVendors.Add(0x154E, "Servotest Ltd"); - mVendors.Add(0x154F, "Stratabeam Technology"); - mVendors.Add(0x1550, "Open Network Co Ltd"); - mVendors.Add(0x1551, "Smart Electronic Development GMBH"); - mVendors.Add(0x1553, "Chicony Electronics Co Ltd"); - mVendors.Add(0x1554, "Prolink Microsystems Corp."); - mVendors.Add(0x1555, "Gesytec GmbH"); - mVendors.Add(0x1556, "PLD Applications"); - mVendors.Add(0x1557, "Mediastar Co. Ltd"); - mVendors.Add(0x1558, "Clevo/Kapok Computer"); - mVendors.Add(0x1559, "SI Logic Ltd"); - mVendors.Add(0x155A, "Innomedia Inc"); - mVendors.Add(0x155B, "Protac International Corp"); - mVendors.Add(0x155C, "s"); - mVendors.Add(0x155D, "MAC System Co Ltd"); - mVendors.Add(0x155E, "KUKA Roboter GmbH"); - mVendors.Add(0x155F, "Perle Systems Limited"); - mVendors.Add(0x1560, "Terayon Communications Systems"); - mVendors.Add(0x1561, "Viewgraphics Inc"); - mVendors.Add(0x1562, "Symbol Technologies, Inc."); - mVendors.Add(0x1563, "A-Trend Technology Co Ltd"); - mVendors.Add(0x1564, "Yamakatsu Electronics Industry Co Ltd"); - mVendors.Add(0x1565, "Biostar Microtech Intl Corp"); - mVendors.Add(0x1566, "Ardent Technologies Inc"); - mVendors.Add(0x1567, "Jungsoft"); - mVendors.Add(0x1568, "DDK Electronics Inc"); - mVendors.Add(0x1569, "Palit Microsystems Inc"); - mVendors.Add(0x156A, "Avtec Systems Inc"); - mVendors.Add(0x156B, "S2io Inc"); - mVendors.Add(0x156C, "Vidac Electronics GMBH"); - mVendors.Add(0x156D, "Alpha-Top Corp"); - mVendors.Add(0x156E, "Alfa Inc."); - mVendors.Add(0x156F, "M-Systems Flash Disk Pioneers Ltd"); - mVendors.Add(0x1570, "Lecroy Corporation"); - mVendors.Add(0x1571, "Contemporary Controls"); - mVendors.Add(0x1572, "Otis Elevator Company"); - mVendors.Add(0x1573, "Lattice - Vantis"); - mVendors.Add(0x1574, "Fairchild Semiconductor"); - mVendors.Add(0x1575, "Voltaire Advanced Data Security Ltd"); - mVendors.Add(0x1576, "Viewcast Com"); - mVendors.Add(0x1578, "Hitt"); - mVendors.Add(0x1579, "Dual Technology Corporation"); - mVendors.Add(0x157A, "Japan Elecronics Ind. Inc"); - mVendors.Add(0x157B, "Star Multimedia Corp."); - mVendors.Add(0x157C, "Eurosoft (UK)"); - mVendors.Add(0x157D, "Gemflex Networks"); - mVendors.Add(0x157E, "Transition Networks"); - mVendors.Add(0x157F, "PX Instruments Technology Ltd"); - mVendors.Add(0x1580, "Primex Aerospace Co."); - mVendors.Add(0x1581, "SEH Computertechnik GMBH"); - mVendors.Add(0x1582, "Cytec Corporation"); - mVendors.Add(0x1583, "Inet Technologies Inc"); - mVendors.Add(0x1584, "Uniwill Computer Corp."); - mVendors.Add(0x1585, "Marconi Commerce Systems SRL"); - mVendors.Add(0x1586, "Lancast Inc"); - mVendors.Add(0x1587, "Konica Corporation"); - mVendors.Add(0x1588, "Solidum Systems Corp"); - mVendors.Add(0x1589, "Atlantek Microsystems Pty Ltd"); - mVendors.Add(0x158A, "Digalog Systems Inc"); - mVendors.Add(0x158B, "Allied Data Technologies"); - mVendors.Add(0x158C, "Hitachi Semiconductor & Devices Sales Co"); - mVendors.Add(0x158D, "Point Multimedia Systems"); - mVendors.Add(0x158E, "Lara Technology Inc"); - mVendors.Add(0x158F, "Ditect Coop"); - mVendors.Add(0x1590, "3pardata Inc."); - mVendors.Add(0x1591, "ARN"); - mVendors.Add(0x1592, "Syba Tech Ltd."); - mVendors.Add(0x1593, "Bops Inc"); - mVendors.Add(0x1594, "Netgame Ltd"); - mVendors.Add(0x1595, "Diva Systems Corp."); - mVendors.Add(0x1596, "Folsom Research Inc"); - mVendors.Add(0x1597, "Memec Design Services"); - mVendors.Add(0x1598, "Granite Microsystems"); - mVendors.Add(0x1599, "Delta Electronics Inc"); - mVendors.Add(0x159A, "General Instrument"); - mVendors.Add(0x159B, "Faraday Technology Corp"); - mVendors.Add(0x159C, "Stratus Computer Systems"); - mVendors.Add(0x159D, "Ningbo Harrison Electronics Co Ltd"); - mVendors.Add(0x159E, "A-Max Technology Co Ltd"); - mVendors.Add(0x159F, "Galea Network Security"); - mVendors.Add(0x15A0, "Compumaster SRL"); - mVendors.Add(0x15A1, "Geocast Network Systems Inc"); - mVendors.Add(0x15A2, "Catalyst Enterprises Inc"); - mVendors.Add(0x15A3, "Italtel"); - mVendors.Add(0x15A4, "X-Net OY"); - mVendors.Add(0x15A5, "Toyota MACS Inc"); - mVendors.Add(0x15A6, "Sunlight Ultrasound Technologies Ltd"); - mVendors.Add(0x15A7, "SSE Telecom Inc"); - mVendors.Add(0x15A8, "Shanghai Communications Technologies Cen"); - mVendors.Add(0x15AA, "Moreton Bay"); - mVendors.Add(0x15AB, "Bluesteel Networks Inc"); - mVendors.Add(0x15AC, "North Atlantic Instruments"); - mVendors.Add(0x15AD, "VMware Inc."); - mVendors.Add(0x15AE, "Amersham Pharmacia Biotech"); - mVendors.Add(0x15B0, "Zoltrix International Limited"); - mVendors.Add(0x15B1, "Source Technology Inc"); - mVendors.Add(0x15B2, "Mosaid Technologies Inc."); - mVendors.Add(0x15B3, "Mellanox Technology"); - mVendors.Add(0x15B4, "CCI/Triad"); - mVendors.Add(0x15B5, "Cimetrics Inc"); - mVendors.Add(0x15B6, "Texas Memory Systems Inc"); - mVendors.Add(0x15B7, "Sandisk Corp."); - mVendors.Add(0x15B8, "Addi-Data GMBH"); - mVendors.Add(0x15B9, "Maestro Digital Communications"); - mVendors.Add(0x15BA, "Impacct Technology Corp"); - mVendors.Add(0x15BB, "Portwell Inc"); - mVendors.Add(0x15BC, "Agilent Technologies"); - mVendors.Add(0x15BD, "DFI Inc."); - mVendors.Add(0x15BE, "Sola Electronics"); - mVendors.Add(0x15BF, "High Tech Computer Corp (HTC)"); - mVendors.Add(0x15C0, "BVM Limited"); - mVendors.Add(0x15C1, "Quantel"); - mVendors.Add(0x15C2, "Newer Technology Inc"); - mVendors.Add(0x15C3, "Taiwan Mycomp Co Ltd"); - mVendors.Add(0x15C4, "EVSX Inc"); - mVendors.Add(0x15C5, "Procomp Informatics Ltd"); - mVendors.Add(0x15C6, "Technical University Of Budapest"); - mVendors.Add(0x15C7, "Tateyama System Laboratory Co Ltd"); - mVendors.Add(0x15C8, "Penta Media Co. Ltd"); - mVendors.Add(0x15C9, "Serome Technology Inc"); - mVendors.Add(0x15CA, "Bitboys OY"); - mVendors.Add(0x15CB, "AG Electronics Ltd"); - mVendors.Add(0x15CC, "Hotrail Inc."); - mVendors.Add(0x15CD, "Dreamtech Co Ltd"); - mVendors.Add(0x15CE, "Genrad Inc."); - mVendors.Add(0x15CF, "Hilscher GMBH"); - mVendors.Add(0x15D1, "Infineon Technologies AG"); - mVendors.Add(0x15D2, "FIC (First International Computer Inc)"); - mVendors.Add(0x15D3, "NDS Technologies Israel Ltd"); - mVendors.Add(0x15D4, "Iwill Corporation"); - mVendors.Add(0x15D5, "Tatung Co."); - mVendors.Add(0x15D6, "Entridia Corporation"); - mVendors.Add(0x15D7, "Rockwell-Collins Inc"); - mVendors.Add(0x15D8, "Cybernetics Technology Co Ltd"); - mVendors.Add(0x15D9, "Super Micro Computer Inc"); - mVendors.Add(0x15DA, "Cyberfirm Inc."); - mVendors.Add(0x15DB, "Applied Computing Systems Inc."); - mVendors.Add(0x15DC, "Litronic Inc."); - mVendors.Add(0x15DD, "Sigmatel Inc."); - mVendors.Add(0x15DE, "Malleable Technologies Inc"); - mVendors.Add(0x15E0, "Cacheflow Inc"); - mVendors.Add(0x15E1, "Voice Technologies Group"); - mVendors.Add(0x15E2, "Quicknet Technologies Inc"); - mVendors.Add(0x15E3, "Networth Technologies Inc"); - mVendors.Add(0x15E4, "VSN Systemen BV"); - mVendors.Add(0x15E5, "Valley Technologies Inc"); - mVendors.Add(0x15E6, "Agere Inc."); - mVendors.Add(0x15E7, "GET Engineering Corp."); - mVendors.Add(0x15E8, "National Datacomm Corp."); - mVendors.Add(0x15E9, "Pacific Digital Corp."); - mVendors.Add(0x15EA, "Tokyo Denshi Sekei K.K."); - mVendors.Add(0x15EB, "Drsearch GMBH"); - mVendors.Add(0x15EC, "Beckhoff GMBH"); - mVendors.Add(0x15ED, "Macrolink Inc"); - mVendors.Add(0x15EE, "IN Win Development Inc."); - mVendors.Add(0x15EF, "Intelligent Paradigm Inc"); - mVendors.Add(0x15F0, "B-Tree Systems Inc"); - mVendors.Add(0x15F1, "Times N Systems Inc"); - mVendors.Add(0x15F2, "Diagnostic Instruments Inc"); - mVendors.Add(0x15F3, "Digitmedia Corp."); - mVendors.Add(0x15F4, "Valuesoft"); - mVendors.Add(0x15F5, "Power Micro Research"); - mVendors.Add(0x15F6, "Extreme Packet Device Inc"); - mVendors.Add(0x15F7, "Banctec"); - mVendors.Add(0x15F8, "Koga Electronics Co"); - mVendors.Add(0x15F9, "Zenith Electronics Corporation"); - mVendors.Add(0x15FA, "Axzam Corporation"); - mVendors.Add(0x15FB, "Zilog Inc."); - mVendors.Add(0x15FC, "Techsan Electronics Co Ltd"); - mVendors.Add(0x15FD, "N-Cubed.Net"); - mVendors.Add(0x15FE, "Kinpo Electronics Inc"); - mVendors.Add(0x15FF, "Fastpoint Technologies Inc."); - mVendors.Add(0x1600, "Northrop Grumman - Canada Ltd"); - mVendors.Add(0x1601, "Tenta Technology"); - mVendors.Add(0x1602, "Prosys-TEC Inc."); - mVendors.Add(0x1603, "Nokia Wireless Business Communications"); - mVendors.Add(0x1604, "Central System Research Co Ltd"); - mVendors.Add(0x1605, "Pairgain Technologies"); - mVendors.Add(0x1606, "Europop AG"); - mVendors.Add(0x1607, "Lava Semiconductor Manufacturing Inc."); - mVendors.Add(0x1608, "Automated Wagering International"); - mVendors.Add(0x1609, "Sciemetric Instruments Inc"); - mVendors.Add(0x160A, "Kollmorgen Servotronix"); - mVendors.Add(0x160B, "Onkyo Corp."); - mVendors.Add(0x160C, "Oregon Micro Systems Inc."); - mVendors.Add(0x160D, "Aaeon Electronics Inc"); - mVendors.Add(0x160E, "CML Emergency Services"); - mVendors.Add(0x160F, "ITEC Co Ltd"); - mVendors.Add(0x1610, "Tottori Sanyo Electric Co Ltd"); - mVendors.Add(0x1611, "Bel Fuse Inc."); - mVendors.Add(0x1612, "Telesynergy Research Inc."); - mVendors.Add(0x1613, "System Craft Inc."); - mVendors.Add(0x1614, "Jace Tech Inc."); - mVendors.Add(0x1615, "Equus Computer Systems Inc"); - mVendors.Add(0x1616, "Iotech Inc."); - mVendors.Add(0x1617, "Rapidstream Inc"); - mVendors.Add(0x1618, "Esec SA"); - mVendors.Add(0x1619, "FarSite Communications Limited"); - mVendors.Add(0x161B, "Mobilian Israel Ltd"); - mVendors.Add(0x161C, "Berkshire Products"); - mVendors.Add(0x161D, "Gatec"); - mVendors.Add(0x161E, "Kyoei Sangyo Co Ltd"); - mVendors.Add(0x161F, "Arima Computer Corporation"); - mVendors.Add(0x1620, "Sigmacom Co Ltd"); - mVendors.Add(0x1621, "Lynx Studio Technology Inc"); - mVendors.Add(0x1622, "Nokia Home Communications"); - mVendors.Add(0x1623, "KRF Tech Ltd"); - mVendors.Add(0x1624, "CE Infosys GMBH"); - mVendors.Add(0x1625, "Warp Nine Engineering"); - mVendors.Add(0x1626, "TDK Semiconductor Corp."); - mVendors.Add(0x1627, "BCom Electronics Inc"); - mVendors.Add(0x1629, "Kongsberg Spacetec a.s."); - mVendors.Add(0x162A, "Sejin Computerland Co Ltd"); - mVendors.Add(0x162B, "Shanghai Bell Company Limited"); - mVendors.Add(0x162C, "C&H Technologies Inc"); - mVendors.Add(0x162D, "Reprosoft Co Ltd"); - mVendors.Add(0x162E, "Margi Systems Inc"); - mVendors.Add(0x162F, "Rohde & Schwarz GMBH & Co KG"); - mVendors.Add(0x1630, "Sky Computers Inc"); - mVendors.Add(0x1631, "NEC Computer International"); - mVendors.Add(0x1632, "Verisys Inc"); - mVendors.Add(0x1633, "Adac Corporation"); - mVendors.Add(0x1634, "Visionglobal Network Corp."); - mVendors.Add(0x1635, "Decros"); - mVendors.Add(0x1636, "Jean Company Ltd"); - mVendors.Add(0x1637, "NSI"); - mVendors.Add(0x1638, "Eumitcom Technology Inc"); - mVendors.Add(0x163A, "Air Prime Inc"); - mVendors.Add(0x163B, "Glotrex Co Ltd"); - mVendors.Add(0x163C, "intel"); - mVendors.Add(0x163D, "Heidelberg Digital LLC"); - mVendors.Add(0x163E, "3dpower"); - mVendors.Add(0x163F, "Renishaw PLC"); - mVendors.Add(0x1640, "Intelliworxx Inc"); - mVendors.Add(0x1641, "MKNet Corporation"); - mVendors.Add(0x1642, "Bitland"); - mVendors.Add(0x1643, "Hajime Industries Ltd"); - mVendors.Add(0x1644, "Western Avionics Ltd"); - mVendors.Add(0x1645, "Quick-Serv. Computer Co. Ltd"); - mVendors.Add(0x1646, "Nippon Systemware Co Ltd"); - mVendors.Add(0x1647, "Hertz Systemtechnik GMBH"); - mVendors.Add(0x1648, "MeltDown Systems LLC"); - mVendors.Add(0x1649, "Jupiter Systems"); - mVendors.Add(0x164A, "Aiwa Co. Ltd"); - mVendors.Add(0x164C, "Department Of Defense"); - mVendors.Add(0x164D, "Ishoni Networks"); - mVendors.Add(0x164E, "Micrel Inc."); - mVendors.Add(0x164F, "Datavoice (Pty) Ltd."); - mVendors.Add(0x1650, "Admore Technology Inc."); - mVendors.Add(0x1651, "Chaparral Network Storage"); - mVendors.Add(0x1652, "Spectrum Digital Inc."); - mVendors.Add(0x1653, "Nature Worldwide Technology Corp"); - mVendors.Add(0x1654, "Sonicwall Inc"); - mVendors.Add(0x1655, "Dazzle Multimedia Inc."); - mVendors.Add(0x1656, "Insyde Software Corp"); - mVendors.Add(0x1657, "Brocade Communications Systems"); - mVendors.Add(0x1658, "Med Associates Inc."); - mVendors.Add(0x1659, "Shiba Denshi Systems Inc."); - mVendors.Add(0x165A, "Epix Inc."); - mVendors.Add(0x165B, "Real-Time Digital Inc."); - mVendors.Add(0x165C, "Kondo Kagaku"); - mVendors.Add(0x165D, "Hsing Tech. Enterprise Co. Ltd."); - mVendors.Add(0x165E, "Hyunju Computer Co. Ltd."); - mVendors.Add(0x165F, "Comartsystem Korea"); - mVendors.Add(0x1660, "Network Security Technologies Inc. (Net"); - mVendors.Add(0x1661, "Worldspace Corp."); - mVendors.Add(0x1662, "Int Labs"); - mVendors.Add(0x1663, "Elmec Inc. Ltd."); - mVendors.Add(0x1664, "Fastfame Technology Co. Ltd."); - mVendors.Add(0x1665, "Edax Inc."); - mVendors.Add(0x1666, "Norpak Corporation"); - mVendors.Add(0x1667, "CoSystems Inc."); - mVendors.Add(0x1668, "Actiontec Electronics Inc."); - mVendors.Add(0x166A, "Komatsu Ltd."); - mVendors.Add(0x166B, "Supernet Inc."); - mVendors.Add(0x166C, "Shade Ltd."); - mVendors.Add(0x166D, "Sibyte Inc."); - mVendors.Add(0x166E, "Schneider Automation Inc."); - mVendors.Add(0x166F, "Televox Software Inc."); - mVendors.Add(0x1670, "Rearden Steel"); - mVendors.Add(0x1671, "Atan Technology Inc."); - mVendors.Add(0x1672, "Unitec Co. Ltd."); - mVendors.Add(0x1673, "pctel"); - mVendors.Add(0x1675, "Square Wave Technology"); - mVendors.Add(0x1676, "Emachines Inc."); - mVendors.Add(0x1677, "Bernecker + Rainer"); - mVendors.Add(0x1678, "INH Semiconductor"); - mVendors.Add(0x1679, "Tokyo Electron Device Ltd."); - mVendors.Add(0x167F, "iba AG"); - mVendors.Add(0x1680, "Dunti Corp."); - mVendors.Add(0x1681, "Hercules"); - mVendors.Add(0x1682, "PINE Technology, Ltd."); - mVendors.Add(0x1688, "CastleNet Technology Inc."); - mVendors.Add(0x168A, "Utimaco Safeware AG"); - mVendors.Add(0x168B, "Circut Assembly Corp."); - mVendors.Add(0x168C, "Atheros Communications Inc."); - mVendors.Add(0x168D, "NMI Electronics Ltd."); - mVendors.Add(0x168E, "Hyundai MultiCAV Computer Co. Ltd."); - mVendors.Add(0x168F, "KDS Innotech Corp."); - mVendors.Add(0x1690, "NetContinuum, Inc."); - mVendors.Add(0x1693, "FERMA"); - mVendors.Add(0x1695, "EPoX Computer Co., Ltd."); - mVendors.Add(0x16AE, "SafeNet Inc."); - mVendors.Add(0x16B3, "CNF Mobile Solutions"); - mVendors.Add(0x16B8, "Sonnet Technologies, Inc."); - mVendors.Add(0x16CA, "Cenatek Inc."); - mVendors.Add(0x16CB, "Minolta Co. Ltd."); - mVendors.Add(0x16CC, "Inari Inc."); - mVendors.Add(0x16D0, "Systemax"); - mVendors.Add(0x16E0, "Third Millenium Test Solutions, Inc."); - mVendors.Add(0x16E5, "Intellon Corporation"); - mVendors.Add(0x16EC, "U.S. Robotics"); - mVendors.Add(0x16F0, "TLA Inc."); - mVendors.Add(0x16F1, "Adicti Corp."); - mVendors.Add(0x16F3, "Jetway Information Co., Ltd"); - mVendors.Add(0x16F6, "VideoTele.com Inc."); - mVendors.Add(0x1700, "Antara LLC"); - mVendors.Add(0x1701, "Interactive Computer Products Inc."); - mVendors.Add(0x1702, "Internet Machines Corp."); - mVendors.Add(0x1703, "Desana Systems"); - mVendors.Add(0x1704, "Clearwater Networks"); - mVendors.Add(0x1705, "Digital First"); - mVendors.Add(0x1706, "Pacific Broadband Communications"); - mVendors.Add(0x1707, "Cogency Semiconductor Inc."); - mVendors.Add(0x1708, "Harris Corp."); - mVendors.Add(0x1709, "Zarlink Semiconductor"); - mVendors.Add(0x170A, "Alpine Electronics Inc."); - mVendors.Add(0x170B, "NetOctave Inc."); - mVendors.Add(0x170C, "YottaYotta Inc."); - mVendors.Add(0x170D, "SensoMotoric Instruments GmbH"); - mVendors.Add(0x170E, "San Valley Systems, Inc."); - mVendors.Add(0x170F, "Cyberdyne Inc."); - mVendors.Add(0x1710, "Pelago Nutworks"); - mVendors.Add(0x1711, "MyName Technologies, Inc."); - mVendors.Add(0x1712, "NICE Systems Inc."); - mVendors.Add(0x1713, "TOPCON Corp."); - mVendors.Add(0x1725, "Vitesse Semiconductor"); - mVendors.Add(0x1734, "Fujitsu-Siemens Computers GmbH"); - mVendors.Add(0x1737, "LinkSys"); - mVendors.Add(0x173B, "Altima Communications Inc."); - mVendors.Add(0x1743, "Peppercon AG"); - mVendors.Add(0x174B, "PC Partner Limited"); - mVendors.Add(0x1752, "Global Brands Manufacture Ltd."); - mVendors.Add(0x1753, "TeraRecon, Inc."); - mVendors.Add(0x1755, "Alchemy Semiconductor Inc."); - mVendors.Add(0x176A, "General Dynamics Canada"); - mVendors.Add(0x1789, "Ennyah Technologies Corp"); - mVendors.Add(0x1793, "Unitech Electronics Co., Ltd"); - mVendors.Add(0x17A7, "Start Network Technology Co., Ltd."); - mVendors.Add(0x17AA, "Legend Ltd. (Beijing)"); - mVendors.Add(0x17AB, "Phillips Components"); - mVendors.Add(0x17AF, "Hightech Information Systems, Ltd."); - mVendors.Add(0x17BE, "Philips Semiconductors"); - mVendors.Add(0x17C0, "Wistron Corp."); - mVendors.Add(0x17C4, "Movita"); - mVendors.Add(0x17CC, "NetChip"); - mVendors.Add(0x17D5, "Neterion Inc."); - mVendors.Add(0x17E9, "DH electronics GmbH"); - mVendors.Add(0x17EE, "Connect Components, Ltd."); - mVendors.Add(0x1813, "Ambient Technologies Inc."); - mVendors.Add(0x1814, "Ralink Technology, Corp"); - mVendors.Add(0x1815, "devolo AG"); - mVendors.Add(0x1820, "InfiniCon Systems, Inc."); - mVendors.Add(0x1824, "Avocent"); - mVendors.Add(0x1860, "Primagraphics Ltd."); - mVendors.Add(0x186C, "Humusoft S.R.O"); - mVendors.Add(0x1887, "Elan Digital Systems Ltd"); - mVendors.Add(0x1888, "Varisys Limited"); - mVendors.Add(0x188D, "Millogic Ltd."); - mVendors.Add(0x1890, "Egenera, Inc."); - mVendors.Add(0x18BC, "Info-Tek Corp."); - mVendors.Add(0x18C9, "ARVOO Engineering BV"); - mVendors.Add(0x18CA, "XGI Technology Inc"); - mVendors.Add(0x18F1, "Spectrum Systementwicklung Microelectronic GmbH"); - mVendors.Add(0x18F4, "Napatech A/S"); - mVendors.Add(0x18F7, "Commtech, Inc."); - mVendors.Add(0x18FB, "Resilience Corporation"); - mVendors.Add(0x1905, "WIS Technology, Inc."); - mVendors.Add(0x1910, "Seaway Networks"); - mVendors.Add(0x1971, "AGEIA Technologies, Inc."); - mVendors.Add(0x19A8, "DAQDATA GmbH"); - mVendors.Add(0x19AC, "Kasten Chase Applied Research"); - mVendors.Add(0x19E2, "Vector Informatik GmbH"); - mVendors.Add(0x1A08, "Linux Networx"); - mVendors.Add(0x1A42, "Imaginant"); - mVendors.Add(0x1B13, "Jaton Corporation USA"); - mVendors.Add(0x1DE1, "Tekram"); - mVendors.Add(0x1FCF, "Miranda Technologies Ltd."); - mVendors.Add(0x2001, "Temporal Research Ltd"); - mVendors.Add(0x2646, "Kingston Technology Co."); - mVendors.Add(0x270F, "ChainTech Computer Co. Ltd."); - mVendors.Add(0x2EC1, "Zenic Inc"); - mVendors.Add(0x3388, "Hint Corp."); - mVendors.Add(0x3411, "Quantum Designs (H.K.) Inc."); - mVendors.Add(0x3513, "ARCOM Control Systems Ltd."); - mVendors.Add(0x38EF, "4links"); - mVendors.Add(0x3D3D, "3Dlabs, Inc. Ltd"); - mVendors.Add(0x4005, "Avance Logic Inc."); - mVendors.Add(0x4144, "Alpha Data"); - mVendors.Add(0x416C, "Aladdin Knowledge Systems"); - mVendors.Add(0x4680, "UMAX Computer Corp."); - mVendors.Add(0x4843, "Hercules Computer Technology"); - mVendors.Add(0x4943, "Growth Networks"); - mVendors.Add(0x4954, "Integral Technologies"); - mVendors.Add(0x4978, "Axil Computer Inc."); - mVendors.Add(0x4C48, "Lung Hwa Electronics"); - mVendors.Add(0x4C53, "SBS-OR Industrial Computers"); - mVendors.Add(0x4CA1, "Seanix Technology Inc"); - mVendors.Add(0x4D51, "Mediaq Inc."); - mVendors.Add(0x4D54, "Microtechnica Co Ltd"); - mVendors.Add(0x4DDC, "ILC Data Device Corp."); - mVendors.Add(0x5053, "TBS/Voyetra Technologies"); - mVendors.Add(0x5136, "S S Technologies"); - mVendors.Add(0x5143, "Qualcomm Inc."); - mVendors.Add(0x5333, "S3 Graphics Co., Ltd"); - mVendors.Add(0x544C, "Teralogic Inc"); - mVendors.Add(0x5555, "Genroco Inc."); - mVendors.Add(0x6409, "Logitec Corp."); - mVendors.Add(0x6666, "Decision Computer International Co."); - mVendors.Add(0x7604, "O.N. Electric Co. Ltd."); - mVendors.Add(0x8086, "Intel Corporation"); - mVendors.Add(0x8866, "T-Square Design Inc."); - mVendors.Add(0x8888, "Silicon Magic"); - mVendors.Add(0x8E0E, "Computone Corporation"); - mVendors.Add(0x9004, "Adaptec Inc"); - mVendors.Add(0x9005, "Adaptec Inc"); - mVendors.Add(0x919A, "Gigapixel Corp"); - mVendors.Add(0x9412, "Holtek"); - mVendors.Add(0x9699, "Omni Media Technology Inc."); - mVendors.Add(0x9902, "StarGen, Inc."); - mVendors.Add(0xA0A0, "Aopen Inc."); - mVendors.Add(0xA0F1, "Unisys Corporation"); - mVendors.Add(0xA200, "NEC Corp."); - mVendors.Add(0xA259, "Hewlett Packard"); - mVendors.Add(0xA304, "Sony"); - mVendors.Add(0xA727, "3com Corporation"); - mVendors.Add(0xAA42, "Scitex Digital Video"); - mVendors.Add(0xAC1E, "Digital Receiver Technology Inc"); - mVendors.Add(0xB1B3, "Shiva Europe Ltd."); - mVendors.Add(0xB894, "Brown & Sharpe Mfg. Co."); - mVendors.Add(0xBEEF, "Mindstream Computing"); - mVendors.Add(0xC001, "TSI Telsys"); - mVendors.Add(0xC0A9, "Micron/Crucial Technology"); - mVendors.Add(0xC0DE, "Motorola"); - mVendors.Add(0xC0FE, "Motion Engineering Inc."); - mVendors.Add(0xC622, "Hudson Soft Co Ltd"); - mVendors.Add(0xCA50, "Varian Australia Pty. Ltd."); - mVendors.Add(0xCAFE, "Chrysalis-ITS"); - mVendors.Add(0xCCCC, "Catapult Communications"); - mVendors.Add(0xD4D4, "Curtiss-Wright Controls Embedded Computing"); - mVendors.Add(0xDC93, "Dawicontrol"); - mVendors.Add(0xDEAD, "Indigita Corporation"); - mVendors.Add(0xDEAF, "Middle Digital, Inc"); - mVendors.Add(0xE159, "Tiger Jet Network Inc"); - mVendors.Add(0xE4BF, "EKF Elektronik GMBH"); - mVendors.Add(0xEA01, "Eagle Technology"); - mVendors.Add(0xEABB, "Aashima Technology B.V."); - mVendors.Add(0xEACE, "Endace Measurement Systems Ltd."); - mVendors.Add(0xECC0, "Echo Digital Audio Corporation"); - mVendors.Add(0xEDD8, "ARK Logic, Inc"); - mVendors.Add(0xF5F5, "F5 Networks Inc."); - mVendors.Add(0xFA57, "Interagon AS"); - */ - - #endregion Fill vendors - - #region Fill devices - - - mDevices.Add(0x80861237,@"82440LX/EX"); - mDevices.Add(0x80867000,@"82371SB"); - mDevices.Add(0x80867010,@"82371SB"); - mDevices.Add(0x80867113,@"82371AB/EB/MB"); - mDevices.Add(0x101300B8,@"CL-GD5446"); - mDevices.Add(0x10222000,@"Am79C970/1/2/3/5/6"); - mDevices.Add(0x10EC8029,@"RTL8029(as)pci ethernet nic"); - mDevices.Add(0x12745000,@"ES1373"); - - //For now it is too slow to add all vendors - - //mDevices.Add(0x003D00D1,@"mx98715/25"); - //mDevices.Add(0x0E110001,@"PCI to EISA Bridge"); - //mDevices.Add(0x0E110002,@"ISA Bridge"); - //mDevices.Add(0x0E11000F,@"CPQB1A9"); - //mDevices.Add(0x0E110012,@"686P7"); - //mDevices.Add(0x0E110049,@"NC7132"); - //mDevices.Add(0x0E11004A,@"NC6136"); - //mDevices.Add(0x0E1100C0,@"Adaptec AIC-7899G"); - //mDevices.Add(0x0E110508,@"Neteligent 4/16 TR"); - //mDevices.Add(0x0E111000,@"Triflex Model 1000"); - //mDevices.Add(0x0E112000,@"Triflex Model 2000"); - //mDevices.Add(0x0E113032,@"QVision 1280/p v0"); - //mDevices.Add(0x0E113033,@"QVision 1280/p v1"); - //mDevices.Add(0x0E113034,@"QVision 1280/p v2"); - //mDevices.Add(0x0E114000,@"Triflex Model 4000"); - //mDevices.Add(0x0E116010,@"Model 6010"); - //mDevices.Add(0x0E117020,@"USB Controller"); - //mDevices.Add(0x0E11A0EC,@"Original Compaq fibre Channel HBA"); - //mDevices.Add(0x0E11A0F0,@"Advanced System Management Controller"); - //mDevices.Add(0x0E11A0F3,@"Triflex PCI to ISA PnP Bridge"); - //mDevices.Add(0x0E11A0F7,@"PCI Hotplug Controller"); - //mDevices.Add(0x0E11A0F8,@"ZFMicro"); - //mDevices.Add(0x0E11A0FC,@"HPFC-5166A"); - //mDevices.Add(0x0E11AE29,@"MIS-L"); - //mDevices.Add(0x0E11AE2A,@"MPC"); - //mDevices.Add(0x0E11AE2B,@"MIS-E"); - //mDevices.Add(0x0E11AE31,@"System Management Controller"); - //mDevices.Add(0x0E11AE32,@"Netelligent 10/100 TX PCI UTP TLAN 2.3"); - //mDevices.Add(0x0E11AE33,@"Triflex"); - //mDevices.Add(0x0E11AE34,@"Netelligent 10 T PCI UTP TLAN 2.3"); - //mDevices.Add(0x0E11AE35,@"Integrated NetFlex 3/P TLAN 2.3"); - //mDevices.Add(0x0E11AE40,@"Dual Port Netelligent 10/100 TX PCI TLAN"); - //mDevices.Add(0x0E11AE43,@"Integrated Netelligent 10/100 TX PCI"); - //mDevices.Add(0x0E11AE69,@"CETUS-L"); - //mDevices.Add(0x0E11AE6C,@"DRACO"); - //mDevices.Add(0x0E11AE6D,@"NorthStar"); - //mDevices.Add(0x0E11B011,@"Dual Port Netelligent 10/100 TX"); - //mDevices.Add(0x0E11B012,@"Netelligent 10 T/2"); - //mDevices.Add(0x0E11B01E,@"NC3120"); - //mDevices.Add(0x0E11B01F,@"NC3122"); - //mDevices.Add(0x0E11B02F,@"NC1120"); - //mDevices.Add(0x0E11B030,@"Netelligent WS 1500"); - //mDevices.Add(0x0E11B04A,@"699209-003"); - //mDevices.Add(0x0E11B0C6,@"NC3161"); - //mDevices.Add(0x0E11B0C7,@"NC3160"); - //mDevices.Add(0x0E11B0D7,@"NC3121 rev. A & B"); - //mDevices.Add(0x0E11B0DD,@"NC3131"); - //mDevices.Add(0x0E11B0DE,@"NC3132"); - //mDevices.Add(0x0E11B0DF,@"NC6132"); - //mDevices.Add(0x0E11B0E0,@"NC6133"); - //mDevices.Add(0x0E11B0E1,@"NC3133"); - //mDevices.Add(0x0E11B123,@"NC6134"); - //mDevices.Add(0x0E11B134,@"NC3163"); - //mDevices.Add(0x0E11B13C,@"NC3162"); - //mDevices.Add(0x0E11B144,@"NC3123"); - //mDevices.Add(0x0E11B163,@"NC3134"); - //mDevices.Add(0x0E11B164,@"NC3135"); - //mDevices.Add(0x0E11B178,@"CISSB"); - //mDevices.Add(0x0E11B196,@"0230"); - //mDevices.Add(0x0E11B1A4,@"NC7131"); - //mDevices.Add(0x0E11B203,@"iLo"); - //mDevices.Add(0x0E11B204,@"iLo"); - //mDevices.Add(0x0E11F095,@"FCA2101"); - //mDevices.Add(0x0E11F130,@"ThunderLAN 1.0 NetFlex-3/P"); - //mDevices.Add(0x0E11F150,@"ThunderLAN 2.3 NetFlex-3/P with BNC"); - //mDevices.Add(0x0E11F700,@"LP7000 Compaq/Emulex Fibre Channel HBA"); - //mDevices.Add(0x0E11F800,@"LP8000 Compaq/Emulex Fibre Channel HBA"); - //mDevices.Add(0x10000001,@"LSI53C810"); - //mDevices.Add(0x10000002,@"53C820"); - //mDevices.Add(0x10000003,@"LSI53C1010-33"); - //mDevices.Add(0x10000004,@"53C815"); - //mDevices.Add(0x10000005,@"53C810AP"); - //mDevices.Add(0x10000006,@"LSI53C860/860E"); - //mDevices.Add(0x1000000A,@"LSI53C1510"); - //mDevices.Add(0x1000000B,@"LSI53C896/897"); - //mDevices.Add(0x1000000C,@"LSI53C895"); - //mDevices.Add(0x1000000D,@"53C885"); - //mDevices.Add(0x1000000F,@"53C875/875E/876/876E"); - //mDevices.Add(0x10000010,@"LSI53C1510"); - //mDevices.Add(0x10000012,@"LSI53C895A"); - //mDevices.Add(0x10000013,@"LSI53C875A"); - //mDevices.Add(0x10000020,@"LSI53C1010-33"); - //mDevices.Add(0x10000021,@"LSI53C1000/1000R/1010R/1010-66"); - //mDevices.Add(0x10000030,@"LSI53C1020/1030"); - //mDevices.Add(0x10000031,@"LSI53C1030ZC"); - //mDevices.Add(0x10000032,@"LSI53C1035"); - //mDevices.Add(0x10000035,@"LSI53C1035"); - //mDevices.Add(0x10000040,@"LSI53C1035"); - //mDevices.Add(0x10000050,@"LSISAS1064"); - //mDevices.Add(0x10000054,@"LSISAS1068"); - //mDevices.Add(0x10000056,@"LSISAS1064ET"); - //mDevices.Add(0x10000058,@"LSISAS1068E"); - //mDevices.Add(0x10000062,@"LSISAS1078"); - //mDevices.Add(0x1000008F,@"53C810"); - //mDevices.Add(0x10000621,@"LSIFC909"); - //mDevices.Add(0x10000622,@"LSIFC929"); - //mDevices.Add(0x10000623,@"LSIFC929"); - //mDevices.Add(0x10000624,@"LSIFC919"); - //mDevices.Add(0x10000625,@"LSIFC919"); - //mDevices.Add(0x10000626,@"LSIFC929X"); - //mDevices.Add(0x10000628,@"LSIFC919X"); - //mDevices.Add(0x10000630,@"LSIFC920"); - //mDevices.Add(0x10000640,@"LSIFC949X"); - //mDevices.Add(0x10000642,@"LSIFC939X"); - //mDevices.Add(0x10000646,@"LSIFC949ES"); - //mDevices.Add(0x10000701,@"53C885"); - //mDevices.Add(0x10000702,@"Yellowfin G-NIC"); - //mDevices.Add(0x10000901,@"61C102"); - //mDevices.Add(0x10001000,@"63C815"); - //mDevices.Add(0x10001001,@"53C895"); - //mDevices.Add(0x10001010,@"LSI 53C102000"); - //mDevices.Add(0x10010010,@"ispLSI1032E"); - //mDevices.Add(0x10010011,@"ispLSI1032E"); - //mDevices.Add(0x10010012,@"ispLSI1032E"); - //mDevices.Add(0x10010013,@"ispLSI1032E"); - //mDevices.Add(0x10010014,@"ispLSI1032E"); - //mDevices.Add(0x10010015,@"ispLSI1032E"); - //mDevices.Add(0x10010016,@"ispLSI1032E"); - //mDevices.Add(0x10010017,@"ispLSI1032E"); - //mDevices.Add(0x10010020,@"ispLSI1032E"); - //mDevices.Add(0x10020B12,@"ati 1900"); - //mDevices.Add(0x10023150,@"M24 1P"); - //mDevices.Add(0x10023154,@"M24 1T"); - //mDevices.Add(0x10023E50,@"RV380"); - //mDevices.Add(0x10023E54,@"RV380"); - //mDevices.Add(0x10024136,@"A3"); - //mDevices.Add(0x10024137,@"RS200"); - //mDevices.Add(0x10024144,@"R300"); - //mDevices.Add(0x10024145,@"R300"); - //mDevices.Add(0x10024146,@"R300"); - //mDevices.Add(0x10024147,@"ATI Fire GL Z1 Video Accelerator"); - //mDevices.Add(0x10024148,@"R350"); - //mDevices.Add(0x10024150,@"rv350"); - //mDevices.Add(0x10024151,@"RV350"); - //mDevices.Add(0x10024152,@"RV360"); - //mDevices.Add(0x10024153,@"RV350"); - //mDevices.Add(0x10024158,@"200E17af"); - //mDevices.Add(0x10024164,@"Radeon 9500 Series, secondary"); - //mDevices.Add(0x10024167,@"ATI Fire GL Z1 4P SECONDARY Video"); - //mDevices.Add(0x10024168,@"R350"); - //mDevices.Add(0x10024170,@"RV350"); - //mDevices.Add(0x10024171,@"RV350"); - //mDevices.Add(0x10024172,@"RV360"); - //mDevices.Add(0x10024173,@"RV350"); - //mDevices.Add(0x10024242,@"R200AIW"); - //mDevices.Add(0x10024243,@"Lucent OHCI IEEE1394 Host Controller"); - //mDevices.Add(0x10024336,@"rs200"); - //mDevices.Add(0x10024337,@"RS200M"); - //mDevices.Add(0x10024341,@"AD1981"); - //mDevices.Add(0x10024342,@"IXP 150"); - //mDevices.Add(0x10024345,@"IXP 150"); - //mDevices.Add(0x10024347,@"IXP 150"); - //mDevices.Add(0x10024348,@"IXP 150"); - //mDevices.Add(0x10024349,@"IXP 1xx/2xx"); - //mDevices.Add(0x1002434C,@"IXP 150"); - //mDevices.Add(0x10024353,@"IXP 150"); - //mDevices.Add(0x10024354,@"215r2qzua21"); - //mDevices.Add(0x10024358,@"216l0sas25"); - //mDevices.Add(0x10024369,@"IXP 3xx"); - //mDevices.Add(0x1002436E,@"IXP 3xx"); - //mDevices.Add(0x10024370,@"IXP_AUDIO_400"); - //mDevices.Add(0x10024372,@"x200"); - //mDevices.Add(0x10024376,@"SB4xx"); - //mDevices.Add(0x10024378,@"AC97"); - //mDevices.Add(0x10024379,@"SB4xx"); - //mDevices.Add(0x1002437A,@"SB4xx"); - //mDevices.Add(0x1002437B,@"OEM Intel Corporation&"); - //mDevices.Add(0x10024381,@"ATI ?"); - //mDevices.Add(0x10024385,@"ATI RD600/RS600"); - //mDevices.Add(0x10024386,@"690G"); - //mDevices.Add(0x1002438C,@"RD600/RS600"); - //mDevices.Add(0x10024390,@"SB7xx"); - //mDevices.Add(0x10024391,@"ATI SB700"); - //mDevices.Add(0x10024392,@"ATI SB700"); - //mDevices.Add(0x10024393,@"ATI ?"); - //mDevices.Add(0x1002439C,@"SB7xx"); - //mDevices.Add(0x10024554,@"Mach64 ET"); - //mDevices.Add(0x10024654,@"Mach64 VT"); - //mDevices.Add(0x10024742,@"(GT-C2U2)"); - //mDevices.Add(0x10024744,@"Rage 3D Pro AGP 2x"); - //mDevices.Add(0x10024747,@"Rage 3D Pro"); - //mDevices.Add(0x10024749,@"RAGE PRO TURBO AGP 2X"); - //mDevices.Add(0x1002474C,@"Rage XC PCI-66"); - //mDevices.Add(0x1002474D,@"Rage XL AGP 2x"); - //mDevices.Add(0x1002474E,@"Rage XC AGP 2x"); - //mDevices.Add(0x1002474F,@"Rage XL PCI-66"); - //mDevices.Add(0x10024750,@"ATI 3D Rage Pro 215GP"); - //mDevices.Add(0x10024751,@"Rage 3D Pro PCI"); - //mDevices.Add(0x10024752,@"Rage XL PCI"); - //mDevices.Add(0x10024753,@"Rage XC PCI"); - //mDevices.Add(0x10024754,@"Mach 64 VT"); - //mDevices.Add(0x10024755,@"Rage 3D II+pci"); - //mDevices.Add(0x10024756,@"Rage 3D IIC AGP"); - //mDevices.Add(0x10024757,@"3D 11C AGP"); - //mDevices.Add(0x10024758,@"210888GX"); - //mDevices.Add(0x10024759,@"215r2qzua21"); - //mDevices.Add(0x1002475A,@"215r2qua12"); - //mDevices.Add(0x10024966,@"RV250"); - //mDevices.Add(0x10024967,@"RV250"); - //mDevices.Add(0x1002496E,@"RV250"); - //mDevices.Add(0x1002496F,@"RV250"); - //mDevices.Add(0x10024C42,@"B10E0E11"); - //mDevices.Add(0x10024C44,@"Rage 3D LT Pro AGP"); - //mDevices.Add(0x10024C45,@"Rage Mobility M3 AGP"); - //mDevices.Add(0x10024C46,@"Mobility M3 AGP"); - //mDevices.Add(0x10024C47,@"ati rage pro"); - //mDevices.Add(0x10024C49,@"123"); - //mDevices.Add(0x10024C4D,@"01541014"); - //mDevices.Add(0x10024C4E,@"216lo sasa25"); - //mDevices.Add(0x10024C50,@"VEN_1002&DEV_4C50&SUBSYS_4C501002&REV_DC"); - //mDevices.Add(0x10024C51,@"113"); - //mDevices.Add(0x10024C52,@"1241243"); - //mDevices.Add(0x10024C53,@"216L0SASA25"); - //mDevices.Add(0x10024C54,@"Mach 64 LT"); - //mDevices.Add(0x10024C57,@"fdds"); - //mDevices.Add(0x10024C58,@"FireGL Mobility"); - //mDevices.Add(0x10024C59,@"Mobility 6"); - //mDevices.Add(0x10024C5A,@"Radeon Mobility M6 LZ"); - //mDevices.Add(0x10024C64,@"Radeon Mobility M9-GL"); - //mDevices.Add(0x10024C66,@"ATI MOBILITY RADEON 9000 (Microsoft Corporation -"); - //mDevices.Add(0x10024D46,@"ATI mobility128"); - //mDevices.Add(0x10024D4C,@"Rage Mobility 128 AGP"); - //mDevices.Add(0x10024D52,@"ATI Theater 550 Pro"); - //mDevices.Add(0x10024E44,@"R300"); - //mDevices.Add(0x10024E45,@"R300"); - //mDevices.Add(0x10024E47,@"ATI Fire GL X1/Z1 Video Accelerator"); - //mDevices.Add(0x10024E48,@"R360"); - //mDevices.Add(0x10024E49,@"R350"); - //mDevices.Add(0x10024E4A,@"R360"); - //mDevices.Add(0x10024E4B,@"FGL9800XT"); - //mDevices.Add(0x10024E50,@"RV360M10"); - //mDevices.Add(0x10024E54,@"RV350-WS"); - //mDevices.Add(0x10024E64,@"R300"); - //mDevices.Add(0x10024E65,@"R300"); - //mDevices.Add(0x10024E67,@"Fire GL X1/Z1 AGP [Pro] Secondary Video"); - //mDevices.Add(0x10024E68,@"R350"); - //mDevices.Add(0x10024E69,@"R350"); - //mDevices.Add(0x10024E6A,@"R350"); - //mDevices.Add(0x10024E6B,@"FGL9800XT"); - //mDevices.Add(0x10025041,@"gt"); - //mDevices.Add(0x10025042,@"Rage 128 Pro PB AGP 2x"); - //mDevices.Add(0x10025043,@"1231324445"); - //mDevices.Add(0x10025044,@"rv100"); - //mDevices.Add(0x10025045,@"Rage 128 Pro PE AGP 2x"); - //mDevices.Add(0x10025046,@"5046"); - //mDevices.Add(0x10025047,@"215R3BUA22"); - //mDevices.Add(0x10025048,@"Rage 128 Pro PH AGP"); - //mDevices.Add(0x10025049,@"bk2.0.2.vr001.001.002.002.004.025.prt3.ty.t"); - //mDevices.Add(0x1002504A,@"Rage 128 Pro PJ PCI"); - //mDevices.Add(0x1002504B,@"Rage 128 Pro PK AGP"); - //mDevices.Add(0x1002504C,@"Rage 128 Pro PL AGP"); - //mDevices.Add(0x1002504D,@"Rage 128 Pro PM PCI"); - //mDevices.Add(0x1002504E,@"Rage 128 Pro PN AGP"); - //mDevices.Add(0x1002504F,@"Rage 128 Pro PO AGP"); - //mDevices.Add(0x10025050,@"Scheda Grafica Standard PCI(VGA)"); - //mDevices.Add(0x10025051,@"Rage 128 Pro PQ AGP"); - //mDevices.Add(0x10025052,@"Rage 128 Pro PR AGP"); - //mDevices.Add(0x10025053,@"Rage 128 Pro PS PCI"); - //mDevices.Add(0x10025054,@"Rage 128 Pro PT AGP"); - //mDevices.Add(0x10025055,@"rage 128 pro agp 4x tmds"); - //mDevices.Add(0x10025056,@"Rage 128 Pro PV PCI"); - //mDevices.Add(0x10025057,@"Rage 128 Pro PW AGP"); - //mDevices.Add(0x10025058,@"Rage 128 Pro"); - //mDevices.Add(0x10025144,@"Radeon 7200 QD SDR/DDR"); - //mDevices.Add(0x10025145,@"Radeon QE"); - //mDevices.Add(0x10025146,@"Radeon QF"); - //mDevices.Add(0x10025147,@"Radeon QG"); - //mDevices.Add(0x10025148,@"R200"); - //mDevices.Add(0x10025149,@"Radeon R200 QI"); - //mDevices.Add(0x1002514A,@"Radeon R200 QJ"); - //mDevices.Add(0x1002514B,@"Radeon R200 QK"); - //mDevices.Add(0x1002514C,@"R200"); - //mDevices.Add(0x1002514D,@"R200"); - //mDevices.Add(0x1002514E,@"Radeon R200 QM"); - //mDevices.Add(0x1002514F,@"Radeon R200 QN"); - //mDevices.Add(0x10025157,@"RV200"); - //mDevices.Add(0x10025158,@"radeon 9700 or 9200"); - //mDevices.Add(0x10025159,@"RV100"); - //mDevices.Add(0x1002515A,@"Radeon VE QZ"); - //mDevices.Add(0x1002515E,@"Radeon ES1000"); - //mDevices.Add(0x10025168,@"Radeon R200 Qh"); - //mDevices.Add(0x10025169,@"Radeon R200 Qi"); - //mDevices.Add(0x1002516A,@"Radeon R200 Qj"); - //mDevices.Add(0x1002516B,@"Radeon R200 Qk"); - //mDevices.Add(0x1002516C,@"E7505"); - //mDevices.Add(0x1002516D,@"R200"); - //mDevices.Add(0x10025245,@"215R46ASA22"); - //mDevices.Add(0x10025246,@"Rage 128 PRO"); - //mDevices.Add(0x10025247,@"Rage 128 RG"); - //mDevices.Add(0x1002524B,@"g01080-108"); - //mDevices.Add(0x1002524C,@"Rage 128 VR RL AGP 2x"); - //mDevices.Add(0x10025345,@"Rage 128 4x SE PCI"); - //mDevices.Add(0x10025346,@"Rage 128 SF 4x AGP 2x"); - //mDevices.Add(0x10025347,@"Rage 128 SG 4x AGP 4x"); - //mDevices.Add(0x10025348,@"Rage 128 4x SH"); - //mDevices.Add(0x1002534B,@"Rage 128 SK PCI"); - //mDevices.Add(0x1002534C,@"Rage 128 SL AGP 2x"); - //mDevices.Add(0x1002534D,@"Rage 128 SM AGP 4x"); - //mDevices.Add(0x1002534E,@"Rage 128 4x"); - //mDevices.Add(0x10025354,@"Mach 64 ST"); - //mDevices.Add(0x10025446,@"Rage 128 PRO ULTRA"); - //mDevices.Add(0x1002544C,@"Rage 128 Pro TL"); - //mDevices.Add(0x10025452,@"Rage 128 Pro TR"); - //mDevices.Add(0x10025455,@"Rage 128 Pro Ultra TU"); - //mDevices.Add(0x10025460,@"RV370"); - //mDevices.Add(0x1002554D,@"R430"); - //mDevices.Add(0x10025551,@"R423GL-SE"); - //mDevices.Add(0x1002556D,@"R430"); - //mDevices.Add(0x10025571,@"R423GL-SE"); - //mDevices.Add(0x10025653,@"R410"); - //mDevices.Add(0x10025654,@"215VT2CA42"); - //mDevices.Add(0x10025655,@"Mach 64 VT3"); - //mDevices.Add(0x10025656,@"Mach 64 VT4 PCI"); - //mDevices.Add(0x10025830,@"RS300"); - //mDevices.Add(0x10025831,@"RS300"); - //mDevices.Add(0x10025832,@"RS300"); - //mDevices.Add(0x10025833,@"Radeon 9100 IGP"); - //mDevices.Add(0x10025834,@"RS300"); - //mDevices.Add(0x10025835,@"RS300"); - //mDevices.Add(0x10025838,@"Radeon 9100 IGP"); - //mDevices.Add(0x10025940,@"RV280"); - //mDevices.Add(0x10025941,@"RV280"); - //mDevices.Add(0x10025954,@"na"); - //mDevices.Add(0x10025955,@"???"); - //mDevices.Add(0x10025960,@"RV280"); - //mDevices.Add(0x10025961,@"RV280"); - //mDevices.Add(0x10025964,@"Radeon 9200"); - //mDevices.Add(0x10025965,@"Nvidia"); - //mDevices.Add(0x10025975,@"Radeon Xpress 1100"); - //mDevices.Add(0x10025A33,@"RC410"); - //mDevices.Add(0x10025A42,@"X200M"); - //mDevices.Add(0x10025A61,@"Radeon XPress 200 (RC410)"); - //mDevices.Add(0x10025A62,@"RC410M"); - //mDevices.Add(0x10025B63,@"Unknown"); - //mDevices.Add(0x10025B64,@"RV370GL"); - //mDevices.Add(0x10025B70,@"RADEON X300"); - //mDevices.Add(0x10025C61,@"bk-ati ver008.016m.085.006"); - //mDevices.Add(0x10025C63,@"RV280 (M9+)"); - //mDevices.Add(0x10025D44,@"RV280"); - //mDevices.Add(0x10025D45,@"RV280"); - //mDevices.Add(0x1002700F,@"A3/U1"); - //mDevices.Add(0x10027010,@"RS200"); - //mDevices.Add(0x10027109,@"R520"); - //mDevices.Add(0x10027142,@"N/A"); - //mDevices.Add(0x10027145,@"x1400"); - //mDevices.Add(0x10027146,@"N/A"); - //mDevices.Add(0x10027149,@"216CZJAKA12FAG"); - //mDevices.Add(0x10027152,@"Fire GL v3300"); - //mDevices.Add(0x10027183,@"RV505"); - //mDevices.Add(0x10027186,@"Mobility Radeon X1450"); - //mDevices.Add(0x10027187,@"Radeon 1300"); - //mDevices.Add(0x10027188,@"Mobility X2300"); - //mDevices.Add(0x100271A1,@"ati graphics"); - //mDevices.Add(0x100271A3,@"X1300"); - //mDevices.Add(0x100271A7,@"Radeon 1300"); - //mDevices.Add(0x10027249,@"ati 1900"); - //mDevices.Add(0x1002724B,@"180636911721"); - //mDevices.Add(0x10027280,@"Radeon X1950 Pro"); - //mDevices.Add(0x100272A0,@"Radeon X1950 Pro Secondary"); - //mDevices.Add(0x10027833,@"RS350"); - //mDevices.Add(0x1002791F,@"RS690"); - //mDevices.Add(0x10027942,@"ATI XPress 1250M"); - //mDevices.Add(0x10029400,@"R600"); - //mDevices.Add(0x100294C1,@"REV_00"); - //mDevices.Add(0x100294C3,@"RV610"); - //mDevices.Add(0x100294C4,@"RV610"); - //mDevices.Add(0x10029501,@"RV670"); - //mDevices.Add(0x10029581,@"634866"); - //mDevices.Add(0x10029587,@" Radeon hd 2600 pro (agp)"); - //mDevices.Add(0x10029588,@"RV630"); - //mDevices.Add(0x10029589,@"RV630"); - //mDevices.Add(0x10029610,@"780G"); - //mDevices.Add(0x10029876,@"ATI GTC (GT-C2U2)"); - //mDevices.Add(0x1002AA01,@"Ati Function driver for high definition audio - AT"); - //mDevices.Add(0x1002AA20,@"RV630"); - //mDevices.Add(0x1002CAB0,@"A3/U1"); - //mDevices.Add(0x1002CAB1,@"A3/U1"); - //mDevices.Add(0x1002CBB2,@"RS200"); - //mDevices.Add(0x10030201,@"0x0201"); - //mDevices.Add(0x10040005,@"82C591/2-FC1"); - //mDevices.Add(0x10040006,@"82C593"); - //mDevices.Add(0x10040007,@"82C594"); - //mDevices.Add(0x10040008,@"82C596/597"); - //mDevices.Add(0x10040009,@"82C597-AFC2"); - //mDevices.Add(0x1004000C,@"82C541"); - //mDevices.Add(0x1004000D,@"82C543"); - //mDevices.Add(0x10040100,@"dtdftdfz"); - //mDevices.Add(0x10040101,@"82C532"); - //mDevices.Add(0x10040102,@"82C534"); - //mDevices.Add(0x10040103,@"82C538"); - //mDevices.Add(0x10040104,@"82C535"); - //mDevices.Add(0x10040105,@"82C147"); - //mDevices.Add(0x10040200,@"82C975"); - //mDevices.Add(0x10040280,@"82C925"); - //mDevices.Add(0x10040304,@"SAA7785"); - //mDevices.Add(0x10040305,@"SAA7785"); - //mDevices.Add(0x10040306,@"SAA7785"); - //mDevices.Add(0x10040307,@"KTX0208X"); - //mDevices.Add(0x10040308,@"Philips PSC705 GamePort Enumerator"); - //mDevices.Add(0x10040702,@"VAS96011"); - //mDevices.Add(0x100B0001,@"DP83810"); - //mDevices.Add(0x100B0002,@"PC87415"); - //mDevices.Add(0x100B000E,@"PC87560"); - //mDevices.Add(0x100B000F,@"CS4210"); - //mDevices.Add(0x100B0011,@"PC87560"); - //mDevices.Add(0x100B0012,@"USB Controller"); - //mDevices.Add(0x100B001B,@"LM4560"); - //mDevices.Add(0x100B0020,@"DP83815/16"); - //mDevices.Add(0x100B0021,@"PC82440"); - //mDevices.Add(0x100B0022,@"DP83820/1"); - //mDevices.Add(0x100B0028,@"Geode GX2"); - //mDevices.Add(0x100B002A,@"CS5535"); - //mDevices.Add(0x100B002D,@"5535"); - //mDevices.Add(0x100B002E,@"Castle ()"); - //mDevices.Add(0x100B002F,@"Geode"); - //mDevices.Add(0x100B0030,@"NSC"); - //mDevices.Add(0x100B0500,@"SCx200"); - //mDevices.Add(0x100B0501,@"SCx200"); - //mDevices.Add(0x100B0502,@"SC1100/SCx200"); - //mDevices.Add(0x100B0503,@"SC1100/SCx200"); - //mDevices.Add(0x100B0504,@"SCx200"); - //mDevices.Add(0x100B0505,@"SCx200"); - //mDevices.Add(0x100B0510,@"SC1100"); - //mDevices.Add(0x100B0511,@"SC1100"); - //mDevices.Add(0x100B0515,@"SC1100"); - //mDevices.Add(0x100BD001,@"M2764AFI"); - //mDevices.Add(0x100C3202,@"ET4000W32P-A"); - //mDevices.Add(0x100C3205,@"ET4000W32P-B"); - //mDevices.Add(0x100C3206,@"ET4000W32P-C"); - //mDevices.Add(0x100C3207,@"ET4000W32P-D"); - //mDevices.Add(0x100C3208,@"ET6000"); - //mDevices.Add(0x100C4702,@"ET6300"); - //mDevices.Add(0x100E0564,@"STPC Client"); - //mDevices.Add(0x100E55CC,@"STPC Client"); - //mDevices.Add(0x100E9000,@"P9000"); - //mDevices.Add(0x100E9001,@"P9000"); - //mDevices.Add(0x100E9100,@"P9100"); - //mDevices.Add(0x10110001,@"DC21050"); - //mDevices.Add(0x10110002,@"DC21040"); - //mDevices.Add(0x10110004,@"DC21030"); - //mDevices.Add(0x10110007,@"Zephyr"); - //mDevices.Add(0x10110008,@"KZPSA"); - //mDevices.Add(0x10110009,@"DC21140"); - //mDevices.Add(0x1011000A,@"DC21230"); - //mDevices.Add(0x1011000C,@"1011"); - //mDevices.Add(0x1011000D,@"TGA2"); - //mDevices.Add(0x1011000F,@"DEFPA"); - //mDevices.Add(0x10110014,@"DC21041"); - //mDevices.Add(0x10110016,@"DGLPB"); - //mDevices.Add(0x10110019,@"DC21142/3"); - //mDevices.Add(0x10110021,@"21052[-AB]"); - //mDevices.Add(0x10110022,@"DC21150-AA"); - //mDevices.Add(0x10110023,@"DC21150"); - //mDevices.Add(0x10110024,@"DC21151/2"); - //mDevices.Add(0x10110025,@"21153"); - //mDevices.Add(0x10110026,@"21154"); - //mDevices.Add(0x10110034,@"Modem56"); - //mDevices.Add(0x10110045,@"DC21553"); - //mDevices.Add(0x10110046,@"21554"); - //mDevices.Add(0x10111065,@"21285"); - //mDevices.Add(0x10112000,@"3X-KPCON-AA"); - //mDevices.Add(0x10130038,@"FW82371EB"); - //mDevices.Add(0x10130040,@"CL-GD7555"); - //mDevices.Add(0x1013004C,@"CL-GD7556"); - //mDevices.Add(0x101300A0,@"CL-GD5440"); - //mDevices.Add(0x101300A2,@"CL-GD5432"); - //mDevices.Add(0x101300A4,@"CL-GD5434"); - //mDevices.Add(0x101300A8,@"CL-GD5434"); - //mDevices.Add(0x101300AC,@"CL-GD5426"); - //mDevices.Add(0x101300B8,@"CL-GD5446"); - //mDevices.Add(0x101300BC,@"CL-GD5480"); - //mDevices.Add(0x101300D0,@"CL-GD5462"); - //mDevices.Add(0x101300D4,@"CL-GD5455"); - //mDevices.Add(0x101300D5,@"CL-GD5464"); - //mDevices.Add(0x101300D6,@"CL-GD5465"); - //mDevices.Add(0x101300E8,@"CL-GD5436U"); - //mDevices.Add(0x10131013,@"cs4630cm"); - //mDevices.Add(0x10131100,@"CL-PD6729"); - //mDevices.Add(0x10131110,@"CL-PD6832"); - //mDevices.Add(0x10131112,@"CL-PD6834"); - //mDevices.Add(0x10131113,@"CL-PD6833"); - //mDevices.Add(0x10131200,@"CL-GD7542"); - //mDevices.Add(0x10131202,@"CL-GD7543"); - //mDevices.Add(0x10131204,@"CL-GD7541"); - //mDevices.Add(0x10134000,@"1085"); - //mDevices.Add(0x10134400,@"CL-CD4400"); - //mDevices.Add(0x10136001,@"CS4610/4611"); - //mDevices.Add(0x10136003,@"CS4614/22/24/"); - //mDevices.Add(0x10136004,@"CS464"); - //mDevices.Add(0x10136005,@"CS4280/4297x"); - //mDevices.Add(0x10139876,@"cirrus logic crystal CS 4614"); - //mDevices.Add(0x10140002,@"MCA Bridge"); - //mDevices.Add(0x10140005,@"Alta Lite"); - //mDevices.Add(0x10140007,@"Alta MP"); - //mDevices.Add(0x1014000A,@"Fire Coral"); - //mDevices.Add(0x10140017,@"CPU to PCI Bridge"); - //mDevices.Add(0x10140018,@"Auto LANStreamer"); - //mDevices.Add(0x1014001B,@"GXT-150P"); - //mDevices.Add(0x1014001D,@"82G2675"); - //mDevices.Add(0x10140020,@"MCA Bridge"); - //mDevices.Add(0x10140022,@"82351/2"); - //mDevices.Add(0x1014002D,@"Python"); - //mDevices.Add(0x1014002E,@"ServeRAID I/II/3x/4H"); - //mDevices.Add(0x10140036,@"Miami/PCI"); - //mDevices.Add(0x10140037,@"IBM27-82660"); - //mDevices.Add(0x1014003A,@"CPU to PCI Bridge"); - //mDevices.Add(0x1014003E,@"85H9533"); - //mDevices.Add(0x10140045,@"SSA Adapter"); - //mDevices.Add(0x10140046,@"MPIC"); - //mDevices.Add(0x10140047,@"PCI to PCI Bridge"); - //mDevices.Add(0x10140048,@"PCI to PCI Bridge"); - //mDevices.Add(0x10140049,@"Warhead SCSI Controller"); - //mDevices.Add(0x1014004D,@"IBM 3780IDSP"); - //mDevices.Add(0x1014004E,@"ATM Controller"); - //mDevices.Add(0x1014004F,@"ATM Controller"); - //mDevices.Add(0x10140050,@"ATM Controller"); - //mDevices.Add(0x10140053,@"85h9533"); - //mDevices.Add(0x10140057,@"85g1897"); - //mDevices.Add(0x1014005C,@"i82557B"); - //mDevices.Add(0x1014005D,@"05J3506"); - //mDevices.Add(0x1014007C,@"ATM Controller"); - //mDevices.Add(0x1014007D,@"3780IDSP"); - //mDevices.Add(0x10140090,@"GXT-3000P"); - //mDevices.Add(0x10140095,@"20H2999"); - //mDevices.Add(0x10140096,@"Chukar chipset SCSI Controller"); - //mDevices.Add(0x101400A1,@"PowerNP NPr2.7"); - //mDevices.Add(0x101400A5,@"ATM Controller"); - //mDevices.Add(0x101400A6,@"ATM 155Mbps MM Controller"); - //mDevices.Add(0x101400B7,@"GXT2000"); - //mDevices.Add(0x101400BE,@"ATM 622Mbps Controller"); - //mDevices.Add(0x101400CE,@"02li537"); - //mDevices.Add(0x101400F9,@"CPC700"); - //mDevices.Add(0x101400FC,@"CPC710"); - //mDevices.Add(0x10140105,@"CPC710"); - //mDevices.Add(0x1014010F,@"Remote Supervisor+Serial Port+Mouse/Keyb"); - //mDevices.Add(0x1014011B,@"Raid controller"); - //mDevices.Add(0x10140142,@"Yotta"); - //mDevices.Add(0x10140144,@"Yotta"); - //mDevices.Add(0x10140156,@"405GP"); - //mDevices.Add(0x10140170,@"RC1000"); - //mDevices.Add(0x10140188,@"PCI Bridge"); - //mDevices.Add(0x101401A7,@"IBM 133"); - //mDevices.Add(0x101401BD,@"ServeRAID 4/5"); - //mDevices.Add(0x1014027F,@"440GX"); - //mDevices.Add(0x10140295,@"NECSCE 11508082"); - //mDevices.Add(0x10140297,@"NECSCE 11508082"); - //mDevices.Add(0x10140302,@"PCI-X Host Bridge"); - //mDevices.Add(0x1014FFFF,@"MPIC 2"); - //mDevices.Add(0x10175343,@"v7-mpeg modul"); - //mDevices.Add(0x10191B10,@"sis-648D"); - //mDevices.Add(0x101A0005,@"8156"); - //mDevices.Add(0x101A0009,@"Altera FLEX"); - //mDevices.Add(0x101E9010,@"MegaRAID 428"); - //mDevices.Add(0x101E9030,@"EIDE Controller"); - //mDevices.Add(0x101E9031,@"EIDE Controller"); - //mDevices.Add(0x101E9032,@"IDE and SCSI Cntrlr"); - //mDevices.Add(0x101E9033,@"I960"); - //mDevices.Add(0x101E9040,@"Multimedia card"); - //mDevices.Add(0x101E9060,@"MegaRAID 434"); - //mDevices.Add(0x101E9063,@"MegaRAC"); - //mDevices.Add(0x10221100,@"Athlon 64 / Opteron"); - //mDevices.Add(0x10221101,@"Athlon 64 / Opteron"); - //mDevices.Add(0x10221102,@"Athlon 64 / Opteron"); - //mDevices.Add(0x10221103,@"Athlon 64 / Opteron"); - //mDevices.Add(0x10222000,@"Am79C970/1/2/3/5/6"); - //mDevices.Add(0x10222001,@"Am79C978"); - //mDevices.Add(0x10222003,@"Am1772"); - //mDevices.Add(0x10222020,@"Am53C974"); - //mDevices.Add(0x10222040,@"Am79C974"); - //mDevices.Add(0x10222081,@"Unknown"); - //mDevices.Add(0x10222082,@"GX3"); - //mDevices.Add(0x1022208F,@"CS5536"); - //mDevices.Add(0x10222093,@"CS5536"); - //mDevices.Add(0x10222094,@"CS5536"); - //mDevices.Add(0x10222095,@"CS5536"); - //mDevices.Add(0x10222096,@"Number: CS5536"); - //mDevices.Add(0x10222097,@"CS5536"); - //mDevices.Add(0x1022209A,@"CS5536"); - //mDevices.Add(0x10223000,@"SC520"); - //mDevices.Add(0x10227004,@"AMD-751"); - //mDevices.Add(0x10227006,@"AMD-751"); - //mDevices.Add(0x10227007,@"AMD-751"); - //mDevices.Add(0x1022700A,@"AMD-IGR4"); - //mDevices.Add(0x1022700B,@"AMD-IGR4"); - //mDevices.Add(0x1022700C,@"AMD-762"); - //mDevices.Add(0x1022700D,@"AMD-762"); - //mDevices.Add(0x1022700E,@"AMD-761"); - //mDevices.Add(0x1022700F,@"AMD-761"); - //mDevices.Add(0x10227400,@"AMD-755"); - //mDevices.Add(0x10227401,@"AMD-755"); - //mDevices.Add(0x10227403,@"AMD-755"); - //mDevices.Add(0x10227404,@"AMD-755"); - //mDevices.Add(0x10227408,@"AMD-756"); - //mDevices.Add(0x10227409,@"AMD-756"); - //mDevices.Add(0x1022740B,@"AMD-756"); - //mDevices.Add(0x1022740C,@"AMD-756"); - //mDevices.Add(0x10227410,@"AMD-766"); - //mDevices.Add(0x10227411,@"AMD-766"); - //mDevices.Add(0x10227412,@"AMD-766"); - //mDevices.Add(0x10227413,@"AMD-766"); - //mDevices.Add(0x10227414,@"AMD-766"); - //mDevices.Add(0x10227440,@"AMD-768"); - //mDevices.Add(0x10227441,@"AMD-768"); - //mDevices.Add(0x10227443,@"AMD-768"); - //mDevices.Add(0x10227445,@"AMD-768"); - //mDevices.Add(0x10227446,@"AMD-768"); - //mDevices.Add(0x10227448,@"AMD-768"); - //mDevices.Add(0x10227449,@"AMD-768"); - //mDevices.Add(0x10227450,@"AMD-8131"); - //mDevices.Add(0x10227451,@"AMD-8131"); - //mDevices.Add(0x10227454,@"AMD-8151"); - //mDevices.Add(0x10227455,@"AMD-8151"); - //mDevices.Add(0x10227458,@"AMD-8132"); - //mDevices.Add(0x10227459,@"AMD-8132"); - //mDevices.Add(0x10227460,@"AMD-8111"); - //mDevices.Add(0x10227461,@"AMD-8111"); - //mDevices.Add(0x10227462,@"AMD-8111"); - //mDevices.Add(0x10227463,@"AMD-8111"); - //mDevices.Add(0x10227464,@"AMD-8111"); - //mDevices.Add(0x10227468,@"AMD-8111"); - //mDevices.Add(0x10227469,@"AMD-8111"); - //mDevices.Add(0x1022746A,@"AMD-8111"); - //mDevices.Add(0x1022746B,@"AMD-8111"); - //mDevices.Add(0x1022746D,@"c-media cmi8738"); - //mDevices.Add(0x1022746E,@"AMD-8111"); - //mDevices.Add(0x1022756B,@"AMD-8111"); - //mDevices.Add(0x10230194,@"82C194"); - //mDevices.Add(0x10232000,@"4DWAVE-DX"); - //mDevices.Add(0x10232001,@"4D WAVE DX SOUND ACCELERATOR"); - //mDevices.Add(0x10232100,@"Cyber-XP4"); - //mDevices.Add(0x10232200,@"Volari V3"); - //mDevices.Add(0x10238400,@"CyberBlade i7"); - //mDevices.Add(0x10238420,@"51331071"); - //mDevices.Add(0x10238500,@"Cyber"); - //mDevices.Add(0x10238520,@"Trident Video Accelerator CyberBlade i1"); - //mDevices.Add(0x10238620,@"CyberBlade-i1"); - //mDevices.Add(0x10238820,@"CyberBlade XP"); - //mDevices.Add(0x10239320,@"TGUI9320"); - //mDevices.Add(0x10239350,@"TGUI9350"); - //mDevices.Add(0x10239360,@"Flat panel Cntrlr"); - //mDevices.Add(0x10239382,@"Cyber9382"); - //mDevices.Add(0x10239383,@"Cyber9383"); - //mDevices.Add(0x10239385,@"Cyber9385"); - //mDevices.Add(0x10239386,@"Cyber9386"); - //mDevices.Add(0x10239388,@"Cyber9388"); - //mDevices.Add(0x10239397,@"Cyber9397"); - //mDevices.Add(0x1023939A,@"Cyber9397DVD"); - //mDevices.Add(0x10239420,@"TGUI9420"); - //mDevices.Add(0x10239430,@"TGUI9430"); - //mDevices.Add(0x10239440,@"TGUI9682"); - //mDevices.Add(0x10239460,@"TGUI9460"); - //mDevices.Add(0x10239470,@"TGUI9470"); - //mDevices.Add(0x10239520,@"Cyber9520"); - //mDevices.Add(0x10239525,@"Cyber9525"); - //mDevices.Add(0x10239540,@"Cyber9540"); - //mDevices.Add(0x10239660,@"TGUI9660XGi"); - //mDevices.Add(0x10239680,@"TGUI9680"); - //mDevices.Add(0x10239682,@"TGUI9682"); - //mDevices.Add(0x10239683,@"TGUI9683"); - //mDevices.Add(0x10239685,@"ProVIDIA 9685"); - //mDevices.Add(0x10239750,@"3DImage 9750 PCI/AGP"); - //mDevices.Add(0x10239753,@"TGUI9753"); - //mDevices.Add(0x10239754,@"TGUI9753"); - //mDevices.Add(0x10239759,@"TGUI975?"); - //mDevices.Add(0x10239783,@"TGUI9783"); - //mDevices.Add(0x10239785,@"TGUI9785"); - //mDevices.Add(0x10239850,@"3D Image 9850 AGP"); - //mDevices.Add(0x10239880,@"Blade 3D 9880"); - //mDevices.Add(0x10239910,@"00011178"); - //mDevices.Add(0x10239930,@"CyberBlade XPm"); - //mDevices.Add(0x10239960,@"9960"); - //mDevices.Add(0x10250028,@"AC97 ID:SIL REV:0x27, 08"); - //mDevices.Add(0x10251435,@"M1435"); - //mDevices.Add(0x10251445,@"M1445"); - //mDevices.Add(0x10251449,@"M1449"); - //mDevices.Add(0x10251451,@"M1451"); - //mDevices.Add(0x10251461,@"M1461"); - //mDevices.Add(0x10251489,@"M1489"); - //mDevices.Add(0x10251511,@"M1511"); - //mDevices.Add(0x10251512,@"M1512"); - //mDevices.Add(0x10251513,@"M1513"); - //mDevices.Add(0x10251521,@"M1521"); - //mDevices.Add(0x10251523,@"M1523"); - //mDevices.Add(0x10251531,@"M1531"); - //mDevices.Add(0x10251533,@"M1533"); - //mDevices.Add(0x10251535,@"M1535"); - //mDevices.Add(0x10251541,@"M1541"); - //mDevices.Add(0x10251542,@"M1542"); - //mDevices.Add(0x10251543,@"M1543C"); - //mDevices.Add(0x10251561,@"M1561"); - //mDevices.Add(0x10251621,@"M1621"); - //mDevices.Add(0x10251631,@"M1631"); - //mDevices.Add(0x10251641,@"M1641"); - //mDevices.Add(0x10253141,@"M3141"); - //mDevices.Add(0x10253143,@"M3143"); - //mDevices.Add(0x10253145,@"M3145"); - //mDevices.Add(0x10253147,@"M3147"); - //mDevices.Add(0x10253149,@"M3149"); - //mDevices.Add(0x10253151,@"M3151"); - //mDevices.Add(0x10253307,@"M3307"); - //mDevices.Add(0x10253309,@"M3309"); - //mDevices.Add(0x10255212,@"M4803"); - //mDevices.Add(0x10255215,@"M5217"); - //mDevices.Add(0x10255217,@"M5217"); - //mDevices.Add(0x10255219,@"M5219"); - //mDevices.Add(0x10255225,@"M5225"); - //mDevices.Add(0x10255229,@"M5229"); - //mDevices.Add(0x10255235,@"1025"); - //mDevices.Add(0x10255237,@"M5237"); - //mDevices.Add(0x10255240,@"EIDE Controller"); - //mDevices.Add(0x10255241,@"PCMCIA Bridge"); - //mDevices.Add(0x10255242,@"General Purpose Controller"); - //mDevices.Add(0x10255243,@"PCI to PCI Bridge"); - //mDevices.Add(0x10255244,@"Floppy Disk Controller"); - //mDevices.Add(0x10255247,@"M1541"); - //mDevices.Add(0x10255427,@"PCI to AGP Bridge"); - //mDevices.Add(0x10255451,@"M5451"); - //mDevices.Add(0x10255453,@"M5453"); - //mDevices.Add(0x10257101,@"M7101"); - //mDevices.Add(0x10280001,@"PowerEdge 2 /Si"); - //mDevices.Add(0x10280002,@"PowerEdge 3/Di"); - //mDevices.Add(0x10280003,@"PowerEdge 3/Si"); - //mDevices.Add(0x10280004,@"PowerEdge 3/Si"); - //mDevices.Add(0x10280005,@"PowerEdge 3/Di"); - //mDevices.Add(0x10280006,@"PowerEdge 3/Di"); - //mDevices.Add(0x10280007,@"Remote Assistant Card"); - //mDevices.Add(0x10280008,@"PowerEdge 3/Di"); - //mDevices.Add(0x1028000A,@"PowerEdge 3/Di"); - //mDevices.Add(0x1028000C,@"Embedded Systems Management Device 4"); - //mDevices.Add(0x1028000E,@"000E"); - //mDevices.Add(0x10280011,@"DRAC4"); - //mDevices.Add(0x10280012,@"DRAC4-UART"); - //mDevices.Add(0x10280013,@"PERC 4e/Si and PERC 4e/Di"); - //mDevices.Add(0x10280014,@"DRAC4-0"); - //mDevices.Add(0x10280015,@"PERC 5/i RAID Controller"); - //mDevices.Add(0x10280287,@"DELL PERC 320/DC"); - //mDevices.Add(0x10281000,@"FA82537EP"); - //mDevices.Add(0x102A0000,@"HYDRA"); - //mDevices.Add(0x102A0010,@"ASPEN"); - //mDevices.Add(0x102B0010,@"MGA-I"); - //mDevices.Add(0x102B0518,@"MGA-PX2085"); - //mDevices.Add(0x102B0519,@"MGA-2064W"); - //mDevices.Add(0x102B051A,@"mga-1164sg-a"); - //mDevices.Add(0x102B051B,@"MGA-2164W"); - //mDevices.Add(0x102B051E,@"MGA-1164SG"); - //mDevices.Add(0x102B051F,@"MGA-200B"); - //mDevices.Add(0x102B0520,@"Matrox lnc MGA-G200B"); - //mDevices.Add(0x102B0521,@"Matrox lnc MGA-G200B"); - //mDevices.Add(0x102B0525,@"MGA G450 Dual Head"); - //mDevices.Add(0x102B0527,@"Parhelia AGP"); - //mDevices.Add(0x102B0528,@"Parhelia"); - //mDevices.Add(0x102B0D10,@"MGA-I"); - //mDevices.Add(0x102B1000,@"MGA-G100"); - //mDevices.Add(0x102B1001,@"MGA-G100"); - //mDevices.Add(0x102B1525,@"Fusion G450 AGP"); - //mDevices.Add(0x102B1527,@"Fusion Plus G800 AGP"); - //mDevices.Add(0x102B2007,@"Mistral"); - //mDevices.Add(0x102B2527,@"MGA-G550"); - //mDevices.Add(0x102B2537,@"Parhelia-LX"); - //mDevices.Add(0x102B2538,@"Matrox Millennium P650 LP PCIe 64"); - //mDevices.Add(0x102B4536,@"Meteor 2 STD/MC/Dig"); - //mDevices.Add(0x102B6573,@"Shark"); - //mDevices.Add(0x102B80A0,@"RT.x10"); - //mDevices.Add(0x102B9876,@"RT 2000"); - //mDevices.Add(0x102C00B8,@"64310"); - //mDevices.Add(0x102C00C0,@"69000"); - //mDevices.Add(0x102C00D0,@"65545"); - //mDevices.Add(0x102C00D8,@"65540"); - //mDevices.Add(0x102C00DC,@"65548"); - //mDevices.Add(0x102C00E0,@"65550"); - //mDevices.Add(0x102C00E4,@"65554"); - //mDevices.Add(0x102C00E5,@"65555"); - //mDevices.Add(0x102C00F0,@"68554"); - //mDevices.Add(0x102C00F4,@"68554"); - //mDevices.Add(0x102C00F5,@"68555"); - //mDevices.Add(0x102C01E0,@"65560"); - //mDevices.Add(0x102C0C30,@"69030"); - //mDevices.Add(0x102D50DC,@"3328"); - //mDevices.Add(0x102F0009,@"r4x00"); - //mDevices.Add(0x102F000A,@"TX3927"); - //mDevices.Add(0x102F0020,@"Meteor 155"); - //mDevices.Add(0x102F0030,@"TC35815CF"); - //mDevices.Add(0x102F0031,@"TX4938"); - //mDevices.Add(0x102F0105,@"TC86C001FG"); - //mDevices.Add(0x102F0106,@"TC86C001FG"); - //mDevices.Add(0x102F0107,@"TC86C001FG"); - //mDevices.Add(0x102F0108,@"TC86C001FG"); - //mDevices.Add(0x102F0180,@"TX4927"); - //mDevices.Add(0x102F0181,@"TX4925"); - //mDevices.Add(0x102F0182,@"TX4937"); - //mDevices.Add(0x10315601,@"MiroVIDEO DC20"); - //mDevices.Add(0x10315607,@"2IVDC-PCX1 1250400 033893932"); - //mDevices.Add(0x10315631,@"Media 3D"); - //mDevices.Add(0x10316057,@"MiroVIDEO DC10/DC30"); - //mDevices.Add(0x10330001,@"upD98409"); - //mDevices.Add(0x10330002,@"PCI to VL98 Bridge"); - //mDevices.Add(0x10330003,@"ATM Controller"); - //mDevices.Add(0x10330004,@"R4000"); - //mDevices.Add(0x10330005,@"PCI to 486 like peripheral bus Bridge"); - //mDevices.Add(0x10330006,@"GUI Accelerator"); - //mDevices.Add(0x10330007,@"unknown from Creative.com"); - //mDevices.Add(0x10330008,@"GUI Accelerator (vga equivalent)"); - //mDevices.Add(0x10330009,@"graphic Cntrlr for 98"); - //mDevices.Add(0x1033001A,@"Nile II"); - //mDevices.Add(0x1033001D,@"uPD98405"); - //mDevices.Add(0x10330021,@"Vrc4373"); - //mDevices.Add(0x10330029,@"PoverVR PCX1"); - //mDevices.Add(0x1033002A,@"PoverVR"); - //mDevices.Add(0x10330035,@"udp9210"); - //mDevices.Add(0x10330036,@"uPD98409"); - //mDevices.Add(0x1033003E,@"uPD66369"); - //mDevices.Add(0x10330046,@"PoverVR PCX2"); - //mDevices.Add(0x1033005A,@"Vrc5074"); - //mDevices.Add(0x10330063,@"uPD72862"); - //mDevices.Add(0x10330067,@"PowerVR Neon 250"); - //mDevices.Add(0x10330074,@"56k Voice Modem"); - //mDevices.Add(0x1033009B,@"Vrc5476"); - //mDevices.Add(0x103300BE,@"VR4122"); - //mDevices.Add(0x103300CD,@"uPD72870"); - //mDevices.Add(0x103300CE,@"uPD72871/2"); - //mDevices.Add(0x103300E0,@"uPD720100A"); - //mDevices.Add(0x103300E7,@"uPD72874"); - //mDevices.Add(0x103300F2,@"D72874GC"); - //mDevices.Add(0x10330520,@"NEC D72874GC"); - //mDevices.Add(0x10360000,@"TMC-18C30"); - //mDevices.Add(0x10390001,@"SiS730"); - //mDevices.Add(0x10390002,@"520"); - //mDevices.Add(0x10390003,@"SiS760"); - //mDevices.Add(0x10390005,@"Pentium chipset"); - //mDevices.Add(0x10390006,@"SiS 85C501"); - //mDevices.Add(0x10390008,@"SiS 85C503"); - //mDevices.Add(0x10390009,@"5595"); - //mDevices.Add(0x10390016,@"SiS961/962"); - //mDevices.Add(0x10390018,@"SiS950"); - //mDevices.Add(0x10390180,@"SiS180"); - //mDevices.Add(0x10390181,@"Raid Controller(?Mode Raid1)"); - //mDevices.Add(0x10390182,@"Raid Controller(?Mode Raid0+1)"); - //mDevices.Add(0x10390183,@"?SIS965"); - //mDevices.Add(0x10390190,@" SiS966L, SiS965L, SiS966, SiS965, SiS968"); - //mDevices.Add(0x10390191,@"SIS191"); - //mDevices.Add(0x10390200,@"SiS5597/98"); - //mDevices.Add(0x10390204,@"SiS 6215"); - //mDevices.Add(0x10390205,@"SiS 6205"); - //mDevices.Add(0x10390300,@"SiS315"); - //mDevices.Add(0x10390305,@"SiS305"); - //mDevices.Add(0x10390315,@"SiS 315"); - //mDevices.Add(0x10390325,@"SiS6330"); - //mDevices.Add(0x10390330,@"SiS330"); - //mDevices.Add(0x10390406,@"85C501"); - //mDevices.Add(0x10390496,@"85C496"); - //mDevices.Add(0x10390530,@"SiS530"); - //mDevices.Add(0x10390540,@"SiS540"); - //mDevices.Add(0x10390550,@"SiS550/1/2"); - //mDevices.Add(0x10390596,@"SiS596"); - //mDevices.Add(0x10390597,@"SiS5513"); - //mDevices.Add(0x10390601,@"SiS83C601"); - //mDevices.Add(0x10390620,@"SiS620"); - //mDevices.Add(0x10390630,@"SiS630"); - //mDevices.Add(0x10390635,@"SiS 635"); - //mDevices.Add(0x10390640,@"SiS 640"); - //mDevices.Add(0x10390645,@"SiS 645"); - //mDevices.Add(0x10390646,@"SiS645DX"); - //mDevices.Add(0x10390648,@"SiS648MX"); - //mDevices.Add(0x10390649,@"sis649"); - //mDevices.Add(0x10390650,@"SiS961"); - //mDevices.Add(0x10390651,@"SiS651"); - //mDevices.Add(0x10390655,@"SiS655"); - //mDevices.Add(0x10390656,@"???"); - //mDevices.Add(0x10390658,@"SiS R658"); - //mDevices.Add(0x10390659,@"SiS R659"); - //mDevices.Add(0x10390660,@"Host-to-PCI Bridge"); - //mDevices.Add(0x10390661,@"SiS 661FX"); - //mDevices.Add(0x10390662,@"???"); - //mDevices.Add(0x10390663,@"???"); - //mDevices.Add(0x10390730,@"SiS 730"); - //mDevices.Add(0x10390735,@"SiS 735"); - //mDevices.Add(0x10390740,@"SiS 740"); - //mDevices.Add(0x10390741,@"SiS741"); - //mDevices.Add(0x10390745,@"SiS745"); - //mDevices.Add(0x10390746,@"SiS746"); - //mDevices.Add(0x10390748,@"SiS748"); - //mDevices.Add(0x10390755,@"SiSM650?"); - //mDevices.Add(0x10390756,@"SiS755FX"); - //mDevices.Add(0x10390760,@"SiS760"); - //mDevices.Add(0x10390761,@"???"); - //mDevices.Add(0x10390762,@"???"); - //mDevices.Add(0x10390900,@"SiS900"); - //mDevices.Add(0x10390901,@"Device ID = 0900 SiS900"); - //mDevices.Add(0x10390962,@"SiS962"); - //mDevices.Add(0x10390963,@"SiS963"); - //mDevices.Add(0x10390964,@"SiS964"); - //mDevices.Add(0x10390999,@"sis950"); - //mDevices.Add(0x10391039,@"SiS5597"); - //mDevices.Add(0x10391182,@"Raid Controller(?Mode Raid5)"); - //mDevices.Add(0x10391183,@"?SIS966/968 "); - //mDevices.Add(0x10391185,@"SIS968"); - //mDevices.Add(0x10393602,@"SiS83C602"); - //mDevices.Add(0x10395107,@"SiS5107"); - //mDevices.Add(0x10395300,@"SiS540"); - //mDevices.Add(0x10395315,@"SiS530/1/2"); - //mDevices.Add(0x10395401,@"SiS5401"); - //mDevices.Add(0x10395511,@"SiS5511/5512"); - //mDevices.Add(0x10395513,@"All SIS SouthBridge"); - //mDevices.Add(0x10395517,@"SiS5517"); - //mDevices.Add(0x10395518,@"SiS5518"); - //mDevices.Add(0x10395571,@"SiS5571"); - //mDevices.Add(0x10395581,@"SiS 5581"); - //mDevices.Add(0x10395582,@"SiS5582"); - //mDevices.Add(0x10395591,@"MTC0001"); - //mDevices.Add(0x10395596,@"SiS5596"); - //mDevices.Add(0x10395597,@"SiS5597"); - //mDevices.Add(0x10395600,@"SiS600"); - //mDevices.Add(0x10395630,@"SiS630"); - //mDevices.Add(0x10396204,@"SiS6204"); - //mDevices.Add(0x10396205,@"SiS6206"); - //mDevices.Add(0x10396225,@"SiS 950 m2284dxs"); - //mDevices.Add(0x10396236,@"SiS6236"); - //mDevices.Add(0x10396300,@"SiS630/730"); - //mDevices.Add(0x10396306,@"SiS530/620"); - //mDevices.Add(0x10396325,@"SiS650"); - //mDevices.Add(0x10396326,@"1039"); - //mDevices.Add(0x10396330,@"SiS661FX/M661FX/760/741/M760/M741"); - //mDevices.Add(0x10397001,@"SiS7001"); - //mDevices.Add(0x10397002,@"SiS7001"); - //mDevices.Add(0x10397005,@"SiS551/2"); - //mDevices.Add(0x10397007,@"OHCI Compliant FireWire Controller"); - //mDevices.Add(0x10397012,@"SiS7012"); - //mDevices.Add(0x10397013,@"SiS7013"); - //mDevices.Add(0x10397015,@"SiS550 dd"); - //mDevices.Add(0x10397016,@"SiS7016"); - //mDevices.Add(0x10397018,@"SiS7018"); - //mDevices.Add(0x10397019,@"SiS550/1/2"); - //mDevices.Add(0x10397300,@"SiS7013"); - //mDevices.Add(0x10399876,@"sis6215"); - //mDevices.Add(0x103C0024,@"Standard Vista USB Keyboard"); - //mDevices.Add(0x103C1005,@"A4977A"); - //mDevices.Add(0x103C1008,@"Donner GFX"); - //mDevices.Add(0x103C100A,@"hpVisualizeFX"); - //mDevices.Add(0x103C1028,@"Tachyon TL Fibre Channel Adapter"); - //mDevices.Add(0x103C1029,@"HPFC-5200B"); - //mDevices.Add(0x103C102A,@"Tach TS"); - //mDevices.Add(0x103C1030,@"J2585A"); - //mDevices.Add(0x103C1031,@"J2585B222"); - //mDevices.Add(0x103C1040,@"J2973A"); - //mDevices.Add(0x103C1041,@"J2585B"); - //mDevices.Add(0x103C1042,@"J2970A"); - //mDevices.Add(0x103C1048,@"SAS"); - //mDevices.Add(0x103C1049,@"DIVA1"); - //mDevices.Add(0x103C104A,@"DIVA2"); - //mDevices.Add(0x103C104B,@"SP2"); - //mDevices.Add(0x103C104D,@"J3242A"); - //mDevices.Add(0x103C1064,@"79C970"); - //mDevices.Add(0x103C10C1,@"NetServer Smart IRQ Router"); - //mDevices.Add(0x103C10ED,@"TopTools"); - //mDevices.Add(0x103C1200,@"82557B"); - //mDevices.Add(0x103C1219,@"NetServer PCI Hot-Plug Controller"); - //mDevices.Add(0x103C121A,@"NetServer SMIC Controller"); - //mDevices.Add(0x103C121B,@"NetServer Legacy COM Port Decoder"); - //mDevices.Add(0x103C121C,@"NetServer PCI COM Port Decoder"); - //mDevices.Add(0x103C1229,@"zx1"); - //mDevices.Add(0x103C122A,@"zx1"); - //mDevices.Add(0x103C122B,@"zx1"); - //mDevices.Add(0x103C12FA,@"Broadcom BCM4306"); - //mDevices.Add(0x103C2910,@"E2910A"); - //mDevices.Add(0x103C2920,@"Fast Host Interface"); - //mDevices.Add(0x103C2924,@"E2924A"); - //mDevices.Add(0x103C2925,@"E2925A"); - //mDevices.Add(0x103C2926,@"E2926A"); - //mDevices.Add(0x103C2927,@"E2927A"); - //mDevices.Add(0x103C2940,@"E2940A"); - //mDevices.Add(0x103C3206,@"unknown"); - //mDevices.Add(0x103C3220,@"P600"); - //mDevices.Add(0x103C3230,@"Smart Array P400 Controller"); - //mDevices.Add(0x103C3302,@"3305103C"); - //mDevices.Add(0x103C5461,@"unknown"); - //mDevices.Add(0x10430675,@"6600"); - //mDevices.Add(0x10441012,@"Domino"); - //mDevices.Add(0x1044A400,@"2124A/9X"); - //mDevices.Add(0x1044A500,@"PCI Bridge"); - //mDevices.Add(0x1044A501,@"I2O SmartRAID V Controller"); - //mDevices.Add(0x1044A511,@"Raptor"); - //mDevices.Add(0x1045A0F8,@"82C750"); - //mDevices.Add(0x1045C101,@"82C264"); - //mDevices.Add(0x1045C178,@"82C178"); - //mDevices.Add(0x1045C556,@"82C556"); - //mDevices.Add(0x1045C557,@"82C557"); - //mDevices.Add(0x1045C558,@"82C558"); - //mDevices.Add(0x1045C567,@"82C750"); - //mDevices.Add(0x1045C568,@"82C750"); - //mDevices.Add(0x1045C569,@"82C579"); - //mDevices.Add(0x1045C621,@"82C621"); - //mDevices.Add(0x1045C700,@"82C700"); - //mDevices.Add(0x1045C701,@"82C701"); - //mDevices.Add(0x1045C814,@"82C814"); - //mDevices.Add(0x1045C822,@"82C822"); - //mDevices.Add(0x1045C824,@"82C824"); - //mDevices.Add(0x1045C825,@"82C825 function 0"); - //mDevices.Add(0x1045C832,@"82C832"); - //mDevices.Add(0x1045C861,@"82C861"); - //mDevices.Add(0x1045C881,@"82C881"); - //mDevices.Add(0x1045C895,@"82C895"); - //mDevices.Add(0x1045C931,@"82C931"); - //mDevices.Add(0x1045C935,@"82C935"); - //mDevices.Add(0x1045D568,@"82C825"); - //mDevices.Add(0x1045D768,@"82C750"); - //mDevices.Add(0x10480253,@"0x0c92"); - //mDevices.Add(0x10480C60,@"Elsa Gladiac MX"); - //mDevices.Add(0x10480C71,@"Elsa Gladiac 721"); - //mDevices.Add(0x10481000,@"Quick Step 1000"); - //mDevices.Add(0x10483000,@"QuickStep 3000"); - //mDevices.Add(0x10488901,@"ELSA GLoria XL"); - //mDevices.Add(0x104A0008,@"STG 2000X"); - //mDevices.Add(0x104A0009,@"STG 1764X"); - //mDevices.Add(0x104A0010,@"STG4000"); - //mDevices.Add(0x104A0209,@"STPC Consmr/Indstrl"); - //mDevices.Add(0x104A020A,@"STPC Atlas/Elite"); - //mDevices.Add(0x104A0210,@"STPC Atlas"); - //mDevices.Add(0x104A021A,@"STPC Consmr-S/Elite"); - //mDevices.Add(0x104A021B,@"STPC Consumer-II"); - //mDevices.Add(0x104A0228,@"STPC Atlas"); - //mDevices.Add(0x104A0230,@"STPC Atlas"); - //mDevices.Add(0x104A0500,@"ST70137"); - //mDevices.Add(0x104A0981,@"10/100 Ethernet Adapter"); - //mDevices.Add(0x104A1746,@"STG 1746X"); - //mDevices.Add(0x104A2774,@"STE10/100A"); - //mDevices.Add(0x104A3520,@"MPEG-II Video Decoder"); - //mDevices.Add(0x104B1040,@"BT958 SCSI Host Adaptor"); - //mDevices.Add(0x104B8130,@"Flashpoint LT"); - //mDevices.Add(0x104C0500,@"TNETE100A/110A/211"); - //mDevices.Add(0x104C0508,@"TI380PCI"); - //mDevices.Add(0x104C1000,@"TI PCI Eagle i/f AS"); - //mDevices.Add(0x104C104C,@"PCI104c"); - //mDevices.Add(0x104C3D04,@"TVP4010"); - //mDevices.Add(0x104C3D07,@"TVP4020"); - //mDevices.Add(0x104C8000,@"TSB12LV21"); - //mDevices.Add(0x104C8009,@"TSB12LV22"); - //mDevices.Add(0x104C8010,@"TSB12LV26"); - //mDevices.Add(0x104C8011,@"PCI4450"); - //mDevices.Add(0x104C8017,@"PCI4410"); - //mDevices.Add(0x104C8019,@"TSB12LV23"); - //mDevices.Add(0x104C8020,@"TSB12LV26"); - //mDevices.Add(0x104C8021,@"TSB43AA22xxx"); - //mDevices.Add(0x104C8023,@"TSB43AB21/A"); - //mDevices.Add(0x104C8024,@"TSB43AB23"); - //mDevices.Add(0x104C8025,@"TSB82AA2"); - //mDevices.Add(0x104C8026,@"TSB43AB21"); - //mDevices.Add(0x104C8027,@"PCI4451"); - //mDevices.Add(0x104C8029,@"040803-2158"); - //mDevices.Add(0x104C8033,@"PCIxx21"); - //mDevices.Add(0x104C8034,@"10981734"); - //mDevices.Add(0x104C8035,@"N/A"); - //mDevices.Add(0x104C8036,@"PCI6515"); - //mDevices.Add(0x104C8038,@"ff101179"); - //mDevices.Add(0x104C803B,@"PCIxx12 VEN_104C&DEV_803B&SUBSYS_0753152D&REV_00\4"); - //mDevices.Add(0x104C803D,@"N/A"); - //mDevices.Add(0x104C8119,@"na"); - //mDevices.Add(0x104C8201,@"006D103C"); - //mDevices.Add(0x104C8204,@"4610, 4515, 4610FM"); - //mDevices.Add(0x104C8400,@"PCI-2422"); - //mDevices.Add(0x104C9065,@"TMX320C6412"); - //mDevices.Add(0x104C9066,@"Hawking HWP54G 802.11b/g Wireless PCI Adapter (Rev T2)"); - //mDevices.Add(0x104CA001,@"TDC1570"); - //mDevices.Add(0x104CA100,@"TDC1561"); - //mDevices.Add(0x104CA102,@"TNETA1575"); - //mDevices.Add(0x104CA186,@"TMS320C6416T"); - //mDevices.Add(0x104CAC10,@"PCI1050"); - //mDevices.Add(0x104CAC11,@"PCI1030/1053"); - //mDevices.Add(0x104CAC12,@"PCI1130"); - //mDevices.Add(0x104CAC13,@"PCI9440"); - //mDevices.Add(0x104CAC15,@"PCI-1131"); - //mDevices.Add(0x104CAC16,@"PCI1250"); - //mDevices.Add(0x104CAC17,@"PCI1220"); - //mDevices.Add(0x104CAC18,@"PCI1260"); - //mDevices.Add(0x104CAC19,@"PCI1221"); - //mDevices.Add(0x104CAC1A,@"PCI1210"); - //mDevices.Add(0x104CAC1B,@"PCI1450"); - //mDevices.Add(0x104CAC1F,@"PCI1251B"); - //mDevices.Add(0x104CAC20,@"PCI2030"); - //mDevices.Add(0x104CAC21,@"PCI2031"); - //mDevices.Add(0x104CAC22,@"PCI2032"); - //mDevices.Add(0x104CAC23,@"PCI2250"); - //mDevices.Add(0x104CAC28,@"PCI2050/2050I"); - //mDevices.Add(0x104CAC30,@"PCI1260"); - //mDevices.Add(0x104CAC40,@"PCI4450"); - //mDevices.Add(0x104CAC41,@"PCI4410"); - //mDevices.Add(0x104CAC42,@"PCI4451"); - //mDevices.Add(0x104CAC43,@"PCI4550"); - //mDevices.Add(0x104CAC44,@"PCI4510SDFSDFSD"); - //mDevices.Add(0x104CAC46,@"PCI4520"); - //mDevices.Add(0x104CAC50,@"PCI1410"); - //mDevices.Add(0x104CAC51,@"PCI-1420"); - //mDevices.Add(0x104CAC52,@"PCI1451"); - //mDevices.Add(0x104CAC53,@"PCI1421"); - //mDevices.Add(0x104CAC54,@"PCI-1510"); - //mDevices.Add(0x104CAC55,@"PCI1520"); - //mDevices.Add(0x104CAC56,@"PCI1510"); - //mDevices.Add(0x104CAC57,@"PCI1530"); - //mDevices.Add(0x104CAC58,@"PCI1515"); - //mDevices.Add(0x104CAC59,@"PCI1620"); - //mDevices.Add(0x104CAC5A,@"PCI1610"); - //mDevices.Add(0x104CAC8F,@"7420"); - //mDevices.Add(0x104CFE00,@"tsb12lv26"); - //mDevices.Add(0x104CFE03,@"12C01A"); - //mDevices.Add(0x104D8009,@"CXD1947"); - //mDevices.Add(0x104D8039,@"CXD3222"); - //mDevices.Add(0x104D8056,@"0x127a"); - //mDevices.Add(0x104D808A,@"Qc pass"); - //mDevices.Add(0x104E0017,@"OTI-64017"); - //mDevices.Add(0x104E0107,@"OTI107"); - //mDevices.Add(0x104E0109,@"Video Adapter"); - //mDevices.Add(0x104E0217,@"OTI-64217"); - //mDevices.Add(0x104E0317,@"OTI-64317"); - //mDevices.Add(0x104E0611,@"OTI-610"); - //mDevices.Add(0x104F104F,@"iatca8262"); - //mDevices.Add(0x10500000,@"004005-34c8c8"); - //mDevices.Add(0x10500001,@"W83769F"); - //mDevices.Add(0x10500033,@"W89C33"); - //mDevices.Add(0x10500105,@"W82C105"); - //mDevices.Add(0x10500628,@"W83628F/629D"); - //mDevices.Add(0x10500840,@"W89C840F"); - //mDevices.Add(0x10500940,@"w89c940f"); - //mDevices.Add(0x10501050,@"W99200aF"); - //mDevices.Add(0x10505A5A,@"W89C940F"); - //mDevices.Add(0x10506692,@"W6692CF"); - //mDevices.Add(0x10509921,@"W99200AF"); - //mDevices.Add(0x10509922,@"W9922PF"); - //mDevices.Add(0x10509960,@"W9960CF"); - //mDevices.Add(0x10509961,@"W9961CF"); - //mDevices.Add(0x10509970,@"W9970CF"); - //mDevices.Add(0x10509971,@"W9971CF"); - //mDevices.Add(0x10510100,@"Motorola MC145575"); - //mDevices.Add(0x10540001,@"PCI Bridge"); - //mDevices.Add(0x10540002,@"PCI bus Cntrlr"); - //mDevices.Add(0x10543505,@"SH7751"); - //mDevices.Add(0x10550810,@"EFAR 486 host Bridge"); - //mDevices.Add(0x10550922,@"Pentium/p54c host Bridge"); - //mDevices.Add(0x10550926,@"I don�t know pentium 133 intel everex setpnot mx"); - //mDevices.Add(0x10559130,@"SLC90E66"); - //mDevices.Add(0x10559460,@"SLC90E66"); - //mDevices.Add(0x10559461,@"SLC90E66"); - //mDevices.Add(0x10559462,@"SLC90E66"); - //mDevices.Add(0x10559463,@"SLC90E66"); - //mDevices.Add(0x10570001,@"MPC105"); - //mDevices.Add(0x10570002,@"MPC106"); - //mDevices.Add(0x10570003,@"MPC8240"); - //mDevices.Add(0x10570004,@"MPC107"); - //mDevices.Add(0x10570006,@"MPC8245"); - //mDevices.Add(0x10570100,@"MC145575"); - //mDevices.Add(0x10570431,@"KTI829c"); - //mDevices.Add(0x10571801,@"DSP56301"); - //mDevices.Add(0x10571802,@"DSP56305"); - //mDevices.Add(0x105718C0,@"MPC8265A/66"); - //mDevices.Add(0x10573052,@"SM56"); - //mDevices.Add(0x10573055,@"sm56"); - //mDevices.Add(0x10573421,@"56IVMR/Phoenix 56ISM"); - //mDevices.Add(0x10574801,@"Raven"); - //mDevices.Add(0x10574802,@"Falcon"); - //mDevices.Add(0x10574803,@"Hawk"); - //mDevices.Add(0x10574806,@"CPX8216"); - //mDevices.Add(0x10574809,@"CPX8216T"); - //mDevices.Add(0x10575600,@"WDM MOT8888"); - //mDevices.Add(0x10575602,@"SM56"); - //mDevices.Add(0x10575608,@"52-6116-2A 21-864-4"); - //mDevices.Add(0x10575803,@"MPC5200"); - //mDevices.Add(0x10576400,@"MPC190"); - //mDevices.Add(0x105A0D30,@"PDC20265R"); - //mDevices.Add(0x105A0D38,@"PDC20263"); - //mDevices.Add(0x105A1275,@"PDC20275"); - //mDevices.Add(0x105A3318,@"PDC20318?"); - //mDevices.Add(0x105A3319,@"PDC20319?"); - //mDevices.Add(0x105A3371,@"PDC20371?"); - //mDevices.Add(0x105A3373,@"PDC20378"); - //mDevices.Add(0x105A3375,@"PDC20375?"); - //mDevices.Add(0x105A3376,@"PDC20376"); - //mDevices.Add(0x105A3570,@"PDC20771"); - //mDevices.Add(0x105A3571,@"0x3571"); - //mDevices.Add(0x105A3574,@"PDC20579"); - //mDevices.Add(0x105A3D18,@"PDC20518"); - //mDevices.Add(0x105A3D73,@"PDC20775"); - //mDevices.Add(0x105A4D30,@"PDC20267"); - //mDevices.Add(0x105A4D33,@"PDC20246"); - //mDevices.Add(0x105A4D38,@"PDC20262"); - //mDevices.Add(0x105A4D68,@"PDC20268"); - //mDevices.Add(0x105A4D69,@"PDC20269"); - //mDevices.Add(0x105A5275,@"PDC20276"); - //mDevices.Add(0x105A5300,@"DC5300"); - //mDevices.Add(0x105A6268,@"PDC20268R"); - //mDevices.Add(0x105A6269,@"PDC20271"); - //mDevices.Add(0x105A6621,@"PDC 20621(?)"); - //mDevices.Add(0x105A6622,@"PDC 20622 (?)"); - //mDevices.Add(0x105A6629,@"FastTrak TX4000 Controller"); - //mDevices.Add(0x105A7275,@"PDC 20277"); - //mDevices.Add(0x105D2309,@"Imagine 128"); - //mDevices.Add(0x105D2339,@"I128s2"); - //mDevices.Add(0x105D493D,@"T2R"); - //mDevices.Add(0x105D5348,@"Revolution IV"); - //mDevices.Add(0x10600001,@"UM82C881"); - //mDevices.Add(0x10600002,@"UM82C886"); - //mDevices.Add(0x10600101,@"UM8673F"); - //mDevices.Add(0x10600881,@"UM8881"); - //mDevices.Add(0x10600886,@"UM8886F"); - //mDevices.Add(0x10600891,@"UM82C891"); - //mDevices.Add(0x10601001,@"UM886A"); - //mDevices.Add(0x1060673A,@"UM8886BF"); - //mDevices.Add(0x1060673B,@"EIDE Master/DMA"); - //mDevices.Add(0x10608710,@"UM8710"); - //mDevices.Add(0x10608821,@"CPU/PCI Bridge"); - //mDevices.Add(0x10608822,@"PCI/ISA Bridge"); - //mDevices.Add(0x10608851,@"Pentium CPU/PCI Bridge"); - //mDevices.Add(0x10608852,@"Pentium CPU/ISA Bridge"); - //mDevices.Add(0x1060886A,@"UM8886A"); - //mDevices.Add(0x10608881,@"UM8881F"); - //mDevices.Add(0x10608886,@"UM8886"); - //mDevices.Add(0x1060888A,@"UM8886A"); - //mDevices.Add(0x10608891,@"UM8891"); - //mDevices.Add(0x10609017,@"UM9017F"); - //mDevices.Add(0x10609018,@"UM9018"); - //mDevices.Add(0x10609026,@"UM9026"); - //mDevices.Add(0x1060E881,@"UM8881"); - //mDevices.Add(0x1060E886,@"UM8886N"); - //mDevices.Add(0x1060E88A,@"UM8886N"); - //mDevices.Add(0x1060E891,@"UM8891N"); - //mDevices.Add(0x10610001,@"AGX013/016"); - //mDevices.Add(0x10610002,@"IIT3104"); - //mDevices.Add(0x10658139,@"Realtek 8139C Network Card"); - //mDevices.Add(0x10660000,@"PT80C826"); - //mDevices.Add(0x10660001,@"PT86C521"); - //mDevices.Add(0x10660002,@"PT86C523"); - //mDevices.Add(0x10660003,@"PT80C524"); - //mDevices.Add(0x10660004,@"PT80C525"); - //mDevices.Add(0x10660005,@"PC87550"); - //mDevices.Add(0x10668002,@"PT86C523"); - //mDevices.Add(0x10671002,@"VG500"); - //mDevices.Add(0x106B0001,@"Bandit"); - //mDevices.Add(0x106B0002,@"Grand Central"); - //mDevices.Add(0x106B0003,@"Control Video"); - //mDevices.Add(0x106B0004,@"PlanB"); - //mDevices.Add(0x106B0007,@"OHare"); - //mDevices.Add(0x106B000E,@"Hydra"); - //mDevices.Add(0x106B0010,@"Heathrow"); - //mDevices.Add(0x106B0017,@"Paddington"); - //mDevices.Add(0x106B0018,@"UniNorth"); - //mDevices.Add(0x106B001F,@"UniNorth"); - //mDevices.Add(0x106B0020,@"UniNorth"); - //mDevices.Add(0x106B0026,@"Pangea"); - //mDevices.Add(0x106B0027,@"Pangea"); - //mDevices.Add(0x106B002D,@"UniNorth 1.5"); - //mDevices.Add(0x106B002E,@"UniNorth 1.5"); - //mDevices.Add(0x106B002F,@"UniNorth 1.5"); - //mDevices.Add(0x106B0030,@"UniNorth/Pangea"); - //mDevices.Add(0x106B003B,@"Intrepid"); - //mDevices.Add(0x106B0050,@"Shasta"); - //mDevices.Add(0x106B0051,@"Shasta"); - //mDevices.Add(0x106B0052,@"Shasta"); - //mDevices.Add(0x106B0053,@"Shasta"); - //mDevices.Add(0x106B0054,@"Shasta"); - //mDevices.Add(0x106B0055,@"Shasta"); - //mDevices.Add(0x106B0058,@"U3L"); - //mDevices.Add(0x106C8801,@"Dual Pentium ISA/PCI Motherboard"); - //mDevices.Add(0x106C8802,@"P54C Tr8"); - //mDevices.Add(0x106C8803,@"Dual Window Graphics Accelerator"); - //mDevices.Add(0x106C8804,@"ht019a"); - //mDevices.Add(0x106C8805,@"100-BaseT LAN Controller"); - //mDevices.Add(0x106E4362,@"88E8053"); - //mDevices.Add(0x10730001,@"3D graphics Cntrlr"); - //mDevices.Add(0x10730002,@"YGV615"); - //mDevices.Add(0x10730003,@"00011179"); - //mDevices.Add(0x10730004,@"YMF754B"); - //mDevices.Add(0x10730005,@"DS1"); - //mDevices.Add(0x10730006,@"DS1"); - //mDevices.Add(0x10730008,@"DS1"); - //mDevices.Add(0x1073000A,@"YMF740"); - //mDevices.Add(0x1073000C,@"YMF740C"); - //mDevices.Add(0x1073000D,@"YMF724F"); - //mDevices.Add(0x10730010,@"YMF744B-V"); - //mDevices.Add(0x10730012,@"YMF754B"); - //mDevices.Add(0x10730020,@"744"); - //mDevices.Add(0x10731000,@"SW1000XG"); - //mDevices.Add(0x10732000,@"DS2416"); - //mDevices.Add(0x10744E78,@"82C500/1"); - //mDevices.Add(0x10771016,@"ISP10160"); - //mDevices.Add(0x10771020,@"ISP1040B/1020A"); - //mDevices.Add(0x10771022,@"ISP1022A"); - //mDevices.Add(0x10771080,@"ISP1080"); - //mDevices.Add(0x10771216,@"ISP12160"); - //mDevices.Add(0x10771240,@"ISP1240"); - //mDevices.Add(0x10771280,@"ISP1280"); - //mDevices.Add(0x10772020,@"ISP2020A"); - //mDevices.Add(0x10772100,@"ISP2100"); - //mDevices.Add(0x10772200,@"ISP2200"); - //mDevices.Add(0x10772300,@"ISP 2300"); - //mDevices.Add(0x10772312,@"ISP 2312"); - //mDevices.Add(0x10772422,@"ISP2422"); - //mDevices.Add(0x10772432,@"ISP2432"); - //mDevices.Add(0x10773010,@"n/a"); - //mDevices.Add(0x10776422,@"EP2422"); - //mDevices.Add(0x10776432,@"EP2432"); - //mDevices.Add(0x10780000,@"Cx5520"); - //mDevices.Add(0x10780001,@"MediaGXm"); - //mDevices.Add(0x10780002,@"Cx5520"); - //mDevices.Add(0x10780100,@"Cx5530"); - //mDevices.Add(0x10780101,@"Cx5530"); - //mDevices.Add(0x10780102,@"Cx5530"); - //mDevices.Add(0x10780103,@"Cx5530"); - //mDevices.Add(0x10780104,@"Cx5530"); - //mDevices.Add(0x10780400,@"ZFMicro"); - //mDevices.Add(0x10780401,@"ZFMicro"); - //mDevices.Add(0x10780402,@"ZFMicro"); - //mDevices.Add(0x10780403,@"ZFMicro"); - //mDevices.Add(0x107D0000,@"P86C850"); - //mDevices.Add(0x107E0001,@"FLIPPER"); - //mDevices.Add(0x107E0002,@"100 vg anylan Cntrlr"); - //mDevices.Add(0x107E0004,@"5526"); - //mDevices.Add(0x107E0005,@"x526"); - //mDevices.Add(0x107E0008,@"4575/5525/5575/6575"); - //mDevices.Add(0x107E9003,@"5535-4P-BRI-ST"); - //mDevices.Add(0x107E9007,@"5535-4P-BRI-U"); - //mDevices.Add(0x107E9008,@"5535-1P-SR"); - //mDevices.Add(0x107E900C,@"5535-1P-SR-ST"); - //mDevices.Add(0x107E900E,@"5535-1P-SR-U"); - //mDevices.Add(0x107E9011,@"5535-1P-PRI"); - //mDevices.Add(0x107E9013,@"5535-2P-PRI"); - //mDevices.Add(0x107E9023,@"5535-4P-BRI-ST"); - //mDevices.Add(0x107E9027,@"5536-4P-BRI-U"); - //mDevices.Add(0x107E9031,@"5535-1P-PRI"); - //mDevices.Add(0x107E9033,@"5536-2P-PRI"); - //mDevices.Add(0x107E9060,@"6535"); - //mDevices.Add(0x107E9070,@"4538"); - //mDevices.Add(0x107E9080,@"4532-002/005"); - //mDevices.Add(0x107E9081,@"4532-001/004"); - //mDevices.Add(0x107E9082,@"4532-000/003"); - //mDevices.Add(0x107E9090,@"107"); - //mDevices.Add(0x107E90A0,@"4539"); - //mDevices.Add(0x107F0802,@"SL82C105"); - //mDevices.Add(0x107F0803,@"EIDE Bus Master Controller"); - //mDevices.Add(0x107F0806,@"EIDE Controller"); - //mDevices.Add(0x107F2015,@"EIDE Controller"); - //mDevices.Add(0x10800600,@"82C596/9"); - //mDevices.Add(0x1080C691,@"Cypress CY7c68001"); - //mDevices.Add(0x1080C693,@"82C693"); - //mDevices.Add(0x10810D47,@"2330"); - //mDevices.Add(0x10830001,@"FR710"); - //mDevices.Add(0x10830613,@"Host Bridge"); - //mDevices.Add(0x10850001,@"UsbDgn"); - //mDevices.Add(0x108A0001,@"Model 617"); - //mDevices.Add(0x108A0010,@"Model 618"); - //mDevices.Add(0x108A0040,@"dataBLIZZARD"); - //mDevices.Add(0x108A3000,@"Model 2106"); - //mDevices.Add(0x108D0001,@"OC-3136/37"); - //mDevices.Add(0x108D0002,@"OC-3139f"); - //mDevices.Add(0x108D0004,@"OC-3139/40"); - //mDevices.Add(0x108D0005,@"OC-3250"); - //mDevices.Add(0x108D0006,@"OC-3530"); - //mDevices.Add(0x108D0007,@"OC-3141"); - //mDevices.Add(0x108D0008,@"OC-3540"); - //mDevices.Add(0x108D000A,@"OC-3150"); - //mDevices.Add(0x108D0011,@"OC-2805"); - //mDevices.Add(0x108D0012,@"OC-2325"); - //mDevices.Add(0x108D0013,@"OC-2183/85"); - //mDevices.Add(0x108D0014,@"OC-2326"); - //mDevices.Add(0x108D0019,@"OC-2327/50"); - //mDevices.Add(0x108D0021,@"OC-6151/52"); - //mDevices.Add(0x108D0022,@"ATM Adapter"); - //mDevices.Add(0x108E0001,@"SPARC EBUS"); - //mDevices.Add(0x108E1000,@"PCIO"); - //mDevices.Add(0x108E1001,@"PCIO"); - //mDevices.Add(0x108E1100,@"RIO EBUS"); - //mDevices.Add(0x108E1101,@"RIO GEM"); - //mDevices.Add(0x108E1102,@"RIO 1394"); - //mDevices.Add(0x108E1103,@"RIO USB"); - //mDevices.Add(0x108E2BAD,@"GEM"); - //mDevices.Add(0x108E5000,@"SME2411"); - //mDevices.Add(0x108E5043,@"SunPCI"); - //mDevices.Add(0x108E7063,@"SunPCi"); - //mDevices.Add(0x108E8000,@"STP2223BGA"); - //mDevices.Add(0x108E8001,@"Schizo"); - //mDevices.Add(0x108EA000,@"UltraSPARC IIi"); - //mDevices.Add(0x108EA001,@"UltraSPARC IIe"); - //mDevices.Add(0x10910020,@"3D Graphics Processor"); - //mDevices.Add(0x10910021,@"3D graphics processor w/texturing"); - //mDevices.Add(0x10910040,@"3D graphics frame buffer"); - //mDevices.Add(0x10910041,@"3D graphics frame buffer"); - //mDevices.Add(0x10910060,@"Proprietary bus Bridge"); - //mDevices.Add(0x109100E4,@"Powerstorm 4D50T"); - //mDevices.Add(0x10910720,@"Motion JPEG Codec"); - //mDevices.Add(0x109200A0,@"SpeedStar Pro SE"); - //mDevices.Add(0x109200A8,@"SpeedStar 64"); - //mDevices.Add(0x10920550,@"Viper V550"); - //mDevices.Add(0x109208D4,@"Supra 2260"); - //mDevices.Add(0x1092094C,@"SupraExpress 56i Pro"); - //mDevices.Add(0x109209C8,@"SUP2761"); - //mDevices.Add(0x10921002,@"R6793-12"); - //mDevices.Add(0x10921092,@"Viper V330"); - //mDevices.Add(0x10926120,@"Maximum"); - //mDevices.Add(0x10928810,@"Stealth SE"); - //mDevices.Add(0x10928811,@"Stealth 64/SE"); - //mDevices.Add(0x10928880,@"Stealth Video"); - //mDevices.Add(0x10928881,@"Stealth Video"); - //mDevices.Add(0x109288B0,@"Stealth 64 Video"); - //mDevices.Add(0x109288B1,@"Stealth 64 Video"); - //mDevices.Add(0x109288C0,@"Stealth 64"); - //mDevices.Add(0x109288C1,@"Stealth 64"); - //mDevices.Add(0x109288D0,@"Stealth 64"); - //mDevices.Add(0x109288D1,@"Stealth 64"); - //mDevices.Add(0x109288F0,@"Stealth 64 Video"); - //mDevices.Add(0x109288F1,@"Stealth 64 Video"); - //mDevices.Add(0x10929876,@"Supra Express 56i Pro CW #2"); - //mDevices.Add(0x10929999,@"Monster Sound"); - //mDevices.Add(0x10930160,@"PCI-DIO-96"); - //mDevices.Add(0x10930161,@"PCI-1200"); - //mDevices.Add(0x10930162,@"PCI-MIO-16XE-50"); - //mDevices.Add(0x10931150,@"PCI-DIO-32HS"); - //mDevices.Add(0x10931170,@"PCI-MIO-16XE-10"); - //mDevices.Add(0x10931180,@"PCI-MIO-16E-1"); - //mDevices.Add(0x10931190,@"PCI-MIO-16E-4"); - //mDevices.Add(0x10931270,@"PCI-6032E"); - //mDevices.Add(0x10931310,@"PCI-6602"); - //mDevices.Add(0x10931330,@"PCI-6031E"); - //mDevices.Add(0x10931340,@"PCI-6033E"); - //mDevices.Add(0x10931350,@"PCI-6071E"); - //mDevices.Add(0x109317D0,@"PCI-6503"); - //mDevices.Add(0x10932A60,@"PCI-6023E"); - //mDevices.Add(0x10932A70,@"PCI-6024E"); - //mDevices.Add(0x10932A80,@"PCI-6025E"); - //mDevices.Add(0x10932C80,@"PCI-6035E"); - //mDevices.Add(0x1093B001,@"IMAQ-PCI-1408"); - //mDevices.Add(0x1093B011,@"IMAQ-PXI-1408"); - //mDevices.Add(0x1093B021,@"IMAQ-PCI-1424"); - //mDevices.Add(0x1093B031,@"IMAQ-PCI-1413"); - //mDevices.Add(0x1093B041,@"IMAQ-PCI-1407"); - //mDevices.Add(0x1093B051,@"IMAQ-PXI-1407"); - //mDevices.Add(0x1093B061,@"IMAQ-PCI-1411"); - //mDevices.Add(0x1093B071,@"IMAQ-PCI-1422"); - //mDevices.Add(0x1093B081,@"IMAQ-PXI-1422"); - //mDevices.Add(0x1093B091,@"IMAQ-PXI-1411"); - //mDevices.Add(0x1093C801,@"PCI-GPIB"); - //mDevices.Add(0x10950640,@"PCI0640A/B"); - //mDevices.Add(0x10950641,@"PCI0640"); - //mDevices.Add(0x10950642,@"PCI0642"); - //mDevices.Add(0x10950643,@"PCI0643"); - //mDevices.Add(0x10950646,@"PCI0646"); - //mDevices.Add(0x10950647,@"PCI0647"); - //mDevices.Add(0x10950648,@"PCI-648"); - //mDevices.Add(0x10950649,@"PCI-649"); - //mDevices.Add(0x10950650,@"PBC0650A"); - //mDevices.Add(0x10950670,@"USB0670"); - //mDevices.Add(0x10950673,@"USB0673"); - //mDevices.Add(0x10950680,@"SiI 0680"); - //mDevices.Add(0x10952455,@"SI3124"); - //mDevices.Add(0x10953112,@"SiI 3112"); - //mDevices.Add(0x10953114,@"Sil 3114"); - //mDevices.Add(0x10953124,@"SiI 3124"); - //mDevices.Add(0x10953132,@"SiI 3132"); - //mDevices.Add(0x10953512,@"Sil 3512"); - //mDevices.Add(0x10953531,@"3531"); - //mDevices.Add(0x10961106,@"0x3059"); - //mDevices.Add(0x10970038,@"EIDE Controller (single FIFO)"); - //mDevices.Add(0x10980001,@"QD8500"); - //mDevices.Add(0x10980002,@"QD8580"); - //mDevices.Add(0x109A8280,@"0x8280"); - //mDevices.Add(0x109E0350,@"BT848KPF"); - //mDevices.Add(0x109E0351,@"B t878 khf"); - //mDevices.Add(0x109E0369,@"Bt878"); - //mDevices.Add(0x109E036E,@"878Asad"); - //mDevices.Add(0x109E036F,@"Bt878"); - //mDevices.Add(0x109E0370,@"Bt880"); - //mDevices.Add(0x109E0878,@"7610144D&REV_02\4&1F7DBC9F&0&09F0"); - //mDevices.Add(0x109E0879,@"Bt879khf"); - //mDevices.Add(0x109E0880,@"Bt880"); - //mDevices.Add(0x109E109E,@"BT848akpf"); - //mDevices.Add(0x109E2115,@"BtV 2115 Mera Lun"); - //mDevices.Add(0x109E2125,@"BtV 2125"); - //mDevices.Add(0x109E2164,@"BtV 2164"); - //mDevices.Add(0x109E2165,@"BtV 2165"); - //mDevices.Add(0x109E8230,@"BtV 8230"); - //mDevices.Add(0x109E8472,@"Bt8471/72"); - //mDevices.Add(0x109E8474,@"Bt8474"); - //mDevices.Add(0x10A80000,@"64-bit GUI Accelerator"); - //mDevices.Add(0x10A90004,@"O2 MACE"); - //mDevices.Add(0x10A90005,@"RAD Audio"); - //mDevices.Add(0x10A90006,@"HPCEX"); - //mDevices.Add(0x10A90007,@"RPCEX"); - //mDevices.Add(0x10A90008,@"DiVO VIP"); - //mDevices.Add(0x10A90009,@"Alteon"); - //mDevices.Add(0x10A90010,@"AMP"); - //mDevices.Add(0x10A90011,@"GRIP"); - //mDevices.Add(0x10A90012,@"SGH PSHAC GSN"); - //mDevices.Add(0x10A91001,@"Magic Carpet"); - //mDevices.Add(0x10A91002,@"Lithium"); - //mDevices.Add(0x10A91003,@"Dual JPEG 1"); - //mDevices.Add(0x10A91004,@"Dual JPEG 2"); - //mDevices.Add(0x10A91005,@"Dual JPEG 3"); - //mDevices.Add(0x10A91006,@"Dual JPEG 4"); - //mDevices.Add(0x10A91007,@"Dual JPEG 5"); - //mDevices.Add(0x10A91008,@"Cesium"); - //mDevices.Add(0x10A92001,@"Fibre Channel"); - //mDevices.Add(0x10A92002,@"ASDE"); - //mDevices.Add(0x10A98001,@"O2 1394"); - //mDevices.Add(0x10A98002,@"G-net NT"); - //mDevices.Add(0x10AB1005,@"USB\VID_0000&PID_0000\5&5657949&0&8"); - //mDevices.Add(0x10AD0001,@"W83769F"); - //mDevices.Add(0x10AD0103,@"sl82c103"); - //mDevices.Add(0x10AD0105,@"W83789F"); - //mDevices.Add(0x10AD0565,@"W83C553F"); - //mDevices.Add(0x10B50480,@"IOP 480"); - //mDevices.Add(0x10B50960,@"PCI 9080RDK-960"); - //mDevices.Add(0x10B51030,@"Gazel R685"); - //mDevices.Add(0x10B51054,@"Gazel R697"); - //mDevices.Add(0x10B51078,@"PCI 9050"); - //mDevices.Add(0x10B51103,@"PCI 9050"); - //mDevices.Add(0x10B51146,@"PCI 9050"); - //mDevices.Add(0x10B51147,@"PCI 9050"); - //mDevices.Add(0x10B51151,@"Gazel R753"); - //mDevices.Add(0x10B51152,@"Gazel R753"); - //mDevices.Add(0x10B52724,@"Thales PCSM Security Card"); - //mDevices.Add(0x10B53001,@"plx9030"); - //mDevices.Add(0x10B55406,@"PCI RDK9054-LITE"); - //mDevices.Add(0x10B55601,@"PCI 9056"); - //mDevices.Add(0x10B56520,@"PCI6520"); - //mDevices.Add(0x10B58111,@"PEX 8311"); - //mDevices.Add(0x10B58509,@"PEX8509"); - //mDevices.Add(0x10B58516,@"PEX 8516"); - //mDevices.Add(0x10B58518,@"PEX8518-AB25BI"); - //mDevices.Add(0x10B58532,@"PEX 8532"); - //mDevices.Add(0x10B59030,@"PCI 9030"); - //mDevices.Add(0x10B59036,@"PCI9036"); - //mDevices.Add(0x10B59050,@"PCI 9050"); - //mDevices.Add(0x10B59052,@"PCI 9052"); - //mDevices.Add(0x10B59054,@"PCI 9054"); - //mDevices.Add(0x10B59056,@"PCI9056"); - //mDevices.Add(0x10B59060,@"PCI9060"); - //mDevices.Add(0x10B5906D,@"PCI 9060SD"); - //mDevices.Add(0x10B5906E,@"PCI 9060ES"); - //mDevices.Add(0x10B59080,@"PCI 9080"); - //mDevices.Add(0x10B60001,@"Smart 16/4"); - //mDevices.Add(0x10B60002,@"Smart 16/4"); - //mDevices.Add(0x10B60003,@"Smart 16/4"); - //mDevices.Add(0x10B60004,@"Smart 16/4 Ringnode Mk1 (PCIBM1)"); - //mDevices.Add(0x10B60006,@"16/4 CardBus Adapter (Eric 2)"); - //mDevices.Add(0x10B60007,@"Presto PCI"); - //mDevices.Add(0x10B60009,@"Smart 100/16/4 PCi-HS Ringnode"); - //mDevices.Add(0x10B6000A,@"Smart 100/16/4 PCI Ringnode"); - //mDevices.Add(0x10B6000B,@"16/4 CardBus Adapter Mk2"); - //mDevices.Add(0x10B61000,@"Horizon"); - //mDevices.Add(0x10B61001,@"Ambassador"); - //mDevices.Add(0x10B61002,@"Ambassador"); - //mDevices.Add(0x10B70001,@"3C985"); - //mDevices.Add(0x10B70013,@"3com p/n: 3CRDAG675"); - //mDevices.Add(0x10B71000,@"3C905CX-TXNM"); - //mDevices.Add(0x10B71006,@"14e4:1645"); - //mDevices.Add(0x10B71007,@"3C556"); - //mDevices.Add(0x10B71700,@"3C940"); - //mDevices.Add(0x10B71F1F,@"3CRWE777A"); - //mDevices.Add(0x10B73390,@"3C339"); - //mDevices.Add(0x10B73590,@"3C359"); - //mDevices.Add(0x10B74500,@"3C450"); - //mDevices.Add(0x10B75055,@"3C555"); - //mDevices.Add(0x10B75057,@"3C575"); - //mDevices.Add(0x10B75157,@"3C575B"); - //mDevices.Add(0x10B75257,@"3CCFE575CT"); - //mDevices.Add(0x10B75900,@"3C590"); - //mDevices.Add(0x10B75920,@"3C592"); - //mDevices.Add(0x10B75950,@"3C595"); - //mDevices.Add(0x10B75951,@"3C595"); - //mDevices.Add(0x10B75952,@"3C595"); - //mDevices.Add(0x10B75970,@"3C597"); - //mDevices.Add(0x10B75B57,@"3C595"); - //mDevices.Add(0x10B76055,@"3C556"); - //mDevices.Add(0x10B76056,@"3CN3AC1556B"); - //mDevices.Add(0x10B76560,@"3CCFE656"); - //mDevices.Add(0x10B76561,@"FEM656"); - //mDevices.Add(0x10B76562,@"3CCFEM656"); - //mDevices.Add(0x10B76563,@"FEM656B"); - //mDevices.Add(0x10B76564,@"3CCFEM656"); - //mDevices.Add(0x10B76565,@"3CCFEM656C"); - //mDevices.Add(0x10B77646,@"3CSOHO100B-TX"); - //mDevices.Add(0x10B77770,@"???"); - //mDevices.Add(0x10B78811,@"Token Ring"); - //mDevices.Add(0x10B79000,@"3C900-TPO"); - //mDevices.Add(0x10B79001,@"3C900-COMBO"); - //mDevices.Add(0x10B79004,@"3C900-TPO"); - //mDevices.Add(0x10B79005,@"3C900B-COMBO"); - //mDevices.Add(0x10B79006,@"3C900B-TPC"); - //mDevices.Add(0x10B7900A,@"3C900B-FL"); - //mDevices.Add(0x10B79050,@"3C905B - Combo"); - //mDevices.Add(0x10B79051,@"3C905-T4"); - //mDevices.Add(0x10B79055,@"3C905-TX"); - //mDevices.Add(0x10B79056,@"3C905B-T4"); - //mDevices.Add(0x10B79058,@"3C905B-COMBO"); - //mDevices.Add(0x10B7905A,@"3C905B-FX"); - //mDevices.Add(0x10B79200,@"3C905 CX-TX-M"); - //mDevices.Add(0x10B79201,@"3C920B-EMB"); - //mDevices.Add(0x10B79202,@"3C920B-EMB"); - //mDevices.Add(0x10B79210,@"3C920B-EMB-WNM"); - //mDevices.Add(0x10B79300,@"3csoho100b-tx"); - //mDevices.Add(0x10B79800,@"3C980-TX"); - //mDevices.Add(0x10B79805,@"3C980-TX"); - //mDevices.Add(0x10B79902,@"3CR990-TX-95"); - //mDevices.Add(0x10B79903,@"3CR990-TX-97"); - //mDevices.Add(0x10B79905,@"3C990B-FX"); - //mDevices.Add(0x10B79908,@"3CR990SVR95"); - //mDevices.Add(0x10B79909,@"3CR990SVR97"); - //mDevices.Add(0x10B7D004,@"3C900B-TPO"); - //mDevices.Add(0x10B80005,@"LAN83C170QF/171"); - //mDevices.Add(0x10B80006,@"LAN83C175"); - //mDevices.Add(0x10B81000,@"37C665"); - //mDevices.Add(0x10B81001,@"37C922"); - //mDevices.Add(0x10B8A011,@"83C170QF"); - //mDevices.Add(0x10B8B106,@"SMC34C90"); - //mDevices.Add(0x10B90101,@"CMI8338/C3DX"); - //mDevices.Add(0x10B90102,@"CMI8338/C3DX"); - //mDevices.Add(0x10B90111,@"CMI8738/C3DX"); - //mDevices.Add(0x10B90780,@"???"); - //mDevices.Add(0x10B90782,@"???"); - //mDevices.Add(0x10B91435,@"M1435"); - //mDevices.Add(0x10B91445,@"M1445"); - //mDevices.Add(0x10B91449,@"M1449"); - //mDevices.Add(0x10B91451,@"M1451"); - //mDevices.Add(0x10B91461,@"M1461"); - //mDevices.Add(0x10B91489,@"M1489"); - //mDevices.Add(0x10B91511,@"M1511"); - //mDevices.Add(0x10B91513,@"M1513"); - //mDevices.Add(0x10B91521,@"M1521"); - //mDevices.Add(0x10B91523,@"M1523"); - //mDevices.Add(0x10B91533,@"M1535+"); - //mDevices.Add(0x10B91535,@"M1535x"); - //mDevices.Add(0x10B91541,@"M1541"); - //mDevices.Add(0x10B91543,@"M1543 a1"); - //mDevices.Add(0x10B91561,@"M1561"); - //mDevices.Add(0x10B91563,@"M1563"); - //mDevices.Add(0x10B91632,@"M1632"); - //mDevices.Add(0x10B91641,@"M1641"); - //mDevices.Add(0x10B91644,@"M1644"); - //mDevices.Add(0x10B91646,@"M1646"); - //mDevices.Add(0x10B91647,@"M1647"); - //mDevices.Add(0x10B91651,@"M1651"); - //mDevices.Add(0x10B91661,@"M1661"); - //mDevices.Add(0x10B91667,@"M1667"); - //mDevices.Add(0x10B91671,@"M1671"); - //mDevices.Add(0x10B91672,@"M1672"); - //mDevices.Add(0x10B91681,@"M1681"); - //mDevices.Add(0x10B91687,@"M1687"); - //mDevices.Add(0x10B93141,@"M3141"); - //mDevices.Add(0x10B93143,@"M3143"); - //mDevices.Add(0x10B93145,@"M3145"); - //mDevices.Add(0x10B93147,@"M3147"); - //mDevices.Add(0x10B93149,@"M3149"); - //mDevices.Add(0x10B93151,@"M3151"); - //mDevices.Add(0x10B93307,@"M3307"); - //mDevices.Add(0x10B93309,@"M3309"); - //mDevices.Add(0x10B95212,@"M4803"); - //mDevices.Add(0x10B95215,@"MS4803"); - //mDevices.Add(0x10B95217,@"m5217h"); - //mDevices.Add(0x10B95219,@"Ali M5219 PCI BUS MASTER IDE Controller"); - //mDevices.Add(0x10B95225,@"M5225"); - //mDevices.Add(0x10B95228,@"M1563"); - //mDevices.Add(0x10B95229,@"M5229 Southbridge"); - //mDevices.Add(0x10B95235,@"M1621"); - //mDevices.Add(0x10B95236,@"M5273"); - //mDevices.Add(0x10B95237,@"M5273 A1 for windows 98"); - //mDevices.Add(0x10B95239,@"527210B9"); - //mDevices.Add(0x10B95249,@"M5249"); - //mDevices.Add(0x10B95251,@"M5251"); - //mDevices.Add(0x10B95253,@"M5253"); - //mDevices.Add(0x10B95261,@"M5261"); - //mDevices.Add(0x10B95263,@"Albatron K8ULTRA-U Pro"); - //mDevices.Add(0x10B95281,@"M1565/1566"); - //mDevices.Add(0x10B95287,@"ULI M1573"); - //mDevices.Add(0x10B95288,@"ULI M1575/M1697 "); - //mDevices.Add(0x10B95289,@"ULI M1567/M1689 "); - //mDevices.Add(0x10B95450,@"Agere Systems AC97 Modem"); - //mDevices.Add(0x10B95451,@"M5451"); - //mDevices.Add(0x10B95455,@"M1563M Southbridge"); - //mDevices.Add(0x10B95457,@"M1563M"); - //mDevices.Add(0x10B95461,@"SW\{CD171DE3-69E5-11D2-B56D-0000F8754380}\{9B36589"); - //mDevices.Add(0x10B95471,@"M1563M Southbridge"); - //mDevices.Add(0x10B95473,@"M1563M Southbridge"); - //mDevices.Add(0x10B97101,@"M7101"); - //mDevices.Add(0x10B97471,@"M1563M Southbridge"); - //mDevices.Add(0x10B99876,@"mdv92xp"); - //mDevices.Add(0x10BA0304,@"GUI Accelerator"); - //mDevices.Add(0x10BD0803,@" MYSON Technology Inc SURECOM EP-320X-S 100/10M Et"); - //mDevices.Add(0x10BD0E34,@"NE34"); - //mDevices.Add(0x10BD5240,@"0055"); - //mDevices.Add(0x10BD5241,@"PCMCIA Bridge"); - //mDevices.Add(0x10BD5242,@"General Purpose Cntrlr"); - //mDevices.Add(0x10BD5243,@"00000000"); - //mDevices.Add(0x10BD5244,@"FCD Cntrlr"); - //mDevices.Add(0x10BD8139,@"surecom EP-320X-R adapter with realtek 8139c chip"); - //mDevices.Add(0x10C80000,@"Graphics Cntrlr"); - //mDevices.Add(0x10C80003,@"NM2093"); - //mDevices.Add(0x10C80004,@"NM2160"); - //mDevices.Add(0x10C80005,@"NM2200"); - //mDevices.Add(0x10C80006,@"NM2360"); - //mDevices.Add(0x10C80016,@"NM2380"); - //mDevices.Add(0x10C80025,@"NM2230"); - //mDevices.Add(0x10C80083,@"NM2097"); - //mDevices.Add(0x10C88005,@"NM2200"); - //mDevices.Add(0x10C88006,@"NM2360"); - //mDevices.Add(0x10C88016,@"NM2380"); - //mDevices.Add(0x10CD1100,@"ASC1100"); - //mDevices.Add(0x10CD1200,@"ASC1200"); - //mDevices.Add(0x10CD1300,@"ASC-3550b"); - //mDevices.Add(0x10CD2300,@"F914C536"); - //mDevices.Add(0x10CD2500,@"ASC38C0800/1600"); - //mDevices.Add(0x10CD4000,@"ASC30C0400"); - //mDevices.Add(0x10CF10C5,@"FMV-103"); - //mDevices.Add(0x10CF2001,@"MB86605"); - //mDevices.Add(0x10CF2002,@"MB86606"); - //mDevices.Add(0x10CF2005,@"MB86974"); - //mDevices.Add(0x10CF200C,@"MB86974"); - //mDevices.Add(0x10CF2010,@"OHCI FireWire Controller"); - //mDevices.Add(0x10CF2011,@"MPEG2 R-Engine (MPEG2 Hardware Encoder)"); - //mDevices.Add(0x10CF2019,@"MB86295"); - //mDevices.Add(0x10CF201E,@"MB86296"); - //mDevices.Add(0x10D6FF51,@"0x0100"); - //mDevices.Add(0x10D90066,@"MX86101P"); - //mDevices.Add(0x10D90512,@"MX98713"); - //mDevices.Add(0x10D90531,@"MX98715/25"); - //mDevices.Add(0x10D90532,@"MX98723/727"); - //mDevices.Add(0x10D90553,@"MX987x5"); - //mDevices.Add(0x10D98625,@"MX86250"); - //mDevices.Add(0x10D98626,@"MX86251"); - //mDevices.Add(0x10D98627,@"MX86251"); - //mDevices.Add(0x10D98888,@"MX86250"); - //mDevices.Add(0x10D9C115,@"lc82c115"); - //mDevices.Add(0x10DC0001,@"STAR/RD24"); - //mDevices.Add(0x10DC0002,@"ATT 2C15-3 (FPGA)"); - //mDevices.Add(0x10DC0004,@"EP20S780"); - //mDevices.Add(0x10DC0010,@"680-1110-150/400"); - //mDevices.Add(0x10DC0011,@"680-1110-200/450"); - //mDevices.Add(0x10DC0012,@"S32PCI64"); - //mDevices.Add(0x10DC0021,@"HIPPI destination"); - //mDevices.Add(0x10DC0022,@"HIPPI source"); - //mDevices.Add(0x10DC0033,@"EP20KE (APEX-FPGA)"); - //mDevices.Add(0x10DC0101,@"SL651 7057 C200"); - //mDevices.Add(0x10DC016A,@"XC4VFX100"); - //mDevices.Add(0x10DC10DC,@"ATT 2C15-3 (FPGA)"); - //mDevices.Add(0x10DD0001,@"3D graphics processor"); - //mDevices.Add(0x10DE0001,@"Lucent 0x00da"); - //mDevices.Add(0x10DE0008,@"NV1"); - //mDevices.Add(0x10DE0009,@"NV1"); - //mDevices.Add(0x10DE0010,@"NV2"); - //mDevices.Add(0x10DE0018,@"NV3"); - //mDevices.Add(0x10DE0019,@"NV3"); - //mDevices.Add(0x10DE0020,@"NV4"); - //mDevices.Add(0x10DE0028,@"NV5"); - //mDevices.Add(0x10DE0029,@"NV5"); - //mDevices.Add(0x10DE002A,@"NV5"); - //mDevices.Add(0x10DE002B,@"NV5"); - //mDevices.Add(0x10DE002C,@"8.0"); - //mDevices.Add(0x10DE002D,@"NV5"); - //mDevices.Add(0x10DE002E,@"NV6"); - //mDevices.Add(0x10DE002F,@"NV6"); - //mDevices.Add(0x10DE0035,@"MCP04"); - //mDevices.Add(0x10DE0036,@"MCP04"); - //mDevices.Add(0x10DE003E,@"MCP04"); - //mDevices.Add(0x10DE0040,@"NV40.0"); - //mDevices.Add(0x10DE0041,@"NV40.1"); - //mDevices.Add(0x10DE0042,@"NV40.2"); - //mDevices.Add(0x10DE0043,@"NV40.3"); - //mDevices.Add(0x10DE0045,@"NV40.5"); - //mDevices.Add(0x10DE0049,@"NV40GL"); - //mDevices.Add(0x10DE004E,@"NV40GL"); - //mDevices.Add(0x10DE0053,@"CK804"); - //mDevices.Add(0x10DE0054,@"CK804"); - //mDevices.Add(0x10DE0055,@"CK804"); - //mDevices.Add(0x10DE0057,@"nForce4 Ultra"); - //mDevices.Add(0x10DE0059,@"Realtek ALC850"); - //mDevices.Add(0x10DE0060,@"nForce MCP2"); - //mDevices.Add(0x10DE0064,@"nForce MCP-T"); - //mDevices.Add(0x10DE0065,@"nForce MCP2/MCP2-T/MCP2-U"); - //mDevices.Add(0x10DE0066,@"nForce MCP-T"); - //mDevices.Add(0x10DE0067,@"nForce MCP2"); - //mDevices.Add(0x10DE0068,@"nForce MCP2"); - //mDevices.Add(0x10DE006A,@"nForce MCP2"); - //mDevices.Add(0x10DE006B,@"nForce MCP-T?"); - //mDevices.Add(0x10DE006C,@"nForce"); - //mDevices.Add(0x10DE006D,@"nForce MCP-T"); - //mDevices.Add(0x10DE006E,@"nForce MCP2"); - //mDevices.Add(0x10DE0085,@"MCP2S"); - //mDevices.Add(0x10DE008C,@"RLT8201BL"); - //mDevices.Add(0x10DE008E,@"MCP2S"); - //mDevices.Add(0x10DE0091,@"G70"); - //mDevices.Add(0x10DE0092,@"NV47 (20x1,7vp)"); - //mDevices.Add(0x10DE009C,@"G70.1"); - //mDevices.Add(0x10DE009D,@"NVIDIA GPU Quadro FX 4500"); - //mDevices.Add(0x10DE00A0,@"NV5"); - //mDevices.Add(0x10DE00C0,@"NV41.0"); - //mDevices.Add(0x10DE00C1,@"NV41.1"); - //mDevices.Add(0x10DE00C2,@"NV41.2"); - //mDevices.Add(0x10DE00C8,@"NV41"); - //mDevices.Add(0x10DE00C9,@"NV41"); - //mDevices.Add(0x10DE00CC,@"NV41"); - //mDevices.Add(0x10DE00CD,@"NV41GL"); - //mDevices.Add(0x10DE00CE,@"NV41GL"); - //mDevices.Add(0x10DE00D0,@"nForce 3"); - //mDevices.Add(0x10DE00D1,@"nForce 3"); - //mDevices.Add(0x10DE00D2,@"nForce 3?"); - //mDevices.Add(0x10DE00D4,@"nForce MCp2"); - //mDevices.Add(0x10DE00D5,@"nForce 150"); - //mDevices.Add(0x10DE00D6,@"nForce MCP3?"); - //mDevices.Add(0x10DE00D7,@"nForce MCP3?"); - //mDevices.Add(0x10DE00D8,@"nForce MCP3?"); - //mDevices.Add(0x10DE00D9,@"nForce 3"); - //mDevices.Add(0x10DE00DA,@"Lucent"); - //mDevices.Add(0x10DE00DD,@"nForce MCP3?"); - //mDevices.Add(0x10DE00DF,@"Marvell 88E1111"); - //mDevices.Add(0x10DE00E0,@"nForce3 250"); - //mDevices.Add(0x10DE00E1,@"nForce3 250"); - //mDevices.Add(0x10DE00E2,@"nForce3 250"); - //mDevices.Add(0x10DE00E3,@"nForce 250"); - //mDevices.Add(0x10DE00E4,@"nForce3 250"); - //mDevices.Add(0x10DE00E5,@"nForce3 250"); - //mDevices.Add(0x10DE00E7,@"nForce3 250"); - //mDevices.Add(0x10DE00E8,@"nForce3 250"); - //mDevices.Add(0x10DE00EA,@"nForce3 250"); - //mDevices.Add(0x10DE00ED,@"nForce3 250"); - //mDevices.Add(0x10DE00EE,@"nForce 250"); - //mDevices.Add(0x10DE00F0,@"NVBR02"); - //mDevices.Add(0x10DE00F1,@"NV43+BR02"); - //mDevices.Add(0x10DE00F2,@"NV43"); - //mDevices.Add(0x10DE00F5,@"G70"); - //mDevices.Add(0x10DE00F6,@"NV41"); - //mDevices.Add(0x10DE00F8,@"NVBR02"); - //mDevices.Add(0x10DE00F9,@"NVBR02"); - //mDevices.Add(0x10DE00FA,@"NVBR02.2"); - //mDevices.Add(0x10DE00FB,@"NVBR02.3"); - //mDevices.Add(0x10DE00FC,@"NVBR02.4"); - //mDevices.Add(0x10DE00FD,@"NVBR02GL"); - //mDevices.Add(0x10DE00FE,@"NVBR02GL"); - //mDevices.Add(0x10DE00FF,@"NVBR02.7"); - //mDevices.Add(0x10DE0100,@"NV10"); - //mDevices.Add(0x10DE0101,@"NV10"); - //mDevices.Add(0x10DE0102,@"NV10"); - //mDevices.Add(0x10DE0103,@"NV10GL"); - //mDevices.Add(0x10DE0110,@"NV11"); - //mDevices.Add(0x10DE0111,@"NV11DDR"); - //mDevices.Add(0x10DE0112,@"NV11"); - //mDevices.Add(0x10DE0113,@"NV11GL"); - //mDevices.Add(0x10DE0141,@"NV43"); - //mDevices.Add(0x10DE0145,@"NV43"); - //mDevices.Add(0x10DE014D,@"unknown"); - //mDevices.Add(0x10DE014E,@"NV43"); - //mDevices.Add(0x10DE014F,@"NV43"); - //mDevices.Add(0x10DE0150,@"NV15"); - //mDevices.Add(0x10DE0151,@"NV15 DDR"); - //mDevices.Add(0x10DE0152,@"NV15BR"); - //mDevices.Add(0x10DE0153,@"NV15GL"); - //mDevices.Add(0x10DE0162,@"NV44?"); - //mDevices.Add(0x10DE0164,@"NV44?"); - //mDevices.Add(0x10DE0165,@"NVS285"); - //mDevices.Add(0x10DE0170,@"NV17.2"); - //mDevices.Add(0x10DE0171,@"NV17.2"); - //mDevices.Add(0x10DE0172,@"NV17.3"); - //mDevices.Add(0x10DE0173,@"NV17.4"); - //mDevices.Add(0x10DE0174,@"NV17M"); - //mDevices.Add(0x10DE0175,@"NV17M"); - //mDevices.Add(0x10DE0176,@"NV17M"); - //mDevices.Add(0x10DE0177,@"NV17M"); - //mDevices.Add(0x10DE0178,@"NV17GL.1"); - //mDevices.Add(0x10DE0179,@"NV17M"); - //mDevices.Add(0x10DE017A,@"NV17GL.2"); - //mDevices.Add(0x10DE017B,@"NV17GL.3"); - //mDevices.Add(0x10DE017C,@"NV17M"); - //mDevices.Add(0x10DE0181,@"NV18B"); - //mDevices.Add(0x10DE0182,@"NV18.2"); - //mDevices.Add(0x10DE0183,@"NV18.4"); - //mDevices.Add(0x10DE0185,@"NV18.6"); - //mDevices.Add(0x10DE0186,@"NV18M"); - //mDevices.Add(0x10DE0187,@"nv18m"); - //mDevices.Add(0x10DE018A,@"Quadro NVS"); - //mDevices.Add(0x10DE018D,@"NV18M"); - //mDevices.Add(0x10DE0191,@"G80"); - //mDevices.Add(0x10DE0193,@"G80"); - //mDevices.Add(0x10DE019D,@"G80"); - //mDevices.Add(0x10DE019E,@"G80"); - //mDevices.Add(0x10DE01A0,@"NVCrush11"); - //mDevices.Add(0x10DE01A4,@"nForce"); - //mDevices.Add(0x10DE01A5,@"nForce"); - //mDevices.Add(0x10DE01A6,@"nForce"); - //mDevices.Add(0x10DE01A8,@"nForce 220"); - //mDevices.Add(0x10DE01A9,@"nForce 420"); - //mDevices.Add(0x10DE01AA,@"nForce 220/230"); - //mDevices.Add(0x10DE01AB,@"nForce 415/420/430"); - //mDevices.Add(0x10DE01AC,@"nForce 2x0/415/4x0"); - //mDevices.Add(0x10DE01AD,@"nForce 2x0/415/4x0"); - //mDevices.Add(0x10DE01B0,@"nForce MCP"); - //mDevices.Add(0x10DE01B1,@"nForce MCP"); - //mDevices.Add(0x10DE01B2,@"nForce"); - //mDevices.Add(0x10DE01B4,@"nForce MCP"); - //mDevices.Add(0x10DE01B7,@"nForce"); - //mDevices.Add(0x10DE01B8,@"nForce"); - //mDevices.Add(0x10DE01BC,@"nForce MCP"); - //mDevices.Add(0x10DE01C1,@"nForce MCP"); - //mDevices.Add(0x10DE01C2,@"nForce MCP"); - //mDevices.Add(0x10DE01C3,@"nForce MCP"); - //mDevices.Add(0x10DE01D1,@"unknown"); - //mDevices.Add(0x10DE01D7,@"unknown"); - //mDevices.Add(0x10DE01DC,@"nvidia mobile graphics"); - //mDevices.Add(0x10DE01DD,@"7500LE"); - //mDevices.Add(0x10DE01E0,@"nForce2"); - //mDevices.Add(0x10DE01E1,@"nForce2"); - //mDevices.Add(0x10DE01E8,@"nForce2"); - //mDevices.Add(0x10DE01EA,@"nForce2"); - //mDevices.Add(0x10DE01EB,@"nForce2"); - //mDevices.Add(0x10DE01EC,@"nForce2"); - //mDevices.Add(0x10DE01ED,@"nForce2"); - //mDevices.Add(0x10DE01EE,@"nForce2"); - //mDevices.Add(0x10DE01EF,@"nForce2"); - //mDevices.Add(0x10DE0200,@"NV20"); - //mDevices.Add(0x10DE0201,@"NV2"); - //mDevices.Add(0x10DE0202,@"NV20BR"); - //mDevices.Add(0x10DE0203,@"NV20DCC"); - //mDevices.Add(0x10DE0221,@"unknown"); - //mDevices.Add(0x10DE0241,@"NVS 210S"); - //mDevices.Add(0x10DE0242,@"unknown"); - //mDevices.Add(0x10DE0244,@"Geforce Go 6150"); - //mDevices.Add(0x10DE0250,@"NV25"); - //mDevices.Add(0x10DE0251,@"NV25.2"); - //mDevices.Add(0x10DE0253,@"NVIDIA Corporation"); - //mDevices.Add(0x10DE0258,@"NV25GL.1"); - //mDevices.Add(0x10DE0259,@"NV25GL.2"); - //mDevices.Add(0x10DE025B,@"NV25GL.4"); - //mDevices.Add(0x10DE0264,@"NVIDIA SMB Bus Controller"); - //mDevices.Add(0x10DE0265,@"MCP51"); - //mDevices.Add(0x10DE0266,@"MCP51S"); - //mDevices.Add(0x10DE0267,@"MCP51S"); - //mDevices.Add(0x10DE0268,@"430"); - //mDevices.Add(0x10DE026C,@"6150"); - //mDevices.Add(0x10DE0271,@"unknown"); - //mDevices.Add(0x10DE0280,@"NV28.1"); - //mDevices.Add(0x10DE0281,@"NV28.2"); - //mDevices.Add(0x10DE0282,@"NV28.3"); - //mDevices.Add(0x10DE0286,@"???"); - //mDevices.Add(0x10DE0288,@"NV28GL.1"); - //mDevices.Add(0x10DE0289,@"NV28GL.2"); - //mDevices.Add(0x10DE028C,@"NV28GL"); - //mDevices.Add(0x10DE0291,@"0x0401"); - //mDevices.Add(0x10DE029C,@"G71"); - //mDevices.Add(0x10DE029D,@"G71"); - //mDevices.Add(0x10DE02A0,@"NV2A"); - //mDevices.Add(0x10DE02E2,@"Video Card GPU BFG 7300 512MB GT"); - //mDevices.Add(0x10DE0300,@"NV30.1"); - //mDevices.Add(0x10DE0301,@"NV30.2"); - //mDevices.Add(0x10DE0302,@"NV30.3"); - //mDevices.Add(0x10DE0308,@"NV30GL.1"); - //mDevices.Add(0x10DE0309,@"NV30GL.2"); - //mDevices.Add(0x10DE030A,@"NV30GL"); - //mDevices.Add(0x10DE0311,@"NV31.1"); - //mDevices.Add(0x10DE0312,@"NV31.2"); - //mDevices.Add(0x10DE0313,@"NV31?"); - //mDevices.Add(0x10DE0314,@"NV31"); - //mDevices.Add(0x10DE0318,@"NV31GL.1"); - //mDevices.Add(0x10DE0319,@"NV31GL.2"); - //mDevices.Add(0x10DE031A,@"NV31GL"); - //mDevices.Add(0x10DE031B,@"NV31B"); - //mDevices.Add(0x10DE031C,@"NV31C"); - //mDevices.Add(0x10DE0321,@"NV34.2"); - //mDevices.Add(0x10DE0322,@"NV34.3"); - //mDevices.Add(0x10DE0323,@"NV34.4"); - //mDevices.Add(0x10DE0324,@"NV"); - //mDevices.Add(0x10DE0325,@"nv36m"); - //mDevices.Add(0x10DE0326,@"NV34.6"); - //mDevices.Add(0x10DE0327,@"NV34.7"); - //mDevices.Add(0x10DE0328,@"NV34GL"); - //mDevices.Add(0x10DE0329,@"G73"); - //mDevices.Add(0x10DE032A,@"NV34GL.3"); - //mDevices.Add(0x10DE032B,@"NV34GL.4"); - //mDevices.Add(0x10DE032C,@"NV34GL"); - //mDevices.Add(0x10DE032D,@"NV34M"); - //mDevices.Add(0x10DE032F,@"NV34GL"); - //mDevices.Add(0x10DE0330,@"???"); - //mDevices.Add(0x10DE0331,@"???"); - //mDevices.Add(0x10DE0332,@"???"); - //mDevices.Add(0x10DE0333,@"NV38"); - //mDevices.Add(0x10DE0334,@"NV35.4"); - //mDevices.Add(0x10DE0338,@"NV35GL"); - //mDevices.Add(0x10DE0341,@"NV36.1"); - //mDevices.Add(0x10DE0342,@"NV36.2"); - //mDevices.Add(0x10DE0343,@"NV36.3"); - //mDevices.Add(0x10DE0344,@"NV36.4"); - //mDevices.Add(0x10DE0345,@"NV36.5"); - //mDevices.Add(0x10DE0348,@"NV36M"); - //mDevices.Add(0x10DE034E,@"nv36GL"); - //mDevices.Add(0x10DE034F,@"NV36GL?"); - //mDevices.Add(0x10DE036C,@"81FB1043"); - //mDevices.Add(0x10DE036E,@"MCP55"); - //mDevices.Add(0x10DE036F,@"MCP55"); - //mDevices.Add(0x10DE0371,@"ADI 1988"); - //mDevices.Add(0x10DE037E,@"MCP55"); - //mDevices.Add(0x10DE037F,@"MCP55S"); - //mDevices.Add(0x10DE0391,@"G73 B1"); - //mDevices.Add(0x10DE0393,@"UNKOWN"); - //mDevices.Add(0x10DE0398,@"G73"); - //mDevices.Add(0x10DE03D0,@"unknown"); - //mDevices.Add(0x10DE03E0,@"nForce 430"); - //mDevices.Add(0x10DE03E7,@"MCP61"); - //mDevices.Add(0x10DE03EC,@"MCP61"); - //mDevices.Add(0x10DE03EF,@"nForce 405"); - //mDevices.Add(0x10DE03F0,@"MCP61"); - //mDevices.Add(0x10DE03F6,@"MCP61"); - //mDevices.Add(0x10DE03F7,@"MCP61"); - //mDevices.Add(0x10DE0402,@"0402"); - //mDevices.Add(0x10DE0407,@"NVIDIA GeForce 8600M GT"); - //mDevices.Add(0x10DE040C,@"NVIDIA Quadro NVS 570M"); - //mDevices.Add(0x10DE0421,@"G86"); - //mDevices.Add(0x10DE0427,@"unknown"); - //mDevices.Add(0x10DE0428,@"NVIDIA� GeForce 8400M G"); - //mDevices.Add(0x10DE0429,@"Unknown"); - //mDevices.Add(0x10DE0448,@"MCP65"); - //mDevices.Add(0x10DE044C,@"MCP65"); - //mDevices.Add(0x10DE044D,@"MCP65"); - //mDevices.Add(0x10DE044E,@"MCP67D"); - //mDevices.Add(0x10DE044F,@"MCP65"); - //mDevices.Add(0x10DE045D,@"MCP65"); - //mDevices.Add(0x10DE0550,@"MCP67"); - //mDevices.Add(0x10DE0554,@"MCP67"); - //mDevices.Add(0x10DE0555,@"MCP67"); - //mDevices.Add(0x10DE0556,@"MCP67"); - //mDevices.Add(0x10DE0558,@"MCP67"); - //mDevices.Add(0x10DE0559,@"MCP67"); - //mDevices.Add(0x10DE055A,@"MCP67"); - //mDevices.Add(0x10DE0560,@"MCP67"); - //mDevices.Add(0x10DE056C,@"MCP73"); - //mDevices.Add(0x10DE0768,@"MCP ?"); - //mDevices.Add(0x10DE07B5,@"MCP72"); - //mDevices.Add(0x10DE07B9,@"MCP72"); - //mDevices.Add(0x10DE07D8,@"nForce 7100-630i (MCP73PV)"); - //mDevices.Add(0x10DE07DC,@"nForce 7100-630i (MCP73PV)"); - //mDevices.Add(0x10DE07F0,@"MCP73"); - //mDevices.Add(0x10DE07F4,@"MCP73"); - //mDevices.Add(0x10DE07F5,@"MCP73"); - //mDevices.Add(0x10DE07F6,@"MCP73"); - //mDevices.Add(0x10DE07F7,@"MCP73"); - //mDevices.Add(0x10DE07F8,@"MCP73"); - //mDevices.Add(0x10DE07F9,@"MCP73"); - //mDevices.Add(0x10DE07FA,@"MCP73"); - //mDevices.Add(0x10DE07FB,@"MCP73"); - //mDevices.Add(0x10DE0AB8,@"MCP79"); - //mDevices.Add(0x10DE0AB9,@"MCP79"); - //mDevices.Add(0x10DE0ABC,@"MCP79"); - //mDevices.Add(0x10DE0ABD,@"MCP79"); - //mDevices.Add(0x10DE10DE,@"NV3"); - //mDevices.Add(0x10DF10DF,@"Light Pulse"); - //mDevices.Add(0x10DF1AE5,@"LP6000"); - //mDevices.Add(0x10DFF0A5,@"PL1050Ex"); - //mDevices.Add(0x10DFF0E5,@"LPe1150"); - //mDevices.Add(0x10DFF700,@"LP7000"); - //mDevices.Add(0x10DFF800,@"LP8000"); - //mDevices.Add(0x10DFF900,@"????"); - //mDevices.Add(0x10DFF980,@"LP9802 / DC"); - //mDevices.Add(0x10DFFA00,@"LP10000"); - //mDevices.Add(0x10E10391,@"TRM-S1040"); - //mDevices.Add(0x10E1690C,@"DC-690c"); - //mDevices.Add(0x10E1DC20,@"DC-290"); - //mDevices.Add(0x10E30000,@"CA91C042/142"); - //mDevices.Add(0x10E30148,@"Tundra Tsi148"); - //mDevices.Add(0x10E30513,@"Tsi320"); - //mDevices.Add(0x10E30850,@"Tsi850"); - //mDevices.Add(0x10E30854,@"Tsi850"); - //mDevices.Add(0x10E30860,@"CA91C860"); - //mDevices.Add(0x10E30862,@"CA91L862A"); - //mDevices.Add(0x10E38260,@"CA91L8200/8260"); - //mDevices.Add(0x10E38261,@"CA91L8200/8260"); - //mDevices.Add(0x10E82011,@"Q-Motion pci 264"); - //mDevices.Add(0x10E84750,@"S5920Q 0048 A023"); - //mDevices.Add(0x10E85920,@"S5920q"); - //mDevices.Add(0x10E88033,@"BBK-PCI light"); - //mDevices.Add(0x10E88043,@"LANai4.x"); - //mDevices.Add(0x10E88062,@"S5933"); - //mDevices.Add(0x10E8807D,@"S5933"); - //mDevices.Add(0x10E88088,@"FS"); - //mDevices.Add(0x10E88089,@"SOB"); - //mDevices.Add(0x10E8809C,@"S5933"); - //mDevices.Add(0x10E880D7,@"PCI-9112"); - //mDevices.Add(0x10E880D8,@"PCI-7200"); - //mDevices.Add(0x10E880D9,@"PCI-9118"); - //mDevices.Add(0x10E8811A,@"PCI-DSlink"); - //mDevices.Add(0x10E88170,@"S5933"); - //mDevices.Add(0x10EA1680,@"IGA-1680"); - //mDevices.Add(0x10EA1682,@"IGA-1682"); - //mDevices.Add(0x10EA1683,@"IGA-1683"); - //mDevices.Add(0x10EA2000,@"CyberPro 2010"); - //mDevices.Add(0x10EA2010,@"CyberPro 20xx/2000A"); - //mDevices.Add(0x10EA5000,@"CyberPro 5000"); - //mDevices.Add(0x10EA5050,@"CyberPro 5050"); - //mDevices.Add(0x10EB0101,@"3GA"); - //mDevices.Add(0x10EB8111,@"Twist3"); - //mDevices.Add(0x10EC0139,@"rtl8139B"); - //mDevices.Add(0x10EC0260,@"RTL260"); - //mDevices.Add(0x10EC0262,@"ALC882"); - //mDevices.Add(0x10EC0268,@"Realtek ALC268"); - //mDevices.Add(0x10EC0880,@"al880"); - //mDevices.Add(0x10EC0883,@"alc883"); - //mDevices.Add(0x10EC0885,@"ALC885"); - //mDevices.Add(0x10EC0888,@"realtek high definition audio"); - //mDevices.Add(0x10EC8021,@"RTL8029AS"); - //mDevices.Add(0x10EC8029,@"RTL8029(as)pci ethernet nic"); - //mDevices.Add(0x10EC8119,@"10"); - //mDevices.Add(0x10EC8129,@"RTL8129"); - //mDevices.Add(0x10EC8131,@"LFE8139ATX"); - //mDevices.Add(0x10EC8138,@"RT8139B/C"); - //mDevices.Add(0x10EC8139,@"RTL-8139/8139C/8139C+"); - //mDevices.Add(0x10EC8167,@"-8168"); - //mDevices.Add(0x10EC8168,@"RTL8111B"); - //mDevices.Add(0x10EC8169,@"RTL8119"); - //mDevices.Add(0x10EC8180,@"RTL8180"); - //mDevices.Add(0x10EC8185,@"RTL-8185"); - //mDevices.Add(0x10EC8186,@"Gigabit"); - //mDevices.Add(0x10ED7310,@"V7310"); - //mDevices.Add(0x10EE0314,@"Spartan XC2S50E"); - //mDevices.Add(0x10EE3FC0,@"RME Digi96"); - //mDevices.Add(0x10EE3FC1,@"RME Digi96/8"); - //mDevices.Add(0x10EE3FC2,@"RME Digi 96/8 Pro"); - //mDevices.Add(0x10EE3FC3,@"RME Digi96/8 Pad"); - //mDevices.Add(0x10EE3FC4,@"Digi9652"); - //mDevices.Add(0x10EE3FC5,@"HDSP 9632"); - //mDevices.Add(0x10EE5343,@"Seamont SC100"); - //mDevices.Add(0x10EE8130,@"Durango PMC"); - //mDevices.Add(0x10EE8381,@"Santos"); - //mDevices.Add(0x10EF8154,@"M815x"); - //mDevices.Add(0x10F0A800,@"VCL-P"); - //mDevices.Add(0x10F0B300,@"VCL-M"); - //mDevices.Add(0x10F11566,@"IDE/SCSI"); - //mDevices.Add(0x10F11677,@"Multimedia"); - //mDevices.Add(0x10F12013,@"RS-56 sp-pci"); - //mDevices.Add(0x10F41300,@"rev1.1"); - //mDevices.Add(0x10F5A001,@"NDR4000"); - //mDevices.Add(0x10F60111,@"CMI8738/C3DX"); - //mDevices.Add(0x10FA0000,@"BT848KPF"); - //mDevices.Add(0x10FA0001,@"GUI Accelerator"); - //mDevices.Add(0x10FA0002,@"GUI Accelerator"); - //mDevices.Add(0x10FA0003,@"GUI Accelerator"); - //mDevices.Add(0x10FA0004,@"GUI Accelerator"); - //mDevices.Add(0x10FA0005,@"GUI Accelerator"); - //mDevices.Add(0x10FA0006,@"GUI Accelerator"); - //mDevices.Add(0x10FA0007,@"GUI Accelerator"); - //mDevices.Add(0x10FA0008,@"GUI Accelerator"); - //mDevices.Add(0x10FA0009,@"GUI Accelerator"); - //mDevices.Add(0x10FA000A,@"GUI Accelerator"); - //mDevices.Add(0x10FA000B,@"GUI Accelerator"); - //mDevices.Add(0x10FA000C,@"Targa 1000"); - //mDevices.Add(0x10FA000D,@"GUI Accelerator"); - //mDevices.Add(0x10FA000E,@"GUI Accelerator"); - //mDevices.Add(0x10FA000F,@"GUI Accelerator"); - //mDevices.Add(0x10FA0010,@"GUI Accelerator"); - //mDevices.Add(0x10FA0011,@"GUI Accelerator"); - //mDevices.Add(0x10FA0012,@"GUI Accelerator"); - //mDevices.Add(0x10FA0013,@"GUI Accelerator"); - //mDevices.Add(0x10FA0014,@"GUI Accelerator"); - //mDevices.Add(0x10FA0015,@"GUI Accelerator"); - //mDevices.Add(0x10FC8139,@"4020011B"); - //mDevices.Add(0x11003044,@"VT6306L"); - //mDevices.Add(0x11010002,@"INI-920"); - //mDevices.Add(0x11011060,@"INI-A100U2W"); - //mDevices.Add(0x1101134A,@"Ultra SCSI Adapter"); - //mDevices.Add(0x11019100,@"INI-9010/9010W"); - //mDevices.Add(0x11019400,@"INIC-940"); - //mDevices.Add(0x11019401,@"INIC-935"); - //mDevices.Add(0x11019500,@"1101"); - //mDevices.Add(0x11019502,@"INIC-950P"); - //mDevices.Add(0x11019700,@"Fast Wide SCSI"); - //mDevices.Add(0x11020002,@"t4780010004541"); - //mDevices.Add(0x11020003,@"EMU8008"); - //mDevices.Add(0x11020004,@"Creative SB Audigy 2 ZS (WDM)"); - //mDevices.Add(0x11020005,@"SB0460"); - //mDevices.Add(0x11020006,@"emu10k1x"); - //mDevices.Add(0x11020007,@"C6SB0410515017656A"); - //mDevices.Add(0x11020008,@"ca0108"); - //mDevices.Add(0x11021017,@"CT6760"); - //mDevices.Add(0x11021020,@"NV5"); - //mDevices.Add(0x11021047,@"EV1938"); - //mDevices.Add(0x11021371,@"ES1371-3"); - //mDevices.Add(0x11022898,@"es2898"); - //mDevices.Add(0x11024001,@"EMU10K1"); - //mDevices.Add(0x11027002,@"EMU10000"); - //mDevices.Add(0x11027003,@"EMU10K2"); - //mDevices.Add(0x11027004,@"Game port for SB Live! Series"); - //mDevices.Add(0x11027005,@"???"); - //mDevices.Add(0x11027802,@"EMU1OK1-NGF"); - //mDevices.Add(0x11028938,@"EV1938"); - //mDevices.Add(0x11030004,@"HPT366/368"); - //mDevices.Add(0x11030005,@"HPT370/372"); - //mDevices.Add(0x11030006,@"HPT302"); - //mDevices.Add(0x11030007,@"HPT371"); - //mDevices.Add(0x11030008,@"HPT-374"); - //mDevices.Add(0x11031720,@"RR172x"); - //mDevices.Add(0x11031740,@"RR174x"); - //mDevices.Add(0x11031742,@"RR174x"); - //mDevices.Add(0x11032210,@"RR2210"); - //mDevices.Add(0x11032300,@"RR2300"); - //mDevices.Add(0x11032310,@"RR231x"); - //mDevices.Add(0x11032340,@"RR2340"); - //mDevices.Add(0x11032522,@"RR252x"); - //mDevices.Add(0x11033120,@"RR312x"); - //mDevices.Add(0x11033220,@"RR322x"); - //mDevices.Add(0x11033320,@"RR332x"); - //mDevices.Add(0x11033410,@"RR341x"); - //mDevices.Add(0x11033510,@"RR35xx"); - //mDevices.Add(0x11033511,@"RR35xx"); - //mDevices.Add(0x11033520,@"RR35xx"); - //mDevices.Add(0x11033521,@"RR35xx"); - //mDevices.Add(0x11033522,@"RR35xx"); - //mDevices.Add(0x11033540,@"RR35xx"); - //mDevices.Add(0x11034320,@"RR432x"); - //mDevices.Add(0x11035081,@"RR18xx"); - //mDevices.Add(0x11036081,@"RR222x/224x"); - //mDevices.Add(0x11037042,@"RR231x"); - //mDevices.Add(0x11055000,@"Multimedia"); - //mDevices.Add(0x11058300,@"EM8400"); - //mDevices.Add(0x11058400,@"EM8400"); - //mDevices.Add(0x11058475,@"EM8475"); - //mDevices.Add(0x11060130,@"VT6305"); - //mDevices.Add(0x11060198,@"CPU to PCI Bridge"); - //mDevices.Add(0x11060238,@"K8T890"); - //mDevices.Add(0x11060259,@"unknown"); - //mDevices.Add(0x11060269,@"KT880"); - //mDevices.Add(0x11060282,@"K8T880Pro"); - //mDevices.Add(0x11060305,@"VT8363A/8365"); - //mDevices.Add(0x11060391,@"VT8363/71"); - //mDevices.Add(0x11060501,@"VT8501"); - //mDevices.Add(0x11060505,@"82C505"); - //mDevices.Add(0x11060561,@"82C570 MV"); - //mDevices.Add(0x11060571,@"VT82C586A/B/VT82C686/A/B/VT823x/A/C"); - //mDevices.Add(0x11060576,@"82C576"); - //mDevices.Add(0x11060581,@"CX700"); - //mDevices.Add(0x11060585,@"VT82C585VP/VPX"); - //mDevices.Add(0x11060586,@"VT82C586VP"); - //mDevices.Add(0x11060591,@"VT8237S"); - //mDevices.Add(0x11060595,@"VT82C595"); - //mDevices.Add(0x11060596,@"VT82C596"); - //mDevices.Add(0x11060597,@"VT82C597"); - //mDevices.Add(0x11060598,@"VT82C598"); - //mDevices.Add(0x11060601,@"VIA8601"); - //mDevices.Add(0x11060605,@"VT82c686"); - //mDevices.Add(0x11060680,@"VT82C680"); - //mDevices.Add(0x11060686,@"VT82C686/686A/686B"); - //mDevices.Add(0x11060691,@"VIA VT KN133"); - //mDevices.Add(0x11060692,@"North Bridge"); - //mDevices.Add(0x11060693,@"VT82C693"); - //mDevices.Add(0x11060926,@"VT86C926"); - //mDevices.Add(0x11061000,@"82C570MV"); - //mDevices.Add(0x11061106,@"060000"); - //mDevices.Add(0x11061204,@"???"); - //mDevices.Add(0x11061238,@"K8T890"); - //mDevices.Add(0x11061259,@"unknown"); - //mDevices.Add(0x11061269,@"KT880"); - //mDevices.Add(0x11061282,@"K8T880Pro"); - //mDevices.Add(0x11061571,@"VT82C416"); - //mDevices.Add(0x11061595,@"VT82C595/97"); - //mDevices.Add(0x11061708,@"0x1708"); - //mDevices.Add(0x11062006,@"VT6105M"); - //mDevices.Add(0x11062204,@"???"); - //mDevices.Add(0x11062238,@"K8T890"); - //mDevices.Add(0x11062259,@"unknown"); - //mDevices.Add(0x11062269,@"KT880"); - //mDevices.Add(0x11062282,@"K8T880Pro"); - //mDevices.Add(0x11063038,@"VT83C572/6202/82C586A/B/82C596/A/B/82C686A/B etc"); - //mDevices.Add(0x11063040,@"VT82C586A/B"); - //mDevices.Add(0x11063041,@"82C570MV"); - //mDevices.Add(0x11063043,@"VT86C100A"); - //mDevices.Add(0x11063044,@"VT8375"); - //mDevices.Add(0x11063050,@"VT82C596/596A/596"); - //mDevices.Add(0x11063051,@"Power Management Controller"); - //mDevices.Add(0x11063053,@"VT6105M"); - //mDevices.Add(0x11063057,@"VT82C686A/B"); - //mDevices.Add(0x11063058,@"VT8237"); - //mDevices.Add(0x11063059,@"VT8237"); - //mDevices.Add(0x11063065,@"VT6102"); - //mDevices.Add(0x11063068,@"VT82C686A/B&VT8231"); - //mDevices.Add(0x11063074,@"VT8233"); - //mDevices.Add(0x11063086,@"VT82C686"); - //mDevices.Add(0x11063091,@"VT8633"); - //mDevices.Add(0x11063099,@"VT8366/66A/67"); - //mDevices.Add(0x11063101,@"VT8653"); - //mDevices.Add(0x11063102,@"VT8362"); - //mDevices.Add(0x11063103,@"VT8615"); - //mDevices.Add(0x11063104,@"VT6202"); - //mDevices.Add(0x11063106,@"VT6105M/LOM"); - //mDevices.Add(0x11063107,@"VT8233/A AC97' Enhance Audio Controller"); - //mDevices.Add(0x11063108,@"Unknown"); - //mDevices.Add(0x11063109,@"VT8233/A AC97' Enhance Audio Controller"); - //mDevices.Add(0x11063112,@"VT8361"); - //mDevices.Add(0x11063113,@"PCI to PCI Bridge"); - //mDevices.Add(0x11063116,@"VT8375"); - //mDevices.Add(0x11063118,@"CN400"); - //mDevices.Add(0x11063119,@"VT6120/VT6121/VT6122"); - //mDevices.Add(0x11063122,@"VT8623"); - //mDevices.Add(0x11063123,@"VT8623"); - //mDevices.Add(0x11063128,@"vt8753"); - //mDevices.Add(0x11063133,@"VT3133"); - //mDevices.Add(0x11063147,@"VT8233"); - //mDevices.Add(0x11063148,@"VT8751"); - //mDevices.Add(0x11063149,@"VT8237 Family/ VT6420"); - //mDevices.Add(0x11063156,@"VT8372"); - //mDevices.Add(0x11063158,@"CPU-to-PCI Bridge"); - //mDevices.Add(0x11063164,@"VT6410"); - //mDevices.Add(0x11063168,@"VT8374"); - //mDevices.Add(0x11063177,@"VT8235"); - //mDevices.Add(0x11063178,@"CPU to PCI Bridge"); - //mDevices.Add(0x11063188,@"K8HTB-8237"); - //mDevices.Add(0x11063189,@"VT8377"); - //mDevices.Add(0x11063198,@"VEN_1106&DEV_B198&SUBSYS_00000000&REV_00"); - //mDevices.Add(0x11063202,@"CPU to PCI Bridge"); - //mDevices.Add(0x11063204,@"1394 i2c"); - //mDevices.Add(0x11063205,@"CPU to PCI Bridge"); - //mDevices.Add(0x11063208,@"PT890"); - //mDevices.Add(0x11063209,@"CPU to PCI Bridge"); - //mDevices.Add(0x11063213,@"PCI to PCI Bridge"); - //mDevices.Add(0x11063227,@"VT8237"); - //mDevices.Add(0x11063230,@"K8N890CE Display Driver"); - //mDevices.Add(0x11063238,@"K8T890"); - //mDevices.Add(0x11063249,@"VT6421"); - //mDevices.Add(0x11063258,@"PT880"); - //mDevices.Add(0x11063259,@"???"); - //mDevices.Add(0x11063269,@"KT880"); - //mDevices.Add(0x11063282,@"K8T880Pro"); - //mDevices.Add(0x11063288,@"040300"); - //mDevices.Add(0x11063343,@"81CE1043"); - //mDevices.Add(0x11063344,@"P4M800PRO&8237R"); - //mDevices.Add(0x11063349,@"VT8251"); - //mDevices.Add(0x11063371,@"S3G700"); - //mDevices.Add(0x11064149,@"VT6420"); - //mDevices.Add(0x11064204,@"???"); - //mDevices.Add(0x11064238,@"???"); - //mDevices.Add(0x11064258,@"???"); - //mDevices.Add(0x11064259,@"???"); - //mDevices.Add(0x11064269,@"KT880"); - //mDevices.Add(0x11064282,@"K8T880Pro"); - //mDevices.Add(0x11065030,@"VT82C596"); - //mDevices.Add(0x11066100,@"VIA VT86C100A"); - //mDevices.Add(0x11067204,@"K8M400"); - //mDevices.Add(0x11067205,@"KM400"); - //mDevices.Add(0x11067238,@"K8T890"); - //mDevices.Add(0x11067258,@"PT880"); - //mDevices.Add(0x11067259,@"PM880"); - //mDevices.Add(0x11067269,@"KT880"); - //mDevices.Add(0x11067282,@"K8T880Pro"); - //mDevices.Add(0x11067353,@"CX700"); - //mDevices.Add(0x11067372,@"VT8237S"); - //mDevices.Add(0x11068208,@"PT890?"); - //mDevices.Add(0x11068231,@"VT8231"); - //mDevices.Add(0x11068235,@"VT8751"); - //mDevices.Add(0x11068237,@"VT8237"); - //mDevices.Add(0x11068305,@"VT8363A/65"); - //mDevices.Add(0x11068391,@"VT8363/71"); - //mDevices.Add(0x11068501,@"VT8501"); - //mDevices.Add(0x11068596,@"VT82C596"); - //mDevices.Add(0x11068597,@"VT82C597"); - //mDevices.Add(0x11068598,@"VT82C598"); - //mDevices.Add(0x11068601,@"VT82C601"); - //mDevices.Add(0x11068602,@"CPU to AGP Bridge"); - //mDevices.Add(0x11068605,@"VT8605"); - //mDevices.Add(0x11068691,@"VT82C691/693A/694X"); - //mDevices.Add(0x11068693,@"VT82C693"); - //mDevices.Add(0x11069238,@"K8T890"); - //mDevices.Add(0x11069398,@"VT8601"); - //mDevices.Add(0x11069876,@"VT8233/A AC97' Enhance Audio Controller"); - //mDevices.Add(0x1106A208,@"PT890"); - //mDevices.Add(0x1106A238,@"K8T890"); - //mDevices.Add(0x1106B091,@"VT8633"); - //mDevices.Add(0x1106B099,@"VT8366/A"); - //mDevices.Add(0x1106B101,@"VT8653"); - //mDevices.Add(0x1106B102,@"VT8362"); - //mDevices.Add(0x1106B103,@"VT8615"); - //mDevices.Add(0x1106B112,@"VT8361"); - //mDevices.Add(0x1106B113,@"I/O APIC"); - //mDevices.Add(0x1106B115,@"VT8363/65"); - //mDevices.Add(0x1106B116,@"VT8375"); - //mDevices.Add(0x1106B133,@"vt686b"); - //mDevices.Add(0x1106B148,@"VT8751 Apollo"); - //mDevices.Add(0x1106B156,@"VT8372"); - //mDevices.Add(0x1106B158,@"PCI-to-PCI Bridge (AGP)"); - //mDevices.Add(0x1106B168,@"VT8235"); - //mDevices.Add(0x1106B188,@"PCI-to-PCI Bridge (AGP 2.0/3.0)"); - //mDevices.Add(0x1106B198,@"546546"); - //mDevices.Add(0x1106B213,@"I/O APIC"); - //mDevices.Add(0x1106C208,@"PT890"); - //mDevices.Add(0x1106C238,@"K8T890"); - //mDevices.Add(0x1106D208,@"PT890"); - //mDevices.Add(0x1106D213,@"PCI to PCI Bridge"); - //mDevices.Add(0x1106D238,@"K8T890"); - //mDevices.Add(0x1106E208,@"PT890"); - //mDevices.Add(0x1106E238,@"K8T890"); - //mDevices.Add(0x1106F208,@"PT890"); - //mDevices.Add(0x1106F238,@"K8T890"); - //mDevices.Add(0x11078576,@"PCI Host Bridge"); - //mDevices.Add(0x11080100,@"p1690plus-AA"); - //mDevices.Add(0x11080101,@"p1690plus-AB"); - //mDevices.Add(0x11080105,@"P1690Plus"); - //mDevices.Add(0x11080108,@"P1690Plus"); - //mDevices.Add(0x11080138,@"P1690Plus"); - //mDevices.Add(0x11080139,@"P1690Plus"); - //mDevices.Add(0x1108013C,@"P1690Plus"); - //mDevices.Add(0x1108013D,@"P1690Plus"); - //mDevices.Add(0x11091400,@"EM110TX"); - //mDevices.Add(0x110A2101,@"PEB 20321"); - //mDevices.Add(0x110A2102,@"PEB 20534"); - //mDevices.Add(0x110A3141,@"01"); - //mDevices.Add(0x110A4033,@"ERTEC400"); - //mDevices.Add(0x110B0001,@"Mpact"); - //mDevices.Add(0x110B0002,@"GM90C7110VX"); - //mDevices.Add(0x11122200,@"2200"); - //mDevices.Add(0x11122300,@"2300"); - //mDevices.Add(0x11122400,@"2400"); - //mDevices.Add(0x11131211,@"mpx en5038a1"); - //mDevices.Add(0x11131216,@"EN5251BE"); - //mDevices.Add(0x11131217,@"EN-2242"); - //mDevices.Add(0x11135105,@"EN-1660"); - //mDevices.Add(0x11139211,@"EN-1207D"); - //mDevices.Add(0x11139511,@"SMC en5251be"); - //mDevices.Add(0x11139876,@"EN5251BE"); - //mDevices.Add(0x11140506,@"AT76C506"); - //mDevices.Add(0x11143202,@"AT97SC3202"); - //mDevices.Add(0x11160022,@"DT3001"); - //mDevices.Add(0x11160023,@"DT3002"); - //mDevices.Add(0x11160024,@"DT3003"); - //mDevices.Add(0x11160025,@"DT3004"); - //mDevices.Add(0x11160026,@"Dt3005"); - //mDevices.Add(0x11160027,@"DT3001-PGL"); - //mDevices.Add(0x11160028,@"DT3003-PGL"); - //mDevices.Add(0x11179500,@"max-lc SVGA card"); - //mDevices.Add(0x11179501,@"MaxPCI image processing board"); - //mDevices.Add(0x11190000,@"GDT6000/6020/6050"); - //mDevices.Add(0x11190001,@"GDT6000/6010"); - //mDevices.Add(0x11190002,@"GDT6110/6510"); - //mDevices.Add(0x11190003,@"GDT6120/6520"); - //mDevices.Add(0x11190004,@"GDT6530"); - //mDevices.Add(0x11190005,@"GDT6550"); - //mDevices.Add(0x11190006,@"GDT6117/6517"); - //mDevices.Add(0x11190007,@"GDT6127/6527"); - //mDevices.Add(0x11190008,@"GDT6537"); - //mDevices.Add(0x11190009,@"GDT6557/6557-ECC"); - //mDevices.Add(0x1119000A,@"GDT6115/6515"); - //mDevices.Add(0x1119000B,@"GDT6125/6525"); - //mDevices.Add(0x1119000C,@"GDT6535"); - //mDevices.Add(0x1119000D,@"GDT6555/6555-ECC"); - //mDevices.Add(0x11190100,@"GDT6117RP/6517RP"); - //mDevices.Add(0x11190101,@"GDT6127RP/6527RP"); - //mDevices.Add(0x11190102,@"GDT6537RP"); - //mDevices.Add(0x11190103,@"GDT6557RP"); - //mDevices.Add(0x11190104,@"GDT6111RP/6511RP"); - //mDevices.Add(0x11190105,@"GDT6121RP/6521RP"); - //mDevices.Add(0x11190110,@"GDT6117RD/6517RD"); - //mDevices.Add(0x11190111,@"GDT6127RD/6527RD"); - //mDevices.Add(0x11190112,@"GDT6537RD"); - //mDevices.Add(0x11190113,@"GDT6557RD"); - //mDevices.Add(0x11190114,@"GDT6111RD/6511RD"); - //mDevices.Add(0x11190115,@"GDT6127RD/6527RD"); - //mDevices.Add(0x11190118,@"GDT6x18RD"); - //mDevices.Add(0x11190119,@"GDT6x28RD"); - //mDevices.Add(0x1119011A,@"GDT6538RD/6638RD"); - //mDevices.Add(0x1119011B,@"GDT6558RD/6658RD"); - //mDevices.Add(0x11190120,@"GDT6117RP2/6517RP2"); - //mDevices.Add(0x11190121,@"GDT6127RP2/6527RP2"); - //mDevices.Add(0x11190122,@"GDT6537RP2"); - //mDevices.Add(0x11190123,@"GDT6557RP2"); - //mDevices.Add(0x11190124,@"GDT6111RP2/6511RP2"); - //mDevices.Add(0x11190125,@"GDT6127RP2/6527RP2"); - //mDevices.Add(0x11190136,@"GDT 6x13RS"); - //mDevices.Add(0x11190137,@"GDT 6x23RS"); - //mDevices.Add(0x11190138,@"GDT 6x18RS"); - //mDevices.Add(0x11190139,@"GDT 6x28RS"); - //mDevices.Add(0x1119013A,@"GDT 6x38RS"); - //mDevices.Add(0x1119013B,@"GDT 6x58RS"); - //mDevices.Add(0x1119013C,@"GDT 6x33RS"); - //mDevices.Add(0x1119013D,@"GDT 6x43RS"); - //mDevices.Add(0x1119013E,@"GDT 6x53RS"); - //mDevices.Add(0x1119013F,@"GDT 6x63RS"); - //mDevices.Add(0x11190166,@"GDT 7x13RN"); - //mDevices.Add(0x11190167,@"GDT 7x23RN"); - //mDevices.Add(0x11190168,@"GDT7x18RN"); - //mDevices.Add(0x11190169,@"GDT7x28RN"); - //mDevices.Add(0x1119016A,@"GDT7538RN/7638RN"); - //mDevices.Add(0x1119016B,@"GDT7558RN/7658RN"); - //mDevices.Add(0x1119016C,@"GDT 7x33RN"); - //mDevices.Add(0x1119016D,@"GDT 7x43RN"); - //mDevices.Add(0x1119016E,@"GDT 7x53RN"); - //mDevices.Add(0x1119016F,@"GDT 7x63RN"); - //mDevices.Add(0x111901D6,@"GDT 4x13RZ"); - //mDevices.Add(0x111901D7,@"GDT 4x23RZ"); - //mDevices.Add(0x111901F6,@"GDT 8x13RZ"); - //mDevices.Add(0x111901F7,@"GDT 8x23RZ"); - //mDevices.Add(0x111901FC,@"GDT 8x33RZ"); - //mDevices.Add(0x111901FD,@"GDT 8x43RZ"); - //mDevices.Add(0x111901FE,@"GDT 8x53RZ"); - //mDevices.Add(0x111901FF,@"GDT 8x63RZ"); - //mDevices.Add(0x11190210,@"GDT6519RD/6619RD"); - //mDevices.Add(0x11190211,@"GDT6529RD/6629RD"); - //mDevices.Add(0x11190260,@"GDT7519RN/7619RN"); - //mDevices.Add(0x11190261,@"GDT7529RN/7629RN"); - //mDevices.Add(0x11190300,@"GDT Rx"); - //mDevices.Add(0x111A0000,@"155P-MF1"); - //mDevices.Add(0x111A0002,@"166P-MF1"); - //mDevices.Add(0x111A0003,@"ENI-25P"); - //mDevices.Add(0x111C0001,@"Powerbus Bridge"); - //mDevices.Add(0x111D0001,@"IDT77201/211"); - //mDevices.Add(0x111D0003,@"IDT77222/252"); - //mDevices.Add(0x111D0004,@"IDT77V252"); - //mDevices.Add(0x111F4A47,@"Precision MX"); - //mDevices.Add(0x111F5243,@"Frame Capture Bus Interface"); - //mDevices.Add(0x11270200,@"FireRunner PCA-200"); - //mDevices.Add(0x11270210,@"PCA-200PC"); - //mDevices.Add(0x11270250,@"ATM"); - //mDevices.Add(0x11270300,@"PCA-200E"); - //mDevices.Add(0x11270310,@"ATM"); - //mDevices.Add(0x11270400,@"ForeRunner HE"); - //mDevices.Add(0x112E0000,@"EIDE/hdd and IDE/cd-rom Ctrlr"); - //mDevices.Add(0x112E000B,@"EIDE/hdd and IDE/cd-rom Ctrlr"); - //mDevices.Add(0x1130F211,@"0x010"); - //mDevices.Add(0x11311131,@"7130"); - //mDevices.Add(0x11311201,@"PTD3000"); - //mDevices.Add(0x11311234,@"EHCI USB 2.0 Controller"); - //mDevices.Add(0x11311301,@"PTD3210"); - //mDevices.Add(0x11311562,@"ISP1561"); - //mDevices.Add(0x11312780,@"TDA2780AQ"); - //mDevices.Add(0x11313400,@"UCB1500"); - //mDevices.Add(0x11313401,@"UCB1500"); - //mDevices.Add(0x11315400,@"TriMedia TM1000/1100"); - //mDevices.Add(0x11315402,@"TriMedia TM-1300EH"); - //mDevices.Add(0x11315406,@"TriMedia PNX1700"); - //mDevices.Add(0x11317130,@"73c0a1434628"); - //mDevices.Add(0x11317133,@"Pinnacle PCTV 110i"); - //mDevices.Add(0x11317134,@"SAA7135"); - //mDevices.Add(0x11317145,@"d145ah"); - //mDevices.Add(0x11317146,@"saa7135HL"); - //mDevices.Add(0x11319730,@"SAA9730"); - //mDevices.Add(0x11337711,@"EiconCard C91"); - //mDevices.Add(0x11337901,@"EiconCard S90"); - //mDevices.Add(0x11337943,@"EiconCard S94"); - //mDevices.Add(0x11337944,@"EiconCard S94"); - //mDevices.Add(0x1133B923,@"EiconCard P92"); - //mDevices.Add(0x1133E001,@"DIVA Pro 2.0 S/T"); - //mDevices.Add(0x1133E002,@"DIVA 2.0 S/T"); - //mDevices.Add(0x1133E003,@"DIVA Pro 2.0 U"); - //mDevices.Add(0x1133E004,@"DIVA 2.0 U"); - //mDevices.Add(0x1133E005,@"DIVA 2.01 S/T"); - //mDevices.Add(0x1133E00B,@"DIVA ISDN 2.02 PCI"); - //mDevices.Add(0x1133E010,@"Maestra"); - //mDevices.Add(0x1133E012,@"MaestraQ"); - //mDevices.Add(0x1133E013,@"MaestraQ-U"); - //mDevices.Add(0x1133E014,@"MaestraP"); - //mDevices.Add(0x1133E015,@"Diva Server PRI-30M PCI v.2"); - //mDevices.Add(0x1133E018,@"DIVA Server BRI-2M/-2F"); - //mDevices.Add(0x11340001,@"Raceway Bridge"); - //mDevices.Add(0x11340002,@"DPRB"); - //mDevices.Add(0x11350001,@"Printer Cntrlr"); - //mDevices.Add(0x11388905,@"8905"); - //mDevices.Add(0x113C0000,@"PCI9060"); - //mDevices.Add(0x113C0001,@"PCI9060"); - //mDevices.Add(0x113C0911,@"PCI911"); - //mDevices.Add(0x113C0912,@"PCI912"); - //mDevices.Add(0x113C0913,@"PCI913"); - //mDevices.Add(0x113C0914,@"PCI914"); - //mDevices.Add(0x113F0808,@"SST-64P"); - //mDevices.Add(0x113F1010,@"SST-128P"); - //mDevices.Add(0x11410001,@"EIDE/ATAPI super adapter"); - //mDevices.Add(0x11423210,@"ProMotion 3210"); - //mDevices.Add(0x11426410,@"6410 6422"); - //mDevices.Add(0x11426412,@"GUI Accelerator"); - //mDevices.Add(0x11426420,@"GUI Accelerator"); - //mDevices.Add(0x11426422,@"ProMotion-6422"); - //mDevices.Add(0x11426424,@"ProVideo 6424"); - //mDevices.Add(0x11426425,@"ProMotion AT25"); - //mDevices.Add(0x11426426,@"GUI Accelerator"); - //mDevices.Add(0x1142643D,@"AT25"); - //mDevices.Add(0x11429876,@"ProMotion AT25"); - //mDevices.Add(0x11440001,@"Noservo Cntrlr"); - //mDevices.Add(0x1145F020,@"CardBus ATAPI Host Adapter"); - //mDevices.Add(0x1145F021,@"NPATA32"); - //mDevices.Add(0x11471123,@"123"); - //mDevices.Add(0x11484000,@"SK-NET"); - //mDevices.Add(0x11484200,@"Token Ring Adapter"); - //mDevices.Add(0x11484300,@"SysKonnect Genesis"); - //mDevices.Add(0x11484320,@"Marvell Yukon"); - //mDevices.Add(0x11489000,@"Marvell Yukon II PCI-X"); - //mDevices.Add(0x11489E00,@"Marvell Yukon EC"); - //mDevices.Add(0x114A5565,@"VMIPCI-5565"); - //mDevices.Add(0x114A5579,@"VMIPCI-5579"); - //mDevices.Add(0x114A5588,@"VMICPCI5588"); - //mDevices.Add(0x114A6504,@"Timer/SRAM FPGA"); - //mDevices.Add(0x114A7587,@"VMIVME-7587"); - //mDevices.Add(0x114D2189,@"0x1002114D"); - //mDevices.Add(0x114F0002,@"AccelePort EPC"); - //mDevices.Add(0x114F0003,@"RightSwitch SE-6"); - //mDevices.Add(0x114F0004,@"AccelePort Xem"); - //mDevices.Add(0x114F0005,@"AccelePort Xr"); - //mDevices.Add(0x114F0006,@"AccelePort C/X"); - //mDevices.Add(0x114F0007,@"DataFire PCI 1 S/T"); - //mDevices.Add(0x114F0009,@"AccelePort Xr/J"); - //mDevices.Add(0x114F000A,@"AccelePort EPC/J"); - //mDevices.Add(0x114F000C,@"DataFirePRIme T1"); - //mDevices.Add(0x114F000D,@"SyncPort"); - //mDevices.Add(0x114F0011,@"AccelePort8r EIA-232"); - //mDevices.Add(0x114F0012,@"AccelePort8r EIA-422"); - //mDevices.Add(0x114F0013,@"AccelePort Xr"); - //mDevices.Add(0x114F0014,@"AccelePort8r EIA-422"); - //mDevices.Add(0x114F0015,@"AccelePort Xem"); - //mDevices.Add(0x114F0016,@"AccelePort EPC/X"); - //mDevices.Add(0x114F0017,@"AccelePort C/X"); - //mDevices.Add(0x114F0019,@"DataFire PCI 1 U"); - //mDevices.Add(0x114F001A,@"DataFirePRIme E1"); - //mDevices.Add(0x114F001B,@"AccelePort C/X (IBM)"); - //mDevices.Add(0x114F001D,@"DataFire RAS"); - //mDevices.Add(0x114F001F,@"ClydeNonCsu6034"); - //mDevices.Add(0x114F0020,@"ClydeNonCsu6032"); - //mDevices.Add(0x114F0021,@"ClydeNonCsu4"); - //mDevices.Add(0x114F0022,@"ClydeNonCsu2"); - //mDevices.Add(0x114F0023,@"AccelePort RAS"); - //mDevices.Add(0x114F0024,@"DataFire RAS B4 ST/U"); - //mDevices.Add(0x114F0026,@"AccelePort 4r 920"); - //mDevices.Add(0x114F0027,@"AccelePort 8r 920"); - //mDevices.Add(0x114F0029,@"DigiClassic PCI"); - //mDevices.Add(0x114F0034,@"AccelePort 2r 920"); - //mDevices.Add(0x114F0035,@"DataFire DSP"); - //mDevices.Add(0x114F0040,@"AccelePort Xp"); - //mDevices.Add(0x114F0042,@"AccelePort 2p PCI"); - //mDevices.Add(0x114F0070,@"DataFire Micro V"); - //mDevices.Add(0x114F0071,@"DataFire Micro V"); - //mDevices.Add(0x114F0072,@"DataFire Micro V"); - //mDevices.Add(0x114F0073,@"DataFire Micro V"); - //mDevices.Add(0x114F6001,@"Avanstar"); - //mDevices.Add(0x11550810,@"486 CPU/PCI Bridge"); - //mDevices.Add(0x11550922,@"2838"); - //mDevices.Add(0x11550926,@"PCI/ISA Bridge"); - //mDevices.Add(0x11583011,@"Tokenet/vg 1001/10m anylan"); - //mDevices.Add(0x11589050,@"Lanfleet/Truevalue"); - //mDevices.Add(0x11589051,@"Lanfleet/Truevalue"); - //mDevices.Add(0x11590001,@"MV1000"); - //mDevices.Add(0x11590002,@"MV-1500"); - //mDevices.Add(0x115D0003,@"RBEM56G-100"); - //mDevices.Add(0x115D0005,@"CardBus Ethernet 10/100"); - //mDevices.Add(0x115D0007,@"CardBus Ethernet 10/100"); - //mDevices.Add(0x115D000B,@"CardBus Ethernet 10/100"); - //mDevices.Add(0x115D000C,@"MPCI 3A56GSP-100 PA"); - //mDevices.Add(0x115D000F,@"CardBus Ethernet 10/100"); - //mDevices.Add(0x115D0076,@"Xircom MPCI3B-56G (Lucent SCORPIO) Soft"); - //mDevices.Add(0x115D00D4,@"MPCI"); - //mDevices.Add(0x115D0101,@"CardBus 56k Modem"); - //mDevices.Add(0x115D0103,@"CardBus Ehternet + 56k Modem"); - //mDevices.Add(0x11610001,@"Host Bridge"); - //mDevices.Add(0x11630001,@"Verite 1000"); - //mDevices.Add(0x11632000,@"Verite 2x00"); - //mDevices.Add(0x11650001,@"Motion JPEG rec/play w/audio"); - //mDevices.Add(0x11660005,@"NB6536 (CNB20-LE)"); - //mDevices.Add(0x11660006,@"NB6536 (CNB20-HE)"); - //mDevices.Add(0x11660007,@"NB6635 (CNB20-LE/HE)"); - //mDevices.Add(0x11660008,@"NB6536 (CNB20-HE)"); - //mDevices.Add(0x11660009,@"NB6536 (CNB20-LE)"); - //mDevices.Add(0x11660010,@"CIOB30"); - //mDevices.Add(0x11660011,@"CMIC-HE"); - //mDevices.Add(0x11660012,@"CMIC-LE"); - //mDevices.Add(0x11660013,@"CNB20-HE"); - //mDevices.Add(0x11660014,@"CNB20-HE"); - //mDevices.Add(0x11660015,@"CMIC-GC"); - //mDevices.Add(0x11660016,@"CMIC-GC"); - //mDevices.Add(0x11660017,@"CMIC-SL"); - //mDevices.Add(0x11660101,@"CIOB-X2"); - //mDevices.Add(0x11660103,@"BCM5715"); - //mDevices.Add(0x11660110,@"CIOB-E"); - //mDevices.Add(0x11660200,@"OSB4"); - //mDevices.Add(0x11660201,@"CSB5"); - //mDevices.Add(0x11660203,@"CSB6"); - //mDevices.Add(0x11660211,@"OSB4"); - //mDevices.Add(0x11660212,@"CSB5"); - //mDevices.Add(0x11660213,@"OSB6"); - //mDevices.Add(0x11660217,@"OSB6"); - //mDevices.Add(0x11660220,@"OSB4"); - //mDevices.Add(0x11660221,@"OSB6"); - //mDevices.Add(0x11660223,@"0x0223"); - //mDevices.Add(0x11660225,@"CSB5"); - //mDevices.Add(0x11660227,@"CSB6"); - //mDevices.Add(0x11660230,@"???"); - //mDevices.Add(0x11660241,@"BC4852"); - //mDevices.Add(0x11690102,@"QL5032"); - //mDevices.Add(0x11690202,@"QL5032"); - //mDevices.Add(0x11690302,@"QL5032"); - //mDevices.Add(0x11690402,@"QL5032"); - //mDevices.Add(0x11690502,@"QL5232"); - //mDevices.Add(0x11690902,@"QL5232"); - //mDevices.Add(0x11692001,@"Ql5032-33APQ208C"); - //mDevices.Add(0x116A6100,@"Bus/Tag Channel"); - //mDevices.Add(0x116A6800,@"Escon Channel"); - //mDevices.Add(0x116A7100,@"Bus/Tag Channel"); - //mDevices.Add(0x116A7800,@"Escon Channel"); - //mDevices.Add(0x116E0500,@"Vx500"); - //mDevices.Add(0x11720001,@"EPF6016ATC144-2"); - //mDevices.Add(0x11720004,@"Multi-serial card"); - //mDevices.Add(0x11768474,@"42000133"); - //mDevices.Add(0x1178AFA1,@"Fast Ethernet"); - //mDevices.Add(0x11790102,@"toshiba america info systems"); - //mDevices.Add(0x11790103,@"Extended PCI IDE Controller Type-B"); - //mDevices.Add(0x11790406,@"Tecra a2"); - //mDevices.Add(0x11790601,@"Toshiba CPU to PCI bridge"); - //mDevices.Add(0x11790602,@"PCI to ISA Bridge for Notebooks"); - //mDevices.Add(0x11790603,@"ToPIC95"); - //mDevices.Add(0x11790604,@"PCI to PCI Bridge for Notebooks"); - //mDevices.Add(0x11790605,@"PCI to ISA Bridge for Notebooks"); - //mDevices.Add(0x11790606,@"PCI to ISA Bridge for Notebooks"); - //mDevices.Add(0x11790609,@"PCI to PCI Bridge for Notebooks"); - //mDevices.Add(0x1179060A,@"ToPIC95B"); - //mDevices.Add(0x1179060F,@"ToPIC97"); - //mDevices.Add(0x11790611,@"PCI to ISA Bridge"); - //mDevices.Add(0x11790617,@"ToPIC100"); - //mDevices.Add(0x11790618,@"CPU to PCI and PCI to ISA Bridge"); - //mDevices.Add(0x11790701,@"vt82c693"); - //mDevices.Add(0x11790804,@"0x0804"); - //mDevices.Add(0x11790805,@"PCI\VEN_1180&DEV_0592&SUBSYS_828D1033&REV_06\4&5A9"); - //mDevices.Add(0x11790D01,@"0x0D01"); - //mDevices.Add(0x117913A8,@"XR17C158/154/152"); - //mDevices.Add(0x117B8320,@"GCE-8320B"); - //mDevices.Add(0x117E0001,@"Printer Host"); - //mDevices.Add(0x11800475,@"RL5c475"); - //mDevices.Add(0x11800476,@"unknown"); - //mDevices.Add(0x11800478,@"RB5c478"); - //mDevices.Add(0x11800552,@"R5C552"); - //mDevices.Add(0x11800592,@"13871043"); - //mDevices.Add(0x11800822,@"R5C832, R5C843"); - //mDevices.Add(0x11800832,@"unknown"); - //mDevices.Add(0x11800843,@"R5C853"); - //mDevices.Add(0x11800852,@"01cf1028"); - //mDevices.Add(0x11805551,@"Unknown"); - //mDevices.Add(0x11858929,@"EIDE Controller"); - //mDevices.Add(0x11860100,@"dl10038d"); - //mDevices.Add(0x11861002,@"DFE-550TX/580TX/DFE-550FX"); - //mDevices.Add(0x11861100,@"Fast Ethernet Adapter"); - //mDevices.Add(0x11861300,@"DL 10038C or 10038D (Remark of Realtek RTL-8139)"); - //mDevices.Add(0x11861301,@"DFE-530TX"); - //mDevices.Add(0x11861340,@"DFE-690TXD"); - //mDevices.Add(0x11861561,@"DRP-32TXD"); - //mDevices.Add(0x11863065,@"14001186"); - //mDevices.Add(0x11863106,@"DFE 530TX+ rev E1"); - //mDevices.Add(0x11863300,@"D-Link Air Wireless Network (DWL-G510)"); - //mDevices.Add(0x11864000,@"DL2000"); - //mDevices.Add(0x11864001,@"DFE-650TX"); - //mDevices.Add(0x11864300,@"dlg10028"); - //mDevices.Add(0x11864B01,@"DGE-530T"); - //mDevices.Add(0x11864C00,@"DGE-530T"); - //mDevices.Add(0x11891592,@"VL/PCI Bridge"); - //mDevices.Add(0x118C0014,@"PCIB"); - //mDevices.Add(0x118C1117,@"MAC-94C201B3"); - //mDevices.Add(0x118D0001,@"n/a"); - //mDevices.Add(0x118D0012,@"Model 12"); - //mDevices.Add(0x118D0014,@"Model 14"); - //mDevices.Add(0x118D0024,@"Model 24"); - //mDevices.Add(0x118D0044,@"Model 44"); - //mDevices.Add(0x118D0112,@"Model 12"); - //mDevices.Add(0x118D0114,@"Model 14"); - //mDevices.Add(0x118D0124,@"Model 24"); - //mDevices.Add(0x118D0144,@"Model 44"); - //mDevices.Add(0x118D0212,@"Model 12"); - //mDevices.Add(0x118D0214,@"Model 14"); - //mDevices.Add(0x118D0224,@"Model 24"); - //mDevices.Add(0x118D0244,@"Model 44"); - //mDevices.Add(0x118D0312,@"Model 12"); - //mDevices.Add(0x118D0314,@"Model 14"); - //mDevices.Add(0x118D0324,@"Model 24"); - //mDevices.Add(0x118D0344,@"Model 44"); - //mDevices.Add(0x11902550,@"TC-2550"); - //mDevices.Add(0x1190C721,@"EIDE"); - //mDevices.Add(0x1190C731,@"TP-910/920/940"); - //mDevices.Add(0x11910001,@"IDE Ctrlr"); - //mDevices.Add(0x11910002,@"ATP850UF"); - //mDevices.Add(0x11910003,@"SCSI-2 cache Cntrlr"); - //mDevices.Add(0x11910004,@"ATP8400"); - //mDevices.Add(0x11910005,@"ATP850UF"); - //mDevices.Add(0x11910006,@"ATP860A"); - //mDevices.Add(0x11910007,@"ATP860R"); - //mDevices.Add(0x11910008,@"ATP865"); - //mDevices.Add(0x11910009,@"ATP865"); - //mDevices.Add(0x1191000B,@"AEC6897"); - //mDevices.Add(0x1191000D,@"ATP8620"); - //mDevices.Add(0x11918001,@"ATP8600"); - //mDevices.Add(0x11918002,@"ATP850S"); - //mDevices.Add(0x11918010,@"ATP870"); - //mDevices.Add(0x11918020,@"ATP870"); - //mDevices.Add(0x11918030,@"ATP870"); - //mDevices.Add(0x11918040,@"ATP870"); - //mDevices.Add(0x11918050,@"Ultra Wide SCSI Controller"); - //mDevices.Add(0x11918060,@"AEC671x"); - //mDevices.Add(0x11918081,@"AEC-67160"); - //mDevices.Add(0x1197010C,@"CompuScope 82G"); - //mDevices.Add(0x11990001,@"IRMA 3270 PCI Adapter"); - //mDevices.Add(0x11990002,@"Advanced ISCA PCI Adapter"); - //mDevices.Add(0x11990201,@"SDLC PCI Adapter"); - //mDevices.Add(0x119B1221,@"82C092G"); - //mDevices.Add(0x119E0001,@"MB86697"); - //mDevices.Add(0x119E0003,@"MB86695"); - //mDevices.Add(0x11A87302,@"NTX-8023-PCI 2MB Long Card"); - //mDevices.Add(0x11A87308,@"NTX-8023-PCI 8MB Long Card"); - //mDevices.Add(0x11A87402,@"NTX-8023-PCI 2MB Short Card"); - //mDevices.Add(0x11A87408,@"NTX-8023-PCI 8MB Short Card"); - //mDevices.Add(0x11A94240,@"AMCC S5933Q"); - //mDevices.Add(0x11AB0146,@"GT-64010/A"); - //mDevices.Add(0x11AB11AB,@"88E8055 PCI-E"); - //mDevices.Add(0x11AB13F8,@"W8300"); - //mDevices.Add(0x11AB1FAA,@"8335"); - //mDevices.Add(0x11AB4320,@"88E8055"); - //mDevices.Add(0x11AB4350,@"88E8036"); - //mDevices.Add(0x11AB4351,@"88E8039"); - //mDevices.Add(0x11AB4353,@"88E8039"); - //mDevices.Add(0x11AB4354,@"88E8040"); - //mDevices.Add(0x11AB4360,@"88E8052"); - //mDevices.Add(0x11AB4361,@"88E8036"); - //mDevices.Add(0x11AB4362,@"88E8053"); - //mDevices.Add(0x11AB4363,@"88E8053"); - //mDevices.Add(0x11AB4364,@"88E8056"); - //mDevices.Add(0x11AB4365,@"88E8070"); - //mDevices.Add(0x11AB4611,@"GT-64115"); - //mDevices.Add(0x11AB4620,@"GT-64120"); - //mDevices.Add(0x11AB4801,@"GT-48001"); - //mDevices.Add(0x11AB4809,@"EV-48300"); - //mDevices.Add(0x11AB5005,@"F5D5005"); - //mDevices.Add(0x11AB5040,@"88SX5040"); - //mDevices.Add(0x11AB5041,@"88SX504"); - //mDevices.Add(0x11AB5080,@"RocketRAID 182x"); - //mDevices.Add(0x11AB5081,@"RocketRAID 182x"); - //mDevices.Add(0x11AB6041,@"MV88SX6041"); - //mDevices.Add(0x11AB6145,@"Add-on IC to provide 4x SATA Ports, attached to ICH7 (SthBridge?) via PCI-Express."); - //mDevices.Add(0x11AB6320,@"GT-64130/131"); - //mDevices.Add(0x11AB6480,@"MV6446x"); - //mDevices.Add(0x11AB6485,@"MV6446x"); - //mDevices.Add(0x11AB9653,@"GT-96100A"); - //mDevices.Add(0x11ABF003,@"GT-64010"); - //mDevices.Add(0x11ABF004,@"GT64120"); - //mDevices.Add(0x11ABF006,@"GT-64120A"); - //mDevices.Add(0x11AD0001,@"LC82C168?"); - //mDevices.Add(0x11AD0002,@"LC82C169C"); - //mDevices.Add(0x11ADC115,@"LC82C115"); - //mDevices.Add(0x11AE4153,@"Bridge Controller"); - //mDevices.Add(0x11AE5842,@"Bridge Controller"); - //mDevices.Add(0x11AF0001,@"9704"); - //mDevices.Add(0x11AF000A,@"Nitris"); - //mDevices.Add(0x11AF000B,@"Nitris DX / Mojo DX"); - //mDevices.Add(0x11B00001,@"V960PBC/PSC"); - //mDevices.Add(0x11B00002,@"V961PBC/PSC"); - //mDevices.Add(0x11B00004,@"V962PBC/PSC"); - //mDevices.Add(0x11B00010,@"V292PBC/PSC"); - //mDevices.Add(0x11B00021,@"V363EPC"); - //mDevices.Add(0x11B00022,@"V363EPC"); - //mDevices.Add(0x11B00024,@"V363EPC"); - //mDevices.Add(0x11B00030,@"V363EPC"); - //mDevices.Add(0x11B00100,@"V320USC"); - //mDevices.Add(0x11B00101,@"V320USC"); - //mDevices.Add(0x11B00102,@"V320USC"); - //mDevices.Add(0x11B00103,@"V320USC"); - //mDevices.Add(0x11B00200,@"V370PDC"); - //mDevices.Add(0x11B00292,@"V292PBC"); - //mDevices.Add(0x11B00500,@"V340HPC"); - //mDevices.Add(0x11B00960,@"V96xPBC"); - //mDevices.Add(0x11B0C960,@"V96DPC"); - //mDevices.Add(0x11B50001,@"PMC/PMX1553"); - //mDevices.Add(0x11B50002,@"PMCF1"); - //mDevices.Add(0x11B50003,@"PMCMMA"); - //mDevices.Add(0x11B50004,@"PMCVGO"); - //mDevices.Add(0x11B50005,@"PMCPCIS"); - //mDevices.Add(0x11B50006,@"PMCPCIM"); - //mDevices.Add(0x11B50007,@"PMCQ1"); - //mDevices.Add(0x11B50008,@"EPMCQ2"); - //mDevices.Add(0x11B50009,@"PMCPIO1"); - //mDevices.Add(0x11B50012,@"PMCF1"); - //mDevices.Add(0x11B50013,@"PMC1553EX"); - //mDevices.Add(0x11B50014,@"PMC1553E"); - //mDevices.Add(0x11B52200,@"PMCFA2C"); - //mDevices.Add(0x11B80001,@"Quad PeerMaster"); - //mDevices.Add(0x11B9C0ED,@"SSA Ctrlr"); - //mDevices.Add(0x11BC0001,@"NPI NuCard"); - //mDevices.Add(0x11BD0015,@"660806-2.0"); - //mDevices.Add(0x11BDBEBE,@"51015777"); - //mDevices.Add(0x11BDBEDE,@"51015777"); - //mDevices.Add(0x11C10440,@"LT Winmodem 56k"); - //mDevices.Add(0x11C10441,@"4390143"); - //mDevices.Add(0x11C10442,@"1648T00"); - //mDevices.Add(0x11C10443,@"LT Winmodem"); - //mDevices.Add(0x11C10444,@"LT Winmodem"); - //mDevices.Add(0x11C10445,@"LT Winmodem"); - //mDevices.Add(0x11C10446,@"LT Winmodem"); - //mDevices.Add(0x11C10447,@"LT Winmodem"); - //mDevices.Add(0x11C10448,@"LT Winmodem 56k"); - //mDevices.Add(0x11C10449,@"LT Winmodem 56k"); - //mDevices.Add(0x11C1044A,@"LT Winmodem 56k"); - //mDevices.Add(0x11C1044B,@"LT Winmodem"); - //mDevices.Add(0x11C1044C,@"LT Winmodem"); - //mDevices.Add(0x11C1044D,@"LT Winmodem"); - //mDevices.Add(0x11C1044E,@"12232"); - //mDevices.Add(0x11C1044F,@"90094-1"); - //mDevices.Add(0x11C10450,@"1456VQH19R-1(INT)"); - //mDevices.Add(0x11C10451,@"LT Winmodem"); - //mDevices.Add(0x11C10452,@"LT Winmodem"); - //mDevices.Add(0x11C10453,@"LT Winmodem"); - //mDevices.Add(0x11C10454,@"LT Winmodem"); - //mDevices.Add(0x11C10455,@"LT Winmodem"); - //mDevices.Add(0x11C10456,@"LT Winmodem"); - //mDevices.Add(0x11C10457,@"LT Winmodem"); - //mDevices.Add(0x11C10458,@"1648C"); - //mDevices.Add(0x11C10459,@"LT Winmodem"); - //mDevices.Add(0x11C1045A,@"LT Winmodem"); - //mDevices.Add(0x11C1045D,@"LT WinModem"); - //mDevices.Add(0x11C10461,@"V90 Wildfire Modem"); - //mDevices.Add(0x11C10462,@"1690"); - //mDevices.Add(0x11C10464,@"This is NOT a Riptide! (as previously stated)"); - //mDevices.Add(0x11C10480,@"Venus Winmodem"); - //mDevices.Add(0x11C1048C,@"1648c-tv5"); - //mDevices.Add(0x11C1048E,@"svp92pl-t00"); - //mDevices.Add(0x11C1048F,@"SV92P-T00"); - //mDevices.Add(0x11C10600,@"sv92p2"); - //mDevices.Add(0x11C10620,@"SV92PP"); - //mDevices.Add(0x11C11040,@"Prespa"); - //mDevices.Add(0x11C13026,@"0x11c13026"); - //mDevices.Add(0x11C15400,@"OR3TP12"); - //mDevices.Add(0x11C15801,@"USB Open Host Controller"); - //mDevices.Add(0x11C15802,@"USS-312MC"); - //mDevices.Add(0x11C15803,@"USS-344"); - //mDevices.Add(0x11C15805,@"uss344"); - //mDevices.Add(0x11C15811,@"FW322"); - //mDevices.Add(0x11C19876,@"lucent 1646T00"); - //mDevices.Add(0x11C1AB20,@"WaveLAN"); - //mDevices.Add(0x11C1AB30,@"Hermes2?"); - //mDevices.Add(0x11C1ED00,@"ET-131x"); - //mDevices.Add(0x11C63001,@"VM-1200 Opto Unit Controller"); - //mDevices.Add(0x11C80658,@"PSB 32"); - //mDevices.Add(0x11C8D665,@"PSB64"); - //mDevices.Add(0x11C8D667,@"PSB66"); - //mDevices.Add(0x11C90010,@"16-line serial port w/DMA"); - //mDevices.Add(0x11C90011,@"4-line serial port w/DMA"); - //mDevices.Add(0x11CB2000,@"PCI-9050-1100083-11"); - //mDevices.Add(0x11CB4000,@"SUPI-1"); - //mDevices.Add(0x11CB8000,@"T225"); - //mDevices.Add(0x11CE102B,@"1001"); - //mDevices.Add(0x11D101F7,@"VxP524"); - //mDevices.Add(0x11D101F8,@"VxP524"); - //mDevices.Add(0x11D41535,@"ADSP-21535"); - //mDevices.Add(0x11D41805,@"62412-51"); - //mDevices.Add(0x11D41884,@"AD1884HD"); - //mDevices.Add(0x11D41889,@"AD1980"); - //mDevices.Add(0x11D41981,@"AD1981HD"); - //mDevices.Add(0x11D41983,@"AD1983HD"); - //mDevices.Add(0x11D41986,@"AD1986A"); - //mDevices.Add(0x11D4198B,@"AD1988B"); - //mDevices.Add(0x11D42192,@"ADSP-2192"); - //mDevices.Add(0x11D4219A,@"ADSP-2192"); - //mDevices.Add(0x11D4219E,@"ADSP-2192"); - //mDevices.Add(0x11D42F44,@"ADSP-2141"); - //mDevices.Add(0x11D50115,@"10115"); - //mDevices.Add(0x11D50116,@"10118"); - //mDevices.Add(0x11D50117,@"10117"); - //mDevices.Add(0x11D50118,@"10118"); - //mDevices.Add(0x11DB1234,@"Dreamcast Broadband Adapter"); - //mDevices.Add(0x11DE6057,@"ZR36057/36067"); - //mDevices.Add(0x11DE6120,@"ZR36120PQC"); - //mDevices.Add(0x11F04232,@"FASTline UTP Quattro"); - //mDevices.Add(0x11F04233,@"FASTline FO"); - //mDevices.Add(0x11F04234,@"FASTline UTP"); - //mDevices.Add(0x11F04235,@"FASTline-II UTP"); - //mDevices.Add(0x11F04236,@"FASTline-II FO"); - //mDevices.Add(0x11F04731,@"GIGAline"); - //mDevices.Add(0x11F42915,@"2915"); - //mDevices.Add(0x11F60112,@"ATT2MD11"); - //mDevices.Add(0x11F60113,@"FreedomLine 100"); - //mDevices.Add(0x11F61401,@"832AE28030680"); - //mDevices.Add(0x11F62011,@"TXA9882"); - //mDevices.Add(0x11F62201,@"TXA9883"); - //mDevices.Add(0x11F69881,@"TXA9881?"); - //mDevices.Add(0x11F87364,@"PM7364"); - //mDevices.Add(0x11F87366,@"PM7364"); - //mDevices.Add(0x11F87367,@"PM7367"); - //mDevices.Add(0x11F87375,@"PM7375"); - //mDevices.Add(0x11F87380,@"PM7380"); - //mDevices.Add(0x11F87382,@"PM7382"); - //mDevices.Add(0x11F87384,@"PM7384"); - //mDevices.Add(0x11F88000,@"PM8000 SPC"); - //mDevices.Add(0x11F88010,@"PM8010 SRC"); - //mDevices.Add(0x11FE0001,@"RocketPort"); - //mDevices.Add(0x11FE0002,@"RocketPort"); - //mDevices.Add(0x11FE0003,@"RocketPort"); - //mDevices.Add(0x11FE0004,@"RocketPort"); - //mDevices.Add(0x11FE0005,@"RocketPort"); - //mDevices.Add(0x11FE0006,@"RocketPort"); - //mDevices.Add(0x11FE0007,@"RocketPort"); - //mDevices.Add(0x11FE0008,@"RocketPort"); - //mDevices.Add(0x11FE0009,@"RocketPort"); - //mDevices.Add(0x11FE000A,@"RocketPort"); - //mDevices.Add(0x11FE000B,@"RocketPort"); - //mDevices.Add(0x11FE000C,@"RocketPort"); - //mDevices.Add(0x11FE000D,@"RocketPort"); - //mDevices.Add(0x11FE8015,@"RocketPort"); - //mDevices.Add(0x12020001,@"NAIATMPCI"); - //mDevices.Add(0x12084853,@"HS-Link Device"); - //mDevices.Add(0x12090100,@"PCI 9054"); - //mDevices.Add(0x120E0100,@"Cyclom-Y"); - //mDevices.Add(0x120E0101,@"Cyclom-Y"); - //mDevices.Add(0x120E0102,@"Cyclom-4Y"); - //mDevices.Add(0x120E0103,@"Cyclom-4Y"); - //mDevices.Add(0x120E0104,@"Cyclom-8Y"); - //mDevices.Add(0x120E0105,@"Cyclom-8Y"); - //mDevices.Add(0x120E0200,@"Cyclom-Z"); - //mDevices.Add(0x120E0201,@"Cyclom-Z"); - //mDevices.Add(0x120E0300,@"PC300 RX 2"); - //mDevices.Add(0x120E0301,@"PC300 RX 1"); - //mDevices.Add(0x120E0302,@"PC300 TE 2"); - //mDevices.Add(0x120E0303,@"PC300 TE 1"); - //mDevices.Add(0x120F0001,@"Roadrunner"); - //mDevices.Add(0x12160003,@"PTM400 PCI Taxi Module"); - //mDevices.Add(0x12176729,@"OZ6729"); - //mDevices.Add(0x1217673A,@"OZ6730"); - //mDevices.Add(0x12176832,@"OZ6832/3"); - //mDevices.Add(0x12176836,@"OZ6836/6860"); - //mDevices.Add(0x12176872,@"OZ6812"); - //mDevices.Add(0x12176925,@"OZ6922"); - //mDevices.Add(0x12176933,@"OZ6933"); - //mDevices.Add(0x12176972,@"OZ6912"); - //mDevices.Add(0x12177110,@"OZ711Mx"); - //mDevices.Add(0x12177113,@"0Z711EC1"); - //mDevices.Add(0x12177114,@"OZ711M1"); - //mDevices.Add(0x12177120,@"Unknown device"); - //mDevices.Add(0x12177130,@"OZ711M3"); - //mDevices.Add(0x12177134,@"OZ711MP1/MS1"); - //mDevices.Add(0x121A0001,@"Voodoo"); - //mDevices.Add(0x121A0002,@"Voodoo2"); - //mDevices.Add(0x121A0003,@"Voodoo Banshee"); - //mDevices.Add(0x121A0005,@"Voodoo3"); - //mDevices.Add(0x121A0007,@"Voodoo4"); - //mDevices.Add(0x121A0009,@"Voodoo5"); - //mDevices.Add(0x121A0010,@"Rampage"); - //mDevices.Add(0x121A0057,@"Voodoo 3/3000"); - //mDevices.Add(0x12201220,@"9622qac"); - //mDevices.Add(0x12230001,@"KatanaQp"); - //mDevices.Add(0x12230002,@"KosaiPM"); - //mDevices.Add(0x12230044,@"Memory controller"); - //mDevices.Add(0x12241000,@"CL560?"); - //mDevices.Add(0x122D1206,@"ICH2"); - //mDevices.Add(0x122D4201,@"MR2800W"); - //mDevices.Add(0x122D50DC,@"PCI168/3328"); - //mDevices.Add(0x122D80DA,@"3328"); - //mDevices.Add(0x122F37AF,@"0x9030"); - //mDevices.Add(0x12360000,@"RealMagic64/GX"); - //mDevices.Add(0x12360531,@"MX98715/25"); - //mDevices.Add(0x12366401,@"REALmagic64/GX"); - //mDevices.Add(0x12369708,@"realmagic64/gx"); - //mDevices.Add(0x123D0010,@"PCI-DV"); - //mDevices.Add(0x123F00E4,@"cl 480"); - //mDevices.Add(0x123F6120,@"12.03"); - //mDevices.Add(0x123F8120,@"176"); - //mDevices.Add(0x123F8888,@"12.03"); - //mDevices.Add(0x12411603,@"keyboard"); - //mDevices.Add(0x12421460,@"JNIC-1460"); - //mDevices.Add(0x12421560,@"JNIC-1560"); - //mDevices.Add(0x12424643,@"JNI PCI 64-bit Fibrechannel"); - //mDevices.Add(0x12440700,@"B1"); - //mDevices.Add(0x12440800,@"C4"); - //mDevices.Add(0x12440A00,@"A1"); - //mDevices.Add(0x12440E00,@"Fritz!PCI 2.0 ISDN Controller"); - //mDevices.Add(0x12441100,@"C2"); - //mDevices.Add(0x12441200,@"T1"); - //mDevices.Add(0x12442700,@"E13 32A5KYW / 2CAKRCT"); - //mDevices.Add(0x124D0000,@"EasyConnect 8/32"); - //mDevices.Add(0x124D0002,@"EasyConnect 8/64"); - //mDevices.Add(0x124D0003,@"EasyIO PCI"); - //mDevices.Add(0x124F0041,@"IFT-2000"); - //mDevices.Add(0x12551110,@"MPEG Forge"); - //mDevices.Add(0x12551210,@"MPEG Fusion"); - //mDevices.Add(0x12552110,@"VideoPlex-pci"); - //mDevices.Add(0x12552120,@"VideoPlex plus"); - //mDevices.Add(0x12552130,@"VideoQuest"); - //mDevices.Add(0x12564201,@"PCI-2240i"); - //mDevices.Add(0x12564401,@"PCI-2220i"); - //mDevices.Add(0x12565201,@"PCI-2000"); - //mDevices.Add(0x12592503,@"Realtek 8139b"); - //mDevices.Add(0x12592560,@"AT-2560 Fast Ethernet Adapter (i82557B)"); - //mDevices.Add(0x125B0B95,@"AX88772"); - //mDevices.Add(0x125B1400,@"AX88140A"); - //mDevices.Add(0x125B1720,@"AX88172"); - //mDevices.Add(0x125D0000,@"ESS336H"); - //mDevices.Add(0x125D1961,@"Multimedia Device"); - //mDevices.Add(0x125D1968,@"ES2839"); - //mDevices.Add(0x125D1969,@"ES72222"); - //mDevices.Add(0x125D1978,@"ES1978"); - //mDevices.Add(0x125D1988,@"ES1988"); - //mDevices.Add(0x125D1989,@"ES1989"); - //mDevices.Add(0x125D1990,@"ES2898S"); - //mDevices.Add(0x125D1998,@"Maestro 3i"); - //mDevices.Add(0x125D199B,@"ES1938/41/46 solo audio"); - //mDevices.Add(0x125D2808,@"ES336H"); - //mDevices.Add(0x125D2828,@"ES2828S"); - //mDevices.Add(0x125D2838,@"ES56H-PI"); - //mDevices.Add(0x125D2839,@"2838"); - //mDevices.Add(0x125D2898,@"2898"); - //mDevices.Add(0x125F2084,@"AMCC S5933"); - //mDevices.Add(0x12603872,@"PRISM 3"); - //mDevices.Add(0x12603873,@"ISL3874A"); - //mDevices.Add(0x12603890,@"ISL3890"); - //mDevices.Add(0x12608130,@"HMP8130"); - //mDevices.Add(0x12608131,@"HMP8131"); - //mDevices.Add(0x12660001,@"NE10/100 Adapter (i82557B)"); - //mDevices.Add(0x12661910,@"NE2000Plus (RT8029) Ethernet Adapter"); - //mDevices.Add(0x12671016,@"NICCY PCI card"); - //mDevices.Add(0x12674243,@"Satellite receiver board / MPEG2 decoder"); - //mDevices.Add(0x12675352,@"PCR2101"); - //mDevices.Add(0x12675A4B,@"telsatturbo"); - //mDevices.Add(0x12680204,@"Unknown"); - //mDevices.Add(0x126C1F1F,@"e-mobility 802.11b Wireless LAN PCI Card"); - //mDevices.Add(0x126F0710,@"SM710"); - //mDevices.Add(0x126F0712,@"SM712"); - //mDevices.Add(0x126F0720,@"SM720 / SM722"); - //mDevices.Add(0x126F0810,@"SM810"); - //mDevices.Add(0x126F0811,@"SM811"); - //mDevices.Add(0x126F0820,@"SM820"); - //mDevices.Add(0x126F0910,@"SM910"); - //mDevices.Add(0x12730002,@"DirecPC"); - //mDevices.Add(0x12741274,@"5880x"); - //mDevices.Add(0x12741371,@"ES 1373"); - //mDevices.Add(0x12741373,@"ES1373"); - //mDevices.Add(0x12745000,@"ES1373"); - //mDevices.Add(0x12745880,@"5880x"); - //mDevices.Add(0x12780701,@"TPE3/TM3"); - //mDevices.Add(0x12790060,@"TM8000"); - //mDevices.Add(0x12790061,@"TMTM8000"); - //mDevices.Add(0x12790295,@"Virtual Northbridge"); - //mDevices.Add(0x12790395,@"LongRun"); - //mDevices.Add(0x12790396,@"SDRAM Controller"); - //mDevices.Add(0x12790397,@"BIOS scratchpad"); - //mDevices.Add(0x12829009,@"DM9009"); - //mDevices.Add(0x12829102,@"DM9102/A/AF"); - //mDevices.Add(0x12830801,@"IT8152F/G"); - //mDevices.Add(0x1283673A,@"IT8330G"); - //mDevices.Add(0x12838152,@"IT8152F/G"); - //mDevices.Add(0x12838172,@"IT8172G"); - //mDevices.Add(0x12838211,@"IT8211F"); - //mDevices.Add(0x12838212,@"IT8212F"); - //mDevices.Add(0x12838330,@"IT8330G"); - //mDevices.Add(0x12838872,@"IT8871/72"); - //mDevices.Add(0x12838875,@"IT8875F"); - //mDevices.Add(0x12838888,@"IT8888F"); - //mDevices.Add(0x12838889,@"IT8889F"); - //mDevices.Add(0x12839876,@"IT8875F"); - //mDevices.Add(0x1283E886,@"IT8330G"); - //mDevices.Add(0x12850100,@"ES1849"); - //mDevices.Add(0x1287001E,@"LS220D"); - //mDevices.Add(0x1287001F,@"LS220C"); - //mDevices.Add(0x12870020,@"LS242"); - //mDevices.Add(0x128AF001,@"Ethernet 10/100"); - //mDevices.Add(0x128D0021,@"ATM Adapter"); - //mDevices.Add(0x129A0415,@"PBT-415"); - //mDevices.Add(0x129A0515,@"PBT-515"); - //mDevices.Add(0x129A0615,@"PBT-615"); - //mDevices.Add(0x129A0715,@"Vanguard PCI/PMC/cPCI"); - //mDevices.Add(0x129ADD10,@"DPIO"); - //mDevices.Add(0x129ADD11,@"DPIO2"); - //mDevices.Add(0x129ADD12,@"DPIO2-66"); - //mDevices.Add(0x12A3ECB8,@"1646T00"); - //mDevices.Add(0x12AA5568,@"Wan405"); - //mDevices.Add(0x12AA556C,@"NAI HSSI Sniffer PCI Adapter"); - //mDevices.Add(0x12AB3000,@"JRS-3DS100"); - //mDevices.Add(0x12AE0001,@"3C986"); - //mDevices.Add(0x12AE0002,@"3C986-T"); - //mDevices.Add(0x12B91006,@"5610"); - //mDevices.Add(0x12B91007,@"AD1807JS"); - //mDevices.Add(0x12B91008,@"USR5610B"); - //mDevices.Add(0x12BA0032,@"Hammerhead-Lite-PCI"); - //mDevices.Add(0x12C19080,@"Sync4hs/CCP/PCI/MP"); - //mDevices.Add(0x12C30058,@"HT80232"); - //mDevices.Add(0x12C35598,@"HT80229"); - //mDevices.Add(0x12C40005,@"Blue Heat-8 RS232"); - //mDevices.Add(0x12C5007F,@"ISE"); - //mDevices.Add(0x12C50081,@"PCIVST"); - //mDevices.Add(0x12C50085,@"Video Simulator/Sender"); - //mDevices.Add(0x12C50086,@"THR2"); - //mDevices.Add(0x12C70546,@"kssjsjj"); - //mDevices.Add(0x12C70561,@"BRI/2 Type Card (Voice Driver)"); - //mDevices.Add(0x12C70647,@"D/240JCT-T1 Card"); - //mDevices.Add(0x12C70648,@"D/300JCT-E1 Card"); - //mDevices.Add(0x12C70649,@"D/300JCT-E1 Card"); - //mDevices.Add(0x12C70651,@"MSI PCI Card"); - //mDevices.Add(0x12C70673,@"BRI/160-PCI Card"); - //mDevices.Add(0x12C70674,@"BRI/120-PCI Card"); - //mDevices.Add(0x12C70675,@"BRI/80-PCI Card"); - //mDevices.Add(0x12C70676,@"D/41JCT Card"); - //mDevices.Add(0x12C70685,@"D/480JCT-2T1 Card"); - //mDevices.Add(0x12C70687,@"D/600JCT-2E1 (75 Ohm) Card"); - //mDevices.Add(0x12C70689,@"D/600JCT-2E1"); - //mDevices.Add(0x12C70707,@"D/320JCT (Resource Only) Card"); - //mDevices.Add(0x12C70708,@"D/160JCT (Resource Only) Card"); - //mDevices.Add(0x12CB0027,@"StudioCard"); - //mDevices.Add(0x12CB002D,@"BX-12"); - //mDevices.Add(0x12CB002E,@"SC-2000"); - //mDevices.Add(0x12CB002F,@"LX-44"); - //mDevices.Add(0x12CB0030,@"SC-22"); - //mDevices.Add(0x12CB0031,@"BX-44"); - //mDevices.Add(0x12CB0032,@"LX-24M"); - //mDevices.Add(0x12CB0033,@"LX-22M"); - //mDevices.Add(0x12CB0034,@"BX-8"); - //mDevices.Add(0x12CB0035,@"BX-12e"); - //mDevices.Add(0x12D40301,@"EP1S"); - //mDevices.Add(0x12D51000,@"MAP-CA"); - //mDevices.Add(0x12D51002,@"MAP-1000"); - //mDevices.Add(0x12D871E2,@"PI7C7300"); - //mDevices.Add(0x12D88150,@"PI7C8150"); - //mDevices.Add(0x12D88152,@"PI7C8152"); - //mDevices.Add(0x12DB0003,@"FoxFire II"); - //mDevices.Add(0x12DE0200,@"Cryptoswift 200"); - //mDevices.Add(0x12DF2102,@"Infineon PEB 20534"); - //mDevices.Add(0x12DF8236,@"Unknown"); - //mDevices.Add(0x12E00010,@"ST16C654"); - //mDevices.Add(0x12E00020,@"ST16C654"); - //mDevices.Add(0x12E00030,@"ST16C654"); - //mDevices.Add(0x12E41000,@"TR1000 PRI"); - //mDevices.Add(0x12E41140,@"ISDN Controller"); - //mDevices.Add(0x12E4B005,@"TR1000 BRI"); - //mDevices.Add(0x12E4B006,@"TR1000 BRI"); - //mDevices.Add(0x12EB0001,@"AU8820"); - //mDevices.Add(0x12EB0002,@"AU8830A2"); - //mDevices.Add(0x12EB0003,@"312EB&REV2"); - //mDevices.Add(0x12EC8139,@"0xxxx"); - //mDevices.Add(0x12F21002,@"215RAAGCGA11F"); - //mDevices.Add(0x12F23059,@"VT8237"); - //mDevices.Add(0x12F80002,@"VideoMaker"); - //mDevices.Add(0x13030001,@"0239"); - //mDevices.Add(0x13030002,@"M44/cM44 DSP board"); - //mDevices.Add(0x13030003,@"Quattro6x DSP board"); - //mDevices.Add(0x13030004,@"Chico/ChicoPlus Data Acquisition Board"); - //mDevices.Add(0x13030005,@"Code Hammer Jtag Debugger board"); - //mDevices.Add(0x13030006,@"Matador DSP board"); - //mDevices.Add(0x13030007,@"Quixote DSP board"); - //mDevices.Add(0x13030008,@"Quadia C64x DSP"); - //mDevices.Add(0x13030009,@"Quadia DSP Baseboard"); - //mDevices.Add(0x13070001,@"PCI-DAS1602/16"); - //mDevices.Add(0x13070006,@"PCI-GPIB"); - //mDevices.Add(0x1307000B,@"PCI-DIO48H"); - //mDevices.Add(0x1307000C,@"PCI-PDISO8"); - //mDevices.Add(0x1307000D,@"PCI-PDISO16"); - //mDevices.Add(0x1307000F,@"PCI-DAS1200"); - //mDevices.Add(0x13070010,@"PCI-DAS1602/12"); - //mDevices.Add(0x13070014,@"PCI-DIO24H"); - //mDevices.Add(0x13070015,@"PCI-DIO24H/CTR3"); - //mDevices.Add(0x13070016,@"PCI-DIO24H/CTR16"); - //mDevices.Add(0x13070017,@"PCI-DIO96H"); - //mDevices.Add(0x13070018,@"PCI-CTR05"); - //mDevices.Add(0x13070019,@"PCI-DAS1200/JR"); - //mDevices.Add(0x1307001A,@"PCI-DAS1001"); - //mDevices.Add(0x1307001B,@"PCI-DAS1002"); - //mDevices.Add(0x1307001C,@"PCI-DAS1602JR/16"); - //mDevices.Add(0x1307001D,@"PCI-DAS6402/16"); - //mDevices.Add(0x1307001E,@"PCI-DAS6402/12"); - //mDevices.Add(0x1307001F,@"PCI-DAS16/M1"); - //mDevices.Add(0x13070020,@"PCI-DDA02/12"); - //mDevices.Add(0x13070021,@"PCI-DDA04/12"); - //mDevices.Add(0x13070022,@"PCI-DDA08/12"); - //mDevices.Add(0x13070023,@"PCI-DDA02/16"); - //mDevices.Add(0x13070024,@"PCI-DDA04/16"); - //mDevices.Add(0x13070025,@"PCI-DDA08/16"); - //mDevices.Add(0x13070026,@"PCI-DAC04/12-HS"); - //mDevices.Add(0x13070027,@"PCI-DAC04/16-HS"); - //mDevices.Add(0x13070028,@"PCI-DIO24"); - //mDevices.Add(0x13070029,@"PCI-DAS08"); - //mDevices.Add(0x1307002C,@"PCI-INT32"); - //mDevices.Add(0x13070033,@"PCI-DUAL-AC5"); - //mDevices.Add(0x13070034,@"PCI-DAS-TC"); - //mDevices.Add(0x13070035,@"PCI-DAS64/M1/16"); - //mDevices.Add(0x13070036,@"PCI-DAS64/M2/16"); - //mDevices.Add(0x13070037,@"PCI-DAS64/M3/16"); - //mDevices.Add(0x1307004C,@"PCI-DAS1000"); - //mDevices.Add(0x1307004D,@"PCI-QUAD04"); - //mDevices.Add(0x13070064,@"PCI-CTR10"); - //mDevices.Add(0x13080001,@"NetCelerator Adapter"); - //mDevices.Add(0x13100003,@"9060"); - //mDevices.Add(0x1310000D,@"FPGA PCI Bridge"); - //mDevices.Add(0x13170531,@"nm0403A03461H121S122P"); - //mDevices.Add(0x13170981,@"AN981"); - //mDevices.Add(0x13170985,@"an983b"); - //mDevices.Add(0x13171985,@"AN985"); - //mDevices.Add(0x13172850,@"016"); - //mDevices.Add(0x13175120,@"ADM5120"); - //mDevices.Add(0x13177892,@"PCT 789T-A"); - //mDevices.Add(0x13178201,@"ADM8211"); - //mDevices.Add(0x13179511,@"ADM9511"); - //mDevices.Add(0x13179513,@"ADM9513"); - //mDevices.Add(0x13180911,@"G-NIC II"); - //mDevices.Add(0x13190801,@"FM0801"); - //mDevices.Add(0x13190802,@"FM801-as"); - //mDevices.Add(0x13191000,@"FM801-as"); - //mDevices.Add(0x13191001,@"FM801"); - //mDevices.Add(0x13191319,@"FM0801-as"); - //mDevices.Add(0x13194901,@"FM801-AU"); - //mDevices.Add(0x131F2002,@"CyberSerial 16850"); - //mDevices.Add(0x131F2011,@"Duet 1S(16650)+1P"); - //mDevices.Add(0x131F2012,@"Duet 1S(16850)+1P"); - //mDevices.Add(0x131F2020,@"SIIG cyber8000"); - //mDevices.Add(0x131F2042,@"Trio 1S(16850)+2P"); - //mDevices.Add(0x131F2050,@"Siig Inc CyberSerial (4-port) 16550"); - //mDevices.Add(0x131F2051,@"CyberSerial 16650"); - //mDevices.Add(0x131F2052,@"CyberSerial 16850"); - //mDevices.Add(0x131F2060,@"Trio 2S(16550)+1P"); - //mDevices.Add(0x131F2061,@"Trio 2S(16650)+1P"); - //mDevices.Add(0x131F2062,@"Trio 2S(16850)+1P"); - //mDevices.Add(0x13288888,@"rev 1.5"); - //mDevices.Add(0x13325410,@"MM-5410D"); - //mDevices.Add(0x13325415,@"MM-5415CN"); - //mDevices.Add(0x13325425,@"MM-5425CN"); - //mDevices.Add(0x13326140,@"MM-6140D"); - //mDevices.Add(0x133D1000,@"SST-5136-PFB-PCI"); - //mDevices.Add(0x13443240,@"CopperHead CopperTail SC1 AMC AC97"); - //mDevices.Add(0x13443320,@"MT8LLN21PADF"); - //mDevices.Add(0x13443321,@"21PAD"); - //mDevices.Add(0x13443470,@"MT7LLN22NCNE"); - //mDevices.Add(0x13444020,@"CopperHead CopperTail SC1 IDE Controller"); - //mDevices.Add(0x13444030,@"CopperHead CopperTail SC1 USB Controller"); - //mDevices.Add(0x134A0001,@"F01 2ASV17184.1"); - //mDevices.Add(0x134A0002,@"Domex DMX3192U/3194UP SCSI Adapter"); - //mDevices.Add(0x134D2188,@"fa82537ep"); - //mDevices.Add(0x134D2189,@"HSP688T"); - //mDevices.Add(0x134D2486,@"82537"); - //mDevices.Add(0x134D7890,@"fa82537ep"); - //mDevices.Add(0x134D7891,@"PCT 789T"); - //mDevices.Add(0x134D7892,@"PCT 789T-A"); - //mDevices.Add(0x134D7893,@"S911 K017"); - //mDevices.Add(0x134D7894,@"688w"); - //mDevices.Add(0x134D7895,@"PCT789T"); - //mDevices.Add(0x134D7896,@"pct789t-c"); - //mDevices.Add(0x134D7897,@"97860963"); - //mDevices.Add(0x134D9714,@"PCT 288-1A"); - //mDevices.Add(0x134DD800,@"pct388p-a"); - //mDevices.Add(0x135A0224,@"PLX9050"); - //mDevices.Add(0x135E5101,@"5101"); - //mDevices.Add(0x135E5102,@"PCI-ACB"); - //mDevices.Add(0x135E7101,@"Single Port RS-232/422/485/520"); - //mDevices.Add(0x135E7201,@"Dual Port RS-232/422/485 Interface"); - //mDevices.Add(0x135E7202,@"Dual Port RS-232 Interface"); - //mDevices.Add(0x135E7401,@"Four Port RS-232 Interface"); - //mDevices.Add(0x135E7402,@"Four Port RS-422/485 Interface"); - //mDevices.Add(0x135E7801,@"Eight Port RS-232 Interface"); - //mDevices.Add(0x135E8001,@"8001"); - //mDevices.Add(0x13600101,@"PCI32"); - //mDevices.Add(0x13600102,@"PCI509"); - //mDevices.Add(0x13600103,@"PCI510"); - //mDevices.Add(0x13600104,@"PCI511"); - //mDevices.Add(0x13600105,@"PEX511"); - //mDevices.Add(0x13600201,@"GPS167PCI"); - //mDevices.Add(0x13600202,@"GPS168PCI"); - //mDevices.Add(0x13600203,@"GPS169PCI"); - //mDevices.Add(0x13600204,@"GPS170PCI"); - //mDevices.Add(0x13600205,@"GPS170PEX"); - //mDevices.Add(0x13600301,@"TCR510PCI"); - //mDevices.Add(0x13600302,@"TCR167PCI"); - //mDevices.Add(0x13600303,@"TCR511PCI"); - //mDevices.Add(0x13600304,@"TCR511PEX"); - //mDevices.Add(0x13659050,@"HYSDN"); - //mDevices.Add(0x13752571,@"NA"); - //mDevices.Add(0x13822009,@"PLX TECHNOLOGY \n PCI9052 \n 0435 \n BX9497.1 MALA"); - //mDevices.Add(0x13822048,@"Prodif Plus sound card"); - //mDevices.Add(0x13822088,@"Marc 8 Midi"); - //mDevices.Add(0x13854100,@"MA301"); - //mDevices.Add(0x1385620A,@"GA620"); - //mDevices.Add(0x1385622A,@"GA622"); - //mDevices.Add(0x1385630A,@"GA630"); - //mDevices.Add(0x13858169,@"GA311"); - //mDevices.Add(0x1385F311,@"FA311"); - //mDevices.Add(0x13875310,@"N/A"); - //mDevices.Add(0x13890001,@"PCI1500PFB"); - //mDevices.Add(0x13890104,@"PCI-CANIO"); - //mDevices.Add(0x13931040,@"C104H/PCI"); - //mDevices.Add(0x13931320,@"CP-132"); - //mDevices.Add(0x13931340,@"CP--134U-I-DB9 V2.3 UPCI Board"); - //mDevices.Add(0x13931680,@"C168H/PCI"); - //mDevices.Add(0x13931681,@"CP-168U"); - //mDevices.Add(0x13932040,@"CP-204J"); - //mDevices.Add(0x13932180,@"C218"); - //mDevices.Add(0x13932210,@"---"); - //mDevices.Add(0x13932240,@"---"); - //mDevices.Add(0x13933200,@"C320"); - //mDevices.Add(0x13936800,@"0x0000"); - //mDevices.Add(0x13940001,@"LXT1001"); - //mDevices.Add(0x13970B4D,@"HFC-8S 16B8D8S0"); - //mDevices.Add(0x13972BD0,@"HFC-PCI A ISDN 2BDS0"); - //mDevices.Add(0x13978B4D,@"HFC-4S ISDN 8B4D4S0"); - //mDevices.Add(0x1397B000,@"B000"); - //mDevices.Add(0x1397B006,@"B006"); - //mDevices.Add(0x1397B007,@"B007"); - //mDevices.Add(0x1397B008,@"B008"); - //mDevices.Add(0x1397B009,@"B009"); - //mDevices.Add(0x1397B00A,@"B00A"); - //mDevices.Add(0x1397B00B,@"B00B"); - //mDevices.Add(0x1397B00C,@"B00C"); - //mDevices.Add(0x1397B100,@"B100"); - //mDevices.Add(0x139A0007,@"SES2000"); - //mDevices.Add(0x13A30005,@"7751"); - //mDevices.Add(0x13A30006,@"6500"); - //mDevices.Add(0x13A30007,@"7811"); - //mDevices.Add(0x13A30012,@"7951"); - //mDevices.Add(0x13A30014,@"7814/7851/7854"); - //mDevices.Add(0x13A30015,@"8065"); - //mDevices.Add(0x13A30017,@"8165"); - //mDevices.Add(0x13A30018,@"8154"); - //mDevices.Add(0x13A30020,@"7954/7955"); - //mDevices.Add(0x13A76240,@"Network Controller"); - //mDevices.Add(0x13A80152,@"XR17C152"); - //mDevices.Add(0x13A80154,@"XR17C154"); - //mDevices.Add(0x13A80158,@"XR17C158"); - //mDevices.Add(0x13C00010,@"SyncLink Adapter"); - //mDevices.Add(0x13C00020,@"SyncLink SCC"); - //mDevices.Add(0x13C00030,@"SyncLink 4 Port Adapter"); - //mDevices.Add(0x13C00070,@"SyncLink GT Adapter"); - //mDevices.Add(0x13C00080,@"SyncLink GT4 Adapter"); - //mDevices.Add(0x13C00090,@"SyncLink AC Adapter"); - //mDevices.Add(0x13C00210,@"SyncLink Serial Adapter version 2"); - //mDevices.Add(0x13C11000,@"9548qad"); - //mDevices.Add(0x13C11001,@"7000/8000 series"); - //mDevices.Add(0x13C11002,@"9000 series"); - //mDevices.Add(0x13C11003,@"9550SX/9590SE Series"); - //mDevices.Add(0x13C11004,@"9650SE Series"); - //mDevices.Add(0x13C70ADC,@"Multi-Function Analogue/Digital IO card"); - //mDevices.Add(0x13C70B10,@"Parallel I/O Card"); - //mDevices.Add(0x13C70D10,@"Digital I/O Card"); - //mDevices.Add(0x13C75744,@"Watchdog Card"); - //mDevices.Add(0x13D02103,@"T228502"); - //mDevices.Add(0x13D1AB06,@"FE2000VX"); - //mDevices.Add(0x13D1AB08,@"SMC8035TX"); - //mDevices.Add(0x13D78086,@"ac97"); - //mDevices.Add(0x13D81000,@"XQ11800FP"); - //mDevices.Add(0x13DF0001,@"PCI56RVP"); - //mDevices.Add(0x13EA3131,@"DS3131"); - //mDevices.Add(0x13EA3134,@"DS3134"); - //mDevices.Add(0x13F00200,@"FFK 8508"); - //mDevices.Add(0x13F00201,@"ST201"); - //mDevices.Add(0x13F00300,@"NX1001"); - //mDevices.Add(0x13F01023,@"NX1101"); - //mDevices.Add(0x13F013F0,@"-PCI\VEN_13F0&DEV_1023&SUBSYS_81801043&REV_41\4&BC"); - //mDevices.Add(0x13F60100,@"CMI8338/PCI C3DX"); - //mDevices.Add(0x13F60101,@"CMI8338-031"); - //mDevices.Add(0x13F60111,@"CMI8738/PCI C3DX"); - //mDevices.Add(0x13F60112,@"CMI-8378B/PCI-6CH"); - //mDevices.Add(0x13F60211,@"CMI8738/PCI-SX"); - //mDevices.Add(0x13F60300,@"0x4005"); - //mDevices.Add(0x13FE1240,@"PCI-1710"); - //mDevices.Add(0x13FE1680,@"PCI-1680U-A"); - //mDevices.Add(0x13FE1713,@"PCI-1713"); - //mDevices.Add(0x13FE1724,@"PCI-1724"); - //mDevices.Add(0x14000004,@"m583mlr"); - //mDevices.Add(0x14001401,@"9432 TX"); - //mDevices.Add(0x14022E00,@"ME-2000/2600"); - //mDevices.Add(0x14024610,@"ME-4610"); - //mDevices.Add(0x14024650,@"ME-4650"); - //mDevices.Add(0x14070100,@"0439"); - //mDevices.Add(0x14070101,@"Lava Quattro PCI A/B"); - //mDevices.Add(0x14070102,@"Lava Quattro PCI C/D"); - //mDevices.Add(0x14070110,@"Lava DSerial PCI Port A"); - //mDevices.Add(0x14070111,@"Lava DSerial PCI Port B"); - //mDevices.Add(0x14070180,@"Lava Octopus PCI Ports 1-4"); - //mDevices.Add(0x14070181,@"Lava Octopus PCI Ports 5-8"); - //mDevices.Add(0x14070200,@"9923"); - //mDevices.Add(0x14070201,@"LavaPort Quad-650 PCI A/B"); - //mDevices.Add(0x14070202,@"LavaPort Quad-650 PCI C/D"); - //mDevices.Add(0x14070220,@"LavaPort Quad-650 PCI A/B"); - //mDevices.Add(0x14070221,@"LavaPort Quad-650 PCI C/D"); - //mDevices.Add(0x14070400,@"Lava 8255 PIO PCI"); - //mDevices.Add(0x14070500,@"Lava Single Serial 550 PCI"); - //mDevices.Add(0x14070510,@"Lava SP Serial 550 PCI"); - //mDevices.Add(0x14070511,@"Lava SP BIDIR Parallel PCI"); - //mDevices.Add(0x14070520,@"Lava RS422 SS-PCI"); - //mDevices.Add(0x14070600,@"4-0 9253"); - //mDevices.Add(0x14070A00,@"LavaPort PCI"); - //mDevices.Add(0x14078000,@"Lava Parallel"); - //mDevices.Add(0x14078001,@"Lava Dual Parallel port A"); - //mDevices.Add(0x14078002,@"9923"); - //mDevices.Add(0x14078003,@"Lava Dual Parallel port B"); - //mDevices.Add(0x14078800,@"BOCA Research IOPPAR"); - //mDevices.Add(0x14097168,@"40371409"); - //mDevices.Add(0x14121712,@"ICE1712"); - //mDevices.Add(0x14121724,@"VT1720/24"); - //mDevices.Add(0x14158401,@"OX9162"); - //mDevices.Add(0x14158403,@"OX9162"); - //mDevices.Add(0x14159500,@"OX16PCI954"); - //mDevices.Add(0x14159501,@"OX16PCI954"); - //mDevices.Add(0x14159505,@"OXm16PCI952"); - //mDevices.Add(0x1415950A,@"OX16PCI954"); - //mDevices.Add(0x1415950B,@"OXCB950"); - //mDevices.Add(0x14159510,@"OX16PCI954"); - //mDevices.Add(0x14159511,@"OX9160"); - //mDevices.Add(0x14159512,@"OX16PCI954"); - //mDevices.Add(0x14159513,@"OX16PCI954"); - //mDevices.Add(0x14159521,@"OX16PCI952"); - //mDevices.Add(0x14159523,@"OX16PCI952"); - //mDevices.Add(0x141F6181,@"KFIR"); - //mDevices.Add(0x14350531,@"DELETE"); - //mDevices.Add(0x14356020,@"SPM6020"); - //mDevices.Add(0x14356030,@"SPM6030"); - //mDevices.Add(0x14356420,@"SPM186420"); - //mDevices.Add(0x14356430,@"SPM176430"); - //mDevices.Add(0x14357520,@"DM7520"); - //mDevices.Add(0x14357540,@"SDM7540"); - //mDevices.Add(0x14480001,@"ADAT/EDIT"); - //mDevices.Add(0x144A7248,@"PCI-9052"); - //mDevices.Add(0x144A7250,@"PCI-7250"); - //mDevices.Add(0x144A7256,@"PCI-7256"); - //mDevices.Add(0x144A7296,@"PCI-7296 (PLX PCI-9052)"); - //mDevices.Add(0x144A7432,@"PCI-7432"); - //mDevices.Add(0x144A7433,@"PCI-7433"); - //mDevices.Add(0x144A7434,@"PCI-7434"); - //mDevices.Add(0x144A7841,@"PCI-7841"); - //mDevices.Add(0x144A8133,@"PCI-8133"); - //mDevices.Add(0x144A8554,@"PCI-8554"); - //mDevices.Add(0x144A9111,@"PCI-9111"); - //mDevices.Add(0x144A9113,@"PCI-9113"); - //mDevices.Add(0x144A9114,@"PCI-9114"); - //mDevices.Add(0x145F0001,@"NextMove PCI"); - //mDevices.Add(0x145F0002,@"NextMove PCI-2"); - //mDevices.Add(0x146200C1,@"NV41.1"); - //mDevices.Add(0x14624720,@"883"); - //mDevices.Add(0x14625071,@"883"); - //mDevices.Add(0x14627960,@"MCP2T"); - //mDevices.Add(0x14710188,@"RoadRunner 10"); - //mDevices.Add(0x148C4011,@"RV250"); - //mDevices.Add(0x148C4152,@"0x1002"); - //mDevices.Add(0x148D1003,@"Rockwell HCF chipset"); - //mDevices.Add(0x14B11033,@"R6795-12"); - //mDevices.Add(0x14B30000,@"9ff-usa-a99-99-0970"); - //mDevices.Add(0x14B50200,@"Scope"); - //mDevices.Add(0x14B50300,@"Pulsar"); - //mDevices.Add(0x14B50400,@"Pulsar SRB"); - //mDevices.Add(0x14B50600,@"Pulsar 2"); - //mDevices.Add(0x14B50800,@"DSP-Board"); - //mDevices.Add(0x14B50900,@"DSP-Board"); - //mDevices.Add(0x14B50A00,@"DSP-Board"); - //mDevices.Add(0x14B50B00,@"DSP-Board"); - //mDevices.Add(0x14B70001,@"Symphony 4110"); - //mDevices.Add(0x14B90001,@"PC4800"); - //mDevices.Add(0x14B90340,@"Cisco Systems 340 PCI Wireless LAN Adptr"); - //mDevices.Add(0x14B92500,@"PC2500 DS"); - //mDevices.Add(0x14B93100,@"PC3100 FH"); - //mDevices.Add(0x14B93101,@"PC3100 FH"); - //mDevices.Add(0x14B93500,@"PC3500 FH"); - //mDevices.Add(0x14B94500,@"PC4500 DS"); - //mDevices.Add(0x14B94800,@"PC4800 DS"); - //mDevices.Add(0x14B9A504,@"A504 Cisco MAC"); - //mDevices.Add(0x14B9A506,@"AIR-MP21G"); - //mDevices.Add(0x14C18043,@"LANai 9.2 0129"); - //mDevices.Add(0x14CF2920,@"FPMC-FIO1-F100-1"); - //mDevices.Add(0x14D40400,@"Panacom 7"); - //mDevices.Add(0x14D90010,@"AP1011/SP1011"); - //mDevices.Add(0x14DB2100,@"PCI IO 1S"); - //mDevices.Add(0x14DB2101,@"PCI IO 1S-650"); - //mDevices.Add(0x14DB2102,@"PCI IO 1S-850"); - //mDevices.Add(0x14DB2110,@"PCI IO 1S1P"); - //mDevices.Add(0x14DB2111,@"PCI IO 1S1P-650"); - //mDevices.Add(0x14DB2112,@"PCI IO 1S1P-850"); - //mDevices.Add(0x14DB2120,@"TK9902"); - //mDevices.Add(0x14DB2121,@"PCI IO 2P"); - //mDevices.Add(0x14DB2130,@"PCI IO 2S"); - //mDevices.Add(0x14DB2131,@"PCI IO 2S-650"); - //mDevices.Add(0x14DB2132,@"PCI IO 2S-850"); - //mDevices.Add(0x14DB2140,@"PCI IO 2P1S"); - //mDevices.Add(0x14DB2141,@"PCI IO 2P1S-650"); - //mDevices.Add(0x14DB2142,@"PCI IO 2P1S-850"); - //mDevices.Add(0x14DB2144,@"PCI IO 2P2S"); - //mDevices.Add(0x14DB2145,@"PCI IO 2P2S-650"); - //mDevices.Add(0x14DB2146,@"PCI IO 2P2S-850"); - //mDevices.Add(0x14DB2150,@"PCI IO 4S"); - //mDevices.Add(0x14DB2151,@"PCI IO 4S-654"); - //mDevices.Add(0x14DB2152,@"PCI IO 4S-850"); - //mDevices.Add(0x14DB2160,@"PCI IO 2S1P"); - //mDevices.Add(0x14DB2161,@"PCI IO 2S1P-650"); - //mDevices.Add(0x14DB2162,@"PCI IO 2S1P-850"); - //mDevices.Add(0x14DB2180,@"PCI IO 8S"); - //mDevices.Add(0x14DB2181,@"PCI IO 8S-654"); - //mDevices.Add(0x14DB2182,@"PCI IO 8S-850"); - //mDevices.Add(0x14DC0000,@"PCI 230"); - //mDevices.Add(0x14DC0001,@"PCI242H"); - //mDevices.Add(0x14DC0002,@"PCI244H"); - //mDevices.Add(0x14DC0003,@"PCI247H"); - //mDevices.Add(0x14DC0004,@"PCI248H"); - //mDevices.Add(0x14DC0005,@"PCI249H"); - //mDevices.Add(0x14DC0006,@"PCI260"); - //mDevices.Add(0x14DC0007,@"PCI224"); - //mDevices.Add(0x14DC0008,@"PCI234"); - //mDevices.Add(0x14DC0009,@"PCI236"); - //mDevices.Add(0x14DC000A,@"PCI272"); - //mDevices.Add(0x14DC000B,@"PCI215"); - //mDevices.Add(0x14DC000C,@"PCI263"); - //mDevices.Add(0x14E4034F,@"NV36GL?"); - //mDevices.Add(0x14E40800,@"BCM33xx/47xx"); - //mDevices.Add(0x14E40804,@"BCM33xx/47xx"); - //mDevices.Add(0x14E40805,@"BCM33xx/47xx"); - //mDevices.Add(0x14E40806,@"BCM33xx/47xx"); - //mDevices.Add(0x14E4080B,@"BCM33xx/47xx"); - //mDevices.Add(0x14E4080F,@"BCM33xx/47xx"); - //mDevices.Add(0x14E40811,@"BCM33xx/47xx"); - //mDevices.Add(0x14E40816,@"BCM3302"); - //mDevices.Add(0x14E414E4,@"BCM5787M"); - //mDevices.Add(0x14E41600,@"BCM5752"); - //mDevices.Add(0x14E41644,@" BCM5751F"); - //mDevices.Add(0x14E41645,@"BCM5701"); - //mDevices.Add(0x14E41646,@"BCM5702x1"); - //mDevices.Add(0x14E41647,@"BCM5703"); - //mDevices.Add(0x14E41648,@"BCM5704"); - //mDevices.Add(0x14E4164C,@"BCM5708"); - //mDevices.Add(0x14E4164D,@"BCM5702FE"); - //mDevices.Add(0x14E41653,@"BCM5788"); - //mDevices.Add(0x14E41654,@"BCM5705-"); - //mDevices.Add(0x14E41658,@"BCM5750"); - //mDevices.Add(0x14E41659,@"BCM5721"); - //mDevices.Add(0x14E4165A,@"5722"); - //mDevices.Add(0x14E4165D,@"BCM5705M"); - //mDevices.Add(0x14E4165E,@"BCM5705M"); - //mDevices.Add(0x14E4166B,@"BCM5780S"); - //mDevices.Add(0x14E4166D,@"BCM5705MFE"); - //mDevices.Add(0x14E4166E,@"BCM5705"); - //mDevices.Add(0x14E41672,@"BCM5754M"); - //mDevices.Add(0x14E41673,@"B5755M"); - //mDevices.Add(0x14E41676,@"BCM5750"); - //mDevices.Add(0x14E41677,@"BCM5750A1"); - //mDevices.Add(0x14E4167A,@"BCM5754"); - //mDevices.Add(0x14E4167B,@"BCM5755/5780"); - //mDevices.Add(0x14E4167C,@"BCM5750"); - //mDevices.Add(0x14E4167E,@"BCM5751FKFB"); - //mDevices.Add(0x14E41693,@"BCM5787A"); - //mDevices.Add(0x14E41696,@"BCM5782"); - //mDevices.Add(0x14E4169A,@"BCM5786"); - //mDevices.Add(0x14E4169B,@"BCM5787"); - //mDevices.Add(0x14E4169C,@"BCM5788"); - //mDevices.Add(0x14E4169D,@"BCM5782k FB"); - //mDevices.Add(0x14E416A6,@"BCM5702X"); - //mDevices.Add(0x14E416A7,@"BCM5703X"); - //mDevices.Add(0x14E416A8,@"BCM5704"); - //mDevices.Add(0x14E416AA,@"B06BDRV"); - //mDevices.Add(0x14E416C6,@"BCM5702A3"); - //mDevices.Add(0x14E416C7,@"BCM 5703CKHB"); - //mDevices.Add(0x14E416DD,@"BCM5781"); - //mDevices.Add(0x14E416FD,@"BCM5753M"); - //mDevices.Add(0x14E416FE,@"BCM5753F"); - //mDevices.Add(0x14E4170C,@"BCM4401"); - //mDevices.Add(0x14E4170D,@"BCM5901"); - //mDevices.Add(0x14E4170E,@"BCM5901"); - //mDevices.Add(0x14E41713,@"BCM5906m"); - //mDevices.Add(0x14E43352,@"BCM3352"); - //mDevices.Add(0x14E43360,@"BCM3360"); - //mDevices.Add(0x14E44211,@"BCM HPNA"); - //mDevices.Add(0x14E44212,@"BCM V.90"); - //mDevices.Add(0x14E44301,@"BCM4301 802.11b"); - //mDevices.Add(0x14E44303,@"BCM4303"); - //mDevices.Add(0x14E44305,@"BCM4307"); - //mDevices.Add(0x14E44306,@"BCM4306"); - //mDevices.Add(0x14E44307,@"BCM4307"); - //mDevices.Add(0x14E44310,@"BCM4310"); - //mDevices.Add(0x14E44311,@"BCM4311"); - //mDevices.Add(0x14E44312,@"BCM4310"); - //mDevices.Add(0x14E44313,@"BCM4310"); - //mDevices.Add(0x14E44315,@"BCM4310"); - //mDevices.Add(0x14E44318,@"BCM4301"); - //mDevices.Add(0x14E44320,@"BCM94309"); - //mDevices.Add(0x14E44321,@"BCM4306"); - //mDevices.Add(0x14E44322,@"BCM4306"); - //mDevices.Add(0x14E44323,@"BCM4306"); - //mDevices.Add(0x14E44324,@"BCM4309"); - //mDevices.Add(0x14E44325,@"BCM4306"); - //mDevices.Add(0x14E44326,@"BCM4306"); - //mDevices.Add(0x14E44328,@"BCM94321KFBG"); - //mDevices.Add(0x14E44401,@"BCM4401"); - //mDevices.Add(0x14E44402,@"BCM4402"); - //mDevices.Add(0x14E44403,@"BCM4402"); - //mDevices.Add(0x14E44410,@"BCM4413"); - //mDevices.Add(0x14E44411,@"BCM4212"); - //mDevices.Add(0x14E44412,@"BCM4412"); - //mDevices.Add(0x14E44430,@"BCM44xx"); - //mDevices.Add(0x14E44432,@"BCM44xx"); - //mDevices.Add(0x14E44610,@"BCM4610"); - //mDevices.Add(0x14E44611,@"BCM4610"); - //mDevices.Add(0x14E44612,@"BCM4610"); - //mDevices.Add(0x14E44613,@"BCM4610"); - //mDevices.Add(0x14E44614,@"BCM4610"); - //mDevices.Add(0x14E44615,@"BCM4610"); - //mDevices.Add(0x14E44704,@"BCM4704"); - //mDevices.Add(0x14E44708,@"BCM4704"); - //mDevices.Add(0x14E44710,@"BCM4710"); - //mDevices.Add(0x14E44711,@"BCM47xx"); - //mDevices.Add(0x14E44712,@"BCM47xx"); - //mDevices.Add(0x14E44713,@"BCM47xx"); - //mDevices.Add(0x14E44714,@"BCM47xx"); - //mDevices.Add(0x14E44715,@"BCM47xx"); - //mDevices.Add(0x14E44716,@"BCM47xx"); - //mDevices.Add(0x14E44717,@"BCM47xx"); - //mDevices.Add(0x14E44718,@"BCM47xx"); - //mDevices.Add(0x14E44720,@"BCM4712"); - //mDevices.Add(0x14E45365,@"BCM5365P"); - //mDevices.Add(0x14E45600,@"BCM5600"); - //mDevices.Add(0x14E45605,@"BCM5605"); - //mDevices.Add(0x14E45615,@"BCM5615"); - //mDevices.Add(0x14E45625,@"BCM5625"); - //mDevices.Add(0x14E45645,@"BCM5645"); - //mDevices.Add(0x14E45670,@"BCM5670"); - //mDevices.Add(0x14E45680,@"BCM5680"); - //mDevices.Add(0x14E45690,@"BCM5690"); - //mDevices.Add(0x14E45691,@"BCM5691"); - //mDevices.Add(0x14E45802,@"BCM5802"); - //mDevices.Add(0x14E45805,@"BCM5805"); - //mDevices.Add(0x14E45820,@"BCM5820"); - //mDevices.Add(0x14E45821,@"BCM5821"); - //mDevices.Add(0x14E45822,@"BCM5822"); - //mDevices.Add(0x14E45823,@"BCM5823"); - //mDevices.Add(0x14E45824,@"BCM5824"); - //mDevices.Add(0x14E45840,@"BCM5840"); - //mDevices.Add(0x14E45841,@"BCM5841"); - //mDevices.Add(0x14E45850,@"BCM5850"); - //mDevices.Add(0x14E47321,@"BCM5751"); - //mDevices.Add(0x14E47411,@"BCM7411"); - //mDevices.Add(0x14EAAB06,@"FNW-3603-TX"); - //mDevices.Add(0x14EB0020,@"BEMx.x"); - //mDevices.Add(0x14EB0C01,@"S1D13808"); - //mDevices.Add(0x14F11035,@"unknown"); - //mDevices.Add(0x14F11059,@"DI15630-5, DI5631, DI5633"); - //mDevices.Add(0x14F11456,@"1456"); - //mDevices.Add(0x14F11611,@"AccessRunner ADSL Modem"); - //mDevices.Add(0x14F12400,@"unknown"); - //mDevices.Add(0x14F12702,@"cx11252-15"); - //mDevices.Add(0x14F12BFA,@"Unknown"); - //mDevices.Add(0x14F12C06,@"10250093"); - //mDevices.Add(0x14F12F00,@"00101767"); - //mDevices.Add(0x14F12F20,@"CX11252-11"); - //mDevices.Add(0x14F12F30,@"01"); - //mDevices.Add(0x14F12F40,@"71030277"); - //mDevices.Add(0x14F15045,@"4.0.3.1"); - //mDevices.Add(0x14F15051,@"4.0.1.6"); - //mDevices.Add(0x14F15B7A,@"Belived to be a CX23418"); - //mDevices.Add(0x14F18800,@"2003"); - //mDevices.Add(0x14F18852,@"0x7717"); - //mDevices.Add(0x14F20001,@"Moselle Split Bridge"); - //mDevices.Add(0x14F20002,@"Capilano Split Bridge"); - //mDevices.Add(0x14F20120,@"Merlin Split Bridge"); - //mDevices.Add(0x14F20121,@"PCI Parallel Port"); - //mDevices.Add(0x14F20122,@"PCI Serial Port"); - //mDevices.Add(0x14F20123,@"PCI PS/2 Keyboard Port"); - //mDevices.Add(0x14F20124,@"3103"); - //mDevices.Add(0x14FD0001,@"H260u"); - //mDevices.Add(0x15070001,@"MPC105 Eagle"); - //mDevices.Add(0x15070002,@"MPC106 Grackle"); - //mDevices.Add(0x15070003,@"MPC8240 Kahlua"); - //mDevices.Add(0x15070100,@"MPC145575 HFC-PCI"); - //mDevices.Add(0x15070431,@"KTI829c 100VG"); - //mDevices.Add(0x15074801,@"Raven"); - //mDevices.Add(0x15074802,@"Falcon"); - //mDevices.Add(0x15074803,@"Hawk"); - //mDevices.Add(0x15074806,@"CPX8216"); - //mDevices.Add(0x15160800,@"MTD800"); - //mDevices.Add(0x15160803,@"Myson MTD803/TAMARACK TC6020"); - //mDevices.Add(0x15160891,@"MTD891"); - //mDevices.Add(0x15192004,@"0x1"); - //mDevices.Add(0x151A1002,@"PCI-1002"); - //mDevices.Add(0x151A1004,@"PCI-1004"); - //mDevices.Add(0x151A1008,@"PCI-1008"); - //mDevices.Add(0x151B9080,@"me594v02100 combox"); - //mDevices.Add(0x151F0568,@"1.0.1.8"); - //mDevices.Add(0x15220100,@"PBridge+"); - //mDevices.Add(0x15240510,@"1.4.5.0"); - //mDevices.Add(0x15240530,@"CB-712/714/810"); - //mDevices.Add(0x15240550,@"CB-712/714/810"); - //mDevices.Add(0x15240610,@"???"); - //mDevices.Add(0x15241211,@"CB-1211"); - //mDevices.Add(0x15241225,@"CB-1225"); - //mDevices.Add(0x15241410,@"CB-1420"); - //mDevices.Add(0x15241411,@"CB-710/2/4/810"); - //mDevices.Add(0x15241412,@"CB-712/4"); - //mDevices.Add(0x15241420,@"CB-1420"); - //mDevices.Add(0x15241421,@"CB-720/2/4"); - //mDevices.Add(0x15241422,@"CB-722/4"); - //mDevices.Add(0x153B1115,@"ICE1712 Envy24"); - //mDevices.Add(0x153B1143,@"SAA7134HL"); - //mDevices.Add(0x153B6003,@"CS4614/22/24"); - //mDevices.Add(0x15409524,@"saa7134"); - //mDevices.Add(0x15433052,@"30201543"); - //mDevices.Add(0x15433155,@"Unknown"); - //mDevices.Add(0x154980FF,@"PCI-ISA-001"); - //mDevices.Add(0x15550002,@"PLX PCI 9050"); - //mDevices.Add(0x155E0020,@"MFC3"); - //mDevices.Add(0x15620001,@"LA-41x3"); - //mDevices.Add(0x15620002,@"LA-5030"); - //mDevices.Add(0x15620003,@"LA-5033"); - //mDevices.Add(0x156A5000,@"NA"); - //mDevices.Add(0x156A5100,@"NA"); - //mDevices.Add(0x1571A001,@"CCSI PCI20"); - //mDevices.Add(0x1571A002,@"CCSI PCI20-485D"); - //mDevices.Add(0x1571A003,@"CCSI PCI20-485X"); - //mDevices.Add(0x1571A004,@"CCSI PCI20-CXB"); - //mDevices.Add(0x1571A005,@"CCSI PCI20-CXS"); - //mDevices.Add(0x1571A006,@"CCSI PCI20-FOG-SMA"); - //mDevices.Add(0x1571A007,@"CCSI PCI20-FOG-ST"); - //mDevices.Add(0x1571A008,@"CCSI PCI20-TB5"); - //mDevices.Add(0x1571A009,@"CCSI PCI20-5-485"); - //mDevices.Add(0x1571A00A,@"CCSI PCI20-5-485D"); - //mDevices.Add(0x1571A00B,@"CCSI PCI20-5-485X"); - //mDevices.Add(0x1571A00C,@"CCSI PIC20-5-FOG-ST"); - //mDevices.Add(0x1571A00D,@"CCSI PCI20-5-FOG-SMA"); - //mDevices.Add(0x1571A00E,@"COM200C22"); - //mDevices.Add(0x1571A201,@"CCSI PCI22-485"); - //mDevices.Add(0x1571A202,@"CCSI PCI22-485D"); - //mDevices.Add(0x1571A203,@"CCSI PCI22-485X"); - //mDevices.Add(0x1571A204,@"CCSI PCI22-CHB"); - //mDevices.Add(0x1571A205,@"CCSI PCI22-FOG-ST"); - //mDevices.Add(0x1571A206,@"CCSI PCI22-THB"); - //mDevices.Add(0x157C8001,@"Fix2000"); - //mDevices.Add(0x15881100,@"PAX.port 1100"); - //mDevices.Add(0x15882000,@"AMD '971"); - //mDevices.Add(0x15888023,@"SNP8023"); - //mDevices.Add(0x158B0015,@"HLF-VMPEU560-C"); - //mDevices.Add(0x15920781,@"W83787IF"); - //mDevices.Add(0x15920782,@"W837871F"); - //mDevices.Add(0x15920783,@"TC32001 PCI I/O"); - //mDevices.Add(0x15920785,@"907ab184740802"); - //mDevices.Add(0x15920786,@"Winbond w83787if"); - //mDevices.Add(0x15920787,@"winbond w83787if"); - //mDevices.Add(0x15920788,@"w837871f"); - //mDevices.Add(0x1592078A,@"007AB192367002ND"); - //mDevices.Add(0x15A20001,@"TA700"); - //mDevices.Add(0x15AD0405,@"VGA 4.0.5"); - //mDevices.Add(0x15AD0710,@"Virtual SVGA"); - //mDevices.Add(0x15AD0720,@"VMXNET"); - //mDevices.Add(0x15AD0770,@"n/a"); - //mDevices.Add(0x15AD0801,@"n/a"); - //mDevices.Add(0x15B00001,@"FM-1789"); - //mDevices.Add(0x15B02BD0,@"2BD0"); - //mDevices.Add(0x15B35274,@"MT21108"); - //mDevices.Add(0x15B36278,@"MT25208A0-FCC"); - //mDevices.Add(0x15B83009,@"xPCI-3504"); - //mDevices.Add(0x15BC0101,@"n2530a"); - //mDevices.Add(0x15BC0103,@"QX4"); - //mDevices.Add(0x15BC2530,@"???"); - //mDevices.Add(0x15BC2531,@"???"); - //mDevices.Add(0x15BC2532,@"???"); - //mDevices.Add(0x15BC2929,@"E2929A"); - //mDevices.Add(0x15D10001,@"TC11IB"); - //mDevices.Add(0x15D10003,@"PEB 20544 E v1.1"); - //mDevices.Add(0x15D10004,@"PEB 3454 E v1.1"); - //mDevices.Add(0x15DC0001,@"Argus 300"); - //mDevices.Add(0x15E20500,@"Internet PhoneJack PCI Card"); - //mDevices.Add(0x15E80130,@"NCP130"); - //mDevices.Add(0x15E80131,@"Prism II"); - //mDevices.Add(0x15E91841,@"NetStaQ ADMA-100"); - //mDevices.Add(0x15F12F30,@"CX11252-15"); - //mDevices.Add(0x15F20001,@"Spot RT"); - //mDevices.Add(0x15F20002,@"Spot RT #2"); - //mDevices.Add(0x15F20003,@"Spot Insight"); - //mDevices.Add(0x16190400,@"FarSync T2P"); - //mDevices.Add(0x16190440,@"FarSync T4P"); - //mDevices.Add(0x16190610,@"FarSync T1U"); - //mDevices.Add(0x16190620,@"FarSync T2U"); - //mDevices.Add(0x16190640,@"FarSync T4U"); - //mDevices.Add(0x16191610,@"FarSync TE1"); - //mDevices.Add(0x16191612,@"FarSync TE1C"); - //mDevices.Add(0x16192610,@"FarSync DSL-S1"); - //mDevices.Add(0x16193640,@"FarSync T4E"); - //mDevices.Add(0x16194640,@"FarSync T4Ue (PCI Express)"); - //mDevices.Add(0x16210020,@"LynxTWO-A"); - //mDevices.Add(0x16210021,@"LynxTWO-B"); - //mDevices.Add(0x16210022,@"LynxTWO-C"); - //mDevices.Add(0x16210023,@"Lynx L22"); - //mDevices.Add(0x16210024,@"Lynx AES16"); - //mDevices.Add(0x16210025,@"Lynx AES16-SRC"); - //mDevices.Add(0x16291003,@"Format Synchronizer v3.0"); - //mDevices.Add(0x16292002,@"Fast Universal Data Output"); - //mDevices.Add(0x162D0100,@"Repeographics controller"); - //mDevices.Add(0x162D0101,@"Reprographics Controller"); - //mDevices.Add(0x162D0102,@"Reprographics Controller"); - //mDevices.Add(0x162D0103,@"Reprographics Controller"); - //mDevices.Add(0x162F1111,@"TS-PRL1"); - //mDevices.Add(0x162F1112,@"TS-PMA"); - //mDevices.Add(0x16381100,@"WL11000P"); - //mDevices.Add(0x163C3052,@"R6793-11"); - //mDevices.Add(0x163CFF02,@"SL2800 PCI"); - //mDevices.Add(0x164F0001,@"PLX 9054"); - //mDevices.Add(0x164F0002,@"PLX 9054"); - //mDevices.Add(0x16570646,@"BRE040"); - //mDevices.Add(0x16580704,@"905410B5"); - //mDevices.Add(0x165AC100,@"PIXCI CL1"); - //mDevices.Add(0x165AD200,@"PIXCI D2X"); - //mDevices.Add(0x165AD300,@"PIXCI D3X"); - //mDevices.Add(0x165C0002,@"FT232BL"); - //mDevices.Add(0x165F2000,@"XILINX SPARTAN"); - //mDevices.Add(0x16680100,@"0304"); - //mDevices.Add(0x166D0001,@"BCM1125/BCM1250 PCI Configuration Header"); - //mDevices.Add(0x166D0002,@"BCM1125/BCM1250 HyperTransport Configuration Heade"); - //mDevices.Add(0x167F4634,@"FOB-IO Card"); - //mDevices.Add(0x167F4C32,@"L2B PCI Board"); - //mDevices.Add(0x167F5344,@"FOB-SD Card"); - //mDevices.Add(0x167F5443,@"FOB-TDC Card"); - //mDevices.Add(0x16810050,@"HWGPCI-54"); - //mDevices.Add(0x168C0007,@"AR5005"); - //mDevices.Add(0x168C0011,@"AR5bmb5"); - //mDevices.Add(0x168C0012,@"AR5211"); - //mDevices.Add(0x168C0013,@"AR5212, AR5213"); - //mDevices.Add(0x168C001A,@"Atheros AR5005G"); - //mDevices.Add(0x168C001B,@"AR5006X"); - //mDevices.Add(0x168C0024,@"AR5008"); - //mDevices.Add(0x168C1014,@"AR5212"); - //mDevices.Add(0x168CFF96,@"AR5212"); - //mDevices.Add(0x16930212,@"PLX PCI9054"); - //mDevices.Add(0x16930213,@"Motorola MPC8245"); - //mDevices.Add(0x16AE1141,@"SafeXcel-1141"); - //mDevices.Add(0x16CA0001,@"Rocket Drive"); - //mDevices.Add(0x16EC0116,@"RTL8169S"); - //mDevices.Add(0x16EC1007,@"0637"); - //mDevices.Add(0x16EC2013,@"11323A"); - //mDevices.Add(0x16EC2F00,@"USRobotics 5660A - Internal Soft Modem"); - //mDevices.Add(0x16EC3685,@"???"); - //mDevices.Add(0x16EC5685,@"E129336-1"); - //mDevices.Add(0x170B0100,@"NSP2000-SSL"); - //mDevices.Add(0x17257174,@"VSC7174"); - //mDevices.Add(0x17341011,@"AIC-7902W"); - //mDevices.Add(0x17341012,@"CSB6"); - //mDevices.Add(0x17341013,@"BCM5703"); - //mDevices.Add(0x173B03E8,@"AC1000"); - //mDevices.Add(0x173B03EA,@"AC1002"); - //mDevices.Add(0x17438139,@"ROL/F-100"); - //mDevices.Add(0x174B0260,@"RV280"); - //mDevices.Add(0x174B0261,@"RV280"); - //mDevices.Add(0x174B7176,@"RV250"); - //mDevices.Add(0x174B7177,@"RV280"); - //mDevices.Add(0x174B7C12,@"RV280"); - //mDevices.Add(0x174B7C13,@"RV280"); - //mDevices.Add(0x17531001,@"VP500"); - //mDevices.Add(0x17531004,@"VP1000"); - //mDevices.Add(0x17550000,@"Au1500"); - //mDevices.Add(0x17AF4150,@"200"); - //mDevices.Add(0x17CC2280,@"Net 2280"); - //mDevices.Add(0x17D55831,@"X1"); - //mDevices.Add(0x17D55832,@"X2"); - //mDevices.Add(0x17D55833,@"X3"); - //mDevices.Add(0x17EE4153,@"RV350"); - //mDevices.Add(0x18133059,@"VT8237"); - //mDevices.Add(0x18134000,@"MD5628D-L-A"); - //mDevices.Add(0x18134100,@"Ambient MD8820"); - //mDevices.Add(0x18140101,@"2460 802.11b"); - //mDevices.Add(0x18140201,@"0x03011814"); - //mDevices.Add(0x18140301,@"b8341462"); - //mDevices.Add(0x18140302,@"RT2525 2.4GHz transceiver + RT2560 MAC/BBP"); - //mDevices.Add(0x18882503,@"Bt881"); - //mDevices.Add(0x18882504,@"Bt878"); - //mDevices.Add(0x18883503,@"nVidia NV28"); - //mDevices.Add(0x18883505,@"nVidia NV28"); - //mDevices.Add(0x18C91011,@"Leonardo CL"); - //mDevices.Add(0x18C91012,@"Leonardo CL-P"); - //mDevices.Add(0x18C91013,@"Leonardo CL-DB"); - //mDevices.Add(0x18C91014,@"Leonardo CL-P-DB"); - //mDevices.Add(0x18C91015,@"Leonardo CL-DVR"); - //mDevices.Add(0x18C91016,@"Leonardo CL-DVR-DB"); - //mDevices.Add(0x18C92011,@"Picasso 2SQ"); - //mDevices.Add(0x18C92012,@"Picasso 3C/3Cpro"); - //mDevices.Add(0x18C92013,@"Picasso LS"); - //mDevices.Add(0x18C92014,@"Picasso CL"); - //mDevices.Add(0x18C92015,@"Picasso FI"); - //mDevices.Add(0x18C92016,@"Picasso SDI"); - //mDevices.Add(0x18C92017,@"Picasso DUO"); - //mDevices.Add(0x18C92021,@"Colory"); - //mDevices.Add(0x18C93011,@"Valentino"); - //mDevices.Add(0x18CA0040,@"8085"); - //mDevices.Add(0x18F70001,@"ESCC-PCI-335"); - //mDevices.Add(0x18F70002,@"422/4-PCI-335"); - //mDevices.Add(0x18F70004,@"422/2-PCI-335"); - //mDevices.Add(0x19100001,@"SW5000-NCA"); - //mDevices.Add(0x19710001,@"AGEIA PhysX 100 Series PCI Express Card"); - //mDevices.Add(0x19711011,@"AGEIA PhysX 100 Series PCI Card"); - //mDevices.Add(0x19711021,@"AGEIA PhysX 200 Series PCI Express Card"); - //mDevices.Add(0x19AC0001,@"ACA2400"); - //mDevices.Add(0x1B130001,@"GeForce4 MX 440"); - //mDevices.Add(0x1DE10391,@"TRM-S1040"); - //mDevices.Add(0x1DE12020,@"DC-390"); - //mDevices.Add(0x1DE1690C,@"DC-690C"); - //mDevices.Add(0x1DE1DC29,@"DC290M"); - //mDevices.Add(0x33880020,@"HB2/HB6"); - //mDevices.Add(0x33880021,@"HB1/1-SE/HB6"); - //mDevices.Add(0x33880022,@"HB4"); - //mDevices.Add(0x33880028,@"HB8"); - //mDevices.Add(0x33880029,@"HB8"); - //mDevices.Add(0x33880030,@"HB7"); - //mDevices.Add(0x33880031,@"PCI 6156"); - //mDevices.Add(0x33888011,@"II"); - //mDevices.Add(0x33888012,@"cmi 8330"); - //mDevices.Add(0x33888013,@"PLX Registration Record Management"); - //mDevices.Add(0x3D3D0001,@"GLint 300SX"); - //mDevices.Add(0x3D3D0002,@"GLint 500TX"); - //mDevices.Add(0x3D3D0003,@"GLint"); - //mDevices.Add(0x3D3D0004,@"3C0SX"); - //mDevices.Add(0x3D3D0005,@"Permedia"); - //mDevices.Add(0x3D3D0006,@"GLint MX"); - //mDevices.Add(0x3D3D0007,@"3D Extreme"); - //mDevices.Add(0x3D3D0008,@"GLint Gamma G1"); - //mDevices.Add(0x3D3D0009,@"Permedia2v"); - //mDevices.Add(0x3D3D000A,@"Permedia 3"); - //mDevices.Add(0x3D3D000C,@"Permedia 3"); - //mDevices.Add(0x3D3D000D,@"GLINT R4"); - //mDevices.Add(0x3D3D000E,@"GLINT Gamma G2"); - //mDevices.Add(0x3D3D0030,@"0x030000"); - //mDevices.Add(0x3D3D0100,@"Permedia II"); - //mDevices.Add(0x3D3D1004,@"Permedia"); - //mDevices.Add(0x3D3D3D04,@"Permedia"); - //mDevices.Add(0x3D3DFFFF,@"GLint VGA"); - //mDevices.Add(0x40050300,@"3220"); - //mDevices.Add(0x40050308,@"3220"); - //mDevices.Add(0x40050309,@"ALS300+"); - //mDevices.Add(0x40051064,@"ALG2064"); - //mDevices.Add(0x40052064,@""); - //mDevices.Add(0x40052128,@"ALG2364A"); - //mDevices.Add(0x40052301,@"ALG2301"); - //mDevices.Add(0x40052302,@"ALG2302"); - //mDevices.Add(0x40052303,@"AVG2302"); - //mDevices.Add(0x40052364,@"ALG2364"); - //mDevices.Add(0x40052464,@"ALG2464"); - //mDevices.Add(0x40052501,@"ALG2564A/25128A"); - //mDevices.Add(0x40054000,@"ALS4000"); - //mDevices.Add(0x41440040,@"ADM-XRC"); - //mDevices.Add(0x41440041,@"ADM-XRC-II Lite"); - //mDevices.Add(0x41440042,@"ADM-XRC-II"); - //mDevices.Add(0x41440043,@"ADM-XPL"); - //mDevices.Add(0x41440044,@"ADM-XP"); - //mDevices.Add(0x41440045,@"ADP-WRC-II"); - //mDevices.Add(0x41440046,@"ADP-DRC-II"); - //mDevices.Add(0x41440049,@"ADP-XPI"); - //mDevices.Add(0x4144004A,@"ADP-XPI (PCI-X)"); - //mDevices.Add(0x4144004F,@"ADM-XRC-4FX"); - //mDevices.Add(0x41440050,@"ADM-XRC-5LX"); - //mDevices.Add(0x41440051,@"ADM-XRC-5T1"); - //mDevices.Add(0x416C0100,@"AlladinCARD"); - //mDevices.Add(0x416C0200,@"CPC"); - //mDevices.Add(0x4C530000,@"PLUSTEST"); - //mDevices.Add(0x4D510200,@"MQ-200"); - //mDevices.Add(0x50532010,@"Daytona Audio Adapter"); - //mDevices.Add(0x53330551,@"86C551"); - //mDevices.Add(0x53335333,@"S3 86c765"); - //mDevices.Add(0x53335631,@"86C325"); - //mDevices.Add(0x53338800,@"86C866"); - //mDevices.Add(0x53338801,@"86C964"); - //mDevices.Add(0x53338810,@"86C732"); - //mDevices.Add(0x53338811,@"8622mcq04"); - //mDevices.Add(0x53338812,@"86CM65?"); - //mDevices.Add(0x53338813,@"86C764"); - //mDevices.Add(0x53338814,@"86C767"); - //mDevices.Add(0x53338815,@"86CM66"); - //mDevices.Add(0x5333883D,@"86C988"); - //mDevices.Add(0x53338870,@"Fire GL"); - //mDevices.Add(0x53338880,@"86C868"); - //mDevices.Add(0x53338881,@"86C868"); - //mDevices.Add(0x53338882,@"86C868"); - //mDevices.Add(0x53338883,@"86C868"); - //mDevices.Add(0x533388B0,@"86C928"); - //mDevices.Add(0x533388B1,@"86C928"); - //mDevices.Add(0x533388B2,@"86C928"); - //mDevices.Add(0x533388B3,@"86C928"); - //mDevices.Add(0x533388C0,@"86C864"); - //mDevices.Add(0x533388C1,@"86C864"); - //mDevices.Add(0x533388C2,@"86C864"); - //mDevices.Add(0x533388C3,@"86C864"); - //mDevices.Add(0x533388D0,@"86C964"); - //mDevices.Add(0x533388D1,@"86C964"); - //mDevices.Add(0x533388D2,@"86C964"); - //mDevices.Add(0x533388D3,@"86C964"); - //mDevices.Add(0x533388F0,@"86C968"); - //mDevices.Add(0x533388F1,@"86C968"); - //mDevices.Add(0x533388F2,@"86C968"); - //mDevices.Add(0x533388F3,@"86C968"); - //mDevices.Add(0x53338900,@"86C775"); - //mDevices.Add(0x53338901,@"pci\ven_5333dev_8C2E&SUBSYS_00011179&REV_05\4&74C6"); - //mDevices.Add(0x53338902,@"86C551"); - //mDevices.Add(0x53338903,@"TrioV Family"); - //mDevices.Add(0x53338904,@"86C365/366"); - //mDevices.Add(0x53338905,@"86c765"); - //mDevices.Add(0x53338906,@"86c765"); - //mDevices.Add(0x53338907,@"86c765"); - //mDevices.Add(0x53338908,@"9711 MCN74"); - //mDevices.Add(0x53338909,@"7699688"); - //mDevices.Add(0x5333890A,@"0x00091011"); - //mDevices.Add(0x5333890B,@"9726 c19394.00"); - //mDevices.Add(0x5333890C,@"86C765"); - //mDevices.Add(0x5333890D,@"86C765 Trio64V+ compatible"); - //mDevices.Add(0x5333890E,@"9711 MCN74"); - //mDevices.Add(0x5333890F,@"86c765"); - //mDevices.Add(0x53338A01,@"86C375/86C385"); - //mDevices.Add(0x53338A10,@"86C357"); - //mDevices.Add(0x53338A11,@"86C359"); - //mDevices.Add(0x53338A12,@"86C359"); - //mDevices.Add(0x53338A13,@"86C368"); - //mDevices.Add(0x53338A20,@"86C391"); - //mDevices.Add(0x53338A21,@"86C390"); - //mDevices.Add(0x53338A22,@"86c398"); - //mDevices.Add(0x53338A23,@"86C394-397"); - //mDevices.Add(0x53338A25,@"86C370"); - //mDevices.Add(0x53338A26,@"86C395B"); - //mDevices.Add(0x53338C00,@"85C260"); - //mDevices.Add(0x53338C01,@"86C260"); - //mDevices.Add(0x53338C02,@"86C240"); - //mDevices.Add(0x53338C03,@"86C280 db"); - //mDevices.Add(0x53338C10,@"86C270/274/290/294"); - //mDevices.Add(0x53338C12,@"86C270/274/290/294"); - //mDevices.Add(0x53338C13,@"82C294"); - //mDevices.Add(0x53338C22,@"86C508"); - //mDevices.Add(0x53338C2A,@"86C544"); - //mDevices.Add(0x53338C2B,@"86C553"); - //mDevices.Add(0x53338C2C,@"86C564"); - //mDevices.Add(0x53338C2D,@"86C573"); - //mDevices.Add(0x53338C2E,@"86C584"); - //mDevices.Add(0x53338C2F,@"86C594"); - //mDevices.Add(0x53338D01,@"86C380/381"); - //mDevices.Add(0x53338D02,@"86c387"); - //mDevices.Add(0x53338D04,@"86C410"); - //mDevices.Add(0x53338E00,@"86C777/787"); - //mDevices.Add(0x53338E01,@"86C732"); - //mDevices.Add(0x53339102,@"86c410"); - //mDevices.Add(0x5333CA00,@"86C617"); - //mDevices.Add(0x55550003,@"VPI General Digital Video Component"); - //mDevices.Add(0x66660001,@"815"); - //mDevices.Add(0x66660002,@"PCCOM8"); - //mDevices.Add(0x80860008,@"Extended Express System Support Ctrlr"); - //mDevices.Add(0x80860309,@"80303"); - //mDevices.Add(0x8086030D,@"80312"); - //mDevices.Add(0x80860318,@"80219"); - //mDevices.Add(0x80860319,@"80219"); - //mDevices.Add(0x80860326,@"670xPXH"); - //mDevices.Add(0x80860327,@"6700PXH"); - //mDevices.Add(0x80860329,@"6700PXH"); - //mDevices.Add(0x8086032A,@"6700PXH"); - //mDevices.Add(0x8086032C,@"6702PXH"); - //mDevices.Add(0x80860330,@"80332"); - //mDevices.Add(0x80860331,@"80332"); - //mDevices.Add(0x80860332,@"80332"); - //mDevices.Add(0x80860333,@"80332"); - //mDevices.Add(0x80860334,@"80332"); - //mDevices.Add(0x80860335,@"80331"); - //mDevices.Add(0x80860336,@"80331"); - //mDevices.Add(0x80860340,@"41210"); - //mDevices.Add(0x80860341,@"41210"); - //mDevices.Add(0x80860370,@"80333"); - //mDevices.Add(0x80860371,@"80333"); - //mDevices.Add(0x80860372,@"80333"); - //mDevices.Add(0x80860373,@"80333"); - //mDevices.Add(0x80860374,@"80333"); - //mDevices.Add(0x80860482,@"82375MB"); - //mDevices.Add(0x80860483,@"82424TX/ZX"); - //mDevices.Add(0x80860484,@"82378ZB/IB"); - //mDevices.Add(0x80860486,@"82425EX"); - //mDevices.Add(0x808604A3,@"82434bX/zX"); - //mDevices.Add(0x80860500,@"E8870"); - //mDevices.Add(0x80860501,@"E8870"); - //mDevices.Add(0x80860502,@"E8870"); - //mDevices.Add(0x80860503,@"E8870"); - //mDevices.Add(0x80860510,@"E8870IO"); - //mDevices.Add(0x80860511,@"E8870IO"); - //mDevices.Add(0x80860512,@"E8870IO"); - //mDevices.Add(0x80860513,@"E8870IO"); - //mDevices.Add(0x80860514,@"E8870IO"); - //mDevices.Add(0x80860515,@"E8870IO"); - //mDevices.Add(0x80860516,@"E8870IO"); - //mDevices.Add(0x80860530,@"E8870SP"); - //mDevices.Add(0x80860531,@"E8870SP"); - //mDevices.Add(0x80860532,@"E8870SP"); - //mDevices.Add(0x80860533,@"E8870SP"); - //mDevices.Add(0x80860534,@"E8870SP"); - //mDevices.Add(0x80860535,@"E8870SP"); - //mDevices.Add(0x80860536,@"E8870SP"); - //mDevices.Add(0x80860537,@"E8870SP"); - //mDevices.Add(0x80860600,@"01af8086"); - //mDevices.Add(0x80860960,@"80960RP"); - //mDevices.Add(0x80860962,@"80960RM/RN"); - //mDevices.Add(0x80860964,@"80960RP"); - //mDevices.Add(0x80861000,@"82542"); - //mDevices.Add(0x80861001,@"2572"); - //mDevices.Add(0x80861002,@"Pro 100 LAN+Modem 56 CardBus II"); - //mDevices.Add(0x80861004,@"82543GC"); - //mDevices.Add(0x80861008,@"82544EI/GC"); - //mDevices.Add(0x80861009,@"82544EI"); - //mDevices.Add(0x8086100C,@"82543EI/GC"); - //mDevices.Add(0x8086100D,@"82544GC"); - //mDevices.Add(0x8086100E,@"82540EM"); - //mDevices.Add(0x8086100F,@"82545EM"); - //mDevices.Add(0x80861010,@"82546EB"); - //mDevices.Add(0x80861011,@"82545EM"); - //mDevices.Add(0x80861012,@"82546EB"); - //mDevices.Add(0x80861013,@"82541EI"); - //mDevices.Add(0x80861014,@"82541ER"); - //mDevices.Add(0x80861015,@"82540EM"); - //mDevices.Add(0x80861016,@"82540EP"); - //mDevices.Add(0x80861017,@"82540EP"); - //mDevices.Add(0x80861018,@"82541EI"); - //mDevices.Add(0x80861019,@"82547EI"); - //mDevices.Add(0x8086101A,@"82547EI"); - //mDevices.Add(0x8086101E,@"82540EP"); - //mDevices.Add(0x80861026,@"82545ep"); - //mDevices.Add(0x80861027,@"82545GM"); - //mDevices.Add(0x80861028,@"82545GM"); - //mDevices.Add(0x80861029,@"82559"); - //mDevices.Add(0x80861030,@"825593"); - //mDevices.Add(0x80861031,@"82801CAM"); - //mDevices.Add(0x80861032,@"82801CAM"); - //mDevices.Add(0x80861033,@"82801CAM"); - //mDevices.Add(0x80861034,@"82801CAM"); - //mDevices.Add(0x80861035,@"82562EH"); - //mDevices.Add(0x80861036,@"82562EH"); - //mDevices.Add(0x80861037,@"82801CAM"); - //mDevices.Add(0x80861038,@"82801CAM"); - //mDevices.Add(0x80861039,@"10011734"); - //mDevices.Add(0x8086103A,@"82801DB"); - //mDevices.Add(0x8086103B,@"82801DB"); - //mDevices.Add(0x8086103C,@"82801DB"); - //mDevices.Add(0x8086103D,@"82801DB"); - //mDevices.Add(0x8086103E,@"82801DB"); - //mDevices.Add(0x80861040,@"536EP"); - //mDevices.Add(0x80861042,@"PRO/Wireless 2011 LAN PCI Card"); - //mDevices.Add(0x80861043,@"82801"); - //mDevices.Add(0x80861048,@"82597EX"); - //mDevices.Add(0x80861049,@"82566MM NIC"); - //mDevices.Add(0x8086104A,@"82566DM"); - //mDevices.Add(0x80861050,@"82801EB/ER"); - //mDevices.Add(0x80861051,@"82801EB/ER"); - //mDevices.Add(0x80861052,@"82801EB/ER"); - //mDevices.Add(0x80861053,@"82801EB/ER"); - //mDevices.Add(0x80861054,@"82801EB/ER"); - //mDevices.Add(0x80861055,@"82801EB/ER"); - //mDevices.Add(0x80861059,@"82551QM"); - //mDevices.Add(0x80861064,@"Intel Pro VE"); - //mDevices.Add(0x80861065,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80861075,@"82547EI"); - //mDevices.Add(0x80861076,@"82541EI"); - //mDevices.Add(0x80861077,@"82547EI"); - //mDevices.Add(0x80861078,@"82541ER"); - //mDevices.Add(0x80861079,@"82546EB"); - //mDevices.Add(0x8086107A,@"82546EB"); - //mDevices.Add(0x8086107B,@"82546EB"); - //mDevices.Add(0x8086107C,@"82541PI"); - //mDevices.Add(0x80861080,@"0321CGEA04"); - //mDevices.Add(0x8086108B,@"PC82573V"); - //mDevices.Add(0x80861092,@"27DA"); - //mDevices.Add(0x8086109A,@"82573L"); - //mDevices.Add(0x808610BD,@"82566DM"); - //mDevices.Add(0x80861100,@"82815/EP/P"); - //mDevices.Add(0x80861101,@"82815/EP/P"); - //mDevices.Add(0x80861102,@"82815"); - //mDevices.Add(0x80861110,@"82815"); - //mDevices.Add(0x80861112,@"82815"); - //mDevices.Add(0x80861120,@"82815"); - //mDevices.Add(0x80861121,@"82815"); - //mDevices.Add(0x80861130,@"82815/82815EM/EP"); - //mDevices.Add(0x80861131,@"82815/82815EM/EP"); - //mDevices.Add(0x80861132,@"65416"); - //mDevices.Add(0x80861161,@"82806AA"); - //mDevices.Add(0x80861162,@"BECC"); - //mDevices.Add(0x80861179,@"82546EB"); - //mDevices.Add(0x80861200,@"IXP1200"); - //mDevices.Add(0x80861209,@"8255xER/IT"); - //mDevices.Add(0x80861221,@"82092AA"); - //mDevices.Add(0x80861222,@"82092AA"); - //mDevices.Add(0x80861223,@"SAA 7116 H"); - //mDevices.Add(0x80861225,@"82452KX/GX"); - //mDevices.Add(0x80861226,@"82596"); - //mDevices.Add(0x80861227,@"82865g"); - //mDevices.Add(0x80861228,@"EE PRO/100 Smart"); - //mDevices.Add(0x80861229,@"82557/8/9/0/1"); - //mDevices.Add(0x8086122D,@"82437FX"); - //mDevices.Add(0x8086122E,@"82371FB"); - //mDevices.Add(0x80861230,@"FW82371AB"); - //mDevices.Add(0x80861231,@"16345"); - //mDevices.Add(0x80861234,@"82371MX"); - //mDevices.Add(0x80861235,@"82439TX"); - //mDevices.Add(0x80861237,@"82440LX/EX"); - //mDevices.Add(0x80861239,@"82371FB"); - //mDevices.Add(0x8086123B,@"82380PB"); - //mDevices.Add(0x8086123C,@"82380AB"); - //mDevices.Add(0x8086123D,@"683053"); - //mDevices.Add(0x8086123E,@"82466GX"); - //mDevices.Add(0x8086123F,@"82466GX"); - //mDevices.Add(0x80861240,@"82752"); - //mDevices.Add(0x8086124B,@"4229"); - //mDevices.Add(0x80861250,@"82430HX"); - //mDevices.Add(0x808612D8,@"92XX"); - //mDevices.Add(0x80861360,@"82806AA"); - //mDevices.Add(0x80861361,@"82806AA"); - //mDevices.Add(0x80861460,@"82870P2"); - //mDevices.Add(0x80861461,@"14611014"); - //mDevices.Add(0x80861462,@"82870P2"); - //mDevices.Add(0x80861960,@"80960RP"); - //mDevices.Add(0x80861962,@"???"); - //mDevices.Add(0x80861A12,@"???"); - //mDevices.Add(0x80861A13,@"???"); - //mDevices.Add(0x80861A20,@"82840"); - //mDevices.Add(0x80861A21,@"82840"); - //mDevices.Add(0x80861A22,@"82840"); - //mDevices.Add(0x80861A23,@"82840"); - //mDevices.Add(0x80861A24,@"82840"); - //mDevices.Add(0x80861A30,@"82845G[GL/GV/GE/PE]"); - //mDevices.Add(0x80861A31,@"82845[MP/MZ]"); - //mDevices.Add(0x80861A38,@"5000P"); - //mDevices.Add(0x80862125,@"82801AA"); - //mDevices.Add(0x80862410,@"82801AA"); - //mDevices.Add(0x80862411,@"82801AA"); - //mDevices.Add(0x80862412,@"82801AA"); - //mDevices.Add(0x80862413,@"82801AA"); - //mDevices.Add(0x80862415,@"Intel 82801DBM SM/BUS Controller 24C3"); - //mDevices.Add(0x80862416,@"82801fb"); - //mDevices.Add(0x80862418,@"82801AA"); - //mDevices.Add(0x80862420,@"82801AB"); - //mDevices.Add(0x80862421,@"82801AB"); - //mDevices.Add(0x80862422,@"82801AB"); - //mDevices.Add(0x80862423,@"82801AB"); - //mDevices.Add(0x80862425,@"82845G"); - //mDevices.Add(0x80862426,@"82801AB"); - //mDevices.Add(0x80862428,@"82801AB"); - //mDevices.Add(0x80862431,@"82810"); - //mDevices.Add(0x80862440,@"82801BA"); - //mDevices.Add(0x80862441,@"82801BA"); - //mDevices.Add(0x80862442,@"82801BA/BAM"); - //mDevices.Add(0x80862443,@"0055110A"); - //mDevices.Add(0x80862444,@"82801BA/BAM"); - //mDevices.Add(0x80862445,@"82801E"); - //mDevices.Add(0x80862446,@"82801BA/BAM"); - //mDevices.Add(0x80862448,@"82801BAM/CAM/DBM"); - //mDevices.Add(0x80862449,@"82559ER"); - //mDevices.Add(0x8086244A,@"82801BAM"); - //mDevices.Add(0x8086244B,@"82801BA"); - //mDevices.Add(0x8086244C,@"82801BAM"); - //mDevices.Add(0x8086244E,@"82801DB"); - //mDevices.Add(0x80862450,@"82801E"); - //mDevices.Add(0x80862452,@"82801E"); - //mDevices.Add(0x80862453,@"82801E"); - //mDevices.Add(0x80862459,@"82801E"); - //mDevices.Add(0x8086245B,@"82801E"); - //mDevices.Add(0x8086245D,@"82801E"); - //mDevices.Add(0x8086245E,@"82801E"); - //mDevices.Add(0x80862480,@"82801CA"); - //mDevices.Add(0x80862481,@"82801CA"); - //mDevices.Add(0x80862482,@"82801CA/CAM"); - //mDevices.Add(0x80862483,@"82801CA/CAM"); - //mDevices.Add(0x80862484,@"82801CA/CAM"); - //mDevices.Add(0x80862485,@"82801CA/CAM"); - //mDevices.Add(0x80862486,@"82801CA/CAM"); - //mDevices.Add(0x80862487,@"82801CA/CAM"); - //mDevices.Add(0x8086248A,@"82801CAM"); - //mDevices.Add(0x8086248B,@"82801CA"); - //mDevices.Add(0x8086248C,@"82801CAM"); - //mDevices.Add(0x8086248D,@"82801??"); - //mDevices.Add(0x808624C0,@"82801DB/DBL"); - //mDevices.Add(0x808624C2,@"82801DB/DBL/DBM"); - //mDevices.Add(0x808624C3,@"82801DB/DBL/DBM"); - //mDevices.Add(0x808624C4,@"82801DB/DBL/DBM"); - //mDevices.Add(0x808624C5,@"Realtek ALC268 "); - //mDevices.Add(0x808624C6,@"82801"); - //mDevices.Add(0x808624C7,@"82801DB/DBL/DBM"); - //mDevices.Add(0x808624CA,@"82801DBM"); - //mDevices.Add(0x808624CB,@"82801DB/DBL"); - //mDevices.Add(0x808624CC,@"82801DBM"); - //mDevices.Add(0x808624CD,@"82801DB/DBL/DBM"); - //mDevices.Add(0x808624D0,@"82801EB/ER"); - //mDevices.Add(0x808624D1,@"82801EB/ER"); - //mDevices.Add(0x808624D2,@"82801EB/ER"); - //mDevices.Add(0x808624D3,@"82801EB/ER"); - //mDevices.Add(0x808624D4,@"82801EB/ER"); - //mDevices.Add(0x808624D5,@"815B104D"); - //mDevices.Add(0x808624D6,@"82801EB/ER"); - //mDevices.Add(0x808624D7,@"82801EB/ER"); - //mDevices.Add(0x808624DB,@"82801EB/ER"); - //mDevices.Add(0x808624DC,@"82801EB"); - //mDevices.Add(0x808624DD,@"82801EB/ER"); - //mDevices.Add(0x808624DE,@"82801EB/ER"); - //mDevices.Add(0x808624DF,@"82801ER"); - //mDevices.Add(0x80862500,@"82820"); - //mDevices.Add(0x80862501,@"82820"); - //mDevices.Add(0x80862502,@"82820"); - //mDevices.Add(0x80862503,@"82820"); - //mDevices.Add(0x80862504,@"82820"); - //mDevices.Add(0x8086250B,@"82820"); - //mDevices.Add(0x8086250F,@"82820"); - //mDevices.Add(0x80862520,@"82805AA"); - //mDevices.Add(0x80862521,@"82804AA"); - //mDevices.Add(0x80862530,@"82850/E"); - //mDevices.Add(0x80862531,@"82860"); - //mDevices.Add(0x80862532,@"82850/850E/860"); - //mDevices.Add(0x80862533,@"82860"); - //mDevices.Add(0x80862534,@"82860"); - //mDevices.Add(0x80862535,@"82860"); - //mDevices.Add(0x80862536,@"82860"); - //mDevices.Add(0x80862539,@"82860"); - //mDevices.Add(0x80862540,@"E7500"); - //mDevices.Add(0x80862541,@"E7500/E7501"); - //mDevices.Add(0x80862543,@"E7500/E7501"); - //mDevices.Add(0x80862544,@"E7500/E7501"); - //mDevices.Add(0x80862545,@"E7500/E7501"); - //mDevices.Add(0x80862546,@"E7500/E7501"); - //mDevices.Add(0x80862547,@"E7500/E7501"); - //mDevices.Add(0x80862548,@"E7500/E7501"); - //mDevices.Add(0x8086254C,@"E7501"); - //mDevices.Add(0x80862550,@"E7505"); - //mDevices.Add(0x80862551,@"25511014"); - //mDevices.Add(0x80862552,@"E7205/E7505"); - //mDevices.Add(0x80862553,@"E7505"); - //mDevices.Add(0x80862554,@"E7505"); - //mDevices.Add(0x80862560,@"82845G/GL/GV/GE/PE"); - //mDevices.Add(0x80862561,@"82845G/GL/GV/GE/PE"); - //mDevices.Add(0x80862562,@"82845G"); - //mDevices.Add(0x80862570,@"82865G/PE/P, 82848P"); - //mDevices.Add(0x80862571,@"82865G/PE/P, 82848P"); - //mDevices.Add(0x80862572,@"82865G"); - //mDevices.Add(0x80862573,@"82865G/PE/P, 82848P"); - //mDevices.Add(0x80862576,@"82865G/PE/P, 82848P"); - //mDevices.Add(0x80862578,@"82875P/E7210"); - //mDevices.Add(0x80862579,@"82875P"); - //mDevices.Add(0x8086257B,@"82875P/E7210"); - //mDevices.Add(0x8086257E,@"82875P/E7210"); - //mDevices.Add(0x80862580,@"915G/P/GV"); - //mDevices.Add(0x80862581,@"915G/P/GV, 925X/XE?"); - //mDevices.Add(0x80862582,@"0181102"); - //mDevices.Add(0x80862584,@"82925X/XE"); - //mDevices.Add(0x80862588,@"E7221"); - //mDevices.Add(0x80862589,@"E7221"); - //mDevices.Add(0x8086258A,@"E7221"); - //mDevices.Add(0x80862590,@"915GM"); - //mDevices.Add(0x80862592,@"Intel 82852/82855 Graphic controller family"); - //mDevices.Add(0x808625A1,@"6300ESB"); - //mDevices.Add(0x808625A2,@"6300ESB"); - //mDevices.Add(0x808625A3,@"6300ESB"); - //mDevices.Add(0x808625A4,@"6300ESB"); - //mDevices.Add(0x808625A6,@"6300ESB"); - //mDevices.Add(0x808625A7,@"6300ESB"); - //mDevices.Add(0x808625A9,@"6300ESB"); - //mDevices.Add(0x808625AA,@"6300ESB"); - //mDevices.Add(0x808625AB,@"6300ESB"); - //mDevices.Add(0x808625AC,@"6300ESB"); - //mDevices.Add(0x808625AD,@"6300ESB"); - //mDevices.Add(0x808625AE,@"6300ESB"); - //mDevices.Add(0x808625B0,@"6300ESB"); - //mDevices.Add(0x80862600,@"E8500"); - //mDevices.Add(0x80862601,@"E8500"); - //mDevices.Add(0x80862602,@"E8500"); - //mDevices.Add(0x80862603,@"E8500"); - //mDevices.Add(0x80862604,@"E8500"); - //mDevices.Add(0x80862605,@"E8500"); - //mDevices.Add(0x80862606,@"E8500"); - //mDevices.Add(0x80862607,@"E8500"); - //mDevices.Add(0x80862640,@"82801FB/FR"); - //mDevices.Add(0x80862641,@"82801FBM"); - //mDevices.Add(0x80862651,@"82801Fb"); - //mDevices.Add(0x80862652,@"82801FR"); - //mDevices.Add(0x80862653,@"82801FBM"); - //mDevices.Add(0x80862658,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80862659,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x8086265A,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x8086265B,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x8086265C,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80862660,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80862662,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80862664,@"82801FB"); - //mDevices.Add(0x80862666,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x80862668,@"11583659"); - //mDevices.Add(0x80862669,@"2028026"); - //mDevices.Add(0x8086266A,@"82801BA/CA"); - //mDevices.Add(0x8086266C,@"82801FB/FR/FW/FRW"); - //mDevices.Add(0x8086266D,@"82801EB"); - //mDevices.Add(0x8086266E,@"Intel Corporation 82830M/MG SDRAM Controller / Ho"); - //mDevices.Add(0x8086266F,@"82801FB/FBM/FW/FR/FRW"); - //mDevices.Add(0x80862681,@"62089A2"); - //mDevices.Add(0x80862770,@"82945G/GZ/P/PL"); - //mDevices.Add(0x80862771,@"82945G/GZ/P/PL"); - //mDevices.Add(0x80862772,@"82945G/GZ"); - //mDevices.Add(0x8086277C,@"82975X"); - //mDevices.Add(0x80862780,@"82915G"); - //mDevices.Add(0x80862782,@"82915G"); - //mDevices.Add(0x80862792,@"Mobile 82915GLx/x/x"); - //mDevices.Add(0x808627A0,@"874079"); - //mDevices.Add(0x808627A6,@"945GM"); - //mDevices.Add(0x808627B8,@"945GL"); - //mDevices.Add(0x808627C1,@"82801GB/GR/GH"); - //mDevices.Add(0x808627C5,@"82801GBM/GHM"); - //mDevices.Add(0x808627C6,@"82801GHM"); - //mDevices.Add(0x808627CA,@"USB UHCI Controller"); - //mDevices.Add(0x808627CB,@"USB UHCI Controller"); - //mDevices.Add(0x808627DA,@"1B761019"); - //mDevices.Add(0x808627DC,@"Intel PRO/100"); - //mDevices.Add(0x80862820,@"82801HB/HR/HH/HO"); - //mDevices.Add(0x80862821,@"82821HR/HH/HO"); - //mDevices.Add(0x80862822,@"82801HR/HH/HO&82801IR/IH/IO(AIE=0)/ICH10R"); - //mDevices.Add(0x80862824,@"82810HB"); - //mDevices.Add(0x80862825,@"82801HB/HR/HH/HO"); - //mDevices.Add(0x80862828,@"82801HBM/HEM"); - //mDevices.Add(0x80862829,@"82801HBM/HEM"); - //mDevices.Add(0x8086282A,@"ICH8ME/9ME"); - //mDevices.Add(0x8086283A,@"81EC1043 (?)"); - //mDevices.Add(0x8086284B,@"82801H"); - //mDevices.Add(0x80862850,@"82801HBM/HEM"); - //mDevices.Add(0x80862920,@"82801(IB)/IR/IH/IO"); - //mDevices.Add(0x80862921,@"82801IR/IH/IO"); - //mDevices.Add(0x80862922,@"82801IR/IH/IO"); - //mDevices.Add(0x80862923,@"82801IB"); - //mDevices.Add(0x80862925,@"82801IR/IH/IO(AIE=1)"); - //mDevices.Add(0x80862926,@"82801IR/IH/IO"); - //mDevices.Add(0x80862928,@"?(ICH9M Family)"); - //mDevices.Add(0x80862929,@"ICH9M/ME"); - //mDevices.Add(0x8086292D,@"?(ICH9M Family)"); - //mDevices.Add(0x8086292E,@"?(ICH9M Family)"); - //mDevices.Add(0x80862930,@"ICH9 Family SMBus Controller"); - //mDevices.Add(0x8086293E,@"486486"); - //mDevices.Add(0x8086294C,@"82566DC-2"); - //mDevices.Add(0x80862987,@"Q965/Q963"); - //mDevices.Add(0x80862992,@"Intel(R) Express Chipset video"); - //mDevices.Add(0x80862993,@"Intel(R) Express Chipset (Dell Version)"); - //mDevices.Add(0x80862994,@"0x8086"); - //mDevices.Add(0x80862997,@"Q965/Q963"); - //mDevices.Add(0x808629A4,@"n/a"); - //mDevices.Add(0x808629B2,@"Q35"); - //mDevices.Add(0x808629B3,@"Q35"); - //mDevices.Add(0x808629B4,@"Q35-Chipset"); - //mDevices.Add(0x808629B7,@"Q35-Chipset"); - //mDevices.Add(0x80862A02,@"Unknown"); - //mDevices.Add(0x80862A03,@"82Q965"); - //mDevices.Add(0x80862A04,@"Q965/Q963"); - //mDevices.Add(0x80862A07,@"Q965/Q963"); - //mDevices.Add(0x80863092,@"SRCU32"); - //mDevices.Add(0x80863200,@"31244"); - //mDevices.Add(0x80863340,@"82855PM"); - //mDevices.Add(0x80863341,@"82855PM"); - //mDevices.Add(0x80863342,@"82855PM"); - //mDevices.Add(0x8086348D,@"82541EI"); - //mDevices.Add(0x80863575,@"82830[MP]"); - //mDevices.Add(0x80863576,@"82830M/MP"); - //mDevices.Add(0x80863577,@"82830M/MG"); - //mDevices.Add(0x80863578,@"82830[MP]"); - //mDevices.Add(0x80863579,@"82835"); - //mDevices.Add(0x8086357B,@"82835"); - //mDevices.Add(0x80863580,@"852GM/GMV"); - //mDevices.Add(0x80863581,@"82852GME/PM"); - //mDevices.Add(0x80863582,@"852GM/GMV"); - //mDevices.Add(0x80863584,@"852GM/GMV"); - //mDevices.Add(0x80863585,@"852GM"); - //mDevices.Add(0x80863590,@"E7520"); - //mDevices.Add(0x80863591,@"E7520"); - //mDevices.Add(0x80863592,@"E7320"); - //mDevices.Add(0x80863593,@"E7525"); - //mDevices.Add(0x80863594,@"E7520"); - //mDevices.Add(0x80863595,@"E7525"); - //mDevices.Add(0x80863596,@"E7525"); - //mDevices.Add(0x80863597,@"E7525"); - //mDevices.Add(0x80863598,@"E7520"); - //mDevices.Add(0x80863599,@"E7520"); - //mDevices.Add(0x8086359A,@"E7520"); - //mDevices.Add(0x8086359B,@"E7525"); - //mDevices.Add(0x8086359E,@"E7525"); - //mDevices.Add(0x8086360B,@"PCI\VEN_8086&DEV_2448&SUBSYS_00000000&REV881\3&18d"); - //mDevices.Add(0x80863A00,@"ICH10 Family"); - //mDevices.Add(0x80863A02,@"ICH10R"); - //mDevices.Add(0x80863A03,@"ICH10"); - //mDevices.Add(0x80863A06,@"ICH10 Family"); - //mDevices.Add(0x80863A20,@"ICH10 Family"); - //mDevices.Add(0x80863A22,@"ICH10R"); - //mDevices.Add(0x80863A23,@"ICH10"); - //mDevices.Add(0x80863A26,@"ICH10 Family"); - //mDevices.Add(0x80864000,@"Creatix"); - //mDevices.Add(0x80864220,@"MPCI3B"); - //mDevices.Add(0x80864222,@"10418086"); - //mDevices.Add(0x80864223,@"2915ABG"); - //mDevices.Add(0x80864224,@"Intel Pro Wireless 2915ABG"); - //mDevices.Add(0x80864227,@"3945ABG"); - //mDevices.Add(0x80864229,@"Intel 4965AGN"); - //mDevices.Add(0x8086422D,@"Intel 4965AGN"); - //mDevices.Add(0x80864230,@"Intel 4965AGN"); - //mDevices.Add(0x80864233,@"Intel 4965AGN"); - //mDevices.Add(0x8086444E,@"TurboMemory"); - //mDevices.Add(0x80865001,@"PRO/DSL 2100"); - //mDevices.Add(0x80865005,@"PRO/DSL 2200"); - //mDevices.Add(0x80865029,@"?(EP80579)"); - //mDevices.Add(0x80865200,@"NH82801GR"); - //mDevices.Add(0x80865201,@"Network Controller"); - //mDevices.Add(0x80865309,@"80303"); - //mDevices.Add(0x8086530D,@"80312"); - //mDevices.Add(0x80866960,@"EHCI 960 emulator"); - //mDevices.Add(0x80867000,@"82371SB"); - //mDevices.Add(0x80867010,@"82371SB"); - //mDevices.Add(0x80867020,@"82371SB"); - //mDevices.Add(0x80867030,@"82437VX"); - //mDevices.Add(0x80867051,@"PB 642365-003"); - //mDevices.Add(0x80867100,@"82439TX"); - //mDevices.Add(0x80867110,@"82371AB/EB/MB"); - //mDevices.Add(0x80867111,@"82371AB/EB/MB"); - //mDevices.Add(0x80867112,@"82371AB/EB/MB"); - //mDevices.Add(0x80867113,@"82371AB/EB/MB"); - //mDevices.Add(0x80867120,@"82810"); - //mDevices.Add(0x80867121,@"82810"); - //mDevices.Add(0x80867122,@"82810-DC100"); - //mDevices.Add(0x80867123,@"82810-DC100"); - //mDevices.Add(0x80867124,@"82810E"); - //mDevices.Add(0x80867125,@"82810E"); - //mDevices.Add(0x80867126,@"82810-DC133"); - //mDevices.Add(0x80867127,@"82810-DC133"); - //mDevices.Add(0x80867128,@"82810-M DC-100"); - //mDevices.Add(0x8086712A,@"82810-M DC-133"); - //mDevices.Add(0x80867180,@"intel 82801 IB ICH7 - high definition audio"); - //mDevices.Add(0x80867181,@"82443 ex/lx"); - //mDevices.Add(0x80867182,@"440LX/EX"); - //mDevices.Add(0x80867190,@"82443BX/ZX"); - //mDevices.Add(0x80867191,@"82443BX/ZX"); - //mDevices.Add(0x80867192,@"82443BX/ZX"); - //mDevices.Add(0x80867194,@"82443MX"); - //mDevices.Add(0x80867195,@"82443MX"); - //mDevices.Add(0x80867196,@"82440 - 443MX"); - //mDevices.Add(0x80867198,@"82443MX"); - //mDevices.Add(0x80867199,@"82443MX"); - //mDevices.Add(0x8086719A,@"82443MX"); - //mDevices.Add(0x8086719B,@"82443MX"); - //mDevices.Add(0x808671A0,@"82443GX"); - //mDevices.Add(0x808671A1,@"intel 82801 IB ICH9 - high definition audio"); - //mDevices.Add(0x808671A2,@"82443GX"); - //mDevices.Add(0x80867221,@"82810"); - //mDevices.Add(0x80867600,@"82372FB/82468GX"); - //mDevices.Add(0x80867601,@"82372FB/82468GX"); - //mDevices.Add(0x80867602,@"82372FB/82468GX"); - //mDevices.Add(0x80867603,@"82372FB/82468GX"); - //mDevices.Add(0x80867605,@"82372FB"); - //mDevices.Add(0x80867800,@"82740"); - //mDevices.Add(0x80868086,@"park"); - //mDevices.Add(0x8086811A,@"Atom SCH"); - //mDevices.Add(0x808684C4,@"82454KX/GX"); - //mDevices.Add(0x808684C5,@"82453KX/GX"); - //mDevices.Add(0x808684CA,@"82451NX"); - //mDevices.Add(0x808684CB,@"82454NX/82467GX"); - //mDevices.Add(0x808684E0,@"82461GX"); - //mDevices.Add(0x808684E1,@"82462GX"); - //mDevices.Add(0x808684E2,@"82465GX"); - //mDevices.Add(0x808684E3,@"82463GX"); - //mDevices.Add(0x808684E4,@"82464GX"); - //mDevices.Add(0x808684E6,@"82466GX"); - //mDevices.Add(0x808684EA,@"82460GX"); - //mDevices.Add(0x808685A1,@"6300ESB"); - //mDevices.Add(0x808685A2,@"6300ESB"); - //mDevices.Add(0x808685A3,@"6300ESB"); - //mDevices.Add(0x808685A4,@"6300ESB"); - //mDevices.Add(0x808685A6,@"6300ESB"); - //mDevices.Add(0x808685A7,@"6300ESB"); - //mDevices.Add(0x808685A9,@"6300ESB"); - //mDevices.Add(0x808685AA,@"6300ESB"); - //mDevices.Add(0x80869620,@"I2O RAID PCI to PCI Bridge"); - //mDevices.Add(0x80869621,@"SRCU21"); - //mDevices.Add(0x80869622,@"SRCUxx"); - //mDevices.Add(0x80869641,@"SRCU31"); - //mDevices.Add(0x808696A1,@"SRCU31L"); - //mDevices.Add(0x80869874,@"AC97"); - //mDevices.Add(0x80869876,@"i845"); - //mDevices.Add(0x8086B152,@"S21152BB"); - //mDevices.Add(0x8086B154,@"S21154AE/BE"); - //mDevices.Add(0x8086B555,@"21555"); - //mDevices.Add(0x88661689,@"T2-MP3-001"); - //mDevices.Add(0x90040078,@"aic-7880p"); - //mDevices.Add(0x90041078,@"AIC-7810C"); - //mDevices.Add(0x90041135,@"0x0035"); - //mDevices.Add(0x90041160,@"AIC-1160"); - //mDevices.Add(0x90042178,@"AIC-7821"); - //mDevices.Add(0x90043860,@"AIC-2930U Ultra SCSI Ctrlr"); - //mDevices.Add(0x90043B78,@"AHA-4944W/4944UW"); - //mDevices.Add(0x90045075,@"AIC-755x"); - //mDevices.Add(0x90045078,@"AIC-7850P"); - //mDevices.Add(0x90045175,@"AIC-755x"); - //mDevices.Add(0x90045178,@"AIC-7850"); - //mDevices.Add(0x90045275,@"AIC-755x"); - //mDevices.Add(0x90045278,@"AIC-7850"); - //mDevices.Add(0x90045375,@"AIC-755x"); - //mDevices.Add(0x90045378,@"AIC-7850"); - //mDevices.Add(0x90045475,@"AIC-755x"); - //mDevices.Add(0x90045478,@"AIC-7850"); - //mDevices.Add(0x90045575,@"AVA-2930"); - //mDevices.Add(0x90045578,@"AIC-7855"); - //mDevices.Add(0x90045675,@"AIC-755x"); - //mDevices.Add(0x90045678,@"AIC-7856"); - //mDevices.Add(0x90045775,@"AIC-755x"); - //mDevices.Add(0x90045778,@"AIC-7850"); - //mDevices.Add(0x90045800,@"AIC-5800"); - //mDevices.Add(0x90045900,@"ANA-5910/30/40"); - //mDevices.Add(0x90045905,@"ANA-5910A/30A/40A"); - //mDevices.Add(0x90046038,@"AHA-2930C"); - //mDevices.Add(0x90046075,@"AIC-7560?"); - //mDevices.Add(0x90046078,@"AIC-7860"); - //mDevices.Add(0x90046178,@"AIC-7861"); - //mDevices.Add(0x90046278,@"AIC-7860"); - //mDevices.Add(0x90046378,@"AIC-7860"); - //mDevices.Add(0x90046478,@"AIC-786x"); - //mDevices.Add(0x90046578,@"AIC-786x"); - //mDevices.Add(0x90046678,@"AIC-786x"); - //mDevices.Add(0x90046778,@"AIC-786x"); - //mDevices.Add(0x90046915,@"ANA620xx/69011A"); - //mDevices.Add(0x90047078,@"AIC-7870"); - //mDevices.Add(0x90047178,@"AHA-2940/2940W"); - //mDevices.Add(0x90047278,@"AHA-3940/3940W"); - //mDevices.Add(0x90047378,@"AHA-3985"); - //mDevices.Add(0x90047478,@"AHA-2944"); - //mDevices.Add(0x90047578,@"AHA-3944/3944W"); - //mDevices.Add(0x90047678,@"AHA-4944W/4944UW"); - //mDevices.Add(0x90047778,@"AIC-787x"); - //mDevices.Add(0x90047810,@"aic 7810"); - //mDevices.Add(0x90047815,@"AIC-7515"); - //mDevices.Add(0x90047850,@"aic-7850"); - //mDevices.Add(0x90047855,@"AHA-2930"); - //mDevices.Add(0x90047860,@"AIC-7860"); - //mDevices.Add(0x90047870,@"AIC-7870"); - //mDevices.Add(0x90047871,@"aha 2940"); - //mDevices.Add(0x90047872,@"aha 3940"); - //mDevices.Add(0x90047873,@"aha 3985"); - //mDevices.Add(0x90047874,@"aha 2944"); - //mDevices.Add(0x90047880,@"aic7880p"); - //mDevices.Add(0x90047890,@"AIC-7890"); - //mDevices.Add(0x90047891,@"AIC-789x"); - //mDevices.Add(0x90047892,@"AIC-789x"); - //mDevices.Add(0x90047893,@"AIC-789x"); - //mDevices.Add(0x90047894,@"AIC-789x"); - //mDevices.Add(0x90047895,@"AIC-7895"); - //mDevices.Add(0x90047896,@"AIC-789x"); - //mDevices.Add(0x90047897,@"AIC-789x"); - //mDevices.Add(0x90048078,@"AIC-7880"); - //mDevices.Add(0x90048178,@"AHA-2940U/2940UW"); - //mDevices.Add(0x90048278,@"AHA-3940Uxx"); - //mDevices.Add(0x90048378,@"AIC-7883U"); - //mDevices.Add(0x90048478,@"ADAPTEC 2940UW CN SCSI"); - //mDevices.Add(0x90048578,@"AHA-3944U/3944UWD"); - //mDevices.Add(0x90048678,@"AHA-4944UW"); - //mDevices.Add(0x90048778,@"AIC-788x"); - //mDevices.Add(0x90048878,@"AIC-7888?"); - //mDevices.Add(0x90048B78,@"ABA-1030"); - //mDevices.Add(0x9004EC78,@"AHA-4944W/4944UW"); - //mDevices.Add(0x90050010,@"AIC-7890AB scsi controller"); - //mDevices.Add(0x90050011,@"11111"); - //mDevices.Add(0x90050013,@"AIC-7890/1"); - //mDevices.Add(0x9005001F,@"AIC-7890 AB for Windows XP"); - //mDevices.Add(0x90050020,@"AIC-789x"); - //mDevices.Add(0x9005002F,@"AIC-789x"); - //mDevices.Add(0x90050030,@"AIC-789x"); - //mDevices.Add(0x9005003F,@"AIC-789x"); - //mDevices.Add(0x90050050,@"AHA-3940U2x/3950U2x Ultra2 SCSI Adapter"); - //mDevices.Add(0x90050051,@"AHA-3950U2x Ultra2 SCSI Adapter"); - //mDevices.Add(0x90050053,@"AIC-7896"); - //mDevices.Add(0x9005005F,@"AIC-7896/7"); - //mDevices.Add(0x90050080,@"AIC-7892Q"); - //mDevices.Add(0x90050081,@"AIC-7892B"); - //mDevices.Add(0x90050083,@"AIC-7892D"); - //mDevices.Add(0x9005008F,@"AIC-7892"); - //mDevices.Add(0x900500C0,@"AIC-7899A"); - //mDevices.Add(0x900500C1,@"AIC-7899B"); - //mDevices.Add(0x900500C3,@"AIC-7899D"); - //mDevices.Add(0x900500C5,@"RAID Subsystem HBA"); - //mDevices.Add(0x900500CF,@"AIC-7899G"); - //mDevices.Add(0x90050258,@"AAC-RAID"); - //mDevices.Add(0x9005041F,@"AIC 9410"); - //mDevices.Add(0x9005043E,@"AIC9450W"); - //mDevices.Add(0x90058000,@"ASC-29320A"); - //mDevices.Add(0x9005800F,@"AIC-7901"); - //mDevices.Add(0x90058010,@"ASC-39320"); - //mDevices.Add(0x90058011,@"ASC-39320D"); - //mDevices.Add(0x90058012,@"ASC-29320"); - //mDevices.Add(0x90058014,@"ASC-29320LP"); - //mDevices.Add(0x90058015,@"ASC-39320"); - //mDevices.Add(0x90058016,@"ASC-39320A"); - //mDevices.Add(0x90058017,@"ASC-29320ALP"); - //mDevices.Add(0x9005801C,@"AIC-?????"); - //mDevices.Add(0x9005801D,@"AIC-7902B"); - //mDevices.Add(0x9005801E,@"AIC-7901"); - //mDevices.Add(0x9005801F,@"AIC-7902"); - //mDevices.Add(0x90058080,@"ASC-29320A"); - //mDevices.Add(0x9005808F,@"AIC-7901"); - //mDevices.Add(0x90058090,@"ASC-39320"); - //mDevices.Add(0x90058091,@"ASC-39320D"); - //mDevices.Add(0x90058092,@"ASC-29320"); - //mDevices.Add(0x90058093,@"ASC-29320B"); - //mDevices.Add(0x90058094,@"ASC-29320LP"); - //mDevices.Add(0x90058095,@"ASC-39320"); - //mDevices.Add(0x90058096,@"ASC-39320A"); - //mDevices.Add(0x90058097,@"ASC-29320ALP"); - //mDevices.Add(0x9005809C,@"ASC-39320D"); - //mDevices.Add(0x9005809D,@"AIC-7902B"); - //mDevices.Add(0x9005809E,@"AIC-7901A"); - //mDevices.Add(0x9005809F,@"AIC-7902B"); - //mDevices.Add(0x94126565,@"HT6565"); - //mDevices.Add(0x99020001,@"SG2010"); - //mDevices.Add(0x99020002,@"SG2010"); - //mDevices.Add(0x99020003,@"SG1010"); - //mDevices.Add(0xAA4203A3,@"9400-0931"); - //mDevices.Add(0xC0DE5600,@"62802"); - //mDevices.Add(0xC0DEC0DE,@"62802-51"); - //mDevices.Add(0xD4D40601,@"PCI Mezzanine Card"); - //mDevices.Add(0xDEAF9050,@"PC Weasel PCI VGA Device"); - //mDevices.Add(0xDEAF9051,@"PC Weasel PCI Serial Comm. Device"); - //mDevices.Add(0xDEAF9052,@"PC Weasel PCI"); - //mDevices.Add(0xE1590001,@"Ambient MD3200 A"); - //mDevices.Add(0xE1590002,@"Sedlbauer Speed PCI"); - //mDevices.Add(0xE1590600,@"Tiger 600"); - //mDevices.Add(0xEACE3100,@"DAG 3.10"); - //mDevices.Add(0xEACE3200,@"DAG 3.2x"); - //mDevices.Add(0xEACE320E,@"DAG 3.2E"); - //mDevices.Add(0xEACE340E,@"DAG 3.4E"); - //mDevices.Add(0xEACE341E,@"DAG 3.41E"); - //mDevices.Add(0xEACE3500,@"DAG 3.5"); - //mDevices.Add(0xEACE351C,@"DAG 3.5ECM"); - //mDevices.Add(0xEACE4100,@"DAG 4.10"); - //mDevices.Add(0xEACE4110,@"DAG 4.11"); - //mDevices.Add(0xEACE4200,@"DAG 4.2"); - //mDevices.Add(0xEACE420E,@"DAG 4.2E"); - //mDevices.Add(0xEDD8A091,@"ARK1000PV"); - //mDevices.Add(0xEDD8A099,@"ARK2000PV"); - //mDevices.Add(0xEDD8A0A1,@"ARK2000MT"); - //mDevices.Add(0xEDD8A0A9,@"ARK2000MI"); - //mDevices.Add(0xEDD8A0B1,@"ARK2000MI+"); - //mDevices.Add(0xFA570001,@"PMC"); - - - - - #endregion Fill devices - - #endregion PCIHelper - } - - public string FindVendor(UInt32 aVendorID) { - return mVendors[aVendorID]; - } - - public string FindDevice(UInt32 aVendorID,UInt32 aDeviceID) - { - return mDevices[aVendorID*0x10000+aDeviceID]; - } - /*protected List mVendors = new List(); - - public DeviceIDs() - { - mVendors.Add(new DeviceID(0x8086, "Intel")); - } - - public string FindVendor(UInt32 aVendorID) - { - for (int i = 0; i < mVendors.Count; i++) - { - - if (mVendors[i].Key == aVendorID) - return mVendors[i].Value; - } - return null; - }*/ - } - - protected static PCIDevice[] mDevices; - public static PCIDevice[] Devices { - get { return mDevices; } - } - - protected static bool mEnumerationCompleted = false; - - public static PCIDevice GetPCIDevice(byte bus, byte slot, byte function) { - if (!mEnumerationCompleted) { - Init(); - } - - foreach (PCIDevice dev in PCIBus.Devices) { - if (dev.Bus == bus && - dev.Slot == slot && - dev.Function == function) - return dev; - } - - return null; - } - - public static void Init() { - var xDevices = new List(16); - EnumerateBus(0, ref xDevices); - Console.WriteLine("Converting devices list to array."); - Console.Write("Count: "); - Console.WriteLine(""); - mDevices = xDevices.ToArray(); - Console.WriteLine(""); - mEnumerationCompleted = true; - } - - /// - /// Enumerates a given bus, adding devices to Devices - /// - /// The bus number to enumerate - /// The list of Devices - private static void EnumerateBus(byte aBus, ref List rDevices) { - for (byte xSlot = 0; xSlot < 32; xSlot++) { - byte xMaxFunctions = 1; - for (byte xFunction = 0; xFunction < xMaxFunctions; xFunction++) { - PCIDevice xPCIDevice = new PCIDeviceNormal(aBus, xSlot, xFunction); - if (xPCIDevice.DeviceExists) { - if (xPCIDevice.HeaderType == 2) { /* PCIHeaderType.Cardbus */ - xPCIDevice = new PCIDeviceCardBus(aBus, xSlot, xFunction); - } - - if (xPCIDevice.HeaderType == 1) { /* PCIHeaderType.Bridge */ - xPCIDevice = new PCIDeviceBridge(aBus, xSlot, xFunction); - } - if (xPCIDevice is PCIDeviceBridge) - { - EnumerateBus(((PCIDeviceBridge)xPCIDevice).SecondaryBus, ref rDevices); - } - rDevices.Add(xPCIDevice); - if (xPCIDevice.IsMultiFunction) { - xMaxFunctions = 8; - } - } - } - } - } - } - - [Flags] - public enum PCICommand : short - { - IO = 0x1, /* Enable response in I/O space */ - Memort = 0x2, /* Enable response in Memory space */ - Master = 0x4, /* Enable bus mastering */ - Special = 0x8, /* Enable response to special cycles */ - Invalidate = 0x10, /* Use memory write and invalidate */ - VGA_Pallete = 0x20, /* Enable palette snooping */ - Parity = 0x40, /* Enable parity checking */ - Wait = 0x80, /* Enable address/data stepping */ - SERR = 0x100, /* Enable SERR */ - Fast_Back = 0x200, /* Enable back-to-back writes */ - } - - [Flags] - public enum PCIStatus : int - { - CAP_LIST = 0x10, /* Support Capability List */ - SUPPORT_66MHZ = 0x20, /* Support 66 Mhz PCI 2.1 bus */ - UDF = 0x40, /* Support User Definable Features [obsolete] */ - FAST_BACK = 0x80, /* Accept fast-back to back */ - PARITY = 0x100, /* Detected parity error */ - DEVSEL_MASK = 0x600, /* DEVSEL timing */ - DEVSEL_FAST = 0x000, - DEVSEL_MEDIUM = 0x200, - DEVSEL_SLOW = 0x400, - SIG_TARGET_ABORT = 0x800, /* Set on target abort */ - REC_TARGET_ABORT = 0x1000, /* Master ack of " */ - REC_MASTER_ABORT = 0x2000, /* Set on master abort */ - SIG_SYSTEM_ERROR = 0x4000, /* Set when we drive SERR */ - DETECTED_PARITY = 0x8000 /* Set on parity error */ - } - - - public enum PCIHeaderType : byte - { - Normal = 0, - Bridge = 1, - Cardbus = 2 - } - - - [Flags] - public enum PCIBist : byte - { - CocdMask = 0x0f, /* Return result */ - Start = 0x40, /* 1 to start BIST, 2 secs or less */ - Capable = 0x80 /* 1 if BIST capable */ - } - - - /// - /// Class representing CardBus PCI Device device - /// - public class PCIDeviceCardBus : PCIDevice - { - public PCIDeviceCardBus(byte bus, byte slot, byte function) - : base (bus,slot,function) - { - } - - public override int NumberOfBaseAddresses() - { - //get - //{ - return 6; - //} - } - } - - /// - /// Class representing a PCI to PCI Bridge PCI Device - /// - public class PCIDeviceBridge : PCIDevice - { - public PCIDeviceBridge(byte bus, byte slot, byte function) - : base (bus,slot,function) - { - } - - public override int NumberOfBaseAddresses() - { - // get - // { - return 2; - ////} - } - - - public byte PrimaryBus { get { return Read8(0x18); } set { Write8(0x18, value); } } - public byte SecondaryBus { get { return Read8(0x19); } set { Write8(0x19, value); } } - public byte SubordinateBus { get { return Read8(0x1a); } set { Write8(0x1a, value); } } - public byte SecondaryLatencyTime { get { return Read8(0x1b); } set { Write8(0x1b, value); } } - } - - - /// - /// Class representing a Normal PCI Device - /// - public class PCIDeviceNormal : PCIDevice - { - public PCIDeviceNormal(byte bus, byte slot, byte function) - : base (bus,slot,function) - { - } - - public override int NumberOfBaseAddresses() - { - //get - //{ - return 6; - //} - } - - [Obsolete("Use PciDevice.GetAddressSpace(2)")] - public UInt32 BaseAddress2 { get { return Read32(0x18); } set { Write32(0x18, value); } } - [Obsolete("Use PciDevice.GetAddressSpace(3)")] - public UInt32 BaseAddress3 { get { return Read32(0x1a); } set { Write32(0x1a, value); } } - [Obsolete("Use PciDevice.GetAddressSpace(4)")] - public UInt32 BaseAddress4 { get { return Read32(0x20); } set { Write32(0x20, value); } } - [Obsolete("Use PciDevice.GetAddressSpace(5)")] - public UInt32 BaseAddress5 { get { return Read32(0x24); } set { Write32(0x24, value); } } - - } - - public abstract class PCIDevice - { - /// - /// Gets the number of address spaces this device type has - /// - /// - public abstract int NumberOfBaseAddresses(); - //{ - // get; - //} - - - private static string[] classtext = new string[] - { - "pre pci 2.0", // 00 - "disk", // 01 - "network", // 02 - "display", // 03 - "multimedia", // 04 - "memory", // 05 - "bridge", // 06 - "communication", // 07 - "system peripheral",// 08 - "input", // 09 - "docking station", // 0A - "CPU", // 0B - "serial bus", // 0C - }; - - private static string[][] subclasstext = new string[][] - { - new string[] { "VGA Device", "non VGA device"}, - new string[] { "SCSI" ,"IDE" , "floppy","IPI","RAID", "other" }, - new string[] { "Ethernet", "TokenRing", "FDDI" , "ATM" , "other" }, - new string[] { "VGA", "SuperVGA","XGA", "other"}, - new string[] { "video" ,"audio", "other"}, - new string[] { "RAM", "Flash memory" , "other"}, - new string[] { "CPU/PCI" ,"PCI/ISA" , "PCI/EISA" , "PCI/MCA","PCI/PCI" , "PCI/PCMCIA", "PCI/NuBus", "PCI/CardBus", "other"}, - new string[] { "serial", "parallel", "other"}, - new string[] { "PIC", "DMAC" , "timer" ,"RTC", "other"}, - new string[] { "keyboard","digitizer","mouse", "other" }, - new string[] { "generic" , "other" }, - new string[] { "386", "486","Pentium" , "P6" ,"Alpha","coproc","other" }, - new string[] { "Firewire", "ACCESS.bus" , "SSA", "USB" ,"Fiber Channel" , "other"}, - }; - - - public string GetClassInfo() - { - int cc = ClassCode; - int sc = SubClass; - - if (cc >= classtext.Length) - return "unknown class (" + cc.ToString() + ") / subclass (" + sc.ToString() + ")"; - - - if (sc >= subclasstext[cc].Length) - return String.Concat(classtext[cc], " / unknown subclass (", sc.ToString(), ")"); - - return String.Concat( classtext[cc] , " / " , subclasstext[cc][sc]); - } - - private const UInt32 PCI_BASE_ADDRESS_SPACE = 0x01; /* 0 = memory, 1 = I/O */ - private const UInt32 PCI_BASE_ADDRESS_SPACE_IO = 0x01; - private const UInt32 PCI_BASE_ADDRESS_SPACE_MEMORY = 0x00; - private const UInt32 PCI_BASE_ADDRESS_MEM_TYPE_MASK = 0x06; - private const UInt32 PCI_BASE_ADDRESS_MEM_TYPE_32 = 0x00; /* 32 bit address */ - private const UInt32 PCI_BASE_ADDRESS_MEM_TYPE_1M = 0x02; /* Below 1M [obsolete] */ - private const UInt32 PCI_BASE_ADDRESS_MEM_TYPE_64 = 0x04; /* 64 bit address */ - private const UInt32 PCI_BASE_ADDRESS_MEM_PREFETCH = 0x08; /* prefetchable? */ - private const UInt32 PCI_BASE_ADDRESS_MEM_MASK = 0xfffffff0; - private const UInt32 PCI_BASE_ADDRESS_IO_MASK = 0xfffffffc; - - - protected PCIDevice(byte bus, byte slot, byte function) - { - this.Bus = bus; - this.Slot = slot; - this.Function = function; - this.Claimed = false; - } - - private bool NeedsIO = false; - private bool NeedsMemory = false; - - private bool _NeedsLayingout = true; - - /// - /// Creates the AddressSpaces for this device. - /// - private void LayoutIO() - { - //Console.WriteLine("Checking AdressSpaces of PCI(" + Bus + ", " + Slot + ", " + Function + ")"); - IOMaps = new Kernel.AddressSpace[NumberOfBaseAddresses()]; - - for (byte i = 0; i < NumberOfBaseAddresses(); i++) - { - UInt32 address = GetBaseAddressInternal(i); - SetBaseAddressInternal(i, 0xffffffff); - UInt32 flags = GetBaseAddressInternal(i); - SetBaseAddressInternal(i, address); - if (address == 0) - { - //Console.WriteLine("register " + i + " - none " + PCIBus.ToHex(flags,8)); - - IOMaps[i] = null; - } - else if ((address & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) - { - UInt32 size = (~(PCI_BASE_ADDRESS_MEM_MASK & flags))+1; - IOMaps[i] = new Kernel.MemoryAddressSpace(address, size); - //Console.WriteLine("register " + i + " - " + size + "b mem"); - - NeedsMemory = true; - } - else if ((address & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) - { - UInt32 size = (~(PCI_BASE_ADDRESS_IO_MASK & flags)) & 0xFF; - IOMaps[i] = new Kernel.IOAddressSpace(address-1, ((uint)size)); - NeedsIO = true; - } - } - - _NeedsLayingout = false; - } - - private Kernel.AddressSpace[] IOMaps; - - /// - /// Gets the AddressSpace object assosiated with the device - /// - /// Address Space to return - /// - public Kernel.AddressSpace GetAddressSpace(byte index) - { - if (index < 0 || index >= NumberOfBaseAddresses()) - throw new ArgumentOutOfRangeException("index"); - - if (_NeedsLayingout) - LayoutIO(); - - return IOMaps[index]; - } - - /// - /// Has this device been claimed a driver - /// - public bool Claimed { get; set; } - /// - /// The bus the device is on - /// - public byte Bus { get; private set; } - /// - /// The slot the device is using - /// - public byte Slot { get; private set; } - /// - /// The function number of the device - /// - public byte Function { get; private set; } - - /// - /// Is this an actual device? - /// - public bool DeviceExists { get { return VendorID != 0xFFFF && VendorID != 0x0; } } - /// - /// Is this a multifunction device? - /// - public bool IsMultiFunction { get { return (Read8(0x0e) & 0xF0) != 0; } } - - /// - /// The Vendor ID - /// - public UInt16 VendorID { get { return Read16(0x0); } } - /// - /// The Device ID - /// - public UInt16 DeviceID { get { return Read16(0x2); } } - - /// - /// the command register of this PCI Device - /// - public PCICommand Command { get { return (PCICommand)Read16(0x4); } set { Write16(0x4, (ushort)value); } } - - /// - /// The Status Register of this PCI Device - /// - public PCIStatus Status { get { return (PCIStatus)Read16(0x6); } set { Write16(0x6, (ushort)value); } } - - /// - /// The Revision ID of this PCI Device - /// - public UInt16 RevisionID { get { return Read16(0x8); } } - /// - /// The Programming Interface Number of this PCI Device - /// - public byte ProgIF { get { return Read8(0x9); } } - /// - /// The Sub class of this PCI Device - /// - public byte SubClass { get { return Read8(0xa); } } - /// - /// The Class of this PCI Device - /// - public byte ClassCode { get { return Read8(0xb); } } - - /// - /// The Cache Line Size of this PCI Device - /// - public byte CacheLineSize { get { return Read8(0x0c); } set { Write8(0x0c, value); } } - /// - /// The Latency Timer of this PCI Device - /// - public byte LatencyTimer { get { return Read8(0x0d); } set { Write8(0x0d, value); } } - /// - /// The header type of this PCI Device - /// - public byte HeaderType { get { return (byte)(Read8(0x0e) & 0xf); } } - /// - /// The BIST Register of this PCI Device - /// - public PCIBist Bist { get { return (PCIBist)Read8(0x0f); } set { Write8(0x0f, (byte)value); } } - - [Obsolete("This function should be private. Use PciDevice.GetAddressSpace(index)")] - public UInt32 GetBaseAddress(byte index) - { - return Read32((byte)(0x10 + index * 4)); - } - - public UInt32 GetBaseAddressInternal(byte index) - { - return Read32((byte)(0x10 + (index * 4))); - } - - private void SetBaseAddressInternal(byte index, UInt32 value) - { - Write32((byte)(0x10 + (index * 4)), value); - } - - [Obsolete("Use PciDevice.GetAddressSpace(0)")] - public UInt32 BaseAddress0 { get { return Read32(0x10); } set { Write32(0x10, value); } } - [Obsolete("Use PciDevice.GetAddressSpace(1)")] - public UInt32 BaseAddress1 { get { return Read32(0x14); } set { Write32(0x14, value); } } - - public byte InterruptLine { get { return Read8(0x3c); } set { Write8(0x3c, value); } } - public byte InterruptPin { get { return Read8(0x3d); } set { Write8(0x3d, value); } } - public byte MinGNT { get { return Read8(0x3e); } set { Write8(0x3e, value); } } - public byte MaxLAT { get { return Read8(0x3f); } set { Write8(0x3f, value); } } - - protected const ushort ConfigAddr = 0xCF8; - protected const ushort ConfigData = 0xCFC; - - /// - /// Disables the device - /// - public void DisableDevice() - { - Command = Command & (~PCICommand.IO & ~PCICommand.Master & PCICommand.Memort); - } - - /// - /// enables the device - /// - public void EnableDevice() - { - Command = Command | ((NeedsIO ? PCICommand.IO : 0) | PCICommand.Master | (NeedsMemory ? PCICommand.Memort : 0)); - } - - private UInt32 GetAddress(byte aRegister) - { - return (UInt32)( - // Bits 23-16 - ((UInt32)Bus << 16) - // Bits 15-11 - | (((UInt32)Slot & 0x1F) << 11) - // Bits 10-8 - | (((UInt32)Function & 0x07) << 8) - // Bits 7-0 - | ((UInt32)aRegister & 0xFC) - // Enable bit - must be set - | 0x80000000); - } - - protected UInt32 Read32(byte aRegister) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - return Kernel.CPUBus.Read32(ConfigData); - } - - protected UInt16 Read16(byte aRegister) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - return (UInt16)(Kernel.CPUBus.Read32(ConfigData) >> ((aRegister % 4) * 8) & 0xFFFF); - } - - protected byte Read8(byte aRegister) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - return (byte)(Kernel.CPUBus.Read32(ConfigData) >> ((aRegister % 4) * 8) & 0xFF); - } - - protected void Write32(byte aRegister, UInt32 value) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - Kernel.CPUBus.Write32(ConfigData, value); - } - - protected void Write16(byte aRegister, UInt16 value) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - Kernel.CPUBus.Write16(ConfigData, value); - } - - protected void Write8(byte aRegister, byte value) - { - Kernel.CPUBus.Write32(ConfigAddr, GetAddress(aRegister)); - Kernel.CPUBus.Write8(ConfigData, value); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Hardware/Properties/AssemblyInfo.cs deleted file mode 100644 index 95dc336179..0000000000 --- a/source/Archive/Cosmos.Hardware/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("Cosmos.Hardware")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Hardware")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("bb0d8fca-4d99-41b4-80f5-466b1c6d5bcf")] - -// 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/source/Archive/Cosmos.Hardware/RTC.cs b/source/Archive/Cosmos.Hardware/RTC.cs deleted file mode 100644 index 1700db8a9e..0000000000 --- a/source/Archive/Cosmos.Hardware/RTC.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - public class RTC: Hardware { - private const ushort AddressPort = 0x70; - private const ushort DataPort = 0x71; - - private static void WaitForReady() { - do { - IOWriteByte(AddressPort, 10); - } - while ((IOReadByte(DataPort) & 0x80) != 0); - } - - public static byte GetSeconds() { - WaitForReady(); - IOWriteByte(AddressPort, 0); - return FromBCD(IOReadByte(DataPort)); - } - - public static byte GetMinutes() { - WaitForReady(); - IOWriteByte(AddressPort, 2); - return FromBCD(IOReadByte(DataPort)); - } - - public static byte GetHours() { - WaitForReady(); - IOWriteByte(AddressPort, 4); - return FromBCD(IOReadByte(DataPort)); - } - - //ToDo convert this to an extension method for FromBCD in Cosmos.Kernel - /// - /// Converts a BCD coded value to hex coded - /// - /// BCD coded - /// Hex coded - private static byte FromBCD(byte value) - { - return (byte)(((value >> 4) & 0x0F) * 10 + (value & 0x0F)); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/Serial.cs b/source/Archive/Cosmos.Hardware/Serial.cs deleted file mode 100644 index 75e5f55578..0000000000 --- a/source/Archive/Cosmos.Hardware/Serial.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Hardware2 { - public class Serial: Hardware { - private const ushort COM1 = 0x3F8; - private const ushort COM2 = 0x2F8; - private static bool[] _serialInited = new []{false, false}; - - private static ushort GetSerialAddr(byte aSerialIdx) { - if (aSerialIdx == 0) { - return COM1; - } -// if(aSerialIdx==1) { - return COM2; - //} - //throw new Exception("Serial port not available"); - } - - public static void InitSerial(byte aSerialIdx) { - if (_serialInited[aSerialIdx+1]) { - return; - } - ushort xComAddr = GetSerialAddr(aSerialIdx); - IOWriteByte((ushort)(xComAddr + 1), 0x00); // Disable all interrupts - IOWriteByte((ushort)(xComAddr + 3), 0x80); // Enable DLAB (set baud rate divisor) - IOWriteByte((ushort)(xComAddr + 0), 0x0C); // Set divisor to 3 (lo byte) 38400 baud - IOWriteByte((ushort)(xComAddr + 1), 0x00); // (hi byte) - IOWriteByte((ushort)(xComAddr + 3), 0x03); // 8 bits, no parity, one stop bit - IOWriteByte((ushort)(xComAddr + 2), 0xC7); // Enable FIFO, clear them, with 14-byte threshold - IOWriteByte((ushort)(xComAddr + 4), 0x0B); // IRQs enabled, RTS/DSR set - _serialInited[aSerialIdx + 1] = true; - } - - private static int IsSerialTransmitEmpty(ushort aSerialAddr) { - return (IOReadByte((ushort)(aSerialAddr + 5)) & 0x20); - } - - public static void WriteSerial(byte aSerialIdx, byte aData) { - ushort xSerialAddr = GetSerialAddr(aSerialIdx); - if (!_serialInited[aSerialIdx + 1]) { - InitSerial(aSerialIdx); - } - while (IsSerialTransmitEmpty(xSerialAddr) == 0) { - ; - } - IOWriteByte(xSerialAddr, aData); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Hardware/USB/USBHost.cs b/source/Archive/Cosmos.Hardware/USB/USBHost.cs deleted file mode 100644 index 1e5c045ccf..0000000000 --- a/source/Archive/Cosmos.Hardware/USB/USBHost.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Hardware2.PC.Bus.USB -{ - public abstract class USBHost : Device - { - } -} diff --git a/source/Archive/Cosmos.Hardware/USB/USBHostOHCI.cs b/source/Archive/Cosmos.Hardware/USB/USBHostOHCI.cs deleted file mode 100644 index 5cc2ed1a9e..0000000000 --- a/source/Archive/Cosmos.Hardware/USB/USBHostOHCI.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.PC.Bus.USB -{ - public class USBHostOHCI : USBHost - { - public static void ScanDevices() - { - foreach (PCIDevice pci in PCIBus.Devices) - { - if (pci.ClassCode == 0x0c && //bus - pci.SubClass == 0x03 && //usb - pci.ProgIF == 0x10) //ohci :D - { - //(as this is an open standard, vendor/device specific implementations should all work the same) - Device.Add(new USBHostOHCI(pci)); - } - } - } - - private PCIDeviceNormal mydevice; - private USBHostOHCIRegisters regs; - public USBHostOHCI(PCIDevice pcidev) - { - mydevice = pcidev as PCIDeviceNormal; - regs = new USBHostOHCIRegisters(pcidev.GetAddressSpace(0) as MemoryAddressSpace); - } - - - public override string Name - { - get { throw new NotImplementedException(); } - } - } -} diff --git a/source/Archive/Cosmos.Hardware/USB/USBHostOHCIRegisters.cs b/source/Archive/Cosmos.Hardware/USB/USBHostOHCIRegisters.cs deleted file mode 100644 index 7d444cabb1..0000000000 --- a/source/Archive/Cosmos.Hardware/USB/USBHostOHCIRegisters.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware2.PC.Bus; -using Cosmos.Kernel; - -namespace Cosmos.Hardware2.PC.Bus.USB -{ - public class USBHostOHCIRegisters - { - private MemoryAddressSpace regs; - public USBHostOHCIRegisters(MemoryAddressSpace regs) - { - this.regs = regs; - } - - public UInt32 HcRevision { get { return regs.Read32Unchecked(0x0); } } - public UInt32 HcControl { get { return regs.Read32Unchecked(0x4); } set { regs.Write32Unchecked(0x4, value); } } - public UInt32 HcCommandStatus { get { return regs.Read32Unchecked(0x8); } set { regs.Write32Unchecked(0x8, value); } } - public UInt32 HcInterruptStatus { get { return regs.Read32Unchecked(0xC); } set { regs.Write32Unchecked(0xC, value); } } - public UInt32 HcInterruptEnable { get { return regs.Read32Unchecked(0x10); } set { regs.Write32Unchecked(0x10, value); } } - public UInt32 HcInterruptDisable { get { return regs.Read32Unchecked(0x14); } set { regs.Write32Unchecked(0x14, value); } } - public UInt32 HcHCCA { get { return regs.Read32Unchecked(0x18); } set { regs.Write32Unchecked(0x18, value); } } - public UInt32 HcPeriodCurrentED { get { return regs.Read32Unchecked(0x1C); } set { regs.Write32Unchecked(0x1C, value); } } - public UInt32 HcControlHeadED { get { return regs.Read32Unchecked(0x20); } set { regs.Write32Unchecked(0x20, value); } } - public UInt32 HcControlCurrentED { get { return regs.Read32Unchecked(0x24); } set { regs.Write32Unchecked(0x24, value); } } - public UInt32 HcBulkHeadED { get { return regs.Read32Unchecked(0x28); } set { regs.Write32Unchecked(0x28, value); } } - public UInt32 HcBulkCurrentED { get { return regs.Read32Unchecked(0x2C); } set { regs.Write32Unchecked(0x2C, value); } } - public UInt32 HcDoneHead { get { return regs.Read32Unchecked(0x30); } set { regs.Write32Unchecked(0x30, value); } } - public UInt32 HcFmInterval { get { return regs.Read32Unchecked(0x34); } set { regs.Write32Unchecked(0x34, value); } } - public UInt32 HcFmRemaining { get { return regs.Read32Unchecked(0x38); } set { regs.Write32Unchecked(0x38, value); } } - public UInt32 HcFmNumber { get { return regs.Read32Unchecked(0x3C); } set { regs.Write32Unchecked(0x3C, value); } } - public UInt32 HcPeriodicStart { get { return regs.Read32Unchecked(0x40); } set { regs.Write32Unchecked(0x40, value); } } - public UInt32 HcLSThreshold { get { return regs.Read32Unchecked(0x44); } set { regs.Write32Unchecked(0x44, value); } } - public UInt32 HcRhDescriptorA { get { return regs.Read32Unchecked(0x48); } set { regs.Write32Unchecked(0x48, value); } } - public UInt32 HcRhDescriptorB { get { return regs.Read32Unchecked(0x4C); } set { regs.Write32Unchecked(0x4C, value); } } - public UInt32 HcRhStatus { get { return regs.Read32Unchecked(0x50); } set { regs.Write32Unchecked(0x50, value); } } - - } - - public struct HcRevisionReg - { - private UInt32 data; - private HcRevisionReg(UInt32 a) - { - this.data = a; - } - - #region Implicit Conversions - public static implicit operator UInt32(HcRevisionReg a) - { - return a.data; - } - - public static implicit operator HcRevisionReg(UInt32 u) - { - return new HcRevisionReg(u); - } - #endregion - - #region FieldAccessors - public byte Major - { - get { return (byte)((data & 0xf0) >> 4); } - set { data = (data & 0xffffff0f) | (UInt32)((value & 0xf) << 4); } - } - public byte Minor - { - get { return (byte)(data & 0xf); } - set { data = (data & 0xfffffff0) | (UInt32)(value & 0xf); } - } - #endregion - - public override string ToString() - { - return data.ToString(); - } - } - - public struct HcControlReg - { - private UInt32 data; - private HcControlReg(UInt32 a) - { - this.data = a; - } - - #region Implicit Conversions - public static implicit operator UInt32(HcControlReg a) - { - return a.data; - } - - public static implicit operator HcControlReg(UInt32 u) - { - return new HcControlReg(u); - } - #endregion - - #region FieldAccessors - - public byte ControlBulkServiceRatio - { - get { return (byte)((data & 0x3)); } - } - public bool PeriodicListEnable - { - get { return (data & 0x4) == 0x4; } - } - public bool IsochronousEnable - { - get { return (data & 0x8) == 0x8; } - } - - public bool ControlListEnable - { - get { return (data & 0x10) == 0x10; } - } - public bool BulkListEnable - { - get { return (data & 0x20) == 0x20; } - } - - public USBStates HostControllerFunctionalState - { - get { return (USBStates)((data & 0xc0) >> 6); } - set { data = data & 0xffffff3f | ((UInt32)value << 6); } - } - - #endregion - - public override string ToString() - { - return data.ToString(); - } - } - - public enum USBStates : byte - { - Reset = 0, Resume = 1, Operational = 2, Suspend = 3 - } -} diff --git a/source/Archive/Cosmos.Hardware/VGAScreen.cs b/source/Archive/Cosmos.Hardware/VGAScreen.cs deleted file mode 100644 index 4c72efa92f..0000000000 --- a/source/Archive/Cosmos.Hardware/VGAScreen.cs +++ /dev/null @@ -1,1136 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Kernel; -using System.Drawing; - -/***************************************************************************** -Sets VGA-compatible video modes without using the BIOS - * http://bos.asmhackers.net/docs/vga_without_bios/ - * adapted from code by Chris Giese http://www.execpc.com/~geezer - * by Stephen Remde -//*/ - -namespace Cosmos.Hardware2 -{ - public class VGAScreen : Hardware - { - private const ushort VGA_AC_INDEX = 0x3C0; - private const ushort VGA_AC_WRITE = 0x3C0; - private const ushort VGA_AC_READ = 0x3C1; - private const ushort VGA_MISC_WRITE = 0x3C2; - private const ushort VGA_SEQ_INDEX = 0x3C4; - private const ushort VGA_SEQ_DATA = 0x3C5; - private const ushort VGA_DAC_READ_INDEX = 0x3C7; - private const ushort VGA_DAC_WRITE_INDEX = 0x3C8; - private const ushort VGA_DAC_DATA = 0x3C9; - private const ushort VGA_MISC_READ = 0x3CC; - private const ushort VGA_GC_INDEX = 0x3CE; - private const ushort VGA_GC_DATA = 0x3CF; - private const ushort VGA_CRTC_INDEX = 0x3D4; /* 0x3B4 */ - private const ushort VGA_CRTC_DATA = 0x3D5; /* 0x3B5 */ - private const ushort VGA_INSTAT_READ = 0x3DA; - - private const ushort VGA_NUM_SEQ_REGS = 5; - private const ushort VGA_NUM_CRTC_REGS = 25; - private const ushort VGA_NUM_GC_REGS = 9; - private const ushort VGA_NUM_AC_REGS = 21; - private const ushort VGA_NUM_REGS = (1 + VGA_NUM_SEQ_REGS + VGA_NUM_CRTC_REGS + - VGA_NUM_GC_REGS + VGA_NUM_AC_REGS); - - private static byte inportb(ushort port) - { - return CPUBus.Read8(port); - } - - - private unsafe static void WriteVGARegisters(byte[] registers) - { - fixed (byte* reg = registers) - { - byte* regs = reg; - byte i; - - /* write MISCELLANEOUS reg */ - CPUBus.Write8(VGA_MISC_WRITE, *regs); - regs++; - /* write SEQUENCER regs */ - for (i = 0; i < VGA_NUM_SEQ_REGS; i++) - { - CPUBus.Write8(VGA_SEQ_INDEX, i); - CPUBus.Write8(VGA_SEQ_DATA, *regs); - regs++; - } - /* unlock CRTC registers */ - CPUBus.Write8(VGA_CRTC_INDEX, 0x03); - CPUBus.Write8(VGA_CRTC_DATA, (byte)(inportb(VGA_CRTC_DATA) | 0x80)); - CPUBus.Write8(VGA_CRTC_INDEX, 0x11); - CPUBus.Write8(VGA_CRTC_DATA, (byte)(inportb(VGA_CRTC_DATA) & 0x7f)); - /* make sure they remain unlocked */ - regs[0x03] |= 0x80; - regs[0x11] &= 0x7f; - /* write CRTC regs */ - for (i = 0; i < VGA_NUM_CRTC_REGS; i++) - { - CPUBus.Write8(VGA_CRTC_INDEX, i); - CPUBus.Write8(VGA_CRTC_DATA, *regs); - regs++; - } - /* write GRAPHICS CONTROLLER regs */ - for (i = 0; i < VGA_NUM_GC_REGS; i++) - { - CPUBus.Write8(VGA_GC_INDEX, i); - CPUBus.Write8(VGA_GC_DATA, *regs); - regs++; - } - /* write ATTRIBUTE CONTROLLER regs */ - for (i = 0; i < VGA_NUM_AC_REGS; i++) - { - inportb(VGA_INSTAT_READ); - CPUBus.Write8(VGA_AC_INDEX, i); - CPUBus.Write8(VGA_AC_WRITE, *regs); - regs++; - } - /* lock 16-color palette and unblank display */ - inportb(VGA_INSTAT_READ); - CPUBus.Write8(VGA_AC_INDEX, 0x20); - } - } - private static void set_plane(byte p) - { - byte pmask; - - p &= 3; - pmask = (byte)(1 << p); - /* set read plane */ - CPUBus.Write8(VGA_GC_INDEX, 4); - CPUBus.Write8(VGA_GC_DATA, p); - /* set write plane */ - CPUBus.Write8(VGA_SEQ_INDEX, 2); - CPUBus.Write8(VGA_SEQ_DATA, pmask); - } - - //int offset = 0xb8000; - static int get_fb_seg() - { - int seg; - - CPUBus.Write8(VGA_GC_INDEX, 6); - seg = inportb(VGA_GC_DATA); - seg >>= 2; - seg &= 3; - switch (seg) - { - case 0: - case 1: - seg = 0xA0000; - break; - case 2: - seg = 0xB0000; - break; - case 3: - seg = 0xB8000; - break; - } - return seg; - } - - private static unsafe void WriteFont(byte[] font, byte font_height) - { - byte seq2, seq4, gc4, gc5, gc6; - - /* save registers - set_plane() modifies GC 4 and SEQ 2, so save them as well */ - CPUBus.Write8(VGA_SEQ_INDEX, 2); - seq2 = inportb(VGA_SEQ_DATA); - - CPUBus.Write8(VGA_SEQ_INDEX, 4); - seq4 = inportb(VGA_SEQ_DATA); - /* turn off even-odd addressing (set flat addressing) - assume: chain-4 addressing already off */ - CPUBus.Write8(VGA_SEQ_DATA, (byte)(seq4 | 0x04)); - - CPUBus.Write8(VGA_GC_INDEX, 4); - gc4 = inportb(VGA_GC_DATA); - - CPUBus.Write8(VGA_GC_INDEX, 5); - gc5 = inportb(VGA_GC_DATA); - /* turn off even-odd addressing */ - CPUBus.Write8(VGA_GC_DATA, (byte)(gc5 & ~0x10)); - - CPUBus.Write8(VGA_GC_INDEX, 6); - gc6 = inportb(VGA_GC_DATA); - /* turn off even-odd addressing */ - CPUBus.Write8(VGA_GC_DATA, (byte)(gc6 & ~0x02)); - /* write font to plane P4 */ - set_plane(2); - /* write font 0 */ - int seg = get_fb_seg(); - for (int i = 0; i < 256; i++) - for (int j = 0; j < font_height; j++) - *((byte*)(seg + i * 32 + j)) = font[i * font_height + j]; - - - /* restore registers */ - CPUBus.Write8(VGA_SEQ_INDEX, 2); - CPUBus.Write8(VGA_SEQ_DATA, seq2); - CPUBus.Write8(VGA_SEQ_INDEX, 4); - CPUBus.Write8(VGA_SEQ_DATA, seq4); - CPUBus.Write8(VGA_GC_INDEX, 4); - CPUBus.Write8(VGA_GC_DATA, gc4); - CPUBus.Write8(VGA_GC_INDEX, 5); - CPUBus.Write8(VGA_GC_DATA, gc5); - CPUBus.Write8(VGA_GC_INDEX, 6); - CPUBus.Write8(VGA_GC_DATA, gc6); - } - - public static SetPixelDelegate SetPixel = new SetPixelDelegate(SetPixelNoMode); - - public delegate void SetPixelDelegate(uint x, uint y, uint c); - - public enum TextSize { Size40x25, Size40x50, Size80x25, Size80x50, Size90x30, Size90x60 }; - - public static void SetTextMode(TextSize aSize) { - switch (aSize) { - case TextSize.Size40x25: - WriteVGARegisters(g_40x25_text); - WriteFont(g_8x16_font, 16); - break; - case TextSize.Size40x50: - WriteVGARegisters(g_40x50_text); - WriteFont(g_8x8_font, 8); - break; - case TextSize.Size80x25: - WriteVGARegisters(g_80x25_text); - WriteFont(g_8x16_font, 16); - break; - case TextSize.Size80x50: - WriteVGARegisters(g_80x50_text); - WriteFont(g_8x8_font, 8); - break; - case TextSize.Size90x30: - WriteVGARegisters(g_90x30_text); - WriteFont(g_8x16_font, 16); - break; - case TextSize.Size90x60: - WriteVGARegisters(g_90x60_text); - WriteFont(g_8x8_font, 8); - break; - default: - throw new Exception("Invalid text size."); - } - } - - //TODO: Change this to be like SetTextmode, but take two enums. One for size, one for bit depth - public static void SetMode640x480x2() - { - WriteVGARegisters(g_640x480x2); - } - public static void SetMode320x240x4() - { - WriteVGARegisters(g_320x200x4); - } - public static void SetMode720x480x16() - { - WriteVGARegisters(g_720x480x16); - } - public static void SetMode320x200x8() - { - WriteVGARegisters(g_320x200x256); - - PixelWidth = 320; - PixelHeight = 200; - Colors = 256; - SetPixel = new SetPixelDelegate(SetPixel320x200x8); - } - public static void SetMode640x480x4() - { - WriteVGARegisters(g_640x480x16); - - PixelWidth = 640; - PixelHeight = 480; - Colors = 16; - SetPixel = new SetPixelDelegate(SetPixel640x480x4); - } - - private static unsafe void SetPixelNoMode(uint x, uint y, uint c) - { - throw new Exception("No video mode set!"); - } - public static unsafe void SetPixel640x480x4(uint x, uint y, uint c) - { - byte* address = (byte*)(0xa0000 + y * 320 + x >> 1); - - c = c & 0xf; - if ((x & 1) == 0) - { - *address = (byte)(((byte)((*address) & 0xf)) | (byte)(c << 4)); - } - else - { - *address = (byte)(((byte)((*address) & 0xf0)) | (byte)c); - } - } - public static unsafe void SetPixel320x200x8(uint x, uint y, uint c) - { - *(byte*)(0xa0000 + y * 320 + x) = (byte)(c & 0xff); - } - public static unsafe uint GetPixel320x200x8(uint x, uint y) - { - return *(byte*)(0xa0000 + y * 320 + x); - } - - private MemoryAddressSpace mr = new MemoryAddressSpace(0xa0000, 0x10000); - - - public static int PixelWidth - { - private set; - get; - } - public static int PixelHeight - { - private set; - get; - } - public static int Colors - { - private set; - get; - } - - public static unsafe void Test() - { - SetMode320x200x8(); - - if (Colors == 256) - { - for (byte i = 0; i < 64; i++) - { - SetPaletteEntry(i, i, 0, 0); - SetPaletteEntry(i + 64, 63, i, 0); - SetPaletteEntry(i + 128, 63, 63, i); - SetPaletteEntry(i + 192, (byte)(63 - i), (byte)(63 - i), (byte)(63 - i)); - - } - } - else - { - for (byte i = 0; i < Colors; i++) - { - byte ii = (byte)((int)i * 64 / Colors); - SetPaletteEntry(i, ii, ii, ii); - } - } - - int[] xs = { 0 }; - int[] ys = { 0 }; - - for (uint y = 0; y < PixelHeight; y++) - { - for (uint x = 0; x < PixelWidth; x++) - { - byte m = (byte)(x + y); - - //SetPixel(x, y, m); - - *(byte*)(0xa0000 + y * 320 + x) = m; - } - } - } - - public static unsafe void Clear(int colour) - { - for (uint y = 0; y < PixelHeight; y++) - { - for (uint x = 0; x < PixelWidth; x++) - { - *(byte*)(0xa0000 + (y * 320) + x) = (byte)(colour & 0xFF) ; - } - } - } - - private static Color[] _Palette = new Color[256]; - public static Color GetPaletteEntry(int index) - { - return _Palette[index]; - } - public static void SetPaletteEntry(int index, Color color) - { - //_Palette[index] = color; - CPUBus.Write8(0x3C8, (byte)index); - CPUBus.Write8(0x3C9, color.R); - CPUBus.Write8(0x3C9, color.G); - CPUBus.Write8(0x3C9, color.B); - } - - public static void SetPalette(int index, byte[] pallete) - { - CPUBus.Write8(0x3C8, (byte)index); - for (int i=0;i> 2)); - } - - public static void SetPaletteEntry(int index, byte r, byte g, byte b) - { - //_Palette[index] = Color.FromArgb(index, r, g, b); - CPUBus.Write8(0x3C8, (byte)index); - CPUBus.Write8(0x3C9, r); - CPUBus.Write8(0x3C9, g); - CPUBus.Write8(0x3C9, b); - } - - - #region FONTS - private static byte[] g_8x8_font = new byte[] -{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E, - 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E, - 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, - 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, - 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C, - 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C, - 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, - 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, - 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, - 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, - 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78, - 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, - 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0, - 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0, - 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99, - 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00, - 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00, - 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00, - 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00, - 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00, - 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF, - 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, - 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, - 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, - 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, - 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00, - 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, - 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, - 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00, - 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, - 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, - 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00, - 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00, - 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, - 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, - 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00, - 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, - 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00, - 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, - 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00, - 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, - 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, - 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, - 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, - 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, - 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, - 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, - 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00, - 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, - 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, - 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00, - 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00, - 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00, - 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, - 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00, - 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00, - 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00, - 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, - 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, - 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00, - 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, - 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, - 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, - 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, - 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, - 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00, - 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00, - 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00, - 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00, - 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, - 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, - 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00, - 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00, - 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00, - 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00, - 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, - 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, - 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, - 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, - 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00, - 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, - 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00, - 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00, - 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, - 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00, - 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, - 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00, - 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00, - 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, - 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0, - 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E, - 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00, - 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00, - 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, - 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, - 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00, - 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00, - 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, - 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00, - 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00, - 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C, - 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00, - 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00, - 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, - 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, - 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38, - 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, - 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, - 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00, - 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00, - 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00, - 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00, - 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, - 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00, - 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00, - 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8, - 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00, - 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18, - 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00, - 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30, - 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3, - 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70, - 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00, - 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00, - 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00, - 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00, - 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, - 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00, - 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00, - 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F, - 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03, - 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00, - 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, - 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, - 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, - 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, - 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, - 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, - 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, - 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, - 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, - 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, - 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, - 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, - 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, - 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, - 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, - 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00, - 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0, - 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, - 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, - 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00, - 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00, - 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0, - 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00, - 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC, - 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00, - 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00, - 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00, - 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0, - 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00, - 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, - 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, - 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00, - 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00, - 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00, - 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70, - 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00, - 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00, - 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, - 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C, - 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, - 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - - private static byte[] g_8x16_font = new byte[] -{ - -// juptitor -//0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x99, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0x00, 0x60, 0x60, 0x00, 0x6c, 0x6c, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x33, 0x33, 0x7f, 0x7f, 0x7f, 0x33, 0x33, 0x33, 0x33, 0x7f, 0x7f, 0x33, 0x33, 0x22, 0x18, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x3e, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x64, 0x66, 0x06, 0x06, 0x04, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x66, 0x26, 0x18, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x7e, 0x60, 0x64, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x60, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x08, 0x00, 0x40, 0x60, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x60, 0x40, 0x00, 0x04, 0x6d, 0x7f, 0x3f, 0x1e, 0x1e, 0x3f, 0x7f, 0x6d, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x04, 0x06, 0x06, 0x06, 0x04, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x20, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x26, 0x26, 0x06, 0x3e, 0x7c, 0x60, 0x60, 0x60, 0x60, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x26, 0x26, 0x06, 0x3e, 0x7e, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, 0x3c, 0x7e, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x3e, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x1c, 0x38, 0x70, 0x70, 0x38, 0x1c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x70, 0x38, 0x1c, 0x1c, 0x38, 0x70, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x26, 0x26, 0x06, 0x0e, 0x1c, 0x18, 0x18, 0x10, 0x00, 0x18, 0x18, 0x00, 0x3f, 0x7f, 0x60, 0x63, 0x63, 0x67, 0x60, 0x63, 0x67, 0x66, 0x67, 0x63, 0x60, 0x7f, 0x3f, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x7c, 0x7c, 0x6e, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x60, 0x60, 0x60, 0x64, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x78, 0x7c, 0x6e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x7c, 0x78, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x7e, 0x60, 0x64, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x7e, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x7c, 0x7c, 0x6e, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7e, 0x3c, 0x00, 0x3f, 0x7f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x7c, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x7c, 0x7c, 0x6e, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7c, 0x3e, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x18, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7f, 0x3f, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x06, 0x26, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x06, 0x06, 0x04, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0x7e, 0x3c, 0x00, 0x38, 0x7c, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x38, 0x00, 0x20, 0x60, 0x60, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x06, 0x06, 0x04, 0x00, 0x38, 0x7c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x7c, 0x38, 0x00, 0x18, 0x3c, 0x7e, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x06, 0x3e, 0x7e, 0x66, 0x7e, 0x3c, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x60, 0x60, 0x66, 0x7e, 0x3c, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3e, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x7e, 0x7c, 0x60, 0x7e, 0x3c, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x64, 0x64, 0x60, 0x7e, 0x7c, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x20, 0x60, 0x60, 0x64, 0x64, 0x66, 0x6e, 0x7c, 0x7c, 0x6e, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7f, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x60, 0x7c, 0x3e, 0x06, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x18, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0x7e, 0x3c, 0x3c, 0x7e, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x0e, 0x1c, 0x38, 0x70, 0x7e, 0x3c, 0x00, 0x04, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x38, 0x70, 0x70, 0x38, 0x18, 0x18, 0x18, 0x0c, 0x04, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x40, 0x60, 0x30, 0x30, 0x30, 0x30, 0x38, 0x1c, 0x1c, 0x38, 0x30, 0x30, 0x30, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x66, 0x67, 0x23, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x93, 0x06, 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x9a, 0x3f, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xcf, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -// lucida console - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd, 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x99, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e, 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30, 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6c, 0xfe, 0x6c, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x12, 0x7f, 0x12, 0x14, 0x24, 0xff, 0x24, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3e, 0x68, 0x48, 0x48, 0x38, 0x1c, 0x0e, 0x0a, 0x0a, 0x4a, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x60, 0x91, 0x92, 0x94, 0x64, 0x08, 0x13, 0x14, 0x24, 0x44, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x2c, 0x18, 0x70, 0x88, 0x8c, 0x87, 0x43, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x06, 0x03, 0x00, 0x00, 0x30, 0x18, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x04, 0x18, 0x30, 0x00, 0x00, 0x00, 0x08, 0x49, 0x77, 0x18, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x7f, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x06, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x30, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x02, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x02, 0x02, 0x06, 0x1c, 0x02, 0x02, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0c, 0x14, 0x24, 0x24, 0x44, 0x84, 0xfe, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x20, 0x20, 0x20, 0x38, 0x04, 0x02, 0x02, 0x02, 0x04, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x20, 0x40, 0x5c, 0x62, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x24, 0x38, 0x46, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x23, 0x1d, 0x01, 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x08, 0x30, 0x30, 0x08, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x30, 0x08, 0x06, 0x06, 0x08, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0x47, 0x89, 0x91, 0x91, 0x93, 0x93, 0xcd, 0x64, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1c, 0x14, 0x14, 0x22, 0x22, 0x7f, 0x41, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x60, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x40, 0x40, 0x40, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x40, 0x40, 0x40, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x40, 0x80, 0x80, 0x87, 0x81, 0x41, 0x61, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x42, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xaa, 0xaa, 0xaa, 0xb2, 0x92, 0x82, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x61, 0x51, 0x51, 0x49, 0x49, 0x45, 0x45, 0x43, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x46, 0x78, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3c, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x44, 0x78, 0x48, 0x44, 0x42, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x40, 0x60, 0x38, 0x04, 0x02, 0x02, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x81, 0x41, 0x41, 0x22, 0x22, 0x14, 0x14, 0x1c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x89, 0x49, 0x55, 0x55, 0x55, 0x55, 0x26, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x22, 0x22, 0x14, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1f, 0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x7c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x7c, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x14, 0x14, 0x22, 0x22, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x02, 0x1e, 0x22, 0x42, 0x46, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x5e, 0x62, 0x41, 0x41, 0x41, 0x41, 0x62, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x41, 0x23, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x42, 0x7e, 0x40, 0x40, 0x20, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x10, 0x7f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x41, 0x23, 0x3d, 0x01, 0x02, 0x3c, 0x00, 0x40, 0x40, 0x40, 0x40, 0x5c, 0x62, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x3c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x78, 0x00, 0x40, 0x40, 0x40, 0x40, 0x42, 0x44, 0x48, 0x70, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x6d, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x62, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x62, 0x41, 0x41, 0x41, 0x41, 0x62, 0x5c, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x41, 0x23, 0x3d, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x40, 0x30, 0x0c, 0x02, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x41, 0x22, 0x22, 0x14, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x88, 0x55, 0x55, 0x55, 0x55, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x41, 0x22, 0x22, 0x14, 0x14, 0x08, 0x08, 0x10, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x30, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x70, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x88, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x76, 0x36, 0x7e, 0xd8, 0xd8, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c, 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3c, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0xcc, 0xcc, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x93, 0x06, 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xce, 0x9a, 0x3f, 0x06, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xcf, 0xdb, 0xf3, 0x7e, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60, 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x98, 0x30, 0x60, 0xc8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - -/* old - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD, 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xC3, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0x99, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63, 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7, 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0xFE, 0x3E, 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06, 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18, 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xD6, 0xD6, 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x0E, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x6C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, - 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66, 0x66, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, - 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00, - 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x0C, 0x06, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x60, 0x66, 0x3C, 0x0C, 0x06, 0x3C, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x30, 0x60, 0x00, 0xFE, 0x66, 0x60, 0x7C, 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x76, 0x36, 0x7E, 0xD8, 0xD8, 0x6E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC, 0xFE, 0xCC, 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x30, 0x18, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00, - 0x00, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x18, 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60, 0x60, 0x60, 0xE6, 0xFC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC4, 0xCC, 0xDE, 0xCC, 0xCC, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0E, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00, - 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, - 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xC0, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x60, 0xCE, 0x93, 0x06, 0x0C, 0x1F, 0x00, 0x00, - 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xCE, 0x9A, 0x3F, 0x06, 0x0F, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, - 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, - 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, - 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xC6, 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xCF, 0xDB, 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x98, 0x30, 0x60, 0xC8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -*/ -}; - - #endregion - - #region MODES - private static byte[] g_640x480x16 = new byte[] -{ -/* MISC */ - 0xE3, -/* SEQ */ - 0x03, 0x01, 0x08, 0x00, 0x06, -/* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x0F, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x01, 0x00, 0x0F, 0x00, 0x00 -}; - private static byte[] g_320x200x256 = new byte[] -{ -/* MISC */ - 0x63, -/* SEQ */ - 0x03, 0x01, 0x0F, 0x00, 0x0E, -/* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, - 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9C, 0x0E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x41, 0x00, 0x0F, 0x00, 0x00 -}; - - private static byte[] g_80x50_text = new byte[] -{ -/* MISC */ - 0x67, -/* SEQ */ - 0x03, 0x00, 0x03, 0x00, 0x02, -/* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, - 0x00, 0x47, 0x06, 0x07, 0x00, 0x00, 0x01, 0x40, - 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00, -}; - - private static byte[] g_720x480x16 = new byte[] -{ -/* MISC */ - 0xE7, -/* SEQ */ - 0x03, 0x01, 0x08, 0x00, 0x06, -/* CRTC */ - 0x6B, 0x59, 0x5A, 0x82, 0x60, 0x8D, 0x0B, 0x3E, - 0x00, 0x40, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x2D, 0x08, 0xE8, 0x05, 0xE3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0x0F, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, - 0x01, 0x00, 0x0F, 0x00, 0x00, -}; - - private static byte[] g_90x30_text = new byte[] -{ -/* MISC */ - 0xE7, -/* SEQ */ - 0x03, 0x01, 0x03, 0x00, 0x02, -/* CRTC */ - 0x6B, 0x59, 0x5A, 0x82, 0x60, 0x8D, 0x0B, 0x3E, - 0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x2D, 0x10, 0xE8, 0x05, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00, -}; - private static byte[] g_90x60_text = new byte[] -{ -/* MISC */ - 0xE7, -/* SEQ */ - 0x03, 0x01, 0x03, 0x00, 0x02, -/* CRTC */ - 0x6B, 0x59, 0x5A, 0x82, 0x60, 0x8D, 0x0B, 0x3E, - 0x00, 0x47, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x2D, 0x08, 0xE8, 0x05, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00, -}; - private static byte[] g_40x25_text = new byte[] -{ -/* MISC */ - 0x67, -/* SEQ */ - 0x03, 0x08, 0x03, 0x00, 0x02, -/* CRTC */ - 0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, - 0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0xA0, - 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00, -}; - private static byte[] g_40x50_text = new byte[] -{ -/* MISC */ - 0x67, -/* SEQ */ - 0x03, 0x08, 0x03, 0x00, 0x02, -/* CRTC */ - 0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, - 0x00, 0x47, 0x06, 0x07, 0x00, 0x00, 0x04, 0x60, - 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00, -}; - private static byte[] g_80x25_text = new byte[] -{ -/* MISC */ - 0x67, -/* SEQ */ - 0x03, 0x00, 0x03, 0x00, 0x02, -/* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, - 0x00, 0x4F, 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x50, - 0x9C, 0x0E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x0C, 0x00, 0x0F, 0x08, 0x00 -}; - private static byte[] g_320x200x4 = new byte[] { -/* MISC */ - 0x63, -/* SEQ */ - 0x03, 0x09, 0x03, 0x00, 0x02, -/* CRTC */ - 0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, - 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x9C, 0x0E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x02, 0x00, - 0xFF, -/* AC */ - 0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x01, 0x00, 0x03, 0x00, 0x00 -}; - private static byte[] g_640x480x2 = new byte[] -{ -/* MISC */ - 0xE3, -/* SEQ */ - 0x03, 0x01, 0x0F, 0x00, 0x06, -/* CRTC */ - 0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, - 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xEA, 0x0C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3, - 0xFF, -/* GC */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, - 0xFF, -/* AC */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, - 0x01, 0x00, 0x0F, 0x00, 0x00 -}; - #endregion - - public static unsafe MemoryAddressSpace GetAddressSpace() - { - return new MemoryAddressSpace(0xa0000, (uint)(PixelHeight * PixelWidth)); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/Cosmos.Sys.FileSystem.csproj b/source/Archive/Cosmos.Kernel.FileSystems/Cosmos.Sys.FileSystem.csproj deleted file mode 100644 index 2b9fb6c01a..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/Cosmos.Sys.FileSystem.csproj +++ /dev/null @@ -1,69 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {5C293BB9-FB42-495E-AAD9-D15888631CA4} - Library - Properties - Cosmos.Sys.FileSystem - Cosmos.Sys.FileSystem - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.Kernel.FileSystems/DebugUtil.cs b/source/Archive/Cosmos.Kernel.FileSystems/DebugUtil.cs deleted file mode 100644 index 23a9a7246f..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/DebugUtil.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.FileSystem -{ - public static class DebugUtil - { - internal static void Send_Ext2SuperBlock(Ext2.Ext2.SuperBlock aSuperBlock) - { - //Hardware2.DebugUtil.StartLogging(); - //Hardware2.DebugUtil.WriteSerialString("\r\n"); - //Hardware2.DebugUtil.EndLogging(); - } - - internal static void Send_Ext2GroupDescriptors(Ext2.Ext2.GroupDescriptor[] aDescriptors) { - //Hardware2.DebugUtil.StartLogging(); - //for(uint i = 0; i < aDescriptors.Length;i++) { - // Hardware2.DebugUtil.WriteSerialString("\r\n"); - //} - //Hardware2.DebugUtil.EndLogging(); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.Structs.cs b/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.Structs.cs deleted file mode 100644 index 95a954494a..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.Structs.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; - -namespace Cosmos.Sys.FileSystem.Ext2 -{ - partial class Ext2 - { - [StructLayout(LayoutKind.Explicit, Size = 84)] - internal struct SuperBlock - { - /// - /// Indicates the total number of INodes, both used and free, in the filesystem. - /// - [FieldOffset(0)] - public uint INodesCount; - - /// - /// Indicates the total number of blocks, both used and free, in the filesystem. - /// - [FieldOffset(4)] - public uint BlockCount; - - /// - /// Indicates the total number of blocks reserved for the usage of the super user. this is most useful - /// if for some reason a user, malicious or not, fills the file system to capacity; the super user will - /// have this specified amount of free blocks at his disposal so he can edit and save configuration files. - /// - [FieldOffset(8)] - public uint RBlocksCount; - - /// - /// Indicates the total number of free blocks, including the number of reserved blocks (). - /// This is a sum of all free blocks of all the block groups. - /// - [FieldOffset(12)] - public uint FreeBlocksCount; - - /// - /// Indicates the total number of free INodes. This is a sum of all free nodes of all the block groups. - /// - [FieldOffset(16)] - public uint FreeINodesCount; - - /// - /// Identifies the first data block, in other words the id of the block containing the superblock - /// structure. - /// Note that this value is always 0 for filesystems with a block size larger than 1KB, - /// and always 1 for filesystem with a blocksize of 1KB. The superblock is always starting at the - /// 1024th byte of the disk, which normally happens to be the first byte of the 3rd sector. - /// - [FieldOffset(20)] - public uint FirstDataBlock; - - /// - /// The block size is computed using this value as the number of bits to shift left the value 1024. - /// This value may only be positive. - /// - /// int xBlockSize = 1024 << LogBlockSize; - /// - /// - [FieldOffset(24)] - public int LogBlockSize; - - [FieldOffset(28)] - public uint LogFragSize; - - [FieldOffset(32)] - public uint BlocksPerGroup; - - [FieldOffset(36)] - public uint FragsPerGroup; - - [FieldOffset(40)] - public uint INodesPerGroup; - - [FieldOffset(44)] - public uint MTime; - - [FieldOffset(48)] - public uint WTime; - - [FieldOffset(52)] - public ushort MntCount; - - [FieldOffset(54)] - public ushort MaxMntCount; - - [FieldOffset(56)] - public ushort Magic; - - [FieldOffset(58)] - public ushort State; - - [FieldOffset(60)] - public ushort Errors; - - [FieldOffset(62)] - public ushort MinorRevLevel; - - [FieldOffset(64)] - public uint LastCheck; - - [FieldOffset(68)] - public uint CheckInterval; - - [FieldOffset(72)] - public uint CreatorOS; - - [FieldOffset(76)] - public uint RevLevel; - - [FieldOffset(80)] - public ushort RefResUID; - - // up to byte 84 (includes 83..) - [FieldOffset(82)] - public ushort DefResGID; - - public void DoSomething() - { - } - } - - /// - /// For each group in the filesystem, a is created. - /// Each represents a single "block group" within the filesystem and the information - /// within any on of them is pertinent only to the group it is describing. - /// - [StructLayout(LayoutKind.Explicit, Size = 32)] - internal struct GroupDescriptor - { - /// - /// Block id of the first block of the "block bitmap" for the group represented. - /// - [FieldOffset(0)] - public uint BlockBitmap; - - /// - /// Block id of the first block of the "INode bitmap" for the group represented. - /// - [FieldOffset(4)] - public uint INodeBitmap; - - /// - /// Block id of the first block of the "INode table" for the group represented. - /// - [FieldOffset(8)] - public uint INodeTable; - - [FieldOffset(12)] - public ushort FreeBlocksCount; - - [FieldOffset(14)] - public ushort FreeINodesCount; - - [FieldOffset(16)] - public ushort UsedDirsCount; - - [FieldOffset(18)] - public ushort Pad; - - [FieldOffset(20)] - public uint Padding1; - - [FieldOffset(24)] - public uint Padding2; - - [FieldOffset(28)] - public uint Padding3; - } - - [StructLayout(LayoutKind.Explicit, Size = 128)] - internal struct INode - { - [FieldOffset(0)] - public INodeModeEnum Mode; - - [FieldOffset(2)] - public ushort UID; - - [FieldOffset(4)] - public uint Size; - - [FieldOffset(8)] - public uint ATime; - - [FieldOffset(12)] - public uint CTime; - - [FieldOffset(16)] - public uint MTime; - - [FieldOffset(20)] - public uint DTime; - - [FieldOffset(24)] - public ushort GID; - - [FieldOffset(26)] - public ushort LinksCount; - - [FieldOffset(28)] - public uint Blocks; - - [FieldOffset(32)] - public uint Flags; - - [FieldOffset(36)] - public uint OSD1; - - [FieldOffset(INodeConsts.BlockOffset)] - public uint Block; - - [FieldOffset(100)] - public uint Generation; - - [FieldOffset(104)] - public uint FileACL; - - [FieldOffset(108)] - public uint DirACL; - - [FieldOffset(112)] - public uint FAddr; - - [FieldOffset(116)] - public uint OSD2_1; - - [FieldOffset(120)] - public uint OSD2_2; - - [FieldOffset(124)] - public uint OSD2_3; - } - - [Flags] - public enum INodeModeEnum : ushort - { - FormatMask = 0xF000, - Socket = 0xC000, - SymbolicLink = 0xA000, - RegularFile = 0x8000, - BlockDevice = 0x6000, - Directory = 0x4000, - CharacterDevice = 0x2000, - Fifo = 0x1000, - SUID = 0x0800, - SGID = 0x0400, - StickyBit = 0x0200, - UserAccessRightsMask = 0x01C0, - UserAccessRightsRead = 0x0100, - UserAccessRightsWrite = 0x0080, - UserAccessRightsExecute = 0x0040, - GroupAccessRightsMask = 0x0038, - GroupAccessRightsRead = 0x0020, - GroupAccessRightsWrite = 0x0010, - GroupAccessRightsExecute = 0x0008, - OthersAccessRightsMask = 0x0007, - OthersAccessRightsRead = 0x0004, - OthersAccessRightsWrite = 0x0002, - OthersAccessRightsExecute = 0x0001 - } - - [StructLayout(LayoutKind.Explicit)] - internal struct DirectoryEntry - { - /// - /// INode number of the entry. A value of 0 indicates that the entry is not used. - /// - [FieldOffset(0)] - public uint INode; - - [FieldOffset(4)] - public ushort RecordLength; - - [FieldOffset(6)] - public byte NameLength; - - [FieldOffset(7)] - public byte FileType; - - [FieldOffset(8)] - public byte FirstNameChar; - } - } - - public static class INodeConsts - { - public const int BlockOffset = 40; - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.cs b/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.cs deleted file mode 100644 index 82f430aa47..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/Ext2/Ext2.cs +++ /dev/null @@ -1,328 +0,0 @@ -//#define EXT2Debug -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware2; -using HW=Cosmos.Hardware2; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.FileSystem.Ext2 { - public unsafe partial class Ext2 : Filesystem { - private readonly BlockDevice mBackend; - private SuperBlock mSuperblock; - private GroupDescriptor[] mGroupDescriptors; - private byte[] mBuffer; - private byte* mBufferAddress; - - public Ext2(BlockDevice aBackend) { - mBackend = aBackend; - Initialize(); - } - - private void Initialize() { - Console.WriteLine("Start Ext2.Initialize"); - mBuffer = new byte[mBackend.BlockSize]; - fixed (byte* xBufferAddress = &mBuffer[0]) { - mBufferAddress = xBufferAddress; - } - // first get the superblock; - var mBufferAsSuperblock = (SuperBlock*)mBufferAddress; - int xAddr = (int)mBufferAddress; - Console.WriteLine("Buffer address: " + xAddr); - Console.WriteLine("Start reading superblock"); - mBackend.ReadBlock(2, - mBuffer); - Console.WriteLine("End reading"); - mSuperblock = *mBufferAsSuperblock; - DebugUtil.Send_Ext2SuperBlock(mSuperblock); - // read the group descriptors - Console.WriteLine("INodeCount: " + mSuperblock.INodesCount); - Console.WriteLine("INode#1: " + mBufferAddress[0]); - Console.WriteLine("INode#2: " + mBufferAddress[1]); - Console.WriteLine("INode#3: " + mBufferAddress[2]); - Console.WriteLine("INode#4: " + mBufferAddress[3]); - - Console.WriteLine("BlockCount: " + mSuperblock.BlockCount); - Console.WriteLine("INodesPerGroup: " + (int)mSuperblock.INodesPerGroup); - if (mSuperblock.INodesPerGroup == 0x4000) - { - Console.WriteLine("INodesPerGroup has correct value!"); - } - uint xGroupDescriptorCount = mSuperblock.INodesCount / mSuperblock.INodesPerGroup; - mGroupDescriptors = new GroupDescriptor[xGroupDescriptorCount]; - var xDescriptorPtr = (GroupDescriptor*)mBufferAddress; - Console.WriteLine("Process GroupDescriptors: " + xGroupDescriptorCount); - //Console.ReadLine(); - for (int i = 0; i < xGroupDescriptorCount; i++) { - Console.WriteLine("Processing GroupDescriptor " + i); - uint xATABlock ; - - if ( BlockSize == 1024 ) - { - xATABlock = ( BlockSize * 2 ) / mBackend.BlockSize ; - } - else - { - xATABlock = ( BlockSize ) / mBackend.BlockSize ; - } - - xATABlock += (uint)(i / 16); - if ((i % 16) == 0) { - Console.WriteLine("Read new GroupDescriptorBlock"); - mBackend.ReadBlock(xATABlock, - mBuffer); - Console.WriteLine("End Read"); - } - mGroupDescriptors[i] = xDescriptorPtr[i % 16]; - Console.WriteLine("End of GroupDescriptor check"); - } - Console.WriteLine("Send GroupDescriptors to log"); - DebugUtil.Send_Ext2GroupDescriptors(mGroupDescriptors); - } - - public override uint BlockSize { - get { - return ((uint)1024) << mSuperblock.LogBlockSize; - } - } - - public override ulong RootId { - get { - return 2; - } - } - - private bool GetBitState(uint aBitmapStart, - int aIndex) { - var xPhyBlock = aBitmapStart * 8; - xPhyBlock += (uint)aIndex % 4096; - mBackend.ReadBlock(xPhyBlock, - mBuffer); - aIndex /= 4096; - int xBufferIndex = aIndex / 8; - aIndex /= 8; - return (mBufferAddress[xBufferIndex] & (1 << aIndex)) != 0; - } - - private static uint ToUInt32(byte[] buffer, int index) - { - return (uint)((((buffer[index + 3] << 0x18) | (buffer[index + 2] << 0x10)) | (buffer[index + 1] << 8)) | buffer[index]); - } - - private static ushort ToUInt16(byte[] buffer, int index) - { - return (ushort)((buffer[index + 1] << 8) | buffer[index]); - } - - public override FilesystemEntry[] GetDirectoryListing(ulong aId) { - var xBaseINodeNumber = (uint)aId; - INode xINode; - GetINode(xBaseINodeNumber, - out xINode); - byte[] xFSBuffer = new byte[BlockSize]; - var xResult = new List(10); - var xDirEntriesPerFSBlock = BlockSize / sizeof(DirectoryEntry); - uint xBlockId = 0; - while (ReadINodeBlock(ref xINode, - xBlockId, - xFSBuffer)) { - //HW.DebugUtil.WriteBinary("Ext2", - // "Directory Entry binary", - // xFSBuffer, - // 0, - // (int)BlockSize); - //HW.DebugUtil.SendNumber("Ext2", - // "First byte of datablock", - // xFSBuffer[0], - // 8); - int xIndex = 0; - var xIteration = 0; - while (xIndex < BlockSize) { - var xINodeNumber = ToUInt32(xFSBuffer, xIndex); - var xRecLength = ToUInt16(xFSBuffer, xIndex + 4); - - // only include used items - if (xINodeNumber > 0) { - // only include non ".." or "." items - if (xINodeNumber != xBaseINodeNumber) { - var xNameLength = xFSBuffer[xIndex + 6]; - var xFileType = xFSBuffer[xIndex + 7]; - if (!(xNameLength == 2 && xFSBuffer[xIndex + 8] == (byte)'.' && xFSBuffer[xIndex + 9] == (byte)'.')) { - var xFSEntry = new FilesystemEntry - { - Id = xINodeNumber, - IsDirectory = (xFileType == 2), - IsReadonly = true, - Filesystem = this - }; - //xFSEntry.Size = GetINode(xINodeNumber).Size; - char[] xName = new char[xNameLength]; - for (int c = 0; c < xName.Length; c++) - { - xName[c] = (char)xFSBuffer[xIndex + 8 + c]; - } - xFSEntry.Name = new string(xName); - if (!xFSEntry.Name.Equals("lost+found")) - { - xResult.Add(xFSEntry); - } - } - } - } - xIndex += xRecLength; - xIteration++; - if (xIteration == 5) - { - break; - } - //break; - } - xBlockId++; - } - for (int i = 0; i < xResult.Count; i++) { - INode xTheINode; - GetINode((uint)xResult[i].Id, - out xTheINode); - xResult[i].Size = xTheINode.Size; - } - return xResult.ToArray(); - } - - private void GetINode(uint aINodeNumber, - out INode oINode) { - var xId = aINodeNumber - 1; - var xGroup = (uint)(xId / mSuperblock.INodesPerGroup); - var xGroupIndex = (uint)(xId % mSuperblock.INodesPerGroup); - //HW.DebugUtil.SendMessage("Ext2", - // "Reading INode"); - //HW.DebugUtil.SendNumber("Ext2", - // "INode Id", - // (uint)xId, - // 32); - //HW.DebugUtil.SendNumber("Ext2", - // "Group", - // xGroup, - // 32); - //HW.DebugUtil.SendNumber("Ext2", - // "GroupIndex", - // xGroupIndex, - // 32); - // read the inode: - var xTableBlockOffset = (uint)(xGroupIndex % (ulong)(BlockSize / sizeof(INode))); - var xTableBlock = mGroupDescriptors[xGroup].INodeTable; - xTableBlock += xGroupIndex / (uint)(BlockSize / sizeof(INode)); - xTableBlock *= (BlockSize / mBackend.BlockSize); - xTableBlock += xTableBlockOffset / (uint)(mBackend.BlockSize / sizeof(INode)); - xTableBlockOffset = xTableBlockOffset % (uint)(mBackend.BlockSize / sizeof(INode)); - mBackend.ReadBlock(xTableBlock, - mBuffer); - INode xINode=new INode(); - fixed (byte* xTempAddress = &mBuffer[0]) { - var xINodeAddress = (INode*)xTempAddress; - xINode = xINodeAddress[(int)xTableBlockOffset]; - } - oINode = xINode; - } - - /// - /// Reads the contents of an inode, resolving all indirect/bi-indirect/tri-indirect block arrays - /// - /// - /// This is zero-based! - /// - /// - private bool ReadINodeBlock(ref INode aINode, - uint aBlockId, - byte[] aBuffer) { - if (aBuffer.Length != BlockSize) { - throw new Exception("Incorrect buffer size!"); - } - if (aINode.Blocks <= aBlockId) - { - return false; - } - fixed (INode* xINodePtr = &aINode) - { - uint xINodeAddr = (uint)xINodePtr; - uint* xBlocks = (uint*)(xINodeAddr + INodeConsts.BlockOffset); - if (aBlockId >= 0 && aBlockId <= 11) - { - var xBlockId = xBlocks[aBlockId]; - if (xBlockId == 0) - { - return false; - } - ReadDataBlock(xBlockId, - aBuffer); - return true; - } - else - { - uint xIndirectBlockRefsPerDataBlock = BlockSize / 4; - if ((aBlockId - 12) < xIndirectBlockRefsPerDataBlock) - { - var xBlockId = xBlocks[12]; - if (xBlockId == 0) - { - return false; - } - ReadDataBlock(xBlockId, - aBuffer); - var xTheBlock = ToUInt32(aBuffer, (int)((aBlockId - 11) * 4)); - ReadDataBlock(xTheBlock, - aBuffer); - return true; - } - Console.WriteLine("Reading indirect blocks not yet supported!"); - } - } - return false; - } - - private void ReadDataBlock(uint aBlockId, - byte[] aBuffer) { - var xPhyBlocksPerFSBlock = (BlockSize / mBackend.BlockSize); - //aBlockId *= xPhyBlocksPerFSBlock; - int xBlock = (int)(aBlockId * xPhyBlocksPerFSBlock); - for (var i = 0; i < xPhyBlocksPerFSBlock; i++) { - mBackend.ReadBlock((uint)(xBlock + i), - mBuffer); - for (int j = 0; j < (int)mBackend.BlockSize; j++) - { - aBuffer[(int)((i * ((int)mBackend.BlockSize)) + j)] = mBuffer[j]; - } - //Array.Copy(mBuffer, - // 0, - // aBuffer, - // (mBackend.BlockSize * i), - // mBackend.BlockSize); - } - } - - public override bool ReadBlock(ulong aId, - ulong aBlock, - byte[] aBuffer) { - INode xTheINode; - uint xId = (uint)aId; - GetINode(xId, - out xTheINode); - return ReadINodeBlock(ref xTheINode, - (uint)aBlock, - aBuffer); - } - - public static bool BlockDeviceContainsExt2(BlockDevice aDevice) { - if (aDevice.BlockCount > 3) - { - byte[] xBuffer = new byte[aDevice.BlockSize]; - // todo: implement better detection - aDevice.ReadBlock(2, - xBuffer); - bool xResult = (xBuffer[56] == 0x53 && xBuffer[57] == 0xEF); - return xResult; - } - return false; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/BootSector.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/BootSector.cs deleted file mode 100644 index b384e66b49..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/BootSector.cs +++ /dev/null @@ -1,490 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public abstract class BootSector - { - protected Partition p; - protected byte[] Sector; - - public BootSector(Partition p) - { - this.p = p; - Sector = new byte[p.BlockSize]; - } - - public byte jmpBoot0 - { - get - { - return Sector[0]; - } - set - { - Sector[0] = value; - } - } - public byte jmpBoot1 - { - get - { - return Sector[1]; - } - set - { - Sector[1] = value; - } - } - public byte jmpBoot2 - { - get - { - return Sector[2]; - } - set - { - Sector[2] = value; - } - } - public byte[] OEMName - { - get - { - return GetBytes(3, 8); - } - set - { - SetBytes(value, 3, 8); - } - - } - public ushort BytesPerSec - { - get - { - return BitConverter.ToUInt16(Sector, 11); - } - set - { - SetBytes(BitConverter.GetBytes(value), 11); - } - } - public byte SectorsPerCluster - { - get - { - return Sector[13]; - } - set - { - Sector[13] = value; - } - } - public ushort ReservedSectorCount - { - get - { - return BitConverter.ToUInt16(Sector, 14); - } - set - { - SetBytes(BitConverter.GetBytes(value), 14); - } - } - public byte NumberFATs - { - get - { - return Sector[16]; - } - set - { - Sector[16] = value; - } - } - public ushort RootEntryCount - { - get - { - return BitConverter.ToUInt16(Sector, 17); - } - set - { - SetBytes(BitConverter.GetBytes(value), 27); - } - } - public ushort TotalSectors16 - { - get - { - return BitConverter.ToUInt16(Sector, 19); - } - set - { - SetBytes(BitConverter.GetBytes(value), 19); - } - } - public byte Media - { - get - { - return Sector[21]; - } - set { Sector[21] = value; } - } - public ushort FATsz16 - { - get - { - return BitConverter.ToUInt16(Sector, 22); - } - set - { - SetBytes(BitConverter.GetBytes(value), 22); - } - } - public ushort SectorsPerTrack - { - get - { - return BitConverter.ToUInt16(Sector, 24); - } - set - { - SetBytes(BitConverter.GetBytes(value), 24); - } - } - public ushort NumberOfHeads - { - get - { - return BitConverter.ToUInt16(Sector, 26); - } - set - { - SetBytes(BitConverter.GetBytes(value), 26); - } - } - public uint HiddenSectors - { - get - { - return BitConverter.ToUInt32(Sector, 28); - } - set - { - SetBytes(BitConverter.GetBytes(value), 28); - } - } - public uint TotalSectors32 - { - get - { - return BitConverter.ToUInt32(Sector, 32); - } - set - { - SetBytes(BitConverter.GetBytes(value), 32); - } - } - public ushort Signature - { - get - { - return BitConverter.ToUInt16(Sector, Sector.Length-2); - } - set - { - SetBytes(BitConverter.GetBytes(value), (uint)Sector.Length - 2); - } - } - - public abstract byte DriveNumber - { - get; - set; - } - public abstract byte Reserved1 - { - get; - set; - } - public abstract byte BootSig - { - get; - set; - } - public abstract byte[] VolId - { - get; - set; - } - public abstract byte[] VolLab - { - get; - set; - } - public abstract byte[] filSysType - { - get; - set; - } - - protected void SetBytes(byte[] b, uint offset) - { - Array.Copy(b, 0, Sector, offset, b.Length); - } - protected void SetBytes(byte[] b, uint offset, uint length) - { - if (b.Length != length) - { - byte[] t = new byte[length]; - Array.Copy(b, t, 0); - b = t; - } - Array.Copy(b, 0, Sector, offset, length); - } - protected byte[] GetBytes(uint offset, uint length) - { - byte[] t = new byte[length]; - Array.Copy(Sector, offset, t, 0, length); - return t; - } - - public void Refresh() - { - p.ReadBlock(0, Sector); - } - public void Save() - { - p.WriteBlock(0, Sector); - } - } - public class BootSectorFAT12 : BootSector - { - public BootSectorFAT12(Partition p) : base(p) { } - public override byte DriveNumber - { - get - { - return Sector[36]; - } - set - { - Sector[36] = value; - } - } - public override byte Reserved1 - { - get - { - return Sector[37]; - } - set - { - Sector[37] = value; - } - } - public override byte BootSig - { - get - { - return Sector[38]; - } - set - { - Sector[38] = value; - } - } - public override byte[] VolId - { - get - { - return GetBytes(39, 4); - } - set - { - SetBytes(value, 39, 4); - } - } - public override byte[] VolLab - { - get - { - return GetBytes(43, 11); - } - set - { - SetBytes(value, 43, 11); - } - } - public override byte[] filSysType - { - get - { - return GetBytes(54, 8); - } - set - { - SetBytes(value, 54, 8); - } - } - } - public class BootSectorFAT16 : BootSectorFAT12 - { - public BootSectorFAT16(Partition p) : base(p) { } - } - public class BootSectorFAT32 : BootSector - { - public BootSectorFAT32(Partition p) : base(p) { } - public uint BPB_FATSz32 - { - get - { - return BitConverter.ToUInt32(Sector, 36); - } - set - { - SetBytes(BitConverter.GetBytes(value), 36); - } - } - public ushort BPB_ExtFlags - { - get - { - return BitConverter.ToUInt16(Sector, 40); - } - set - { - SetBytes(BitConverter.GetBytes(value), 40); - } - } - public ushort BPB_FSVer - { - get - { - return BitConverter.ToUInt16(Sector, 42); - } - set - { - SetBytes(BitConverter.GetBytes(value), 42); - } - } - public uint BPB_RootClus - { - get - { - return BitConverter.ToUInt32(Sector, 44); - } - set - { - SetBytes(BitConverter.GetBytes(value), 44); - } - } - public ushort BPB_FSInfo - { - get - { - return BitConverter.ToUInt16(Sector, 48); - } - set - { - SetBytes(BitConverter.GetBytes(value), 48); - } - } - public ushort BPB_BkBootSec - { - get - { - return BitConverter.ToUInt16(Sector, 50); - } - set - { - SetBytes(BitConverter.GetBytes(value), 50); - } - } - public byte[] BPB_Reserved - { - get - { - return GetBytes(52, 12); - - } - set - { - SetBytes(value, 52, 12); - } - } - public override byte DriveNumber - { - get - { - return Sector[64]; - } - set - { - Sector[64] = value; - } - } - public override byte Reserved1 - { - get - { - return Sector[65]; - } - set - { - Sector[65] = value; - } - } - public override byte BootSig - { - get - { - return Sector[66]; - } - set - { - Sector[66] = value; - } - } - public override byte[] VolId - { - get - { - return GetBytes(67, 4); - } - set - { - SetBytes(value, 67, 4); - } - } - public override byte[] VolLab - { - get - { - return GetBytes(71, 11); - } - set - { - SetBytes(value, 71, 11); - } - } - public override byte[] filSysType - { - get - { - return GetBytes(82, 8); - } - set - { - SetBytes(value, 82, 8); - } - } - - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/DirectoryTable.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/DirectoryTable.cs deleted file mode 100644 index c7051dfbb1..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/DirectoryTable.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public class DirectoryTable - { - FAT fat; - uint cluster; - public DirectoryTable(FAT fat, uint cluster) - { - this.fat = fat; - this.cluster = cluster; - } - - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FAT.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FAT.cs deleted file mode 100644 index 7553d91a0b..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FAT.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public abstract class FAT - { - protected Partition p; - - protected FAT(Partition p) - { - this.p = p; - } - - public BootSector BootSector; - public FileAllocationTable FileAllocationTable; - - - public abstract byte[] ReadCluster(uint Cluster); - public abstract void WriteCluster(uint Cluster, byte[] bytes); - - - } - - public class FAT32 : FAT - { - public FileSystemInfo32 FileSystemInfo32; - public FAT32(Partition p) : base(p) - { - BootSector = new BootSectorFAT32(p); - BootSector.Refresh(); - if ((BootSector as BootSectorFAT32).BPB_FSInfo != 0x0) - FileSystemInfo32 = new FileSystemInfo32(p, (BootSector as BootSectorFAT32).BPB_FSInfo); - else - FileSystemInfo32 = null; - - FileAllocationTable = new FileAllocationTableFAT32(this, p, - BootSector.ReservedSectorCount, - (uint)(BootSector.ReservedSectorCount + BootSector.FATsz16)); - CalcOffsets(); - } - public void Format(string label, uint clustersize) - { - BootSectorFAT32 BootSector = new BootSectorFAT32(p); - BootSector.TotalSectors32 = (uint)p.BlockCount; - BootSector.BytesPerSec = (ushort)p.BlockSize; - BootSector.SectorsPerCluster = (byte)(clustersize / p.BlockSize); - BootSector.BPB_FATSz32 = (BootSector.TotalSectors32 * 512 * 4 / clustersize + p.BlockSize - 1) / p.BlockSize; - BootSector.ReservedSectorCount = 32; - BootSector.Media = 0xf8; - BootSector.NumberFATs = 2; - BootSector.Signature = 0xaa55; - this.BootSector = BootSector; - - FileAllocationTable = new FileAllocationTableFAT32(this, p, BootSector.ReservedSectorCount, (uint)(BootSector.ReservedSectorCount + BootSector.FATsz16)); - - FileSystemInfo32 = new FileSystemInfo32(p, 1); - BootSector.BPB_FSInfo = 1; - FileSystemInfo32.Free_Count = (BootSector.TotalSectors32 / BootSector.SectorsPerCluster -2); - FileSystemInfo32.LeadSig = 0x41615252; - FileSystemInfo32.Nxt_Free = 0x2; - FileSystemInfo32.StrucSig = 0x61417272; - FileSystemInfo32.TrailSig = 0xaa550000; - - BootSector.Save(); - FileSystemInfo32.Save(); - FileAllocationTable.Format(); - - CalcOffsets(); - } - - public uint FirstDataSector; - public uint SectorsPerCluster; - public uint ClusterSize; - public uint BytesPerSector; - - - private void CalcOffsets() - { - FirstDataSector =(uint)( BootSector.ReservedSectorCount + BootSector.NumberFATs * BootSector.FATsz16); - SectorsPerCluster = BootSector.SectorsPerCluster; - BytesPerSector = BootSector.BytesPerSec; - ClusterSize = SectorsPerCluster * BytesPerSector; - } - private uint FirstSectorOfCluster(uint cluster) - { - return (cluster - 2) * SectorsPerCluster + FirstDataSector; - } - - public override byte[] ReadCluster(uint cluster) - { - byte[] data = new byte[ClusterSize]; - - uint Sector = FirstSectorOfCluster(cluster); - byte[] read = new byte[p.BlockSize]; - for (int i = 0; i < SectorsPerCluster; i++) - { - p.ReadBlock(Sector++, read); - Array.Copy(read, 0, data, i * BytesPerSector, BytesPerSector); - } - return data; - } - - public override void WriteCluster(uint cluster, byte[] bytes) - { - uint Sector = FirstSectorOfCluster(cluster); - - byte[] dest = new byte[BytesPerSector]; - - for (int i = 0; i < SectorsPerCluster; i++) - { - Array.Copy(bytes, i * BytesPerSector, dest,0, BytesPerSector); - p.WriteBlock(Sector++, dest); - } - - } - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FATStream.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FATStream.cs deleted file mode 100644 index b41c756200..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FATStream.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public class FATStream : Stream - { - private FAT fs; - private FileAllocationTable fat; - private uint startcluster; - - long ClusterSize; - - public FATStream(FAT fs, FileAllocationTable fat, UInt32 startcluster) - { - this.fs = fs; - this.fat = fat; - this.startcluster = startcluster; - - ClusterSize = fat.ClusterSize; - - Restart(0); - } - - public override bool CanRead - { - get { return true; } - } - - public override bool CanSeek - { - get { return true; } - } - - public override bool CanWrite - { - get { return false; } - } - - public override void Flush() - { - throw new NotImplementedException(); - } - - public override long Length - { - get { throw new NotImplementedException(); } - } - - private long position; - public override long Position - { - get - { - return position; - } - set - { - GotoPosition(value); - } - } - - private long CurrentClusterStart; - private byte[] CurrentCluster; - private long CurrentClusterEnd; - private uint CurrentClusterNumber; - - - private void GotoPosition(long value) - { - if (value < CurrentClusterStart) - { - Restart(value); - } - else if ( value >= CurrentClusterEnd) - { - if (value < 2 * CurrentClusterEnd - CurrentClusterStart) - { - GetNextCluster(); - } - else - { - Restart(value); - } - } - position = value; - } - - private void GetNextCluster() - { - CurrentClusterStart += ClusterSize; - CurrentClusterEnd = CurrentClusterStart + ClusterSize; - CurrentClusterNumber = fat.GetNextCluster(CurrentClusterNumber); - if (CurrentClusterNumber == (fat as FileAllocationTableFAT32).ClusterEOL) - throw new Exception("end of file"); - CurrentCluster = fs.ReadCluster(CurrentClusterNumber); - } - - private void Restart(long value) - { - CurrentClusterStart = 0; - - CurrentClusterNumber = startcluster; - while (value >= CurrentClusterStart + ClusterSize) // TODO: check eof! - { - if (CurrentClusterNumber == (fat as FileAllocationTableFAT32).ClusterEOL) - throw new Exception("end of file"); - - CurrentClusterStart += ClusterSize; - CurrentClusterNumber = fat.GetNextCluster(CurrentClusterNumber); - } - - CurrentClusterEnd = CurrentClusterStart + ClusterSize; - CurrentCluster = fs.ReadCluster(CurrentClusterNumber); - } - - public override int Read(byte[] aBuffer, int aOffset, int aCount) - { - return Read(aBuffer , (long)aOffset , (long)aCount); - } - - public int Read(byte[] buffer, long offset, long count) - { - int read=0; - while (count > 0) - { - long left = CurrentClusterEnd - Position; - if (left > count) - left = count; - Array.Copy(CurrentCluster, position - CurrentClusterStart, - buffer, offset, left); - Position += left; - offset += left; - count -= left; - read+=left; - } - return read; - } - - public override long Seek(long offset, SeekOrigin origin) - { - if (origin == SeekOrigin.Begin) - { - Position = offset; - } - else if (origin == SeekOrigin.Current) - { - Position += offset; - } - else - { - Position = Length + offset; - } - return position; - } - - public override void SetLength(long value) - { - throw new NotImplementedException(); - } - - public override void Write(byte[] aBuffer, int aOffset, int aCount) - { - Write(aBuffer , (long)aOffset , (long)aCount); - } - - public void Write(byte[] buffer, long offset, long count) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileAllocationTable.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileAllocationTable.cs deleted file mode 100644 index de13b1cba7..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileAllocationTable.cs +++ /dev/null @@ -1,153 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public abstract class FileAllocationTable - { - public abstract uint GetFreeCluster(); - public abstract uint GetNextCluster(uint CurrentCluster); - public abstract uint AddFreeCluster(uint LastSector); - - - public uint ClusterSize; - - public abstract void Format(); - } - public class FileAllocationTableFAT32 : FileAllocationTable - { - private FAT32 fat32; - private uint FirstSector; - private uint SecondSector; - private uint TotalClusters; - private Partition p; - public FileAllocationTableFAT32(FAT32 fat32, Partition p, uint firstsector, uint secondsector) - { - this.fat32 = fat32; - this.FirstSector = firstsector; - this.SecondSector = secondsector; - this.TotalClusters = (fat32.BootSector.TotalSectors32-fat32.BootSector.ReservedSectorCount)/ fat32.BootSector.SectorsPerCluster; - this.p = p; - this.ClusterSize = (uint)(fat32.BootSector.SectorsPerCluster * fat32.BootSector.BytesPerSec); - - switch (fat32.BootSector.BytesPerSec/4) - { - case 128: - Shift = 7; - Mask = 0x7f; - break; - default: - throw new Exception("weird sector size"); - } - } - - - private int Shift; - private uint Mask; - - public override void Format() - { - byte[] b = new byte[fat32.BootSector.BytesPerSec]; - for (int i = 0; i < fat32.BootSector.FATsz16; i++) - p.WriteBlock((uint)(FirstSector + i), b); - - b[0] = fat32.BootSector.Media; - b[1] = 0xff; - b[2] = 0xff; - b[3] = 0xff; - - Array.Copy(BitConverter.GetBytes((uint)0x0ffffff8), 0, b, 4, 4); - - p.WriteBlock(FirstSector, b); // first 2 sectors are reserved - } - - public uint ClusterFree = 0x0; - public uint ClusterReserved = 0x0; - public uint ClusterEOL = 0xffffff8; - public uint ClusterBAD = 0xffffff6; - - - public override uint AddFreeCluster(uint LastCluster) - { - uint newcluster = GetFreeCluster(); - WriteClusterAllocation(newcluster, ClusterEOL); - WriteClusterAllocation(LastCluster, newcluster); - return newcluster; - } - - public override uint GetFreeCluster() - { - uint start = fat32.FileSystemInfo32.Nxt_Free; - if (start == 0x0 || start == 0xffffffff) - start = 0x2; - - for (uint i = 0; i < TotalClusters; i++) - { - uint actualcluster = (start + i - 2) % (TotalClusters) + 2; - if (ReadClusterAllocation(actualcluster) == 0x0) - { - fat32.FileSystemInfo32.Nxt_Free = actualcluster + 1; - return actualcluster; - } - } - - throw new Exception("Disk full"); - - } - - private unsafe uint ReadClusterAllocation(uint actualcluster) - { - uint index = actualcluster & Mask; - uint sector = FirstSector + actualcluster >> Shift; - - byte[] data= GetSector(sector); - - return BitConverter.ToUInt32(data,(int)(index<<2)); - } - private unsafe void WriteClusterAllocation(uint actualcluster, uint value) - { - uint index = actualcluster & Mask; - uint sector = FirstSector + actualcluster >> Shift; - - byte[] data = GetSector(sector); - byte[] b = BitConverter.GetBytes(value); - index <<= 2; - data[index++] = b[0]; - data[index++] = b[1]; - data[index++] = b[2]; - data[index++] = b[3]; - - SetSector(sector, data); - } - - byte[] CachedSector; - uint SectorNumber=0xffffffff; - - - public override uint GetNextCluster(uint CurrentCluster) - { - return ReadClusterAllocation(CurrentCluster); - } - - private void SetSector(uint sector, byte[] data) - { - if (sector == SectorNumber) - CachedSector = data; - p.WriteBlock(sector, data); - } - private unsafe byte[] GetSector(uint Sector) - { - if (Sector != SectorNumber) - { - SectorNumber = Sector; - p.ReadBlock(Sector, CachedSector); - } - return CachedSector; - } - - - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileSystemInfo32.cs b/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileSystemInfo32.cs deleted file mode 100644 index ed593e0786..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FAT32/FileSystemInfo32.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.FileSystem.FAT32 -{ - public class FileSystemInfo32 - { - protected Partition p; - protected byte[] Sector; - protected uint Offset; - - public FileSystemInfo32(Partition p, uint Offset) - { - this.p = p; - this.Offset = Offset; - Sector = new byte[p.BlockSize]; - } - - public void Load() - { - p.ReadBlock(Offset, Sector); - } - public void Load(uint Offset) - { - this.Offset = Offset; - Load(); - } - public void Save(uint Offset) - { - this.Offset = Offset; - Save(); - } - - public void Save() - { - p.WriteBlock(Offset, Sector); - } - - public uint LeadSig - { - get - { - return BitConverter.ToUInt32(Sector, 0); - } - set - { - SetBytes(BitConverter.GetBytes(value), 0); - } - } - public byte[] Reserved1 - { - get - { - return GetBytes(4, 480); - } - set - { - SetBytes(value, 4, 480); - } - - } - public uint StrucSig - { - get - { - return BitConverter.ToUInt16(Sector, 484); - } - set - { - SetBytes(BitConverter.GetBytes(value), 484); - } - } - public uint Free_Count - { - get - { - return BitConverter.ToUInt16(Sector, 488); - } - set - { - SetBytes(BitConverter.GetBytes(value), 488); - } - } - public uint Nxt_Free - { - get - { - return BitConverter.ToUInt16(Sector, 492); - } - set - { - SetBytes(BitConverter.GetBytes(value), 492); - } - } - public byte[] Reserved2 - { - get - { - return GetBytes(496, 12); - } - set - { - SetBytes(value, 496, 12); - } - } - public uint TrailSig - { - get - { - return BitConverter.ToUInt16(Sector, 508); - } - set - { - SetBytes(BitConverter.GetBytes(value), 508); - } - } - - protected void SetBytes(byte[] b, uint offset) - { - Array.Copy(b, 0, Sector, offset, b.Length); - } - protected void SetBytes(byte[] b, uint offset, uint length) - { - if (b.Length != length) - { - byte[] t = new byte[length]; - Array.Copy(b, t, 0); - b = t; - } - Array.Copy(b, 0, Sector, offset, length); - } - protected byte[] GetBytes(uint offset, uint length) - { - byte[] t = new byte[length]; - Array.Copy(Sector, offset, t, 0, length); - return t; - } - - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/FileSystem_Old.cs b/source/Archive/Cosmos.Kernel.FileSystems/FileSystem_Old.cs deleted file mode 100644 index ae69c8dc4e..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/FileSystem_Old.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Cosmos.Sys.FileSystem { - public abstract class FileSystem_Old - { - public virtual FSDirectory GetDirectory(string path) - { - FSObject o = GetObject(path); - if (o is FSDirectory) - return o as FSDirectory; - throw new Exception("DiretoryNotFound"); - } - - public virtual FSFile GetFile(string path) - { - FSObject o = GetObject(path); - if (o is FSFile) - return o as FSFile; - throw new Exception("FileNotFound"); - } - - protected abstract FSObject GetObject(string path); - } - - public abstract class FSObject - { - public abstract string Name - { - get; - set; - } - - public abstract int Size - { - get; - } - - public abstract bool Delete(string name); - } - - public abstract class FSFile : FSObject - { - public abstract Stream GetStream(); - } - - public abstract class FSDirectory : FSObject - { - protected FSDirectory[] SubDirectorys; - protected FSFile[] Files; - - public FSDirectory GetDirectory(string name) - { - foreach (var dir in SubDirectorys) - if (dir.Name == name) - return dir; - throw new Exception("DirectoryNotFound"); - } - - public FSFile GetFile(string name) - { - foreach (var file in Files) - if (file.Name == name) - return file; - throw new Exception("fileNotFound"); - } - - public abstract FSFile CreateFile(string name); - public abstract FSDirectory CreateDirectory(string name); - - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/Filesystem.cs b/source/Archive/Cosmos.Kernel.FileSystems/Filesystem.cs deleted file mode 100644 index c78131a6bf..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/Filesystem.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.FileSystem { - /// - /// Represents either a directory or a file in a filesystem. The entry also contains metadata, such as name, attributes, etc. - /// - public class FilesystemEntry { - public ulong Id; - public string Name; - public bool IsDirectory; - public bool IsReadonly; - public ulong Size; - public Filesystem Filesystem; - } - - public abstract class Filesystem { - public abstract uint BlockSize { - get; - } - - public abstract ulong RootId { - get; - } - - public abstract FilesystemEntry[] GetDirectoryListing(ulong aId); - - public abstract bool ReadBlock(ulong aId, - ulong aBlock, - byte[] aBuffer); - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.FileSystems/MBR.cs b/source/Archive/Cosmos.Kernel.FileSystems/MBR.cs deleted file mode 100644 index d45eb2a838..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/MBR.cs +++ /dev/null @@ -1,271 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Hardware2; - -namespace Cosmos.Sys.FileSystem -{ - public class MBR : PartitionManager - { - protected Disk blockdevice; - - public static void Initialise() - { - for (int i = 0; i < Cosmos.Hardware2.Device.Devices.Count; i++) - { - Device d = Cosmos.Hardware2.Device.Devices[i]; - if (d is Disk) - { - MBR mbr = new MBR(d as Disk); - if (mbr.IsValid()) - Cosmos.Hardware2.Device.Devices.Add(mbr); - } - } - } - - public MBR(Disk bd) - { - this.blockdevice = bd; - Partition = new IBMPartitionInformation[4]; - Partition[0] = new IBMPartitionInformation(this, 0); - Partition[1] = new IBMPartitionInformation(this, 1); - Partition[2] = new IBMPartitionInformation(this, 2); - Partition[3] = new IBMPartitionInformation(this, 3); - Refresh(); - } - - private byte[] Sector; - - public byte[] Code - { - - get - { - byte[] b = new byte[440]; - Array.Copy(Sector, b, 440); - return b; - } - set - { - byte[] b; - if (value.Length != 440) - { - b = new byte[440]; - Array.Copy(value, b, 0); - } - else - { - b = value; - } - Array.Copy(value, Sector, 0); - } - - } - - public uint DiskSignature - { - get - { - return BitConverter.ToUInt32(Sector, 440); - } - set - { - byte[] b = BitConverter.GetBytes(value); - Sector[440] = b[0]; - Sector[441] = b[1]; - Sector[442] = b[2]; - Sector[443] = b[3]; - } - } - public ushort Null - { - get - { - return BitConverter.ToUInt16(Sector, 444); - } - set - { - byte[] b = BitConverter.GetBytes(value); - Sector[444] = b[0]; - Sector[445] = b[1]; - } - } - - public IBMPartitionInformation[] Partition; - - public ushort MBRSignature - { - get - { - return BitConverter.ToUInt16(Sector,510); - } - } - - public void Refresh() - { - // disable and remove any partitions we already added - blockdevice.ReadBlock(0, Sector); - //add partitons back to device list - } - public void Save() - { - Sector[510] = 0x55; - Sector[511] = 0xaa; - blockdevice.WriteBlock(0, Sector); - } - - public bool IsValid() - { - return MBRSignature == 0x55aa; - } - - public class IBMPartitionInformation - { - private MBR mbr; - private int offset; - public IBMPartitionInformation(MBR mbr, int index) - { - this.mbr=mbr; - this.offset=446+16*index; - } - - public byte Status - { - get - { - return mbr.Sector[offset]; - } - set - { - mbr.Sector[offset] = value; - } - } - - public bool Bootable - { - get - { - return (Status & 0x80) == 0x80; - } - set - { - Status = (byte)((Status & 0x7f) | (value ? 0x80 : 0)); - } - } - - public byte PartitionType - { - get - { - return mbr.Sector[offset + 4]; - } - set - { - mbr.Sector[offset + 4] = value; - } - } - public uint StartLBA - { - get - { - return BitConverter.ToUInt32(mbr.Sector,offset+8); - } - set - { - byte[] b = BitConverter.GetBytes(value); - mbr.Sector[offset + 8] = b[0]; - mbr.Sector[offset + 9] = b[1]; - mbr.Sector[offset + 10] = b[2]; - mbr.Sector[offset + 11] = b[3]; - } - } - public uint LengthLBA - { - get - { - return BitConverter.ToUInt32(mbr.Sector, offset + 12); - } - set - { - byte[] b = BitConverter.GetBytes(value); - mbr.Sector[offset + 12] = b[0]; - mbr.Sector[offset + 13] = b[1]; - mbr.Sector[offset + 14] = b[2]; - mbr.Sector[offset + 15] = b[3]; - } - } - - public bool ValidPartition() - { - return (PartitionType > 0 && (Status == 0x00 || Status == 0x80)); - } - - public Partition GetPartitionDevice() - { - if (ValidPartition()) - return new MBRPartition(this, mbr); - return null; - } - } - - public class MBRPartition : Partition - { - private MBR Mbr; - private uint Start, Length; - private BlockDevice blockDev; - - public MBRPartition(IBMPartitionInformation info, MBR mbr) - { - Mbr = mbr; - Start = info.StartLBA; - Length = info.LengthLBA; - Identifier = info.PartitionType; - blockDev = mbr.blockdevice; - } - - public override uint BlockSize - { - get { return blockDev.BlockSize; } - } - - public override ulong BlockCount - { - get { return Length; } - } - - public override void ReadBlock(ulong aBlock, byte[] aBuffer) - { - blockDev.ReadBlock(aBlock + Start, aBuffer); - } - - public override void WriteBlock(ulong aBlock, byte[] aContents) - { - blockDev.WriteBlock(aBlock + Start, aContents); - } - - public override string Name - { - get { return "MBR Partition [Type="+Identifier + "] in MBR " + blockDev.Name; } - } - } - - public override string Name - { - get { throw new NotImplementedException(); } - } - } - - - public abstract class Disk : BlockDevice - { - } - public abstract class PartitionManager : Device - { - } - - public abstract class Partition : BlockDevice - { - public object Identifier; - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/MBT.cs b/source/Archive/Cosmos.Kernel.FileSystems/MBT.cs deleted file mode 100644 index bba3bc169a..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/MBT.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.Hardware2; -using System.Runtime.InteropServices; - -namespace Cosmos.Sys.FileSystem { - public static class MBT { - private class MBTPartition: BlockDevice { - private readonly BlockDevice mBackend; - private readonly uint mBlockStart; - private readonly uint mBlockCount; - private readonly string mName; - public MBTPartition(BlockDevice aBackend, uint aBlockStart, uint aBlockCount, string aName) - { - mBlockStart = aBlockStart; - mBlockCount = aBlockCount; - mBackend = aBackend; - mName = aName; - } - - public override uint BlockSize { - get { - return mBackend.BlockSize; - } - } - - public override ulong BlockCount - { - get { - return mBlockCount; - } - } - - private ulong GetActualBlock(ulong aBlock) - { - return aBlock + mBlockStart; - } - - public override void ReadBlock(ulong aBlock, byte[] aBuffer) - { - mBackend.ReadBlock(GetActualBlock(aBlock), aBuffer); - } - - public override void WriteBlock(ulong aBlock, byte[] aContents) - { - mBackend.WriteBlock(GetActualBlock(aBlock), aContents); - } - - public override string Name { - get { - return mName; - } - } - } - public static void Init() - { - //DebugUtil.SendMessage("MBT", "Initializing"); - //DebugUtil.SendNumber("MBT", "DeviceCount", (uint)Device.Devices.Count, 32); - - //List mbtPartitions = new List(); - for (int i = 0; i < Device.Devices.Count; i++) { - if (Device.Devices[i].Type == Device.DeviceType.Storage) { - var xTest = getPartitions((BlockDevice)Device.Devices[i]); - if (xTest != null) { - for (int j = 0; j < xTest.Count; j++) { - Device.Add(xTest[j]); - } - } - } - } - } - - private static List getPartitions(BlockDevice xBlockDev) - { - if (xBlockDev == null) - return default(List); - - List partitionList = new List(); - int xContentsIndex = 0x1BE; - //DebugUtil.SendMessage("MBT", "Found Device"); - byte[] xBlockContents = new byte[xBlockDev.BlockSize]; - xBlockDev.ReadBlock(0, xBlockContents); - // detecting whether MBT or not - //DebugUtil.SendNumber("MBT", "xBlockDev.BlockSize", xBlockDev.BlockSize, 32); - - //DebugUtil.SendDoubleNumber("MBT", "Last bytes of block", xBlockContents[510], 8, xBlockContents[511], 8); - if (!(xBlockContents[xBlockDev.BlockSize - 2] == 0x55 && xBlockContents[xBlockDev.BlockSize - 1] == 0xAA)) - { - //DebugUtil.SendMessage("MBT", "Does not contain MBR"); - //Hardware.DebugUtil.SendATA_BlockReceived(255, 255, 0, xBlockContents); - return default(List); - } - - for (byte j = 0; j < 4; j++) - { - //DebugUtil.SendNumber("MBT", "Partition Status", xBlockContents[xContentsIndex], 8); - if (!(xBlockContents[xContentsIndex] == 0x80 || xBlockContents[xContentsIndex] == 0)) - { - xContentsIndex += 16; - continue; - } - xContentsIndex += 8; - uint xStart = BitConverter.ToUInt32(xBlockContents, xContentsIndex); - xContentsIndex += 4; - uint xLength = BitConverter.ToUInt32(xBlockContents, xContentsIndex); - xContentsIndex += 4; - if (xStart > 0 && xLength > 0) - { - //DebugUtil.SendDoubleNumber("MBT", "Entry Found. Start, Length in blocks", xStart, 32, xLength, 32); - xStart += 2; - Console.WriteLine("Add Partition to Device list"); - partitionList.Add(new MBTPartition(xBlockDev, xStart, xLength, "Partition")); //Causes System Fault on the HTC Shift! - //DebugUtil.SendMessage("MBT", "FoundPartition"); - } - } - - return partitionList; - } - } -} diff --git a/source/Archive/Cosmos.Kernel.FileSystems/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Kernel.FileSystems/Properties/AssemblyInfo.cs deleted file mode 100644 index 03033e8c8a..0000000000 --- a/source/Archive/Cosmos.Kernel.FileSystems/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("Cosmos.Kernel.FileSystems")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Kernel.FileSystems")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("7cef21e2-4b4b-4db4-94f3-ff091f6b7a5f")] - -// 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/source/Archive/Cosmos.Kernel.LogTail/Cosmos.Kernel.LogTail.csproj b/source/Archive/Cosmos.Kernel.LogTail/Cosmos.Kernel.LogTail.csproj deleted file mode 100644 index 9c6bb6fabe..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Cosmos.Kernel.LogTail.csproj +++ /dev/null @@ -1,135 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {7BAB58BF-E8A1-4623-B6BF-4B90A0505226} - WinExe - Properties - Cosmos.Kernel.LogTail - Cosmos.Kernel.LogTail - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - true - GlobalSuppressions.cs - prompt - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - - - - - 3.5 - - - 3.5 - - - 3.5 - - - - - - - - - - - UserControl - - - HeapLogHandler.cs - - - UserControl - - - LogHandler.cs - - - - UserControl - - - MessageLogHandler.cs - - - UserControl - - - TestLogHandler.cs - - - Form - - - MainForm.cs - - - - - HeapLogHandler.cs - Designer - - - MessageLogHandler.cs - Designer - - - TestLogHandler.cs - Designer - - - MainForm.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - diff --git a/source/Archive/Cosmos.Kernel.LogTail/ErrorStrippingFileStream.cs b/source/Archive/Cosmos.Kernel.LogTail/ErrorStrippingFileStream.cs deleted file mode 100644 index d9f400b4be..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/ErrorStrippingFileStream.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace Cosmos.Kernel.LogTail -{ - public class ErrorStrippingFileStream : FileStream - { - public ErrorStrippingFileStream(string file) - : base(file, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite) - { - - } - - public override int ReadByte() - { - int result; - while ((result = base.ReadByte()) == 0) ; - return result; - } - - public override int Read(byte[] array, int offset, int count) - { - int i; - for (i = 0; i < count; i++) - { - int b = ReadByte(); - if (b == -1) - return i; - - array[offset + i] = (byte) b; - } - return i; - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.Designer.cs deleted file mode 100644 index 0a5f0f0b60..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.Designer.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace Cosmos.Kernel.LogTail.Handlers -{ - partial class HeapLogHandler - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.lblTotalUsage = new System.Windows.Forms.Label(); - this.lblValue = new System.Windows.Forms.Label(); - this.lblAvailMemory = new System.Windows.Forms.Label(); - this.lblAvailValue = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // lblTotalUsage - // - this.lblTotalUsage.AutoSize = true; - this.lblTotalUsage.Location = new System.Drawing.Point(16, 36); - this.lblTotalUsage.Name = "lblTotalUsage"; - this.lblTotalUsage.Size = new System.Drawing.Size(95, 13); - this.lblTotalUsage.TabIndex = 0; - this.lblTotalUsage.Text = "Total heap Usage:"; - // - // lblValue - // - this.lblValue.Location = new System.Drawing.Point(117, 36); - this.lblValue.Name = "lblValue"; - this.lblValue.Size = new System.Drawing.Size(75, 13); - this.lblValue.TabIndex = 1; - this.lblValue.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // lblAvailMemory - // - this.lblAvailMemory.AutoSize = true; - this.lblAvailMemory.Location = new System.Drawing.Point(16, 12); - this.lblAvailMemory.Name = "lblAvailMemory"; - this.lblAvailMemory.Size = new System.Drawing.Size(93, 13); - this.lblAvailMemory.TabIndex = 2; - this.lblAvailMemory.Text = "Available Memory:"; - // - // lblAvailValue - // - this.lblAvailValue.Location = new System.Drawing.Point(117, 12); - this.lblAvailValue.Name = "lblAvailValue"; - this.lblAvailValue.Size = new System.Drawing.Size(75, 13); - this.lblAvailValue.TabIndex = 3; - this.lblAvailValue.TextAlign = System.Drawing.ContentAlignment.TopRight; - // - // HeapLogHandler - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.lblAvailValue); - this.Controls.Add(this.lblAvailMemory); - this.Controls.Add(this.lblValue); - this.Controls.Add(this.lblTotalUsage); - this.Name = "HeapLogHandler"; - this.Size = new System.Drawing.Size(315, 265); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label lblTotalUsage; - private System.Windows.Forms.Label lblValue; - private System.Windows.Forms.Label lblAvailMemory; - private System.Windows.Forms.Label lblAvailValue; - - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.cs deleted file mode 100644 index d42e3f23c6..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.Globalization; - -namespace Cosmos.Kernel.LogTail.Handlers { - public partial class HeapLogHandler: LogHandler { - public override string Title { - get { - return "Heap Usage"; - } - } - - public HeapLogHandler() { - InitializeComponent(); - } - - public override void Clear() { - if (InvokeRequired) { - this.BeginInvoke(new Action(Clear)); - return; - } - } - - private uint mHeapUsage = 0; - public uint HeapUsage { - get { - return mHeapUsage; - } - set { - if (value != mHeapUsage) { - mHeapUsage = value; - lblValue.Text = GetValueString(value); - } - } - } - - private static string GetValueString(uint aValue) { - string[] xTest = new string[] { "B", "KB", "MB", "GB" }; - int xIteration = 0; - Single xValue = aValue; - while (xValue >= 1024) { - xValue /= 1024f; - xIteration++; - } - return xValue.ToString("#0.000") + " " + xTest[xIteration]; - } - - private delegate void Handler(LogMessage message); - - public override void HandleMessage(LogMessage message) { - if (InvokeRequired) { - this.BeginInvoke(new Handler(HandleMessage), message); - return; - } - if (message.Name == "MM_Alloc") { - HeapUsage += UInt32.Parse(message["Length"].Substring(2), NumberStyles.HexNumber); - return; - } - if (message.Name == "MM_Init") { - lblAvailValue.Text = GetValueString(UInt32.Parse(message["Length"].Substring(2), NumberStyles.HexNumber)); - return; - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.resx b/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/HeapLogHandler.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.Designer.cs deleted file mode 100644 index 6c80cc7a94..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.Designer.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Cosmos.Kernel.LogTail.Handlers -{ - partial class LogHandler - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.cs deleted file mode 100644 index ded7b3b197..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogHandler.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace Cosmos.Kernel.LogTail.Handlers -{ - public partial class LogHandler : UserControl - { - public virtual String Title - { - get - { - throw new NotImplementedException(); - } - } - - public LogHandler() - { - InitializeComponent(); - } - - // For designer support. - public virtual void HandleMessage(LogMessage message) - { - throw new NotImplementedException(); - } - - public virtual void Clear() - { - throw new NotImplementedException(); - } - - public static LogHandler[] GetHandlers() - { - List handlers = new List(); - - foreach (Type t in typeof(LogHandler).Assembly.GetTypes()) - { - if (t != typeof(LogHandler) && typeof(LogHandler).IsAssignableFrom(t)) - handlers.Add((LogHandler)Activator.CreateInstance(t)); - } - - return handlers.ToArray(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogMessage.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogMessage.cs deleted file mode 100644 index 80c6b6ef70..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/LogMessage.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Kernel.LogTail.Handlers -{ - /// - /// Represents a single log message. - /// - public class LogMessage - { - private string _name; - /// - /// Gets the name of the message. - /// - public string Name - { - get { return _name; } - } - - /// - /// The values. - /// - private Dictionary _values = new Dictionary(); - - /// - /// Gets a specific attribute. - /// - /// The name of the atttribute. - /// - public string this[string name] - { - get - { - string result; - _values.TryGetValue(name, out result); - return result; - } - } - - /// - /// Creates a new instance of the class. - /// - /// - public LogMessage(string name) - { - _name = name; - } - - /// - /// Adds an attribute. - /// - /// - /// - public void AddAttribute(string name, string value) - { - _values.Add(name, value); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.Designer.cs deleted file mode 100644 index 6a91842fbe..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.Designer.cs +++ /dev/null @@ -1,91 +0,0 @@ -namespace Cosmos.Kernel.LogTail.Handlers -{ - partial class MessageLogHandler - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MessageLogHandler)); - this.listView = new System.Windows.Forms.ListView(); - this.sourceColumnHeader = new System.Windows.Forms.ColumnHeader(); - this.messageColumnHeader = new System.Windows.Forms.ColumnHeader(); - this.imageList = new System.Windows.Forms.ImageList(this.components); - this.SuspendLayout(); - // - // listView - // - this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.sourceColumnHeader, - this.messageColumnHeader}); - this.listView.Dock = System.Windows.Forms.DockStyle.Fill; - this.listView.GridLines = true; - this.listView.LargeImageList = this.imageList; - this.listView.Location = new System.Drawing.Point(0, 0); - this.listView.Name = "listView"; - this.listView.Size = new System.Drawing.Size(150, 150); - this.listView.SmallImageList = this.imageList; - this.listView.StateImageList = this.imageList; - this.listView.TabIndex = 0; - this.listView.UseCompatibleStateImageBehavior = false; - this.listView.View = System.Windows.Forms.View.Details; - // - // sourceColumnHeader - // - this.sourceColumnHeader.Text = "Source"; - this.sourceColumnHeader.Width = 120; - // - // messageColumnHeader - // - this.messageColumnHeader.Text = "Message"; - this.messageColumnHeader.Width = 500; - // - // imageList - // - this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream"))); - this.imageList.TransparentColor = System.Drawing.Color.Transparent; - this.imageList.Images.SetKeyName(0, "error"); - this.imageList.Images.SetKeyName(1, "message"); - this.imageList.Images.SetKeyName(2, "warning"); - // - // MessageLogHandler - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.listView); - this.Name = "MessageLogHandler"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ListView listView; - private System.Windows.Forms.ImageList imageList; - private System.Windows.Forms.ColumnHeader sourceColumnHeader; - private System.Windows.Forms.ColumnHeader messageColumnHeader; - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.cs deleted file mode 100644 index 94867acc41..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace Cosmos.Kernel.LogTail.Handlers -{ - public partial class MessageLogHandler : LogHandler - { - public override string Title - { - get - { - return "Messages"; - } - } - - public MessageLogHandler() - { - InitializeComponent(); - } - - public override void Clear() - { - if (InvokeRequired) - { - this.BeginInvoke(new Action(Clear)); - return; - } - - listView.Items.Clear(); - } - - private delegate void Handler(LogMessage message); - - public override void HandleMessage(LogMessage message) - { - if (InvokeRequired) - { - this.BeginInvoke(new Handler(HandleMessage), message); - return; - } - - // We only handle these. - if (message.Name != "Warning" && message.Name != "Error" && message.Name != "Message") - return; - - // Create the item. - ListViewItem item = new ListViewItem(new string[] { message["Module"], message["String"] }); - item.ImageKey = message.Name.ToLowerInvariant(); - - // Add it. - listView.Items.Add(item); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.resx b/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.resx deleted file mode 100644 index 6085ffe3d8..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/MessageLogHandler.resx +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACG - DQAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABEAMAAQEBAAEgBgABEP8AIwABMQECAQMBTAFTASQBZQHSAU8BPwGsAfABTgE2AZYB6QFMATQBlgHp - AUYBOAGqAfABTAEeAWMB0gE1AQIBBAFUAQYCAQEGIAABCQIBAQoBBwIBAQckAAJFAVwBogEuAacB4AH/ - ASwBpAHfAf8BKgGhAd0B/wEoAZ4B3AH/ASYBmwHaAf8BJAGYAdkB/wEhAZMB1gH/ARwBjAHTAf8BFwGF - Ac8B/wESAX8BzAH/AQ4BeAHJAf8BCgFyAcYB/wEHAW0BwwH/AQQBaQHBAf8BMgEqAU4BokwAATEBAgED - AUwBZAFGAZMB5AGJAZcB+gH/AYQBlQL/AYEBkAH8Af8BfwGOAfoB/wF/AY0B9wH/AX8BiwHyAf8BUwFb - Ad0B/wFBAQMBCgFzHAABCQIBAQoBOAGDAT4B/wEzAXgBNgH7AQcCAQEHIAABPAGKAbQB4wG+AeMB9QH/ - AfQB/AH+Af8B7wH7Af4B/wHuAfsB/gH/Ae4B+wH+Af8B7wH8Af4B/wHvAfwB/gH/Ae8B+wH+Af8B7gH7 - Af4B/wHtAfsB/gH/Ae0B+wH+Af8B7AH7Af4B/wHyAfwB/gH/AasBzgHrAf8BHwFLAYsB2EgAATIBAgED - AU0BaQFGAYUB3wGWAaUB+gH/AVwBdgL/ATQBUgL/ATIBUQL/AS4BSwH+Af8BJwFEAfoB/wFKAWIB+QH/ - AYYBlAH0Af8BWQEzAXoB3AEyAQIBAwFNFAABCQIBAQoBQQGOAUgB/wFVAaMBXQH/AVABnwFYAf8BNAF8 - ATkB/gEHAgEBCBwAATEBEAEVAUsBYwG/AegB/wH0AfwB/gH/AbUB7wH6Af8BWQHaAfUB/wFZAdoB9QH/ - AVgB2AHzAf8BWQHXAfIB/wFZAdYB8gH/AVgB2QH0Af8BUgHYAfUB/wFPAdcB9AH/AWMB2gH2Af8B6gH7 - Af4B/wFFAZMB0gH/AS0BCgESAUtEAAExAQIBAwFLAXQBVAGVAeUBnwGtAfsB/wFpAYEC/wFCAWAC/wFC - AWAC/wE+AVsC/wE5AVcC/wE1AVIC/wEqAUgB/QH/AUwBZwH9Af8BiQGWAfYB/wFaAT0BkQHlATEBAQED - AUsMAAEJAgEBCgFKAZoBUgH/AVwBrAFlAf8BeAHKAYIB/wF1AcgBfwH/AVIBoAFaAf8BNQF9AToB/gEH - AgEBCBwAAUQBbwGQAcoBnQHXAfEB/wHnAfkB/QH/AYsB5QH4Af8BWwHbAfYB/wFcAdoB9AH/AT4BoQHV - Af8BPgGhAdUB/wFVAdYB8gH/AVMB2AH1Af8BUQHWAfQB/wHYAfYB/AH/AYgBvwHlAf8BNAE9AWUBtEgA - AWgBOgFwAdUBogGyAfwB/wF1AY8C/wFRAXIC/wFRAXAC/wFNAWsC/wFIAWYC/wFDAWAC/wE+AVwC/wE5 - AVcC/wEuAU0C/wFQAWkC/wGEAZMB+gH/AVIBJQFpAdUIAAEJAgEBCgFSAaYBWwH/AWQBtQFuAf8BfwHO - AYkB/wF8AcwBhwH/AXcBygGBAf8BdwHJAYEB/wFTAaIBWwH/ATYBfgE7Af4BBwIBAQgYAAEcAQUBBgEk - ATYBrAHeAfsB8wH7Af4B/wHDAfIB+wH/AV0B3AH2Af8BXQHaAfQB/wFlAd8B9gH/AVgBywHrAf8BVgHW - AfIB/wFVAdkB9QH/AZQB5wH4Af8B4wH0AfsB/wEbAYEBxgH5ARsBBAEFASRIAAF7AWwBuQHyAaYBuwL/ - AWEBgQL/AWEBgAL/AVwBewL/AVcBdQL/AVIBcAL/AU0BawL/AUgBZgL/AUMBYAL/AT0BWwL/ATMBUQL/ - AYcBmQL/AVMBRgGzAfIEAAEIAgEBCQFaAbABZAH/AWwBvQF3Af8BhAHSAZAB/wF7AckBhQH/AWEBsgFr - Af8BZAG0AW4B/wF5AckBgwH/AXkBywGCAf8BVAGjAV0B/wE2AX4BOgH9AQcCAQEIGAABRwFQAWcBqgGM - AdIB8AH/AeoB+wH+Af8BlAHmAfgB/wFdAdoB9AH/AUgBsQHdAf8BPgGhAdUB/wFXAdcB8gH/AV0B2wH1 - Af8B3gH4Af0B/wF+AcAB5wH/AT0BKQE8AYdMAAF8AWEBoAHpAasBvgL/AW8BjQL/AWsBiQL/AWcBgwL/ - AWEBgAL/AVwBewL/AVcBdgL/AVIBcQL/AU0BawL/AUgBZQL/AUEBXgL/AYoBmwL/AVkBQAGZAekEAAEy - AQ8BCQFGAV0BkQFSAeQBegHJAYYB/wGBAc4BjQH/AVIBogFZAfwBQwEfAREBbwFLAS8BGQGLAV0BrQFo - Af8BfQHMAYYB/wF6AcsBhQH/AVUBpAFeAf8BNgF9AToB/AEHAgEBCBQAAQsBAQECAQwBPgGbAcUB7AHI - AeoB9wH/AeYB+gH9Af8BXgHaAfQB/wE+AaEB1QH/AT4BoQHVAf8BWAHXAfIB/wHHAfMB/AH/AcAB4wH0 - Af8BMQF7Aa4B5AELAgEBDEwAAYEBaAGlAeoBsQHEAv8BeAGYAv8BdQGTAv8BcAGOAv8BawGJAv8BZwGD - Av8BYQGAAv8BXAF7Av8BVwF1Av8BUQFwAv8BSgFpAv8BkAGhAv8BXQFGAZ4B6ggAASwBCwEHATwBXgGU - AVQB5gFuAcABegH/AUUBIgETAW8IAAFMATMBHAGRAV8BrgFpAf8BfgHNAYkB/wF9Ac0BhwH/AVcBpQFg - Af8BNwF+ATsB/AEHAgEBCBQAATgBGAEeAVoBcgHIAe0B/wH5Af4C/wFfAdwB9AH/AT8BogHVAf8BPwGi - AdUB/wFdAdkB9AH/Ae0B+wH+Af8BaQG7AeUB/wE2ARQBHAFaUAABjAF7AbwB8gG4Ac0C/wF/AaAC/wF+ - AZ0C/wF6AZkC/wF1AZMC/wFwAY4C/wFrAYkC/wFnAYMC/wFiAYAC/wFbAXoC/wFRAXIC/wGYAaoC/wFl - AVYBtwHyDAABMAEOAQgBQwFBAR0BEQFlEAABTQE0ARwBkQFgAa8BagH/AYABzgGKAf8BfwHOAYkB/wFY - AaYBYQH/ATgBfwE8AfwBBwIBAQgUAAFGAX8BoQHUAakB3wH0Af8B7QH5Af0B/wE/AaMB1gH/AT8BowHW - Af8B1AH1AfwB/wGiAdcB8QH/AUABYAGCAcNUAAF7AUsBcQHUAbwBzQH8Af8BnAG7Av8BgQGlAv8BgQGi - Av8BfgGeAv8BegGZAv8BdgGTAv8BcQGOAv8BawGJAv8BYgGBAv8BegGTAv8BngGtAfsB/wFjATQBbAHU - KAABTQE0ARwBkQFhAbABawH/AYEBzwGNAf8BgAHPAYsB/wFZAacBYgH/AToBhQFBAf8BBwIBAQgQAAEj - AQgBCQEwAToBtQHkAf0B+QH9Av8BlAHpAfkB/wGeAesB+gH/AewB+gH+Af8BMAGlAdwB/AEjAQcBCQEw - VAABMQECAQMBSgGOAW4BmgHkAcEB0QH8Af8BoAG/Av8BhgGqAv8BhQGnAv8BgQGiAv8BfgGdAv8BegGY - Av8BcQGQAv8BhQGhAv8BrAG6AfsB/wF4AVgBlAHkATEBAgEDAUosAAFNATUBHAGRAWMBsgFtAf8BggHR - AY8B/wF7AcgBhQH/AVgBpgFhAf8BQgEgAQ8BexQAAUkBXQF0AbQBlAHYAfIB/wHzAfwB/gH/AecB+gH+ - Af8BjwHTAfAB/wFFATwBUAGWXAABMQECAQMBSQGJAWUBiwHfAcQB1AH8Af8BowHCAv8BiwGvAv8BiQGr - Av8BhAGnAv8BgAGgAv8BkQGuAv8BtAHDAfsB/wF6AVEBgAHbATEBAgEDAUo0AAFNATUBHQGRAWQBswFu - Af8BYAGvAWoB/wFEASIBEgF5GAABDwICARIBPwGoAdIB8gHxAfoB/QH/AdUB7wH6Af8BPAGaAccB7QEP - AgIBEmAAATEBAgEDAUoBkAFyAZoB5AHCAdMB/AH/AcEB1gL/Ab0B0QL/AbsBzwL/AbkBzgL/AbcByAH8 - Af8BmAGfAe0B/wFEAQYBCgFyPAABTQE1AR0BkQFIASgBFQF/IAABSQFBAVEBlQGFAdQB8QH/AYIB0QHw - Af8BPQEgASgBaWgAATIBAgEDAUsBfQFMAW0B0gGUAYEBugHwAYsBcQGkAekBigFwAaQB6QGMAX4BuAHw - AXYBRwFsAdIBNgEDAQQBUwEGAgEBBmQAAQMCAQEDAUgBggGiAdQBSQFtAYkBwwEDAgEBA/8AWQABQgFN - AT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEABv8CAAHwAQcB+QH/BAAB4AEHAfAB/wQA - AcABAwHgAX8EAAGAAQEBwAE/AYABAQIAAYABAQGAAR8BgAEBAgABgAEBAQABDwHAAQMCAAGAAQEBAAEH - AcABAwIAAYABAQGGAQMB4AEHAgABgAEBAc8BAQHwAQ8CAAGAAQEB/wGAAfABDwIAAYABAQH/AcAB+AEf - AgABwAEDAf8B4QH4AR8CAAHgAQcB/wHzAfwBPwIAAfABBwL/AfwBPwIABv8CAAs= - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.Designer.cs deleted file mode 100644 index 0dcff57101..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace Cosmos.Kernel.LogTail.Handlers -{ - partial class TestLogHandler - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestLogHandler)); - this.listView = new System.Windows.Forms.ListView(); - this.imageList = new System.Windows.Forms.ImageList(this.components); - this.SuspendLayout(); - // - // listView - // - this.listView.Dock = System.Windows.Forms.DockStyle.Fill; - this.listView.LargeImageList = this.imageList; - this.listView.Location = new System.Drawing.Point(0, 0); - this.listView.Name = "listView"; - this.listView.Size = new System.Drawing.Size(150, 150); - this.listView.SmallImageList = this.imageList; - this.listView.TabIndex = 0; - this.listView.UseCompatibleStateImageBehavior = false; - this.listView.View = System.Windows.Forms.View.SmallIcon; - // - // imageList - // - this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream"))); - this.imageList.TransparentColor = System.Drawing.Color.Transparent; - this.imageList.Images.SetKeyName(0, "no"); - this.imageList.Images.SetKeyName(1, "yes"); - // - // TestLogHandler - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.listView); - this.Name = "TestLogHandler"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.ListView listView; - private System.Windows.Forms.ImageList imageList; - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.cs b/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.cs deleted file mode 100644 index cd2914058e..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace Cosmos.Kernel.LogTail.Handlers -{ - public partial class TestLogHandler : LogHandler - { - private ListViewGroup _currentGroup; - - public TestLogHandler() - { - InitializeComponent(); - } - - public override string Title - { - get - { - return "Test Cases"; - } - } - - public override void Clear() - { - if (InvokeRequired) - { - this.BeginInvoke(new Action(Clear)); - return; - } - - listView.Items.Clear(); - } - - private delegate void Handler(LogMessage message); - - public override void HandleMessage(LogMessage message) - { - if (InvokeRequired) - { - this.BeginInvoke(new Handler(HandleMessage), message); - return; - } - - if (message.Name == "TestCase_Started") - { - _currentGroup = new ListViewGroup(message["Name"]); - listView.Groups.Add(_currentGroup); - } - else if (message.Name == "TestCase") - { - ListViewItem item = new ListViewItem(message["Message"]); - item.ImageKey = message["Success"]; - item.Group = _currentGroup; - listView.Items.Add(item); - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.resx b/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.resx deleted file mode 100644 index 92dae80a67..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Handlers/TestLogHandler.resx +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADG - CgAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABEAMAAQEBAAEgBgABEP8AIwABEAEBAc8B7AIBAfEB/wIBAfEB/wIBAfEB/wIBAe8B/wIBAe8B/wIB - Ae0B/wEPAQEBzQHtIAABGgEDAQIBIwE8AR8BCAF9AS4BWwEYAdsBIgFpAR0B8wEiAWcBHQHzAS4BVAEY - AdsBPAEcAQgBfQEaAQMBAgEjnAABEAEBAdIB7AEbASEB9QH/AT0BTQH5Af8BOwFKAfgB/wE5AUgB+AH/ - ATYBRgH4Af8BNQFEAfcB/wEzAUMB9wH/ARUBHAHxAf8BEgEBAcUB6BgAATIBEAEFAVMBKQFrARoB5gFD - AaABUwH/AYcBygGaAf8BmwHTAasB/wGbAdIBqwH/AYMBxwGWAf8BPgGXAU0B/wEpAVoBGQHmATIBDQEE - AVOUAAEQAQEB1AHsAR4BJAH5Af8BRQFUAfoB/wElASoB+QH/AhMB9wH/AhAB9gH/Ag0B9QH/AgoB9QH/ - ARcBHAH1Af8BNAFEAfcB/wEVARwB8QH/ARIBAQHFAegQAAEyARABBgFTASIBfwEfAfQBbgG+AYMB/wGo - AdsBtQH/AYcBzAGYAf8BZwG8AX4B/wFlAboBfQH/AYYBywGYAf8BpQHZAbQB/wFnAbcBfgH/ASEBYwEc - AfQBMgENAQQBU4wAARABAQHVAewBIAEmAfoB/wFLAVkB+wH/AUMBSAH7Af8CyQH9Af8CPAH5Af8CFAH3 - Af8CEQH2Af8CNAH3Af8CxQH9Af8BMQE2AfcB/wE1AUUB9wH/ARUBHAHyAf8BEgEBAcUB6AgAARoBBAEC - ASIBKwF6AScB5QFzAcIBhwH/AagB2wGyAf8BYQG8AXgB/wFdAboBdAH/AVoBuAFxAf8BWgG1AXAB/wFZ - AbUBcAH/AVwBtwF1Af8BpQHZAbMB/wFqAbgBgAH/ASkBWwEZAeUBGgEDAQIBIogAAgEB+wH/AVABXgH9 - Af8BMwE4AfsB/wLLAf4B/wLyAv8C6wH+Af8CPAH5Af8COgH4Af8C6gH+Af8C8QH+Af8CxQH9Af8BGQEe - AfYB/wE0AUQB9wH/AgEB7wH/CAABPQEpARABfgFNAbABZQH/AaoB3QG0Af8BZQHBAXoB/wFgAb4BcgH/ - AXYBxQGFAf8B1AHsAdkB/wGKAc0BmQH/AVcBtgFtAf8BWQG1AW8B/wFdAbcBdQH/AaYB2gG0Af8BQgGb - AU8B/wE8AR4BCAF+iAACAQH9Af8BUwFgAf0B/wIpAfwB/wJIAfwB/wLsAv8C8gL/AuwC/wLsAf4B/wLx - Av8C6gH+Af8CNQH3Af8CDAH1Af8BNgFGAfgB/wIBAe8B/wgAATIBfQEyAdsBkQHSAZ8B/wGNAdQBmgH/ - AWUBwwF1Af8BegHJAYcB/wHyAfoB9AX/Af0B/gH9Af8BhgHLAZYB/wFYAbcBbgH/AVwBuQFzAf8BhQHM - AZcB/wGHAccBmgH/AS4BWQEYAduIAAIBAf0B/wFWAWMB/gH/Ai0B/QH/AioB/AH/AkkB/AH/Au0C/wLy - Av8C8gL/AuwB/gH/AjsB+QH/AhMB9wH/AhAB9gH/ATkBSQH4Af8CAQHxAf8IAAElAaEBPwH2AaYB3AGv - Af8BcQHKAYAB/wF0AcoBgQH/AfAB+QHxBf8B6wH3Ae0F/wH7Af0B/AH/AYgBzQGWAf8BXAG5AXIB/wFo - Ab4BfgH/AaAB1wGvAf8BIQFyAR0B9ogAAgEB/QH/AVgBZQH+Af8CMQH9Af8CLgH9Af8CTAH8Af8C7QL/ - AvIC/wLyAv8C7AL/Aj4B+QH/AhcB+AH/AhQB9wH/AT0BTAH4Af8CAQHxAf8IAAErAagBRgH2AacB3QGx - Af8BcwHMAYEB/wFnAccBdAH/AbAB4QG3Af8B0gHuAdYB/wFkAcEBcQH/AbgB4wG/Bf8B+wH9AfwB/wGM - AdABmQH/AWoBwQF/Af8BoQHXAa4B/wEhAXcBHQH2iAACAQL/AVsBaAH+Af8CNAH+Af8CUQH9Af8C7QL/ - AvMC/wLtAv8C7QL/AvIC/wLsAf4B/wI/AfoB/wIYAfgB/wFAAU8B+QH/AgEB8QH/CAABPAGLAT8B2wGV - AdcBoQH/AZEB1wGbAf8BagHJAXcB/wFlAcYBcAH/AWIBxAFvAf8BYgHDAXAB/wFiAcIBcAH/AbkB5AHA - Bf8B4wH0AeYB/wGLAdEBmQH/AYsBzgGdAf8BLwFlARgB24gAAgEC/wFcAWkC/wFEAUgB/gH/As8C/wLz - Av8C7QL/Ak0B/AH/AksB/AH/AuwC/wLyAv8CygH+Af8BKwEwAfoB/wFDAVIB+gH/AgEB8wH/CAABQgEv - ARcBfgFYAb8BcQH/Aa8B4QG3Af8BbgHMAXsB/wFpAcgBcwH/AWYBxwFxAf8BZAHFAW8B/wFjAcQBbwH/ - AWQBxAFyAf8BtgHjAb4B/wFwAccBfwH/AawB3wG1Af8BSQGpAV8B/wE9ASQBCgF+iAABEQEBAdkB6wEn - ASwC/wFeAWsC/wFZAVwC/wLPAv8CUwH+Af8CMAH9Af8CLQH9Af8CTAH8Af8CzAH+Af8BSQFNAfsB/wFK - AVgB+wH/AR4BJAH5Af8BEQEBAdAB6wgAARoBBAEDASIBPwGaAUUB5QGAAc4BkAH/Aa4B4QG1Af8BbgHM - AXsB/wFrAcoBdwH/AWkByAFzAf8BaQHIAXUB/wFpAcgBdgH/AWwByQF6Af8BrAHfAbQB/wF3AcQBiQH/ - ASsBegElAeUBGgEEAQIBIowAAREBAQHZAesBJwEsAv8BXgFrAv8BRAFIAv8CNQH+Af8CMwH+Af8CMQH9 - Af8CLgH9Af8BOQE9AfwB/wFQAV4B/AH/ASABJgH6Af8BEQEBAdIB6xAAATUBFgELAVMBOQGwAU4B9AGA - Ac4BkAH/Aa8B4QG3Af8BkgHYAZ0B/wF4Ac4BgwH/AXgBzgGDAf8BkgHYAZ0B/wGuAeEBtQH/AXkByAGL - Af8BJAGQAS8B9AEyARIBBwFTlAABEQEBAdkB6wEnASwC/wFdAWoC/wFcAWkC/wFbAWgB/gH/AVkBZgH+ - Af8BVwFkAf4B/wFVAWIB/gH/ASMBKAH8Af8BCwEBAeIB8hgAATYBFgELAVMBQAGeAUkB5gFaAcIBdQH/ - AZYB1wGjAf8BpQHcAa4B/wGlAdwBrgH/AZUB1gGhAf8BUQG5AWsB/wEtAYsBNwHmATIBEwEIAVOcAAEQ - AQEB2wHsAgEC/wIBAv8CAQL/AgEB/QH/AgEB/QH/AgEB/QH/ARABAQHZAewgAAEbAQUBAwEjAUQBMAEX - AX0BRQGQAUQB2wE3AawBTQHzATMBqgFLAfMBOgGJAT0B2wFAAS0BFQF9ARsBBAEDASP/AJEAAUIBTQE+ - BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAT/BAAB8AEPAfABDwQAAeABBwHgAQcEAAHA - AQMBwAEDBAABgAEBAYABAQQAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAGA - AQEBgAEBBAABgAEBAYABAQQAAYABAQGAAQEEAAHAAQMBwAEDBAAB4AEHAeABBwQAAfABDwHwAQ8EAAT/ - BAAL - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.LogTail/MainForm.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/MainForm.Designer.cs deleted file mode 100644 index b2fceb1ea3..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/MainForm.Designer.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace Cosmos.Kernel.LogTail -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.tabControl = new System.Windows.Forms.TabControl(); - this.SuspendLayout(); - // - // tabControl - // - this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControl.Location = new System.Drawing.Point(0, 0); - this.tabControl.Name = "tabControl"; - this.tabControl.SelectedIndex = 0; - this.tabControl.Size = new System.Drawing.Size(292, 270); - this.tabControl.TabIndex = 0; - // - // MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(292, 270); - this.Controls.Add(this.tabControl); - this.Name = "MainForm"; - this.Text = "Cosmos Log Tail"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.TabControl tabControl; - } -} - diff --git a/source/Archive/Cosmos.Kernel.LogTail/MainForm.cs b/source/Archive/Cosmos.Kernel.LogTail/MainForm.cs deleted file mode 100644 index b3597a2917..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/MainForm.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; -using System.IO; -using System.Xml; -using Cosmos.Kernel.LogTail.Handlers; - -namespace Cosmos.Kernel.LogTail -{ - public partial class MainForm : Form - { - private Handlers.LogHandler[] _handlers; - private string _file; - private FileSystemWatcher _watcher; - private bool _watching = true; - private long _count = 0; - private FileStream _fs; - - public MainForm() - { - InitializeComponent(); - BuildTabs(); - } - - public MainForm(string file) : this() - { - _file = Path.GetFullPath(file); - string dir = Path.GetDirectoryName(_file); - string pattern = Path.GetFileName(_file); - - _watcher = new FileSystemWatcher(dir, pattern); - _watcher.Changed += new FileSystemEventHandler(_watcher_Changed); - _watcher.Created += new FileSystemEventHandler(_watcher_Created); - _watcher.Deleted += new FileSystemEventHandler(_watcher_Deleted); - _watcher.EnableRaisingEvents = true; - - if (File.Exists(_file)) - CreateReader(); - } - - private void CreateReader() - { - - _fs = new ErrorStrippingFileStream(_file); - - _watching = true; - _watcher_Changed(this, new FileSystemEventArgs(WatcherChangeTypes.All, "", "")); - } - - private XmlReader CreateXmlReader() - { - XmlReaderSettings settings = new XmlReaderSettings(); - settings.ConformanceLevel = ConformanceLevel.Fragment; - - return XmlTextReader.Create(_fs, settings); - } - - void _watcher_Deleted(object sender, FileSystemEventArgs e) - { - _watching = false; - _fs.Close(); - foreach (LogHandler handler in this._handlers) - handler.Clear(); - } - - void _watcher_Created(object sender, FileSystemEventArgs e) - { - CreateReader(); - } - - void _watcher_Changed(object sender, FileSystemEventArgs e) - { - if (_watching) - { - XmlReader _reader = CreateXmlReader(); - bool reading = true; - while (reading) - { - try - { - reading = true; - reading = _reader.Read(); - } - catch { } - - LogMessage message = new LogMessage(_reader.Name); - for (int i = 0; i < _reader.AttributeCount; i++) - { - _reader.MoveToAttribute(i); - message.AddAttribute(_reader.Name, _reader.Value); - } - foreach (LogHandler handler in this._handlers) - handler.HandleMessage(message); - } - } - } - - private void BuildTabs() - { - _handlers = Handlers.LogHandler.GetHandlers(); - foreach (Handlers.LogHandler handler in _handlers) - { - TabPage page = new TabPage(); - page.Text = handler.Title; - page.Controls.Add(handler); - handler.Dock = DockStyle.Fill; - handler.Clear(); - tabControl.TabPages.Add(page); - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/MainForm.resx b/source/Archive/Cosmos.Kernel.LogTail/MainForm.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/MainForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.LogTail/Program.cs b/source/Archive/Cosmos.Kernel.LogTail/Program.cs deleted file mode 100644 index 2e12418852..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Program.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Forms; - -namespace Cosmos.Kernel.LogTail -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm(args[0])); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Kernel.LogTail/Properties/AssemblyInfo.cs deleted file mode 100644 index 2851af3b09..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/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("Cosmos.Kernel.LogTail")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.Kernel.LogTail")] -[assembly: AssemblyCopyright("Copyright © 2008")] -[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("3b728cd0-b173-4666-9019-81f99450017c")] - -// 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/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.Designer.cs deleted file mode 100644 index dba572b41b..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1433 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Cosmos.Kernel.LogTail.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Cosmos.Kernel.LogTail.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.resx b/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.resx deleted file mode 100644 index af7dbebbac..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.LogTail/Properties/Settings.Designer.cs b/source/Archive/Cosmos.Kernel.LogTail/Properties/Settings.Designer.cs deleted file mode 100644 index ff52391138..0000000000 --- a/source/Archive/Cosmos.Kernel.LogTail/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.1433 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Cosmos.Kernel.LogTail.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/CPUID.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/CPUID.cs deleted file mode 100644 index 4604860a5d..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/CPUID.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; -using Assembler = Cosmos.Assembler; -using CPUAll = Cosmos.Assembler; -using CPUx86 = Cosmos.Assembler.x86; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class CPUIDSupport: AssemblerMethod { - //; Method 'System.UInt32 Cosmos.Kernel.Plugs.CPU.HasCPUIDSupport()' - //; Locals: - //; (0) 0 4 ebp - 04h (Type = System.UInt32) - //; Arguments: - //; (none) - //; ReturnSize: 4 - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - /*XS.Pushfd(); - new CPUx86.Pop("eax"); - new CPUx86.Move("ecx", "eax"); - - new CPUx86.Xor("eax", "200000h"); - new CPUx86.Push("eax"); - XS.Popfd(); - - XS.Pushfd(); - new CPUx86.Pop("ebx"); - new CPUx86.Xor("eax", "ebx"); - new CPUx86.And("eax", "200000h"); - new CPUx86.JumpIfZero(".not"); - - new CPUx86.Move("eax", "1"); - new CPUx86.Jump(".return"); - - new CPUAll.Label(".not"); - new CPUx86.Xor("eax", "eax"); - - new CPUAll.Label(".return"); - new CPUx86.Push("ecx"); - XS.Popfd(); - - new CPUx86.Push("eax");*/ - XS.Push(0); - } - } - public class GetCPUIDInternal: AssemblerMethod { - // ; (No Type Info available) - //; Method 'System.Void Cosmos.Kernel.Plugs.CPU.GetCPUId(System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32&, System.UInt32)' - //; Locals: - //; (none) - //; Arguments: - //; (0) 16 4 ebp + 018h (Type = System.UInt32&) - //; (1) 12 4 ebp + 014h (Type = System.UInt32&) - //; (2) 8 4 ebp + 010h (Type = System.UInt32&) - //; (3) 4 4 ebp + 0Ch (Type = System.UInt32&) - //; (4) 0 4 ebp + 08h (Type = System.UInt32) - //; ReturnSize: 0 - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - new CPUx86.ClrInterruptFlag(); - XS.Mov(XSRegisters.EAX, XSRegisters.EBP, sourceDisplacement: 8); - XS.CpuId(); - XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x18); - XS.Mov(XSRegisters.EDI, XSRegisters.EDX, destinationIsIndirect: true); - XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x14); - XS.Mov(XSRegisters.EDI, XSRegisters.ECX, destinationIsIndirect: true); - XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0x10); - XS.Mov(XSRegisters.EDI, XSRegisters.EBX, destinationIsIndirect: true); - XS.Mov(XSRegisters.EDI, XSRegisters.EBP, sourceDisplacement: 0xC); - XS.Mov(XSRegisters.EDI, XSRegisters.EAX, destinationIsIndirect: true); - XS.Sti(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisableInterrupts.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisableInterrupts.cs deleted file mode 100644 index be8ee3a10f..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisableInterrupts.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class DisableInterrupts: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - new CPUx86.ClrInterruptFlag(); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePSE.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePSE.cs deleted file mode 100644 index f9579b94f4..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePSE.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; -using Assembler = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class ASMDisablePSE: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR4); - XS.And(XSRegisters.EAX, 0xFFFFFFEF); - XS.Mov(XSRegisters.CR4, XSRegisters.CPUx86.Registers.EAX); - - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePaging.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePaging.cs deleted file mode 100644 index 17e0272a8e..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/DisablePaging.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; -using Assembler = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class ASMDisablePaging: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR0); - XS.And(XSRegisters.EAX, 0x7FFFFFFF); - XS.Mov(XSRegisters.CR0, XSRegisters.CPUx86.Registers.EAX); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnableInterrupts.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnableInterrupts.cs deleted file mode 100644 index 87ae712fc5..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnableInterrupts.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; - -namespace Cosmos.Kernel.Plugs.Assemblers -{ - public class EnableInterrupts : AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.Sti(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePSE.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePSE.cs deleted file mode 100644 index e8255a79b9..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePSE.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; -using Assembler = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class ASMEnablePSE: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR4); - XS.Or(XSRegisters.EAX, 0x00000010); - XS.Mov(XSRegisters.CR4, XSRegisters.CPUx86.Registers.EAX); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePaging.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePaging.cs deleted file mode 100644 index 007ff681c9..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/EnablePaging.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; -using Assembler = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class ASMEnablePaging: AssemblerMethod { - - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, XSRegisters.CPUx86.Registers.CR0); - XS.Or(XSRegisters.EAX, 0x80000000); - XS.Mov(XSRegisters.CR0, XSRegisters.CPUx86.Registers.EAX); - } - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetAmountOfRAM.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetAmountOfRAM.cs deleted file mode 100644 index 69a5841225..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetAmountOfRAM.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; -using Assembler = Cosmos.Assembler; -using CPUx86 = Cosmos.Assembler.x86; -using CPUAll = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class GetAmountOfRAM: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, CPUAll.ElementReference.New("MultiBootInfo_Memory_High"), sourceIsIndirect: true); - XS.Xor(XSRegisters.EDX, XSRegisters.CPUx86.Registers.EDX); - XS.Mov(XSRegisters.ECX, 1024); - XS.Divide(XSRegisters.ECX); - XS.Add(XSRegisters.EAX, 1); - XS.Push(XSRegisters.EAX); - } - - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetCurrentESP.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetCurrentESP.cs deleted file mode 100644 index 2845beed1b..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetCurrentESP.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class GetCurrentESP: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Push(XSRegisters.ESP); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetMBIAddress.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetMBIAddress.cs deleted file mode 100644 index c19f3adfa9..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/GetMBIAddress.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Assembler.x86; -using Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers -{ - public class GetMBIAddress: AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.Push(Cosmos.Assembler.ElementReference.New("MultiBootInfo_Structure"), isIndirect: true); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/InitFloat.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/InitFloat.cs deleted file mode 100644 index 87225bb553..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/InitFloat.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; -using Assembler = Cosmos.Assembler; -using CPUAll = Cosmos.Assembler; -using CPUx86 = Cosmos.Assembler.x86; -using System.Collections.Generic; - -namespace Cosmos.Kernel.Plugs.Assemblers -{ - public class InitFloat : AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.FloatInit(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/SetPageDirectory.cs b/source/Archive/Cosmos.Kernel.Plugs/Assemblers/SetPageDirectory.cs deleted file mode 100644 index 9662580bd4..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Assemblers/SetPageDirectory.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; -using CPUx86 = Cosmos.Assembler.x86; -using Assembler = Cosmos.Assembler; - -namespace Cosmos.Kernel.Plugs.Assemblers { - public class ASMSetPageDirectory: AssemblerMethod { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - XS.Mov(XSRegisters.EAX, XSRegisters.ESP, sourceDisplacement: 0x8); - XS.Mov(XSRegisters.CR3, XSRegisters.CPUx86.Registers.EAX); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Cosmos.Kernel.Plugs.csproj b/source/Archive/Cosmos.Kernel.Plugs/Cosmos.Kernel.Plugs.csproj deleted file mode 100644 index 7c32738c81..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Cosmos.Kernel.Plugs.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {B168BEDD-C6A6-4E7C-B9A5-0144286E9E42} - Library - Properties - Cosmos.Kernel.Plugs - Cosmos.Kernel.Plugs - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - {1116130E-28E0-428A-A597-F4B3B676C0CA} - XSharp.Assembler - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - Cosmos.IL2CPU.Plugs - - - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} - Cosmos.IL2CPU - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - {CE50FE98-9AC4-4B4D-ADC7-31F6DCD28755} - Cosmos.Hardware2 - - - {A1F83D9F-2D44-4264-A08B-416797123018} - Cosmos.Kernel - - - - - diff --git a/source/Archive/Cosmos.Kernel.Plugs/GCImplementationImpl.cs b/source/Archive/Cosmos.Kernel.Plugs/GCImplementationImpl.cs deleted file mode 100644 index 6fd7b2463c..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/GCImplementationImpl.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Kernel.Plugs -{ - [Plug(TargetName = "Cosmos.IL2CPU.GCImplementation, Cosmos.IL2CPU")] - public static class GCImplementationImpl - { - - public static uint AllocNewObject(uint aSize) - { - return GC.AllocNewObject(aSize); - } - - public static void IncRefCount(uint aObject) - { - GC.IncRefCount(aObject); - } - public static void DecRefCount(uint aObject) - { - GC.DecRefCount(aObject); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/HeapImpl.cs b/source/Archive/Cosmos.Kernel.Plugs/HeapImpl.cs deleted file mode 100644 index 08ef23d926..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/HeapImpl.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Core; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Kernel.Plugs { - [Plug(TargetName = "Cosmos.IL2CPU.RuntimeEngine, Cosmos.IL2CPU")] - public static class HeapImpl { - //[PlugMethod(Signature = "System_UInt32__Indy_IL2CPU_RuntimeEngine_Heap_AllocNewObject_System_UInt32_")] - public static uint Heap_AllocNewObject(uint aSize) { - return Heap.MemAlloc(aSize); - } - - //[PlugMethod(Signature = "System_UInt32__Indy_IL2CPU_RuntimeEngine_Heap_Free_System_UInt32_")] - public static void Heap_Free(uint aObject) { - //Heap.MemFree(aObject); - } - } -} diff --git a/source/Archive/Cosmos.Kernel.Plugs/Interlocked.cs b/source/Archive/Cosmos.Kernel.Plugs/Interlocked.cs deleted file mode 100644 index cf8aeaf015..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/Interlocked.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Kernel.Plugs -{ - [Plug(Target = typeof(System.Threading.Interlocked))] - public static class Interlocked - { - public static object CompareExchange(ref object location1, object value, object comparand) - { - object xResult = null; - CPU.DisableInterrupts(); - try - { - xResult = location1; - if (Object.ReferenceEquals(location1, comparand)) - { - location1 = value; - } - } - finally - { - CPU.EnableInterrupts(); - } - return xResult; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/PagingUtilityImpl.cs b/source/Archive/Cosmos.Kernel.Plugs/PagingUtilityImpl.cs deleted file mode 100644 index 4b4178b1e5..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/PagingUtilityImpl.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Kernel.Plugs -{ - [Plug(Target=typeof(Kernel.PagingUtility))] - public class PagingUtility - { - [PlugMethod(Assembler=typeof(Assemblers.ASMEnablePaging))] - public static void EnablePaging() - { - //Assembler - } - [PlugMethod(Assembler=typeof(Assemblers.ASMDisablePaging))] - public static void DisablePaging() - { - //Assembler - } - - [PlugMethod(Assembler=typeof(Assemblers.ASMEnablePSE))] - public static void EnablePSE() - { - //Assembler - } - [PlugMethod(Assembler=typeof(Assemblers.ASMDisablePSE))] - public static void DisablePSE() - { - //Assembler - } - - [PlugMethod(Assembler=typeof(Assemblers.ASMSetPageDirectory))] - public static void SetPageDirectory(uint Address) - { - //Assembler - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel.Plugs/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Kernel.Plugs/Properties/AssemblyInfo.cs deleted file mode 100644 index 6c43498b78..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/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("Cosmos.Kernel.Plugs")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Kernel.Plugs")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("f88117d8-002b-4f5b-9255-e0939a6a3b85")] - -// 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/source/Archive/Cosmos.Kernel.Plugs/ThreadImpl.cs b/source/Archive/Cosmos.Kernel.Plugs/ThreadImpl.cs deleted file mode 100644 index a70b573e32..0000000000 --- a/source/Archive/Cosmos.Kernel.Plugs/ThreadImpl.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.IL2CPU.Plugs; -using System.Threading; - -namespace Cosmos.Kernel.Plugs { - [Plug(Target=typeof(System.Threading.Thread))] - public static class ThreadImpl { - private static bool running = true; - - public static IntPtr InternalGetCurrentThread() { - return IntPtr.Zero; - - } - public static void Sleep(int millisecondsTimeout) - { - // Cosmos.HAL.Global.Sleep((uint) millisecondsTimeout); - Kernel.CPU.Halt(); - } - //public static void Start() - //{ - // if (SetMethod == null) - // throw new Exception("SetMethod can't equal null"); - - // do - // { - // SetMethood(); - // } while (running); - //} - - public delegate void SetMethod(); - - //public static void Stop() - //{ - // running = false; - //} - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/AddressSpace.cs b/source/Archive/Cosmos.Kernel/AddressSpace.cs deleted file mode 100644 index 15da355487..0000000000 --- a/source/Archive/Cosmos.Kernel/AddressSpace.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace Cosmos.Kernel -{ - public abstract class AddressSpace - { - public UInt32 Offset; - public UInt32 Size; - - public AddressSpace( UInt32 offset, UInt32 size ) - { - Offset = offset; - Size = size; - } - - /// - /// Reads 8 bits from a given offset if it within the valid range - /// - /// The offset to read from - /// 8 bits of data read - public abstract byte Read8( UInt32 offset ); - - /// - /// Reads 16 bits from a given offset if it within the valid range - /// - /// The offset to read from - /// 16 bits of data read - public abstract UInt16 Read16( UInt32 offset ); - - /// - /// Reads 32 bits from a given offset if it within the valid range - /// - /// The offset to read from - /// 32 bits of data read - public abstract UInt32 Read32( UInt32 offset ); - - /// - /// Reads 64 bits from a given offset if it within the valid range - /// - /// The offset to read from - /// 32 bits of data read - public abstract UInt64 Read64( UInt32 offset ); - - /// - /// Reads 8 bits from a given offset. The offset is not checked. Use with caution - /// - /// The offset to read from - /// 8 bits of data read - public abstract byte Read8Unchecked( UInt32 offset ); - - /// - /// Reads 16 bits from a given offset. The offset is not checked. Use with caution - /// - /// The offset to read from - /// 16 bits of data read - public abstract UInt16 Read16Unchecked( UInt32 offset ); - - /// - /// Reads 32 bits from a given offset. The offset is not checked. Use with caution - /// - /// The offset to read from - /// 32 bits of data read - public abstract UInt32 Read32Unchecked( UInt32 offset ); - - /// - /// Reads 64 bits from a given offset. The offset is not checked. Use with caution - /// - /// The offset to read from - /// 64 bits of data read - public abstract UInt64 Read64Unchecked( UInt32 offset ); - - /// - /// Writes 8 bits from a given offset if it is within the valid range. - /// - /// The offset to write to - /// The data to write - public abstract void Write8( UInt32 offset, byte value ); - - /// - /// Writes 16 bits from a given offset if it is within the valid range. - /// - /// The offset to write to - /// The data to write - public abstract void Write16( UInt32 offset, UInt16 value ); - - /// - /// Writes 32 bits from a given offset if it is within the valid range. - /// - /// The offset to write to - /// The data to write - public abstract void Write32( UInt32 offset, UInt32 value ); - - /// - /// Writes 64 bits from a given offset if it is within the valid range. - /// - /// The offset to write to - /// The data to write - public abstract void Write64( UInt32 offset, UInt64 value ); - - /// - /// Writes 8 bits from a given offset. The offset is not checked. Use with caution. - /// - /// The offset to write to - /// The data to write - public abstract void Write8Unchecked( UInt32 offset, byte value ); - - /// - /// Writes 16 bits from a given offset. The offset is not checked. Use with caution. - /// - /// The offset to write to - /// The data to write - public abstract void Write16Unchecked( UInt32 offset, UInt16 value ); - - /// - /// Writes 32 bits from a given offset. The offset is not checked. Use with caution. - /// - /// The offset to write to - /// The data to write - public abstract void Write32Unchecked( UInt32 offset, UInt32 value ); - - /// - /// Writes 64 bits from a given offset. The offset is not checked. Use with caution. - /// - /// The offset to write to - /// The data to write - public abstract void Write64Unchecked( UInt32 offset, UInt64 value ); - } -} diff --git a/source/Archive/Cosmos.Kernel/CPU.cs b/source/Archive/Cosmos.Kernel/CPU.cs deleted file mode 100644 index b33c2f85c3..0000000000 --- a/source/Archive/Cosmos.Kernel/CPU.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Kernel { - public class CPU { - - public static void ClearInterruptsTable() { - //plugged - } - - // Amount of RAM in MB's. - protected static uint GetAmountOfRAM() { return 0; } // Plugged - protected static uint GetEndOfKernel() { return 0; } // Plugged - public static void UpdateIDT(bool aEnableInterruptsImmediately) { } // Plugged - public static void InitFloat() { } // Plugged - - public static uint AmountOfMemory { - get { - return GetAmountOfRAM(); - } - } - - public static uint EndOfKernel { - get { - return GetEndOfKernel(); - } - } - - // Plugged - public static void ZeroFill(uint aStartAddress, uint aLength) { - } - - // Plugged - public static uint GetCurrentESP() { - return 0; - } - - // Plugged - public static uint GetEndOfStack() { - return 0; - } - - // Plugged - public static void DoTest() - { - } - - - - private static string CPUIDuint2string(uint a) - { - return new string(new char[] { (char)(a), (char)(a >> 8), (char)(a >> 16), (char)(a >> 24) }); - } - - private static bool HaveCheckedCPUID = false; - private static bool HasCPUID = false; - private static string CPUString = null; - - public static string CPUVendor - { - get - { - if (CPUString == null) - { - if (CPUIDSupport) - { - uint d,c,b,a; - GetCPUId(out d, out c, out b, out a, 0); - CPUString = CPUIDuint2string(b) + CPUIDuint2string(d) + CPUIDuint2string(c); - } - else - { - CPUString = string.Empty; - } - } - return CPUString; - } - } - - public static bool CPUIDSupport - { - get - { - if (!HaveCheckedCPUID) - { - HaveCheckedCPUID = true; - HasCPUID = (HasCPUIDSupport() != 0); - } - return HasCPUID; - } - } - - // Plugged - public static uint HasCPUIDSupport() - { - return 0; - } - - // Plugged - public static void GetCPUId(out uint d, out uint c, out uint b, out uint a, uint v) - { - d = 0; - c = 0; - b = 0; - a = 0; - } - - /// - /// Forced simple reboot of PC - /// - public static void Reboot() - { - // Disable all interrupts - DisableInterrupts(); - - byte temp; - - // Clear all keyboard buffers - do - { - temp = CPUBus.Read8(0x64); // Empty user data - if ((temp & 0x01) != 0) - { - CPUBus.Read8(0x60); // Empty keyboard data - } - } while ((temp & 0x02) != 0); - - CPUBus.Write8(0x64, 0xFE); // Pulse CPU Reset line - Halt(); // If it didn't work, Halt the CPU - } - - //Plugged - public static void Halt() - { - - } - - public static void DisableInterrupts() { - // plugged - } - - public static void EnableInterrupts() - { - // plugged - } - - // plugged - public static void Interrupt30(ref uint aEAX, ref uint aEBX, ref uint aECX, ref uint aEDX) { - aEAX = 0; - } - - // plugged - public static uint GetMBIAddress() - { - return 0; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/CPUBus.cs b/source/Archive/Cosmos.Kernel/CPUBus.cs deleted file mode 100644 index 8c608d12ff..0000000000 --- a/source/Archive/Cosmos.Kernel/CPUBus.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Kernel { - public class CPUBus { - - // plugged - public static void Write8(UInt16 aPort, byte aData) { } - // plugged - public static void Write16(UInt16 aPort, UInt16 aData) { } - // plugged - public static void Write32(UInt16 aPort, UInt32 aData) { } - - // plugged - public static byte Read8(UInt16 aPort) { return 0; } - // plugged - public static UInt16 Read16(UInt16 aPort) { return 0; } - // plugged - public static UInt32 Read32(UInt16 aPort) { return 0; } - } -} diff --git a/source/Archive/Cosmos.Kernel/Cosmos.Kernel.csproj b/source/Archive/Cosmos.Kernel/Cosmos.Kernel.csproj deleted file mode 100644 index 38fd936af0..0000000000 --- a/source/Archive/Cosmos.Kernel/Cosmos.Kernel.csproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {A1F83D9F-2D44-4264-A08B-416797123018} - Library - Properties - Cosmos.Kernel - Cosmos.Kernel - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - {5AC4773C-CB4E-4CD9-8D50-02E10A07DEE6} - Cosmos.Core - - - - diff --git a/source/Archive/Cosmos.Kernel/Extension/Binary.cs b/source/Archive/Cosmos.Kernel/Extension/Binary.cs deleted file mode 100644 index 0462bd4bcb..0000000000 --- a/source/Archive/Cosmos.Kernel/Extension/Binary.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Kernel { - public static class BinaryExtension { - #region Extension methods - - public static string ToBinary(this byte n) - { - return ConvertToBinary((UInt32)n); - } - - public static string ToBinary(this byte n, int width) - { - return ConvertToBinary((UInt32)n).PadLeft(width, '0'); - } - - public static string ToBinary(this byte n, int width, bool prefix, bool suffix) - { - string bin = ""; - if (prefix) - bin += GetPrefix(); - - bin += ConvertToBinary((UInt32)n).PadLeft(width, '0'); - - if (suffix) - bin = bin + GetSuffix(); - - return bin; - } - - public static string ToBinary(this UInt16 n) - { - return ConvertToBinary((UInt32)n); - } - - public static string ToBinary(this UInt16 n, int width) - { - return ConvertToBinary((UInt32)n).PadLeft(width, '0'); - } - - public static string ToBinary(this int n) - { - return ConvertToBinary((UInt32)n); - } - - public static string ToBinary(this int n, int width) - { - return ConvertToBinary((UInt32)n).PadLeft(width, '0'); - } - - public static string ToBinary(this UInt32 n) - { - return ConvertToBinary(n); - } - - public static string ToBinary(this UInt32 n, int width) - { - return ConvertToBinary(n).PadLeft(width, '0'); - } - - public static UInt32 FromBinary(this string n) - { - return ConvertFromBinary(n); - } - - #endregion - - #region Prefix/Suffix - - private static string GetPrefix() - { - return "0b"; - } - - private static string GetSuffix() - { - return "b"; - } - - #endregion - - #region Conversion - - public static string ConvertToBinary(UInt32 d) - { - if (d == 0) - return "0"; - - string bin = string.Empty; - - while (d > 0) - { - if (d.IsOdd()) - { - bin = "1" + bin; - d = d - 1; - } - else - { - bin = "0" + bin; - } - - d = d / 2; - } - - return bin; - } - - public static UInt32 ConvertFromBinary(string bin) - { - int multiplier = 1; - int value = 0; - - for (int i = bin.Length - 1; i >= 0; i--) - { - if (bin[i].ToString() == "1") - value += multiplier; - - multiplier *= 2; - } - - return (UInt32)value; - } - - private static bool IsOdd(this UInt32 n) - { - if ((n % 2) > 0) - return true; - else - return false; - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Kernel/GC.cs b/source/Archive/Cosmos.Kernel/GC.cs deleted file mode 100644 index 6ec83f606b..0000000000 --- a/source/Archive/Cosmos.Kernel/GC.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Cosmos.Core; - -namespace Cosmos.Kernel -{ - public class GC - { - public static uint AllocNewObject(uint aSize) - { - return Heap.MemAlloc(aSize); - } - public static unsafe void IncRefCount(uint aObject) - { - //throw new NotImplementedException(); - } - public static unsafe void DecRefCount(uint aObject) - { - //throw new NotImplementedException(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel/Global.cs b/source/Archive/Cosmos.Kernel/Global.cs deleted file mode 100644 index 26a39be0ac..0000000000 --- a/source/Archive/Cosmos.Kernel/Global.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Kernel { - public class Global { - public static void Init() { - } - } -} diff --git a/source/Archive/Cosmos.Kernel/Heap.cs b/source/Archive/Cosmos.Kernel/Heap.cs deleted file mode 100644 index fd1ef9ff4d..0000000000 --- a/source/Archive/Cosmos.Kernel/Heap.cs +++ /dev/null @@ -1,343 +0,0 @@ -//using System; - -//namespace Cosmos.Kernel { -// public static class Heap { -// public static bool EnableDebug = true; -// private static uint mStart; -// private static uint mStartAddress; -// private static uint mLength; -// private static uint mEndOfRam; - -// private static void Initialize(uint aStartAddress, uint aEndOfRam) { -// mStart = mStartAddress = aStartAddress + (4 - (aStartAddress % 4)); -// mLength = aEndOfRam - aStartAddress; -// mLength = (mLength / 4) * 4; -// mStartAddress += 1024; -// mEndOfRam = aEndOfRam; -// mStartAddress = (mStartAddress / 4) * 4; -// mLength -= 1024; -// ClearMemory(aStartAddress, mLength); -// UpdateDebugDisplay(); -// } - -// private static void WriteNumber(uint aNumber, byte aBits) { -// uint xValue = aNumber; -// byte xCurrentBits = aBits; -// Console.Write("0x"); -// while (xCurrentBits >= 4) { -// xCurrentBits -= 4; -// byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF); -// string xDigitString = null; -// switch (xCurrentDigit) { -// case 0: -// xDigitString = "0"; -// goto default; -// case 1: -// xDigitString = "1"; -// goto default; -// case 2: -// xDigitString = "2"; -// goto default; -// case 3: -// xDigitString = "3"; -// goto default; -// case 4: -// xDigitString = "4"; -// goto default; -// case 5: -// xDigitString = "5"; -// goto default; -// case 6: -// xDigitString = "6"; -// goto default; -// case 7: -// xDigitString = "7"; -// goto default; -// case 8: -// xDigitString = "8"; -// goto default; -// case 9: -// xDigitString = "9"; -// goto default; -// case 10: -// xDigitString = "A"; -// goto default; -// case 11: -// xDigitString = "B"; -// goto default; -// case 12: -// xDigitString = "C"; -// goto default; -// case 13: -// xDigitString = "D"; -// goto default; -// case 14: -// xDigitString = "E"; -// goto default; -// case 15: -// xDigitString = "F"; -// goto default; -// default: -// if (xDigitString == null) { -// System.Diagnostics.Debugger.Break(); -// } -// Console.Write(xDigitString); -// break; -// } -// } -// } - -// private static bool mDebugDisplayInitialized = false; - -// // this method displays the used/total memory of the heap on the first line of the text screen -// private static void UpdateDebugDisplay() { -// //if (EnableDebug) -// //{ -// // if (!mDebugDisplayInitialized) -// // { -// // mDebugDisplayInitialized = true; -// // int xOldPositionLeft = Console.CursorLeft; -// // int xOldPositionTop = Console.CursorTop; -// // Console.CursorLeft = 0; -// // Console.CursorTop = 0; -// // Console.Write("[Heap Usage: "); -// // WriteNumber(mStartAddress, -// // 32); -// // Console.Write("/"); -// // WriteNumber(mEndOfRam, -// // 32); -// // Console.Write("] bytes"); -// // while (Console.CursorLeft < (Console.WindowWidth-1)) -// // { -// // Console.Write(" "); -// // } -// // Console.CursorLeft = xOldPositionLeft; -// // Console.CursorTop = xOldPositionTop; -// // } -// // else -// // { -// // int xOldPositionLeft = Console.CursorLeft; -// // int xOldPositionTop = Console.CursorTop; -// // Console.CursorLeft = 13; -// // Console.CursorTop = 0; -// // WriteNumber(mStartAddress, -// // 32); -// // Console.CursorLeft = xOldPositionLeft; -// // Console.CursorTop = xOldPositionTop; -// // } -// //} -// } - -// private static void ClearMemory(uint aStartAddress, uint aLength) { -// CPU.ZeroFill(aStartAddress, aLength); -// } - -// private static bool mInited; -// public static uint MemAlloc(uint aLength) { -// if (!mInited) { -// mInited = true; -// Initialize(CPU.EndOfKernel, (CPU.AmountOfMemory * 1024 * 1024) - 1024); -// } - -// uint xTemp = mStartAddress; - -// if ((xTemp + aLength) > (mStart + mLength)) { -// Console.WriteLine("Too large memory block allocated!"); -// WriteNumber(aLength, 32); -// while (true) -// ; -// } -// mStartAddress += aLength; -// UpdateDebugDisplay(); -// return xTemp; -// } - -// public static void MemFree(uint aPointer) { -// } - -// } - -// #region old -// // public unsafe static class Heap { -// // private enum MemoryBlockState: byte { -// // Free, -// // Used, -// // EndOfMemory -// // } -// // private unsafe struct MemoryBlock { -// // public MemoryBlockState State; -// // public MemoryBlock* Next; -// // public byte FirstByte; -// // } -// // private static uint mStart; -// // private static uint mStartAddress; -// // // private static uint mCurrentAddress = mStartAddress; -// // private static uint mLength; -// // private static MemoryBlock* mFirstBlock; -// // //private const uint DefaultStartAddress = 4 * 1024 * 1024; -// // //private const uint DefaultMaxMemory = 32 * 1024 * 1024; -// // -// // private static void ClearMemory(uint aStartAddress, uint aLength) { -// // //int xStart = (RTC.GetMinutes() * 60) + RTC.GetSeconds(); -// // CPU.ZeroFill(aStartAddress, aLength); -// // //int xEnd = (RTC.GetMinutes() * 60) + RTC.GetSeconds(); -// // //int xDiff = xEnd - xStart; -// // //Console.Write("Time to clear "); -// // //Hardware.Storage.ATAOld.WriteNumber((uint)xDiff, 32); -// // //Console.WriteLine(""); -// // } -// // -// // private static void Initialize(uint aStartAddress, uint aEndOfRam) { -// // mStart = mStartAddress = aStartAddress + (4 - (aStartAddress % 4)); -// // mLength = aEndOfRam - aStartAddress; -// // mLength = (mLength / 4) * 4; -// // mStartAddress += 1024; -// // mStartAddress = (mStartAddress / 4) * 4; -// // mLength -= 1024; -// // //Console.Write("Clearing Memory at "); -// // int xCursorLeft = Console.CursorLeft; -// // // hack: try to get this working with the full chunk or chunks of 1MB -// // //const int xBlockSize = 1024 * 1024; -// // //for (uint i = 0; i < (mLength / xBlockSize); i++) { -// // // Console.CursorLeft = xCursorLeft; -// // // Hardware.Storage.ATAOld.WriteNumber(mStartAddress + (i * xBlockSize), 32); -// // // ClearMemory(mStartAddress + (i * xBlockSize), xBlockSize); -// // //} -// // //Console.Write("Clearing Memory...."); -// // ClearMemory(aStartAddress, mLength); -// // //Console.WriteLine("Done"); -// // //mFirstBlock = (MemoryBlock*)aStartAddress; -// // //mFirstBlock->State = MemoryBlockState.Free; -// // //mFirstBlock->Next = (MemoryBlock*)(aStartAddress + mLength); -// // //mFirstBlock->Next->State = MemoryBlockState.EndOfMemory; -// // DebugUtil.SendMM_Init(mStartAddress, mLength); -// // } -// // private static bool mInited; -// // public static void Init() { -// // if (!mInited) { -// // mInited = true; -// // Initialize(CPU.EndOfKernel, (CPU.AmountOfMemory * 1024 * 1024) - 1024); -// // } -// // } -// // -// // public static uint MemAlloc(uint aLength) { -// // Init(); -// // uint xTemp = mStartAddress; -// // if ((xTemp + aLength) > (mStart + mLength)) { -// // Console.WriteLine("Too large memory block allocated!"); -// // Console.Write(" BlockSize = "); -// // // dont use .ToString here, as it uses heap... -// // WriteNumber(aLength, 32); -// // Console.WriteLine(""); -// // System.Diagnostics.Debugger.Break(); -// // } -// // mStartAddress += aLength; -// // DebugUtil.SendMM_Alloc(xTemp, aLength); -// // return xTemp; -// // //CheckInit(); -// // //MemoryBlock* xCurrentBlock = mFirstBlock; -// // //bool xFound = false; -// // //while (!xFound) { -// // // if (xCurrentBlock->State == MemoryBlockState.EndOfMemory) { -// // // DebugUtil.SendError("MM", "Reached maximum memory"); -// // // return 0; -// // // } -// // // if (xCurrentBlock->Next == null) { -// // // DebugUtil.SendError("MM", "No next block found, but not yet at EOM", (uint)xCurrentBlock, 32); -// // // return 0; -// // // } -// // // if (((((uint)xCurrentBlock->Next) - ((uint)xCurrentBlock)) >= (aLength + 5)) && (xCurrentBlock->State == MemoryBlockState.Free)) { -// // // xFound = true; -// // // break; -// // // } -// // // xCurrentBlock = xCurrentBlock->Next; -// // //} -// // //uint xFoundBlockSize = (((uint)xCurrentBlock->Next) - ((uint)xCurrentBlock)); -// // //if (xFoundBlockSize > (aLength + 37)) { -// // // MemoryBlock* xOldNextBlock = xCurrentBlock->Next; -// // // xCurrentBlock->Next = (MemoryBlock*)(((uint)xCurrentBlock) + aLength + 5); -// // // xCurrentBlock->Next->Next = xOldNextBlock; -// // // xCurrentBlock->Next->State = MemoryBlockState.Free; -// // //} -// // //xCurrentBlock->State = MemoryBlockState.Used; -// // //DebugUtil.SendMM_Alloc((uint)xCurrentBlock, aLength); -// // //return ((uint)xCurrentBlock) + 5; -// // } -// // -// // public static void MemFree(uint aPointer) { -// // //MemoryBlock* xBlock = (MemoryBlock*)(aPointer - 5); -// // //DebugUtil.SendMM_Free(aPointer - 5, (((uint)xBlock->Next) - ((uint)xBlock))); -// // //xBlock->State = MemoryBlockState.Free; -// // //uint xLength = ((uint)xBlock->Next) - aPointer; -// // //ClearMemory(aPointer, xLength); -// // } -// // -// // public static void WriteNumber(uint aNumber, byte aBits) -// // { -// // uint xValue = aNumber; -// // byte xCurrentBits = aBits; -// // Console.Write("0x"); -// // while (xCurrentBits >= 4) -// // { -// // xCurrentBits -= 4; -// // byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF); -// // string xDigitString = null; -// // switch (xCurrentDigit) -// // { -// // case 0: -// // xDigitString = "0"; -// // goto default; -// // case 1: -// // xDigitString = "1"; -// // goto default; -// // case 2: -// // xDigitString = "2"; -// // goto default; -// // case 3: -// // xDigitString = "3"; -// // goto default; -// // case 4: -// // xDigitString = "4"; -// // goto default; -// // case 5: -// // xDigitString = "5"; -// // goto default; -// // case 6: -// // xDigitString = "6"; -// // goto default; -// // case 7: -// // xDigitString = "7"; -// // goto default; -// // case 8: -// // xDigitString = "8"; -// // goto default; -// // case 9: -// // xDigitString = "9"; -// // goto default; -// // case 10: -// // xDigitString = "A"; -// // goto default; -// // case 11: -// // xDigitString = "B"; -// // goto default; -// // case 12: -// // xDigitString = "C"; -// // goto default; -// // case 13: -// // xDigitString = "D"; -// // goto default; -// // case 14: -// // xDigitString = "E"; -// // goto default; -// // case 15: -// // xDigitString = "F"; -// // goto default; -// // default: -// // Console.Write(xDigitString); -// // break; -// // } -// // } -// // } -// // } -// #endregion old -//} diff --git a/source/Archive/Cosmos.Kernel/IOAddressSpace.cs b/source/Archive/Cosmos.Kernel/IOAddressSpace.cs deleted file mode 100644 index 777b377b87..0000000000 --- a/source/Archive/Cosmos.Kernel/IOAddressSpace.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace Cosmos.Kernel -{ - public class IOAddressSpace : AddressSpace - { - public IOAddressSpace( UInt32 offset, UInt32 size ) - : base( offset, size ) - { - if( offset > 0xffff || offset + size > 0xffff ) - throw new ArgumentOutOfRangeException( "offset or size" ); - } - - public override string ToString() - { - return ""; // String.Concat("IOAddressSpace, offset = ", Offset.ToHex(), ", size = ", Size.ToHex()); - } - - public override byte Read8( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return Kernel.CPUBus.Read8( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt16 Read16( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return Kernel.CPUBus.Read16( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt32 Read32( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return Kernel.CPUBus.Read32( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt64 Read64( UInt32 offset ) - { - throw new NotImplementedException(); - } - - public override byte Read8Unchecked( UInt32 offset ) - { - return Kernel.CPUBus.Read8( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt16 Read16Unchecked( UInt32 offset ) - { - return Kernel.CPUBus.Read16( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt32 Read32Unchecked( UInt32 offset ) - { - return Kernel.CPUBus.Read32( ( UInt16 )( this.Offset + offset ) ); - } - public override UInt64 Read64Unchecked( UInt32 offset ) - { - throw new NotImplementedException(); - } - - public override void Write8( UInt32 offset, byte value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - Kernel.CPUBus.Write8( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write16( UInt32 offset, UInt16 value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - Kernel.CPUBus.Write16( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write32( UInt32 offset, UInt32 value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - Kernel.CPUBus.Write32( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write64( UInt32 offset, UInt64 value ) - { - throw new NotImplementedException(); - } - public override void Write8Unchecked( UInt32 offset, byte value ) - { - Kernel.CPUBus.Write8( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write16Unchecked( UInt32 offset, UInt16 value ) - { - Kernel.CPUBus.Write16( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write32Unchecked( UInt32 offset, UInt32 value ) - { - Kernel.CPUBus.Write32( ( UInt16 )( this.Offset + offset ), value ); - } - public override void Write64Unchecked( UInt32 offset, UInt64 value ) - { - throw new NotImplementedException(); - } - } -} diff --git a/source/Archive/Cosmos.Kernel/KPaging/PagingStructs.cs b/source/Archive/Cosmos.Kernel/KPaging/PagingStructs.cs deleted file mode 100644 index a997311021..0000000000 --- a/source/Archive/Cosmos.Kernel/KPaging/PagingStructs.cs +++ /dev/null @@ -1,252 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace Cosmos.Kernel -{ - [StructLayout(LayoutKind.Explicit)] - public struct PageDirectoryEntry - { - [FieldOffset(0)] - public uint PDEValue; - - public uint PageTableAddress - { - get - { - return (PDEValue & ((uint)0xFFFFF000)); - } - set - { - PDEValue = ((value & ((uint)0xFFFFF000)) | (PDEValue & ((uint)0x00000FFF))); - } - } - public bool Available1 - { - get - { - return ((PDEValue & ((uint)0x400)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x400)) : (PDEValue & ((uint)0xFFFFFBFF))); - } - } - public bool Available0 - { - get - { - return ((PDEValue & ((uint)0x200)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x200)) : (PDEValue & ((uint)0xFFFFFDFF))); - } - } - public bool LargePages - { - get - { - return ((PDEValue & ((uint)0x100)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x100)) : (PDEValue & ((uint)0xFFFFFEFF))); - } - } - public bool Accessed - { - get - { - return ((PDEValue & ((uint)0x20)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x20)) : (PDEValue & ((uint)0xFFFFFFDF))); - } - } - public bool CacheDisabled - { - get - { - return ((PDEValue & ((uint)0x10)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x10)) : (PDEValue & ((uint)0xFFFFFFEF))); - } - } - public bool WriteThrough - { - get - { - return ((PDEValue & ((uint)0x8)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x8)) : (PDEValue & ((uint)0xFFFFFFF8))); - } - } - public bool UserAccess - { - get - { - return ((PDEValue & ((uint)0x4)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x4)) : (PDEValue & ((uint)0xFFFFFFFB))); - } - } - public bool ReadOnly - { - get - { - return ((PDEValue & ((uint)0x2)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x2)) : (PDEValue & ((uint)0xFFFFFFFD))); - } - } - public bool Present - { - get - { - return ((PDEValue & ((uint)0x1)) != ((uint)0)); - } - set - { - PDEValue = (value ? (PDEValue | ((uint)0x1)) : (PDEValue & ((uint)0xFFFFFFFE))); - } - } - } - - [StructLayout(LayoutKind.Explicit)] - public struct PageTableEntry - { - [FieldOffset(0)] - public uint PTEValue; - - public uint PhysicalAddress - { - get - { - return (PTEValue & ((uint)0xFFFFF000)); - } - set - { - PTEValue = ((value & ((uint)0xFFFFF000)) | (PTEValue & ((uint)0x00000FFF))); - } - } - public bool Available1 - { - get - { - return ((PTEValue & ((uint)0x400)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x400)) : (PTEValue & ((uint)0xFFFFFBFF))); - } - } - public bool Available0 - { - get - { - return ((PTEValue & ((uint)0x200)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x200)) : (PTEValue & ((uint)0xFFFFFDFF))); - } - } - public bool Global - { - get - { - return ((PTEValue & ((uint)0x100)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x100)) : (PTEValue & ((uint)0xFFFFFEFF))); - } - } - public bool Dirty - { - get - { - return ((PTEValue & ((uint)0x40)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x40)) : (PTEValue & ((uint)0xFFFFFFBF))); - } - } - public bool Accessed - { - get - { - return ((PTEValue & ((uint)0x20)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x20)) : (PTEValue & ((uint)0xFFFFFFDF))); - } - } - public bool CacheDisabled - { - get - { - return ((PTEValue & ((uint)0x10)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x10)) : (PTEValue & ((uint)0xFFFFFFEF))); - } - } - public bool WriteThrough - { - get - { - return ((PTEValue & ((uint)0x8)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x8)) : (PTEValue & ((uint)0xFFFFFFF8))); - } - } - public bool UserAccess - { - get - { - return ((PTEValue & ((uint)0x4)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x4)) : (PTEValue & ((uint)0xFFFFFFFB))); - } - } - public bool ReadOnly - { - get - { - return ((PTEValue & ((uint)0x2)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x2)) : (PTEValue & ((uint)0xFFFFFFFD))); - } - } - public bool Present - { - get - { - return ((PTEValue & ((uint)0x1)) != ((uint)0)); - } - set - { - PTEValue = (value ? (PTEValue | ((uint)0x1)) : (PTEValue & ((uint)0xFFFFFFFE))); - } - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/KPaging/PagingUtility.cs b/source/Archive/Cosmos.Kernel/KPaging/PagingUtility.cs deleted file mode 100644 index fd7730c3db..0000000000 --- a/source/Archive/Cosmos.Kernel/KPaging/PagingUtility.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; - -namespace Cosmos.Kernel -{ - public class PagingUtility - { - public static void EnablePaging() - { - //Plugged - } - public static void DisablePaging() - { - //Plugged - } - - public static void EnablePSE() - { - //Plugged - } - public static void DisablePSE() - { - //Plugged - } - - public static void SetPageDirectory(uint Address) - { - //Plugged - } - public static void InvalidatePage(uint Address) - { - //Plugged - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedByteArray.cs b/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedByteArray.cs deleted file mode 100644 index 39069bdfed..0000000000 --- a/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedByteArray.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Kernel.ManagedMemory { - public unsafe class ManagedByteArray { - public ManagedByteArray(int aSize):this(aSize, 1) { - } - - public ManagedByteArray(int aSize, int aAlignment) { - mUnalignedData = new byte[aSize + aAlignment]; - if (aAlignment > 1) { - fixed (byte* xFirstElemAddress = &mUnalignedData[0]) { - var xPtr = new IntPtr(xFirstElemAddress); - Address = xPtr.ToInt64(); - if (Address % aAlignment != 0) { - mAlignmentCorrection = (int)(aAlignment - (Address % aAlignment)); - Address += mAlignmentCorrection; - } - } - } - } - - public byte this[int aIndex]{ - get{ - return mUnalignedData[aIndex + mAlignmentCorrection]; - } - set { - mUnalignedData[aIndex + mAlignmentCorrection] = value; - } - } - - private byte[] mUnalignedData; - private int mAlignmentCorrection; - public long Address { - get; - private set; - } - - - public IEnumerable Data { - get { - return mUnalignedData.Skip(mAlignmentCorrection); - } - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedUInt32Array.cs b/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedUInt32Array.cs deleted file mode 100644 index 6d83f2b2ea..0000000000 --- a/source/Archive/Cosmos.Kernel/ManagedMemory/ManagedUInt32Array.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.Core; - -namespace Cosmos.Kernel.ManagedMemory { - public unsafe class ManagedUInt32Array { - public ManagedUInt32Array(int aSize):this(aSize, 4) { - } - - public ManagedUInt32Array(int aSize, int aAlignment) { - if (aAlignment > 1) { - Address = Heap.MemAlloc((uint)((aSize * 4) + aAlignment)); - mUnalignedData = (uint*)Address; - mAlignmentCorrection = (int)(aAlignment - (Address % aAlignment)); - Address += mAlignmentCorrection; - mAlignedData = (uint*)Address; - }else{ - Address = Heap.MemAlloc((uint)(aSize * 4)); - mUnalignedData = (uint*)Address; - mAlignedData = mUnalignedData; - } - } - - public UInt32 this[int aIndex]{ - get{ - return mAlignedData[aIndex]; - } - set { - mAlignedData[aIndex] = value; - } - } - - private UInt32* mUnalignedData; - private uint* mAlignedData; - private int mAlignmentCorrection; - public long Address; - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Kernel/ManagedMemorySpace.cs b/source/Archive/Cosmos.Kernel/ManagedMemorySpace.cs deleted file mode 100644 index ab08c99913..0000000000 --- a/source/Archive/Cosmos.Kernel/ManagedMemorySpace.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Kernel -{ - /// - /// Provides Managed Memory allocation for drivers that need memory address access and memory address alignment - /// - public unsafe class ManagedMemorySpace : MemoryAddressSpace - { - private byte[] memory; - - /// - /// Create a new buffer with the given size, not aligned - /// - /// Size of buffer - public ManagedMemorySpace(UInt32 size) - : this(size, 1, false) - { } - - /// - /// Create a Managed buffer reference to an existing buffer - /// This can only be used for unaligned buffers. - /// - /// Existing byte buffer - public ManagedMemorySpace(byte[] buffer) - : base(0, (uint)buffer.Length) - { - fixed (byte* bodystart = &buffer[0]) - { - this.Offset = (UInt32)bodystart; - } - } - /// - /// Create a new buffer with the given size, aligned on the byte boundary specified - /// - /// Size of buffer - /// Byte Boundary alignment - public ManagedMemorySpace(UInt32 size, byte alignment) - : this(size, alignment, true) - { } - - /// - /// Create a new buffer with the given size, and aligned on the byte boundary if align is true - /// - /// Size of buffer - /// Byte Boundary alignment - /// true if buffer should be aligned, false otherwise - public ManagedMemorySpace(UInt32 size, byte alignment, bool align) - : base(0, size) - { - memory = new byte[size + alignment - 1]; - fixed (byte* bodystart = memory) - { - this.Offset = (UInt32)bodystart; - } - if (align == true) - { - while (this.Offset % alignment != 0) - { - this.Offset++; - } - } - } - - /// - /// Get or set the byte at the given offset - /// - /// Address Offset - /// Byte value at given offset - public byte this[uint offset] - { - get { return this.Read8(offset); } - set { this.Write8(offset, value); } - } - } -} diff --git a/source/Archive/Cosmos.Kernel/MemoryAddressSpace.cs b/source/Archive/Cosmos.Kernel/MemoryAddressSpace.cs deleted file mode 100644 index 563e47c453..0000000000 --- a/source/Archive/Cosmos.Kernel/MemoryAddressSpace.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; - -namespace Cosmos.Kernel -{ - public unsafe class MemoryAddressSpace : AddressSpace - { - public MemoryAddressSpace( UInt32 offset, UInt32 size ) - : base( offset, size ) - { } - - public override string ToString() - { - return "";// String.Concat("MemoryAddressSpace, offset = ", Offset.ToHex(), ", size = ", Size.ToHex()); - } - - public override byte Read8( UInt32 offset ) - { - if( offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return *( byte* )( this.Offset + offset ); - } - public override UInt16 Read16( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return *( UInt16* )( this.Offset + offset ); - } - public override UInt32 Read32( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return *( UInt32* )( this.Offset + offset ); - } - - public override UInt64 Read64( UInt32 offset ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - return *( UInt64* )( this.Offset + offset ); - } - - public override byte Read8Unchecked( UInt32 offset ) - { - return *( byte* )( this.Offset + offset ); - } - public override UInt16 Read16Unchecked( UInt32 offset ) - { - return *( UInt16* )( this.Offset + offset ); - } - public override UInt32 Read32Unchecked( UInt32 offset ) - { - return *( UInt32* )( this.Offset + offset ); - } - - public override UInt64 Read64Unchecked( UInt32 offset ) - { - return *( UInt64* )( this.Offset + offset ); - } - - public override void Write8( UInt32 offset, byte value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - ( *( byte* )( this.Offset + offset ) ) = value; - } - public override void Write16( UInt32 offset, UInt16 value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - ( *( UInt16* )( this.Offset + offset ) ) = value; - } - public override void Write32( UInt32 offset, UInt32 value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - ( *( UInt32* )( this.Offset + offset ) ) = value; - } - public override void Write64( UInt32 offset, UInt64 value ) - { - if( offset < 0 || offset > Size ) - throw new ArgumentOutOfRangeException( "offset" ); - ( *( UInt64* )( this.Offset + offset ) ) = value; - } - public override void Write8Unchecked( UInt32 offset, byte value ) - { - ( *( byte* )( this.Offset + offset ) ) = value; - } - public override void Write16Unchecked( UInt32 offset, UInt16 value ) - { - ( *( UInt16* )( this.Offset + offset ) ) = value; - } - public override void Write32Unchecked( UInt32 offset, UInt32 value ) - { - ( *( UInt32* )( this.Offset + offset ) ) = value; - } - public override void Write64Unchecked( UInt32 offset, UInt64 value ) - { - ( *( UInt64* )( this.Offset + offset ) ) = value; - } - - public void CopyFrom( MemoryAddressSpace src ) - { - for( uint x = 0; x < src.Size; x++ ) - { - ( *( byte* )( this.Offset + x ) ) = *( byte* )( src.Offset + x ); - } - } - - public void CopyFrom( MemoryAddressSpace src, uint srcOffset, uint dstOffset, uint bytes ) - { - for( uint x = 0; x < bytes; x++ ) - { - ( *( byte* )( this.Offset + dstOffset + x ) ) = *( byte* )( src.Offset + srcOffset + x ); - } - } - - public void SetMem( byte data ) - { - for( uint x = 0; x < this.Size; x++ ) - { - ( *( byte* )( this.Offset + x ) ) = data; - } - } - } -} diff --git a/source/Archive/Cosmos.Kernel/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Kernel/Properties/AssemblyInfo.cs deleted file mode 100644 index 79460eb6d4..0000000000 --- a/source/Archive/Cosmos.Kernel/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("Cosmos.Kernel")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Kernel")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("538c19b8-7720-4eed-b255-f5b0d7f40e90")] - -// 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/source/Archive/Cosmos.Shell.Console/Commands/BreakCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/BreakCommand.cs deleted file mode 100644 index 8a9139d589..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/BreakCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class BreakCommand : CommandBase - { - public override string Name - { - get { return "break"; } - } - - public override string Summary - { - get { return "If a debugger is attached, causes a break."; } - } - - public override void Execute(string param) - { - System.Diagnostics.Debugger.Break(); - } - - public override void Help() - { - System.Console.WriteLine(Name); - System.Console.Write(" "); System.Console.WriteLine(Summary); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/ClsCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/ClsCommand.cs deleted file mode 100644 index f4861671a1..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/ClsCommand.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class ClsCommand : CommandBase - { - public override string Name - { - get { return "cls"; } - } - - public override string Summary - { - get { return "Clears the screen."; } - } - - public override void Execute(string param) - { - System.Console.Clear(); - } - - public override void Help() - { - System.Console.WriteLine("cls"); - System.Console.WriteLine(" Clears the screen."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/CommandBase.cs b/source/Archive/Cosmos.Shell.Console/Commands/CommandBase.cs deleted file mode 100644 index 51ceab46da..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/CommandBase.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands { - /// - /// Represents a command. - /// - public abstract class CommandBase { - /// - /// Gets the name of the command (must be lowercase). - /// - public abstract string Name - { - get; - } - - /// - /// Gets the summary for the command. - /// - public abstract string Summary - { - get; - } - - public abstract void Execute(string param); - - public abstract void Help(); - - /* - public virtual void Help() - { - System.Console.WriteLine(Name); - System.Console.WriteLine(" " + Summary); - } - */ - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/DirCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/DirCommand.cs deleted file mode 100644 index 336cd7463b..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/DirCommand.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands { - public class DirCommand: CommandBase { - public override string Name { - get { - return "dir"; - } - } - - public override string Summary { - get { - return "Lists the files in the current directory."; - } - } - - public override void Execute(string param) { - System.Console.Write("Device Count: "); - System.Console.WriteLine(Hardware.Device.Devices.Count.ToString()); - for (int i = Hardware.Device.Devices.Count - 1; i >= 0; i--) { - var xDevice = Hardware.Device.Devices[i]; - if (xDevice.Type == Cosmos.Hardware.Device.DeviceType.Storage) { - var xBlockDevice = (Hardware.BlockDevice)xDevice; - //Cosmos.Kernel.FileSystem.Ext2 xExt2 = new Cosmos.Kernel.FileSystem.Ext2(xBlockDevice); - - //if (!xExt2.Initialize()) { - // System.Console.WriteLine("Error while initializing Ext2 Filesystem!"); - //} else { - // System.Console.WriteLine("ATA and Ext2 successfully initialized!"); - // // System.Diagnostics.Debugger.Break(); - // string[] files = xExt2.GetDirectoryEntries(new string[0]); - // if (files == null) { - // System.Console.WriteLine("Error while getting DirectoryEntries"); - // } - // for (int f = 0; f < files.Length; f++) - // System.Console.WriteLine(files[f]); - //} - return; - } - System.Console.Write("Device Type: "); - System.Console.WriteLine(GetDeviceTypeName(xDevice.Type)); - } - System.Console.WriteLine("No BlockDevices found!"); - } - - private static string GetDeviceTypeName(Cosmos.Hardware.Device.DeviceType deviceType) { - switch (deviceType) { - case Cosmos.Hardware.Device.DeviceType.Storage: - return "Storage"; - case Cosmos.Hardware.Device.DeviceType.Keyboard: - return "Keyboard"; - case Cosmos.Hardware.Device.DeviceType.Mouse: - return "Mouse"; - case Cosmos.Hardware.Device.DeviceType.Other: - return "Other"; - case Cosmos.Hardware.Device.DeviceType.Unknown: - return "Unknown"; - default: - return "Unknown value!"; - } - - } - - - - public override void Help() { - System.Console.WriteLine("dir"); - System.Console.WriteLine(" Lists the files in the current directory."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/EchoCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/EchoCommand.cs deleted file mode 100644 index a27681ac33..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/EchoCommand.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class EchoCommand : CommandBase - { - public override string Name - { - get { return "echo"; } - } - - public override string Summary - { - get { return "Duplicates text you enter to the console."; } - } - - public override void Execute(string param) - { - System.Console.WriteLine(param); - System.Console.WriteLine(); - } - - public override void Help() - { - System.Console.WriteLine("echo [text]"); - System.Console.WriteLine(" Duplicates text you enter to the console."); - System.Console.WriteLine(" [text]: The text to duplicate."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/ExitCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/ExitCommand.cs deleted file mode 100644 index e7194bfb7f..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/ExitCommand.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class ExitCommand : CommandBase - { - public override string Name - { - get { return "exit"; } - } - - public override string Summary - { - get { return "Closes the console."; } - } - - public delegate void SimpleDelegate(); - - private SimpleDelegate _exit; - - public ExitCommand(SimpleDelegate exit) - { - _exit = exit; - } - - public override void Execute(string param) - { - _exit(); - } - - public override void Help() - { - System.Console.WriteLine("exit"); - System.Console.WriteLine(" Closes the console."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/FailCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/FailCommand.cs deleted file mode 100644 index b48d9cc452..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/FailCommand.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class FailCommand : CommandBase - { - public override string Name - { - get { return "fail"; } - } - - public override string Summary - { - get { return "Causes a kernel-level exception (RSOD)."; } - } - - public override void Execute(string param) - { - - throw new Exception("This is a kernel-level Exception!"); - } - - public override void Help() - { - System.Console.WriteLine("fail"); - System.Console.WriteLine(" Causes a kernel-level exception (RSOD)."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/HelpCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/HelpCommand.cs deleted file mode 100644 index bc6e55a01e..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/HelpCommand.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class HelpCommand : CommandBase - { - public override string Name - { - get { return "help"; } - } - - public HelpCommand(List commands) - { - _commands = commands; - } - - private List _commands; - - public override void Execute(string param) - { - if (param.CompareTo("") == 0) - DisplayCommands(); - else - CommandHelp(param); - } - - private void CommandHelp(string command) - { - bool found = false; - for (int i = 0; i < _commands.Count; i++) - { - if (_commands[i].Name.CompareTo(command) == 0) - { - found = true; - _commands[i].Help(); - System.Console.WriteLine(); - break; - } - } - - if (!found) - { - System.Console.ForegroundColor = ConsoleColor.Red; - System.Console.Write("The command "); - System.Console.Write(command); - System.Console.WriteLine(" is not supported. Please type help for more information."); - System.Console.ForegroundColor = ConsoleColor.White; - System.Console.WriteLine(); - } - } - - private void DisplayCommands() - { - System.Console.WriteLine("Supported Commands:"); - for (int i = 0; i < _commands.Count; i++) - { - System.Console.ForegroundColor = ConsoleColor.Red; - System.Console.Write(" "); - System.Console.Write(_commands[i].Name); - System.Console.Write(": "); - System.Console.ForegroundColor = ConsoleColor.White; - System.Console.WriteLine(_commands[i].Summary); - } - System.Console.WriteLine("Please type help [command] for more information."); - System.Console.WriteLine(); - - } - - public override void Help() - { - System.Console.WriteLine("help [command]"); - System.Console.WriteLine(" Gets help on a specific command."); - System.Console.WriteLine(" [command]:The command to look up."); - } - - public override string Summary - { - get { return "Gets help on a specific command."; } - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/LspciCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/LspciCommand.cs deleted file mode 100644 index 3eb91d8ee9..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/LspciCommand.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware.PC.Bus; - - -namespace Cosmos.Shell.Console.Commands -{ - public class LspciCommand : CommandBase - { - public override string Name - { - get { return "lspci"; } - } - - public override string Summary - { - get { return "Lists pci devices."; } - } - - public override void Execute(string param) - { - //Cosmos.Hardware.PC.Bus.PCIBus.DebugLSPCI(); - - } - - - - public override void Help() - { - //System.Console.WriteLine(Name); - //System.Console.WriteLine(" " + Summary); - - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/MountCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/MountCommand.cs deleted file mode 100644 index 37517111dc..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/MountCommand.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Cosmos.Shell.Console.Commands { - public class MountCommand: CommandBase { - public override string Name { - get { - return "mount"; - } - } - - public override string Summary { - get { - return "Tries to mount all blockdevices"; - } - } - - public override void Execute(string param) { - System.Console.WriteLine("Not implemented!"); - //Cosmos.Kernel.New.Partitioning.MBT.Initialize(); - } - - public override void Help() { - System.Console.WriteLine("Tries to mount all blockdevices by probing MBT and FS's"); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Shell.Console/Commands/TimeCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/TimeCommand.cs deleted file mode 100644 index f8da97a160..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/TimeCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware; - -namespace Cosmos.Shell.Console.Commands -{ - class TimeCommand : CommandBase - { - public override string Name - { - get { return "time"; } - } - - public override string Summary - { - get { return "Displays the current time."; } - } - - public override void Execute(string param) - { - //TODO: For some reason the values output are too high. F.instance GetSeconds goes to 90. - System.Console.WriteLine((int)RTC.GetHours() + ":" + RTC.GetMinutes() + ":" + RTC.GetSeconds()); - } - - public override void Help() - { - throw new NotImplementedException(); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/TypeCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/TypeCommand.cs deleted file mode 100644 index b261ce5205..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/TypeCommand.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Shell.Console.Commands { - public class TypeCommand : CommandBase { - public override string Name { - get { - return "type"; - } - } - - public override void Execute(string param) { - - //Hardware.Storage.ATA xDrive = new Cosmos.Hardware.Storage.ATA(0, 0); - //Cosmos.Kernel.FileSystem.Ext2 xExt2 = new Cosmos.Kernel.FileSystem.Ext2(xDrive); - //if (!xExt2.Initialize()){ - // System.Console.WriteLine("Error: Ext2 Initialization failed!"); - // return; - //} - //byte[] xItem = xExt2.ReadFile(new string[] { param }); - //if (xItem == null) - //{ - // System.Console.WriteLine("Error: Couldn't read file!"); - // return; - //} - //char[] xChars = new char[xItem.Length - 1]; - //for (int i = 0; i < xChars.Length; i++) - //{ - // xChars[i] = (char)xItem[i]; - //} - //String s = new String(xChars); - //System.Console.WriteLine(s); - throw new NotImplementedException(); - } - - public override void Help() - { - System.Console.WriteLine("type [filename]"); - System.Console.WriteLine(" Types the specified file out to the console window."); - System.Console.WriteLine(" [filename]: The name of the file."); - } - - public override string Summary - { - get { return "Types the specified file out to the console window."; } - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Commands/VersionCommand.cs b/source/Archive/Cosmos.Shell.Console/Commands/VersionCommand.cs deleted file mode 100644 index 4f37f777ab..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Commands/VersionCommand.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Shell.Console.Commands -{ - public class VersionCommand : CommandBase - { - - public override string Name - { - get { return "version"; } - } - - public override string Summary - { - get { return "Displays version information about Cosmos."; } - } - - public override void Execute(string param) - { - if (param.CompareTo("") == 0 || param.CompareTo("ver") == 0) - { - DisplayVersion(); - } - else - Help(); - } - - private void DisplayVersion() - { - System.Console.ForegroundColor = ConsoleColor.Red; - System.Console.WriteLine("Cosmos Copyright 2010 The Cosmos Project"); - System.Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - System.Console.ForegroundColor = ConsoleColor.White; - System.Console.Write("Cosmos "); - System.Console.ForegroundColor = ConsoleColor.Green; - System.Console.WriteLine("Milestone 4"); - System.Console.ForegroundColor = ConsoleColor.White; - System.Console.WriteLine(); - } - - public override void Help() - { - System.Console.WriteLine("version [ver|dev]"); - System.Console.Write(" "); System.Console.WriteLine(Summary); - System.Console.WriteLine(); - System.Console.WriteLine(" ver: Displays the version information."); - System.Console.WriteLine(" dev: Displays information about the developers."); - } - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Cosmos.Demo.Shell.csproj b/source/Archive/Cosmos.Shell.Console/Cosmos.Demo.Shell.csproj deleted file mode 100644 index ce431d1d3e..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Cosmos.Demo.Shell.csproj +++ /dev/null @@ -1,90 +0,0 @@ - - - - - Debug - x86 - 9.0.30729 - 2.0 - {E4A9F8F0-D0DC-465A-A64A-FE56504D397E} - Exe - Properties - Cosmos.Demo.Shell - Cosmos.Demo.Shell - v4.7.1 - 512 - %24/IL2CPU/source/Cosmos/Cosmos.Shell.Console - . - https://tfs04.codeplex.com - {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - - - true - bin\Debug\ - DEBUG;TRACE - full - x86 - true - GlobalSuppressions.cs - prompt - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - {1F0EDE86-F6D4-4355-9A97-10E90457770C} - Cosmos.Compiler.Builder - - - {CE50FE98-9AC4-4B4D-ADC7-31F6DCD28755} - Cosmos.Hardware - - - {A1F83D9F-2D44-4264-A08B-416797123018} - Cosmos.Kernel - - - {819DB8FC-5DA1-461F-83C9-2F5C88088C94} - Cosmos.Sys - - - - - - - - diff --git a/source/Archive/Cosmos.Shell.Console/Program.cs b/source/Archive/Cosmos.Shell.Console/Program.cs deleted file mode 100644 index 87c9f806df..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Program.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Compiler.Builder; -using Cosmos.Hardware; - -namespace Cosmos.Demo.Shell { - - public class Program { - - #region Build Console - // This contains code to launch the build console. Most users should not chagne this. - [STAThread] - public static void Main() { - BuildUI.Run(); - } - #endregion - - // Here is where your Cosmos code goes. This is the code that will be executed during Cosmos boot. - // Write your code, and run. Cosmos build console will appear, select your target, and thats it! - public static void Init() { - try { - var xBoot = new Cosmos.Sys.Boot(); - xBoot.Execute(); - //System.Console.WriteLine("Sorry - the Cosmos.Shell.Console is currently not working."); - Prompter pmt = new Prompter(); - pmt.Initialize(); - //stages.Enqueue(new Prompter()); - - } catch (Exception E) { - System.Console.WriteLine("Error occurred:"); - System.Console.Write(" "); - System.Console.WriteLine(E.Message); - } - - System.Console.WriteLine("Halting system now!.."); - - // Halt system. - while (true) - ; - } - - - private static void WriteNumber(uint aValue, byte aBitCount) { - uint xValue = aValue; - byte xCurrentBits = aBitCount; - System.Console.Write("0x"); - while (xCurrentBits >= 4) { - xCurrentBits -= 4; - byte xCurrentDigit = (byte)((xValue >> xCurrentBits) & 0xF); - string xDigitString = null; - switch (xCurrentDigit) { - case 0: - xDigitString = "0"; - goto default; - case 1: - xDigitString = "1"; - goto default; - case 2: - xDigitString = "2"; - goto default; - case 3: - xDigitString = "3"; - goto default; - case 4: - xDigitString = "4"; - goto default; - case 5: - xDigitString = "5"; - goto default; - case 6: - xDigitString = "6"; - goto default; - case 7: - xDigitString = "7"; - goto default; - case 8: - xDigitString = "8"; - goto default; - case 9: - xDigitString = "9"; - goto default; - case 10: - xDigitString = "A"; - goto default; - case 11: - xDigitString = "B"; - goto default; - case 12: - xDigitString = "C"; - goto default; - case 13: - xDigitString = "D"; - goto default; - case 14: - xDigitString = "E"; - goto default; - case 15: - xDigitString = "F"; - goto default; - default: - System.Console.Write(xDigitString); - break; - } - } - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Shell.Console/Prompter.cs b/source/Archive/Cosmos.Shell.Console/Prompter.cs deleted file mode 100644 index 8e9aad73e5..0000000000 --- a/source/Archive/Cosmos.Shell.Console/Prompter.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Demo.Shell { - /// - /// The demonstration prompter. - /// - public class Prompter - { - private List _commands; - - private bool running = true; - - public void Stop() { - running = false; - } - - public void Initialize() { - _commands = new List(); - _commands.Add(new Cosmos.Shell.Console.Commands.BreakCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.ClsCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.DirCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.EchoCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.ExitCommand(Stop)); - _commands.Add(new Cosmos.Shell.Console.Commands.FailCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.HelpCommand(_commands)); - _commands.Add(new Cosmos.Shell.Console.Commands.TimeCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.TypeCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.VersionCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.LspciCommand()); - _commands.Add(new Cosmos.Shell.Console.Commands.MountCommand()); - - while (running) { - System.Console.Write("Running = "); - System.Console.Write(running.ToString()); - System.Console.Write(" "); - System.Console.Write("/> "); - string line = System.Console.ReadLine(); - if (string.IsNullOrEmpty(line)) { continue; } - int index = line.IndexOf(' '); - string command; - string param; - if (index == -1) { - command = line; - param = ""; - } else { - command = line.Substring(0, index); - param = line.Substring(index + 1); - } - - bool found = false; - for (int i = 0; i < _commands.Count; i++) { - if (_commands[i].Name == command) { - found = true; - _commands[i].Execute(param); - break; - } - } - - if (!found) { - System.Console.ForegroundColor = ConsoleColor.Red; - System.Console.Write("The command "); - System.Console.Write(command); - System.Console.WriteLine(" is not supported. Please type help for more information."); - System.Console.ForegroundColor = ConsoleColor.White; - System.Console.WriteLine(); - } - } - } - - } -} diff --git a/source/Archive/Cosmos.Shell.Console/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Shell.Console/Properties/AssemblyInfo.cs deleted file mode 100644 index cf42796511..0000000000 --- a/source/Archive/Cosmos.Shell.Console/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("Cosmos.Shell.Console")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.Shell.Console")] -[assembly: AssemblyCopyright("Copyright © 2007")] -[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("b069679f-9e84-440e-b482-7354825155c5")] - -// 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/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeControlInfoAssembler.cs b/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeControlInfoAssembler.cs deleted file mode 100644 index 837de07348..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeControlInfoAssembler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Assembler.x86; -using Cosmos.Assembler; - -namespace Cosmos.Sys.Plugs.Assemblers -{ - public class GetVbeControlInfoAssembler: AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.Push(Cosmos.Assembler.ElementReference.New("MultibootGraphicsRuntime_VbeControlInfoAddr"), isIndirect: true); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeAssembler.cs b/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeAssembler.cs deleted file mode 100644 index 91c77e4be5..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeAssembler.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Assembler.x86; -using Cosmos.Assembler; - -namespace Cosmos.Sys.Plugs.Assemblers -{ - public class GetVbeModeAssembler: AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.Xor(XSRegisters.EAX, XSRegisters.Registers.EAX); - XS.Mov(XSRegisters.AX, Cosmos.Assembler.ElementReference.New("MultibootGraphicsRuntime_VbeMode"), sourceIsIndirect: true); - XS.Push(XSRegisters.EAX); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeInfoAssembler.cs b/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeInfoAssembler.cs deleted file mode 100644 index 45d58190b9..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Assemblers/GetVbeModeInfoAssembler.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Assembler.x86; -using Cosmos.Assembler; - -namespace Cosmos.Sys.Plugs.Assemblers -{ - public class GetVbeModeInfoAssembler: AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) - { - XS.Push(Cosmos.Assembler.ElementReference.New("MultibootGraphicsRuntime_VbeModeInfoAddr"), isIndirect: true); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys.Plugs/Assemblers/Reboot.cs b/source/Archive/Cosmos.Sys.Plugs/Assemblers/Reboot.cs deleted file mode 100644 index 5f805955e5..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Assemblers/Reboot.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Cosmos.IL2CPU.Plugs; -using Assembler=Cosmos.Assembler; -using CPUAll = Cosmos.Assembler; -using CPUx86 = Cosmos.Assembler.x86; -using Cosmos.Assembler.x86; - -namespace Cosmos.Sys.Plugs.Assemblers -{ - public class Reboot : AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - new CPUx86.ClrInterruptFlag(); - /* Clear all keyboard buffers (output and command buffers) */ - new CPUAll.Label(".waitBuffer"); - XS.Mov(XSRegisters.DX, 0x64); - XS.InFromDX(XSRegisters.AL); - XS.Test(XSRegisters.AL, 2); - XS.Jump(ConditionalTestEnum.NotEqual, ".waitBuffer"); - XS.Mov(XSRegisters.AL, 0xD1); - XS.Mov(XSRegisters.DX, 0x64); - XS.OutToDX(XSRegisters.AL); - new CPUAll.Label(".clearBuffer"); - XS.Mov(XSRegisters.DX, 0x64); - XS.InFromDX(XSRegisters.AL); - XS.Test(XSRegisters.AL, 2); - XS.Jump(ConditionalTestEnum.NotEqual, ".clearBuffer"); - XS.Mov(XSRegisters.AL, 0xFE); - XS.Mov(XSRegisters.DX, 0x60); - XS.OutToDX(XSRegisters.AL); - new CPUAll.Label(".loop");//failed... halt - XS.Halt(); - XS.Jump(".loop"); - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/Assemblers/Shutdown.cs b/source/Archive/Cosmos.Sys.Plugs/Assemblers/Shutdown.cs deleted file mode 100644 index 2a0378bf38..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Assemblers/Shutdown.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Cosmos.IL2CPU.Plugs; -using Assembler=Cosmos.Assembler; -using CPUAll = Cosmos.Assembler; -using CPUx86 = Cosmos.Assembler.x86; -using Cosmos.Assembler.x86; - -namespace Cosmos.Sys.Plugs.Assemblers{ - public class ShutDown : AssemblerMethod - { - public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) { - //ACPI Way...ONLY QEMu And Boschs - XS.Mov(XSRegisters.DX, 0xB004); - new CPUx86.Mov { - DestinationReg = CPUx86.Registers.AX, - SourceValue = 0x0 | 0x2000 - }; - new CPUx86.Out { - DestinationReg = CPUx86.Registers.AX, - Size = (byte)CPUx86.Instruction.InstructionSize.Word - }; - //TODO: ACPI Way...see http://forum.osdev.org/viewtopic.php?t=16990 - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/BootInfo.cs b/source/Archive/Cosmos.Sys.Plugs/BootInfo.cs deleted file mode 100644 index 609b6c2224..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/BootInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Sys.Plugs -{ - [Plug(Target=typeof(Sys.BootInfo))] - public static class BootInfo - { - [PlugMethod(Assembler=typeof(Assemblers.GetVbeControlInfoAssembler))] - public static uint GetVbeControlInfoAddr() - { - return UInt32.MaxValue; - } - - [PlugMethod(Assembler = typeof(Assemblers.GetVbeModeInfoAssembler))] - public static uint GetVbeModeInfoAddr() - { - return UInt32.MaxValue; - } - - [PlugMethod(Assembler = typeof(Assemblers.GetVbeModeAssembler))] - public static ushort GetVbeMode() - { - return ushort.MaxValue; - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/Cosmos.Sys.Plugs.csproj b/source/Archive/Cosmos.Sys.Plugs/Cosmos.Sys.Plugs.csproj deleted file mode 100644 index 53b2b060c0..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Cosmos.Sys.Plugs.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {6110AD07-EB07-4A99-BB73-7A69AF5732F1} - Library - Properties - Cosmos.Sys.Plugs - Cosmos.Sys.Plugs - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - true - full - x86 - true - GlobalSuppressions.cs - prompt - false - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - {1116130E-28E0-428A-A597-F4B3B676C0CA} - XSharp.Assembler - - - {C801F19C-A9D3-42D5-9A57-9FFDF9B4D05E} - Cosmos.IL2CPU.Plugs - - - {239E33A7-F0C3-4801-85CA-4D8F89A31DC0} - Cosmos.IL2CPU - - - - - diff --git a/source/Archive/Cosmos.Sys.Plugs/Deboot.cs b/source/Archive/Cosmos.Sys.Plugs/Deboot.cs deleted file mode 100644 index 98b14a5691..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/Deboot.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Sys.Plugs -{ - [Plug(Target = typeof(Sys.Deboot))] - public static class Deboot - { - [PlugMethod(Assembler = typeof(Assemblers.Reboot))] - public static void Reboot() - { - - } - [PlugMethod(Assembler = typeof(Assemblers.ShutDown))] - public static void ShutDown() - { - - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Sys.Plugs/Properties/AssemblyInfo.cs deleted file mode 100644 index 56a86e0abb..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/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("Cosmos.Sys.Plugs")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Cosmos")] -[assembly: AssemblyProduct("Cosmos.Sys.Plugs")] -[assembly: AssemblyCopyright("Copyright © 2010")] -[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("3f26c4c6-ff66-48fd-9cbd-29e53b058d2b")] - -// 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/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryImpl.cs deleted file mode 100644 index 2e8c9c2169..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryImpl.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.Plugs { - [Plug(Target=typeof(Directory))] - public static class DirectoryImpl - { - public static bool Exists(string aDir) { - return VFSManager.DirectoryExists(aDir); - } - - private static string mCurrentDirectory = @"/0"; - public static string GetCurrentDirectory() - { - return mCurrentDirectory; - } - - public static void SetCurrentDirectory(string aDir) - { - mCurrentDirectory = aDir; - } - - public static string[] GetDirectories(string aDir) - { - var xEntries = VFSManager.GetDirectoryListing(aDir); - //var xResult = new string[xEntries.Length]; - var xResult = new List(); - for (int i = 0; i < xEntries.Length; i++) - { - ////var i = 0; - if (xEntries[i].IsDirectory) - { - xResult.Add(xEntries[i].Name); - //xResult[i] = xEntries[i].Name; - } - } - //var xResult = new string[1]; - //xResult[0] = "TempDir"; - return xResult.ToArray(); - // List xDirectoryNames = new List(); - // foreach (FilesystemEntry xDirectory in VFSManager.GetDirectories(aDir)) - // xDirectoryNames.Add(xDirectory.Name); - - // return xDirectoryNames.ToArray(); - // //return (from xDirectoryName in VFSManager.GetDirectories(aDir) select xDirectoryName.Name).ToArray(); - } - - //Plugs Directory.InternalGetFileDirectoryNames which is used by 6 methods (in Directory and DirectoryInfo) - public static string[] InternalGetFileDirectoryNames(string path, string userPathOriginal, string searchPattern, bool includeFiles, bool includeDirs, SearchOption searchOption) - { - return VFSManager.InternalGetFileDirectoryNames(path, userPathOriginal, searchPattern, includeFiles, includeDirs, searchOption); - } - - public static string[] GetFiles(string aDir) - { - List xFileNames = new List(); - var xFileEntries = VFSManager.GetFiles(aDir); - for (int i = 0; i < xFileEntries.Length; i++) - { - xFileNames.Add(xFileEntries[i].Name); - } - return xFileNames.ToArray(); - - //return (from xFileName in VFSManager.GetFiles(aDir) select xFileName.Name).ToArray(); - } - - public static string[] GetLogicalDrives() - { - return VFSManager.GetLogicalDrives(); - } - - public static DirectoryInfo GetParent(string aDir) - { - if (aDir == null) - throw new ArgumentNullException("aDir"); - - if (aDir.Length == 0) - throw new ArgumentException("aDir is empty"); - - string xDirectoryName = Path.GetDirectoryName(aDir); - if (xDirectoryName == null) - return null; - - return new DirectoryInfo(xDirectoryName); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryInfoImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryInfoImpl.cs deleted file mode 100644 index f5faad72ca..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/DirectoryInfoImpl.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using System.IO; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.Plugs -{ - [Plug(Target=typeof(DirectoryInfo))] - [PlugField(FieldId = "$$Storage$$", FieldType = typeof(FilesystemEntry))] - [PlugField(FieldId = "$$FullPath$$", FieldType = typeof(String))] - public static class DirectoryInfoImpl - { - [PlugMethod(/*Signature = "System_Void__System_IO_DirectoryInfo__ctor_System_String_"*/)] - public static void Ctor( - DirectoryInfo aThis, - //[FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage, - //[FieldAccess(Name = "$$FullPath$$")] String aFullPath, - String aPath - ) - { - //if (aPath == null) - // throw new ArgumentNullException("aPath is null in DirectoryInfo ctor"); - - ////Search for directory - ////if (!VFSManager.DirectoryExists(aPath)) - //// throw new DirectoryNotFoundException("Unable to find directory " + aPath); - - ////If it exists, then get the directory as a FilesystemEntry - //aStorage = VFSManager.GetDirectoryEntry(aPath); - //aFullPath = aPath; - } - - public static bool get_Exists(DirectoryInfo aThis, [FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage) - { - //TODO: actually test if it exists - return (aStorage != null); - } - - //public static string FullName - //{ - // get - // { - // return ".FullName isn't implemented yet"; - // } - //} - - //public static string get_FullName(DirectoryInfo aThis, [FieldAccess(Name = "$$FullPath$$")] String aFullPath) - //{ - // //TODO: return FULL name - // return aFullPath; - //} - - public static string get_Name(DirectoryInfo aThis, [FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage) - { - return aStorage.Name; - } - - public static FileInfo[] GetFiles(DirectoryInfo aThis, [FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage) - { - List xFiles = new List(); - var xEntries = VFSManager.GetFiles(aStorage); - - foreach (FilesystemEntry xEntry in xEntries) - { - xFiles.Add(new FileInfo(xEntry.Name)); - } - - return xFiles.ToArray(); - - //Alternative implementation - //var xEntries = VFSManager.GetFiles(aStorage); - //FileInfo[] files = new FileInfo[xEntries.Length]; - //for (int i = 0; i < xEntries.Length; i++) - //{ - // files[i] = new FileInfo(xEntries[i].Name); - //} - - //return files; - } - - - public static string ToString([FieldAccess(Name = "$$Path$$")] ref String aPath) - { - return "DirectoryInfo.ToString() not yet implemented"; - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/DriveInfoImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/DriveInfoImpl.cs deleted file mode 100644 index 5fc3388744..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/DriveInfoImpl.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using Cosmos.Sys.FileSystem; -using System.IO; - -namespace Cosmos.Sys.Plugs.VFS -{ - [Plug(Target = typeof(DriveInfo))] - public static class DriveInfoImpl - { - [PlugMethod(Signature = "System_Void__System_IO_DriveInfo__ctor_System_String_")] - public static void Ctor(DriveInfo aThis, string aDriveName) - { - ; - } - - public static string get_DriveFormat(ref DriveInfo aThis) - { - return "DriveFormat not implemented"; - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/FileImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/FileImpl.cs deleted file mode 100644 index 2e9e12a845..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/FileImpl.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Sys.Plugs { - [Plug(Target=typeof(File))] - public static class FileImpl { - public static bool Exists(string aFile) { - return VFSManager.FileExists(aFile); - } - - public static string ReadAllText(string aFile) - { - //Find file - if (!File.Exists(aFile)) - return "Could not find file " + aFile; - //throw new FileNotFoundException("Could not find file " + aFile); - - return VFSManager.ReadFileAsString(aFile); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/FileInfoImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/FileInfoImpl.cs deleted file mode 100644 index cd71805661..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/FileInfoImpl.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using System.IO; -using Cosmos.Sys.FileSystem; - -namespace Cosmos.Sys.Plugs -{ - [Plug(Target = typeof(FileInfo))] - [PlugField(FieldId = "$$Storage$$", FieldType = typeof(FilesystemEntry))] - public static class FileInfoImpl - { - //[PlugMethod(Signature = "System_Void__System_IO_FileInfo__ctor_System_String_")] - public static void Ctor( - FileInfo aThis, - [FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage, - String aFile - ) - { - //Determine if aFile is relative or absolute - string xFile; - if (aFile.IsRelativePath()) - xFile = Directory.GetCurrentDirectory() + aFile; - else - xFile = aFile; - - var xEntry = VFSManager.GetDirectoryEntry(xFile); - - if (!xEntry.IsDirectory) - aStorage = xEntry; - } - - public static string get_Name([FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage) - { - return "Filename" + aStorage.Name; - } - - public static bool get_Exists([FieldAccess(Name = "$$Storage$$")] ref FilesystemEntry aStorage) - { - return VFSManager.FileExists(aStorage.Name); - } - - public static string ToString(FileInfo aThis) { - return "FileInfo.ToString() not yet implemented!"; - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/FileSystemInfoImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/FileSystemInfoImpl.cs deleted file mode 100644 index 03d2093584..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/FileSystemInfoImpl.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; -using System.IO; - -namespace Cosmos.Sys.Plugs.VFS -{ - [Plug(Target = typeof(System.IO.FileSystemInfo))] - public static class FileSystemInfo - { - public static string get_FullName(System.IO.FileSystemInfo aThis) - { - return "FullName not implemented yet in FileSystemInfo plug"; - } - } -} diff --git a/source/Archive/Cosmos.Sys.Plugs/VFS/PathImpl.cs b/source/Archive/Cosmos.Sys.Plugs/VFS/PathImpl.cs deleted file mode 100644 index 2359e1de1b..0000000000 --- a/source/Archive/Cosmos.Sys.Plugs/VFS/PathImpl.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.Sys.Plugs { - [Plug(Target=typeof(Path))] - public static class PathImpl { - - /// - /// Get the directory part of a path to a file. No trailing slash in returned string. - /// - /// - /// - public static string GetDirectoryName(string aPath) - { - if (aPath == null || aPath.Length <= 1) - { - return "/"; - } - int xIndex = aPath.LastIndexOfAny(new char[] { '/', '\\' }); - if (xIndex == -1) - { - return aPath; - } - return aPath.Substring(0, xIndex); - } - - public static void Cctor() { - // todo: implement fully? - } - - //public static string GetFileName(string aPath) - //{ - // int xIndex = aPath.LastIndexOfAny(new char[] { '/', '\\' }); - // if (xIndex == -1) - // { - // return aPath; - // } - // return aPath.Substring(xIndex + 1, aPath.Length - xIndex - 1); - //} - - //public static string GetPathRoot(string aPath) - //{ - // if (aPath.IsAbsolutePath()) - // return new String(new char[] { aPath[0], aPath[1], aPath[2] }); - // else - // return String.Empty; - //} - - //public static bool IsPathRooted(string aPath) - //{ - // return aPath.IsAbsolutePath(); - //} - - public static string GetFullPath(string aPath) - { - //Plug is used to avoid call to FileIOPermission - return GetFullPathInternal(aPath); - } - - public static string GetFullPathInternal(string aPath) - { - //Exact copy of .NET's version of GetFullPathInternal - if (aPath == null) - { - throw new ArgumentNullException("path"); - } - return NormalizePath(aPath, true); - } - - public static string NormalizePath(string aPath, bool aFullCheck) - { - if (aPath.IsRelativePath()) - return Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + aPath; - else - return aPath.TrimEnd(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }); - } - - public static string GetRandomFileName() - { - return "random.tmp"; - } - - public static string GetTempFileName() - { - return "\0\tempfile.tmp"; - } - - public static string GetTempPath() - { - return @"\0\Temp"; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.Sys/Boot.cs b/source/Archive/Cosmos.Sys/Boot.cs deleted file mode 100644 index 048afc39ef..0000000000 --- a/source/Archive/Cosmos.Sys/Boot.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Hardware2; - -namespace Cosmos.Sys { - - /// - /// Boot configurations for Cosmos. - /// One of these configurations should be called from the first line of any Cosmos-based operating system. - /// For now we just have default, but can add others in the future. - /// - public class Boot { - - /// - /// Boot the kernel using default boot-configuration. - /// Initializes basic hardware like CPU, serialports, PCI, Keyboard and blockdevices. - /// Later properties will be added, which will alter this. - /// However if no properties are changed from defaults, and Execute is called it should - /// perform a default boot. - /// - public void Execute(bool aCleanScreen) { - //Hardware.VGAScreen.SetTextMode(VGAScreen.TextSize.Size80x25); - Console.Clear(); - - Kernel.Global.Init(); - Hardware2.Global2.Init(); - Sys.Global.Init(); - - // Clear again in case debug information has been written out - if (aCleanScreen) - { - Console.Clear(); - } - } - - public void Execute() { - Execute(true); - } - - } -} diff --git a/source/Archive/Cosmos.Sys/BootInfo.cs b/source/Archive/Cosmos.Sys/BootInfo.cs deleted file mode 100644 index 7726ba8d73..0000000000 --- a/source/Archive/Cosmos.Sys/BootInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys -{ - public static class BootInfo - { - public static uint GetVbeControlInfoAddr() - { - return UInt32.MaxValue; - } - - public static uint GetVbeModeInfoAddr() - { - return UInt32.MaxValue; - } - - public static ushort GetVbeMode() - { - return ushort.MaxValue; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Cosmos.Sys.csproj b/source/Archive/Cosmos.Sys/Cosmos.Sys.csproj deleted file mode 100644 index 6fa62ab12c..0000000000 --- a/source/Archive/Cosmos.Sys/Cosmos.Sys.csproj +++ /dev/null @@ -1,93 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {819DB8FC-5DA1-461F-83C9-2F5C88088C94} - Library - Properties - Cosmos.Sys - Cosmos.Sys - v4.7.1 - 512 - SAK - SAK - SAK - SAK - - - - true - bin\Debug\ - DEBUG;TRACE - bin\Debug\Cosmos.Sys.XML - full - x86 - true - GlobalSuppressions.cs - prompt - 1591 - false - - - bin\Release\ - TRACE - true - pdbonly - x86 - true - GlobalSuppressions.cs - prompt - false - - - - - 3.5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.Sys/Deboot.cs b/source/Archive/Cosmos.Sys/Deboot.cs deleted file mode 100644 index 6168914c9e..0000000000 --- a/source/Archive/Cosmos.Sys/Deboot.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys { - public class Deboot { - //plugged - public static void ShutDown() { - - } - - //Plugged - public static void Reboot() { - - } - } -} diff --git a/source/Archive/Cosmos.Sys/Global.cs b/source/Archive/Cosmos.Sys/Global.cs deleted file mode 100644 index b3ebb08d40..0000000000 --- a/source/Archive/Cosmos.Sys/Global.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys { - public class Global { - static public void Init() - { - Console.WriteLine(" Init Virtual File System"); - VFSManager.Init(); - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/EthernetPacket.cs b/source/Archive/Cosmos.Sys/Network/ChadTCPIP/EthernetPacket.cs deleted file mode 100644 index 6029a1c38a..0000000000 --- a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/EthernetPacket.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network { - public class EthernetPacket : Packet { - public class PacketType { - public const UInt16 IP = 0x800; - } - - protected byte mHeaderSize = 14; - protected int mHeaderBegin; - - public EthernetPacket(byte[] aData, UInt64 aSrcMAC, UInt64 aDestMAC, UInt16 aType) { - mHeaderBegin = Initialize(aData, mHeaderSize); - DestinationAddress = aDestMAC; - SourceAddress = aSrcMAC; - this.Type = aType; - } - - public EthernetPacket(byte[] aRawData) { - mData = aRawData; - } - - public uint Type { - get { - return (uint)(mData[12] << 8 | mData[13]); - } - set { - mData[12] = (byte)(value >> 8); - mData[13] = (byte)value; - } - } - - public UInt64 DestinationAddress { - get { - return (UInt64)( - mData[0] << 40 - | mData[1] << 32 - | mData[2] << 24 - | mData[3] << 16 - | mData[4] << 8 - | mData[5]); - } - set { - mData[0] = (byte)(value >> 24); - mData[1] = (byte)(value >> 24); - mData[2] = (byte)(value >> 24); - mData[3] = (byte)(value >> 16); - mData[4] = (byte)(value >> 8); - mData[5] = (byte)value; - } - } - -// public - - public UInt64 SourceAddress { - get { - return (UInt64)( - mData[6] << 40 - | mData[7] << 32 - | mData[8] << 24 - | mData[9] << 16 - | mData[10] << 8 - | mData[11]); - } - set { - mData[6] = (byte)(value >> 24); - mData[7] = (byte)(value >> 24); - mData[8] = (byte)(value >> 24); - mData[9] = (byte)(value >> 16); - mData[10] = (byte)(value >> 8); - mData[11] = (byte)value; - } - } - - } -} diff --git a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/ICMPPacket.cs b/source/Archive/Cosmos.Sys/Network/ChadTCPIP/ICMPPacket.cs deleted file mode 100644 index 22efd4e9db..0000000000 --- a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/ICMPPacket.cs +++ /dev/null @@ -1,144 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network -{ - public class ICMPPacket : IP4Packet { - protected int mICMPHead; - - public ICMPPacket(uint aSrcIP, uint aDestIP, ICMPType aType, byte[] aData, byte aCode) - { - mICMPHead = base.Initialize( - aData, //Data in ICMP body - 8, //Size of ICMP header - 0x01, //ICMP - aSrcIP, - aDestIP - ); - - this.Type = aType; - this.Code = aCode; - } - - /// - /// Concludes the ICMP Packet by setting checksum, etc. - /// - protected override void Conclude() - { - base.Conclude(); - this.SetChecksum(); - } - - public ICMPType Type - { - get { return (ICMPType)mData[mICMPHead + 0]; } - set { mData[mICMPHead + 0] = (byte)value; } - } - - public byte Code - { - get { return mData[mICMPHead + 1]; } - set { mData[mICMPHead + 1] = (byte)value; } - } - - public UInt16 Checksum - { - //TODO: Calculate checksum for ICMP here - get { return 0; }//dummy checksum - } - - /// - /// Calculates and saves the checksum for the ICMP packet - /// - private void SetChecksum() - { - mData[mICMPHead + 2] = (byte)(this.Checksum >> 8); - mData[mICMPHead + 3] = (byte)this.Checksum; - } - - public UInt16 ID - { - get { throw new NotImplementedException(); } - set { ;} - } - - public UInt16 Sequence - { - get { throw new NotImplementedException(); } - set { ;} - } - - public byte[] Padding - { - get { throw new NotImplementedException(); } - set { ;} - } - - public enum ICMPType : byte - { - EchoReply = 0, - DestinationUnreachable = 3, - SourceQuench = 4, - RedirectMessage = 5, - EchoRequest = 8, - RouterAdvertisement = 9, - RouterSolicitation = 10, - TimeExeeded = 11, - BadIPHeader = 12, - Timestamp = 13, - TimestampReply = 14, - InformationRequest = 15, - InformationReply = 16, - AddressMaskRequest = 17, - AddressMaskReply = 18, - Traceroute = 30 - } - - //public string GetControlMessage(ICMPType type, byte code) - //{ - // switch (type) - // { - // case ICMPType.EchoReply: - // break; - // case ICMPType.DestinationUnreachable: - // break; - // case ICMPType.SourceQuench: - // break; - // case ICMPType.RedirectMessage: - // break; - // case ICMPType.EchoRequest: - // break; - // case ICMPType.RouterAdvertisement: - // break; - // case ICMPType.RouterSolicitation: - // break; - // case ICMPType.TimeExeeded: - // break; - // case ICMPType.BadIPHeader: - // break; - // case ICMPType.Timestamp: - // break; - // case ICMPType.TimestampReply: - // break; - // case ICMPType.InformationRequest: - // break; - // case ICMPType.InformationReply: - // break; - // case ICMPType.AddressMaskRequest: - // break; - // case ICMPType.AddressMaskReply: - // break; - // case ICMPType.Traceroute: - // break; - // default: - // break; - // } - - // return "dummy"; - //} - - - } -} diff --git a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/IP4Packet.cs b/source/Archive/Cosmos.Sys/Network/ChadTCPIP/IP4Packet.cs deleted file mode 100644 index dda2a2fe1d..0000000000 --- a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/IP4Packet.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network -{ - // http://en.wikipedia.org/wiki/IPv4 - public abstract class IP4Packet : Packet { - protected byte mHeaderSize = 20; - protected int mHeaderBegin; - - /// - /// Initialized the IPv4 packet. - /// - /// - /// - /// - /// - /// - /// - protected int Initialize(byte[] aData, int aHeaderSize, byte aProtocol, uint aSrcAddr, uint aDestAddr) { - mHeaderBegin = base.Initialize(aData, mHeaderSize + aHeaderSize); - // Version + Header length - // 0x40 is the version (4 in high nibble, i.e. 4x) - // Length is # of 32 bit words in header - mData[mHeaderBegin] = (byte)(0x40 | (mHeaderSize >> 2)); - // Differentiated Services Field - mData[mHeaderBegin + 1] = 0x00; - // Total Length - IP Packet + sub packets + data (i.e. IP + UDP + UPD Data) - int xSize = mData.Length - mHeaderBegin; - mData[mHeaderBegin + 2] = (byte)(xSize >> 8); - mData[mHeaderBegin + 3] = (byte)xSize; - // IP - Identification - Varies - // This field is an identification field and is primarily used for uniquely identifying fragments of an original IP datagram. Some experimental work has suggested using the ID field for other purposes, such as for adding packet-tracing information to datagrams in order to help trace back datagrams with spoofed source addresses. - mData[mHeaderBegin + 4] = 0x5a; - mData[mHeaderBegin + 5] = 0xf8; - // Flags + Fragment Offset - mData[mHeaderBegin + 6] = 0x00; - mData[mHeaderBegin + 7] = 0x00; - // TTL - mData[mHeaderBegin + 8] = 0x80; - Protocol = aProtocol; - // IP - Header Checksum - Varies - // In 1's complement, there are 2 representations for zero: 0000000000000000 and 1111111111111111. - // Note that flipping the bits of the one gives you the other. A header checksum of "0" - // (allowed for some protocols, e.g. UDP) denotes that the checksum was not calculated. - // Thus, implementations which do calculate a checksum make sure to give a result of 0xffff rather - // that 0, when the checksum is actually zero. - mData[mHeaderBegin + 10] = 0x00; - mData[mHeaderBegin + 11] = 0x00; - SourceAddress = aSrcAddr; - DestinationAddress = aDestAddr; - - return mHeaderBegin + mHeaderSize; - } - - public byte Protocol { - get { - return mData[mHeaderBegin + 9]; - } - set { - mData[mHeaderBegin + 9] = value; - } - } - - public uint SourceAddress { - get { - return (uint)( - mData[mHeaderBegin + 12] << 24 - | mData[mHeaderBegin + 13] << 16 - | mData[mHeaderBegin + 14] << 8 - | mData[mHeaderBegin + 15]); - } - set { - mData[mHeaderBegin + 12] = (byte)(value >> 24); - mData[mHeaderBegin + 13] = (byte)(value >> 16); - mData[mHeaderBegin + 14] = (byte)(value >> 8); - mData[mHeaderBegin + 15] = (byte)value; - } - } - - public uint DestinationAddress { - get { - return (uint)( - mData[mHeaderBegin + 16] << 24 - | mData[mHeaderBegin + 17] << 16 - | mData[mHeaderBegin + 18] << 8 - | mData[mHeaderBegin + 19]); - } - set { - mData[mHeaderBegin + 16] = (byte)(value >> 24); - mData[mHeaderBegin + 17] = (byte)(value >> 16); - mData[mHeaderBegin + 18] = (byte)(value >> 8); - mData[mHeaderBegin + 19] = (byte)value; - } - } - - /// - /// Concludes the IP4Packet by setting checksum, etc. - /// - protected override void Conclude() { - base.Conclude(); - this.SetChecksum(); - } - - /// - /// Calculates and saves the checksum for the IPv4 packet. - /// - private void SetChecksum() - { - //Blank out checksum bytes - mData[mHeaderBegin + 10] = 0; - mData[mHeaderBegin + 11] = 0; - - // TODO: Change this to a ASM and use 32 bit addition - UInt32 xResult = 0; - for (int i = 0; i < mHeaderSize; i = i + 2) - { - xResult += (UInt16)((mData[mHeaderBegin + i] << 8) + mData[mHeaderBegin + i + 1]); - } - xResult = (~((xResult & 0xFFFF) + (xResult >> 16))); - // Store result - mData[mHeaderBegin + 10] = (byte)(xResult >> 8); - mData[mHeaderBegin + 11] = (byte)xResult; - } - - - } -} diff --git a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/Packet.cs b/source/Archive/Cosmos.Sys/Network/ChadTCPIP/Packet.cs deleted file mode 100644 index 711a79edfd..0000000000 --- a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/Packet.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network -{ - public abstract class Packet { - protected byte[] mData; - - // This is a method and not a read only property to "signify" to - // user that it is not a direct access, but incurs a performance - // penalty to call - public byte[] GetData() { - Conclude(); - return mData; - } - - /// - /// Initializes the Packet with some data and sets a size for the header. This is used to determine the size of the bytearray. - /// - /// A bytearray used to initialize the size of the packet. - /// Used to determine the difference between the header and the body. - /// Always 0 - protected int Initialize(byte[] aData, int aHeaderSize) { - mData = new byte[aData.Length + aHeaderSize]; - aData.CopyTo(mData, aHeaderSize); - return 0; - } - - /// - /// Concludes the Packet - /// - protected virtual void Conclude() { - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/UDPPacket.cs b/source/Archive/Cosmos.Sys/Network/ChadTCPIP/UDPPacket.cs deleted file mode 100644 index 4970d96927..0000000000 --- a/source/Archive/Cosmos.Sys/Network/ChadTCPIP/UDPPacket.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network -{ - // http://en.wikipedia.org/wiki/User_Datagram_Protocol - public class UDPPacket : IP4Packet { - protected new int mHeaderBegin; - - public UDPPacket(uint aSrcIP, UInt16 aSrcPort, uint aDestIP, UInt16 aDestPort, byte[] aData) { - mHeaderBegin = Initialize(aData, 8, 0x11, aSrcIP, aDestIP); - SourcePort = aSrcPort; - DestinationPort = aDestPort; - // Length - int xSize = mData.Length - mHeaderBegin; - mData[mHeaderBegin + 4] = (byte)(xSize >> 8); - mData[mHeaderBegin + 5] = (byte)xSize; - } - - public UDPPacket(byte[] aRawData) { - mData = aRawData; - } - - public UInt16 Length { - get { - return (UInt16)(mData[mHeaderBegin + 4] << 8 | mData[mHeaderBegin + 5]); - } - } - - // Properties are bound directly to data. For frequent updates this is slower - // but typically users will not make frequent updates. - // Doing it this way instead of storing in a property and inserted later - // saves memory, and also eliminates the need later to write separate - // parse routines when we receive packets. - public UInt16 SourcePort { - get { - return (UInt16)(mData[mHeaderBegin] << 8 | mData[mHeaderBegin + 1]); - } - set { - mData[mHeaderBegin] = (byte)(value >> 8); - mData[mHeaderBegin + 1] = (byte)value; - } - } - - public UInt16 DestinationPort { - get { - return (UInt16)(mData[mHeaderBegin + 2] << 8 | mData[mHeaderBegin + 3]); - } - set { - mData[mHeaderBegin + 2] = (byte)(value >> 8); - mData[mHeaderBegin + 3] = (byte)value; - } - } - - protected override void Conclude() { - base.Conclude(); - mData[mHeaderBegin + 6] = 0; - mData[mHeaderBegin + 7] = 0; - - // This needs to be updated. 0 is valid for no checksum, but this also - // is correct once updated - // All offsets are -34 now - //mData[40] = 0; - //mData[41] = 0; - - //// TODO: Change this to a ASM and use 32 bit addition - //UInt32 xResult = 0; - //// TODO: Adjust for length and odd sizes - //for (int i = 34; i < 42; i = i + 2) { - // xResult += (UInt16)((mData[i] << 8) + mData[i + 1]); - //} - //// Data - //xResult += (UInt16)((mData[42] << 8) + 0); - //// Pseudo header - //// --Protocol - //// TODO: Change to actually iterate data - //xResult += (UInt16)(mData[23]); - //// --IP Source - //xResult += (UInt16)((mData[26] << 8) + mData[27]); - //xResult += (UInt16)((mData[28] << 8) + mData[29]); - //// --IP Dest - //xResult += (UInt16)((mData[30] << 8) + mData[31]); - //xResult += (UInt16)((mData[32] << 8) + mData[33]); - //// --UDP Length - //xResult += (UInt16)((mData[38] << 8) + mData[39]); - - //xResult = (~((xResult & 0xFFFF) + (xResult >> 16))); - - //mData[40] = (byte)(xResult >> 8); - //mData[41] = (byte)xResult; - - //return (UInt16)xResult; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/IPv4Address.cs b/source/Archive/Cosmos.Sys/Network/IPv4Address.cs deleted file mode 100644 index aabcf24d86..0000000000 --- a/source/Archive/Cosmos.Sys/Network/IPv4Address.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Sys.Network -{ - public class IPv4Address : IComparable - { - public static IPv4Address Zero = new IPv4Address(0, 0, 0, 0); - - public byte[] address = new byte[4]; - - public IPv4Address(byte aFirst, byte aSecond, byte aThird, byte aFourth) - { - address[0] = aFirst; - address[1] = aSecond; - address[2] = aThird; - address[3] = aFourth; - } - - public IPv4Address(byte[] buffer, int offset) - { - if (buffer == null || buffer.Length < (offset + 4)) - throw new ArgumentException("buffer does not contain enough data starting at offset", "buffer"); - - address[0] = buffer[offset]; - address[1] = buffer[offset + 1]; - address[2] = buffer[offset + 2]; - address[3] = buffer[offset + 3]; - } - - public static IPv4Address Parse(string adr) - { - string[] fragments = adr.Split('.'); - if (fragments.Length == 4) - { - byte first = byte.Parse(fragments[0]); - byte second = byte.Parse(fragments[1]); - byte third = byte.Parse(fragments[2]); - byte fourth = byte.Parse(fragments[3]); - - return new IPv4Address(first, second, third, fourth); - } - else - { - return null; - } - } - - public bool IsLoopbackAddress() - { - if (address[0] == 127) - return true; - else - return false; - } - - public bool IsBroadcastAddress() - { - if (address[0] == 255) - { - return true; - } - - return false; - } - - public override string ToString() - { - return - address[0] + - "." + - address[1] + - "." + - address[2] + - "." + - address[3]; - } - - public byte[] ToByteArray() - { - return address; - } - - public UInt32 To32BitNumber() - { - return (UInt32)((address[0] << 24) | (address[1] << 16) | (address[2] << 8) | (address[3] << 0)); - } - - - #region IComparable Members - - public int CompareTo(object obj) - { - if (obj is IPv4Address) - { - IPv4Address other = (IPv4Address)obj; - int i = 0; - i = address[0].CompareTo(other.address[0]); - if (i != 0) return i; - i = address[1].CompareTo(other.address[1]); - if (i != 0) return i; - i = address[2].CompareTo(other.address[2]); - if (i != 0) return i; - i = address[3].CompareTo(other.address[3]); - if (i != 0) return i; - - return 0; - } - else - throw new ArgumentException("obj is not a IPv4Address", "obj"); - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.Sys/Network/IPv4Config.cs b/source/Archive/Cosmos.Sys/Network/IPv4Config.cs deleted file mode 100644 index 4773254fd0..0000000000 --- a/source/Archive/Cosmos.Sys/Network/IPv4Config.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Cosmos.Sys.Network -{ - public class IPv4Config - { - protected IPv4Address address; - protected IPv4Address defaultGateway; - protected IPv4Address subnetMask; - - public IPv4Config(IPv4Address ip, IPv4Address subnet) - : this(ip, subnet, IPv4Address.Zero) - {} - - public IPv4Config(IPv4Address ip, IPv4Address subnet, IPv4Address gw) - { - this.address = ip; - this.subnetMask = subnet; - this.defaultGateway = gw; - } - - public IPv4Address IPAddress - { - get { return this.address; } - } - public IPv4Address SubnetMask - { - get { return this.subnetMask; } - } - public IPv4Address DefaultGateway - { - get { return this.defaultGateway; } - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/IPv4EndPoint.cs b/source/Archive/Cosmos.Sys/Network/IPv4EndPoint.cs deleted file mode 100644 index d2867318ba..0000000000 --- a/source/Archive/Cosmos.Sys/Network/IPv4EndPoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.Sys.Network -{ - public class IPv4EndPoint - { - protected IPv4Address ipAddr; - protected UInt16 port; - - public IPv4EndPoint(IPv4Address addr, UInt16 port) - { - this.ipAddr = addr; - this.port = port; - } - - public IPv4Address IPAddress - { - get { return this.ipAddr; } - } - - public UInt16 Port - { - get { return this.port; } - } - - public override string ToString() - { - return this.ipAddr.ToString() + ":" + this.port.ToString(); - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPCache.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPCache.cs deleted file mode 100644 index c8bda9d834..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPCache.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP.ARP -{ - internal static class ARPCache - { - private static HW.TempDictionary cache; - - private static void ensureCacheExists() - { - if (cache == null) - { - cache = new HW.TempDictionary(); - } - } - - public static bool Contains(IPv4Address ipAddress) - { - ensureCacheExists(); - return cache.ContainsKey(ipAddress.To32BitNumber()); - } - - public static void Update(IPv4Address ipAddress, HW.Network.MACAddress macAddress) - { - ensureCacheExists(); - UInt32 ip_hash = ipAddress.To32BitNumber(); - if (ip_hash == 0) - { - return; - } - - if (cache.ContainsKey(ip_hash) == false) - { - cache.Add(ip_hash, macAddress); - } - else - { - cache[ip_hash] = macAddress; - } - } - - public static HW.Network.MACAddress Resolve(IPv4Address ipAddress) - { - ensureCacheExists(); - if (cache.ContainsKey(ipAddress.To32BitNumber()) == false) - { - return null; - } - - return cache[ipAddress.To32BitNumber()]; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket.cs deleted file mode 100644 index 612156025c..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP.ARP -{ - internal class ARPPacket : EthernetPacket - { - protected UInt16 aHardwareType; - protected UInt16 aProtocolType; - protected byte aHardwareLen; - protected byte aProtocolLen; - protected UInt16 aOperation; - - internal ARPPacket(byte[] rawData) - : base(rawData) - {} - - protected override void initFields() - { - base.initFields(); - aHardwareType = (UInt16)((mRawData[14] << 8) | mRawData[15]); - aProtocolType = (UInt16)((mRawData[16] << 8) | mRawData[17]); - aHardwareLen = mRawData[18]; - aProtocolLen = mRawData[19]; - aOperation = (UInt16)((mRawData[20] << 8) | mRawData[21]); - } - - protected ARPPacket(HW.Network.MACAddress dest, HW.Network.MACAddress src, UInt16 hwType, UInt16 protoType, - byte hwLen, byte protoLen, UInt16 operation, int packet_size) - : base(dest, src, 0x0806, packet_size) - { - mRawData[14] = (byte)(hwType >> 8); - mRawData[15] = (byte)(hwType >> 0); - mRawData[16] = (byte)(protoType >> 8); - mRawData[17] = (byte)(protoType >> 0); - mRawData[18] = hwLen; - mRawData[19] = protoLen; - mRawData[20] = (byte)(operation >> 8); - mRawData[21] = (byte)(operation >> 0); - - initFields(); - } - - internal UInt16 Operation - { - get { return this.aOperation; } - } - internal UInt16 HardwareType - { - get { return this.aHardwareType; } - } - internal UInt16 ProtocolType - { - get { return this.aProtocolType; } - } - - public override string ToString() - { - return "ARP Packet Src=" + srcMAC + ", Dest=" + destMAC + ", HWType=" + aHardwareType + ", Protocol=" + aProtocolType + - ", Operation=" + Operation; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket_EthernetIPv4.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket_EthernetIPv4.cs deleted file mode 100644 index f9e9c8be3a..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPPacket_EthernetIPv4.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP.ARP -{ - internal abstract class ARPPacket_EthernetIPv4 : ARPPacket - { - protected HW.Network.MACAddress mSenderMAC; - protected HW.Network.MACAddress mTargetMAC; - protected IPv4Address mSenderIP; - protected IPv4Address mTargetIP; - - internal ARPPacket_EthernetIPv4(byte[] rawData) - : base(rawData) - {} - - protected override void initFields() - { - base.initFields(); - mSenderMAC = new HW.Network.MACAddress(mRawData, 22); - mSenderIP = new IPv4Address(mRawData, 28); - mTargetMAC = new HW.Network.MACAddress(mRawData, 32); - mTargetIP = new IPv4Address(mRawData, 38); - } - - protected ARPPacket_EthernetIPv4(UInt16 operation, HW.Network.MACAddress senderMAC, IPv4Address senderIP, - HW.Network.MACAddress targetMAC, IPv4Address targetIP, int packet_size) - : base(targetMAC, senderMAC, 1, 0x0800, 6, 4, operation, packet_size) - { - for (int i = 0; i < 6; i++) - { - mRawData[22 + i] = senderMAC.bytes[i]; - mRawData[32 + i] = targetMAC.bytes[i]; - } - for (int i = 0; i < 4; i++) - { - mRawData[28 + i] = senderIP.address[i]; - mRawData[38 + i] = targetIP.address[i]; - } - - initFields(); - } - - internal HW.Network.MACAddress SenderMAC - { - get { return this.mSenderMAC; } - } - internal HW.Network.MACAddress TargetMAC - { - get { return this.mTargetMAC; } - } - internal IPv4Address SenderIP - { - get { return this.mSenderIP; } - } - internal IPv4Address TargetIP - { - get { return this.mTargetIP; } - } - - public override string ToString() - { - return "IPv4 Ethernet ARP Packet SenderMAC=" + mSenderMAC + ", TargetMAC=" + mTargetMAC + ", SenderIP=" + mSenderIP + - ", TargetIP=" + mTargetIP + ", Operation=" + aOperation; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPReply_EthernetIPv4.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPReply_EthernetIPv4.cs deleted file mode 100644 index e286119fff..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPReply_EthernetIPv4.cs +++ /dev/null @@ -1,20 +0,0 @@ -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP.ARP -{ - internal class ARPReply_EthernetIPv4 : ARPPacket_EthernetIPv4 - { - internal ARPReply_EthernetIPv4(byte[] rawData) - : base(rawData) - {} - - internal ARPReply_EthernetIPv4(HW.Network.MACAddress ourMAC, IPv4Address ourIP, HW.Network.MACAddress targetMAC, IPv4Address targetIP) - : base(2, ourMAC, ourIP, targetMAC, targetIP, 42) - {} - - public override string ToString() - { - return "ARP Reply Src=" + srcMAC + ", Dest=" + destMAC + ", Sender=" + mSenderIP + ", Target=" + mTargetIP; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPRequest_EthernetIPv4.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPRequest_EthernetIPv4.cs deleted file mode 100644 index 7dde862793..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ARP/ARPRequest_EthernetIPv4.cs +++ /dev/null @@ -1,20 +0,0 @@ -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP.ARP -{ - internal class ARPRequest_EthernetIPv4 : ARPPacket_EthernetIPv4 - { - internal ARPRequest_EthernetIPv4(byte[] rawData) - : base(rawData) - {} - - internal ARPRequest_EthernetIPv4(HW.Network.MACAddress ourMAC, IPv4Address ourIP, HW.Network.MACAddress targetMAC, IPv4Address targetIP) - : base(1, ourMAC, ourIP, targetMAC, targetIP, 42) - { } - - public override string ToString() - { - return "ARP Request Src=" + srcMAC + ", Dest=" + destMAC + ", Sender=" + mSenderIP + ", Target=" + mTargetIP; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/EthernetPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/EthernetPacket.cs deleted file mode 100644 index f9915f8c3f..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/EthernetPacket.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using HW = Cosmos.Hardware2; -using Cosmos.Kernel; - -namespace Cosmos.Sys.Network.TCPIP -{ - internal class EthernetPacket - { - protected byte[] mRawData; - protected HW.Network.MACAddress srcMAC; - protected HW.Network.MACAddress destMAC; - protected UInt16 aEtherType; - - internal EthernetPacket(byte[] rawData) - { - mRawData = rawData; - initFields(); - } - - protected virtual void initFields() - { - destMAC = new HW.Network.MACAddress(mRawData, 0); - srcMAC = new HW.Network.MACAddress(mRawData, 6); - aEtherType = (UInt16)((mRawData[12] << 8) | mRawData[13]); - } - - protected EthernetPacket(UInt16 type, int packet_size) - : this(HW.Network.MACAddress.None, HW.Network.MACAddress.None, type, packet_size) - { - } - - protected EthernetPacket(HW.Network.MACAddress dest, HW.Network.MACAddress src, UInt16 type, int packet_size) - { - mRawData = new byte[packet_size]; - for (int i = 0; i < 6; i++) - { - mRawData[i] = dest.bytes[i]; - mRawData[6 + i] = src.bytes[i]; - } - - mRawData[12] = (byte)(type >> 8); - mRawData[13] = (byte)(type >> 0); - initFields(); - } - - internal HW.Network.MACAddress SourceMAC - { - get { return this.srcMAC; } - set - { - for (int i = 0; i < 6; i++) - { - mRawData[6+i] = value.bytes[i]; - } - initFields(); - } - } - internal HW.Network.MACAddress DestinationMAC - { - get { return this.destMAC; } - set - { - for (int i = 0; i < 6; i++) - { - mRawData[i] = value.bytes[i]; - } - initFields(); - } - } - internal UInt16 EthernetType - { - get { return this.aEtherType; } - } - - internal byte[] GetBytes() - { - return this.mRawData; - } - - internal byte[] RawData - { - get { return this.mRawData; } - } - - public override string ToString() - { - return ""; // "Ethernet Packet : Src=" + srcMAC + ", Dest=" + destMAC + ", Type=" + aEtherType.ToHex(4); - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoReply.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoReply.cs deleted file mode 100644 index 442367f28a..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoReply.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; - -namespace Cosmos.Sys.Network.TCPIP.ICMP -{ - internal class ICMPEchoReply : ICMPPacket - { - protected UInt16 icmpID; - protected UInt16 icmpSequence; - - internal ICMPEchoReply(byte[] rawData) - : base(rawData) - {} - - protected override void initFields() - { - base.initFields(); - icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); - } - - internal ICMPEchoReply(ICMPEchoRequest request) - : base(request.DestinationIP, request.SourceIP, 0, 0, - request.ICMP_ID, request.ICMP_Sequence, (UInt16)(request.ICMP_DataLength + 8)) - { - for (int b = 0; b < this.ICMP_DataLength; b++) - { - mRawData[this.dataOffset + 8 + b] = request.RawData[this.dataOffset + 8 + b]; - } - - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); - } - - internal UInt16 ICMP_ID - { - get { return this.icmpID; } - } - internal UInt16 ICMP_Sequence - { - get { return this.icmpSequence; } - } - - public override string ToString() - { - return "ICMP Echo Reply Src=" + sourceIP + ", Dest=" + destIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoRequest.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoRequest.cs deleted file mode 100644 index 40e5d3e7b3..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPEchoRequest.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -namespace Cosmos.Sys.Network.TCPIP.ICMP -{ - internal class ICMPEchoRequest : ICMPPacket - { - protected UInt16 icmpID; - protected UInt16 icmpSequence; - - internal ICMPEchoRequest(byte[] rawData) - : base(rawData) - {} - - internal ICMPEchoRequest(IPv4Address source, IPv4Address dest, UInt16 id, UInt16 sequence) - : base(source, dest, 8, 0, id, sequence, 40) - { - for (byte b = 8; b < this.ICMP_DataLength; b++) - { - mRawData[this.dataOffset + b] = b; - } - - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); - } - - protected override void initFields() - { - base.initFields(); - icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); - } - - internal UInt16 ICMP_ID - { - get { return this.icmpID; } - } - internal UInt16 ICMP_Sequence - { - get { return this.icmpSequence; } - } - - public override string ToString() - { - return "ICMP Echo Request Src=" + sourceIP + ", Dest=" + destIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPPacket.cs deleted file mode 100644 index b9dba19d05..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/ICMP/ICMPPacket.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; - -namespace Cosmos.Sys.Network.TCPIP.ICMP -{ - internal class ICMPPacket : IPPacket - { - protected byte icmpType; - protected byte icmpCode; - protected UInt16 icmpCRC; - - public ICMPPacket(byte[] rawData) - : base(rawData) - {} - - protected override void initFields() - { - base.initFields(); - icmpType = mRawData[this.dataOffset]; - icmpCode = mRawData[this.dataOffset + 1]; - icmpCRC = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]); - } - - internal ICMPPacket(IPv4Address source, IPv4Address dest, byte type, byte code, UInt16 id, UInt16 seq, UInt16 icmpDataSize) - : base(icmpDataSize, 1, source, dest) - { - mRawData[this.dataOffset] = type; - mRawData[this.dataOffset + 1] = code; - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - mRawData[this.dataOffset + 4] = (byte)((id >> 8) & 0xFF); - mRawData[this.dataOffset + 5] = (byte)((id >> 0) & 0xFF); - mRawData[this.dataOffset + 6] = (byte)((seq >> 8) & 0xFF); - mRawData[this.dataOffset + 7] = (byte)((seq >> 0) & 0xFF); - - icmpCRC = CalcICMPCRC((UInt16)(icmpDataSize + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); - initFields(); - } - - protected UInt16 CalcICMPCRC(UInt16 length) - { - return CalcOcCRC(this.dataOffset, length); - } - - internal byte ICMP_Type - { - get { return this.icmpType; } - } - internal byte ICMP_Code - { - get { return this.icmpCode; } - } - internal UInt16 ICMP_CRC - { - get { return this.icmpCRC; } - } - internal UInt16 ICMP_DataLength - { - get { return (UInt16)(this.DataLength - 8); } - } - - internal byte[] GetICMPData() - { - byte[] data = new byte[ICMP_DataLength]; - - for (int b = 0; b < ICMP_DataLength; b++) - { - data[b] = mRawData[this.dataOffset + 8 + b]; - } - - return data; - } - - public override string ToString() - { - return "ICMP Packet Src=" + sourceIP + ", Dest=" + destIP + ", Type=" + icmpType + ", Code=" + icmpCode; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/IPPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/IPPacket.cs deleted file mode 100644 index 2c3728a2ef..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/IPPacket.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using HW = Cosmos.Hardware2; - -namespace Cosmos.Sys.Network.TCPIP -{ - internal class IPPacket : EthernetPacket - { - protected byte ipVersion; - protected byte ipHeaderLength; - protected byte tos; - protected UInt16 ipLength; - protected UInt16 fragmentID; - protected UInt16 fragmentOffset; - protected byte flags; - protected byte ttl; - protected byte proto; - protected UInt16 ipCRC; - protected IPv4Address sourceIP; - protected IPv4Address destIP; - protected UInt16 dataOffset; - - internal IPPacket(byte[] rawData) - : base(rawData) - {} - - protected override void initFields() - { - base.initFields(); - ipVersion = (byte)((mRawData[14] & 0xF0) >> 4); - ipHeaderLength = (byte)(mRawData[14] & 0x0F); - tos = mRawData[15]; - ipLength = (UInt16)((mRawData[16] << 8) | mRawData[17]); - fragmentID = (UInt16)((mRawData[18] << 8) | mRawData[19]); - flags = (byte)((mRawData[20] & 0xE0) >> 5); - fragmentOffset = (UInt16)(((mRawData[20] & 0x1F) << 8) | mRawData[21]); - ttl = mRawData[22]; - proto = mRawData[23]; - ipCRC = (UInt16)((mRawData[24] << 8) | mRawData[25]); - sourceIP = new IPv4Address(mRawData, 26); - destIP = new IPv4Address(mRawData, 30); - dataOffset = (UInt16)(14 + HeaderLength); - } - - protected IPPacket(UInt16 dataLength, byte protocol, IPv4Address source, IPv4Address dest) - : this(HW.Network.MACAddress.None, HW.Network.MACAddress.None, dataLength, protocol, source, dest) - { } - - private IPPacket(HW.Network.MACAddress srcMAC, HW.Network.MACAddress destMAC, UInt16 dataLength, byte protocol, - IPv4Address source, IPv4Address dest) - : base(destMAC, srcMAC, 0x0800, dataLength + 14 + 20) - { - mRawData[14] = 0x45; - mRawData[15] = 0; - ipLength = (UInt16)(dataLength + 20); - ipHeaderLength = 5; - mRawData[16] = (byte)((ipLength >> 8) & 0xFF); - mRawData[17] = (byte)((ipLength >> 0) & 0xFF); - fragmentID = TCPIPStack.NextIPFragmentID(); - mRawData[18] = (byte)((fragmentID >> 8) & 0xFF); - mRawData[19] = (byte)((fragmentID >> 0) & 0xFF); - mRawData[20] = 0x00; - mRawData[21] = 0x00; - mRawData[22] = 0x80; - mRawData[23] = protocol; - mRawData[24] = 0x00; - mRawData[25] = 0x00; - for (int b = 0; b < 4; b++) - { - mRawData[26 + b] = source.address[b]; - mRawData[30 + b] = dest.address[b]; - } - ipCRC = CalcIPCRC(20); - mRawData[24] = (byte)((ipCRC >> 8) & 0xFF); - mRawData[25] = (byte)((ipCRC >> 0) & 0xFF); - - initFields(); - } - - protected UInt16 CalcOcCRC(UInt16 offset, UInt16 length) - { - return IPPacket.CalcOcCRC(this.RawData, offset, length); - } - - protected static UInt16 CalcOcCRC(byte[] buffer, UInt16 offset, int length) - { - UInt32 crc = 0; - - for (UInt16 w = offset; w < offset + length; w += 2) - { - crc += (UInt16)((buffer[w] << 8) | buffer[w + 1]); - } - - crc = (~((crc & 0xFFFF) + (crc >> 16))); - - return (UInt16)crc; - } - - protected UInt16 CalcIPCRC(UInt16 headerLength) - { - return CalcOcCRC(14, headerLength); - } - - internal byte IPVersion - { - get { return this.ipVersion; } - } - internal UInt16 HeaderLength - { - get { return (UInt16)(this.ipHeaderLength * 4); } - } - internal byte TypeOfService - { - get { return this.tos; } - } - internal UInt16 IPLength - { - get { return this.ipLength; } - } - internal UInt16 FragmentID - { - get { return this.fragmentID; } - } - internal UInt16 FragmentOffset - { - get { return this.fragmentOffset; } - } - internal byte Flags - { - get { return this.flags; } - } - internal byte TTL - { - get { return this.ttl; } - } - internal byte Protocol - { - get { return this.proto; } - } - internal UInt16 IPCRC - { - get { return this.ipCRC; } - } - internal IPv4Address SourceIP - { - get { return this.sourceIP; } - } - internal IPv4Address DestinationIP - { - get { return this.destIP; } - } - internal UInt16 DataLength - { - get { return (UInt16)(this.ipLength - this.HeaderLength); } - } - - public override string ToString() - { - return "IP Packet Src=" + sourceIP + ", Dest=" + destIP + ", Protocol=" + proto + ", TTL=" + ttl + ", DataLen=" + DataLength; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/IPv4OutgoingBuffer.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/IPv4OutgoingBuffer.cs deleted file mode 100644 index 8b9cf469f2..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/IPv4OutgoingBuffer.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System.Collections.Generic; -using HW = Cosmos.Hardware2; -using System; - -namespace Cosmos.Sys.Network.TCPIP -{ - internal static class IPv4OutgoingBuffer - { - private class BufferEntry - { - public enum EntryStatus { ADDED, ARP_SENT, ROUTE_ARP_SENT, JUST_SEND, DONE }; - - public HW.Network.NetworkDevice NIC; - public IPPacket Packet; - public EntryStatus Status; - public IPv4Address nextHop; - - public BufferEntry(HW.Network.NetworkDevice nic, IPPacket packet) - { - this.NIC = nic; - this.Packet = packet; - this.Status = EntryStatus.ADDED; - } - } - - private static List queue; - - private static void ensureQueueExists() - { - if (queue == null) - { - queue = new List(); - } - } - - internal static void AddPacket(IPPacket packet) - { - ensureQueueExists(); - HW.Network.NetworkDevice nic = TCPIPStack.FindInterface(packet.SourceIP); - packet.SourceMAC = nic.MACAddress; - queue.Add(new BufferEntry(nic, packet)); - } - - internal static void Send() - { - ensureQueueExists(); - if (queue.Count < 1) - { - return; - } - - //foreach (BufferEntry entry in queue) - for (int e = 0; e < queue.Count; e++) - { - BufferEntry entry = queue[e]; - if (entry.Status == BufferEntry.EntryStatus.ADDED) - { - if (TCPIPStack.IsLocalAddress(entry.Packet.DestinationIP) == false) - { - entry.nextHop = TCPIPStack.FindRoute(entry.Packet.DestinationIP); - if (entry.nextHop == null) - { - entry.Status = BufferEntry.EntryStatus.DONE; - continue; - } - - if (ARP.ARPCache.Contains(entry.nextHop) == true) - { - entry.Packet.DestinationMAC = ARP.ARPCache.Resolve(entry.nextHop); - - entry.NIC.QueueBytes(entry.Packet.RawData); - - entry.Status = BufferEntry.EntryStatus.DONE; - } - else - { - ARP.ARPRequest_EthernetIPv4 arp_request = new ARP.ARPRequest_EthernetIPv4(entry.NIC.MACAddress, entry.Packet.SourceIP, - HW.Network.MACAddress.Broadcast, entry.nextHop); - - entry.NIC.QueueBytes(arp_request.RawData); - - entry.Status = BufferEntry.EntryStatus.ROUTE_ARP_SENT; - } - continue; - } - - if (ARP.ARPCache.Contains(entry.Packet.DestinationIP) == true) - { - entry.Packet.DestinationMAC = ARP.ARPCache.Resolve(entry.Packet.DestinationIP); - - entry.NIC.QueueBytes(entry.Packet.RawData); - - entry.Status = BufferEntry.EntryStatus.DONE; - } - else - { - ARP.ARPRequest_EthernetIPv4 arp_request = new ARP.ARPRequest_EthernetIPv4(entry.NIC.MACAddress, entry.Packet.SourceIP, - HW.Network.MACAddress.Broadcast, entry.Packet.DestinationIP); - - entry.NIC.QueueBytes(arp_request.RawData); - - entry.Status = BufferEntry.EntryStatus.ARP_SENT; - } - } - else if (entry.Status == BufferEntry.EntryStatus.JUST_SEND) - { - entry.NIC.QueueBytes(entry.Packet.RawData); - - entry.Status = BufferEntry.EntryStatus.DONE; - } - } - - int i = 0; - while (i < queue.Count) - { - if (queue[i].Status == BufferEntry.EntryStatus.DONE) - { - queue.RemoveAt(i); - } - else - { - i++; - } - } - } - - internal static void ARPCache_Update(ARP.ARPReply_EthernetIPv4 arp_reply) - { - ensureQueueExists(); - //foreach (BufferEntry entry in queue) - for (int e = 0; e < queue.Count; e++) - { - BufferEntry entry = queue[e]; - if (entry.Status == BufferEntry.EntryStatus.ARP_SENT) - { - if (entry.Packet.DestinationIP.CompareTo(arp_reply.SenderIP) == 0) - { - entry.Packet.DestinationMAC = arp_reply.SenderMAC; - - entry.Status = BufferEntry.EntryStatus.JUST_SEND; - } - } - else if (entry.Status == BufferEntry.EntryStatus.ROUTE_ARP_SENT) - { - if (entry.nextHop.CompareTo(arp_reply.SenderIP) == 0) - { - entry.Packet.DestinationMAC = arp_reply.SenderMAC; - - entry.Status = BufferEntry.EntryStatus.JUST_SEND; - } - } - } - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPConnection.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPConnection.cs deleted file mode 100644 index e6af5d9b7f..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPConnection.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace Cosmos.Sys.Network.TCPIP.TCP -{ - internal class TCPConnection - { - internal enum State { SYN_SENT, SYN_RECVD, ESTABLISHED, TIMEWAIT }; - - protected UInt64 socket; - protected IPv4EndPoint remoteEndpoint; - protected IPv4EndPoint localEndpoint; - protected UInt32 remoteSeqNumber; - protected UInt32 localSeqNumber; - protected State state; - internal TcpClient client; - - internal TCPConnection(IPv4Address remoteIP, UInt16 remotePort, IPv4Address localIP, UInt16 localPort, - UInt32 initialSeqNumber, State initialState) - { - this.remoteEndpoint = new IPv4EndPoint(remoteIP, remotePort); - this.localEndpoint = new IPv4EndPoint(localIP, localPort); - this.remoteSeqNumber = initialSeqNumber; - this.localSeqNumber = 0x3040; - - this.state = initialState; - - // TODO: have socket be a hash key we can use to find connections quickly - this.socket = remotePort; - } - - internal IPv4EndPoint RemoteEndpoint - { - get { return this.remoteEndpoint; } - } - internal IPv4Address RemoteIP - { - get { return this.remoteEndpoint.IPAddress; } - } - internal UInt16 RemotePort - { - get { return this.remoteEndpoint.Port; } - } - internal IPv4EndPoint LocalEndpoint - { - get { return this.localEndpoint; } - } - internal IPv4Address LocalIP - { - get { return this.localEndpoint.IPAddress; } - } - internal UInt16 LocalPort - { - get { return this.localEndpoint.Port; } - } - internal State ConnectionState - { - get { return this.state; } - set { this.state = value; } - } - internal UInt64 Socket - { - get { return this.socket; } - } - internal UInt32 LocalSequenceNumber - { - get { return this.localSeqNumber; } - set { this.localSeqNumber = value; } - } - internal UInt32 RemoteSequenceNumber - { - get { return this.remoteSeqNumber; } - set { this.remoteSeqNumber = value; } - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPPacket.cs deleted file mode 100644 index 951127fe69..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/TCP/TCPPacket.cs +++ /dev/null @@ -1,246 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Cosmos.Kernel; - -namespace Cosmos.Sys.Network.TCPIP.TCP -{ - internal class TCPPacket : IPPacket - { - private const byte CWR = 0x80; - private const byte ECE = 0x40; - private const byte URG = 0x20; - private const byte ACK = 0x10; - private const byte PSH = 0x08; - private const byte RST = 0x04; - private const byte SYN = 0x02; - private const byte FIN = 0x01; - - protected UInt16 sourcePort; - protected UInt16 destPort; - protected UInt32 seqNum; - protected UInt32 ackNum; - protected byte tcpHeaderDWords; - protected byte tcpFlags; - protected UInt16 windowSize; - protected UInt16 tcpChecksum; - protected UInt16 urgentPointer; - protected UInt16 tcpDataOffset; - protected int numOptions; - protected int optionsLength; - protected byte optionsOffset = 20; - - internal TCPPacket(byte[] rawData) - : base(rawData) - { } - - internal TCPPacket(TCPConnection connection, UInt32 seqNum, UInt32 ackNum, byte tcpFlags, UInt16 winSize) - : this(connection.LocalIP, connection.RemoteIP, connection.LocalPort, connection.RemotePort, seqNum, - ackNum, tcpFlags, winSize) - { } - - internal TCPPacket(TCPConnection connection, UInt32 seqNum, UInt32 ackNum, byte tcpFlags, UInt16 winSize, byte optionCount) - : this(connection.LocalIP, connection.RemoteIP, connection.LocalPort, connection.RemotePort, seqNum, - ackNum, tcpFlags, winSize, null, 0, (optionCount * 4)) - { } - - internal TCPPacket(IPv4Address source, IPv4Address dest, UInt16 srcPort, UInt16 destPort, - UInt32 seqNum, UInt32 ackNum, byte tcpFlags, UInt16 winSize) - : this(source, dest, srcPort, destPort, seqNum, ackNum, tcpFlags, winSize, null, 0, 0) - { } - - internal TCPPacket(IPv4Address source, IPv4Address dest, UInt16 srcPort, UInt16 destPort, - UInt32 seqNum, UInt32 ackNum, byte tcpFlags, UInt16 winSize, byte[] data) - : this(source, dest, srcPort, destPort, seqNum, ackNum, tcpFlags, winSize, data, data.Length, 0) - { } - - internal TCPPacket(IPv4Address source, IPv4Address dest, UInt16 srcPort, UInt16 destPort, - UInt32 seqNum, UInt32 ackNum, byte tcpFlags, UInt16 winSize, byte[] data, int dataLength, int optionLength) - : base((UInt16)(dataLength + 20 + optionLength), 6, source, dest) - { - numOptions = optionLength / 4; - this.optionsLength = optionLength; - - mRawData[this.dataOffset + 0] = (byte)((srcPort >> 8) & 0xFF); - mRawData[this.dataOffset + 1] = (byte)((srcPort >> 0) & 0xFF); - mRawData[this.dataOffset + 2] = (byte)((destPort >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((destPort >> 0) & 0xFF); - mRawData[this.dataOffset + 4] = (byte)((seqNum >> 24) & 0xFF); - mRawData[this.dataOffset + 5] = (byte)((seqNum >> 16) & 0xFF); - mRawData[this.dataOffset + 6] = (byte)((seqNum >> 8) & 0xFF); - mRawData[this.dataOffset + 7] = (byte)((seqNum >> 0) & 0xFF); - mRawData[this.dataOffset + 8] = (byte)((ackNum >> 24) & 0xFF); - mRawData[this.dataOffset + 9] = (byte)((ackNum >> 16) & 0xFF); - mRawData[this.dataOffset + 10] = (byte)((ackNum >> 8) & 0xFF); - mRawData[this.dataOffset + 11] = (byte)((ackNum >> 0) & 0xFF); - mRawData[this.dataOffset + 12] = (byte)((5 + numOptions) << 4); - mRawData[this.dataOffset + 13] = tcpFlags; - mRawData[this.dataOffset + 14] = (byte)((winSize >> 8) & 0xFF); - mRawData[this.dataOffset + 15] = (byte)((winSize >> 0) & 0xFF); - mRawData[this.dataOffset + 16] = 0x00; - mRawData[this.dataOffset + 17] = 0x00; - mRawData[this.dataOffset + 18] = 0x00; - mRawData[this.dataOffset + 19] = 0x00; - - initFields(); - if (data != null) - { - for (int b = 0; b < data.Length; b++) - { - mRawData[this.tcpDataOffset + b] = data[b]; - } - } - - RecalcCRC(); - } - - private void RecalcCRC() - { - mRawData[this.dataOffset + 16] = 0x00; - mRawData[this.dataOffset + 17] = 0x00; - tcpChecksum = this.CalcTCPCRC(); - mRawData[this.dataOffset + 16] = (byte)((tcpChecksum >> 8) & 0xFF); - mRawData[this.dataOffset + 17] = (byte)((tcpChecksum >> 0) & 0xFF); - } - - private UInt16 CalcTCPCRC() - { - UInt16 crc; - - byte[] tempHeader = new byte[32 + TCP_DataLength + optionsLength]; - for (int b = 0; b < 8; b++) - { - tempHeader[b] = mRawData[26 + b]; - } - tempHeader[9] = 6; - tempHeader[10] = (byte)(this.TCP_Length >> 8); - tempHeader[11] = (byte)(this.TCP_Length & 0xFF); - for (int b = 0; b < 20 + optionsLength; b++) - { - tempHeader[12 + b] = mRawData[this.dataOffset + b]; - } - for (int b = 0; b < this.TCP_DataLength; b++) - { - tempHeader[32 + optionsLength + b] = mRawData[this.tcpDataOffset + b]; - } - - crc = IPPacket.CalcOcCRC(tempHeader, 0, tempHeader.Length); - - return crc; - } - - protected override void initFields() - { - base.initFields(); - sourcePort = (UInt16)((mRawData[this.dataOffset] << 8) | mRawData[this.dataOffset + 1]); - destPort = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]); - seqNum = (UInt32)((mRawData[this.dataOffset + 4] << 24) | (mRawData[this.dataOffset + 5] << 16) | - (mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); - ackNum = (UInt32)((mRawData[this.dataOffset + 8] << 24) | (mRawData[this.dataOffset + 9] << 16) | - (mRawData[this.dataOffset + 10] << 8) | mRawData[this.dataOffset + 11]); - tcpHeaderDWords = (byte)((mRawData[this.dataOffset + 12] & 0xF0) >> 4); - tcpFlags = mRawData[this.dataOffset + 13]; - windowSize = (UInt16)((mRawData[this.dataOffset + 14] << 8) | mRawData[this.dataOffset + 15]); - tcpChecksum = (UInt16)((mRawData[this.dataOffset + 16] << 8) | mRawData[this.dataOffset + 17]); - urgentPointer = (UInt16)((mRawData[this.dataOffset + 18] << 8) | mRawData[this.dataOffset + 19]); - - tcpDataOffset = (UInt16)(this.dataOffset + (this.tcpHeaderDWords * 4)); - } - - internal UInt16 DestinationPort - { - get { return this.destPort; } - } - internal UInt16 SourcePort - { - get { return this.sourcePort; } - } - internal UInt32 SequenceNumber - { - get { return this.seqNum; } - } - internal UInt32 AckNumber - { - get { return this.ackNum; } - } - internal byte TCP_Flags - { - get { return this.tcpFlags; } - } - internal UInt16 WindowSize - { - get { return this.windowSize; } - } - internal UInt16 TCPCRC - { - get { return this.tcpChecksum; } - } - internal UInt16 TCP_Length - { - get { return (UInt16)(this.ipLength - this.HeaderLength); } - } - internal UInt16 TCP_HeaderLength - { - get { return (UInt16)(this.tcpHeaderDWords * 4); } - } - internal UInt16 TCP_HeaderWords - { - get { return this.tcpHeaderDWords; } - } - internal UInt16 TCP_DataLength - { - get { return (UInt16)(this.TCP_Length - this.TCP_HeaderLength); } - } - internal bool Syn - { - get { return ((this.tcpFlags & SYN) != 0); } - } - internal bool Fin - { - get { return ((this.tcpFlags & FIN) != 0); } - } - internal bool Ack - { - get { return ((this.tcpFlags & ACK) != 0); } - } - internal byte[] TCP_Data - { - get - { - byte[] data = new byte[this.TCP_DataLength]; - - for (int b = 0; b < data.Length; b++) - { - data[b] = this.mRawData[this.tcpDataOffset + b]; - } - - return data; - } - } - - public override string ToString() - { - return ""; // "TCP Packet Src=" + sourceIP + ":" + sourcePort + ", Dest=" + destIP + ":" + destPort + - //",Flags=" + tcpFlags.ToHex(2) + ",SeqNo=" + seqNum + ",AckNum=" + ackNum + ", DataLen=" + TCP_DataLength; - } - - internal void AddMSSOption(int mss) - { - mRawData[this.dataOffset + optionsOffset] = 0x02; - mRawData[this.dataOffset + optionsOffset + 1] = 0x04; - mRawData[this.dataOffset + optionsOffset + 2] = (byte)(mss >> 8); - mRawData[this.dataOffset + optionsOffset + 3] = (byte)(mss & 0xFF); - optionsOffset += 4; - RecalcCRC(); - } - internal void AddSACKOption() - { - mRawData[this.dataOffset + optionsOffset] = 0x01; - mRawData[this.dataOffset + optionsOffset + 1] = 0x01; - mRawData[this.dataOffset + optionsOffset + 2] = 0x04; - mRawData[this.dataOffset + optionsOffset + 3] = 0x02; - optionsOffset += 4; - RecalcCRC(); - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIP/UDP/UDPPacket.cs b/source/Archive/Cosmos.Sys/Network/TCPIP/UDP/UDPPacket.cs deleted file mode 100644 index b75f4cfe6e..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIP/UDP/UDPPacket.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; - -namespace Cosmos.Sys.Network.TCPIP.UDP -{ - internal class UDPPacket : IPPacket - { - protected UInt16 sourcePort; - protected UInt16 destPort; - protected UInt16 udpLen; - protected UInt16 udpCRC; - - internal UDPPacket(byte[] rawData) - : base(rawData) - {} - - internal UDPPacket(IPv4Address source, IPv4Address dest, UInt16 srcPort, UInt16 destPort, byte[] data) - : base((UInt16)(data.Length+8), 17, source, dest) - { - mRawData[this.dataOffset + 0] = (byte)((srcPort >> 8) & 0xFF); - mRawData[this.dataOffset + 1] = (byte)((srcPort >> 0) & 0xFF); - mRawData[this.dataOffset + 2] = (byte)((destPort >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((destPort >> 0) & 0xFF); - udpLen = (UInt16)(data.Length + 8); - mRawData[this.dataOffset + 4] = (byte)((udpLen >> 8) & 0xFF); - mRawData[this.dataOffset + 5] = (byte)((udpLen >> 0) & 0xFF); - mRawData[this.dataOffset + 6] = 0; - mRawData[this.dataOffset + 7] = 0; - for (int b = 0; b < data.Length; b++) - { - mRawData[this.dataOffset + 8 + b] = data[b]; - } - - initFields(); - } - - protected override void initFields() - { - base.initFields(); - sourcePort = (UInt16)((mRawData[this.dataOffset] << 8) | mRawData[this.dataOffset + 1]); - destPort = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]); - udpLen = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - udpCRC = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); - } - - internal UInt16 DestinationPort - { - get { return this.destPort; } - } - internal UInt16 SourcePort - { - get { return this.sourcePort; } - } - internal UInt16 UDP_Length - { - get { return this.udpLen; } - } - internal UInt16 UDP_DataLength - { - get { return (UInt16)(this.udpLen - 8); } - } - internal byte[] UDP_Data - { - get - { - byte[] data = new byte[this.udpLen - 8]; - - for (int b = 0; b < data.Length; b++) - { - data[b] = this.mRawData[this.dataOffset + 8 + b]; - } - - return data; - } - } - - public override string ToString() - { - return "UDP Packet Src=" + sourceIP + ":" + sourcePort + ", Dest=" + destIP + ":" + destPort + ", DataLen=" + UDP_DataLength; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TCPIPStack.cs b/source/Archive/Cosmos.Sys/Network/TCPIPStack.cs deleted file mode 100644 index 91c66ba2fa..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TCPIPStack.cs +++ /dev/null @@ -1,411 +0,0 @@ -using System; -using System.Collections.Generic; -using HW = Cosmos.Hardware2; -using ARP = Cosmos.Sys.Network.TCPIP.ARP; -using ICMP = Cosmos.Sys.Network.TCPIP.ICMP; -using UDP = Cosmos.Sys.Network.TCPIP.UDP; -using TCP = Cosmos.Sys.Network.TCPIP.TCP; - -namespace Cosmos.Sys.Network -{ - /// - /// Data Received function delegate for UDP protocol - /// - /// Endpoint that data was received from - /// Data received in the packet - public delegate void DataReceived(IPv4EndPoint source, byte[] data); - - /// - /// New TCP Client connection delegate - /// - /// Instance of the that represents the connection - public delegate void ClientConnected(TcpClient client); - /// - /// TCP Client Data Received delegate - /// - /// instance that data was received on - /// Byte buffer of the received data - public delegate void ClientDataReceived(TcpClient client, byte[] data); - - /// - /// TCP Client disconnection delegate - /// - /// Instance of the that represents the connection - public delegate void ClientDisconnected(TcpClient client); - - /// - /// Implements a TCP/IP Stack on top of Cosmos - /// - public static class TCPIPStack - { - private static UInt16 sNextFragmentID; - - private static HW.TempDictionary addressMap; - private static List ipConfigs; - private static HW.TempDictionary udpClients; - private static HW.TempDictionary tcpListeners; - internal static List tcpSockets; - - /// - /// Initialize the TCP/IP Stack variables - /// - public static void Init() - { - addressMap = new HW.TempDictionary(); - ipConfigs = new List(); - udpClients = new HW.TempDictionary(); - tcpListeners = new HW.TempDictionary(); - tcpSockets = new List(); - } - - /// - /// Configure the IP address setup for a given network card - /// - /// Network Device to configure - /// Configuration - public static void ConfigIP(HW.Network.NetworkDevice nic, IPv4Config config) - { - addressMap.Add(config.IPAddress.To32BitNumber(), nic); - ipConfigs.Add(config); - nic.DataReceived += HandlePacket; - } - - /// - /// This function must be called repeatedly to keep the TCP/IP Stack going. - /// Will later be called by a background thread in the kernel - /// - public static void Update() - { - TCPIP.IPv4OutgoingBuffer.Send(); - } - - /// - /// Can be used to test pinging to a network address from Cosmos - /// - /// IP Address of destination - public static void Ping(IPv4Address dest) - { - IPv4Address source = FindNetwork(dest); - if (source == null) - { - Console.WriteLine("Destination Network Unreachable!!"); - return; - } - - ICMP.ICMPEchoRequest request = new ICMP.ICMPEchoRequest(source, dest, 0x10, 1); - TCPIP.IPv4OutgoingBuffer.AddPacket(request); - } - - /// - /// Subscribe to a UDP port to listen to data received on a specific port number - /// Only one listener allowed - /// - /// Port number to listen on - /// delegate to call when data is received - public static void SubscribeUDPPort(UInt16 port, DataReceived callback) - { - if (udpClients.ContainsKey(port) == true) - { - throw new ArgumentException("Port is already subscribed to", "port"); - } - - udpClients.Add(port, callback); - } - - /// - /// Unsubscribe from existing subscription to a UDP port - /// - /// Port number to unsubscribe from - public static void UnsubscribeUDPPort(UInt16 port) - { - udpClients.Remove(port); - } - - /// - /// Send a UDP packet to a destination device - /// - /// IP address of destination - /// Source port - /// Destination port to send data to - /// Data to be sent - public static void SendUDP(IPv4Address dest, UInt16 srcPort, UInt16 destPort, byte[] data) - { - IPv4Address source = FindNetwork(dest); - if (source == null) - { - Console.WriteLine("Destination Network Unreachable!!"); - return; - } - UDP.UDPPacket outgoing = new UDP.UDPPacket(source, dest, srcPort, destPort, data); - TCPIP.IPv4OutgoingBuffer.AddPacket(outgoing); - } - - /// - /// Add a TCP listener to the specified port - /// - /// Port number to listen on - /// Callback function that is called when a new client connects - public static void AddTcpListener(UInt16 port, ClientConnected connectCallback) - { - if (tcpListeners.ContainsKey(port) == true) - { - throw new ArgumentException("Port is already subscribed to", "port"); - } - - tcpListeners.Add(port, connectCallback); - } - - internal static UInt16 NextIPFragmentID() - { - return sNextFragmentID++; - } - - internal static void HandlePacket(byte[] packetData) - { - UInt16 etherType = (UInt16)((packetData[12] << 8) | packetData[13]); - switch (etherType) - { - case 0x0806: - ARPHandler(packetData); - break; - case 0x0800: - IPv4Handler(packetData); - break; - } - } - - private static void IPv4Handler(byte[] packetData) - { - TCPIP.IPPacket ip_packet = new TCPIP.IPPacket(packetData); - ARP.ARPCache.Update(ip_packet.SourceIP, ip_packet.SourceMAC); - - if ((addressMap.ContainsKey(ip_packet.DestinationIP.To32BitNumber()) == true) || - (ip_packet.DestinationIP.address[3] == 255)) - { - switch (ip_packet.Protocol) - { - case 1: - IPv4_ICMPHandler(packetData); - break; - case 6: - IPv4_TCPHandler(packetData); - break; - case 17: - IPv4_UDPHandler(packetData); - break; - } - } - } - - private static void IPv4_TCPHandler(byte[] packetData) - { - TCP.TCPPacket tcp_packet = new TCP.TCPPacket(packetData); - if (tcp_packet.Syn == true) - { - if (tcpListeners.ContainsKey(tcp_packet.DestinationPort) == true) - { - TCP.TCPConnection connection = new TCP.TCPConnection(tcp_packet.SourceIP, tcp_packet.SourcePort, tcp_packet.DestinationIP, - tcp_packet.DestinationPort, tcp_packet.SequenceNumber, TCP.TCPConnection.State.SYN_RECVD); - - tcpSockets.Add(connection); - - TCP.TCPPacket syn_ack = new TCP.TCPPacket(connection, connection.LocalSequenceNumber, - ++connection.RemoteSequenceNumber, 0x12, 8192, 2); - syn_ack.AddMSSOption(1360); - syn_ack.AddSACKOption(); - - TCPIP.IPv4OutgoingBuffer.AddPacket(syn_ack); - - return; - } - } - - TCP.TCPConnection active_connection = null; - for (int c = 0; c < tcpSockets.Count; c++) - { - if ((tcpSockets[c].RemoteIP.CompareTo(tcp_packet.SourceIP) == 0) && - (tcpSockets[c].RemotePort == tcp_packet.SourcePort) && - (tcpSockets[c].LocalPort == tcp_packet.DestinationPort)) - { - active_connection = tcpSockets[c]; - break; - } - } - - if (active_connection == null) - { - TCP.TCPPacket reset_packet = new TCP.TCPPacket(tcp_packet.DestinationIP, tcp_packet.SourceIP, tcp_packet.DestinationPort, - tcp_packet.SourcePort, 0, (tcp_packet.SequenceNumber + 1), 0x14, 8192); - TCPIP.IPv4OutgoingBuffer.AddPacket(reset_packet); - return; - } - - if (active_connection.ConnectionState == TCP.TCPConnection.State.SYN_RECVD) - { - if ((tcp_packet.Ack == true) && ((active_connection.LocalSequenceNumber + 1) == tcp_packet.AckNumber)) - { - active_connection.LocalSequenceNumber++; - active_connection.ConnectionState = TCP.TCPConnection.State.ESTABLISHED; - - ClientConnected connectCallback = tcpListeners[tcp_packet.DestinationPort]; - - connectCallback(new TcpClient(active_connection)); - } - } - else if (active_connection.ConnectionState == TCP.TCPConnection.State.SYN_SENT) - { - if ((tcp_packet.Syn == true) && (tcp_packet.Ack == true) && ((active_connection.LocalSequenceNumber + 1) == tcp_packet.AckNumber)) - { - active_connection.LocalSequenceNumber++; - active_connection.RemoteSequenceNumber = tcp_packet.SequenceNumber + 1; - active_connection.ConnectionState = TCP.TCPConnection.State.ESTABLISHED; - - TCP.TCPPacket ack = new TCP.TCPPacket(active_connection, active_connection.LocalSequenceNumber, - active_connection.RemoteSequenceNumber, 0x10, 8192); - TCPIP.IPv4OutgoingBuffer.AddPacket(ack); - } - } - else if (active_connection.ConnectionState == TCP.TCPConnection.State.ESTABLISHED) - { - if (tcp_packet.Ack == true) - { - //active_connection.LocalSequenceNumber = tcp_packet.AckNumber; - } - - if (tcp_packet.TCP_DataLength > 0) - { - active_connection.RemoteSequenceNumber += tcp_packet.TCP_DataLength; - - TCP.TCPPacket ack = new TCP.TCPPacket(active_connection, active_connection.LocalSequenceNumber, - active_connection.RemoteSequenceNumber, 0x10, 8192); - TCPIP.IPv4OutgoingBuffer.AddPacket(ack); - - active_connection.client.dataReceived(tcp_packet.TCP_Data); - } - - if (tcp_packet.Fin == true) - { - active_connection.client.disconnect(); - } - } - } - - private static void IPv4_UDPHandler(byte[] packetData) - { - UDP.UDPPacket udp_packet = new UDP.UDPPacket(packetData); - if (udpClients.ContainsKey(udp_packet.DestinationPort) == true) - { - DataReceived dlgt = udpClients[udp_packet.DestinationPort]; - if (dlgt != null) - { - dlgt(new IPv4EndPoint(udp_packet.SourceIP, udp_packet.SourcePort), udp_packet.UDP_Data); - } - } - } - - private static void IPv4_ICMPHandler(byte[] packetData) - { - ICMP.ICMPPacket icmp_packet = new ICMP.ICMPPacket(packetData); - switch (icmp_packet.ICMP_Type) - { - case 0: - ICMP.ICMPEchoReply recvd_reply = new ICMP.ICMPEchoReply(packetData); - Console.WriteLine("Received ICMP Echo reply from " + recvd_reply.SourceIP.ToString()); - break; - case 8: - ICMP.ICMPEchoRequest request = new ICMP.ICMPEchoRequest(packetData); - ICMP.ICMPEchoReply reply = new ICMP.ICMPEchoReply(request); - Console.WriteLine("Sending ICMP Echo reply to " + reply.DestinationIP.ToString()); - TCPIP.IPv4OutgoingBuffer.AddPacket(reply); - break; - } - } - - private static void ARPHandler(byte[] packetData) - { - ARP.ARPPacket arp_packet = new ARP.ARPPacket(packetData); - if (arp_packet.Operation == 0x01) - { - if ((arp_packet.HardwareType == 1) && (arp_packet.ProtocolType == 0x0800)) - { - ARP.ARPRequest_EthernetIPv4 arp_request = new ARP.ARPRequest_EthernetIPv4(packetData); - ARP.ARPCache.Update(arp_request.SenderIP, arp_request.SenderMAC); - - if (addressMap.ContainsKey(arp_request.TargetIP.To32BitNumber()) == true) - { - //Console.WriteLine("ARP Request Recvd from " + arp_request.SenderIP.ToString()); - HW.Network.NetworkDevice nic = addressMap[arp_request.TargetIP.To32BitNumber()]; - - ARP.ARPReply_EthernetIPv4 reply = - new ARP.ARPReply_EthernetIPv4(nic.MACAddress, arp_request.TargetIP, arp_request.SenderMAC, arp_request.SenderIP); - - nic.QueueBytes(reply.RawData); - } - } - } - else if (arp_packet.Operation == 0x02) - { - if ((arp_packet.HardwareType == 1) && (arp_packet.ProtocolType == 0x0800)) - { - ARP.ARPReply_EthernetIPv4 arp_reply = new ARP.ARPReply_EthernetIPv4(packetData); - ARP.ARPCache.Update(arp_reply.SenderIP, arp_reply.SenderMAC); - - //Console.WriteLine("ARP Reply Recvd for IP=" + arp_reply.SenderIP.ToString()); - TCPIP.IPv4OutgoingBuffer.ARPCache_Update(arp_reply); - } - } - } - - internal static HW.Network.NetworkDevice FindInterface(IPv4Address sourceIP) - { - return addressMap[sourceIP.To32BitNumber()]; - } - - internal static IPv4Address FindNetwork(IPv4Address destIP) - { - IPv4Address default_gw = null; - - for (int c = 0; c < ipConfigs.Count; c++) - { - if ((ipConfigs[c].IPAddress.To32BitNumber() & ipConfigs[c].SubnetMask.To32BitNumber()) == - (destIP.To32BitNumber() & ipConfigs[c].SubnetMask.To32BitNumber())) - { - return ipConfigs[c].IPAddress; - } - if ((default_gw == null) && (ipConfigs[c].DefaultGateway.CompareTo(IPv4Address.Zero) != 0)) - { - default_gw = ipConfigs[c].IPAddress; - } - } - - return default_gw; - } - - internal static bool IsLocalAddress(IPv4Address destIP) - { - for (int c = 0; c < ipConfigs.Count; c++) - { - if ((ipConfigs[c].IPAddress.To32BitNumber() & ipConfigs[c].SubnetMask.To32BitNumber()) == - (destIP.To32BitNumber() & ipConfigs[c].SubnetMask.To32BitNumber())) - { - return true; - } - } - - return false; - } - - internal static IPv4Address FindRoute(IPv4Address destIP) - { - for (int c = 0; c < ipConfigs.Count; c++) - { - if (ipConfigs[c].DefaultGateway.CompareTo(IPv4Address.Zero) != 0) - { - return ipConfigs[c].DefaultGateway; - } - } - - return null; - } - } -} diff --git a/source/Archive/Cosmos.Sys/Network/TcpClient.cs b/source/Archive/Cosmos.Sys/Network/TcpClient.cs deleted file mode 100644 index 07da90a873..0000000000 --- a/source/Archive/Cosmos.Sys/Network/TcpClient.cs +++ /dev/null @@ -1,177 +0,0 @@ -using Cosmos.Sys.Network.TCPIP.TCP; -using System; - -namespace Cosmos.Sys.Network -{ - /// - /// Represents an established TCP connection between this host and another - /// - public class TcpClient - { - internal TCPConnection connection; - internal ClientDataReceived dataCallback; - internal ClientDisconnected disconnectCallback; - - internal UInt16 mss = 1360; - - protected static UInt16 NextLocalPort = 33000; - - public TcpClient(IPv4Address dest, UInt16 port) - { - IPv4Address source = TCPIPStack.FindNetwork(dest); - if( source == null ) - { - throw new ArgumentException("Destination host unreachable", "dest"); - } - - this.connection = new TCPConnection(dest, port, source, NextLocalPort++, 0x5656, TCPConnection.State.SYN_SENT); - this.connection.client = this; - - TCPIPStack.tcpSockets.Add(connection); - - TCPPacket packet = new TCPPacket(connection, connection.LocalSequenceNumber, 0, 0x02, 8192); - - TCPIP.IPv4OutgoingBuffer.AddPacket(packet); - } - - internal TcpClient(TCPConnection connection) - { - this.connection = connection; - this.connection.client = this; - } - - /// - /// Data Received callback function - /// - public ClientDataReceived DataReceived - { - get { return this.dataCallback; } - set { this.dataCallback = value; } - } - - /// - /// Data Received callback function - /// - public ClientDisconnected Disconnect - { - get { return this.disconnectCallback; } - set { this.disconnectCallback = value; } - } - - /// - /// Send a string to the remote host - /// - /// String to be sent - public void SendString(string data) - { - byte[] dataBuffer = new byte[data.Length]; - for (int b = 0; b < data.Length; b++) - { - dataBuffer[b] = (byte)data[b]; - } - - this.SendData(dataBuffer); - } - - /// - /// Send a raw byte buffer to the remote host - /// - /// Byte buffer with data to send - public void SendData(byte[] data) - { - if (data.Length < mss) - { - TCPPacket packet = new TCPPacket(connection.LocalIP, connection.RemoteIP, connection.LocalPort, connection.RemotePort, - connection.LocalSequenceNumber, connection.RemoteSequenceNumber, 0x18, 8192, data); - - TCPIP.IPv4OutgoingBuffer.AddPacket(packet); - - connection.LocalSequenceNumber += (uint)data.Length; - - return; - } - - int remaining_bytes = data.Length; - int data_idx = 0; - byte[] new_buffer; - byte tcp_flags = 0x10; - while (remaining_bytes > 0) - { - if (remaining_bytes > mss) - { - new_buffer = new byte[mss]; - } - else - { - new_buffer = new byte[remaining_bytes]; - tcp_flags = 0x18; - } - - for (int b = 0; b < new_buffer.Length; b++) - { - new_buffer[b] = data[data_idx]; - data_idx++; - remaining_bytes--; - } - - TCPPacket packet = new TCPPacket(connection.LocalIP, connection.RemoteIP, connection.LocalPort, connection.RemotePort, - connection.LocalSequenceNumber, connection.RemoteSequenceNumber, tcp_flags, 8192, new_buffer); - - TCPIP.IPv4OutgoingBuffer.AddPacket(packet); - - connection.LocalSequenceNumber += (uint)new_buffer.Length; - } - } - - /// - /// Close down an active connection - /// - public void Close() - { - TCPPacket packet = new TCPPacket(connection, connection.LocalSequenceNumber, connection.RemoteSequenceNumber + 1, 0x11, 8192); - - TCPIP.IPv4OutgoingBuffer.AddPacket(packet); - - connection.ConnectionState = TCPConnection.State.TIMEWAIT; - } - - internal void dataReceived(byte[] data) - { - if (this.dataCallback != null) - { - this.dataCallback(this, data); - } - } - - /// - /// Remote IP Endpoint - /// - public IPv4EndPoint RemoteEndpoint - { - get { return this.connection.RemoteEndpoint; } - } - /// - /// Local IP Endpoint - /// - public IPv4EndPoint LocalEndpoint - { - get { return this.connection.LocalEndpoint; } - } - - /// - /// Returns true if the current connection is active - /// - public bool Connected - { - get { return (this.connection.ConnectionState == TCPConnection.State.ESTABLISHED); } - } - - internal void disconnect() - { - if (this.disconnectCallback != null) - { - this.disconnectCallback(this); - } - } - } -} diff --git a/source/Archive/Cosmos.Sys/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.Sys/Properties/AssemblyInfo.cs deleted file mode 100644 index 06ba477db4..0000000000 --- a/source/Archive/Cosmos.Sys/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("Cosmos.System")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Chad Z. Hower")] -[assembly: AssemblyProduct("Cosmos.System")] -[assembly: AssemblyCopyright("Copyright © Chad Z. Hower 2008")] -[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("9077a025-b0aa-4562-9a1b-67b7ebeb6817")] - -// 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/source/Archive/Cosmos.Sys/VFSManager.cs b/source/Archive/Cosmos.Sys/VFSManager.cs deleted file mode 100644 index e9f84b7ec3..0000000000 --- a/source/Archive/Cosmos.Sys/VFSManager.cs +++ /dev/null @@ -1,662 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -//using System.Linq; -using Cosmos.Sys.FileSystem; -using Cosmos.Sys.FileSystem.Ext2; -using Cosmos.Hardware2; -using Cosmos.Hardware2.Storage; -//using DebugUtil=Cosmos.FileSystem.DebugUtil; - -namespace Cosmos.Sys { - public static class VFSManager { - private static List mFilesystems; - //TODO: Remove when done with ext2 testing. - public static List Filesystems { get { return mFilesystems; } } - - private static void DetectFilesystem(BlockDevice aDevice) { - #region Ext2 - if (Ext2.BlockDeviceContainsExt2(aDevice)) { - aDevice.Used = true; - var xFS = new Ext2(aDevice); - mFilesystems.Add(xFS); - } - - #endregion - } - - public static void Init() { - if (mFilesystems != null) { - throw new Exception("Virtual File System Manager already initialized!"); - } - mFilesystems = new List(4); - for (int i = 0; i < Device.Devices.Count; i++) { - Console.WriteLine("Check device: " + i); - var xDevice = Device.Devices[i]; - if (xDevice.Type != Device.DeviceType.Storage) { - continue; - } - var xStorageDevice = (BlockDevice)xDevice; - if (xStorageDevice.Used) { - continue; - } - Console.WriteLine("Detect Filesystem"); - DetectFilesystem(xStorageDevice); - Console.WriteLine("Detection went ok"); - } - Console.WriteLine("Checked all devices"); - //// Cosmos.Debug.Debugger.SendNumber("VFS","Registered Filesystems",(uint)mFilesystems.Count,32); - Console.WriteLine("End check"); - if (mFilesystems.Count == 0) - { - Console.WriteLine("WARNING: No filesystems found in VFS init!"); - } - else - { - Console.WriteLine(" Found " + mFilesystems.Count + " filesystems!"); - } - } - - //Path examples: - - // 1:\Dir\File.txt - // 1:\Dir\ - // 1:\Dir - // 1:/Dir/ - // 0:\Dir\Sub - // Sub - // Sub/ - // Sub\File.txt - // ..\Other\File.txt - // ..\..\Other - - //public static bool ContainsVolumeSeparator(this string aPath) - //{ - // return (aPath[1] == Path.VolumeSeparatorChar); - //} - - public static bool IsAbsolutePath(this string aPath) - { - return ((aPath[0] == Path.DirectorySeparatorChar) || aPath[0] == Path.AltDirectorySeparatorChar); - //return aPath.ContainsVolumeSeparator(); - } - - public static bool IsRelativePath(this string aPath) - { - return ((aPath[0] != Path.DirectorySeparatorChar) || aPath[0] != Path.AltDirectorySeparatorChar); - //return !aPath.ContainsVolumeSeparator(); - } - - public static string[] SplitPath(string aPath) - { - return aPath.Split(GetDirectorySeparators(), StringSplitOptions.RemoveEmptyEntries); - } - - private static char[] GetDirectorySeparators() - { - return new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }; - } - - //public static bool IsADriveVolume(this string aPath) - //{ - // string xPath = aPath.Replace('\\', '-');//(GetDirectorySeparators()); - // xPath = xPath.Replace('/', (char)(""[0])); - - // Console.WriteLine(xPath); - // return false; - //} - - - /// - /// Get a single directory from the given path. - /// - /// Absolute path - /// - public static FilesystemEntry GetDirectoryEntry(string aPath) { - if (String.IsNullOrEmpty(aPath)) - { - throw new ArgumentNullException("aPath"); - } - if (!aPath.IsAbsolutePath()) - throw new ArgumentException("Path must be absolute, not relative"); - - if (aPath.Length == 1) - { //Uber-root (/) - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "aPath is 1 long!"); - return null; - } - else - { - string[] xPathParts = SplitPath(aPath); - - // first get the correct FS - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Searching for filesystem: " + xPathParts[0]); - var xFS = GetFileSystemFromPath(ParseStringToInt(xPathParts[0])); - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Found filesystem " + xFS.RootId.ToString()); - - var xCurrentFSEntryId = xFS.RootId; - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Found filesystem " + xCurrentFSEntryId); - if (xPathParts.Length == 1) - { - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Returning root entry"); - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "String parsed"); - return GetVolumeEntry(ParseStringToInt(xPathParts[0])); - //return null; - } - for (int i = 1; i < (xPathParts.Length); i++) - { - var xListing = xFS.GetDirectoryListing(xCurrentFSEntryId); - bool xFound = false; - for (int j = 0; j < xListing.Length; j++) - { - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Checking if " + xListing[j].Name + " equals " + xPathParts[i]); - if (xListing[j].Name.Equals(xPathParts[i])) - { - xCurrentFSEntryId = xListing[j].Id; - if (i == (xPathParts.Length - 1)) - { - //// Cosmos.Debug.Debugger.SendMessage("GetDirectoryEntry", "Found match! : " + xListing[j].Name); - return xListing[j]; - } - xFound = true; - break; - } - } - if (!xFound) - { - //// Cosmos.Debug.Debugger.SendError("GetDirectoryEntry", "Path not found(1)"); - throw new Exception("Path not found: " + aPath); - } - } - //// Cosmos.Debug.Debugger.SendError("GetDirectoryEntry", "Path not found(2)"); - throw new Exception("Path not found: " + aPath); - } - } - - /// - /// Retrieves an array of FilesystemEntries (i.e. Directories and Files) in the gives Directory path. - /// - /// Directory to search in. Can be absolute and relative. - /// All Directories and Files in the given path. - public static FilesystemEntry[] GetDirectoryListing(string aPath) { - - if (String.IsNullOrEmpty(aPath)) { - throw new ArgumentNullException("aPath is null in GetDirectoryListing"); - } - - //if (aPath[0] != '/' && aPath[0] != '\\') { - // throw new Exception("Incorrect path, must start with / or \\!"); - //} - - //if (aPath.Trim(Path.VolumeSeparatorChar).Length == 1) - //{ - // return GetVolumeEntry(0); - //} - - //var xFS = GetFileSystemFromPath(aPath, 1); - //return xFS.GetDirectoryListing(xFS.RootId); - if (aPath.Length == 1) - { - return GetVolumes(); - } - else - { - //string xParentPath = aPath; - //if (String.IsNullOrEmpty(xParentPath)) - //{ - // // Cosmos.Debug.Debugger.SendMessage("GetDirectoryListing", "Should never come here!"); - // var xFS = GetFileSystemFromPath(aPath, 1); - // // Cosmos.Debug.Debugger.SendMessage("GetDirectoryListing", "1-RootId=" + xFS.RootId.ToString()); - // return xFS.GetDirectoryListing(xFS.RootId); - //} - - var xParentItem = GetDirectoryEntry(aPath); - //if (xParentItem == null) - //{ - // var xFS = GetFileSystemFromPath(aPath, 1); - // return xFS.GetDirectoryListing(xFS.RootId); - //} - var xResult= xParentItem.Filesystem.GetDirectoryListing(xParentItem.Id); - return xResult; - } - - } - - - /// - /// Get a single volume - /// - public static FilesystemEntry GetVolumeEntry(int volumeId) - { - var xFS = GetFileSystemFromPath(volumeId); - - return new FilesystemEntry() - { - Name = volumeId.ToString(), - Filesystem = xFS, - IsDirectory = true, - IsReadonly = true, - Id = (ulong)xFS.RootId - }; - } - - public static FilesystemEntry[] GetVolumes() - { - //if (aFilesystems == null) - // throw new ArgumentNullException("mFilesystems has not been initialized"); - - //Get volumes - var xResult = new FilesystemEntry[mFilesystems.Count]; - for (int i = 0; i < mFilesystems.Count; i++) - { - xResult[i] = GetVolumeEntry(i); - } - return xResult; - } - - /// - /// Retrieves all files and directories in the given directory entry. - /// - /// Must be a Directory entry. - /// - public static FilesystemEntry[] GetDirectoryListing(FilesystemEntry aDirectory) - { - if (!aDirectory.IsDirectory) - throw new ArgumentException("Only Directories are allowed"); - - var xFS = aDirectory.Filesystem; - //// Cosmos.Debug.Debugger.SendMessage("GetDirectorylisting", "ID is " + aDirectory.Id); - //aDirectory. - return xFS.GetDirectoryListing(aDirectory.Id); - } - - /// - /// Retrieves the drive filesystem from the drivenumber in the path. - /// - /// The posistion of the drive number in the path. - /// A filesystem - private static Filesystem GetFileSystemFromPath(int aPath) - { - //// Cosmos.Debug.Debugger.SendMessage("GetFileSystemFromPath", aPath.ToString()); - if (mFilesystems.Count == 0) - throw new Exception("No filesystems found"); - else - { - int xId = aPath; - return mFilesystems[xId]; - } - } - - private static int ParseStringToInt(string aString) { - int xResult = 0; - for (int i = 0; i < aString.Length; i++) { - if (i > 0) { - xResult *= 10; - } - - #region actual parsing - - switch (aString[i]) { - case '0': - break; - case '1': - xResult += 1; - break; - case '2': - xResult += 2; - break; - case '3': - xResult += 3; - break; - case '4': - xResult += 4; - break; - case '5': - xResult += 5; - break; - case '6': - xResult += 6; - break; - case '7': - xResult += 7; - break; - case '8': - xResult += 8; - break; - case '9': - xResult += 9; - break; - default: - throw new Exception("Wrong number format! " + aString[i] + " is not a number."); - } - - #endregion - } - return xResult; - } - - public static bool FileExists(string aPath) { - try - { - //var xDir = Path.GetDirectoryName(aPath) + Path.DirectorySeparatorChar; - return (GetFileEntry(aPath) != null); - - //var xDirectory = GetDirectoryEntry(Path.GetDirectoryName(s)); - - //// Cosmos.Debug.Debugger.SendMessage("FileExists", "1"); - //var xEntries = GetDirectoryListing(Path.GetDirectoryName(s)); - //// Cosmos.Debug.Debugger.SendMessage("FileExists", "2"); - //string xFileName = Path.GetFileName(s); - //// Cosmos.Debug.Debugger.SendMessage("FileExists", "3"); - //for (int i = 0; i < xEntries.Length; i++) - //{ - // // Cosmos.Debug.Debugger.SendMessage("FileExists", "4"); - // if (xEntries[i].Name.Equals(xFileName)) - // { - // // Cosmos.Debug.Debugger.SendMessage("FileExists", "5"); - // return !xEntries[i].IsDirectory; - // } - //} - //return false; - } - catch (Exception) - { - //// Cosmos.Debug.Debugger.SendMessage("FileExists", "Error!: " + e.Message); - return false; - } - } - - public static string ReadFileAsString(string aFile) - { - //// Cosmos.Debug.Debugger.SendMessage("ReadFile", "Start reading file now"); - var xFile = GetFileEntry(aFile); - //// Cosmos.Debug.Debugger.SendMessage("ReadFile", "Found file " + xFile.Id.ToString()); - var xFS = xFile.Filesystem;//GetFileSystemFromPath(aFile, 1); - //// Cosmos.Debug.Debugger.SendMessage("ReadFile", "Found filesystem " + xFS.RootId.ToString()); - - byte[] xSingleBlockBuffer = new byte[xFS.BlockSize]; - byte[] xAllBlocksBuffer = new byte[xFile.Size]; - int xBlockCount = (xAllBlocksBuffer.Length / xSingleBlockBuffer.Length); - if ((xAllBlocksBuffer.Length % xSingleBlockBuffer.Length) > 0) { - xBlockCount++; - } - // Cosmos.Debug.Debugger.SendNumber("ReadFile", "xBlockCount", (uint)xBlockCount, 32); - for (uint i = 0; i < xBlockCount; i++) - { - // Cosmos.Debug.Debugger.SendMessage("ReadFile", "Reading block " + i.ToString()); - //Read the block - if (!xFS.ReadBlock(xFile.Id, i, xSingleBlockBuffer)) - { - return ""; - } - // Cosmos.Debug.Debugger.SendMessage("ReadFile", "After ReadBlock"); - //int xCurLength = xAllBlocksBuffer.Length % xSingleBlockBuffer.Length; - int xCurLength = (int)xFS.BlockSize; - if(i == (xBlockCount-1)) { - if(xFile.Size % xFS.BlockSize != 0) { - // if the last block is read, we should only read the last couple of bytes (not always full block) - xCurLength = (int)(xFile.Size % xFS.BlockSize); - } - } - // Cosmos.Debug.Debugger.SendNumber("ReadFile", "xCurLength", (uint)xCurLength, 32); - //if (xCurLength == 0) - //{ - // xCurLength = xSingleBlockBuffer.Length; - //} - - //Copy the single block into the full buffer - Array.Copy(xSingleBlockBuffer, 0, xAllBlocksBuffer, i * xSingleBlockBuffer.Length, xCurLength); - - //If we read exactly to the end, then break - if ((i + 1) == xBlockCount) - { - break; - } - } - - if (xAllBlocksBuffer.Length > 0) - { - System.Text.StringBuilder xBuilder = new System.Text.StringBuilder(xAllBlocksBuffer.Length); - for (int i = 0; i < xAllBlocksBuffer.Length; i++) - { - xBuilder.Append(((char)xAllBlocksBuffer[i]).ToString()); - } - return xBuilder.ToString(); - //return new string(xAllBlocksBuffer).ToString(); - } - else - throw new Exception("Unable to read contents of file " + xFile); - - //return "Dummy file contents"; - } - - /// - /// Checks if the given directory exists on disk. - /// - /// Can be both relative and absolute path. - /// - public static bool DirectoryExists(string aDir) { - try - { - string xDir = aDir + Path.DirectorySeparatorChar; - return (VFSManager.GetDirectoryEntry(Path.GetDirectoryName(xDir)) != null); - - //string xDir = aDir + Path.DirectorySeparatorChar; - //var xEntries = GetDirectoryListing(Path.GetDirectoryName(xDir)); - //string xDirName = Path.GetFileName(xDir); - //for (int i = 0; i < xEntries.Length; i++) - //{ - // if (xEntries[i].Name.Equals(xDirName)) - // { - // return xEntries[i].IsDirectory; - // } - //} - //return false; - } - catch (Exception) - { - // Cosmos.Debug.Debugger.SendError("VFSManager.cs", e.Message); - return false; - } - - } - - /// Retrieve multiple directories from the given directory. - //public static FilesystemEntry[] GetDirectories(string aDir) - //{ - // // Cosmos.Debug.Debugger.SendMessage("GetDirectories", "Checking for nullreference"); - // if (aDir == null) - // { - // throw new ArgumentNullException("aDir is null"); - // } - - // // Cosmos.Debug.Debugger.SendMessage("GetDirectories", "Checking if " + aDir + " exists"); - // //if (!Directory.Exists(aDir)) - // //{ - // // throw new DirectoryNotFoundException("Unable to find directory " + aDir); - // //} - - // // Cosmos.Debug.Debugger.SendMessage("GetDirectories", "About to GetDirectoryListing"); - - // var xDir = VFSManager.GetDirectoryEntry(Path.GetDirectoryName(aDir)); - // ///// Cosmos.Debug.Debugger.SendMessage("GetDirectories", xDir.Name + " with ID " + xDir.Id.ToString()); - // var xEntries = VFSManager.GetDirectoryListing(xDir); - // //var xEntries = VFSManager.GetDirectoryListing(Path.GetDirectoryName(aDir)); - // //List xDirectories = new List(); - // //for (int i = 0; i < xEntries.Length; i++) - // //{ - // // if (xEntries[i].IsDirectory) - // // { - // // xDirectories.Add(xEntries[0]); - // // } - // //} - - // ////foreach (FilesystemEntry entry in xEntries) - // //// if (entry.IsDirectory) - // //// xDirectories.Add(entry); - - - // ////return (from xEntry in GetDirectoryListing(aDir) where xEntry.IsDirectory select xEntry).ToArray(); - // //// Cosmos.Debug.Debugger.SendMessage("GetDirectories", "Returning"); - // //return xDirectories.ToArray(); - // return new FilesystemEntry[0]; - //} - - - /// - /// Retrieve a specific file with the given path. - /// - /// - /// - public static FilesystemEntry GetFileEntry(String aFile) - { - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Searching for file " + aFile); - string xFileName = Path.GetFileName(aFile); - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Filename is " + xFileName); - - //Find the directory first. - var xDirectory = VFSManager.GetDirectoryEntry(Path.GetDirectoryName(aFile) + Path.DirectorySeparatorChar); - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Directory is " + xDirectory.Name); - - //Then find file in that directory - //var xFS = GetFileSystemFromPath(aFile, 1); - //// Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Got filesystem"); - - //FilesystemEntry[] xEntries = xFS.GetDirectoryListing(xDirectory.Id); - //// Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Got Directory Listing"); - - FilesystemEntry[] xEntries = VFSManager.GetDirectoryListing(xDirectory); - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Found " + xEntries.Length + " entries"); - - foreach (FilesystemEntry xEntry in xEntries) - { - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "Matching " + xEntry.Name + " with " + xFileName); - if (xEntry.Name.Equals(xFileName)) - return xEntry; - } - - //throw new FileNotFoundException(); - // Cosmos.Debug.Debugger.SendMessage("GetFileEntry", "File not found: " + aFile); - return null; - } - - /// - /// Get all the files in the given directory. - /// - /// - /// - public static FilesystemEntry[] GetFiles(string aDir) - { - if (aDir == null) - throw new ArgumentNullException("aDir is null"); - - //var xDirectory = VFSManager.GetDirectoryEntry(Path.GetDirectoryName(aDir)); - //// Cosmos.Debug.Debugger.SendMessage("GetFiles", "Directory found"); - ////var xFS = xDirectory.Filesystem; - //var xFS = GetFileSystemFromPath(Path.GetDirectoryName(aDir), 1); - //// Cosmos.Debug.Debugger.SendMessage("GetFiles", "Filesystem set"); - - //List xFiles = new List(); - //// Cosmos.Debug.Debugger.SendMessage("GetFiles", "Going to search directory with ID " + xDirectory.Id); - //var xEntries = xFS.GetDirectoryListing(xDirectory.Id); - //foreach (FilesystemEntry xEntry in xEntries) - //{ - // // Cosmos.Debug.Debugger.SendMessage("GetFiles", "Foreach"); - // if (!xEntry.IsDirectory) - // xFiles.Add(xEntry); - //} - - //// Cosmos.Debug.Debugger.SendMessage("GetFiles", "Converting to array"); - //return xFiles.ToArray(); - - - //if (!Directory.Exists(aDir)) - // throw new DirectoryNotFoundException("Unable to find directory " + aDir); - - List xFiles = new List(); - var xDirName = Path.GetDirectoryName(aDir); - var xEntries = VFSManager.GetDirectoryListing(xDirName); - - for (int i = 0; i < xEntries.Length; i++) - { - var entry = xEntries[i]; - if (!entry.IsDirectory) - xFiles.Add(entry); - } - - return xFiles.ToArray(); - - //return (from xEntry in GetDirectoryListing(aDir) where !xEntry.IsDirectory select xEntry).ToArray(); - } - - /// - /// Get the files in the given Directory entry - /// - /// Must be a Directory - /// - public static FilesystemEntry[] GetFiles(FilesystemEntry aDir) - { - // Cosmos.Debug.Debugger.SendMessage("GetFiles(FileystemEntry)", aDir.Name); - - if (aDir == null) - throw new ArgumentNullException("aDir in GetFiles(FilesystemEntry)"); - - if (!aDir.IsDirectory) - throw new Exception("Must be a directory"); - - List xFiles = new List(); - foreach (FilesystemEntry xEntry in VFSManager.GetDirectoryListing(aDir)) - { - // Cosmos.Debug.Debugger.SendMessage("GetFiles(FileystemEntry)", "Found " + xEntry.Name); - if (!xEntry.IsDirectory) - xFiles.Add(xEntry); - } - - return xFiles.ToArray(); - } - - /// - /// Get the logical drives found. Formatted as 1:\ - /// - /// - public static string[] GetLogicalDrives() - { - List xDrives = new List(); - foreach (FilesystemEntry entry in GetVolumes()) - xDrives.Add(entry.Name + Path.VolumeSeparatorChar + Path.DirectorySeparatorChar); - - return xDrives.ToArray(); - } - - //Mimics the behaviour of System.IO.Directory.InternalGetFileDirectoryNames - public static string[] InternalGetFileDirectoryNames(string path, string userPathOriginal, string searchPattern, bool includeFiles, bool includeDirs, SearchOption searchOption) - { - //TODO: Add SearchOption functionality - //TODO: What is userPathOriginal? - //TODO: Add SearchPattern functionality - - List xFileAndDirectoryNames = new List(); - - //Validate input arguments - if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - throw new ArgumentOutOfRangeException("searchOption"); - - searchPattern = searchPattern.TrimEnd(new char[0]); - if (searchPattern.Length == 0) - return new string[0]; - - //Perform search in filesystem - FilesystemEntry[] xEntries = VFSManager.GetDirectoryListing(path); - - foreach (FilesystemEntry xEntry in xEntries) - { - if (xEntry.IsDirectory && includeDirs) - xFileAndDirectoryNames.Add(xEntry.Name); - else if (!xEntry.IsDirectory && includeFiles) - xFileAndDirectoryNames.Add(xEntry.Name); - } - - return xFileAndDirectoryNames.ToArray(); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.DummyHost/Cosmos.VS.DummyHost.csproj b/source/Archive/Cosmos.VS.DummyHost/Cosmos.VS.DummyHost.csproj deleted file mode 100644 index f3abd58ee2..0000000000 --- a/source/Archive/Cosmos.VS.DummyHost/Cosmos.VS.DummyHost.csproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {43FF8E06-9485-476B-803D-725FE625AA39} - Exe - Properties - Cosmos.VS.DummyHost - Cosmos.VS.DummyHost - v4.7.1 - Client - 512 - SAK - SAK - SAK - SAK - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.DummyHost/Program.cs b/source/Archive/Cosmos.VS.DummyHost/Program.cs deleted file mode 100644 index 7b025670e1..0000000000 --- a/source/Archive/Cosmos.VS.DummyHost/Program.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Cosmos.VS.DummyHost { - class Program { - static void Main(string[] args) { - Console.ReadLine(); - } - } -} diff --git a/source/Archive/Cosmos.VS.DummyHost/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.VS.DummyHost/Properties/AssemblyInfo.cs deleted file mode 100644 index 1038a9ebe2..0000000000 --- a/source/Archive/Cosmos.VS.DummyHost/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("Cosmos.VS.DummyHost")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.VS.DummyHost")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[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("36a2e887-f28b-45ae-b635-6e7cd374d2c4")] - -// 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/source/Archive/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj b/source/Archive/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj deleted file mode 100644 index 40284f83ae..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Cosmos.VS.ProjectSystem.csproj +++ /dev/null @@ -1,386 +0,0 @@ - - - - - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - true - - - - Program - $(DevEnvDir)devenv.exe - /rootSuffix Exp - - - Debug - AnyCPU - 2.0 - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {12C1623C-1B28-46DF-A4B5-6B767A01ECF6} - Library - Properties - Cosmos.VS.ProjectSystem - Cosmos.VS.ProjectSystem - v4.7.1 - true - true - true - true - true - false - - - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - True - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - UserControl - - - CosmosPage.cs - - - - - - - UserControl - - - CustomPropertyPage.cs - - - - UserControl - - - TitleDivision.cs - - - Form - - - UnsavedConfigChangesDialog.cs - - - true - - - true - - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - Designer - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - true - - - Always - true - - - CosmosPage.cs - Designer - - - CustomPropertyPage.cs - - - - - - - true - Designer - - - true - - - true - Designer - - - Designer - - - Designer - - - Designer - - - - - False - - - False - - - $(MSBuildBinPath)\Microsoft.Build.dll - - - $(MSBuildBinPath)\Microsoft.Build.Framework.dll - - - $(MSBuildBinPath)\Microsoft.Build.Utilities.Core.dll - - - $(MSBuildBinPath)\Microsoft.Build.Tasks.Core.dll - - - - - ..\..\packages\Microsoft.VisualStudio.CoreUtility.15.4.27004\lib\net45\Microsoft.VisualStudio.CoreUtility.dll - True - - - False - ..\..\packages\Microsoft.VisualStudio.Designer.Interfaces.1.1.4322\lib\microsoft.visualstudio.designer.interfaces.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Imaging.15.4.27004\lib\net45\Microsoft.VisualStudio.Imaging.dll - True - - - ..\..\packages\Microsoft.VisualStudio.OLE.Interop.7.10.6071\lib\Microsoft.VisualStudio.OLE.Interop.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.15.0.15.4.27004\lib\Microsoft.VisualStudio.Shell.15.0.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.Framework.15.4.27004\lib\net45\Microsoft.VisualStudio.Shell.Framework.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.7.10.6071\lib\Microsoft.VisualStudio.Shell.Interop.dll - True - - - False - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.10.0.10.0.30319\lib\Microsoft.VisualStudio.Shell.Interop.10.0.dll - True - - - False - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.11.0.11.0.61030\lib\Microsoft.VisualStudio.Shell.Interop.11.0.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.15.0.26606\lib\net20\Microsoft.VisualStudio.Shell.Interop.15.3.DesignTime.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.Shell.Interop.8.0.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Shell.Interop.9.0.9.0.30729\lib\Microsoft.VisualStudio.Shell.Interop.9.0.dll - True - - - ..\..\packages\Microsoft.VisualStudio.TextManager.Interop.7.10.6070\lib\Microsoft.VisualStudio.TextManager.Interop.dll - True - - - ..\..\packages\Microsoft.VisualStudio.TextManager.Interop.8.0.8.0.50727\lib\Microsoft.VisualStudio.TextManager.Interop.8.0.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Threading.15.5.24\lib\net46\Microsoft.VisualStudio.Threading.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Utilities.15.4.27004\lib\net46\Microsoft.VisualStudio.Utilities.dll - True - - - ..\..\packages\Microsoft.VisualStudio.Validation.15.3.32\lib\net45\Microsoft.VisualStudio.Validation.dll - True - - - ..\..\packages\Microsoft.Win32.Registry.4.4.0\lib\net461\Microsoft.Win32.Registry.dll - True - - - - - False - - - - - - ..\..\packages\System.Security.AccessControl.4.4.0\lib\net461\System.Security.AccessControl.dll - - - ..\..\packages\System.Security.Principal.Windows.4.4.0\lib\net461\System.Security.Principal.Windows.dll - - - - - - True - ..\..\packages\VSLangProj.7.0.3300\lib\net10\vslangproj.dll - True - - - False - - - - - - {F74A4B2B-02DA-455A-89FB-803A442B5B2C} - Cosmos.Build.Common - BuiltProjectOutputGroup%3bBuiltProjectOutputGroupDependencies%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - - - {a97a1ef7-aeec-43f3-8cb0-5c7269dc7e85} - Cosmos.Debug.Common - BuiltProjectOutputGroup%3bBuiltProjectOutputGroupDependencies%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - - - {535a7e34-ac73-4781-b791-2c81a9066a2c} - Cosmos.VS.DebugEngine - BuiltProjectOutputGroup%3bBuiltProjectOutputGroupDependencies%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgdefProjectOutputGroup%3bVSIXContainerProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - - - {47E8F3DC-FF3F-4CC7-8643-1807260B0B18} - Cosmos.VS.Windows - BuiltProjectOutputGroup%3bBuiltProjectOutputGroupDependencies%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3bPkgdefProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - - - {B37F98E5-6D98-48D2-B736-01F0B28D46CE} - Cosmos.VS.Wizards - BuiltProjectOutputGroup%3bBuiltProjectOutputGroupDependencies%3bGetCopyToOutputDirectoryItems%3bSatelliteDllsProjectOutputGroup%3b - DebugSymbolsProjectOutputGroup%3b - - - - - TitleDivision.cs - - - UnsavedConfigChangesDialog.cs - - - true - VSPackage - - - - ..\MPF\12.0\ - true - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/CosmosConfigProvider.cs b/source/Archive/Cosmos.VS.ProjectSystem/CosmosConfigProvider.cs deleted file mode 100644 index 4ce0f3e29f..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/CosmosConfigProvider.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Reflection; -using Microsoft.VisualStudio.Project; - -namespace Cosmos.VS.ProjectSystem -{ - public class CosmosConfigProvider : ConfigProvider - { - public CosmosConfigProvider(CosmosProjectNode manager) : base(manager) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - } - - protected override ProjectConfig CreateProjectConfiguration(string configName) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - return new CosmosProjectConfig(ProjectMgr, configName); - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectConfig.cs b/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectConfig.cs deleted file mode 100644 index e09049ac0a..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectConfig.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Project; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; - -using Cosmos.Build.Common; -using Cosmos.Debug.Common; - -namespace Cosmos.VS.ProjectSystem -{ - public class CosmosProjectConfig : ProjectConfig - { - public CosmosProjectConfig(ProjectNode project, string configuration) - : base(project, configuration) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - } - - public override int DebugLaunch(uint aLaunch) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - try - { - var xDeployment = (DeploymentType)Enum.Parse(typeof(DeploymentType), GetConfigurationProperty(BuildPropertyNames.DeploymentString, true)); - var xLaunch = (LaunchType)Enum.Parse(typeof(LaunchType), GetConfigurationProperty(BuildPropertyNames.LaunchString, false)); - var xVSDebugPort = GetConfigurationProperty(BuildPropertyNames.VisualStudioDebugPortString, false); - - string xOutputAsm = ProjectMgr.GetOutputAssembly(ConfigName); - string xOutputPath = Path.GetDirectoryName(xOutputAsm); - string xIsoFile = Path.ChangeExtension(xOutputAsm, ".iso"); - string xBinFile = Path.ChangeExtension(xOutputAsm, ".bin"); - - if (xDeployment == DeploymentType.ISO) - { - IsoMaker.Generate(xBinFile, xIsoFile); - - } - else if (xDeployment == DeploymentType.USB) - { - Process.Start(Path.Combine(CosmosPaths.Tools, "Cosmos.Deploy.USB.exe"), "\"" + xBinFile + "\""); - - } - else if (xDeployment == DeploymentType.PXE) - { - string xPxePath = Path.Combine(CosmosPaths.Build, "PXE"); - string xPxeIntf = GetConfigurationProperty(BuildPropertyNames.PxeInterfaceString, false); - File.Copy(xBinFile, Path.Combine(xPxePath, "Cosmos.bin"), true); - Process.Start(Path.Combine(CosmosPaths.Tools, "Cosmos.Deploy.Pixie.exe"), xPxeIntf + " \"" + xPxePath + "\""); - } - else if (xDeployment == DeploymentType.BinaryImage) - { - // prepare? - } - else - { - throw new Exception("Unknown deployment type."); - } - - if (xLaunch == LaunchType.None - && xDeployment == DeploymentType.ISO) - { - Process.Start(xOutputPath); - } - else - { - // http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.vsdebugtargetinfo_members.aspx - var xInfo = new VsDebugTargetInfo(); - xInfo.cbSize = (uint)Marshal.SizeOf(xInfo); - - xInfo.dlo = DEBUG_LAUNCH_OPERATION.DLO_CreateProcess; - xInfo.fSendStdoutToOutputWindow = 0; // App keeps its stdout - xInfo.grfLaunch = aLaunch; // Just pass through for now. - xInfo.bstrRemoteMachine = null; // debug locally - - var xValues = new Dictionary(); - xValues.Add("ProjectFile", Path.Combine(ProjectMgr.ProjectFolder, ProjectMgr.ProjectFile)); - xValues.Add("ISOFile", xIsoFile); - //xValues.Add("BinFormat", GetConfigurationProperty("BinFormat", false)); - foreach (var xName in BuildProperties.PropNames) - { - xValues.Add(xName, GetConfigurationProperty(xName, false)); - } - - xInfo.bstrExe = DictionaryHelper.DumpToString(xValues); - - // Select the debugger - xInfo.clsidCustom = Cosmos.VS.DebugEngine.AD7.Impl.AD7Engine.EngineID; // Debug engine identifier. - // ??? This identifier doesn't seems to appear anywhere else in souce code. - //xInfo.clsidPortSupplier = new Guid("{708C1ECA-FF48-11D2-904F-00C04FA302A1}"); - - VsShellUtilities.LaunchDebugger(ProjectMgr.Site, xInfo); - } - } - catch (Exception ex) - { - return Marshal.GetHRForException(ex); - } - return VSConstants.S_OK; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectFactory.cs b/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectFactory.cs deleted file mode 100644 index 6701a6b258..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectFactory.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio.Project; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Cosmos.VS.ProjectSystem -{ - [Guid(Guids.guidCosmosProjectFactoryString)] - class CosmosProjectFactory : ProjectFactory - { - private readonly CosmosProjectPackage mPackage; - - public CosmosProjectFactory(CosmosProjectPackage aPackage) - : base(aPackage) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - mPackage = aPackage; - } - - protected override ProjectNode CreateProject() - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - var xProject = new CosmosProjectNode(mPackage); - xProject.SetSite((IOleServiceProvider)((IServiceProvider)mPackage).GetService(typeof(IOleServiceProvider))); - return xProject; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectNode.cs b/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectNode.cs deleted file mode 100644 index eec305c571..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectNode.cs +++ /dev/null @@ -1,512 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.IO; -using System.Reflection; -using System.Windows.Forms; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Project; -using Microsoft.VisualStudio.Shell.Interop; -using EnvDTE; - -using Cosmos.Build.Common; -using Cosmos.VS.ProjectSystem.PropertyPages; - -namespace Cosmos.VS.ProjectSystem -{ - public class CosmosProjectNode : ProjectNode, IVsReferenceManagerUser - { - private static readonly ImageList mImageList; - internal static int mImageIndex; - readonly BuildEvents mBuildEvents; - - protected override bool SupportsProjectDesigner - { - get { return true; } - set { } - } - - static CosmosProjectNode() - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - mImageList = Utilities.GetImageList(typeof(CosmosProjectNode).Assembly.GetManifestResourceStream("Cosmos.VS.ProjectSystem.Resources.CosmosProjectNode.bmp")); - } - - public CosmosProjectNode(CosmosProjectPackage package) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - Package = package; - var dte = (DTE)((IServiceProvider)Package).GetService(typeof(DTE)); - mBuildEvents = dte.Events.BuildEvents; - //mBuildEvents.OnBuildProjConfigDone += OnBuildProjConfigDone; - - mImageIndex = ImageHandler.ImageList.Images.Count; - - foreach (Image img in mImageList.Images) - { - ImageHandler.AddImage(img); - } - } - - protected override Guid[] GetConfigurationIndependentPropertyPages() - { - Guid[] result = new Guid[1]; - result[0] = typeof(CosmosPage).GUID; - return result; - } - - protected override Guid[] GetPriorityProjectDesignerPages() - { - Guid[] result = new Guid[1]; - result[0] = typeof(CosmosPage).GUID; - return result; - } - - - //public override int GetProperty(uint itemId, int propId, out object property) - //{ - // switch ((__VSHPROPID2)propId) - // { - // case __VSHPROPID2.VSHPROPID_CfgPropertyPagesCLSIDList: - // { - // var res = base.GetProperty(itemId, propId, out property); - // if (ErrorHandler.Succeeded(res)) - // { - // var guids = GetGuidsFromList(property as string); - // guids.RemoveAll(g => CfgSpecificPropertyPagesToRemove.Contains(g)); - // guids.AddRange(CfgSpecificPropertyPagesToAdd); - // property = MakeListFromGuids(guids); - // } - // return res; - // } - // case __VSHPROPID2.VSHPROPID_PropertyPagesCLSIDList: - // { - // var res = base.GetProperty(itemId, propId, out property); - // if (ErrorHandler.Succeeded(res)) - // { - // var guids = GetGuidsFromList(property as string); - // guids.RemoveAll(g => PropertyPagesToRemove.Contains(g)); - // guids.AddRange(PropertyPagesToAdd); - // property = MakeListFromGuids(guids); - // } - // return res; - // } - // } - - // return base.GetProperty(itemId, propId, out property); - //} - - public override Guid ProjectGuid => Guids.guidCosmosProjectFactory; - - public override Guid ProjectIDGuid { get; set; } - - public override string ProjectType => "Cosmos"; - - public override int ImageIndex => mImageIndex; - - internal string AssemblySearchPaths => CosmosPaths.Kernel; - - protected override ConfigProvider CreateConfigProvider() - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - return new CosmosConfigProvider(this); - } - - private void OnBuildProjConfigDone(string Project, string ProjectConfig, string Platform, string SolutionConfig, bool Success) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - if (false == Success) - { - var dte = (DTE)((IServiceProvider)Package).GetService(typeof(DTE)); - dte.DTE.ExecuteCommand("Build.Cancel"); - } - } - - internal override void BuildAsync(uint vsopts, string config, IVsOutputWindowPane output, string target, Action uiThreadCallback) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - var xSolutionBuildManager = (IVsSolutionBuildManager)GetService(typeof(IVsSolutionBuildManager)); - var xSolution = (IVsSolution)GetService(typeof(IVsSolution)); - if (xSolutionBuildManager != null && xSolution != null) - { - IVsHierarchy xStartupProj; - xSolutionBuildManager.get_StartupProject(out xStartupProj); - if (xStartupProj != null) - { - var xProj = xStartupProj as IVsProject3; - Guid xGuid; - xSolution.GetGuidOfProject(xStartupProj, out xGuid); - if (xGuid != Guid.Empty) - { - if (xGuid != ProjectIDGuid) - { - uiThreadCallback(MSBuildResult.Successful, "Skipped"); - output.OutputStringThreadSafe("Project skipped, as it's not necessary for running\r\n\r\n"); - return; - } - } - } - } - base.BuildAsync(vsopts, config, output, target, uiThreadCallback); - } - - public override void AddFileFromTemplate(string source, string target) - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - string nameSpace = FileTemplateProcessor.GetFileNamespace(target, this); - string className = Path.GetFileNameWithoutExtension(target); - - FileTemplateProcessor.AddReplace("$nameSpace$", nameSpace); - FileTemplateProcessor.AddReplace("$className$", className); - - FileTemplateProcessor.UntokenFile(source, target); - FileTemplateProcessor.Reset(); - } - - public override int AddProjectReference() - { - var referenceManager = this.GetService(typeof(SVsReferenceManager)) as IVsReferenceManager; - if (referenceManager != null) - { - referenceManager.ShowReferenceManager( - this, - SR.GetString(SR.AddReferenceDialogTitle), - "VS.ReferenceManager", - VSConstants.ProjectReferenceProvider_Guid, - false); - return VSConstants.S_OK; - } - else - { - return VSConstants.E_NOINTERFACE; - } - } - - protected override void SetMSBuildProjectProperty(string propertyName, string propertyValue) - { - var xPropertyGroupsCount = BuildProject.Xml.PropertyGroups.Count; - - if (xPropertyGroupsCount == 0) - { - throw new Exception("The Cosmos project is invalid."); - } - - if (xPropertyGroupsCount == 1) - { - var xPropertyGroup = BuildProject.Xml.AddPropertyGroup(); - xPropertyGroup.SetProperty(propertyName, propertyValue); - } - else - { - BuildProject.Xml.PropertyGroups.ElementAt(xPropertyGroupsCount - 1).SetProperty(propertyName, propertyValue); - } - } - - #region IVsReferenceManagerUser methods - - public void ChangeReferences(uint operation, IVsReferenceProviderContext changedContext) - { - var op = (__VSREFERENCECHANGEOPERATION)operation; - __VSREFERENCECHANGEOPERATIONRESULT result; - - try - { - if (op == __VSREFERENCECHANGEOPERATION.VSREFERENCECHANGEOPERATION_ADD) - { - result = this.AddReferences(changedContext); - } - else - { - result = this.RemoveReferences(changedContext); - } - } - catch (InvalidOperationException e) - { - System.Diagnostics.Debug.Fail(e.ToString()); - result = __VSREFERENCECHANGEOPERATIONRESULT.VSREFERENCECHANGEOPERATIONRESULT_DENY; - } - - if (result == __VSREFERENCECHANGEOPERATIONRESULT.VSREFERENCECHANGEOPERATIONRESULT_DENY) - { - throw new InvalidOperationException(); - } - } - - public Array GetProviderContexts() - { - var referenceManager = this.GetService(typeof(SVsReferenceManager)) as IVsReferenceManager; - return this.GetProviderContexts(referenceManager).ToArray(); - } - - protected virtual IEnumerable GetProviderContexts(IVsReferenceManager mgr) - { - var ctxt = CreateAssemblyReferenceProviderContext(mgr); - if (ctxt != null) - { - yield return ctxt; - } - ctxt = CreateProjectReferenceProviderContext(mgr); - if (ctxt != null) - { - yield return ctxt; - } - ctxt = CreateFileReferenceProviderContext(mgr); - if (ctxt != null) - { - yield return ctxt; - } - } - - protected virtual IVsReferenceProviderContext CreateAssemblyReferenceProviderContext(IVsReferenceManager mgr) - { - var moniker = TargetFrameworkMoniker.FullName; - if (string.IsNullOrEmpty(moniker)) - { - return null; - } - - var context = (IVsAssemblyReferenceProviderContext)mgr.CreateProviderContext(VSConstants.AssemblyReferenceProvider_Guid); - context.TargetFrameworkMoniker = moniker; - context.AssemblySearchPaths = AssemblySearchPaths; - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .OfType(); - foreach (var reference in references) - { - var newReference = (IVsAssemblyReference)context.CreateReference(); - newReference.FullPath = reference.Url ?? reference.AssemblyName.ToString(); - newReference.Name = reference.AssemblyName.Name; - newReference.AlreadyReferenced = true; - context.AddReference(newReference); - } - - return context; - } - - protected virtual IVsReferenceProviderContext CreateProjectReferenceProviderContext(IVsReferenceManager mgr) - { - var context = (IVsProjectReferenceProviderContext)mgr.CreateProviderContext(VSConstants.ProjectReferenceProvider_Guid); - context.CurrentProject = this; - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .OfType(); - foreach (var reference in references) - { - var newReference = (IVsProjectReference)context.CreateReference(); - newReference.FullPath = reference.Url; - newReference.Name = reference.ReferencedProjectName; - newReference.Identity = reference.ReferencedProjectGuid.ToString("B"); - newReference.ReferenceSpecification = reference.ReferencedProjectGuid.ToString(); - newReference.AlreadyReferenced = true; - context.AddReference(newReference); - } - - return context; - } - - protected virtual IVsReferenceProviderContext CreateFileReferenceProviderContext(IVsReferenceManager mgr) - { - var exts = AddReferenceExtensions; - if (string.IsNullOrEmpty(exts)) - { - return null; - } - - var context = (IVsFileReferenceProviderContext)mgr.CreateProviderContext(VSConstants.FileReferenceProvider_Guid); - context.BrowseFilter = AddReferenceExtensions.Replace('|', '\0') + "\0"; - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .Where(n => !(n is AssemblyReferenceNode) && !(n is ProjectReferenceNode)); - foreach (var reference in references) - { - var newReference = (IVsFileReference)context.CreateReference(); - newReference.FullPath = reference.Url; - newReference.AlreadyReferenced = true; - context.AddReference(newReference); - } - - return context; - } - - protected virtual string AddReferenceExtensions - { - get - { - return "Dynamic Link Libraries (*.dll)|*.dll|All Files (*.*)|*.*"; - } - } - - private __VSREFERENCECHANGEOPERATIONRESULT AddReferences(IVsReferenceProviderContext context) - { - var addedReferences = this.GetAddedReferences(context); - - var referenceContainer = this.GetReferenceContainer(); - foreach (var selectorData in addedReferences) - { - referenceContainer.AddReferenceFromSelectorData(selectorData); - } - - return __VSREFERENCECHANGEOPERATIONRESULT.VSREFERENCECHANGEOPERATIONRESULT_ALLOW; - } - - protected virtual IEnumerable GetAddedReferences(IVsReferenceProviderContext context) - { - var addedReferences = Enumerable.Empty(); - - if (context.ProviderGuid == VSConstants.AssemblyReferenceProvider_Guid) - { - addedReferences = GetAddedReferences(context as IVsAssemblyReferenceProviderContext); - } - else if (context.ProviderGuid == VSConstants.ProjectReferenceProvider_Guid) - { - addedReferences = GetAddedReferences(context as IVsProjectReferenceProviderContext); - } - else if (context.ProviderGuid == VSConstants.FileReferenceProvider_Guid) - { - addedReferences = GetAddedReferences(context as IVsFileReferenceProviderContext); - } - - return addedReferences; - } - - private __VSREFERENCECHANGEOPERATIONRESULT RemoveReferences(IVsReferenceProviderContext context) - { - var removedReferences = this.GetRemovedReferences(context); - - foreach (var refNode in removedReferences) - { - refNode.Remove(true /* delete from storage*/); - } - - return __VSREFERENCECHANGEOPERATIONRESULT.VSREFERENCECHANGEOPERATIONRESULT_ALLOW; - } - - protected virtual IEnumerable GetRemovedReferences(IVsReferenceProviderContext context) - { - var removedReferences = Enumerable.Empty(); - - if (context.ProviderGuid == VSConstants.AssemblyReferenceProvider_Guid) - { - removedReferences = GetRemovedReferences(context as IVsAssemblyReferenceProviderContext); - } - else if (context.ProviderGuid == VSConstants.ProjectReferenceProvider_Guid) - { - removedReferences = GetRemovedReferences(context as IVsProjectReferenceProviderContext); - } - else if (context.ProviderGuid == VSConstants.FileReferenceProvider_Guid) - { - removedReferences = GetRemovedReferences(context as IVsFileReferenceProviderContext); - } - - return removedReferences; - } - - private IEnumerable GetAddedReferences(IVsAssemblyReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(reference => new VSCOMPONENTSELECTORDATA() - { - type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus, - bstrFile = reference.FullPath, - bstrTitle = reference.Name - }); - - return selectedReferences; - } - - private IEnumerable GetRemovedReferences(IVsAssemblyReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(fileRef => fileRef.FullPath); - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .OfType() - .Where(refNode => selectedReferences.Contains(refNode.Url)); - - return references; - } - - private IEnumerable GetAddedReferences(IVsProjectReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(reference => new VSCOMPONENTSELECTORDATA() - { - type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project, - bstrTitle = reference.Name, - bstrFile = new FileInfo(reference.FullPath).Directory.FullName, - bstrProjRef = reference.ReferenceSpecification - }); - - return selectedReferences; - } - - private IEnumerable GetRemovedReferences(IVsProjectReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(asmRef => new Guid(asmRef.Identity)); - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .OfType() - .Where(refNode => selectedReferences.Contains(refNode.ReferencedProjectGuid)); - - return references; - } - - private IEnumerable GetAddedReferences(IVsFileReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(reference => new VSCOMPONENTSELECTORDATA() - { - type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File, - bstrFile = reference.FullPath - }); - - return selectedReferences; - } - - private IEnumerable GetRemovedReferences(IVsFileReferenceProviderContext context) - { - var selectedReferences = context - .References - .OfType() - .Select(fileRef => fileRef.FullPath); - - var referenceContainer = this.GetReferenceContainer(); - var references = referenceContainer - .EnumReferences() - .OfType() - .Where(refNode => selectedReferences.Contains(refNode.Url)); - - return references; - } - - #endregion - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectPackage.cs b/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectPackage.cs deleted file mode 100644 index 832b60ad90..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/CosmosProjectPackage.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using System.Runtime.InteropServices; -using Cosmos.VS.ProjectSystem.PropertyPages; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Project; - -namespace Cosmos.VS.ProjectSystem -{ - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")] - [PackageRegistration(UseManagedResourcesOnly = true)] - [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] - [ProvideProjectFactory(typeof(CosmosProjectFactory), null, "Cosmos Project Files (*.Cosmos);*.Cosmos", "Cosmos", "Cosmos", @".\NullPath", LanguageVsTemplate = "Cosmos")] - [ProvideObject(typeof(CosmosPage), RegisterUsing = RegistrationMethod.CodeBase)] - [ProvideMenuResource("Menus.ctmenu", 1)] - [Guid(Guids.guidCosmosProjectPkgString)] - public sealed class CosmosProjectPackage : ProjectPackage - { - public CosmosProjectPackage() - { - //Logger.LogEvent += Global.OutputPane.OutputString; - Logger.LogEvent += aMessage => Trace.WriteLine(aMessage); - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - } - - #region Package Members - - protected override void Initialize() - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - base.Initialize(); - this.RegisterProjectFactory(new CosmosProjectFactory(this)); - } - - public override string ProductUserContext => ""; - - #endregion - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.Designer.cs b/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.Designer.cs deleted file mode 100644 index f3a7b6b355..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.Designer.cs +++ /dev/null @@ -1,119 +0,0 @@ -namespace Cosmos.VS.Package -{ - partial class UnsavedConfigChangesDialog - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelMessage = new System.Windows.Forms.Label(); - this.buttonCancel = new System.Windows.Forms.Button(); - this.buttonNo = new System.Windows.Forms.Button(); - this.buttonYes = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // labelMessage - // - this.labelMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.labelMessage.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelMessage.Location = new System.Drawing.Point(12, 9); - this.labelMessage.Name = "labelMessage"; - this.labelMessage.Size = new System.Drawing.Size(366, 91); - this.labelMessage.TabIndex = 0; - this.labelMessage.Text = "The current configuration \'{0}\' has unsaved changes, would you like to save these" + - " changes now?"; - // - // buttonCancel - // - this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.buttonCancel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonCancel.Location = new System.Drawing.Point(303, 103); - this.buttonCancel.Name = "buttonCancel"; - this.buttonCancel.Size = new System.Drawing.Size(75, 26); - this.buttonCancel.TabIndex = 1; - this.buttonCancel.Text = "Cancel"; - this.buttonCancel.UseVisualStyleBackColor = true; - this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click); - // - // buttonNo - // - this.buttonNo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonNo.DialogResult = System.Windows.Forms.DialogResult.No; - this.buttonNo.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonNo.Location = new System.Drawing.Point(222, 103); - this.buttonNo.Name = "buttonNo"; - this.buttonNo.Size = new System.Drawing.Size(75, 26); - this.buttonNo.TabIndex = 2; - this.buttonNo.Text = "No"; - this.buttonNo.UseVisualStyleBackColor = true; - this.buttonNo.Click += new System.EventHandler(this.buttonNo_Click); - // - // buttonYes - // - this.buttonYes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.buttonYes.DialogResult = System.Windows.Forms.DialogResult.Yes; - this.buttonYes.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.buttonYes.Location = new System.Drawing.Point(141, 103); - this.buttonYes.Name = "buttonYes"; - this.buttonYes.Size = new System.Drawing.Size(75, 26); - this.buttonYes.TabIndex = 3; - this.buttonYes.Text = "Yes"; - this.buttonYes.UseVisualStyleBackColor = true; - this.buttonYes.Click += new System.EventHandler(this.buttonYes_Click); - // - // UnsavedConfigurationChanges - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.buttonCancel; - this.ClientSize = new System.Drawing.Size(390, 141); - this.Controls.Add(this.buttonYes); - this.Controls.Add(this.buttonNo); - this.Controls.Add(this.buttonCancel); - this.Controls.Add(this.labelMessage); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "UnsavedConfigurationChanges"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Project Properties"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Label labelMessage; - private System.Windows.Forms.Button buttonCancel; - private System.Windows.Forms.Button buttonNo; - private System.Windows.Forms.Button buttonYes; - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.cs b/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.cs deleted file mode 100644 index cccab8e094..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace Cosmos.VS.Package -{ - public partial class UnsavedConfigChangesDialog : Form - { - public UnsavedConfigChangesDialog() - { - InitializeComponent(); - } - - private void buttonCancel_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Cancel; - this.Close(); - } - - private void buttonNo_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.No; - this.Close(); - } - - private void buttonYes_Click(object sender, EventArgs e) - { - this.DialogResult = DialogResult.Yes; - this.Close(); - } - - public String Message - { get { return this.labelMessage.Text; } set { this.labelMessage.Text = value; } } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.resx b/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Dialogs/UnsavedConfigChangesDialog.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Global.cs b/source/Archive/Cosmos.VS.ProjectSystem/Global.cs deleted file mode 100644 index 8843878222..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Global.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Cosmos.VS.ProjectSystem -{ - public static class Global - { - public static EnvDTE.OutputWindowPane OutputPane; - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Guids.cs b/source/Archive/Cosmos.VS.ProjectSystem/Guids.cs deleted file mode 100644 index ea3431e50b..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Guids.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace Cosmos.VS.ProjectSystem -{ - static class Guids - { - public const string guidCosmosProjectPkgString = "4cae44ed-88b9-4b7c-822b-b040f18fcee3"; - public const string guidCosmosProjectCmdSetString = "c119efe0-fb56-44a1-b9f0-31247afb207f"; - public const string guidCosmosProjectFactoryString = "471ec4bb-e47e-4229-a789-d1f5f83b52d4"; - public const string guidPropPageEnvironmentString = "08c09552-8dd6-4b59-b901-51ebd5d564a6"; - public const string guidCosmosPropertyPageString = "d33a2d29-c4fd-4e12-a510-4c01a14d63e1"; - - public static readonly Guid guidCosmosProjectCmdSet = new Guid(guidCosmosProjectCmdSetString); - public static readonly Guid guidCosmosProjectFactory = new Guid(guidCosmosProjectFactoryString); - public static readonly Guid guidCosmosPropertyPage = new Guid(guidCosmosPropertyPageString); - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Logger.cs b/source/Archive/Cosmos.VS.ProjectSystem/Logger.cs deleted file mode 100644 index 59227cb089..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Logger.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Text; - -namespace Cosmos.VS.ProjectSystem -{ - internal class Logger - { - public static event Action LogEvent; - - private static void DoDebug(string message) - { - message = $"COSMOS: {message}"; - if (LogEvent != null) - { - LogEvent(message); - } - else - { - Console.WriteLine(message); - } - } - - [Conditional("COSMOSDEBUG")] - public static void Debug(string aMessage, params object[] aParams) - { - string xMessage = $"DEBUG {aMessage}"; - if (aParams != null) - { - xMessage = xMessage + " : "; - for (int i = 0; i < aParams.Length; i++) - { - string xParam = aParams[i].ToString(); - if (!string.IsNullOrWhiteSpace(xParam)) - { - xMessage = xMessage + " " + xParam; - } - } - } - - DoDebug(xMessage); - } - - [Conditional("COSMOSDEBUG")] - public static void Debug(string aMessage) - { - string xMessage = $"DEBUG {aMessage}"; - DoDebug(xMessage); - } - - [Conditional("COSMOSDEBUG")] - public static void TraceMethod(MethodBase aMethod) - { - string xMessage = $"TRACE Class {aMethod.DeclaringType}, Method {aMethod}"; - DoDebug(xMessage); - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProfilePresets.cs b/source/Archive/Cosmos.VS.ProjectSystem/ProfilePresets.cs deleted file mode 100644 index db64928569..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProfilePresets.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Reflection; -using Cosmos.Build.Common; - -namespace Cosmos.VS.ProjectSystem -{ - public class ProfilePresets : Dictionary - { - public ProfilePresets() - { - Logger.TraceMethod(MethodBase.GetCurrentMethod()); - - Add("ISO", "ISO Image"); - Add("USB", "USB Bootable Drive"); - Add("PXE", "PXE Network Boot"); - Add("VMware", "VMware"); - if (BochsSupport.BochsEnabled) - { - Add("Bochs", "Bochs"); - } - Add("IntelEdison", "Intel Edison Serial boot"); - Add("HyperV", "Hyper-V"); - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/Cosmos.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/Cosmos.vstemplate deleted file mode 100644 index ce3d8d1e0b..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/Cosmos.vstemplate +++ /dev/null @@ -1,17 +0,0 @@ - - - Cosmos Project (Empty) - A project for running your code as operating system. Does not include any language. - Kernel.ico - Cosmos - true - Cosmos - true - true - - - - - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/CosmosProject.Cosmos b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/CosmosProject.Cosmos deleted file mode 100644 index 1eecfcbd7f..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Cosmos/CosmosProject.Cosmos +++ /dev/null @@ -1,31 +0,0 @@ - - - - net462 - - - - elf - VMware - true - Source - User - False - false - Player - bin\Debug\ - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProj.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProj.vstemplate deleted file mode 100644 index 4e879b04fa..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProj.vstemplate +++ /dev/null @@ -1,18 +0,0 @@ - - - Cosmos C# Library - A project for creating a Cosmos Kernel - Kernel.ico - CSharp - true - CSharpKernel - true - true - true - - - - Kernel.cs - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProject.csproj b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProject.csproj deleted file mode 100644 index 1a0f11770c..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/CSharpProject.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - $KernelProjectGuid$ - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.cs b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.cs deleted file mode 100644 index 376962eec9..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace $safeprojectname$ -{ - public class Kernel: Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Console.Write("Input: "); - var input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.ico b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Kernel.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Readme.txt b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Readme.txt deleted file mode 100644 index ed6072c1bd..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (CSharp)/Readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -$GeneratedGuid1$ .Cosmos id -$GeneratedGuid2$ .csproj id \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.ico b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.vb b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.vb deleted file mode 100644 index b2e4981195..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/Kernel.vb +++ /dev/null @@ -1,23 +0,0 @@ -Imports System -Imports System.Collections.Generic -Imports System.Text - -Namespace $safeprojectname$ - - Public Class Kernel - Inherits Cosmos.System.Kernel - - Protected Overrides Sub BeforeRun() - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.") - End Sub - - Protected Overrides Sub Run() - Console.Write("Input: ") - Dim input = Console.ReadLine() - Console.Write("Text typed: ") - Console.WriteLine(input) - End Sub - - End Class - -End Namespace diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProj.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProj.vstemplate deleted file mode 100644 index 5ddd2f5610..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProj.vstemplate +++ /dev/null @@ -1,18 +0,0 @@ - - - Cosmos VB.NET Library - A project for creating a Cosmos Kernel - Kernel.ico - VisualBasic - true - VBKernel - true - true - true - - - - Kernel.vb - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProjKernel.vbproj b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProjKernel.vbproj deleted file mode 100644 index f2de72e9af..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosKernel (VB)/VBProjKernel.vbproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - $guid1$ - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProj.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProj.vstemplate deleted file mode 100644 index 4c64112df7..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProj.vstemplate +++ /dev/null @@ -1,22 +0,0 @@ - - - C# Operating System - A project for creating a Cosmos Kernel - Kernel.ico - Cosmos - true - CosmosKernel - true - true - true - - - - Kernel.cs - - - - Cosmos.VS.Wizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983 - Cosmos.VS.Wizards.CosmosProjectWizard - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProject.csproj b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProject.csproj deleted file mode 100644 index 0376f767cb..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/CSharpProject.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - $KernelProjectGuid$ - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.cs b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.cs deleted file mode 100644 index 376962eec9..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Sys = Cosmos.System; - -namespace $safeprojectname$ -{ - public class Kernel: Sys.Kernel - { - protected override void BeforeRun() - { - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back."); - } - - protected override void Run() - { - Console.Write("Input: "); - var input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.ico b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Kernel.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Readme.txt b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Readme.txt deleted file mode 100644 index ed6072c1bd..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (CSharp)/Readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -$GeneratedGuid1$ .Cosmos id -$GeneratedGuid2$ .csproj id \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProj.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProj.vstemplate deleted file mode 100644 index 6f5a79c47b..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProj.vstemplate +++ /dev/null @@ -1,22 +0,0 @@ - - - F# Operating System - A project for creating a Cosmos Kernel - Kernel.ico - Cosmos - true - CosmosKernel - true - true - true - - - - Kernel.fs - - - - Cosmos.VS.Wizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983 - Cosmos.VS.Wizards.CosmosProjectWizard - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProject.fsproj b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProject.fsproj deleted file mode 100644 index 0376f767cb..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/FSharpProject.fsproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - $KernelProjectGuid$ - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.fs b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.fs deleted file mode 100644 index da35cd94c3..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.fs +++ /dev/null @@ -1,12 +0,0 @@ -namespace $safeprojectname$ - -open System - -type Kernel() = - inherit Cosmos.System.Kernel() - override u.BeforeRun() = (Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.");) - override u.Run() = - Console.Write("Input: "); - let input = Console.ReadLine(); - Console.Write("Text typed: "); - Console.WriteLine(input); \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.ico b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (FSharp)/Kernel.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.ico b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.vb b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.vb deleted file mode 100644 index b2e4981195..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/Kernel.vb +++ /dev/null @@ -1,23 +0,0 @@ -Imports System -Imports System.Collections.Generic -Imports System.Text - -Namespace $safeprojectname$ - - Public Class Kernel - Inherits Cosmos.System.Kernel - - Protected Overrides Sub BeforeRun() - Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.") - End Sub - - Protected Overrides Sub Run() - Console.Write("Input: ") - Dim input = Console.ReadLine() - Console.Write("Text typed: ") - Console.WriteLine(input) - End Sub - - End Class - -End Namespace diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProj.vstemplate b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProj.vstemplate deleted file mode 100644 index 151c2d9f5d..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProj.vstemplate +++ /dev/null @@ -1,22 +0,0 @@ - - - VB.NET Operating System - A project for creating a Cosmos Kernel - Kernel.ico - Cosmos - true - CosmosKernel - true - true - true - - - - Kernel.vb - - - - Cosmos.VS.Wizards, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5ae71220097cb983 - Cosmos.VS.Wizards.CosmosProjectWizard - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProjKernel.vbproj b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProjKernel.vbproj deleted file mode 100644 index f2de72e9af..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/CosmosProject (VB)/VBProjKernel.vbproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - netstandard2.0 - $guid1$ - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Readme.txt b/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Readme.txt deleted file mode 100644 index 740bc83cc3..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/ProjectTemplates/Readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -Overview of templates. - -+ Cosmos - Only generates a .Cosmos file -+ CosmosKernel (C#) - Only generates a .csproj file -+ CosmosProject (C#) - Generates both a .csproj and a .Cosmos file. \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.VS.ProjectSystem/Properties/AssemblyInfo.cs deleted file mode 100644 index 89616d54d9..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +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("Cosmos.VS.ProjectSystem")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.VS.ProjectSystem")] -[assembly: AssemblyCopyright("")] -[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)] - -// 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/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.Designer.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.Designer.cs deleted file mode 100644 index 7505586168..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.Designer.cs +++ /dev/null @@ -1,987 +0,0 @@ -namespace Cosmos.VS.ProjectSystem.PropertyPages -{ - partial class CosmosPage - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CosmosPage)); - this.panel1 = new System.Windows.Forms.Panel(); - this.lablCurrentProfile = new System.Windows.Forms.Label(); - this.label11 = new System.Windows.Forms.Label(); - this.TabControl1 = new System.Windows.Forms.TabControl(); - this.tabProfile = new System.Windows.Forms.TabPage(); - this.lablPreset = new System.Windows.Forms.Label(); - this.panel2 = new System.Windows.Forms.Panel(); - this.lboxProfile = new System.Windows.Forms.ListBox(); - this.toolStrip1 = new System.Windows.Forms.ToolStrip(); - this.butnProfileClone = new System.Windows.Forms.ToolStripButton(); - this.butnProfileDelete = new System.Windows.Forms.ToolStripButton(); - this.butnProfileRename = new System.Windows.Forms.ToolStripButton(); - this.lablDeployText = new System.Windows.Forms.Label(); - this.lablBuildOnly = new System.Windows.Forms.Label(); - this.tabCompile = new System.Windows.Forms.TabPage(); - this.labelBinFormat = new System.Windows.Forms.Label(); - this.comboBinFormat = new System.Windows.Forms.ComboBox(); - this.comboFramework = new System.Windows.Forms.ComboBox(); - this.buttonOutputBrowse = new System.Windows.Forms.Button(); - this.label2 = new System.Windows.Forms.Label(); - this.textOutputPath = new System.Windows.Forms.TextBox(); - this.labelFramework = new System.Windows.Forms.Label(); - this.tabAssembler = new System.Windows.Forms.TabPage(); - this.checkUseInternalAssembler = new System.Windows.Forms.CheckBox(); - this.labelInternalAssembler = new System.Windows.Forms.Label(); - this.tabDebug = new System.Windows.Forms.TabPage(); - this.chckEnableDebugStub = new System.Windows.Forms.CheckBox(); - this.panlDebugSettings = new System.Windows.Forms.Panel(); - this.stackCorruptionDetectionGroupBox = new System.Windows.Forms.GroupBox(); - this.label12 = new System.Windows.Forms.Label(); - this.comboStackCorruptionDetectionLevel = new System.Windows.Forms.ComboBox(); - this.chkEnableStackCorruptionDetection = new System.Windows.Forms.CheckBox(); - this.debugLevelGroupBox = new System.Windows.Forms.GroupBox(); - this.comboTraceMode = new System.Windows.Forms.ComboBox(); - this.label5 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.comboDebugMode = new System.Windows.Forms.ComboBox(); - this.debugStubGroupBox = new System.Windows.Forms.GroupBox(); - this.checkIgnoreDebugStubAttribute = new System.Windows.Forms.CheckBox(); - this.label9 = new System.Windows.Forms.Label(); - this.cmboVisualStudioDebugPort = new System.Windows.Forms.ComboBox(); - this.cmboCosmosDebugPort = new System.Windows.Forms.ComboBox(); - this.label10 = new System.Windows.Forms.Label(); - this.tabDeployment = new System.Windows.Forms.TabPage(); - this.lboxDeployment = new System.Windows.Forms.ListBox(); - this.tabLaunch = new System.Windows.Forms.TabPage(); - this.lboxLaunch = new System.Windows.Forms.ListBox(); - this.tabVMware = new System.Windows.Forms.TabPage(); - this.checkEnableGDB = new System.Windows.Forms.CheckBox(); - this.checkStartCosmosGDB = new System.Windows.Forms.CheckBox(); - this.label3 = new System.Windows.Forms.Label(); - this.cmboVMwareEdition = new System.Windows.Forms.ComboBox(); - this.tabBochs = new System.Windows.Forms.TabPage(); - this.checkStartBochsDebugGui = new System.Windows.Forms.CheckBox(); - this.checkEnableBochsDebug = new System.Windows.Forms.CheckBox(); - this.tabPXE = new System.Windows.Forms.TabPage(); - this.butnPxeRefresh = new System.Windows.Forms.Button(); - this.comboPxeInterface = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.tabUSB = new System.Windows.Forms.TabPage(); - this.label7 = new System.Windows.Forms.Label(); - this.tabISO = new System.Windows.Forms.TabPage(); - this.label8 = new System.Windows.Forms.Label(); - this.tabSlave = new System.Windows.Forms.TabPage(); - this.cmboSlavePort = new System.Windows.Forms.ComboBox(); - this.label6 = new System.Windows.Forms.Label(); - this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); - this.tabHyperV = new System.Windows.Forms.TabPage(); - this.panel1.SuspendLayout(); - this.TabControl1.SuspendLayout(); - this.tabProfile.SuspendLayout(); - this.panel2.SuspendLayout(); - this.toolStrip1.SuspendLayout(); - this.tabCompile.SuspendLayout(); - this.tabAssembler.SuspendLayout(); - this.tabDebug.SuspendLayout(); - this.panlDebugSettings.SuspendLayout(); - this.stackCorruptionDetectionGroupBox.SuspendLayout(); - this.debugLevelGroupBox.SuspendLayout(); - this.debugStubGroupBox.SuspendLayout(); - this.tabDeployment.SuspendLayout(); - this.tabLaunch.SuspendLayout(); - this.tabVMware.SuspendLayout(); - this.tabBochs.SuspendLayout(); - this.tabPXE.SuspendLayout(); - this.tabUSB.SuspendLayout(); - this.tabISO.SuspendLayout(); - this.tabSlave.SuspendLayout(); - this.SuspendLayout(); - // - // panel1 - // - this.panel1.Controls.Add(this.lablCurrentProfile); - this.panel1.Controls.Add(this.label11); - this.panel1.Dock = System.Windows.Forms.DockStyle.Top; - this.panel1.Location = new System.Drawing.Point(0, 0); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(635, 43); - this.panel1.TabIndex = 3; - // - // lablCurrentProfile - // - this.lablCurrentProfile.AutoSize = true; - this.lablCurrentProfile.Location = new System.Drawing.Point(99, 17); - this.lablCurrentProfile.Name = "lablCurrentProfile"; - this.lablCurrentProfile.Size = new System.Drawing.Size(41, 13); - this.lablCurrentProfile.TabIndex = 1; - this.lablCurrentProfile.Text = "label12"; - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(17, 17); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(76, 13); - this.label11.TabIndex = 0; - this.label11.Text = "Current Profile:"; - // - // TabControl1 - // - this.TabControl1.Controls.Add(this.tabProfile); - this.TabControl1.Controls.Add(this.tabCompile); - this.TabControl1.Controls.Add(this.tabAssembler); - this.TabControl1.Controls.Add(this.tabDebug); - this.TabControl1.Controls.Add(this.tabDeployment); - this.TabControl1.Controls.Add(this.tabLaunch); - this.TabControl1.Controls.Add(this.tabVMware); - this.TabControl1.Controls.Add(this.tabHyperV); - this.TabControl1.Controls.Add(this.tabBochs); - this.TabControl1.Controls.Add(this.tabPXE); - this.TabControl1.Controls.Add(this.tabUSB); - this.TabControl1.Controls.Add(this.tabISO); - this.TabControl1.Controls.Add(this.tabSlave); - this.TabControl1.Dock = System.Windows.Forms.DockStyle.Fill; - this.TabControl1.Location = new System.Drawing.Point(0, 43); - this.TabControl1.Multiline = true; - this.TabControl1.Name = "TabControl1"; - this.TabControl1.SelectedIndex = 0; - this.TabControl1.Size = new System.Drawing.Size(635, 512); - this.TabControl1.TabIndex = 1; - // - // tabProfile - // - this.tabProfile.Controls.Add(this.lablPreset); - this.tabProfile.Controls.Add(this.panel2); - this.tabProfile.Controls.Add(this.lablDeployText); - this.tabProfile.Controls.Add(this.lablBuildOnly); - this.tabProfile.Location = new System.Drawing.Point(4, 22); - this.tabProfile.Name = "tabProfile"; - this.tabProfile.Padding = new System.Windows.Forms.Padding(3); - this.tabProfile.Size = new System.Drawing.Size(627, 486); - this.tabProfile.TabIndex = 8; - this.tabProfile.Text = "Profile"; - this.tabProfile.UseVisualStyleBackColor = true; - // - // lablPreset - // - this.lablPreset.AutoSize = true; - this.lablPreset.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lablPreset.ForeColor = System.Drawing.SystemColors.HotTrack; - this.lablPreset.Location = new System.Drawing.Point(217, 17); - this.lablPreset.Name = "lablPreset"; - this.lablPreset.Size = new System.Drawing.Size(247, 13); - this.lablPreset.TabIndex = 7; - this.lablPreset.Text = "** This is a preset. Some options are restricted."; - // - // panel2 - // - this.panel2.Controls.Add(this.lboxProfile); - this.panel2.Controls.Add(this.toolStrip1); - this.panel2.Dock = System.Windows.Forms.DockStyle.Left; - this.panel2.Location = new System.Drawing.Point(3, 3); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(200, 480); - this.panel2.TabIndex = 6; - // - // lboxProfile - // - this.lboxProfile.Dock = System.Windows.Forms.DockStyle.Fill; - this.lboxProfile.FormattingEnabled = true; - this.lboxProfile.Location = new System.Drawing.Point(0, 27); - this.lboxProfile.Name = "lboxProfile"; - this.lboxProfile.Size = new System.Drawing.Size(200, 453); - this.lboxProfile.Sorted = true; - this.lboxProfile.TabIndex = 3; - // - // toolStrip1 - // - this.toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); - this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.butnProfileClone, - this.butnProfileDelete, - this.butnProfileRename}); - this.toolStrip1.Location = new System.Drawing.Point(0, 0); - this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(200, 27); - this.toolStrip1.TabIndex = 2; - this.toolStrip1.Text = "toolStrip1"; - // - // butnProfileClone - // - this.butnProfileClone.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.butnProfileClone.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileClone.Image"))); - this.butnProfileClone.ImageTransparentColor = System.Drawing.Color.Magenta; - this.butnProfileClone.Name = "butnProfileClone"; - this.butnProfileClone.Size = new System.Drawing.Size(24, 24); - this.butnProfileClone.Text = "Clone"; - this.butnProfileClone.ToolTipText = "Create a new profile from an existing one."; - // - // butnProfileDelete - // - this.butnProfileDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.butnProfileDelete.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileDelete.Image"))); - this.butnProfileDelete.ImageTransparentColor = System.Drawing.Color.Magenta; - this.butnProfileDelete.Name = "butnProfileDelete"; - this.butnProfileDelete.Size = new System.Drawing.Size(24, 24); - this.butnProfileDelete.Text = "Delete"; - this.butnProfileDelete.ToolTipText = "Delete selected profile"; - // - // butnProfileRename - // - this.butnProfileRename.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.butnProfileRename.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileRename.Image"))); - this.butnProfileRename.ImageTransparentColor = System.Drawing.Color.Magenta; - this.butnProfileRename.Name = "butnProfileRename"; - this.butnProfileRename.Size = new System.Drawing.Size(24, 24); - this.butnProfileRename.Text = "Rename"; - this.butnProfileRename.ToolTipText = "Rename selected profile."; - // - // lablDeployText - // - this.lablDeployText.Location = new System.Drawing.Point(217, 44); - this.lablDeployText.Name = "lablDeployText"; - this.lablDeployText.Size = new System.Drawing.Size(228, 137); - this.lablDeployText.TabIndex = 4; - this.lablDeployText.Text = "label1"; - // - // lablBuildOnly - // - this.lablBuildOnly.AutoSize = true; - this.lablBuildOnly.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lablBuildOnly.ForeColor = System.Drawing.SystemColors.HotTrack; - this.lablBuildOnly.Location = new System.Drawing.Point(217, 4); - this.lablBuildOnly.Name = "lablBuildOnly"; - this.lablBuildOnly.Size = new System.Drawing.Size(310, 13); - this.lablBuildOnly.TabIndex = 3; - this.lablBuildOnly.Text = "** This is a build only option. No process will be launched."; - // - // tabCompile - // - this.tabCompile.AutoScroll = true; - this.tabCompile.Controls.Add(this.labelBinFormat); - this.tabCompile.Controls.Add(this.comboBinFormat); - this.tabCompile.Controls.Add(this.comboFramework); - this.tabCompile.Controls.Add(this.buttonOutputBrowse); - this.tabCompile.Controls.Add(this.label2); - this.tabCompile.Controls.Add(this.textOutputPath); - this.tabCompile.Controls.Add(this.labelFramework); - this.tabCompile.Location = new System.Drawing.Point(4, 22); - this.tabCompile.Name = "tabCompile"; - this.tabCompile.Padding = new System.Windows.Forms.Padding(3); - this.tabCompile.Size = new System.Drawing.Size(627, 486); - this.tabCompile.TabIndex = 0; - this.tabCompile.Text = "Compile"; - this.tabCompile.UseVisualStyleBackColor = true; - // - // labelBinFormat - // - this.labelBinFormat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.labelBinFormat.AutoSize = true; - this.labelBinFormat.Enabled = false; - this.labelBinFormat.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelBinFormat.Location = new System.Drawing.Point(18, 113); - this.labelBinFormat.Margin = new System.Windows.Forms.Padding(22, 3, 0, 3); - this.labelBinFormat.Name = "labelBinFormat"; - this.labelBinFormat.Size = new System.Drawing.Size(66, 15); - this.labelBinFormat.TabIndex = 23; - this.labelBinFormat.Text = "Bin format:"; - this.labelBinFormat.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // comboBinFormat - // - this.comboBinFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBinFormat.FormattingEnabled = true; - this.comboBinFormat.Location = new System.Drawing.Point(34, 136); - this.comboBinFormat.Name = "comboBinFormat"; - this.comboBinFormat.Size = new System.Drawing.Size(228, 21); - this.comboBinFormat.TabIndex = 22; - // - // comboFramework - // - this.comboFramework.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboFramework.Enabled = false; - this.comboFramework.FormattingEnabled = true; - this.comboFramework.Location = new System.Drawing.Point(34, 87); - this.comboFramework.Name = "comboFramework"; - this.comboFramework.Size = new System.Drawing.Size(228, 21); - this.comboFramework.TabIndex = 5; - // - // buttonOutputBrowse - // - this.buttonOutputBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonOutputBrowse.Location = new System.Drawing.Point(430, 37); - this.buttonOutputBrowse.Name = "buttonOutputBrowse"; - this.buttonOutputBrowse.Size = new System.Drawing.Size(21, 23); - this.buttonOutputBrowse.TabIndex = 20; - this.buttonOutputBrowse.Text = ".."; - this.buttonOutputBrowse.UseVisualStyleBackColor = true; - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.label2.AutoSize = true; - this.label2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label2.Location = new System.Drawing.Point(18, 17); - this.label2.Margin = new System.Windows.Forms.Padding(22, 3, 0, 3); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(75, 15); - this.label2.TabIndex = 19; - this.label2.Text = "Output path:"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // textOutputPath - // - this.textOutputPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.textOutputPath.Location = new System.Drawing.Point(34, 38); - this.textOutputPath.Name = "textOutputPath"; - this.textOutputPath.Size = new System.Drawing.Size(390, 20); - this.textOutputPath.TabIndex = 4; - // - // labelFramework - // - this.labelFramework.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.labelFramework.AutoSize = true; - this.labelFramework.Enabled = false; - this.labelFramework.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelFramework.Location = new System.Drawing.Point(18, 66); - this.labelFramework.Margin = new System.Windows.Forms.Padding(22, 3, 0, 3); - this.labelFramework.Name = "labelFramework"; - this.labelFramework.Size = new System.Drawing.Size(69, 15); - this.labelFramework.TabIndex = 21; - this.labelFramework.Text = "Framework:"; - this.labelFramework.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // tabAssembler - // - this.tabAssembler.Controls.Add(this.checkUseInternalAssembler); - this.tabAssembler.Controls.Add(this.labelInternalAssembler); - this.tabAssembler.Location = new System.Drawing.Point(4, 22); - this.tabAssembler.Name = "tabAssembler"; - this.tabAssembler.Size = new System.Drawing.Size(627, 486); - this.tabAssembler.TabIndex = 10; - this.tabAssembler.Text = "Assembler"; - this.tabAssembler.UseVisualStyleBackColor = true; - // - // checkUseInternalAssembler - // - this.checkUseInternalAssembler.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.checkUseInternalAssembler.AutoSize = true; - this.checkUseInternalAssembler.Enabled = false; - this.checkUseInternalAssembler.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkUseInternalAssembler.Location = new System.Drawing.Point(18, 12); - this.checkUseInternalAssembler.Margin = new System.Windows.Forms.Padding(22, 12, 3, 3); - this.checkUseInternalAssembler.Name = "checkUseInternalAssembler"; - this.checkUseInternalAssembler.Size = new System.Drawing.Size(146, 19); - this.checkUseInternalAssembler.TabIndex = 6; - this.checkUseInternalAssembler.Text = "Use Internal Assembler"; - this.checkUseInternalAssembler.UseVisualStyleBackColor = true; - // - // labelInternalAssembler - // - this.labelInternalAssembler.Enabled = false; - this.labelInternalAssembler.Location = new System.Drawing.Point(40, 32); - this.labelInternalAssembler.Margin = new System.Windows.Forms.Padding(44, 0, 3, 0); - this.labelInternalAssembler.Name = "labelInternalAssembler"; - this.labelInternalAssembler.Size = new System.Drawing.Size(224, 18); - this.labelInternalAssembler.TabIndex = 20; - this.labelInternalAssembler.Text = "Experimental. Check if you like to crash!"; - // - // tabDebug - // - this.tabDebug.AutoScroll = true; - this.tabDebug.Controls.Add(this.chckEnableDebugStub); - this.tabDebug.Controls.Add(this.panlDebugSettings); - this.tabDebug.Location = new System.Drawing.Point(4, 22); - this.tabDebug.Name = "tabDebug"; - this.tabDebug.Padding = new System.Windows.Forms.Padding(3); - this.tabDebug.Size = new System.Drawing.Size(627, 486); - this.tabDebug.TabIndex = 2; - this.tabDebug.Text = "Debug"; - this.tabDebug.UseVisualStyleBackColor = true; - // - // chckEnableDebugStub - // - this.chckEnableDebugStub.AutoSize = true; - this.chckEnableDebugStub.Location = new System.Drawing.Point(14, 6); - this.chckEnableDebugStub.Name = "chckEnableDebugStub"; - this.chckEnableDebugStub.Size = new System.Drawing.Size(154, 17); - this.chckEnableDebugStub.TabIndex = 7; - this.chckEnableDebugStub.Text = "Enable Remote Debugging"; - this.chckEnableDebugStub.UseVisualStyleBackColor = true; - // - // panlDebugSettings - // - this.panlDebugSettings.Controls.Add(this.stackCorruptionDetectionGroupBox); - this.panlDebugSettings.Controls.Add(this.debugLevelGroupBox); - this.panlDebugSettings.Controls.Add(this.debugStubGroupBox); - this.panlDebugSettings.Location = new System.Drawing.Point(6, 29); - this.panlDebugSettings.Name = "panlDebugSettings"; - this.panlDebugSettings.Size = new System.Drawing.Size(280, 400); - this.panlDebugSettings.TabIndex = 33; - // - // stackCorruptionDetectionGroupBox - // - this.stackCorruptionDetectionGroupBox.Controls.Add(this.label12); - this.stackCorruptionDetectionGroupBox.Controls.Add(this.comboStackCorruptionDetectionLevel); - this.stackCorruptionDetectionGroupBox.Controls.Add(this.chkEnableStackCorruptionDetection); - this.stackCorruptionDetectionGroupBox.Location = new System.Drawing.Point(10, 10); - this.stackCorruptionDetectionGroupBox.Name = "stackCorruptionDetectionGroupBox"; - this.stackCorruptionDetectionGroupBox.Size = new System.Drawing.Size(260, 90); - this.stackCorruptionDetectionGroupBox.TabIndex = 34; - this.stackCorruptionDetectionGroupBox.TabStop = false; - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(3, 42); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(85, 13); - this.label12.TabIndex = 30; - this.label12.Text = "Detection Level:"; - // - // comboStackCorruptionDetectionLevel - // - this.comboStackCorruptionDetectionLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboStackCorruptionDetectionLevel.FormattingEnabled = true; - this.comboStackCorruptionDetectionLevel.Location = new System.Drawing.Point(33, 58); - this.comboStackCorruptionDetectionLevel.Name = "comboStackCorruptionDetectionLevel"; - this.comboStackCorruptionDetectionLevel.Size = new System.Drawing.Size(220, 21); - this.comboStackCorruptionDetectionLevel.TabIndex = 9; - this.comboStackCorruptionDetectionLevel.SelectedIndexChanged += new System.EventHandler(this.stackCorruptionDetectionLevelComboBox_SelectedIndexChanged); - // - // chkEnableStackCorruptionDetection - // - this.chkEnableStackCorruptionDetection.AutoSize = true; - this.chkEnableStackCorruptionDetection.Location = new System.Drawing.Point(6, 19); - this.chkEnableStackCorruptionDetection.Name = "chkEnableStackCorruptionDetection"; - this.chkEnableStackCorruptionDetection.Size = new System.Drawing.Size(190, 17); - this.chkEnableStackCorruptionDetection.TabIndex = 8; - this.chkEnableStackCorruptionDetection.Text = "Enable Stack Corruption Detection"; - this.chkEnableStackCorruptionDetection.UseVisualStyleBackColor = true; - this.chkEnableStackCorruptionDetection.CheckedChanged += new System.EventHandler(this.chkEnableStacckCorruptionDetection_CheckedChanged); - // - // debugLevelGroupBox - // - this.debugLevelGroupBox.Controls.Add(this.comboTraceMode); - this.debugLevelGroupBox.Controls.Add(this.label5); - this.debugLevelGroupBox.Controls.Add(this.label4); - this.debugLevelGroupBox.Controls.Add(this.comboDebugMode); - this.debugLevelGroupBox.Location = new System.Drawing.Point(10, 110); - this.debugLevelGroupBox.Name = "debugLevelGroupBox"; - this.debugLevelGroupBox.Size = new System.Drawing.Size(260, 125); - this.debugLevelGroupBox.TabIndex = 34; - this.debugLevelGroupBox.TabStop = false; - // - // comboTraceMode - // - this.comboTraceMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboTraceMode.FormattingEnabled = true; - this.comboTraceMode.Location = new System.Drawing.Point(34, 94); - this.comboTraceMode.Name = "comboTraceMode"; - this.comboTraceMode.Size = new System.Drawing.Size(220, 21); - this.comboTraceMode.TabIndex = 10; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label5.Location = new System.Drawing.Point(3, 73); - this.label5.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(49, 15); - this.label5.TabIndex = 26; - this.label5.Text = "Tracing:"; - this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // label4 - // - this.label4.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(3, 19); - this.label4.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(98, 21); - this.label4.TabIndex = 24; - this.label4.Text = "Debug Level:"; - this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // comboDebugMode - // - this.comboDebugMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboDebugMode.FormattingEnabled = true; - this.comboDebugMode.Location = new System.Drawing.Point(34, 46); - this.comboDebugMode.Name = "comboDebugMode"; - this.comboDebugMode.Size = new System.Drawing.Size(220, 21); - this.comboDebugMode.TabIndex = 9; - // - // debugStubGroupBox - // - this.debugStubGroupBox.Controls.Add(this.checkIgnoreDebugStubAttribute); - this.debugStubGroupBox.Controls.Add(this.label9); - this.debugStubGroupBox.Controls.Add(this.cmboVisualStudioDebugPort); - this.debugStubGroupBox.Controls.Add(this.cmboCosmosDebugPort); - this.debugStubGroupBox.Controls.Add(this.label10); - this.debugStubGroupBox.Location = new System.Drawing.Point(10, 245); - this.debugStubGroupBox.Name = "debugStubGroupBox"; - this.debugStubGroupBox.Size = new System.Drawing.Size(260, 140); - this.debugStubGroupBox.TabIndex = 31; - this.debugStubGroupBox.TabStop = false; - // - // checkIgnoreDebugStubAttribute - // - this.checkIgnoreDebugStubAttribute.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkIgnoreDebugStubAttribute.Location = new System.Drawing.Point(6, 19); - this.checkIgnoreDebugStubAttribute.Name = "checkIgnoreDebugStubAttribute"; - this.checkIgnoreDebugStubAttribute.Size = new System.Drawing.Size(218, 20); - this.checkIgnoreDebugStubAttribute.TabIndex = 11; - this.checkIgnoreDebugStubAttribute.Text = "Ignore DebugStub Attribute Settings"; - this.checkIgnoreDebugStubAttribute.UseVisualStyleBackColor = true; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(6, 42); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(69, 13); - this.label9.TabIndex = 29; - this.label9.Text = "Cosmos Port:"; - // - // cmboVisualStudioDebugPort - // - this.cmboVisualStudioDebugPort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmboVisualStudioDebugPort.FormattingEnabled = true; - this.cmboVisualStudioDebugPort.Items.AddRange(new object[] { - "Ethernet (not supported yet)", - "Serial Com1", - "Serial Com2", - "Serial Com3", - "Serial Com4"}); - this.cmboVisualStudioDebugPort.Location = new System.Drawing.Point(34, 106); - this.cmboVisualStudioDebugPort.Name = "cmboVisualStudioDebugPort"; - this.cmboVisualStudioDebugPort.Size = new System.Drawing.Size(220, 21); - this.cmboVisualStudioDebugPort.Sorted = true; - this.cmboVisualStudioDebugPort.TabIndex = 13; - // - // cmboCosmosDebugPort - // - this.cmboCosmosDebugPort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmboCosmosDebugPort.FormattingEnabled = true; - this.cmboCosmosDebugPort.Items.AddRange(new object[] { - "Ethernet (not supported yet)", - "Serial Com1", - "Serial Com2", - "Serial Com3", - "Serial Com4"}); - this.cmboCosmosDebugPort.Location = new System.Drawing.Point(34, 58); - this.cmboCosmosDebugPort.Name = "cmboCosmosDebugPort"; - this.cmboCosmosDebugPort.Size = new System.Drawing.Size(220, 21); - this.cmboCosmosDebugPort.Sorted = true; - this.cmboCosmosDebugPort.TabIndex = 12; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(6, 90); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(93, 13); - this.label10.TabIndex = 30; - this.label10.Text = "Visual Studio Port:"; - // - // tabDeployment - // - this.tabDeployment.Controls.Add(this.lboxDeployment); - this.tabDeployment.Location = new System.Drawing.Point(4, 22); - this.tabDeployment.Name = "tabDeployment"; - this.tabDeployment.Size = new System.Drawing.Size(627, 486); - this.tabDeployment.TabIndex = 11; - this.tabDeployment.Text = "Deployment"; - this.tabDeployment.UseVisualStyleBackColor = true; - // - // lboxDeployment - // - this.lboxDeployment.Dock = System.Windows.Forms.DockStyle.Left; - this.lboxDeployment.FormattingEnabled = true; - this.lboxDeployment.Location = new System.Drawing.Point(0, 0); - this.lboxDeployment.Name = "lboxDeployment"; - this.lboxDeployment.Size = new System.Drawing.Size(206, 486); - this.lboxDeployment.Sorted = true; - this.lboxDeployment.TabIndex = 15; - // - // tabLaunch - // - this.tabLaunch.Controls.Add(this.lboxLaunch); - this.tabLaunch.Location = new System.Drawing.Point(4, 22); - this.tabLaunch.Name = "tabLaunch"; - this.tabLaunch.Size = new System.Drawing.Size(627, 486); - this.tabLaunch.TabIndex = 12; - this.tabLaunch.Text = "Launch"; - this.tabLaunch.UseVisualStyleBackColor = true; - // - // lboxLaunch - // - this.lboxLaunch.Dock = System.Windows.Forms.DockStyle.Left; - this.lboxLaunch.FormattingEnabled = true; - this.lboxLaunch.Location = new System.Drawing.Point(0, 0); - this.lboxLaunch.Name = "lboxLaunch"; - this.lboxLaunch.Size = new System.Drawing.Size(206, 486); - this.lboxLaunch.Sorted = true; - this.lboxLaunch.TabIndex = 16; - // - // tabVMware - // - this.tabVMware.Controls.Add(this.checkEnableGDB); - this.tabVMware.Controls.Add(this.checkStartCosmosGDB); - this.tabVMware.Controls.Add(this.label3); - this.tabVMware.Controls.Add(this.cmboVMwareEdition); - this.tabVMware.Location = new System.Drawing.Point(4, 22); - this.tabVMware.Name = "tabVMware"; - this.tabVMware.Padding = new System.Windows.Forms.Padding(3); - this.tabVMware.Size = new System.Drawing.Size(627, 486); - this.tabVMware.TabIndex = 4; - this.tabVMware.Text = "VMware"; - this.tabVMware.UseVisualStyleBackColor = true; - // - // checkEnableGDB - // - this.checkEnableGDB.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkEnableGDB.Location = new System.Drawing.Point(9, 77); - this.checkEnableGDB.Name = "checkEnableGDB"; - this.checkEnableGDB.Size = new System.Drawing.Size(218, 20); - this.checkEnableGDB.TabIndex = 19; - this.checkEnableGDB.Text = "Enable GDB Debugger"; - this.checkEnableGDB.UseVisualStyleBackColor = true; - // - // checkStartCosmosGDB - // - this.checkStartCosmosGDB.AutoSize = true; - this.checkStartCosmosGDB.Enabled = false; - this.checkStartCosmosGDB.Location = new System.Drawing.Point(24, 103); - this.checkStartCosmosGDB.Margin = new System.Windows.Forms.Padding(25, 3, 3, 3); - this.checkStartCosmosGDB.Name = "checkStartCosmosGDB"; - this.checkStartCosmosGDB.Size = new System.Drawing.Size(140, 17); - this.checkStartCosmosGDB.TabIndex = 20; - this.checkStartCosmosGDB.Text = "Use Cosmos GDB Client"; - this.checkStartCosmosGDB.UseVisualStyleBackColor = true; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(6, 12); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(42, 13); - this.label3.TabIndex = 18; - this.label3.Text = "Edition:"; - // - // cmboVMwareEdition - // - this.cmboVMwareEdition.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmboVMwareEdition.FormattingEnabled = true; - this.cmboVMwareEdition.Location = new System.Drawing.Point(26, 37); - this.cmboVMwareEdition.Name = "cmboVMwareEdition"; - this.cmboVMwareEdition.Size = new System.Drawing.Size(143, 21); - this.cmboVMwareEdition.Sorted = true; - this.cmboVMwareEdition.TabIndex = 18; - // - // tabBochs - // - this.tabBochs.Controls.Add(this.checkStartBochsDebugGui); - this.tabBochs.Controls.Add(this.checkEnableBochsDebug); - this.tabBochs.Location = new System.Drawing.Point(4, 22); - this.tabBochs.Name = "tabBochs"; - this.tabBochs.Padding = new System.Windows.Forms.Padding(3); - this.tabBochs.Size = new System.Drawing.Size(627, 486); - this.tabBochs.TabIndex = 5; - this.tabBochs.Text = "Bochs"; - this.tabBochs.UseVisualStyleBackColor = true; - // - // checkStartBochsDebugGui - // - this.checkStartBochsDebugGui.Enabled = false; - this.checkStartBochsDebugGui.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkStartBochsDebugGui.Location = new System.Drawing.Point(24, 43); - this.checkStartBochsDebugGui.Name = "checkStartBochsDebugGui"; - this.checkStartBochsDebugGui.Size = new System.Drawing.Size(218, 20); - this.checkStartBochsDebugGui.TabIndex = 35; - this.checkStartBochsDebugGui.Text = "Use Bochs Debugger GUI"; - this.checkStartBochsDebugGui.UseVisualStyleBackColor = true; - // - // checkEnableBochsDebug - // - this.checkEnableBochsDebug.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.checkEnableBochsDebug.Location = new System.Drawing.Point(9, 17); - this.checkEnableBochsDebug.Name = "checkEnableBochsDebug"; - this.checkEnableBochsDebug.Size = new System.Drawing.Size(218, 20); - this.checkEnableBochsDebug.TabIndex = 21; - this.checkEnableBochsDebug.Text = "Enable Bochs Debugger"; - this.checkEnableBochsDebug.UseVisualStyleBackColor = true; - // - // tabPXE - // - this.tabPXE.Controls.Add(this.butnPxeRefresh); - this.tabPXE.Controls.Add(this.comboPxeInterface); - this.tabPXE.Controls.Add(this.label1); - this.tabPXE.Location = new System.Drawing.Point(4, 22); - this.tabPXE.Name = "tabPXE"; - this.tabPXE.Padding = new System.Windows.Forms.Padding(3); - this.tabPXE.Size = new System.Drawing.Size(627, 486); - this.tabPXE.TabIndex = 6; - this.tabPXE.Text = "PXE"; - this.tabPXE.UseVisualStyleBackColor = true; - // - // butnPxeRefresh - // - this.butnPxeRefresh.AutoSize = true; - this.butnPxeRefresh.Image = ((System.Drawing.Image)(resources.GetObject("butnPxeRefresh.Image"))); - this.butnPxeRefresh.Location = new System.Drawing.Point(177, 31); - this.butnPxeRefresh.Margin = new System.Windows.Forms.Padding(0); - this.butnPxeRefresh.Name = "butnPxeRefresh"; - this.butnPxeRefresh.Size = new System.Drawing.Size(23, 23); - this.butnPxeRefresh.TabIndex = 23; - this.butnPxeRefresh.UseVisualStyleBackColor = true; - // - // comboPxeInterface - // - this.comboPxeInterface.Location = new System.Drawing.Point(28, 32); - this.comboPxeInterface.Name = "comboPxeInterface"; - this.comboPxeInterface.Size = new System.Drawing.Size(146, 21); - this.comboPxeInterface.TabIndex = 22; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(13, 16); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(52, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Interface:"; - // - // tabUSB - // - this.tabUSB.Controls.Add(this.label7); - this.tabUSB.Location = new System.Drawing.Point(4, 22); - this.tabUSB.Name = "tabUSB"; - this.tabUSB.Padding = new System.Windows.Forms.Padding(3); - this.tabUSB.Size = new System.Drawing.Size(627, 486); - this.tabUSB.TabIndex = 7; - this.tabUSB.Text = "USB"; - this.tabUSB.UseVisualStyleBackColor = true; - // - // label7 - // - this.label7.Location = new System.Drawing.Point(16, 15); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(375, 102); - this.label7.TabIndex = 1; - this.label7.Text = "There are no current USB options. The target drive will be requested when you run" + - " the project."; - // - // tabISO - // - this.tabISO.Controls.Add(this.label8); - this.tabISO.Location = new System.Drawing.Point(4, 22); - this.tabISO.Name = "tabISO"; - this.tabISO.Padding = new System.Windows.Forms.Padding(3); - this.tabISO.Size = new System.Drawing.Size(627, 486); - this.tabISO.TabIndex = 8; - this.tabISO.Text = "ISO"; - this.tabISO.UseVisualStyleBackColor = true; - // - // label8 - // - this.label8.Location = new System.Drawing.Point(17, 16); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(375, 102); - this.label8.TabIndex = 1; - this.label8.Text = "There are currently no ISO options."; - // - // tabSlave - // - this.tabSlave.Controls.Add(this.cmboSlavePort); - this.tabSlave.Controls.Add(this.label6); - this.tabSlave.Location = new System.Drawing.Point(4, 22); - this.tabSlave.Name = "tabSlave"; - this.tabSlave.Padding = new System.Windows.Forms.Padding(3); - this.tabSlave.Size = new System.Drawing.Size(627, 486); - this.tabSlave.TabIndex = 13; - this.tabSlave.Text = "Slave"; - this.tabSlave.UseVisualStyleBackColor = true; - // - // cmboSlavePort - // - this.cmboSlavePort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.cmboSlavePort.FormattingEnabled = true; - this.cmboSlavePort.Items.AddRange(new object[] { - "Ethernet (not supported yet)", - "Serial Com1", - "Serial Com2", - "Serial Com3", - "Serial Com4"}); - this.cmboSlavePort.Location = new System.Drawing.Point(30, 31); - this.cmboSlavePort.Name = "cmboSlavePort"; - this.cmboSlavePort.Size = new System.Drawing.Size(146, 21); - this.cmboSlavePort.Sorted = true; - this.cmboSlavePort.TabIndex = 23; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(15, 15); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(59, 13); - this.label6.TabIndex = 34; - this.label6.Text = "Slave Port:"; - // - // tabHyperV - // - this.tabHyperV.Location = new System.Drawing.Point(4, 22); - this.tabHyperV.Name = "tabHyperV"; - this.tabHyperV.Padding = new System.Windows.Forms.Padding(3); - this.tabHyperV.Size = new System.Drawing.Size(627, 486); - this.tabHyperV.TabIndex = 14; - this.tabHyperV.Text = "Hyper-V"; - this.tabHyperV.UseVisualStyleBackColor = true; - // - // CosmosPage - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.TabControl1); - this.Controls.Add(this.panel1); - this.Name = "CosmosPage"; - this.Size = new System.Drawing.Size(635, 555); - this.Title = "Cosmos"; - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.TabControl1.ResumeLayout(false); - this.tabProfile.ResumeLayout(false); - this.tabProfile.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.toolStrip1.ResumeLayout(false); - this.toolStrip1.PerformLayout(); - this.tabCompile.ResumeLayout(false); - this.tabCompile.PerformLayout(); - this.tabAssembler.ResumeLayout(false); - this.tabAssembler.PerformLayout(); - this.tabDebug.ResumeLayout(false); - this.tabDebug.PerformLayout(); - this.panlDebugSettings.ResumeLayout(false); - this.stackCorruptionDetectionGroupBox.ResumeLayout(false); - this.stackCorruptionDetectionGroupBox.PerformLayout(); - this.debugLevelGroupBox.ResumeLayout(false); - this.debugLevelGroupBox.PerformLayout(); - this.debugStubGroupBox.ResumeLayout(false); - this.debugStubGroupBox.PerformLayout(); - this.tabDeployment.ResumeLayout(false); - this.tabLaunch.ResumeLayout(false); - this.tabVMware.ResumeLayout(false); - this.tabVMware.PerformLayout(); - this.tabBochs.ResumeLayout(false); - this.tabPXE.ResumeLayout(false); - this.tabPXE.PerformLayout(); - this.tabUSB.ResumeLayout(false); - this.tabISO.ResumeLayout(false); - this.tabSlave.ResumeLayout(false); - this.tabSlave.PerformLayout(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.Label lablCurrentProfile; - private System.Windows.Forms.Label label11; - private System.Windows.Forms.TabControl TabControl1; - private System.Windows.Forms.TabPage tabProfile; - private System.Windows.Forms.Label lablDeployText; - private System.Windows.Forms.Label lablBuildOnly; - private System.Windows.Forms.TabPage tabDeployment; - private System.Windows.Forms.ListBox lboxDeployment; - private System.Windows.Forms.TabPage tabLaunch; - private System.Windows.Forms.ListBox lboxLaunch; - private System.Windows.Forms.TabPage tabCompile; - private System.Windows.Forms.ComboBox comboFramework; - private System.Windows.Forms.Button buttonOutputBrowse; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox textOutputPath; - private System.Windows.Forms.Label labelFramework; - private System.Windows.Forms.TabPage tabAssembler; - private System.Windows.Forms.CheckBox checkUseInternalAssembler; - private System.Windows.Forms.Label labelInternalAssembler; - private System.Windows.Forms.TabPage tabDebug; - private System.Windows.Forms.CheckBox chckEnableDebugStub; - private System.Windows.Forms.Panel panlDebugSettings; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ComboBox cmboVisualStudioDebugPort; - private System.Windows.Forms.ComboBox comboTraceMode; - private System.Windows.Forms.ComboBox cmboCosmosDebugPort; - private System.Windows.Forms.ComboBox comboDebugMode; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.Label label9; - private System.Windows.Forms.CheckBox checkIgnoreDebugStubAttribute; - private System.Windows.Forms.TabPage tabBochs; - private System.Windows.Forms.CheckBox checkEnableBochsDebug; - private System.Windows.Forms.TabPage tabVMware; - private System.Windows.Forms.CheckBox checkEnableGDB; - private System.Windows.Forms.CheckBox checkStartCosmosGDB; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.ComboBox cmboVMwareEdition; - private System.Windows.Forms.TabPage tabPXE; - private System.Windows.Forms.TabPage tabUSB; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.TabPage tabISO; - private System.Windows.Forms.Label label8; - private System.Windows.Forms.Panel panel2; - private System.Windows.Forms.ToolStrip toolStrip1; - private System.Windows.Forms.ListBox lboxProfile; - private System.Windows.Forms.ToolStripButton butnProfileClone; - private System.Windows.Forms.ToolStripButton butnProfileDelete; - private System.Windows.Forms.Label lablPreset; - private System.Windows.Forms.ToolStripButton butnProfileRename; - private System.Windows.Forms.ComboBox comboPxeInterface; - private System.Windows.Forms.Button butnPxeRefresh; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TabPage tabSlave; - private System.Windows.Forms.ComboBox cmboSlavePort; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.CheckBox chkEnableStackCorruptionDetection; - private System.Windows.Forms.Label labelBinFormat; - private System.Windows.Forms.ComboBox comboBinFormat; - private System.Windows.Forms.CheckBox checkStartBochsDebugGui; - private System.Windows.Forms.GroupBox stackCorruptionDetectionGroupBox; - private System.Windows.Forms.ComboBox comboStackCorruptionDetectionLevel; - private System.Windows.Forms.GroupBox debugLevelGroupBox; - private System.Windows.Forms.GroupBox debugStubGroupBox; - private System.ComponentModel.BackgroundWorker backgroundWorker1; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.TabPage tabHyperV; - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.cs deleted file mode 100644 index 1b8defa2b7..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.cs +++ /dev/null @@ -1,954 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO.Ports; -using System.Linq; -using System.Net.NetworkInformation; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Cosmos.Build.Common; -using Cosmos.VS.Package; -using Microsoft.VisualBasic; -using DebugMode = Cosmos.Build.Common.DebugMode; - -namespace Cosmos.VS.ProjectSystem.PropertyPages -{ - // We put all items on ONE form because VS is such a C++ developers wet dream to manage mulitple pages - // and add new ones. - - // We use our own profiles instead of Project Configrations because: - // -Couldnt find a proper way to tell VS there are no configuration independent pages. The MPF way (as well as - // 0 sized array) both don't work. - // -When we assign our own project configuration types and the solution configurations refer to now non existent - // project configurations, there are errors. - // - // BOTH of the above probably could be solved with some digging. BUT in the end we learned that project configs - // really wont do what we want. For the user to change the active config for a *single* project they would need - // to change it manually in the solution config, or maintain on solution config for every project config type. - // Maintaining so many solution configs is not only impractical but causes a whole bunch of other issues. - // - // So instead we keep our own list of profiles, and when the user selects them we write out a copy of its values - // to the active configuration (all since we are not configuration dependent) for MSBuild and other code to use. - - [Guid(Guids.guidCosmosPropertyPageString)] - public partial class CosmosPage : CustomPropertyPage - { - protected class ProfileItem - { - public string Prefix; - - public string Name; - - public bool IsPreset; - - public override string ToString() - { - return Name; - } - } - - protected ProfilePresets mPresets = new ProfilePresets(); - - protected int mVMwareAndBochsDebugPipe; - protected int mHyperVDebugPipe; - - protected bool mShowTabBochs; - protected bool mShowTabDebug; - protected bool mShowTabDeployment; - protected bool mShowTabLaunch; - protected bool mShowTabVMware; - protected bool mShowTabHyperV; - protected bool mShowTabPXE; - protected bool mShowTabUSB; - protected bool mShowTabISO; - protected bool mShowTabSlave; - - protected bool FreezeEvents; - - public CosmosPage() - { - InitializeComponent(); - - # region Profile - - butnProfileClone.Click += new EventHandler(butnProfileClone_Click); - butnProfileDelete.Click += new EventHandler(butnProfileDelete_Click); - butnProfileRename.Click += new EventHandler(butnProfileRename_Click); - - lboxProfile.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - var xProfile = (ProfileItem)lboxProfile.SelectedItem; - if (xProfile.Prefix != mProps.Profile) - { - // Save existing profile - mProps.SaveProfile(mProps.Profile); - // Load newly selected profile - mProps.LoadProfile(xProfile.Prefix); - mProps.Profile = xProfile.Prefix; - - IsDirty = true; - UpdateUI(); - } - }; - - #endregion - - # region Deploy - - lboxDeployment.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - var xValue = (DeploymentType)((EnumValue)lboxDeployment.SelectedItem).Value; - if (xValue != mProps.Deployment) - { - mProps.Deployment = xValue; - IsDirty = true; - } - }; - - #endregion - - # region Launch - - lboxLaunch.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - var xValue = (LaunchType)((EnumValue)lboxLaunch.SelectedItem).Value; - if (xValue != mProps.Launch) - { - mProps.Launch = xValue; - IsDirty = true; - // Bochs requires an ISO. Force Deployment property. - if (LaunchType.Bochs == xValue) - { - if (DeploymentType.ISO != mProps.Deployment) - { - foreach (EnumValue scannedValue in lboxDeployment.Items) - { - if (DeploymentType.ISO == (DeploymentType)scannedValue.Value) - { - lboxDeployment.SelectedItem = scannedValue; - break; - } - } - } - } - } - }; - - #endregion - - #region Compile - - comboFramework.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var value = (Framework)((EnumValue)comboFramework.SelectedItem).Value; - if (value != mProps.Framework) - { - mProps.Framework = value; - IsDirty = true; - } - }; - comboBinFormat.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var value = (BinFormat)((EnumValue)comboBinFormat.SelectedItem).Value; - if (value != mProps.BinFormat) - { - mProps.BinFormat = value; - IsDirty = true; - } - }; - - textOutputPath.TextChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - string value = textOutputPath.Text; - if (!string.Equals(value, mProps.OutputPath, StringComparison.InvariantCultureIgnoreCase)) - { - mProps.OutputPath = textOutputPath.Text; - IsDirty = true; - } - }; - - #endregion - - #region Assembler - - checkUseInternalAssembler.CheckedChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - bool value = checkUseInternalAssembler.Checked; - if (value != mProps.UseInternalAssembler) - { - mProps.UseInternalAssembler = value; - IsDirty = true; - } - }; - - #endregion - - #region VMware - - cmboVMwareEdition.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (VMwareEdition)((EnumValue)cmboVMwareEdition.SelectedItem).Value; - if (x != mProps.VMwareEdition) - { - mProps.VMwareEdition = x; - IsDirty = true; - } - }; - - #endregion - - #region PXE - - comboPxeInterface.TextChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = comboPxeInterface.Text.Trim(); - if (x != mProps.PxeInterface) - { - mProps.PxeInterface = x; - IsDirty = true; - } - }; - - cmboSlavePort.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (string)cmboSlavePort.SelectedItem; - if (x != mProps.SlavePort) - { - mProps.SlavePort = x; - IsDirty = true; - } - }; - - butnPxeRefresh.Click += new EventHandler(butnPxeRefresh_Click); - - #endregion - - #region Debug - - comboDebugMode.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (Cosmos.Build.Common.DebugMode)((EnumValue)comboDebugMode.SelectedItem).Value; - if (x != mProps.DebugMode) - { - mProps.DebugMode = x; - IsDirty = true; - } - }; - - chckEnableDebugStub.CheckedChanged += delegate (object aSender, EventArgs e) - { - if (FreezeEvents) return; - panlDebugSettings.Enabled = chckEnableDebugStub.Checked; - mProps.DebugEnabled = chckEnableDebugStub.Checked; - IsDirty = true; - }; - - comboTraceMode.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (TraceAssemblies)((EnumValue)comboTraceMode.SelectedItem).Value; - if (x != mProps.TraceAssemblies) - { - mProps.TraceAssemblies = x; - IsDirty = true; - } - }; - - checkIgnoreDebugStubAttribute.CheckedChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - bool x = checkIgnoreDebugStubAttribute.Checked; - if (x != mProps.IgnoreDebugStubAttribute) - { - mProps.IgnoreDebugStubAttribute = x; - IsDirty = true; - } - }; - - cmboCosmosDebugPort.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (string)cmboCosmosDebugPort.SelectedItem; - if (x != mProps.CosmosDebugPort) - { - mProps.CosmosDebugPort = x; - IsDirty = true; - } - }; - - cmboVisualStudioDebugPort.SelectedIndexChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - var x = (string)cmboVisualStudioDebugPort.SelectedItem; - if (x != mProps.VisualStudioDebugPort) - { - mProps.VisualStudioDebugPort = x; - IsDirty = true; - } - }; - - checkEnableGDB.CheckedChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - bool x = checkEnableGDB.Checked; - if (x != mProps.EnableGDB) - { - mProps.EnableGDB = x; - IsDirty = true; - } - checkStartCosmosGDB.Enabled = x; - checkStartCosmosGDB.Checked = x; - }; - - checkStartCosmosGDB.CheckedChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - bool x = checkStartCosmosGDB.Checked; - if (x != mProps.StartCosmosGDB) - { - mProps.StartCosmosGDB = x; - IsDirty = true; - } - }; - - checkEnableBochsDebug.CheckedChanged += delegate (Object sender, EventArgs e) - { - if (FreezeEvents) return; - bool x = checkEnableBochsDebug.Checked; - if (x != mProps.EnableBochsDebug) - { - mProps.EnableBochsDebug = x; - IsDirty = true; - } - checkStartBochsDebugGui.Enabled = x; - - if (x == false) - { - checkStartBochsDebugGui.Checked = x; - } - }; - - checkStartBochsDebugGui.CheckedChanged += delegate (object sender, EventArgs e) - { - if (FreezeEvents) return; - bool x = checkStartBochsDebugGui.Checked; - if (x != mProps.StartBochsDebugGui) - { - mProps.StartBochsDebugGui = x; - IsDirty = true; - } - }; - #endregion - } - - public override void ApplyChanges() - { - // Save now, because when we reload this form it will - // reload out of the saved profile and trash any changes - // in the active area. - mProps.SaveProfile(mProps.Profile); - base.ApplyChanges(); - } - - protected void RemoveTab(TabPage aTab) - { - if (TabControl1.TabPages.Contains(aTab)) - { - TabControl1.TabPages.Remove(aTab); - } - } - - protected void UpdateTabs() - { - var xTab = TabControl1.SelectedTab; - - RemoveTab(tabDebug); - RemoveTab(tabDeployment); - RemoveTab(tabLaunch); - RemoveTab(tabVMware); - RemoveTab(tabHyperV); - RemoveTab(tabPXE); - RemoveTab(tabUSB); - RemoveTab(tabISO); - RemoveTab(tabSlave); - RemoveTab(tabBochs); - - if (mShowTabDebug) - { - TabControl1.TabPages.Add(tabDebug); - } - - if (mShowTabDeployment) - { - TabControl1.TabPages.Add(tabDeployment); - } - if (mShowTabPXE) - { - TabControl1.TabPages.Add(tabPXE); - } - if (mShowTabUSB) - { - TabControl1.TabPages.Add(tabUSB); - } - if (mShowTabISO) - { - TabControl1.TabPages.Add(tabISO); - } - - if (mShowTabLaunch) - { - TabControl1.TabPages.Add(tabLaunch); - } - if (mShowTabVMware) - { - TabControl1.TabPages.Add(tabVMware); - } - if (mShowTabHyperV) - { - TabControl1.TabPages.Add(tabHyperV); - } - if (mShowTabSlave) - { - TabControl1.TabPages.Add(tabSlave); - } - if (mShowTabBochs) - { - TabControl1.TabPages.Add(tabBochs); - } - - if (TabControl1.TabPages.Contains(xTab)) - { - TabControl1.SelectedTab = xTab; - } - else - { - TabControl1.SelectedTab = tabProfile; - } - } - - protected void UpdatePresetsUI() - { - FreezeEvents = true; - - mShowTabDebug = true; - cmboCosmosDebugPort.Enabled = true; - cmboVisualStudioDebugPort.Enabled = true; - - if (mProps.Profile == "ISO") - { - mShowTabDebug = false; - - } - else if (mProps.Profile == "USB") - { - mShowTabDebug = false; - mShowTabUSB = true; - - } - else if (mProps.Profile == "VMware") - { - mShowTabVMware = true; - chckEnableDebugStub.Checked = true; - chkEnableStackCorruptionDetection.Checked = true; - cmboCosmosDebugPort.Enabled = false; - cmboVisualStudioDebugPort.Enabled = false; - cmboVisualStudioDebugPort.SelectedIndex = mVMwareAndBochsDebugPipe; - - } - else if (mProps.Profile == "HyperV") - { - mShowTabHyperV = true; - chckEnableDebugStub.Checked = true; - chkEnableStackCorruptionDetection.Checked = true; - cmboCosmosDebugPort.Enabled = false; - cmboVisualStudioDebugPort.Enabled = false; - cmboVisualStudioDebugPort.SelectedIndex = mHyperVDebugPipe; - } - else if (mProps.Profile == "PXE") - { - chckEnableDebugStub.Checked = false; - } - else if (mProps.Profile == "Bochs") - { - mShowTabBochs = true; - chckEnableDebugStub.Checked = true; - chkEnableStackCorruptionDetection.Checked = true; - cmboCosmosDebugPort.Enabled = false; - cmboVisualStudioDebugPort.Enabled = false; - cmboVisualStudioDebugPort.SelectedIndex = mVMwareAndBochsDebugPipe; - } - else if (mProps.Profile == "IntelEdison") - { - mShowTabBochs = false; - mShowTabVMware = false; - cmboVisualStudioDebugPort.Enabled = false; - } - FreezeEvents = false; - } - - protected void UpdateUI() - { - UpdatePresetsUI(); - var xProfile = (ProfileItem)lboxProfile.SelectedItem; - if (xProfile == null) - { - return; - } - - if (mShowTabDebug == false) - { - chckEnableDebugStub.Checked = false; - } - - lablCurrentProfile.Text = xProfile.Name; - lablDeployText.Text = mProps.Description; - lboxDeployment.SelectedItem = mProps.Deployment; - - // Launch - lboxLaunch.SelectedItem = mProps.Launch; - - lablBuildOnly.Visible = mProps.Launch == LaunchType.None; - - lboxDeployment.SelectedItem = EnumValue.Find(lboxDeployment.Items, mProps.Deployment); - lboxLaunch.SelectedItem = EnumValue.Find(lboxLaunch.Items, mProps.Launch); - cmboVMwareEdition.SelectedItem = EnumValue.Find(cmboVMwareEdition.Items, mProps.VMwareEdition); - chckEnableDebugStub.Checked = mProps.DebugEnabled; - chkEnableStackCorruptionDetection.Checked = mProps.StackCorruptionDetectionEnabled; - comboStackCorruptionDetectionLevel.SelectedItem = EnumValue.Find(comboStackCorruptionDetectionLevel.Items, mProps.StackCorruptionDetectionLevel); - - panlDebugSettings.Enabled = mProps.DebugEnabled; - cmboCosmosDebugPort.SelectedIndex = cmboCosmosDebugPort.Items.IndexOf(mProps.CosmosDebugPort); - if (!String.IsNullOrWhiteSpace(mProps.VisualStudioDebugPort)) - { - cmboVisualStudioDebugPort.SelectedIndex = - cmboVisualStudioDebugPort.Items.IndexOf(mProps.VisualStudioDebugPort); - } - textOutputPath.Text = mProps.OutputPath; - comboFramework.SelectedItem = EnumValue.Find(comboFramework.Items, mProps.Framework); - comboBinFormat.SelectedItem = EnumValue.Find(comboBinFormat.Items, mProps.BinFormat); - checkUseInternalAssembler.Checked = mProps.UseInternalAssembler; - checkEnableGDB.Checked = mProps.EnableGDB; - checkStartCosmosGDB.Checked = mProps.StartCosmosGDB; - checkEnableBochsDebug.Checked = mProps.EnableBochsDebug; - checkStartBochsDebugGui.Checked = mProps.StartBochsDebugGui; - // Locked to COM1 for now. - //cmboCosmosDebugPort.SelectedIndex = 0; - - #region Slave - - cmboSlavePort.SelectedIndex = cmboSlavePort.Items.IndexOf(mProps.SlavePort); - - #endregion - - checkIgnoreDebugStubAttribute.Checked = mProps.IgnoreDebugStubAttribute; - comboDebugMode.SelectedItem = EnumValue.Find(comboDebugMode.Items, mProps.DebugMode); - comboTraceMode.SelectedItem = EnumValue.Find(comboTraceMode.Items, mProps.TraceAssemblies); - - lablPreset.Visible = xProfile.IsPreset; - - mShowTabDeployment = !xProfile.IsPreset; - mShowTabLaunch = !xProfile.IsPreset; - // - mShowTabISO = mProps.Deployment == DeploymentType.ISO; - mShowTabUSB = mProps.Deployment == DeploymentType.USB; - mShowTabPXE = mProps.Deployment == DeploymentType.PXE; - // - mShowTabVMware = mProps.Launch == LaunchType.VMware; - mShowTabHyperV = mProps.Launch == LaunchType.HyperV; - mShowTabSlave = mProps.Launch == LaunchType.Slave; - mShowTabBochs = (LaunchType.Bochs == mProps.Launch); - // - UpdateTabs(); - } - - protected int FillProfile(string aPrefix, string aName) - { - var xProfile = new ProfileItem { Prefix = aPrefix, Name = aName, IsPreset = true }; - return lboxProfile.Items.Add(xProfile); - } - - protected int FillProfile(int aID) - { - var xProfile = new ProfileItem { Prefix = "User" + aID.ToString("000"), IsPreset = false }; - xProfile.Name = mProps.GetProperty(xProfile.Prefix + "_Name"); - return lboxProfile.Items.Add(xProfile); - } - - protected void FillProfiles() - { - lboxProfile.Items.Clear(); - - foreach (var xPreset in mPresets) - { - FillProfile(xPreset.Key, xPreset.Value); - } - - for (int i = 1; i < 100; i++) - { - if (!string.IsNullOrEmpty(mProps.GetProperty("User" + i.ToString("000") + "_Name"))) - { - FillProfile(i); - } - } - } - - void butnProfileRename_Click(object sender, EventArgs e) - { - var xItem = (ProfileItem)lboxProfile.SelectedItem; - - if (xItem == null) - { - // This should be impossible, but we check for it anwyays. - - } - else if (xItem.IsPreset) - { - MessageBox.Show("Preset profiles cannot be renamed."); - - } - else - { - string xName = Interaction.InputBox("Profile Name", "Rename Profile", mProps.Name); - if (xName != "") - { - IsDirty = true; - mProps.Name = xName; - xItem.Name = xName; - typeof(ListBox).InvokeMember( - "RefreshItems", - BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, - null, - lboxProfile, - new object[] { }); - } - } - } - - void butnProfileDelete_Click(object sender, EventArgs e) - { - var xItem = (ProfileItem)lboxProfile.SelectedItem; - - if (xItem == null) - { - // This should be impossible, but we check for it anwyays. - - } - else if (xItem.IsPreset) - { - MessageBox.Show("Preset profiles cannot be deleted."); - - } - else if (MessageBox.Show("Delete profile '" + xItem.Name + "'?", "", MessageBoxButtons.YesNo) - == DialogResult.Yes) - { - IsDirty = true; - // Select a new profile first, so the selectchange logic wont barf - lboxProfile.SelectedIndex = 0; - lboxProfile.Items.Remove(xItem); - mProps.DeleteProfile(xItem.Prefix); - } - } - - void butnProfileClone_Click(object sender, EventArgs e) - { - var xItem = (ProfileItem)lboxProfile.SelectedItem; - if (xItem == null) - { - // This should be impossible, but we check for it anwyays. - return; - } - - int xID; - string xPrefix = null; - for (xID = 1; xID < 100; xID++) - { - xPrefix = "User" + xID.ToString("000"); - if (mProps.GetProperty(xPrefix + "_Name") == "") - { - break; - } - } - if (xID == 100) - { - MessageBox.Show("No more profile space is available."); - return; - } - - IsDirty = true; - mProps.Name = xItem.Prefix + " User " + xID.ToString("000"); - mProps.Description = ""; - mProps.SaveProfile(xPrefix); - lboxProfile.SelectedIndex = FillProfile(xID); - } - - void butnPxeRefresh_Click(object sender, EventArgs e) - { - FillNetworkInterfaces(); - } - - protected BuildProperties mProps = new BuildProperties(); - - public override PropertiesBase Properties - { - get - { - return mProps; - } - } - - /// - /// Load project independent properties. - /// - protected void LoadProjectProps() - { - foreach (var propertyName in mProps.ProjectIndependentProperties) - { - var propertyValue = ProjectMgr.GetProjectProperty(propertyName); - mProps.SetProperty(propertyName, propertyValue); - } - } - - /// - /// Load properties for the given profile. - /// - /// Name of the profile for which load properties. - protected void LoadProfileProps(string aPrefix) - { - string xPrefix = aPrefix + (aPrefix == "" ? "" : "_"); - foreach (var xName in BuildProperties.PropNames) - { - if (!mProps.ProjectIndependentProperties.Contains(xName)) - { - string xValue = ProjectConfigs[0].GetConfigurationProperty(xPrefix + xName, false); - // This is important that we dont copy empty values, so instead the defaults will be used. - if (!string.IsNullOrWhiteSpace(xValue)) - { - mProps.SetProperty(xPrefix + xName, xValue); - } - } - } - } - - protected void LoadProps() - { - // Load mProps from project config file. - // The reason for loading into mProps seems to be so we can track changes, and cancel if necessary. - mProps.Reset(); - - // Reset cache only on first one - // Get selected profile - mProps.SetProperty( - BuildPropertyNames.ProfileString, - ProjectConfigs[0].GetConfigurationProperty(BuildPropertyNames.ProfileString, true)); - - LoadProjectProps(); - - // Load selected profile props - LoadProfileProps(""); - foreach (var xPreset in mPresets) - { - LoadProfileProps(xPreset.Key); - } - for (int i = 1; i < 100; i++) - { - string xPrefix = "User" + i.ToString("000"); - if (!string.IsNullOrWhiteSpace(ProjectConfigs[0].GetConfigurationProperty(xPrefix + "_Name", false))) - { - LoadProfileProps(xPrefix); - } - } - } - - protected override void FillProperties() - { - base.FillProperties(); - LoadProps(); - - FillProfiles(); - foreach (ProfileItem xItem in lboxProfile.Items) - { - if (xItem.Prefix == mProps.Profile) - { - lboxProfile.SelectedItem = xItem; - break; - } - } - - lboxDeployment.Items.AddRange(EnumValue.GetEnumValues(typeof(DeploymentType), true)); - comboFramework.Items.AddRange(EnumValue.GetEnumValues(typeof(Framework), true)); - comboBinFormat.Items.AddRange(EnumValue.GetEnumValues(typeof(BinFormat), true)); - lboxLaunch.Items.AddRange(EnumValue.GetEnumValues(typeof(LaunchType), true)); - - #region VMware - - cmboVMwareEdition.Items.AddRange(EnumValue.GetEnumValues(typeof(VMwareEdition), true)); - - #endregion - - #region Debug - - cmboCosmosDebugPort.Items.Clear(); - FillComPorts(cmboCosmosDebugPort.Items); - - cmboVisualStudioDebugPort.Items.Clear(); - FillComPorts(cmboVisualStudioDebugPort.Items); - mVMwareAndBochsDebugPipe = cmboVisualStudioDebugPort.Items.Add(@"Pipe: Cosmos\Serial"); - mHyperVDebugPipe = cmboVisualStudioDebugPort.Items.Add(@"Pipe: CosmosSerial"); - - comboDebugMode.Items.AddRange(EnumValue.GetEnumValues(typeof(DebugMode), false)); - comboTraceMode.Items.AddRange(EnumValue.GetEnumValues(typeof(TraceAssemblies), false)); - comboStackCorruptionDetectionLevel.Items.AddRange(EnumValue.GetEnumValues(typeof(StackCorruptionDetectionLevel), true)); - - #endregion - - #region PXE - - FillNetworkInterfaces(); - - cmboSlavePort.Items.Clear(); - cmboSlavePort.Items.Add("None"); - FillComPorts(cmboSlavePort.Items); - - #endregion - - UpdateUI(); - } - - protected void FillComPorts(System.Collections.IList aList) - { - //TODO http://stackoverflow.com/questions/2937585/how-to-open-a-serial-port-by-friendly-name - foreach (string xPort in SerialPort.GetPortNames()) - { - aList.Add("Serial: " + xPort); - } - } - - protected void FillNetworkInterfaces() - { - comboPxeInterface.Items.Clear(); - - comboPxeInterface.Items.AddRange(GetNetworkInterfaces().ToArray()); - - if (mProps.PxeInterface == String.Empty) - { - if (comboPxeInterface.Items.Count > 0) - { - comboPxeInterface.Text = comboPxeInterface.Items[0].ToString(); - } - else - { - comboPxeInterface.Text = "192.168.42.1"; - } - } - else - { - comboPxeInterface.Text = mProps.PxeInterface; - } - } - - protected List GetNetworkInterfaces() - { - NetworkInterface[] nInterfaces = NetworkInterface.GetAllNetworkInterfaces(); - List interfaces_list = new List(); - - foreach (NetworkInterface nInterface in nInterfaces) - { - if (nInterface.OperationalStatus == OperationalStatus.Up) - { - IPInterfaceProperties ipProperties = nInterface.GetIPProperties(); - - foreach (var ip in ipProperties.UnicastAddresses) - { - if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) - { - interfaces_list.Add(ip.Address.ToString()); - } - } - } - } - - return interfaces_list; - } - - private void OutputBrowse_Click(object sender, EventArgs e) - { - string folderPath = String.Empty; - var dialog = new FolderBrowserDialog(); - dialog.ShowNewFolderButton = true; - - folderPath = textOutputPath.Text; - if ((String.IsNullOrEmpty(folderPath) == false) - && (folderPath.IndexOfAny(System.IO.Path.GetInvalidPathChars()) == -1)) - { - if (System.IO.Path.IsPathRooted(folderPath) == false) - { - folderPath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Project.FullName), folderPath); - } - - while ((System.IO.Directory.Exists(folderPath) == false) && (String.IsNullOrEmpty(folderPath) == false)) - { - int index = -1; - index = - folderPath.IndexOfAny( - new Char[] { System.IO.Path.PathSeparator, System.IO.Path.AltDirectorySeparatorChar }); - if (index > -1) - { - folderPath = folderPath.Substring(0, index - 1); - } - else - { - folderPath = String.Empty; - } - } - - if (String.IsNullOrEmpty(folderPath) == true) - { - folderPath = System.IO.Path.GetDirectoryName(Project.FullName); - } - } - else - { - folderPath = System.IO.Path.GetDirectoryName(Project.FullName); - } - - dialog.SelectedPath = folderPath; - dialog.Description = "Select build output path"; - - if (dialog.ShowDialog() == DialogResult.OK) - { - textOutputPath.Text = dialog.SelectedPath; - } - } - - private void chkEnableStacckCorruptionDetection_CheckedChanged(object sender, EventArgs e) - { - if (!FreezeEvents) - { - IsDirty = true; - mProps.StackCorruptionDetectionEnabled = chkEnableStackCorruptionDetection.Checked; - comboStackCorruptionDetectionLevel.Enabled = mProps.StackCorruptionDetectionEnabled; - } - } - - private void stackCorruptionDetectionLevelComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - if (!FreezeEvents) - { - var x = (StackCorruptionDetectionLevel)((EnumValue) comboStackCorruptionDetectionLevel.SelectedItem).Value; - if (x != mProps.StackCorruptionDetectionLevel) - { - mProps.StackCorruptionDetectionLevel = x; - IsDirty = true; - } - } - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.resx b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.resx deleted file mode 100644 index 6112095a21..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CosmosPage.resx +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - 17, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAeRJREFUOE+9kd9LU2Ech/enlDKkuvYPiCgzCgwKL+oi6Add7UKvuooMgyRmLHA2 - F9YsZZue6SLSRcrMtTTbcq5sE08mttF07Ohybp7Z0847bWYxL4Ie+Ny85/08X77v0f0z7tFPaJFGwiL2 - wQBd7jfIC9/YulIerbwb24CfK01PiMwt7C1xDYe3akXymz9o636BxxfmXEPr3hL7UFAUPVGQ3kNIVrhn - e440puAcTeHwpng4lMLUnxSJLOZ+F3a5/UKgkdvIo6xmiSXSQrCb5p4lqi/7CM6ulCRWp1d87PRtYBxU - uCF9pfGRTPfLZXG+kwZLAve4wqH6Ad7NJIsSc2Ffbe+1jMpSKsN8bIWP8jLWZ3FRapHyIqHC1AvGOAfr - n3LgTC9VdY+LAm3f9az6a7LBGuWq+QN3HfNCsI3yXWV2cR3f9CoWaRL9qQclgZLOMvM5QTASwx/6wsjb - OZo6i7/3ek8agznO+TtRTt+cErFIE+hPtJcE1bUX/0ijaUoI1MJ6iZTKtLzGcEDB9SrJ/V4/lTWm0kP+ - jUvN40Kwc/J22p2vqThqLC84e81LJreJtT9Ah2sSS9+EmKyVzfYx9h+5XV5QY/AUXtshUlVnQ3+yg8rj - bVQcay2UW9h3+FZ5wX9Cp/sJHQDnDCBJADYAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAfxJREFUOE+dkm1LU2EYx/cZCqpXUZBFD6jlaptuZw/l3ApKIiwWrBcFLfZCZg2k - mOXmsvoEQc+UIYJgFERZbpkYam7mMFdqG1t7UvMr/Drn2JRxTi/qxf+G++b/u6+L6/prSssr/K9keCIW - p83vJzr8keLSL1WjmjSFxWWe9/ZhtR7B4XTy+s1bpDc1c760xEzyG896euS7Rnro7eun1XcZncGE1Wbn - /oNHig+y+RLvIh9oPtFMMBRehaUjOfeDkdExfG1+6o1mBLOFjkCATK7wByxyvbMTi62R7lt3SGdz63BZ - +eIij588xXbYjiDYCHaFGZuI0RW+jclopONGiIV0ds2vmLY0sNhUAve58xzSNaDTGzGZBS54vGInxQrv - X1c1+D5CndaAod6E3XGMuYW0wqMKT8/M4jh6nOqaA9TUatEe1GNvcip8CjghglKl3XuquXjJy1B0mDMu - N7X767h772GFtwKe/T5Pk1hx6/YqXGfdYqspebKSfFfa0esbSHxNKuFsoYTH28qOXfuwWBsZ/xxfM2XE - Vc2nMpw81SImsV0OSwXcP/CCTVu2UbVzL8FwN6nM6i7LkkIzOTWN0SQQ/5KQ7zL8U/z56rUAGzZupuW0 - i0/jk6oRlSoGQzcZHIqsw5KiI6N4xAENvHwlBiGjAMvKiUFSTdi/aYXfkSUMWsgi4zsAAAAASUVORK5C - YII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAgNJREFUOE+lkutLk2EYxvePhJaHShFBUTEPiCieQOmDiEZgrEbpYGiCQxkqA80I - RUkUEZ0YRMS+DDI70MkTmzJnDc8iU8QT2mAEItnle90wHwTDyBduXnie5/rd133Q4ZKfAJqHFs9E08A8 - zD1emDpmYXjqRlnTFIrMk8iuGkNaxWekGEaQrHecBfw+/vPXODw6hj9whN2fh/Bt/8LSRgA3cxr/DeBZ - 9kvmTNMoHGNbIrYN+3Aj23IxgJkpds0doP3VstgmsNexhutZ9QrAms8T0zYzU5xXM46kcjsmvfvoeL2i - AeoUgA07T8yaaZuZKab1rzN74jgys1YB2O2gmBZzH49LODXrrJlnzEzxe9cOLH1ziMioVgCOiuIFX0CE - Q+/WYf+yieiCFrRp9tkwxnP7Kt5MbKGm6wfC000KwDlTXNLgEvHMkh+Db32o7fYivtQm1l9+3IBOp5P7 - yjYPwlKNCsAluWudxgvtknb5t9oWcL/VLU2Mvd2JFq3uqs7vAtE/ceNayiMF4KiYMSjmY2O7B4Ua+NaD - YQGEJumRbvyG1IcfBHI12aAAXM8R57aIWTNrLLY4tfNPiCvpR1SeVeu6WWzHFD6THSDwFMDdpmUG62NJ - PKM4Or9ZxBxb8H8l7g5CEu8pAOfM3WanSeeS8CFHxW4zM2umbWamOCShXAH+/wNOANABIDUxWnDPAAAA - AElFTkSuQmCC - - - - 122, 17 - - - - ..\Resources\Refresh_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.Designer.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.Designer.cs deleted file mode 100644 index 2fecdb9a48..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.Designer.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace Cosmos.VS.ProjectSystem.PropertyPages { - partial class CustomPropertyPage { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) { - if (disposing && (components != null)) { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() { - this.SuspendLayout(); - // - // CustomPropertyPage - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Name = "CustomPropertyPage"; - this.ResumeLayout(false); - - } - - #endregion - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.cs deleted file mode 100644 index 35cf229aaa..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.cs +++ /dev/null @@ -1,367 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Cosmos.Build.Common; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Project; -using Microsoft.VisualStudio.Project.Automation; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Cosmos.VS.ProjectSystem.PropertyPages -{ - public partial class CustomPropertyPage : UserControl, IPropertyPage - { - private static readonly List _pageList = new List(); - private bool _dirty; - private string _helpKeyword; - - private IPropertyPageSite _site; - private string _title; - - public CustomPropertyPage() - { - ProjectMgr = null; - ProjectConfigs = null; - Project = null; - _site = null; - _dirty = false; - IgnoreDirty = false; - _title = string.Empty; - _helpKeyword = string.Empty; - } - - protected static CustomPropertyPage[] Pages => _pageList.ToArray(); - - public virtual PropertiesBase Properties => null; - - public virtual string Title - { - get - { - if (_title == null) - _title = string.Empty; - return _title; - } - set => _title = value; - } - - protected virtual string HelpKeyword - { - get - { - if (_helpKeyword == null) - _helpKeyword = string.Empty; - return _helpKeyword; - } - set => _title = value; - } - - public bool IsDirty - { - get { return _dirty; } - set - { - if (IgnoreDirty == false) - if (_dirty != value) - { - _dirty = value; - if (_site != null) - _site.OnStatusChange((uint) (_dirty ? PropPageStatus.Dirty : PropPageStatus.Clean)); - } - } - } - - public bool IgnoreDirty { get; set; } - - public ProjectNode ProjectMgr { get; private set; } - - protected ProjectConfig[] ProjectConfigs { get; private set; } - - protected OAProject Project { get; private set; } - - void IPropertyPage.SetPageSite(IPropertyPageSite pPageSite) - { - _site = pPageSite; - } - - void IPropertyPage.Activate(IntPtr hWndParent, RECT[] pRect, int bModal) - { - CreateControl(); - Initialize(); - NativeMethods.SetParent(Handle, hWndParent); - - _pageList.Add(this); - FillConfigurations(); - - IgnoreDirty = true; - FillProperties(); - IgnoreDirty = false; - } - - void IPropertyPage.Deactivate() - { - _pageList.Remove(this); - Dispose(); - } - - void IPropertyPage.GetPageInfo(PROPPAGEINFO[] pPageInfo) - { - PROPPAGEINFO info = new PROPPAGEINFO(); - - Size = new Size(492, 288); - - info.cb = (uint) Marshal.SizeOf(typeof(PROPPAGEINFO)); - info.dwHelpContext = 0; - info.pszDocString = null; - info.pszHelpFile = null; - info.pszTitle = Title; - info.SIZE.cx = Width; - info.SIZE.cy = Height; - pPageInfo[0] = info; - } - - void IPropertyPage.SetObjects(uint count, object[] punk) - { - if (count > 0) - { - if (punk[0] is ProjectConfig) - { - ArrayList configs = new ArrayList(); - for (int i = 0; i < count; i++) - { - ProjectConfig config = (ProjectConfig) punk[i]; - if (ProjectMgr == null) - ProjectMgr = config.ProjectMgr; - configs.Add(config); - } - ProjectConfigs = (ProjectConfig[]) configs.ToArray(typeof(ProjectConfig)); - - // For ProjectNodes we will get one of these - } - else if (punk[0] is NodeProperties) - { - if (ProjectMgr == null) - ProjectMgr = (punk[0] as NodeProperties).Node.ProjectMgr; - - var configsMap = new Dictionary(); - - for (int i = 0; i < count; i++) - { - NodeProperties property = (NodeProperties) punk[i]; - IVsCfgProvider provider; - ErrorHandler.ThrowOnFailure(property.Node.ProjectMgr.GetCfgProvider(out provider)); - var expected = new uint[1]; - ErrorHandler.ThrowOnFailure(provider.GetCfgs(0, null, expected, null)); - if (expected[0] > 0) - { - var configs = new ProjectConfig[expected[0]]; - var actual = new uint[1]; - provider.GetCfgs(expected[0], configs, actual, null); - - foreach (ProjectConfig config in configs) - if (!configsMap.ContainsKey(config.ConfigName)) - configsMap.Add(config.ConfigName, config); - } - } - - if (configsMap.Count > 0) - { - if (ProjectConfigs == null) - ProjectConfigs = new ProjectConfig[configsMap.Keys.Count]; - configsMap.Values.CopyTo(ProjectConfigs, 0); - } - } - } - else - { - ProjectMgr = null; - } - - /* This code calls FillProperties without Initialize call - if (_projectMgr != null) - { - FillProperties(); - } - */ - - if (ProjectMgr != null && Project == null) - Project = new OAProject(ProjectMgr); - } - - void IPropertyPage.Show(uint nCmdShow) - { - Visible = true; - Show(); - } - - void IPropertyPage.Move(RECT[] pRect) - { - RECT r = pRect[0]; - - Location = new Point(r.left, r.top); - Size = new Size(r.right - r.left, r.bottom - r.top); - } - - int IPropertyPage.IsPageDirty() - { - return IsDirty ? VSConstants.S_OK : VSConstants.S_FALSE; - } - - int IPropertyPage.Apply() - { - if (IsDirty) - { - if (ProjectMgr == null) - { - System.Diagnostics.Debug.Assert(false); - return VSConstants.E_INVALIDARG; - } - - if (CheckInput()) - { - ApplyChanges(); - IsDirty = false; - } - else - { - return VSConstants.S_FALSE; - } - } - return VSConstants.S_OK; - } - - void IPropertyPage.Help(string pszHelpDir) - { - // IServiceProvider serviceProvider = _site as IServiceProvider; - // if (serviceProvider != null) - // { - // Help helpService = serviceProvider.GetService(typeof(Help)) as Help; - // if (helpService != null) - // { - // helpService.DisplayTopicFromF1Keyword(HelpKeyword); - // } - // } - } - - int IPropertyPage.TranslateAccelerator(MSG[] pMsg) - { - MSG msg = pMsg[0]; - - if ((msg.message < NativeMethods.WM_KEYFIRST || msg.message > NativeMethods.WM_KEYLAST) && - (msg.message < NativeMethods.WM_MOUSEFIRST || msg.message > NativeMethods.WM_MOUSELAST)) - return 1; - - return NativeMethods.IsDialogMessageA(Handle, ref msg) ? 0 : 1; - } - - protected virtual void FillProperties() - { - } - - protected virtual void FillConfigurations() - { - } - - public virtual void ApplyChanges() - { - if (Properties != null) - { - var properties = Properties.GetProperties(); - var independentProperties = Properties.ProjectIndependentProperties; - foreach (var pair in properties) - { - string propertyName = pair.Key; - - //if (independentProperties.Contains(propertyName)) - // SetProjectProperty(pair.Key, pair.Value); - //else - // SetConfigProperty(pair.Key, pair.Value); - - SetProjectProperty(pair.Key, pair.Value); - } - - IsDirty = false; - } - } - - /// - /// Sets project specific property. - /// - /// Name of the property to set. - /// Value of the property. - public virtual void SetProjectProperty(string name, string value) - { - CCITracing.TraceCall(); - if (value == null) - value = string.Empty; - - if (ProjectMgr != null) - ProjectMgr.SetProjectProperty(name, value); - } - - public virtual void SetConfigProperty(string name, string value) - { - CCITracing.TraceCall(); - if (value == null) - value = string.Empty; - - if (ProjectMgr != null) - { - foreach (ProjectConfig config in ProjectConfigs) - config.SetConfigurationProperty(name, value); - ProjectMgr.SetProjectFileDirty(true); - } - } - - public virtual string GetConfigProperty(string aName) - { - return ProjectConfigs[0].GetConfigurationProperty(aName, true); - } - - protected virtual void Initialize() - { - } - - protected virtual bool CheckInput() - { - return true; - } - - protected void MarkPageChanged() - { - IsDirty = true; - } - - protected string GetComboValue(ComboBox comboBox) - { - string selectedItem = comboBox.SelectedItem as string; - if (selectedItem != null) - return selectedItem; - return string.Empty; - } - - protected void AddComboBoxItems(ComboBox comboBox, params string[] items) - { - foreach (string item in items) - comboBox.Items.Add(item); - } - - private bool ParseBoolean(string value, bool defaultValue) - { - if (!string.IsNullOrEmpty(value)) - try - { - return bool.Parse(value); - } - catch - { - } - return defaultValue; - } - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.resx b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/CustomPropertyPage.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.Designer.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.Designer.cs deleted file mode 100644 index 3653e3f7d0..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace Cosmos.VS.ProjectSystem.PropertyPages -{ - partial class TitleDivision - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.labelTitle = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // labelTitle - // - this.labelTitle.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.labelTitle.AutoSize = true; - this.labelTitle.Location = new System.Drawing.Point(3, 0); - this.labelTitle.Margin = new System.Windows.Forms.Padding(3, 0, 6, 0); - this.labelTitle.Name = "labelTitle"; - this.labelTitle.Size = new System.Drawing.Size(67, 13); - this.labelTitle.TabIndex = 0; - this.labelTitle.Text = "Title Division"; - // - // TitleDivision - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.BackColor = System.Drawing.Color.Transparent; - this.Controls.Add(this.labelTitle); - this.Name = "TitleDivision"; - this.Size = new System.Drawing.Size(379, 13); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label labelTitle; - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.cs b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.cs deleted file mode 100644 index ad7c589fc4..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using Microsoft.VisualStudio.Project; - -namespace Cosmos.VS.ProjectSystem.PropertyPages -{ - public partial class TitleDivision : UserControl - { - public TitleDivision() - { - InitializeComponent(); - - Resize += TitleDivision_Resize; - Paint += TitleDivision_Paint; - labelTitle.Resize += Title_Resize; - FontChanged += TitleDivision_FontChanged; - - LineColor = SystemColors.ControlDark; - } - - void TitleDivision_FontChanged(object sender, EventArgs e) - { - labelTitle.Font = Font; - } - - void TitleDivision_Resize(object sender, EventArgs e) - { - Single halfHeight; - halfHeight = Size.Height * 0.5f; - halfHeight = halfHeight - (labelTitle.Size.Height * 0.5f); - - labelTitle.Location = new Point(0, (Int32)halfHeight); - Invalidate(); - } - - void TitleDivision_Paint(object sender, PaintEventArgs e) - { - Pen linePen; - Single halfHeight; - Single start; - Single end; - - halfHeight = (Size.Height * 0.5f) + 1.0f; - start = (Single)labelTitle.Right; - - if (String.IsNullOrEmpty(labelTitle.Text) == false) - { - start += (Single)labelTitle.Margin.Right; - }else{ - start += (Single)Padding.Left; - } - - end = Size.Width - (Single)Padding.Right; - - linePen = new Pen(LineColor); - - e.Graphics.DrawLine(linePen, start, halfHeight, end, halfHeight); - - linePen.Dispose(); - linePen = null; - } - - void Title_Resize(object sender, EventArgs e) - { - Size = new Size(Size.Width, labelTitle.Size.Height); - Invalidate(); - } - - [SRCategory("Category")] - [DisplayName("Line Color")] - [SRDescription("Description")] - public Color LineColor - { get; set; } - - [SRCategory("Category")] - [DisplayName("Title")] - [SRDescription("Description")] - public String Title - { - get{ return labelTitle.Text; } - set{ labelTitle.Text = value; } - } - - } -} diff --git a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.resx b/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.resx deleted file mode 100644 index 19dc0dd8b3..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/PropertyPages/TitleDivision.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Resources/Cosmos.ico b/source/Archive/Cosmos.VS.ProjectSystem/Resources/Cosmos.ico deleted file mode 100644 index fcdc401832..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/Resources/Cosmos.ico and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Resources/CosmosProjectNode.bmp b/source/Archive/Cosmos.VS.ProjectSystem/Resources/CosmosProjectNode.bmp deleted file mode 100644 index bf0fce1ea6..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/Resources/CosmosProjectNode.bmp and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/Resources/Refresh_16x.png b/source/Archive/Cosmos.VS.ProjectSystem/Resources/Refresh_16x.png deleted file mode 100644 index bc31d5e1fe..0000000000 Binary files a/source/Archive/Cosmos.VS.ProjectSystem/Resources/Refresh_16x.png and /dev/null differ diff --git a/source/Archive/Cosmos.VS.ProjectSystem/VSPackage.resx b/source/Archive/Cosmos.VS.ProjectSystem/VSPackage.resx deleted file mode 100644 index 190be97c19..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/VSPackage.resx +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cosmos Visual Studio Project System - - - The Visual Studio Project System for the Cosmos Operating System. - - - - Resources\Cosmos.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.ProjectSystem/app.config b/source/Archive/Cosmos.VS.ProjectSystem/app.config deleted file mode 100644 index a916be450f..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/app.config +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/packages.config b/source/Archive/Cosmos.VS.ProjectSystem/packages.config deleted file mode 100644 index 4da079ae38..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/packages.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.ProjectSystem/source.extension.vsixmanifest b/source/Archive/Cosmos.VS.ProjectSystem/source.extension.vsixmanifest deleted file mode 100644 index 28fd96fb18..0000000000 --- a/source/Archive/Cosmos.VS.ProjectSystem/source.extension.vsixmanifest +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Cosmos Visual Studio Project System - The Visual Studio project system for the Cosmos Operating System. - Resources\Cosmos.ico - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Archive/Cosmos.VS.Wizards/Cosmos.VS.Wizards.csproj b/source/Archive/Cosmos.VS.Wizards/Cosmos.VS.Wizards.csproj deleted file mode 100644 index f03739e973..0000000000 --- a/source/Archive/Cosmos.VS.Wizards/Cosmos.VS.Wizards.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - 15.0 - - - - Debug - AnyCPU - 2.0 - {B37F98E5-6D98-48D2-B736-01F0B28D46CE} - Library - Properties - Cosmos.VS.Wizards - Cosmos.VS.Wizards - v4.7.1 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - False - - - - - - - - \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.Wizards/CosmosProject.Cosmos b/source/Archive/Cosmos.VS.Wizards/CosmosProject.Cosmos deleted file mode 100644 index 2a24f10e2f..0000000000 --- a/source/Archive/Cosmos.VS.Wizards/CosmosProject.Cosmos +++ /dev/null @@ -1,38 +0,0 @@ - - - - net462 - - - - elf - VMware - true - Source - User - False - false - Player - bin\Debug\ - Use VMware Player or Workstation to deploy and debug. - ISO - VMware - Pipe: Cosmos\Serial - - - - - - - - - - - $KernelProjectName$ - $KernelProjectGuid$ - - - - - - diff --git a/source/Archive/Cosmos.VS.Wizards/CosmosProjectWizard.cs b/source/Archive/Cosmos.VS.Wizards/CosmosProjectWizard.cs deleted file mode 100644 index ac34574828..0000000000 --- a/source/Archive/Cosmos.VS.Wizards/CosmosProjectWizard.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using EnvDTE; -using Microsoft.VisualStudio.TemplateWizard; - -namespace Cosmos.VS.Wizards -{ - public class CosmosProjectWizard : IWizard - { - private const string BochsConfigurationFileName = "Cosmos.bxrc"; - - public void BeforeOpeningFile(EnvDTE.ProjectItem projectItem) - { - } - - private static string GetTemplate(string templateName) - { - using (var xStream = typeof(CosmosProjectWizard).Assembly.GetManifestResourceStream(templateName)) - { - if (xStream == null) - { - MessageBox.Show("Could not find template manifest stream : " + templateName); - return null; - } - using (var xReader = new StreamReader(xStream)) - { - return xReader.ReadToEnd(); - } - } - } - - private static string GetBochsConfigurationFileTemplate() - { - return GetTemplate(BochsConfigurationFileName); - } - - private static string GetProjectFileTemplate() - { - return GetTemplate("Cosmos.VS.Wizards.CosmosProject.Cosmos"); - } - - public void ProjectFinishedGenerating(Project project) - { - // add Cosmos template to solution - // read embedded template file - var xInputString = GetProjectFileTemplate(); - if (xInputString == null) - { - return; - } - - // set project extension for reference - string extension = Path.GetExtension(project.UniqueName); - - xInputString = xInputString.Replace("$KernelProjectGuid$", mGuidKernel.ToString("b")); - xInputString = xInputString.Replace("$CosmosProjectGuid$", mGuidCosmosProj.ToString("b")); - xInputString = xInputString.Replace("$KernelProjectName$", project.Name); - xInputString = xInputString.Replace("$CosmosProjectName$", project.Name + "Boot"); - xInputString = xInputString.Replace("$ProjectTypeExtension$", extension); - var xFilename = Path.GetDirectoryName(project.FullName); - xFilename = Path.Combine(xFilename, project.Name + "Boot"); - xFilename += ".Cosmos"; - File.WriteAllText(xFilename, xInputString); - - Project xCosmosProject; - try - { - xCosmosProject = project.DTE.Solution.AddFromFile(xFilename, false); - } - catch (COMException) - { - return; - } - - // set Cosmos Boot as startup project - project.DTE.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer).Activate(); - EnvDTE.UIHierarchy hierarchy = project.DTE.ActiveWindow.Object as EnvDTE.UIHierarchy; - string fullPath = FindProject(hierarchy.UIHierarchyItems, xCosmosProject); - if (fullPath.Length > 0) - { - hierarchy.GetItem(fullPath).Select(EnvDTE.vsUISelectionType.vsUISelectionTypeSelect); - project.DTE.ExecuteCommand("Project.SetasStartUpProject"); - } - - // set all projects in all configurations are supposed to build - foreach (SolutionConfiguration item in project.DTE.Solution.SolutionBuild.SolutionConfigurations) - { - for (int i = 1; i <= item.SolutionContexts.Count; i++) - { - SolutionContext context = item.SolutionContexts.Item(i); - if (context.ProjectName.EndsWith(project.UniqueName)) - context.ShouldBuild = true; - else if (context.ProjectName.EndsWith(xCosmosProject.UniqueName)) - context.ShouldBuild = true; - } - } - } - - public void ProjectItemFinishedGenerating(EnvDTE.ProjectItem projectItem) - { - } - - public void RunFinished() - { - } - - public string FindProject(UIHierarchyItems h, Project p) - { - foreach (UIHierarchyItem xUiHierarchyItem in h) - { - if (xUiHierarchyItem.Name == p.Name) - { - dynamic solutionNode = xUiHierarchyItem.Object; - dynamic project = p.Object; - - if (solutionNode.Project.ProjectIDGuid == project.ProjectIDGuid) - { - return p.Name; - } - } - - var xPartOfName = FindProject(xUiHierarchyItem.UIHierarchyItems, p); - if (xPartOfName.Length > 0) - { - if (xUiHierarchyItem.Object is SolutionClass solution) - { - return xUiHierarchyItem.Name + "\\" + xPartOfName; - } - return xUiHierarchyItem.Name + "\\" + xPartOfName; - } - } - return string.Empty; - } - - private Guid mGuidKernel; - private Guid mGuidCosmosProj; - - public void RunStarted(object automationObject, Dictionary replacementsDictionary, WizardRunKind runKind, object[] customParams) - { - mGuidKernel = Guid.NewGuid(); - mGuidCosmosProj = Guid.NewGuid(); - replacementsDictionary.Add("$KernelProjectGuid$", mGuidKernel.ToString("B")); - replacementsDictionary.Add("$CosmosProjectGuid$", mGuidCosmosProj.ToString("B")); - } - - public bool ShouldAddProjectItem(string filePath) - { - return true; - } - } -} \ No newline at end of file diff --git a/source/Archive/Cosmos.VS.Wizards/Properties/AssemblyInfo.cs b/source/Archive/Cosmos.VS.Wizards/Properties/AssemblyInfo.cs deleted file mode 100644 index 04815eec7d..0000000000 --- a/source/Archive/Cosmos.VS.Wizards/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +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("Cosmos.VS.Wizards")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Cosmos.VS.Wizards")] -[assembly: AssemblyCopyright("")] -[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)] - -// 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/source/Archive/MPF/12.0/AssemblyReferenceNode.cs b/source/Archive/MPF/12.0/AssemblyReferenceNode.cs deleted file mode 100644 index 8e8a7a8ab9..0000000000 --- a/source/Archive/MPF/12.0/AssemblyReferenceNode.cs +++ /dev/null @@ -1,524 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using MSBuildExecution = Microsoft.Build.Execution; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using Microsoft.Build.Execution; - -namespace Microsoft.VisualStudio.Project -{ - [ComVisible(true)] - public class AssemblyReferenceNode : ReferenceNode - { - #region fields - /// - /// The name of the assembly this reference represents - /// - private System.Reflection.AssemblyName assemblyName; - private AssemblyName resolvedAssemblyName; - - private string assemblyPath = String.Empty; - - /// - /// Defines the listener that would listen on file changes on the nested project node. - /// - private FileChangeManager fileChangeListener; - - /// - /// A flag for specifying if the object was disposed. - /// - private bool isDisposed; - #endregion - - #region properties - /// - /// The name of the assembly this reference represents. - /// - /// - internal System.Reflection.AssemblyName AssemblyName - { - get - { - return this.assemblyName; - } - } - - /// - /// Returns the name of the assembly this reference refers to on this specific - /// machine. It can be different from the AssemblyName property because it can - /// be more specific. - /// - internal System.Reflection.AssemblyName ResolvedAssembly - { - get { return resolvedAssemblyName; } - } - - public override string Url - { - get - { - return this.assemblyPath; - } - } - - public override string Caption - { - get - { - return this.assemblyName.Name; - } - } - - private Automation.OAAssemblyReference assemblyRef; - internal override object Object - { - get - { - if(null == assemblyRef) - { - assemblyRef = new Automation.OAAssemblyReference(this); - } - return assemblyRef; - } - } - #endregion - - #region ctors - /// - /// Constructor for the ReferenceNode - /// - public AssemblyReferenceNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.GetPathNameFromProjectFile(); - - this.InitializeFileChangeEvents(); - - string include = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - - this.CreateFromAssemblyName(new System.Reflection.AssemblyName(include)); - } - - /// - /// Constructor for the AssemblyReferenceNode - /// - public AssemblyReferenceNode(ProjectNode root, string assemblyPath) - : base(root) - { - // Validate the input parameters. - if(null == root) - { - throw new ArgumentNullException("root"); - } - if(string.IsNullOrEmpty(assemblyPath)) - { - throw new ArgumentNullException("assemblyPath"); - } - - this.InitializeFileChangeEvents(); - - // The assemblyPath variable can be an actual path on disk or a generic assembly name. - if(File.Exists(assemblyPath)) - { - // The assemblyPath parameter is an actual file on disk; try to load it. - this.assemblyName = System.Reflection.AssemblyName.GetAssemblyName(assemblyPath); - this.assemblyPath = assemblyPath; - - // We register with listeningto chnages onteh path here. The rest of teh cases will call into resolving the assembly and registration is done there. - this.fileChangeListener.ObserveItem(this.assemblyPath); - } - else - { - // The file does not exist on disk. This can be because the file / path is not - // correct or because this is not a path, but an assembly name. - // Try to resolve the reference as an assembly name. - this.CreateFromAssemblyName(new System.Reflection.AssemblyName(assemblyPath)); - } - } - #endregion - - #region methods - /// - /// Closes the node. - /// - /// - public override int Close() - { - try - { - this.Dispose(true); - } - finally - { - base.Close(); - } - - return VSConstants.S_OK; - } - - /// - /// Links a reference node to the project and hierarchy. - /// - protected override void BindReferenceData() - { - Debug.Assert(this.assemblyName != null, "The AssemblyName field has not been initialized"); - - // If the item has not been set correctly like in case of a new reference added it now. - // The constructor for the AssemblyReference node will create a default project item. In that case the Item is null. - // We need to specify here the correct project element. - if(this.ItemNode == null || this.ItemNode.Item == null) - { - this.ItemNode = new ProjectElement(this.ProjectMgr, this.assemblyName.FullName, ProjectFileConstants.Reference); - } - - // Set the basic information we know about - this.ItemNode.SetMetadata(ProjectFileConstants.Name, this.assemblyName.Name); - if (!string.IsNullOrEmpty(this.assemblyPath)) - { - this.ItemNode.SetMetadata(ProjectFileConstants.AssemblyName, Path.GetFileName(this.assemblyPath)); - } - else - { - this.ItemNode.SetMetadata(ProjectFileConstants.AssemblyName, null); - } - - this.SetReferenceProperties(); - } - - /// - /// Disposes the node - /// - /// - protected override void Dispose(bool disposing) - { - if(this.isDisposed) - { - return; - } - - try - { - this.UnregisterFromFileChangeService(); - } - finally - { - base.Dispose(disposing); - this.isDisposed = true; - } - } - - private void CreateFromAssemblyName(AssemblyName name) - { - this.assemblyName = name; - - // Use MsBuild to resolve the assemblyname - this.ResolveAssemblyReference(); - - if(String.IsNullOrEmpty(this.assemblyPath) && (null != this.ItemNode.Item)) - { - // Try to get the assembly name from the hintpath. - this.GetPathNameFromProjectFile(); - if(this.assemblyPath == null) - { - // Try to get the assembly name from the path - this.assemblyName = System.Reflection.AssemblyName.GetAssemblyName(this.assemblyPath); - } - } - if(null == resolvedAssemblyName) - { - resolvedAssemblyName = assemblyName; - } - } - - /// - /// Checks if an assembly is already added. The method parses all references and compares the full assemblynames, or the location of the assemblies to decide whether two assemblies are the same. - /// - /// true if the assembly has already been added. - protected internal override bool IsAlreadyAdded(out ReferenceNode existingReference) - { - ReferenceContainerNode referencesFolder = this.ProjectMgr.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as ReferenceContainerNode; - Debug.Assert(referencesFolder != null, "Could not find the References node"); - bool shouldCheckPath = !string.IsNullOrEmpty(this.Url); - - for(HierarchyNode n = referencesFolder.FirstChild; n != null; n = n.NextSibling) - { - AssemblyReferenceNode assemblyReferenceNode = n as AssemblyReferenceNode; - if(null != assemblyReferenceNode) - { - // We will check if the full assemblynames are the same or if the Url of the assemblies is the same. - if(String.Compare(assemblyReferenceNode.AssemblyName.FullName, this.assemblyName.FullName, StringComparison.OrdinalIgnoreCase) == 0 || - (shouldCheckPath && NativeMethods.IsSamePath(assemblyReferenceNode.Url, this.Url))) - { - existingReference = assemblyReferenceNode; - return true; - } - } - } - - existingReference = null; - return false; - } - - /// - /// Determines if this is node a valid node for painting the default reference icon. - /// - /// - protected override bool CanShowDefaultIcon() - { - if(String.IsNullOrEmpty(this.assemblyPath) || !File.Exists(this.assemblyPath)) - { - return false; - } - - return true; - } - - private void GetPathNameFromProjectFile() - { - string result = this.ItemNode.GetMetadata(ProjectFileConstants.HintPath); - if(String.IsNullOrEmpty(result)) - { - result = this.ItemNode.GetMetadata(ProjectFileConstants.AssemblyName); - if(String.IsNullOrEmpty(result)) - { - this.assemblyPath = String.Empty; - } - else if(!result.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) - { - result += ".dll"; - this.assemblyPath = result; - } - } - else - { - this.assemblyPath = this.GetFullPathFromPath(result); - } - } - - private string GetFullPathFromPath(string path) - { - if(Path.IsPathRooted(path)) - { - return path; - } - else - { - Uri uri = new Uri(this.ProjectMgr.BaseURI.Uri, path); - - if(uri != null) - { - return Microsoft.VisualStudio.Shell.Url.Unescape(uri.LocalPath, true); - } - } - - return String.Empty; - } - - protected override void ResolveReference() - { - this.ResolveAssemblyReference(); - } - - private void SetHintPathAndPrivateValue() - { - // Private means local copy; we want to know if it is already set to not override the default - string privateValue = this.ItemNode.GetMetadata(ProjectFileConstants.Private); - - // Get the list of items which require HintPath - ICollection references = this.ProjectMgr.CurrentConfig.GetItems(MsBuildGeneratedItemType.ReferenceCopyLocalPaths); - - // Remove the HintPath, we will re-add it below if it is needed - if(!String.IsNullOrEmpty(this.assemblyPath)) - { - this.ItemNode.SetMetadata(ProjectFileConstants.HintPath, null); - } - - // Now loop through the generated References to find the corresponding one - foreach (ProjectItemInstance reference in references) - { - string fileName = Path.GetFileNameWithoutExtension(reference.EvaluatedInclude); - if(String.Compare(fileName, this.assemblyName.Name, StringComparison.OrdinalIgnoreCase) == 0) - { - // We found it, now set some properties based on this. - string hintPath = reference.GetMetadataValue(ProjectFileConstants.HintPath); - if (!string.IsNullOrEmpty(hintPath)) - { - if(Path.IsPathRooted(hintPath)) - { - hintPath = PackageUtilities.GetPathDistance(this.ProjectMgr.BaseURI.Uri, new Uri(hintPath)); - } - - this.ItemNode.SetMetadata(ProjectFileConstants.HintPath, hintPath); - - // If this is not already set, we default to true - if(String.IsNullOrEmpty(privateValue)) - { - this.ItemNode.SetMetadata(ProjectFileConstants.Private, true.ToString()); - } - } - break; - } - - } - } - - /// - /// This function ensures that some properties of the reference are set. - /// - private void SetReferenceProperties() - { - // Set a default HintPath for msbuild to be able to resolve the reference. - this.ItemNode.SetMetadata(ProjectFileConstants.HintPath, this.assemblyPath); - - // Resolve assembly referernces. This is needed to make sure that properties like the full path - // to the assembly or the hint path are set. - if(this.ProjectMgr.Build(MsBuildTarget.ResolveAssemblyReferences) != MSBuildResult.Successful) - { - return; - } - - // Check if we have to resolve again the path to the assembly. - if (!string.IsNullOrEmpty(this.assemblyPath)) - { - ResolveReference(); - SetHintPathAndPrivateValue(); - } - } - - /// - /// Does the actual job of resolving an assembly reference. We need a private method that does not violate - /// calling virtual method from the constructor. - /// - private void ResolveAssemblyReference() - { - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return; - } - - var group = this.ProjectMgr.CurrentConfig.GetItems(ProjectFileConstants.ReferencePath); - foreach (var item in group) - { - string fullPath = this.GetFullPathFromPath(item.EvaluatedInclude); - - System.Reflection.AssemblyName name = System.Reflection.AssemblyName.GetAssemblyName(fullPath); - - // Try with full assembly name and then with weak assembly name. - if (String.Equals(name.FullName, this.assemblyName.FullName, StringComparison.OrdinalIgnoreCase) || String.Equals(name.Name, this.assemblyName.Name, StringComparison.OrdinalIgnoreCase)) - { - if (!NativeMethods.IsSamePath(fullPath, this.assemblyPath)) - { - // set the full path now. - this.assemblyPath = fullPath; - - // We have a new item to listen too, since the assembly reference is resolved from a different place. - this.fileChangeListener.ObserveItem(this.assemblyPath); - } - - this.resolvedAssemblyName = name; - - // No hint path is needed since the assembly path will always be resolved. - return; - } - } - } - - /// - /// Registers with File change events - /// - private void InitializeFileChangeEvents() - { - this.fileChangeListener = new FileChangeManager(this.ProjectMgr.Site); - this.fileChangeListener.FileChangedOnDisk += this.OnAssemblyReferenceChangedOnDisk; - } - - /// - /// Unregisters this node from file change notifications. - /// - private void UnregisterFromFileChangeService() - { - this.fileChangeListener.FileChangedOnDisk -= this.OnAssemblyReferenceChangedOnDisk; - this.fileChangeListener.Dispose(); - } - - /// - /// Event callback. Called when one of the assembly file is changed. - /// - /// The FileChangeManager object. - /// Event args containing the file name that was updated. - private void OnAssemblyReferenceChangedOnDisk(object sender, FileChangedOnDiskEventArgs e) - { - Debug.Assert(e != null, "No event args specified for the FileChangedOnDisk event"); - - // We only care about file deletes, so check for one before enumerating references. - if((e.FileChangeFlag & _VSFILECHANGEFLAGS.VSFILECHG_Del) == 0) - { - return; - } - - - if(NativeMethods.IsSamePath(e.FileName, this.assemblyPath)) - { - this.OnInvalidateItems(this.Parent); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Attributes.cs b/source/Archive/MPF/12.0/Attributes.cs deleted file mode 100644 index 32eae15b58..0000000000 --- a/source/Archive/MPF/12.0/Attributes.cs +++ /dev/null @@ -1,116 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines a type converter. - /// - /// This is needed to get rid of the type TypeConverter type that could not give back the Type we were passing to him. - /// We do not want to use reflection to get the type back from the ConverterTypeName. Also the GetType methos does not spwan converters from other assemblies. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments"), AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field)] - public sealed class PropertyPageTypeConverterAttribute : Attribute - { - #region fields - Type converterType; - #endregion - - #region ctors - public PropertyPageTypeConverterAttribute(Type type) - { - this.converterType = type; - } - #endregion - - #region properties - public Type ConverterType - { - get - { - return this.converterType; - } - } - #endregion - } - - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)] - internal sealed class LocDisplayNameAttribute : DisplayNameAttribute - { - #region fields - string name; - #endregion - - #region ctors - public LocDisplayNameAttribute(string name) - { - this.name = name; - } - #endregion - - #region properties - public override string DisplayName - { - get - { - string result = SR.GetString(this.name, CultureInfo.CurrentUICulture); - if(result == null) - { - Debug.Assert(false, "String resource '" + this.name + "' is missing"); - result = this.name; - } - return result; - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/AutomationScope.cs b/source/Archive/MPF/12.0/Automation/AutomationScope.cs deleted file mode 100644 index 1c5e74fd0d..0000000000 --- a/source/Archive/MPF/12.0/Automation/AutomationScope.cs +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio.Shell.Interop; -using ErrorHandler = Microsoft.VisualStudio.ErrorHandler; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Helper class that handle the scope of an automation function. - /// It should be used inside a "using" directive to define the scope of the - /// automation function and make sure that the ExitAutomation method is called. - /// - internal class AutomationScope : IDisposable - { - private IVsExtensibility3 extensibility; - private bool inAutomation; - private static volatile object Mutex; - private bool isDisposed; - - /// - /// Initializes the class. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] - static AutomationScope() - { - Mutex = new object(); - } - - /// - /// Defines the beginning of the scope of an automation function. This constuctor - /// calls EnterAutomationFunction to signal the Shell that the current function is - /// changing the status of the automation objects. - /// - public AutomationScope(IServiceProvider provider) - { - if(null == provider) - { - throw new ArgumentNullException("provider"); - } - extensibility = provider.GetService(typeof(EnvDTE.IVsExtensibility)) as IVsExtensibility3; - if(null == extensibility) - { - throw new InvalidOperationException(); - } - ErrorHandler.ThrowOnFailure(extensibility.EnterAutomationFunction()); - inAutomation = true; - } - - /// - /// Ends the scope of the automation function. This function is also called by the - /// Dispose method. - /// - public void ExitAutomation() - { - if(inAutomation) - { - ErrorHandler.ThrowOnFailure(extensibility.ExitAutomationFunction()); - inAutomation = false; - } - } - - /// - /// Gets the IVsExtensibility3 interface used in the automation function. - /// - public IVsExtensibility3 Extensibility - { - get { return extensibility; } - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - #region IDisposable Members - private void Dispose(bool disposing) - { - if(!this.isDisposed) - { - lock(Mutex) - { - if(disposing) - { - ExitAutomation(); - } - - this.isDisposed = true; - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAFileItem.cs b/source/Archive/MPF/12.0/Automation/OAFileItem.cs deleted file mode 100644 index b1bd069b73..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAFileItem.cs +++ /dev/null @@ -1,428 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using EnvDTE; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; -using VSConstants = Microsoft.VisualStudio.VSConstants; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents an automation object for a file in a project - /// - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAFileItem : OAProjectItem - { - #region ctors - public OAFileItem(OAProject project, FileNode node) - : base(project, node) - { - } - - #endregion - - #region overridden methods - /// - /// Returns the dirty state of the document. - /// - /// Is thrown if the project is closed or it the service provider attached to the project is invalid. - /// Is thrown if the dirty state cannot be retrived. - public override bool IsDirty - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed || this.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - bool isDirty = false; - - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - DocumentManager manager = this.Node.GetDocumentManager(); - - if (manager == null) - { - throw new InvalidOperationException(); - } - - bool isOpen, isOpenedByUs; - uint docCookie; - IVsPersistDocData persistDocData; - manager.GetDocInfo(out isOpen, out isDirty, out isOpenedByUs, out docCookie, out persistDocData); - } - - return isDirty; - }); - } - - } - - /// - /// Gets the Document associated with the item, if one exists. - /// - public override EnvDTE.Document Document - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed || this.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - EnvDTE.Document document = null; - - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - IVsUIHierarchy hier; - uint itemid; - - IVsWindowFrame windowFrame; - - VsShellUtilities.IsDocumentOpen(this.Node.ProjectMgr.Site, this.Node.Url, VSConstants.LOGVIEWID_Any, out hier, out itemid, out windowFrame); - - if (windowFrame != null) - { - object var; - ErrorHandler.ThrowOnFailure(windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocCookie, out var)); - object documentAsObject; - ErrorHandler.ThrowOnFailure(scope.Extensibility.GetDocumentFromDocCookie((int)var, out documentAsObject)); - if (documentAsObject == null) - { - throw new InvalidOperationException(); - } - else - { - document = (Document)documentAsObject; - } - } - - } - - return document; - }); - } - } - - - /// - /// Opens the file item in the specified view. - /// - /// Specifies the view kind in which to open the item (file) - /// Window object - public override EnvDTE.Window Open(string viewKind) - { - return UIThread.DoOnUIThread(delegate() - { - if (this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed || this.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - IVsWindowFrame windowFrame = null; - IntPtr docData = IntPtr.Zero; - - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - try - { - // Validate input params - Guid logicalViewGuid = VSConstants.LOGVIEWID_Primary; - try - { - if (!(String.IsNullOrEmpty(viewKind))) - { - logicalViewGuid = new Guid(viewKind); - } - } - catch (FormatException) - { - // Not a valid guid - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidGuid, CultureInfo.CurrentUICulture), "viewKind"); - } - - uint itemid; - IVsHierarchy ivsHierarchy; - uint docCookie; - IVsRunningDocumentTable rdt = this.Node.ProjectMgr.Site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - Debug.Assert(rdt != null, " Could not get running document table from the services exposed by this project"); - if (rdt == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, this.Node.Url, out ivsHierarchy, out itemid, out docData, out docCookie)); - - // Open the file using the IVsProject3 interface - ErrorHandler.ThrowOnFailure(this.Node.ProjectMgr.OpenItem(this.Node.ID, ref logicalViewGuid, docData, out windowFrame)); - - } - finally - { - if (docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - } - - // Get the automation object and return it - return ((windowFrame != null) ? VsShellUtilities.GetWindowObject(windowFrame) : null); - }); - } - - /// - /// Saves the project item. - /// - /// The name with which to save the project or project item. - /// Is thrown if the save operation failes. - /// Is thrown if fileName is null. - public override void Save(string fileName) - { - this.DoSave(false, fileName); - } - - /// - /// Saves the project item. - /// - /// The file name with which to save the solution, project, or project item. If the file exists, it is overwritten - /// true if the rename was successful. False if Save as failes - public override bool SaveAs(string fileName) - { - try - { - this.DoSave(true, fileName); - } - catch(InvalidOperationException) - { - return false; - } - catch(COMException) - { - return false; - } - return true; - } - - /// - /// Gets a value indicating whether the project item is open in a particular view type. - /// - /// A Constants.vsViewKind* indicating the type of view to check./param> - /// A Boolean value indicating true if the project is open in the given view type; false if not. - public override bool get_IsOpen(string viewKind) - { - return UIThread.DoOnUIThread(delegate() - { - if (this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed || this.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - // Validate input params - Guid logicalViewGuid = VSConstants.LOGVIEWID_Primary; - try - { - if (!(String.IsNullOrEmpty(viewKind))) - { - logicalViewGuid = new Guid(viewKind); - } - } - catch (FormatException) - { - // Not a valid guid - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidGuid, CultureInfo.CurrentUICulture), "viewKind"); - } - - bool isOpen = false; - - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - IVsUIHierarchy hier; - uint itemid; - - IVsWindowFrame windowFrame; - - isOpen = VsShellUtilities.IsDocumentOpen(this.Node.ProjectMgr.Site, this.Node.Url, logicalViewGuid, out hier, out itemid, out windowFrame); - - } - - return isOpen; - }); - } - - /// - /// Gets the ProjectItems for the object. - /// - public override ProjectItems ProjectItems - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.Project.Project.CanFileNodesHaveChilds) - return new OAProjectItems(this.Project, this.Node); - else - return base.ProjectItems; - }); - } - } - - - #endregion - - #region helpers - /// - /// Saves or Save As the file - /// - /// Flag determining which Save method called , the SaveAs or the Save. - /// The name of the project file. - private void DoSave(bool isCalledFromSaveAs, string fileName) - { - UIThread.DoOnUIThread(delegate() - { - if (fileName == null) - { - throw new ArgumentNullException("fileName"); - } - - if (this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed || this.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - IntPtr docData = IntPtr.Zero; - - try - { - IVsRunningDocumentTable rdt = this.Node.ProjectMgr.Site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - Debug.Assert(rdt != null, " Could not get running document table from the services exposed by this project"); - if (rdt == null) - { - throw new InvalidOperationException(); - } - - // First we see if someone else has opened the requested view of the file. - uint itemid; - IVsHierarchy ivsHierarchy; - uint docCookie; - int canceled; - string url = this.Node.Url; - - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, url, out ivsHierarchy, out itemid, out docData, out docCookie)); - - // If an empty file name is passed in for Save then make the file name the project name. - if (!isCalledFromSaveAs && fileName.Length == 0) - { - ErrorHandler.ThrowOnFailure(this.Node.ProjectMgr.SaveItem(VSSAVEFLAGS.VSSAVE_SilentSave, url, this.Node.ID, docData, out canceled)); - } - else - { - Utilities.ValidateFileName(this.Node.ProjectMgr.Site, fileName); - - // Compute the fullpath from the directory of the existing Url. - string fullPath = fileName; - if (!Path.IsPathRooted(fileName)) - { - string directory = Path.GetDirectoryName(url); - fullPath = Path.Combine(directory, fileName); - } - - if (!isCalledFromSaveAs) - { - if (!NativeMethods.IsSamePath(this.Node.Url, fullPath)) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(this.Node.ProjectMgr.SaveItem(VSSAVEFLAGS.VSSAVE_SilentSave, fullPath, this.Node.ID, docData, out canceled)); - } - else - { - ErrorHandler.ThrowOnFailure(this.Node.ProjectMgr.SaveItem(VSSAVEFLAGS.VSSAVE_SilentSave, fullPath, this.Node.ID, docData, out canceled)); - } - } - - if (canceled == 1) - { - throw new InvalidOperationException(); - } - } - catch (COMException e) - { - throw new InvalidOperationException(e.Message); - } - finally - { - if (docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - } - }); - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAFolderItem.cs b/source/Archive/MPF/12.0/Automation/OAFolderItem.cs deleted file mode 100644 index 5239ab0956..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAFolderItem.cs +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using EnvDTE; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents an automation object for a folder in a project - /// - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAFolderItem : OAProjectItem - { - #region ctors - public OAFolderItem(OAProject project, FolderNode node) - : base(project, node) - { - } - - #endregion - - #region overridden methods - public override ProjectItems Collection - { - get - { - return UIThread.DoOnUIThread(delegate() - { - ProjectItems items = new OAProjectItems(this.Project, this.Node); - return items; - }); - } - } - - public override ProjectItems ProjectItems - { - get - { - return this.Collection; - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OANavigableProjectItems.cs b/source/Archive/MPF/12.0/Automation/OANavigableProjectItems.cs deleted file mode 100644 index 312d0283c8..0000000000 --- a/source/Archive/MPF/12.0/Automation/OANavigableProjectItems.cs +++ /dev/null @@ -1,317 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// This can navigate a collection object only (partial implementation of ProjectItems interface) - /// - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] - [ComVisible(true)] - public class OANavigableProjectItems : EnvDTE.ProjectItems - { - #region fields - private OAProject project; - private IList items; - private HierarchyNode nodeWithItems; - #endregion - - #region properties - /// - /// Defines an internal list of project items - /// - internal IList Items - { - get - { - return this.items; - } - } - - /// - /// Defines a relationship to the associated project. - /// - internal OAProject Project - { - get - { - return this.project; - } - } - - /// - /// Defines the node that contains the items - /// - internal HierarchyNode NodeWithItems - { - get - { - return this.nodeWithItems; - } - } - #endregion - - #region ctor - /// - /// Constructor. - /// - /// The associated project. - /// The node that defines the items. - public OANavigableProjectItems(OAProject project, HierarchyNode nodeWithItems) - { - this.project = project; - this.nodeWithItems = nodeWithItems; - this.items = this.GetListOfProjectItems(); - } - - /// - /// Constructor. - /// - /// The associated project. - /// A list of items that will make up the items defined by this object. - /// The node that defines the items. - public OANavigableProjectItems(OAProject project, IList items, HierarchyNode nodeWithItems) - { - this.items = items; - this.project = project; - this.nodeWithItems = nodeWithItems; - } - #endregion - - #region EnvDTE.ProjectItems - - /// - /// Gets a value indicating the number of objects in the collection. - /// - public virtual int Count - { - get - { - return items.Count; - } - } - - /// - /// Gets the immediate parent object of a ProjectItems collection. - /// - public virtual object Parent - { - get - { - return this.nodeWithItems.GetAutomationObject(); - } - } - - /// - /// Gets an enumeration indicating the type of object. - /// - public virtual string Kind - { - get - { - // TODO: Add OAProjectItems.Kind getter implementation - return null; - } - } - - /// - /// Gets the top-level extensibility object. - /// - public virtual EnvDTE.DTE DTE - { - get - { - return (EnvDTE.DTE)this.project.DTE; - } - } - - /// - /// Gets the project hosting the project item or items. - /// - public virtual EnvDTE.Project ContainingProject - { - get - { - return this.project; - } - } - - /// - /// Adds one or more ProjectItem objects from a directory to the ProjectItems collection. - /// - /// The directory from which to add the project item. - /// A ProjectItem object. - public virtual EnvDTE.ProjectItem AddFromDirectory(string directory) - { - throw new NotImplementedException(); - } - - /// - /// Creates a new project item from an existing item template file and adds it to the project. - /// - /// The full path and file name of the template project file. - /// The file name to use for the new project item. - /// A ProjectItem object. - public virtual EnvDTE.ProjectItem AddFromTemplate(string fileName, string name) - { - throw new NotImplementedException(); - } - - /// - /// Creates a new folder in Solution Explorer. - /// - /// The name of the folder node in Solution Explorer. - /// The type of folder to add. The available values are based on vsProjectItemsKindConstants and vsProjectItemKindConstants - /// A ProjectItem object. - public virtual EnvDTE.ProjectItem AddFolder(string name, string kind) - { - throw new NotImplementedException(); - } - - /// - /// Copies a source file and adds it to the project. - /// - /// The path and file name of the project item to be added. - /// A ProjectItem object. - public virtual EnvDTE.ProjectItem AddFromFileCopy(string filePath) - { - throw new NotImplementedException(); - } - - /// - /// Adds a project item from a file that is installed in a project directory structure. - /// - /// The file name of the item to add as a project item. - /// A ProjectItem object. - public virtual EnvDTE.ProjectItem AddFromFile(string fileName) - { - throw new NotImplementedException(); - } - - /// - /// Get Project Item from index - /// - /// Either index by number (1-based) or by name can be used to get the item - /// Project Item. null is return if invalid index is specified - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] - public virtual EnvDTE.ProjectItem Item(object index) - { - if(index is int) - { - int realIndex = (int)index - 1; - if(realIndex >= 0 && realIndex < this.items.Count) - { - return (EnvDTE.ProjectItem)items[realIndex]; - } - return null; - } - else if(index is string) - { - string name = (string)index; - foreach(EnvDTE.ProjectItem item in items) - { - if(String.Compare(item.Name, name, StringComparison.OrdinalIgnoreCase) == 0) - { - return item; - } - } - } - return null; - } - - /// - /// Returns an enumeration for items in a collection. - /// - /// An IEnumerator for this object. - public virtual IEnumerator GetEnumerator() - { - if(this.items == null) - { - yield return null; - } - - int count = items.Count; - for(int i = 0; i < count; i++) - { - yield return items[i]; - } - } - - #endregion - - #region virtual methods - /// - /// Retrives a list of items associated with the current node. - /// - /// A List of project items - protected IList GetListOfProjectItems() - { - return UIThread.DoOnUIThread(delegate() - { - List list = new List(); - for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) - { - EnvDTE.ProjectItem item = child.GetAutomationObject() as EnvDTE.ProjectItem; - if (null != item) - { - list.Add(item); - } - } - - return list; - }); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OANestedProjectItem.cs b/source/Archive/MPF/12.0/Automation/OANestedProjectItem.cs deleted file mode 100644 index 81d6310103..0000000000 --- a/source/Archive/MPF/12.0/Automation/OANestedProjectItem.cs +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OANestedProjectItem : OAProjectItem - { - #region fields - EnvDTE.Project nestedProject; - #endregion - - #region ctors - public OANestedProjectItem(OAProject project, NestedProjectNode node) - : base(project, node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - object nestedproject; - if(ErrorHandler.Succeeded(node.NestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out nestedproject))) - { - this.nestedProject = nestedproject as EnvDTE.Project; - } - } - - #endregion - - #region overridden methods - /// - /// Returns the collection of project items defined in the nested project - /// - public override EnvDTE.ProjectItems ProjectItems - { - get - { - if(this.nestedProject != null) - { - return this.nestedProject.ProjectItems; - } - return null; - } - } - - /// - /// Returns the nested project. - /// - public override EnvDTE.Project SubProject - { - get - { - return this.nestedProject; - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OANullProperty.cs b/source/Archive/MPF/12.0/Automation/OANullProperty.cs deleted file mode 100644 index eeec3952b9..0000000000 --- a/source/Archive/MPF/12.0/Automation/OANullProperty.cs +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// This object defines a so called null object that is returned as instead of null. This is because callers in VSCore usually crash if a null propery is returned for them. - /// - - public class OANullProperty : EnvDTE.Property - { - #region fields - private OAProperties parent; - #endregion - - #region ctors - - public OANullProperty(OAProperties parent) - { - this.parent = parent; - } - #endregion - - #region EnvDTE.Property - - public object Application - { - get { return String.Empty; } - } - - public EnvDTE.Properties Collection - { - get - { - //todo: EnvDTE.Property.Collection - return this.parent; - } - } - - public EnvDTE.DTE DTE - { - get { return null; } - } - - public object get_IndexedValue(object index1, object index2, object index3, object index4) - { - return String.Empty; - } - - public void let_Value(object value) - { - //todo: let_Value - } - - public string Name - { - get { return String.Empty; } - } - - public short NumIndices - { - get { return 0; } - } - - public object Object - { - get { return this.parent.Target; } - set - { - } - } - - public EnvDTE.Properties Parent - { - get { return this.parent; } - } - - public void set_IndexedValue(object index1, object index2, object index3, object index4, object value) - { - - } - - public object Value - { - get { return String.Empty; } - set { } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAProject.cs b/source/Archive/MPF/12.0/Automation/OAProject.cs deleted file mode 100644 index 6595265794..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAProject.cs +++ /dev/null @@ -1,531 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using EnvDTE; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [ComVisible(true)] - public class OAProject : EnvDTE.Project, EnvDTE.ISupportVSProperties - { - #region fields - private ProjectNode project; - EnvDTE.ConfigurationManager configurationManager; - #endregion - - #region properties - public ProjectNode Project - { - get { return this.project; } - } - #endregion - - #region ctor - public OAProject(ProjectNode project) - { - this.project = project; - } - #endregion - - #region EnvDTE.Project - /// - /// Gets or sets the name of the object. - /// - public virtual string Name - { - get - { - return project.Caption; - } - set - { - if(this.project == null || this.project.Site == null || this.project.IsClosed) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.project.Site)) - { - project.SetEditLabel(value); - } - }); - } - } - - /// - /// Microsoft Internal Use Only. Gets the file name of the project. - /// - public virtual string FileName - { - get - { - return project.ProjectFile; - } - } - - /// - /// Microsoft Internal Use Only. Specfies if the project is dirty. - /// - public virtual bool IsDirty - { - get - { - int dirty; - - ErrorHandler.ThrowOnFailure(project.IsDirty(out dirty)); - return dirty != 0; - } - set - { - if(this.project == null || this.project.Site == null || this.project.IsClosed) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.project.Site)) - { - project.SetProjectFileDirty(value); - } - }); - } - } - - /// - /// Gets the Projects collection containing the Project object supporting this property. - /// - public virtual EnvDTE.Projects Collection - { - get { return null; } - } - - /// - /// Gets the top-level extensibility object. - /// - public virtual EnvDTE.DTE DTE - { - get - { - return (EnvDTE.DTE)this.project.Site.GetService(typeof(EnvDTE.DTE)); - } - } - - /// - /// Gets a GUID string indicating the kind or type of the object. - /// - public virtual string Kind - { - get { return project.ProjectGuid.ToString("B"); } - } - - /// - /// Gets a ProjectItems collection for the Project object. - /// - public virtual EnvDTE.ProjectItems ProjectItems - { - get - { - return new OAProjectItems(this, project); - } - } - - /// - /// Gets a collection of all properties that pertain to the Project object. - /// - public virtual EnvDTE.Properties Properties - { - get - { - return new OAProperties(this.project.NodeProperties); - } - } - - /// - /// Returns the name of project as a relative path from the directory containing the solution file to the project file - /// - /// Unique name if project is in a valid state. Otherwise null - public virtual string UniqueName - { - get - { - if(this.project == null || this.project.IsClosed) - { - return null; - } - else - { - return UIThread.DoOnUIThread(delegate() - { - // Get Solution service - IVsSolution solution = this.project.GetService(typeof(IVsSolution)) as IVsSolution; - if (solution == null) - { - throw new InvalidOperationException(); - } - - // Ask solution for unique name of project - string uniqueName = string.Empty; - ErrorHandler.ThrowOnFailure(solution.GetUniqueNameOfProject(this.project.InteropSafeIVsHierarchy, out uniqueName)); - return uniqueName; - }); - } - } - } - - /// - /// Gets an interface or object that can be accessed by name at run time. - /// - public virtual object Object - { - get { return this.project.Object; } - } - - /// - /// Gets the requested Extender object if it is available for this object. - /// - /// The name of the extender object. - /// An Extender object. - public virtual object get_Extender(string name) - { - return null; - } - - /// - /// Gets a list of available Extenders for the object. - /// - public virtual object ExtenderNames - { - get { return null; } - } - - /// - /// Gets the Extender category ID (CATID) for the object. - /// - public virtual string ExtenderCATID - { - get { return String.Empty; } - } - - /// - /// Gets the full path and name of the Project object's file. - /// - public virtual string FullName - { - get - { - return UIThread.DoOnUIThread(delegate() - { - string filename; - uint format; - ErrorHandler.ThrowOnFailure(project.GetCurFile(out filename, out format)); - return filename; - }); - } - } - - /// - /// Gets or sets a value indicatingwhether the object has not been modified since last being saved or opened. - /// - public virtual bool Saved - { - get - { - return !this.IsDirty; - } - set - { - if(this.project == null || this.project.Site == null || this.project.IsClosed) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.project.Site)) - { - project.SetProjectFileDirty(!value); - } - }); - } - } - - /// - /// Gets the ConfigurationManager object for this Project . - /// - public virtual EnvDTE.ConfigurationManager ConfigurationManager - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.configurationManager == null) - { - IVsExtensibility3 extensibility = this.project.Site.GetService(typeof(IVsExtensibility)) as IVsExtensibility3; - - if (extensibility == null) - { - throw new InvalidOperationException(); - } - - object configurationManagerAsObject; - ErrorHandler.ThrowOnFailure(extensibility.GetConfigMgr(this.project.InteropSafeIVsHierarchy, VSConstants.VSITEMID_ROOT, out configurationManagerAsObject)); - - if (configurationManagerAsObject == null) - { - throw new InvalidOperationException(); - } - else - { - this.configurationManager = (ConfigurationManager)configurationManagerAsObject; - } - } - - return this.configurationManager; - }); - } - } - - /// - /// Gets the Globals object containing add-in values that may be saved in the solution (.sln) file, the project file, or in the user's profile data. - /// - public virtual EnvDTE.Globals Globals - { - get { return null; } - } - - /// - /// Gets a ProjectItem object for the nested project in the host project. - /// - public virtual EnvDTE.ProjectItem ParentProjectItem - { - get { return null; } - } - - /// - /// Gets the CodeModel object for the project. - /// - public virtual EnvDTE.CodeModel CodeModel - { - get { return null; } - } - - /// - /// Saves the project. - /// - /// The file name with which to save the solution, project, or project item. If the file exists, it is overwritten - /// Is thrown if the save operation failes. - /// Is thrown if fileName is null. - public virtual void SaveAs(string fileName) - { - this.DoSave(true, fileName); - } - - /// - /// Saves the project - /// - /// The file name of the project - /// Is thrown if the save operation failes. - /// Is thrown if fileName is null. - public virtual void Save(string fileName) - { - this.DoSave(false, fileName); - } - - /// - /// Removes the project from the current solution. - /// - public virtual void Delete() - { - if(this.project == null || this.project.Site == null || this.project.IsClosed) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.project.Site)) - { - this.project.Remove(false); - } - }); - } - #endregion - - #region ISupportVSProperties methods - /// - /// Microsoft Internal Use Only. - /// - public virtual void NotifyPropertiesDelete() - { - } - #endregion - - #region private methods - /// - /// Saves or Save Asthe project. - /// - /// Flag determining which Save method called , the SaveAs or the Save. - /// The name of the project file. - private void DoSave(bool isCalledFromSaveAs, string fileName) - { - if(fileName == null) - { - throw new ArgumentNullException("fileName"); - } - - if(this.project == null || this.project.Site == null || this.project.IsClosed) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.project.Site)) - { - // If an empty file name is passed in for Save then make the file name the project name. - if (!isCalledFromSaveAs && string.IsNullOrEmpty(fileName)) - { - // Use the solution service to save the project file. Note that we have to use the service - // so that all the shell's elements are aware that we are inside a save operation and - // all the file change listenters registered by the shell are suspended. - - // Get the cookie of the project file from the RTD. - IVsRunningDocumentTable rdt = this.project.Site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - if (null == rdt) - { - throw new InvalidOperationException(); - } - - IVsHierarchy hier; - uint itemid; - IntPtr unkData; - uint cookie; - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, this.project.Url, out hier, - out itemid, out unkData, out cookie)); - if (IntPtr.Zero != unkData) - { - Marshal.Release(unkData); - } - - // Verify that we have a cookie. - if (0 == cookie) - { - // This should never happen because if the project is open, then it must be in the RDT. - throw new InvalidOperationException(); - } - - // Get the IVsHierarchy for the project. - IVsHierarchy prjHierarchy = project.InteropSafeIVsHierarchy; - - // Now get the solution. - IVsSolution solution = this.project.Site.GetService(typeof(SVsSolution)) as IVsSolution; - // Verify that we have both solution and hierarchy. - if ((null == prjHierarchy) || (null == solution)) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(solution.SaveSolutionElement((uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_SaveIfDirty, prjHierarchy, cookie)); - } - else - { - - // We need to make some checks before we can call the save method on the project node. - // This is mainly because it is now us and not the caller like in case of SaveAs or Save that should validate the file name. - // The IPersistFileFormat.Save method only does a validation that is necesseray to be performed. Example: in case of Save As the - // file name itself is not validated only the whole path. (thus a file name like file\file is accepted, since as a path is valid) - - // 1. The file name has to be valid. - string fullPath = fileName; - try - { - if (!Path.IsPathRooted(fileName)) - { - fullPath = Path.Combine(this.project.ProjectFolder, fileName); - } - } - // We want to be consistent in the error message and exception we throw. fileName could be for example #�&%"�&"% and that would trigger an ArgumentException on Path.IsRooted. - catch (ArgumentException) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture)); - } - - // It might be redundant but we validate the file and the full path of the file being valid. The SaveAs would also validate the path. - // If we decide that this is performance critical then this should be refactored. - Utilities.ValidateFileName(this.project.Site, fullPath); - - if (!isCalledFromSaveAs) - { - // 2. The file name has to be the same - if (!NativeMethods.IsSamePath(fullPath, this.project.Url)) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(this.project.Save(fullPath, 1, 0)); - } - else - { - ErrorHandler.ThrowOnFailure(this.project.Save(fullPath, 0, 0)); - } - } - } - }); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAProjectItem.cs b/source/Archive/MPF/12.0/Automation/OAProjectItem.cs deleted file mode 100644 index 86738e842d..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAProjectItem.cs +++ /dev/null @@ -1,481 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [ComVisible(true)] - public class OAProjectItem : EnvDTE.ProjectItem - where T : HierarchyNode - { - - #region fields - private T node; - private OAProject project; - #endregion - - #region properties - protected T Node - { - get - { - return this.node; - } - } - - /// - /// Returns the automation project - /// - protected OAProject Project - { - get - { - return this.project; - } - } - #endregion - - #region ctors - public OAProjectItem(OAProject project, T node) - { - this.node = node; - this.project = project; - } - #endregion - - #region EnvDTE.ProjectItem - - /// - /// Gets the requested Extender if it is available for this object - /// - /// The name of the extender. - /// The extender object. - public virtual object get_Extender(string extenderName) - { - return null; - } - - /// - /// Gets an object that can be accessed by name at run time. - /// - public virtual object Object - { - get - { - return this.node.Object; - } - } - - /// - /// Gets the Document associated with the item, if one exists. - /// - public virtual EnvDTE.Document Document - { - get - { - return null; - } - } - - /// - /// Gets the number of files associated with a ProjectItem. - /// - public virtual short FileCount - { - get - { - return (short)1; - } - } - - /// - /// Gets a collection of all properties that pertain to the object. - /// - public virtual EnvDTE.Properties Properties - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.node.NodeProperties == null) - { - return null; - } - return new OAProperties(this.node.NodeProperties); - }); - } - } - - - /// - /// Gets the FileCodeModel object for the project item. - /// - public virtual EnvDTE.FileCodeModel FileCodeModel - { - get - { - return null; - } - } - - /// - /// Gets a ProjectItems for the object. - /// - public virtual EnvDTE.ProjectItems ProjectItems - { - get - { - return null; - } - } - - /// - /// Gets a GUID string indicating the kind or type of the object. - /// - public virtual string Kind - { - get - { - Guid guid; - ErrorHandler.ThrowOnFailure(this.node.GetGuidProperty((int)__VSHPROPID.VSHPROPID_TypeGuid, out guid)); - return guid.ToString("B"); - } - } - - /// - /// Saves the project item. - /// - /// The name with which to save the project or project item. - /// Implemented by subclasses. - public virtual void Save(string fileName) - { - throw new NotImplementedException(); - } - - /// - /// Gets the top-level extensibility object. - /// - public virtual EnvDTE.DTE DTE - { - get - { - return (EnvDTE.DTE)this.project.DTE; - } - } - - /// - /// Gets the ProjectItems collection containing the ProjectItem object supporting this property. - /// - public virtual EnvDTE.ProjectItems Collection - { - get - { - return UIThread.DoOnUIThread(delegate() - { - // Get the parent node - HierarchyNode parentNode = this.node.Parent; - Debug.Assert(parentNode != null, "Failed to get the parent node"); - - // Get the ProjectItems object for the parent node - if (parentNode is ProjectNode) - { - // The root node for the project - return ((OAProject)parentNode.GetAutomationObject()).ProjectItems; - } - else if (parentNode is FileNode && parentNode.FirstChild != null) - { - // The item has children - return ((OAProjectItem)parentNode.GetAutomationObject()).ProjectItems; - } - else if (parentNode is FolderNode) - { - return ((OAProjectItem)parentNode.GetAutomationObject()).ProjectItems; - } - else - { - // Not supported. Override this method in derived classes to return appropriate collection object - throw new NotImplementedException(); - } - }); - } - } - /// - /// Gets a list of available Extenders for the object. - /// - public virtual object ExtenderNames - { - get - { - return null; - } - } - - /// - /// Gets the ConfigurationManager object for this ProjectItem. - /// - /// We do not support config management based per item. - public virtual EnvDTE.ConfigurationManager ConfigurationManager - { - get - { - return null; - } - } - - /// - /// Gets the project hosting the ProjectItem. - /// - public virtual EnvDTE.Project ContainingProject - { - get - { - return this.project; - } - } - - /// - /// Gets or sets a value indicating whether or not the object has been modified since last being saved or opened. - /// - public virtual bool Saved - { - get - { - return !this.IsDirty; - - } - set - { - throw new NotImplementedException(); - } - } - - /// - /// Gets the Extender category ID (CATID) for the object. - /// - public virtual string ExtenderCATID - { - get - { - return null; - } - } - - /// - /// If the project item is the root of a subproject, then the SubProject property returns the Project object for the subproject. - /// - public virtual EnvDTE.Project SubProject - { - get - { - return null; - } - } - - /// - /// Microsoft Internal Use Only. Checks if the document associated to this item is dirty. - /// - public virtual bool IsDirty - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - /// - /// Gets or sets the name of the object. - /// - public virtual string Name - { - get - { - return this.node.Caption; - } - set - { - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed || this.node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - this.node.SetEditLabel(value); - } - }); - } - } - /// - /// Removes the project item from hierarchy. - /// - public virtual void Remove() - { - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed || this.node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - this.node.Remove(false); - } - }); - } - - /// - /// Removes the item from its project and its storage. - /// - public virtual void Delete() - { - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed || this.node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - this.node.Remove(true); - } - }); - } - - /// - /// Saves the project item. - /// - /// The file name with which to save the solution, project, or project item. If the file exists, it is overwritten. - /// true if save was successful - /// This method is implemented on subclasses. - public virtual bool SaveAs(string newFileName) - { - throw new NotImplementedException(); - } - - /// - /// Gets a value indicating whether the project item is open in a particular view type. - /// - /// A Constants.vsViewKind* indicating the type of view to check./param> - /// A Boolean value indicating true if the project is open in the given view type; false if not. - public virtual bool get_IsOpen(string viewKind) - { - throw new NotImplementedException(); - } - - /// - /// Gets the full path and names of the files associated with a project item. - /// - /// The index of the item - /// The full path of the associated item - /// Is thrown if index is not one - public virtual string get_FileNames(short index) - { - // This method should really only be called with 1 as the parameter, but - // there used to be a bug in VB/C# that would work with 0. To avoid breaking - // existing automation they are still accepting 0. To be compatible with them - // we accept it as well. - Debug.Assert(index > 0, "Index is 1 based."); - if(index < 0) - { - throw new ArgumentOutOfRangeException("index"); - } - return this.node.Url; - } - - /// - /// Expands the view of Solution Explorer to show project items. - /// - public virtual void ExpandView() - { - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed || this.node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - - UIThread.DoOnUIThread(delegate() - { - using (AutomationScope scope = new AutomationScope(this.Node.ProjectMgr.Site)) - { - IVsUIHierarchyWindow uiHierarchy = UIHierarchyUtilities.GetUIHierarchyWindow(this.node.ProjectMgr.Site, HierarchyNode.SolutionExplorer); - if (uiHierarchy == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(uiHierarchy.ExpandItem(this.node.ProjectMgr.InteropSafeIVsUIHierarchy, this.node.ID, EXPANDFLAGS.EXPF_ExpandFolder)); - - } - }); - } - - /// - /// Opens the project item in the specified view. Not implemented because this abstract class dont know what to open - /// - /// Specifies the view kind in which to open the item - /// Window object - public virtual EnvDTE.Window Open(string ViewKind) - { - throw new NotImplementedException(); - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAProjectItems.cs b/source/Archive/MPF/12.0/Automation/OAProjectItems.cs deleted file mode 100644 index 5296f09cca..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAProjectItems.cs +++ /dev/null @@ -1,323 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using EnvDTE; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Contains ProjectItem objects - /// - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] - [ComVisible(true)] - public class OAProjectItems : OANavigableProjectItems - { - #region ctor - public OAProjectItems(OAProject project, HierarchyNode nodeWithItems) - : base(project, nodeWithItems) - { - } - #endregion - - #region EnvDTE.ProjectItems - /// - /// Creates a new project item from an existing item template file and adds it to the project. - /// - /// The full path and file name of the template project file. - /// The file name to use for the new project item. - /// A ProjectItem object. - public override EnvDTE.ProjectItem AddFromTemplate(string fileName, string name) - { - - if(this.Project == null || this.Project.Project == null || this.Project.Project.Site == null || this.Project.Project.IsClosed) - { - throw new InvalidOperationException(); - } - - return UIThread.DoOnUIThread(delegate() - { - ProjectNode proj = this.Project.Project; - EnvDTE.ProjectItem itemAdded = null; - - using (AutomationScope scope = new AutomationScope(this.Project.Project.Site)) - { - string fixedFileName = fileName; - - if (!File.Exists(fileName)) - { - string tempFileName = GetTemplateNoZip(fileName); - if (File.Exists(tempFileName)) - { - fixedFileName = tempFileName; - } - } - - // Determine the operation based on the extension of the filename. - // We should run the wizard only if the extension is vstemplate - // otherwise it's a clone operation - VSADDITEMOPERATION op; - - if(Utilities.IsTemplateFile(fixedFileName)) - { - op = VSADDITEMOPERATION.VSADDITEMOP_RUNWIZARD; - } - else - { - op = VSADDITEMOPERATION.VSADDITEMOP_CLONEFILE; - } - - VSADDRESULT[] result = new VSADDRESULT[1]; - - // It is not a very good idea to throw since the AddItem might return Cancel or Abort. - // The problem is that up in the call stack the wizard code does not check whether it has received a ProjectItem or not and will crash. - // The other problem is that we cannot get add wizard dialog back if a cancel or abort was returned because we throw and that code will never be executed. Typical catch 22. - ErrorHandler.ThrowOnFailure(proj.AddItem(this.NodeWithItems.ID, op, name, 0, new string[1] { fixedFileName }, IntPtr.Zero, result)); - - string fileDirectory = proj.GetBaseDirectoryForAddingFiles(this.NodeWithItems); - string templateFilePath = System.IO.Path.Combine(fileDirectory, name); - itemAdded = this.EvaluateAddResult(result[0], templateFilePath); - } - - return itemAdded; - }); - } - - /// - /// Adds a folder to the collection of ProjectItems with the given name. - /// - /// The kind must be null, empty string, or the string value of vsProjectItemKindPhysicalFolder. - /// Virtual folders are not supported by this implementation. - /// - /// The name of the new folder to add - /// A string representing a Guid of the folder kind. - /// A ProjectItem representing the newly added folder. - public override ProjectItem AddFolder(string name, string kind) - { - if(this.Project == null || this.Project.Project == null || this.Project.Project.Site == null || this.Project.Project.IsClosed) - { - throw new InvalidOperationException(); - } - - return UIThread.DoOnUIThread(delegate() - { - //Verify name is not null or empty - Utilities.ValidateFileName(this.Project.Project.Site, name); - - //Verify that kind is null, empty, or a physical folder - if (!(string.IsNullOrEmpty(kind) || kind.Equals(EnvDTE.Constants.vsProjectItemKindPhysicalFolder))) - { - throw new ArgumentException("Parameter specification for AddFolder was not meet", "kind"); - } - - for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) - { - if (child.Caption.Equals(name, StringComparison.OrdinalIgnoreCase)) - { - throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, "Folder already exists with the name '{0}'", name)); - } - } - - ProjectNode proj = this.Project.Project; - - HierarchyNode newFolder = null; - using (AutomationScope scope = new AutomationScope(this.Project.Project.Site)) - { - - //In the case that we are adding a folder to a folder, we need to build up - //the path to the project node. - name = Path.Combine(this.NodeWithItems.VirtualNodeName, name); - - newFolder = proj.CreateFolderNodes(name); - } - - return newFolder.GetAutomationObject() as ProjectItem; - }); - } - - /// - /// Copies a source file and adds it to the project. - /// - /// The path and file name of the project item to be added. - /// A ProjectItem object. - public override EnvDTE.ProjectItem AddFromFileCopy(string filePath) - { - return this.AddItem(filePath, VSADDITEMOPERATION.VSADDITEMOP_CLONEFILE); - } - - /// - /// Adds a project item from a file that is installed in a project directory structure. - /// - /// The file name of the item to add as a project item. - /// A ProjectItem object. - public override EnvDTE.ProjectItem AddFromFile(string fileName) - { - // TODO: VSADDITEMOP_LINKTOFILE - return this.AddItem(fileName, VSADDITEMOPERATION.VSADDITEMOP_OPENFILE); - } - - #endregion - - #region helper methods - /// - /// Adds an item to the project. - /// - /// The full path of the item to add. - /// The to use when adding the item. - /// A ProjectItem object. - protected virtual EnvDTE.ProjectItem AddItem(string path, VSADDITEMOPERATION op) - { - if(this.Project == null || this.Project.Project == null || this.Project.Project.Site == null || this.Project.Project.IsClosed) - { - throw new InvalidOperationException(); - } - - return UIThread.DoOnUIThread(delegate() - { - ProjectNode proj = this.Project.Project; - - EnvDTE.ProjectItem itemAdded = null; - using (AutomationScope scope = new AutomationScope(this.Project.Project.Site)) - { - VSADDRESULT[] result = new VSADDRESULT[1]; - ErrorHandler.ThrowOnFailure(proj.AddItem(this.NodeWithItems.ID, op, path, 0, new string[1] { path }, IntPtr.Zero, result)); - - string fileName = System.IO.Path.GetFileName(path); - string fileDirectory = proj.GetBaseDirectoryForAddingFiles(this.NodeWithItems); - string filePathInProject = System.IO.Path.Combine(fileDirectory, fileName); - - itemAdded = this.EvaluateAddResult(result[0], filePathInProject); - } - - return itemAdded; - }); - } - - /// - /// Evaluates the result of an add operation. - /// - /// The returned by the Add methods - /// The full path of the item added. - /// A ProjectItem object. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] - protected virtual EnvDTE.ProjectItem EvaluateAddResult(VSADDRESULT result, string path) - { - return UIThread.DoOnUIThread(delegate() - { - if (result == VSADDRESULT.ADDRESULT_Success) - { - HierarchyNode nodeAdded = this.NodeWithItems.FindChild(path); - Debug.Assert(nodeAdded != null, "We should have been able to find the new element in the hierarchy"); - if (nodeAdded != null) - { - EnvDTE.ProjectItem item = null; - if (nodeAdded is FileNode) - { - item = new OAFileItem(this.Project, nodeAdded as FileNode); - } - else if (nodeAdded is NestedProjectNode) - { - item = new OANestedProjectItem(this.Project, nodeAdded as NestedProjectNode); - } - else - { - item = new OAProjectItem(this.Project, nodeAdded); - } - - this.Items.Add(item); - return item; - } - } - return null; - }); - } - - /// - /// Removes .zip extensions from the components of a path. - /// - private static string GetTemplateNoZip(string fileName) - { - char[] separators = { '\\' }; - string[] components = fileName.Split(separators); - - for (int i = 0; i < components.Length; i++) - { - string component = components[i]; - - if (Path.GetExtension(component).Equals(".zip", StringComparison.InvariantCultureIgnoreCase)) - { - component = Path.GetFileNameWithoutExtension(component); - components[i] = component; - } - } - - // if first element is a drive, we need to combine the first and second. - // Path.Combine does not add a directory separator between the drive and the - // first directory. - if (components.Length > 1) - { - if (Path.IsPathRooted(components[0])) - { - components[0] = string.Format("{0}{1}{2}", components[0], Path.DirectorySeparatorChar, components[1]); - components[1] = string.Empty; // Path.Combine drops empty strings. - } - } - - return Path.Combine(components); - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAProperties.cs b/source/Archive/MPF/12.0/Automation/OAProperties.cs deleted file mode 100644 index ef7f232e73..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAProperties.cs +++ /dev/null @@ -1,324 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Reflection; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Contains all of the properties of a given object that are contained in a generic collection of properties. - /// - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] - - public class OAProperties : EnvDTE.Properties - { - #region fields - private NodeProperties target; - private Dictionary properties = new Dictionary(); - #endregion - - #region properties - /// - /// Defines the NodeProperties object that contains the defines the properties. - /// - public NodeProperties Target - { - get - { - return this.target; - } - } - - /// - /// The hierarchy node for the object which properties this item represent - /// - public HierarchyNode Node - { - get - { - return this.Target.Node; - } - } - - /// - /// Defines a dictionary of the properties contained. - /// - public Dictionary Properties - { - get - { - return this.properties; - } - } - #endregion - - #region ctor - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] - public OAProperties(NodeProperties target) - { - System.Diagnostics.Debug.Assert(target != null); - - if (target == null) - { - throw new ArgumentNullException("target"); - } - - this.target = target; - this.AddPropertiesFromType(target.GetType()); - } - #endregion - - #region EnvDTE.Properties - /// - /// Microsoft Internal Use Only. - /// - public virtual object Application - { - get { return null; } - } - - /// - /// Gets a value indicating the number of objects in the collection. - /// - public int Count - { - get { return properties.Count; } - } - - /// - /// Gets the top-level extensibility object. - /// - public virtual EnvDTE.DTE DTE - { - get - { - return UIThread.DoOnUIThread(delegate() - { - if (this.target == null || this.target.Node == null || this.target.Node.ProjectMgr == null || this.target.Node.ProjectMgr.IsClosed || - this.target.Node.ProjectMgr.Site == null) - { - throw new InvalidOperationException(); - } - return this.target.Node.ProjectMgr.Site.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; - }); - } - } - - /// - /// Gets an enumeration for items in a collection. - /// - /// An enumerator. - public IEnumerator GetEnumerator() - { - if(this.properties == null) - { - yield return null; - } - - if(this.properties.Count == 0) - { - yield return new OANullProperty(this); - } - - IEnumerator enumerator = this.properties.Values.GetEnumerator(); - - while(enumerator.MoveNext()) - { - yield return enumerator.Current; - } - } - - /// - /// Returns an indexed member of a Properties collection. - /// - /// The index at which to return a mamber. - /// A Property object. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] - public virtual EnvDTE.Property Item(object index) - { - if(index is string) - { - string indexAsString = (string)index; - if(this.properties.ContainsKey(indexAsString)) - { - return (EnvDTE.Property)this.properties[indexAsString]; - } - } - else if(index is int) - { - int realIndex = (int)index - 1; - if(realIndex >= 0 && realIndex < this.properties.Count) - { - IEnumerator enumerator = this.properties.Values.GetEnumerator(); - - int i = 0; - while(enumerator.MoveNext()) - { - if(i++ == realIndex) - { - return (EnvDTE.Property)enumerator.Current; - } - } - } - } - - return new OANullProperty(null); - } - /// - /// Gets the immediate parent object of a Properties collection. - /// - public virtual object Parent - { - get { return null; } - } - #endregion - - #region methods - /// - /// Add properties to the collection of properties filtering only those properties which are com-visible and AutomationBrowsable - /// - /// The type of NodeProperties the we should filter on - protected void AddPropertiesFromType(Type targetType) - { - Debug.Assert(targetType != null); - - if (targetType == null) - { - throw new ArgumentNullException("targetType"); - } - - // If the type is not COM visible, we do not expose any of the properties - if(!IsComVisible(targetType)) - return; - - // Add all properties being ComVisible and AutomationVisible - PropertyInfo[] propertyInfos = targetType.GetProperties(); - foreach(PropertyInfo propertyInfo in propertyInfos) - { - if(!IsInMap(propertyInfo) && IsComVisible(propertyInfo) && IsAutomationVisible(propertyInfo)) - { - AddProperty(propertyInfo); - } - } - } - #endregion - - #region virtual methods - /// - /// Creates a new OAProperty object and adds it to the current list of properties - /// - /// The property to be associated with an OAProperty object - protected virtual void AddProperty(PropertyInfo propertyInfo) - { - if (propertyInfo == null) - { - throw new ArgumentNullException("propertyInfo"); - } - - this.properties.Add(propertyInfo.Name, new OAProperty(this, propertyInfo)); - } - #endregion - - #region helper methods - - private bool IsInMap(PropertyInfo propertyInfo) - { - return this.properties.ContainsKey(propertyInfo.Name); - } - - private static bool IsAutomationVisible(PropertyInfo propertyInfo) - { - object[] customAttributesOnProperty = propertyInfo.GetCustomAttributes(typeof(AutomationBrowsableAttribute), true); - - foreach(AutomationBrowsableAttribute attr in customAttributesOnProperty) - { - if(!attr.Browsable) - { - return false; - } - } - return true; - } - - private static bool IsComVisible(Type targetType) - { - object[] customAttributesOnProperty = targetType.GetCustomAttributes(typeof(ComVisibleAttribute), true); - - foreach(ComVisibleAttribute attr in customAttributesOnProperty) - { - if(!attr.Value) - { - return false; - } - } - return true; - } - - private static bool IsComVisible(PropertyInfo propertyInfo) - { - object[] customAttributesOnProperty = propertyInfo.GetCustomAttributes(typeof(ComVisibleAttribute), true); - - foreach(ComVisibleAttribute attr in customAttributesOnProperty) - { - if(!attr.Value) - { - return false; - } - } - return true; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAProperty.cs b/source/Archive/MPF/12.0/Automation/OAProperty.cs deleted file mode 100644 index b30219b377..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAProperty.cs +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Reflection; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - - public class OAProperty : EnvDTE.Property - { - #region fields - private OAProperties parent; - private PropertyInfo pi; - #endregion - - #region ctors - - public OAProperty(OAProperties parent, PropertyInfo pi) - { - this.parent = parent; - this.pi = pi; - } - #endregion - - #region EnvDTE.Property - /// - /// Microsoft Internal Use Only. - /// - public object Application - { - get { return null; } - } - - /// - /// Gets the Collection containing the Property object supporting this property. - /// - public EnvDTE.Properties Collection - { - get - { - //todo: EnvDTE.Property.Collection - return this.parent; - } - } - - /// - /// Gets the top-level extensibility object. - /// - public EnvDTE.DTE DTE - { - get - { - return this.parent.DTE; - } - } - - /// - /// Returns one element of a list. - /// - /// The index of the item to display. - /// The index of the item to display. Reserved for future use. - /// The index of the item to display. Reserved for future use. - /// The index of the item to display. Reserved for future use. - /// The value of a property - public object get_IndexedValue(object index1, object index2, object index3, object index4) - { - ParameterInfo[] par = pi.GetIndexParameters(); - int len = Math.Min(par.Length, 4); - if(len == 0) return this.Value; - object[] index = new object[len]; - Array.Copy(new object[4] { index1, index2, index3, index4 }, index, len); - return this.pi.GetValue(this.parent.Target, index); - } - - /// - /// Setter function to set properties values. - /// - /// - public void let_Value(object value) - { - this.Value = value; - } - - /// - /// Gets the name of the object. - /// - public string Name - { - get - { - return pi.Name; - } - } - - /// - /// Gets the number of indices required to access the value. - /// - public short NumIndices - { - get { return (short)pi.GetIndexParameters().Length; } - } - - /// - /// Sets or gets the object supporting the Property object. - /// - public object Object - { - get - { - return this.parent.Target; - } - set - { - } - } - - /// - /// Microsoft Internal Use Only. - /// - public EnvDTE.Properties Parent - { - get { return this.parent; } - } - - /// - /// Sets the value of the property at the specified index. - /// - /// The index of the item to set. - /// Reserved for future use. - /// Reserved for future use. - /// Reserved for future use. - /// The value to set. - public void set_IndexedValue(object index1, object index2, object index3, object index4, object value) - { - ParameterInfo[] par = pi.GetIndexParameters(); - int len = Math.Min(par.Length, 4); - if(len == 0) - { - this.Value = value; - } - else - { - object[] index = new object[len]; - Array.Copy(new object[4] { index1, index2, index3, index4 }, index, len); - - using(AutomationScope scope = new AutomationScope(this.parent.Target.Node.ProjectMgr.Site)) - { - this.pi.SetValue(this.parent.Target, value, index); - } - } - - } - - /// - /// Gets or sets the value of the property returned by the Property object. - /// - public object Value - { - get { return pi.GetValue(this.parent.Target, null); } - set - { - using(AutomationScope scope = new AutomationScope(this.parent.Target.Node.ProjectMgr.Site)) - { - this.pi.SetValue(this.parent.Target, value, null); - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAReferenceFolderItem.cs b/source/Archive/MPF/12.0/Automation/OAReferenceFolderItem.cs deleted file mode 100644 index b32611652e..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAReferenceFolderItem.cs +++ /dev/null @@ -1,104 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Contains OAReferenceItem objects - /// - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAReferenceFolderItem : OAProjectItem - { - #region ctors - public OAReferenceFolderItem(OAProject project, ReferenceContainerNode node) - : base(project, node) - { - } - - #endregion - - #region overridden methods - /// - /// Returns the project items collection of all the references defined for this project. - /// - public override EnvDTE.ProjectItems ProjectItems - { - get - { - return new OANavigableProjectItems(this.Project, this.GetListOfProjectItems(), this.Node); - } - } - - - #endregion - - #region Helper methods - private List GetListOfProjectItems() - { - List list = new List(); - for(HierarchyNode child = this.Node.FirstChild; child != null; child = child.NextSibling) - { - ReferenceNode node = child as ReferenceNode; - - if(node != null) - { - list.Add(new OAReferenceItem(this.Project, node)); - } - } - - return list; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OAReferenceItem.cs b/source/Archive/MPF/12.0/Automation/OAReferenceItem.cs deleted file mode 100644 index 7459fbc7d2..0000000000 --- a/source/Archive/MPF/12.0/Automation/OAReferenceItem.cs +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents the automation object equivalent to a ReferenceNode object - /// - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAReferenceItem : OAProjectItem - { - #region ctors - public OAReferenceItem(OAProject project, ReferenceNode node) - : base(project, node) - { - } - - #endregion - - #region overridden methods - /// - /// Not implemented. If called throws invalid operation exception. - /// - public override void Delete() - { - throw new InvalidOperationException(); - } - - - /// - /// Not implemented. If called throws invalid operation exception. - /// - /// A Constants. vsViewKind indicating the type of view to use. - /// - public override EnvDTE.Window Open(string viewKind) - { - throw new InvalidOperationException(); - } - - /// - /// Gets or sets the name of the object. - /// - public override string Name - { - get - { - return base.Name; - } - set - { - throw new InvalidOperationException(); - } - } - - /// - /// Gets the ProjectItems collection containing the ProjectItem object supporting this property. - /// - public override EnvDTE.ProjectItems Collection - { - get - { - // Get the parent node (ReferenceContainerNode) - ReferenceContainerNode parentNode = this.Node.Parent as ReferenceContainerNode; - Debug.Assert(parentNode != null, "Failed to get the parent node"); - - // Get the ProjectItems object for the parent node - if(parentNode != null) - { - // The root node for the project - return ((OAReferenceFolderItem)parentNode.GetAutomationObject()).ProjectItems; - } - - return null; - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/OASolutionFolder.cs b/source/Archive/MPF/12.0/Automation/OASolutionFolder.cs deleted file mode 100644 index 7968bcc693..0000000000 --- a/source/Archive/MPF/12.0/Automation/OASolutionFolder.cs +++ /dev/null @@ -1,168 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [ComVisible(true)] - public class OASolutionFolder : EnvDTE80.SolutionFolder - where T : HierarchyNode - { - bool hidden = false; - T node; - - public OASolutionFolder(T associatedNode) - { - if(associatedNode == null) - { - throw new ArgumentNullException("associatedNode"); - } - - Debug.Assert(associatedNode.ProjectMgr is ProjectContainerNode, "Expecting obejct of type" + typeof(ProjectContainerNode).Name); - - if(!(associatedNode.ProjectMgr is ProjectContainerNode)) - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "associatedNode"); - - this.node = associatedNode; - } - - - #region SolutionFolder Members - - public virtual EnvDTE.Project AddFromFile(string fileName) - { - ProjectContainerNode projectContainer = (ProjectContainerNode)this.node.ProjectMgr; - ProjectElement newElement = new ProjectElement(projectContainer, fileName, ProjectFileConstants.SubProject); - NestedProjectNode newNode = projectContainer.AddExistingNestedProject(newElement, __VSCREATEPROJFLAGS.CPF_NOTINSLNEXPLR | __VSCREATEPROJFLAGS.CPF_SILENT | __VSCREATEPROJFLAGS.CPF_OPENFILE); - if(newNode == null) - return null; - // Now that the sub project was created, get its extensibility object so we can return it - object newProject = null; - if(ErrorHandler.Succeeded(newNode.NestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out newProject))) - return newProject as EnvDTE.Project; - else - return null; - } - - public virtual EnvDTE.Project AddFromTemplate(string fileName, string destination, string projectName) - { - bool isVSTemplate = Utilities.IsTemplateFile(fileName); - - NestedProjectNode newNode = null; - if(isVSTemplate) - { - // Get the wizard to run, we will get called again and use the alternate code path - ProjectElement newElement = new ProjectElement(this.node.ProjectMgr, System.IO.Path.Combine(destination, projectName), ProjectFileConstants.SubProject); - newElement.SetMetadata(ProjectFileConstants.Template, fileName); - ((ProjectContainerNode)this.node.ProjectMgr).RunVsTemplateWizard(newElement, false); - } - else - { - if((String.IsNullOrEmpty(System.IO.Path.GetExtension(projectName)))) - { - string targetExtension = System.IO.Path.GetExtension(fileName); - projectName = System.IO.Path.ChangeExtension(projectName, targetExtension); - } - - ProjectContainerNode projectContainer = (ProjectContainerNode)this.node.ProjectMgr; - newNode = projectContainer.AddNestedProjectFromTemplate(fileName, destination, projectName, null, __VSCREATEPROJFLAGS.CPF_NOTINSLNEXPLR | __VSCREATEPROJFLAGS.CPF_SILENT | __VSCREATEPROJFLAGS.CPF_CLONEFILE); - } - if(newNode == null) - return null; - - // Now that the sub project was created, get its extensibility object so we can return it - object newProject = null; - if(ErrorHandler.Succeeded(newNode.NestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out newProject))) - return newProject as EnvDTE.Project; - else - return null; - } - - public virtual EnvDTE.Project AddSolutionFolder(string Name) - { - throw new NotImplementedException(); - } - - public virtual EnvDTE.Project Parent - { - get - { - throw new NotImplementedException(); - } - } - - public virtual bool Hidden - { - get - { - return hidden; - } - set - { - hidden = value; - } - } - - public virtual EnvDTE.DTE DTE - { - get - { - return (EnvDTE.DTE)this.node.ProjectMgr.Site.GetService(typeof(EnvDTE.DTE)); - } - } - - #endregion - } - -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAAssemblyReference.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAAssemblyReference.cs deleted file mode 100644 index 2f9dc5183e..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAAssemblyReference.cs +++ /dev/null @@ -1,209 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Text; -using VSLangProj; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAAssemblyReference : OAReferenceBase - { - public OAAssemblyReference(AssemblyReferenceNode assemblyReference) : - base(assemblyReference) - { - } - - #region Reference override - public override int BuildNumber - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.Version)) - { - return 0; - } - return BaseReferenceNode.ResolvedAssembly.Version.Build; - } - } - public override string Culture - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.CultureInfo)) - { - return string.Empty; - } - return BaseReferenceNode.ResolvedAssembly.CultureInfo.Name; - } - } - public override string Identity - { - get - { - // Note that in this function we use the assembly name instead of the resolved one - // because the identity of this reference is the assembly name needed by the project, - // not the specific instance found in this machine / environment. - if(null == BaseReferenceNode.AssemblyName) - { - return null; - } - return BaseReferenceNode.AssemblyName.FullName; - } - } - public override int MajorVersion - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.Version)) - { - return 0; - } - return BaseReferenceNode.ResolvedAssembly.Version.Major; - } - } - public override int MinorVersion - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.Version)) - { - return 0; - } - return BaseReferenceNode.ResolvedAssembly.Version.Minor; - } - } - - public override string PublicKeyToken - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.GetPublicKeyToken())) - { - return null; - } - StringBuilder builder = new StringBuilder(); - byte[] publicKeyToken = BaseReferenceNode.ResolvedAssembly.GetPublicKeyToken(); - for(int i = 0; i < publicKeyToken.Length; i++) - { - builder.AppendFormat("{0:x}", publicKeyToken[i]); - } - return builder.ToString(); - } - } - - public override string Name - { - get - { - if(null != BaseReferenceNode.ResolvedAssembly) - { - return BaseReferenceNode.ResolvedAssembly.Name; - } - if(null != BaseReferenceNode.AssemblyName) - { - return BaseReferenceNode.AssemblyName.Name; - } - return null; - } - } - public override int RevisionNumber - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.Version)) - { - return 0; - } - return BaseReferenceNode.ResolvedAssembly.Version.Revision; - } - } - public override bool StrongName - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (0 == (BaseReferenceNode.ResolvedAssembly.Flags & AssemblyNameFlags.PublicKey))) - { - return false; - } - return true; - } - } - public override prjReferenceType Type - { - get - { - return prjReferenceType.prjReferenceTypeAssembly; - } - } - public override string Version - { - get - { - if((null == BaseReferenceNode.ResolvedAssembly) || - (null == BaseReferenceNode.ResolvedAssembly.Version)) - { - return string.Empty; - } - return BaseReferenceNode.ResolvedAssembly.Version.ToString(); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OABuildManager.cs b/source/Archive/MPF/12.0/Automation/VSProject/OABuildManager.cs deleted file mode 100644 index 5be37ae1f6..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OABuildManager.cs +++ /dev/null @@ -1,143 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio.Shell.Interop; -using VSLangProj; -using Microsoft.VisualStudio; - -namespace Microsoft.VisualStudio.Project.Automation -{ - public class OABuildManager : ConnectionPointContainer, - IEventSource<_dispBuildManagerEvents>, - BuildManager, - BuildManagerEvents - { - private ProjectNode projectManager; - - public OABuildManager(ProjectNode project) - { - projectManager = project; - AddEventSource<_dispBuildManagerEvents>(this as IEventSource<_dispBuildManagerEvents>); - } - - - #region BuildManager Members - - public virtual string BuildDesignTimeOutput(string bstrOutputMoniker) - { - throw new NotImplementedException(); - } - - public virtual EnvDTE.Project ContainingProject - { - get { return projectManager.GetAutomationObject() as EnvDTE.Project; } - } - - public virtual EnvDTE.DTE DTE - { - get { return projectManager.Site.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual object DesignTimeOutputMonikers - { - get { throw new NotImplementedException(); } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual object Parent - { - get { throw new NotImplementedException(); } - } - - #endregion - - #region _dispBuildManagerEvents_Event Members - - public event _dispBuildManagerEvents_DesignTimeOutputDeletedEventHandler DesignTimeOutputDeleted; - - public event _dispBuildManagerEvents_DesignTimeOutputDirtyEventHandler DesignTimeOutputDirty; - - #endregion - - #region IEventSource<_dispBuildManagerEvents> Members - - void IEventSource<_dispBuildManagerEvents>.OnSinkAdded(_dispBuildManagerEvents sink) - { - DesignTimeOutputDeleted += new _dispBuildManagerEvents_DesignTimeOutputDeletedEventHandler(sink.DesignTimeOutputDeleted); - DesignTimeOutputDirty += new _dispBuildManagerEvents_DesignTimeOutputDirtyEventHandler(sink.DesignTimeOutputDirty); - } - - void IEventSource<_dispBuildManagerEvents>.OnSinkRemoved(_dispBuildManagerEvents sink) - { - DesignTimeOutputDeleted -= new _dispBuildManagerEvents_DesignTimeOutputDeletedEventHandler(sink.DesignTimeOutputDeleted); - DesignTimeOutputDirty -= new _dispBuildManagerEvents_DesignTimeOutputDirtyEventHandler(sink.DesignTimeOutputDirty); - } - - #endregion - - protected virtual void OnDesignTimeOutputDeleted(string outputMoniker) - { - var handlers = this.DesignTimeOutputDeleted; - if (handlers != null) - { - handlers(outputMoniker); - } - } - - protected virtual void OnDesignTimeOutputDirty(string outputMoniker) - { - var handlers = this.DesignTimeOutputDirty; - if (handlers != null) - { - handlers(outputMoniker); - } - } - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAComReference.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAComReference.cs deleted file mode 100644 index b45fa1e1b1..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAComReference.cs +++ /dev/null @@ -1,123 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project.Automation -{ - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAComReference : OAReferenceBase - { - public OAComReference(ComReferenceNode comReference) : - base(comReference) - { - } - - #region Reference override - public override string Culture - { - get - { - int locale = 0; - try - { - locale = int.Parse(BaseReferenceNode.LCID, CultureInfo.InvariantCulture); - } - catch(System.FormatException) - { - // Do Nothing - } - if(0 == locale) - { - return string.Empty; - } - CultureInfo culture = new CultureInfo(locale); - return culture.Name; - } - } - public override string Identity - { - get - { - return string.Format(CultureInfo.InvariantCulture, "{0}\\{1}", BaseReferenceNode.TypeGuid.ToString("B"), this.Version); - } - } - public override int MajorVersion - { - get { return BaseReferenceNode.MajorVersionNumber; } - } - public override int MinorVersion - { - get { return BaseReferenceNode.MinorVersionNumber; } - } - public override string Name - { - get { return BaseReferenceNode.Caption; } - } - public override VSLangProj.prjReferenceType Type - { - get - { - return VSLangProj.prjReferenceType.prjReferenceTypeActiveX; - } - } - public override string Version - { - get - { - Version version = new Version(BaseReferenceNode.MajorVersionNumber, BaseReferenceNode.MinorVersionNumber); - return version.ToString(); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAProjectReference.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAProjectReference.cs deleted file mode 100644 index 2e40056037..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAProjectReference.cs +++ /dev/null @@ -1,127 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using VSLangProj; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents a project reference of the solution - /// - [SuppressMessage("Microsoft.Interoperability", "CA1405:ComVisibleTypeBaseTypesShouldBeComVisible")] - [ComVisible(true)] - public class OAProjectReference : OAReferenceBase - { - public OAProjectReference(ProjectReferenceNode projectReference) : - base(projectReference) - { - } - - #region Reference override - public override string Culture - { - get { return string.Empty; } - } - public override string Name - { - get { return BaseReferenceNode.ReferencedProjectName; } - } - public override string Identity - { - get - { - return BaseReferenceNode.Caption; - } - } - public override string Path - { - get - { - return BaseReferenceNode.ReferencedProjectOutputPath; - } - } - public override EnvDTE.Project SourceProject - { - get - { - if(Guid.Empty == BaseReferenceNode.ReferencedProjectGuid) - { - return null; - } - IVsHierarchy hierarchy = VsShellUtilities.GetHierarchy(BaseReferenceNode.ProjectMgr.Site, BaseReferenceNode.ReferencedProjectGuid); - if(null == hierarchy) - { - return null; - } - object extObject; - if(Microsoft.VisualStudio.ErrorHandler.Succeeded( - hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ExtObject, out extObject))) - { - return extObject as EnvDTE.Project; - } - return null; - } - } - public override prjReferenceType Type - { - // TODO: Write the code that finds out the type of the output of the source project. - get { return prjReferenceType.prjReferenceTypeAssembly; } - } - public override string Version - { - get { return string.Empty; } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAReferenceBase.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAReferenceBase.cs deleted file mode 100644 index 169e00c2da..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAReferenceBase.cs +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using VSLangProj; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents the automation equivalent of ReferenceNode - /// - /// - [SuppressMessage("Microsoft.Naming", "CA1715:IdentifiersShouldHaveCorrectPrefix", MessageId = "T")] - [ComVisible(true)] - public abstract class OAReferenceBase : Reference - where RefType : ReferenceNode - { - #region fields - private RefType referenceNode; - #endregion - - #region ctors - protected OAReferenceBase(RefType referenceNode) - { - this.referenceNode = referenceNode; - } - #endregion - - #region properties - protected RefType BaseReferenceNode - { - get { return referenceNode; } - } - #endregion - - #region Reference Members - public virtual int BuildNumber - { - get { return 0; } - } - - public virtual References Collection - { - get - { - return BaseReferenceNode.Parent.Object as References; - } - } - - public virtual EnvDTE.Project ContainingProject - { - get - { - return BaseReferenceNode.ProjectMgr.GetAutomationObject() as EnvDTE.Project; - } - } - - public virtual bool CopyLocal - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - public virtual string Culture - { - get { throw new NotImplementedException(); } - } - - public virtual EnvDTE.DTE DTE - { - get - { - return BaseReferenceNode.ProjectMgr.Site.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; - } - } - - public virtual string Description - { - get - { - return this.Name; - } - } - - public virtual string ExtenderCATID - { - get { throw new NotImplementedException(); } - } - - public virtual object ExtenderNames - { - get { throw new NotImplementedException(); } - } - - public virtual string Identity - { - get { throw new NotImplementedException(); } - } - - public virtual int MajorVersion - { - get { return 0; } - } - - public virtual int MinorVersion - { - get { return 0; } - } - - public virtual string Name - { - get { throw new NotImplementedException(); } - } - - public virtual string Path - { - get - { - return BaseReferenceNode.Url; - } - } - - public virtual string PublicKeyToken - { - get { throw new NotImplementedException(); } - } - - public virtual void Remove() - { - BaseReferenceNode.Remove(false); - } - - public virtual int RevisionNumber - { - get { return 0; } - } - - public virtual EnvDTE.Project SourceProject - { - get { return null; } - } - - public virtual bool StrongName - { - get { return false; } - } - - public virtual prjReferenceType Type - { - get { throw new NotImplementedException(); } - } - - public virtual string Version - { - get { return new Version().ToString(); } - } - - public virtual object get_Extender(string ExtenderName) - { - throw new NotImplementedException(); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAReferences.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAReferences.cs deleted file mode 100644 index da4cbd687d..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAReferences.cs +++ /dev/null @@ -1,355 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio.Shell.Interop; -using VSLangProj; -using ErrorHandler = Microsoft.VisualStudio.ErrorHandler; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents the automation object for the equivalent ReferenceContainerNode object - /// - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] - [ComVisible(true)] - public class OAReferences : ConnectionPointContainer, - IEventSource<_dispReferencesEvents>, - References, - ReferencesEvents - { - private ReferenceContainerNode container; - public OAReferences(ReferenceContainerNode containerNode) - { - container = containerNode; - AddEventSource<_dispReferencesEvents>(this as IEventSource<_dispReferencesEvents>); - container.OnChildAdded += new EventHandler(OnReferenceAdded); - container.OnChildRemoved += new EventHandler(OnReferenceRemoved); - } - - #region Private Members - private Reference AddFromSelectorData(VSCOMPONENTSELECTORDATA selector, string wrapperTool = null) - { - ReferenceNode refNode = container.AddReferenceFromSelectorData(selector, wrapperTool); - if(null == refNode) - { - return null; - } - - return refNode.Object as Reference; - } - - private Reference FindByName(string stringIndex) - { - foreach(Reference refNode in this) - { - if(0 == string.Compare(refNode.Name, stringIndex, StringComparison.Ordinal)) - { - return refNode; - } - } - return null; - } - #endregion - - #region References Members - - public Reference Add(string bstrPath) - { - if(string.IsNullOrEmpty(bstrPath)) - { - return null; - } - VSCOMPONENTSELECTORDATA selector = new VSCOMPONENTSELECTORDATA(); - selector.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_File; - selector.bstrFile = bstrPath; - - return AddFromSelectorData(selector); - } - - public Reference AddActiveX(string bstrTypeLibGuid, int lMajorVer, int lMinorVer, int lLocaleId, string bstrWrapperTool) - { - VSCOMPONENTSELECTORDATA selector = new VSCOMPONENTSELECTORDATA(); - selector.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Com2; - selector.guidTypeLibrary = new Guid(bstrTypeLibGuid); - selector.lcidTypeLibrary = (uint)lLocaleId; - selector.wTypeLibraryMajorVersion = (ushort)lMajorVer; - selector.wTypeLibraryMinorVersion = (ushort)lMinorVer; - - return AddFromSelectorData(selector, bstrWrapperTool); - } - - public Reference AddProject(EnvDTE.Project project) - { - if(null == project) - { - return null; - } - // Get the soulution. - IVsSolution solution = container.ProjectMgr.Site.GetService(typeof(SVsSolution)) as IVsSolution; - if(null == solution) - { - return null; - } - - // Get the hierarchy for this project. - IVsHierarchy projectHierarchy; - ErrorHandler.ThrowOnFailure(solution.GetProjectOfUniqueName(project.UniqueName, out projectHierarchy)); - - // Create the selector data. - VSCOMPONENTSELECTORDATA selector = new VSCOMPONENTSELECTORDATA(); - selector.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project; - - // Get the project reference string. - ErrorHandler.ThrowOnFailure(solution.GetProjrefOfProject(projectHierarchy, out selector.bstrProjRef)); - - selector.bstrTitle = project.Name; - selector.bstrFile = System.IO.Path.GetDirectoryName(project.FullName); - - return AddFromSelectorData(selector); - } - - public EnvDTE.Project ContainingProject - { - get - { - return container.ProjectMgr.GetAutomationObject() as EnvDTE.Project; - } - } - - public int Count - { - get - { - return container.EnumReferences().Count; - } - } - - public EnvDTE.DTE DTE - { - get - { - return container.ProjectMgr.Site.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; - } - } - - public Reference Find(string bstrIdentity) - { - if(string.IsNullOrEmpty(bstrIdentity)) - { - return null; - } - foreach(Reference refNode in this) - { - if(null != refNode) - { - if(0 == string.Compare(bstrIdentity, refNode.Identity, StringComparison.Ordinal)) - { - return refNode; - } - } - } - return null; - } - - public IEnumerator GetEnumerator() - { - List references = new List(); - IEnumerator baseEnum = container.EnumReferences().GetEnumerator(); - if(null == baseEnum) - { - return references.GetEnumerator(); - } - while(baseEnum.MoveNext()) - { - ReferenceNode refNode = baseEnum.Current as ReferenceNode; - if(null == refNode) - { - continue; - } - Reference reference = refNode.Object as Reference; - if(null != reference) - { - references.Add(reference); - } - } - return references.GetEnumerator(); - } - - public Reference Item(object index) - { - string stringIndex = index as string; - if(null != stringIndex) - { - return FindByName(stringIndex); - } - // Note that this cast will throw if the index is not convertible to int. - int intIndex = (int)index; - IList refs = container.EnumReferences(); - if(null == refs) - { - throw new ArgumentOutOfRangeException("index"); - } - if((intIndex <= 0) || (intIndex > refs.Count)) - { - throw new ArgumentOutOfRangeException("index"); - } - // Let the implementation of IList<> throw in case of index not correct. - return refs[intIndex - 1].Object as Reference; - } - - public object Parent - { - get - { - return container.Parent.Object; - } - } - - #endregion - - #region _dispReferencesEvents_Event Members - public event _dispReferencesEvents_ReferenceAddedEventHandler ReferenceAdded; - public event _dispReferencesEvents_ReferenceChangedEventHandler ReferenceChanged; - public event _dispReferencesEvents_ReferenceRemovedEventHandler ReferenceRemoved; - #endregion - - #region Callbacks for the HierarchyNode events - private void OnReferenceAdded(object sender, HierarchyNodeEventArgs args) - { - // Validate the parameters. - if((container != sender as ReferenceContainerNode) || - (null == args) || (null == args.Child)) - { - return; - } - - // Check if there is any sink for this event. - if(null == ReferenceAdded) - { - return; - } - - // Check that the removed item implements the Reference interface. - Reference reference = args.Child.Object as Reference; - if(null != reference) - { - ReferenceAdded(reference); - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", - Justification="Support for this has not yet been added")] - private void OnReferenceChanged(object sender, HierarchyNodeEventArgs args) - { - // Validate the parameters. - if ((container != sender as ReferenceContainerNode) || - (null == args) || (null == args.Child)) - { - return; - } - - // Check if there is any sink for this event. - if (null == ReferenceChanged) - { - return; - } - - // Check that the removed item implements the Reference interface. - Reference reference = args.Child.Object as Reference; - if (null != reference) - { - ReferenceChanged(reference); - } - } - - private void OnReferenceRemoved(object sender, HierarchyNodeEventArgs args) - { - // Validate the parameters. - if((container != sender as ReferenceContainerNode) || - (null == args) || (null == args.Child)) - { - return; - } - - // Check if there is any sink for this event. - if(null == ReferenceRemoved) - { - return; - } - - // Check that the removed item implements the Reference interface. - Reference reference = args.Child.Object as Reference; - if(null != reference) - { - ReferenceRemoved(reference); - } - } - #endregion - - #region IEventSource<_dispReferencesEvents> Members - void IEventSource<_dispReferencesEvents>.OnSinkAdded(_dispReferencesEvents sink) - { - ReferenceAdded += new _dispReferencesEvents_ReferenceAddedEventHandler(sink.ReferenceAdded); - ReferenceChanged += new _dispReferencesEvents_ReferenceChangedEventHandler(sink.ReferenceChanged); - ReferenceRemoved += new _dispReferencesEvents_ReferenceRemovedEventHandler(sink.ReferenceRemoved); - } - - void IEventSource<_dispReferencesEvents>.OnSinkRemoved(_dispReferencesEvents sink) - { - ReferenceAdded -= new _dispReferencesEvents_ReferenceAddedEventHandler(sink.ReferenceAdded); - ReferenceChanged -= new _dispReferencesEvents_ReferenceChangedEventHandler(sink.ReferenceChanged); - ReferenceRemoved -= new _dispReferencesEvents_ReferenceRemovedEventHandler(sink.ReferenceRemoved); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAVSProject.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAVSProject.cs deleted file mode 100644 index a1d8c68daa..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAVSProject.cs +++ /dev/null @@ -1,251 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using EnvDTE; -using VSLangProj; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents an automation friendly version of a language-specific project. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "OAVS")] - [ComVisible(true)] - public class OAVSProject : VSProject - { - #region fields - private ProjectNode project; - private OAVSProjectEvents events; - #endregion - - #region ctors - public OAVSProject(ProjectNode project) - { - this.project = project; - } - #endregion - - #region VSProject Members - - public virtual ProjectItem AddWebReference(string bstrUrl) - { - throw new NotImplementedException(); - } - - public virtual BuildManager BuildManager - { - get - { - return new OABuildManager(this.project); - } - } - - public virtual void CopyProject(string bstrDestFolder, string bstrDestUNCPath, prjCopyProjectOption copyProjectOption, string bstrUsername, string bstrPassword) - { - throw new NotImplementedException(); - } - - public virtual ProjectItem CreateWebReferencesFolder() - { - throw new NotImplementedException(); - } - - public virtual DTE DTE - { - get - { - return (EnvDTE.DTE)this.project.Site.GetService(typeof(EnvDTE.DTE)); - } - } - - public virtual VSProjectEvents Events - { - get - { - if(events == null) - events = new OAVSProjectEvents(this); - return events; - } - } - - public virtual void Exec(prjExecCommand command, int bSuppressUI, object varIn, out object pVarOut) - { - throw new NotImplementedException(); ; - } - - public virtual void GenerateKeyPairFiles(string strPublicPrivateFile, string strPublicOnlyFile) - { - throw new NotImplementedException(); ; - } - - public virtual string GetUniqueFilename(object pDispatch, string bstrRoot, string bstrDesiredExt) - { - throw new NotImplementedException(); ; - } - - public virtual Imports Imports - { - get - { - throw new NotImplementedException(); - } - } - - public virtual EnvDTE.Project Project - { - get - { - return this.project.GetAutomationObject() as EnvDTE.Project; - } - } - - public virtual References References - { - get - { - ReferenceContainerNode references = project.GetReferenceContainer() as ReferenceContainerNode; - if(null == references) - { - return null; - } - return references.Object as References; - } - } - - public virtual void Refresh() - { - throw new NotImplementedException(); - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual string TemplatePath - { - get - { - throw new NotImplementedException(); - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual ProjectItem WebReferencesFolder - { - get - { - throw new NotImplementedException(); - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual bool WorkOffline - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - #endregion - } - - /// - /// Provides access to language-specific project events - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "OAVS")] - [ComVisible(true)] - public class OAVSProjectEvents : VSProjectEvents - { - #region fields - private OAVSProject vsProject; - #endregion - - #region ctors - public OAVSProjectEvents(OAVSProject vsProject) - { - this.vsProject = vsProject; - } - #endregion - - #region VSProjectEvents Members - - public virtual BuildManagerEvents BuildManagerEvents - { - get - { - return vsProject.BuildManager as BuildManagerEvents; - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] - public virtual ImportsEvents ImportsEvents - { - get - { - throw new NotImplementedException(); - } - } - - public virtual ReferencesEvents ReferencesEvents - { - get - { - return vsProject.References as ReferencesEvents; - } - } - - #endregion - } - -} diff --git a/source/Archive/MPF/12.0/Automation/VSProject/OAVSProjectItem.cs b/source/Archive/MPF/12.0/Automation/VSProject/OAVSProjectItem.cs deleted file mode 100644 index d7baae42e2..0000000000 --- a/source/Archive/MPF/12.0/Automation/VSProject/OAVSProjectItem.cs +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using EnvDTE; -using VSLangProj; - -namespace Microsoft.VisualStudio.Project.Automation -{ - /// - /// Represents a language-specific project item - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "OAVS")] - [ComVisible(true)] - public class OAVSProjectItem : VSProjectItem - { - #region fields - private FileNode fileNode; - #endregion - - #region ctors - public OAVSProjectItem(FileNode fileNode) - { - this.FileNode = fileNode; - } - #endregion - - #region VSProjectItem Members - - public virtual EnvDTE.Project ContainingProject - { - get { return fileNode.ProjectMgr.GetAutomationObject() as EnvDTE.Project; } - } - - public virtual ProjectItem ProjectItem - { - get { return fileNode.GetAutomationObject() as ProjectItem; } - } - - public virtual DTE DTE - { - get { return (DTE)this.fileNode.ProjectMgr.Site.GetService(typeof(DTE)); } - } - - public virtual void RunCustomTool() - { - this.FileNode.RunGenerator(); - } - - #endregion - - #region public properties - /// - /// File Node property - /// - public FileNode FileNode - { - get - { - return fileNode; - } - set - { - fileNode = value; - } - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/BuildDependency.cs b/source/Archive/MPF/12.0/BuildDependency.cs deleted file mode 100644 index 54cbf0ff64..0000000000 --- a/source/Archive/MPF/12.0/BuildDependency.cs +++ /dev/null @@ -1,138 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - public class BuildDependency : IVsBuildDependency - { - Guid referencedProjectGuid = Guid.Empty; - ProjectNode projectMgr = null; - - - public BuildDependency(ProjectNode projectMgr, Guid projectReference) - { - this.referencedProjectGuid = projectReference; - this.projectMgr = projectMgr; - } - - #region IVsBuildDependency methods - public int get_CanonicalName(out string canonicalName) - { - canonicalName = null; - return VSConstants.S_OK; - } - - public int get_Type(out System.Guid guidType) - { - // All our dependencies are build projects - guidType = VSConstants.GUID_VS_DEPTYPE_BUILD_PROJECT; - return VSConstants.S_OK; - } - - public int get_Description(out string description) - { - description = null; - return VSConstants.S_OK; - } - - - public int get_HelpContext(out uint helpContext) - { - helpContext = 0; - return VSConstants.E_NOTIMPL; - } - - public int get_HelpFile(out string helpFile) - { - helpFile = null; - return VSConstants.E_NOTIMPL; - } - - public int get_MustUpdateBefore(out int mustUpdateBefore) - { - // Must always update dependencies - mustUpdateBefore = 1; - - return VSConstants.S_OK; - } - - public int get_ReferredProject(out object unknownProject) - { - unknownProject = null; - - unknownProject = this.GetReferencedHierarchy(); - - // If we cannot find the referenced hierarchy return S_FALSE. - return (unknownProject == null) ? VSConstants.S_FALSE : VSConstants.S_OK; - } - - #endregion - - #region helper methods - private IVsHierarchy GetReferencedHierarchy() - { - IVsHierarchy hierarchy = null; - - if(this.referencedProjectGuid == Guid.Empty || this.projectMgr == null || this.projectMgr.IsClosed) - { - return hierarchy; - } - - return VsShellUtilities.GetHierarchy(this.projectMgr.Site, this.referencedProjectGuid); - - } - - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/BuildPropertyPage.cs b/source/Archive/MPF/12.0/BuildPropertyPage.cs deleted file mode 100644 index 95f944e8d0..0000000000 --- a/source/Archive/MPF/12.0/BuildPropertyPage.cs +++ /dev/null @@ -1,122 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Enumerated list of the properties shown on the build property page - /// - internal enum BuildPropertyPageTag - { - OutputPath - } - - /// - /// Defines the properties on the build property page and the logic the binds the properties to project data (load and save) - /// - [Guid("9B3DEA40-7F29-4a17-87A4-00EE08E8241E")] - public class BuildPropertyPage : SettingsPage - { - #region fields - private string outputPath; - - public BuildPropertyPage() - { - this.Name = SR.GetString(SR.BuildCaption, CultureInfo.CurrentUICulture); - } - #endregion - - #region properties - [SRCategoryAttribute(SR.BuildCaption)] - [LocDisplayName(SR.OutputPath)] - [SRDescriptionAttribute(SR.OutputPathDescription)] - public string OutputPath - { - get { return this.outputPath; } - set { this.outputPath = value; this.IsDirty = true; } - } - #endregion - - #region overridden methods - public override string GetClassName() - { - return this.GetType().FullName; - } - - protected override void BindProperties() - { - if(this.ProjectMgr == null) - { - Debug.Assert(false); - return; - } - - this.outputPath = this.GetConfigProperty(BuildPropertyPageTag.OutputPath.ToString()); - } - - protected override int ApplyChanges() - { - if(this.ProjectMgr == null) - { - Debug.Assert(false); - return VSConstants.E_INVALIDARG; - } - - this.SetConfigProperty(BuildPropertyPageTag.OutputPath.ToString(), this.outputPath); - this.IsDirty = false; - return VSConstants.S_OK; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ComReferenceNode.cs b/source/Archive/MPF/12.0/ComReferenceNode.cs deleted file mode 100644 index 7aa34c2085..0000000000 --- a/source/Archive/MPF/12.0/ComReferenceNode.cs +++ /dev/null @@ -1,397 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; -using System.Collections.Generic; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Execution; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This type of node is used for references to COM components. - /// - - [ComVisible(true)] - public class ComReferenceNode : ReferenceNode - { - #region fields - private string typeName; - private Guid typeGuid; - private string projectRelativeFilePath; - private string installedFilePath; - private string minorVersionNumber; - private string majorVersionNumber; - private string lcid; - #endregion - - #region properties - public override string Caption - { - get { return this.typeName; } - } - - public override string Url - { - get - { - return this.projectRelativeFilePath; - } - } - - /// - /// Returns the Guid of the COM object. - /// - public Guid TypeGuid - { - get { return this.typeGuid; } - } - - /// - /// Returns the path where the COM object is installed. - /// - public string InstalledFilePath - { - get { return this.installedFilePath; } - } - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "LCID")] - public string LCID - { - get { return lcid; } - } - - public int MajorVersionNumber - { - get - { - if(string.IsNullOrEmpty(majorVersionNumber)) - { - return 0; - } - return int.Parse(majorVersionNumber, CultureInfo.CurrentCulture); - } - } - - public bool EmbedInteropTypes - { - get - { - bool value; - bool.TryParse(this.ItemNode.GetMetadata(ProjectFileConstants.EmbedInteropTypes), out value); - return value; - } - - set - { - this.ItemNode.SetMetadata(ProjectFileConstants.EmbedInteropTypes, value.ToString()); - } - } - - public string WrapperTool - { - get { return this.ItemNode.GetMetadata(ProjectFileConstants.WrapperTool); } - set { this.ItemNode.SetMetadata(ProjectFileConstants.WrapperTool, value); } - } - - public int MinorVersionNumber - { - get - { - if(string.IsNullOrEmpty(minorVersionNumber)) - { - return 0; - } - return int.Parse(minorVersionNumber, CultureInfo.CurrentCulture); - } - } - private Automation.OAComReference comReference; - internal override object Object - { - get - { - if(null == comReference) - { - comReference = new Automation.OAComReference(this); - } - return comReference; - } - } - #endregion - - #region ctors - /// - /// Constructor for the ComReferenceNode. - /// - public ComReferenceNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.typeName = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - string typeGuidAsString = this.ItemNode.GetMetadata(ProjectFileConstants.Guid); - if(typeGuidAsString != null) - { - this.typeGuid = new Guid(typeGuidAsString); - } - - this.majorVersionNumber = this.ItemNode.GetMetadata(ProjectFileConstants.VersionMajor); - this.minorVersionNumber = this.ItemNode.GetMetadata(ProjectFileConstants.VersionMinor); - this.lcid = this.ItemNode.GetMetadata(ProjectFileConstants.Lcid); - this.SetProjectItemsThatRelyOnReferencesToBeResolved(false); - this.SetInstalledFilePath(); - } - - /// - /// Overloaded constructor for creating a ComReferenceNode from selector data - /// - /// The Project node - /// The component selctor data. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")] - public ComReferenceNode(ProjectNode root, VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null) - : base(root) - { - if(root == null) - { - throw new ArgumentNullException("root"); - } - if(selectorData.type == VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project - || selectorData.type == VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus) - { - throw new ArgumentException("SelectorData cannot be of type VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project or VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus", "selectorData"); - } - - // Initialize private state - this.typeName = selectorData.bstrTitle; - this.typeGuid = selectorData.guidTypeLibrary; - this.majorVersionNumber = selectorData.wTypeLibraryMajorVersion.ToString(CultureInfo.InvariantCulture); - this.minorVersionNumber = selectorData.wTypeLibraryMinorVersion.ToString(CultureInfo.InvariantCulture); - this.lcid = selectorData.lcidTypeLibrary.ToString(CultureInfo.InvariantCulture); - this.WrapperTool = wrapperTool; - - // Check to see if the COM object actually exists. - this.SetInstalledFilePath(); - // If the value cannot be set throw. - if(String.IsNullOrEmpty(this.installedFilePath)) - { - throw new InvalidOperationException(); - } - } - #endregion - - #region methods - protected override NodeProperties CreatePropertiesObject() - { - return new ComReferenceProperties(this); - } - - /// - /// Links a reference node to the project and hierarchy. - /// - protected override void BindReferenceData() - { - Debug.Assert(this.ItemNode != null, "The AssemblyName field has not been initialized"); - - // We need to create the project element at this point if it has not been created. - // We cannot do that from the ctor if input comes from a component selector data, since had we been doing that we would have added a project element to the project file. - // The problem with that approach is that we would need to remove the project element if the item cannot be added to the hierachy (E.g. It already exists). - // It is just safer to update the project file now. This is the intent of this method. - // Call MSBuild to build the target ResolveComReferences - if(this.ItemNode == null || this.ItemNode.Item == null) - { - this.ItemNode = this.GetProjectElementBasedOnInputFromComponentSelectorData(); - } - - this.SetProjectItemsThatRelyOnReferencesToBeResolved(true); - } - - /// - /// Checks if a reference is already added. The method parses all references and compares the the FinalItemSpec and the Guid. - /// - /// true if the assembly has already been added. - protected internal override bool IsAlreadyAdded(out ReferenceNode existingReference) - { - ReferenceContainerNode referencesFolder = this.ProjectMgr.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as ReferenceContainerNode; - Debug.Assert(referencesFolder != null, "Could not find the References node"); - - for(HierarchyNode n = referencesFolder.FirstChild; n != null; n = n.NextSibling) - { - ComReferenceNode referenceNode = n as ComReferenceNode; - - if(referenceNode != null) - { - // We check if the name and guids are the same - if(referenceNode.TypeGuid == this.TypeGuid && String.Compare(referenceNode.Caption, this.Caption, StringComparison.OrdinalIgnoreCase) == 0) - { - existingReference = referenceNode; - return true; - } - } - } - - existingReference = null; - return false; - } - - /// - /// Determines if this is node a valid node for painting the default reference icon. - /// - /// - protected override bool CanShowDefaultIcon() - { - return !String.IsNullOrEmpty(this.installedFilePath); - } - - /// - /// This is an helper method to convert the VSCOMPONENTSELECTORDATA recieved by the - /// implementer of IVsComponentUser into a ProjectElement that can be used to create - /// an instance of this class. - /// This should not be called for project reference or reference to managed assemblies. - /// - /// ProjectElement corresponding to the COM component passed in - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")] - private ProjectElement GetProjectElementBasedOnInputFromComponentSelectorData() - { - - ProjectElement element = new ProjectElement(this.ProjectMgr, this.typeName, ProjectFileConstants.COMReference); - - // Set the basic information regarding this COM component - element.SetMetadata(ProjectFileConstants.Guid, this.typeGuid.ToString("B")); - element.SetMetadata(ProjectFileConstants.VersionMajor, this.majorVersionNumber); - element.SetMetadata(ProjectFileConstants.VersionMinor, this.minorVersionNumber); - element.SetMetadata(ProjectFileConstants.Lcid, this.lcid); - element.SetMetadata(ProjectFileConstants.Isolated, false.ToString()); - - // See if a PIA exist for this component - TypeLibConverter typelib = new TypeLibConverter(); - string assemblyName; - string assemblyCodeBase; - if(typelib.GetPrimaryInteropAssembly(this.typeGuid, Int32.Parse(this.majorVersionNumber, CultureInfo.InvariantCulture), Int32.Parse(this.minorVersionNumber, CultureInfo.InvariantCulture), Int32.Parse(this.lcid, CultureInfo.InvariantCulture), out assemblyName, out assemblyCodeBase)) - { - element.SetMetadata(ProjectFileConstants.WrapperTool, WrapperToolAttributeValue.Primary.ToString().ToLowerInvariant()); - } - else - { - // MSBuild will have to generate an interop assembly - element.SetMetadata(ProjectFileConstants.WrapperTool, WrapperToolAttributeValue.TlbImp.ToString().ToLowerInvariant()); - element.SetMetadata(ProjectFileConstants.EmbedInteropTypes, true.ToString()); - element.SetMetadata(ProjectFileConstants.Private, true.ToString()); - } - return element; - } - - private void SetProjectItemsThatRelyOnReferencesToBeResolved(bool renameItemNode) - { - // Call MSBuild to build the target ResolveComReferences - bool success; - ErrorHandler.ThrowOnFailure(this.ProjectMgr.BuildTarget(MsBuildTarget.ResolveComReferences, out success)); - if(!success) - throw new InvalidOperationException(); - - // Now loop through the generated COM References to find the corresponding one - IEnumerable comReferences = this.ProjectMgr.BuildProject.GetItems(MsBuildGeneratedItemType.ComReferenceWrappers); - foreach (ProjectItem reference in comReferences) - { - if(String.Compare(reference.GetMetadataValue(ProjectFileConstants.Guid), this.typeGuid.ToString("B"), StringComparison.OrdinalIgnoreCase) == 0 - && String.Compare(reference.GetMetadataValue(ProjectFileConstants.VersionMajor), this.majorVersionNumber, StringComparison.OrdinalIgnoreCase) == 0 - && String.Compare(reference.GetMetadataValue(ProjectFileConstants.VersionMinor), this.minorVersionNumber, StringComparison.OrdinalIgnoreCase) == 0 - && String.Compare(reference.GetMetadataValue(ProjectFileConstants.Lcid), this.lcid, StringComparison.OrdinalIgnoreCase) == 0) - { - string name = reference.EvaluatedInclude; - if(Path.IsPathRooted(name)) - { - this.projectRelativeFilePath = name; - } - else - { - this.projectRelativeFilePath = Path.Combine(this.ProjectMgr.ProjectFolder, name); - } - - if(renameItemNode) - { - this.ItemNode.Rename(Path.GetFileNameWithoutExtension(name)); - } - break; - } - } - } - - /// - /// Verify that the TypeLib is registered and set the the installed file path of the com reference. - /// - /// - private void SetInstalledFilePath() - { - string registryPath = string.Format(CultureInfo.InvariantCulture, @"TYPELIB\{0:B}\{1:x}.{2:x}", this.typeGuid, this.MajorVersionNumber, this.MinorVersionNumber); - using(RegistryKey typeLib = Registry.ClassesRoot.OpenSubKey(registryPath)) - { - if(typeLib != null) - { - // Check if we need to set the name for this type. - if(string.IsNullOrEmpty(this.typeName)) - { - this.typeName = typeLib.GetValue(string.Empty) as string; - } - // Now get the path to the file that contains this type library. - using(RegistryKey installKey = typeLib.OpenSubKey(string.Format(CultureInfo.InvariantCulture, @"{0}\win32", this.LCID))) - { - this.installedFilePath = installKey.GetValue(String.Empty) as String; - } - } - } - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ConfigProvider.cs b/source/Archive/MPF/12.0/ConfigProvider.cs deleted file mode 100644 index 4e7507f7e1..0000000000 --- a/source/Archive/MPF/12.0/ConfigProvider.cs +++ /dev/null @@ -1,795 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using Microsoft.Build.Construction; - -/* This file provides a basefunctionallity for IVsCfgProvider2. - Instead of using the IVsProjectCfgEventsHelper object we have our own little sink and call our own helper methods - similiar to the interface. But there is no real benefit in inheriting from the interface in the first place. - Using the helper object seems to be: - a) undocumented - b) not really wise in the managed world -*/ -namespace Microsoft.VisualStudio.Project -{ - - [ComVisible(true)] - public class ConfigProvider : IVsCfgProvider2, IVsProjectCfgProvider, IVsExtensibleObject - { - #region fields - internal const string configString = " '$(Configuration)' == '{0}' "; - internal const string AnyCPUPlatform = "Any CPU"; - internal const string x86Platform = "x86"; - - private ProjectNode project; - private EventSinkCollection cfgEventSinks = new EventSinkCollection(); - private List, string>> newCfgProps = new List, string>>(); - private Dictionary configurationsList = new Dictionary(); - #endregion - - #region Properties - /// - /// The associated project. - /// - protected ProjectNode ProjectMgr - { - get - { - return this.project; - } - } - /// - /// If the project system wants to add custom properties to the property group then - /// they provide us with this data. - /// Returns/sets the [() ] collection - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1002:DoNotExposeGenericLists"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public virtual List, string>> NewConfigProperties - { - get - { - return newCfgProps; - } - set - { - newCfgProps = value; - } - } - - #endregion - - #region ctors - public ConfigProvider(ProjectNode manager) - { - this.project = manager; - } - #endregion - - #region methods - /// - /// Creates new Project Configuartion objects based on the configuration name. - /// - /// The name of the configuration - /// An instance of a ProjectConfig object. - protected ProjectConfig GetProjectConfiguration(string configName) - { - if (configName == null) - { - return null; - } - - // if we already created it, return the cached one - if(configurationsList.ContainsKey(configName)) - { - return configurationsList[configName]; - } - - ProjectConfig requestedConfiguration = CreateProjectConfiguration(configName); - configurationsList.Add(configName, requestedConfiguration); - - return requestedConfiguration; - } - - protected virtual ProjectConfig CreateProjectConfiguration(string configName) - { - return new ProjectConfig(this.project, configName); - } - - #endregion - - #region IVsProjectCfgProvider methods - /// - /// Provides access to the IVsProjectCfg interface implemented on a project's configuration object. - /// - /// The canonical name of the configuration to access. - /// The IVsProjectCfg interface of the configuration identified by szProjectCfgCanonicalName. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OpenProjectCfg(string projectCfgCanonicalName, out IVsProjectCfg projectCfg) - { - if(projectCfgCanonicalName == null) - { - throw new ArgumentNullException("projectCfgCanonicalName"); - } - - projectCfg = null; - - // Be robust in release - if(projectCfgCanonicalName == null) - { - return VSConstants.E_INVALIDARG; - } - - - Debug.Assert(this.project != null && this.project.BuildProject != null); - - string[] configs = GetPropertiesConditionedOn(ProjectFileConstants.Configuration); - - foreach(string config in configs) - { - if(String.Compare(config, projectCfgCanonicalName, StringComparison.OrdinalIgnoreCase) == 0) - { - projectCfg = this.GetProjectConfiguration(config); - if(projectCfg != null) - { - return VSConstants.S_OK; - } - else - { - return VSConstants.E_FAIL; - } - } - } - - return VSConstants.E_INVALIDARG; - } - - /// - /// Checks whether or not this configuration provider uses independent configurations. - /// - /// true if independent configurations are used, false if they are not used. By default returns true. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int get_UsesIndependentConfigurations(out int usesIndependentConfigurations) - { - usesIndependentConfigurations = 1; - return VSConstants.S_OK; - } - #endregion - - #region IVsCfgProvider2 methods - /// - /// Copies an existing configuration name or creates a new one. - /// - /// The name of the new configuration. - /// the name of the configuration to copy, or a null reference, indicating that AddCfgsOfCfgName should create a new configuration. - /// Flag indicating whether or not the new configuration is private. If fPrivate is set to true, the configuration is private. If set to false, the configuration is public. This flag can be ignored. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int AddCfgsOfCfgName(string name, string cloneName, int fPrivate) - { - // We need to QE/QS the project file - if(!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - // First create the condition that represent the configuration we want to clone - string condition = (cloneName == null ? String.Empty : String.Format(CultureInfo.InvariantCulture, configString, cloneName).Trim()); - - // Get all configs - List configGroup = new List(this.project.BuildProject.Xml.PropertyGroups); - ProjectPropertyGroupElement configToClone = null; - - if(cloneName != null) - { - // Find the configuration to clone - foreach (ProjectPropertyGroupElement currentConfig in configGroup) - { - // Only care about conditional property groups - if(currentConfig.Condition == null || currentConfig.Condition.Length == 0) - continue; - - // Skip if it isn't the group we want - if(String.Compare(currentConfig.Condition.Trim(), condition, StringComparison.OrdinalIgnoreCase) != 0) - continue; - - configToClone = currentConfig; - } - } - - ProjectPropertyGroupElement newConfig = null; - if(configToClone != null) - { - // Clone the configuration settings - newConfig = this.project.ClonePropertyGroup(configToClone); - //Will be added later with the new values to the path - - foreach (ProjectPropertyElement property in newConfig.Properties) - { - if (property.Name.Equals("OutputPath", StringComparison.OrdinalIgnoreCase)) - { - property.Parent.RemoveChild(property); - } - } - } - else - { - // no source to clone from, lets just create a new empty config - newConfig = this.project.BuildProject.Xml.AddPropertyGroup(); - // Get the list of property name, condition value from the config provider - IList, string>> propVals = this.NewConfigProperties; - foreach(KeyValuePair, string> data in propVals) - { - KeyValuePair propData = data.Key; - string value = data.Value; - ProjectPropertyElement newProperty = newConfig.AddProperty(propData.Key, value); - if(!String.IsNullOrEmpty(propData.Value)) - newProperty.Condition = propData.Value; - } - } - - - //add the output path - string outputBasePath = this.ProjectMgr.OutputBaseRelativePath; - if(outputBasePath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) - outputBasePath = Path.GetDirectoryName(outputBasePath); - newConfig.AddProperty("OutputPath", Path.Combine(outputBasePath, name) + Path.DirectorySeparatorChar.ToString()); - - // Set the condition that will define the new configuration - string newCondition = String.Format(CultureInfo.InvariantCulture, configString, name); - newConfig.Condition = newCondition; - - NotifyOnCfgNameAdded(name); - return VSConstants.S_OK; - } - - /// - /// Copies an existing platform name or creates a new one. - /// - /// The name of the new platform. - /// The name of the platform to copy, or a null reference, indicating that AddCfgsOfPlatformName should create a new platform. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int AddCfgsOfPlatformName(string platformName, string clonePlatformName) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Deletes a specified configuration name. - /// - /// The name of the configuration to be deleted. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int DeleteCfgsOfCfgName(string name) - { - // We need to QE/QS the project file - if(!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - if(name == null) - { - Debug.Fail(String.Format(CultureInfo.CurrentCulture, "Name of the configuration should not be null if you want to delete it from project: {0}", this.project.BuildProject.FullPath)); - // The configuration " '$(Configuration)' == " does not exist, so technically the goal - // is achieved so return S_OK - return VSConstants.S_OK; - } - // Verify that this config exist - string[] configs = GetPropertiesConditionedOn(ProjectFileConstants.Configuration); - foreach(string config in configs) - { - if(String.Compare(config, name, StringComparison.OrdinalIgnoreCase) == 0) - { - // Create condition of config to remove - string condition = String.Format(CultureInfo.InvariantCulture, configString, config); - - foreach (ProjectPropertyGroupElement element in this.project.BuildProject.Xml.PropertyGroups) - { - if(String.Equals(element.Condition, condition, StringComparison.OrdinalIgnoreCase)) - { - element.Parent.RemoveChild(element); - } - } - - NotifyOnCfgNameDeleted(name); - } - } - - return VSConstants.S_OK; - } - - /// - /// Deletes a specified platform name. - /// - /// The platform name to delet. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int DeleteCfgsOfPlatformName(string platName) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Returns the existing configurations stored in the project file. - /// - /// Specifies the requested number of property names. If this number is unknown, celt can be zero. - /// On input, an allocated array to hold the number of configuration property names specified by celt. This parameter can also be a null reference if the celt parameter is zero. - /// On output, names contains configuration property names. - /// The actual number of property names returned. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetCfgNames(uint celt, string[] names, uint[] actual) - { - // get's called twice, once for allocation, then for retrieval - int i = 0; - - string[] configList = GetPropertiesConditionedOn(ProjectFileConstants.Configuration); - - if(names != null) - { - foreach(string config in configList) - { - names[i++] = config; - if(i == celt) - break; - } - } - else - i = configList.Length; - - if(actual != null) - { - actual[0] = (uint)i; - } - - return VSConstants.S_OK; - } - - /// - /// Returns the configuration associated with a specified configuration or platform name. - /// - /// The name of the configuration to be returned. - /// The name of the platform for the configuration to be returned. - /// The implementation of the IVsCfg interface. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetCfgOfName(string name, string platName, out IVsCfg cfg) - { - cfg = null; - cfg = this.GetProjectConfiguration(name); - - return VSConstants.S_OK; - } - - /// - /// Returns a specified configuration property. - /// - /// Specifies the property identifier for the property to return. For valid propid values, see __VSCFGPROPID. - /// The value of the property. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetCfgProviderProperty(int propid, out object var) - { - var = false; - switch((__VSCFGPROPID)propid) - { - case __VSCFGPROPID.VSCFGPROPID_SupportsCfgAdd: - var = true; - break; - - case __VSCFGPROPID.VSCFGPROPID_SupportsCfgDelete: - var = true; - break; - - case __VSCFGPROPID.VSCFGPROPID_SupportsCfgRename: - var = true; - break; - - case __VSCFGPROPID.VSCFGPROPID_SupportsPlatformAdd: - var = false; - break; - - case __VSCFGPROPID.VSCFGPROPID_SupportsPlatformDelete: - var = false; - break; - } - return VSConstants.S_OK; - } - - /// - /// Returns the per-configuration objects for this object. - /// - /// Number of configuration objects to be returned or zero, indicating a request for an unknown number of objects. - /// On input, pointer to an interface array or a null reference. On output, this parameter points to an array of IVsCfg interfaces belonging to the requested configuration objects. - /// The number of configuration objects actually returned or a null reference, if this information is not necessary. - /// Flags that specify settings for project configurations, or a null reference (Nothing in Visual Basic) if no additional flag settings are required. For valid prgrFlags values, see __VSCFGFLAGS. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetCfgs(uint celt, IVsCfg[] a, uint[] actual, uint[] flags) - { - if(flags != null) - flags[0] = 0; - - int i = 0; - string[] configList = GetPropertiesConditionedOn(ProjectFileConstants.Configuration); - - if(a != null) - { - foreach(string configName in configList) - { - a[i] = this.GetProjectConfiguration(configName); - - i++; - if(i == celt) - break; - } - } - else - i = configList.Length; - - if(actual != null) - actual[0] = (uint)i; - - return VSConstants.S_OK; - } - - /// - /// Returns one or more platform names. - /// - /// Specifies the requested number of platform names. If this number is unknown, celt can be zero. - /// On input, an allocated array to hold the number of platform names specified by celt. This parameter can also be a null reference if the celt parameter is zero. On output, names contains platform names. - /// The actual number of platform names returned. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetPlatformNames(uint celt, string[] names, uint[] actual) - { - string[] platforms = this.GetPlatformsFromProject(); - return GetPlatforms(celt, names, actual, platforms); - } - - /// - /// Returns the set of platforms that are installed on the user's machine. - /// - /// Specifies the requested number of supported platform names. If this number is unknown, celt can be zero. - /// On input, an allocated array to hold the number of names specified by celt. This parameter can also be a null reference (Nothing in Visual Basic)if the celt parameter is zero. On output, names contains the names of supported platforms - /// The actual number of platform names returned. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetSupportedPlatformNames(uint celt, string[] names, uint[] actual) - { - string[] platforms = this.GetSupportedPlatformsFromProject(); - return GetPlatforms(celt, names, actual, platforms); - } - - /// - /// Assigns a new name to a configuration. - /// - /// The old name of the target configuration. - /// The new name of the target configuration. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int RenameCfgsOfCfgName(string old, string newname) - { - // First create the condition that represent the configuration we want to rename - string condition = String.Format(CultureInfo.InvariantCulture, configString, old).Trim(); - - foreach (ProjectPropertyGroupElement config in this.project.BuildProject.Xml.PropertyGroups) - { - // Only care about conditional property groups - if(config.Condition == null || config.Condition.Length == 0) - continue; - - // Skip if it isn't the group we want - if(String.Compare(config.Condition.Trim(), condition, StringComparison.OrdinalIgnoreCase) != 0) - continue; - - // Change the name - config.Condition = String.Format(CultureInfo.InvariantCulture, configString, newname); - // Update the name in our config list - if(configurationsList.ContainsKey(old)) - { - ProjectConfig configuration = configurationsList[old]; - configurationsList.Remove(old); - configurationsList.Add(newname, configuration); - // notify the configuration of its new name - configuration.ConfigName = newname; - } - - NotifyOnCfgNameRenamed(old, newname); - } - - return VSConstants.S_OK; - } - - /// - /// Cancels a registration for configuration event notification. - /// - /// The cookie used for registration. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int UnadviseCfgProviderEvents(uint cookie) - { - this.cfgEventSinks.RemoveAt(cookie); - return VSConstants.S_OK; - } - - /// - /// Registers the caller for configuration event notification. - /// - /// Reference to the IVsCfgProviderEvents interface to be called to provide notification of configuration events. - /// Reference to a token representing the completed registration - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int AdviseCfgProviderEvents(IVsCfgProviderEvents sink, out uint cookie) - { - cookie = this.cfgEventSinks.Add(sink); - return VSConstants.S_OK; - } - #endregion - - #region IVsExtensibleObject Members - - /// - /// Proved access to an IDispatchable object being a list of configuration properties - /// - /// Combined Name and Platform for the configuration requested - /// The IDispatchcable object - /// S_OK if successful - public virtual int GetAutomationObject(string configurationName, out object configurationProperties) - { - //Init out param - configurationProperties = null; - - string name, platform; - if(!ProjectConfig.TrySplitConfigurationCanonicalName(configurationName, out name, out platform)) - { - return VSConstants.E_INVALIDARG; - } - - // Get the configuration - IVsCfg cfg; - ErrorHandler.ThrowOnFailure(this.GetCfgOfName(name, platform, out cfg)); - - // Get the properties of the configuration - configurationProperties = ((ProjectConfig)cfg).ConfigurationProperties; - - return VSConstants.S_OK; - - } - #endregion - - #region helper methods - /// - /// Called when a new configuration name was added. - /// - /// The name of configuration just added. - private void NotifyOnCfgNameAdded(string name) - { - foreach(IVsCfgProviderEvents sink in this.cfgEventSinks) - { - ErrorHandler.ThrowOnFailure(sink.OnCfgNameAdded(name)); - } - } - - /// - /// Called when a config name was deleted. - /// - /// The name of the configuration. - private void NotifyOnCfgNameDeleted(string name) - { - foreach(IVsCfgProviderEvents sink in this.cfgEventSinks) - { - ErrorHandler.ThrowOnFailure(sink.OnCfgNameDeleted(name)); - } - } - - /// - /// Called when a config name was renamed - /// - /// Old configuration name - /// New configuration name - private void NotifyOnCfgNameRenamed(string oldName, string newName) - { - foreach(IVsCfgProviderEvents sink in this.cfgEventSinks) - { - ErrorHandler.ThrowOnFailure(sink.OnCfgNameRenamed(oldName, newName)); - } - } - - /// - /// Called when a platform name was added - /// - /// The name of the platform. - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - private void NotifyOnPlatformNameAdded(string platformName) - { - foreach(IVsCfgProviderEvents sink in this.cfgEventSinks) - { - ErrorHandler.ThrowOnFailure(sink.OnPlatformNameAdded(platformName)); - } - } - - /// - /// Called when a platform name was deleted - /// - /// The name of the platform. - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - private void NotifyOnPlatformNameDeleted(string platformName) - { - foreach(IVsCfgProviderEvents sink in this.cfgEventSinks) - { - ErrorHandler.ThrowOnFailure(sink.OnPlatformNameDeleted(platformName)); - } - } - - /// - /// Gets all the platforms defined in the project - /// - /// An array of platform names. - private string[] GetPlatformsFromProject() - { - string[] platforms = GetPropertiesConditionedOn(ProjectFileConstants.Platform); - - if(platforms == null || platforms.Length == 0) - { - return new string[] { x86Platform, AnyCPUPlatform }; - } - - for(int i = 0; i < platforms.Length; i++) - { - platforms[i] = ConvertPlatformToVsProject(platforms[i]); - } - - return platforms; - } - - /// - /// Return the supported platform names. - /// - /// An array of supported platform names. - private string[] GetSupportedPlatformsFromProject() - { - string platforms = this.ProjectMgr.BuildProject.GetPropertyValue(ProjectFileConstants.AvailablePlatforms); - - if(platforms == null) - { - return new string[] { }; - } - - if(platforms.Contains(",")) - { - return platforms.Split(','); - } - - return new string[] { platforms }; - } - - /// - /// Helper function to convert AnyCPU to Any CPU. - /// - /// The oldname. - /// The new name. - private static string ConvertPlatformToVsProject(string oldPlatformName) - { - if(String.Compare(oldPlatformName, ProjectFileValues.AnyCPU, StringComparison.OrdinalIgnoreCase) == 0) - { - return AnyCPUPlatform; - } - - return oldPlatformName; - } - - /// - /// Common method for handling platform names. - /// - /// Specifies the requested number of platform names. If this number is unknown, celt can be zero. - /// On input, an allocated array to hold the number of platform names specified by celt. This parameter can also be null if the celt parameter is zero. On output, names contains platform names - /// A count of the actual number of platform names returned. - /// An array of available platform names - /// A count of the actual number of platform names returned. - /// The platforms array is never null. It is assured by the callers. - private static int GetPlatforms(uint celt, string[] names, uint[] actual, string[] platforms) - { - Debug.Assert(platforms != null, "The plaforms array should never be null"); - if(names == null) - { - if(actual == null || actual.Length == 0) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "actual"); - } - - actual[0] = (uint)platforms.Length; - return VSConstants.S_OK; - } - - //Degenarate case - if(celt == 0) - { - if(actual != null && actual.Length != 0) - { - actual[0] = (uint)platforms.Length; - } - - return VSConstants.S_OK; - } - - uint returned = 0; - for(int i = 0; i < platforms.Length && names.Length > returned; i++) - { - names[returned] = platforms[i]; - returned++; - } - - if(actual != null && actual.Length != 0) - { - actual[0] = returned; - } - - if(celt > returned) - { - return VSConstants.S_FALSE; - } - - return VSConstants.S_OK; - } - #endregion - - /// - /// Get all the configurations in the project. - /// - private string[] GetPropertiesConditionedOn(string constant) - { - List configurations = null; - this.project.BuildProject.ReevaluateIfNecessary(); - this.project.BuildProject.ConditionedProperties.TryGetValue(constant, out configurations); - - return (configurations == null) ? new string[] { } : configurations.ToArray(); - } - - } -} diff --git a/source/Archive/MPF/12.0/ConfigurationProperties.cs b/source/Archive/MPF/12.0/ConfigurationProperties.cs deleted file mode 100644 index 5ed18296b7..0000000000 --- a/source/Archive/MPF/12.0/ConfigurationProperties.cs +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines the config dependent properties exposed through automation - /// - [ComVisible(true)] - [Guid("21f73a8f-91d7-4085-9d4f-c48ee235ee5b")] - public interface IProjectConfigProperties - { - string OutputPath { get; set; } - } - - /// - /// Implements the configuration dependent properties interface - /// - - [ClassInterface(ClassInterfaceType.None)] - public class ProjectConfigProperties : IProjectConfigProperties - { - #region fields - private ProjectConfig projectConfig; - #endregion - - #region ctors - public ProjectConfigProperties(ProjectConfig projectConfig) - { - this.projectConfig = projectConfig; - } - #endregion - - #region IProjectConfigProperties Members - - public virtual string OutputPath - { - get - { - return this.projectConfig.GetConfigurationProperty(BuildPropertyPageTag.OutputPath.ToString(), true); - } - set - { - this.projectConfig.SetConfigurationProperty(BuildPropertyPageTag.OutputPath.ToString(), value); - } - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/DataObject.cs b/source/Archive/MPF/12.0/DataObject.cs deleted file mode 100644 index 88e5f52f69..0000000000 --- a/source/Archive/MPF/12.0/DataObject.cs +++ /dev/null @@ -1,630 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; - -namespace Microsoft.VisualStudio.Project -{ - internal enum tagDVASPECT - { - DVASPECT_CONTENT = 1, - DVASPECT_THUMBNAIL = 2, - DVASPECT_ICON = 4, - DVASPECT_DOCPRINT = 8 - } - - internal enum tagTYMED - { - TYMED_HGLOBAL = 1, - TYMED_FILE = 2, - TYMED_ISTREAM = 4, - TYMED_ISTORAGE = 8, - TYMED_GDI = 16, - TYMED_MFPICT = 32, - TYMED_ENHMF = 64, - TYMED_NULL = 0 - } - - internal sealed class DataCacheEntry : IDisposable - { - #region fields - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - - private FORMATETC format; - - private long data; - - private DATADIR dataDir; - - private bool isDisposed; - #endregion - - #region properties - internal FORMATETC Format - { - get - { - return this.format; - } - } - - internal long Data - { - get - { - return this.data; - } - } - - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal DATADIR DataDir - { - get - { - return this.dataDir; - } - } - - #endregion - - /// - /// The IntPtr is data allocated that should be removed. It is allocated by the ProcessSelectionData method. - /// - internal DataCacheEntry(FORMATETC fmt, IntPtr data, DATADIR dir) - { - this.format = fmt; - this.data = (long)data; - this.dataDir = dir; - } - - #region Dispose - ~DataCacheEntry() - { - Dispose(false); - } - - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// The method that does the cleanup. - /// - /// - private void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simulteniously. - lock(Mutex) - { - if(disposing && this.data != 0) - { - Marshal.FreeHGlobal((IntPtr)this.data); - this.data = 0; - } - - this.isDisposed = true; - } - } - } - #endregion - } - - /// - /// Unfortunately System.Windows.Forms.IDataObject and - /// Microsoft.VisualStudio.OLE.Interop.IDataObject are different... - /// - internal sealed class DataObject : IDataObject - { - #region fields - internal const int DATA_S_SAMEFORMATETC = 0x00040130; - EventSinkCollection map; - ArrayList entries; - #endregion - - internal DataObject() - { - this.map = new EventSinkCollection(); - this.entries = new ArrayList(); - } - - internal void SetData(FORMATETC format, IntPtr data) - { - this.entries.Add(new DataCacheEntry(format, data, DATADIR.DATADIR_SET)); - } - - #region IDataObject methods - int IDataObject.DAdvise(FORMATETC[] e, uint adv, IAdviseSink sink, out uint cookie) - { - if (e == null) - { - throw new ArgumentNullException("e"); - } - - STATDATA sdata = new STATDATA(); - - sdata.ADVF = adv; - sdata.FORMATETC = e[0]; - sdata.pAdvSink = sink; - cookie = this.map.Add(sdata); - sdata.dwConnection = cookie; - return 0; - } - - void IDataObject.DUnadvise(uint cookie) - { - this.map.RemoveAt(cookie); - } - - int IDataObject.EnumDAdvise(out IEnumSTATDATA e) - { - e = new EnumSTATDATA((IEnumerable)this.map); - return 0; //?? - } - - int IDataObject.EnumFormatEtc(uint direction, out IEnumFORMATETC penum) - { - penum = new EnumFORMATETC((DATADIR)direction, (IEnumerable)this.entries); - return 0; - } - - int IDataObject.GetCanonicalFormatEtc(FORMATETC[] format, FORMATETC[] fmt) - { - throw new System.Runtime.InteropServices.COMException("", DATA_S_SAMEFORMATETC); - } - - void IDataObject.GetData(FORMATETC[] fmt, STGMEDIUM[] m) - { - STGMEDIUM retMedium = new STGMEDIUM(); - - if(fmt == null || fmt.Length < 1) - return; - - foreach(DataCacheEntry e in this.entries) - { - if(e.Format.cfFormat == fmt[0].cfFormat /*|| fmt[0].cfFormat == InternalNativeMethods.CF_HDROP*/) - { - retMedium.tymed = e.Format.tymed; - - // Caller must delete the memory. - retMedium.unionmember = DragDropHelper.CopyHGlobal(new IntPtr(e.Data)); - break; - } - } - - if(m != null && m.Length > 0) - m[0] = retMedium; - } - - void IDataObject.GetDataHere(FORMATETC[] fmt, STGMEDIUM[] m) - { - } - - int IDataObject.QueryGetData(FORMATETC[] fmt) - { - if(fmt == null || fmt.Length < 1) - return VSConstants.S_FALSE; - - foreach(DataCacheEntry e in this.entries) - { - if(e.Format.cfFormat == fmt[0].cfFormat /*|| fmt[0].cfFormat == InternalNativeMethods.CF_HDROP*/) - return VSConstants.S_OK; - } - - return VSConstants.S_FALSE; - } - - void IDataObject.SetData(FORMATETC[] fmt, STGMEDIUM[] m, int fRelease) - { - } - #endregion - } - - [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] - internal static class DragDropHelper - { -#pragma warning disable 414 - internal static readonly ushort CF_VSREFPROJECTITEMS; - internal static readonly ushort CF_VSSTGPROJECTITEMS; - internal static readonly ushort CF_VSPROJECTCLIPDESCRIPTOR; -#pragma warning restore 414 - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] - static DragDropHelper() - { - CF_VSREFPROJECTITEMS = UnsafeNativeMethods.RegisterClipboardFormat("CF_VSREFPROJECTITEMS"); - CF_VSSTGPROJECTITEMS = UnsafeNativeMethods.RegisterClipboardFormat("CF_VSSTGPROJECTITEMS"); - CF_VSPROJECTCLIPDESCRIPTOR = UnsafeNativeMethods.RegisterClipboardFormat("CF_PROJECTCLIPBOARDDESCRIPTOR"); - } - - - public static FORMATETC CreateFormatEtc(ushort iFormat) - { - FORMATETC fmt = new FORMATETC(); - fmt.cfFormat = iFormat; - fmt.ptd = IntPtr.Zero; - fmt.dwAspect = (uint)DVASPECT.DVASPECT_CONTENT; - fmt.lindex = -1; - fmt.tymed = (uint)TYMED.TYMED_HGLOBAL; - return fmt; - } - - public static int QueryGetData(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, ref FORMATETC fmtetc) - { - int returnValue = VSConstants.E_FAIL; - FORMATETC[] af = new FORMATETC[1]; - af[0] = fmtetc; - try - { - int result = ErrorHandler.ThrowOnFailure(pDataObject.QueryGetData(af)); - if(result == VSConstants.S_OK) - { - fmtetc = af[0]; - returnValue = VSConstants.S_OK; - } - } - catch(COMException e) - { - Trace.WriteLine("COMException : " + e.Message); - returnValue = e.ErrorCode; - } - - return returnValue; - } - - public static STGMEDIUM GetData(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, ref FORMATETC fmtetc) - { - FORMATETC[] af = new FORMATETC[1]; - af[0] = fmtetc; - STGMEDIUM[] sm = new STGMEDIUM[1]; - pDataObject.GetData(af, sm); - fmtetc = af[0]; - return sm[0]; - } - - /// - /// Retrives data from a VS format. - /// - public static List GetDroppedFiles(ushort format, Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject, out DropDataType ddt) - { - ddt = DropDataType.None; - List droppedFiles = new List(); - - // try HDROP - FORMATETC fmtetc = CreateFormatEtc(format); - - if(QueryGetData(dataObject, ref fmtetc) == VSConstants.S_OK) - { - STGMEDIUM stgmedium = DragDropHelper.GetData(dataObject, ref fmtetc); - if(stgmedium.tymed == (uint)TYMED.TYMED_HGLOBAL) - { - // We are releasing the cloned hglobal here. - IntPtr dropInfoHandle = stgmedium.unionmember; - if(dropInfoHandle != IntPtr.Zero) - { - ddt = DropDataType.Shell; - try - { - uint numFiles = UnsafeNativeMethods.DragQueryFile(dropInfoHandle, 0xFFFFFFFF, null, 0); - - // We are a directory based project thus a projref string is placed on the clipboard. - // We assign the maximum length of a projref string. - // The format of a projref is : || - uint lenght = (uint)Guid.Empty.ToString().Length + 2 * NativeMethods.MAX_PATH + 2; - char[] moniker = new char[lenght + 1]; - for(uint fileIndex = 0; fileIndex < numFiles; fileIndex++) - { - uint queryFileLength = UnsafeNativeMethods.DragQueryFile(dropInfoHandle, fileIndex, moniker, lenght); - string filename = new String(moniker, 0, (int)queryFileLength); - droppedFiles.Add(filename); - } - } - finally - { - Marshal.FreeHGlobal(dropInfoHandle); - } - } - } - } - - return droppedFiles; - } - - - - public static string GetSourceProjectPath(Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject) - { - string projectPath = null; - FORMATETC fmtetc = CreateFormatEtc(CF_VSPROJECTCLIPDESCRIPTOR); - - if(QueryGetData(dataObject, ref fmtetc) == VSConstants.S_OK) - { - STGMEDIUM stgmedium = DragDropHelper.GetData(dataObject, ref fmtetc); - if(stgmedium.tymed == (uint)TYMED.TYMED_HGLOBAL) - { - // We are releasing the cloned hglobal here. - IntPtr dropInfoHandle = stgmedium.unionmember; - if(dropInfoHandle != IntPtr.Zero) - { - try - { - string path = GetData(dropInfoHandle); - - // Clone the path that we can release our memory. - if(!String.IsNullOrEmpty(path)) - { - projectPath = String.Copy(path); - } - } - finally - { - Marshal.FreeHGlobal(dropInfoHandle); - } - } - } - } - - return projectPath; - } - - /// - /// Returns the data packed after the DROPFILES structure. - /// - /// - /// - internal static string GetData(IntPtr dropHandle) - { - IntPtr data = UnsafeNativeMethods.GlobalLock(dropHandle); - try - { - _DROPFILES df = (_DROPFILES)Marshal.PtrToStructure(data, typeof(_DROPFILES)); - if(df.fWide != 0) - { - IntPtr pdata = new IntPtr((long)data + df.pFiles); - return Marshal.PtrToStringUni(pdata); - } - } - finally - { - if(data != null) - { - UnsafeNativeMethods.GlobalUnLock(data); - } - } - - return null; - } - - internal static IntPtr CopyHGlobal(IntPtr data) - { - IntPtr src = UnsafeNativeMethods.GlobalLock(data); - int size = UnsafeNativeMethods.GlobalSize(data); - IntPtr ptr = Marshal.AllocHGlobal(size); - IntPtr buffer = UnsafeNativeMethods.GlobalLock(ptr); - - try - { - for(int i = 0; i < size; i++) - { - byte val = Marshal.ReadByte(new IntPtr((long)src + i)); - - Marshal.WriteByte(new IntPtr((long)buffer + i), val); - } - } - finally - { - if(buffer != IntPtr.Zero) - { - UnsafeNativeMethods.GlobalUnLock(buffer); - } - - if(src != IntPtr.Zero) - { - UnsafeNativeMethods.GlobalUnLock(src); - } - } - return ptr; - } - - internal static void CopyStringToHGlobal(string s, IntPtr data, int bufferSize) - { - Int16 nullTerminator = 0; - int dwSize = Marshal.SizeOf(nullTerminator); - - if((s.Length + 1) * Marshal.SizeOf(s[0]) > bufferSize) - throw new System.IO.InternalBufferOverflowException(); - // IntPtr memory already locked... - for(int i = 0, len = s.Length; i < len; i++) - { - Marshal.WriteInt16(data, i * dwSize, s[i]); - } - // NULL terminate it - Marshal.WriteInt16(new IntPtr((long)data + (s.Length * dwSize)), nullTerminator); - } - - } // end of dragdrophelper - - internal class EnumSTATDATA : IEnumSTATDATA - { - IEnumerable i; - - IEnumerator e; - - public EnumSTATDATA(IEnumerable i) - { - this.i = i; - this.e = i.GetEnumerator(); - } - - void IEnumSTATDATA.Clone(out IEnumSTATDATA clone) - { - clone = new EnumSTATDATA(i); - } - - int IEnumSTATDATA.Next(uint celt, STATDATA[] d, out uint fetched) - { - uint rc = 0; - //uint size = (fetched != null) ? fetched[0] : 0; - for(uint i = 0; i < celt; i++) - { - if(e.MoveNext()) - { - STATDATA sdata = (STATDATA)e.Current; - - rc++; - if(d != null && d.Length > i) - { - d[i] = sdata; - } - } - } - - fetched = rc; - return 0; - } - - int IEnumSTATDATA.Reset() - { - e.Reset(); - return 0; - } - - int IEnumSTATDATA.Skip(uint celt) - { - for(uint i = 0; i < celt; i++) - { - e.MoveNext(); - } - - return 0; - } - } - - internal class EnumFORMATETC : IEnumFORMATETC - { - IEnumerable cache; // of DataCacheEntrys. - - DATADIR dir; - - IEnumerator e; - - public EnumFORMATETC(DATADIR dir, IEnumerable cache) - { - this.cache = cache; - this.dir = dir; - e = cache.GetEnumerator(); - } - - void IEnumFORMATETC.Clone(out IEnumFORMATETC clone) - { - clone = new EnumFORMATETC(dir, cache); - } - - int IEnumFORMATETC.Next(uint celt, FORMATETC[] d, uint[] fetched) - { - uint rc = 0; - //uint size = (fetched != null) ? fetched[0] : 0; - for(uint i = 0; i < celt; i++) - { - if(e.MoveNext()) - { - DataCacheEntry entry = (DataCacheEntry)e.Current; - - rc++; - if(d != null && d.Length > i) - { - d[i] = entry.Format; - } - } - else - { - return VSConstants.S_FALSE; - } - } - - if(fetched != null && fetched.Length > 0) - fetched[0] = rc; - return VSConstants.S_OK; - } - - int IEnumFORMATETC.Reset() - { - e.Reset(); - return 0; - } - - int IEnumFORMATETC.Skip(uint celt) - { - for(uint i = 0; i < celt; i++) - { - e.MoveNext(); - } - - return 0; - } - } -} diff --git a/source/Archive/MPF/12.0/DependentFileNode.cs b/source/Archive/MPF/12.0/DependentFileNode.cs deleted file mode 100644 index fa376ab0d8..0000000000 --- a/source/Archive/MPF/12.0/DependentFileNode.cs +++ /dev/null @@ -1,183 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using System.Text; -using Microsoft.VisualStudio; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines the logic for all dependent file nodes (solution explorer icon, commands etc.) - /// - - [ComVisible(true)] - public class DependentFileNode : FileNode - { - #region fields - /// - /// Defines if the node has a name relation to its parent node - /// e.g. Form1.ext and Form1.resx are name related (until first occurence of extention separator) - /// - #endregion - - #region Properties - public override int ImageIndex - { - get { return (this.CanShowDefaultIcon() ? (int)ProjectNode.ImageName.DependentFile : (int)ProjectNode.ImageName.MissingFile); } - } - #endregion - - #region ctor - /// - /// Constructor for the DependentFileNode - /// - /// Root of the hierarchy - /// Associated project element - public DependentFileNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.HasParentNodeNameRelation = false; - } - - - #endregion - - #region overridden methods - /// - /// Disable rename - /// - /// new label - /// E_NOTIMPLE in order to tell the call that we do not support rename - public override string GetEditLabel() - { - throw new NotImplementedException(); - } - - /// - /// Gets a handle to the icon that should be set for this node - /// - /// Whether the folder is open, ignored here. - /// Handle to icon for the node - public override object GetIconHandle(bool open) - { - return this.ProjectMgr.ImageHandler.GetIconHandle(this.ImageIndex); - } - - /// - /// Disable certain commands for dependent file nodes - /// - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if(cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch((VsCommands)cmd) - { - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Cut: - case VsCommands.Rename: - result |= QueryStatusResult.NOTSUPPORTED; - return VSConstants.S_OK; - - case VsCommands.ViewCode: - case VsCommands.Open: - case VsCommands.OpenWith: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.EXCLUDEFROMPROJECT) - { - result |= QueryStatusResult.NOTSUPPORTED; - return VSConstants.S_OK; - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - /// - /// DependentFileNodes node cannot be dragged. - /// - /// null - protected internal override StringBuilder PrepareSelectedNodesForClipBoard() - { - return null; - } - - protected override NodeProperties CreatePropertiesObject() - { - return new DependentFileNodeProperties(this); - } - - /// - /// Redraws the state icon if the node is not excluded from source control. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - protected internal override void UpdateSccStateIcons() - { - if(!this.ExcludeNodeFromScc) - { - this.Parent.ReDraw(UIHierarchyElement.SccState); - } - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/DesignPropertyDescriptor.cs b/source/Archive/MPF/12.0/DesignPropertyDescriptor.cs deleted file mode 100644 index 0f5b69a85c..0000000000 --- a/source/Archive/MPF/12.0/DesignPropertyDescriptor.cs +++ /dev/null @@ -1,249 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.ComponentModel; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// The purpose of DesignPropertyDescriptor is to allow us to customize the - /// display name of the property in the property grid. None of the CLR - /// implementations of PropertyDescriptor allow you to change the DisplayName. - /// - public class DesignPropertyDescriptor : PropertyDescriptor - { - private string displayName; // Custom display name - private PropertyDescriptor property; // Base property descriptor - private Hashtable editors = new Hashtable(); // Type -> editor instance - private TypeConverter converter; - - - /// - /// Delegates to base. - /// - public override string DisplayName - { - get - { - return this.displayName; - } - } - - /// - /// Delegates to base. - /// - public override Type ComponentType - { - get - { - return this.property.ComponentType; - } - } - - /// - /// Delegates to base. - /// - public override bool IsReadOnly - { - get - { - return this.property.IsReadOnly; - } - } - - /// - /// Delegates to base. - /// - public override Type PropertyType - { - get - { - return this.property.PropertyType; - } - } - - - /// - /// Delegates to base. - /// - public override object GetEditor(Type editorBaseType) - { - object editor = this.editors[editorBaseType]; - if(editor == null) - { - for(int i = 0; i < this.Attributes.Count; i++) - { - EditorAttribute attr = Attributes[i] as EditorAttribute; - if(attr == null) - { - continue; - } - Type editorType = Type.GetType(attr.EditorBaseTypeName); - if(editorBaseType == editorType) - { - Type type = GetTypeFromNameProperty(attr.EditorTypeName); - if(type != null) - { - editor = CreateInstance(type); - this.editors[type] = editor; // cache it - break; - } - } - } - } - return editor; - } - - - /// - /// Return type converter for property - /// - public override TypeConverter Converter - { - get - { - if(converter == null) - { - PropertyPageTypeConverterAttribute attr = (PropertyPageTypeConverterAttribute)Attributes[typeof(PropertyPageTypeConverterAttribute)]; - if(attr != null && attr.ConverterType != null) - { - converter = (TypeConverter)CreateInstance(attr.ConverterType); - } - - if(converter == null) - { - converter = TypeDescriptor.GetConverter(this.PropertyType); - } - } - return converter; - } - } - - - - /// - /// Convert name to a Type object. - /// - public virtual Type GetTypeFromNameProperty(string typeName) - { - return Type.GetType(typeName); - } - - - /// - /// Delegates to base. - /// - public override bool CanResetValue(object component) - { - bool result = this.property.CanResetValue(component); - return result; - } - - /// - /// Delegates to base. - /// - public override object GetValue(object component) - { - object value = this.property.GetValue(component); - return value; - } - - /// - /// Delegates to base. - /// - public override void ResetValue(object component) - { - this.property.ResetValue(component); - } - - /// - /// Delegates to base. - /// - public override void SetValue(object component, object value) - { - this.property.SetValue(component, value); - } - - /// - /// Delegates to base. - /// - public override bool ShouldSerializeValue(object component) - { - bool result = this.property.ShouldSerializeValue(component); - return result; - } - - /// - /// Constructor. Copy the base property descriptor and also hold a pointer - /// to it for calling its overridden abstract methods. - /// - public DesignPropertyDescriptor(PropertyDescriptor prop) - : base(prop) - { - if (prop == null) - { - throw new ArgumentNullException("prop"); - } - - this.property = prop; - - DisplayNameAttribute attr = prop.Attributes[typeof(DisplayNameAttribute)] as DisplayNameAttribute; - - if(attr != null) - { - this.displayName = attr.DisplayName; - } - else - { - this.displayName = prop.Name; - } - } - } -} diff --git a/source/Archive/MPF/12.0/DesignTimeAssemblyResolution.cs b/source/Archive/MPF/12.0/DesignTimeAssemblyResolution.cs deleted file mode 100644 index 6ee078a6f3..0000000000 --- a/source/Archive/MPF/12.0/DesignTimeAssemblyResolution.cs +++ /dev/null @@ -1,645 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.Build.Framework; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Build.Utilities; -using Microsoft.Build.Execution; -using System.IO; -using System.Globalization; - -namespace Microsoft.VisualStudio.Project -{ - public class DesignTimeAssemblyResolution - { - private const string OriginalItemSpec = "originalItemSpec"; - - private const string FoundAssemblyVersion = "Version"; - - private const string HighestVersionInRedistList = "HighestVersionInRedist"; - - private const string OutOfRangeDependencies = "OutOfRangeDependencies"; - - private RarInputs rarInputs; - - public bool EnableLogging { get; set; } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", MessageId = "GetFrameworkPaths")] - public virtual void Initialize(ProjectNode projectNode) - { - if (projectNode == null) - { - throw new ArgumentNullException("projectNode"); - } - - if (projectNode.CallMSBuild("GetFrameworkPaths") != MSBuildResult.Successful) - { - throw new InvalidOperationException("Build of GetFrameworkPaths failed."); - } - - this.rarInputs = new RarInputs(projectNode.CurrentConfig); - } - - public virtual VsResolvedAssemblyPath[] Resolve(IEnumerable assemblies) - { - if (assemblies == null) - { - throw new ArgumentNullException("assemblies"); - } - - // Resolve references WITHOUT invoking MSBuild to avoid re-entrancy problems. - const bool projectDtar = true; - var rar = new Microsoft.Build.Tasks.ResolveAssemblyReference(); - var engine = new MockEngine(EnableLogging); - rar.BuildEngine = engine; - - // first set common properties/items then if projectDtar then set additional projectDtar properties - ITaskItem[] assemblyItems = assemblies.Select(assembly => new TaskItem(assembly)).ToArray(); - rar.Assemblies = assemblyItems; - rar.SearchPaths = rarInputs.PdtarSearchPaths; - - rar.TargetFrameworkDirectories = rarInputs.TargetFrameworkDirectories; - rar.AllowedAssemblyExtensions = rarInputs.AllowedAssemblyExtensions; - rar.TargetProcessorArchitecture = rarInputs.TargetProcessorArchitecture; - rar.TargetFrameworkVersion = rarInputs.TargetFrameworkVersion; - rar.TargetFrameworkMoniker = rarInputs.TargetFrameworkMoniker; - rar.TargetFrameworkMonikerDisplayName = rarInputs.TargetFrameworkMonikerDisplayName; - rar.TargetedRuntimeVersion = rarInputs.TargetedRuntimeVersion; - rar.FullFrameworkFolders = rarInputs.FullFrameworkFolders; - rar.LatestTargetFrameworkDirectories = rarInputs.LatestTargetFrameworkDirectories; - rar.FullTargetFrameworkSubsetNames = rarInputs.FullTargetFrameworkSubsetNames; - rar.FullFrameworkAssemblyTables = rarInputs.FullFrameworkAssemblyTables; - rar.IgnoreDefaultInstalledAssemblySubsetTables = rarInputs.IgnoreDefaultInstalledAssemblySubsetTables; - rar.ProfileName = rarInputs.ProfileName; - - rar.Silent = !this.EnableLogging; - rar.FindDependencies = true; - rar.AutoUnify = false; - rar.FindSatellites = false; - rar.FindSerializationAssemblies = false; - rar.FindRelatedFiles = false; - - // This set needs to be kept in sync with the set of project instance data that - // is populated into RarInputs - if (projectDtar) - { - // set project dtar specific properties - rar.CandidateAssemblyFiles = rarInputs.CandidateAssemblyFiles; - rar.StateFile = rarInputs.StateFile; - rar.InstalledAssemblySubsetTables = rarInputs.InstalledAssemblySubsetTables; - rar.TargetFrameworkSubsets = rarInputs.TargetFrameworkSubsets; - } - - IEnumerable results; - - try - { - rar.Execute(); - results = FilterResults(rar.ResolvedFiles).Select(pair => new VsResolvedAssemblyPath - { - bstrOrigAssemblySpec = pair.Key, - bstrResolvedAssemblyPath = pair.Value, - }); - } - catch (Exception ex) - { - if (ErrorHandler.IsCriticalException(ex)) - { - throw; - } - - engine.RecordRARExecutionException(ex); - results = Enumerable.Empty(); - } - finally - { - if (this.EnableLogging) - { - WriteLogFile(engine, projectDtar, assemblies); - } - } - - return results.ToArray(); - } - - private static IEnumerable> FilterResults(IEnumerable resolvedFiles) - { - foreach (ITaskItem resolvedFile in resolvedFiles) - { - bool bAddResolvedAssemblyToResultList = true; - - // excludeVersionWarningsFromResult - string foundAssemblyVersion = resolvedFile.GetMetadata(FoundAssemblyVersion); - string highestVersionInRedist = resolvedFile.GetMetadata(HighestVersionInRedistList); - - Version asmVersion = null; - bool parsedAsmVersion = Version.TryParse(foundAssemblyVersion, out asmVersion); - - Version redistVersion = null; - bool parsedRedistVersion = Version.TryParse(highestVersionInRedist, out redistVersion); - - if ((parsedAsmVersion && parsedRedistVersion) && asmVersion > redistVersion) - { - // if the version of the assembly is greater than the highest version - for that assembly - found in - // the chained(possibly) redist lists; then the assembly does not belong to the target framework - bAddResolvedAssemblyToResultList = false; - } - - // check outOfRangeDependencies - string outOfRangeDependencies = resolvedFile.GetMetadata(OutOfRangeDependencies); - if (!String.IsNullOrEmpty(outOfRangeDependencies)) - { - // This metadata is a semi-colon delimited list of dependent assembly names which target - // a higher framework. If this metadata is NOT EMPTY then - // the current assembly does have dependencies which are greater than the current target framework - - // so let's exclude this assembly - bAddResolvedAssemblyToResultList = false; - } - - if (bAddResolvedAssemblyToResultList) - { - yield return new KeyValuePair(resolvedFile.GetMetadata(OriginalItemSpec), resolvedFile.ItemSpec); - } - } - } - - private static void WriteLogFile(MockEngine engine, bool projectDtar, IEnumerable assemblies) - { - string logFilePrefix = projectDtar ? "P" : "G"; - - string logFilePath = Path.Combine(Path.GetTempPath(), logFilePrefix + @"Dtar" + (Guid.NewGuid()).ToString("N", CultureInfo.InvariantCulture) + ".log"); - - StringBuilder inputs = new StringBuilder(); - - Array.ForEach(assemblies.ToArray(), assembly => { inputs.Append(assembly); inputs.Append(";"); inputs.Append("\n"); }); - - string logAssemblies = "Inputs: \n" + inputs.ToString() + "\n\n"; - - string finalLog = logAssemblies + engine.Log; - - string[] finalLogLines = finalLog.Split(new char[] { '\n' }); - - File.WriteAllLines(logFilePath, finalLogLines); - } - - /// - /// Engine required by RAR, primarily for collecting logs - /// - private class MockEngine : IBuildEngine - { - private int messages = 0; - private int warnings = 0; - private int errors = 0; - private StringBuilder log = new StringBuilder(); - private readonly bool enableLog = false; - - internal MockEngine(bool enableLog) - { - this.enableLog = enableLog; - } - - public void RecordRARExecutionException(Exception ex) - { - if (!enableLog) return; - - log.Append(String.Format(CultureInfo.InvariantCulture, "{0}", ex.ToString())); - } - - public void LogErrorEvent(BuildErrorEventArgs eventArgs) - { - if (eventArgs == null) - { - throw new ArgumentNullException("eventArgs"); - } - - if (!enableLog) return; - - if (eventArgs.File != null && eventArgs.File.Length > 0) - { - log.Append(String.Format(CultureInfo.InvariantCulture, "{0}({1},{2}): ", eventArgs.File, eventArgs.LineNumber, eventArgs.ColumnNumber)); - } - - log.Append("ERROR "); - log.Append(eventArgs.Code); - log.Append(": "); - ++errors; - - log.AppendLine(eventArgs.Message); - } - - public void LogWarningEvent(BuildWarningEventArgs eventArgs) - { - if (eventArgs == null) - { - throw new ArgumentNullException("eventArgs"); - } - - if (!enableLog) return; - - if (eventArgs.File != null && eventArgs.File.Length > 0) - { - log.Append(String.Format(CultureInfo.InvariantCulture, "{0}({1},{2}): ", eventArgs.File, eventArgs.LineNumber, eventArgs.ColumnNumber)); - } - - log.Append("WARNING "); - log.Append(eventArgs.Code); - log.Append(": "); - ++warnings; - - log.AppendLine(eventArgs.Message); - } - - public void LogCustomEvent(CustomBuildEventArgs eventArgs) - { - if (eventArgs == null) - { - throw new ArgumentNullException("eventArgs"); - } - - if (!enableLog) return; - - log.Append(eventArgs.Message); - log.Append("\n"); - } - - public void LogMessageEvent(BuildMessageEventArgs eventArgs) - { - if (eventArgs == null) - { - throw new ArgumentNullException("eventArgs"); - } - - log.Append(eventArgs.Message); - log.Append("\n"); - - ++messages; - } - - public bool ContinueOnError - { - get { return false; } - } - - public string ProjectFileOfTaskNode - { - get { return String.Empty; } - } - - public int LineNumberOfTaskNode - { - get { return 0; } - } - - public int ColumnNumberOfTaskNode - { - get { return 0; } - } - - internal string Log - { - get { return log.ToString(); } - } - - public bool BuildProjectFile(string projectFileName, string[] targetNames, System.Collections.IDictionary globalProperties, System.Collections.IDictionary targetOutputs) - { - throw new NotImplementedException(); - } - } - - /// - /// Accesssor for RAR related properties in the projectInstance. - /// See ResolveAssemblyReferennce task msdn docs for member descriptions - /// - private class RarInputs - { - #region private fields - - // RAR related property/item names etc - private const string TargetFrameworkDirectory = "TargetFrameworkDirectory"; - private const string RegistrySearchPathFormat = "Registry:{0},{1},{2}{3}"; - private const string FrameworkRegistryBase = "FrameworkRegistryBase"; - private const string TargetFrameworkVersionName = "TargetFrameworkVersion"; - private const string AssemblyFoldersSuffix = "AssemblyFoldersSuffix"; - private const string AssemblyFoldersExConditions = "AssemblyFoldersExConditions"; - private const string AllowedReferenceAssemblyFileExtensions = "AllowedReferenceAssemblyFileExtensions"; - private const string ProcessorArchitecture = "ProcessorArchitecture"; - private const string TargetFrameworkMonikerName = "TargetFrameworkMoniker"; - private const string TargetFrameworkMonikerDisplayNameName = "TargetFrameworkMonikerDisplayName"; - private const string TargetedRuntimeVersionName = "TargetedRuntimeVersion"; - private const string FullFrameworkReferenceAssemblyPaths = "_FullFrameworkReferenceAssemblyPaths"; - private const string TargetFrameworkProfile = "TargetFrameworkProfile"; - - private const string ProjectDesignTimeAssemblyResolutionSearchPaths = "ProjectDesignTimeAssemblyResolutionSearchPaths"; - private const string Content = "Content"; - private const string None = "None"; - private const string RARResolvedReferencePath = "ReferencePath"; - private const string IntermediateOutputPath = "IntermediateOutputPath"; - private const string InstalledAssemblySubsetTablesName = "InstalledAssemblySubsetTables"; - private const string IgnoreInstalledAssemblySubsetTables = "IgnoreInstalledAssemblySubsetTables"; - private const string ReferenceInstalledAssemblySubsets = "_ReferenceInstalledAssemblySubsets"; - private const string FullReferenceAssemblyNames = "FullReferenceAssemblyNames"; - private const string LatestTargetFrameworkDirectoriesName = "LatestTargetFrameworkDirectories"; - private const string FullFrameworkAssemblyTablesName = "FullFrameworkAssemblyTables"; - private const string MSBuildProjectDirectory = "MSBuildProjectDirectory"; - - #endregion //private fields - - public string[] TargetFrameworkDirectories { get; private set; } - public string[] AllowedAssemblyExtensions { get; private set; } - public string TargetProcessorArchitecture { get; private set; } - public string TargetFrameworkVersion { get; private set; } - public string TargetFrameworkMoniker { get; private set; } - public string TargetFrameworkMonikerDisplayName { get; private set; } - public string TargetedRuntimeVersion { get; private set; } - public string[] FullFrameworkFolders { get; private set; } - public string ProfileName { get; private set; } - public string[] PdtarSearchPaths { get; private set; } - public string[] CandidateAssemblyFiles { get; private set; } - public string StateFile { get; private set; } - public ITaskItem[] InstalledAssemblySubsetTables { get; private set; } - public bool IgnoreDefaultInstalledAssemblySubsetTables { get; private set; } - public string[] TargetFrameworkSubsets { get; private set; } - public string[] FullTargetFrameworkSubsetNames { get; private set; } - public ITaskItem[] FullFrameworkAssemblyTables { get; private set; } - public string[] LatestTargetFrameworkDirectories { get; private set; } - - #region constructors - public RarInputs(ProjectInstance projectInstance) - { - // Run through all of the entries we want to extract from the project instance before we discard it to save memory - TargetFrameworkDirectories = GetTargetFrameworkDirectories(projectInstance); - AllowedAssemblyExtensions = GetAllowedAssemblyExtensions(projectInstance); - TargetProcessorArchitecture = GetTargetProcessorArchitecture(projectInstance); - TargetFrameworkVersion = GetTargetFrameworkVersion(projectInstance); - TargetFrameworkMoniker = GetTargetFrameworkMoniker(projectInstance); - TargetFrameworkMonikerDisplayName = GetTargetFrameworkMonikerDisplayName(projectInstance); - TargetedRuntimeVersion = GetTargetedRuntimeVersion(projectInstance); - FullFrameworkFolders = GetFullFrameworkFolders(projectInstance); - LatestTargetFrameworkDirectories = GetLatestTargetFrameworkDirectories(projectInstance); - FullTargetFrameworkSubsetNames = GetFullTargetFrameworkSubsetNames(projectInstance); - FullFrameworkAssemblyTables = GetFullFrameworkAssemblyTables(projectInstance); - IgnoreDefaultInstalledAssemblySubsetTables = GetIgnoreDefaultInstalledAssemblySubsetTables(projectInstance); - ProfileName = GetProfileName(projectInstance); - - /* - * rar.CandidateAssemblyFiles = rarInputs.CandidateAssemblyFiles; - rar.StateFile = rarInputs.StateFile; - rar.InstalledAssemblySubsetTables = rarInputs.InstalledAssemblySubsetTables; - rar.TargetFrameworkSubsets = rarInputs.TargetFrameworkSubsets; - */ - - // This set needs to be kept in sync with the set of project instance data that - // is passed into Rar - PdtarSearchPaths = GetPdtarSearchPaths(projectInstance); - - CandidateAssemblyFiles = GetCandidateAssemblyFiles(projectInstance); - StateFile = GetStateFile(projectInstance); - InstalledAssemblySubsetTables = GetInstalledAssemblySubsetTables(projectInstance); - TargetFrameworkSubsets = GetTargetFrameworkSubsets(projectInstance); - } - #endregion // constructors - - #region public properties - - #region common properties/items - - private string[] GetTargetFrameworkDirectories(ProjectInstance projectInstance) - { - if (TargetFrameworkDirectories == null) - { - string val = projectInstance.GetPropertyValue(TargetFrameworkDirectory).Trim(); - - TargetFrameworkDirectories = val.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries) - .Select(s => s.Trim()) - .Where(s => s.Length > 0) - .ToArray(); - } - - return TargetFrameworkDirectories; - } - - private static string[] GetAllowedAssemblyExtensions(ProjectInstance projectInstance) - { - string[] allowedAssemblyExtensions; - - string val = projectInstance.GetPropertyValue(AllowedReferenceAssemblyFileExtensions).Trim(); - - allowedAssemblyExtensions = val.Split(';').Select(s => s.Trim()).ToArray(); - - return allowedAssemblyExtensions; - } - - private static string GetTargetProcessorArchitecture(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(ProcessorArchitecture).Trim(); - - return val; - } - - private static string GetTargetFrameworkVersion(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(TargetFrameworkVersionName).Trim(); - - return val; - } - - private static string GetTargetFrameworkMoniker(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(TargetFrameworkMonikerName).Trim(); - - return val; - } - - private static string GetTargetFrameworkMonikerDisplayName(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(TargetFrameworkMonikerDisplayNameName).Trim(); - - return val; - } - - private static string GetTargetedRuntimeVersion(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(TargetedRuntimeVersionName).Trim(); - - return val; - } - - private static string[] GetFullFrameworkFolders(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(FullFrameworkReferenceAssemblyPaths).Trim(); - - string[] _fullFrameworkFolders = val.Split(';').Select(s => s.Trim()).ToArray(); - - return _fullFrameworkFolders; - } - - private static string[] GetLatestTargetFrameworkDirectories(ProjectInstance projectInstance) - { - IEnumerable taskItems = projectInstance.GetItems(LatestTargetFrameworkDirectoriesName); - - string[] latestTargetFrameworkDirectory = (taskItems.Select((Func)((item) => { return item.ItemSpec.Trim(); }))).ToArray(); - - return latestTargetFrameworkDirectory; - } - - private static string GetProfileName(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(TargetFrameworkProfile).Trim(); - - return val; - } - #endregion //common properties/items - - #region project dtar specific properties/items - - private static string[] GetPdtarSearchPaths(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(ProjectDesignTimeAssemblyResolutionSearchPaths).Trim(); - - string[] _pdtarSearchPaths = val.Split(';').Select(s => s.Trim()).ToArray(); - - return _pdtarSearchPaths; - } - - private static string[] GetCandidateAssemblyFiles(ProjectInstance projectInstance) - { - var candidateAssemblyFilesList = new List(); - - candidateAssemblyFilesList.AddRange(projectInstance.GetItems(Content)); - candidateAssemblyFilesList.AddRange(projectInstance.GetItems(None)); - candidateAssemblyFilesList.AddRange(projectInstance.GetItems(RARResolvedReferencePath)); - - string[] candidateAssemblyFiles = candidateAssemblyFilesList.Select((Func)((item) => { return item.GetMetadataValue("FullPath").Trim(); })).ToArray(); - - return candidateAssemblyFiles; - } - - private static string GetStateFile(ProjectInstance projectInstance) - { - string intermediatePath = projectInstance.GetPropertyValue(IntermediateOutputPath).Trim(); - - intermediatePath = GetFullPathInProjectContext(projectInstance, intermediatePath); - - string stateFile = Path.Combine(intermediatePath, "DesignTimeResolveAssemblyReferences.cache"); - - return stateFile; - } - - private static ITaskItem[] GetInstalledAssemblySubsetTables(ProjectInstance projectInstance) - { - return projectInstance.GetItems(InstalledAssemblySubsetTablesName).ToArray(); - } - - private static bool GetIgnoreDefaultInstalledAssemblySubsetTables(ProjectInstance projectInstance) - { - bool ignoreDefaultInstalledAssemblySubsetTables = false; - - string val = projectInstance.GetPropertyValue(IgnoreInstalledAssemblySubsetTables).Trim(); - - if (!String.IsNullOrEmpty(val)) - { - if (val == Boolean.TrueString || val == Boolean.FalseString) - { - ignoreDefaultInstalledAssemblySubsetTables = Convert.ToBoolean(val, CultureInfo.InvariantCulture); - } - } - - return ignoreDefaultInstalledAssemblySubsetTables; - } - - private static string[] GetTargetFrameworkSubsets(ProjectInstance projectInstance) - { - IEnumerable taskItems = projectInstance.GetItems(ReferenceInstalledAssemblySubsets); - - string[] targetFrameworkSubsets = (taskItems.Select((Func)((item) => { return item.ItemSpec.Trim(); }))).ToArray(); - - return targetFrameworkSubsets; - } - - private static string[] GetFullTargetFrameworkSubsetNames(ProjectInstance projectInstance) - { - string val = projectInstance.GetPropertyValue(FullReferenceAssemblyNames).Trim(); - - string[] fullTargetFrameworkSubsetNames = val.Split(';').Select(s => s.Trim()).ToArray(); - - return fullTargetFrameworkSubsetNames; - } - - private static ITaskItem[] GetFullFrameworkAssemblyTables(ProjectInstance projectInstance) - { - return projectInstance.GetItems(FullFrameworkAssemblyTablesName).ToArray(); - } - - #endregion //project dtar specific properties/items - - #endregion // public properties - - #region private methods - static string GetFullPathInProjectContext(ProjectInstance projectInstance, string path) - { - string fullPath = path; - - if (!Path.IsPathRooted(path)) - { - string projectDir = projectInstance.GetPropertyValue(MSBuildProjectDirectory).Trim(); - - fullPath = Path.Combine(projectDir, path); - - fullPath = Path.GetFullPath(fullPath); - } - - return fullPath; - } - #endregion // private methods - } - } -} diff --git a/source/Archive/MPF/12.0/Diagrams/AutomationClasses.cd b/source/Archive/MPF/12.0/Diagrams/AutomationClasses.cd deleted file mode 100644 index 579933f3e2..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/AutomationClasses.cd +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - AAAAAJAAAAAAMAAAAAAAAAAAAAAAAAACgBABAAAAAAA= - Automation\OAFileItem.cs - - - - - - AEQAAAAAEABACBAAAAgASAQkCAgAIAAAAgAAAAAAACQ= - Automation\OANavigableProjectItems.cs - - - - - - - AAQAAJQAAABEUIIhQAAcCAQAAAkAAAAAIBgFCABCAAA= - Automation\OAProject.cs - - - - - - - - - - AQQAQJAAAABEYAAgQACMDCQBCAkAAAACgBAFAAECAAA= - Automation\OAProjectItem.cs - - - - - - - AEAAAAAAEAAAAAAAAAAgAAAggAAAAAAAAAAAAAAAACA= - Automation\OAProjectItems.cs - - - - - - EAYAAAACABAAABAAIAAAQCQEAAIAAAAIAAAAAAECAAA= - Automation\OAProperties.cs - - - - - - - AQSAAAAAABAAQAJgAAAQQAQAgAAAAAAAAAAgAAAAAAA= - Automation\OAProperty.cs - - - - - - - AAAAABAAAAAAAAAAAAAAACAAAAAACAAAAAAAAAAAAAA= - Automation\OANestedProjectItem.cs - - - - - - AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ= - Automation\OAReferenceFolderItem.cs - - - - - - AUQAAAAAAAAAAAAAAAAAQAAgAAIAAAAAAAQAAAAEAAA= - Automation\OASolutionFolder.cs - - - - - - - AAAAAAAAAAAAYAAAAAAAAAQAAAEAAAAAAAAAAAAAAAA= - Automation\OAReferenceItem.cs - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Diagrams/ConfigurationClasses.cd b/source/Archive/MPF/12.0/Diagrams/ConfigurationClasses.cd deleted file mode 100644 index d8f0733824..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/ConfigurationClasses.cd +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - AAAAAQQAAAAAAAAAAAAAgAAACAgAQBAAAAAAAACAABA= - Output.cs - - - - - - - AAAAIgABgwTAAAAAAAAAiAAAAIgEQAAggAAAEASAABA= - OutputGroup.cs - - - - - - - AAgCEEJABBAAkaSFCGCkAAEAAEiBYEEKACAAGRDJUEA= - ProjectConfig.cs - - - - - - - AABCAAAACgAACAAAAABABAEIAAQAgAAAIABAEABQAAA= - ProjectConfig.cs - - - - - - - gAWAgFQBAAJIAhACAAgCABAEAQ5MAAAABCAEEAAAEQQ= - ConfigProvider.cs - - - - - - - AgAEAEACAAAAAAQApAQAAgAUABAAA4AAQAIAAAAAgiA= - ProjectElement.cs - - - - - - PcP89b7sGr3/n1KfHv7+dr/f9h//71+3/xPdS+fRan4= - ProjectNode.CopyPaste.cs - - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Diagrams/DocumentManagerClasses.cd b/source/Archive/MPF/12.0/Diagrams/DocumentManagerClasses.cd deleted file mode 100644 index 112e417f91..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/DocumentManagerClasses.cd +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - FileDocumentManager.cs - AACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - DocumentManager.cs - AQCAQIQAAAAAIAEAAAAAAAAAIAAAAAAAAAAAACGAAAE= - - - - - - - - - - - - ProjectDesignerDocumentManager.cs - AACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - HierarchyNode.cs - NKl4a26oCodRuoDQodAKZKQQxKtwgtmAOJLYAHLHccE= - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Diagrams/HierarchyClasses.cd b/source/Archive/MPF/12.0/Diagrams/HierarchyClasses.cd deleted file mode 100644 index ecdc3b906c..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/HierarchyClasses.cd +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - BolBCECAAgFAAIEAgBACZAAAAAAAAAAQyAQQAIRGQIA= - FileNode.cs - - - - - - PcP89b7sGr3/n1KfHv7+dr/f9h//71+3/xPdS+fRan4= - ProjectNode.CopyPaste.cs - - - - - - - NKl4K26oqqdRuqD4sdAKZLc0zKtxgtmgOJLYADLHccE= - HierarchyNode.cs - - - - - - - AABFCBAAAAYgAAAgQAAAAAAEQMABAAAATAWAAAABAAE= - ProjectContainerNode.cs - - - - - - - BIAQEAKAAgFAAAAAgIACJAAABAICAAAACAAQAAACAQA= - FolderNode.cs - - - - - - AIBAAGagAAFAAAAAgACiIAAAAAAQAAEAGAAQAABAAAA= - ReferenceNode.cs - - - - - - AABICACgAAUAAIAgggACIABAAAYQQAAAGEIQAABAARA= - ReferenceContainerNode.cs - - - - - - - AACACCIAAAIAACQgQAAEBAQAgACAAAABCAgQAQACIAA= - ComReferenceNode.cs - - - - - - CIACCFYCAgAAgAEgAIACBAQAAAAQABAACAAAAECACgA= - ProjectReferenceNode.cs - - - - - - AAACCCJAACAACAAgEAoAAAACBABACIAIGAAAEACAABw= - AssemblyReferenceNode.cs - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Diagrams/PropertiesClasses.cd b/source/Archive/MPF/12.0/Diagrams/PropertiesClasses.cd deleted file mode 100644 index 3e804f2e2a..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/PropertiesClasses.cd +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - AAAACAAACAAAAAAgAAAAgAAAABAEIAAAAERAAAAACAA= - LocalizableProperties.cs - - - - - - - CAAAAAAgAAAAAAAAAAAAAAAAAAAAIQAAAAAAAABAAAA= - NodeProperties.cs - - - - - - CAAAAAAAAAAAAAAAAAAAAAQAAAAAIAAAAAAAAAAAAAA= - NodeProperties.cs - - - - - - EQACAAAAAAAAAQAAAAAECAQAAAkgAggAAAhECAEAAAA= - NodeProperties.cs - - - - - - - CAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABAAAA= - NodeProperties.cs - - - - - - AAABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgQAYA= - NodeProperties.cs - - - - - - CAAAAAAAABAAAAAAAAAAAAAAAAAgIAgAAAQAAABAAAA= - NodeProperties.cs - - - - - - CAAAAAAABAAAAAAAAAAAAAAAAAAAIAAAAAAAAABAAAA= - NodeProperties.cs - - - - - - CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - NodeProperties.cs - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Diagrams/ReferenceClasses.cd b/source/Archive/MPF/12.0/Diagrams/ReferenceClasses.cd deleted file mode 100644 index a8dd97e00e..0000000000 --- a/source/Archive/MPF/12.0/Diagrams/ReferenceClasses.cd +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - ReferenceNode.cs - - - - - AIBAAGagAAFAAAAAgACiIAAAAAAQAAEAGAAQAABAAAA= - ReferenceNode.cs - - - - - - - - - - - - - - - CIACCFYCAgAAgAEgAIACBAQAAAAQABAACAAAAECACgA= - ProjectReferenceNode.cs - - - - - - - - - - - - AAAQAAYAAAQAgAAQAEAAAAAAAAAAAAAAEQAAAACAAAA= - BuildDependency.cs - - - - - - - AACACCIAAAIAACQgQAAEBAQAgACAAAABCAgQAQACIAA= - ComReferenceNode.cs - - - - - - AAAAAAAAAAAAAAAAAQAAIAAAAgAAAAAIAAAAgABAAAA= - SolutionListenerForProjectReferenceUpdate.cs - - - - - - AAIACRBQoCAQCCAAEAIAJAAACgQBAAAYAQAiiAIAAAA= - SolutionListener.cs - - - - - - - AAACCCJAACAACAAgEAoAAAACBABACIAIGAAAEACAABw= - AssemblyReferenceNode.cs - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/DocumentManager.cs b/source/Archive/MPF/12.0/DocumentManager.cs deleted file mode 100644 index b0cc51cda5..0000000000 --- a/source/Archive/MPF/12.0/DocumentManager.cs +++ /dev/null @@ -1,383 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This abstract class handles opening, saving of items in the hierarchy. - /// - - public abstract class DocumentManager - { - #region fields - private HierarchyNode node = null; - #endregion - - #region properties - protected HierarchyNode Node - { - get - { - return this.node; - } - } - #endregion - - #region ctors - protected DocumentManager(HierarchyNode node) - { - this.node = node; - } - #endregion - - #region virtual methods - - /// - /// Open a document using the standard editor. This method has no implementation since a document is abstract in this context - /// - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// IntPtr to the IUnknown interface of the existing document data object - /// A reference to the window frame that is mapped to the document - /// Determine the UI action on the document window - /// NotImplementedException - /// See FileDocumentManager class for an implementation of this method - public virtual int Open(ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - throw new NotImplementedException(); - } - - /// - /// Open a document using a specific editor. This method has no implementation. - /// - /// Specifies actions to take when opening a specific editor. Possible editor flags are defined in the enumeration Microsoft.VisualStudio.Shell.Interop.__VSOSPEFLAGS - /// Unique identifier of the editor type - /// Name of the physical view. If null, the environment calls MapLogicalView on the editor factory to determine the physical view that corresponds to the logical view. In this case, null does not specify the primary view, but rather indicates that you do not know which view corresponds to the logical view - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// IntPtr to the IUnknown interface of the existing document data object - /// A reference to the window frame that is mapped to the document - /// Determine the UI action on the document window - /// NotImplementedException - /// See FileDocumentManager for an implementation of this method - public virtual int OpenWithSpecific(uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame frame, WindowFrameShowAction windowFrameAction) - { - throw new NotImplementedException(); - } - - /// - /// Close an open document window - /// - /// Decides how to close the document - /// S_OK if successful, otherwise an error is returned - public virtual int Close(__FRAMECLOSE closeFlag) - { - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - // Get info about the document - bool isDirty, isOpen, isOpenedByUs; - uint docCookie; - IVsPersistDocData ppIVsPersistDocData; - this.GetDocInfo(out isOpen, out isDirty, out isOpenedByUs, out docCookie, out ppIVsPersistDocData); - - if(isOpenedByUs) - { - IVsUIShellOpenDocument shell = this.Node.ProjectMgr.Site.GetService(typeof(IVsUIShellOpenDocument)) as IVsUIShellOpenDocument; - Guid logicalView = Guid.Empty; - uint grfIDO = 0; - IVsUIHierarchy pHierOpen; - uint[] itemIdOpen = new uint[1]; - IVsWindowFrame windowFrame; - int fOpen; - ErrorHandler.ThrowOnFailure(shell.IsDocumentOpen(this.Node.ProjectMgr.InteropSafeIVsUIHierarchy, this.Node.ID, this.Node.Url, ref logicalView, grfIDO, out pHierOpen, itemIdOpen, out windowFrame, out fOpen)); - - if(windowFrame != null) - { - docCookie = 0; - return windowFrame.CloseFrame((uint)closeFlag); - } - } - - return VSConstants.S_OK; - } - - /// - /// Silently saves an open document - /// - /// Save the open document only if it is dirty - /// The call to SaveDocData may return Microsoft.VisualStudio.Shell.Interop.PFF_RESULTS.STG_S_DATALOSS to indicate some characters could not be represented in the current codepage - public virtual void Save(bool saveIfDirty) - { - bool isDirty, isOpen, isOpenedByUs; - uint docCookie; - IVsPersistDocData persistDocData; - this.GetDocInfo(out isOpen, out isDirty, out isOpenedByUs, out docCookie, out persistDocData); - if(isDirty && saveIfDirty && persistDocData != null) - { - string name; - int cancelled; - ErrorHandler.ThrowOnFailure(persistDocData.SaveDocData(VSSAVEFLAGS.VSSAVE_SilentSave, out name, out cancelled)); - } - } - - #endregion - - #region helper methods - /// - /// Get document properties from RDT - /// - internal void GetDocInfo( - out bool isOpen, // true if the doc is opened - out bool isDirty, // true if the doc is dirty - out bool isOpenedByUs, // true if opened by our project - out uint docCookie, // VSDOCCOOKIE if open - out IVsPersistDocData persistDocData) - { - isOpen = isDirty = isOpenedByUs = false; - docCookie = (uint)ShellConstants.VSDOCCOOKIE_NIL; - persistDocData = null; - - if(this.node == null || this.node.ProjectMgr == null || this.node.ProjectMgr.IsClosed) - { - return; - } - - IVsHierarchy hierarchy; - uint vsitemid = VSConstants.VSITEMID_NIL; - - VsShellUtilities.GetRDTDocumentInfo(this.node.ProjectMgr.Site, this.node.Url, out hierarchy, out vsitemid, out persistDocData, out docCookie); - - if(hierarchy == null || docCookie == (uint)ShellConstants.VSDOCCOOKIE_NIL) - { - return; - } - - isOpen = true; - // check if the doc is opened by another project - if(Utilities.IsSameComObject(this.node.ProjectMgr.InteropSafeIVsHierarchy, hierarchy)) - { - isOpenedByUs = true; - } - - if(persistDocData != null) - { - int isDocDataDirty; - ErrorHandler.ThrowOnFailure(persistDocData.IsDocDataDirty(out isDocDataDirty)); - isDirty = (isDocDataDirty != 0); - } - } - - protected string GetOwnerCaption() - { - Debug.Assert(this.node != null, "No node has been initialized for the document manager"); - - object pvar; - ErrorHandler.ThrowOnFailure(this.node.GetProperty(this.node.ID, (int)__VSHPROPID.VSHPROPID_Caption, out pvar)); - - return (pvar as string); - } - - protected static void CloseWindowFrame(ref IVsWindowFrame windowFrame) - { - if(windowFrame != null) - { - try - { - ErrorHandler.ThrowOnFailure(windowFrame.CloseFrame(0)); - } - finally - { - windowFrame = null; - } - } - } - - protected string GetFullPathForDocument() - { - string fullPath = String.Empty; - - Debug.Assert(this.node != null, "No node has been initialized for the document manager"); - - // Get the URL representing the item - fullPath = this.node.GetMkDocument(); - - Debug.Assert(!String.IsNullOrEmpty(fullPath), "Could not retrive the fullpath for the node" + this.Node.ID.ToString(CultureInfo.CurrentCulture)); - return fullPath; - } - - #endregion - - #region static methods - /// - /// Updates the caption for all windows associated to the document. - /// - /// The service provider. - /// The new caption. - /// The IUnknown interface to a document data object associated with a registered document. - public static void UpdateCaption(IServiceProvider site, string caption, IntPtr docData) - { - if(site == null) - { - throw new ArgumentNullException("site"); - } - - if(String.IsNullOrEmpty(caption)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "caption"); - } - - IVsUIShell uiShell = site.GetService(typeof(SVsUIShell)) as IVsUIShell; - - // We need to tell the windows to update their captions. - IEnumWindowFrames windowFramesEnum; - ErrorHandler.ThrowOnFailure(uiShell.GetDocumentWindowEnum(out windowFramesEnum)); - IVsWindowFrame[] windowFrames = new IVsWindowFrame[1]; - uint fetched; - while(windowFramesEnum.Next(1, windowFrames, out fetched) == VSConstants.S_OK && fetched == 1) - { - IVsWindowFrame windowFrame = windowFrames[0]; - object data; - ErrorHandler.ThrowOnFailure(windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out data)); - IntPtr ptr = Marshal.GetIUnknownForObject(data); - try - { - if(ptr == docData) - { - ErrorHandler.ThrowOnFailure(windowFrame.SetProperty((int)__VSFPROPID.VSFPROPID_OwnerCaption, caption)); - } - } - finally - { - if(ptr != IntPtr.Zero) - { - Marshal.Release(ptr); - } - } - } - } - - /// - /// Rename document in the running document table from oldName to newName. - /// - /// The service provider. - /// Full path to the old name of the document. - /// Full path to the new name of the document. - /// The new item id of the document - public static void RenameDocument(IServiceProvider site, string oldName, string newName, uint newItemId) - { - if(site == null) - { - throw new ArgumentNullException("site"); - } - - if(String.IsNullOrEmpty(oldName)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "oldName"); - } - - if(String.IsNullOrEmpty(newName)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "newName"); - } - - if(newItemId == VSConstants.VSITEMID_NIL) - { - throw new ArgumentNullException("newItemId"); - } - - IVsRunningDocumentTable pRDT = site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - IVsUIShellOpenDocument doc = site.GetService(typeof(SVsUIShellOpenDocument)) as IVsUIShellOpenDocument; - - if(pRDT == null || doc == null) return; - - IVsHierarchy pIVsHierarchy; - uint itemId; - IntPtr docData; - uint uiVsDocCookie; - ErrorHandler.ThrowOnFailure(pRDT.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, oldName, out pIVsHierarchy, out itemId, out docData, out uiVsDocCookie)); - - if(docData != IntPtr.Zero) - { - try - { - IntPtr pUnk = Marshal.GetIUnknownForObject(pIVsHierarchy); - Guid iid = typeof(IVsHierarchy).GUID; - IntPtr pHier; - Marshal.QueryInterface(pUnk, ref iid, out pHier); - try - { - ErrorHandler.ThrowOnFailure(pRDT.RenameDocument(oldName, newName, pHier, newItemId)); - } - finally - { - if(pHier != IntPtr.Zero) - Marshal.Release(pHier); - if(pUnk != IntPtr.Zero) - Marshal.Release(pUnk); - } - } - finally - { - Marshal.Release(docData); - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/EnumDependencies.cs b/source/Archive/MPF/12.0/EnumDependencies.cs deleted file mode 100644 index fa8d73e348..0000000000 --- a/source/Archive/MPF/12.0/EnumDependencies.cs +++ /dev/null @@ -1,142 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - - public class EnumDependencies : IVsEnumDependencies - { - private List dependencyList = new List(); - - private uint nextIndex; - - public EnumDependencies(IList dependencyList) - { - if (dependencyList == null) - { - throw new ArgumentNullException("dependencyList"); - } - - foreach(IVsDependency dependency in dependencyList) - { - this.dependencyList.Add(dependency); - } - } - - public EnumDependencies(IList dependencyList) - { - if (dependencyList == null) - { - throw new ArgumentNullException("dependencyList"); - } - - foreach(IVsBuildDependency dependency in dependencyList) - { - this.dependencyList.Add(dependency); - } - } - - public int Clone(out IVsEnumDependencies enumDependencies) - { - enumDependencies = new EnumDependencies(this.dependencyList); - ErrorHandler.ThrowOnFailure(enumDependencies.Skip(this.nextIndex)); - return VSConstants.S_OK; - } - - public int Next(uint elements, IVsDependency[] dependencies, out uint elementsFetched) - { - elementsFetched = 0; - if (dependencies == null) - { - throw new ArgumentNullException("dependencies"); - } - - uint fetched = 0; - int count = this.dependencyList.Count; - - while(this.nextIndex < count && elements > 0 && fetched < count) - { - dependencies[fetched] = this.dependencyList[(int)this.nextIndex]; - this.nextIndex++; - fetched++; - elements--; - - } - - elementsFetched = fetched; - - // Did we get 'em all? - return (elements == 0 ? VSConstants.S_OK : VSConstants.S_FALSE); - } - - public int Reset() - { - this.nextIndex = 0; - return VSConstants.S_OK; - } - - public int Skip(uint elements) - { - this.nextIndex += elements; - uint count = (uint)this.dependencyList.Count; - - if(this.nextIndex > count) - { - this.nextIndex = count; - return VSConstants.S_FALSE; - } - - return VSConstants.S_OK; - } - } -} diff --git a/source/Archive/MPF/12.0/FileChangeManager.cs b/source/Archive/MPF/12.0/FileChangeManager.cs deleted file mode 100644 index af3bf7649a..0000000000 --- a/source/Archive/MPF/12.0/FileChangeManager.cs +++ /dev/null @@ -1,325 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This object is in charge of reloading nodes that have file monikers that can be listened to changes - /// - internal class FileChangeManager : IVsFileChangeEvents - { - #region nested objects - /// - /// Defines a data structure that can link a item moniker to the item and its file change cookie. - /// - private struct ObservedItemInfo - { - /// - /// Defines the id of the item that is to be reloaded. - /// - private uint itemID; - - /// - /// Defines the file change cookie that is returned when listening on file changes on the nested project item. - /// - private uint fileChangeCookie; - - /// - /// Defines the nested project item that is to be reloaded. - /// - internal uint ItemID - { - get - { - return this.itemID; - } - - set - { - this.itemID = value; - } - } - - /// - /// Defines the file change cookie that is returned when listenning on file changes on the nested project item. - /// - internal uint FileChangeCookie - { - get - { - return this.fileChangeCookie; - } - - set - { - this.fileChangeCookie = value; - } - } - } - #endregion - - #region Fields - /// - /// Event that is raised when one of the observed file names have changed on disk. - /// - internal event EventHandler FileChangedOnDisk; - - /// - /// Reference to the FileChange service. - /// - private IVsFileChangeEx fileChangeService; - - /// - /// Maps between the observed item identified by its filename (in canonicalized form) and the cookie used for subscribing - /// to the events. - /// - private Dictionary observedItems = new Dictionary(); - - /// - /// Has Disposed already been called? - /// - private bool disposed; - #endregion - - #region Constructor - /// - /// Overloaded ctor. - /// - /// An instance of a project item. - internal FileChangeManager(IServiceProvider serviceProvider) - { - #region input validation - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - #endregion - - this.fileChangeService = (IVsFileChangeEx)serviceProvider.GetService(typeof(SVsFileChangeEx)); - - if(this.fileChangeService == null) - { - // VS is in bad state, since the SVsFileChangeEx could not be proffered. - throw new InvalidOperationException(); - } - } - #endregion - - #region IDisposable Members - /// - /// Disposes resources. - /// - public void Dispose() - { - // Don't dispose more than once - if(this.disposed) - { - return; - } - - this.disposed = true; - - // Unsubscribe from the observed source files. - foreach(ObservedItemInfo info in this.observedItems.Values) - { - ErrorHandler.ThrowOnFailure(this.fileChangeService.UnadviseFileChange(info.FileChangeCookie)); - } - - // Clean the observerItems list - this.observedItems.Clear(); - } - #endregion - - #region IVsFileChangeEvents Members - /// - /// Called when one of the file have changed on disk. - /// - /// Number of files changed. - /// Array of file names. - /// Array of flags indicating the type of changes. See _VSFILECHANGEFLAGS. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - int IVsFileChangeEvents.FilesChanged(uint numberOfFilesChanged, string[] filesChanged, uint[] flags) - { - if (filesChanged == null) - { - throw new ArgumentNullException("filesChanged"); - } - - if (flags == null) - { - throw new ArgumentNullException("flags"); - } - - if(this.FileChangedOnDisk != null) - { - for(int i = 0; i < numberOfFilesChanged; i++) - { - string fullFileName = Utilities.CanonicalizeFileName(filesChanged[i]); - if(this.observedItems.ContainsKey(fullFileName)) - { - ObservedItemInfo info = this.observedItems[fullFileName]; - this.FileChangedOnDisk(this, new FileChangedOnDiskEventArgs(fullFileName, info.ItemID, (_VSFILECHANGEFLAGS)flags[i])); - } - } - } - - return VSConstants.S_OK; - } - - /// - /// Notifies clients of changes made to a directory. - /// - /// Name of the directory that had a change. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - int IVsFileChangeEvents.DirectoryChanged(string directory) - { - return VSConstants.S_OK; - } - #endregion - - #region helpers - /// - /// Observe when the given file is updated on disk. In this case we do not care about the item id that represents the file in the hierarchy. - /// - /// File to observe. - internal void ObserveItem(string fileName) - { - this.ObserveItem(fileName, VSConstants.VSITEMID_NIL); - } - - /// - /// Observe when the given file is updated on disk. - /// - /// File to observe. - /// The item id of the item to observe. - internal void ObserveItem(string fileName, uint id) - { - #region Input validation - if(String.IsNullOrEmpty(fileName)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "fileName"); - } - #endregion - - string fullFileName = Utilities.CanonicalizeFileName(fileName); - if(!this.observedItems.ContainsKey(fullFileName)) - { - // Observe changes to the file - uint fileChangeCookie; - ErrorHandler.ThrowOnFailure(this.fileChangeService.AdviseFileChange(fullFileName, (uint)(_VSFILECHANGEFLAGS.VSFILECHG_Time | _VSFILECHANGEFLAGS.VSFILECHG_Del), this, out fileChangeCookie)); - - ObservedItemInfo itemInfo = new ObservedItemInfo(); - itemInfo.ItemID = id; - itemInfo.FileChangeCookie = fileChangeCookie; - - // Remember that we're observing this file (used in FilesChanged event handler) - this.observedItems.Add(fullFileName, itemInfo); - } - } - - /// - /// Ignore item file changes for the specified item. - /// - /// File to ignore observing. - /// Flag indicating whether or not to ignore changes (1 to ignore, 0 to stop ignoring). - internal void IgnoreItemChanges(string fileName, bool ignore) - { - #region Input validation - if(String.IsNullOrEmpty(fileName)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "fileName"); - } - #endregion - - string fullFileName = Utilities.CanonicalizeFileName(fileName); - if(this.observedItems.ContainsKey(fullFileName)) - { - // Call ignore file with the flags specified. - ErrorHandler.ThrowOnFailure(this.fileChangeService.IgnoreFile(0, fileName, ignore ? 1 : 0)); - } - } - - /// - /// Stop observing when the file is updated on disk. - /// - /// File to stop observing. - internal void StopObservingItem(string fileName) - { - #region Input validation - if(String.IsNullOrEmpty(fileName)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "fileName"); - } - #endregion - - string fullFileName = Utilities.CanonicalizeFileName(fileName); - - if(this.observedItems.ContainsKey(fullFileName)) - { - // Get the cookie that was used for this.observedItems to this file. - ObservedItemInfo itemInfo = this.observedItems[fullFileName]; - - // Remove the file from our observed list. It's important that this is done before the call to - // UnadviseFileChange, because for some reason, the call to UnadviseFileChange can trigger a - // FilesChanged event, and we want to be able to filter that event away. - this.observedItems.Remove(fullFileName); - - // Stop observing the file - ErrorHandler.ThrowOnFailure(this.fileChangeService.UnadviseFileChange(itemInfo.FileChangeCookie)); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/FileDocumentManager.cs b/source/Archive/MPF/12.0/FileDocumentManager.cs deleted file mode 100644 index 946af5a757..0000000000 --- a/source/Archive/MPF/12.0/FileDocumentManager.cs +++ /dev/null @@ -1,306 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This class handles opening, saving of file items in the hierarchy. - /// - - public class FileDocumentManager : DocumentManager - { - #region ctors - - public FileDocumentManager(FileNode node) - : base(node) - { - } - #endregion - - #region overriden methods - - /// - /// Open a file using the standard editor - /// - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// IntPtr to the IUnknown interface of the existing document data object - /// A reference to the window frame that is mapped to the file - /// Determine the UI action on the document window - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int Open(ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - bool newFile = false; - bool openWith = false; - return this.Open(newFile, openWith, ref logicalView, docDataExisting, out windowFrame, windowFrameAction); - } - - /// - /// Open a file with a specific editor - /// - /// Specifies actions to take when opening a specific editor. Possible editor flags are defined in the enumeration Microsoft.VisualStudio.Shell.Interop.__VSOSPEFLAGS - /// Unique identifier of the editor type - /// Name of the physical view. If null, the environment calls MapLogicalView on the editor factory to determine the physical view that corresponds to the logical view. In this case, null does not specify the primary view, but rather indicates that you do not know which view corresponds to the logical view - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// IntPtr to the IUnknown interface of the existing document data object - /// A reference to the window frame that is mapped to the file - /// Determine the UI action on the document window - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int OpenWithSpecific(uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - windowFrame = null; - bool newFile = false; - bool openWith = false; - return this.Open(newFile, openWith, editorFlags, ref editorType, physicalView, ref logicalView, docDataExisting, out windowFrame, windowFrameAction); - } - - #endregion - - #region public methods - /// - /// Open a file in a document window with a std editor - /// - /// Open the file as a new file - /// Use a dialog box to determine which editor to use - /// Determine the UI action on the document window - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public int Open(bool newFile, bool openWith, WindowFrameShowAction windowFrameAction) - { - Guid logicalView = Guid.Empty; - IVsWindowFrame windowFrame = null; - return this.Open(newFile, openWith, logicalView, out windowFrame, windowFrameAction); - } - - /// - /// Open a file in a document window with a std editor - /// - /// Open the file as a new file - /// Use a dialog box to determine which editor to use - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// A reference to the window frame that is mapped to the file - /// Determine the UI action on the document window - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public int Open(bool newFile, bool openWith, Guid logicalView, out IVsWindowFrame frame, WindowFrameShowAction windowFrameAction) - { - frame = null; - IVsRunningDocumentTable rdt = this.Node.ProjectMgr.Site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - Debug.Assert(rdt != null, " Could not get running document table from the services exposed by this project"); - if(rdt == null) - { - return VSConstants.E_FAIL; - } - - // First we see if someone else has opened the requested view of the file. - _VSRDTFLAGS flags = _VSRDTFLAGS.RDT_NoLock; - uint itemid; - IntPtr docData = IntPtr.Zero; - IVsHierarchy ivsHierarchy; - uint docCookie; - string path = this.GetFullPathForDocument(); - int returnValue = VSConstants.S_OK; - - try - { - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)flags, path, out ivsHierarchy, out itemid, out docData, out docCookie)); - ErrorHandler.ThrowOnFailure(this.Open(newFile, openWith, ref logicalView, docData, out frame, windowFrameAction)); - } - catch(COMException e) - { - Trace.WriteLine("Exception :" + e.Message); - returnValue = e.ErrorCode; - } - finally - { - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - - return returnValue; - } - - #endregion - - #region virtual methods - /// - /// Open a file in a document window - /// - /// Open the file as a new file - /// Use a dialog box to determine which editor to use - /// In MultiView case determines view to be activated by IVsMultiViewDocumentView. For a list of logical view GUIDS, see constants starting with LOGVIEWID_ defined in NativeMethods class - /// IntPtr to the IUnknown interface of the existing document data object - /// A reference to the window frame that is mapped to the file - /// Determine the UI action on the document window - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int Open(bool newFile, bool openWith, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - windowFrame = null; - Guid editorType = Guid.Empty; - return this.Open(newFile, openWith, 0, ref editorType, null, ref logicalView, docDataExisting, out windowFrame, windowFrameAction); - } - - #endregion - - #region helper methods - - private int Open(bool newFile, bool openWith, uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - windowFrame = null; - if(this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - Debug.Assert(this.Node != null, "No node has been initialized for the document manager"); - Debug.Assert(this.Node.ProjectMgr != null, "No project manager has been initialized for the document manager"); - Debug.Assert(this.Node is FileNode, "Node is not FileNode object"); - - int returnValue = VSConstants.S_OK; - string caption = this.GetOwnerCaption(); - string fullPath = this.GetFullPathForDocument(); - - // Make sure that the file is on disk before we open the editor and display message if not found - if(!((FileNode)this.Node).IsFileOnDisk(true)) - { - // Inform clients that we have an invalid item (wrong icon) - this.Node.OnInvalidateItems(this.Node.Parent); - - // Bail since we are not able to open the item - // Do not return an error code otherwise an internal error message is shown. The scenario for this operation - // normally is already a reaction to a dialog box telling that the item has been removed. - return VSConstants.S_FALSE; - } - - IVsUIShellOpenDocument uiShellOpenDocument = this.Node.ProjectMgr.Site.GetService(typeof(SVsUIShellOpenDocument)) as IVsUIShellOpenDocument; - IOleServiceProvider serviceProvider = this.Node.ProjectMgr.Site.GetService(typeof(IOleServiceProvider)) as IOleServiceProvider; - - try - { - this.Node.ProjectMgr.OnOpenItem(fullPath); - int result = VSConstants.E_FAIL; - - if(openWith) - { - result = uiShellOpenDocument.OpenStandardEditor((uint)__VSOSEFLAGS.OSE_UseOpenWithDialog, fullPath, ref logicalView, caption, this.Node.ProjectMgr.InteropSafeIVsUIHierarchy, this.Node.ID, docDataExisting, serviceProvider, out windowFrame); - } - else - { - __VSOSEFLAGS openFlags = 0; - if(newFile) - { - openFlags |= __VSOSEFLAGS.OSE_OpenAsNewFile; - } - - //NOTE: we MUST pass the IVsProject in pVsUIHierarchy and the itemid - // of the node being opened, otherwise the debugger doesn't work. - if(editorType != Guid.Empty) - { - result = uiShellOpenDocument.OpenSpecificEditor(editorFlags, fullPath, ref editorType, physicalView, ref logicalView, caption, this.Node.ProjectMgr.InteropSafeIVsUIHierarchy, this.Node.ID, docDataExisting, serviceProvider, out windowFrame); - } - else - { - openFlags |= __VSOSEFLAGS.OSE_ChooseBestStdEditor; - result = uiShellOpenDocument.OpenStandardEditor((uint)openFlags, fullPath, ref logicalView, caption, this.Node.ProjectMgr.InteropSafeIVsUIHierarchy, this.Node.ID, docDataExisting, serviceProvider, out windowFrame); - } - } - - if(result != VSConstants.S_OK && result != VSConstants.S_FALSE && result != VSConstants.OLE_E_PROMPTSAVECANCELLED) - { - ErrorHandler.ThrowOnFailure(result); - } - - if(windowFrame != null) - { - object var; - - if(newFile) - { - ErrorHandler.ThrowOnFailure(windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocData, out var)); - IVsPersistDocData persistDocData = (IVsPersistDocData)var; - ErrorHandler.ThrowOnFailure(persistDocData.SetUntitledDocPath(fullPath)); - } - - var = null; - ErrorHandler.ThrowOnFailure(windowFrame.GetProperty((int)__VSFPROPID.VSFPROPID_DocCookie, out var)); - this.Node.DocCookie = (uint)(int)var; - - if(windowFrameAction == WindowFrameShowAction.Show) - { - ErrorHandler.ThrowOnFailure(windowFrame.Show()); - } - else if(windowFrameAction == WindowFrameShowAction.ShowNoActivate) - { - ErrorHandler.ThrowOnFailure(windowFrame.ShowNoActivate()); - } - else if(windowFrameAction == WindowFrameShowAction.Hide) - { - ErrorHandler.ThrowOnFailure(windowFrame.Hide()); - } - } - } - catch(COMException e) - { - Trace.WriteLine("Exception e:" + e.Message); - returnValue = e.ErrorCode; - CloseWindowFrame(ref windowFrame); - } - - return returnValue; - } - - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/FileNode.cs b/source/Archive/MPF/12.0/FileNode.cs deleted file mode 100644 index f71c194c3a..0000000000 --- a/source/Archive/MPF/12.0/FileNode.cs +++ /dev/null @@ -1,1121 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - - [ComVisible(true)] - public class FileNode : HierarchyNode - { - #region static fiels - private static Dictionary extensionIcons; - #endregion - - #region overriden Properties - /// - /// overwrites of the generic hierarchyitem. - /// - [System.ComponentModel.BrowsableAttribute(false)] - public override string Caption - { - get - { - // Use LinkedIntoProjectAt property if available - string caption = this.ItemNode.GetMetadata(ProjectFileConstants.LinkedIntoProjectAt); - if(caption == null || caption.Length == 0) - { - // Otherwise use filename - caption = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - caption = Path.GetFileName(caption); - } - return caption; - } - } - public override int ImageIndex - { - get - { - // Check if the file is there. - if(!this.CanShowDefaultIcon()) - { - return (int)ProjectNode.ImageName.MissingFile; - } - - //Check for known extensions - int imageIndex; - string extension = System.IO.Path.GetExtension(this.FileName); - if((string.IsNullOrEmpty(extension)) || (!extensionIcons.TryGetValue(extension, out imageIndex))) - { - // Missing or unknown extension; let the base class handle this case. - return base.ImageIndex; - } - - // The file type is known and there is an image for it in the image list. - return imageIndex; - } - } - - public override Guid ItemTypeGuid - { - get { return VSConstants.GUID_ItemType_PhysicalFile; } - } - - public override int MenuCommandId - { - get { return VsMenus.IDM_VS_CTXT_ITEMNODE; } - } - - public override string Url - { - get - { - string path = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - if(String.IsNullOrEmpty(path)) - { - return String.Empty; - } - - Url url; - if(Path.IsPathRooted(path)) - { - // Use absolute path - url = new Microsoft.VisualStudio.Shell.Url(path); - } - else - { - // Path is relative, so make it relative to project path - url = new Url(this.ProjectMgr.BaseURI, path); - } - return url.AbsoluteUrl; - - } - } - #endregion - - #region ctor - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] - static FileNode() - { - // Build the dictionary with the mapping between some well known extensions - // and the index of the icons inside the standard image list. - extensionIcons = new Dictionary(StringComparer.OrdinalIgnoreCase); - extensionIcons.Add(".aspx", (int)ProjectNode.ImageName.WebForm); - extensionIcons.Add(".asax", (int)ProjectNode.ImageName.GlobalApplicationClass); - extensionIcons.Add(".asmx", (int)ProjectNode.ImageName.WebService); - extensionIcons.Add(".ascx", (int)ProjectNode.ImageName.WebUserControl); - extensionIcons.Add(".asp", (int)ProjectNode.ImageName.ASPPage); - extensionIcons.Add(".config", (int)ProjectNode.ImageName.WebConfig); - extensionIcons.Add(".htm", (int)ProjectNode.ImageName.HTMLPage); - extensionIcons.Add(".html", (int)ProjectNode.ImageName.HTMLPage); - extensionIcons.Add(".css", (int)ProjectNode.ImageName.StyleSheet); - extensionIcons.Add(".xsl", (int)ProjectNode.ImageName.StyleSheet); - extensionIcons.Add(".vbs", (int)ProjectNode.ImageName.ScriptFile); - extensionIcons.Add(".js", (int)ProjectNode.ImageName.ScriptFile); - extensionIcons.Add(".wsf", (int)ProjectNode.ImageName.ScriptFile); - extensionIcons.Add(".txt", (int)ProjectNode.ImageName.TextFile); - extensionIcons.Add(".resx", (int)ProjectNode.ImageName.Resources); - extensionIcons.Add(".rc", (int)ProjectNode.ImageName.Resources); - extensionIcons.Add(".bmp", (int)ProjectNode.ImageName.Bitmap); - extensionIcons.Add(".ico", (int)ProjectNode.ImageName.Icon); - extensionIcons.Add(".gif", (int)ProjectNode.ImageName.Image); - extensionIcons.Add(".jpg", (int)ProjectNode.ImageName.Image); - extensionIcons.Add(".png", (int)ProjectNode.ImageName.Image); - extensionIcons.Add(".map", (int)ProjectNode.ImageName.ImageMap); - extensionIcons.Add(".wav", (int)ProjectNode.ImageName.Audio); - extensionIcons.Add(".mid", (int)ProjectNode.ImageName.Audio); - extensionIcons.Add(".midi", (int)ProjectNode.ImageName.Audio); - extensionIcons.Add(".avi", (int)ProjectNode.ImageName.Video); - extensionIcons.Add(".mov", (int)ProjectNode.ImageName.Video); - extensionIcons.Add(".mpg", (int)ProjectNode.ImageName.Video); - extensionIcons.Add(".mpeg", (int)ProjectNode.ImageName.Video); - extensionIcons.Add(".cab", (int)ProjectNode.ImageName.CAB); - extensionIcons.Add(".jar", (int)ProjectNode.ImageName.JAR); - extensionIcons.Add(".xslt", (int)ProjectNode.ImageName.XSLTFile); - extensionIcons.Add(".xsd", (int)ProjectNode.ImageName.XMLSchema); - extensionIcons.Add(".xml", (int)ProjectNode.ImageName.XMLFile); - extensionIcons.Add(".pfx", (int)ProjectNode.ImageName.PFX); - extensionIcons.Add(".snk", (int)ProjectNode.ImageName.SNK); - } - - /// - /// Constructor for the FileNode - /// - /// Root of the hierarchy - /// Associated project element - public FileNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - if(this.ProjectMgr.NodeHasDesigner(this.ItemNode.GetMetadata(ProjectFileConstants.Include))) - { - this.HasDesigner = true; - } - } - #endregion - - #region overridden methods - protected override NodeProperties CreatePropertiesObject() - { - ISingleFileGenerator generator = this.CreateSingleFileGenerator(); - - return generator == null ? new FileNodeProperties(this) : new SingleFileGeneratorNodeProperties(this); - } - - public override object GetIconHandle(bool open) - { - int index = this.ImageIndex; - if(NoImage == index) - { - // There is no image for this file; let the base class handle this case. - return base.GetIconHandle(open); - } - // Return the handle for the image. - return this.ProjectMgr.ImageHandler.GetIconHandle(index); - } - - /// - /// Get an instance of the automation object for a FileNode - /// - /// An instance of the Automation.OAFileNode if succeeded - public override object GetAutomationObject() - { - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return null; - } - - return new Automation.OAFileItem(this.ProjectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - /// - /// Renames a file node. - /// - /// The new name. - /// An errorcode for failure or S_OK. - /// - /// - /// We are going to throw instaed of showing messageboxes, since this method is called from various places where a dialog box does not make sense. - /// For example the FileNodeProperties are also calling this method. That should not show directly a messagebox. - /// Also the automation methods are also calling SetEditLabel - /// - - public override int SetEditLabel(string label) - { - // IMPORTANT NOTE: This code will be called when a parent folder is renamed. As such, it is - // expected that we can be called with a label which is the same as the current - // label and this should not be considered a NO-OP. - - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - // Validate the filename. - if(String.IsNullOrEmpty(label)) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture)); - } - else if(label.Length > NativeMethods.MAX_PATH) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), label)); - } - else if(Utilities.IsFileNameInvalid(label)) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture)); - } - - for(HierarchyNode n = this.Parent.FirstChild; n != null; n = n.NextSibling) - { - if(n != this && String.Compare(n.Caption, label, StringComparison.OrdinalIgnoreCase) == 0) - { - //A file or folder with the name '{0}' already exists on disk at this location. Please choose another name. - //If this file or folder does not appear in the Solution Explorer, then it is not currently part of your project. To view files which exist on disk, but are not in the project, select Show All Files from the Project menu. - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileOrFolderAlreadyExists, CultureInfo.CurrentUICulture), label)); - } - } - - string fileName = Path.GetFileNameWithoutExtension(label); - - // If there is no filename or it starts with a leading dot issue an error message and quit. - if(String.IsNullOrEmpty(fileName) || fileName[0] == '.') - { - throw new InvalidOperationException(SR.GetString(SR.FileNameCannotContainALeadingPeriod, CultureInfo.CurrentUICulture)); - } - - // Verify that the file extension is unchanged - string strRelPath = Path.GetFileName(this.ItemNode.GetMetadata(ProjectFileConstants.Include)); - if(String.Compare(Path.GetExtension(strRelPath), Path.GetExtension(label), StringComparison.OrdinalIgnoreCase) != 0) - { - // Prompt to confirm that they really want to change the extension of the file - string message = SR.GetString(SR.ConfirmExtensionChange, CultureInfo.CurrentUICulture, new string[] { label }); - IVsUIShell shell = this.ProjectMgr.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if(shell == null) - { - return VSConstants.E_FAIL; - } - - if(!VsShellUtilities.PromptYesNo(message, null, OLEMSGICON.OLEMSGICON_INFO, shell)) - { - // The user cancelled the confirmation for changing the extension. - // Return S_OK in order not to show any extra dialog box - return VSConstants.S_OK; - } - } - - - // Build the relative path by looking at folder names above us as one scenarios - // where we get called is when a folder above us gets renamed (in which case our path is invalid) - HierarchyNode parent = this.Parent; - while(parent != null && (parent is FolderNode)) - { - strRelPath = Path.Combine(parent.Caption, strRelPath); - parent = parent.Parent; - } - - return SetEditLabel(label, strRelPath); - } - - public override string GetMkDocument() - { - Debug.Assert(this.Url != null, "No url sepcified for this node"); - - return this.Url; - } - - /// - /// Delete the item corresponding to the specified path from storage. - /// - /// - protected internal override void DeleteFromStorage(string path) - { - if(File.Exists(path)) - { - File.SetAttributes(path, FileAttributes.Normal); // make sure it's not readonly. - File.Delete(path); - } - } - - /// - /// Rename the underlying document based on the change the user just made to the edit label. - /// - protected internal override int SetEditLabel(string label, string relativePath) - { - int returnValue = VSConstants.S_OK; - uint oldId = this.ID; - string strSavePath = Path.GetDirectoryName(relativePath); - - if(!Path.IsPathRooted(relativePath)) - { - strSavePath = Path.Combine(Path.GetDirectoryName(this.ProjectMgr.BaseURI.Uri.LocalPath), strSavePath); - } - - string newName = Path.Combine(strSavePath, label); - - if(NativeMethods.IsSamePath(newName, this.Url)) - { - // If this is really a no-op, then nothing to do - if(String.Compare(newName, this.Url, StringComparison.Ordinal) == 0) - return VSConstants.S_FALSE; - } - else - { - // If the renamed file already exists then quit (unless it is the result of the parent having done the move). - if(IsFileOnDisk(newName) - && (IsFileOnDisk(this.Url) - || String.Compare(Path.GetFileName(newName), Path.GetFileName(this.Url), StringComparison.Ordinal) != 0)) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileCannotBeRenamedToAnExistingFile, CultureInfo.CurrentUICulture), label)); - } - else if(newName.Length > NativeMethods.MAX_PATH) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), label)); - } - - } - - string oldName = this.Url; - // must update the caption prior to calling RenameDocument, since it may - // cause queries of that property (such as from open editors). - string oldrelPath = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - - try - { - if(!RenameDocument(oldName, newName)) - { - this.ItemNode.Rename(oldrelPath); - this.ItemNode.RefreshProperties(); - } - - if(this is DependentFileNode) - { - OnInvalidateItems(this.Parent); - } - - } - catch(Exception e) - { - // Just re-throw the exception so we don't get duplicate message boxes. - Trace.WriteLine("Exception : " + e.Message); - this.RecoverFromRenameFailure(newName, oldrelPath); - returnValue = Marshal.GetHRForException(e); - throw; - } - // Return S_FALSE if the hierarchy item id has changed. This forces VS to flush the stale - // hierarchy item id. - if(returnValue == (int)VSConstants.S_OK || returnValue == (int)VSConstants.S_FALSE || returnValue == VSConstants.OLE_E_PROMPTSAVECANCELLED) - { - return (oldId == this.ID) ? VSConstants.S_OK : (int)VSConstants.S_FALSE; - } - - return returnValue; - } - - /// - /// Returns a specific Document manager to handle files - /// - /// Document manager object - protected internal override DocumentManager GetDocumentManager() - { - return new FileDocumentManager(this); - } - - /// - /// Called by the drag&drop implementation to ask the node - /// which is being dragged/droped over which nodes should - /// process the operation. - /// This allows for dragging to a node that cannot contain - /// items to let its parent accept the drop, while a reference - /// node delegate to the project and a folder/project node to itself. - /// - /// - protected internal override HierarchyNode GetDragTargetHandlerNode() - { - Debug.Assert(this.ProjectMgr != null, " The project manager is null for the filenode"); - HierarchyNode handlerNode = this; - while(handlerNode != null && !(handlerNode is ProjectNode || handlerNode is FolderNode)) - handlerNode = handlerNode.Parent; - if(handlerNode == null) - handlerNode = this.ProjectMgr; - return handlerNode; - } - - protected override int ExecCommandOnNode(Guid cmdGroup, uint cmd, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) - { - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - // Exec on special filenode commands - if(cmdGroup == VsMenus.guidStandardCommandSet97) - { - IVsWindowFrame windowFrame = null; - - switch((VsCommands)cmd) - { - case VsCommands.ViewCode: - return ((FileDocumentManager)this.GetDocumentManager()).Open(false, false, VSConstants.LOGVIEWID_Code, out windowFrame, WindowFrameShowAction.Show); - - case VsCommands.ViewForm: - return ((FileDocumentManager)this.GetDocumentManager()).Open(false, false, VSConstants.LOGVIEWID_Designer, out windowFrame, WindowFrameShowAction.Show); - - case VsCommands.Open: - return ((FileDocumentManager)this.GetDocumentManager()).Open(false, false, WindowFrameShowAction.Show); - - case VsCommands.OpenWith: - return ((FileDocumentManager)this.GetDocumentManager()).Open(false, true, VSConstants.LOGVIEWID_UserChooseView, out windowFrame, WindowFrameShowAction.Show); - } - } - - // Exec on special filenode commands - if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch((VsCommands2K)cmd) - { - case VsCommands2K.RUNCUSTOMTOOL: - { - try - { - this.RunGenerator(); - return VSConstants.S_OK; - } - catch(Exception e) - { - Trace.WriteLine("Running Custom Tool failed : " + e.Message); - throw; - } - } - } - } - - return base.ExecCommandOnNode(cmdGroup, cmd, nCmdexecopt, pvaIn, pvaOut); - } - - - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if(cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch((VsCommands)cmd) - { - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Cut: - case VsCommands.Rename: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - - case VsCommands.ViewCode: - //case VsCommands.Delete: goto case VsCommands.OpenWith; - case VsCommands.Open: - case VsCommands.OpenWith: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.EXCLUDEFROMPROJECT) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - if((VsCommands2K)cmd == VsCommands2K.RUNCUSTOMTOOL) - { - if(string.IsNullOrEmpty(this.ItemNode.GetMetadata(ProjectFileConstants.DependentUpon)) && (this.NodeProperties is SingleFileGeneratorNodeProperties)) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - - protected override void DoDefaultAction() - { - CCITracing.TraceCall(); - FileDocumentManager manager = this.GetDocumentManager() as FileDocumentManager; - Debug.Assert(manager != null, "Could not get the FileDocumentManager"); - manager.Open(false, false, WindowFrameShowAction.Show); - } - - /// - /// Performs a SaveAs operation of an open document. Called from SaveItem after the running document table has been updated with the new doc data. - /// - /// A pointer to the document in the rdt - /// The new file path to the document - /// - protected override int AfterSaveItemAs(IntPtr docData, string newFilePath) - { - if(String.IsNullOrEmpty(newFilePath)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "newFilePath"); - } - - int returnCode = VSConstants.S_OK; - newFilePath = newFilePath.Trim(); - - //Identify if Path or FileName are the same for old and new file - string newDirectoryName = Path.GetDirectoryName(newFilePath); - Uri newDirectoryUri = new Uri(newDirectoryName); - string newCanonicalDirectoryName = newDirectoryUri.LocalPath; - newCanonicalDirectoryName = newCanonicalDirectoryName.TrimEnd(Path.DirectorySeparatorChar); - string oldCanonicalDirectoryName = new Uri(Path.GetDirectoryName(this.GetMkDocument())).LocalPath; - oldCanonicalDirectoryName = oldCanonicalDirectoryName.TrimEnd(Path.DirectorySeparatorChar); - string errorMessage = String.Empty; - bool isSamePath = NativeMethods.IsSamePath(newCanonicalDirectoryName, oldCanonicalDirectoryName); - bool isSameFile = NativeMethods.IsSamePath(newFilePath, this.Url); - - // Currently we do not support if the new directory is located outside the project cone - string projectCannonicalDirecoryName = new Uri(this.ProjectMgr.ProjectFolder).LocalPath; - projectCannonicalDirecoryName = projectCannonicalDirecoryName.TrimEnd(Path.DirectorySeparatorChar); - if(!isSamePath && newCanonicalDirectoryName.IndexOf(projectCannonicalDirecoryName, StringComparison.OrdinalIgnoreCase) == -1) - { - errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.LinkedItemsAreNotSupported, CultureInfo.CurrentUICulture), Path.GetFileNameWithoutExtension(newFilePath)); - throw new InvalidOperationException(errorMessage); - } - - //Get target container - HierarchyNode targetContainer = null; - if(isSamePath) - { - targetContainer = this.Parent; - } - else if(NativeMethods.IsSamePath(newCanonicalDirectoryName, projectCannonicalDirecoryName)) - { - //the projectnode is the target container - targetContainer = this.ProjectMgr; - } - else - { - //search for the target container among existing child nodes - targetContainer = this.ProjectMgr.FindChild(newDirectoryName); - if(targetContainer != null && (targetContainer is FileNode)) - { - // We already have a file node with this name in the hierarchy. - errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileAlreadyExistsAndCannotBeRenamed, CultureInfo.CurrentUICulture), Path.GetFileNameWithoutExtension(newFilePath)); - throw new InvalidOperationException(errorMessage); - } - } - - if(targetContainer == null) - { - // Add a chain of subdirectories to the project. - string relativeUri = PackageUtilities.GetPathDistance(this.ProjectMgr.BaseURI.Uri, newDirectoryUri); - Debug.Assert(!String.IsNullOrEmpty(relativeUri) && relativeUri != newDirectoryUri.LocalPath, "Could not make pat distance of " + this.ProjectMgr.BaseURI.Uri.LocalPath + " and " + newDirectoryUri); - targetContainer = this.ProjectMgr.CreateFolderNodes(relativeUri); - } - Debug.Assert(targetContainer != null, "We should have found a target node by now"); - - //Suspend file changes while we rename the document - string oldrelPath = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - string oldName = Path.Combine(this.ProjectMgr.ProjectFolder, oldrelPath); - SuspendFileChanges sfc = new SuspendFileChanges(this.ProjectMgr.Site, oldName); - sfc.Suspend(); - - try - { - // Rename the node. - DocumentManager.UpdateCaption(this.ProjectMgr.Site, Path.GetFileName(newFilePath), docData); - // Check if the file name was actually changed. - // In same cases (e.g. if the item is a file and the user has changed its encoding) this function - // is called even if there is no real rename. - if(!isSameFile || (this.Parent.ID != targetContainer.ID)) - { - // The path of the file is changed or its parent is changed; in both cases we have - // to rename the item. - this.RenameFileNode(oldName, newFilePath, targetContainer.ID); - OnInvalidateItems(this.Parent); - } - } - catch(Exception e) - { - Trace.WriteLine("Exception : " + e.Message); - this.RecoverFromRenameFailure(newFilePath, oldrelPath); - throw; - } - finally - { - sfc.Resume(); - } - - return returnCode; - } - - /// - /// Determines if this is node a valid node for painting the default file icon. - /// - /// - protected override bool CanShowDefaultIcon() - { - string moniker = this.GetMkDocument(); - - if(String.IsNullOrEmpty(moniker) || !File.Exists(moniker)) - { - return false; - } - - return true; - } - - #endregion - - #region virtual methods - public virtual string FileName - { - get - { - return this.Caption; - } - set - { - this.SetEditLabel(value); - } - } - - /// - /// Determine if this item is represented physical on disk and shows a messagebox in case that the file is not present and a UI is to be presented. - /// - /// true if user should be presented for UI in case the file is not present - /// true if file is on disk - internal protected virtual bool IsFileOnDisk(bool showMessage) - { - bool fileExist = IsFileOnDisk(this.Url); - - if(!fileExist && showMessage && !Utilities.IsInAutomationFunction(this.ProjectMgr.Site)) - { - string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.ItemDoesNotExistInProjectDirectory, CultureInfo.CurrentUICulture), this.Caption); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.ProjectMgr.Site, title, message, icon, buttons, defaultButton); - } - - return fileExist; - } - - /// - /// Determine if the file represented by "path" exist in storage. - /// Override this method if your files are not persisted on disk. - /// - /// Url representing the file - /// True if the file exist - internal protected virtual bool IsFileOnDisk(string path) - { - return File.Exists(path); - } - - /// - /// Renames the file in the hierarchy by removing old node and adding a new node in the hierarchy. - /// - /// The old file name. - /// The new file name - /// The new parent id of the item. - /// The newly added FileNode. - /// While a new node will be used to represent the item, the underlying MSBuild item will be the same and as a result file properties saved in the project file will not be lost. - protected virtual FileNode RenameFileNode(string oldFileName, string newFileName, uint newParentId) - { - if(string.Compare(oldFileName, newFileName, StringComparison.Ordinal) == 0) - { - // We do not want to rename the same file - return null; - } - - this.OnItemDeleted(); - this.Parent.RemoveChild(this); - - // Since this node has been removed all of its state is zombied at this point - // Do not call virtual methods after this point since the object is in a deleted state. - - string[] file = new string[1]; - file[0] = newFileName; - VSADDRESULT[] result = new VSADDRESULT[1]; - Guid emptyGuid = Guid.Empty; - ErrorHandler.ThrowOnFailure(this.ProjectMgr.AddItemWithSpecific(newParentId, VSADDITEMOPERATION.VSADDITEMOP_OPENFILE, null, 0, file, IntPtr.Zero, 0, ref emptyGuid, null, ref emptyGuid, result)); - FileNode childAdded = this.ProjectMgr.FindChild(newFileName) as FileNode; - Debug.Assert(childAdded != null, "Could not find the renamed item in the hierarchy"); - // Update the itemid to the newly added. - this.ID = childAdded.ID; - - // Remove the item created by the add item. We need to do this otherwise we will have two items. - // Please be aware that we have not removed the ItemNode associated to the removed file node from the hierrachy. - // What we want to achieve here is to reuse the existing build item. - // We want to link to the newly created node to the existing item node and addd the new include. - - //temporarily keep properties from new itemnode since we are going to overwrite it - string newInclude = childAdded.ItemNode.Item.EvaluatedInclude; - string dependentOf = childAdded.ItemNode.GetMetadata(ProjectFileConstants.DependentUpon); - childAdded.ItemNode.RemoveFromProjectFile(); - - // Assign existing msbuild item to the new childnode - childAdded.ItemNode = this.ItemNode; - childAdded.ItemNode.Item.ItemType = this.ItemNode.ItemName; - childAdded.ItemNode.Item.Xml.Include = newInclude; - if(!string.IsNullOrEmpty(dependentOf)) - childAdded.ItemNode.SetMetadata(ProjectFileConstants.DependentUpon, dependentOf); - childAdded.ItemNode.RefreshProperties(); - - //Update the new document in the RDT. - DocumentManager.RenameDocument(this.ProjectMgr.Site, oldFileName, newFileName, childAdded.ID); - - //Select the new node in the hierarchy - IVsUIHierarchyWindow uiWindow = UIHierarchyUtilities.GetUIHierarchyWindow(this.ProjectMgr.Site, SolutionExplorer); - // This happens in the context of renaming a file. - // Since we are already in solution explorer, it is extremely unlikely that we get a null return. - // If we do, the consequences are minimal: the parent node will be selected instead of the - // renamed node. - if (uiWindow != null) - { - ErrorHandler.ThrowOnFailure(uiWindow.ExpandItem(this.ProjectMgr.InteropSafeIVsUIHierarchy, this.ID, EXPANDFLAGS.EXPF_SelectItem)); - } - - //Update FirstChild - childAdded.FirstChild = this.FirstChild; - - //Update ChildNodes - SetNewParentOnChildNodes(childAdded); - RenameChildNodes(childAdded); - - return childAdded; - } - - /// - /// Rename all childnodes - /// - /// The newly added Parent node. - protected virtual void RenameChildNodes(FileNode parentNode) - { - foreach(HierarchyNode child in GetChildNodes()) - { - FileNode childNode = child as FileNode; - if(null == childNode) - { - continue; - } - string newfilename; - if(childNode.HasParentNodeNameRelation) - { - string relationalName = childNode.Parent.GetRelationalName(); - string extension = childNode.GetRelationNameExtension(); - newfilename = relationalName + extension; - newfilename = Path.Combine(Path.GetDirectoryName(childNode.Parent.GetMkDocument()), newfilename); - } - else - { - newfilename = Path.Combine(Path.GetDirectoryName(childNode.Parent.GetMkDocument()), childNode.Caption); - } - - childNode.RenameDocument(childNode.GetMkDocument(), newfilename); - - //We must update the DependsUpon property since the rename operation will not do it if the childNode is not renamed - //which happens if the is no name relation between the parent and the child - string dependentOf = childNode.ItemNode.GetMetadata(ProjectFileConstants.DependentUpon); - if(!string.IsNullOrEmpty(dependentOf)) - { - childNode.ItemNode.SetMetadata(ProjectFileConstants.DependentUpon, childNode.Parent.ItemNode.GetMetadata(ProjectFileConstants.Include)); - } - } - } - - - /// - /// Tries recovering from a rename failure. - /// - /// The file that failed to be renamed. - /// The original filenamee - protected virtual void RecoverFromRenameFailure(string fileThatFailed, string originalFileName) - { - if(this.ItemNode != null && !String.IsNullOrEmpty(originalFileName)) - { - this.ItemNode.Rename(originalFileName); - } - } - - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - if(deleteOperation == __VSDELETEITEMOPERATION.DELITEMOP_DeleteFromStorage) - { - return this.ProjectMgr.CanProjectDeleteItems; - } - return false; - } - - /// - /// This should be overriden for node that are not saved on disk - /// - /// Previous name in storage - /// New name in storage - protected virtual void RenameInStorage(string oldName, string newName) - { - File.Move(oldName, newName); - } - - /// - /// factory method for creating single file generators. - /// - /// - protected virtual ISingleFileGenerator CreateSingleFileGenerator() - { - return new SingleFileGenerator(this.ProjectMgr); - } - - /// - /// This method should be overridden to provide the list of special files and associated flags for source control. - /// - /// One of the file associated to the node. - /// The list of files to be placed under source control. - /// The flags that are associated to the files. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "scc")] - protected internal override void GetSccSpecialFiles(string sccFile, IList files, IList flags) - { - if(this.ExcludeNodeFromScc) - { - return; - } - - if(files == null) - { - throw new ArgumentNullException("files"); - } - - if(flags == null) - { - throw new ArgumentNullException("flags"); - } - - foreach(HierarchyNode node in this.GetChildNodes()) - { - files.Add(node.GetMkDocument()); - } - } - - #endregion - - #region Helper methods - /// - /// Get's called to rename the eventually running document this hierarchyitem points to - /// - /// returns FALSE if the doc can not be renamed - internal bool RenameDocument(string oldName, string newName) - { - IVsRunningDocumentTable pRDT = this.GetService(typeof(IVsRunningDocumentTable)) as IVsRunningDocumentTable; - if(pRDT == null) return false; - IntPtr docData = IntPtr.Zero; - IVsHierarchy pIVsHierarchy; - uint itemId; - uint uiVsDocCookie; - - SuspendFileChanges sfc = new SuspendFileChanges(this.ProjectMgr.Site, oldName); - sfc.Suspend(); - - try - { - // Suspend ms build since during a rename operation no msbuild re-evaluation should be performed until we have finished. - // Scenario that could fail if we do not suspend. - // We have a project system relying on MPF that triggers a Compile target build (re-evaluates itself) whenever the project changes. (example: a file is added, property changed.) - // 1. User renames a file in the above project sytem relying on MPF - // 2. Our rename funstionality implemented in this method removes and readds the file and as a post step copies all msbuild entries from the removed file to the added file. - // 3. The project system mentioned will trigger an msbuild re-evaluate with the new item, because it was listening to OnItemAdded. - // The problem is that the item at the "add" time is only partly added to the project, since the msbuild part has not yet been copied over as mentioned in part 2 of the last step of the rename process. - // The result is that the project re-evaluates itself wrongly. - VSRENAMEFILEFLAGS renameflag = VSRENAMEFILEFLAGS.VSRENAMEFILEFLAGS_NoFlags; - try - { - this.ProjectMgr.SuspendMSBuild(); - ErrorHandler.ThrowOnFailure(pRDT.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, oldName, out pIVsHierarchy, out itemId, out docData, out uiVsDocCookie)); - - if(pIVsHierarchy != null && !Utilities.IsSameComObject(pIVsHierarchy, this.ProjectMgr.InteropSafeIVsHierarchy)) - { - // Don't rename it if it wasn't opened by us. - return false; - } - - // ask other potentially running packages - if(!this.ProjectMgr.Tracker.CanRenameItem(oldName, newName, renameflag)) - { - return false; - } - // Allow the user to "fix" the project by renaming the item in the hierarchy - // to the real name of the file on disk. - if(IsFileOnDisk(oldName) || !IsFileOnDisk(newName)) - { - RenameInStorage(oldName, newName); - } - - string newFileName = Path.GetFileName(newName); - DocumentManager.UpdateCaption(this.ProjectMgr.Site, newFileName, docData); - bool caseOnlyChange = NativeMethods.IsSamePath(oldName, newName); - if(!caseOnlyChange) - { - // Check out the project file if necessary. - if(!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - this.RenameFileNode(oldName, newName); - } - else - { - this.RenameCaseOnlyChange(newFileName); - } - } - finally - { - this.ProjectMgr.ResumeMSBuild(this.ProjectMgr.ReEvaluateProjectFileTargetName); - } - - this.ProjectMgr.Tracker.OnItemRenamed(oldName, newName, renameflag); - } - finally - { - sfc.Resume(); - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - - return true; - } - - private FileNode RenameFileNode(string oldFileName, string newFileName) - { - return this.RenameFileNode(oldFileName, newFileName, this.Parent.ID); - } - - /// - /// Renames the file node for a case only change. - /// - /// The new file name. - private void RenameCaseOnlyChange(string newFileName) - { - //Update the include for this item. - string include = this.ItemNode.Item.EvaluatedInclude; - if(String.Compare(include, newFileName, StringComparison.OrdinalIgnoreCase) == 0) - { - this.ItemNode.Item.Xml.Include = newFileName; - } - else - { - string includeDir = Path.GetDirectoryName(include); - this.ItemNode.Item.Xml.Include = Path.Combine(includeDir, newFileName); - } - - this.ItemNode.RefreshProperties(); - - this.ReDraw(UIHierarchyElement.Caption); - this.RenameChildNodes(this); - - // Refresh the property browser. - IVsUIShell shell = this.ProjectMgr.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if(shell == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(shell.RefreshPropertyBrowser(0)); - - //Select the new node in the hierarchy - IVsUIHierarchyWindow uiWindow = UIHierarchyUtilities.GetUIHierarchyWindow(this.ProjectMgr.Site, SolutionExplorer); - // This happens in the context of renaming a file by case only (Table.sql -> table.sql) - // Since we are already in solution explorer, it is extremely unlikely that we get a null return. - if (uiWindow != null) - { - ErrorHandler.ThrowOnFailure(uiWindow.ExpandItem(this.ProjectMgr.InteropSafeIVsUIHierarchy, this.ID, EXPANDFLAGS.EXPF_SelectItem)); - } - } - - #endregion - - #region SingleFileGenerator Support methods - /// - /// Event handler for the Custom tool property changes - /// - /// FileNode sending it - /// Node event args - internal virtual void OnCustomToolChanged(object sender, HierarchyNodeEventArgs e) - { - this.RunGenerator(); - } - - /// - /// Event handler for the Custom tool namespce property changes - /// - /// FileNode sending it - /// Node event args - internal virtual void OnCustomToolNameSpaceChanged(object sender, HierarchyNodeEventArgs e) - { - this.RunGenerator(); - } - - #endregion - - #region helpers - /// - /// Runs a generator. - /// - internal void RunGenerator() - { - ISingleFileGenerator generator = this.CreateSingleFileGenerator(); - if(generator != null) - { - generator.RunGenerator(this.Url); - } - } - - /// - /// Update the ChildNodes after the parent node has been renamed - /// - /// The new FileNode created as part of the rename of this node - private void SetNewParentOnChildNodes(FileNode newFileNode) - { - foreach(HierarchyNode childNode in GetChildNodes()) - { - childNode.Parent = newFileNode; - } - } - - private List GetChildNodes() - { - List childNodes = new List(); - HierarchyNode childNode = this.FirstChild; - while(childNode != null) - { - childNodes.Add(childNode); - childNode = childNode.NextSibling; - } - return childNodes; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/FolderNode.cs b/source/Archive/MPF/12.0/FolderNode.cs deleted file mode 100644 index 0920eb9318..0000000000 --- a/source/Archive/MPF/12.0/FolderNode.cs +++ /dev/null @@ -1,497 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - - [ComVisible(true)] - public class FolderNode : HierarchyNode - { - #region ctors - /// - /// Constructor for the FolderNode - /// - /// Root node of the hierarchy - /// relative path from root i.e.: "NewFolder1\\NewFolder2\\NewFolder3 - /// Associated project element - public FolderNode(ProjectNode root, string relativePath, ProjectElement element) - : base(root, element) - { - if (relativePath == null) - { - throw new ArgumentNullException("relativePath"); - } - - this.VirtualNodeName = relativePath.TrimEnd('\\'); - } - #endregion - - #region overridden properties - public override int SortPriority - { - get { return DefaultSortOrderNode.FolderNode; } - } - - /// - /// This relates to the SCC glyph - /// - public override VsStateIcon StateIconIndex - { - get - { - // The SCC manager does not support being asked for the state icon of a folder (result of the operation is undefined) - return VsStateIcon.STATEICON_NOSTATEICON; - } - } - #endregion - - #region overridden methods - protected override NodeProperties CreatePropertiesObject() - { - return new FolderNodeProperties(this); - } - - protected internal override void DeleteFromStorage(string path) - { - this.DeleteFolder(path); - } - - /// - /// Get the automation object for the FolderNode - /// - /// An instance of the Automation.OAFolderNode type if succeeded - public override object GetAutomationObject() - { - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return null; - } - - return new Automation.OAFolderItem(this.ProjectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - public override object GetIconHandle(bool open) - { - return this.ProjectMgr.ImageHandler.GetIconHandle(open ? (int)ProjectNode.ImageName.OpenFolder : (int)ProjectNode.ImageName.Folder); - } - - /// - /// Rename Folder - /// - /// new Name of Folder - /// VSConstants.S_OK, if succeeded - public override int SetEditLabel(string label) - { - if(String.Compare(Path.GetFileName(this.Url.TrimEnd('\\')), label, StringComparison.Ordinal) == 0) - { - // Label matches current Name - return VSConstants.S_OK; - } - - string newPath = Path.Combine(new DirectoryInfo(this.Url).Parent.FullName, label); - - // Verify that No Directory/file already exists with the new name among current children - for(HierarchyNode n = Parent.FirstChild; n != null; n = n.NextSibling) - { - if(n != this && String.Compare(n.Caption, label, StringComparison.OrdinalIgnoreCase) == 0) - { - return ShowFileOrFolderAlreadExistsErrorMessage(newPath); - } - } - - // Verify that No Directory/file already exists with the new name on disk - if(Directory.Exists(newPath) || File.Exists(newPath)) - { - return ShowFileOrFolderAlreadExistsErrorMessage(newPath); - } - - try - { - RenameFolder(label); - - //Refresh the properties in the properties window - IVsUIShell shell = this.ProjectMgr.GetService(typeof(SVsUIShell)) as IVsUIShell; - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - ErrorHandler.ThrowOnFailure(shell.RefreshPropertyBrowser(0)); - - // Notify the listeners that the name of this folder is changed. This will - // also force a refresh of the SolutionExplorer's node. - this.OnPropertyChanged(this, (int)__VSHPROPID.VSHPROPID_Caption, 0); - } - catch(Exception e) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.RenameFolder, CultureInfo.CurrentUICulture), e.Message)); - } - return VSConstants.S_OK; - } - - - public override int MenuCommandId - { - get { return VsMenus.IDM_VS_CTXT_FOLDERNODE; } - } - - public override Guid ItemTypeGuid - { - get - { - return VSConstants.GUID_ItemType_PhysicalFolder; - } - } - - public override string Url - { - get - { - return Path.Combine(Path.GetDirectoryName(this.ProjectMgr.Url), this.VirtualNodeName) + "\\"; - } - } - - public override string Caption - { - get - { - // it might have a backslash at the end... - // and it might consist of Grandparent\parent\this\ - string caption = this.VirtualNodeName; - string[] parts; - parts = caption.Split(Path.DirectorySeparatorChar); - caption = parts[parts.GetUpperBound(0)]; - return caption; - } - } - - public override string GetMkDocument() - { - Debug.Assert(this.Url != null, "No url sepcified for this node"); - - return this.Url; - } - - /// - /// Enumerate the files associated with this node. - /// A folder node is not a file and as such no file to enumerate. - /// - /// The list of files to be placed under source control. - /// The flags that are associated to the files. - protected internal override void GetSccFiles(System.Collections.Generic.IList files, System.Collections.Generic.IList flags) - { - return; - } - - /// - /// This method should be overridden to provide the list of special files and associated flags for source control. - /// - /// One of the file associated to the node. - /// The list of files to be placed under source control. - /// The flags that are associated to the files. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "scc")] - protected internal override void GetSccSpecialFiles(string sccFile, IList files, IList flags) - { - if(this.ExcludeNodeFromScc) - { - return; - } - - if(files == null) - { - throw new ArgumentNullException("files"); - } - - if(flags == null) - { - throw new ArgumentNullException("flags"); - } - - if(string.IsNullOrEmpty(sccFile)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "sccFile"); - } - - // Get the file node for the file passed in. - FileNode node = this.FindChild(sccFile) as FileNode; - - // Dependents do not participate directly in scc. - if(node != null && !(node is DependentFileNode)) - { - node.GetSccSpecialFiles(sccFile, files, flags); - } - } - - /// - /// Recursevily walks the folder nodes and redraws the state icons - /// - protected internal override void UpdateSccStateIcons() - { - for(HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - child.UpdateSccStateIcons(); - } - } - - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if(cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch((VsCommands)cmd) - { - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Cut: - case VsCommands.Rename: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - - case VsCommands.NewFolder: - case VsCommands.AddNewItem: - case VsCommands.AddExistingItem: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.EXCLUDEFROMPROJECT) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - if(deleteOperation == __VSDELETEITEMOPERATION.DELITEMOP_DeleteFromStorage) - { - return this.ProjectMgr.CanProjectDeleteItems; - } - return false; - } - - #endregion - - #region virtual methods - /// - /// Override if your node is not a file system folder so that - /// it does nothing or it deletes it from your storage location. - /// - /// Path to the folder to delete - public virtual void DeleteFolder(string path) - { - if(Directory.Exists(path)) - Directory.Delete(path, true); - } - - /// - /// creates the physical directory for a folder node - /// Override if your node does not use file system folder - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "e")] - public virtual void CreateDirectory() - { - try - { - if(Directory.Exists(this.Url) == false) - { - Directory.CreateDirectory(this.Url); - } - } - //TODO - this should not digest all exceptions. - catch(System.Exception e) - { - CCITracing.Trace(e); - throw; - } - } - /// - /// Creates a folder nodes physical directory - /// Override if your node does not use file system folder - /// - /// - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "e")] - public virtual void CreateDirectory(string newName) - { - if(String.IsNullOrEmpty(newName)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "newName"); - } - - try - { - // on a new dir && enter, we get called with the same name (so do nothing if name is the same - char[] dummy = new char[1]; - dummy[0] = Path.DirectorySeparatorChar; - string oldDir = this.Url; - oldDir = oldDir.TrimEnd(dummy); - string strNewDir = Path.Combine(Path.GetDirectoryName(oldDir), newName); - - if(String.Compare(strNewDir, oldDir, StringComparison.OrdinalIgnoreCase) != 0) - { - if(Directory.Exists(strNewDir)) - { - throw new InvalidOperationException(SR.GetString(SR.DirectoryExistError, CultureInfo.CurrentUICulture)); - } - Directory.CreateDirectory(strNewDir); - } - } - //TODO - this should not digest all exceptions. - catch(System.Exception e) - { - CCITracing.Trace(e); - throw; - } - } - - /// - /// Rename the physical directory for a folder node - /// Override if your node does not use file system folder - /// - /// - public virtual void RenameDirectory(string newPath) - { - if(Directory.Exists(this.Url)) - { - if(Directory.Exists(newPath)) - { - ShowFileOrFolderAlreadExistsErrorMessage(newPath); - } - - Directory.Move(this.Url, newPath); - } - } - #endregion - - #region helper methods - private void RenameFolder(string newName) - { - // Do the rename (note that we only do the physical rename if the leaf name changed) - string newPath = Path.Combine(this.Parent.VirtualNodeName, newName); - if(String.Compare(Path.GetFileName(VirtualNodeName), newName, StringComparison.Ordinal) != 0) - { - this.RenameDirectory(Path.Combine(this.ProjectMgr.ProjectFolder, newPath)); - } - this.VirtualNodeName = newPath; - - this.ItemNode.Rename(VirtualNodeName); - - // Let all children know of the new path - for(HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - FolderNode node = child as FolderNode; - - if(node == null) - { - child.SetEditLabel(child.Caption); - } - else - { - node.RenameFolder(node.Caption); - } - } - - // Some of the previous operation may have changed the selection so set it back to us - IVsUIHierarchyWindow uiWindow = UIHierarchyUtilities.GetUIHierarchyWindow(this.ProjectMgr.Site, SolutionExplorer); - // This happens in the context of renaming a folder. - // Since we are already in solution explorer, it is extremely unlikely that we get a null return. - // If we do, the consequences are minimal: the parent node will be selected instead of the - // renamed node. - if (uiWindow != null) - { - ErrorHandler.ThrowOnFailure(uiWindow.ExpandItem(this.ProjectMgr.InteropSafeIVsUIHierarchy, this.ID, EXPANDFLAGS.EXPF_SelectItem)); - } - } - - /// - /// Show error message if not in automation mode, otherwise throw exception - /// - /// path of file or folder already existing on disk - /// S_OK - private int ShowFileOrFolderAlreadExistsErrorMessage(string newPath) - { - //A file or folder with the name '{0}' already exists on disk at this location. Please choose another name. - //If this file or folder does not appear in the Solution Explorer, then it is not currently part of your project. To view files which exist on disk, but are not in the project, select Show All Files from the Project menu. - string errorMessage = (String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileOrFolderAlreadyExists, CultureInfo.CurrentUICulture), newPath)); - if(!Utilities.IsInAutomationFunction(this.ProjectMgr.Site)) - { - string title = null; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.ProjectMgr.Site, title, errorMessage, icon, buttons, defaultButton); - return VSConstants.S_OK; - } - else - { - throw new InvalidOperationException(errorMessage); - } - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/GlobalSuppressions.cs b/source/Archive/MPF/12.0/GlobalSuppressions.cs deleted file mode 100644 index cb9975bd82..0000000000 --- a/source/Archive/MPF/12.0/GlobalSuppressions.cs +++ /dev/null @@ -1,656 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System.Diagnostics.CodeAnalysis; - -// This file is used by Code Analysis to maintain SuppressMessage -// attributes that are applied to this project. Project-level -// suppressions either have no target or are given a specific target -// and scoped to a namespace, type, member, etc. -// -// To add a suppression to this file, right-click the message in the -// Error List, point to "Suppress Message(s)", and click "In Project -// Suppression File". You do not need to add suppressions to this -// file manually. - -// The below contains suppressions from LinkDemand occurring from calls to the Marshal type's methods. -// Calls to these methods are absolute necessary to do successful VS integration. -// All these methods are called from the VS Kernel, through interface calls that are expanded in the below methods. -// Some of the below methods are non public but their caller's then are methods that are VS Integration interface implementations. -// The methods in which the LinkDemands were suppressed should be revisited though if adding further LinkDemands or directly Demanding UnmanagedCode Permission is a better choice. - -//Interface parameters naming matching suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#AdviseHierarchyEvents(Microsoft.VisualStudio.Shell.Interop.IVsHierarchyEvents,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#AdviseHierarchyEvents(Microsoft.VisualStudio.Shell.Interop.IVsHierarchyEvents,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#AdviseBuildStatusCallback(Microsoft.VisualStudio.Shell.Interop.IVsBuildStatusCallback,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartBuild(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartBuild(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartClean(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartUpToDateCheck(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartClean(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartUpToDateCheck(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartUpToDateCheck(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStatus(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartBuild(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartBuild(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartClean(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#UnadviseBuildStatusCallback(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#Stop(System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartUpToDateCheck(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartUpToDateCheck(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#StartClean(Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_HelpContext(System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_Description(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_CanonicalName(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#Wait(System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_MustUpdateBefore(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_HelpFile(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterLoadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterOpeningChildren(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterLoadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterClosingChildren(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterOpenProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterOpenProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterRenameProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeCloseProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeCloseProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeClosingChildren(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeOpeningChildren(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeUnloadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnBeforeUnloadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryChangeProjectParent(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryChangeProjectParent(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryChangeProjectParent(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryCloseProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryCloseProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryCloseProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryCloseSolution(System.Object,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnQueryUnloadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListenerForProjectOpen.#OnAfterOpenSolution(System.Object,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListenerForProjectOpen.#OnAfterOpenSolution(System.Object,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#OnActiveProjectCfgChange(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#OnAfterActiveSolutionCfgChange(Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#OnAfterActiveSolutionCfgChange(Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#OnBeforeActiveSolutionCfgChange(Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#OnBeforeActiveSolutionCfgChange(Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Begin(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Begin(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Begin(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Begin(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Begin(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateProjectCfg_Done(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsCfg,System.UInt32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateSolution_Begin(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.UpdateSolutionEventsListener.#UpdateSolution_StartUpdate(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#DeleteItem(System.UInt32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#DeleteItem(System.UInt32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#Exec(System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#Exec(System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#Exec(System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommand(System.UInt32,System.Guid&,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetCanonicalName(System.UInt32,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetCanonicalName(System.UInt32,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetGuidProperty(System.UInt32,System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetGuidProperty(System.UInt32,System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetNestedHierarchy(System.UInt32,System.Guid&,System.IntPtr&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetNestedHierarchy(System.UInt32,System.Guid&,System.IntPtr&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetProperty(System.UInt32,System.Int32,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetProperty(System.UInt32,System.Int32,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetProperty(System.UInt32,System.Int32,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IgnoreItemFileChanges(System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IgnoreItemFileChanges(System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IsItemReloadable(System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IsItemReloadable(System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#OnBeforeDropNotify(Microsoft.VisualStudio.OLE.Interop.IDataObject,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ParseCanonicalName(System.String,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ParseCanonicalName(System.String,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryClose(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryDeleteItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryDeleteItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryDeleteItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatus(System.Guid&,System.UInt32,Microsoft.VisualStudio.OLE.Interop.OLECMD[],System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatusCommand(System.UInt32,System.Guid&,System.UInt32,Microsoft.VisualStudio.OLE.Interop.OLECMD[],System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatusCommand(System.UInt32,System.Guid&,System.UInt32,Microsoft.VisualStudio.OLE.Interop.OLECMD[],System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatusCommand(System.UInt32,System.Guid&,System.UInt32,Microsoft.VisualStudio.OLE.Interop.OLECMD[],System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ReloadItem(System.UInt32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ReloadItem(System.UInt32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetGuidProperty(System.UInt32,System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetGuidProperty(System.UInt32,System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetProperty(System.UInt32,System.Int32,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetProperty(System.UInt32,System.Int32,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#UnadviseHierarchyEvents(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFolder(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFolder(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFromDirectory(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFromFile(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFromFileCopy(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFromTemplate(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#AddFromTemplate(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItem`1.#Save(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItem`1.#SaveAs(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#EnumOutputs(Microsoft.VisualStudio.Shell.Interop.IVsEnumOutputs&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_BuildableProjectCfg(Microsoft.VisualStudio.Shell.Interop.IVsBuildableProjectCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_CanonicalName(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_DisplayName(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_IsDebugOnly(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_IsPackaged(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_IsReleaseOnly(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_IsSpecifyingOutputSupported(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_Platform(System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_ProjectCfgProvider(Microsoft.VisualStudio.Shell.Interop.IVsProjectCfgProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_RootURL(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_TargetCodePage(System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#get_UpdateSequenceNumber(Microsoft.VisualStudio.OLE.Interop.ULARGE_INTEGER[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetCfg(Microsoft.VisualStudio.Shell.Interop.IVsCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetPages(Microsoft.VisualStudio.OLE.Interop.CAUUID[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetProjectDesignerPages(Microsoft.VisualStudio.OLE.Interop.CAUUID[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetProjectItem(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetProjectItem(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#OpenOutput(System.String,Microsoft.VisualStudio.Shell.Interop.IVsOutput&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#OpenOutput(System.String,Microsoft.VisualStudio.Shell.Interop.IVsOutput&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#QueryDebugLaunch(System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#QueryDebugLaunch(System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterAsynchOpenProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterAsynchOpenProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterChangeProjectParent(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListener.#OnAfterCloseSolution(System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#AdviseBuildStatusCallback(Microsoft.VisualStudio.Shell.Interop.IVsBuildStatusCallback,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_ReferredProject(System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartClean(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#QueryStartBuild(System.UInt32,System.Int32[],System.Int32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#get_ProjectCfg(Microsoft.VisualStudio.Shell.Interop.IVsProjectCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildDependency.#get_Type(System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1701:ResourceStringCompoundWordsShouldBeCasedCorrectly", MessageId = "dataset", Scope = "resource", Target = "Microsoft.VisualStudio.Project.resources")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1703:ResourceStringsShouldBeSpelledCorrectly", MessageId = "Intelli", Scope = "resource", Target = "Microsoft.VisualStudio.Project.SecurityWarningDialog.resources")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.FileNode.#AfterSaveItemAs(System.IntPtr,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#OnChanged(System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#OnRequestEdit(System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#GetCfgProvider(Microsoft.VisualStudio.Shell.Interop.IVsCfgProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#GetPages(Microsoft.VisualStudio.OLE.Interop.CAUUID[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#GetProjectDesignerPages(Microsoft.VisualStudio.OLE.Interop.CAUUID[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#GetProjectItem(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#GetProjectItem(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OnBeforeDropNotify(Microsoft.VisualStudio.OLE.Interop.IDataObject,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OnClear(System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OnPaste(System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OnPaste(System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#RegisterClipboardNotifications(System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#GetPageInfo(Microsoft.VisualStudio.OLE.Interop.PROPPAGEINFO[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#Help(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#Move(Microsoft.VisualStudio.OLE.Interop.RECT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#SetObjects(System.UInt32,System.Object[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#SetObjects(System.UInt32,System.Object[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#SetPageSite(Microsoft.VisualStudio.OLE.Interop.IPropertyPageSite)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#Show(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#TranslateAccelerator(Microsoft.VisualStudio.OLE.Interop.MSG[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#CreateGeneratorInstance(System.String,System.Int32&,System.Int32&,System.Int32&,Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#CreateGeneratorInstance(System.String,System.Int32&,System.Int32&,System.Int32&,Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#CreateGeneratorInstance(System.String,System.Int32&,System.Int32&,System.Int32&,Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#CreateGeneratorInstance(System.String,System.Int32&,System.Int32&,System.Int32&,Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#CreateGeneratorInstance(System.String,System.Int32&,System.Int32&,System.Int32&,Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetDefaultGenerator(System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetDefaultGenerator(System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetGeneratorInformation(System.String,System.Int32&,System.Int32&,System.Int32&,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetGeneratorInformation(System.String,System.Int32&,System.Int32&,System.Int32&,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetGeneratorInformation(System.String,System.Int32&,System.Int32&,System.Int32&,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetGeneratorInformation(System.String,System.Int32&,System.Int32&,System.Int32&,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorFactory.#GetGeneratorInformation(System.String,System.Int32&,System.Int32&,System.Int32&,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#Activate(System.IntPtr,Microsoft.VisualStudio.OLE.Interop.RECT[],System.Int32)")] - -//Ref arguments suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.TokenProcessor.#ReplaceBetweenTokens(System.String&,Microsoft.VisualStudio.Project.ReplaceBetweenPairToken)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.TokenProcessor.#ReplaceTokens(System.String&,Microsoft.VisualStudio.Project.ReplacePairToken)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatusOnNode(System.Guid,System.UInt32,System.IntPtr,Microsoft.VisualStudio.Project.QueryStatusResult&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#OpenWithSpecific(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.FileDocumentManager.#Open(System.Boolean,System.Boolean,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#OpenWithSpecific(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.TokenProcessor.#DeleteTokens(System.String&,Microsoft.VisualStudio.Project.DeleteToken)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#Open(System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#CloseWindowFrame(Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.String,System.String,System.UInt32,System.Guid&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#SetGuidProperty(System.Int32,System.Guid&)")] - -//Out arguments suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#Open(System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.FileDocumentManager.#Open(System.Boolean,System.Boolean,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#DisableCommandOnNodesThatDoNotSupportMultiSelection(System.Guid,System.UInt32,System.Collections.Generic.IList`1,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "6#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommandIndependentOfSelection(System.Guid,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr,Microsoft.VisualStudio.Project.CommandOrigin,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "7#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommandThatDependsOnSelectedNodes(System.Guid,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr,Microsoft.VisualStudio.Project.CommandOrigin,System.Collections.Generic.IList`1,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#QueryStatusCommandFromOleCommandTarget(System.Guid,System.UInt32,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetGuidProperty(System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#OpenWithSpecific(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.FileDocumentManager.#Open(System.Boolean,System.Boolean,System.Guid,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ReferenceNode.#CanAddReference(Microsoft.VisualStudio.Project.ReferenceNode+CannotAddReferenceErrorMessage&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.String,System.String,System.UInt32,System.Guid&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "7#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#ExecCommandThatDependsOnSelectedNodes(System.Guid,System.UInt32,System.UInt32,System.IntPtr,System.IntPtr,Microsoft.VisualStudio.Project.CommandOrigin,System.Collections.Generic.IList`1,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#DisableCommandOnNodesThatDoNotSupportMultiSelection(System.Guid,System.UInt32,System.Collections.Generic.IList`1,System.Boolean&)")] - -//Default constructors for COM suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.AssemblyReferenceNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ComReferenceNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ConfigProvider")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ConnectionPointContainer")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.DependentFileNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.DependentFileNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.FileNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.FileNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.FolderNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.FolderNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.HierarchyNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.NestedProjectNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.NodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAAssemblyReference")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAComReference")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAFileItem")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAFolderItem")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OANestedProjectItem")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OANullProperty")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProject")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItems")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectReference")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProperty")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceFolderItem")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceItem")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAReferences")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAVSProject")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAVSProjectEvents")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.OutputGroup")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectConfig")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectConfigProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectPackage")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectReferenceNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectReferencesProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ReferenceContainerNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ReferenceNode")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.ReferenceNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.SettingsPage")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.SingleFileGeneratorNodeProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1409:ComVisibleTypesShouldBeCreatable", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAVSProjectItem")] - -//PInvoke suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods.#DestroyIcon(System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods.#GetBinaryType(System.String,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#GlobalUnlock(System.Runtime.InteropServices.HandleRef)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#GlobalUnLock(System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#ImageList_Draw(System.Runtime.InteropServices.HandleRef,System.Int32,System.Runtime.InteropServices.HandleRef,System.Int32,System.Int32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#SHGetPathFromIDList(System.IntPtr,System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1414:MarkBooleanPInvokeArgumentsWithMarshalAs", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods.#IsDialogMessageA(System.IntPtr,Microsoft.VisualStudio.OLE.Interop.MSG&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Portability", "CA1901:PInvokeDeclarationsShouldBePortable", MessageId = "return", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#RegisterClipboardFormat(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Portability", "CA1901:PInvokeDeclarationsShouldBePortable", MessageId = "return", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#GlobalSize(System.IntPtr)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Portability", "CA1901:PInvokeDeclarationsShouldBePortable", MessageId = "return", Scope = "member", Target = "Microsoft.VisualStudio.Project.UnsafeNativeMethods.#GlobalSize(System.Runtime.InteropServices.HandleRef)")] - -//'Flags' naming suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "type", Target = "Microsoft.VisualStudio.Project.ModuleKindFlags")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#VirtualProjectFlags")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetQueryRemoveFileFlags(System.String[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetQueryAddFileFlags(System.String[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetAddFileFlags(System.String[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.Utilities.#CreateCADWORD(System.Collections.Generic.IList`1)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.String,System.String,System.UInt32,System.Guid&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#AddNestedProjectFromTemplate(System.String,System.String,System.String,Microsoft.VisualStudio.Project.ProjectElement,Microsoft.VisualStudio.Shell.Interop.__VSCREATEPROJFLAGS)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#AddNestedProjectFromTemplate(Microsoft.VisualStudio.Project.ProjectElement,Microsoft.VisualStudio.Shell.Interop.__VSCREATEPROJFLAGS)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#AddExistingNestedProject(Microsoft.VisualStudio.Project.ProjectElement,Microsoft.VisualStudio.Shell.Interop.__VSCREATEPROJFLAGS)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#Init(System.String,System.String,System.String,Microsoft.VisualStudio.Shell.Interop.__VSCREATEPROJFLAGS)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#OnPropertyChanged(Microsoft.VisualStudio.Project.HierarchyNode,System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flag", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#IgnoreItemFileChanges(System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetSccSpecialFiles(System.String,System.Collections.Generic.IList`1,System.Collections.Generic.IList`1)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetSccFiles(System.Collections.Generic.IList`1,System.Collections.Generic.IList`1)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#OpenWithSpecific(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flag", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#Close(Microsoft.VisualStudio.Shell.Interop.__FRAMECLOSE)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1726:UsePreferredTerms", MessageId = "Flags", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetRemoveFileFlags(System.String[])")] - -//Properties instead of methods suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#GetFullPathForDocument()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.DocumentManager.#GetOwnerCaption()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetAutomationObject()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetDocumentManager()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetDragTargetHandlerNode()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetEditLabel()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetMkDocument()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetRelationalName()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetRelationNameExtension()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.IReferenceContainerProvider.#GetReferenceContainer()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems.#GetListOfProjectItems()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectElement.#GetFullPathForElement()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetCompiler()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetInner()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetOutputGroupNames()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectOptions.#GetOptionHelp()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSelectedNodes()")] - -//Generic nesting suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.BuildableProjectConfig.#Build(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetOutputGroupNames()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#NewConfigProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Scope = "member", Target = "Microsoft.VisualStudio.Project.Utilities.#ConvertFromType`1(System.String,System.Globalization.CultureInfo)")] - -//Methods that swallows exceptions suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.CodeBehindCodeGenerator.#GetDesignerItem(Microsoft.VisualStudio.Project.Web.VsHierarchyItem,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.CodeBehindCodeGenerator.#FindClass(Microsoft.VisualStudio.Project.Web.VsHierarchyItem,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.CodeBehindCodeGenerator.#DisposeGenerateState()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.CodeBehindCodeGenerator.#GetFieldNames(EnvDTE.CodeClass,System.Boolean,System.Boolean,System.Int32,System.Int32,Microsoft.VisualStudio.Project.Web.FieldDataDictionary&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.CodeBehindCodeGenerator.#GetFieldNames(System.String[],System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#Close()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods+ConnectionPointCookie.#.ctor(System.Object,System.Object,System.Type,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods+DataStreamFromComStream.#Flush()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.VsHierarchyItem.#FullPath()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.VsHierarchyItem.#GetGuidPropHelper(Microsoft.VisualStudio.Shell.Interop.__VSHPROPID)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.VsHierarchyItem.#GetPropHelper(System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.VsHierarchyItem.#GetService`1()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.WAUtilities.#CreateInstance`1(System.IServiceProvider,System.Guid)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.Web.WAUtilities.#GetService`1(System.IServiceProvider)")] - -//Local variables names matching instance variable names suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "dropDataType", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#PasteFromClipboard(Microsoft.VisualStudio.Project.HierarchyNode)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "dropDataType", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Drop(Microsoft.VisualStudio.OLE.Interop.IDataObject,System.UInt32,System.UInt32,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "dropDataType", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ProcessSelectionDataObject(Microsoft.VisualStudio.OLE.Interop.IDataObject,Microsoft.VisualStudio.Project.HierarchyNode)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "filename", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "filename", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SaveCompleted(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "isDirty", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDirty(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "isDirty", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#CleanupSelectionDataObject(System.Boolean,System.Boolean,System.Boolean,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "isDirty", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsFlavorDirty()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "isDirty", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OnBeforeDropNotify(Microsoft.VisualStudio.OLE.Interop.IDataObject,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "name", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#GetTypedConfigProperty(System.String,System.Type)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "name", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#GetTypedProperty(System.String,System.Type)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "name", Scope = "member", Target = "Microsoft.VisualStudio.Project.SettingsPage.#SetConfigProperty(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "options", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetTargetPlatform(Microsoft.VisualStudio.Project.ProjectOptions)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "options", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetOutputAssembly(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "options", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetProjectOptions(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "options", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#PrepareBuild(System.String,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "options", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetBuildConfigurationProperties(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "project", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#CreateOutputGroup(Microsoft.VisualStudio.Project.ProjectNode,System.Collections.Generic.KeyValuePair`2)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "projectName", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectNode.#Init(System.String,System.String,System.String,Microsoft.VisualStudio.Shell.Interop.__VSCREATEPROJFLAGS)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccAuxPath", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccAuxPath", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccSettings(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccLocalPath", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccLocalPath", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccSettings(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccProjectName", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccProjectName", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccSettings(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccProvider", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "sccProvider", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccSettings(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "site", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "dropDataType", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#QueryDropEffect(Microsoft.VisualStudio.Project.DropDataType,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "i", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumSTATDATA.#Microsoft.VisualStudio.OLE.Interop.IEnumSTATDATA.Skip(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "i", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumSTATDATA.#Microsoft.VisualStudio.OLE.Interop.IEnumSTATDATA.Next(System.UInt32,Microsoft.VisualStudio.OLE.Interop.STATDATA[],System.UInt32&)")] - -//COM Exceptions suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#ExtenderCATID")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#Culture")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#ExtenderNames")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#Identity")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#Name")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#PublicKeyToken")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#Type")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OASolutionFolder`1.#Parent")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItem`1.#Collection")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItem`1.#IsDirty")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceBase`1.#CopyLocal")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.DataObject.#Microsoft.VisualStudio.OLE.Interop.IDataObject.GetCanonicalFormatEtc(Microsoft.VisualStudio.OLE.Interop.FORMATETC[],Microsoft.VisualStudio.OLE.Interop.FORMATETC[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#.ctor(Microsoft.VisualStudio.Project.ProjectNode,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#RunVsTemplateWizard(Microsoft.VisualStudio.Project.ProjectElement,System.Boolean)")] - -//IEnumerable implementation suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAReferences")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProperties")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OANavigableProjectItems")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface", Scope = "type", Target = "Microsoft.VisualStudio.Project.Automation.OAProjectItems")] - -//Other suppressions -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible", Scope = "type", Target = "Microsoft.VisualStudio.Project.ProjectNode+ImageName")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "trailer", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetProperty(System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "vspropId", Scope = "member", Target = "Microsoft.VisualStudio.Project.HierarchyNode.#GetGuidProperty(System.UInt32,System.Int32,System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily", Scope = "member", Target = "Microsoft.VisualStudio.Project.NativeMethods+ConnectionPointCookie.#.ctor(System.Object,System.Object,System.Type,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConnectionPointContainer.#Microsoft.VisualStudio.OLE.Interop.IConnectionPointContainer.FindConnectionPoint(System.Guid&,Microsoft.VisualStudio.OLE.Interop.IConnectionPoint&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#EnvDTE80.IInternalExtenderProvider.CanExtend(System.String,System.String,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#EnvDTE80.IInternalExtenderProvider.GetExtender(System.String,System.String,System.Object,EnvDTE.IExtenderSite,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.NodeProperties.#EnvDTE80.IInternalExtenderProvider.GetExtenderNames(System.String,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#Microsoft.VisualStudio.Shell.Interop.IVsProjectFlavorCfg.Close()")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#VisualStudio.Project.IProjectEventsProvider.ProjectEventsProvider")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.GetItemAttribute(System.UInt32,System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.GetPropertyValue(System.String,System.String,System.UInt32,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.RemoveProperty(System.String,System.String,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetItemAttribute(System.UInt32,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsBuildPropertyStorage.SetPropertyValue(System.String,System.String,System.UInt32,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Shell.Interop.IVsProjectFlavorCfgProvider.CreateProjectFlavorCfg(Microsoft.VisualStudio.Shell.Interop.IVsCfg,Microsoft.VisualStudio.Shell.Interop.IVsProjectFlavorCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConnectionPointContainer.#Microsoft.VisualStudio.OLE.Interop.IConnectionPointContainer.EnumConnectionPoints(Microsoft.VisualStudio.OLE.Interop.IEnumConnectionPoints&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Microsoft.VisualStudio.Project.IProjectEventsProvider.ProjectEventsProvider")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetMsBuildProperty(System.String,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddNodeIfTargetExistInStorage(Microsoft.VisualStudio.Project.HierarchyNode,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddFolderFromOtherProject(System.String,Microsoft.VisualStudio.Project.HierarchyNode)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectElement.#GetMetadataAndThrow(System.String,System.Exception)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#GetRegisteredProject(Microsoft.VisualStudio.Project.ProjectElement)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectConfig.#GetMsBuildProperty(System.String,System.Boolean)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1065:DoNotRaiseExceptionsInUnexpectedLocations", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAVSProject.#Imports")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_CanonicalName(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_HelpContext(System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.SolutionListenerForProjectReferenceUpdate.#OnBeforeUnloadProject(Microsoft.VisualStudio.Shell.Interop.IVsHierarchy,Microsoft.VisualStudio.Shell.Interop.IVsHierarchy)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#TransferItem(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#TransferItem(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#TransferItem(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetSccLocation(System.String,System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetInnerProject(System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetHostObject(System.String,System.String,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetHostObject(System.String,System.String,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetHostObject(System.String,System.String,System.Object)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SetAggregateProjectTypeGuids(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SccGlyphChanged(System.Int32,System.UInt32[],Microsoft.VisualStudio.Shell.Interop.VsStateIcon[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SccGlyphChanged(System.Int32,System.UInt32[],Microsoft.VisualStudio.Shell.Interop.VsStateIcon[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SccGlyphChanged(System.Int32,System.UInt32[],Microsoft.VisualStudio.Shell.Interop.VsStateIcon[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SccGlyphChanged(System.Int32,System.UInt32[],Microsoft.VisualStudio.Shell.Interop.VsStateIcon[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#SaveCompleted(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Save(System.String,System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Save(System.String,System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Save(System.String,System.Int32,System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#ReopenItem(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#RemoveItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#RemoveItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#RemoveItem(System.UInt32,System.UInt32,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "6#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItemWithSpecific(System.UInt32,System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItem(System.UInt32,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItem(System.UInt32,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenItem(System.UInt32,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#OpenDependency(System.String,Microsoft.VisualStudio.Shell.Interop.IVsDependency&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#Load(System.String,System.UInt32,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDocumentInProject(System.String,System.Int32&,Microsoft.VisualStudio.Shell.Interop.VSDOCUMENTPRIORITY[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDocumentInProject(System.String,System.Int32&,Microsoft.VisualStudio.Shell.Interop.VSDOCUMENTPRIORITY[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDocumentInProject(System.String,System.Int32&,Microsoft.VisualStudio.Shell.Interop.VSDOCUMENTPRIORITY[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDocumentInProject(System.String,System.Int32&,Microsoft.VisualStudio.Shell.Interop.VSDOCUMENTPRIORITY[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#IsDirty(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitNew(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "6#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#InitializeForOuter(System.String,System.String,System.String,System.UInt32,System.Guid&,System.IntPtr&,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSccSpecialFiles(System.UInt32,System.String,Microsoft.VisualStudio.OLE.Interop.CALPOLESTR[],Microsoft.VisualStudio.OLE.Interop.CADWORD[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSccSpecialFiles(System.UInt32,System.String,Microsoft.VisualStudio.OLE.Interop.CALPOLESTR[],Microsoft.VisualStudio.OLE.Interop.CADWORD[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSccSpecialFiles(System.UInt32,System.String,Microsoft.VisualStudio.OLE.Interop.CALPOLESTR[],Microsoft.VisualStudio.OLE.Interop.CADWORD[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSccFiles(System.UInt32,Microsoft.VisualStudio.OLE.Interop.CALPOLESTR[],Microsoft.VisualStudio.OLE.Interop.CADWORD[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetSccFiles(System.UInt32,Microsoft.VisualStudio.OLE.Interop.CALPOLESTR[],Microsoft.VisualStudio.OLE.Interop.CADWORD[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetMkDocument(System.UInt32,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetMkDocument(System.UInt32,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetItemContext(System.UInt32,Microsoft.VisualStudio.OLE.Interop.IServiceProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetItemContext(System.UInt32,Microsoft.VisualStudio.OLE.Interop.IServiceProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetFormatList(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetFile(System.Int32,System.UInt32,System.UInt32&,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetFile(System.Int32,System.UInt32,System.UInt32&,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetFile(System.Int32,System.UInt32,System.UInt32&,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetFile(System.Int32,System.UInt32,System.UInt32&,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetCurFile(System.String&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetCurFile(System.String&,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetClassID(System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetCfgProvider(Microsoft.VisualStudio.Shell.Interop.IVsCfgProvider&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetBuildSystemKind(System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GetAggregateProjectTypeGuids(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GenerateUniqueItemName(System.UInt32,System.String,System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GenerateUniqueItemName(System.UInt32,System.String,System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GenerateUniqueItemName(System.UInt32,System.String,System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#GenerateUniqueItemName(System.UInt32,System.String,System.String,System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#EnumDependencies(Microsoft.VisualStudio.Shell.Interop.IVsEnumDependencies&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#BuildTarget(System.String,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#BuildTarget(System.String,System.Boolean&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "10#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "8#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "9#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "7#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "6#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItemWithSpecific(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,System.UInt32,System.Guid&,System.String,System.Guid&,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "6#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddItem(System.UInt32,Microsoft.VisualStudio.Shell.Interop.VSADDITEMOPERATION,System.String,System.UInt32,System.String[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectNode.#AddComponent(Microsoft.VisualStudio.Shell.Interop.VSADDCOMPOPERATION,System.UInt32,System.IntPtr[],System.IntPtr,Microsoft.VisualStudio.Shell.Interop.VSADDCOMPRESULT[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "4#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#SaveItem(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS,System.String,System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ProjectContainerNode.#IsItemDirty(System.UInt32,System.IntPtr,System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OASolutionFolder`1.#AddFromTemplate(System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OASolutionFolder`1.#AddFromTemplate(System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OASolutionFolder`1.#AddFromTemplate(System.String,System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OASolutionFolder`1.#AddFromFile(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAReferenceItem.#Open(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProject.#SaveAs(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAProject.#Save(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAFileItem.#SaveAs(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.Automation.OAFileItem.#Open(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_Type(System.Guid&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_ReferredProject(System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_MustUpdateBefore(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_HelpFile(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.NestedProjectBuildDependency.#get_Description(System.String&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "5#", Scope = "member", Target = "Microsoft.VisualStudio.Project.FileDocumentManager.#OpenWithSpecific(System.UInt32,System.Guid&,System.String,System.Guid&,System.IntPtr,Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame&,Microsoft.VisualStudio.Project.WindowFrameShowAction)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumDependencies.#Skip(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumDependencies.#Next(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsDependency[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumDependencies.#Next(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsDependency[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumDependencies.#Next(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsDependency[],System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.EnumDependencies.#Clone(Microsoft.VisualStudio.Shell.Interop.IVsEnumDependencies&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#UnadviseCfgProviderEvents(System.UInt32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#RenameCfgsOfCfgName(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#RenameCfgsOfCfgName(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#OpenProjectCfg(System.String,Microsoft.VisualStudio.Shell.Interop.IVsProjectCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#OpenProjectCfg(System.String,Microsoft.VisualStudio.Shell.Interop.IVsProjectCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetSupportedPlatformNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetSupportedPlatformNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetPlatformNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetPlatformNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "3#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgs(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsCfg[],System.UInt32[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgs(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsCfg[],System.UInt32[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgs(System.UInt32,Microsoft.VisualStudio.Shell.Interop.IVsCfg[],System.UInt32[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgProviderProperty(System.Int32,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgOfName(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgOfName(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgOfName(System.String,System.String,Microsoft.VisualStudio.Shell.Interop.IVsCfg&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "2#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetCfgNames(System.UInt32,System.String[],System.UInt32[])")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetAutomationObject(System.String,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#GetAutomationObject(System.String,System.Object&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#get_UsesIndependentConfigurations(System.Int32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#DeleteCfgsOfPlatformName(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#DeleteCfgsOfCfgName(System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AdviseCfgProviderEvents(Microsoft.VisualStudio.Shell.Interop.IVsCfgProviderEvents,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AdviseCfgProviderEvents(Microsoft.VisualStudio.Shell.Interop.IVsCfgProviderEvents,System.UInt32&)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AddCfgsOfPlatformName(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AddCfgsOfPlatformName(System.String,System.String)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "1#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AddCfgsOfCfgName(System.String,System.String,System.Int32)")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#", Scope = "member", Target = "Microsoft.VisualStudio.Project.ConfigProvider.#AddCfgsOfCfgName(System.String,System.String,System.Int32)")] diff --git a/source/Archive/MPF/12.0/HierarchyNode.cs b/source/Archive/MPF/12.0/HierarchyNode.cs deleted file mode 100644 index 5e504bae66..0000000000 --- a/source/Archive/MPF/12.0/HierarchyNode.cs +++ /dev/null @@ -1,3238 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; -using System.Text; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -//#define CCI_TRACING -using Microsoft.VisualStudio.Shell.Interop; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// An object that deals with user interaction via a GUI in the form a hierarchy: a parent node with zero or more child nodes, each of which - /// can itself be a hierarchy. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] - public abstract class HierarchyNode : - IVsUIHierarchy, - IVsPersistHierarchyItem2, - Microsoft.VisualStudio.OLE.Interop.IOleCommandTarget, - IVsHierarchyDropDataSource2, - IVsHierarchyDropDataSource, - IVsHierarchyDropDataTarget, - IVsHierarchyDeleteHandler, - IDisposable - //, IVsBuildStatusCallback - { - #region nested types - /// - /// DropEffect as defined in oleidl.h - /// - internal enum DropEffect - { - None, - Copy = 1, - Move = 2, - Link = 4 - }; - #endregion - - #region Events - internal event EventHandler OnChildAdded - { - add { onChildAdded += value; } - remove { onChildAdded -= value; } - } - internal event EventHandler OnChildRemoved - { - add { onChildRemoved += value; } - remove { onChildRemoved -= value; } - } - #endregion - - #region static/const fields - public static readonly Guid SolutionExplorer = new Guid(EnvDTE.Constants.vsWindowKindSolutionExplorer); - public const int NoImage = -1; -#if DEBUG - internal static int LastTracedProperty; -#endif - #endregion - - #region fields - private EventSinkCollection hierarchyEventSinks = new EventSinkCollection(); - private ProjectNode projectMgr; - private ProjectElement itemNode; - private HierarchyNode parentNode; - private HierarchyNode nextSibling; - private HierarchyNode firstChild; - private HierarchyNode lastChild; - private bool isExpanded; - private uint hierarchyId; - private uint docCookie; - private bool hasDesigner; - private string virtualNodeName = String.Empty; // Only used by virtual nodes - private IVsHierarchy parentHierarchy; - private int parentHierarchyItemId; - private NodeProperties nodeProperties; - private OleServiceProvider oleServiceProvider = new OleServiceProvider(); - private bool excludeNodeFromScc; - private EventHandler onChildAdded; - private EventHandler onChildRemoved; - private bool hasParentNodeNameRelation; - private List itemsDraggedOrCutOrCopied; - private bool sourceDraggedOrCutOrCopied; - - /// - /// Has the object been disposed. - /// - /// We will not specify a property for isDisposed, rather it is expected that the a private flag is defined - /// on all subclasses. We do not want get in a situation where the base class's dipose is not called because a child sets the flag through the property. - private bool isDisposed; - #endregion - - #region abstract properties - /// - /// The URL of the node. - /// - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings")] - public abstract string Url - { - get; - } - - /// - /// The Caption of the node. - /// - /// - public abstract string Caption - { - get; - } - - /// - /// The item type guid associated to a node. - /// - /// - public abstract Guid ItemTypeGuid - { - get; - } - #endregion - - #region virtual properties - /// - /// Defines a string that is used to separate the name relation from the extension - /// - public virtual string NameRelationSeparator - { - get - { - return "."; - } - } - - - public virtual int MenuCommandId - { - get { return VsMenus.IDM_VS_CTXT_NOCOMMANDS; } - } - - - /// - /// Return an imageindex - /// - /// - public virtual int ImageIndex - { - get { return NoImage; } - } - - /// - /// Return an state icon index - /// - /// - /// - /// Sets the state icon for a file. - /// - public virtual VsStateIcon StateIconIndex - { - get - { - if (!this.ExcludeNodeFromScc) - { - IVsSccManager2 sccManager = this.ProjectMgr.Site.GetService(typeof(SVsSccManager)) as IVsSccManager2; - - if (sccManager != null) - { - VsStateIcon[] statIcons = new VsStateIcon[1] { VsStateIcon.STATEICON_NOSTATEICON }; - uint[] sccStatus = new uint[1] { 0 }; - // Get the glyph from the scc manager. Note that it will fail in command line - // scenarios. - if (ErrorHandler.Succeeded(sccManager.GetSccGlyph(1, new string[] { this.GetMkDocument() }, statIcons, sccStatus))) - { - return statIcons[0]; - } - } - } - - return VsStateIcon.STATEICON_NOSTATEICON; - } - } - - /// - /// Defines whether a node can execute a command if in selection. - /// - public virtual bool CanExecuteCommand - { - get - { - return true; - } - } - - /// - /// Used to determine the sort order of different node types - /// in the solution explorer window. - /// Nodes with the same priorities are sorted based on their captions. - /// - public virtual int SortPriority - { - get { return DefaultSortOrderNode.HierarchyNode; } - } - - /// - /// Defines the properties attached to this node. - /// - public virtual NodeProperties NodeProperties - { - get - { - if (null == nodeProperties) - { - nodeProperties = CreatePropertiesObject(); - } - return this.nodeProperties; - } - - } - - /// - /// Returns an object that is a special view over this object; this is the value - /// returned by the Object property of the automation objects. - /// - internal virtual object Object - { - get { return this; } - } - #endregion - - #region properties - - public OleServiceProvider OleServiceProvider - { - get - { - return this.oleServiceProvider; - } - } - - [System.ComponentModel.BrowsableAttribute(false)] - public ProjectNode ProjectMgr - { - get - { - return this.projectMgr; - } - set - { - this.projectMgr = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public HierarchyNode NextSibling - { - get - { - return this.nextSibling; - } - set - { - this.nextSibling = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public HierarchyNode FirstChild - { - get - { - return this.firstChild; - } - set - { - this.firstChild = value; - } - } - - [System.ComponentModel.BrowsableAttribute(false)] - public HierarchyNode LastChild - { - get - { - return this.lastChild; - } - set - { - this.lastChild = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public HierarchyNode Parent - { - get - { - return this.parentNode; - } - set - { - this.parentNode = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] - public uint ID - { - get - { - return this.hierarchyId; - } - internal set - { - this.hierarchyId = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public ProjectElement ItemNode - { - get - { - return itemNode; - } - set - { - itemNode = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public bool HasDesigner - { - get - { - return this.hasDesigner; - } - set { this.hasDesigner = value; } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public bool IsExpanded - { - get - { - return this.isExpanded; - } - set { this.isExpanded = value; } - } - - public string VirtualNodeName - { - get - { - return this.virtualNodeName; - } - set - { - this.virtualNodeName = value; - } - } - - - [System.ComponentModel.BrowsableAttribute(false)] - public HierarchyNode PreviousSibling - { - get - { - if (this.parentNode == null) return null; - HierarchyNode prev = null; - for (HierarchyNode child = this.parentNode.firstChild; child != null; child = child.nextSibling) - { - if (child == this) - break; - prev = child; - } - return prev; - } - } - - public uint DocCookie - { - get - { - return this.docCookie; - } - set - { - this.docCookie = value; - } - } - - /// - /// Specifies if a Node is under source control. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - public bool ExcludeNodeFromScc - { - get - { - return this.excludeNodeFromScc; - } - set - { - this.excludeNodeFromScc = value; - } - } - - /// - /// Defines if a node a name relation to its parent node - /// - /// - public bool HasParentNodeNameRelation - { - get - { - return this.hasParentNodeNameRelation; - } - set - { - this.hasParentNodeNameRelation = value; - } - } - - protected bool SourceDraggedOrCutOrCopied - { - get - { - return this.sourceDraggedOrCutOrCopied; - } - set - { - this.sourceDraggedOrCutOrCopied = value; - } - } - - protected IList ItemsDraggedOrCutOrCopied - { - get - { - return this.itemsDraggedOrCutOrCopied; - } - } - #endregion - - #region ctors - - protected HierarchyNode() - { - this.IsExpanded = true; - } - - protected HierarchyNode(ProjectNode root, ProjectElement element) - { - if (root == null) - { - throw new ArgumentNullException("root"); - } - - this.projectMgr = root; - this.itemNode = element; - this.hierarchyId = this.projectMgr.ItemIdMap.Add(this); - this.oleServiceProvider.AddService(typeof(IVsHierarchy), root, false); - } - - /// - /// Overloaded ctor. - /// - /// - protected HierarchyNode(ProjectNode root) - { - if (root == null) - { - throw new ArgumentNullException("root"); - } - - this.projectMgr = root; - this.itemNode = new ProjectElement(this.projectMgr, null, true); - this.hierarchyId = this.projectMgr.ItemIdMap.Add(this); - this.oleServiceProvider.AddService(typeof(IVsHierarchy), root, false); - } - #endregion - - #region virtual methods - /// - /// Creates an object derived from NodeProperties that will be used to expose properties - /// spacific for this object to the property browser. - /// - /// - protected virtual NodeProperties CreatePropertiesObject() - { - return null; - } - - /// - /// Return an iconhandle - /// - /// - /// - public virtual object GetIconHandle(bool open) - { - return null; - } - - /// - /// AddChild - add a node, sorted in the right location. - /// - /// The node to add. - public virtual void AddChild(HierarchyNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - // make sure the node is in the map. - Object nodeWithSameID = this.projectMgr.ItemIdMap[node.hierarchyId]; - if (!Object.ReferenceEquals(node, nodeWithSameID as HierarchyNode)) - { - if (nodeWithSameID == null && node.ID <= this.ProjectMgr.ItemIdMap.Count) - { // reuse our hierarchy id if possible. - this.projectMgr.ItemIdMap.SetAt(node.hierarchyId, this); - } - else - { - throw new InvalidOperationException(); - } - } - - HierarchyNode previous = null; - for (HierarchyNode n = this.firstChild; n != null; n = n.nextSibling) - { - if (this.ProjectMgr.CompareNodes(node, n) > 0) break; - previous = n; - } - // insert "node" after "previous". - if (previous != null) - { - node.nextSibling = previous.nextSibling; - previous.nextSibling = node; - if (previous == this.lastChild) - { - this.lastChild = node; - } - } - else - { - if (this.lastChild == null) - { - this.lastChild = node; - } - node.nextSibling = this.firstChild; - this.firstChild = node; - } - node.parentNode = this; - this.OnItemAdded(this, node); - } - - /// - /// Removes a node from the hierarchy. - /// - /// The node to remove. - public virtual void RemoveChild(HierarchyNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - this.projectMgr.ItemIdMap.Remove(node); - - HierarchyNode last = null; - for (HierarchyNode n = this.firstChild; n != null; n = n.nextSibling) - { - if (n == node) - { - if (last != null) - { - last.nextSibling = n.nextSibling; - } - if (n == this.lastChild) - { - if (last == this.lastChild) - { - this.lastChild = null; - } - else - { - this.lastChild = last; - } - } - if (n == this.firstChild) - { - this.firstChild = n.nextSibling; - } - return; - } - last = n; - } - throw new InvalidOperationException("Node not found"); - } - - /// - /// Returns an automation object representing this node - /// - /// The automation object - public virtual object GetAutomationObject() - { - return new Automation.OAProjectItem(this.projectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - /// - /// Returns a property object based on a property id - /// - /// the property id of the property requested - /// the property object requested - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - public virtual object GetProperty(int propId) - { - object result = null; - switch ((__VSHPROPID)propId) - { - case __VSHPROPID.VSHPROPID_Expandable: - result = (this.firstChild != null); - break; - - case __VSHPROPID.VSHPROPID_Caption: - result = this.Caption; - break; - - case __VSHPROPID.VSHPROPID_Name: - result = this.Caption; - break; - - case __VSHPROPID.VSHPROPID_ExpandByDefault: - result = false; - break; - - case __VSHPROPID.VSHPROPID_IconImgList: - result = this.ProjectMgr.ImageHandler.ImageList.Handle; - break; - - case __VSHPROPID.VSHPROPID_OpenFolderIconIndex: - case __VSHPROPID.VSHPROPID_IconIndex: - int index = this.ImageIndex; - if (index != NoImage) - { - result = index; - } - break; - - case __VSHPROPID.VSHPROPID_StateIconIndex: - result = (int)this.StateIconIndex; - break; - - case __VSHPROPID.VSHPROPID_IconHandle: - result = GetIconHandle(false); - break; - - case __VSHPROPID.VSHPROPID_OpenFolderIconHandle: - result = GetIconHandle(true); - break; - - case __VSHPROPID.VSHPROPID_NextVisibleSibling: - goto case __VSHPROPID.VSHPROPID_NextSibling; - - case __VSHPROPID.VSHPROPID_NextSibling: - result = (int)((this.nextSibling != null) ? this.nextSibling.hierarchyId : VSConstants.VSITEMID_NIL); - break; - - case __VSHPROPID.VSHPROPID_FirstChild: - goto case __VSHPROPID.VSHPROPID_FirstVisibleChild; - - case __VSHPROPID.VSHPROPID_FirstVisibleChild: - result = (int)((this.firstChild != null) ? this.firstChild.hierarchyId : VSConstants.VSITEMID_NIL); - break; - - case __VSHPROPID.VSHPROPID_Parent: - if (null == this.parentNode) - { - unchecked { result = new IntPtr((int)VSConstants.VSITEMID_NIL); } - } - else - { - result = new IntPtr((int)this.parentNode.hierarchyId); // see bug 176470 - } - break; - - case __VSHPROPID.VSHPROPID_ParentHierarchyItemid: - if (parentHierarchy != null) - { - result = (int)parentHierarchyItemId; // VS requires VT_I4 | VT_INT_PTR - } - break; - - case __VSHPROPID.VSHPROPID_ParentHierarchy: - result = parentHierarchy; - break; - - case __VSHPROPID.VSHPROPID_Root: - result = Marshal.GetIUnknownForObject(this.projectMgr); - break; - - case __VSHPROPID.VSHPROPID_Expanded: - result = this.isExpanded; - break; - - case __VSHPROPID.VSHPROPID_BrowseObject: - result = this.NodeProperties; - //if (result != null) result = new DispatchWrapper(result); - break; - - case __VSHPROPID.VSHPROPID_EditLabel: - if (this.ProjectMgr != null && !this.ProjectMgr.IsClosed && !this.ProjectMgr.IsCurrentStateASuppressCommandsMode()) - { - result = GetEditLabel(); - } - break; - - case __VSHPROPID.VSHPROPID_SaveName: - //SaveName is the name shown in the Save and the Save Changes dialog boxes. - result = this.Caption; - break; - - case __VSHPROPID.VSHPROPID_ItemDocCookie: - if (this.docCookie != 0) return (IntPtr)this.docCookie; //cast to IntPtr as some callers expect VT_INT - break; - - case __VSHPROPID.VSHPROPID_ExtObject: - result = GetAutomationObject(); - break; - } - - __VSHPROPID2 id2 = (__VSHPROPID2)propId; - switch (id2) - { - case __VSHPROPID2.VSHPROPID_NoDefaultNestedHierSorting: - return true; // We are doing the sorting ourselves through VSHPROPID_FirstChild and VSHPROPID_NextSibling - case __VSHPROPID2.VSHPROPID_BrowseObjectCATID: - { - // If there is a browse object and it is a NodeProperties, then get it's CATID - object browseObject = this.GetProperty((int)__VSHPROPID.VSHPROPID_BrowseObject); - if (browseObject != null) - { - if (browseObject is DispatchWrapper) - browseObject = ((DispatchWrapper)browseObject).WrappedObject; - result = this.ProjectMgr.GetCATIDForType(browseObject.GetType()).ToString("B"); - if (String.CompareOrdinal(result as string, Guid.Empty.ToString("B")) == 0) - result = null; - } - break; - } - case __VSHPROPID2.VSHPROPID_ExtObjectCATID: - { - // If there is a extensibility object and it is a NodeProperties, then get it's CATID - object extObject = this.GetProperty((int)__VSHPROPID.VSHPROPID_ExtObject); - if (extObject != null) - { - if (extObject is DispatchWrapper) - extObject = ((DispatchWrapper)extObject).WrappedObject; - result = this.ProjectMgr.GetCATIDForType(extObject.GetType()).ToString("B"); - if (String.CompareOrdinal(result as string, Guid.Empty.ToString("B")) == 0) - result = null; - } - break; - } - } - - __VSHPROPID4 id4 = (__VSHPROPID4)propId; - switch (id4) - { - case __VSHPROPID4.VSHPROPID_TargetFrameworkMoniker: - result = this.ProjectMgr.TargetFrameworkMoniker.FullName; - break; - } - -#if DEBUG - if (propId != LastTracedProperty) - { - string trailer = (result == null) ? "null" : result.ToString(); - CCITracing.TraceCall(this.hierarchyId + "," + propId.ToString() + " = " + trailer); - LastTracedProperty = propId; // some basic filtering here... - } -#endif - return result; - } - - /// - /// Sets the value of a property for a given property id - /// - /// the property id of the property to be set - /// value of the property - /// S_OK if succeeded - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "propid")] - public virtual int SetProperty(int propid, object value) - { - __VSHPROPID id = (__VSHPROPID)propid; - - CCITracing.TraceCall(this.hierarchyId + "," + id.ToString()); - switch (id) - { - case __VSHPROPID.VSHPROPID_Expanded: - this.isExpanded = (bool)value; - break; - - case __VSHPROPID.VSHPROPID_ParentHierarchy: - parentHierarchy = (IVsHierarchy)value; - break; - - case __VSHPROPID.VSHPROPID_ParentHierarchyItemid: - parentHierarchyItemId = (int)value; - break; - - case __VSHPROPID.VSHPROPID_EditLabel: - return SetEditLabel((string)value); - - default: - CCITracing.TraceCall(" unhandled"); - break; - } - - __VSHPROPID4 id4 = (__VSHPROPID4)propid; - switch (id4) - { - case __VSHPROPID4.VSHPROPID_TargetFrameworkMoniker: - this.ProjectMgr.TargetFrameworkMoniker = new FrameworkName((string)value); - break; - } - - return VSConstants.S_OK; - } - - /// - /// Get a guid property - /// - /// property id for the guid property requested - /// the requested guid - /// S_OK if succeded - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "propid")] - public virtual int GetGuidProperty(int propid, out Guid guid) - { - guid = Guid.Empty; - if (propid == (int)__VSHPROPID.VSHPROPID_TypeGuid) - { - guid = this.ItemTypeGuid; - } - - if (guid.CompareTo(Guid.Empty) == 0) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - - return VSConstants.S_OK; - } - - /// - /// Set a guid property. - /// - /// property id of the guid property to be set - /// the guid to be set - /// E_NOTIMPL - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "propid")] - public virtual int SetGuidProperty(int propid, ref Guid guid) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called by the shell when a node has been renamed from the GUI - /// - /// - /// E_NOTIMPL - public virtual int SetEditLabel(string label) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called by the shell to get the node caption when the user tries to rename from the GUI - /// - /// the node cation - public virtual string GetEditLabel() - { - return this.Caption; - } - - /// - /// This method is called by the interface method GetMkDocument to specify the item moniker. - /// - /// The moniker for this item - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Mk")] - public virtual string GetMkDocument() - { - return String.Empty; - } - - /// - /// Removes items from the hierarchy. Project overwrites this - /// - /// - public virtual void Remove(bool removeFromStorage) - { - string documentToRemove = this.GetMkDocument(); - - // Ask Document tracker listeners if we can remove the item. - string[] filesToBeDeleted = new string[1] { documentToRemove }; - VSQUERYREMOVEFILEFLAGS[] queryRemoveFlags = this.GetQueryRemoveFileFlags(filesToBeDeleted); - if (!this.ProjectMgr.Tracker.CanRemoveItems(filesToBeDeleted, queryRemoveFlags)) - { - return; - } - - // Close the document if it has a manager. - DocumentManager manager = this.GetDocumentManager(); - if (manager != null) - { - if (manager.Close(!removeFromStorage ? __FRAMECLOSE.FRAMECLOSE_PromptSave : __FRAMECLOSE.FRAMECLOSE_NoSave) == VSConstants.E_ABORT) - { - // User cancelled operation in message box. - return; - } - } - - // Check out the project file. - if (!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - // Notify hierarchy event listeners that the file is going to be removed. - OnItemDeleted(); - - // Remove child if any before removing from the hierarchy - for (HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - child.Remove(removeFromStorage); - } - - // the project node has no parentNode - if (this.parentNode != null) - { - // Remove from the Hierarchy - this.parentNode.RemoveChild(this); - } - - // We save here the path to delete since this.Url might call the Include which will be deleted by the RemoveFromProjectFile call. - string pathToDelete = this.GetMkDocument(); - this.itemNode.RemoveFromProjectFile(); - - if (removeFromStorage) - { - this.DeleteFromStorage(pathToDelete); - } - - // Close the document window if opened. - CloseDocumentWindow(this); - - // Notify document tracker listeners that we have removed the item. - VSREMOVEFILEFLAGS[] removeFlags = this.GetRemoveFileFlags(filesToBeDeleted); - Debug.Assert(removeFlags != null, "At least an empty array should be returned for the GetRemoveFileFlags"); - this.ProjectMgr.Tracker.OnItemRemoved(documentToRemove, removeFlags[0]); - - // Notify hierarchy event listeners that we have removed the item - if (null != this.parentNode.onChildRemoved) - { - HierarchyNodeEventArgs args = new HierarchyNodeEventArgs(this); - parentNode.onChildRemoved(parentNode, args); - } - - // Notify hierarchy event listeners that items have been invalidated - OnInvalidateItems(this.parentNode); - - // Dispose the node now that is deleted. - this.Dispose(true); - } - - /// - /// Returns the relational name which is defined as the first part of the caption until indexof NameRelationSeparator - /// - public virtual string GetRelationalName() - { - //Get the first part of the caption - string[] partsOfParent = this.Caption.Split(new string[] { this.NameRelationSeparator }, StringSplitOptions.None); - return partsOfParent[0]; - } - - /// - /// Returns the 'extension' of the relational name - /// e.g. form1.resx returns .resx, form1.designer.cs returns .designer.cs - /// - /// The extension - public virtual string GetRelationNameExtension() - { - return this.Caption.Substring(this.Caption.IndexOf(this.NameRelationSeparator, StringComparison.Ordinal)); - } - - /// - /// Close open document frame for a specific node. - /// - protected void CloseDocumentWindow(HierarchyNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - // We walk the RDT looking for all running documents attached to this hierarchy and itemid. There - // are cases where there may be two different editors (not views) open on the same document. - IEnumRunningDocuments pEnumRdt; - IVsRunningDocumentTable pRdt = this.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - if (pRdt == null) - { - throw new InvalidOperationException(); - } - if (ErrorHandler.Succeeded(pRdt.GetRunningDocumentsEnum(out pEnumRdt))) - { - uint[] cookie = new uint[1]; - uint fetched; - uint saveOptions = (uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_NoSave; - IVsHierarchy srpOurHier = node.projectMgr.InteropSafeIVsHierarchy; - - ErrorHandler.ThrowOnFailure(pEnumRdt.Reset()); - while (VSConstants.S_OK == pEnumRdt.Next(1, cookie, out fetched)) - { - // Note we can pass NULL for all parameters we don't care about - uint empty; - string emptyStr; - IntPtr ppunkDocData; - IVsHierarchy srpHier; - uint itemid = VSConstants.VSITEMID_NIL; - - ErrorHandler.ThrowOnFailure(pRdt.GetDocumentInfo( - cookie[0], - out empty, - out empty, - out empty, - out emptyStr, - out srpHier, - out itemid, - out ppunkDocData)); - - // Is this one of our documents? - if (Utilities.IsSameComObject(srpOurHier, srpHier) && itemid == node.ID) - { - IVsSolution soln = GetService(typeof(SVsSolution)) as IVsSolution; - ErrorHandler.ThrowOnFailure(soln.CloseSolutionElement(saveOptions, srpOurHier, cookie[0])); - } - if (ppunkDocData != IntPtr.Zero) - Marshal.Release(ppunkDocData); - - } - } - } - - /// - /// Redraws the state icon if the node is not excluded from source control. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - protected internal virtual void UpdateSccStateIcons() - { - if (!this.ExcludeNodeFromScc) - { - this.ReDraw(UIHierarchyElement.SccState); - } - } - - /// - /// To be overwritten by descendants. - /// - protected internal virtual int SetEditLabel(string label, string relativePath) - { - throw new NotImplementedException(); - } - - /// - /// Called by the drag and drop implementation to ask the node - /// which is being dragged/droped over which nodes should - /// process the operation. - /// This allows for dragging to a node that cannot contain - /// items to let its parent accept the drop - /// - /// HierarchyNode that accept the drop handling - protected internal virtual HierarchyNode GetDragTargetHandlerNode() - { - return this; - } - - /// - /// Add a new Folder to the project hierarchy. - /// - /// S_OK if succeeded, otherwise an error - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] - protected virtual int AddNewFolder() - { - // Check out the project file. - if (!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - try - { - // Generate a new folder name - string newFolderName; - ErrorHandler.ThrowOnFailure(this.projectMgr.GenerateUniqueItemName(this.hierarchyId, String.Empty, String.Empty, out newFolderName)); - - // create the project part of it, the project file - HierarchyNode child = this.ProjectMgr.CreateFolderNodes(Path.Combine(this.virtualNodeName, newFolderName)); - - if (child is FolderNode) - { - ((FolderNode)child).CreateDirectory(); - } - - // If we are in automation mode then skip the ui part which is about renaming the folder - if (!Utilities.IsInAutomationFunction(this.projectMgr.Site)) - { - IVsUIHierarchyWindow uiWindow = UIHierarchyUtilities.GetUIHierarchyWindow(this.projectMgr.Site, SolutionExplorer); - // This happens in the context of adding a new folder. - // Since we are already in solution explorer, it is extremely unlikely that we get a null return. - // If we do, the newly created folder will not be selected, and we will not attempt the rename - // command (since we are selecting the wrong item). - if (uiWindow != null) - { - // we need to get into label edit mode now... - // so first select the new guy... - ErrorHandler.ThrowOnFailure(uiWindow.ExpandItem(this.projectMgr.InteropSafeIVsUIHierarchy, child.hierarchyId, EXPANDFLAGS.EXPF_SelectItem)); - // them post the rename command to the shell. Folder verification and creation will - // happen in the setlabel code... - IVsUIShell shell = this.projectMgr.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if (shell == null) - { - return VSConstants.E_FAIL; - } - - object dummy = null; - Guid cmdGroup = VsMenus.guidStandardCommandSet97; - ErrorHandler.ThrowOnFailure(shell.PostExecCommand(ref cmdGroup, (uint)VsCommands.Rename, 0, ref dummy)); - } - } - } - catch (COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - return e.ErrorCode; - } - - return VSConstants.S_OK; - } - - protected virtual int AddItemToHierarchy(HierarchyAddType addType) - { - CCITracing.TraceCall(); - IVsAddProjectItemDlg addItemDialog; - - string strFilter = String.Empty; - int iDontShowAgain; - uint uiFlags; - IVsProject3 project = this.projectMgr.InteropSafeIVsProject3; - - string strBrowseLocations = Path.GetDirectoryName(this.projectMgr.BaseURI.Uri.LocalPath); - - System.Guid projectGuid = this.projectMgr.ProjectGuid; - - addItemDialog = this.GetService(typeof(IVsAddProjectItemDlg)) as IVsAddProjectItemDlg; - - if (addType == HierarchyAddType.AddNewItem) - uiFlags = (uint)(__VSADDITEMFLAGS.VSADDITEM_AddNewItems | __VSADDITEMFLAGS.VSADDITEM_SuggestTemplateName | __VSADDITEMFLAGS.VSADDITEM_AllowHiddenTreeView); - else - uiFlags = (uint)(__VSADDITEMFLAGS.VSADDITEM_AddExistingItems | __VSADDITEMFLAGS.VSADDITEM_AllowMultiSelect | __VSADDITEMFLAGS.VSADDITEM_AllowStickyFilter); - - ErrorHandler.ThrowOnFailure(addItemDialog.AddProjectItemDlg(this.hierarchyId, ref projectGuid, project, uiFlags, null, null, ref strBrowseLocations, ref strFilter, out iDontShowAgain)); /*&fDontShowAgain*/ - - return VSConstants.S_OK; - } - - /// - /// Overwritten in subclasses - /// - protected virtual void DoDefaultAction() - { - CCITracing.TraceCall(); - } - - /// - /// Handles the exclude from project command. - /// - /// - protected virtual int ExcludeFromProject() - { - Debug.Assert(this.ProjectMgr != null, "The project item " + this.ToString() + " has not been initialised correctly. It has a null ProjectMgr"); - this.Remove(false); - return VSConstants.S_OK; - } - - /// - /// Handles the Show in Designer command. - /// - /// - protected virtual int ShowInDesigner(IList selectedNodes) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Prepares a selected node for clipboard. - /// It takes the the project reference string of this item and adds it to a stringbuilder. - /// - /// A stringbuilder. - /// This method has to be public since seleceted nodes will call it. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ClipBoard")] - protected internal virtual StringBuilder PrepareSelectedNodesForClipBoard() - { - Debug.Assert(this.ProjectMgr != null, " No project mananager available for this node " + ToString()); - Debug.Assert(this.ProjectMgr.ItemsDraggedOrCutOrCopied != null, " The itemsdragged list should have been initialized prior calling this method"); - StringBuilder sb = new StringBuilder(); - - if (this.hierarchyId == VSConstants.VSITEMID_ROOT) - { - if (this.ProjectMgr.ItemsDraggedOrCutOrCopied != null) - { - this.ProjectMgr.ItemsDraggedOrCutOrCopied.Clear();// abort - } - return sb; - } - - if (this.ProjectMgr.ItemsDraggedOrCutOrCopied != null) - { - this.ProjectMgr.ItemsDraggedOrCutOrCopied.Add(this); - } - - string projref = String.Empty; - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - if (solution != null) - { - ErrorHandler.ThrowOnFailure(solution.GetProjrefOfItem(this.ProjectMgr.InteropSafeIVsHierarchy, this.hierarchyId, out projref)); - if (String.IsNullOrEmpty(projref)) - { - if (this.ProjectMgr.ItemsDraggedOrCutOrCopied != null) - { - this.ProjectMgr.ItemsDraggedOrCutOrCopied.Clear();// abort - } - return sb; - } - } - - // Append the projectref and a null terminator to the string builder - sb.Append(projref); - sb.Append('\0'); - - return sb; - } - - /// - /// Returns the Cannonical Name - /// - /// Cannonical Name - protected virtual string GetCanonicalName() - { - return this.GetMkDocument(); - } - - /// - /// Factory method for the Document Manager object - /// - /// null object, since a hierarchy node does not know its kind of document - /// Must be overriden by derived node classes if a document manager is needed - protected internal virtual DocumentManager GetDocumentManager() - { - return null; - } - - /// - /// Displays the context menu. - /// - /// list of selected nodes. - /// contains the location (x,y) at which to show the menu. - [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "pointer")] - protected virtual int DisplayContextMenu(IList selectedNodes, IntPtr pointerToVariant) - { - if (selectedNodes == null || selectedNodes.Count == 0 || pointerToVariant == IntPtr.Zero) - { - return NativeMethods.OLECMDERR_E_NOTSUPPORTED; - } - - int idmxStoredMenu = 0; - - foreach (HierarchyNode node in selectedNodes) - { - // We check here whether we have a multiple selection of - // nodes of differing type. - if (idmxStoredMenu == 0) - { - // First time through or single node case - idmxStoredMenu = node.MenuCommandId; - } - else if (idmxStoredMenu != node.MenuCommandId) - { - // We have different node types. Check if any of the nodes is - // the project node and set the menu accordingly. - if (node.MenuCommandId == VsMenus.IDM_VS_CTXT_PROJNODE) - { - idmxStoredMenu = VsMenus.IDM_VS_CTXT_XPROJ_PROJITEM; - } - else - { - idmxStoredMenu = VsMenus.IDM_VS_CTXT_XPROJ_MULTIITEM; - } - } - } - - object variant = Marshal.GetObjectForNativeVariant(pointerToVariant); - UInt32 pointsAsUint = (UInt32)variant; - short x = (short)(pointsAsUint & 0x0000ffff); - short y = (short)((pointsAsUint & 0xffff0000) / 0x10000); - - - POINTS points = new POINTS(); - points.x = x; - points.y = y; - return ShowContextMenu(idmxStoredMenu, VsMenus.guidSHLMainMenu, points); - } - - /// - /// Shows the specified context menu at a specified location. - /// - /// The context menu ID. - /// The GUID of the menu group. - /// The location at which to show the menu. - protected virtual int ShowContextMenu(int menuId, Guid menuGroup, POINTS points) - { - IVsUIShell shell = this.projectMgr.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if (shell == null) - { - return VSConstants.E_FAIL; - } - POINTS[] pnts = new POINTS[1]; - pnts[0].x = points.x; - pnts[0].y = points.y; - return shell.ShowContextMenu(0, ref menuGroup, menuId, pnts, (IOleCommandTarget)this); - } - - #region initiation of command execution - /// - /// Handles command execution. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Values describe how the object should execute the command. - /// Pointer to a VARIANTARG structure containing input arguments. Can be NULL - /// VARIANTARG structure to receive command output. Can be NULL. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cmdexecopt")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "n")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "pva")] - protected virtual int ExecCommandOnNode(Guid cmdGroup, uint cmd, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) - { - if (this.projectMgr == null || this.projectMgr.IsClosed) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - if (cmdGroup == Guid.Empty) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - else if (cmdGroup == VsMenus.guidVsUIHierarchyWindowCmds) - { - switch (cmd) - { - case (uint)VSConstants.VsUIHierarchyWindowCmdIds.UIHWCMDID_DoubleClick: - case (uint)VSConstants.VsUIHierarchyWindowCmdIds.UIHWCMDID_EnterKey: - this.DoDefaultAction(); - return VSConstants.S_OK; - } - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - else if (cmdGroup == VsMenus.guidStandardCommandSet97) - { - HierarchyNode nodeToAddTo = this.GetDragTargetHandlerNode(); - switch ((VsCommands)cmd) - { - case VsCommands.AddNewItem: - return nodeToAddTo.AddItemToHierarchy(HierarchyAddType.AddNewItem); - - case VsCommands.AddExistingItem: - return nodeToAddTo.AddItemToHierarchy(HierarchyAddType.AddExistingItem); - - case VsCommands.NewFolder: - return nodeToAddTo.AddNewFolder(); - - case VsCommands.Paste: - return this.ProjectMgr.PasteFromClipboard(this); - } - - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)cmd) - { - case VsCommands2K.EXCLUDEFROMPROJECT: - return this.ExcludeFromProject(); - } - } - - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Executes a command that can only be executed once the whole selection is known. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Values describe how the object should execute the command. - /// Pointer to a VARIANTARG structure containing input arguments. Can be NULL - /// VARIANTARG structure to receive command output. Can be NULL. - /// The origin of the command. From IOleCommandTarget or hierarchy. - /// The list of the selected nodes. - /// An out parameter specifying that the command was handled. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "vaIn")] - protected virtual int ExecCommandThatDependsOnSelectedNodes(Guid cmdGroup, uint cmdId, uint cmdExecOpt, IntPtr vaIn, IntPtr vaOut, CommandOrigin commandOrigin, IList selectedNodes, out bool handled) - { - handled = false; - if (cmdGroup == VsMenus.guidVsUIHierarchyWindowCmds) - { - switch (cmdId) - { - case (uint)VSConstants.VsUIHierarchyWindowCmdIds.UIHWCMDID_RightClick: - // The UIHWCMDID_RightClick is what tells an IVsUIHierarchy in a UIHierarchyWindow - // to put up the context menu. Since the mouse may have moved between the - // mouse down and the mouse up, GetCursorPos won't tell you the right place - // to put the context menu (especially if it came through the keyboard). - // So we pack the proper menu position into pvaIn by - // memcpy'ing a POINTS struct into the VT_UI4 part of the pvaIn variant. The - // code to unpack it looks like this: - // ULONG ulPts = V_UI4(pvaIn); - // POINTS pts; - // memcpy((void*)&pts, &ulPts, sizeof(POINTS)); - // You then pass that POINTS into DisplayContextMenu. - handled = true; - return this.DisplayContextMenu(selectedNodes, vaIn); - default: - break; - } - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)cmdId) - { - case VsCommands2K.ViewInClassDiagram: - handled = true; - return this.ShowInDesigner(selectedNodes); - } - } - - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Executes command that are independent of a selection. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Values describe how the object should execute the command. - /// Pointer to a VARIANTARG structure containing input arguments. Can be NULL - /// VARIANTARG structure to receive command output. Can be NULL. - /// The origin of the command. From IOleCommandTarget or hierarchy. - /// An out parameter specifying that the command was handled. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "vaIn")] - protected virtual int ExecCommandIndependentOfSelection(Guid cmdGroup, uint cmdId, uint cmdExecOpt, IntPtr vaIn, IntPtr vaOut, CommandOrigin commandOrigin, out bool handled) - { - handled = false; - - if (this.projectMgr == null || this.projectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - if (cmdGroup == VsMenus.guidStandardCommandSet97) - { - if (commandOrigin == CommandOrigin.OleCommandTarget) - { - switch ((VsCommands)cmdId) - { - case VsCommands.Cut: - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Rename: - handled = true; - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - } - - switch ((VsCommands)cmdId) - { - case VsCommands.Copy: - handled = true; - return this.ProjectMgr.CopyToClipboard(); - - case VsCommands.Cut: - handled = true; - return this.ProjectMgr.CutToClipboard(); - - case VsCommands.SolutionCfg: - handled = true; - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - - case VsCommands.SearchCombo: - handled = true; - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - - } - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - // There should only be the project node who handles these and should manifest in the same action regardles of selection. - switch ((VsCommands2K)cmdId) - { - case VsCommands2K.SHOWALLFILES: - handled = true; - return this.projectMgr.ShowAllFiles(); - case VsCommands2K.ADDREFERENCE: - handled = true; - return this.projectMgr.AddProjectReference(); - case VsCommands2K.ADDWEBREFERENCE: - handled = true; - return this.projectMgr.AddWebReference(); - } - } - - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// The main entry point for command excection. Gets called from the IVsUIHierarchy and IOleCommandTarget methods. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Values describe how the object should execute the command. - /// Pointer to a VARIANTARG structure containing input arguments. Can be NULL - /// VARIANTARG structure to receive command output. Can be NULL. - /// The origin of the command. From IOleCommandTarget or hierarchy. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "vaIn")] - protected virtual int InternalExecCommand(Guid cmdGroup, uint cmdId, uint cmdExecOpt, IntPtr vaIn, IntPtr vaOut, CommandOrigin commandOrigin) - { - CCITracing.TraceCall(cmdGroup.ToString() + "," + cmdId.ToString()); - if (this.projectMgr == null || this.projectMgr.IsClosed) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - if (cmdGroup == Guid.Empty) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - IList selectedNodes = this.projectMgr.GetSelectedNodes(); - - // Check if all nodes can execute a command. If there is at least one that cannot return not handled. - foreach (HierarchyNode node in selectedNodes) - { - if (!node.CanExecuteCommand) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - } - - // Handle commands that are independent of a selection. - bool handled = false; - int returnValue = this.ExecCommandIndependentOfSelection(cmdGroup, cmdId, cmdExecOpt, vaIn, vaOut, commandOrigin, out handled); - if (handled) - { - return returnValue; - } - - - // Now handle commands that need the selected nodes as input parameter. - returnValue = this.ExecCommandThatDependsOnSelectedNodes(cmdGroup, cmdId, cmdExecOpt, vaIn, vaOut, commandOrigin, selectedNodes, out handled); - if (handled) - { - return returnValue; - } - - returnValue = (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - - // Handle commands iteratively. The same action will be executed for all of the selected items. - foreach (HierarchyNode node in selectedNodes) - { - try - { - returnValue = node.ExecCommandOnNode(cmdGroup, cmdId, cmdExecOpt, vaIn, vaOut); - } - catch (COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - returnValue = e.ErrorCode; - } - if (returnValue != VSConstants.S_OK) - { - break; - } - } - - if (returnValue == VSConstants.E_ABORT || returnValue == VSConstants.OLE_E_PROMPTSAVECANCELLED) - { - returnValue = VSConstants.S_OK; - } - - return returnValue; - } - - #endregion - - #region query command handling - /// - /// Handles menus originating from IOleCommandTarget. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Specifies whether the menu was handled. - /// A QueryStatusResult describing the status of the menu. - protected virtual QueryStatusResult QueryStatusCommandFromOleCommandTarget(Guid cmdGroup, uint cmd, out bool handled) - { - handled = false; - // NOTE: We only want to support Cut/Copy/Paste/Delete/Rename commands - // if focus is in the project window. This means that we should only - // support these commands if they are dispatched via IVsUIHierarchy - // interface and not if they are dispatch through IOleCommandTarget - // during the command routing to the active project/hierarchy. - if (VsMenus.guidStandardCommandSet97 == cmdGroup) - { - - switch ((VsCommands)cmd) - { - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Cut: - case VsCommands.Rename: - handled = true; - return QueryStatusResult.NOTSUPPORTED; - } - } - // The reference menu and the web reference menu should always be shown. - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)cmd) - { - case VsCommands2K.ADDREFERENCE: - handled = true; - return QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - } - } - return QueryStatusResult.NOTSUPPORTED; - } - - /// - /// Specifies which command does not support multiple selection and should be disabled if multi-selected. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// The list of selected nodes. - /// Specifies whether the menu was handled. - /// A QueryStatusResult describing the status of the menu. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Multi")] - protected virtual QueryStatusResult DisableCommandOnNodesThatDoNotSupportMultiSelection(Guid cmdGroup, uint cmd, IList selectedNodes, out bool handled) - { - handled = false; - QueryStatusResult queryResult = QueryStatusResult.NOTSUPPORTED; - if (selectedNodes == null || selectedNodes.Count == 1) - { - return queryResult; - } - - if (VsMenus.guidStandardCommandSet97 == cmdGroup) - { - switch ((VsCommands)cmd) - { - case VsCommands.Cut: - case VsCommands.Copy: - // If the project node is selected then cut and copy is not supported. - if (selectedNodes.Contains(this.projectMgr)) - { - queryResult = QueryStatusResult.SUPPORTED | QueryStatusResult.INVISIBLE; - handled = true; - } - break; - - case VsCommands.Paste: - case VsCommands.NewFolder: - queryResult = QueryStatusResult.SUPPORTED | QueryStatusResult.INVISIBLE; - handled = true; - break; - } - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)cmd) - { - case VsCommands2K.QUICKOBJECTSEARCH: - case VsCommands2K.SETASSTARTPAGE: - case VsCommands2K.ViewInClassDiagram: - queryResult = QueryStatusResult.SUPPORTED | QueryStatusResult.INVISIBLE; - handled = true; - break; - } - } - - return queryResult; - } - - /// - /// Handles command status on a node. Should be overridden by descendant nodes. If a command cannot be handled then the base should be called. - /// - /// A unique identifier of the command group. The pguidCmdGroup parameter can be NULL to specify the standard group. - /// The command to query status for. - /// Pointer to an OLECMDTEXT structure in which to return the name and/or status information of a single command. Can be NULL to indicate that the caller does not require this information. - /// An out parameter specifying the QueryStatusResult of the command. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "p")] - protected virtual int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if ((VsCommands2K)cmd == VsCommands2K.SHOWALLFILES) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Disables commands when the project is in run/break mode. - /// / - /// Unique identifier of the command group - /// The command to be executed. - /// A QueryStatusResult describing the status of the menu. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity"), SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "InCurrent")] - protected virtual bool DisableCmdInCurrentMode(Guid commandGroup, uint command) - { - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return false; - } - - // Don't ask if it is not these two commandgroups. - if (commandGroup == VsMenus.guidStandardCommandSet97 || commandGroup == VsMenus.guidStandardCommandSet2K) - { - if (this.ProjectMgr.IsCurrentStateASuppressCommandsMode()) - { - if (commandGroup == VsMenus.guidStandardCommandSet97) - { - switch ((VsCommands)command) - { - default: - break; - case VsCommands.AddExistingItem: - case VsCommands.AddNewItem: - case VsCommands.NewFolder: - case VsCommands.Remove: - case VsCommands.Cut: - case VsCommands.Paste: - case VsCommands.Copy: - case VsCommands.EditLabel: - case VsCommands.Rename: - case VsCommands.UnloadProject: - return true; - } - } - else if (commandGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)command) - { - default: - break; - case VsCommands2K.EXCLUDEFROMPROJECT: - case VsCommands2K.INCLUDEINPROJECT: - case VsCommands2K.ADDWEBREFERENCECTX: - case VsCommands2K.ADDWEBREFERENCE: - case VsCommands2K.ADDREFERENCE: - case VsCommands2K.SETASSTARTPAGE: - return true; - } - } - } - // If we are not in a cut or copy mode then disable the paste command - else if (!this.ProjectMgr.AllowPasteCommand()) - { - if (commandGroup == VsMenus.guidStandardCommandSet97 && (VsCommands)command == VsCommands.Paste) - { - return true; - } - } - } - - return false; - } - - - /// - /// Queries the object for the command status on a list of selected nodes. - /// - /// A unique identifier of the command group. - /// The number of commands in the prgCmds array - /// A caller-allocated array of OLECMD structures that indicate the commands for which the caller requires status information. This method fills the cmdf member of each structure with values taken from the OLECMDF enumeration - /// Pointer to an OLECMDTEXT structure in which to return the name and/or status information of a single command. Can be NULL to indicate that the caller does not require this information. - /// Specifies the origin of the command. Either it was called from the QueryStatusCommand on IVsUIHierarchy or from the IOleCommandTarget - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cmds")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "c")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "p")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "prg")] - protected virtual int QueryStatusSelection(Guid cmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText, CommandOrigin commandOrigin) - { - if (this.projectMgr.IsClosed) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - if (cmdGroup == Guid.Empty) - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - - if (prgCmds == null) - { - throw new ArgumentNullException("prgCmds"); - } - - uint cmd = prgCmds[0].cmdID; - QueryStatusResult queryResult = QueryStatusResult.NOTSUPPORTED; - - // For now ask this node (that is the project node) to disable or enable a node. - // This is an optimization. Why should we ask each node for its current state? They all are in the same state. - // Also please note that we return QueryStatusResult.INVISIBLE instead of just QueryStatusResult.SUPPORTED. - // The reason is that if the project has nested projects, then providing just QueryStatusResult.SUPPORTED is not enough. - // What will happen is that the nested project will show grayed commands that belong to this project and does not belong to the nested project. (like special commands implemented by subclassed projects). - // The reason is that a special command comes in that is not handled because we are in debug mode. Then VsCore asks the nested project can you handle it. - // The nested project does not know about it, thus it shows it on the nested project as grayed. - if (this.DisableCmdInCurrentMode(cmdGroup, cmd)) - { - queryResult = QueryStatusResult.SUPPORTED | QueryStatusResult.INVISIBLE; - } - else - { - bool handled = false; - - if (commandOrigin == CommandOrigin.OleCommandTarget) - { - queryResult = this.QueryStatusCommandFromOleCommandTarget(cmdGroup, cmd, out handled); - } - - if (!handled) - { - IList selectedNodes = this.projectMgr.GetSelectedNodes(); - - // Want to disable in multiselect case. - if (selectedNodes != null && selectedNodes.Count > 1) - { - queryResult = this.DisableCommandOnNodesThatDoNotSupportMultiSelection(cmdGroup, cmd, selectedNodes, out handled); - } - - // Now go and do the job on the nodes. - if (!handled) - { - queryResult = this.QueryStatusSelectionOnNodes(selectedNodes, cmdGroup, cmd, pCmdText); - } - - } - } - - // Process the results set in the QueryStatusResult - if (queryResult != QueryStatusResult.NOTSUPPORTED) - { - // Set initial value - prgCmds[0].cmdf = (uint)OLECMDF.OLECMDF_SUPPORTED; - - if ((queryResult & QueryStatusResult.ENABLED) != 0) - { - prgCmds[0].cmdf |= (uint)OLECMDF.OLECMDF_ENABLED; - } - - if ((queryResult & QueryStatusResult.INVISIBLE) != 0) - { - prgCmds[0].cmdf |= (uint)OLECMDF.OLECMDF_INVISIBLE; - } - - if ((queryResult & QueryStatusResult.LATCHED) != 0) - { - prgCmds[0].cmdf |= (uint)OLECMDF.OLECMDF_LATCHED; - } - - return VSConstants.S_OK; - } - - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Queries the selected nodes for the command status. - /// A command is supported iff any nodes supports it. - /// A command is enabled iff all nodes enable it. - /// A command is invisible iff any node sets invisibility. - /// A command is latched only if all are latched. - /// - /// The list of selected nodes. - /// A unique identifier of the command group. - /// The command id to query for. - /// Pointer to an OLECMDTEXT structure in which to return the name and/or status information of a single command. Can be NULL to indicate that the caller does not require this information. - /// Retuns the result of the query on the slected nodes. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "p")] - protected virtual QueryStatusResult QueryStatusSelectionOnNodes(IList selectedNodes, Guid cmdGroup, uint cmd, IntPtr pCmdText) - { - if (selectedNodes == null || selectedNodes.Count == 0) - { - return QueryStatusResult.NOTSUPPORTED; - } - - int result = 0; - bool supported = false; - bool enabled = true; - bool invisible = false; - bool latched = true; - QueryStatusResult tempQueryResult = QueryStatusResult.NOTSUPPORTED; - - foreach (HierarchyNode node in selectedNodes) - { - result = node.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref tempQueryResult); - if (result < 0) - { - break; - } - - // cmd is supported iff any node supports cmd - // cmd is enabled iff all nodes enable cmd - // cmd is invisible iff any node sets invisibility - // cmd is latched only if all are latched. - supported = supported || ((tempQueryResult & QueryStatusResult.SUPPORTED) != 0); - enabled = enabled && ((tempQueryResult & QueryStatusResult.ENABLED) != 0); - invisible = invisible || ((tempQueryResult & QueryStatusResult.INVISIBLE) != 0); - latched = latched && ((tempQueryResult & QueryStatusResult.LATCHED) != 0); - } - - QueryStatusResult queryResult = QueryStatusResult.NOTSUPPORTED; - - if (result >= 0 && supported) - { - queryResult = QueryStatusResult.SUPPORTED; - - if (enabled) - { - queryResult |= QueryStatusResult.ENABLED; - } - - if (invisible) - { - queryResult |= QueryStatusResult.INVISIBLE; - } - - if (latched) - { - queryResult |= QueryStatusResult.LATCHED; - } - } - - return queryResult; - } - - #endregion - protected virtual bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - return this.ProjectMgr.CanProjectDeleteItems; - } - - /// - /// Overwrite this method to tell that you support the default icon for this node. - /// - /// - protected virtual bool CanShowDefaultIcon() - { - return false; - } - - /// - /// Performs save as operation for an item after the save as dialog has been processed. - /// - /// A pointer to the rdt - /// The newName of the item - /// - protected virtual int AfterSaveItemAs(IntPtr docData, string newName) - { - throw new NotImplementedException(); - } - - /// - /// The method that does the cleanup. - /// - /// Is the Dispose called by some internal member, or it is called by from GC. - protected virtual void Dispose(bool disposing) - { - if (this.isDisposed) - { - return; - } - - if (disposing) - { - // This will dispose any subclassed project node that implements IDisposable. - if (this.oleServiceProvider != null) - { - // Dispose the ole service provider object. - this.oleServiceProvider.Dispose(); - } - } - - this.isDisposed = true; - } - - /// - /// Sets the VSADDFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnAddFiles - /// - /// The files to which an array of VSADDFILEFLAGS has to be specified. - /// - protected internal virtual VSADDFILEFLAGS[] GetAddFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSADDFILEFLAGS[1] { VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags }; - } - - VSADDFILEFLAGS[] addFileFlags = new VSADDFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - addFileFlags[i] = VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags; - } - - return addFileFlags; - } - - /// - /// Sets the VSQUERYADDFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnQueryAddFiles - /// - /// The files to which an array of VSADDFILEFLAGS has to be specified. - /// - protected internal virtual VSQUERYADDFILEFLAGS[] GetQueryAddFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSQUERYADDFILEFLAGS[1] { VSQUERYADDFILEFLAGS.VSQUERYADDFILEFLAGS_NoFlags }; - } - - VSQUERYADDFILEFLAGS[] queryAddFileFlags = new VSQUERYADDFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - queryAddFileFlags[i] = VSQUERYADDFILEFLAGS.VSQUERYADDFILEFLAGS_NoFlags; - } - - return queryAddFileFlags; - } - - /// - /// Sets the VSREMOVEFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnRemoveFiles - /// - /// The files to which an array of VSREMOVEFILEFLAGS has to be specified. - /// - protected internal virtual VSREMOVEFILEFLAGS[] GetRemoveFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSREMOVEFILEFLAGS[1] { VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_NoFlags }; - } - - VSREMOVEFILEFLAGS[] removeFileFlags = new VSREMOVEFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - removeFileFlags[i] = VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_NoFlags; - } - - return removeFileFlags; - } - - /// - /// Sets the VSQUERYREMOVEFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnQueryRemoveFiles - /// - /// The files to which an array of VSQUERYREMOVEFILEFLAGS has to be specified. - /// - protected internal virtual VSQUERYREMOVEFILEFLAGS[] GetQueryRemoveFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSQUERYREMOVEFILEFLAGS[1] { VSQUERYREMOVEFILEFLAGS.VSQUERYREMOVEFILEFLAGS_NoFlags }; - } - - VSQUERYREMOVEFILEFLAGS[] queryRemoveFileFlags = new VSQUERYREMOVEFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - queryRemoveFileFlags[i] = VSQUERYREMOVEFILEFLAGS.VSQUERYREMOVEFILEFLAGS_NoFlags; - } - - return queryRemoveFileFlags; - } - - /// - /// This method should be overridden to provide the list of files and associated flags for source control. - /// - /// The list of files to be placed under source control. - /// The flags that are associated to the files. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - protected internal virtual void GetSccFiles(IList files, IList flags) - { - if (this.ExcludeNodeFromScc) - { - return; - } - - if (files == null) - { - throw new ArgumentNullException("files"); - } - - if (flags == null) - { - throw new ArgumentNullException("flags"); - } - - files.Add(this.GetMkDocument()); - - tagVsSccFilesFlags flagsToAdd = (this.firstChild != null && (this.firstChild is DependentFileNode)) ? tagVsSccFilesFlags.SFF_HasSpecialFiles : tagVsSccFilesFlags.SFF_NoFlags; - - flags.Add(flagsToAdd); - } - - /// - /// This method should be overridden to provide the list of special files and associated flags for source control. - /// - /// One of the file associated to the node. - /// The list of files to be placed under source control. - /// The flags that are associated to the files. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "scc")] - protected internal virtual void GetSccSpecialFiles(string sccFile, IList files, IList flags) - { - if (this.ExcludeNodeFromScc) - { - return; - } - - if (files == null) - { - throw new ArgumentNullException("files"); - } - - if (flags == null) - { - throw new ArgumentNullException("flags"); - } - } - - /// - /// Delete the item corresponding to the specified path from storage. - /// - /// Url of the item to delete - internal protected virtual void DeleteFromStorage(string path) - { - } - - /// - /// Determines whether a file change should be ignored or not. - /// - /// Flag indicating whether or not to ignore changes (true to ignore changes). - protected internal virtual void IgnoreItemFileChanges(bool ignoreFlag) - { - } - - /// - /// Called to determine whether a project item is reloadable. - /// - /// True if the project item is reloadable. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Reloadable")] - protected internal virtual bool IsItemReloadable() - { - return true; - } - - /// - /// Reloads an item. - /// - /// Reserved parameter defined at the IVsPersistHierarchyItem2::ReloadItem parameter. - protected internal virtual void ReloadItem(uint reserved) - { - - } - - /// - /// Handle the Copy operation to the clipboard - /// This method is typically overriden on the project node - /// - protected internal virtual int CopyToClipboard() - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Handle the Cut operation to the clipboard - /// This method is typically overriden on the project node - /// - protected internal virtual int CutToClipboard() - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Handle the paste from Clipboard command. - /// This method is typically overriden on the project node - /// - protected internal virtual int PasteFromClipboard(HierarchyNode targetNode) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Determines if the paste command should be allowed. - /// This method is typically overriden on the project node - /// - protected internal virtual bool AllowPasteCommand() - { - return false; ; - } - - /// - /// Register/Unregister for Clipboard events for the UiHierarchyWindow (solution explorer) - /// This method is typically overriden on the project node - /// - /// true for register, false for unregister - protected internal virtual void RegisterClipboardNotifications(bool value) - { - return; - } - #endregion - - #region public methods - - public void OnItemAdded(HierarchyNode parent, HierarchyNode child) - { - if (parent == null) - { - throw new ArgumentNullException("parent"); - } - - if (child == null) - { - throw new ArgumentNullException("child"); - } - - if (null != parent.onChildAdded) - { - HierarchyNodeEventArgs args = new HierarchyNodeEventArgs(child); - parent.onChildAdded(parent, args); - } - - HierarchyNode foo; - foo = this.projectMgr == null ? this : this.projectMgr; - - if (foo == this.projectMgr && (this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents) != 0) - { - return; - } - - HierarchyNode prev = child.PreviousSibling; - uint prevId = (prev != null) ? prev.hierarchyId : VSConstants.VSITEMID_NIL; - foreach (IVsHierarchyEvents sink in foo.hierarchyEventSinks) - { - int result = sink.OnItemAdded(parent.hierarchyId, prevId, child.hierarchyId); - if (ErrorHandler.Failed(result) && result != VSConstants.E_NOTIMPL) - { - ErrorHandler.ThrowOnFailure(result); - } - } - } - - - public virtual void OnItemDeleted() - { - HierarchyNode foo; - foo = this.projectMgr == null ? this : this.projectMgr; - - if (foo == this.projectMgr && (this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents) != 0) - { - return; - } - - if (foo.hierarchyEventSinks.Count > 0) - { - // Note that in some cases (deletion of project node for example), an Advise - // may be removed while we are iterating over it. To get around this problem we - // take a snapshot of the advise list and walk that. - List clonedSink = new List(); - - foreach (IVsHierarchyEvents anEvent in foo.hierarchyEventSinks) - { - clonedSink.Add(anEvent); - } - - foreach (IVsHierarchyEvents clonedEvent in clonedSink) - { - int result = clonedEvent.OnItemDeleted(this.hierarchyId); - if (ErrorHandler.Failed(result) && result != VSConstants.E_NOTIMPL) - { - ErrorHandler.ThrowOnFailure(result); - } - } - } - } - - public void OnItemsAppended(HierarchyNode parent) - { - if (parent == null) - { - throw new ArgumentNullException("parent"); - } - - HierarchyNode foo; - foo = this.projectMgr == null ? this : this.projectMgr; - - if (foo == this.projectMgr && (this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents) != 0) - { - return; - } - - foreach (IVsHierarchyEvents sink in foo.hierarchyEventSinks) - { - int result = sink.OnItemsAppended(parent.hierarchyId); - - if (ErrorHandler.Failed(result) && result != VSConstants.E_NOTIMPL) - { - ErrorHandler.ThrowOnFailure(result); - } - } - } - - - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "propid")] - public void OnPropertyChanged(HierarchyNode node, int propid, uint flags) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - HierarchyNode foo; - foo = this.projectMgr == null ? this : this.projectMgr; - if (foo == this.projectMgr && (this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents) != 0) - { - return; - } - - foreach (IVsHierarchyEvents sink in foo.hierarchyEventSinks) - { - int result = sink.OnPropertyChanged(node.hierarchyId, propid, flags); - - if (ErrorHandler.Failed(result) && result != VSConstants.E_NOTIMPL) - { - ErrorHandler.ThrowOnFailure(result); - } - } - } - - - public void OnInvalidateItems(HierarchyNode parent) - { - if (parent == null) - { - throw new ArgumentNullException("parent"); - } - HierarchyNode foo; - foo = this.projectMgr == null ? this : this.projectMgr; - if (foo == this.projectMgr && (this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents) != 0) - { - return; - } - - foreach (IVsHierarchyEvents sink in foo.hierarchyEventSinks) - { - int result = sink.OnInvalidateItems(parent.hierarchyId); - - if (ErrorHandler.Failed(result) && result != VSConstants.E_NOTIMPL) - { - ErrorHandler.ThrowOnFailure(result); - } - } - } - - /// - /// Causes the hierarchy to be redrawn. - /// - /// Used by the hierarchy to decide which element to redraw - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Re")] - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ReDraw")] - public virtual void ReDraw(UIHierarchyElement element) - { - - foreach (IVsHierarchyEvents sink in this.projectMgr.hierarchyEventSinks) - { - int result; - if ((element & UIHierarchyElement.Icon) != 0) - { - result = sink.OnPropertyChanged(this.ID, (int)__VSHPROPID.VSHPROPID_IconIndex, 0); - Debug.Assert(ErrorHandler.Succeeded(result), "Redraw failed for node " + this.GetMkDocument()); - } - - if ((element & UIHierarchyElement.Caption) != 0) - { - result = sink.OnPropertyChanged(this.ID, (int)__VSHPROPID.VSHPROPID_Caption, 0); - Debug.Assert(ErrorHandler.Succeeded(result), "Redraw failed for node " + this.GetMkDocument()); - } - - if ((element & UIHierarchyElement.SccState) != 0) - { - result = sink.OnPropertyChanged(this.ID, (int)__VSHPROPID.VSHPROPID_StateIconIndex, 0); - Debug.Assert(ErrorHandler.Succeeded(result), "Redraw failed for node " + this.GetMkDocument()); - } - } - - } - - /// - /// Finds a non virtual hierarchy item by its project element. - /// - /// The Project element to find - /// The node found - public HierarchyNode FindChildByProjectElement(ProjectElement node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - for (HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - if (!child.ItemNode.IsVirtual && child.ItemNode == node) - { - return child; - } - } - return null; - } - - public object GetService(Type type) - { - if (type == null) - { - throw new ArgumentNullException("type"); - } - - if (this.projectMgr.Site == null) return null; - return this.projectMgr.Site.GetService(type); - } - - - #endregion - - #region IDisposable - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - #region IVsHierarchy methods - - public virtual int AdviseHierarchyEvents(IVsHierarchyEvents sink, out uint cookie) - { - cookie = this.hierarchyEventSinks.Add(sink) + 1; - return VSConstants.S_OK; - } - - - public virtual int Close() - { - DocumentManager manager = this.GetDocumentManager(); - try - { - if (manager != null) - { - manager.Close(__FRAMECLOSE.FRAMECLOSE_PromptSave); - } - - } - catch { } - finally - { - this.Dispose(true); - } - - return VSConstants.S_OK; - } - - - public virtual int GetCanonicalName(uint itemId, out string name) - { - HierarchyNode n = this.projectMgr.NodeFromItemId(itemId); - name = (n != null) ? n.GetCanonicalName() : null; - return VSConstants.S_OK; - } - - - public virtual int GetGuidProperty(uint itemId, int propid, out Guid guid) - { - guid = Guid.Empty; - HierarchyNode n = this.projectMgr.NodeFromItemId(itemId); - if (n != null) - { - int hr = n.GetGuidProperty(propid, out guid); - __VSHPROPID vspropId = (__VSHPROPID)propid; - CCITracing.TraceCall(vspropId.ToString() + "=" + guid.ToString()); - return hr; - } - if (guid == Guid.Empty) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - return VSConstants.S_OK; - } - - - public virtual int GetProperty(uint itemId, int propId, out object propVal) - { - propVal = null; - if (itemId != VSConstants.VSITEMID_ROOT && propId == (int)__VSHPROPID.VSHPROPID_IconImgList) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - - - HierarchyNode n = this.projectMgr.NodeFromItemId(itemId); - if (n != null) - { - propVal = n.GetProperty(propId); - } - if (propVal == null) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - return VSConstants.S_OK; - } - - - public virtual int GetNestedHierarchy(uint itemId, ref Guid iidHierarchyNested, out IntPtr ppHierarchyNested, out uint pItemId) - { - ppHierarchyNested = IntPtr.Zero; - pItemId = 0; - // If itemid is not a nested hierarchy we must return E_FAIL. - return VSConstants.E_FAIL; - } - - - public virtual int GetSite(out Microsoft.VisualStudio.OLE.Interop.IServiceProvider site) - { - site = this.projectMgr.Site.GetService(typeof(Microsoft.VisualStudio.OLE.Interop.IServiceProvider)) as Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - return VSConstants.S_OK; - } - - - /// - /// the canonicalName of an item is it's URL, or better phrased, - /// the persistence data we put into @RelPath, which is a relative URL - /// to the root project - /// returning the itemID from this means scanning the list - /// - /// - /// - public virtual int ParseCanonicalName(string name, out uint itemId) - { - // we always start at the current node and go it's children down, so - // if you want to scan the whole tree, better call - // the root - uint notFoundValue = (uint)VSConstants.VSITEMID.Nil; - itemId = notFoundValue; - - // The default implemenation will check for case insensitive comparision. - if (String.Equals(name, this.Url, StringComparison.OrdinalIgnoreCase)) - { - itemId = this.hierarchyId; - return VSConstants.S_OK; - } - if (this.firstChild != null) - { - this.firstChild.ParseCanonicalName(name, out itemId); - } - if (itemId == notFoundValue && this.nextSibling != null) - { - this.nextSibling.ParseCanonicalName(name, out itemId); - } - - return itemId == notFoundValue ? VSConstants.E_FAIL : VSConstants.S_OK; - } - - - public virtual int QueryClose(out int fCanClose) - { - fCanClose = 1; - return VSConstants.S_OK; - } - - - public virtual int SetGuidProperty(uint itemId, int propid, ref Guid guid) - { - HierarchyNode n = this.projectMgr.NodeFromItemId(itemId); - int rc = VSConstants.E_INVALIDARG; - if (n != null) - { - rc = n.SetGuidProperty(propid, ref guid); - } - return rc; - } - - - public virtual int SetProperty(uint itemId, int propid, object value) - { - HierarchyNode n = this.projectMgr.NodeFromItemId(itemId); - if (n != null) - { - return n.SetProperty(propid, value); - } - else - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - } - - - public virtual int SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider site) - { - return VSConstants.E_NOTIMPL; - } - - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2233:OperationsShouldNotOverflow", MessageId = "cookie-1")] - public virtual int UnadviseHierarchyEvents(uint cookie) - { - this.hierarchyEventSinks.RemoveAt(cookie - 1); - return VSConstants.S_OK; - } - - - public int Unused0() - { - return VSConstants.E_NOTIMPL; - } - - - public int Unused1() - { - return VSConstants.E_NOTIMPL; - } - - - public int Unused2() - { - return VSConstants.E_NOTIMPL; - } - - - public int Unused3() - { - return VSConstants.E_NOTIMPL; - } - - - public int Unused4() - { - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IVsUIHierarchy methods - - public virtual int ExecCommand(uint itemId, ref Guid guidCmdGroup, uint nCmdId, uint nCmdExecOpt, IntPtr pvain, IntPtr p) - { - return this.InternalExecCommand(guidCmdGroup, nCmdId, nCmdExecOpt, pvain, p, CommandOrigin.UiHierarchy); - } - - public virtual int QueryStatusCommand(uint itemId, ref Guid guidCmdGroup, uint cCmds, OLECMD[] cmds, IntPtr pCmdText) - { - return this.QueryStatusSelection(guidCmdGroup, cCmds, cmds, pCmdText, CommandOrigin.UiHierarchy); - } - #endregion - - #region IVsPersistHierarchyItem2 methods - - /// - /// Determines whether the hierarchy item changed. - /// - /// Item identifier of the hierarchy item contained in VSITEMID. - /// Pointer to the IUnknown interface of the hierarchy item. - /// true if the hierarchy item changed. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int IsItemDirty(uint itemId, IntPtr docData, out int isDirty) - { - IVsPersistDocData pd = (IVsPersistDocData)Marshal.GetObjectForIUnknown(docData); - return ErrorHandler.ThrowOnFailure(pd.IsDocDataDirty(out isDirty)); - } - - /// - /// Saves the hierarchy item to disk. - /// - /// Flags whose values are taken from the VSSAVEFLAGS enumeration. - /// New filename when doing silent save as - /// Item identifier of the hierarchy item saved from VSITEMID. - /// Item identifier of the hierarchy item saved from VSITEMID. - /// [out] true if the save action was canceled. - /// [out] true if the save action was canceled. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - public virtual int SaveItem(VSSAVEFLAGS saveFlag, string silentSaveAsName, uint itemid, IntPtr docData, out int cancelled) - { - cancelled = 0; - - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - // Validate itemid - if (itemid == VSConstants.VSITEMID_ROOT || itemid == VSConstants.VSITEMID_SELECTION) - { - return VSConstants.E_INVALIDARG; - } - - HierarchyNode node = this.ProjectMgr.NodeFromItemId(itemid); - if (node == null) - { - return VSConstants.E_FAIL; - } - - string existingFileMoniker = node.GetMkDocument(); - - // We can only perform save if the document is open - if (docData == IntPtr.Zero) - { - string errorMessage = string.Format(CultureInfo.CurrentCulture, SR.GetString(SR.CanNotSaveFileNotOpeneInEditor, CultureInfo.CurrentUICulture), node.Url); - throw new InvalidOperationException(errorMessage); - } - - string docNew = String.Empty; - int returnCode = VSConstants.S_OK; - IPersistFileFormat ff = null; - IVsPersistDocData dd = null; - IVsUIShell shell = this.projectMgr.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - - if (shell == null) - { - return VSConstants.E_FAIL; - } - - try - { - //Save docdata object. - //For the saveas action a dialog is show in order to enter new location of file. - //In case of a save action and the file is readonly a dialog is also shown - //with a couple of options, SaveAs, Overwrite or Cancel. - ff = Marshal.GetObjectForIUnknown(docData) as IPersistFileFormat; - if (ff == null) - { - return VSConstants.E_FAIL; - } - if (VSSAVEFLAGS.VSSAVE_SilentSave == saveFlag) - { - ErrorHandler.ThrowOnFailure(shell.SaveDocDataToFile(saveFlag, ff, silentSaveAsName, out docNew, out cancelled)); - } - else - { - dd = Marshal.GetObjectForIUnknown(docData) as IVsPersistDocData; - if (dd == null) - { - return VSConstants.E_FAIL; - } - ErrorHandler.ThrowOnFailure(dd.SaveDocData(saveFlag, out docNew, out cancelled)); - } - - // We can be unloaded after the SaveDocData() call if the save caused a designer to add a file and this caused - // the project file to be reloaded (QEQS caused a newer version of the project file to be downloaded). So we check - // here. - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - cancelled = 1; - return (int)OleConstants.OLECMDERR_E_CANCELED; - } - else - { - // if a SaveAs occurred we need to update to the fact our item's name has changed. - // this includes the following: - // 1. call RenameDocument on the RunningDocumentTable - // 2. update the full path name for the item in our hierarchy - // 3. a directory-based project may need to transfer the open editor to the - // MiscFiles project if the new file is saved outside of the project directory. - // This is accomplished by calling IVsExternalFilesManager::TransferDocument - - // we have three options for a saveas action to be performed - // 1. the flag was set (the save as command was triggered) - // 2. a silent save specifying a new document name - // 3. a save command was triggered but was not possible because the file has a read only attrib. Therefore - // the user has chosen to do a save as in the dialog that showed up - bool emptyOrSamePath = String.IsNullOrEmpty(docNew) || NativeMethods.IsSamePath(existingFileMoniker, docNew); - bool saveAs = ((saveFlag == VSSAVEFLAGS.VSSAVE_SaveAs)) || - ((saveFlag == VSSAVEFLAGS.VSSAVE_SilentSave) && !emptyOrSamePath) || - ((saveFlag == VSSAVEFLAGS.VSSAVE_Save) && !emptyOrSamePath); - - if (saveAs) - { - returnCode = node.AfterSaveItemAs(docData, docNew); - - // If it has been cancelled recover the old name. - if ((returnCode == (int)OleConstants.OLECMDERR_E_CANCELED || returnCode == VSConstants.E_ABORT)) - { - // Cleanup. - this.DeleteFromStorage(docNew); - if (this is ProjectNode && File.Exists(docNew)) - { - File.Delete(docNew); - } - - if (ff != null) - { - returnCode = shell.SaveDocDataToFile(VSSAVEFLAGS.VSSAVE_SilentSave, ff, existingFileMoniker, out docNew, out cancelled); - } - } - else if (returnCode != VSConstants.S_OK) - { - ErrorHandler.ThrowOnFailure(returnCode); - } - } - } - } - catch (COMException e) - { - Trace.WriteLine("Exception :" + e.Message); - returnCode = e.ErrorCode; - - // Try to recover - if (ff != null) - { - ErrorHandler.ThrowOnFailure(shell.SaveDocDataToFile(VSSAVEFLAGS.VSSAVE_SilentSave, ff, existingFileMoniker, out docNew, out cancelled)); - } - } - - return returnCode; - } - - /// - /// Flag indicating that changes to a file can be ignored when item is saved or reloaded. - /// - /// Specifies the item id from VSITEMID. - /// Flag indicating whether or not to ignore changes (1 to ignore, 0 to stop ignoring). - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int IgnoreItemFileChanges(uint itemId, int ignoreFlag) - { - #region precondition - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - #endregion - - HierarchyNode n = this.ProjectMgr.NodeFromItemId(itemId); - if (n != null) - { - n.IgnoreItemFileChanges(ignoreFlag == 0 ? false : true); - } - - return VSConstants.S_OK; - } - - /// - /// Called to determine whether a project item is reloadable before calling ReloadItem. - /// - /// Item identifier of an item in the hierarchy. Valid values are VSITEMID_NIL, VSITEMID_ROOT and VSITEMID_SELECTION. - /// A flag indicating that the project item is reloadable (1 for reloadable, 0 for non-reloadable). - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Reloadable")] - public virtual int IsItemReloadable(uint itemId, out int isReloadable) - { - isReloadable = 0; - - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - HierarchyNode n = this.ProjectMgr.NodeFromItemId(itemId); - if (n != null) - { - isReloadable = (n.IsItemReloadable()) ? 1 : 0; - } - - return VSConstants.S_OK; - } - - /// - /// Called to reload a project item. - /// - /// Specifies itemid from VSITEMID. - /// Reserved. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int ReloadItem(uint itemId, uint reserved) - { - #region precondition - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - #endregion - - HierarchyNode n = this.ProjectMgr.NodeFromItemId(itemId); - if (n != null) - { - n.ReloadItem(reserved); - } - - return VSConstants.S_OK; - } - #endregion - - #region IOleCommandTarget methods - /// - /// CommandTarget.Exec is called for most major operations if they are NOT UI based. Otherwise IVSUInode::exec is called first - /// - public virtual int Exec(ref Guid guidCmdGroup, uint nCmdId, uint nCmdExecOpt, IntPtr pvaIn, IntPtr pvaOut) - { - return this.InternalExecCommand(guidCmdGroup, nCmdId, nCmdExecOpt, pvaIn, pvaOut, CommandOrigin.OleCommandTarget); - } - - /// - /// Queries the object for the command status - /// - /// we only support one command at a time, i.e. the first member in the OLECMD array - public virtual int QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText) - { - return this.QueryStatusSelection(guidCmdGroup, cCmds, prgCmds, pCmdText, CommandOrigin.OleCommandTarget); - } - #endregion - - #region IVsHierarchyDeleteHandler methods - - public virtual int DeleteItem(uint delItemOp, uint itemId) - { - if (itemId == VSConstants.VSITEMID_SELECTION) - { - return VSConstants.E_INVALIDARG; - } - - HierarchyNode node = this.projectMgr.NodeFromItemId(itemId); - if (node != null) - { - node.Remove((delItemOp & (uint)__VSDELETEITEMOPERATION.DELITEMOP_DeleteFromStorage) != 0); - return VSConstants.S_OK; - } - - return VSConstants.E_FAIL; - } - - - public virtual int QueryDeleteItem(uint delItemOp, uint itemId, out int candelete) - { - candelete = 0; - if (itemId == VSConstants.VSITEMID_SELECTION) - { - return VSConstants.E_INVALIDARG; - } - - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - // We ask the project what state it is. If he is a state that should not allow delete then we return. - if (this.ProjectMgr.IsCurrentStateASuppressCommandsMode()) - { - return VSConstants.S_OK; - } - - HierarchyNode node = this.projectMgr.NodeFromItemId(itemId); - - if (node == null) - { - return VSConstants.E_FAIL; - } - - // Ask the nodes if they can remove the item. - bool canDeleteItem = node.CanDeleteItem((__VSDELETEITEMOPERATION)delItemOp); - if (canDeleteItem) - { - candelete = 1; - } - - return VSConstants.S_OK; - } - #endregion - - #region IVsHierarchyDropDataSource2 methods - - public virtual int GetDropInfo(out uint pdwOKEffects, out Microsoft.VisualStudio.OLE.Interop.IDataObject ppDataObject, out IDropSource ppDropSource) - { - pdwOKEffects = (uint)DropEffect.None; - ppDataObject = null; - ppDropSource = null; - return VSConstants.E_NOTIMPL; - } - - public virtual int OnDropNotify(int fDropped, uint dwEffects) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeDropNotify(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, uint dwEffect, out int fCancelDrop) - { - pDataObject = null; - fCancelDrop = 0; - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IVsHierarchyDropDataTarget methods - - public virtual int DragEnter(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, uint grfKeyState, uint itemid, ref uint pdwEffect) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int DragLeave() - { - return VSConstants.E_NOTIMPL; - } - - public virtual int DragOver(uint grfKeyState, uint itemid, ref uint pdwEffect) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int Drop(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, uint grfKeyState, uint itemid, ref uint pdwEffect) - { - return VSConstants.E_NOTIMPL; - } - #endregion - - #region helper methods - internal HierarchyNode FindChild(string name) - { - if (String.IsNullOrEmpty(name)) - { - return null; - } - - HierarchyNode result; - for (HierarchyNode child = this.firstChild; child != null; child = child.NextSibling) - { - if (!String.IsNullOrEmpty(child.VirtualNodeName) && String.Compare(child.VirtualNodeName, name, StringComparison.OrdinalIgnoreCase) == 0) - { - return child; - } - // If it is a foldernode then it has a virtual name but we want to find folder nodes by the document moniker or url - else if ((String.IsNullOrEmpty(child.VirtualNodeName) || (child is FolderNode)) && - (NativeMethods.IsSamePath(child.GetMkDocument(), name) || NativeMethods.IsSamePath(child.Url, name))) - { - return child; - } - - result = child.FindChild(name); - if (result != null) - { - return result; - } - } - return null; - } - - /// - /// Recursively find all nodes of type T - /// - /// The type of hierachy node being serched for - /// A list of nodes of type T - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal void FindNodesOfType(List nodes) - where T : HierarchyNode - { - for (HierarchyNode n = this.FirstChild; n != null; n = n.NextSibling) - { - if (n is T) - { - T nodeAsT = (T)n; - nodes.Add(nodeAsT); - } - - n.FindNodesOfType(nodes); - } - } - - /// - /// Adds an item from a project refererence to target node. - /// - /// - /// - internal bool AddFileToNodeFromProjectReference(string projectRef, HierarchyNode targetNode) - { - if (String.IsNullOrEmpty(projectRef)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "projectRef"); - } - - if (targetNode == null) - { - throw new ArgumentNullException("targetNode"); - } - - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - if (solution == null) - { - throw new InvalidOperationException(); - } - - uint itemidLoc; - IVsHierarchy hierarchy; - string str; - VSUPDATEPROJREFREASON[] reason = new VSUPDATEPROJREFREASON[1]; - ErrorHandler.ThrowOnFailure(solution.GetItemOfProjref(projectRef, out hierarchy, out itemidLoc, out str, reason)); - if (hierarchy == null) - { - throw new InvalidOperationException(); - } - - // This will throw invalid cast exception if the hierrachy is not a project. - IVsProject project = (IVsProject)hierarchy; - - string moniker; - ErrorHandler.ThrowOnFailure(project.GetMkDocument(itemidLoc, out moniker)); - string[] files = new String[1] { moniker }; - VSADDRESULT[] vsaddresult = new VSADDRESULT[1]; - vsaddresult[0] = VSADDRESULT.ADDRESULT_Failure; - int addResult = targetNode.ProjectMgr.AddItem(targetNode.ID, VSADDITEMOPERATION.VSADDITEMOP_OPENFILE, null, 0, files, IntPtr.Zero, vsaddresult); - if (addResult != VSConstants.S_OK && addResult != VSConstants.S_FALSE && addResult != (int)OleConstants.OLECMDERR_E_CANCELED) - { - ErrorHandler.ThrowOnFailure(addResult); - return false; - } - return (vsaddresult[0] == VSADDRESULT.ADDRESULT_Success); - } - - internal void InstantiateItemsDraggedOrCutOrCopiedList() - { - this.itemsDraggedOrCutOrCopied = new List(); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/IDEBuildLogger.cs b/source/Archive/MPF/12.0/IDEBuildLogger.cs deleted file mode 100644 index 9dd7c57a87..0000000000 --- a/source/Archive/MPF/12.0/IDEBuildLogger.cs +++ /dev/null @@ -1,663 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Windows.Forms.Design; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Globalization; -using System.Runtime.InteropServices; -using System.Text; -using System.Diagnostics.CodeAnalysis; -using System.Threading; -using System.Windows.Threading; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.TextManager.Interop; -using Microsoft.Win32; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This class implements an MSBuild logger that output events to VS outputwindow and tasklist. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDE")] - internal class IDEBuildLogger : Logger - { - #region fields - - // TODO: Remove these constants when we have a version that supports getting the verbosity using automation. - private string buildVerbosityRegistryRoot = @"Software\Microsoft\VisualStudio\10.0"; - private const string buildVerbosityRegistrySubKey = @"General"; - private const string buildVerbosityRegistryKey = "MSBuildLoggerVerbosity"; - - private int currentIndent; - private IVsOutputWindowPane outputWindowPane; - private string errorString = SR.GetString(SR.Error, CultureInfo.CurrentUICulture); - private string warningString = SR.GetString(SR.Warning, CultureInfo.CurrentUICulture); - private TaskProvider taskProvider; - private IVsHierarchy hierarchy; - private IServiceProvider serviceProvider; - private Dispatcher dispatcher; - private bool haveCachedVerbosity = false; - - // Queues to manage Tasks and Error output plus message logging - private ConcurrentQueue> taskQueue; - private ConcurrentQueue outputQueue; - - #endregion - - #region properties - - public IServiceProvider ServiceProvider - { - get { return this.serviceProvider; } - } - - public string WarningString - { - get { return this.warningString; } - set { this.warningString = value; } - } - - public string ErrorString - { - get { return this.errorString; } - set { this.errorString = value; } - } - - /// - /// When the build is not a "design time" (background or secondary) build this is True - /// - /// - /// The only known way to detect an interactive build is to check this.outputWindowPane for null. - /// - protected bool InteractiveBuild - { - get { return this.outputWindowPane != null; } - } - - /// - /// When building from within VS, setting this will - /// enable the logger to retrive the verbosity from - /// the correct registry hive. - /// - internal string BuildVerbosityRegistryRoot - { - get { return this.buildVerbosityRegistryRoot; } - set - { - this.buildVerbosityRegistryRoot = value; - } - } - - /// - /// Set to null to avoid writing to the output window - /// - internal IVsOutputWindowPane OutputWindowPane - { - get { return this.outputWindowPane; } - set { this.outputWindowPane = value; } - } - - #endregion - - #region ctors - - /// - /// Constructor. Inititialize member data. - /// - public IDEBuildLogger(IVsOutputWindowPane output, TaskProvider taskProvider, IVsHierarchy hierarchy) - { - if (taskProvider == null) - throw new ArgumentNullException("taskProvider"); - if (hierarchy == null) - throw new ArgumentNullException("hierarchy"); - - Trace.WriteLineIf(Thread.CurrentThread.GetApartmentState() != ApartmentState.STA, "WARNING: IDEBuildLogger constructor running on the wrong thread."); - - IOleServiceProvider site; - Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hierarchy.GetSite(out site)); - - this.taskProvider = taskProvider; - this.outputWindowPane = output; - this.hierarchy = hierarchy; - this.serviceProvider = new ServiceProvider(site); - this.dispatcher = Dispatcher.CurrentDispatcher; - } - - #endregion - - #region overridden methods - - /// - /// Overridden from the Logger class. - /// - public override void Initialize(IEventSource eventSource) - { - if (null == eventSource) - { - throw new ArgumentNullException("eventSource"); - } - - this.taskQueue = new ConcurrentQueue>(); - this.outputQueue = new ConcurrentQueue(); - - eventSource.BuildStarted += new BuildStartedEventHandler(BuildStartedHandler); - eventSource.BuildFinished += new BuildFinishedEventHandler(BuildFinishedHandler); - eventSource.ProjectStarted += new ProjectStartedEventHandler(ProjectStartedHandler); - eventSource.ProjectFinished += new ProjectFinishedEventHandler(ProjectFinishedHandler); - eventSource.TargetStarted += new TargetStartedEventHandler(TargetStartedHandler); - eventSource.TargetFinished += new TargetFinishedEventHandler(TargetFinishedHandler); - eventSource.TaskStarted += new TaskStartedEventHandler(TaskStartedHandler); - eventSource.TaskFinished += new TaskFinishedEventHandler(TaskFinishedHandler); - eventSource.CustomEventRaised += new CustomBuildEventHandler(CustomHandler); - eventSource.ErrorRaised += new BuildErrorEventHandler(ErrorHandler); - eventSource.WarningRaised += new BuildWarningEventHandler(WarningHandler); - eventSource.MessageRaised += new BuildMessageEventHandler(MessageHandler); - } - - #endregion - - #region event delegates - - /// - /// This is the delegate for BuildStartedHandler events. - /// - protected virtual void BuildStartedHandler(object sender, BuildStartedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - ClearCachedVerbosity(); - ClearQueuedOutput(); - ClearQueuedTasks(); - - QueueOutputEvent(MessageImportance.Low, buildEvent); - } - - /// - /// This is the delegate for BuildFinishedHandler events. - /// - /// - /// - protected virtual void BuildFinishedHandler(object sender, BuildFinishedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - MessageImportance importance = buildEvent.Succeeded ? MessageImportance.Low : MessageImportance.High; - QueueOutputText(importance, Environment.NewLine); - QueueOutputEvent(importance, buildEvent); - - // flush output and error queues - ReportQueuedOutput(); - ReportQueuedTasks(); - } - - /// - /// This is the delegate for ProjectStartedHandler events. - /// - protected virtual void ProjectStartedHandler(object sender, ProjectStartedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(MessageImportance.Low, buildEvent); - } - - /// - /// This is the delegate for ProjectFinishedHandler events. - /// - protected virtual void ProjectFinishedHandler(object sender, ProjectFinishedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(buildEvent.Succeeded ? MessageImportance.Low : MessageImportance.High, buildEvent); - } - - /// - /// This is the delegate for TargetStartedHandler events. - /// - protected virtual void TargetStartedHandler(object sender, TargetStartedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(MessageImportance.Low, buildEvent); - IndentOutput(); - } - - /// - /// This is the delegate for TargetFinishedHandler events. - /// - protected virtual void TargetFinishedHandler(object sender, TargetFinishedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - UnindentOutput(); - QueueOutputEvent(MessageImportance.Low, buildEvent); - } - - /// - /// This is the delegate for TaskStartedHandler events. - /// - protected virtual void TaskStartedHandler(object sender, TaskStartedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(MessageImportance.Low, buildEvent); - IndentOutput(); - } - - /// - /// This is the delegate for TaskFinishedHandler events. - /// - protected virtual void TaskFinishedHandler(object sender, TaskFinishedEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - UnindentOutput(); - QueueOutputEvent(MessageImportance.Low, buildEvent); - } - - /// - /// This is the delegate for CustomHandler events. - /// - /// - /// - protected virtual void CustomHandler(object sender, CustomBuildEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(MessageImportance.High, buildEvent); - } - - /// - /// This is the delegate for error events. - /// - protected virtual void ErrorHandler(object sender, BuildErrorEventArgs errorEvent) - { - // NOTE: This may run on a background thread! - QueueOutputText(GetFormattedErrorMessage(errorEvent.File, errorEvent.LineNumber, errorEvent.ColumnNumber, false, errorEvent.Code, errorEvent.Message)); - QueueTaskEvent(errorEvent); - } - - /// - /// This is the delegate for warning events. - /// - protected virtual void WarningHandler(object sender, BuildWarningEventArgs warningEvent) - { - // NOTE: This may run on a background thread! - QueueOutputText(MessageImportance.High, GetFormattedErrorMessage(warningEvent.File, warningEvent.LineNumber, warningEvent.ColumnNumber, true, warningEvent.Code, warningEvent.Message)); - QueueTaskEvent(warningEvent); - } - - /// - /// This is the delegate for Message event types - /// - protected virtual void MessageHandler(object sender, BuildMessageEventArgs messageEvent) - { - // NOTE: This may run on a background thread! - QueueOutputEvent(messageEvent.Importance, messageEvent); - if(messageEvent.Importance == MessageImportance.High) - QueueTaskEvent(messageEvent); - } - - #endregion - - #region output queue - - protected void QueueOutputEvent(MessageImportance importance, BuildEventArgs buildEvent) - { - // NOTE: This may run on a background thread! - if (LogAtImportance(importance) && !string.IsNullOrEmpty(buildEvent.Message)) - { - StringBuilder message = new StringBuilder(this.currentIndent + buildEvent.Message.Length); - if (this.currentIndent > 0) - { - message.Append('\t', this.currentIndent); - } - message.AppendLine(buildEvent.Message); - - QueueOutputText(message.ToString()); - } - } - - protected void QueueOutputText(MessageImportance importance, string text) - { - // NOTE: This may run on a background thread! - if (LogAtImportance(importance)) - { - QueueOutputText(text); - } - } - - protected void QueueOutputText(string text) - { - // NOTE: This may run on a background thread! - if (this.OutputWindowPane != null) - { - // Enqueue the output text - this.outputQueue.Enqueue(text); - - // We want to interactively report the output. But we dont want to dispatch - // more than one at a time, otherwise we might overflow the main thread's - // message queue. So, we only report the output if the queue was empty. - if (this.outputQueue.Count == 1) - { - ReportQueuedOutput(); - } - } - } - - private void IndentOutput() - { - // NOTE: This may run on a background thread! - this.currentIndent++; - } - - private void UnindentOutput() - { - // NOTE: This may run on a background thread! - this.currentIndent--; - } - - private void ReportQueuedOutput() - { - // NOTE: This may run on a background thread! - // We need to output this on the main thread. We must use BeginInvoke because the main thread may not be pumping events yet. - BeginInvokeWithErrorMessage(this.serviceProvider, this.dispatcher, () => - { - if (this.OutputWindowPane != null) - { - string outputString; - - while (this.outputQueue.TryDequeue(out outputString)) - { - Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(this.OutputWindowPane.OutputString(outputString)); - } - } - }); - } - - private void ClearQueuedOutput() - { - // NOTE: This may run on a background thread! - this.outputQueue = new ConcurrentQueue(); - } - - #endregion output queue - - #region task queue - - protected void QueueTaskEvent(BuildEventArgs errorEvent) - { - this.taskQueue.Enqueue(() => - { - ErrorTask task = new ErrorTask(); - - if (errorEvent is BuildErrorEventArgs) - { - BuildErrorEventArgs errorArgs = (BuildErrorEventArgs)errorEvent; - task.Document = errorArgs.File; - task.ErrorCategory = TaskErrorCategory.Error; - task.Line = errorArgs.LineNumber - 1; // The task list does +1 before showing this number. - task.Column = errorArgs.ColumnNumber; - task.Priority = TaskPriority.High; - } - else if (errorEvent is BuildWarningEventArgs) - { - BuildWarningEventArgs warningArgs = (BuildWarningEventArgs)errorEvent; - task.Document = warningArgs.File; - task.ErrorCategory = TaskErrorCategory.Warning; - task.Line = warningArgs.LineNumber - 1; // The task list does +1 before showing this number. - task.Column = warningArgs.ColumnNumber; - task.Priority = TaskPriority.Normal; - } - else if (errorEvent is BuildMessageEventArgs) - { - BuildMessageEventArgs messageArgs = (BuildMessageEventArgs)errorEvent; - task.ErrorCategory = TaskErrorCategory.Message; - task.Priority = TaskPriority.Normal; - } - - task.Text = errorEvent.Message; - task.Category = TaskCategory.BuildCompile; - task.HierarchyItem = hierarchy; - - return task; - }); - - // NOTE: Unlike output we dont want to interactively report the tasks. So we never queue - // call ReportQueuedTasks here. We do this when the build finishes. - } - - private void ReportQueuedTasks() - { - // NOTE: This may run on a background thread! - // We need to output this on the main thread. We must use BeginInvoke because the main thread may not be pumping events yet. - BeginInvokeWithErrorMessage(this.serviceProvider, this.dispatcher, () => - { - this.taskProvider.SuspendRefresh(); - try - { - Func taskFunc; - - while (this.taskQueue.TryDequeue(out taskFunc)) - { - // Create the error task - ErrorTask task = taskFunc(); - - // Log the task - this.taskProvider.Tasks.Add(task); - } - } - finally - { - this.taskProvider.ResumeRefresh(); - } - }); - } - - private void ClearQueuedTasks() - { - // NOTE: This may run on a background thread! - this.taskQueue = new ConcurrentQueue>(); - - if (this.InteractiveBuild) - { - // We need to clear this on the main thread. We must use BeginInvoke because the main thread may not be pumping events yet. - BeginInvokeWithErrorMessage(this.serviceProvider, this.dispatcher, () => - { - this.taskProvider.Tasks.Clear(); - }); - } - } - - #endregion task queue - - #region helpers - - /// - /// This method takes a MessageImportance and returns true if messages - /// at importance i should be logged. Otherwise return false. - /// - private bool LogAtImportance(MessageImportance importance) - { - // If importance is too low for current settings, ignore the event - bool logIt = false; - - this.SetVerbosity(); - - switch (this.Verbosity) - { - case LoggerVerbosity.Quiet: - logIt = false; - break; - case LoggerVerbosity.Minimal: - logIt = (importance == MessageImportance.High); - break; - case LoggerVerbosity.Normal: - // Falling through... - case LoggerVerbosity.Detailed: - logIt = (importance != MessageImportance.Low); - break; - case LoggerVerbosity.Diagnostic: - logIt = true; - break; - default: - Debug.Fail("Unknown Verbosity level. Ignoring will cause everything to be logged"); - break; - } - - return logIt; - } - - /// - /// Format error messages for the task list - /// - private string GetFormattedErrorMessage( - string fileName, - int line, - int column, - bool isWarning, - string errorNumber, - string errorText) - { - string errorCode = isWarning ? this.WarningString : this.ErrorString; - - StringBuilder message = new StringBuilder(); - if (!string.IsNullOrEmpty(fileName)) - { - message.AppendFormat(CultureInfo.CurrentCulture, "{0}({1},{2}):", fileName, line, column); - } - message.AppendFormat(CultureInfo.CurrentCulture, " {0} {1}: {2}", errorCode, errorNumber, errorText); - message.AppendLine(); - - return message.ToString(); - } - - /// - /// Sets the verbosity level. - /// - private void SetVerbosity() - { - // TODO: This should be replaced when we have a version that supports automation. - if (!this.haveCachedVerbosity) - { - string verbosityKey = String.Format(CultureInfo.InvariantCulture, @"{0}\{1}", BuildVerbosityRegistryRoot, buildVerbosityRegistrySubKey); - using (RegistryKey subKey = Registry.CurrentUser.OpenSubKey(verbosityKey)) - { - if (subKey != null) - { - object valueAsObject = subKey.GetValue(buildVerbosityRegistryKey); - if (valueAsObject != null) - { - this.Verbosity = (LoggerVerbosity)((int)valueAsObject); - } - } - } - - this.haveCachedVerbosity = true; - } - } - - /// - /// Clear the cached verbosity, so that it will be re-evaluated from the build verbosity registry key. - /// - private void ClearCachedVerbosity() - { - this.haveCachedVerbosity = false; - } - - #endregion helpers - - #region exception handling helpers - - /// - /// Call Dispatcher.BeginInvoke, showing an error message if there was a non-critical exception. - /// - /// service provider - /// dispatcher - /// action to invoke - private static void BeginInvokeWithErrorMessage(IServiceProvider serviceProvider, Dispatcher dispatcher, Action action) - { - dispatcher.BeginInvoke(new Action(() => CallWithErrorMessage(serviceProvider, action))); - } - - /// - /// Show error message if exception is caught when invoking a method - /// - /// service provider - /// action to invoke - private static void CallWithErrorMessage(IServiceProvider serviceProvider, Action action) - { - try - { - action(); - } - catch (Exception ex) - { - if (Microsoft.VisualStudio.ErrorHandler.IsCriticalException(ex)) - { - throw; - } - - ShowErrorMessage(serviceProvider, ex); - } - } - - /// - /// Show error window about the exception - /// - /// service provider - /// exception - private static void ShowErrorMessage(IServiceProvider serviceProvider, Exception exception) - { - IUIService UIservice = (IUIService)serviceProvider.GetService(typeof(IUIService)); - if (UIservice != null && exception != null) - { - UIservice.ShowError(exception); - } - } - - #endregion exception handling helpers - } -} diff --git a/source/Archive/MPF/12.0/ImageHandler.cs b/source/Archive/MPF/12.0/ImageHandler.cs deleted file mode 100644 index a66c4f2075..0000000000 --- a/source/Archive/MPF/12.0/ImageHandler.cs +++ /dev/null @@ -1,241 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Windows.Forms; -using Microsoft.VisualStudio; - -namespace Microsoft.VisualStudio.Project -{ - public class ImageHandler : IDisposable - { - private ImageList imageList; - private List iconHandles; - private static volatile object Mutex; - private bool isDisposed; - - /// - /// Initializes the class. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] - static ImageHandler() - { - Mutex = new object(); - } - - /// - /// Builds an empty ImageHandler object. - /// - public ImageHandler() - { - } - - /// - /// Builds an ImageHandler object from a Stream providing the bitmap that - /// stores the images for the image list. - /// - public ImageHandler(Stream resourceStream) - { - if(null == resourceStream) - { - throw new ArgumentNullException("resourceStream"); - } - imageList = Utilities.GetImageList(resourceStream); - } - - /// - /// Builds an ImageHandler object from an ImageList object. - /// - public ImageHandler(ImageList list) - { - if(null == list) - { - throw new ArgumentNullException("list"); - } - imageList = list; - } - - /// - /// Closes the ImageHandler object freeing its resources. - /// - public void Close() - { - if(null != iconHandles) - { - foreach(IntPtr hnd in iconHandles) - { - if(hnd != IntPtr.Zero) - { - NativeMethods.DestroyIcon(hnd); - } - } - iconHandles = null; - } - - if(null != imageList) - { - imageList.Dispose(); - imageList = null; - } - } - - /// - /// Add an image to the ImageHandler. - /// - /// the image object to be added. - public void AddImage(Image image) - { - if(null == image) - { - throw new ArgumentNullException("image"); - } - if(null == imageList) - { - imageList = new ImageList(); - } - imageList.Images.Add(image); - if(null != iconHandles) - { - iconHandles.Add(IntPtr.Zero); - } - } - - /// - /// Get or set the ImageList object for this ImageHandler. - /// - public ImageList ImageList - { - get { return imageList; } - set - { - Close(); - imageList = value; - } - } - - /// - /// Returns the handle to an icon build from the image of index - /// iconIndex in the image list. - /// - public IntPtr GetIconHandle(int iconIndex) - { - // Verify that the object is in a consistent state. - if((null == imageList)) - { - throw new InvalidOperationException(); - } - // Make sure that the list of handles is initialized. - if(null == iconHandles) - { - InitHandlesList(); - } - - // Verify that the index is inside the expected range. - if((iconIndex < 0) || (iconIndex >= iconHandles.Count)) - { - throw new ArgumentOutOfRangeException("iconIndex"); - } - - // Check if the icon is in the cache. - if(IntPtr.Zero == iconHandles[iconIndex]) - { - Bitmap bitmap = imageList.Images[iconIndex] as Bitmap; - // If the image is not a bitmap, then we can not build the icon, - // so we have to return a null handle. - if(null == bitmap) - { - return IntPtr.Zero; - } - - iconHandles[iconIndex] = bitmap.GetHicon(); - } - - return iconHandles[iconIndex]; - } - - private void InitHandlesList() - { - iconHandles = new List(imageList.Images.Count); - for(int i = 0; i < imageList.Images.Count; ++i) - { - iconHandles.Add(IntPtr.Zero); - } - } - - #region IDisposable Members - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - #endregion - - private void Dispose(bool disposing) - { - if(!this.isDisposed) - { - lock(Mutex) - { - if(disposing) - { - this.imageList.Dispose(); - } - - this.isDisposed = true; - } - } - } - } -} diff --git a/source/Archive/MPF/12.0/Interfaces.cs b/source/Archive/MPF/12.0/Interfaces.cs deleted file mode 100644 index d26cc791ab..0000000000 --- a/source/Archive/MPF/12.0/Interfaces.cs +++ /dev/null @@ -1,202 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; - -namespace Microsoft.VisualStudio.Project -{ - - /// - /// This interface defines the rules for handling build dependency on a project container. - /// - /// Normally this should be an internal interface but since it shouldbe available for the aggregator it must be made public. - [ComVisible(true)] - - public interface IBuildDependencyOnProjectContainer - { - /// - /// Defines whether the nested projects should be build with the parent project. - /// - bool BuildNestedProjectsOnBuild - { - get; - set; - } - - /// - /// Enumerates the nested hierachies present that will participate in the build dependency update. - /// - /// A list of hierrachies. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Hierachies")] - IVsHierarchy[] EnumNestedHierachiesForBuildDependency(); - } - - /// - /// Interface for manipulating build dependency - /// - /// Normally this should be an internal interface but since it shouldbe available for the aggregator it must be made public. - [ComVisible(true)] - - public interface IBuildDependencyUpdate - { - /// - /// Defines a container for storing BuildDependencies - /// - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - IVsBuildDependency[] BuildDependencies - { - get; - } - - /// - /// Adds a BuildDependency to the container - /// - /// The dependency to add - void AddBuildDependency(IVsBuildDependency dependency); - - /// - /// Removes the builddependency from teh container. - /// - /// The dependency to add - void RemoveBuildDependency(IVsBuildDependency dependency); - - } - - /// - /// Provides access to the reference data container. - /// - /// Normally this should be an internal interface but since it should be available for - /// the aggregator it must be made public. - [ComVisible(true)] - public interface IReferenceContainerProvider - { - IReferenceContainer GetReferenceContainer(); - } - - /// - /// Defines a container for manipulating references - /// - /// Normally this should be an internal interface but since it should be available for - /// the aggregator it must be made public. - [ComVisible(true)] - public interface IReferenceContainer - { - IList EnumReferences(); - ReferenceNode AddReferenceFromSelectorData(VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null); - void LoadReferencesFromBuildProject(MSBuild.Project buildProject); - } - - /// - /// Defines the events that are internally defined for communication with other subsytems. - /// - [ComVisible(true)] - public interface IProjectEvents - { - /// - /// Event raised just after the project file opened. - /// - [SuppressMessage("Microsoft.Naming", "CA1713:EventsShouldNotHaveBeforeOrAfterPrefix")] - event EventHandler AfterProjectFileOpened; - - /// - /// Event raised before the project file closed. - /// - [SuppressMessage("Microsoft.Naming", "CA1713:EventsShouldNotHaveBeforeOrAfterPrefix")] - event EventHandler BeforeProjectFileClosed; - } - - /// - /// Defines the interface that will specify ehethrr the object is a project events listener. - /// - [ComVisible(true)] - public interface IProjectEventsListener - { - - /// - /// Is the object a project events listener. - /// - /// - bool IsProjectEventsListener - { get; set; } - - } - - /// - /// Enable getting and setting the project events provider - /// - [ComVisible(true)] - public interface IProjectEventsProvider - { - /// - /// Defines the provider for the project events - /// - IProjectEvents ProjectEventsProvider - { - get; - set; - } - } - - /// - /// Defines support for single file generator - /// - public interface ISingleFileGenerator - { - /// - /// Runs the generator on the item represented by the document moniker. - /// - /// - void RunGenerator(string document); - } -} diff --git a/source/Archive/MPF/12.0/Key.snk b/source/Archive/MPF/12.0/Key.snk deleted file mode 100644 index f55b44f357..0000000000 Binary files a/source/Archive/MPF/12.0/Key.snk and /dev/null differ diff --git a/source/Archive/MPF/12.0/LocalizableProperties.cs b/source/Archive/MPF/12.0/LocalizableProperties.cs deleted file mode 100644 index 146f77aa57..0000000000 --- a/source/Archive/MPF/12.0/LocalizableProperties.cs +++ /dev/null @@ -1,145 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.ComponentModel; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Enables a managed object to expose properties and attributes for COM objects. - /// - [ComVisible(true)] - public class LocalizableProperties : ICustomTypeDescriptor - { - #region ICustomTypeDescriptor - public virtual AttributeCollection GetAttributes() - { - AttributeCollection col = TypeDescriptor.GetAttributes(this, true); - return col; - } - - public virtual EventDescriptor GetDefaultEvent() - { - EventDescriptor ed = TypeDescriptor.GetDefaultEvent(this, true); - return ed; - } - - public virtual PropertyDescriptor GetDefaultProperty() - { - PropertyDescriptor pd = TypeDescriptor.GetDefaultProperty(this, true); - return pd; - } - - public virtual object GetEditor(Type editorBaseType) - { - object o = TypeDescriptor.GetEditor(this, editorBaseType, true); - return o; - } - - public virtual EventDescriptorCollection GetEvents() - { - EventDescriptorCollection edc = TypeDescriptor.GetEvents(this, true); - return edc; - } - - public virtual EventDescriptorCollection GetEvents(System.Attribute[] attributes) - { - EventDescriptorCollection edc = TypeDescriptor.GetEvents(this, attributes, true); - return edc; - } - - public virtual object GetPropertyOwner(PropertyDescriptor pd) - { - return this; - } - - public virtual PropertyDescriptorCollection GetProperties() - { - PropertyDescriptorCollection pcol = GetProperties(null); - return pcol; - } - - public virtual PropertyDescriptorCollection GetProperties(System.Attribute[] attributes) - { - ArrayList newList = new ArrayList(); - PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this, attributes, true); - - for(int i = 0; i < props.Count; i++) - newList.Add(CreateDesignPropertyDescriptor(props[i])); - - return new PropertyDescriptorCollection((PropertyDescriptor[])newList.ToArray(typeof(PropertyDescriptor))); ; - } - - public virtual DesignPropertyDescriptor CreateDesignPropertyDescriptor(PropertyDescriptor propertyDescriptor) - { - return new DesignPropertyDescriptor(propertyDescriptor); - } - - public virtual string GetComponentName() - { - string name = TypeDescriptor.GetComponentName(this, true); - return name; - } - - public virtual TypeConverter GetConverter() - { - TypeConverter tc = TypeDescriptor.GetConverter(this, true); - return tc; - } - - public virtual string GetClassName() - { - return this.GetType().FullName; - } - - #endregion ICustomTypeDescriptor - } -} diff --git a/source/Archive/MPF/12.0/MPFProjectAll.files b/source/Archive/MPF/12.0/MPFProjectAll.files deleted file mode 100644 index 0115aeee0f..0000000000 --- a/source/Archive/MPF/12.0/MPFProjectAll.files +++ /dev/null @@ -1,11 +0,0 @@ - - - - - . - - - - - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.csproj b/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.csproj deleted file mode 100644 index e430eca4cc..0000000000 --- a/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.csproj +++ /dev/null @@ -1,154 +0,0 @@ - - - - Debug - AnyCPU - 2.0 - {CACB60A9-1E76-4F92-8831-B134A658C695} - Library - Properties - Microsoft.VisualStudio.Project - Microsoft.VisualStudio.Project - v4.7.1 - 512 - $(AllowedAssemblyPrefix);Microsoft.Internal - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - AllRules.ruleset - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Microsoft.VisualStudio.Project.resources - Designer - - - - - - diff --git a/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.sln b/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.sln deleted file mode 100644 index fef9ea06b8..0000000000 --- a/source/Archive/MPF/12.0/Microsoft.VisualStudio.Project.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.VisualStudio.Project", "Microsoft.VisualStudio.Project.csproj", "{CACB60A9-1E76-4F92-8831-B134A658C695}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CACB60A9-1E76-4F92-8831-B134A658C695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CACB60A9-1E76-4F92-8831-B134A658C695}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CACB60A9-1E76-4F92-8831-B134A658C695}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CACB60A9-1E76-4F92-8831-B134A658C695}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/source/Archive/MPF/12.0/Misc/ConnectionPointContainer.cs b/source/Archive/MPF/12.0/Misc/ConnectionPointContainer.cs deleted file mode 100644 index 13b252042d..0000000000 --- a/source/Archive/MPF/12.0/Misc/ConnectionPointContainer.cs +++ /dev/null @@ -1,162 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Class used to identify a source of events of type SinkType. - /// - [ComVisible(false)] - internal interface IEventSource - where SinkType : class - { - void OnSinkAdded(SinkType sink); - void OnSinkRemoved(SinkType sink); - } - - [ComVisible(true)] - public class ConnectionPointContainer : IConnectionPointContainer - { - private Dictionary connectionPoints; - internal ConnectionPointContainer() - { - connectionPoints = new Dictionary(); - } - internal void AddEventSource(IEventSource source) - where SinkType : class - { - if(null == source) - { - throw new ArgumentNullException("source"); - } - if(connectionPoints.ContainsKey(typeof(SinkType).GUID)) - { - throw new ArgumentException("EventSource guid already added to the list of connection points", "source"); - } - connectionPoints.Add(typeof(SinkType).GUID, new ConnectionPoint(this, source)); - } - - #region IConnectionPointContainer Members - void IConnectionPointContainer.EnumConnectionPoints(out IEnumConnectionPoints ppEnum) - { - throw new NotImplementedException(); ; - } - void IConnectionPointContainer.FindConnectionPoint(ref Guid riid, out IConnectionPoint ppCP) - { - ppCP = connectionPoints[riid]; - } - #endregion - } - - internal class ConnectionPoint : IConnectionPoint - where SinkType : class - { - Dictionary sinks; - private uint nextCookie; - private ConnectionPointContainer container; - private IEventSource source; - internal ConnectionPoint(ConnectionPointContainer container, IEventSource source) - { - if(null == container) - { - throw new ArgumentNullException("container"); - } - if(null == source) - { - throw new ArgumentNullException("source"); - } - this.container = container; - this.source = source; - sinks = new Dictionary(); - nextCookie = 1; - } - #region IConnectionPoint Members - public void Advise(object pUnkSink, out uint pdwCookie) - { - SinkType sink = pUnkSink as SinkType; - if(null == sink) - { - Marshal.ThrowExceptionForHR(VSConstants.E_NOINTERFACE); - } - sinks.Add(nextCookie, sink); - pdwCookie = nextCookie; - source.OnSinkAdded(sink); - nextCookie += 1; - } - - public void EnumConnections(out IEnumConnections ppEnum) - { - throw new NotImplementedException(); ; - } - - public void GetConnectionInterface(out Guid pIID) - { - pIID = typeof(SinkType).GUID; - } - - public void GetConnectionPointContainer(out IConnectionPointContainer ppCPC) - { - ppCPC = this.container; - } - - public void Unadvise(uint dwCookie) - { - // This will throw if the cookie is not in the list. - SinkType sink = sinks[dwCookie]; - sinks.Remove(dwCookie); - source.OnSinkRemoved(sink); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Misc/ExternDll.cs b/source/Archive/MPF/12.0/Misc/ExternDll.cs deleted file mode 100644 index 91f1fe3526..0000000000 --- a/source/Archive/MPF/12.0/Misc/ExternDll.cs +++ /dev/null @@ -1,122 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -namespace Microsoft.VisualStudio.Project -{ - internal static class ExternDll - { - -#if FEATURE_PAL - -#if !PLATFORM_UNIX - internal const String DLLPREFIX = ""; - internal const String DLLSUFFIX = ".dll"; -#else // !PLATFORM_UNIX -#if __APPLE__ - internal const String DLLPREFIX = "lib"; - internal const String DLLSUFFIX = ".dylib"; -#elif _AIX - internal const String DLLPREFIX = "lib"; - internal const String DLLSUFFIX = ".a"; -#elif __hppa__ || IA64 - internal const String DLLPREFIX = "lib"; - internal const String DLLSUFFIX = ".sl"; -#else - internal const String DLLPREFIX = "lib"; - internal const String DLLSUFFIX = ".so"; -#endif -#endif // !PLATFORM_UNIX - - public const string Kernel32 = DLLPREFIX + "rotor_pal" + DLLSUFFIX; - public const string User32 = DLLPREFIX + "rotor_pal" + DLLSUFFIX; - public const string Mscoree = DLLPREFIX + "sscoree" + DLLSUFFIX; -#else - public const string Activeds = "activeds.dll"; - public const string Advapi32 = "advapi32.dll"; - public const string Comctl32 = "comctl32.dll"; - public const string Comdlg32 = "comdlg32.dll"; - public const string Gdi32 = "gdi32.dll"; - public const string Gdiplus = "gdiplus.dll"; - public const string Hhctrl = "hhctrl.ocx"; - public const string Imm32 = "imm32.dll"; - public const string Kernel32 = "kernel32.dll"; - public const string Loadperf = "Loadperf.dll"; - public const string Mscoree = "mscoree.dll"; - public const string Mscorwks = "mscorwks.dll"; - public const string Msi = "msi.dll"; - public const string Mqrt = "mqrt.dll"; - public const string Ntdll = "ntdll.dll"; - public const string Ole32 = "ole32.dll"; - public const string Oleacc = "oleacc.dll"; - public const string Oleaut32 = "oleaut32.dll"; - public const string Olepro32 = "olepro32.dll"; - public const string PerfCounter = "perfcounter.dll"; - public const string Powrprof = "Powrprof.dll"; - public const string Psapi = "psapi.dll"; - public const string Shell32 = "shell32.dll"; - public const string Shfolder = "shfolder.dll"; - public const string User32 = "user32.dll"; - public const string Uxtheme = "uxtheme.dll"; - public const string WinMM = "winmm.dll"; - public const string Winspool = "winspool.drv"; - public const string Wtsapi32 = "wtsapi32.dll"; - public const string Version = "version.dll"; - public const string Vsassert = "vsassert.dll"; - public const string Shlwapi = "shlwapi.dll"; - public const string Crypt32 = "crypt32.dll"; - - // system.data specific - internal const string Odbc32 = "odbc32.dll"; - internal const string SNI = "System.Data.dll"; - - // system.data.oracleclient specific - internal const string OciDll = "oci.dll"; - internal const string OraMtsDll = "oramts.dll"; -#endif //!FEATURE_PAL - } -} diff --git a/source/Archive/MPF/12.0/Misc/NativeMethods.cs b/source/Archive/MPF/12.0/Misc/NativeMethods.cs deleted file mode 100644 index c38048d481..0000000000 --- a/source/Archive/MPF/12.0/Misc/NativeMethods.cs +++ /dev/null @@ -1,744 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.TextManager.Interop; - -namespace Microsoft.VisualStudio.Project -{ - internal static class NativeMethods - { - // IIDS - public static readonly Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}"); - - public const int - CLSCTX_INPROC_SERVER = 0x1; - - public const int - S_FALSE = 0x00000001, - S_OK = 0x00000000, - - IDOK = 1, - IDCANCEL = 2, - IDABORT = 3, - IDRETRY = 4, - IDIGNORE = 5, - IDYES = 6, - IDNO = 7, - IDCLOSE = 8, - IDHELP = 9, - IDTRYAGAIN = 10, - IDCONTINUE = 11, - - OLECMDERR_E_NOTSUPPORTED = unchecked((int)0x80040100), - OLECMDERR_E_UNKNOWNGROUP = unchecked((int)0x80040104), - - UNDO_E_CLIENTABORT = unchecked((int)0x80044001), - E_OUTOFMEMORY = unchecked((int)0x8007000E), - E_INVALIDARG = unchecked((int)0x80070057), - E_FAIL = unchecked((int)0x80004005), - E_NOINTERFACE = unchecked((int)0x80004002), - E_POINTER = unchecked((int)0x80004003), - E_NOTIMPL = unchecked((int)0x80004001), - E_UNEXPECTED = unchecked((int)0x8000FFFF), - E_HANDLE = unchecked((int)0x80070006), - E_ABORT = unchecked((int)0x80004004), - E_ACCESSDENIED = unchecked((int)0x80070005), - E_PENDING = unchecked((int)0x8000000A); - - public const int - OLECLOSE_SAVEIFDIRTY = 0, - OLECLOSE_NOSAVE = 1, - OLECLOSE_PROMPTSAVE = 2; - - public const int - OLEIVERB_PRIMARY = 0, - OLEIVERB_SHOW = -1, - OLEIVERB_OPEN = -2, - OLEIVERB_HIDE = -3, - OLEIVERB_UIACTIVATE = -4, - OLEIVERB_INPLACEACTIVATE = -5, - OLEIVERB_DISCARDUNDOSTATE = -6, - OLEIVERB_PROPERTIES = -7; - - public const int - OFN_READONLY = unchecked((int)0x00000001), - OFN_OVERWRITEPROMPT = unchecked((int)0x00000002), - OFN_HIDEREADONLY = unchecked((int)0x00000004), - OFN_NOCHANGEDIR = unchecked((int)0x00000008), - OFN_SHOWHELP = unchecked((int)0x00000010), - OFN_ENABLEHOOK = unchecked((int)0x00000020), - OFN_ENABLETEMPLATE = unchecked((int)0x00000040), - OFN_ENABLETEMPLATEHANDLE = unchecked((int)0x00000080), - OFN_NOVALIDATE = unchecked((int)0x00000100), - OFN_ALLOWMULTISELECT = unchecked((int)0x00000200), - OFN_EXTENSIONDIFFERENT = unchecked((int)0x00000400), - OFN_PATHMUSTEXIST = unchecked((int)0x00000800), - OFN_FILEMUSTEXIST = unchecked((int)0x00001000), - OFN_CREATEPROMPT = unchecked((int)0x00002000), - OFN_SHAREAWARE = unchecked((int)0x00004000), - OFN_NOREADONLYRETURN = unchecked((int)0x00008000), - OFN_NOTESTFILECREATE = unchecked((int)0x00010000), - OFN_NONETWORKBUTTON = unchecked((int)0x00020000), - OFN_NOLONGNAMES = unchecked((int)0x00040000), - OFN_EXPLORER = unchecked((int)0x00080000), - OFN_NODEREFERENCELINKS = unchecked((int)0x00100000), - OFN_LONGNAMES = unchecked((int)0x00200000), - OFN_ENABLEINCLUDENOTIFY = unchecked((int)0x00400000), - OFN_ENABLESIZING = unchecked((int)0x00800000), - OFN_USESHELLITEM = unchecked((int)0x01000000), - OFN_DONTADDTORECENT = unchecked((int)0x02000000), - OFN_FORCESHOWHIDDEN = unchecked((int)0x10000000); - - // for READONLYSTATUS - public const int - ROSTATUS_NotReadOnly = 0x0, - ROSTATUS_ReadOnly = 0x1, - ROSTATUS_Unknown = unchecked((int)0xFFFFFFFF); - - public const int - IEI_DoNotLoadDocData = 0x10000000; - - public const int - CB_SETDROPPEDWIDTH = 0x0160, - - GWL_STYLE = (-16), - GWL_EXSTYLE = (-20), - - DWL_MSGRESULT = 0, - - SW_SHOWNORMAL = 1, - - HTMENU = 5, - - WS_POPUP = unchecked((int)0x80000000), - WS_CHILD = 0x40000000, - WS_MINIMIZE = 0x20000000, - WS_VISIBLE = 0x10000000, - WS_DISABLED = 0x08000000, - WS_CLIPSIBLINGS = 0x04000000, - WS_CLIPCHILDREN = 0x02000000, - WS_MAXIMIZE = 0x01000000, - WS_CAPTION = 0x00C00000, - WS_BORDER = 0x00800000, - WS_DLGFRAME = 0x00400000, - WS_VSCROLL = 0x00200000, - WS_HSCROLL = 0x00100000, - WS_SYSMENU = 0x00080000, - WS_THICKFRAME = 0x00040000, - WS_TABSTOP = 0x00010000, - WS_MINIMIZEBOX = 0x00020000, - WS_MAXIMIZEBOX = 0x00010000, - WS_EX_DLGMODALFRAME = 0x00000001, - WS_EX_MDICHILD = 0x00000040, - WS_EX_TOOLWINDOW = 0x00000080, - WS_EX_CLIENTEDGE = 0x00000200, - WS_EX_CONTEXTHELP = 0x00000400, - WS_EX_RIGHT = 0x00001000, - WS_EX_LEFT = 0x00000000, - WS_EX_RTLREADING = 0x00002000, - WS_EX_LEFTSCROLLBAR = 0x00004000, - WS_EX_CONTROLPARENT = 0x00010000, - WS_EX_STATICEDGE = 0x00020000, - WS_EX_APPWINDOW = 0x00040000, - WS_EX_LAYERED = 0x00080000, - WS_EX_TOPMOST = 0x00000008, - WS_EX_NOPARENTNOTIFY = 0x00000004, - - LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54), - - LVS_EX_LABELTIP = 0x00004000, - - // winuser.h - WH_JOURNALPLAYBACK = 1, - WH_GETMESSAGE = 3, - WH_MOUSE = 7, - WSF_VISIBLE = 0x0001, - WM_NULL = 0x0000, - WM_CREATE = 0x0001, - WM_DELETEITEM = 0x002D, - WM_DESTROY = 0x0002, - WM_MOVE = 0x0003, - WM_SIZE = 0x0005, - WM_ACTIVATE = 0x0006, - WA_INACTIVE = 0, - WA_ACTIVE = 1, - WA_CLICKACTIVE = 2, - WM_SETFOCUS = 0x0007, - WM_KILLFOCUS = 0x0008, - WM_ENABLE = 0x000A, - WM_SETREDRAW = 0x000B, - WM_SETTEXT = 0x000C, - WM_GETTEXT = 0x000D, - WM_GETTEXTLENGTH = 0x000E, - WM_PAINT = 0x000F, - WM_CLOSE = 0x0010, - WM_QUERYENDSESSION = 0x0011, - WM_QUIT = 0x0012, - WM_QUERYOPEN = 0x0013, - WM_ERASEBKGND = 0x0014, - WM_SYSCOLORCHANGE = 0x0015, - WM_ENDSESSION = 0x0016, - WM_SHOWWINDOW = 0x0018, - WM_WININICHANGE = 0x001A, - WM_SETTINGCHANGE = 0x001A, - WM_DEVMODECHANGE = 0x001B, - WM_ACTIVATEAPP = 0x001C, - WM_FONTCHANGE = 0x001D, - WM_TIMECHANGE = 0x001E, - WM_CANCELMODE = 0x001F, - WM_SETCURSOR = 0x0020, - WM_MOUSEACTIVATE = 0x0021, - WM_CHILDACTIVATE = 0x0022, - WM_QUEUESYNC = 0x0023, - WM_GETMINMAXINFO = 0x0024, - WM_PAINTICON = 0x0026, - WM_ICONERASEBKGND = 0x0027, - WM_NEXTDLGCTL = 0x0028, - WM_SPOOLERSTATUS = 0x002A, - WM_DRAWITEM = 0x002B, - WM_MEASUREITEM = 0x002C, - WM_VKEYTOITEM = 0x002E, - WM_CHARTOITEM = 0x002F, - WM_SETFONT = 0x0030, - WM_GETFONT = 0x0031, - WM_SETHOTKEY = 0x0032, - WM_GETHOTKEY = 0x0033, - WM_QUERYDRAGICON = 0x0037, - WM_COMPAREITEM = 0x0039, - WM_GETOBJECT = 0x003D, - WM_COMPACTING = 0x0041, - WM_COMMNOTIFY = 0x0044, - WM_WINDOWPOSCHANGING = 0x0046, - WM_WINDOWPOSCHANGED = 0x0047, - WM_POWER = 0x0048, - WM_COPYDATA = 0x004A, - WM_CANCELJOURNAL = 0x004B, - WM_NOTIFY = 0x004E, - WM_INPUTLANGCHANGEREQUEST = 0x0050, - WM_INPUTLANGCHANGE = 0x0051, - WM_TCARD = 0x0052, - WM_HELP = 0x0053, - WM_USERCHANGED = 0x0054, - WM_NOTIFYFORMAT = 0x0055, - WM_CONTEXTMENU = 0x007B, - WM_STYLECHANGING = 0x007C, - WM_STYLECHANGED = 0x007D, - WM_DISPLAYCHANGE = 0x007E, - WM_GETICON = 0x007F, - WM_SETICON = 0x0080, - WM_NCCREATE = 0x0081, - WM_NCDESTROY = 0x0082, - WM_NCCALCSIZE = 0x0083, - WM_NCHITTEST = 0x0084, - WM_NCPAINT = 0x0085, - WM_NCACTIVATE = 0x0086, - WM_GETDLGCODE = 0x0087, - WM_NCMOUSEMOVE = 0x00A0, - WM_NCLBUTTONDOWN = 0x00A1, - WM_NCLBUTTONUP = 0x00A2, - WM_NCLBUTTONDBLCLK = 0x00A3, - WM_NCRBUTTONDOWN = 0x00A4, - WM_NCRBUTTONUP = 0x00A5, - WM_NCRBUTTONDBLCLK = 0x00A6, - WM_NCMBUTTONDOWN = 0x00A7, - WM_NCMBUTTONUP = 0x00A8, - WM_NCMBUTTONDBLCLK = 0x00A9, - WM_NCXBUTTONDOWN = 0x00AB, - WM_NCXBUTTONUP = 0x00AC, - WM_NCXBUTTONDBLCLK = 0x00AD, - WM_KEYFIRST = 0x0100, - WM_KEYDOWN = 0x0100, - WM_KEYUP = 0x0101, - WM_CHAR = 0x0102, - WM_DEADCHAR = 0x0103, - WM_CTLCOLOR = 0x0019, - WM_SYSKEYDOWN = 0x0104, - WM_SYSKEYUP = 0x0105, - WM_SYSCHAR = 0x0106, - WM_SYSDEADCHAR = 0x0107, - WM_KEYLAST = 0x0108, - WM_IME_STARTCOMPOSITION = 0x010D, - WM_IME_ENDCOMPOSITION = 0x010E, - WM_IME_COMPOSITION = 0x010F, - WM_IME_KEYLAST = 0x010F, - WM_INITDIALOG = 0x0110, - WM_COMMAND = 0x0111, - WM_SYSCOMMAND = 0x0112, - WM_TIMER = 0x0113, - WM_HSCROLL = 0x0114, - WM_VSCROLL = 0x0115, - WM_INITMENU = 0x0116, - WM_INITMENUPOPUP = 0x0117, - WM_MENUSELECT = 0x011F, - WM_MENUCHAR = 0x0120, - WM_ENTERIDLE = 0x0121, - WM_CHANGEUISTATE = 0x0127, - WM_UPDATEUISTATE = 0x0128, - WM_QUERYUISTATE = 0x0129, - WM_CTLCOLORMSGBOX = 0x0132, - WM_CTLCOLOREDIT = 0x0133, - WM_CTLCOLORLISTBOX = 0x0134, - WM_CTLCOLORBTN = 0x0135, - WM_CTLCOLORDLG = 0x0136, - WM_CTLCOLORSCROLLBAR = 0x0137, - WM_CTLCOLORSTATIC = 0x0138, - WM_MOUSEFIRST = 0x0200, - WM_MOUSEMOVE = 0x0200, - WM_LBUTTONDOWN = 0x0201, - WM_LBUTTONUP = 0x0202, - WM_LBUTTONDBLCLK = 0x0203, - WM_RBUTTONDOWN = 0x0204, - WM_RBUTTONUP = 0x0205, - WM_RBUTTONDBLCLK = 0x0206, - WM_MBUTTONDOWN = 0x0207, - WM_MBUTTONUP = 0x0208, - WM_MBUTTONDBLCLK = 0x0209, - WM_XBUTTONDOWN = 0x020B, - WM_XBUTTONUP = 0x020C, - WM_XBUTTONDBLCLK = 0x020D, - WM_MOUSEWHEEL = 0x020A, - WM_MOUSELAST = 0x020A, - WM_PARENTNOTIFY = 0x0210, - WM_ENTERMENULOOP = 0x0211, - WM_EXITMENULOOP = 0x0212, - WM_NEXTMENU = 0x0213, - WM_SIZING = 0x0214, - WM_CAPTURECHANGED = 0x0215, - WM_MOVING = 0x0216, - WM_POWERBROADCAST = 0x0218, - WM_DEVICECHANGE = 0x0219, - WM_IME_SETCONTEXT = 0x0281, - WM_IME_NOTIFY = 0x0282, - WM_IME_CONTROL = 0x0283, - WM_IME_COMPOSITIONFULL = 0x0284, - WM_IME_SELECT = 0x0285, - WM_IME_CHAR = 0x0286, - WM_IME_KEYDOWN = 0x0290, - WM_IME_KEYUP = 0x0291, - WM_MDICREATE = 0x0220, - WM_MDIDESTROY = 0x0221, - WM_MDIACTIVATE = 0x0222, - WM_MDIRESTORE = 0x0223, - WM_MDINEXT = 0x0224, - WM_MDIMAXIMIZE = 0x0225, - WM_MDITILE = 0x0226, - WM_MDICASCADE = 0x0227, - WM_MDIICONARRANGE = 0x0228, - WM_MDIGETACTIVE = 0x0229, - WM_MDISETMENU = 0x0230, - WM_ENTERSIZEMOVE = 0x0231, - WM_EXITSIZEMOVE = 0x0232, - WM_DROPFILES = 0x0233, - WM_MDIREFRESHMENU = 0x0234, - WM_MOUSEHOVER = 0x02A1, - WM_MOUSELEAVE = 0x02A3, - WM_CUT = 0x0300, - WM_COPY = 0x0301, - WM_PASTE = 0x0302, - WM_CLEAR = 0x0303, - WM_UNDO = 0x0304, - WM_RENDERFORMAT = 0x0305, - WM_RENDERALLFORMATS = 0x0306, - WM_DESTROYCLIPBOARD = 0x0307, - WM_DRAWCLIPBOARD = 0x0308, - WM_PAINTCLIPBOARD = 0x0309, - WM_VSCROLLCLIPBOARD = 0x030A, - WM_SIZECLIPBOARD = 0x030B, - WM_ASKCBFORMATNAME = 0x030C, - WM_CHANGECBCHAIN = 0x030D, - WM_HSCROLLCLIPBOARD = 0x030E, - WM_QUERYNEWPALETTE = 0x030F, - WM_PALETTEISCHANGING = 0x0310, - WM_PALETTECHANGED = 0x0311, - WM_HOTKEY = 0x0312, - WM_PRINT = 0x0317, - WM_PRINTCLIENT = 0x0318, - WM_HANDHELDFIRST = 0x0358, - WM_HANDHELDLAST = 0x035F, - WM_AFXFIRST = 0x0360, - WM_AFXLAST = 0x037F, - WM_PENWINFIRST = 0x0380, - WM_PENWINLAST = 0x038F, - WM_APP = unchecked((int)0x8000), - WM_USER = 0x0400, - WM_REFLECT = - WM_USER + 0x1C00, - WS_OVERLAPPED = 0x00000000, - WPF_SETMINPOSITION = 0x0001, - WM_CHOOSEFONT_GETLOGFONT = (0x0400 + 1), - - WHEEL_DELTA = 120, - DWLP_MSGRESULT = 0, - PSNRET_NOERROR = 0, - PSNRET_INVALID = 1, - PSNRET_INVALID_NOCHANGEPAGE = 2; - - public const int - PSN_APPLY = ((0 - 200) - 2), - PSN_KILLACTIVE = ((0 - 200) - 1), - PSN_RESET = ((0 - 200) - 3), - PSN_SETACTIVE = ((0 - 200) - 0); - - public const int - GMEM_MOVEABLE = 0x0002, - GMEM_ZEROINIT = 0x0040, - GMEM_DDESHARE = 0x2000; - - public const int - SWP_NOACTIVATE = 0x0010, - SWP_NOZORDER = 0x0004, - SWP_NOSIZE = 0x0001, - SWP_NOMOVE = 0x0002, - SWP_FRAMECHANGED = 0x0020; - - public const int - TVM_SETINSERTMARK = (0x1100 + 26), - TVM_GETEDITCONTROL = (0x1100 + 15); - - public const int - FILE_ATTRIBUTE_READONLY = 0x00000001; - - public const int - PSP_DEFAULT = 0x00000000, - PSP_DLGINDIRECT = 0x00000001, - PSP_USEHICON = 0x00000002, - PSP_USEICONID = 0x00000004, - PSP_USETITLE = 0x00000008, - PSP_RTLREADING = 0x00000010, - PSP_HASHELP = 0x00000020, - PSP_USEREFPARENT = 0x00000040, - PSP_USECALLBACK = 0x00000080, - PSP_PREMATURE = 0x00000400, - PSP_HIDEHEADER = 0x00000800, - PSP_USEHEADERTITLE = 0x00001000, - PSP_USEHEADERSUBTITLE = 0x00002000; - - public const int - PSH_DEFAULT = 0x00000000, - PSH_PROPTITLE = 0x00000001, - PSH_USEHICON = 0x00000002, - PSH_USEICONID = 0x00000004, - PSH_PROPSHEETPAGE = 0x00000008, - PSH_WIZARDHASFINISH = 0x00000010, - PSH_WIZARD = 0x00000020, - PSH_USEPSTARTPAGE = 0x00000040, - PSH_NOAPPLYNOW = 0x00000080, - PSH_USECALLBACK = 0x00000100, - PSH_HASHELP = 0x00000200, - PSH_MODELESS = 0x00000400, - PSH_RTLREADING = 0x00000800, - PSH_WIZARDCONTEXTHELP = 0x00001000, - PSH_WATERMARK = 0x00008000, - PSH_USEHBMWATERMARK = 0x00010000, // user pass in a hbmWatermark instead of pszbmWatermark - PSH_USEHPLWATERMARK = 0x00020000, // - PSH_STRETCHWATERMARK = 0x00040000, // stretchwatermark also applies for the header - PSH_HEADER = 0x00080000, - PSH_USEHBMHEADER = 0x00100000, - PSH_USEPAGELANG = 0x00200000, // use frame dialog template matched to page - PSH_WIZARD_LITE = 0x00400000, - PSH_NOCONTEXTHELP = 0x02000000; - - public const int - PSBTN_BACK = 0, - PSBTN_NEXT = 1, - PSBTN_FINISH = 2, - PSBTN_OK = 3, - PSBTN_APPLYNOW = 4, - PSBTN_CANCEL = 5, - PSBTN_HELP = 6, - PSBTN_MAX = 6; - - public const int - TRANSPARENT = 1, - OPAQUE = 2, - FW_BOLD = 700; - - [StructLayout(LayoutKind.Sequential)] - public struct NMHDR - { - public IntPtr hwndFrom; - public int idFrom; - public int code; - } - - /// - /// Helper class for setting the text parameters to OLECMDTEXT structures. - /// - public static class OLECMDTEXT - { - - /// - /// Flags for the OLE command text - /// - public enum OLECMDTEXTF - { - /// No flag - OLECMDTEXTF_NONE = 0, - /// The name of the command is required. - OLECMDTEXTF_NAME = 1, - /// A description of the status is required. - OLECMDTEXTF_STATUS = 2 - } - } - - /// - /// OLECMDF enums for IOleCommandTarget - /// - public enum tagOLECMDF - { - OLECMDF_SUPPORTED = 1, - OLECMDF_ENABLED = 2, - OLECMDF_LATCHED = 4, - OLECMDF_NINCHED = 8, - OLECMDF_INVISIBLE = 16 - } - - /// - /// This method takes a file URL and converts it to an absolute path. The trick here is that - /// if there is a '#' in the path, everything after this is treated as a fragment. So - /// we need to append the fragment to the end of the path. - /// - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - public static string GetAbsolutePath(string fileName) - { - System.Diagnostics.Debug.Assert(fileName != null && fileName.Length > 0, "Cannot get absolute path, fileName is not valid"); - - Uri uri = new Uri(fileName); - return uri.LocalPath + uri.Fragment; - } - - /// - /// Please use this "approved" method to compare file names. - /// - public static bool IsSamePath(string file1, string file2) - { - if(file1 == null || file1.Length == 0) - { - return (file2 == null || file2.Length == 0); - } - - Uri uri1 = null; - Uri uri2 = null; - - try - { - if(!Uri.TryCreate(file1, UriKind.Absolute, out uri1) || !Uri.TryCreate(file2, UriKind.Absolute, out uri2)) - { - return false; - } - - if(uri1 != null && uri1.IsFile && uri2 != null && uri2.IsFile) - { - return 0 == String.Compare(uri1.LocalPath, uri2.LocalPath, StringComparison.OrdinalIgnoreCase); - } - - return file1 == file2; - } - catch(UriFormatException e) - { - Trace.WriteLine("Exception " + e.Message); - } - - return false; - } - - [ComImport(), Guid("9BDA66AE-CA28-4e22-AA27-8A7218A0E3FA"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - public interface IEventHandler - { - - // converts the underlying codefunction into an event handler for the given event - // if the given event is NULL, then the function will handle no events - [PreserveSig] - int AddHandler(string bstrEventName); - - [PreserveSig] - int RemoveHandler(string bstrEventName); - - IVsEnumBSTR GetHandledEvents(); - - bool HandlesEvent(string bstrEventName); - } - - [ComImport(), Guid("A55CCBCC-7031-432d-B30A-A68DE7BDAD75"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - public interface IParameterKind - { - - void SetParameterPassingMode(PARAMETER_PASSING_MODE ParamPassingMode); - void SetParameterArrayDimensions(int uDimensions); - int GetParameterArrayCount(); - int GetParameterArrayDimensions(int uIndex); - int GetParameterPassingMode(); - } - - public enum PARAMETER_PASSING_MODE - { - cmParameterTypeIn = 1, - cmParameterTypeOut = 2, - cmParameterTypeInOut = 3 - } - - [ - ComImport, Guid("3E596484-D2E4-461a-A876-254C4F097EBB"), - InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown) - ] - public interface IMethodXML - { - // Generate XML describing the contents of this function's body. - void GetXML(ref string pbstrXML); - - // Parse the incoming XML with respect to the CodeModel XML schema and - // use the result to regenerate the body of the function. - /// - [PreserveSig] - int SetXML(string pszXML); - - // This is really a textpoint - [PreserveSig] - int GetBodyPoint([MarshalAs(UnmanagedType.Interface)]out object bodyPoint); - } - - [ComImport(), Guid("EA1A87AD-7BC5-4349-B3BE-CADC301F17A3"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - public interface IVBFileCodeModelEvents - { - - [PreserveSig] - int StartEdit(); - - [PreserveSig] - int EndEdit(); - } - - ///-------------------------------------------------------------------------- - /// ICodeClassBase: - ///-------------------------------------------------------------------------- - [GuidAttribute("23BBD58A-7C59-449b-A93C-43E59EFC080C")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - [ComImport()] - public interface ICodeClassBase - { - [PreserveSig()] - int GetBaseName(out string pBaseName); - } - - public const ushort CF_HDROP = 15; // winuser.h - public const uint MK_CONTROL = 0x0008; //winuser.h - public const uint MK_SHIFT = 0x0004; - public const int MAX_PATH = 260; // windef.h - - /// - /// Specifies options for a bitmap image associated with a task item. - /// - public enum VSTASKBITMAP - { - BMP_COMPILE = -1, - BMP_SQUIGGLE = -2, - BMP_COMMENT = -3, - BMP_SHORTCUT = -4, - BMP_USER = -5 - }; - - public const int ILD_NORMAL = 0x0000, - ILD_TRANSPARENT = 0x0001, - ILD_MASK = 0x0010, - ILD_ROP = 0x0040; - - /// - /// Defines the values that are not supported by the System.Environment.SpecialFolder enumeration - /// - [ComVisible(true)] - public enum ExtendedSpecialFolder - { - /// - /// Identical to CSIDL_COMMON_STARTUP - /// - CommonStartup = 0x0018, - - /// - /// Identical to CSIDL_WINDOWS - /// - Windows = 0x0024, - } - - - // APIS - - /// - /// Changes the parent window of the specified child window. - /// - /// Handle to the child window. - /// Handle to the new parent window. If this parameter is NULL, the desktop window becomes the new parent window. - /// A handle to the previous parent window indicates success. NULL indicates failure. - [DllImport("User32", ExactSpelling = true, CharSet = CharSet.Auto)] - public static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent); - - [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] - public static extern bool DestroyIcon(IntPtr handle); - - [DllImport("user32.dll", EntryPoint = "IsDialogMessageA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - public static extern bool IsDialogMessageA(IntPtr hDlg, ref MSG msg); - - /// - /// Indicates whether the file type is binary or not - /// - /// Full path to the file to check - /// If file isbianry the bitness of the app is indicated by lpBinaryType value. - /// True if the file is binary false otherwise - [DllImport("kernel32.dll")] - public static extern bool GetBinaryType([MarshalAs(UnmanagedType.LPWStr)]string lpApplicationName, out uint lpBinaryType); - - } -} - diff --git a/source/Archive/MPF/12.0/Misc/UnsafeNativeMethods.cs b/source/Archive/MPF/12.0/Misc/UnsafeNativeMethods.cs deleted file mode 100644 index 9cb50f9a79..0000000000 --- a/source/Archive/MPF/12.0/Misc/UnsafeNativeMethods.cs +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project -{ - internal static class UnsafeNativeMethods - { - [DllImport(ExternDll.Kernel32, EntryPoint = "GlobalLock", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - internal static extern IntPtr GlobalLock(IntPtr h); - - [DllImport(ExternDll.Kernel32, EntryPoint = "GlobalUnlock", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - internal static extern bool GlobalUnLock(IntPtr h); - - [DllImport(ExternDll.Kernel32, EntryPoint = "GlobalSize", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - internal static extern int GlobalSize(IntPtr h); - - [DllImport(ExternDll.Ole32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int OleSetClipboard(Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject); - - [DllImport(ExternDll.Ole32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int OleGetClipboard(out Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject); - - [DllImport(ExternDll.Ole32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int OleFlushClipboard(); - - [DllImport(ExternDll.User32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int OpenClipboard(IntPtr newOwner); - - [DllImport(ExternDll.User32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int EmptyClipboard(); - - [DllImport(ExternDll.User32, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal static extern int CloseClipboard(); - - [DllImport(ExternDll.Comctl32, CharSet = CharSet.Auto)] - internal static extern int ImageList_GetImageCount(HandleRef himl); - - [DllImport(ExternDll.Comctl32, CharSet = CharSet.Auto)] - internal static extern bool ImageList_Draw(HandleRef himl, int i, HandleRef hdcDst, int x, int y, int fStyle); - - [DllImport(ExternDll.Shell32, EntryPoint = "DragQueryFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - internal static extern uint DragQueryFile(IntPtr hDrop, uint iFile, char[] lpszFile, uint cch); - - [DllImport(ExternDll.User32, EntryPoint = "RegisterClipboardFormatW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] - internal static extern ushort RegisterClipboardFormat(string format); - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode"), DllImport(ExternDll.Shell32, EntryPoint = "SHGetSpecialFolderLocation")] - internal static extern int SHGetSpecialFolderLocation(IntPtr hwnd, int csidl, [Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] ppidl); - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode"), DllImport(ExternDll.Shell32, EntryPoint = "SHGetPathFromIDList", CharSet = System.Runtime.InteropServices.CharSet.Auto)] - internal static extern bool SHGetPathFromIDList(IntPtr pidl, IntPtr pszPath); - } -} - diff --git a/source/Archive/MPF/12.0/NestedProjectBuildDependency.cs b/source/Archive/MPF/12.0/NestedProjectBuildDependency.cs deleted file mode 100644 index c3d3c9a6b1..0000000000 --- a/source/Archive/MPF/12.0/NestedProjectBuildDependency.cs +++ /dev/null @@ -1,121 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Used for adding a build dependency to nested project (not a real project reference) - /// - public class NestedProjectBuildDependency : IVsBuildDependency - { - IVsHierarchy dependentHierarchy = null; - - #region ctors - - public NestedProjectBuildDependency(IVsHierarchy dependentHierarchy) - { - this.dependentHierarchy = dependentHierarchy; - } - #endregion - - #region IVsBuildDependency methods - public int get_CanonicalName(out string canonicalName) - { - canonicalName = null; - return VSConstants.S_OK; - } - - public int get_Type(out System.Guid guidType) - { - // All our dependencies are build projects - guidType = VSConstants.GUID_VS_DEPTYPE_BUILD_PROJECT; - - return VSConstants.S_OK; - } - - public int get_Description(out string description) - { - description = null; - return VSConstants.S_OK; - } - - - public int get_HelpContext(out uint helpContext) - { - helpContext = 0; - return VSConstants.E_NOTIMPL; - } - - public int get_HelpFile(out string helpFile) - { - helpFile = null; - return VSConstants.E_NOTIMPL; - } - - public int get_MustUpdateBefore(out int mustUpdateBefore) - { - // Must always update dependencies - mustUpdateBefore = 1; - - return VSConstants.S_OK; - } - - public int get_ReferredProject(out object unknownProject) - { - unknownProject = this.dependentHierarchy; - - return (unknownProject == null) ? VSConstants.E_FAIL : VSConstants.S_OK; - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/NestedProjectNode.cs b/source/Archive/MPF/12.0/NestedProjectNode.cs deleted file mode 100644 index 422d79f3a7..0000000000 --- a/source/Archive/MPF/12.0/NestedProjectNode.cs +++ /dev/null @@ -1,1185 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using ErrorHandler = Microsoft.VisualStudio.ErrorHandler; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - - public class NestedProjectNode : HierarchyNode, IPropertyNotifySink - { - #region fields - private IVsHierarchy nestedHierarchy; - - Guid projectInstanceGuid = Guid.Empty; - - private string projectName = String.Empty; - - private string projectPath = String.Empty; - - private ImageHandler imageHandler; - - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - - /// - /// Sets the dispose flag on the object. - /// - private bool isDisposed; - - // A cooike retrieved when advising on property chnanged events. - private uint projectPropertyNotifySinkCookie; - #endregion - - #region properties - internal IVsHierarchy NestedHierarchy - { - get - { - return this.nestedHierarchy; - } - } - #endregion - - #region virtual properties - /// - /// Returns the __VSADDVPFLAGS that will be passed in when calling AddVirtualProjectEx - /// - protected virtual uint VirtualProjectFlags - { - get { return 0; } - } - #endregion - - #region overridden properties - /// - /// The path of the nested project. - /// - public override string Url - { - get - { - return this.projectPath; - } - } - - /// - /// The Caption of the nested project. - /// - public override string Caption - { - get - { - return Path.GetFileNameWithoutExtension(this.projectName); - } - } - - public override Guid ItemTypeGuid - { - get - { - return VSConstants.GUID_ItemType_SubProject; - } - } - - /// - /// Defines whether a node can execute a command if in selection. - /// We do this in order to let the nested project to handle the execution of its own commands. - /// - public override bool CanExecuteCommand - { - get - { - return false; - } - } - - public override int SortPriority - { - get { return DefaultSortOrderNode.NestedProjectNode; } - } - - protected bool IsDisposed - { - get { return this.isDisposed; } - set { this.isDisposed = value; } - } - - - - #endregion - - #region ctor - - protected NestedProjectNode() - { - } - - public NestedProjectNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.IsExpanded = true; - } - #endregion - - #region IPropertyNotifySink Members - /// - /// Notifies a sink that the [bindable] property specified by dispID has changed. - /// If dispID is DISPID_UNKNOWN, then multiple properties have changed together. - /// The client (owner of the sink) should then retrieve the current value of each property of interest from the object that generated the notification. - /// In our case we will care about the VSLangProj80.VsProjPropId.VBPROJPROPID_FileName and update the changes in the parent project file. - /// - /// Dispatch identifier of the property that is about to change or DISPID_UNKNOWN if multiple properties are about to change. - public virtual void OnChanged(int dispid) - { - if (dispid == (int)VSLangProj80.VsProjPropId.VBPROJPROPID_FileName) - { - // Get the filename of the nested project. Inetead of asking the label on the nested we ask the filename, since the label might not yet been set. - IVsProject3 nestedProject = this.nestedHierarchy as IVsProject3; - - if (nestedProject != null) - { - string document; - ErrorHandler.ThrowOnFailure(nestedProject.GetMkDocument(VSConstants.VSITEMID_ROOT, out document)); - this.RenameNestedProjectInParentProject(Path.GetFileNameWithoutExtension(document)); - - // We need to redraw the caption since for some reason, by intervining to the OnChanged event the Caption is not updated. - this.ReDraw(UIHierarchyElement.Caption); - } - } - } - - /// - /// Notifies a sink that a [requestedit] property is about to change and that the object is asking the sink how to proceed. - /// - /// Dispatch identifier of the property that is about to change or DISPID_UNKNOWN if multiple properties are about to change. - public virtual void OnRequestEdit(int dispid) - { - - } - - #endregion - - #region public methods - #endregion - - #region overridden methods - - /// - /// Get the automation object for the NestedProjectNode - /// - /// An instance of the Automation.OANestedProjectItem type if succeded - public override object GetAutomationObject() - { - //Validate that we are not disposed or the project is closing - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return null; - } - - return new Automation.OANestedProjectItem(this.ProjectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - /// - /// Gets properties of a given node or of the hierarchy. - /// - /// Identifier of the hierarchy property - /// It return an object which type is dependent on the propid. - public override object GetProperty(int propId) - { - __VSHPROPID vshPropId = (__VSHPROPID)propId; - switch (vshPropId) - { - default: - return base.GetProperty(propId); - - case __VSHPROPID.VSHPROPID_Expandable: - return true; - - case __VSHPROPID.VSHPROPID_BrowseObject: - case __VSHPROPID.VSHPROPID_HandlesOwnReload: - return this.DelegateGetPropertyToNested(propId); - } - } - - - /// - /// Gets properties whose values are GUIDs. - /// - /// Identifier of the hierarchy property - /// Pointer to a GUID property specified in propid - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int GetGuidProperty(int propid, out Guid guid) - { - guid = Guid.Empty; - switch ((__VSHPROPID)propid) - { - case __VSHPROPID.VSHPROPID_ProjectIDGuid: - guid = this.projectInstanceGuid; - break; - - default: - return base.GetGuidProperty(propid, out guid); - } - - CCITracing.TraceCall(String.Format(CultureInfo.CurrentCulture, "Guid for {0} property", propid)); - if (guid.CompareTo(Guid.Empty) == 0) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - - return VSConstants.S_OK; - } - - - /// - /// Determines whether the hierarchy item changed. - /// - /// Item identifier of the hierarchy item contained in VSITEMID - /// Pointer to the IUnknown interface of the hierarchy item. - /// TRUE if the hierarchy item changed. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int IsItemDirty(uint itemId, IntPtr punkDocData, out int pfDirty) - { - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - Debug.Assert(punkDocData != IntPtr.Zero, "docData intptr was zero"); - - // Get an IPersistFileFormat object from docData object - IPersistFileFormat persistFileFormat = Marshal.GetTypedObjectForIUnknown(punkDocData, typeof(IPersistFileFormat)) as IPersistFileFormat; - Debug.Assert(persistFileFormat != null, "The docData object does not implement the IPersistFileFormat interface"); - - // Call IsDirty on the IPersistFileFormat interface - ErrorHandler.ThrowOnFailure(persistFileFormat.IsDirty(out pfDirty)); - - return VSConstants.S_OK; - } - - /// - /// Saves the hierarchy item to disk. - /// - /// Flags whose values are taken from the VSSAVEFLAGS enumeration. - /// File name to be applied when dwSave is set to VSSAVE_SilentSave. - /// Item identifier of the hierarchy item saved from VSITEMID. - /// Pointer to the IUnknown interface of the hierarchy item saved. - /// TRUE if the save action was canceled. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int SaveItem(VSSAVEFLAGS dwSave, string silentSaveAsName, uint itemid, IntPtr punkDocData, out int pfCancelled) - { - // Don't ignore/unignore file changes - // Use Advise/Unadvise to work around rename situations - try - { - this.StopObservingNestedProjectFile(); - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - Debug.Assert(punkDocData != IntPtr.Zero, "docData intptr was zero"); - - // Get an IPersistFileFormat object from docData object (we don't call release on punkDocData since did not increment its ref count) - IPersistFileFormat persistFileFormat = Marshal.GetTypedObjectForIUnknown(punkDocData, typeof(IPersistFileFormat)) as IPersistFileFormat; - Debug.Assert(persistFileFormat != null, "The docData object does not implement the IPersistFileFormat interface"); - - IVsUIShell uiShell = this.GetService(typeof(SVsUIShell)) as IVsUIShell; - string newName; - ErrorHandler.ThrowOnFailure(uiShell.SaveDocDataToFile(dwSave, persistFileFormat, silentSaveAsName, out newName, out pfCancelled)); - - // When supported do a rename of the nested project here - } - finally - { - // Succeeded or not we must hook to the file change events - // Don't ignore/unignore file changes - // Use Advise/Unadvise to work around rename situations - this.ObserveNestedProjectFile(); - } - - return VSConstants.S_OK; - } - - /// - /// Gets the icon handle. It tries first the nested to get the icon handle. If that is not supported it will get it from - /// the image list of the nested if that is supported. If neither of these is supported a default image will be shown. - /// - /// An object representing the icon. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "Microsoft.VisualStudio.Shell.Interop.IVsHierarchy.GetProperty(System.UInt32,System.Int32,System.Object@)")] - public override object GetIconHandle(bool open) - { - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - - object iconHandle = null; - this.nestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_IconHandle, out iconHandle); - if (iconHandle == null) - { - if (null == imageHandler) - { - InitImageHandler(); - } - // Try to get an icon from the nested hierrachy image list. - if (imageHandler.ImageList != null) - { - object imageIndexAsObject = null; - if (this.nestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_IconIndex, out imageIndexAsObject) == VSConstants.S_OK && - imageIndexAsObject != null) - { - int imageIndex = (int)imageIndexAsObject; - if (imageIndex < imageHandler.ImageList.Images.Count) - { - iconHandle = imageHandler.GetIconHandle(imageIndex); - } - } - } - - if (null == iconHandle) - { - iconHandle = this.ProjectMgr.ImageHandler.GetIconHandle((int)ProjectNode.ImageName.Application); - } - } - - return iconHandle; - } - - /// - /// Return S_OK. Implementation of Closing a nested project is done in CloseNestedProject which is called by CloseChildren. - /// - /// S_OK - public override int Close() - { - return VSConstants.S_OK; - } - - - /// - /// Returns the moniker of the nested project. - /// - /// - public override string GetMkDocument() - { - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return String.Empty; - } - - return this.projectPath; - } - - /// - /// Called by the shell when a node has been renamed from the GUI - /// - /// The name of the new label. - /// A success or failure value. - public override int SetEditLabel(string label) - { - int result = this.DelegateSetPropertyToNested((int)__VSHPROPID.VSHPROPID_EditLabel, label); - if (ErrorHandler.Succeeded(result)) - { - this.RenameNestedProjectInParentProject(label); - } - - return result; - } - - /// - /// Called by the shell to get the node caption when the user tries to rename from the GUI - /// - /// the node cation - public override string GetEditLabel() - { - return (string)this.DelegateGetPropertyToNested((int)__VSHPROPID.VSHPROPID_EditLabel); - } - - /// - /// This is temporary until we have support for re-adding a nested item - /// - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - return false; - } - - /// - /// Delegates the call to the inner hierarchy. - /// - /// Reserved parameter defined at the IVsPersistHierarchyItem2::ReloadItem parameter. - protected internal override void ReloadItem(uint reserved) - { - #region precondition - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - throw new InvalidOperationException(); - } - - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - #endregion - - IVsPersistHierarchyItem2 persistHierachyItem = this.nestedHierarchy as IVsPersistHierarchyItem2; - - // We are expecting that if we get called then the nestedhierarchy supports IVsPersistHierarchyItem2, since then hierrachy should support handling its own reload. - // There should be no errormessage to the user since this is an internal error, that it cannot be fixed at user level. - if (persistHierachyItem == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(persistHierachyItem.ReloadItem(VSConstants.VSITEMID_ROOT, reserved)); - } - - /// - /// Flag indicating that changes to a file can be ignored when item is saved or reloaded. - /// - /// Flag indicating whether or not to ignore changes (1 to ignore, 0 to stop ignoring). - protected internal override void IgnoreItemFileChanges(bool ignoreFlag) - { - #region precondition - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - throw new InvalidOperationException(); - } - - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - #endregion - - this.IgnoreNestedProjectFile(ignoreFlag); - - IVsPersistHierarchyItem2 persistHierachyItem = this.nestedHierarchy as IVsPersistHierarchyItem2; - - // If the IVsPersistHierarchyItem2 is not implemented by the nested just return - if (persistHierachyItem == null) - { - return; - } - - ErrorHandler.ThrowOnFailure(persistHierachyItem.IgnoreItemFileChanges(VSConstants.VSITEMID_ROOT, ignoreFlag ? 1 : 0)); - } - - /// - /// Sets the VSADDFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnAddFiles - /// - /// The files to which an array of VSADDFILEFLAGS has to be specified. - /// - protected internal override VSADDFILEFLAGS[] GetAddFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSADDFILEFLAGS[1] { VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags }; - } - - VSADDFILEFLAGS[] addFileFlags = new VSADDFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - addFileFlags[i] = VSADDFILEFLAGS.VSADDFILEFLAGS_IsNestedProjectFile; - } - - return addFileFlags; - } - - /// - /// Sets the VSQUERYADDFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnQueryAddFiles - /// - /// The files to which an array of VSADDFILEFLAGS has to be specified. - /// - protected internal override VSQUERYADDFILEFLAGS[] GetQueryAddFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSQUERYADDFILEFLAGS[1] { VSQUERYADDFILEFLAGS.VSQUERYADDFILEFLAGS_NoFlags }; - } - - VSQUERYADDFILEFLAGS[] queryAddFileFlags = new VSQUERYADDFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - queryAddFileFlags[i] = VSQUERYADDFILEFLAGS.VSQUERYADDFILEFLAGS_IsNestedProjectFile; - } - - return queryAddFileFlags; - } - - /// - /// Sets the VSREMOVEFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnRemoveFiles - /// - /// The files to which an array of VSREMOVEFILEFLAGS has to be specified. - /// - protected internal override VSREMOVEFILEFLAGS[] GetRemoveFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSREMOVEFILEFLAGS[1] { VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_NoFlags }; - } - - VSREMOVEFILEFLAGS[] removeFileFlags = new VSREMOVEFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - removeFileFlags[i] = VSREMOVEFILEFLAGS.VSREMOVEFILEFLAGS_IsNestedProjectFile; - } - - return removeFileFlags; - } - - /// - /// Sets the VSQUERYREMOVEFILEFLAGS that will be used to call the IVsTrackProjectDocumentsEvents2 OnQueryRemoveFiles - /// - /// The files to which an array of VSQUERYREMOVEFILEFLAGS has to be specified. - /// - protected internal override VSQUERYREMOVEFILEFLAGS[] GetQueryRemoveFileFlags(string[] files) - { - if (files == null || files.Length == 0) - { - return new VSQUERYREMOVEFILEFLAGS[1] { VSQUERYREMOVEFILEFLAGS.VSQUERYREMOVEFILEFLAGS_NoFlags }; - } - - VSQUERYREMOVEFILEFLAGS[] queryRemoveFileFlags = new VSQUERYREMOVEFILEFLAGS[files.Length]; - - for (int i = 0; i < files.Length; i++) - { - queryRemoveFileFlags[i] = VSQUERYREMOVEFILEFLAGS.VSQUERYREMOVEFILEFLAGS_IsNestedProjectFile; - } - - return queryRemoveFileFlags; - } - #endregion - - #region virtual methods - /// - /// Initialize the nested hierarhy node. - /// - /// The file name of the nested project. - /// The location of the nested project. - /// The name of the project. - /// The nested project creation flags - /// This methos should be called just after a NestedProjectNode object is created. - public virtual void Init(string fileName, string destination, string projectName, __VSCREATEPROJFLAGS createFlags) - { - if (String.IsNullOrEmpty(fileName)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "fileName"); - } - - if (String.IsNullOrEmpty(destination)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "destination"); - } - - this.projectName = Path.GetFileName(fileName); - this.projectPath = Path.Combine(destination, this.projectName); - - // get the IVsSolution interface from the global service provider - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - Debug.Assert(solution != null, "Could not get the IVsSolution object from the services exposed by this project"); - if (solution == null) - { - throw new InvalidOperationException(); - } - - // Get the project type guid from project element - string typeGuidString = this.ItemNode.GetMetadataAndThrow(ProjectFileConstants.TypeGuid, new InvalidOperationException()); - Guid projectFactoryGuid = Guid.Empty; - if (!String.IsNullOrEmpty(typeGuidString)) - { - projectFactoryGuid = new Guid(typeGuidString); - } - - // Get the project factory. - IVsProjectFactory projectFactory; - ErrorHandler.ThrowOnFailure(solution.GetProjectFactory((uint)0, new Guid[] { projectFactoryGuid }, fileName, out projectFactory)); - - this.CreateProjectDirectory(); - - //Create new project using factory - int cancelled; - Guid refiid = NativeMethods.IID_IUnknown; - IntPtr projectPtr = IntPtr.Zero; - - try - { - ErrorHandler.ThrowOnFailure(projectFactory.CreateProject(fileName, destination, projectName, (uint)createFlags, ref refiid, out projectPtr, out cancelled)); - - if (projectPtr != IntPtr.Zero) - { - this.nestedHierarchy = Marshal.GetTypedObjectForIUnknown(projectPtr, typeof(IVsHierarchy)) as IVsHierarchy; - Debug.Assert(this.nestedHierarchy != null, "Nested hierarchy could not be created"); - Debug.Assert(cancelled == 0); - } - } - finally - { - if (projectPtr != IntPtr.Zero) - { - // We created a new instance of the project, we need to call release to decrement the ref count - // the RCW (this.nestedHierarchy) still has a reference to it which will keep it alive - Marshal.Release(projectPtr); - } - } - - if (cancelled != 0 && this.nestedHierarchy == null) - { - ErrorHandler.ThrowOnFailure(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - // Link into the nested VS hierarchy. - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.SetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ParentHierarchy, this.ProjectMgr)); - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.SetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ParentHierarchyItemid, (object)(int)this.ID)); - - this.LockRDTEntry(); - - this.ConnectPropertyNotifySink(); - } - - /// - /// Links a nested project as a virtual project to the solution. - /// - protected internal virtual void AddVirtualProject() - { - // This is the second step in creating and adding a nested project. The inner hierarchy must have been - // already initialized at this point. - #region precondition - if (this.nestedHierarchy == null) - { - throw new InvalidOperationException(); - } - #endregion - // get the IVsSolution interface from the global service provider - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - Debug.Assert(solution != null, "Could not get the IVsSolution object from the services exposed by this project"); - if (solution == null) - { - throw new InvalidOperationException(); - } - - this.InitializeInstanceGuid(); - - // Add virtual project to solution. - ErrorHandler.ThrowOnFailure(solution.AddVirtualProjectEx(this.nestedHierarchy, this.VirtualProjectFlags, ref this.projectInstanceGuid)); - - // Now set up to listen on file changes on the nested project node. - this.ObserveNestedProjectFile(); - } - - /// - /// The method that does the cleanup. - /// - /// - protected override void Dispose(bool disposing) - { - // Everybody can go here. - if (!this.isDisposed) - { - try - { - // Synchronize calls to the Dispose simulteniously. - lock (Mutex) - { - if (disposing) - { - this.DisconnectPropertyNotifySink(); - this.StopObservingNestedProjectFile(); - - // If a project cannot load it may happen that the imagehandler is not instantiated. - if (this.imageHandler != null) - { - this.imageHandler.Close(); - } - } - } - } - finally - { - base.Dispose(disposing); - this.isDisposed = true; - } - } - } - - /// - /// Creates the project directory if it does not exist. - /// - /// - protected virtual void CreateProjectDirectory() - { - string directoryName = Path.GetDirectoryName(this.projectPath); - - if (!Directory.Exists(directoryName)) - { - Directory.CreateDirectory(directoryName); - } - } - - - /// - /// Lock the RDT Entry for the nested project. - /// By default this document is marked as "Dont Save as". That means the menu File->SaveAs is disabled for the - /// nested project node. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "RDT")] - protected virtual void LockRDTEntry() - { - // Define flags for the nested project document - _VSRDTFLAGS flags = _VSRDTFLAGS.RDT_VirtualDocument | _VSRDTFLAGS.RDT_ProjSlnDocument; ; - - // Request the RDT service - IVsRunningDocumentTable rdt = this.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - Debug.Assert(rdt != null, " Could not get running document table from the services exposed by this project"); - if (rdt == null) - { - throw new InvalidOperationException(); - } - - // First we see if someone else has opened the requested view of the file. - uint itemid; - IntPtr docData = IntPtr.Zero; - IVsHierarchy ivsHierarchy; - uint docCookie; - IntPtr projectPtr = IntPtr.Zero; - - try - { - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)flags, this.projectPath, out ivsHierarchy, out itemid, out docData, out docCookie)); - flags |= _VSRDTFLAGS.RDT_EditLock; - - if (ivsHierarchy != null && docCookie != (uint)ShellConstants.VSDOCCOOKIE_NIL) - { - if (docCookie != this.DocCookie) - { - this.DocCookie = docCookie; - } - } - else - { - - // get inptr for hierarchy - projectPtr = Marshal.GetIUnknownForObject(this.nestedHierarchy); - Debug.Assert(projectPtr != IntPtr.Zero, " Project pointer for the nested hierarchy has not been initialized"); - ErrorHandler.ThrowOnFailure(rdt.RegisterAndLockDocument((uint)flags, this.projectPath, this.ProjectMgr.InteropSafeIVsHierarchy, this.ID, projectPtr, out docCookie)); - - this.DocCookie = docCookie; - Debug.Assert(this.DocCookie != (uint)ShellConstants.VSDOCCOOKIE_NIL, "Invalid cookie when registering document in the running document table."); - - //we must also set the doc cookie on the nested hier - this.SetDocCookieOnNestedHier(this.DocCookie); - } - } - finally - { - // Release all Inptr's that that were given as out pointers - if (docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - if (projectPtr != IntPtr.Zero) - { - Marshal.Release(projectPtr); - } - } - - } - - /// - /// Unlock the RDT entry for the nested project - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "RDT")] - protected virtual void UnlockRDTEntry() - { - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return; - } - // First we see if someone else has opened the requested view of the file. - IVsRunningDocumentTable rdt = this.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - if (rdt != null && this.DocCookie != (int)ShellConstants.VSDOCCOOKIE_NIL) - { - _VSRDTFLAGS flags = _VSRDTFLAGS.RDT_EditLock; - - ErrorHandler.ThrowOnFailure(rdt.UnlockDocument((uint)flags, (uint)this.DocCookie)); - } - - this.DocCookie = (int)ShellConstants.VSDOCCOOKIE_NIL; - } - - /// - /// Renames the project file in the parent project structure. - /// - /// The new label. - protected virtual void RenameNestedProjectInParentProject(string label) - { - string existingLabel = this.Caption; - - if (String.Compare(existingLabel, label, StringComparison.Ordinal) == 0) - { - return; - } - - string oldFileName = this.projectPath; - string oldPath = this.Url; - - try - { - this.StopObservingNestedProjectFile(); - this.ProjectMgr.SuspendMSBuild(); - - // Check out the project file if necessary. - if (!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - - string newFileName = label + Path.GetExtension(oldFileName); - this.SaveNestedProjectItemInProjectFile(newFileName); - - string projectDirectory = Path.GetDirectoryName(oldFileName); - - // update state. - this.projectName = newFileName; - this.projectPath = Path.Combine(projectDirectory, this.projectName); - - // Unload and lock the RDT entries - this.UnlockRDTEntry(); - this.LockRDTEntry(); - - // Since actually this is a rename in our hierarchy notify the tracker that a rename has happened. - this.ProjectMgr.Tracker.OnItemRenamed(oldPath, this.projectPath, VSRENAMEFILEFLAGS.VSRENAMEFILEFLAGS_IsNestedProjectFile); - } - finally - { - this.ObserveNestedProjectFile(); - this.ProjectMgr.ResumeMSBuild(this.ProjectMgr.ReEvaluateProjectFileTargetName); - } - } - /// - /// Saves the nested project information in the project file. - /// - /// - protected virtual void SaveNestedProjectItemInProjectFile(string newFileName) - { - string existingInclude = this.ItemNode.Item.EvaluatedInclude; - string existingRelativePath = Path.GetDirectoryName(existingInclude); - string newRelativePath = Path.Combine(existingRelativePath, newFileName); - this.ItemNode.Rename(newRelativePath); - } - #endregion - - #region helper methods - /// - /// Closes a nested project and releases the nested hierrachy pointer. - /// - internal void CloseNestedProjectNode() - { - if (this.isDisposed || this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return; - } - - uint itemid = VSConstants.VSITEMID_NIL; - try - { - this.DisconnectPropertyNotifySink(); - - IVsUIHierarchy hier; - - IVsWindowFrame windowFrame; - VsShellUtilities.IsDocumentOpen(this.ProjectMgr.Site, this.projectPath, Guid.Empty, out hier, out itemid, out windowFrame); - - - if (itemid == VSConstants.VSITEMID_NIL) - { - this.UnlockRDTEntry(); - } - - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - if (solution == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(solution.RemoveVirtualProject(this.nestedHierarchy, 0)); - - } - finally - { - this.StopObservingNestedProjectFile(); - - // if we haven't already release the RDT cookie, do so now. - if (itemid == VSConstants.VSITEMID_NIL) - { - this.UnlockRDTEntry(); - } - - this.Dispose(true); - } - } - - private void InitializeInstanceGuid() - { - if (this.projectInstanceGuid != Guid.Empty) - { - return; - } - - Guid instanceGuid = Guid.Empty; - - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - - // This method should be called from the open children method, then we can safely use the IsNewProject property - if (this.ProjectMgr.IsNewProject) - { - instanceGuid = Guid.NewGuid(); - this.ItemNode.SetMetadata(ProjectFileConstants.InstanceGuid, instanceGuid.ToString("B")); - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.SetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, ref instanceGuid)); - } - else - { - // Get a guid from the nested hiererachy. - Guid nestedHiererachyInstanceGuid; - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out nestedHiererachyInstanceGuid)); - - // Get instance guid from the project file. If it does not exist then we create one. - string instanceGuidAsString = this.ItemNode.GetMetadata(ProjectFileConstants.InstanceGuid); - - // 1. nestedHiererachyInstanceGuid is empty and instanceGuidAsString is empty then create a new one. - // 2. nestedHiererachyInstanceGuid is empty and instanceGuidAsString not empty use instanceGuidAsString and update the nested project object by calling SetGuidProperty. - // 3. nestedHiererachyInstanceGuid is not empty instanceGuidAsString is empty then use nestedHiererachyInstanceGuid and update the outer project element. - // 4. nestedHiererachyInstanceGuid is not empty instanceGuidAsString is empty then use nestedHiererachyInstanceGuid and update the outer project element. - - if (nestedHiererachyInstanceGuid == Guid.Empty && String.IsNullOrEmpty(instanceGuidAsString)) - { - instanceGuid = Guid.NewGuid(); - } - else if (nestedHiererachyInstanceGuid == Guid.Empty && !String.IsNullOrEmpty(instanceGuidAsString)) - { - instanceGuid = new Guid(instanceGuidAsString); - - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.SetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, ref instanceGuid)); - } - else if (nestedHiererachyInstanceGuid != Guid.Empty) - { - instanceGuid = nestedHiererachyInstanceGuid; - - // If the instanceGuidAsString is empty then creating a guid out of it would throw an exception. - if (String.IsNullOrEmpty(instanceGuidAsString) || nestedHiererachyInstanceGuid != new Guid(instanceGuidAsString)) - { - this.ItemNode.SetMetadata(ProjectFileConstants.InstanceGuid, instanceGuid.ToString("B")); - } - } - } - - this.projectInstanceGuid = instanceGuid; - } - - private void SetDocCookieOnNestedHier(uint itemDocCookie) - { - object docCookie = (int)itemDocCookie; - - try - { - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.SetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ItemDocCookie, docCookie)); - } - catch (NotImplementedException) - { - //we swallow this exception on purpose - } - } - - private void InitImageHandler() - { - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - - if (null == imageHandler) - { - imageHandler = new ImageHandler(); - } - object imageListAsPointer = null; - ErrorHandler.ThrowOnFailure(this.nestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_IconImgList, out imageListAsPointer)); - if (imageListAsPointer != null) - { - this.imageHandler.ImageList = Utilities.GetImageList(imageListAsPointer); - } - } - - /// - /// Delegates Getproperty calls to the inner nested. - /// - /// The property to delegate. - /// The return of the GetProperty from nested. - private object DelegateGetPropertyToNested(int propID) - { - if (!this.ProjectMgr.IsClosed) - { - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - - object returnValue; - - // Do not throw since some project types will return E_FAIL if they do not support a property. - int result = this.nestedHierarchy.GetProperty(VSConstants.VSITEMID_ROOT, propID, out returnValue); - if (ErrorHandler.Succeeded(result)) - { - return returnValue; - } - } - - return null; - } - - /// - /// Delegates Setproperty calls to the inner nested. - /// - /// The property to delegate. - /// The property to set. - /// The return of the SetProperty from nested. - private int DelegateSetPropertyToNested(int propID, object value) - { - if (this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - Debug.Assert(this.nestedHierarchy != null, "The nested hierarchy object must be created before calling this method"); - - // Do not throw since some project types will return E_FAIL if they do not support a property. - return this.nestedHierarchy.SetProperty(VSConstants.VSITEMID_ROOT, propID, value); - } - - /// - /// Starts observing changes on this file. - /// - private void ObserveNestedProjectFile() - { - ProjectContainerNode parent = this.ProjectMgr as ProjectContainerNode; - Debug.Assert(parent != null, "The parent project for nested projects should be subclassed from ProjectContainerNode"); - parent.NestedProjectNodeReloader.ObserveItem(this.GetMkDocument(), this.ID); - } - - /// - /// Stops observing changes on this file. - /// - private void StopObservingNestedProjectFile() - { - ProjectContainerNode parent = this.ProjectMgr as ProjectContainerNode; - Debug.Assert(parent != null, "The parent project for nested projects should be subclassed from ProjectContainerNode"); - parent.NestedProjectNodeReloader.StopObservingItem(this.GetMkDocument()); - } - - /// - /// Ignores observing changes on this file depending on the boolean flag. - /// - /// Flag indicating whether or not to ignore changes (1 to ignore, 0 to stop ignoring). - private void IgnoreNestedProjectFile(bool ignoreFlag) - { - ProjectContainerNode parent = this.ProjectMgr as ProjectContainerNode; - Debug.Assert(parent != null, "The parent project for nested projects should be subclassed from ProjectContainerNode"); - parent.NestedProjectNodeReloader.IgnoreItemChanges(this.GetMkDocument(), ignoreFlag); - } - - /// - /// We need to advise property notify sink on project properties so that - /// we know when the project file is renamed through a property. - /// - private void ConnectPropertyNotifySink() - { - if (this.projectPropertyNotifySinkCookie != (uint)ShellConstants.VSCOOKIE_NIL) - { - return; - } - - IConnectionPoint connectionPoint = this.GetConnectionPointFromPropertySink(); - if (connectionPoint != null) - { - connectionPoint.Advise(this, out this.projectPropertyNotifySinkCookie); - } - } - - /// - /// Disconnects the propertynotify sink - /// - private void DisconnectPropertyNotifySink() - { - if (this.projectPropertyNotifySinkCookie == (uint)ShellConstants.VSCOOKIE_NIL) - { - return; - } - - IConnectionPoint connectionPoint = this.GetConnectionPointFromPropertySink(); - if (connectionPoint != null) - { - connectionPoint.Unadvise(this.projectPropertyNotifySinkCookie); - this.projectPropertyNotifySinkCookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - } - - /// - /// Gets a ConnectionPoint for the IPropertyNotifySink interface. - /// - /// - private IConnectionPoint GetConnectionPointFromPropertySink() - { - IConnectionPoint connectionPoint = null; - object browseObject = this.GetProperty((int)__VSHPROPID.VSHPROPID_BrowseObject); - IConnectionPointContainer connectionPointContainer = browseObject as IConnectionPointContainer; - - if (connectionPointContainer != null) - { - Guid guid = typeof(IPropertyNotifySink).GUID; - connectionPointContainer.FindConnectionPoint(ref guid, out connectionPoint); - } - - return connectionPoint; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/NodeProperties.cs b/source/Archive/MPF/12.0/NodeProperties.cs deleted file mode 100644 index 881906070d..0000000000 --- a/source/Archive/MPF/12.0/NodeProperties.cs +++ /dev/null @@ -1,852 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - - /// - /// All public properties on Nodeproperties or derived classes are assumed to be used by Automation by default. - /// Set this attribute to false on Properties that should not be visible for Automation. - /// - [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] - public sealed class AutomationBrowsableAttribute : System.Attribute - { - public AutomationBrowsableAttribute(bool browsable) - { - this.browsable = browsable; - } - - public bool Browsable - { - get - { - return this.browsable; - } - } - - private bool browsable; - } - - /// - /// To create your own localizable node properties, subclass this and add public properties - /// decorated with your own localized display name, category and description attributes. - /// - - public class NodeProperties : LocalizableProperties, - ISpecifyPropertyPages, - IVsGetCfgProvider, - IVsSpecifyProjectDesignerPages, - EnvDTE80.IInternalExtenderProvider, - IVsBrowseObject - { - #region fields - private HierarchyNode node; - #endregion - - #region properties - [Browsable(false)] - [AutomationBrowsable(false)] - public HierarchyNode Node - { - get { return this.node; } - } - - /// - /// Used by Property Pages Frame to set it's title bar. The Caption of the Hierarchy Node is returned. - /// - [Browsable(false)] - [AutomationBrowsable(false)] - public virtual string Name - { - get { return this.node.Caption; } - } - - #endregion - - #region ctors - public NodeProperties(HierarchyNode node) - { - if(node == null) - { - throw new ArgumentNullException("node"); - } - this.node = node; - } - #endregion - - #region ISpecifyPropertyPages methods - public virtual void GetPages(CAUUID[] pages) - { - this.GetCommonPropertyPages(pages); - } - #endregion - - #region IVsSpecifyProjectDesignerPages - /// - /// Implementation of the IVsSpecifyProjectDesignerPages. It will retun the pages that are configuration independent. - /// - /// The pages to return. - /// - public virtual int GetProjectDesignerPages(CAUUID[] pages) - { - this.GetCommonPropertyPages(pages); - return VSConstants.S_OK; - } - #endregion - - #region IVsGetCfgProvider methods - public virtual int GetCfgProvider(out IVsCfgProvider p) - { - p = null; - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IVsBrowseObject methods - /// - /// Maps back to the hierarchy or project item object corresponding to the browse object. - /// - /// Reference to the hierarchy object. - /// Reference to the project item. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetProjectItem(out IVsHierarchy hier, out uint itemid) - { - if(this.node == null) - { - throw new InvalidOperationException(); - } - hier = this.node.ProjectMgr.InteropSafeIVsHierarchy; - itemid = this.node.ID; - return VSConstants.S_OK; - } - #endregion - - #region overridden methods - /// - /// Get the Caption of the Hierarchy Node instance. If Caption is null or empty we delegate to base - /// - /// Caption of Hierarchy node instance - public override string GetComponentName() - { - string caption = this.Node.Caption; - if(string.IsNullOrEmpty(caption)) - { - return base.GetComponentName(); - } - else - { - return caption; - } - } - #endregion - - #region helper methods - protected string GetProperty(string name, string def) - { - string a = this.Node.ItemNode.GetMetadata(name); - return (a == null) ? def : a; - } - - protected void SetProperty(string name, string value) - { - this.Node.ItemNode.SetMetadata(name, value); - } - - /// - /// Retrieves the common property pages. The NodeProperties is the BrowseObject and that will be called to support - /// configuration independent properties. - /// - /// The pages to return. - private void GetCommonPropertyPages(CAUUID[] pages) - { - // We do not check whether the supportsProjectDesigner is set to false on the ProjectNode. - // We rely that the caller knows what to call on us. - if(pages == null) - { - throw new ArgumentNullException("pages"); - } - - if(pages.Length == 0) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "pages"); - } - - // Only the project should show the property page the rest should show the project properties. - if(this.node != null && (this.node is ProjectNode)) - { - // Retrieve the list of guids from hierarchy properties. - // Because a flavor could modify that list we must make sure we are calling the outer most implementation of IVsHierarchy - string guidsList = String.Empty; - IVsHierarchy hierarchy = this.Node.ProjectMgr.InteropSafeIVsHierarchy; - object variant = null; - ErrorHandler.ThrowOnFailure(hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID2.VSHPROPID_PropertyPagesCLSIDList, out variant)); - guidsList = (string)variant; - - Guid[] guids = Utilities.GuidsArrayFromSemicolonDelimitedStringOfGuids(guidsList); - if(guids == null || guids.Length == 0) - { - pages[0] = new CAUUID(); - pages[0].cElems = 0; - } - else - { - pages[0] = PackageUtilities.CreateCAUUIDFromGuidArray(guids); - } - } - else - { - pages[0] = new CAUUID(); - pages[0].cElems = 0; - } - } - #endregion - - #region IInternalExtenderProvider Members - - bool EnvDTE80.IInternalExtenderProvider.CanExtend(string extenderCATID, string extenderName, object extendeeObject) - { - EnvDTE80.IInternalExtenderProvider outerHierarchy = this.Node.ProjectMgr.InteropSafeIVsHierarchy as EnvDTE80.IInternalExtenderProvider; - - - if(outerHierarchy != null) - { - return outerHierarchy.CanExtend(extenderCATID, extenderName, extendeeObject); - } - return false; - } - - object EnvDTE80.IInternalExtenderProvider.GetExtender(string extenderCATID, string extenderName, object extendeeObject, EnvDTE.IExtenderSite extenderSite, int cookie) - { - EnvDTE80.IInternalExtenderProvider outerHierarchy = this.Node.ProjectMgr.InteropSafeIVsHierarchy as EnvDTE80.IInternalExtenderProvider; - - if(outerHierarchy != null) - { - return outerHierarchy.GetExtender(extenderCATID, extenderName, extendeeObject, extenderSite, cookie); - } - - return null; - } - - object EnvDTE80.IInternalExtenderProvider.GetExtenderNames(string extenderCATID, object extendeeObject) - { - EnvDTE80.IInternalExtenderProvider outerHierarchy = this.Node.ProjectMgr.InteropSafeIVsHierarchy as EnvDTE80.IInternalExtenderProvider; - - if(outerHierarchy != null) - { - return outerHierarchy.GetExtenderNames(extenderCATID, extendeeObject); - } - - return null; - } - - #endregion - - #region ExtenderSupport - [Browsable(false)] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CATID")] - public virtual string ExtenderCATID - { - get - { - Guid catid = this.Node.ProjectMgr.GetCATIDForType(this.GetType()); - if(Guid.Empty.CompareTo(catid) == 0) - { - return null; - } - return catid.ToString("B"); - } - } - - [Browsable(false)] - public object ExtenderNames() - { - EnvDTE.ObjectExtenders extenderService = (EnvDTE.ObjectExtenders)this.Node.GetService(typeof(EnvDTE.ObjectExtenders)); - Debug.Assert(extenderService != null, "Could not get the ObjectExtenders object from the services exposed by this property object"); - if(extenderService == null) - { - throw new InvalidOperationException(); - } - return extenderService.GetExtenderNames(this.ExtenderCATID, this); - } - - public object Extender(string extenderName) - { - EnvDTE.ObjectExtenders extenderService = (EnvDTE.ObjectExtenders)this.Node.GetService(typeof(EnvDTE.ObjectExtenders)); - Debug.Assert(extenderService != null, "Could not get the ObjectExtenders object from the services exposed by this property object"); - if(extenderService == null) - { - throw new InvalidOperationException(); - } - return extenderService.GetExtender(this.ExtenderCATID, extenderName, this); - } - - #endregion - } - - - public class FileNodeProperties : NodeProperties - { - #region properties - [SRCategoryAttribute(SR.Advanced)] - [LocDisplayName(SR.BuildAction)] - [SRDescriptionAttribute(SR.BuildActionDescription)] - public virtual BuildAction BuildAction - { - get - { - string value = this.Node.ItemNode.ItemName; - if(value == null || value.Length == 0) - { - return BuildAction.None; - } - return (BuildAction)Enum.Parse(typeof(BuildAction), value); - } - set - { - this.Node.ItemNode.ItemName = value.ToString(); - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FileName)] - [SRDescriptionAttribute(SR.FileNameDescription)] - public string FileName - { - get - { - return this.Node.Caption; - } - set - { - this.Node.SetEditLabel(value); - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FullPath)] - [SRDescriptionAttribute(SR.FullPathDescription)] - public string FullPath - { - get - { - return this.Node.Url; - } - } - - #region non-browsable properties - used for automation only - [Browsable(false)] - public string Extension - { - get - { - return Path.GetExtension(this.Node.Caption); - } - } - #endregion - - #endregion - - #region ctors - public FileNodeProperties(HierarchyNode node) - : base(node) - { - } - #endregion - - #region overridden methods - public override string GetClassName() - { - return SR.GetString(SR.FileProperties, CultureInfo.CurrentUICulture); - } - #endregion - } - - - public class DependentFileNodeProperties : NodeProperties - { - #region properties - [SRCategoryAttribute(SR.Advanced)] - [LocDisplayName(SR.BuildAction)] - [SRDescriptionAttribute(SR.BuildActionDescription)] - public virtual BuildAction BuildAction - { - get - { - string value = this.Node.ItemNode.ItemName; - if(value == null || value.Length == 0) - { - return BuildAction.None; - } - return (BuildAction)Enum.Parse(typeof(BuildAction), value); - } - set - { - this.Node.ItemNode.ItemName = value.ToString(); - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FileName)] - [SRDescriptionAttribute(SR.FileNameDescription)] - public virtual string FileName - { - get - { - return this.Node.Caption; - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FullPath)] - [SRDescriptionAttribute(SR.FullPathDescription)] - public string FullPath - { - get - { - return this.Node.Url; - } - } - #endregion - - #region ctors - public DependentFileNodeProperties(HierarchyNode node) - : base(node) - { - } - - #endregion - - #region overridden methods - public override string GetClassName() - { - return SR.GetString(SR.FileProperties, CultureInfo.CurrentUICulture); - } - #endregion - } - - - public class SingleFileGeneratorNodeProperties : FileNodeProperties - { - #region fields - private EventHandler onCustomToolChanged; - private EventHandler onCustomToolNameSpaceChanged; - #endregion - - #region custom tool events - internal event EventHandler OnCustomToolChanged - { - add { onCustomToolChanged += value; } - remove { onCustomToolChanged -= value; } - } - - internal event EventHandler OnCustomToolNameSpaceChanged - { - add { onCustomToolNameSpaceChanged += value; } - remove { onCustomToolNameSpaceChanged -= value; } - } - - #endregion - - #region properties - [SRCategoryAttribute(SR.Advanced)] - [LocDisplayName(SR.CustomTool)] - [SRDescriptionAttribute(SR.CustomToolDescription)] - public virtual string CustomTool - { - get - { - return this.Node.ItemNode.GetMetadata(ProjectFileConstants.Generator); - } - set - { - if (CustomTool != value) - { - this.Node.ItemNode.SetMetadata(ProjectFileConstants.Generator, value != string.Empty ? value : null); - HierarchyNodeEventArgs args = new HierarchyNodeEventArgs(this.Node); - if (onCustomToolChanged != null) - { - onCustomToolChanged(this.Node, args); - } - } - } - } - - [SRCategoryAttribute(VisualStudio.Project.SR.Advanced)] - [LocDisplayName(SR.CustomToolNamespace)] - [SRDescriptionAttribute(SR.CustomToolNamespaceDescription)] - public virtual string CustomToolNamespace - { - get - { - return this.Node.ItemNode.GetMetadata(ProjectFileConstants.CustomToolNamespace); - } - set - { - if (CustomToolNamespace != value) - { - this.Node.ItemNode.SetMetadata(ProjectFileConstants.CustomToolNamespace, value != String.Empty ? value : null); - HierarchyNodeEventArgs args = new HierarchyNodeEventArgs(this.Node); - if (onCustomToolNameSpaceChanged != null) - { - onCustomToolNameSpaceChanged(this.Node, args); - } - } - } - } - #endregion - - #region ctors - public SingleFileGeneratorNodeProperties(HierarchyNode node) - : base(node) - { - } - #endregion - } - - - public class ProjectNodeProperties : NodeProperties - { - #region properties - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.ProjectFolder)] - [SRDescriptionAttribute(SR.ProjectFolderDescription)] - [AutomationBrowsable(false)] - public string ProjectFolder - { - get - { - return this.Node.ProjectMgr.ProjectFolder; - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.ProjectFile)] - [SRDescriptionAttribute(SR.ProjectFileDescription)] - [AutomationBrowsable(false)] - public string ProjectFile - { - get - { - return this.Node.ProjectMgr.ProjectFile; - } - set - { - this.Node.ProjectMgr.ProjectFile = value; - } - } - - #region non-browsable properties - used for automation only - [Browsable(false)] - public string FileName - { - get - { - return this.Node.ProjectMgr.ProjectFile; - } - set - { - this.Node.ProjectMgr.ProjectFile = value; - } - } - - - [Browsable(false)] - public string FullPath - { - get - { - string fullPath = this.Node.ProjectMgr.ProjectFolder; - if(!fullPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) - { - return fullPath + Path.DirectorySeparatorChar; - } - else - { - return fullPath; - } - } - } - #endregion - - #endregion - - #region ctors - public ProjectNodeProperties(ProjectNode node) - : base(node) - { - } - #endregion - - #region overridden methods - public override string GetClassName() - { - return SR.GetString(SR.ProjectProperties, CultureInfo.CurrentUICulture); - } - - /// - /// ICustomTypeDescriptor.GetEditor - /// To enable the "Property Pages" button on the properties browser - /// the browse object (project properties) need to be unmanaged - /// or it needs to provide an editor of type ComponentEditor. - /// - /// Type of the editor - /// Editor - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", - Justification="The service provider is used by the PropertiesEditorLauncher")] - public override object GetEditor(Type editorBaseType) - { - // Override the scenario where we are asked for a ComponentEditor - // as this is how the Properties Browser calls us - if(editorBaseType == typeof(ComponentEditor)) - { - IOleServiceProvider sp; - ErrorHandler.ThrowOnFailure(this.Node.GetSite(out sp)); - return new PropertiesEditorLauncher(new ServiceProvider(sp)); - } - - return base.GetEditor(editorBaseType); - } - - public override int GetCfgProvider(out IVsCfgProvider p) - { - if(this.Node != null && this.Node.ProjectMgr != null) - { - return this.Node.ProjectMgr.GetCfgProvider(out p); - } - - return base.GetCfgProvider(out p); - } - #endregion - } - - - public class FolderNodeProperties : NodeProperties - { - #region properties - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FolderName)] - [SRDescriptionAttribute(SR.FolderNameDescription)] - [AutomationBrowsable(false)] - public string FolderName - { - get - { - return this.Node.Caption; - } - set - { - this.Node.SetEditLabel(value); - this.Node.ReDraw(UIHierarchyElement.Caption); - } - } - - #region properties - used for automation only - [Browsable(false)] - [AutomationBrowsable(true)] - public string FileName - { - get - { - return this.Node.Caption; - } - set - { - this.Node.SetEditLabel(value); - } - } - - [Browsable(false)] - [AutomationBrowsable(true)] - public string FullPath - { - get - { - string fullPath = this.Node.GetMkDocument(); - if(!fullPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) - { - return fullPath + Path.DirectorySeparatorChar; - } - else - { - return fullPath; - } - } - } - #endregion - - #endregion - - #region ctors - public FolderNodeProperties(HierarchyNode node) - : base(node) - { - } - #endregion - - #region overridden methods - public override string GetClassName() - { - return SR.GetString(SR.FolderProperties, CultureInfo.CurrentUICulture); - } - #endregion - } - - - public class ReferenceNodeProperties : NodeProperties - { - #region properties - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.RefName)] - [SRDescriptionAttribute(SR.RefNameDescription)] - [Browsable(true)] - [AutomationBrowsable(true)] - public override string Name - { - get - { - return this.Node.Caption; - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.CopyToLocal)] - [SRDescriptionAttribute(SR.CopyToLocalDescription)] - public bool CopyToLocal - { - get - { - string copyLocal = this.GetProperty(ProjectFileConstants.Private, "False"); - if(copyLocal == null || copyLocal.Length == 0) - return true; - return bool.Parse(copyLocal); - } - set - { - this.SetProperty(ProjectFileConstants.Private, value.ToString()); - } - } - - [SRCategoryAttribute(SR.Misc)] - [LocDisplayName(SR.FullPath)] - [SRDescriptionAttribute(SR.FullPathDescription)] - public virtual string FullPath - { - get - { - return this.Node.Url; - } - } - #endregion - - #region ctors - public ReferenceNodeProperties(HierarchyNode node) - : base(node) - { - } - #endregion - - #region overridden methods - public override string GetClassName() - { - return SR.GetString(SR.ReferenceProperties, CultureInfo.CurrentUICulture); - } - #endregion - } - - [ComVisible(true)] - public class ProjectReferencesProperties : ReferenceNodeProperties - { - #region ctors - public ProjectReferencesProperties(ProjectReferenceNode node) - : base(node) - { - } - #endregion - - #region overriden methods - public override string FullPath - { - get - { - return ((ProjectReferenceNode)Node).ReferencedProjectOutputPath; - } - } - #endregion - } - - [ComVisible(true)] - public class ComReferenceProperties : ReferenceNodeProperties - { - public ComReferenceProperties(ComReferenceNode node) - : base(node) - { - } - - [SRCategory(SR.Misc)] - [LocDisplayName(SR.EmbedInteropTypes)] - [SRDescription(SR.EmbedInteropTypesDescription)] - public virtual bool EmbedInteropTypes - { - get { return ((ComReferenceNode)this.Node).EmbedInteropTypes; } - set { ((ComReferenceNode)this.Node).EmbedInteropTypes = value; } - } - } -} diff --git a/source/Archive/MPF/12.0/OleServiceProvider.cs b/source/Archive/MPF/12.0/OleServiceProvider.cs deleted file mode 100644 index dd693dc6d0..0000000000 --- a/source/Archive/MPF/12.0/OleServiceProvider.cs +++ /dev/null @@ -1,297 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - public class OleServiceProvider : IOleServiceProvider, IDisposable - { - #region Public Types - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")] - public delegate object ServiceCreatorCallback(Type serviceType); - #endregion - - #region Private Types - private class ServiceData : IDisposable - { - private Type serviceType; - private object instance; - private ServiceCreatorCallback creator; - private bool shouldDispose; - public ServiceData(Type serviceType, object instance, ServiceCreatorCallback callback, bool shouldDispose) - { - if(null == serviceType) - { - throw new ArgumentNullException("serviceType"); - } - - if((null == instance) && (null == callback)) - { - throw new ArgumentNullException("instance"); - } - - this.serviceType = serviceType; - this.instance = instance; - this.creator = callback; - this.shouldDispose = shouldDispose; - } - - public object ServiceInstance - { - get - { - if(null == instance) - { - instance = creator(serviceType); - } - return instance; - } - } - - public Guid Guid - { - get { return serviceType.GUID; } - } - - public void Dispose() - { - if((shouldDispose) && (null != instance)) - { - IDisposable disp = instance as IDisposable; - if(null != disp) - { - disp.Dispose(); - } - instance = null; - } - creator = null; - GC.SuppressFinalize(this); - } - } - #endregion - - #region fields - - private Dictionary services = new Dictionary(); - private bool isDisposed; - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - #endregion - - #region ctors - public OleServiceProvider() - { - } - #endregion - - #region IOleServiceProvider Members - - public int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject) - { - ppvObject = (IntPtr)0; - int hr = VSConstants.S_OK; - - ServiceData serviceInstance = null; - - if(services != null && services.ContainsKey(guidService)) - { - serviceInstance = services[guidService]; - } - - if(serviceInstance == null) - { - return VSConstants.E_NOINTERFACE; - } - - // Now check to see if the user asked for an IID other than - // IUnknown. If so, we must do another QI. - // - if(riid.Equals(NativeMethods.IID_IUnknown)) - { - ppvObject = Marshal.GetIUnknownForObject(serviceInstance.ServiceInstance); - } - else - { - IntPtr pUnk = IntPtr.Zero; - try - { - pUnk = Marshal.GetIUnknownForObject(serviceInstance.ServiceInstance); - hr = Marshal.QueryInterface(pUnk, ref riid, out ppvObject); - } - finally - { - if(pUnk != IntPtr.Zero) - { - Marshal.Release(pUnk); - } - } - } - - return hr; - } - - #endregion - - #region Dispose - - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - /// - /// Adds the given service to the service container. - /// - /// The type of the service to add. - /// An instance of the service. - /// true if the Dipose of the service provider is allowed to dispose the sevice instance. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", - Justification = "The services created here will be disposed in the Dispose method of this type.")] - public void AddService(Type serviceType, object serviceInstance, bool shouldDisposeServiceInstance) - { - // Create the description of this service. Note that we don't do any validation - // of the parameter here because the constructor of ServiceData will do it for us. - ServiceData service = new ServiceData(serviceType, serviceInstance, null, shouldDisposeServiceInstance); - - // Now add the service desctription to the dictionary. - AddService(service); - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", - Justification="The services created here will be disposed in the Dispose method of this type.")] - public void AddService(Type serviceType, ServiceCreatorCallback callback, bool shouldDisposeServiceInstance) - { - // Create the description of this service. Note that we don't do any validation - // of the parameter here because the constructor of ServiceData will do it for us. - ServiceData service = new ServiceData(serviceType, null, callback, shouldDisposeServiceInstance); - - // Now add the service desctription to the dictionary. - AddService(service); - } - - private void AddService(ServiceData data) - { - // Make sure that the collection of services is created. - if(null == services) - { - services = new Dictionary(); - } - - // Disallow the addition of duplicate services. - if(services.ContainsKey(data.Guid)) - { - throw new InvalidOperationException(); - } - - services.Add(data.Guid, data); - } - - /// - /// Removes the given service type from the service container. - /// - public void RemoveService(Type serviceType) - { - if(serviceType == null) - { - throw new ArgumentNullException("serviceType"); - } - - if(services.ContainsKey(serviceType.GUID)) - { - services.Remove(serviceType.GUID); - } - } - - #region helper methods - /// - /// The method that does the cleanup. - /// - /// - protected virtual void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simulteniously. - lock(Mutex) - { - if(disposing) - { - // Remove all our services - if(services != null) - { - foreach(ServiceData data in services.Values) - { - data.Dispose(); - } - services.Clear(); - services = null; - } - } - - this.isDisposed = true; - } - } - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/Output.cs b/source/Archive/MPF/12.0/Output.cs deleted file mode 100644 index fc865e56a1..0000000000 --- a/source/Archive/MPF/12.0/Output.cs +++ /dev/null @@ -1,177 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Build.Execution; - -namespace Microsoft.VisualStudio.Project -{ - class Output : IVsOutput2 - { - private ProjectNode project; - private ProjectItemInstance output; - - /// - /// Constructor for IVSOutput2 implementation - /// - /// Project that produce this output - /// MSBuild generated item corresponding to the output assembly (by default, these would be of type MainAssembly - public Output(ProjectNode projectManager, ProjectItemInstance outputAssembly) - { - if(projectManager == null) - throw new ArgumentNullException("projectManager"); - if(outputAssembly == null) - throw new ArgumentNullException("outputAssembly"); - - project = projectManager; - output = outputAssembly; - } - - #region IVsOutput2 Members - - public int get_CanonicalName(out string pbstrCanonicalName) - { - // Get the output assembly path (including the name) - pbstrCanonicalName = output.GetMetadataValue(ProjectFileConstants.FinalOutputPath); - Debug.Assert(!String.IsNullOrEmpty(pbstrCanonicalName), "Output Assembly not defined"); - - // Make sure we have a full path - if(!System.IO.Path.IsPathRooted(pbstrCanonicalName)) - { - pbstrCanonicalName = new Url(project.BaseURI, pbstrCanonicalName).AbsoluteUrl; - } - return VSConstants.S_OK; - } - - /// - /// This path must start with file:/// if it wants other project - /// to be able to reference the output on disk. - /// If the output is not on disk, then this requirement does not - /// apply as other projects probably don't know how to access it. - /// - public virtual int get_DeploySourceURL(out string pbstrDeploySourceURL) - { - string path = output.GetMetadataValue(ProjectFileConstants.FinalOutputPath); - if(string.IsNullOrEmpty(path)) - { - throw new InvalidOperationException(); - } - if(path.Length < 9 || String.Compare(path.Substring(0, 8), "file:///", StringComparison.OrdinalIgnoreCase) != 0) - path = "file:///" + path; // TODO: does not work with '#' char, see e.g. bug 641942 - pbstrDeploySourceURL = path; - return VSConstants.S_OK; - } - - public int get_DisplayName(out string pbstrDisplayName) - { - return this.get_CanonicalName(out pbstrDisplayName); - } - - public virtual int get_Property(string szProperty, out object pvar) - { - if (string.IsNullOrEmpty(szProperty)) - { - pvar = null; - return VSConstants.E_INVALIDARG; - } - - if (string.Equals(szProperty, "OUTPUTLOC", StringComparison.OrdinalIgnoreCase)) - { - szProperty = ProjectFileConstants.FinalOutputPath; - } - - string value = output.GetMetadataValue(szProperty); - pvar = value; - - // If we don't have a value, we are expected to return unimplemented - if (string.IsNullOrEmpty(value)) - { - return VSConstants.E_NOTIMPL; - } - - // Special hack for COM2REG property: it's a bool rather than a string, and always true, for some reason. - if (string.Equals(szProperty, "COM2REG", StringComparison.OrdinalIgnoreCase)) - { - pvar = true; - } - - return VSConstants.S_OK; - } - - public int get_RootRelativeURL(out string pbstrRelativePath) - { - pbstrRelativePath = String.Empty; - object variant; - // get the corresponding property - - if(ErrorHandler.Succeeded(this.get_Property("TargetPath", out variant))) - { - string var = variant as String; - - if(var != null) - { - pbstrRelativePath = var; - } - } - - return VSConstants.S_OK; - } - - public virtual int get_Type(out Guid pguidType) - { - pguidType = Guid.Empty; - throw new NotImplementedException(); - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/OutputGroup.cs b/source/Archive/MPF/12.0/OutputGroup.cs deleted file mode 100644 index 44f861988c..0000000000 --- a/source/Archive/MPF/12.0/OutputGroup.cs +++ /dev/null @@ -1,302 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using MSBuildExecution = Microsoft.Build.Execution; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Allows projects to group outputs according to usage. - /// - - public class OutputGroup : IVsOutputGroup2 - { - #region fields - private ProjectConfig projectCfg; - private ProjectNode project; - - private List outputs = new List(); - private Output keyOutput; - private string name; - private string targetName; - #endregion - - #region properties - /// - /// Get the project configuration object associated with this output group - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cfg")] - protected ProjectConfig ProjectCfg - { - get { return projectCfg; } - } - - /// - /// Get the project object that produces this output group. - /// - protected ProjectNode Project - { - get { return project; } - } - - /// - /// Gets the msbuild target name which is assciated to the outputgroup. - /// ProjectNode defines a static collection of output group names and their associated MsBuild target - /// - protected string TargetName - { - get { return targetName; } - } - #endregion - - #region ctors - - /// - /// Constructor for IVSOutputGroup2 implementation - /// - /// Name of the output group. See VS_OUTPUTGROUP_CNAME_Build in vsshell.idl for the list of standard values - /// MSBuild target name - /// Project that produce this output - /// Configuration that produce this output - public OutputGroup(string outputName, string msBuildTargetName, ProjectNode projectManager, ProjectConfig configuration) - { - if(outputName == null) - throw new ArgumentNullException("outputName"); - if(msBuildTargetName == null) - throw new ArgumentNullException("outputName"); - if(projectManager == null) - throw new ArgumentNullException("projectManager"); - if(configuration == null) - throw new ArgumentNullException("configuration"); - - name = outputName; - targetName = msBuildTargetName; - project = projectManager; - projectCfg = configuration; - } - #endregion - - #region virtual methods - protected virtual void Refresh() - { - // Let MSBuild know which configuration we are working with - project.SetConfiguration(projectCfg.ConfigName); - - // Generate dependencies if such a task exist - const string generateDependencyList = "AllProjectOutputGroups"; - if(project.BuildProject.Targets.ContainsKey(generateDependencyList)) - { - bool succeeded = false; - project.BuildTarget(generateDependencyList, out succeeded); - Debug.Assert(succeeded, "Failed to build target: " + generateDependencyList); - } - - // Rebuild the content of our list of output - string outputType = this.targetName + "Output"; - this.outputs.Clear(); - foreach (MSBuildExecution.ProjectItemInstance assembly in project.CurrentConfig.GetItems(outputType)) - { - Output output = new Output(project, assembly); - this.outputs.Add(output); - - // See if it is our key output - if(String.Compare(assembly.GetMetadataValue("IsKeyOutput"), true.ToString(), StringComparison.OrdinalIgnoreCase) == 0) - keyOutput = output; - } - - project.SetCurrentConfiguration(); - - // Now that the group is built we have to check if it is invalidated by a property - // change on the project. - project.OnProjectPropertyChanged += new EventHandler(OnProjectPropertyChanged); - } - - public virtual void InvalidateGroup() - { - // Set keyOutput to null so that a refresh will be performed the next time - // a property getter is called. - if(null != keyOutput) - { - // Once the group is invalidated there is no more reason to listen for events. - project.OnProjectPropertyChanged -= new EventHandler(OnProjectPropertyChanged); - } - keyOutput = null; - } - #endregion - - #region event handlers - private void OnProjectPropertyChanged(object sender, ProjectPropertyChangedArgs args) - { - // In theory here we should decide if we have to invalidate the group according with the kind of property - // that is changed. - InvalidateGroup(); - } - #endregion - - #region IVsOutputGroup2 Members - - public virtual int get_CanonicalName(out string pbstrCanonicalName) - { - pbstrCanonicalName = this.name; - return VSConstants.S_OK; - } - - public virtual int get_DeployDependencies(uint celt, IVsDeployDependency[] rgpdpd, uint[] pcActual) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int get_Description(out string pbstrDescription) - { - pbstrDescription = null; - - string description; - int hr = this.get_CanonicalName(out description); - if(ErrorHandler.Succeeded(hr)) - pbstrDescription = this.Project.GetOutputGroupDescription(description); - return hr; - } - - public virtual int get_DisplayName(out string pbstrDisplayName) - { - pbstrDisplayName = null; - - string displayName; - int hr = this.get_CanonicalName(out displayName); - if(ErrorHandler.Succeeded(hr)) - pbstrDisplayName = this.Project.GetOutputGroupDisplayName(displayName); - return hr; - } - - public virtual int get_KeyOutput(out string pbstrCanonicalName) - { - pbstrCanonicalName = null; - if(keyOutput == null) - Refresh(); - if(keyOutput == null) - { - pbstrCanonicalName = String.Empty; - return VSConstants.S_FALSE; - } - return keyOutput.get_CanonicalName(out pbstrCanonicalName); - } - - public virtual int get_KeyOutputObject(out IVsOutput2 ppKeyOutput) - { - if(keyOutput == null) - Refresh(); - ppKeyOutput = keyOutput; - if(ppKeyOutput == null) - return VSConstants.S_FALSE; - return VSConstants.S_OK; - } - - public virtual int get_Outputs(uint celt, IVsOutput2[] rgpcfg, uint[] pcActual) - { - // Ensure that we are refreshed. This is somewhat of a hack that enables project to - // project reference scenarios to work. Normally, output groups are populated as part - // of build. However, in the project to project reference case, what ends up happening - // is that the referencing projects requests the referenced project's output group - // before a build is done on the referenced project. - // - // Furthermore, the project auto toolbox manager requires output groups to be populated - // on project reopen as well... - // - // In the end, this is probably the right thing to do, though -- as it keeps the output - // groups always up to date. - Refresh(); - - // See if only the caller only wants to know the count - if(celt == 0 || rgpcfg == null) - { - if(pcActual != null && pcActual.Length > 0) - pcActual[0] = (uint)outputs.Count; - return VSConstants.S_OK; - } - - // Fill the array with our outputs - uint count = 0; - foreach(Output output in outputs) - { - if(rgpcfg.Length > count && celt > count && output != null) - { - rgpcfg[count] = output; - ++count; - } - } - - if(pcActual != null && pcActual.Length > 0) - pcActual[0] = count; - - // If the number asked for does not match the number returned, return S_FALSE - return (count == celt) ? VSConstants.S_OK : VSConstants.S_FALSE; - } - - public virtual int get_ProjectCfg(out IVsProjectCfg2 ppIVsProjectCfg2) - { - ppIVsProjectCfg2 = (IVsProjectCfg2)this.projectCfg; - return VSConstants.S_OK; - } - - public virtual int get_Property(string pszProperty, out object pvar) - { - pvar = project.GetProjectProperty(pszProperty); - return VSConstants.S_OK; - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectBase.files b/source/Archive/MPF/12.0/ProjectBase.files deleted file mode 100644 index b3772d8611..0000000000 --- a/source/Archive/MPF/12.0/ProjectBase.files +++ /dev/null @@ -1,443 +0,0 @@ - - - - v4.7.1 - $(AllowedAssemblyPrefix);Microsoft.Internal - - - - $(MSBuildThisFileDirectory) - - - - - ProjectBase\Diagrams\AutomationClasses.cd - true - - - ProjectBase\Diagrams\ConfigurationClasses.cd - true - - - ProjectBase\Diagrams\DocumentManagerClasses.cd - true - - - ProjectBase\Diagrams\HierarchyClasses.cd - true - - - ProjectBase\Diagrams\PropertiesClasses.cd - true - - - ProjectBase\Diagrams\ReferenceClasses.cd - true - - - - - - ProjectBase\misc\ConnectionPointContainer.cs - true - - - ProjectBase\Misc\ExternDll.cs - true - - - ProjectBase\Misc\NativeMethods.cs - true - - - ProjectBase\Misc\UnsafeNativeMethods.cs - true - - - - ProjectBase\DesignTimeAssemblyResolution.cs - true - - - ProjectBase\UIThread.cs - true - - - - ProjectBase\AssemblyReferenceNode.cs - true - - - ProjectBase\Attributes.cs - true - - - - - ProjectBase\AutomationScope.cs - true - - - ProjectBase\OAFileItem.cs - true - - - ProjectBase\OAFolderItem.cs - true - - - ProjectBase\OANestedProjectItem.cs - true - - - ProjectBase\OANullProperty.cs - true - - - ProjectBase\OAProject.cs - true - - - ProjectBase\OAProjectItem.cs - true - - - ProjectBase\OAProjectItems.cs - true - - - ProjectBase\OAProperties.cs - true - - - ProjectBase\OAProperty.cs - true - - - ProjectBase\OANavigableProjectItems.cs - true - - - ProjectBase\OAReferenceFolderItem.cs - true - - - ProjectBase\OARreferenceItem.cs - true - - - ProjectBase\OASolutionFolder.cs - true - - - - - ProjectBase\LangProj\OAAssemblyReference.cs - true - - - ProjectBase\LangProj\OABuildManager.cs - true - - - ProjectBase\LangProj\OAComReference.cs - true - - - ProjectBase\LangProj\OAProjectReference.cs - true - - - ProjectBase\LangProj\OAReferenceBase.cs - true - - - ProjectBase\LangProj\OAReferences.cs - true - - - ProjectBase\LangProj\OAVSProject.cs - true - - - ProjectBase\LangProj\OAVSProjectItem.cs - true - - - - ProjectBase\BuildDependency.cs - true - - - ProjectBase\BuildPropertyPage.cs - true - - - ProjectBase\ComReferenceNode.cs - true - - - ProjectBase\ConfigProvider.cs - true - Code - - - ProjectBase\ConfigurationProperties.cs - true - Code - - - ProjectBase\DataObject.cs - true - Code - - - ProjectBase\DesignPropertyDescriptor.cs - true - - - ProjectBase\DocumentManager.cs - true - - - ProjectBase\EnumDependencies.cs - true - - - ProjectBase\FileChangeManager.cs - true - - - ProjectBase\FileDocumentManager.cs - true - - - ProjectBase\FileNode.cs - true - - - ProjectBase\DependentFileNode.cs - true - - - ProjectBase\FolderNode.cs - true - - - ProjectBase\GlobalSuppressions.cs - true - - - ProjectBase\HierarchyNode.cs - true - - - ProjectBase\ImageHandler.cs - true - - - - ProjectBase\IAggregatedHierarchy.cs - true - - - ProjectBase\IDEBuildLogger.cs - true - - - ProjectBase\LocalizableProperties.cs - true - - - ProjectBase\Project.cs - true - - - ProjectBase\NestedProjectBuildDependency.cs - true - - - ProjectBase\NestedProjectNode.cs - true - - - ProjectBase\NodeProperties.cs - true - - - ProjectBase\OleServiceProvider.cs - true - - - ProjectBase\Output.cs - true - - - ProjectBase\OutputGroup.cs - true - - - ProjectBase\ProjectConfig.cs - true - - - ProjectBase\ProjectContainerNode.cs - true - - - ProjectBase\ProjectDesignerDocumentManager.cs - true - - - ProjectBase\ProjectElement.cs - true - - - ProjectBase\ProjectFactory.cs - true - - - ProjectBase\ProjectFileConstants.cs - true - - - ProjectBase\ProjectNode.cs - true - - - ProjectBase\ProjectNode.CopyPaste.cs - true - - - ProjectBase\ProjectNode.Events.cs - true - - - ProjectBase\ProjectOptions.cs - true - - - ProjectBase\ProjectPackage.cs - true - - - ProjectBase\ProjectReferenceNode.cs - true - - - ProjectBase\PropertiesEditorLauncher.cs - true - - - ProjectBase\ReferenceContainerNode.cs - true - - - ProjectBase\ReferenceNode.cs - true - - - ProjectBase\RegisteredProjectType.cs - true - - - ProjectBase\SettingsPage.cs - true - - - ProjectBase\SingleFileGenerator.cs - true - - - ProjectBase\SingleFileGeneratorFactory.cs - true - - - ProjectBase\SolutionListener.cs - true - - - ProjectBase\SolutionListenerForBuildDependencyUpdate.cs - true - - - ProjectBase\SolutionListenerForProjectEvents.cs - true - - - ProjectBase\SolutionListenerForProjectOpen.cs - true - - - ProjectBase\SolutionListenerForProjectReferenceUpdate.cs - true - - - ProjectBase\StructuresEnums.cs - true - - - ProjectBase\SuspendFileChanges.cs - true - - - ProjectBase\Tracing.cs - true - - - ProjectBase\TokenProcessor.cs - true - - - ProjectBase\TrackDocumentsHelper.cs - true - - - ProjectBase\TypeConverters.cs - true - - - ProjectBase\UpdateSolutionEventsListener.cs - true - - - ProjectBase\Url.cs - true - - - ProjectBase\Utilities.cs - true - - - ProjectBase\VsCommands.cs - true - - - ProjectBase\VSShellUtilities.cs - true - - - ProjectBase\SelectionListener.cs - true - - - ProjectBase\ProjectDocumentsListener.cs - true - - - - - - VisualStudio.Package.Project.resx - true - Microsoft.VisualStudio.Project.resources - - - - - Resources\imagelis.bmp - true - Microsoft.VisualStudio.Project.Resources.imagelis.bmp - - - diff --git a/source/Archive/MPF/12.0/ProjectConfig.cs b/source/Archive/MPF/12.0/ProjectConfig.cs deleted file mode 100644 index 5d6f89b3c8..0000000000 --- a/source/Archive/MPF/12.0/ProjectConfig.cs +++ /dev/null @@ -1,1057 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -//#define ConfigTrace -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using MSBuildExecution = Microsoft.Build.Execution; -using MSBuildConstruction = Microsoft.Build.Construction; - -namespace Microsoft.VisualStudio.Project -{ - - public class ProjectConfig : - IVsCfg, - IVsProjectCfg, - IVsProjectCfg2, - IVsProjectFlavorCfg, - IVsDebuggableProjectCfg, - ISpecifyPropertyPages, - IVsSpecifyProjectDesignerPages, - IVsCfgBrowseObject - { - #region constants - internal const string Debug = "Debug"; - internal const string Release = "Release"; - internal const string AnyCPU = "AnyCPU"; - #endregion - - #region fields - private ProjectNode project; - private string configName; - private MSBuildExecution.ProjectInstance currentConfig; - private List outputGroups; - private IProjectConfigProperties configurationProperties; - private IVsProjectFlavorCfg flavoredCfg; - private BuildableProjectConfig buildableCfg; - #endregion - - #region properties - public ProjectNode ProjectMgr - { - get - { - return this.project; - } - } - - public string ConfigName - { - get - { - return this.configName; - } - set - { - this.configName = value; - } - } - - public virtual object ConfigurationProperties - { - get - { - if(this.configurationProperties == null) - { - this.configurationProperties = new ProjectConfigProperties(this); - } - return this.configurationProperties; - } - } - - protected IList OutputGroups - { - get - { - if(null == this.outputGroups) - { - // Initialize output groups - this.outputGroups = new List(); - - // Get the list of group names from the project. - // The main reason we get it from the project is to make it easier for someone to modify - // it by simply overriding that method and providing the correct MSBuild target(s). - IList> groupNames = project.GetOutputGroupNames(); - - if(groupNames != null) - { - // Populate the output array - foreach(KeyValuePair group in groupNames) - { - OutputGroup outputGroup = CreateOutputGroup(project, group); - this.outputGroups.Add(outputGroup); - } - } - - } - return this.outputGroups; - } - } - #endregion - - #region ctors - public ProjectConfig(ProjectNode project, string configuration) - { - this.project = project; - this.configName = configuration; - - // Because the project can be aggregated by a flavor, we need to make sure - // we get the outer most implementation of that interface (hence: project --> IUnknown --> Interface) - IntPtr projectUnknown = Marshal.GetIUnknownForObject(this.ProjectMgr); - try - { - IVsProjectFlavorCfgProvider flavorCfgProvider = (IVsProjectFlavorCfgProvider)Marshal.GetTypedObjectForIUnknown(projectUnknown, typeof(IVsProjectFlavorCfgProvider)); - ErrorHandler.ThrowOnFailure(flavorCfgProvider.CreateProjectFlavorCfg(this, out flavoredCfg)); - if(flavoredCfg == null) - throw new COMException(); - } - finally - { - if(projectUnknown != IntPtr.Zero) - Marshal.Release(projectUnknown); - } - // if the flavored object support XML fragment, initialize it - IPersistXMLFragment persistXML = flavoredCfg as IPersistXMLFragment; - if(null != persistXML) - { - this.project.LoadXmlFragment(persistXML, this.DisplayName); - } - } - #endregion - - #region methods - protected virtual OutputGroup CreateOutputGroup(ProjectNode project, KeyValuePair group) - { - OutputGroup outputGroup = new OutputGroup(group.Key, group.Value, project, this); - return outputGroup; - } - - public void PrepareBuild(bool clean) - { - project.PrepareBuild(this.configName, clean); - } - - public virtual string GetConfigurationProperty(string propertyName, bool resetCache) - { - MSBuildExecution.ProjectPropertyInstance property = GetMsBuildProperty(propertyName, resetCache); - if (property == null) - return null; - - return property.EvaluatedValue; - } - - public virtual void SetConfigurationProperty(string propertyName, string propertyValue) - { - if(!this.project.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - string condition = String.Format(CultureInfo.InvariantCulture, ConfigProvider.configString, this.ConfigName); - - SetPropertyUnderCondition(propertyName, propertyValue, condition); - - // property cache will need to be updated - this.currentConfig = null; - - // Signal the output groups that something is changed - foreach(OutputGroup group in this.OutputGroups) - { - group.InvalidateGroup(); - } - this.project.SetProjectFileDirty(true); - - return; - } - - /// - /// Emulates the behavior of SetProperty(name, value, condition) on the old MSBuild object model. - /// This finds a property group with the specified condition (or creates one if necessary) then sets the property in there. - /// - private void SetPropertyUnderCondition(string propertyName, string propertyValue, string condition) - { - string conditionTrimmed = (condition == null) ? String.Empty : condition.Trim(); - - if (conditionTrimmed.Length == 0) - { - this.project.BuildProject.SetProperty(propertyName, propertyValue); - return; - } - - // New OM doesn't have a convenient equivalent for setting a property with a particular property group condition. - // So do it ourselves. - MSBuildConstruction.ProjectPropertyGroupElement newGroup = null; - - foreach (MSBuildConstruction.ProjectPropertyGroupElement group in this.project.BuildProject.Xml.PropertyGroups) - { - if (String.Equals(group.Condition.Trim(), conditionTrimmed, StringComparison.OrdinalIgnoreCase)) - { - newGroup = group; - break; - } - } - - if (newGroup == null) - { - newGroup = this.project.BuildProject.Xml.AddPropertyGroup(); // Adds after last existing PG, else at start of project - newGroup.Condition = condition; - } - - foreach (MSBuildConstruction.ProjectPropertyElement property in newGroup.PropertiesReversed) // If there's dupes, pick the last one so we win - { - if (String.Equals(property.Name, propertyName, StringComparison.OrdinalIgnoreCase) && property.Condition.Length == 0) - { - property.Value = propertyValue; - return; - } - } - - newGroup.AddProperty(propertyName, propertyValue); - } - - /// - /// If flavored, and if the flavor config can be dirty, ask it if it is dirty - /// - /// Project file or user file - /// 0 = not dirty - internal int IsFlavorDirty(_PersistStorageType storageType) - { - int isDirty = 0; - if(this.flavoredCfg != null && this.flavoredCfg is IPersistXMLFragment) - { - ErrorHandler.ThrowOnFailure(((IPersistXMLFragment)this.flavoredCfg).IsFragmentDirty((uint)storageType, out isDirty)); - } - return isDirty; - } - - /// - /// If flavored, ask the flavor if it wants to provide an XML fragment - /// - /// Guid of the flavor - /// Project file or user file - /// Fragment that the flavor wants to save - /// HRESULT - internal int GetXmlFragment(Guid flavor, _PersistStorageType storageType, out string fragment) - { - fragment = null; - int hr = VSConstants.S_OK; - if(this.flavoredCfg != null && this.flavoredCfg is IPersistXMLFragment) - { - Guid flavorGuid = flavor; - hr = ((IPersistXMLFragment)this.flavoredCfg).Save(ref flavorGuid, (uint)storageType, out fragment, 1); - } - return hr; - } - #endregion - - #region IVsSpecifyPropertyPages - public void GetPages(CAUUID[] pages) - { - this.GetCfgPropertyPages(pages); - } - #endregion - - #region IVsSpecifyProjectDesignerPages - /// - /// Implementation of the IVsSpecifyProjectDesignerPages. It will retun the pages that are configuration dependent. - /// - /// The pages to return. - /// VSConstants.S_OK - public virtual int GetProjectDesignerPages(CAUUID[] pages) - { - this.GetCfgPropertyPages(pages); - return VSConstants.S_OK; - } - #endregion - - #region IVsCfg methods - /// - /// The display name is a two part item - /// first part is the config name, 2nd part is the platform name - /// - public virtual int get_DisplayName(out string name) - { - name = DisplayName; - return VSConstants.S_OK; - } - - private string DisplayName - { - get - { - string name; - string[] platform = new string[1]; - uint[] actual = new uint[1]; - name = this.configName; - // currently, we only support one platform, so just add it.. - IVsCfgProvider provider; - ErrorHandler.ThrowOnFailure(project.GetCfgProvider(out provider)); - ErrorHandler.ThrowOnFailure(((IVsCfgProvider2)provider).GetPlatformNames(1, platform, actual)); - if(!string.IsNullOrEmpty(platform[0])) - { - name += "|" + platform[0]; - } - return name; - } - } - public virtual int get_IsDebugOnly(out int fDebug) - { - fDebug = 0; - if(this.configName == "Debug") - { - fDebug = 1; - } - return VSConstants.S_OK; - } - public virtual int get_IsReleaseOnly(out int fRelease) - { - CCITracing.TraceCall(); - fRelease = 0; - if(this.configName == "Release") - { - fRelease = 1; - } - return VSConstants.S_OK; - } - #endregion - - #region IVsProjectCfg methods - public virtual int EnumOutputs(out IVsEnumOutputs eo) - { - CCITracing.TraceCall(); - eo = null; - return VSConstants.E_NOTIMPL; - } - - public virtual int get_BuildableProjectCfg(out IVsBuildableProjectCfg pb) - { - CCITracing.TraceCall(); - if(buildableCfg == null) - buildableCfg = new BuildableProjectConfig(this); - pb = buildableCfg; - return VSConstants.S_OK; - } - - public virtual int get_CanonicalName(out string name) - { - return ((IVsCfg)this).get_DisplayName(out name); - } - - public virtual int get_IsPackaged(out int pkgd) - { - CCITracing.TraceCall(); - pkgd = 0; - return VSConstants.S_OK; - } - - public virtual int get_IsSpecifyingOutputSupported(out int f) - { - CCITracing.TraceCall(); - f = 1; - return VSConstants.S_OK; - } - - public virtual int get_Platform(out Guid platform) - { - CCITracing.TraceCall(); - platform = Guid.Empty; - return VSConstants.E_NOTIMPL; - } - - public virtual int get_ProjectCfgProvider(out IVsProjectCfgProvider p) - { - CCITracing.TraceCall(); - p = null; - IVsCfgProvider cfgProvider = null; - this.project.GetCfgProvider(out cfgProvider); - if(cfgProvider != null) - { - p = cfgProvider as IVsProjectCfgProvider; - } - - return (null == p) ? VSConstants.E_NOTIMPL : VSConstants.S_OK; - } - - public virtual int get_RootURL(out string root) - { - CCITracing.TraceCall(); - root = null; - return VSConstants.S_OK; - } - - public virtual int get_TargetCodePage(out uint target) - { - CCITracing.TraceCall(); - target = (uint)System.Text.Encoding.Default.CodePage; - return VSConstants.S_OK; - } - - public virtual int get_UpdateSequenceNumber(ULARGE_INTEGER[] li) - { - if (li == null) - { - throw new ArgumentNullException("li"); - } - - CCITracing.TraceCall(); - li[0] = new ULARGE_INTEGER(); - li[0].QuadPart = 0; - return VSConstants.S_OK; - } - - public virtual int OpenOutput(string name, out IVsOutput output) - { - CCITracing.TraceCall(); - output = null; - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IVsDebuggableProjectCfg methods - /// - /// Called by the vs shell to start debugging (managed or unmanaged). - /// Override this method to support other debug engines. - /// - /// A flag that determines the conditions under which to start the debugger. For valid grfLaunch values, see __VSDBGLAUNCHFLAGS - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code - public virtual int DebugLaunch(uint grfLaunch) - { - CCITracing.TraceCall(); - - try - { - VsDebugTargetInfo info = new VsDebugTargetInfo(); - info.cbSize = (uint)Marshal.SizeOf(info); - info.dlo = Microsoft.VisualStudio.Shell.Interop.DEBUG_LAUNCH_OPERATION.DLO_CreateProcess; - - // On first call, reset the cache, following calls will use the cached values - string property = GetConfigurationProperty("StartProgram", true); - if(string.IsNullOrEmpty(property)) - { - info.bstrExe = this.project.GetOutputAssembly(this.ConfigName); - } - else - { - info.bstrExe = property; - } - - property = GetConfigurationProperty("WorkingDirectory", false); - if(string.IsNullOrEmpty(property)) - { - info.bstrCurDir = Path.GetDirectoryName(info.bstrExe); - } - else - { - info.bstrCurDir = property; - } - - property = GetConfigurationProperty("CmdArgs", false); - if(!string.IsNullOrEmpty(property)) - { - info.bstrArg = property; - } - - property = GetConfigurationProperty("RemoteDebugMachine", false); - if(property != null && property.Length > 0) - { - info.bstrRemoteMachine = property; - } - - info.fSendStdoutToOutputWindow = 0; - - property = GetConfigurationProperty("EnableUnmanagedDebugging", false); - if(property != null && string.Compare(property, "true", StringComparison.OrdinalIgnoreCase) == 0) - { - //Set the unmanged debugger - //TODO change to vsconstant when it is available in VsConstants (guidNativeOnlyEng was the old name, maybe it has got a new name) - info.clsidCustom = new Guid("{3B476D35-A401-11D2-AAD4-00C04F990171}"); - } - else - { - //Set the managed debugger - info.clsidCustom = VSConstants.CLSID_ComPlusOnlyDebugEngine; - } - info.grfLaunch = grfLaunch; - VsShellUtilities.LaunchDebugger(this.project.Site, info); - } - catch(Exception e) - { - Trace.WriteLine("Exception : " + e.Message); - - return Marshal.GetHRForException(e); - } - - return VSConstants.S_OK; - } - - /// - /// Determines whether the debugger can be launched, given the state of the launch flags. - /// - /// Flags that determine the conditions under which to launch the debugger. - /// For valid grfLaunch values, see __VSDBGLAUNCHFLAGS or __VSDBGLAUNCHFLAGS2. - /// true if the debugger can be launched, otherwise false - /// S_OK if the method succeeds, otherwise an error code - public virtual int QueryDebugLaunch(uint flags, out int fCanLaunch) - { - CCITracing.TraceCall(); - string assembly = this.project.GetAssemblyName(this.ConfigName); - fCanLaunch = (assembly != null && assembly.ToUpperInvariant().EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) ? 1 : 0; - if(fCanLaunch == 0) - { - string property = GetConfigurationProperty("StartProgram", true); - fCanLaunch = (property != null && property.Length > 0) ? 1 : 0; - } - return VSConstants.S_OK; - } - #endregion - - #region IVsProjectCfg2 Members - - public virtual int OpenOutputGroup(string szCanonicalName, out IVsOutputGroup ppIVsOutputGroup) - { - ppIVsOutputGroup = null; - // Search through our list of groups to find the one they are looking forgroupName - foreach(OutputGroup group in OutputGroups) - { - string groupName; - group.get_CanonicalName(out groupName); - if(String.Compare(groupName, szCanonicalName, StringComparison.OrdinalIgnoreCase) == 0) - { - ppIVsOutputGroup = group; - break; - } - } - return (ppIVsOutputGroup != null) ? VSConstants.S_OK : VSConstants.E_FAIL; - } - - public virtual int OutputsRequireAppRoot(out int pfRequiresAppRoot) - { - pfRequiresAppRoot = 0; - return VSConstants.E_NOTIMPL; - } - - public virtual int get_CfgType(ref Guid iidCfg, out IntPtr ppCfg) - { - // Delegate to the flavored configuration (to enable a flavor to take control) - // Since we can be asked for Configuration we don't support, avoid throwing and return the HRESULT directly - int hr = flavoredCfg.get_CfgType(ref iidCfg, out ppCfg); - - return hr; - } - - public virtual int get_IsPrivate(out int pfPrivate) - { - pfPrivate = 0; - return VSConstants.S_OK; - } - - public virtual int get_OutputGroups(uint celt, IVsOutputGroup[] rgpcfg, uint[] pcActual) - { - // Are they only asking for the number of groups? - if(celt == 0) - { - if((null == pcActual) || (0 == pcActual.Length)) - { - throw new ArgumentNullException("pcActual"); - } - pcActual[0] = (uint)OutputGroups.Count; - return VSConstants.S_OK; - } - - // Check that the array of output groups is not null - if((null == rgpcfg) || (rgpcfg.Length == 0)) - { - throw new ArgumentNullException("rgpcfg"); - } - - // Fill the array with our output groups - uint count = 0; - foreach(OutputGroup group in OutputGroups) - { - if(rgpcfg.Length > count && celt > count && group != null) - { - rgpcfg[count] = group; - ++count; - } - } - - if(pcActual != null && pcActual.Length > 0) - pcActual[0] = count; - - // If the number asked for does not match the number returned, return S_FALSE - return (count == celt) ? VSConstants.S_OK : VSConstants.S_FALSE; - } - - public virtual int get_VirtualRoot(out string pbstrVRoot) - { - pbstrVRoot = null; - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region IVsCfgBrowseObject - /// - /// Maps back to the configuration corresponding to the browse object. - /// - /// The IVsCfg object represented by the browse object - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetCfg(out IVsCfg cfg) - { - cfg = this; - return VSConstants.S_OK; - } - - /// - /// Maps back to the hierarchy or project item object corresponding to the browse object. - /// - /// Reference to the hierarchy object. - /// Reference to the project item. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetProjectItem(out IVsHierarchy hier, out uint itemid) - { - if(this.project == null || this.project.NodeProperties == null) - { - throw new InvalidOperationException(); - } - return this.project.NodeProperties.GetProjectItem(out hier, out itemid); - } - #endregion - - #region helper methods - /// - /// Splits the canonical configuration name into platform and configuration name. - /// - /// The canonicalName name. - /// The name of the configuration. - /// The name of the platform. - /// true if successfull. - internal static bool TrySplitConfigurationCanonicalName(string canonicalName, out string configName, out string platformName) - { - configName = String.Empty; - platformName = String.Empty; - - if(String.IsNullOrEmpty(canonicalName)) - { - return false; - } - - string[] splittedCanonicalName = canonicalName.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); - - if(splittedCanonicalName == null || (splittedCanonicalName.Length != 1 && splittedCanonicalName.Length != 2)) - { - return false; - } - - configName = splittedCanonicalName[0]; - if(splittedCanonicalName.Length == 2) - { - platformName = splittedCanonicalName[1]; - } - - return true; - } - - private MSBuildExecution.ProjectPropertyInstance GetMsBuildProperty(string propertyName, bool resetCache) - { - if (resetCache || this.currentConfig == null) - { - // Get properties for current configuration from project file and cache it - this.project.SetConfiguration(this.ConfigName); - this.project.BuildProject.ReevaluateIfNecessary(); - // Create a snapshot of the evaluated project in its current state - this.currentConfig = this.project.BuildProject.CreateProjectInstance(); - - // Restore configuration - project.SetCurrentConfiguration(); - } - - if (this.currentConfig == null) - throw new Exception("Failed to retrieve properties"); - - // return property asked for - return this.currentConfig.GetProperty(propertyName); - } - - /// - /// Retrieves the configuration dependent property pages. - /// - /// The pages to return. - private void GetCfgPropertyPages(CAUUID[] pages) - { - // We do not check whether the supportsProjectDesigner is set to true on the ProjectNode. - // We rely that the caller knows what to call on us. - if(pages == null) - { - throw new ArgumentNullException("pages"); - } - - if(pages.Length == 0) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "pages"); - } - - // Retrive the list of guids from hierarchy properties. - // Because a flavor could modify that list we must make sure we are calling the outer most implementation of IVsHierarchy - string guidsList = String.Empty; - IVsHierarchy hierarchy = this.project.InteropSafeIVsHierarchy; - object variant = null; - ErrorHandler.ThrowOnFailure(hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID2.VSHPROPID_CfgPropertyPagesCLSIDList, out variant), new int[] { VSConstants.DISP_E_MEMBERNOTFOUND, VSConstants.E_NOTIMPL }); - guidsList = (string)variant; - - Guid[] guids = Utilities.GuidsArrayFromSemicolonDelimitedStringOfGuids(guidsList); - if(guids == null || guids.Length == 0) - { - pages[0] = new CAUUID(); - pages[0].cElems = 0; - } - else - { - pages[0] = PackageUtilities.CreateCAUUIDFromGuidArray(guids); - } - } - #endregion - - #region IVsProjectFlavorCfg Members - /// - /// This is called to let the flavored config let go - /// of any reference it may still be holding to the base config - /// - /// - int IVsProjectFlavorCfg.Close() - { - // This is used to release the reference the flavored config is holding - // on the base config, but in our scenario these 2 are the same object - // so we have nothing to do here. - return VSConstants.S_OK; - } - - /// - /// Actual implementation of get_CfgType. - /// When not flavored or when the flavor delegate to use - /// we end up creating the requested config if we support it. - /// - /// IID representing the type of config object we should create - /// Config object that the method created - /// HRESULT - int IVsProjectFlavorCfg.get_CfgType(ref Guid iidCfg, out IntPtr ppCfg) - { - ppCfg = IntPtr.Zero; - - // See if this is an interface we support - if(iidCfg == typeof(IVsDebuggableProjectCfg).GUID) - ppCfg = Marshal.GetComInterfaceForObject(this, typeof(IVsDebuggableProjectCfg)); - else if(iidCfg == typeof(IVsBuildableProjectCfg).GUID) - { - IVsBuildableProjectCfg buildableConfig; - this.get_BuildableProjectCfg(out buildableConfig); - ppCfg = Marshal.GetComInterfaceForObject(buildableConfig, typeof(IVsBuildableProjectCfg)); - } - - // If not supported - if(ppCfg == IntPtr.Zero) - return VSConstants.E_NOINTERFACE; - - return VSConstants.S_OK; - } - - #endregion - } - - //============================================================================= - // NOTE: advises on out of proc build execution to maximize - // future cross-platform targeting capabilities of the VS tools. - - - [ComVisible(true)] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Buildable")] - public class BuildableProjectConfig : IVsBuildableProjectCfg - { - #region fields - ProjectConfig config = null; - EventSinkCollection callbacks = new EventSinkCollection(); - #endregion - - #region ctors - public BuildableProjectConfig(ProjectConfig config) - { - this.config = config; - } - #endregion - - #region IVsBuildableProjectCfg methods - - public virtual int AdviseBuildStatusCallback(IVsBuildStatusCallback callback, out uint cookie) - { - CCITracing.TraceCall(); - - cookie = callbacks.Add(callback); - return VSConstants.S_OK; - } - - public virtual int get_ProjectCfg(out IVsProjectCfg p) - { - CCITracing.TraceCall(); - - p = config; - return VSConstants.S_OK; - } - - public virtual int QueryStartBuild(uint options, int[] supported, int[] ready) - { - CCITracing.TraceCall(); - if(supported != null && supported.Length > 0) - supported[0] = 1; - if(ready != null && ready.Length > 0) - ready[0] = (this.config.ProjectMgr.BuildInProgress) ? 0 : 1; - return VSConstants.S_OK; - } - - public virtual int QueryStartClean(uint options, int[] supported, int[] ready) - { - CCITracing.TraceCall(); - config.PrepareBuild(false); - if(supported != null && supported.Length > 0) - supported[0] = 1; - if(ready != null && ready.Length > 0) - ready[0] = (this.config.ProjectMgr.BuildInProgress) ? 0 : 1; - return VSConstants.S_OK; - } - - public virtual int QueryStartUpToDateCheck(uint options, int[] supported, int[] ready) - { - CCITracing.TraceCall(); - config.PrepareBuild(false); - if(supported != null && supported.Length > 0) - supported[0] = 0; // TODO: - if(ready != null && ready.Length > 0) - ready[0] = (this.config.ProjectMgr.BuildInProgress) ? 0 : 1; - return VSConstants.S_OK; - } - - public virtual int QueryStatus(out int done) - { - CCITracing.TraceCall(); - - done = (this.config.ProjectMgr.BuildInProgress) ? 0 : 1; - return VSConstants.S_OK; - } - - public virtual int StartBuild(IVsOutputWindowPane pane, uint options) - { - CCITracing.TraceCall(); - config.PrepareBuild(false); - - // Current version of MSBuild wish to be called in an STA - uint flags = VSConstants.VS_BUILDABLEPROJECTCFGOPTS_REBUILD; - - // If we are not asked for a rebuild, then we build the default target (by passing null) - this.Build(options, pane, ((options & flags) != 0) ? MsBuildTarget.Rebuild : null); - - return VSConstants.S_OK; - } - - public virtual int StartClean(IVsOutputWindowPane pane, uint options) - { - CCITracing.TraceCall(); - config.PrepareBuild(true); - // Current version of MSBuild wish to be called in an STA - this.Build(options, pane, MsBuildTarget.Clean); - return VSConstants.S_OK; - } - - public virtual int StartUpToDateCheck(IVsOutputWindowPane pane, uint options) - { - CCITracing.TraceCall(); - - return VSConstants.E_NOTIMPL; - } - - public virtual int Stop(int fsync) - { - CCITracing.TraceCall(); - - return VSConstants.S_OK; - } - - public virtual int UnadviseBuildStatusCallback(uint cookie) - { - CCITracing.TraceCall(); - - - callbacks.RemoveAt(cookie); - return VSConstants.S_OK; - } - - public virtual int Wait(uint ms, int fTickWhenMessageQNotEmpty) - { - CCITracing.TraceCall(); - - return VSConstants.E_NOTIMPL; - } - #endregion - - #region helpers - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - private bool NotifyBuildBegin() - { - int shouldContinue = 1; - foreach (IVsBuildStatusCallback cb in callbacks) - { - try - { - ErrorHandler.ThrowOnFailure(cb.BuildBegin(ref shouldContinue)); - if (shouldContinue == 0) - { - return false; - } - } - catch (Exception e) - { - // If those who ask for status have bugs in their code it should not prevent the build/notification from happening - Debug.Fail(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.BuildEventError, CultureInfo.CurrentUICulture), e.Message)); - } - } - - return true; - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - private void NotifyBuildEnd(MSBuildResult result, string buildTarget) - { - int success = ((result == MSBuildResult.Successful) ? 1 : 0); - - foreach (IVsBuildStatusCallback cb in callbacks) - { - try - { - ErrorHandler.ThrowOnFailure(cb.BuildEnd(success)); - } - catch (Exception e) - { - // If those who ask for status have bugs in their code it should not prevent the build/notification from happening - Debug.Fail(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.BuildEventError, CultureInfo.CurrentUICulture), e.Message)); - } - finally - { - // We want to refresh the references if we are building with the Build or Rebuild target or if the project was opened for browsing only. - bool shouldRepaintReferences = (buildTarget == null || buildTarget == MsBuildTarget.Build || buildTarget == MsBuildTarget.Rebuild); - - // Now repaint references if that is needed. - // We hardly rely here on the fact the ResolveAssemblyReferences target has been run as part of the build. - // One scenario to think at is when an assembly reference is renamed on disk thus becomming unresolvable, - // but msbuild can actually resolve it. - // Another one if the project was opened only for browsing and now the user chooses to build or rebuild. - if (shouldRepaintReferences && (result == MSBuildResult.Successful)) - { - this.RefreshReferences(); - } - } - } - } - - private void Build(uint options, IVsOutputWindowPane output, string target) - { - if (!this.NotifyBuildBegin()) - { - return; - } - - try - { - config.ProjectMgr.BuildAsync(options, this.config.ConfigName, output, target, (result, buildTarget) => this.NotifyBuildEnd(result, buildTarget)); - } - catch(Exception e) - { - Trace.WriteLine("Exception : " + e.Message); - ErrorHandler.ThrowOnFailure(output.OutputStringThreadSafe("Unhandled Exception:" + e.Message + "\n")); - this.NotifyBuildEnd(MSBuildResult.Failed, target); - throw; - } - finally - { - ErrorHandler.ThrowOnFailure(output.FlushToTaskList()); - } - } - - /// - /// Refreshes references and redraws them correctly. - /// - private void RefreshReferences() - { - // Refresh the reference container node for assemblies that could be resolved. - IReferenceContainer referenceContainer = this.config.ProjectMgr.GetReferenceContainer(); - foreach(ReferenceNode referenceNode in referenceContainer.EnumReferences()) - { - referenceNode.RefreshReference(); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectContainerNode.cs b/source/Archive/MPF/12.0/ProjectContainerNode.cs deleted file mode 100644 index 55943eeb3d..0000000000 --- a/source/Archive/MPF/12.0/ProjectContainerNode.cs +++ /dev/null @@ -1,842 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio.Project.Automation; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; - -namespace Microsoft.VisualStudio.Project -{ - - public abstract class ProjectContainerNode : ProjectNode, - IVsParentProject, - IBuildDependencyOnProjectContainer - { - #region fields - - /// - /// Setting this flag to true will build all nested project when building this project - /// - private bool buildNestedProjectsOnBuild = true; - - private ProjectElement nestedProjectElement; - - /// - /// Defines the listener that would listen on file changes on the nested project node. - /// - /// - ///This might need a refactoring when nested projects can be added and removed by demand. - /// - private FileChangeManager nestedProjectNodeReloader; - #endregion - - #region ctors - protected ProjectContainerNode() - { - } - #endregion - - #region properties - /// - /// Returns teh object that handles listening to file changes on the nested project files. - /// - internal FileChangeManager NestedProjectNodeReloader - { - get - { - if(this.nestedProjectNodeReloader == null) - { - this.nestedProjectNodeReloader = new FileChangeManager(this.Site); - this.nestedProjectNodeReloader.FileChangedOnDisk += this.OnNestedProjectFileChangedOnDisk; - } - - return this.nestedProjectNodeReloader; - } - } - #endregion - - #region overridden properties - /// - /// This is the object that will be returned by EnvDTE.Project.Object for this project - /// - internal override object Object - { - get { return new OASolutionFolder(this); } - } - - #endregion - - #region public overridden methods - /// - /// Gets the nested hierarchy. - /// - /// The item id. - /// Identifier of the interface to be returned in ppHierarchyNested. - /// Pointer to the interface whose identifier was passed in iidHierarchyNested. - /// Pointer to an item identifier of the root node of the nested hierarchy. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. If ITEMID is not a nested hierarchy, this method returns E_FAIL. - - public override int GetNestedHierarchy(UInt32 itemId, ref Guid iidHierarchyNested, out IntPtr ppHierarchyNested, out uint pItemId) - { - pItemId = VSConstants.VSITEMID_ROOT; - ppHierarchyNested = IntPtr.Zero; - if(this.FirstChild != null) - { - for(HierarchyNode n = this.FirstChild; n != null; n = n.NextSibling) - { - NestedProjectNode p = n as NestedProjectNode; - - if(p != null && p.ID == itemId) - { - if(p.NestedHierarchy != null) - { - IntPtr iunknownPtr = IntPtr.Zero; - int returnValue = VSConstants.S_OK; - try - { - iunknownPtr = Marshal.GetIUnknownForObject(p.NestedHierarchy); - Marshal.QueryInterface(iunknownPtr, ref iidHierarchyNested, out ppHierarchyNested); - } - catch(COMException e) - { - returnValue = e.ErrorCode; - } - finally - { - if(iunknownPtr != IntPtr.Zero) - { - Marshal.Release(iunknownPtr); - } - } - - return returnValue; - } - break; - } - } - } - - return VSConstants.E_FAIL; - } - - public override int IsItemDirty(uint itemId, IntPtr punkDocData, out int pfDirty) - { - HierarchyNode hierNode = this.NodeFromItemId(itemId); - Debug.Assert(hierNode != null, "Hierarchy node not found"); - if(hierNode != this) - { - return ErrorHandler.ThrowOnFailure(hierNode.IsItemDirty(itemId, punkDocData, out pfDirty)); - } - else - { - return ErrorHandler.ThrowOnFailure(base.IsItemDirty(itemId, punkDocData, out pfDirty)); - } - } - - public override int SaveItem(VSSAVEFLAGS dwSave, string silentSaveAsName, uint itemid, IntPtr punkDocData, out int pfCancelled) - { - HierarchyNode hierNode = this.NodeFromItemId(itemid); - Debug.Assert(hierNode != null, "Hierarchy node not found"); - if(hierNode != this) - { - return ErrorHandler.ThrowOnFailure(hierNode.SaveItem(dwSave, silentSaveAsName, itemid, punkDocData, out pfCancelled)); - } - else - { - return ErrorHandler.ThrowOnFailure(base.SaveItem(dwSave, silentSaveAsName, itemid, punkDocData, out pfCancelled)); - } - } - - protected override bool FilterItemTypeToBeAddedToHierarchy(string itemType) - { - if(String.Compare(itemType, ProjectFileConstants.SubProject, StringComparison.OrdinalIgnoreCase) == 0) - { - return true; - } - return base.FilterItemTypeToBeAddedToHierarchy(itemType); - } - - /// - /// Called to reload a project item. - /// Reloads a project and its nested project nodes. - /// - /// Specifies itemid from VSITEMID. - /// Reserved. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int ReloadItem(uint itemId, uint reserved) - { - #region precondition - if(this.IsClosed) - { - return VSConstants.E_FAIL; - } - #endregion - - NestedProjectNode node = this.NodeFromItemId(itemId) as NestedProjectNode; - - if(node != null) - { - object propertyAsObject = node.GetProperty((int)__VSHPROPID.VSHPROPID_HandlesOwnReload); - - if(propertyAsObject != null && (bool)propertyAsObject) - { - node.ReloadItem(reserved); - } - else - { - this.ReloadNestedProjectNode(node); - } - - return VSConstants.S_OK; - } - - return base.ReloadItem(itemId, reserved); - } - - /// - /// Reloads a project and its nested project nodes. - /// - protected override void Reload() - { - base.Reload(); - this.CreateNestedProjectNodes(); - } - #endregion - - #region IVsParentProject - public virtual int OpenChildren() - { - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - - Debug.Assert(solution != null, "Could not retrieve the solution from the services provided by this project"); - if(solution == null) - { - return VSConstants.E_FAIL; - } - - IntPtr iUnKnownForSolution = IntPtr.Zero; - int returnValue = VSConstants.S_OK; // be optimistic. - - try - { - this.DisableQueryEdit = true; - this.EventTriggeringFlag = ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents | ProjectNode.EventTriggering.DoNotTriggerTrackerEvents; - iUnKnownForSolution = Marshal.GetIUnknownForObject(solution); - - // notify SolutionEvents listeners that we are about to add children - IVsFireSolutionEvents fireSolutionEvents = Marshal.GetTypedObjectForIUnknown(iUnKnownForSolution, typeof(IVsFireSolutionEvents)) as IVsFireSolutionEvents; - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnBeforeOpeningChildren(this)); - - this.AddVirtualProjects(); - - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnAfterOpeningChildren(this)); - } - catch(Exception e) - { - // Exceptions are digested by the caller but we want then to be shown if not a ComException and if not in automation. - if(!(e is COMException) && !Utilities.IsInAutomationFunction(this.Site)) - { - string title = null; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, e.Message, icon, buttons, defaultButton); - } - - Trace.WriteLine("Exception : " + e.Message); - throw; - } - finally - { - this.DisableQueryEdit = false; - - if(iUnKnownForSolution != IntPtr.Zero) - { - Marshal.Release(iUnKnownForSolution); - } - - this.EventTriggeringFlag = ProjectNode.EventTriggering.TriggerAll; - } - - return returnValue; - } - - public virtual int CloseChildren() - { - int returnValue = VSConstants.S_OK; // be optimistic. - - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - Debug.Assert(solution != null, "Could not retrieve the solution from the services provided by this project"); - - if(solution == null) - { - return VSConstants.E_FAIL; - } - - IntPtr iUnKnownForSolution = IntPtr.Zero; - - try - { - iUnKnownForSolution = Marshal.GetIUnknownForObject(solution); - - // notify SolutionEvents listeners that we are about to close children - IVsFireSolutionEvents fireSolutionEvents = Marshal.GetTypedObjectForIUnknown(iUnKnownForSolution, typeof(IVsFireSolutionEvents)) as IVsFireSolutionEvents; - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnBeforeClosingChildren(this)); - - // If the removal crashes we never fire the close children event. IS that a problem? - this.RemoveNestedProjectNodes(); - - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnAfterClosingChildren(this)); - } - finally - { - if(iUnKnownForSolution != IntPtr.Zero) - { - Marshal.Release(iUnKnownForSolution); - } - } - - return returnValue; - } - #endregion - - #region IBuildDependencyOnProjectContainerNode - /// - /// Defines whether nested projects should be build with the parent project - /// - public virtual bool BuildNestedProjectsOnBuild - { - get { return this.buildNestedProjectsOnBuild; } - set { this.buildNestedProjectsOnBuild = value; } - } - - /// - /// Enumerates the nested hierachies that should be added to the build dependency list. - /// - /// - public virtual IVsHierarchy[] EnumNestedHierachiesForBuildDependency() - { - List nestedProjectList = new List(); - // Add all nested project among projectContainer child nodes - for(HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - NestedProjectNode nestedProjectNode = child as NestedProjectNode; - if(nestedProjectNode != null) - { - nestedProjectList.Add(nestedProjectNode.NestedHierarchy); - } - } - - return nestedProjectList.ToArray(); - } - #endregion - - #region helper methods - - internal protected void RemoveNestedProjectNodes() - { - for(HierarchyNode n = this.FirstChild; n != null; n = n.NextSibling) - { - NestedProjectNode p = n as NestedProjectNode; - if(p != null) - { - p.CloseNestedProjectNode(); - } - } - - // We do not care of file changes after this. - this.NestedProjectNodeReloader.FileChangedOnDisk -= this.OnNestedProjectFileChangedOnDisk; - this.NestedProjectNodeReloader.Dispose(); - } - - /// - /// This is used when loading the project to loop through all the items - /// and for each SubProject it finds, it create the project and a node - /// in our Hierarchy to hold the project. - /// - internal protected void CreateNestedProjectNodes() - { - // 1. Create a ProjectElement with the found item and then Instantiate a new Nested project with this ProjectElement. - // 2. Link into the hierarchy. - // Read subprojects from from msbuildmodel - __VSCREATEPROJFLAGS creationFlags = __VSCREATEPROJFLAGS.CPF_NOTINSLNEXPLR | __VSCREATEPROJFLAGS.CPF_SILENT; - - if(this.IsNewProject) - { - creationFlags |= __VSCREATEPROJFLAGS.CPF_CLONEFILE; - } - else - { - creationFlags |= __VSCREATEPROJFLAGS.CPF_OPENFILE; - } - - foreach (MSBuild.ProjectItem item in this.BuildProject.Items) - { - if(String.Compare(item.ItemType, ProjectFileConstants.SubProject, StringComparison.OrdinalIgnoreCase) == 0) - { - this.nestedProjectElement = new ProjectElement(this, item, false); - - if(!this.IsNewProject) - { - AddExistingNestedProject(null, creationFlags); - } - else - { - // If we are creating the subproject from a vstemplate/vsz file - bool isVsTemplate = Utilities.IsTemplateFile(GetProjectTemplatePath(null)); - if(isVsTemplate) - { - RunVsTemplateWizard(null, true); - } - else - { - // We are cloning the specified project file - AddNestedProjectFromTemplate(null, creationFlags); - } - } - } - } - - this.nestedProjectElement = null; - } - /// - /// Add an existing project as a nested node of our hierarchy. - /// This is used while loading the project and can also be used - /// to add an existing project to our hierarchy. - /// - protected internal virtual NestedProjectNode AddExistingNestedProject(ProjectElement element, __VSCREATEPROJFLAGS creationFlags) - { - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - throw new ArgumentNullException("element"); - } - - string filename = elementToUse.GetFullPathForElement(); - // Delegate to AddNestedProjectFromTemplate. Because we pass flags that specify open project rather then clone, this will works. - Debug.Assert((creationFlags & __VSCREATEPROJFLAGS.CPF_OPENFILE) == __VSCREATEPROJFLAGS.CPF_OPENFILE, "__VSCREATEPROJFLAGS.CPF_OPENFILE should have been specified, did you mean to call AddNestedProjectFromTemplate?"); - return AddNestedProjectFromTemplate(filename, Path.GetDirectoryName(filename), Path.GetFileName(filename), elementToUse, creationFlags); - } - - /// - /// Let the wizard code execute and provide us the information we need. - /// Our SolutionFolder automation object should be called back with the - /// details at which point it will call back one of our method to add - /// a nested project. - /// If you are trying to add a new subproject this is probably the - /// method you want to call. If you are just trying to clone a template - /// project file, then AddNestedProjectFromTemplate is what you want. - /// - /// The project item to use as the base of the nested project. - /// true if the wizard should run silently, otherwise false. - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Vs")] - protected internal void RunVsTemplateWizard(ProjectElement element, bool silent) - { - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - throw new ArgumentNullException("element"); - } - this.nestedProjectElement = elementToUse; - - Automation.OAProject oaProject = GetAutomationObject() as Automation.OAProject; - if(oaProject == null || oaProject.ProjectItems == null) - throw new System.InvalidOperationException(SR.GetString(SR.InvalidAutomationObject, CultureInfo.CurrentUICulture)); - Debug.Assert(oaProject.Object != null, "The project automation object should have set the Object to the SolutionFolder"); - Automation.OASolutionFolder folder = oaProject.Object as Automation.OASolutionFolder; - - // Prepare the parameters to pass to RunWizardFile - string destination = elementToUse.GetFullPathForElement(); - string template = this.GetProjectTemplatePath(elementToUse); - - object[] wizParams = new object[7]; - wizParams[0] = EnvDTE.Constants.vsWizardAddSubProject; - wizParams[1] = Path.GetFileNameWithoutExtension(destination); - wizParams[2] = oaProject.ProjectItems; - wizParams[3] = Path.GetDirectoryName(destination); - wizParams[4] = Path.GetFileNameWithoutExtension(destination); - wizParams[5] = Path.GetDirectoryName(folder.DTE.FullName); //VS install dir - wizParams[6] = silent; - - IVsDetermineWizardTrust wizardTrust = this.GetService(typeof(SVsDetermineWizardTrust)) as IVsDetermineWizardTrust; - if(wizardTrust != null) - { - Guid guidProjectAdding = Guid.Empty; - - // In case of a project template an empty guid should be added as the guid parameter. See env\msenv\core\newtree.h IsTrustedTemplate method definition. - ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardInitiated(template, ref guidProjectAdding)); - } - - try - { - // Make the call to execute the wizard. This should cause AddNestedProjectFromTemplate to be - // called back with the correct set of parameters. - EnvDTE.IVsExtensibility extensibilityService = (EnvDTE.IVsExtensibility)GetService(typeof(EnvDTE.IVsExtensibility)); - EnvDTE.wizardResult result = extensibilityService.RunWizardFile(template, 0, ref wizParams); - if(result == EnvDTE.wizardResult.wizardResultFailure) - throw new COMException(); - } - finally - { - if(wizardTrust != null) - { - ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardCompleted()); - } - } - } - - /// - /// This will clone a template project file and add it as a - /// subproject to our hierarchy. - /// If you want to create a project for which there exist a - /// vstemplate, consider using RunVsTemplateWizard instead. - /// - protected internal virtual NestedProjectNode AddNestedProjectFromTemplate(ProjectElement element, __VSCREATEPROJFLAGS creationFlags) - { - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - throw new ArgumentNullException("element"); - } - string destination = elementToUse.GetFullPathForElement(); - string template = this.GetProjectTemplatePath(elementToUse); - - return this.AddNestedProjectFromTemplate(template, Path.GetDirectoryName(destination), Path.GetFileName(destination), elementToUse, creationFlags); - } - - /// - /// This can be called directly or through RunVsTemplateWizard. - /// This will clone a template project file and add it as a - /// subproject to our hierarchy. - /// If you want to create a project for which there exist a - /// vstemplate, consider using RunVsTemplateWizard instead. - /// - protected internal virtual NestedProjectNode AddNestedProjectFromTemplate(string fileName, string destination, string projectName, ProjectElement element, __VSCREATEPROJFLAGS creationFlags) - { - // If this is project creation and the template specified a subproject in its project file, this.nestedProjectElement will be used - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - // If this is null, this means MSBuild does not know anything about our subproject so add an MSBuild item for it - elementToUse = new ProjectElement(this, fileName, ProjectFileConstants.SubProject); - } - - NestedProjectNode node = CreateNestedProjectNode(elementToUse); - node.Init(fileName, destination, projectName, creationFlags); - - // In case that with did not have an existing element, or the nestedProjectelement was null - // and since Init computes the final path, set the MSBuild item to that path - if(this.nestedProjectElement == null) - { - string relativePath = node.Url; - if(Path.IsPathRooted(relativePath)) - { - relativePath = this.ProjectFolder; - if(!relativePath.EndsWith("/\\", StringComparison.Ordinal)) - { - relativePath += Path.DirectorySeparatorChar; - } - - relativePath = new Url(relativePath).MakeRelative(new Url(node.Url)); - } - - elementToUse.Rename(relativePath); - } - - this.AddChild(node); - return node; - } - - /// - /// Override this method if you want to provide your own type of nodes. - /// This would be the case if you derive a class from NestedProjectNode - /// - protected virtual NestedProjectNode CreateNestedProjectNode(ProjectElement element) - { - return new NestedProjectNode(this, element); - } - - /// - /// Links the nested project nodes to the solution. The default implementation parses all nested project nodes and calles AddVirtualProjectEx on them. - /// - protected virtual void AddVirtualProjects() - { - for(HierarchyNode child = this.FirstChild; child != null; child = child.NextSibling) - { - NestedProjectNode nestedProjectNode = child as NestedProjectNode; - if(nestedProjectNode != null) - { - nestedProjectNode.AddVirtualProject(); - } - } - } - - /// - /// Based on the Template and TypeGuid properties of the - /// element, generate the full template path. - /// - /// TypeGuid should be the Guid of a registered project factory. - /// Template can be a full path, a project template (for projects - /// that support VsTemplates) or a relative path (for other projects). - /// - protected virtual string GetProjectTemplatePath(ProjectElement element) - { - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - throw new ArgumentNullException("element"); - } - - string templateFile = elementToUse.GetMetadata(ProjectFileConstants.Template); - Debug.Assert(!String.IsNullOrEmpty(templateFile), "No template file has been specified in the template attribute in the project file"); - - string fullPath = templateFile; - if(!Path.IsPathRooted(templateFile)) - { - RegisteredProjectType registeredProjectType = this.GetRegisteredProject(elementToUse); - - // This is not a full path - Debug.Assert(registeredProjectType != null && (!String.IsNullOrEmpty(registeredProjectType.DefaultProjectExtensionValue) || !String.IsNullOrEmpty(registeredProjectType.WizardTemplatesDirValue)), " Registered wizard directory value not set in the registry."); - - // See if this specify a VsTemplate file - fullPath = registeredProjectType.GetVsTemplateFile(templateFile); - if(String.IsNullOrEmpty(fullPath)) - { - // Default to using the WizardTemplateDir to calculate the absolute path - fullPath = Path.Combine(registeredProjectType.WizardTemplatesDirValue, templateFile); - } - } - - return fullPath; - } - - /// - /// Get information from the registry based for the project - /// factory corresponding to the TypeGuid of the element - /// - private RegisteredProjectType GetRegisteredProject(ProjectElement element) - { - ProjectElement elementToUse = (element == null) ? this.nestedProjectElement : element; - - if(elementToUse == null) - { - throw new ArgumentNullException("element"); - } - - // Get the project type guid from project elementToUse - string typeGuidString = elementToUse.GetMetadataAndThrow(ProjectFileConstants.TypeGuid, new Exception()); - Guid projectFactoryGuid = new Guid(typeGuidString); - - EnvDTE.DTE dte = this.ProjectMgr.Site.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; - Debug.Assert(dte != null, "Could not get the automation object from the services exposed by this project"); - - if(dte == null) - throw new InvalidOperationException(); - - RegisteredProjectType registeredProjectType = RegisteredProjectType.CreateRegisteredProjectType(projectFactoryGuid); - Debug.Assert(registeredProjectType != null, "Could not read the registry setting associated to this project."); - if(registeredProjectType == null) - { - throw new InvalidOperationException(); - } - return registeredProjectType; - } - - /// - /// Reloads a nested project node by deleting it and readding it. - /// - /// The node to reload. - protected virtual void ReloadNestedProjectNode(NestedProjectNode node) - { - if(node == null) - { - throw new ArgumentNullException("node"); - } - - IVsSolution solution = this.GetService(typeof(IVsSolution)) as IVsSolution; - - if(solution == null) - { - throw new InvalidOperationException(); - } - - NestedProjectNode newNode = null; - try - { - // (VS 2005 UPDATE) When deleting and re-adding the nested project, - // we do not want SCC to see this as a delete and add operation. - this.EventTriggeringFlag = ProjectNode.EventTriggering.DoNotTriggerTrackerEvents; - - // notify SolutionEvents listeners that we are about to add children - IVsFireSolutionEvents fireSolutionEvents = solution as IVsFireSolutionEvents; - - if(fireSolutionEvents == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnBeforeUnloadProject(node.NestedHierarchy)); - - int isDirtyAsInt = 0; - this.IsDirty(out isDirtyAsInt); - - bool isDirty = (isDirtyAsInt == 0) ? false : true; - - ProjectElement element = node.ItemNode; - node.CloseNestedProjectNode(); - - // Remove from the solution - this.RemoveChild(node); - - // Now readd it - try - { - __VSCREATEPROJFLAGS flags = __VSCREATEPROJFLAGS.CPF_NOTINSLNEXPLR | __VSCREATEPROJFLAGS.CPF_SILENT | __VSCREATEPROJFLAGS.CPF_OPENFILE; - newNode = this.AddExistingNestedProject(element, flags); - newNode.AddVirtualProject(); - } - catch(Exception e) - { - // We get a System.Exception if anything failed, thus we have no choice but catch it. - // Exceptions are digested by VS. Show the error if not in automation. - if(!Utilities.IsInAutomationFunction(this.Site)) - { - string message = (String.IsNullOrEmpty(e.Message)) ? SR.GetString(SR.NestedProjectFailedToReload, CultureInfo.CurrentUICulture) : e.Message; - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - } - - // Do not digest exception. let the caller handle it. If in a later stage this exception is not digested then the above messagebox is not needed. - throw; - } - -#if DEBUG - IVsHierarchy nestedHierarchy; - ErrorHandler.ThrowOnFailure(solution.GetProjectOfUniqueName(newNode.GetMkDocument(), out nestedHierarchy)); - Debug.Assert(nestedHierarchy != null && Utilities.IsSameComObject(nestedHierarchy, newNode.NestedHierarchy), "The nested hierrachy was not reloaded correctly."); -#endif - this.SetProjectFileDirty(isDirty); - - ErrorHandler.ThrowOnFailure(fireSolutionEvents.FireOnAfterLoadProject(newNode.NestedHierarchy)); - } - finally - { - // In this scenario the nested project failed to unload or reload the nested project. We will unload the whole project, otherwise the nested project is lost. - // This is similar to the scenario when one wants to open a project and the nested project cannot be loaded because for example the project file has xml errors. - // We should note that we rely here that if the unload fails then exceptions are not digested and are shown to the user. - if(newNode == null || newNode.NestedHierarchy == null) - { - ErrorHandler.ThrowOnFailure(solution.CloseSolutionElement((uint)__VSSLNCLOSEOPTIONS.SLNCLOSEOPT_UnloadProject | (uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_ForceSave, this.InteropSafeIVsHierarchy, 0)); - } - else - { - this.EventTriggeringFlag = ProjectNode.EventTriggering.TriggerAll; - } - } - } - - /// - /// Event callback. Called when one of the nested project files is changed. - /// - /// The FileChangeManager object. - /// Event args containing the file name that was updated. - private void OnNestedProjectFileChangedOnDisk(object sender, FileChangedOnDiskEventArgs e) - { - #region Pre-condition validation - Debug.Assert(e != null, "No event args specified for the FileChangedOnDisk event"); - - // We care only about time change for reload. - if((e.FileChangeFlag & _VSFILECHANGEFLAGS.VSFILECHG_Time) == 0) - { - return; - } - - // test if we actually have a document for this id. - string moniker; - this.GetMkDocument(e.ItemID, out moniker); - Debug.Assert(NativeMethods.IsSamePath(moniker, e.FileName), " The file + " + e.FileName + " has changed but we could not retrieve the path for the item id associated to the path."); - #endregion - - bool reload = true; - if(!Utilities.IsInAutomationFunction(this.Site)) - { - // Prompt to reload the nested project file. We use the moniker here since the filename from the event arg is canonicalized. - string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.QueryReloadNestedProject, CultureInfo.CurrentUICulture), moniker); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_INFO; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_YESNO; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - reload = (VsShellUtilities.ShowMessageBox(this.Site, message, title, icon, buttons, defaultButton) == NativeMethods.IDYES); - } - - if(reload) - { - // We have to use here the interface method call, since it might be that specialized project nodes like the project container item - // is owerwriting the default functionality. - this.ReloadItem(e.ItemID, 0); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectDesignerDocumentManager.cs b/source/Archive/MPF/12.0/ProjectDesignerDocumentManager.cs deleted file mode 100644 index 2ca6939c38..0000000000 --- a/source/Archive/MPF/12.0/ProjectDesignerDocumentManager.cs +++ /dev/null @@ -1,113 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - class ProjectDesignerDocumentManager : DocumentManager - { - #region ctors - public ProjectDesignerDocumentManager(ProjectNode node) - : base(node) - { - } - #endregion - - #region overriden methods - - public override int Open(ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame windowFrame, WindowFrameShowAction windowFrameAction) - { - Guid editorGuid = VSConstants.GUID_ProjectDesignerEditor; - return this.OpenWithSpecific(0, ref editorGuid, String.Empty, ref logicalView, docDataExisting, out windowFrame, windowFrameAction); - } - - public override int OpenWithSpecific(uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame frame, WindowFrameShowAction windowFrameAction) - { - frame = null; - Debug.Assert(editorType == VSConstants.GUID_ProjectDesignerEditor, "Cannot open project designer with guid " + editorType.ToString()); - - - if(this.Node == null || this.Node.ProjectMgr == null || this.Node.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - - IVsUIShellOpenDocument uiShellOpenDocument = this.Node.ProjectMgr.Site.GetService(typeof(SVsUIShellOpenDocument)) as IVsUIShellOpenDocument; - IOleServiceProvider serviceProvider = this.Node.ProjectMgr.Site.GetService(typeof(IOleServiceProvider)) as IOleServiceProvider; - - if(serviceProvider != null && uiShellOpenDocument != null) - { - string fullPath = this.GetFullPathForDocument(); - string caption = this.GetOwnerCaption(); - - IVsUIHierarchy parentHierarchy = this.Node.ProjectMgr.GetProperty((int)__VSHPROPID.VSHPROPID_ParentHierarchy) as IVsUIHierarchy; - int parentHierarchyItemId = (int)this.Node.ProjectMgr.GetProperty((int)__VSHPROPID.VSHPROPID_ParentHierarchyItemid); - - - ErrorHandler.ThrowOnFailure(uiShellOpenDocument.OpenSpecificEditor(editorFlags, fullPath, ref editorType, physicalView, ref logicalView, caption, parentHierarchy, (uint)parentHierarchyItemId, docDataExisting, serviceProvider, out frame)); - - if(frame != null) - { - if(windowFrameAction == WindowFrameShowAction.Show) - { - ErrorHandler.ThrowOnFailure(frame.Show()); - } - } - } - - return VSConstants.S_OK; - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/ProjectDocumentsListener.cs b/source/Archive/MPF/12.0/ProjectDocumentsListener.cs deleted file mode 100644 index c6b828ed70..0000000000 --- a/source/Archive/MPF/12.0/ProjectDocumentsListener.cs +++ /dev/null @@ -1,234 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; -using System.Diagnostics.CodeAnalysis; - -namespace Microsoft.VisualStudio.Project -{ - - - public abstract class ProjectDocumentsListener : IVsTrackProjectDocumentsEvents2, IDisposable - { - #region fields - private uint eventsCookie; - private IVsTrackProjectDocuments2 projectDocTracker; - private ServiceProvider serviceProvider; - private bool isDisposed; - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - #endregion - - #region ctors - protected ProjectDocumentsListener(ServiceProvider serviceProviderParameter) - { - if (serviceProviderParameter == null) - { - throw new ArgumentNullException("serviceProviderParameter"); - } - - this.serviceProvider = serviceProviderParameter; - this.projectDocTracker = this.serviceProvider.GetService(typeof(SVsTrackProjectDocuments)) as IVsTrackProjectDocuments2; - - Debug.Assert(this.projectDocTracker != null, "Could not get the IVsTrackProjectDocuments2 object from the services exposed by this project"); - - if(this.projectDocTracker == null) - { - throw new InvalidOperationException(); - } - } - #endregion - - #region properties - protected uint EventsCookie - { - get - { - return this.eventsCookie; - } - } - - protected IVsTrackProjectDocuments2 ProjectDocumentTracker2 - { - get - { - return this.projectDocTracker; - } - } - - protected ServiceProvider ServiceProvider - { - get - { - return this.serviceProvider; - } - } - #endregion - - #region IVsTrackProjectDocumentsEvents2 Members - - public virtual int OnAfterAddDirectoriesEx(int cProjects, int cDirectories, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgpszMkDocuments, VSADDDIRECTORYFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterAddFilesEx(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgpszMkDocuments, VSADDFILEFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterRemoveDirectories(int cProjects, int cDirectories, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgpszMkDocuments, VSREMOVEDIRECTORYFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterRemoveFiles(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgpszMkDocuments, VSREMOVEFILEFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterRenameDirectories(int cProjects, int cDirs, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgszMkOldNames, string[] rgszMkNewNames, VSRENAMEDIRECTORYFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterRenameFiles(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgszMkOldNames, string[] rgszMkNewNames, VSRENAMEFILEFLAGS[] rgFlags) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterSccStatusChanged(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgpszMkDocuments, uint[] rgdwSccStatus) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryAddDirectories(IVsProject pProject, int cDirectories, string[] rgpszMkDocuments, VSQUERYADDDIRECTORYFLAGS[] rgFlags, VSQUERYADDDIRECTORYRESULTS[] pSummaryResult, VSQUERYADDDIRECTORYRESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryAddFiles(IVsProject pProject, int cFiles, string[] rgpszMkDocuments, VSQUERYADDFILEFLAGS[] rgFlags, VSQUERYADDFILERESULTS[] pSummaryResult, VSQUERYADDFILERESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryRemoveDirectories(IVsProject pProject, int cDirectories, string[] rgpszMkDocuments, VSQUERYREMOVEDIRECTORYFLAGS[] rgFlags, VSQUERYREMOVEDIRECTORYRESULTS[] pSummaryResult, VSQUERYREMOVEDIRECTORYRESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryRemoveFiles(IVsProject pProject, int cFiles, string[] rgpszMkDocuments, VSQUERYREMOVEFILEFLAGS[] rgFlags, VSQUERYREMOVEFILERESULTS[] pSummaryResult, VSQUERYREMOVEFILERESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryRenameDirectories(IVsProject pProject, int cDirs, string[] rgszMkOldNames, string[] rgszMkNewNames, VSQUERYRENAMEDIRECTORYFLAGS[] rgFlags, VSQUERYRENAMEDIRECTORYRESULTS[] pSummaryResult, VSQUERYRENAMEDIRECTORYRESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryRenameFiles(IVsProject pProject, int cFiles, string[] rgszMkOldNames, string[] rgszMkNewNames, VSQUERYRENAMEFILEFLAGS[] rgFlags, VSQUERYRENAMEFILERESULTS[] pSummaryResult, VSQUERYRENAMEFILERESULTS[] rgResults) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region IDisposable Members - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - #endregion - - #region methods - public void Init() - { - if(this.ProjectDocumentTracker2 != null) - { - ErrorHandler.ThrowOnFailure(this.ProjectDocumentTracker2.AdviseTrackProjectDocumentsEvents(this, out this.eventsCookie)); - } - } - - /// - /// The method that does the cleanup. - /// - /// - [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "Microsoft.VisualStudio.Shell.Interop.IVsTrackProjectDocuments2.UnadviseTrackProjectDocumentsEvents(System.UInt32)")] - protected virtual void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simulteniously. - lock(Mutex) - { - if(disposing && this.eventsCookie != (uint)ShellConstants.VSCOOKIE_NIL && this.ProjectDocumentTracker2 != null) - { - this.ProjectDocumentTracker2.UnadviseTrackProjectDocumentsEvents((uint)this.eventsCookie); - this.eventsCookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - - this.isDisposed = true; - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectElement.cs b/source/Archive/MPF/12.0/ProjectElement.cs deleted file mode 100644 index 34f6c9923a..0000000000 --- a/source/Archive/MPF/12.0/ProjectElement.cs +++ /dev/null @@ -1,453 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using MSBuild = Microsoft.Build.Evaluation; -using Microsoft.Build.Evaluation; - -namespace Microsoft.VisualStudio.Project -{ - - /// - /// This class represent a project item (usualy a file) and allow getting and - /// setting attribute on it. - /// This class allow us to keep the internal details of our items hidden from - /// our derived classes. - /// While the class itself is public so it can be manipulated by derived classes, - /// its internal constructors make sure it can only be created from within the assembly. - /// - public sealed class ProjectElement - { - #region fields - private MSBuild.ProjectItem item; - private ProjectNode itemProject; - private bool deleted; - private bool isVirtual; - private Dictionary virtualProperties; - #endregion - - #region properties - public string ItemName - { - get - { - if(this.HasItemBeenDeleted()) - { - return String.Empty; - } - else - { - return this.item.ItemType; - } - } - set - { - if(!this.HasItemBeenDeleted()) - { - // Check out the project file. - if(!this.itemProject.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - this.item.ItemType = value; - } - } - } - - internal MSBuild.ProjectItem Item - { - get - { - return this.item; - } - } - - internal bool IsVirtual - { - get - { - return this.isVirtual; - } - } - #endregion - - #region ctors - /// - /// Constructor to create a new MSBuild.ProjectItem and add it to the project - /// Only have internal constructors as the only one who should be creating - /// such object is the project itself (see Project.CreateFileNode()). - /// - internal ProjectElement(ProjectNode project, string itemPath, string itemType) - { - if(project == null) - { - throw new ArgumentNullException("project"); - } - - if(String.IsNullOrEmpty(itemPath)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "itemPath"); - } - - - if(String.IsNullOrEmpty(itemType)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "itemType"); - } - - this.itemProject = project; - - // create and add the item to the project - - this.item = project.BuildProject.AddItem(itemType, Microsoft.Build.Evaluation.ProjectCollection.Escape(itemPath))[0]; - this.itemProject.SetProjectFileDirty(true); - this.RefreshProperties(); - } - - /// - /// Constructor to Wrap an existing MSBuild.ProjectItem - /// Only have internal constructors as the only one who should be creating - /// such object is the project itself (see Project.CreateFileNode()). - /// - /// Project that owns this item - /// an MSBuild.ProjectItem; can be null if virtualFolder is true - /// Is this item virtual (such as reference folder) - internal ProjectElement(ProjectNode project, MSBuild.ProjectItem existingItem, bool virtualFolder) - { - if(project == null) - throw new ArgumentNullException("project"); - if(!virtualFolder && existingItem == null) - throw new ArgumentNullException("existingItem"); - - // Keep a reference to project and item - this.itemProject = project; - this.item = existingItem; - this.isVirtual = virtualFolder; - - if(this.isVirtual) - this.virtualProperties = new Dictionary(); - } - #endregion - - #region public methods - /// - /// Calling this method remove this item from the project file. - /// Once the item is delete, you should not longer be using it. - /// Note that the item should be removed from the hierarchy prior to this call. - /// - public void RemoveFromProjectFile() - { - if(!deleted && item != null) - { - deleted = true; - itemProject.BuildProject.RemoveItem(item); - } - itemProject = null; - item = null; - } - - /// - /// Set an attribute on the project element - /// - /// Name of the attribute to set - /// Value to give to the attribute. Use null to delete the metadata definition. - public void SetMetadata(string attributeName, string attributeValue) - { - Debug.Assert(String.Compare(attributeName, ProjectFileConstants.Include, StringComparison.OrdinalIgnoreCase) != 0, "Use rename as this won't work"); - - if(this.IsVirtual) - { - // For virtual node, use our virtual property collection - if(virtualProperties.ContainsKey(attributeName)) - virtualProperties.Remove(attributeName); - virtualProperties.Add(attributeName, attributeValue); - return; - } - - // Build Action is the type, not a property, so intercept - if(String.Equals(attributeName, ProjectFileConstants.BuildAction, StringComparison.OrdinalIgnoreCase)) - { - item.ItemType = attributeValue; - return; - } - - // Check out the project file. - if(!this.itemProject.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - if(attributeValue == null) - item.RemoveMetadata(attributeName); - else - item.SetMetadataValue(attributeName, attributeValue); - itemProject.SetProjectFileDirty(true); - } - - public string GetEvaluatedMetadata(string attributeName) - { - if(this.IsVirtual) - { - // For virtual items, use our virtual property collection - if(!virtualProperties.ContainsKey(attributeName)) - { - return String.Empty; - } - return virtualProperties[attributeName]; - } - - // cannot ask MSBuild for Include, so intercept it and return the corresponding property - if(String.Compare(attributeName, ProjectFileConstants.Include, StringComparison.OrdinalIgnoreCase) == 0) - { - return item.EvaluatedInclude; - } - - // Build Action is the type, not a property, so intercept this one as well - if(String.Compare(attributeName, ProjectFileConstants.BuildAction, StringComparison.OrdinalIgnoreCase) == 0) - { - return item.ItemType; - } - - return item.GetMetadataValue(attributeName); - } - - /// - /// Get the value of an attribute on a project element - /// - /// Name of the attribute to get the value for - /// Value of the attribute - public string GetMetadata(string attributeName) - { - if(this.IsVirtual) - { - // For virtual items, use our virtual property collection - if(!virtualProperties.ContainsKey(attributeName)) - return String.Empty; - return virtualProperties[attributeName]; - } - - // cannot ask MSBuild for Include, so intercept it and return the corresponding property - if(String.Compare(attributeName, ProjectFileConstants.Include, StringComparison.OrdinalIgnoreCase) == 0) - return item.EvaluatedInclude; - - // Build Action is the type, not a property, so intercept this one as well - if(String.Compare(attributeName, ProjectFileConstants.BuildAction, StringComparison.OrdinalIgnoreCase) == 0) - return item.ItemType; - - return item.GetMetadataValue(attributeName); - } - - /// - /// Gets the attribute and throws the handed exception if the exception if the attribute is empty or null. - /// - /// The name of the attribute to get. - /// The exception to be thrown if not found or empty. - /// The attribute if found - /// The method will throw an Exception and neglect the passed in exception if the attribute is deleted - public string GetMetadataAndThrow(string attributeName, Exception exception) - { - Debug.Assert(!String.IsNullOrEmpty(attributeName), "Cannot retrieve an attribute for a null or empty attribute name"); - string attribute = GetMetadata(attributeName); - - if(String.IsNullOrEmpty(attributeName) && exception != null) - { - if(String.IsNullOrEmpty(exception.Message)) - { - Debug.Assert(!String.IsNullOrEmpty(this.itemProject.BaseURI.AbsoluteUrl), "Cannot retrieve an attribute for a project that does not have a name"); - string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.AttributeLoad, CultureInfo.CurrentUICulture), attributeName, this.itemProject.BaseURI.AbsoluteUrl); - throw new Exception(message, exception); - } - throw exception; - } - - return attribute; - } - - - public void Rename(string newPath) - { - string escapedPath = Microsoft.Build.Evaluation.ProjectCollection.Escape(newPath); - if(this.IsVirtual) - { - virtualProperties[ProjectFileConstants.Include] = escapedPath; - return; - } - - item.Rename(escapedPath); - this.RefreshProperties(); - } - - - /// - /// Reevaluate all properties for the current item - /// This should be call if you believe the property for this item - /// may have changed since it was created/refreshed, or global properties - /// this items depends on have changed. - /// Be aware that there is a perf cost in calling this function. - /// - public void RefreshProperties() - { - if(this.IsVirtual) - return; - - itemProject.BuildProject.ReevaluateIfNecessary(); - - IEnumerable items = itemProject.BuildProject.GetItems(item.ItemType); - foreach (ProjectItem projectItem in items) - { - if(projectItem!= null && projectItem.UnevaluatedInclude.Equals(item.UnevaluatedInclude)) - { - item = projectItem; - return; - } - } - } - - /// - /// Return an absolute path for the passed in element. - /// If the element is already an absolute path, it is returned. - /// Otherwise, it is unrelativized using the project directory - /// as the base. - /// Note that any ".." in the paths will be resolved. - /// - /// For non-file system based project, it may make sense to override. - /// - /// FullPath - public string GetFullPathForElement() - { - string path = this.GetMetadata(ProjectFileConstants.Include); - if(!Path.IsPathRooted(path)) - path = Path.Combine(this.itemProject.ProjectFolder, path); - - // If any part of the path used relative paths, resolve this now - path = Path.GetFullPath(path); - return path; - } - - #endregion - - #region helper methods - /// - /// Has the item been deleted - /// - private bool HasItemBeenDeleted() - { - return (this.deleted || this.item == null); - } - #endregion - - #region overridden from System.Object - public static bool operator ==(ProjectElement element1, ProjectElement element2) - { - // Do they reference the same element? - if(Object.ReferenceEquals(element1, element2)) - return true; - - // Verify that they are not null (cast to object first to avoid stack overflow) - if(element1 as object == null || element2 as object == null) - { - return false; - } - - Debug.Assert(!element1.IsVirtual || !element2.IsVirtual, "Cannot compare virtual nodes"); - - // Cannot compare vitual items. - if(element1.IsVirtual || element2.IsVirtual) - { - return false; - } - - // Do they reference the same project? - if(!element1.itemProject.Equals(element2.itemProject)) - return false; - - // Do they have the same include? - string include1 = element1.GetMetadata(ProjectFileConstants.Include); - string include2 = element2.GetMetadata(ProjectFileConstants.Include); - - // Unfortunately the checking for nulls have to be done again, since neither String.Equals nor String.Compare can handle nulls. - // Virtual folders should not be handled here. - if(include1 == null || include2 == null) - { - return false; - } - - return String.Equals(include1, include2, StringComparison.CurrentCultureIgnoreCase); - } - - - public static bool operator !=(ProjectElement element1, ProjectElement element2) - { - return !(element1 == element2); - } - - - public override bool Equals(object obj) - { - ProjectElement element2 = obj as ProjectElement; - if(element2 == null) - return false; - - return this == element2; - } - - - public override int GetHashCode() - { - return base.GetHashCode(); - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectFactory.cs b/source/Archive/MPF/12.0/ProjectFactory.cs deleted file mode 100644 index 77085c13bf..0000000000 --- a/source/Archive/MPF/12.0/ProjectFactory.cs +++ /dev/null @@ -1,277 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using MSBuildExecution = Microsoft.Build.Execution; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Creates projects within the solution - /// - - public abstract class ProjectFactory : Microsoft.VisualStudio.Shell.Flavor.FlavoredProjectFactoryBase //, IVsAsynchronousProjectCreate - { - #region fields - private Microsoft.VisualStudio.Shell.Package package; - private System.IServiceProvider site; - private static readonly Lazy taskSchedulerService = new Lazy(() => Package.GetGlobalService(typeof(SVsTaskSchedulerService)) as IVsTaskSchedulerService); - - /// - /// The msbuild engine that we are going to use. - /// - private MSBuild.ProjectCollection buildEngine; - - /// - /// The msbuild project for the project file. - /// - private MSBuild.Project buildProject; - #endregion - - #region properties - protected Microsoft.VisualStudio.Shell.Package Package - { - get - { - return this.package; - } - } - - protected System.IServiceProvider Site - { - get - { - return this.site; - } - } - - /// - /// The msbuild engine that we are going to use. - /// - protected MSBuild.ProjectCollection BuildEngine - { - get - { - return this.buildEngine; - } - } - - /// - /// The msbuild project for the temporary project file. - /// - protected MSBuild.Project BuildProject - { - get - { - return this.buildProject; - } - set - { - this.buildProject = value; - } - } - #endregion - - #region ctor - protected ProjectFactory(Microsoft.VisualStudio.Shell.Package package) - { - this.package = package; - this.site = package; - - // Please be aware that this methods needs that ServiceProvider is valid, thus the ordering of calls in the ctor matters. - this.buildEngine = Utilities.InitializeMsBuildEngine(this.buildEngine, this.site); - } - #endregion - - #region methods - - public virtual bool CanCreateProjectAsynchronously(ref Guid rguidProjectID, string filename, uint flags) - { - return true; - } - - public void OnBeforeCreateProjectAsync(ref Guid rguidProjectID, string filename, string location, string pszName, uint flags) - { - } - - public virtual IVsTask CreateProjectAsync(ref Guid rguidProjectID, string filename, string location, string pszName, uint flags) - { - Guid iid = typeof(IVsHierarchy).GUID; - return VsTaskLibraryHelper.CreateAndStartTask(taskSchedulerService.Value, VsTaskRunContext.UIThreadBackgroundPriority, VsTaskLibraryHelper.CreateTaskBody(() => - { - IntPtr project; - int cancelled; - CreateProject(filename, location, pszName, flags, ref iid, out project, out cancelled); - if (cancelled != 0) - { - throw new OperationCanceledException(); - } - - return Marshal.GetObjectForIUnknown(project); - })); - } - - #endregion - - #region abstract methods - protected abstract ProjectNode CreateProject(); - #endregion - - #region overriden methods - /// - /// Rather than directly creating the project, ask VS to initate the process of - /// creating an aggregated project in case we are flavored. We will be called - /// on the IVsAggregatableProjectFactory to do the real project creation. - /// - /// Project file - /// Path of the project - /// Project Name - /// Creation flags - /// Guid of the project - /// Project that end up being created by this method - /// Was the project creation canceled - protected override void CreateProject(string fileName, string location, string name, uint flags, ref Guid projectGuid, out IntPtr project, out int canceled) - { - project = IntPtr.Zero; - canceled = 0; - - // Get the list of GUIDs from the project/template - string guidsList = this.ProjectTypeGuids(fileName); - - // Launch the aggregate creation process (we should be called back on our IVsAggregatableProjectFactoryCorrected implementation) - IVsCreateAggregateProject aggregateProjectFactory = (IVsCreateAggregateProject)this.Site.GetService(typeof(SVsCreateAggregateProject)); - int hr = aggregateProjectFactory.CreateAggregateProject(guidsList, fileName, location, name, flags, ref projectGuid, out project); - if(hr == VSConstants.E_ABORT) - canceled = 1; - ErrorHandler.ThrowOnFailure(hr); - - // This needs to be done after the aggregation is completed (to avoid creating a non-aggregated CCW) and as a result we have to go through the interface - IProjectEventsProvider eventsProvider = (IProjectEventsProvider)Marshal.GetTypedObjectForIUnknown(project, typeof(IProjectEventsProvider)); - eventsProvider.ProjectEventsProvider = this.GetProjectEventsProvider(); - - this.buildProject = null; - } - - - /// - /// Instantiate the project class, but do not proceed with the - /// initialization just yet. - /// Delegate to CreateProject implemented by the derived class. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", - Justification="The global property handles is instantiated here and used in the project node that will Dispose it")] - protected override object PreCreateForOuter(IntPtr outerProjectIUnknown) - { - Debug.Assert(this.buildProject != null, "The build project should have been initialized before calling PreCreateForOuter."); - - // Please be very carefull what is initialized here on the ProjectNode. Normally this should only instantiate and return a project node. - // The reason why one should very carefully add state to the project node here is that at this point the aggregation has not yet been created and anything that would cause a CCW for the project to be created would cause the aggregation to fail - // Our reasoning is that there is no other place where state on the project node can be set that is known by the Factory and has to execute before the Load method. - ProjectNode node = this.CreateProject(); - Debug.Assert(node != null, "The project failed to be created"); - node.BuildEngine = this.buildEngine; - node.BuildProject = this.buildProject; - node.Package = this.package as ProjectPackage; - return node; - } - - /// - /// Retrives the list of project guids from the project file. - /// If you don't want your project to be flavorable, override - /// to only return your project factory Guid: - /// return this.GetType().GUID.ToString("B"); - /// - /// Project file to look into to find the Guid list - /// List of semi-colon separated GUIDs - protected override string ProjectTypeGuids(string file) - { - // Load the project so we can extract the list of GUIDs - - this.buildProject = Utilities.ReinitializeMsBuildProject(this.buildEngine, file, this.buildProject); - - // Retrieve the list of GUIDs, if it is not specify, make it our GUID - string guids = buildProject.GetPropertyValue(ProjectFileConstants.ProjectTypeGuids); - if(String.IsNullOrEmpty(guids)) - guids = this.GetType().GUID.ToString("B"); - - return guids; - } - #endregion - - #region helpers - private IProjectEvents GetProjectEventsProvider() - { - ProjectPackage projectPackage = this.package as ProjectPackage; - Debug.Assert(projectPackage != null, "Package not inherited from framework"); - if(projectPackage != null) - { - foreach(SolutionListener listener in projectPackage.SolutionListeners) - { - IProjectEvents projectEvents = listener as IProjectEvents; - if(projectEvents != null) - { - return projectEvents; - } - } - } - - return null; - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectFileConstants.cs b/source/Archive/MPF/12.0/ProjectFileConstants.cs deleted file mode 100644 index 47950c48f7..0000000000 --- a/source/Archive/MPF/12.0/ProjectFileConstants.cs +++ /dev/null @@ -1,177 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System.Diagnostics.CodeAnalysis; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines the constant strings for various msbuild targets - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - public static class MsBuildTarget - { - public const string ResolveProjectReferences = "ResolveProjectReferences"; - public const string ResolveAssemblyReferences = "ResolveAssemblyReferences"; - public const string ResolveComReferences = "ResolveComReferences"; - public const string Build = "Build"; - public const string Rebuild = "ReBuild"; - public const string Clean = "Clean"; - } - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - public static class MsBuildGeneratedItemType - { - public const string ReferenceCopyLocalPaths = "ReferenceCopyLocalPaths"; - public const string ComReferenceWrappers = "ComReferenceWrappers"; - } - - /// - /// Defines the constant strings used with project files. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "COM")] - public static class ProjectFileConstants - { - public const string Include = "Include"; - public const string Name = "Name"; - public const string HintPath = "HintPath"; - public const string AssemblyName = "AssemblyName"; - public const string FinalOutputPath = "FinalOutputPath"; - public const string Project = "Project"; - public const string LinkedIntoProjectAt = "LinkedIntoProjectAt"; - public const string TypeGuid = "TypeGuid"; - public const string InstanceGuid = "InstanceGuid"; - public const string Private = "Private"; - public const string EmbedInteropTypes = "EmbedInteropTypes"; - public const string ProjectReference = "ProjectReference"; - public const string Reference = "Reference"; - public const string WebReference = "WebReference"; - public const string WebReferenceFolder = "WebReferenceFolder"; - public const string Folder = "Folder"; - public const string Content = "Content"; - public const string EmbeddedResource = "EmbeddedResource"; - public const string RootNamespace = "RootNamespace"; - public const string OutputType = "OutputType"; - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubType")] - public const string SubType = "SubType"; - public const string DependentUpon = "DependentUpon"; - public const string Compile = "Compile"; - public const string ReferencePath = "ReferencePath"; - public const string ResolvedProjectReferencePaths = "ResolvedProjectReferencePaths"; - public const string Configuration = "Configuration"; - public const string Platform = "Platform"; - public const string AvailablePlatforms = "AvailablePlatforms"; - public const string BuildVerbosity = "BuildVerbosity"; - public const string Template = "Template"; - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubProject")] - public const string SubProject = "SubProject"; - public const string BuildAction = "BuildAction"; - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "COM")] - public const string COMReference = "COMReference"; - public const string Guid = "Guid"; - public const string VersionMajor = "VersionMajor"; - public const string VersionMinor = "VersionMinor"; - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lcid")] - public const string Lcid = "Lcid"; - public const string Isolated = "Isolated"; - public const string WrapperTool = "WrapperTool"; - public const string BuildingInsideVisualStudio = "BuildingInsideVisualStudio"; - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - public const string SccProjectName = "SccProjectName"; - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - public const string SccLocalPath = "SccLocalPath"; - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - public const string SccAuxPath = "SccAuxPath"; - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - public const string SccProvider = "SccProvider"; - public const string ProjectGuid = "ProjectGuid"; - public const string ProjectTypeGuids = "ProjectTypeGuids"; - public const string Generator = "Generator"; - public const string CustomToolNamespace = "CustomToolNamespace"; - public const string FlavorProperties = "FlavorProperties"; - public const string VisualStudio = "VisualStudio"; - public const string User = "User"; - public const string ApplicationDefinition = "ApplicationDefinition"; - public const string Link = "Link"; - public const string Page = "Page"; - public const string Resource = "Resource"; - public const string None = "None"; - } - - public static class ProjectFileAttributeValue - { - public const string Code = "Code"; - public const string Form = "Form"; - public const string Component = "Component"; - public const string Designer = "Designer"; - public const string UserControl = "UserControl"; - } - - internal static class ProjectFileValues - { - internal const string AnyCPU = "AnyCPU"; - } - - public enum WrapperToolAttributeValue - { - Primary, - TlbImp - } - - /// - /// A set of constants that specify the default sort order for different types of hierarchy nodes. - /// - public static class DefaultSortOrderNode - { - public const int HierarchyNode = 1000; - public const int FolderNode = 500; - public const int NestedProjectNode = 200; - public const int ReferenceContainerNode = 300; - } - -} diff --git a/source/Archive/MPF/12.0/ProjectNode.CopyPaste.cs b/source/Archive/MPF/12.0/ProjectNode.CopyPaste.cs deleted file mode 100644 index c4ed1471bd..0000000000 --- a/source/Archive/MPF/12.0/ProjectNode.CopyPaste.cs +++ /dev/null @@ -1,1207 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Text; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using IOleDataObject = Microsoft.VisualStudio.OLE.Interop.IDataObject; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Manages the CopyPaste and Drag and Drop scenarios for a Project. - /// - /// This is a partial class. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling")] - public partial class ProjectNode : IVsUIHierWinClipboardHelperEvents - { - #region fields - private uint copyPasteCookie; - private DropDataType dropDataType; - #endregion - - #region override of IVsHierarchyDropDataTarget methods - /// - /// Called as soon as the mouse drags an item over a new hierarchy or hierarchy window - /// - /// reference to interface IDataObject of the item being dragged - /// Current state of the keyboard and the mouse modifier keys. See docs for a list of possible values - /// Item identifier for the item currently being dragged - /// On entry, a pointer to the current DropEffect. On return, must contain the new valid DropEffect - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int DragEnter(IOleDataObject pDataObject, uint grfKeyState, uint itemid, ref uint pdwEffect) - { - pdwEffect = (uint)DropEffect.None; - - if(this.SourceDraggedOrCutOrCopied) - { - return VSConstants.S_OK; - } - - this.dropDataType = QueryDropDataType(pDataObject); - if(this.dropDataType != DropDataType.None) - { - pdwEffect = (uint)this.QueryDropEffect(this.dropDataType, grfKeyState); - } - - return VSConstants.S_OK; - } - - /// - /// Called when one or more items are dragged out of the hierarchy or hierarchy window, or when the drag-and-drop operation is cancelled or completed. - /// - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int DragLeave() - { - this.dropDataType = DropDataType.None; - return VSConstants.S_OK; - } - - /// - /// Called when one or more items are dragged over the target hierarchy or hierarchy window. - /// - /// Current state of the keyboard keys and the mouse modifier buttons. See - /// Item identifier of the drop data target over which the item is being dragged - /// On entry, reference to the value of the pdwEffect parameter of the IVsHierarchy object, identifying all effects that the hierarchy supports. - /// On return, the pdwEffect parameter must contain one of the effect flags that indicate the result of the drop operation. For a list of pwdEffects values, see - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int DragOver(uint grfKeyState, uint itemid, ref uint pdwEffect) - { - pdwEffect = (uint)DropEffect.None; - - // Dragging items to a project that is being debugged is not supported - // (see VSWhidbey 144785) - DBGMODE dbgMode = VsShellUtilities.GetDebugMode(this.Site) & ~DBGMODE.DBGMODE_EncMask; - if(dbgMode == DBGMODE.DBGMODE_Run || dbgMode == DBGMODE.DBGMODE_Break) - { - return VSConstants.S_OK; - } - - if(this.isClosed || this.site == null) - { - return VSConstants.E_UNEXPECTED; - } - - // We should also analyze if the node being dragged over can accept the drop. - if(!this.CanTargetNodeAcceptDrop(itemid)) - { - return VSConstants.E_NOTIMPL; - } - - if(this.dropDataType != DropDataType.None) - { - pdwEffect = (uint)this.QueryDropEffect(this.dropDataType, grfKeyState); - } - - return VSConstants.S_OK; - } - - /// - /// Called when one or more items are dropped into the target hierarchy or hierarchy window when the mouse button is released. - /// - /// Reference to the IDataObject interface on the item being dragged. This data object contains the data being transferred in the drag-and-drop operation. - /// If the drop occurs, then this data object (item) is incorporated into the target hierarchy or hierarchy window. - /// Current state of the keyboard and the mouse modifier keys. See - /// Item identifier of the drop data target over which the item is being dragged - /// Visual effects associated with the drag-and drop-operation, such as a cursor, bitmap, and so on. - /// The value of dwEffects passed to the source object via the OnDropNotify method is the value of pdwEffects returned by the Drop method - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int Drop(IOleDataObject pDataObject, uint grfKeyState, uint itemid, ref uint pdwEffect) - { - if(pDataObject == null) - { - return VSConstants.E_INVALIDARG; - } - - pdwEffect = (uint)DropEffect.None; - - // Get the node that is being dragged over and ask it which node should handle this call - HierarchyNode targetNode = NodeFromItemId(itemid); - if(targetNode != null) - { - targetNode = targetNode.GetDragTargetHandlerNode(); - } - else - { - // There is no target node. The drop can not be completed. - return VSConstants.S_FALSE; - } - - int returnValue; - try - { - DropDataType dropDataType = DropDataType.None; - dropDataType = ProcessSelectionDataObject(pDataObject, targetNode); - pdwEffect = (uint)this.QueryDropEffect(dropDataType, grfKeyState); - - // If it is a drop from windows and we get any kind of error we return S_FALSE and dropeffect none. This - // prevents bogus messages from the shell from being displayed - returnValue = (dropDataType != DropDataType.Shell) ? VSConstants.E_FAIL : VSConstants.S_OK; - } - catch(System.IO.FileNotFoundException e) - { - Trace.WriteLine("Exception : " + e.Message); - - if(!Utilities.IsInAutomationFunction(this.Site)) - { - string message = e.Message; - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - } - - returnValue = VSConstants.E_FAIL; - } - - return returnValue; - } - #endregion - - #region override of IVsHierarchyDropDataSource2 methods - /// - /// Returns information about one or more of the items being dragged - /// - /// Pointer to a DWORD value describing the effects displayed while the item is being dragged, - /// such as cursor icons that change during the drag-and-drop operation. - /// For example, if the item is dragged over an invalid target point - /// (such as the item's original location), the cursor icon changes to a circle with a line through it. - /// Similarly, if the item is dragged over a valid target point, the cursor icon changes to a file or folder. - /// Pointer to the IDataObject interface on the item being dragged. - /// This data object contains the data being transferred in the drag-and-drop operation. - /// If the drop occurs, then this data object (item) is incorporated into the target hierarchy or hierarchy window. - /// Pointer to the IDropSource interface of the item being dragged. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int GetDropInfo(out uint pdwOKEffects, out IOleDataObject ppDataObject, out IDropSource ppDropSource) - { - //init out params - pdwOKEffects = (uint)DropEffect.None; - ppDataObject = null; - ppDropSource = null; - - IOleDataObject dataObject = PackageSelectionDataObject(false); - if(dataObject == null) - { - return VSConstants.E_NOTIMPL; - } - - this.SourceDraggedOrCutOrCopied = true; - - pdwOKEffects = (uint)(DropEffect.Move | DropEffect.Copy); - - ppDataObject = dataObject; - return VSConstants.S_OK; - } - - /// - /// Notifies clients that the dragged item was dropped. - /// - /// If true, then the dragged item was dropped on the target. If false, then the drop did not occur. - /// Visual effects associated with the drag-and-drop operation, such as cursors, bitmaps, and so on. - /// The value of dwEffects passed to the source object via OnDropNotify method is the value of pdwEffects returned by Drop method. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int OnDropNotify(int fDropped, uint dwEffects) - { - if(!this.SourceDraggedOrCutOrCopied) - { - return VSConstants.S_FALSE; - } - - this.CleanupSelectionDataObject(fDropped != 0, false, dwEffects == (uint)DropEffect.Move); - - this.SourceDraggedOrCutOrCopied = false; - - return VSConstants.S_OK; - } - - /// - /// Allows the drag source to prompt to save unsaved items being dropped. - /// Notifies the source hierarchy that information dragged from it is about to be dropped on a target. - /// This method is called immediately after the mouse button is released on a drop. - /// - /// Reference to the IDataObject interface on the item being dragged. - /// This data object contains the data being transferred in the drag-and-drop operation. - /// If the drop occurs, then this data object (item) is incorporated into the hierarchy window of the new hierarchy. - /// Current state of the keyboard and the mouse modifier keys. - /// If true, then the drop is cancelled by the source hierarchy. If false, then the drop can continue. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public override int OnBeforeDropNotify(IOleDataObject o, uint dwEffect, out int fCancelDrop) - { - // If there is nothing to be dropped just return that drop should be cancelled. - if(this.ItemsDraggedOrCutOrCopied == null) - { - fCancelDrop = 1; - return VSConstants.S_OK; - } - - fCancelDrop = 0; - bool dirty = false; - foreach(HierarchyNode node in this.ItemsDraggedOrCutOrCopied) - { - bool isDirty, isOpen, isOpenedByUs; - uint docCookie; - IVsPersistDocData ppIVsPersistDocData; - DocumentManager manager = node.GetDocumentManager(); - if(manager != null) - { - manager.GetDocInfo(out isOpen, out isDirty, out isOpenedByUs, out docCookie, out ppIVsPersistDocData); - if(isDirty && isOpenedByUs) - { - dirty = true; - break; - } - } - } - - // if there are no dirty docs we are ok to proceed - if(!dirty) - { - return VSConstants.S_OK; - } - - // Prompt to save if there are dirty docs - string message = SR.GetString(SR.SaveModifiedDocuments, CultureInfo.CurrentUICulture); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_WARNING; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_YESNOCANCEL; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - int result = VsShellUtilities.ShowMessageBox(Site, title, message, icon, buttons, defaultButton); - switch(result) - { - case NativeMethods.IDYES: - break; - - case NativeMethods.IDNO: - return VSConstants.S_OK; - - case NativeMethods.IDCANCEL: goto default; - - default: - fCancelDrop = 1; - return VSConstants.S_OK; - } - - // Save all dirty documents - foreach(HierarchyNode node in this.ItemsDraggedOrCutOrCopied) - { - DocumentManager manager = node.GetDocumentManager(); - if(manager != null) - { - manager.Save(true); - } - } - - return VSConstants.S_OK; - } - - #endregion - - #region IVsUIHierWinClipboardHelperEvents Members - /// - /// Called after your cut/copied items has been pasted - /// - ///If true, then the IDataObject has been successfully pasted into a target hierarchy. - /// If false, then the cut or copy operation was cancelled. - /// Visual effects associated with the drag and drop operation, such as cursors, bitmaps, and so on. - /// These should be the same visual effects used in OnDropNotify - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OnPaste(int wasCut, uint dropEffect) - { - if(!this.SourceDraggedOrCutOrCopied) - { - return VSConstants.S_FALSE; - } - - if(dropEffect == (uint)DropEffect.None) - { - return OnClear(wasCut); - } - - this.CleanupSelectionDataObject(false, wasCut != 0, dropEffect == (uint)DropEffect.Move); - this.SourceDraggedOrCutOrCopied = false; - return VSConstants.S_OK; - } - - /// - /// Called when your cut/copied operation is canceled - /// - /// This flag informs the source that the Cut method was called (true), - /// rather than Copy (false), so the source knows whether to "un-cut-highlight" the items that were cut. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OnClear(int wasCut) - { - if(!this.SourceDraggedOrCutOrCopied) - { - return VSConstants.S_FALSE; - } - - this.CleanupSelectionDataObject(false, wasCut != 0, false, true); - this.SourceDraggedOrCutOrCopied = false; - return VSConstants.S_OK; - } - #endregion - - #region virtual methods - /// - /// Determines if a node can accept drop opertaion. - /// - /// The id of the node. - /// true if the node acceots drag operation. - protected internal virtual bool CanTargetNodeAcceptDrop(uint itemId) - { - HierarchyNode targetNode = NodeFromItemId(itemId); - if(targetNode is ReferenceContainerNode || targetNode is ReferenceNode) - { - return false; - } - else - { - return true; - } - } - - /// - /// Returns a dataobject from selected nodes - /// - /// boolean that defines if the selected items must be cut - /// data object for selected items - internal virtual DataObject PackageSelectionDataObject(bool cutHighlightItems) - { - this.CleanupSelectionDataObject(false, false, false); - StringBuilder sb = new StringBuilder(); - - DataObject dataObject = null; - - try - { - IList selectedNodes = this.GetSelectedNodes(); - if(selectedNodes != null) - { - this.InstantiateItemsDraggedOrCutOrCopiedList(); - - StringBuilder selectionContent = null; - - // If there is a selection package the data - if(selectedNodes.Count > 1) - { - foreach(HierarchyNode node in selectedNodes) - { - selectionContent = node.PrepareSelectedNodesForClipBoard(); - if(selectionContent != null) - { - sb.Append(selectionContent); - } - } - } - else if(selectedNodes.Count == 1) - { - HierarchyNode selectedNode = selectedNodes[0]; - selectionContent = selectedNode.PrepareSelectedNodesForClipBoard(); - if(selectionContent != null) - { - sb.Append(selectionContent); - } - } - } - - // Add the project items first. - IntPtr ptrToItems = this.PackageSelectionData(sb, false); - if(ptrToItems == IntPtr.Zero) - { - return null; - } - - FORMATETC fmt = DragDropHelper.CreateFormatEtc(DragDropHelper.CF_VSSTGPROJECTITEMS); - dataObject = new DataObject(); - dataObject.SetData(fmt, ptrToItems); - - // Now add the project path that sourced data. We just write the project file path. - IntPtr ptrToProjectPath = this.PackageSelectionData(new StringBuilder(this.GetMkDocument()), true); - - if(ptrToProjectPath != IntPtr.Zero) - { - dataObject.SetData(DragDropHelper.CreateFormatEtc(DragDropHelper.CF_VSPROJECTCLIPDESCRIPTOR), ptrToProjectPath); - } - - if (cutHighlightItems) - { - bool first = true; - IVsUIHierarchyWindow w = UIHierarchyUtilities.GetUIHierarchyWindow(this.site, HierarchyNode.SolutionExplorer); - - // This happens in the context of cutting multiple items from the project. - // Since we are already in solution explorer, it is extremely unlikely that we get a null return. - // If we do, the icons for the cut items will not fade. The cut operation will still succeed. - if (w != null) - { - foreach (HierarchyNode node in this.ItemsDraggedOrCutOrCopied) - { - ErrorHandler.ThrowOnFailure(w.ExpandItem(this.InteropSafeIVsUIHierarchy, node.ID, first ? EXPANDFLAGS.EXPF_CutHighlightItem : EXPANDFLAGS.EXPF_AddCutHighlightItem)); - first = false; - } - } - } - } - catch(COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - - dataObject = null; - } - - return dataObject; - } - - - /// - /// This is used to recursively add a folder from an other project. - /// Note that while we copy the folder content completely, we only - /// add to the project items which are part of the source project. - /// - /// Project reference (from data object) using the format: {Guid}|project|folderPath - /// Node to add the new folder to - protected internal virtual void AddFolderFromOtherProject(string folderToAdd, HierarchyNode targetNode) - { - if(String.IsNullOrEmpty(folderToAdd)) - throw new ArgumentNullException("folderToAdd"); - if(targetNode == null) - throw new ArgumentNullException("targetNode"); - - // Split the reference in its 3 parts - int index1 = Guid.Empty.ToString("B").Length; - if(index1 + 1 >= folderToAdd.Length) - throw new ArgumentOutOfRangeException("folderToAdd"); - - // Get the Guid - string guidString = folderToAdd.Substring(1, index1 - 2); - Guid projectInstanceGuid = new Guid(guidString); - - // Get the project path - int index2 = folderToAdd.IndexOf('|', index1 + 1); - if(index2 < 0 || index2 + 1 >= folderToAdd.Length) - throw new ArgumentOutOfRangeException("folderToAdd"); - - // Finally get the source path - string folder = folderToAdd.Substring(index2 + 1); - - // Get the target path - string folderName = Path.GetFileName(Path.GetDirectoryName(folder)); - string targetPath = Path.Combine(GetBaseDirectoryForAddingFiles(targetNode), folderName); - - // Recursively copy the directory to the new location - Utilities.RecursivelyCopyDirectory(folder, targetPath); - - // Retrieve the project from which the items are being copied - IVsHierarchy sourceHierarchy; - IVsSolution solution = (IVsSolution)GetService(typeof(SVsSolution)); - ErrorHandler.ThrowOnFailure(solution.GetProjectOfGuid(ref projectInstanceGuid, out sourceHierarchy)); - - // Then retrieve the item ID of the item to copy - uint itemID = VSConstants.VSITEMID_ROOT; - ErrorHandler.ThrowOnFailure(sourceHierarchy.ParseCanonicalName(folder, out itemID)); - - // Ensure we don't end up in an endless recursion - if(Utilities.IsSameComObject(this.InteropSafeIVsHierarchy, sourceHierarchy)) - { - HierarchyNode cursorNode = targetNode; - while(cursorNode != null) - { - if(String.Compare(folder, cursorNode.GetMkDocument(), StringComparison.OrdinalIgnoreCase) == 0) - throw new Exception(); - cursorNode = cursorNode.Parent; - } - } - - // Now walk the source project hierarchy to see which node needs to be added. - WalkSourceProjectAndAdd(sourceHierarchy, itemID, targetNode, false); - } - - /// - /// Recursive method that walk a hierarchy and add items it find to our project. - /// Note that this is meant as an helper to the Copy&Paste/Drag&Drop functionality. - /// - /// Hierarchy to walk - /// Item ID where to start walking the hierarchy - /// Node to start adding to - /// Typically false on first call and true after that - protected virtual void WalkSourceProjectAndAdd(IVsHierarchy sourceHierarchy, uint itemId, HierarchyNode targetNode, bool addSiblings) - { - if (sourceHierarchy == null) - { - throw new ArgumentNullException("sourceHierarchy"); - } - - // Before we start the walk, add the current node - object variant = null; - HierarchyNode newNode = targetNode; - if(itemId != VSConstants.VSITEMID_NIL) - { - // Calculate the corresponding path in our project - string source; - ErrorHandler.ThrowOnFailure(((IVsProject)sourceHierarchy).GetMkDocument(itemId, out source)); - string name = Path.GetFileName(source.TrimEnd(new char[] { '/', '\\' })); - string targetPath = Path.Combine(GetBaseDirectoryForAddingFiles(targetNode), name); - - // See if this is a linked item (file can be linked, not folders) - ErrorHandler.ThrowOnFailure(sourceHierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_BrowseObject, out variant), VSConstants.E_NOTIMPL); - VSLangProj.FileProperties fileProperties = variant as VSLangProj.FileProperties; - if(fileProperties != null && fileProperties.IsLink) - { - // Since we don't support linked item, we make a copy of the file into our storage where it would have been linked - File.Copy(source, targetPath, true); - } - - newNode = AddNodeIfTargetExistInStorage(targetNode, name, targetPath); - - - // Start with child nodes (depth first) - variant = null; - ErrorHandler.ThrowOnFailure(sourceHierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_FirstVisibleChild, out variant)); - uint currentItemID = (uint)(int)variant; - WalkSourceProjectAndAdd(sourceHierarchy, currentItemID, newNode, true); - - if(addSiblings) - { - // Then look at siblings - currentItemID = itemId; - while(currentItemID != VSConstants.VSITEMID_NIL) - { - variant = null; - ErrorHandler.ThrowOnFailure(sourceHierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_NextVisibleSibling, out variant)); - currentItemID = (uint)(int)variant; - WalkSourceProjectAndAdd(sourceHierarchy, currentItemID, targetNode, true); - } - } - } - } - - /// - /// Add an existing item (file/folder) to the project if it already exist in our storage. - /// - /// Node to that this item to - /// Name of the item being added - /// Path of the item being added - /// Node that was added - protected virtual HierarchyNode AddNodeIfTargetExistInStorage(HierarchyNode parentNode, string name, string targetPath) - { - if (parentNode == null) - { - return null; - } - - HierarchyNode newNode = parentNode; - // If the file/directory exist, add a node for it - if(File.Exists(targetPath)) - { - VSADDRESULT[] result = new VSADDRESULT[1]; - ErrorHandler.ThrowOnFailure(this.AddItem(parentNode.ID, VSADDITEMOPERATION.VSADDITEMOP_OPENFILE, name, 1, new string[] { targetPath }, IntPtr.Zero, result)); - if(result[0] != VSADDRESULT.ADDRESULT_Success) - throw new Exception(); - newNode = this.FindChild(targetPath); - if(newNode == null) - throw new Exception(); - } - else if(Directory.Exists(targetPath)) - { - newNode = this.CreateFolderNodes(targetPath); - } - return newNode; - } - #endregion - - #region non-virtual methods - /// - /// Handle the Cut operation to the clipboard - /// - protected internal override int CutToClipboard() - { - int returnValue = (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - try - { - this.RegisterClipboardNotifications(true); - - // Create our data object and change the selection to show item(s) being cut - IOleDataObject dataObject = this.PackageSelectionDataObject(true); - if(dataObject != null) - { - this.SourceDraggedOrCutOrCopied = true; - - // Add our cut item(s) to the clipboard - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleSetClipboard(dataObject)); - - // Inform VS (UiHierarchyWindow) of the cut - IVsUIHierWinClipboardHelper clipboardHelper = (IVsUIHierWinClipboardHelper)GetService(typeof(SVsUIHierWinClipboardHelper)); - if(clipboardHelper == null) - { - return VSConstants.E_FAIL; - } - - returnValue = ErrorHandler.ThrowOnFailure(clipboardHelper.Cut(dataObject)); - } - } - catch(COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - returnValue = e.ErrorCode; - } - - return returnValue; - } - - /// - /// Handle the Copy operation to the clipboard - /// - protected internal override int CopyToClipboard() - { - int returnValue = (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - try - { - this.RegisterClipboardNotifications(true); - - // Create our data object and change the selection to show item(s) being copy - IOleDataObject dataObject = this.PackageSelectionDataObject(false); - if(dataObject != null) - { - this.SourceDraggedOrCutOrCopied = true; - - // Add our copy item(s) to the clipboard - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleSetClipboard(dataObject)); - - // Inform VS (UiHierarchyWindow) of the copy - IVsUIHierWinClipboardHelper clipboardHelper = (IVsUIHierWinClipboardHelper)GetService(typeof(SVsUIHierWinClipboardHelper)); - if(clipboardHelper == null) - { - return VSConstants.E_FAIL; - } - returnValue = ErrorHandler.ThrowOnFailure(clipboardHelper.Copy(dataObject)); - } - } - catch(COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - returnValue = e.ErrorCode; - } - catch(ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - returnValue = Marshal.GetHRForException(e); - } - - return returnValue; - } - - /// - /// Handle the Paste operation to a targetNode - /// - protected internal override int PasteFromClipboard(HierarchyNode targetNode) - { - int returnValue = (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - - if (targetNode == null) - { - return VSConstants.E_INVALIDARG; - } - - //Get the clipboardhelper service and use it after processing dataobject - IVsUIHierWinClipboardHelper clipboardHelper = (IVsUIHierWinClipboardHelper)GetService(typeof(SVsUIHierWinClipboardHelper)); - if(clipboardHelper == null) - { - return VSConstants.E_FAIL; - } - - try - { - //Get dataobject from clipboard - IOleDataObject dataObject = null; - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleGetClipboard(out dataObject)); - if(dataObject == null) - { - return VSConstants.E_UNEXPECTED; - } - - DropEffect dropEffect = DropEffect.None; - DropDataType dropDataType = DropDataType.None; - try - { - dropDataType = this.ProcessSelectionDataObject(dataObject, targetNode.GetDragTargetHandlerNode()); - dropEffect = this.QueryDropEffect(dropDataType, 0); - } - catch(ExternalException e) - { - Trace.WriteLine("Exception : " + e.Message); - - // If it is a drop from windows and we get any kind of error ignore it. This - // prevents bogus messages from the shell from being displayed - if(dropDataType != DropDataType.Shell) - { - throw; - } - } - finally - { - // Inform VS (UiHierarchyWindow) of the paste - returnValue = clipboardHelper.Paste(dataObject, (uint)dropEffect); - } - } - catch(COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - - returnValue = e.ErrorCode; - } - - return returnValue; - } - - /// - /// Determines if the paste command should be allowed. - /// - /// - protected internal override bool AllowPasteCommand() - { - IOleDataObject dataObject = null; - try - { - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleGetClipboard(out dataObject)); - if(dataObject == null) - { - return false; - } - - // First see if this is a set of storage based items - FORMATETC format = DragDropHelper.CreateFormatEtc((ushort)DragDropHelper.CF_VSSTGPROJECTITEMS); - if(dataObject.QueryGetData(new FORMATETC[] { format }) == VSConstants.S_OK) - return true; - // Try reference based items - format = DragDropHelper.CreateFormatEtc((ushort)DragDropHelper.CF_VSREFPROJECTITEMS); - if(dataObject.QueryGetData(new FORMATETC[] { format }) == VSConstants.S_OK) - return true; - // Try windows explorer files format - format = DragDropHelper.CreateFormatEtc((ushort)NativeMethods.CF_HDROP); - return (dataObject.QueryGetData(new FORMATETC[] { format }) == VSConstants.S_OK); - } - // We catch External exceptions since it might be that it is not our data on the clipboard. - catch(ExternalException e) - { - Trace.WriteLine("Exception :" + e.Message); - return false; - } - } - - /// - /// Register/Unregister for Clipboard events for the UiHierarchyWindow (solution explorer) - /// - /// true for register, false for unregister - protected internal override void RegisterClipboardNotifications(bool register) - { - // Get the UiHierarchy window clipboard helper service - IVsUIHierWinClipboardHelper clipboardHelper = (IVsUIHierWinClipboardHelper)GetService(typeof(SVsUIHierWinClipboardHelper)); - if(clipboardHelper == null) - { - return; - } - - if(register && this.copyPasteCookie == 0) - { - // Register - ErrorHandler.ThrowOnFailure(clipboardHelper.AdviseClipboardHelperEvents(this.InteropSafeIVsUIHierWinClipboardHelperEvents, out this.copyPasteCookie)); - Debug.Assert(this.copyPasteCookie != 0, "AdviseClipboardHelperEvents returned an invalid cookie"); - } - else if(!register && this.copyPasteCookie != 0) - { - // Unregister - ErrorHandler.ThrowOnFailure(clipboardHelper.UnadviseClipboardHelperEvents(this.copyPasteCookie)); - this.copyPasteCookie = 0; - } - } - - /// - /// Process dataobject from Drag/Drop/Cut/Copy/Paste operation - /// - /// The targetNode is set if the method is called from a drop operation, otherwise it is null - internal DropDataType ProcessSelectionDataObject(IOleDataObject dataObject, HierarchyNode targetNode) - { - DropDataType dropDataType = DropDataType.None; - bool isWindowsFormat = false; - - // Try to get it as a directory based project. - List filesDropped = DragDropHelper.GetDroppedFiles(DragDropHelper.CF_VSSTGPROJECTITEMS, dataObject, out dropDataType); - if(filesDropped.Count == 0) - { - filesDropped = DragDropHelper.GetDroppedFiles(DragDropHelper.CF_VSREFPROJECTITEMS, dataObject, out dropDataType); - } - if(filesDropped.Count == 0) - { - filesDropped = DragDropHelper.GetDroppedFiles(NativeMethods.CF_HDROP, dataObject, out dropDataType); - isWindowsFormat = (filesDropped.Count > 0); - } - - if(dropDataType != DropDataType.None && filesDropped.Count > 0) - { - string[] filesDroppedAsArray = filesDropped.ToArray(); - - HierarchyNode node = (targetNode == null) ? this : targetNode; - - // For directory based projects the content of the clipboard is a double-NULL terminated list of Projref strings. - if(isWindowsFormat) - { - // This is the code path when source is windows explorer - VSADDRESULT[] vsaddresults = new VSADDRESULT[1]; - vsaddresults[0] = VSADDRESULT.ADDRESULT_Failure; - int addResult = AddItem(node.ID, VSADDITEMOPERATION.VSADDITEMOP_OPENFILE, null, (uint)filesDropped.Count, filesDroppedAsArray, IntPtr.Zero, vsaddresults); - if(addResult != VSConstants.S_OK && addResult != VSConstants.S_FALSE && addResult != (int)OleConstants.OLECMDERR_E_CANCELED - && vsaddresults[0] != VSADDRESULT.ADDRESULT_Success) - { - ErrorHandler.ThrowOnFailure(addResult); - } - - return dropDataType; - } - else - { - if(AddFilesFromProjectReferences(node, filesDroppedAsArray)) - { - return dropDataType; - } - } - } - - // If we reached this point then the drop data must be set to None. - // Otherwise the OnPaste will be called with a valid DropData and that would actually delete the item. - return DropDataType.None; - } - - /// - /// Get the dropdatatype from the dataobject - /// - /// The dataobject to be analysed for its format - /// dropdatatype or none if dataobject does not contain known format - internal static DropDataType QueryDropDataType(IOleDataObject pDataObject) - { - if(pDataObject == null) - { - return DropDataType.None; - } - - // known formats include File Drops (as from WindowsExplorer), - // VSProject Reference Items and VSProject Storage Items. - FORMATETC fmt = DragDropHelper.CreateFormatEtc(NativeMethods.CF_HDROP); - - if(DragDropHelper.QueryGetData(pDataObject, ref fmt) == VSConstants.S_OK) - { - return DropDataType.Shell; - } - - fmt.cfFormat = DragDropHelper.CF_VSREFPROJECTITEMS; - if(DragDropHelper.QueryGetData(pDataObject, ref fmt) == VSConstants.S_OK) - { - // Data is from a Ref-based project. - return DropDataType.VsRef; - } - - fmt.cfFormat = DragDropHelper.CF_VSSTGPROJECTITEMS; - if(DragDropHelper.QueryGetData(pDataObject, ref fmt) == VSConstants.S_OK) - { - return DropDataType.VsStg; - } - - return DropDataType.None; - } - - /// - /// Returns the drop effect. - /// - /// - /// // A directory based project should perform as follow: - /// NO MODIFIER - /// - COPY if not from current hierarchy, - /// - MOVE if from current hierarchy - /// SHIFT DRAG - MOVE - /// CTRL DRAG - COPY - /// CTRL-SHIFT DRAG - NO DROP (used for reference based projects only) - /// - internal DropEffect QueryDropEffect(DropDataType dropDataType, uint grfKeyState) - { - //Validate the dropdatatype - if((dropDataType != DropDataType.Shell) && (dropDataType != DropDataType.VsRef) && (dropDataType != DropDataType.VsStg)) - { - return DropEffect.None; - } - - // CTRL-SHIFT - if((grfKeyState & NativeMethods.MK_CONTROL) != 0 && (grfKeyState & NativeMethods.MK_SHIFT) != 0) - { - // Because we are not referenced base, we don't support link - return DropEffect.None; - } - - // CTRL - if((grfKeyState & NativeMethods.MK_CONTROL) != 0) - return DropEffect.Copy; - - // SHIFT - if((grfKeyState & NativeMethods.MK_SHIFT) != 0) - return DropEffect.Move; - - // no modifier - if(this.SourceDraggedOrCutOrCopied) - { - return DropEffect.Move; - } - else - { - return DropEffect.Copy; - } - } - - internal void CleanupSelectionDataObject(bool dropped, bool cut, bool moved) - { - this.CleanupSelectionDataObject(dropped, cut, moved, false); - } - - /// - /// After a drop or paste, will use the dwEffects - /// to determine whether we need to clean up the source nodes or not. If - /// justCleanup is set, it only does the cleanup work. - /// - internal void CleanupSelectionDataObject(bool dropped, bool cut, bool moved, bool justCleanup) - { - if(this.ItemsDraggedOrCutOrCopied == null || this.ItemsDraggedOrCutOrCopied.Count == 0) - { - return; - } - - try - { - IVsUIHierarchyWindow w = UIHierarchyUtilities.GetUIHierarchyWindow(this.site, HierarchyNode.SolutionExplorer); - foreach(HierarchyNode node in this.ItemsDraggedOrCutOrCopied) - { - if((moved && (cut || dropped) && !justCleanup)) - { - // do not close it if the doc is dirty or we do not own it - bool isDirty, isOpen, isOpenedByUs; - uint docCookie; - IVsPersistDocData ppIVsPersistDocData; - DocumentManager manager = node.GetDocumentManager(); - if(manager != null) - { - manager.GetDocInfo(out isOpen, out isDirty, out isOpenedByUs, out docCookie, out ppIVsPersistDocData); - if(isDirty || (isOpen && !isOpenedByUs)) - { - continue; - } - - // close it if opened - if(isOpen) - { - manager.Close(__FRAMECLOSE.FRAMECLOSE_NoSave); - } - } - - node.Remove(true); - } - else if(w != null) - { - ErrorHandler.ThrowOnFailure(w.ExpandItem(this.InteropSafeIVsUIHierarchy, node.ID, EXPANDFLAGS.EXPF_UnCutHighlightItem)); - } - } - } - finally - { - try - { - // Now delete the memory allocated by the packaging of datasources. - // If we just did a cut, or we are told to cleanup, then we need to free the data object. Otherwise, we leave it - // alone so that you can continue to paste the data in new locations. - if(moved || cut || justCleanup) - { - this.ItemsDraggedOrCutOrCopied.Clear(); - this.CleanAndFlushClipboard(); - } - } - finally - { - this.dropDataType = DropDataType.None; - } - } - } - - /// - /// Moves files from one part of our project to another. - /// - /// the targetHandler node - /// List of projectref string - /// true if succeeded - internal bool AddFilesFromProjectReferences(HierarchyNode targetNode, string[] projectReferences) - { - //Validate input - if(projectReferences == null) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "projectReferences"); - } - if(targetNode == null) - { - throw new InvalidOperationException(); - } - - //Iteratively add files from projectref - foreach(string projectReference in projectReferences) - { - if(projectReference == null) - { - // bad projectref, bail out - return false; - } - if(projectReference.EndsWith("/", StringComparison.Ordinal) || projectReference.EndsWith("\\", StringComparison.Ordinal)) - { - AddFolderFromOtherProject(projectReference, targetNode); - } - else if(!AddFileToNodeFromProjectReference(projectReference, targetNode)) - { - return false; - } - } - - return true; - } - - #endregion - - #region private helper methods - /// - /// Empties all the data structures added to the clipboard and flushes the clipboard. - /// - private void CleanAndFlushClipboard() - { - IOleDataObject oleDataObject = null; - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleGetClipboard(out oleDataObject)); - if(oleDataObject == null) - { - return; - } - - - string sourceProjectPath = DragDropHelper.GetSourceProjectPath(oleDataObject); - - if(!String.IsNullOrEmpty(sourceProjectPath) && NativeMethods.IsSamePath(sourceProjectPath, this.GetMkDocument())) - { - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.OleFlushClipboard()); - int clipboardOpened = 0; - try - { - ErrorHandler.ThrowOnFailure(clipboardOpened = UnsafeNativeMethods.OpenClipboard(IntPtr.Zero)); - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.EmptyClipboard()); - } - finally - { - if(clipboardOpened == 1) - { - ErrorHandler.ThrowOnFailure(UnsafeNativeMethods.CloseClipboard()); - } - } - } - } - - private IntPtr PackageSelectionData(StringBuilder sb, bool addEndFormatDelimiter) - { - if(sb == null || sb.ToString().Length == 0 || this.ItemsDraggedOrCutOrCopied.Count == 0) - { - return IntPtr.Zero; - } - - // Double null at end. - if(addEndFormatDelimiter) - { - if(sb.ToString()[sb.Length - 1] != '\0') - { - sb.Append('\0'); - } - } - - // We request unmanaged permission to execute the below. - new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); - - _DROPFILES df = new _DROPFILES(); - int dwSize = Marshal.SizeOf(df); - Int16 wideChar = 0; - int dwChar = Marshal.SizeOf(wideChar); - int structSize = dwSize + ((sb.Length + 1) * dwChar); - IntPtr ptr = Marshal.AllocHGlobal(structSize); - df.pFiles = dwSize; - df.fWide = 1; - IntPtr data = IntPtr.Zero; - try - { - data = UnsafeNativeMethods.GlobalLock(ptr); - Marshal.StructureToPtr(df, data, false); - IntPtr strData = new IntPtr((long)data + dwSize); - DragDropHelper.CopyStringToHGlobal(sb.ToString(), strData, structSize); - } - finally - { - if(data != IntPtr.Zero) - UnsafeNativeMethods.GlobalUnLock(data); - } - - return ptr; - } - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectNode.Events.cs b/source/Archive/MPF/12.0/ProjectNode.Events.cs deleted file mode 100644 index a67c2d93d9..0000000000 --- a/source/Archive/MPF/12.0/ProjectNode.Events.cs +++ /dev/null @@ -1,79 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; - -namespace Microsoft.VisualStudio.Project -{ - public partial class ProjectNode - { - #region fields - private EventHandler projectPropertiesListeners; - #endregion - - #region events - public event EventHandler OnProjectPropertyChanged - { - add { projectPropertiesListeners += value; } - remove { projectPropertiesListeners -= value; } - } - #endregion - - #region methods - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")] - protected void RaiseProjectPropertyChanged(string propertyName, string oldValue, string newValue) - { - if(null != projectPropertiesListeners) - { - projectPropertiesListeners(this, new ProjectPropertyChangedArgs(propertyName, oldValue, newValue)); - } - } - #endregion - } - -} diff --git a/source/Archive/MPF/12.0/ProjectNode.cs b/source/Archive/MPF/12.0/ProjectNode.cs deleted file mode 100644 index 9d94396ff5..0000000000 --- a/source/Archive/MPF/12.0/ProjectNode.cs +++ /dev/null @@ -1,6637 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.CodeDom.Compiler; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; -using System.Text; -using System.Xml; -using EnvDTE; -using Microsoft.Build.BackEnd; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Execution; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; -using IServiceProvider = System.IServiceProvider; -using MSBuild = Microsoft.Build.Evaluation; -using MSBuildConstruction = Microsoft.Build.Construction; -using MSBuildExecution = Microsoft.Build.Execution; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Manages the persistent state of the project (References, options, files, etc.) and deals with user interaction via a GUI in the form a hierarchy. - /// - - [ComVisible(true)] - public abstract partial class ProjectNode : HierarchyNode, - IVsGetCfgProvider, - IVsProject3, - IVsAggregatableProject, - IVsProjectFlavorCfgProvider, - IPersistFileFormat, - IVsProjectBuildSystem, - IVsBuildPropertyStorage, - IVsComponentUser, - IVsDependencyProvider, - IVsSccProject2, - IBuildDependencyUpdate, - IProjectEventsListener, - IProjectEventsProvider, - IReferenceContainerProvider, - IVsProjectSpecialFiles, - IVsProjectUpgrade, - IVsDesignTimeAssemblyResolution, - IVsSetTargetFrameworkWorkerCallback - { - #region nested types - - public enum ImageName - { - OfflineWebApp = 0, - WebReferencesFolder = 1, - OpenReferenceFolder = 2, - ReferenceFolder = 3, - Reference = 4, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SDL")] - SDLWebReference = 5, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "DISCO")] - DISCOWebReference = 6, - Folder = 7, - OpenFolder = 8, - ExcludedFolder = 9, - OpenExcludedFolder = 10, - ExcludedFile = 11, - DependentFile = 12, - MissingFile = 13, - WindowsForm = 14, - WindowsUserControl = 15, - WindowsComponent = 16, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XML")] - XMLSchema = 17, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XML")] - XMLFile = 18, - WebForm = 19, - WebService = 20, - WebUserControl = 21, - WebCustomUserControl = 22, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ASP")] - ASPPage = 23, - GlobalApplicationClass = 24, - WebConfig = 25, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "HTML")] - HTMLPage = 26, - StyleSheet = 27, - ScriptFile = 28, - TextFile = 29, - SettingsFile = 30, - Resources = 31, - Bitmap = 32, - Icon = 33, - Image = 34, - ImageMap = 35, - XWorld = 36, - Audio = 37, - Video = 38, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CAB")] - CAB = 39, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "JAR")] - JAR = 40, - DataEnvironment = 41, - PreviewFile = 42, - DanglingReference = 43, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XSLT")] - XSLTFile = 44, - Cursor = 45, - AppDesignerFolder = 46, - Data = 47, - Application = 48, - DataSet = 49, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "PFX")] - PFX = 50, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SNK")] - SNK = 51, - - ImageLast = 51 - } - - /// - /// Flags for specifying which events to stop triggering. - /// - [Flags] - internal enum EventTriggering - { - TriggerAll = 0, - DoNotTriggerHierarchyEvents = 1, - DoNotTriggerTrackerEvents = 2 - } - - #endregion - - #region constants - /// - /// The user file extension. - /// - internal const string PerUserFileExtension = ".user"; - - private Guid GUID_MruPage = new Guid("{19B97F03-9594-4c1c-BE28-25FF030113B3}"); - - /// - /// The VS command that allows projects to open Windows Explorer to the project directory. - /// - private const VsCommands2K ExploreFolderInWindowsCommand = (VsCommands2K)1635; - - #endregion - - #region fields - - private static readonly FrameworkName DefaultTargetFrameworkMoniker = new FrameworkName(".NETFramework", new Version(4, 0)); - - private static Guid addComponentLastActiveTab = VSConstants.GUID_SolutionPage; - - private static uint addComponentDialogSizeX = 0; - - private static uint addComponentDialogSizeY = 0; - - /// - /// List of output groups names and their associated target - /// - private static KeyValuePair[] outputGroupNames = - { // Name Target (MSBuild) - new KeyValuePair("Built", "BuiltProjectOutputGroup"), - new KeyValuePair("ContentFiles", "ContentFilesProjectOutputGroup"), - new KeyValuePair("LocalizedResourceDlls", "SatelliteDllsProjectOutputGroup"), - new KeyValuePair("Documentation", "DocumentationProjectOutputGroup"), - new KeyValuePair("Symbols", "DebugSymbolsProjectOutputGroup"), - new KeyValuePair("SourceFiles", "SourceFilesProjectOutputGroup"), - new KeyValuePair("XmlSerializer", "SGenFilesOutputGroup"), - }; - - /// A project will only try to build if it can obtain a lock on this object - private volatile static object BuildLock = new object(); - - /// Maps integer ids to project item instances - private EventSinkCollection itemIdMap = new EventSinkCollection(); - - /// A service provider call back object provided by the IDE hosting the project manager - private ServiceProvider site; - - public static ServiceProvider ServiceProvider { get; set; } - - private TrackDocumentsHelper tracker; - - /// - /// A cached copy of project options. - /// - private ProjectOptions options; - - /// - /// This property returns the time of the last change made to this project. - /// It is not the time of the last change on the project file, but actually of - /// the in memory project settings. In other words, it is the last time that - /// SetProjectDirty was called. - /// - private DateTime lastModifiedTime; - - /// - /// MSBuild engine we are going to use - /// - private MSBuild.ProjectCollection buildEngine; - - private Microsoft.Build.Utilities.Logger buildLogger; - - private bool useProvidedLogger; - - private MSBuild.Project buildProject; - - private MSBuildExecution.ProjectInstance currentConfig; - - private DesignTimeAssemblyResolution designTimeAssemblyResolution; - - private ConfigProvider configProvider; - - private TaskProvider taskProvider; - - private string filename; - - private Microsoft.VisualStudio.Shell.Url baseUri; - - private bool isDirty; - - private bool isNewProject; - - private bool projectOpened; - - private bool buildIsPrepared; - - private ImageHandler imageHandler; - - private string errorString; - - private string warningString; - - private Guid projectIdGuid; - - private bool isClosed; - - private EventTriggering eventTriggeringFlag = EventTriggering.TriggerAll; - - private bool invokeMSBuildWhenResumed; - - private uint suspendMSBuildCounter; - - private bool canFileNodesHaveChilds; - - private bool isProjectEventsListener = true; - - /// - /// The build dependency list passed to IVsDependencyProvider::EnumDependencies - /// - private List buildDependencyList = new List(); - - /// - /// Defines if Project System supports Project Designer - /// - private bool supportsProjectDesigner; - - private bool showProjectInSolutionPage = true; - - private bool buildInProcess; - - /// - /// Field for determining whether sourcecontrol should be disabled. - /// - private bool disableScc; - - private string sccProjectName; - - private string sccLocalPath; - - private string sccAuxPath; - - private string sccProvider; - - /// - /// Flag for controling how many times we register with the Scc manager. - /// - private bool isRegisteredWithScc; - - /// - /// Flag for controling query edit should communicate with the scc manager. - /// - private bool disableQueryEdit; - - /// - /// Control if command with potential destructive behavior such as delete should - /// be enabled for nodes of this project. - /// - private bool canProjectDeleteItems; - - /// - /// Token processor used by the project sample. - /// - private TokenProcessor tokenProcessor; - - /// - /// Member to store output base relative path. Used by OutputBaseRelativePath property - /// - private string outputBaseRelativePath = "bin"; - - private IProjectEvents projectEventsProvider; - - /// - /// Used for flavoring to hold the XML fragments - /// - private XmlDocument xmlFragments; - - /// - /// Used to map types to CATID. This provide a generic way for us to do this - /// and make it simpler for a project to provide it's CATIDs for the different type of objects - /// for which it wants to support extensibility. This also enables us to have multiple - /// type mapping to the same CATID if we choose to. - /// - private Dictionary catidMapping = new Dictionary(); - - /// - /// The internal package implementation. - /// - private ProjectPackage package; - - // Has the object been disposed. - private bool isDisposed; - #endregion - - #region abstract properties - /// - /// This Guid must match the Guid you registered under - /// HKLM\Software\Microsoft\VisualStudio\%version%\Projects. - /// Among other things, the Project framework uses this - /// guid to find your project and item templates. - /// - public abstract Guid ProjectGuid - { - get; - } - - /// - /// Returns a caption for VSHPROPID_TypeName. - /// - /// - public abstract string ProjectType - { - get; - } - #endregion - - #region virtual properties - /// - /// This is the project instance guid that is peristed in the project file - /// - [System.ComponentModel.BrowsableAttribute(false)] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ID")] - public virtual Guid ProjectIDGuid - { - get - { - return this.projectIdGuid; - } - set - { - if (this.projectIdGuid != value) - { - this.projectIdGuid = value; - if (this.buildProject != null) - { - this.SetProjectProperty("ProjectGuid", this.projectIdGuid.ToString("B")); - } - } - } - } - #endregion - - #region properties - - #region overridden properties - public override int MenuCommandId - { - get - { - return VsMenus.IDM_VS_CTXT_PROJNODE; - } - } - - public override string Url - { - get - { - return this.GetMkDocument(); - } - } - - public override string Caption - { - get - { - // Default to file name - string caption = this.buildProject.FullPath; - if (String.IsNullOrEmpty(caption)) - { - if (this.buildProject.GetProperty(ProjectFileConstants.Name) != null) - { - caption = this.buildProject.GetProperty(ProjectFileConstants.Name).EvaluatedValue; - if (caption == null || caption.Length == 0) - { - caption = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - } - } - } - else - { - caption = Path.GetFileNameWithoutExtension(caption); - } - - return caption; - } - } - - public override Guid ItemTypeGuid - { - get - { - return this.ProjectGuid; - } - } - - public override int ImageIndex - { - get - { - return (int)ProjectNode.ImageName.Application; - } - } - - - #endregion - - #region virtual properties - - public virtual string ErrorString - { - get - { - if (this.errorString == null) - { - this.errorString = SR.GetString(SR.Error, CultureInfo.CurrentUICulture); - } - - return this.errorString; - } - } - - public virtual string WarningString - { - get - { - if (this.warningString == null) - { - this.warningString = SR.GetString(SR.Warning, CultureInfo.CurrentUICulture); - } - - return this.warningString; - } - } - - /// - /// The target name that will be used for evaluating the project file (i.e., pseudo-builds). - /// This target is used to trigger a build with when the project system changes. - /// Example: The language projrcts are triggering a build with the Compile target whenever - /// the project system changes. - /// - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ReEvaluate")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Re")] - protected internal virtual string ReEvaluateProjectFileTargetName - { - get - { - return null; - } - } - - /// - /// This is the object that will be returned by EnvDTE.Project.Object for this project - /// - protected internal virtual object ProjectObject - { - get - { - return null; - } - } - - /// - /// Override this property to specify when the project file is dirty. - /// - protected virtual bool IsProjectFileDirty - { - get - { - string document = this.GetMkDocument(); - - if (String.IsNullOrEmpty(document)) - { - return this.isDirty; - } - - return (this.isDirty || !File.Exists(document)); - } - } - - /// - /// True if the project uses the Project Designer Editor instead of the property page frame to edit project properties. - /// - protected virtual bool SupportsProjectDesigner - { - get - { - return this.supportsProjectDesigner; - } - set - { - this.supportsProjectDesigner = value; - } - - } - - protected virtual Guid ProjectDesignerEditor - { - get - { - return VSConstants.GUID_ProjectDesignerEditor; - } - } - - /// - /// Defines the flag that supports the VSHPROPID.ShowProjInSolutionPage - /// - protected virtual bool ShowProjectInSolutionPage - { - get - { - return this.showProjectInSolutionPage; - } - set - { - this.showProjectInSolutionPage = value; - } - } - - #endregion - - /// - /// Gets or sets the ability of a project filenode to have child nodes (sub items). - /// Example would be C#/VB forms having resx and designer files. - /// - protected internal bool CanFileNodesHaveChilds - { - get - { - return canFileNodesHaveChilds; - } - set - { - canFileNodesHaveChilds = value; - } - } - - /// - /// Get and set the Token processor. - /// - public TokenProcessor FileTemplateProcessor - { - get - { - if (tokenProcessor == null) - tokenProcessor = new TokenProcessor(); - return tokenProcessor; - } - set - { - tokenProcessor = value; - } - } - - /// - /// Gets a service provider object provided by the IDE hosting the project - /// - [SuppressMessage("Microsoft.Naming", "CA1721:PropertyNamesShouldNotMatchGetMethods")] - public IServiceProvider Site - { - get - { - return this.site; - } - } - - /// - /// Gets an ImageHandler for the project node. - /// - public ImageHandler ImageHandler - { - get - { - if (null == imageHandler) - { - imageHandler = new ImageHandler(typeof(ProjectNode).Assembly.GetManifestResourceStream("Microsoft.VisualStudio.Project.Resources.imagelis.bmp")); - } - return imageHandler; - } - } - - /// - /// This property returns the time of the last change made to this project. - /// It is not the time of the last change on the project file, but actually of - /// the in memory project settings. In other words, it is the last time that - /// SetProjectDirty was called. - /// - public DateTime LastModifiedTime - { - get - { - return this.lastModifiedTime; - } - } - - /// - /// Determines whether this project is a new project. - /// - public bool IsNewProject - { - get - { - return this.isNewProject; - } - } - - /// - /// Gets the path to the folder containing the project. - /// - public string ProjectFolder - { - get - { - return Path.GetDirectoryName(this.filename); - } - } - - /// - /// Gets or sets the project filename. - /// - public string ProjectFile - { - get - { - return Path.GetFileName(this.filename); - } - set - { - this.SetEditLabel(value); - } - } - - /// - /// Gets the Base Uniform Resource Identifier (URI). - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URI")] - public Microsoft.VisualStudio.Shell.Url BaseURI - { - get - { - if (baseUri == null && this.buildProject != null) - { - string path = System.IO.Path.GetDirectoryName(this.buildProject.FullPath); - // Uri/Url behave differently when you have trailing slash and when you dont - if (!path.EndsWith("\\", StringComparison.Ordinal) && !path.EndsWith("/", StringComparison.Ordinal)) - path += "\\"; - baseUri = new Url(path); - } - - Debug.Assert(baseUri != null, "Base URL should not be null. Did you call BaseURI before loading the project?"); - return baseUri; - } - } - - /// - /// Gets whether or not the project is closed. - /// - public bool IsClosed - { - get - { - return this.isClosed; - } - } - - /// - /// Gets whether or not the project is being built. - /// - public bool BuildInProgress - { - get - { - return buildInProcess; - } - } - - /// - /// Gets or set the relative path to the folder containing the project ouput. - /// - public virtual string OutputBaseRelativePath - { - get - { - return this.outputBaseRelativePath; - } - set - { - if (Path.IsPathRooted(value)) - { - throw new ArgumentException("Path must not be rooted."); - } - - this.outputBaseRelativePath = value; - } - } - - public FrameworkName TargetFrameworkMoniker - { - get - { - if (this.options == null) - { - GetProjectOptions(); - } - if (this.options != null) - { - return this.options.TargetFrameworkMoniker ?? DefaultTargetFrameworkMoniker; - } - else - { - return DefaultTargetFrameworkMoniker; - } - } - - set - { - if (this.options == null) - { - GetProjectOptions(); - } - - if (value == null) - { - value = DefaultTargetFrameworkMoniker; - } - - if (this.options.TargetFrameworkMoniker != value) - { - this.OnTargetFrameworkMonikerChanged(this.options, this.options.TargetFrameworkMoniker, value); - } - } - } - - /// - /// Version of this node as an IVsHierarchy that can be safely passed to native code from a background thread. - /// - public IVsHierarchy InteropSafeIVsHierarchy - { - get; - protected set; - } - - /// - /// Version of this node as an IVsUIHierarchy that can be safely passed to native code from a background thread. - /// - public IVsUIHierarchy InteropSafeIVsUIHierarchy - { - get; - protected set; - } - - /// - /// Version of this node as an IVsProject3 that can be safely passed to native code from a background thread. - /// - public IVsProject3 InteropSafeIVsProject3 - { - get; - protected set; - } - - /// - /// Version of this node as an IVsSccProject2 that can be safely passed to native code from a background thread. - /// - public IVsSccProject2 InteropSafeIVsSccProject2 - { - get; - protected set; - } - - /// - /// Version of this node as an IVsUIHierWinClipboardHelperEvents that can be safely passed to native code from a background thread. - /// - public IVsUIHierWinClipboardHelperEvents InteropSafeIVsUIHierWinClipboardHelperEvents - { - get; - protected set; - } - - public IVsComponentUser InteropSafeIVsComponentUser - { - get; - protected set; - } - - /// - /// Gets or sets the flag whether query edit should communicate with the scc manager. - /// - protected bool DisableQueryEdit - { - get - { - return this.disableQueryEdit; - } - set - { - this.disableQueryEdit = value; - } - } - - /// - /// Gets a collection of integer ids that maps to project item instances - /// - internal EventSinkCollection ItemIdMap - { - get - { - return this.itemIdMap; - } - } - - /// - /// Get the helper object that track document changes. - /// - internal TrackDocumentsHelper Tracker - { - get - { - return this.tracker; - } - } - - /// - /// Gets or sets the build logger. - /// - protected Microsoft.Build.Utilities.Logger BuildLogger - { - get - { - return this.buildLogger; - } - set - { - this.buildLogger = value; - this.useProvidedLogger = true; - } - } - - /// - /// Gets the taskprovider. - /// - protected TaskProvider TaskProvider - { - get - { - return this.taskProvider; - } - } - - /// - /// Gets the project file name. - /// - protected string FileName - { - get - { - return this.filename; - } - } - - protected bool IsIdeInCommandLineMode - { - get - { - bool cmdline = false; - var shell = this.site.GetService(typeof(SVsShell)) as IVsShell; - if (shell != null) - { - object obj; - Marshal.ThrowExceptionForHR(shell.GetProperty((int)__VSSPROPID.VSSPROPID_IsInCommandLineMode, out obj)); - cmdline = (bool)obj; - } - return cmdline; - } - } - - /// - /// Gets the configuration provider. - /// - protected ConfigProvider ConfigProvider - { - get - { - if (this.configProvider == null) - { - this.configProvider = CreateConfigProvider(); - } - - return this.configProvider; - } - } - - /// - /// Gets or sets whether or not source code control is disabled for this project. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - protected bool IsSccDisabled - { - get - { - return this.disableScc; - } - set - { - this.disableScc = value; - } - } - - /// - /// Gets or set whether items can be deleted for this project. - /// Enabling this feature can have the potential destructive behavior such as deleting files from disk. - /// - protected internal bool CanProjectDeleteItems - { - get - { - return canProjectDeleteItems; - } - set - { - canProjectDeleteItems = value; - } - } - - /// - /// Determines whether the project was fully opened. This is set when the OnAfterOpenProject has triggered. - /// - protected internal bool HasProjectOpened - { - get - { - return this.projectOpened; - } - } - - /// - /// Gets or sets event triggering flags. - /// - internal EventTriggering EventTriggeringFlag - { - get - { - return this.eventTriggeringFlag; - } - set - { - this.eventTriggeringFlag = value; - } - } - - /// - /// Defines the build project that has loaded the project file. - /// - protected internal MSBuild.Project BuildProject - { - get - { - return this.buildProject; - } - set - { - SetBuildProject(value); - } - } - - /// - /// Gets the current config. - /// - /// The current config. - protected internal Microsoft.Build.Execution.ProjectInstance CurrentConfig - { - get { return this.currentConfig; } - } - - /// - /// Defines the build engine that is used to build the project file. - /// - internal MSBuild.ProjectCollection BuildEngine - { - get - { - return this.buildEngine; - } - set - { - this.buildEngine = value; - } - } - - /// - /// The internal package implementation. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal ProjectPackage Package - { - get - { - return this.package; - } - set - { - this.package = value; - } - } - #endregion - - #region ctor - - protected ProjectNode() - { - this.Initialize(); - } - #endregion - - #region overridden methods - protected override NodeProperties CreatePropertiesObject() - { - return new ProjectNodeProperties(this); - } - - /// - /// Sets the properties for the project node. - /// - /// Identifier of the hierarchy property. For a list of propid values, - /// The value to set. - /// A success or failure value. - public override int SetProperty(int propid, object value) - { - __VSHPROPID id = (__VSHPROPID)propid; - - switch (id) - { - case __VSHPROPID.VSHPROPID_ShowProjInSolutionPage: - this.ShowProjectInSolutionPage = (bool)value; - return VSConstants.S_OK; - } - - return base.SetProperty(propid, value); - } - - /// - /// Renames the project node. - /// - /// The new name - /// A success or failure value. - public override int SetEditLabel(string label) - { - // Validate the filename. - if (String.IsNullOrEmpty(label)) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture)); - } - else if (this.ProjectFolder.Length + label.Length + 1 > NativeMethods.MAX_PATH) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), label)); - } - else if (Utilities.IsFileNameInvalid(label)) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture)); - } - - string fileName = Path.GetFileNameWithoutExtension(label); - - // if there is no filename or it starts with a leading dot issue an error message and quit. - if (String.IsNullOrEmpty(fileName) || fileName[0] == '.') - { - throw new InvalidOperationException(SR.GetString(SR.FileNameCannotContainALeadingPeriod, CultureInfo.CurrentUICulture)); - } - - // Nothing to do if the name is the same - string oldFileName = Path.GetFileNameWithoutExtension(this.Url); - if (String.Compare(oldFileName, label, StringComparison.Ordinal) == 0) - { - return VSConstants.S_FALSE; - } - - // Now check whether the original file is still there. It could have been renamed. - if (!File.Exists(this.Url)) - { - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileOrFolderCannotBeFound, CultureInfo.CurrentUICulture), this.ProjectFile)); - } - - // Get the full file name and then rename the project file. - string newFile = Path.Combine(this.ProjectFolder, label); - string extension = Path.GetExtension(this.Url); - - // Make sure it has the correct extension - if (String.Compare(Path.GetExtension(newFile), extension, StringComparison.OrdinalIgnoreCase) != 0) - { - newFile += extension; - } - - this.RenameProjectFile(newFile); - return VSConstants.S_OK; - } - - /// - /// Gets the automation object for the project node. - /// - /// An instance of an EnvDTE.Project implementation object representing the automation object for the project. - public override object GetAutomationObject() - { - return new Automation.OAProject(this); - } - - /// - /// Closes the project node. - /// - /// A success or failure value. - public override int Close() - { - int hr = VSConstants.S_OK; - try - { - // Walk the tree and close all nodes. - // This has to be done before the project closes, since we want still state available for the ProjectMgr on the nodes - // when nodes are closing. - try - { - CloseAllNodes(this); - } - finally - { - this.Dispose(true); - } - } - catch (COMException e) - { - hr = e.ErrorCode; - } - finally - { - ErrorHandler.ThrowOnFailure(base.Close()); - } - - this.isClosed = true; - - return hr; - } - - /// - /// Sets the service provider from which to access the services. - /// - /// An instance to an Microsoft.VisualStudio.OLE.Interop object - /// A success or failure value. - public override int SetSite(Microsoft.VisualStudio.OLE.Interop.IServiceProvider site) - { - CCITracing.TraceCall(); - this.site = new ServiceProvider(site); - ServiceProvider = this.site; - - if (taskProvider != null) - { - taskProvider.Dispose(); - } - taskProvider = new TaskProvider(this.site); - - return VSConstants.S_OK; - } - - /// - /// Gets the properties of the project node. - /// - /// The __VSHPROPID of the property. - /// A property dependent value. See: for details. - public override object GetProperty(int propId) - { - switch ((__VSHPROPID)propId) - { - case __VSHPROPID.VSHPROPID_ConfigurationProvider: - return this.ConfigProvider; - - case __VSHPROPID.VSHPROPID_ProjectName: - return this.Caption; - - case __VSHPROPID.VSHPROPID_ProjectDir: - return this.ProjectFolder; - - case __VSHPROPID.VSHPROPID_TypeName: - return this.ProjectType; - - case __VSHPROPID.VSHPROPID_ShowProjInSolutionPage: - return this.ShowProjectInSolutionPage; - - case __VSHPROPID.VSHPROPID_ExpandByDefault: - return true; - - // Use the same icon as if the folder was closed - case __VSHPROPID.VSHPROPID_OpenFolderIconIndex: - return GetProperty((int)__VSHPROPID.VSHPROPID_IconIndex); - } - - switch ((__VSHPROPID2)propId) - { - case __VSHPROPID2.VSHPROPID_SupportsProjectDesigner: - return this.SupportsProjectDesigner; - - case __VSHPROPID2.VSHPROPID_PropertyPagesCLSIDList: - return Utilities.CreateSemicolonDelimitedListOfStringFromGuids(this.GetConfigurationIndependentPropertyPages()); - - case __VSHPROPID2.VSHPROPID_CfgPropertyPagesCLSIDList: - return Utilities.CreateSemicolonDelimitedListOfStringFromGuids(this.GetConfigurationDependentPropertyPages()); - - case __VSHPROPID2.VSHPROPID_PriorityPropertyPagesCLSIDList: - return Utilities.CreateSemicolonDelimitedListOfStringFromGuids(this.GetPriorityProjectDesignerPages()); - - case __VSHPROPID2.VSHPROPID_Container: - return true; - default: - break; - } - - return base.GetProperty(propId); - } - - /// - /// Gets the GUID value of the node. - /// - /// A __VSHPROPID or __VSHPROPID2 value of the guid property - /// The guid to return for the property. - /// A success or failure value. - public override int GetGuidProperty(int propid, out Guid guid) - { - guid = Guid.Empty; - if ((__VSHPROPID)propid == __VSHPROPID.VSHPROPID_ProjectIDGuid) - { - guid = this.ProjectIDGuid; - } - else if (propid == (int)__VSHPROPID.VSHPROPID_CmdUIGuid) - { - guid = this.ProjectGuid; - } - else if ((__VSHPROPID2)propid == __VSHPROPID2.VSHPROPID_ProjectDesignerEditor && this.SupportsProjectDesigner) - { - guid = this.ProjectDesignerEditor; - } - else - { - base.GetGuidProperty(propid, out guid); - } - - if (guid.CompareTo(Guid.Empty) == 0) - { - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - - return VSConstants.S_OK; - } - - /// - /// Sets Guid properties for the project node. - /// - /// A __VSHPROPID or __VSHPROPID2 value of the guid property - /// The guid value to set. - /// A success or failure value. - public override int SetGuidProperty(int propid, ref Guid guid) - { - switch ((__VSHPROPID)propid) - { - case __VSHPROPID.VSHPROPID_ProjectIDGuid: - this.ProjectIDGuid = guid; - return VSConstants.S_OK; - } - CCITracing.TraceCall(String.Format(CultureInfo.CurrentCulture, "Property {0} not found", propid)); - return VSConstants.DISP_E_MEMBERNOTFOUND; - } - - /// - /// Removes items from the hierarchy. - /// - /// Project overwrites this. - public override void Remove(bool removeFromStorage) - { - // the project will not be deleted from disk, just removed - if (removeFromStorage) - { - return; - } - - // Remove the entire project from the solution - IVsSolution solution = this.Site.GetService(typeof(SVsSolution)) as IVsSolution; - uint iOption = 1; // SLNSAVEOPT_PromptSave - ErrorHandler.ThrowOnFailure(solution.CloseSolutionElement(iOption, this.InteropSafeIVsHierarchy, 0)); - } - - /// - /// Gets the moniker for the project node. That is the full path of the project file. - /// - /// The moniker for the project file. - public override string GetMkDocument() - { - Debug.Assert(!String.IsNullOrEmpty(this.filename)); - Debug.Assert(this.BaseURI != null && !String.IsNullOrEmpty(this.BaseURI.AbsoluteUrl)); - return Path.Combine(this.BaseURI.AbsoluteUrl, this.filename); - } - - /// - /// Disposes the project node object. - /// - /// Flag determining ehether it was deterministic or non deterministic clean up. - protected override void Dispose(bool disposing) - { - if (this.isDisposed) - { - return; - } - - try - { - try - { - this.UnRegisterProject(); - } - finally - { - try - { - this.RegisterClipboardNotifications(false); - } - finally - { - try - { - if (this.projectEventsProvider != null) - { - this.projectEventsProvider.AfterProjectFileOpened -= this.OnAfterProjectOpen; - } - if (this.taskProvider != null) - { - taskProvider.Tasks.Clear(); - this.taskProvider.Dispose(); - this.taskProvider = null; - } - - if (this.buildLogger != null) - { - this.buildLogger.Shutdown(); - buildLogger = null; - } - - if (this.site != null) - { - this.site.Dispose(); - } - } - finally - { - this.buildEngine = null; - } - } - } - - if (this.buildProject != null) - { - this.buildProject.ProjectCollection.UnloadProject(this.buildProject); - this.buildProject.ProjectCollection.UnloadProject(this.buildProject.Xml); - this.buildProject = null; - } - - if (null != imageHandler) - { - imageHandler.Close(); - imageHandler = null; - } - } - finally - { - base.Dispose(disposing); - this.isDisposed = true; - } - } - - /// - /// Handles command status on the project node. If a command cannot be handled then the base should be called. - /// - /// A unique identifier of the command group. The pguidCmdGroup parameter can be NULL to specify the standard group. - /// The command to query status for. - /// Pointer to an OLECMDTEXT structure in which to return the name and/or status information of a single command. Can be NULL to indicate that the caller does not require this information. - /// An out parameter specifying the QueryStatusResult of the command. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if (cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch ((VsCommands)cmd) - { - case VsCommands.Copy: - case VsCommands.Paste: - case VsCommands.Cut: - case VsCommands.Rename: - case VsCommands.Exit: - case VsCommands.ProjectSettings: - case VsCommands.BuildSln: - case VsCommands.UnloadProject: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - - case VsCommands.ViewForm: - if (this.HasDesigner) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - break; - - case VsCommands.CancelBuild: - result |= QueryStatusResult.SUPPORTED; - if (this.buildInProcess) - result |= QueryStatusResult.ENABLED; - else - result |= QueryStatusResult.INVISIBLE; - return VSConstants.S_OK; - - case VsCommands.NewFolder: - case VsCommands.AddNewItem: - case VsCommands.AddExistingItem: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - - case VsCommands.SetStartupProject: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - - switch ((VsCommands2K)cmd) - { - case VsCommands2K.ADDREFERENCE: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - - case VsCommands2K.EXCLUDEFROMPROJECT: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.INVISIBLE; - return VSConstants.S_OK; - - case ExploreFolderInWindowsCommand: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - /// - /// Handles command execution. - /// - /// Unique identifier of the command group - /// The command to be executed. - /// Values describe how the object should execute the command. - /// Pointer to a VARIANTARG structure containing input arguments. Can be NULL - /// VARIANTARG structure to receive command output. Can be NULL. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - protected override int ExecCommandOnNode(Guid cmdGroup, uint cmd, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) - { - if (cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch ((VsCommands)cmd) - { - - case VsCommands.UnloadProject: - return this.UnloadProject(); - case VsCommands.CleanSel: - case VsCommands.CleanCtx: - return this.CleanProject(); - } - } - else if (cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch ((VsCommands2K)cmd) - { - case VsCommands2K.ADDREFERENCE: - return this.AddProjectReference(); - - case VsCommands2K.ADDWEBREFERENCE: - case VsCommands2K.ADDWEBREFERENCECTX: - return this.AddWebReference(); - - case ExploreFolderInWindowsCommand: - string explorerPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"); - System.Diagnostics.Process.Start(explorerPath, this.ProjectFolder); - return VSConstants.S_OK; - } - } - - return base.ExecCommandOnNode(cmdGroup, cmd, nCmdexecopt, pvaIn, pvaOut); - } - - /// - /// Get the boolean value for the deletion of a project item - /// - /// A flag that specifies the type of delete operation (delete from storage or remove from project) - /// true if item can be deleted from project - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - if (deleteOperation == __VSDELETEITEMOPERATION.DELITEMOP_RemoveFromProject) - { - return true; - } - return false; - } - - /// - /// Returns a specific Document manager to handle opening and closing of the Project(Application) Designer if projectdesigner is supported. - /// - /// Document manager object - protected internal override DocumentManager GetDocumentManager() - { - if (this.SupportsProjectDesigner) - { - return new ProjectDesignerDocumentManager(this); - } - return null; - } - - #endregion - - #region virtual methods - - /// - /// Executes a wizard. - /// - /// The node to which the wizard should add item(s). - /// The name of the file that the user typed in. - /// The name of the wizard to run. - /// The owner of the dialog box. - /// A VSADDRESULT enum value describing success or failure. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily"), SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "dlg")] - public virtual VSADDRESULT RunWizard(HierarchyNode parentNode, string itemName, string wizardToRun, IntPtr dlgOwner) - { - Debug.Assert(!String.IsNullOrEmpty(itemName), "The Add item dialog was passing in a null or empty item to be added to the hierrachy."); - Debug.Assert(!String.IsNullOrEmpty(this.ProjectFolder), "The Project Folder is not specified for this project."); - - if (parentNode == null) - { - throw new ArgumentNullException("parentNode"); - } - - if (String.IsNullOrEmpty(itemName)) - { - throw new ArgumentNullException("itemName"); - } - - // We just validate for length, since we assume other validation has been performed by the dlgOwner. - if (this.ProjectFolder.Length + itemName.Length + 1 > NativeMethods.MAX_PATH) - { - string errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), itemName); - if (!Utilities.IsInAutomationFunction(this.Site)) - { - string title = null; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, errorMessage, icon, buttons, defaultButton); - return VSADDRESULT.ADDRESULT_Failure; - } - else - { - throw new InvalidOperationException(errorMessage); - } - } - - - // Build up the ContextParams safearray - // [0] = Wizard type guid (bstr) - // [1] = Project name (bstr) - // [2] = ProjectItems collection (bstr) - // [3] = Local Directory (bstr) - // [4] = Filename the user typed (bstr) - // [5] = Product install Directory (bstr) - // [6] = Run silent (bool) - - object[] contextParams = new object[7]; - contextParams[0] = EnvDTE.Constants.vsWizardAddItem; - contextParams[1] = this.Caption; - object automationObject = parentNode.GetAutomationObject(); - if (automationObject is EnvDTE.Project) - { - EnvDTE.Project project = (EnvDTE.Project)automationObject; - contextParams[2] = project.ProjectItems; - } - else - { - // This would normally be a folder unless it is an item with subitems - EnvDTE.ProjectItem item = (EnvDTE.ProjectItem)automationObject; - contextParams[2] = item.ProjectItems; - } - - contextParams[3] = this.ProjectFolder; - - contextParams[4] = itemName; - - object objInstallationDir = null; - IVsShell shell = (IVsShell)this.GetService(typeof(IVsShell)); - ErrorHandler.ThrowOnFailure(shell.GetProperty((int)__VSSPROPID.VSSPROPID_InstallDirectory, out objInstallationDir)); - string installDir = (string)objInstallationDir; - - // append a '\' to the install dir to mimic what the shell does (though it doesn't add one to destination dir) - if (!installDir.EndsWith("\\", StringComparison.Ordinal)) - { - installDir += "\\"; - } - - contextParams[5] = installDir; - - contextParams[6] = true; - - IVsExtensibility3 ivsExtensibility = this.GetService(typeof(IVsExtensibility)) as IVsExtensibility3; - Debug.Assert(ivsExtensibility != null, "Failed to get IVsExtensibility3 service"); - if (ivsExtensibility == null) - { - return VSADDRESULT.ADDRESULT_Failure; - } - - // Determine if we have the trust to run this wizard. - IVsDetermineWizardTrust wizardTrust = this.GetService(typeof(SVsDetermineWizardTrust)) as IVsDetermineWizardTrust; - if (wizardTrust != null) - { - Guid guidProjectAdding = Guid.Empty; - ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardInitiated(wizardToRun, ref guidProjectAdding)); - } - - int wizResultAsInt; - try - { - Array contextParamsAsArray = contextParams; - - int result = ivsExtensibility.RunWizardFile(wizardToRun, (int)dlgOwner, ref contextParamsAsArray, out wizResultAsInt); - - if (!ErrorHandler.Succeeded(result) && result != VSConstants.OLE_E_PROMPTSAVECANCELLED) - { - ErrorHandler.ThrowOnFailure(result); - } - } - finally - { - if (wizardTrust != null) - { - ErrorHandler.ThrowOnFailure(wizardTrust.OnWizardCompleted()); - } - } - - EnvDTE.wizardResult wizardResult = (EnvDTE.wizardResult)wizResultAsInt; - - switch (wizardResult) - { - default: - return VSADDRESULT.ADDRESULT_Cancel; - case wizardResult.wizardResultSuccess: - return VSADDRESULT.ADDRESULT_Success; - case wizardResult.wizardResultFailure: - return VSADDRESULT.ADDRESULT_Failure; - } - } - - /// - /// Override this method if you want to modify the behavior of the Add Reference dialog - /// By example you could change which pages are visible and which is visible by default. - /// - /// - public virtual int AddProjectReference() - { - CCITracing.TraceCall(); - - IVsComponentSelectorDlg4 componentDialog; - string strBrowseLocations = Path.GetDirectoryName(this.BaseURI.Uri.LocalPath); - var tabInitList = new List() - { - new VSCOMPONENTSELECTORTABINIT { - guidTab = VSConstants.GUID_COMPlusPage, - varTabInitInfo = GetComponentPickerDirectories(), - }, - new VSCOMPONENTSELECTORTABINIT { - guidTab = VSConstants.GUID_COMClassicPage, - }, - new VSCOMPONENTSELECTORTABINIT { - // Tell the Add Reference dialog to call hierarchies GetProperty with the following - // propID to enablefiltering out ourself from the Project to Project reference - varTabInitInfo = (int)__VSHPROPID.VSHPROPID_ShowProjInSolutionPage, - guidTab = VSConstants.GUID_SolutionPage, - }, - // Add the Browse for file page - new VSCOMPONENTSELECTORTABINIT { - varTabInitInfo = 0, - guidTab = VSConstants.GUID_BrowseFilePage, - }, - new VSCOMPONENTSELECTORTABINIT { - guidTab = GUID_MruPage, - }, - }; - tabInitList.ForEach(tab => tab.dwSize = (uint)Marshal.SizeOf(typeof(VSCOMPONENTSELECTORTABINIT))); - - componentDialog = this.GetService(typeof(IVsComponentSelectorDlg)) as IVsComponentSelectorDlg4; - try - { - // call the container to open the add reference dialog. - if (componentDialog != null) - { - // Let the project know not to show itself in the Add Project Reference Dialog page - this.ShowProjectInSolutionPage = false; - // call the container to open the add reference dialog. - string browseFilters = "Component Files (*.exe;*.dll)\0*.exe;*.dll\0"; - ErrorHandler.ThrowOnFailure(componentDialog.ComponentSelectorDlg5( - (System.UInt32)(__VSCOMPSELFLAGS.VSCOMSEL_MultiSelectMode | __VSCOMPSELFLAGS.VSCOMSEL_IgnoreMachineName), - this.InteropSafeIVsComponentUser, - 0, - null, - SR.GetString(SR.AddReferenceDialogTitle, CultureInfo.CurrentUICulture), // Title - "VS.AddReference", // Help topic - addComponentDialogSizeX, - addComponentDialogSizeY, - (uint)tabInitList.Count, - tabInitList.ToArray(), - ref addComponentLastActiveTab, - browseFilters, - ref strBrowseLocations, - this.TargetFrameworkMoniker.FullName)); - } - } - catch (COMException e) - { - Trace.WriteLine("Exception : " + e.Message); - return e.ErrorCode; - } - finally - { - // Let the project know it can show itself in the Add Project Reference Dialog page - this.ShowProjectInSolutionPage = true; - } - return VSConstants.S_OK; - } - - /// - /// Returns the Compiler associated to the project - /// - /// Null - public virtual ICodeCompiler GetCompiler() - { - - return null; - } - - /// - /// Override this method if you have your own project specific - /// subclass of ProjectOptions - /// - /// This method returns a new instance of the ProjectOptions base class. - public virtual ProjectOptions CreateProjectOptions() - { - return new ProjectOptions(); - } - - /// - /// Loads a project file. Called from the factory CreateProject to load the project. - /// - /// File name of the project that will be created. - /// Location where the project will be created. - /// If applicable, the name of the template to use when cloning a new project. - /// Set of flag values taken from the VSCREATEPROJFLAGS enumeration. - /// Identifier of the interface that the caller wants returned. - /// An out parameter specifying if the project creation was canceled - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "iid")] - public virtual void Load(string fileName, string location, string name, uint flags, ref Guid iidProject, out int canceled) - { - try - { - this.disableQueryEdit = true; - - // set up internal members and icons - canceled = 0; - - this.ProjectMgr = this; - this.isNewProject = false; - - if ((flags & (uint)__VSCREATEPROJFLAGS.CPF_CLONEFILE) == (uint)__VSCREATEPROJFLAGS.CPF_CLONEFILE) - { - // we need to generate a new guid for the project - this.projectIdGuid = Guid.NewGuid(); - } - else - { - this.SetProjectGuidFromProjectFile(); - } - - // This is almost a No op if the engine has already been instantiated in the factory. - this.buildEngine = Utilities.InitializeMsBuildEngine(this.buildEngine, this.Site); - - // based on the passed in flags, this either reloads/loads a project, or tries to create a new one - // now we create a new project... we do that by loading the template and then saving under a new name - // we also need to copy all the associated files with it. - if ((flags & (uint)__VSCREATEPROJFLAGS.CPF_CLONEFILE) == (uint)__VSCREATEPROJFLAGS.CPF_CLONEFILE) - { - Debug.Assert(!String.IsNullOrEmpty(fileName) && File.Exists(fileName), "Invalid filename passed to load the project. A valid filename is expected"); - - this.isNewProject = true; - - // This should be a very fast operation if the build project is already initialized by the Factory. - SetBuildProject(Utilities.ReinitializeMsBuildProject(this.buildEngine, fileName, this.buildProject)); - - // Compute the file name - // We try to solve two problems here. When input comes from a wizzard in case of zipped based projects - // the parameters are different. - // In that case the filename has the new filename in a temporay path. - - // First get the extension from the template. - // Then get the filename from the name. - // Then create the new full path of the project. - string extension = Path.GetExtension(fileName); - - string tempName = String.Empty; - - // We have to be sure that we are not going to loose data here. If the project name is a.b.c then for a project that was based on a zipped template(the wizzard calls us) GetFileNameWithoutExtension will suppress "c". - // We are going to check if the parameter "name" is extension based and the extension is the same as the one from the "filename" parameter. - string tempExtension = Path.GetExtension(name); - if (!String.IsNullOrEmpty(tempExtension)) - { - bool isSameExtension = (String.Compare(tempExtension, extension, StringComparison.OrdinalIgnoreCase) == 0); - - if (isSameExtension) - { - tempName = Path.GetFileNameWithoutExtension(name); - } - // If the tempExtension is not the same as the extension that the project name comes from then assume that the project name is a dotted name. - else - { - tempName = Path.GetFileName(name); - } - } - else - { - tempName = Path.GetFileName(name); - } - - Debug.Assert(!String.IsNullOrEmpty(tempName), "Could not compute project name"); - string tempProjectFileName = tempName + extension; - this.filename = Path.Combine(location, tempProjectFileName); - - // Initialize the common project properties. - this.InitializeProjectProperties(); - - ErrorHandler.ThrowOnFailure(this.Save(this.filename, 1, 0)); - - // now we do have the project file saved. we need to create embedded files. - foreach (MSBuild.ProjectItem item in this.BuildProject.Items) - { - // Ignore the item if it is a reference or folder - if (this.FilterItemTypeToBeAddedToHierarchy(item.ItemType)) - { - continue; - } - - // MSBuilds tasks/targets can create items (such as object files), - // such items are not part of the project per say, and should not be displayed. - // so ignore those items. - if (!this.IsItemTypeFileType(item.ItemType)) - { - continue; - } - - string strRelFilePath = item.EvaluatedInclude; - string basePath = Path.GetDirectoryName(fileName); - string strPathToFile; - string newFileName; - // taking the base name from the project template + the relative pathname, - // and you get the filename - strPathToFile = Path.Combine(basePath, strRelFilePath); - // the new path should be the base dir of the new project (location) + the rel path of the file - newFileName = Path.Combine(location, strRelFilePath); - // now the copy file - AddFileFromTemplate(strPathToFile, newFileName); - } - } - else - { - this.filename = fileName; - } - - // now reload to fix up references - this.Reload(); - } - finally - { - this.disableQueryEdit = false; - } - } - - /// - /// Called to add a file to the project from a template. - /// Override to do it yourself if you want to customize the file - /// - /// Full path of template file - /// Full path of file once added to the project - public virtual void AddFileFromTemplate(string source, string target) - { - if (String.IsNullOrEmpty(source)) - { - throw new ArgumentNullException("source"); - } - if (String.IsNullOrEmpty(target)) - { - throw new ArgumentNullException("target"); - } - - try - { - string directory = Path.GetDirectoryName(target); - if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - FileInfo fiOrg = new FileInfo(source); - FileInfo fiNew = fiOrg.CopyTo(target, true); - - fiNew.Attributes = FileAttributes.Normal; // remove any read only attributes. - } - catch (IOException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (UnauthorizedAccessException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (NotSupportedException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - } - - /// - /// Called when the project opens an editor window for the given file - /// - public virtual void OnOpenItem(string fullPathToSourceFile) - { - } - - /// - /// This add methos adds the "key" item to the hierarchy, potentially adding other subitems in the process - /// This method may recurse if the parent is an other subitem - /// - /// - /// List of subitems not yet added to the hierarchy - /// Key to retrieve the target item from the subitems list - /// Newly added node - /// If the parent node was found we add the dependent item to it otherwise we add the item ignoring the "DependentUpon" metatdata - protected virtual HierarchyNode AddDependentFileNode(IDictionary subitems, string key) - { - if (subitems == null) - { - throw new ArgumentNullException("subitems"); - } - - MSBuild.ProjectItem item = subitems[key]; - subitems.Remove(key); - - HierarchyNode newNode; - HierarchyNode parent = null; - - string dependentOf = item.GetMetadataValue(ProjectFileConstants.DependentUpon); - Debug.Assert(String.Compare(dependentOf, key, StringComparison.OrdinalIgnoreCase) != 0, "File dependent upon itself is not valid. Ignoring the DependentUpon metadata"); - if (subitems.ContainsKey(dependentOf)) - { - // The parent item is an other subitem, so recurse into this method to add the parent first - parent = AddDependentFileNode(subitems, dependentOf); - } - else - { - // See if the parent node already exist in the hierarchy - uint parentItemID; - string path = Path.Combine(this.ProjectFolder, dependentOf); - ErrorHandler.ThrowOnFailure(this.ParseCanonicalName(path, out parentItemID)); - if (parentItemID != (uint)VSConstants.VSITEMID.Nil) - parent = this.NodeFromItemId(parentItemID); - Debug.Assert(parent != null, "File dependent upon a non existing item or circular dependency. Ignoring the DependentUpon metadata"); - } - - // If the parent node was found we add the dependent item to it otherwise we add the item ignoring the "DependentUpon" metatdata - if (parent != null) - newNode = this.AddDependentFileNodeToNode(item, parent); - else - newNode = this.AddIndependentFileNode(item); - - return newNode; - } - - /// - /// This is called from the main thread before the background build starts. - /// cleanBuild is not part of the vsopts, but passed down as the callpath is differently - /// PrepareBuild mainly creates directories and cleans house if cleanBuild is true - /// - /// - /// - public virtual void PrepareBuild(string config, bool cleanBuild) - { - if (this.buildIsPrepared && !cleanBuild) return; - - ProjectOptions options = this.GetProjectOptions(config); - string outputPath = Path.GetDirectoryName(options.OutputAssembly); - - if (cleanBuild && this.currentConfig.Targets.ContainsKey(MsBuildTarget.Clean)) - { - this.InvokeMsBuild(MsBuildTarget.Clean); - } - - PackageUtilities.EnsureOutputPath(outputPath); - if (!String.IsNullOrEmpty(options.XmlDocFileName)) - { - PackageUtilities.EnsureOutputPath(Path.GetDirectoryName(options.XmlDocFileName)); - } - - this.buildIsPrepared = true; - } - - /// - /// Do the build by invoking msbuild - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "vsopts")] - public virtual MSBuildResult Build(uint vsopts, string config, IVsOutputWindowPane output, string target) - { - lock (ProjectNode.BuildLock) - { - bool engineLogOnlyCritical = this.BuildPrelude(output); - - MSBuildResult result = MSBuildResult.Failed; - - try - { - this.SetBuildConfigurationProperties(config); - - result = this.InvokeMsBuild(target); - } - finally - { - // Unless someone specifically request to use an output window pane, we should not output to it - if (null != output) - { - this.SetOutputLogger(null); - BuildEngine.OnlyLogCriticalEvents = engineLogOnlyCritical; - } - } - - return result; - } - } - - - /// - /// Do the build by invoking msbuild - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "vsopts")] - internal virtual void BuildAsync(uint vsopts, string config, IVsOutputWindowPane output, string target, Action uiThreadCallback) - { - this.BuildPrelude(output); - this.SetBuildConfigurationProperties(config); - this.DoMSBuildSubmission(BuildKind.Async, target, uiThreadCallback); - } - - /// - /// Return the value of a project property - /// - /// Name of the property to get - /// True to avoid using the cache - /// null if property does not exist, otherwise value of the property - public virtual string GetProjectProperty(string propertyName, bool resetCache) - { - MSBuildExecution.ProjectPropertyInstance property = GetMsBuildProperty(propertyName, resetCache); - if (property == null) - return null; - - return property.EvaluatedValue; - } - - /// - /// Set value of project property - /// - /// Name of property - /// Value of property - public virtual void SetProjectProperty(string propertyName, string propertyValue) - { - if (propertyName == null) - throw new ArgumentNullException("propertyName", "Cannot set a null project property"); - - string oldValue = null; - ProjectPropertyInstance oldProp = GetMsBuildProperty(propertyName, true); - if (oldProp != null) - oldValue = oldProp.EvaluatedValue; - if (propertyValue == null) - { - // if property already null, do nothing - if (oldValue == null) - return; - // otherwise, set it to empty - propertyValue = String.Empty; - } - - // Only do the work if this is different to what we had before - if (String.Compare(oldValue, propertyValue, StringComparison.Ordinal) != 0) - { - // Check out the project file. - if (!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - SetMSBuildProjectProperty(propertyName, propertyValue); - RaiseProjectPropertyChanged(propertyName, oldValue, propertyValue); - - // property cache will need to be updated - this.currentConfig = null; - this.SetProjectFileDirty(true); - } - return; - } - - protected virtual void SetMSBuildProjectProperty(string propertyName, string propertyValue) - { - this.buildProject.SetProperty(propertyName, propertyValue); - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")] - public virtual ProjectOptions GetProjectOptions(string config = null) - { - if (string.IsNullOrEmpty(config)) - { - EnvDTE.Project automationObject = this.GetAutomationObject() as EnvDTE.Project; - try - { - config = Utilities.GetActiveConfigurationName(automationObject); - } - catch (InvalidOperationException) - { - // Can't figure out the active configuration. Perhaps during solution load, or in a unit test. - } - catch (COMException) - { - // We may be in solution load and don't have an active config yet. - } - } - - // Even though the options are the same, when this config was originally set, it may have been before - // the project system was ready to set up its configuration, so go ahead and call through to SetConfiguration - // anyway -- it should do effectively nothing if the config is the same and all the initialization has - // already occurred. - if (this.options != null && String.Equals(this.options.Config, config, StringComparison.OrdinalIgnoreCase)) - { - if (config != null) - { - // Fancy dance with the options required because SetConfiguration nulls out this.options - // even if the configuration itself has not changed; whereas we're only calling SetConfiguration - // for purposes of initializing some other fields here; since we know the config is the same, it - // should be perfectly safe to keep the same options as before. - ProjectOptions currentOptions = this.options; - this.SetConfiguration(config); - this.options = currentOptions; - } - - return this.options; - } - - ProjectOptions options = CreateProjectOptions(); - options.Config = config; - - string targetFrameworkMoniker = GetProjectProperty("TargetFrameworkMoniker", false); - - if (!string.IsNullOrEmpty(targetFrameworkMoniker)) - { - try - { - options.TargetFrameworkMoniker = new FrameworkName(targetFrameworkMoniker); - } - catch (ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - } - - if (config == null) - { - this.options = options; - return options; - } - - options.GenerateExecutable = true; - - this.SetConfiguration(config); - - string outputPath = this.GetOutputPath(this.currentConfig); - if (!String.IsNullOrEmpty(outputPath)) - { - // absolutize relative to project folder location - outputPath = Path.Combine(this.ProjectFolder, outputPath); - } - - // Set some default values - options.OutputAssembly = outputPath + this.Caption + ".exe"; - options.ModuleKind = ModuleKindFlags.ConsoleApplication; - - options.RootNamespace = GetProjectProperty(ProjectFileConstants.RootNamespace, false); - options.OutputAssembly = outputPath + this.GetAssemblyName(config); - - string outputtype = GetProjectProperty(ProjectFileConstants.OutputType, false); - if (!string.IsNullOrEmpty(outputtype)) - { - outputtype = outputtype.ToLower(CultureInfo.InvariantCulture); - } - - if (outputtype == "library") - { - options.ModuleKind = ModuleKindFlags.DynamicallyLinkedLibrary; - options.GenerateExecutable = false; // DLL's have no entry point. - } - else if (outputtype == "winexe") - options.ModuleKind = ModuleKindFlags.WindowsApplication; - else - options.ModuleKind = ModuleKindFlags.ConsoleApplication; - - options.Win32Icon = GetProjectProperty("ApplicationIcon", false); - options.MainClass = GetProjectProperty("StartupObject", false); - - // other settings from CSharp we may want to adopt at some point... - // AssemblyKeyContainerName = "" //This is the key file used to sign the interop assembly generated when importing a com object via add reference - // AssemblyOriginatorKeyFile = "" - // DelaySign = "false" - // DefaultClientScript = "JScript" - // DefaultHTMLPageLayout = "Grid" - // DefaultTargetSchema = "IE50" - // PreBuildEvent = "" - // PostBuildEvent = "" - // RunPostBuildEvent = "OnBuildSuccess" - - // transfer all config build options... - if (GetBoolAttr(this.currentConfig, "AllowUnsafeBlocks")) - { - options.AllowUnsafeCode = true; - } - - if (GetProjectProperty("BaseAddress", false) != null) - { - try - { - options.BaseAddress = Int64.Parse(GetProjectProperty("BaseAddress", false), CultureInfo.InvariantCulture); - } - catch (ArgumentNullException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (FormatException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (OverflowException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - } - - if (GetBoolAttr(this.currentConfig, "CheckForOverflowUnderflow")) - { - options.CheckedArithmetic = true; - } - - if (GetProjectProperty("DefineConstants", false) != null) - { - options.DefinedPreprocessorSymbols = new StringCollection(); - foreach (string s in GetProjectProperty("DefineConstants", false).Replace(" \t\r\n", "").Split(';')) - { - options.DefinedPreprocessorSymbols.Add(s); - } - } - - string docFile = GetProjectProperty("DocumentationFile", false); - if (!String.IsNullOrEmpty(docFile)) - { - options.XmlDocFileName = Path.Combine(this.ProjectFolder, docFile); - } - - if (GetBoolAttr(this.currentConfig, "DebugSymbols")) - { - options.IncludeDebugInformation = true; - } - - if (GetProjectProperty("FileAlignment", false) != null) - { - try - { - options.FileAlignment = Int32.Parse(GetProjectProperty("FileAlignment", false), CultureInfo.InvariantCulture); - } - catch (ArgumentNullException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (FormatException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (OverflowException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - } - - if (GetBoolAttr(this.currentConfig, "IncrementalBuild")) - { - options.IncrementalCompile = true; - } - - if (GetBoolAttr(this.currentConfig, "Optimize")) - { - options.Optimize = true; - } - - if (GetBoolAttr(this.currentConfig, "RegisterForComInterop")) - { - } - - if (GetBoolAttr(this.currentConfig, "RemoveIntegerChecks")) - { - } - - if (GetBoolAttr(this.currentConfig, "TreatWarningsAsErrors")) - { - options.TreatWarningsAsErrors = true; - } - - if (GetProjectProperty("WarningLevel", false) != null) - { - try - { - options.WarningLevel = Int32.Parse(GetProjectProperty("WarningLevel", false), CultureInfo.InvariantCulture); - } - catch (ArgumentNullException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (ArgumentException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (FormatException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch (OverflowException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - } - - this.options = options; // do this AFTER setting configuration so it doesn't clear it. - return options; - } - - public virtual void OnTargetFrameworkMonikerChanged(ProjectOptions options, FrameworkName currentTargetFramework, FrameworkName newTargetFramework) - { - if (currentTargetFramework == null) - { - throw new ArgumentNullException("currentTargetFramework"); - } - if (newTargetFramework == null) - { - throw new ArgumentNullException("newTargetFramework"); - } - - var retargetingService = this.site.GetService(typeof(SVsTrackProjectRetargeting)) as IVsTrackProjectRetargeting; - if (retargetingService == null) - { - // Probably in a unit test. - ////throw new InvalidOperationException("Unable to acquire the SVsTrackProjectRetargeting service."); - Marshal.ThrowExceptionForHR(UpdateTargetFramework(this.InteropSafeIVsHierarchy, currentTargetFramework.FullName, newTargetFramework.FullName)); - } - else - { - Marshal.ThrowExceptionForHR(retargetingService.OnSetTargetFramework(this.InteropSafeIVsHierarchy, currentTargetFramework.FullName, newTargetFramework.FullName, this, true)); - } - } - - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Attr")] - [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "bool")] - public virtual bool GetBoolAttr(string config, string name) - { - this.SetConfiguration(config); - return this.GetBoolAttr(this.currentConfig, name); - } - - /// - /// Get the assembly name for a give configuration - /// - /// the matching configuration in the msbuild file - /// assembly name - public virtual string GetAssemblyName(string config) - { - this.SetConfiguration(config); - return GetAssemblyName(this.currentConfig); - } - - /// - /// Determines whether a file is a code file. - /// - /// Name of the file to be evaluated - /// false by default for any fileName - public virtual bool IsCodeFile(string fileName) - { - return false; - } - - /// - /// Determines whether the given file is a resource file (resx file). - /// - /// Name of the file to be evaluated. - /// true if the file is a resx file, otherwise false. - public virtual bool IsEmbeddedResource(string fileName) - { - if (String.Compare(Path.GetExtension(fileName), ".ResX", StringComparison.OrdinalIgnoreCase) == 0) - return true; - return false; - } - - /// - /// Create a file node based on an msbuild item. - /// - /// msbuild item - /// FileNode added - public virtual FileNode CreateFileNode(ProjectElement item) - { - return new FileNode(this, item); - } - - /// - /// Create a file node based on a string. - /// - /// filename of the new filenode - /// File node added - public virtual FileNode CreateFileNode(string file) - { - ProjectElement item = this.AddFileToMsBuild(file); - return this.CreateFileNode(item); - } - - /// - /// Create dependent file node based on an msbuild item - /// - /// msbuild item - /// dependent file node - public virtual DependentFileNode CreateDependentFileNode(ProjectElement item) - { - return new DependentFileNode(this, item); - } - - /// - /// Create a dependent file node based on a string. - /// - /// filename of the new dependent file node - /// Dependent node added - public virtual DependentFileNode CreateDependentFileNode(string file) - { - ProjectElement item = this.AddFileToMsBuild(file); - return this.CreateDependentFileNode(item); - } - - /// - /// Walks the subpaths of a project relative path and checks if the folder nodes hierarchy is already there, if not creates it. - /// - /// Path of the folder, can be relative to project or absolute - public virtual HierarchyNode CreateFolderNodes(string path) - { - if (String.IsNullOrEmpty(path)) - { - throw new ArgumentNullException("path"); - } - - if (Path.IsPathRooted(path)) - { - // Ensure we are using a relative path - if (String.Compare(this.ProjectFolder, 0, path, 0, this.ProjectFolder.Length, StringComparison.OrdinalIgnoreCase) != 0) - throw new ArgumentException("The path is not relative", "path"); - - path = path.Substring(this.ProjectFolder.Length); - } - - string[] parts; - HierarchyNode curParent; - - parts = path.Split(Path.DirectorySeparatorChar); - path = String.Empty; - curParent = this; - - // now we have an array of subparts.... - for (int i = 0; i < parts.Length; i++) - { - if (parts[i].Length > 0) - { - path += parts[i] + "\\"; - curParent = VerifySubFolderExists(path, curParent); - } - } - return curParent; - } - - /// - /// Defines if Node has Designer. By default we do not support designers for nodes - /// - /// Path to item to query for designer support - /// true if node has designer - public virtual bool NodeHasDesigner(string itemPath) - { - return false; - } - - /// - /// List of Guids of the config independent property pages. It is called by the GetProperty for VSHPROPID_PropertyPagesCLSIDList property. - /// - /// - protected virtual Guid[] GetConfigurationIndependentPropertyPages() - { - return new Guid[] { Guid.Empty }; - } - - /// - /// Returns a list of Guids of the configuration dependent property pages. It is called by the GetProperty for VSHPROPID_CfgPropertyPagesCLSIDList property. - /// - /// - protected virtual Guid[] GetConfigurationDependentPropertyPages() - { - return new Guid[0]; - } - - /// - /// An ordered list of guids of the prefered property pages. See - /// - /// An array of guids. - protected virtual Guid[] GetPriorityProjectDesignerPages() - { - return new Guid[] { Guid.Empty }; - } - - /// - /// Takes a path and verifies that we have a node with that name. - /// It is meant to be a helper method for CreateFolderNodes(). - /// For some scenario it may be useful to override. - /// - /// full path to the subfolder we want to verify. - /// the parent node where to add the subfolder if it does not exist. - /// the foldernode correcsponding to the path. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubFolder")] - protected virtual FolderNode VerifySubFolderExists(string path, HierarchyNode parent) - { - FolderNode folderNode = null; - uint uiItemId; - Url url = new Url(this.BaseURI, path); - string strFullPath = url.AbsoluteUrl; - // Folders end in our storage with a backslash, so add one... - this.ParseCanonicalName(strFullPath, out uiItemId); - if (uiItemId != (uint)VSConstants.VSITEMID.Nil) - { - Debug.Assert(this.NodeFromItemId(uiItemId) is FolderNode, "Not a FolderNode"); - folderNode = (FolderNode)this.NodeFromItemId(uiItemId); - } - - if (folderNode == null && path != null && parent != null) - { - // folder does not exist yet... - // We could be in the process of loading so see if msbuild knows about it - ProjectElement item = null; - foreach (MSBuild.ProjectItem folder in buildProject.GetItems(ProjectFileConstants.Folder)) - { - if (String.Compare(folder.EvaluatedInclude.TrimEnd('\\'), path.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase) == 0) - { - item = new ProjectElement(this, folder, false); - break; - } - } - // If MSBuild did not know about it, create a new one - if (item == null) - item = this.AddFolderToMsBuild(path); - folderNode = this.CreateFolderNode(path, item); - parent.AddChild(folderNode); - } - - return folderNode; - } - - /// - /// To support virtual folders, override this method to return your own folder nodes - /// - /// Path to store for this folder - /// Element corresponding to the folder - /// A FolderNode that can then be added to the hierarchy - protected internal virtual FolderNode CreateFolderNode(string path, ProjectElement element) - { - FolderNode folderNode = new FolderNode(this, path, element); - return folderNode; - } - - /// - /// Gets the list of selected HierarchyNode objects - /// - /// A list of HierarchyNode objects - protected internal virtual IList GetSelectedNodes() - { - // Retrieve shell interface in order to get current selection - IVsMonitorSelection monitorSelection = this.GetService(typeof(IVsMonitorSelection)) as IVsMonitorSelection; - - if (monitorSelection == null) - { - throw new InvalidOperationException(); - } - - List selectedNodes = new List(); - IntPtr hierarchyPtr = IntPtr.Zero; - IntPtr selectionContainer = IntPtr.Zero; - try - { - // Get the current project hierarchy, project item, and selection container for the current selection - // If the selection spans multiple hierachies, hierarchyPtr is Zero - uint itemid; - IVsMultiItemSelect multiItemSelect = null; - ErrorHandler.ThrowOnFailure(monitorSelection.GetCurrentSelection(out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainer)); - - // We only care if there are one ore more nodes selected in the tree - if (itemid != VSConstants.VSITEMID_NIL && hierarchyPtr != IntPtr.Zero) - { - IVsHierarchy hierarchy = Marshal.GetObjectForIUnknown(hierarchyPtr) as IVsHierarchy; - - if (itemid != VSConstants.VSITEMID_SELECTION) - { - // This is a single selection. Compare hirarchy with our hierarchy and get node from itemid - if (Utilities.IsSameComObject(this.InteropSafeIVsHierarchy, hierarchy)) - { - HierarchyNode node = this.NodeFromItemId(itemid); - if (node != null) - { - selectedNodes.Add(node); - } - } - else - { - NestedProjectNode node = this.GetNestedProjectForHierarchy(hierarchy); - if (node != null) - { - selectedNodes.Add(node); - } - } - } - else if (multiItemSelect != null) - { - // This is a multiple item selection. - - //Get number of items selected and also determine if the items are located in more than one hierarchy - uint numberOfSelectedItems; - int isSingleHierarchyInt; - ErrorHandler.ThrowOnFailure(multiItemSelect.GetSelectionInfo(out numberOfSelectedItems, out isSingleHierarchyInt)); - bool isSingleHierarchy = (isSingleHierarchyInt != 0); - - // Now loop all selected items and add to the list only those that are selected within this hierarchy - if (!isSingleHierarchy || (isSingleHierarchy && Utilities.IsSameComObject(this.InteropSafeIVsHierarchy, hierarchy))) - { - Debug.Assert(numberOfSelectedItems > 0, "Bad number of selected itemd"); - VSITEMSELECTION[] vsItemSelections = new VSITEMSELECTION[numberOfSelectedItems]; - uint flags = (isSingleHierarchy) ? (uint)__VSGSIFLAGS.GSI_fOmitHierPtrs : 0; - ErrorHandler.ThrowOnFailure(multiItemSelect.GetSelectedItems(flags, numberOfSelectedItems, vsItemSelections)); - foreach (VSITEMSELECTION vsItemSelection in vsItemSelections) - { - if (isSingleHierarchy || Utilities.IsSameComObject(this.InteropSafeIVsHierarchy, vsItemSelection.pHier)) - { - HierarchyNode node = this.NodeFromItemId(vsItemSelection.itemid); - if (node != null) - { - selectedNodes.Add(node); - } - } - } - } - } - } - } - finally - { - if (hierarchyPtr != IntPtr.Zero) - { - Marshal.Release(hierarchyPtr); - } - if (selectionContainer != IntPtr.Zero) - { - Marshal.Release(selectionContainer); - } - } - - return selectedNodes; - } - - /// - /// Recursevily walks the hierarchy nodes and redraws the state icons - /// - protected internal override void UpdateSccStateIcons() - { - if (this.FirstChild == null) - { - return; - } - - for (HierarchyNode n = this.FirstChild; n != null; n = n.NextSibling) - { - n.UpdateSccStateIcons(); - } - } - - - /// - /// Handles the shows all objects command. - /// - /// - protected internal virtual int ShowAllFiles() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Handles the Add web reference command. - /// - /// - protected internal virtual int AddWebReference() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Unloads the project. - /// - /// - protected internal virtual int UnloadProject() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Handles the clean project command. - /// - /// - protected virtual int CleanProject() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// Reload project from project file - /// - protected virtual void Reload() - { - Debug.Assert(this.buildEngine != null, "There is no build engine defined for this project"); - - try - { - this.disableQueryEdit = true; - - this.isClosed = false; - this.eventTriggeringFlag = ProjectNode.EventTriggering.DoNotTriggerHierarchyEvents | ProjectNode.EventTriggering.DoNotTriggerTrackerEvents; - - SetBuildProject(Utilities.ReinitializeMsBuildProject(this.buildEngine, this.filename, this.buildProject)); - - // Load the guid - this.SetProjectGuidFromProjectFile(); - - this.ProcessReferences(); - - this.ProcessFiles(); - - this.ProcessFolders(); - - this.LoadNonBuildInformation(); - - this.InitSccInfo(); - - this.RegisterSccProject(); - } - finally - { - this.SetProjectFileDirty(false); - this.eventTriggeringFlag = ProjectNode.EventTriggering.TriggerAll; - this.disableQueryEdit = false; - } - } - - /// - /// Renames the project file - /// - /// The full path of the new project file. - protected virtual void RenameProjectFile(string newFile) - { - IVsUIShell shell = this.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if (shell == null) - { - throw new InvalidOperationException(); - } - - // Do some name validation - if (Microsoft.VisualStudio.Project.Utilities.ContainsInvalidFileNameChars(newFile)) - { - throw new InvalidOperationException(SR.GetString(SR.ErrorInvalidProjectName, CultureInfo.CurrentUICulture)); - } - - // Figure out what the new full name is - string oldFile = this.Url; - - int canContinue = 0; - IVsSolution vsSolution = (IVsSolution)this.GetService(typeof(SVsSolution)); - if (ErrorHandler.Succeeded(vsSolution.QueryRenameProject(this.InteropSafeIVsProject3, oldFile, newFile, 0, out canContinue)) - && canContinue != 0) - { - bool isFileSame = NativeMethods.IsSamePath(oldFile, newFile); - - // If file already exist and is not the same file with different casing - if (!isFileSame && File.Exists(newFile)) - { - // Prompt the user for replace - string message = SR.GetString(SR.FileAlreadyExists, newFile); - - if (!Utilities.IsInAutomationFunction(this.Site)) - { - if (!VsShellUtilities.PromptYesNo(message, null, OLEMSGICON.OLEMSGICON_WARNING, shell)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - } - else - { - throw new InvalidOperationException(message); - } - - // Delete the destination file after making sure it is not read only - File.SetAttributes(newFile, FileAttributes.Normal); - File.Delete(newFile); - } - - SuspendFileChanges fileChanges = new SuspendFileChanges(this.Site, this.filename); - fileChanges.Suspend(); - try - { - // Actual file rename - this.SaveMSBuildProjectFileAs(newFile); - - this.SetProjectFileDirty(false); - - if (!isFileSame) - { - // Now that the new file name has been created delete the old one. - // TODO: Handle source control issues. - File.SetAttributes(oldFile, FileAttributes.Normal); - File.Delete(oldFile); - } - - this.OnPropertyChanged(this, (int)__VSHPROPID.VSHPROPID_Caption, 0); - - // Update solution - ErrorHandler.ThrowOnFailure(vsSolution.OnAfterRenameProject(this.InteropSafeIVsProject3, oldFile, newFile, 0)); - - ErrorHandler.ThrowOnFailure(shell.RefreshPropertyBrowser(0)); - } - finally - { - fileChanges.Resume(); - } - } - else - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - } - - /// - /// Called by the project to know if the item is a file (that is part of the project) - /// or an intermediate file used by the MSBuild tasks/targets - /// Override this method if your project has more types or different ones - /// - /// Type name - /// True = items of this type should be included in the project - protected virtual bool IsItemTypeFileType(string type) - { - if (String.Compare(type, BuildAction.Compile.ToString(), StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(type, BuildAction.Content.ToString(), StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(type, BuildAction.EmbeddedResource.ToString(), StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(type, BuildAction.None.ToString(), StringComparison.OrdinalIgnoreCase) == 0) - return true; - - // we don't know about this type, so ignore it. - return false; - } - - /// - /// Filter items that should not be processed as file items. Example: Folders and References. - /// - protected virtual bool FilterItemTypeToBeAddedToHierarchy(string itemType) - { - return (String.Compare(itemType, ProjectFileConstants.Reference, StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(itemType, ProjectFileConstants.ProjectReference, StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(itemType, ProjectFileConstants.COMReference, StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(itemType, ProjectFileConstants.Folder, StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(itemType, ProjectFileConstants.WebReference, StringComparison.OrdinalIgnoreCase) == 0 - || String.Compare(itemType, ProjectFileConstants.WebReferenceFolder, StringComparison.OrdinalIgnoreCase) == 0); - } - - /// - /// Associate window output pane to the build logger - /// - /// - protected virtual void SetOutputLogger(IVsOutputWindowPane output) - { - // Create our logger, if it was not specified - if (!this.useProvidedLogger || this.buildLogger == null) - { - // Because we may be aggregated, we need to make sure to get the outer IVsHierarchy - IntPtr unknown = IntPtr.Zero; - IVsHierarchy hierarchy = null; - try - { - unknown = Marshal.GetIUnknownForObject(this); - hierarchy = Marshal.GetTypedObjectForIUnknown(unknown, typeof(IVsHierarchy)) as IVsHierarchy; - } - finally - { - if (unknown != IntPtr.Zero) - Marshal.Release(unknown); - } - // Create the logger - this.BuildLogger = new IDEBuildLogger(output, this.TaskProvider, hierarchy); - - // To retrive the verbosity level, the build logger depends on the registry root - // (otherwise it will used an hardcoded default) - ILocalRegistry2 registry = this.GetService(typeof(SLocalRegistry)) as ILocalRegistry2; - if (null != registry) - { - string registryRoot; - ErrorHandler.ThrowOnFailure(registry.GetLocalRegistryRoot(out registryRoot)); - IDEBuildLogger logger = this.BuildLogger as IDEBuildLogger; - if (!String.IsNullOrEmpty(registryRoot) && (null != logger)) - { - logger.BuildVerbosityRegistryRoot = registryRoot; - logger.ErrorString = this.ErrorString; - logger.WarningString = this.WarningString; - } - } - } - else - { - ((IDEBuildLogger)this.BuildLogger).OutputWindowPane = output; - } - } - - /// - /// Set configuration properties for a specific configuration - /// - /// configuration name - protected virtual void SetBuildConfigurationProperties(string config) - { - ProjectOptions options = null; - - if (!String.IsNullOrEmpty(config)) - { - options = this.GetProjectOptions(config); - } - - if (options != null && this.buildProject != null) - { - // Make sure the project configuration is set properly - this.SetConfiguration(config); - } - } - - /// - /// This execute an MSBuild target for a design-time build. - /// - /// Name of the MSBuild target to execute - /// Result from executing the target (success/failure) - /// - /// If you depend on the items/properties generated by the target - /// you should be aware that any call to BuildTarget on any project - /// will reset the list of generated items/properties - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - protected virtual MSBuildResult InvokeMsBuild(string target) - { - MSBuildResult result = MSBuildResult.Failed; - const bool designTime = true; - bool requiresUIThread = UIThread.Instance.IsUIThread; // we don't run tasks that require calling the STA thread, so unless we're ON it, we don't need it. - - IVsBuildManagerAccessor accessor = this.Site.GetService(typeof(SVsBuildManagerAccessor)) as IVsBuildManagerAccessor; - BuildSubmission submission = null; - - if (this.buildProject != null) - { - if (!TryBeginBuild(designTime, requiresUIThread)) - { - throw new InvalidOperationException("A build is already in progress."); - } - - try - { - // Do the actual Build - string[] targetsToBuild = new string[target != null ? 1 : 0]; - if (target != null) - { - targetsToBuild[0] = target; - } - - currentConfig = BuildProject.CreateProjectInstance(); - - BuildRequestData requestData = new BuildRequestData(currentConfig, targetsToBuild, this.BuildProject.ProjectCollection.HostServices, BuildRequestDataFlags.ReplaceExistingProjectInstance); - submission = BuildManager.DefaultBuildManager.PendBuildRequest(requestData); - if (accessor != null) - { - ErrorHandler.ThrowOnFailure(accessor.RegisterLogger(submission.SubmissionId, this.buildLogger)); - } - - BuildResult buildResult = submission.Execute(); - - result = (buildResult.OverallResult == BuildResultCode.Success) ? MSBuildResult.Successful : MSBuildResult.Failed; - } - finally - { - EndBuild(submission, designTime, requiresUIThread); - } - } - - return result; - } - - /// - /// Start MSBuild build submission - /// - /// If buildKind is ASync, this method starts the submission and returns. uiThreadCallback will be called on UI thread once submissions completes. - /// if buildKind is Sync, this method executes the submission and runs uiThreadCallback - /// Is it a Sync or ASync build - /// target to build - /// project instance to build; if null, this.BuildProject.CreateProjectInstance() is used to populate - /// callback to be run UI thread - /// A Build submission instance. - protected virtual BuildSubmission DoMSBuildSubmission(BuildKind buildKind, string target, Action uiThreadCallback) - { - const bool designTime = false; - bool requiresUIThread = buildKind == BuildKind.Sync && UIThread.Instance.IsUIThread; // we don't run tasks that require calling the STA thread, so unless we're ON it, we don't need it. - - IVsBuildManagerAccessor accessor = (IVsBuildManagerAccessor)this.Site.GetService(typeof(SVsBuildManagerAccessor)); - if (accessor == null) - { - throw new InvalidOperationException(); - } - - if (!TryBeginBuild(designTime, requiresUIThread)) - { - if (uiThreadCallback != null) - { - uiThreadCallback(MSBuildResult.Failed, target); - } - - return null; - } - - string[] targetsToBuild = new string[target != null ? 1 : 0]; - if (target != null) - { - targetsToBuild[0] = target; - } - - MSBuildExecution.ProjectInstance projectInstance = BuildProject.CreateProjectInstance(); - - projectInstance.SetProperty(GlobalProperty.VisualStudioStyleErrors.ToString(), "true"); - projectInstance.SetProperty("UTFOutput", "true"); - projectInstance.SetProperty(GlobalProperty.BuildingInsideVisualStudio.ToString(), "true"); - - this.BuildProject.ProjectCollection.HostServices.SetNodeAffinity(projectInstance.FullPath, NodeAffinity.InProc); - BuildRequestData requestData = new BuildRequestData(projectInstance, targetsToBuild, this.BuildProject.ProjectCollection.HostServices, BuildRequestDataFlags.ReplaceExistingProjectInstance); - BuildSubmission submission = BuildManager.DefaultBuildManager.PendBuildRequest(requestData); - try - { - if (useProvidedLogger && buildLogger != null) - { - ErrorHandler.ThrowOnFailure(accessor.RegisterLogger(submission.SubmissionId, buildLogger)); - } - - if (buildKind == BuildKind.Async) - { - submission.ExecuteAsync(sub => - { - UIThread.Instance.Run(() => - { - this.FlushBuildLoggerContent(); - EndBuild(sub, designTime, requiresUIThread); - uiThreadCallback((sub.BuildResult.OverallResult == BuildResultCode.Success) ? MSBuildResult.Successful : MSBuildResult.Failed, target); - }); - }, null); - } - else - { - submission.Execute(); - EndBuild(submission, designTime, requiresUIThread); - MSBuildResult msbuildResult = (submission.BuildResult.OverallResult == BuildResultCode.Success) ? MSBuildResult.Successful : MSBuildResult.Failed; - if (uiThreadCallback != null) - { - uiThreadCallback(msbuildResult, target); - } - } - } - catch (Exception e) - { - Debug.Fail(e.ToString()); - EndBuild(submission, designTime, requiresUIThread); - if (uiThreadCallback != null) - { - uiThreadCallback(MSBuildResult.Failed, target); - } - - throw; - } - - return submission; - } - - /// - /// Initialize common project properties with default value if they are empty - /// - /// The following common project properties are defaulted to projectName (if empty): - /// AssemblyName, Name and RootNamespace. - /// If the project filename is not set then no properties are set - protected virtual void InitializeProjectProperties() - { - // Get projectName from project filename. Return if not set - string projectName = Path.GetFileNameWithoutExtension(this.filename); - if (String.IsNullOrEmpty(projectName)) - { - return; - } - - if (String.IsNullOrEmpty(GetProjectProperty(ProjectFileConstants.AssemblyName))) - { - SetProjectProperty(ProjectFileConstants.AssemblyName, projectName); - } - if (String.IsNullOrEmpty(GetProjectProperty(ProjectFileConstants.Name))) - { - SetProjectProperty(ProjectFileConstants.Name, projectName); - } - if (String.IsNullOrEmpty(GetProjectProperty(ProjectFileConstants.RootNamespace))) - { - SetProjectProperty(ProjectFileConstants.RootNamespace, projectName); - } - } - - /// - /// Factory method for configuration provider - /// - /// Configuration provider created - protected virtual ConfigProvider CreateConfigProvider() - { - return new ConfigProvider(this); - } - - /// - /// Factory method for reference container node - /// - /// ReferenceContainerNode created - protected virtual ReferenceContainerNode CreateReferenceContainerNode() - { - return new ReferenceContainerNode(this); - } - - /// - /// Saves the project file on a new name. - /// - /// The new name of the project file. - /// Success value or an error code. - protected virtual int SaveAs(string newFileName) - { - Debug.Assert(!String.IsNullOrEmpty(newFileName), "Cannot save project file for an empty or null file name"); - if (String.IsNullOrEmpty(newFileName)) - { - throw new ArgumentNullException("newFileName"); - } - - newFileName = newFileName.Trim(); - - string errorMessage = String.Empty; - - if (newFileName.Length > NativeMethods.MAX_PATH) - { - errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), newFileName); - } - else - { - string fileName = String.Empty; - - try - { - fileName = Path.GetFileNameWithoutExtension(newFileName); - } - // We want to be consistent in the error message and exception we throw. fileName could be for example #�&%"�&"% and that would trigger an ArgumentException on Path.IsRooted. - catch (ArgumentException) - { - errorMessage = SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture); - } - - if (errorMessage.Length == 0) - { - // If there is no filename or it starts with a leading dot issue an error message and quit. - // For some reason the save as dialog box allows to save files like "......ext" - if (String.IsNullOrEmpty(fileName) || fileName[0] == '.') - { - errorMessage = SR.GetString(SR.FileNameCannotContainALeadingPeriod, CultureInfo.CurrentUICulture); - } - else if (Utilities.ContainsInvalidFileNameChars(newFileName)) - { - errorMessage = SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture); - } - else - { - string url = Path.GetDirectoryName(newFileName); - string oldUrl = Path.GetDirectoryName(this.Url); - - if (!NativeMethods.IsSamePath(oldUrl, url)) - { - errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.SaveOfProjectFileOutsideCurrentDirectory, CultureInfo.CurrentUICulture), this.ProjectFolder); - } - } - } - } - if (errorMessage.Length > 0) - { - // If it is not called from an automation method show a dialog box. - if (!Utilities.IsInAutomationFunction(this.Site)) - { - string title = null; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, errorMessage, icon, buttons, defaultButton); - return VSConstants.OLE_E_PROMPTSAVECANCELLED; - } - - throw new InvalidOperationException(errorMessage); - } - - string oldName = this.filename; - - IVsSolution solution = this.Site.GetService(typeof(IVsSolution)) as IVsSolution; - Debug.Assert(solution != null, "Could not retrieve the solution form the service provider"); - if (solution == null) - { - throw new InvalidOperationException(); - } - - int canRenameContinue = 0; - ErrorHandler.ThrowOnFailure(solution.QueryRenameProject(this.InteropSafeIVsProject3, this.filename, newFileName, 0, out canRenameContinue)); - - if (canRenameContinue == 0) - { - return VSConstants.OLE_E_PROMPTSAVECANCELLED; - } - - SuspendFileChanges fileChanges = new SuspendFileChanges(this.Site, oldName); - fileChanges.Suspend(); - try - { - // Save the project file and project file related properties. - this.SaveMSBuildProjectFileAs(newFileName); - - this.SetProjectFileDirty(false); - - - // TODO: If source control is enabled check out the project file. - - //Redraw. - this.OnPropertyChanged(this, (int)__VSHPROPID.VSHPROPID_Caption, 0); - - ErrorHandler.ThrowOnFailure(solution.OnAfterRenameProject(this.InteropSafeIVsProject3, oldName, this.filename, 0)); - - IVsUIShell shell = this.Site.GetService(typeof(SVsUIShell)) as IVsUIShell; - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if (shell == null) - { - throw new InvalidOperationException(); - } - ErrorHandler.ThrowOnFailure(shell.RefreshPropertyBrowser(0)); - } - finally - { - fileChanges.Resume(); - } - - return VSConstants.S_OK; - } - - /// - /// Saves project file related information to the new file name. It also calls msbuild API to save the project file. - /// It is called by the SaveAs method and the SetEditLabel before the project file rename related events are triggered. - /// An implementer can override this method to provide specialized semantics on how the project file is renamed in the msbuild file. - /// - /// The new full path of the project file - protected virtual void SaveMSBuildProjectFileAs(string newFileName) - { - Debug.Assert(!String.IsNullOrEmpty(newFileName), "Cannot save project file for an empty or null file name"); - - this.buildProject.FullPath = newFileName; - - this.filename = newFileName; - - string newFileNameWithoutExtension = Path.GetFileNameWithoutExtension(newFileName); - - // Refresh solution explorer - this.SetProjectProperty(ProjectFileConstants.Name, newFileNameWithoutExtension); - - // Saves the project file on disk. - this.buildProject.Save(newFileName); - - } - - /// - /// Adds a file to the msbuild project. - /// - /// The file to be added. - /// A ProjectElement describing the newly added file. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ToMs")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - protected virtual ProjectElement AddFileToMsBuild(string file) - { - ProjectElement newItem; - - string itemPath = PackageUtilities.MakeRelativeIfRooted(file, this.BaseURI); - Debug.Assert(!Path.IsPathRooted(itemPath), "Cannot add item with full path."); - - if (this.IsCodeFile(itemPath)) - { - newItem = this.CreateMsBuildFileItem(itemPath, ProjectFileConstants.Compile); - newItem.SetMetadata(ProjectFileConstants.SubType, ProjectFileAttributeValue.Code); - } - else if (this.IsEmbeddedResource(itemPath)) - { - newItem = this.CreateMsBuildFileItem(itemPath, ProjectFileConstants.EmbeddedResource); - } - else - { - newItem = this.CreateMsBuildFileItem(itemPath, ProjectFileConstants.Content); - newItem.SetMetadata(ProjectFileConstants.SubType, ProjectFileConstants.Content); - } - - return newItem; - } - - /// - /// Adds a folder to the msbuild project. - /// - /// The folder to be added. - /// A Projectelement describing the newly added folder. - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "ToMs")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - protected virtual ProjectElement AddFolderToMsBuild(string folder) - { - ProjectElement newItem; - - string itemPath = PackageUtilities.MakeRelativeIfRooted(folder, this.BaseURI); - Debug.Assert(!Path.IsPathRooted(itemPath), "Cannot add item with full path."); - - newItem = this.CreateMsBuildFileItem(itemPath, ProjectFileConstants.Folder); - - return newItem; - } - - /// - /// Determines whether an item can be owerwritten in the hierarchy. - /// - /// The orginal filname. - /// The computed new file name, that will be copied to the project directory or into the folder . - /// S_OK for success, or an error message - protected virtual int CanOverwriteExistingItem(string originalFileName, string computedNewFileName) - { - if (String.IsNullOrEmpty(originalFileName) || String.IsNullOrEmpty(computedNewFileName)) - { - return VSConstants.E_INVALIDARG; - } - - string message = String.Empty; - string title = String.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - - // If the document is open then return error message. - IVsUIHierarchy hier; - IVsWindowFrame windowFrame; - uint itemid = VSConstants.VSITEMID_NIL; - - bool isOpen = VsShellUtilities.IsDocumentOpen(this.Site, computedNewFileName, Guid.Empty, out hier, out itemid, out windowFrame); - - if (isOpen) - { - message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.CannotAddFileThatIsOpenInEditor, CultureInfo.CurrentUICulture), Path.GetFileName(computedNewFileName)); - VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - return VSConstants.E_ABORT; - } - - - // File already exists in project... message box - message = SR.GetString(SR.FileAlreadyInProject, CultureInfo.CurrentUICulture); - icon = OLEMSGICON.OLEMSGICON_QUERY; - buttons = OLEMSGBUTTON.OLEMSGBUTTON_YESNO; - int msgboxResult = VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - if (msgboxResult != NativeMethods.IDYES) - { - return (int)OleConstants.OLECMDERR_E_CANCELED; - } - - return VSConstants.S_OK; - } - - /// - /// Handle owerwriting of an existing item in the hierarchy. - /// - /// The node that exists. - protected virtual void OverwriteExistingItem(HierarchyNode existingNode) - { - - } - - /// - /// Adds a new file node to the hierarchy. - /// - /// The parent of the new fileNode - /// The file name - protected virtual void AddNewFileNodeToHierarchy(HierarchyNode parentNode, string fileName) - { - if (parentNode == null) - { - throw new ArgumentNullException("parentNode"); - } - - HierarchyNode child; - - // In the case of subitem, we want to create dependent file node - // and set the DependentUpon property - if (this.canFileNodesHaveChilds && (parentNode is FileNode || parentNode is DependentFileNode)) - { - child = this.CreateDependentFileNode(fileName); - child.ItemNode.SetMetadata(ProjectFileConstants.DependentUpon, parentNode.ItemNode.GetMetadata(ProjectFileConstants.Include)); - - // Make sure to set the HasNameRelation flag on the dependent node if it is related to the parent by name - if (!child.HasParentNodeNameRelation && string.Compare(child.GetRelationalName(), parentNode.GetRelationalName(), StringComparison.OrdinalIgnoreCase) == 0) - { - child.HasParentNodeNameRelation = true; - } - } - else - { - //Create and add new filenode to the project - child = this.CreateFileNode(fileName); - } - - parentNode.AddChild(child); - - // TODO : Revisit the VSADDFILEFLAGS here. Can it be a nested project? - this.tracker.OnItemAdded(fileName, VSADDFILEFLAGS.VSADDFILEFLAGS_NoFlags); - } - - /// - /// Defines whther the current mode of the project is in a supress command mode. - /// - /// - protected internal virtual bool IsCurrentStateASuppressCommandsMode() - { - if (VsShellUtilities.IsSolutionBuilding(this.Site)) - { - return true; - } - - DBGMODE dbgMode = VsShellUtilities.GetDebugMode(this.Site) & ~DBGMODE.DBGMODE_EncMask; - if (dbgMode == DBGMODE.DBGMODE_Run || dbgMode == DBGMODE.DBGMODE_Break) - { - return true; - } - - return false; - - } - - - /// - /// This is the list of output groups that the configuration object should - /// provide. - /// The first string is the name of the group. - /// The second string is the target name (MSBuild) for that group. - /// - /// To add/remove OutputGroups, simply override this method and edit the list. - /// - /// To get nice display names and description for your groups, override: - /// - GetOutputGroupDisplayName - /// - GetOutputGroupDescription - /// - /// List of output group name and corresponding MSBuild target - protected internal virtual IList> GetOutputGroupNames() - { - return new List>(outputGroupNames); - } - - /// - /// Get the display name of the given output group. - /// - /// Canonical name of the output group - /// Display name - protected internal virtual string GetOutputGroupDisplayName(string canonicalName) - { - string result = SR.GetString(String.Format(CultureInfo.InvariantCulture, "Output{0}", canonicalName), CultureInfo.CurrentUICulture); - if (String.IsNullOrEmpty(result)) - result = canonicalName; - return result; - } - - /// - /// Get the description of the given output group. - /// - /// Canonical name of the output group - /// Description - protected internal virtual string GetOutputGroupDescription(string canonicalName) - { - string result = SR.GetString(String.Format(CultureInfo.InvariantCulture, "Output{0}Description", canonicalName), CultureInfo.CurrentUICulture); - if (String.IsNullOrEmpty(result)) - result = canonicalName; - return result; - } - - /// - /// Set the configuration in MSBuild. - /// This does not get persisted and is used to evaluate msbuild conditions - /// which are based on the $(Configuration) property. - /// - protected internal virtual void SetCurrentConfiguration() - { - if (this.BuildInProgress) - { - // we are building so this should already be the current configuration - return; - } - - // Can't ask for the active config until the project is opened, so do nothing in that scenario - if (!this.projectOpened) - return; - - EnvDTE.Project automationObject = this.GetAutomationObject() as EnvDTE.Project; - - this.SetConfiguration(Utilities.GetActiveConfigurationName(automationObject)); - } - - /// - /// Set the configuration property in MSBuild. - /// This does not get persisted and is used to evaluate msbuild conditions - /// which are based on the $(Configuration) property. - /// - /// Configuration name - protected internal virtual void SetConfiguration(string config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - - // Can't ask for the active config until the project is opened, so do nothing in that scenario - if (!projectOpened) - return; - - // We cannot change properties during the build so if the config - // we want to set is the current, we do nothing otherwise we fail. - if (this.BuildInProgress) - { - EnvDTE.Project automationObject = this.GetAutomationObject() as EnvDTE.Project; - string currentConfigName = Utilities.GetActiveConfigurationName(automationObject); - bool configsAreEqual = String.Compare(currentConfigName, config, StringComparison.OrdinalIgnoreCase) == 0; - - if (configsAreEqual) - { - return; - } - throw new InvalidOperationException(); - } - - bool propertiesChanged = this.buildProject.SetGlobalProperty(ProjectFileConstants.Configuration, config); - if (this.currentConfig == null || propertiesChanged) - { - this.currentConfig = this.buildProject.CreateProjectInstance(); - } - - if (propertiesChanged || this.designTimeAssemblyResolution == null) - { - if (this.designTimeAssemblyResolution == null) - { - this.designTimeAssemblyResolution = new DesignTimeAssemblyResolution(); - } - - this.designTimeAssemblyResolution.Initialize(this); - } - - this.options = null; - } - - /// - /// Loads reference items from the project file into the hierarchy. - /// - protected internal virtual void ProcessReferences() - { - IReferenceContainer container = GetReferenceContainer(); - if (null == container) - { - // Process References - ReferenceContainerNode referencesFolder = CreateReferenceContainerNode(); - if (null == referencesFolder) - { - // This project type does not support references or there is a problem - // creating the reference container node. - // In both cases there is no point to try to process references, so exit. - return; - } - this.AddChild(referencesFolder); - container = referencesFolder; - } - - // Load the referernces. - container.LoadReferencesFromBuildProject(buildProject); - } - - /// - /// Loads folders from the project file into the hierarchy. - /// - protected internal virtual void ProcessFolders() - { - // Process Folders (useful to persist empty folder) - foreach (MSBuild.ProjectItem folder in this.buildProject.GetItems(ProjectFileConstants.Folder)) - { - string strPath = folder.EvaluatedInclude; - - // We do not need any special logic for assuring that a folder is only added once to the ui hierarchy. - // The below method will only add once the folder to the ui hierarchy - this.CreateFolderNodes(strPath); - } - } - - /// - /// Loads file items from the project file into the hierarchy. - /// - protected internal virtual void ProcessFiles() - { - List subitemsKeys = new List(); - Dictionary subitems = new Dictionary(); - - // Define a set for our build items. The value does not really matter here. - Dictionary items = new Dictionary(); - - // Process Files - foreach (MSBuild.ProjectItem item in this.buildProject.Items) - { - // Ignore the item if it is a reference or folder - if (this.FilterItemTypeToBeAddedToHierarchy(item.ItemType)) - continue; - - // MSBuilds tasks/targets can create items (such as object files), - // such items are not part of the project per say, and should not be displayed. - // so ignore those items. - if (!this.IsItemTypeFileType(item.ItemType)) - continue; - - // If the item is already contained do nothing. - // TODO: possibly report in the error list that the the item is already contained in the project file similar to Language projects. - if (items.ContainsKey(item.EvaluatedInclude.ToUpperInvariant())) - continue; - - // Make sure that we do not want to add the item, dependent, or independent twice to the ui hierarchy - items.Add(item.EvaluatedInclude.ToUpperInvariant(), item); - - string dependentOf = item.GetMetadataValue(ProjectFileConstants.DependentUpon); - - if (!this.CanFileNodesHaveChilds || String.IsNullOrEmpty(dependentOf)) - { - AddIndependentFileNode(item); - } - else - { - // We will process dependent items later. - // Note that we use 2 lists as we want to remove elements from - // the collection as we loop through it - subitemsKeys.Add(item.EvaluatedInclude); - subitems.Add(item.EvaluatedInclude, item); - } - } - - // Now process the dependent items. - if (this.CanFileNodesHaveChilds) - { - ProcessDependentFileNodes(subitemsKeys, subitems); - } - - } - - /// - /// Processes dependent filenodes from list of subitems. Multi level supported, but not circular dependencies. - /// - /// List of sub item keys - /// - protected internal virtual void ProcessDependentFileNodes(IList subitemsKeys, Dictionary subitems) - { - if (subitemsKeys == null || subitems == null) - { - return; - } - - foreach (string key in subitemsKeys) - { - // A previous pass could have removed the key so make sure it still needs to be added - if (!subitems.ContainsKey(key)) - continue; - - AddDependentFileNode(subitems, key); - } - } - - /// - /// For flavored projects which implement IPersistXMLFragment, load the information now - /// - protected internal virtual void LoadNonBuildInformation() - { - IPersistXMLFragment outerHierarchy = this.InteropSafeIVsHierarchy as IPersistXMLFragment; - if (outerHierarchy != null) - { - this.LoadXmlFragment(outerHierarchy, null); - } - } - - /// - /// Used to sort nodes in the hierarchy. - /// - protected internal virtual int CompareNodes(HierarchyNode node1, HierarchyNode node2) - { - Debug.Assert(node1 != null && node2 != null); - if (node1 == null) - { - throw new ArgumentNullException("node1"); - } - - if (node2 == null) - { - throw new ArgumentNullException("node2"); - } - - if (node1.SortPriority == node2.SortPriority) - { - return String.Compare(node2.Caption, node1.Caption, true, CultureInfo.CurrentCulture); - } - else - { - return node2.SortPriority - node1.SortPriority; - } - } - - /// - /// Handles global properties related to configuration and platform changes invoked by a change in the active configuration. - /// - /// The sender of the event. - /// The event args - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2109:ReviewVisibleEventHandlers", - Justification = "This method will give the opportunity to update global properties based on active configuration change. " + - "There is no security threat that could otherwise not be reached by listening to configuration chnage events.")] - protected virtual void OnHandleConfigurationRelatedGlobalProperties(object sender, ActiveConfigurationChangedEventArgs eventArgs) - { - Debug.Assert(eventArgs != null, "Wrong hierarchy passed as event arg for the configuration change listener."); - - // If (eventArgs.Hierarchy == NULL) then we received this event because the solution configuration - // was changed. - // If it is not null we got the event because a project in teh configuration manager has changed its active configuration. - // We care only about our project in the default implementation. - if (eventArgs == null || eventArgs.Hierarchy == null || !Utilities.IsSameComObject(eventArgs.Hierarchy, this.InteropSafeIVsHierarchy)) - { - return; - } - - string name, platform; - if (!Utilities.TryGetActiveConfigurationAndPlatform(this.Site, this.InteropSafeIVsHierarchy, out name, out platform)) - { - throw new InvalidOperationException(); - } - - this.buildProject.SetGlobalProperty(GlobalProperty.Configuration.ToString(), name); - - // If the platform is "Any CPU" then it should be set to AnyCPU, since that is the property value in MsBuild terms. - if (String.Compare(platform, ConfigProvider.AnyCPUPlatform, StringComparison.Ordinal) == 0) - { - platform = ProjectFileValues.AnyCPU; - } - - this.buildProject.SetGlobalProperty(GlobalProperty.Platform.ToString(), platform); - } - - /// - /// Flush any remaining content from build logger. - /// This method is called as part of the callback method passed to the buildsubmission during async build - /// so that results can be printed the the build is finished. - /// - protected virtual void FlushBuildLoggerContent() - { - } - #endregion - - #region non-virtual methods - - /// - /// Suspends MSBuild - /// - public void SuspendMSBuild() - { - this.suspendMSBuildCounter++; - } - - /// - /// Resumes MSBuild. - /// - public void ResumeMSBuild(string config, IVsOutputWindowPane output, string target) - { - this.suspendMSBuildCounter--; - - if (this.suspendMSBuildCounter == 0 && this.invokeMSBuildWhenResumed) - { - try - { - this.Build(config, output, target); - } - finally - { - this.invokeMSBuildWhenResumed = false; - } - } - } - - /// - /// Resumes MSBuild. - /// - public void ResumeMSBuild(string config, string target) - { - this.ResumeMSBuild(config, null, target); - } - - /// - /// Resumes MSBuild. - /// - public void ResumeMSBuild(string target) - { - this.ResumeMSBuild(String.Empty, null, target); - } - - /// - /// Calls MSBuild if it is not suspended. If it is suspended then it will remember to call when msbuild is resumed. - /// - public MSBuildResult CallMSBuild(string config, IVsOutputWindowPane output, string target) - { - if (this.suspendMSBuildCounter > 0) - { - // remember to invoke MSBuild - this.invokeMSBuildWhenResumed = true; - return MSBuildResult.Suspended; - } - else - { - return this.Build(config, output, target); - } - } - - /// - /// Overloaded method. Calls MSBuild if it is not suspended. Does not log on the outputwindow. If it is suspended then it will remeber to call when msbuild is resumed. - /// - public MSBuildResult CallMSBuild(string config, string target) - { - return this.CallMSBuild(config, null, target); - } - - /// - /// Calls MSBuild if it is not suspended. Does not log and uses current configuration. If it is suspended then it will remeber to call when msbuild is resumed. - /// - public MSBuildResult CallMSBuild(string target) - { - return this.CallMSBuild(String.Empty, null, target); - } - - /// - /// Calls MSBuild if it is not suspended. Uses current configuration. If it is suspended then it will remeber to call when msbuild is resumed. - /// - public MSBuildResult CallMSBuild(string target, IVsOutputWindowPane output) - { - return this.CallMSBuild(String.Empty, output, target); - } - - /// - /// Overloaded method to invoke MSBuild - /// - public MSBuildResult Build(string config, IVsOutputWindowPane output, string target) - { - return this.Build(0, config, output, target); - } - - /// - /// Overloaded method to invoke MSBuild. Does not log build results to the output window pane. - /// - public MSBuildResult Build(string config, string target) - { - return this.Build(0, config, null, target); - } - - /// - /// Overloaded method. Invokes MSBuild using the default configuration and does without logging on the output window pane. - /// - public MSBuildResult Build(string target) - { - return this.Build(0, String.Empty, null, target); - } - - /// - /// Overloaded method. Invokes MSBuild using the default configuration. - /// - public MSBuildResult Build(string target, IVsOutputWindowPane output) - { - return this.Build(0, String.Empty, output, target); - } - - /// - /// Get the output path for a specific configuration name - /// - /// name of configuration - /// Output path - public string GetOutputPath(string config) - { - this.SetConfiguration(config); - return this.GetOutputPath(this.currentConfig); - } - - /// - /// Get value of Project property - /// - /// Name of Property to retrieve - /// Evaluated value of property. - public string GetProjectProperty(string propertyName) - { - return this.GetProjectProperty(propertyName, true); - } - - /// - /// Gets the unevaluated value of a project property. - /// - /// The name of the property to retrieve. - /// Unevaluated value of the property. - public string GetProjectPropertyUnevaluated(string propertyName) - { - return this.buildProject.GetProperty(propertyName).UnevaluatedValue; - } - - /// - /// Set dirty state of project - /// - /// boolean value indicating dirty state - public void SetProjectFileDirty(bool value) - { - this.isDirty = value; - if (this.isDirty) - { - this.lastModifiedTime = DateTime.Now; - this.buildIsPrepared = false; - } - } - - /// - /// Get output assembly for a specific configuration name - /// - /// Name of configuration - /// Name of output assembly - public string GetOutputAssembly(string config) - { - ProjectOptions options = this.GetProjectOptions(config); - - return options.OutputAssembly; - } - - /// - /// Get Node from ItemID. - /// - /// ItemID for the requested node - /// Node if found - public HierarchyNode NodeFromItemId(uint itemId) - { - if (VSConstants.VSITEMID_ROOT == itemId) - { - return this; - } - else if (VSConstants.VSITEMID_NIL == itemId) - { - return null; - } - else if (VSConstants.VSITEMID_SELECTION == itemId) - { - throw new NotImplementedException(); - } - - return (HierarchyNode)this.ItemIdMap[itemId]; - } - - /// - /// This method return new project element, and add new MSBuild item to the project/build hierarchy - /// - /// file name - /// MSBuild item type - /// new project element - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - public ProjectElement CreateMsBuildFileItem(string file, string itemType) - { - return new ProjectElement(this, file, itemType); - } - - /// - /// This method returns new project element based on existing MSBuild item. It does not modify/add project/build hierarchy at all. - /// - /// MSBuild item instance - /// wrapping project element - public ProjectElement GetProjectElement(MSBuild.ProjectItem item) - { - return new ProjectElement(this, item, false); - } - - /// - /// Create FolderNode from Path - /// - /// Path to folder - /// FolderNode created that can be added to the hierarchy - protected internal FolderNode CreateFolderNode(string path) - { - ProjectElement item = this.AddFolderToMsBuild(path); - FolderNode folderNode = CreateFolderNode(path, item); - return folderNode; - } - - /// - /// Verify if the file can be written to. - /// Return false if the file is read only and/or not checked out - /// and the user did not give permission to change it. - /// Note that exact behavior can also be affected based on the SCC - /// settings under Tools->Options. - /// - internal bool QueryEditProjectFile(bool suppressUI) - { - bool result = true; - if (this.site == null) - { - // We're already zombied. Better return FALSE. - result = false; - } - else if (this.disableQueryEdit) - { - return true; - } - else - { - IVsQueryEditQuerySave2 queryEditQuerySave = this.GetService(typeof(SVsQueryEditQuerySave)) as IVsQueryEditQuerySave2; - if (queryEditQuerySave != null) - { // Project path dependends on server/client project - string path = this.filename; - - tagVSQueryEditFlags qef = tagVSQueryEditFlags.QEF_AllowInMemoryEdits; - if (suppressUI) - qef |= tagVSQueryEditFlags.QEF_SilentMode; - - // If we are debugging, we want to prevent our project from being reloaded. To - // do this, we pass the QEF_NoReload flag - if (!Utilities.IsVisualStudioInDesignMode(this.Site)) - qef |= tagVSQueryEditFlags.QEF_NoReload; - - uint verdict; - uint moreInfo; - string[] files = new string[1]; - files[0] = path; - uint[] flags = new uint[1]; - VSQEQS_FILE_ATTRIBUTE_DATA[] attributes = new VSQEQS_FILE_ATTRIBUTE_DATA[1]; - int hr = queryEditQuerySave.QueryEditFiles( - (uint)qef, - 1, // 1 file - files, // array of files - flags, // no per file flags - attributes, // no per file file attributes - out verdict, - out moreInfo /* ignore additional results */); - - tagVSQueryEditResult qer = (tagVSQueryEditResult)verdict; - if (ErrorHandler.Failed(hr) || (qer != tagVSQueryEditResult.QER_EditOK)) - { - if (!suppressUI && !Utilities.IsInAutomationFunction(this.Site)) - { - string message = SR.GetString(SR.CancelQueryEdit, path); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - } - result = false; - } - } - } - return result; - } - - /// - /// Checks whether a hierarchy is a nested project. - /// - /// - /// - internal NestedProjectNode GetNestedProjectForHierarchy(IVsHierarchy hierarchy) - { - IVsProject3 project = hierarchy as IVsProject3; - - if (project != null) - { - string mkDocument = String.Empty; - ErrorHandler.ThrowOnFailure(project.GetMkDocument(VSConstants.VSITEMID_ROOT, out mkDocument)); - - if (!String.IsNullOrEmpty(mkDocument)) - { - HierarchyNode node = this.FindChild(mkDocument); - - return node as NestedProjectNode; - } - } - - return null; - } - - /// - /// Given a node determines what is the directory that can accept files. - /// If the node is a FoldeNode than it is the Url of the Folder. - /// If the node is a ProjectNode it is the project folder. - /// Otherwise (such as FileNode subitem) it delegate the resolution to the parent node. - /// - internal string GetBaseDirectoryForAddingFiles(HierarchyNode nodeToAddFile) - { - string baseDir = String.Empty; - - if (nodeToAddFile is FolderNode) - { - baseDir = nodeToAddFile.Url; - } - else if (nodeToAddFile is ProjectNode) - { - baseDir = this.ProjectFolder; - } - else if (nodeToAddFile != null) - { - baseDir = GetBaseDirectoryForAddingFiles(nodeToAddFile.Parent); - } - - return baseDir; - } - - /// - /// For internal use only. - /// This creates a copy of an existing configuration and add it to the project. - /// Caller should change the condition on the PropertyGroup. - /// If derived class want to accomplish this, they should call ConfigProvider.AddCfgsOfCfgName() - /// It is expected that in the future MSBuild will have support for this so we don't have to - /// do it manually. - /// - /// PropertyGroup to clone - /// - internal MSBuildConstruction.ProjectPropertyGroupElement ClonePropertyGroup(MSBuildConstruction.ProjectPropertyGroupElement group) - { - // Create a new (empty) PropertyGroup - MSBuildConstruction.ProjectPropertyGroupElement newPropertyGroup = this.buildProject.Xml.AddPropertyGroup(); - - // Now copy everything from the group we are trying to clone to the group we are creating - if (!String.IsNullOrEmpty(group.Condition)) - newPropertyGroup.Condition = group.Condition; - foreach (MSBuildConstruction.ProjectPropertyElement prop in group.Properties) - { - MSBuildConstruction.ProjectPropertyElement newProperty = newPropertyGroup.AddProperty(prop.Name, prop.Value); - if (!String.IsNullOrEmpty(prop.Condition)) - newProperty.Condition = prop.Condition; - } - - return newPropertyGroup; - } - - /// - /// Get the project extensions - /// - /// - internal MSBuildConstruction.ProjectExtensionsElement GetProjectExtensions() - { - var extensionsElement = this.buildProject.Xml.ChildrenReversed.OfType().FirstOrDefault(); - - if (extensionsElement == null) - { - extensionsElement = this.buildProject.Xml.CreateProjectExtensionsElement(); - this.buildProject.Xml.AppendChild(extensionsElement); - } - - return extensionsElement; - } - - /// - /// Set the xmlText as a project extension element with the id passed. - /// - /// The id of the project extension element. - /// The value to set for a project extension. - internal void SetProjectExtensions(string id, string xmlText) - { - MSBuildConstruction.ProjectExtensionsElement element = this.GetProjectExtensions(); - - // If it doesn't already have a value and we're asked to set it to - // nothing, don't do anything. Same as old OM. Keeps project neat. - if (element == null) - { - if (xmlText.Length == 0) - { - return; - } - - element = this.buildProject.Xml.CreateProjectExtensionsElement(); - this.buildProject.Xml.AppendChild(element); - } - - element[id] = xmlText; - } - - /// - /// Register the project with the Scc manager. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - protected void RegisterSccProject() - { - - if (this.IsSccDisabled || this.isRegisteredWithScc || String.IsNullOrEmpty(this.sccProjectName)) - { - return; - } - - IVsSccManager2 sccManager = this.Site.GetService(typeof(SVsSccManager)) as IVsSccManager2; - - if (sccManager != null) - { - ErrorHandler.ThrowOnFailure(sccManager.RegisterSccProject(this.InteropSafeIVsSccProject2, this.sccProjectName, this.sccAuxPath, this.sccLocalPath, this.sccProvider)); - - this.isRegisteredWithScc = true; - } - } - - /// - /// Unregisters us from the SCC manager - /// - [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "UnRegister")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Un")] - protected void UnRegisterProject() - { - if (this.IsSccDisabled || !this.isRegisteredWithScc) - { - return; - } - - IVsSccManager2 sccManager = this.Site.GetService(typeof(SVsSccManager)) as IVsSccManager2; - - if (sccManager != null) - { - ErrorHandler.ThrowOnFailure(sccManager.UnregisterSccProject(this.InteropSafeIVsSccProject2)); - this.isRegisteredWithScc = false; - } - } - - /// - /// Get the CATID corresponding to the specified type. - /// - /// Type of the object for which you want the CATID - /// CATID - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CATID")] - protected internal Guid GetCATIDForType(Type type) - { - if (type == null) - throw new ArgumentNullException("type"); - - if (catidMapping.ContainsKey(type)) - return catidMapping[type]; - // If you get here and you want your object to be extensible, then add a call to AddCATIDMapping() in your project constructor - return Guid.Empty; - } - - /// - /// This is used to specify a CATID corresponding to a BrowseObject or an ExtObject. - /// The CATID can be any GUID you choose. For types which are your owns, you could use - /// their type GUID, while for other types (such as those provided in the MPF) you should - /// provide a different GUID. - /// - /// Type of the extensible object - /// GUID that extender can use to uniquely identify your object type - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "catid")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CATID")] - protected void AddCATIDMapping(Type type, Guid catid) - { - catidMapping.Add(type, catid); - } - - /// - /// Initialize an object with an XML fragment. - /// - /// Object that support being initialized with an XML fragment - /// Name of the configuration being initialized, null if it is the project - protected internal void LoadXmlFragment(IPersistXMLFragment persistXmlFragment, string configName) - { - if (persistXmlFragment == null) - { - throw new ArgumentNullException("persistXmlFragment"); - } - - if (xmlFragments == null) - { - // Retrieve the xml fragments from MSBuild - xmlFragments = new XmlDocument(); - - string fragments = GetProjectExtensions()[ProjectFileConstants.VisualStudio]; - fragments = String.Format(CultureInfo.InvariantCulture, "{0}", fragments); - xmlFragments.LoadXml(fragments); - } - - // We need to loop through all the flavors - string flavorsGuid; - ErrorHandler.ThrowOnFailure(((IVsAggregatableProject)this).GetAggregateProjectTypeGuids(out flavorsGuid)); - foreach (Guid flavor in Utilities.GuidsArrayFromSemicolonDelimitedStringOfGuids(flavorsGuid)) - { - // Look for a matching fragment - string flavorGuidString = flavor.ToString("B"); - string fragment = null; - XmlNode node = null; - foreach (XmlNode child in xmlFragments.FirstChild.ChildNodes) - { - if (child.Attributes.Count > 0) - { - string guid = String.Empty; - string configuration = String.Empty; - if (child.Attributes[ProjectFileConstants.Guid] != null) - guid = child.Attributes[ProjectFileConstants.Guid].Value; - if (child.Attributes[ProjectFileConstants.Configuration] != null) - configuration = child.Attributes[ProjectFileConstants.Configuration].Value; - - if (String.Compare(child.Name, ProjectFileConstants.FlavorProperties, StringComparison.OrdinalIgnoreCase) == 0 - && String.Compare(guid, flavorGuidString, StringComparison.OrdinalIgnoreCase) == 0 - && ((String.IsNullOrEmpty(configName) && String.IsNullOrEmpty(configuration)) - || (String.Compare(configuration, configName, StringComparison.OrdinalIgnoreCase) == 0))) - { - // we found the matching fragment - fragment = child.InnerXml; - node = child; - break; - } - } - } - - Guid flavorGuid = flavor; - if (String.IsNullOrEmpty(fragment)) - { - // the fragment was not found so init with default values - ErrorHandler.ThrowOnFailure(persistXmlFragment.InitNew(ref flavorGuid, (uint)_PersistStorageType.PST_PROJECT_FILE)); - // While we don't yet support user files, our flavors might, so we will store that in the project file until then - // TODO: Refactor this code when we support user files - ErrorHandler.ThrowOnFailure(persistXmlFragment.InitNew(ref flavorGuid, (uint)_PersistStorageType.PST_USER_FILE)); - } - else - { - ErrorHandler.ThrowOnFailure(persistXmlFragment.Load(ref flavorGuid, (uint)_PersistStorageType.PST_PROJECT_FILE, fragment)); - // While we don't yet support user files, our flavors might, so we will store that in the project file until then - // TODO: Refactor this code when we support user files - if (node.NextSibling != null && node.NextSibling.Attributes[ProjectFileConstants.User] != null) - ErrorHandler.ThrowOnFailure(persistXmlFragment.Load(ref flavorGuid, (uint)_PersistStorageType.PST_USER_FILE, node.NextSibling.InnerXml)); - } - } - } - - /// - /// Retrieve all XML fragments that need to be saved from the flavors and store the information in msbuild. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XML")] - protected void PersistXMLFragments() - { - if (this.IsFlavorDirty() != 0) - { - XmlDocument doc = new XmlDocument(); - XmlElement root = doc.CreateElement("ROOT"); - - // We will need the list of configuration inside the loop, so get it before entering the loop - uint[] count = new uint[1]; - IVsCfg[] configs = null; - int hr = this.ConfigProvider.GetCfgs(0, null, count, null); - if (ErrorHandler.Succeeded(hr) && count[0] > 0) - { - configs = new IVsCfg[count[0]]; - hr = this.ConfigProvider.GetCfgs((uint)configs.Length, configs, count, null); - if (ErrorHandler.Failed(hr)) - count[0] = 0; - } - if (count[0] == 0) - configs = new IVsCfg[0]; - - // We need to loop through all the flavors - string flavorsGuid; - ErrorHandler.ThrowOnFailure(((IVsAggregatableProject)this).GetAggregateProjectTypeGuids(out flavorsGuid)); - foreach (Guid flavor in Utilities.GuidsArrayFromSemicolonDelimitedStringOfGuids(flavorsGuid)) - { - IPersistXMLFragment outerHierarchy = this.InteropSafeIVsHierarchy as IPersistXMLFragment; - // First check the project - if (outerHierarchy != null) - { - // Retrieve the XML fragment - string fragment = string.Empty; - Guid flavorGuid = flavor; - ErrorHandler.ThrowOnFailure((outerHierarchy).Save(ref flavorGuid, (uint)_PersistStorageType.PST_PROJECT_FILE, out fragment, 1)); - if (!String.IsNullOrEmpty(fragment)) - { - // Add the fragment to our XML - WrapXmlFragment(doc, root, flavor, null, fragment); - } - // While we don't yet support user files, our flavors might, so we will store that in the project file until then - // TODO: Refactor this code when we support user files - fragment = String.Empty; - ErrorHandler.ThrowOnFailure((outerHierarchy).Save(ref flavorGuid, (uint)_PersistStorageType.PST_USER_FILE, out fragment, 1)); - if (!String.IsNullOrEmpty(fragment)) - { - // Add the fragment to our XML - XmlElement node = WrapXmlFragment(doc, root, flavor, null, fragment); - node.Attributes.Append(doc.CreateAttribute(ProjectFileConstants.User)); - } - } - - // Then look at the configurations - foreach (IVsCfg config in configs) - { - // Get the fragment for this flavor/config pair - string fragment; - ErrorHandler.ThrowOnFailure(((ProjectConfig)config).GetXmlFragment(flavor, _PersistStorageType.PST_PROJECT_FILE, out fragment)); - if (!String.IsNullOrEmpty(fragment)) - { - string configName; - ErrorHandler.ThrowOnFailure(config.get_DisplayName(out configName)); - WrapXmlFragment(doc, root, flavor, configName, fragment); - } - } - } - if (root.ChildNodes != null && root.ChildNodes.Count > 0) - { - // Save our XML (this is only the non-build information for each flavor) in msbuild - SetProjectExtensions(ProjectFileConstants.VisualStudio, root.InnerXml.ToString()); - } - } - } - - #endregion - - #region IVsGetCfgProvider Members - //================================================================================= - - public virtual int GetCfgProvider(out IVsCfgProvider p) - { - CCITracing.TraceCall(); - // Be sure to call the property here since that is doing a polymorhic ProjectConfig creation. - p = this.ConfigProvider; - return (p == null ? VSConstants.E_NOTIMPL : VSConstants.S_OK); - } - #endregion - - #region IPersist Members - - public int GetClassID(out Guid clsid) - { - clsid = this.ProjectGuid; - return VSConstants.S_OK; - } - #endregion - - #region IPersistFileFormat Members - - int IPersistFileFormat.GetClassID(out Guid clsid) - { - clsid = this.ProjectGuid; - return VSConstants.S_OK; - } - - public virtual int GetCurFile(out string name, out uint formatIndex) - { - name = this.filename; - formatIndex = 0; - return VSConstants.S_OK; - } - - public virtual int GetFormatList(out string formatlist) - { - formatlist = String.Empty; - return VSConstants.S_OK; - } - - public virtual int InitNew(uint formatIndex) - { - return VSConstants.S_OK; - } - - public virtual int IsDirty(out int isDirty) - { - isDirty = 0; - if (this.buildProject.Xml.HasUnsavedChanges || this.IsProjectFileDirty) - { - isDirty = 1; - return VSConstants.S_OK; - } - - isDirty = IsFlavorDirty(); - - return VSConstants.S_OK; - } - - protected int IsFlavorDirty() - { - int isDirty = 0; - // See if one of our flavor consider us dirty - IPersistXMLFragment outerHierarchy = this.InteropSafeIVsHierarchy as IPersistXMLFragment; - if (outerHierarchy != null) - { - // First check the project - ErrorHandler.ThrowOnFailure(outerHierarchy.IsFragmentDirty((uint)_PersistStorageType.PST_PROJECT_FILE, out isDirty)); - // While we don't yet support user files, our flavors might, so we will store that in the project file until then - // TODO: Refactor this code when we support user files - if (isDirty == 0) - ErrorHandler.ThrowOnFailure(outerHierarchy.IsFragmentDirty((uint)_PersistStorageType.PST_USER_FILE, out isDirty)); - } - if (isDirty == 0) - { - // Then look at the configurations - uint[] count = new uint[1]; - int hr = this.ConfigProvider.GetCfgs(0, null, count, null); - if (ErrorHandler.Succeeded(hr) && count[0] > 0) - { - // We need to loop through the configurations - IVsCfg[] configs = new IVsCfg[count[0]]; - hr = this.ConfigProvider.GetCfgs((uint)configs.Length, configs, count, null); - Debug.Assert(ErrorHandler.Succeeded(hr), "failed to retrieve configurations"); - foreach (IVsCfg config in configs) - { - isDirty = ((ProjectConfig)config).IsFlavorDirty(_PersistStorageType.PST_PROJECT_FILE); - if (isDirty != 0) - break; - } - } - } - return isDirty; - } - - public virtual int Load(string fileName, uint mode, int readOnly) - { - this.filename = fileName; - this.Reload(); - return VSConstants.S_OK; - } - - public virtual int Save(string fileToBeSaved, int remember, uint formatIndex) - { - - // The file name can be null. Then try to use the Url. - string tempFileToBeSaved = fileToBeSaved; - if (String.IsNullOrEmpty(tempFileToBeSaved) && !String.IsNullOrEmpty(this.Url)) - { - tempFileToBeSaved = this.Url; - } - - if (String.IsNullOrEmpty(tempFileToBeSaved)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "fileToBeSaved"); - } - - bool setProjectFileDirtyAfterSave = false; - if (remember == 0) - { - setProjectFileDirtyAfterSave = this.IsProjectFileDirty; - } - - // Update the project with the latest flavor data (if needed) - PersistXMLFragments(); - - int result = VSConstants.S_OK; - bool saveAs = true; - if (NativeMethods.IsSamePath(tempFileToBeSaved, this.filename)) - { - saveAs = false; - } - if (!saveAs) - { - SuspendFileChanges fileChanges = new SuspendFileChanges(this.Site, this.filename); - fileChanges.Suspend(); - try - { - // Ensure the directory exist - string saveFolder = Path.GetDirectoryName(tempFileToBeSaved); - if (!Directory.Exists(saveFolder)) - Directory.CreateDirectory(saveFolder); - // Save the project - this.buildProject.Save(tempFileToBeSaved); - this.SetProjectFileDirty(false); - } - finally - { - fileChanges.Resume(); - } - } - else - { - result = this.SaveAs(tempFileToBeSaved); - if (result != VSConstants.OLE_E_PROMPTSAVECANCELLED) - { - ErrorHandler.ThrowOnFailure(result); - } - - } - - if (setProjectFileDirtyAfterSave) - { - this.SetProjectFileDirty(true); - } - - return result; - } - - public virtual int SaveCompleted(string filename) - { - // TODO: turn file watcher back on. - return VSConstants.S_OK; - } - #endregion - - #region IVsProject3 Members - - /// - /// Callback from the additem dialog. Deals with adding new and existing items - /// - public virtual int GetMkDocument(uint itemId, out string mkDoc) - { - mkDoc = null; - if (itemId == VSConstants.VSITEMID_SELECTION) - { - return VSConstants.E_UNEXPECTED; - } - - HierarchyNode n = this.NodeFromItemId(itemId); - if (n == null) - { - return VSConstants.E_INVALIDARG; - } - - mkDoc = n.GetMkDocument(); - - if (String.IsNullOrEmpty(mkDoc)) - { - return VSConstants.E_FAIL; - } - - return VSConstants.S_OK; - } - - - public virtual int AddItem(uint itemIdLoc, VSADDITEMOPERATION op, string itemName, uint filesToOpen, string[] files, IntPtr dlgOwner, VSADDRESULT[] result) - { - Guid empty = Guid.Empty; - - return AddItemWithSpecific(itemIdLoc, op, itemName, filesToOpen, files, dlgOwner, 0, ref empty, null, ref empty, result); - } - - /// - /// Creates new items in a project, adds existing files to a project, or causes Add Item wizards to be run - /// - /// - /// - /// - /// - /// Array of file names. - /// If dwAddItemOperation is VSADDITEMOP_CLONEFILE the first item in the array is the name of the file to clone. - /// If dwAddItemOperation is VSADDITEMOP_OPENDIRECTORY, the first item in the array is the directory to open. - /// If dwAddItemOperation is VSADDITEMOP_RUNWIZARD, the first item is the name of the wizard to run, - /// and the second item is the file name the user supplied (same as itemName). - /// - /// - /// - /// - /// - /// - /// S_OK if it succeeds - /// The result array is initalized to failure. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1506:AvoidExcessiveClassCoupling"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] - public virtual int AddItemWithSpecific(uint itemIdLoc, VSADDITEMOPERATION op, string itemName, uint filesToOpen, string[] files, IntPtr dlgOwner, uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, VSADDRESULT[] result) - { - if (files == null || result == null || files.Length == 0 || result.Length == 0) - { - return VSConstants.E_INVALIDARG; - } - - // Locate the node to be the container node for the file(s) being added - // only projectnode or foldernode and file nodes are valid container nodes - // We need to locate the parent since the item wizard expects the parent to be passed. - HierarchyNode n = this.NodeFromItemId(itemIdLoc); - if (n == null) - { - return VSConstants.E_INVALIDARG; - } - - while ((!(n is ProjectNode)) && (!(n is FolderNode)) && (!this.CanFileNodesHaveChilds || !(n is FileNode))) - { - n = n.Parent; - } - Debug.Assert(n != null, "We should at this point have either a ProjectNode or FolderNode or a FileNode as a container for the new filenodes"); - - // handle link and runwizard operations at this point - switch (op) - { - case VSADDITEMOPERATION.VSADDITEMOP_LINKTOFILE: - // we do not support this right now - throw new NotImplementedException("VSADDITEMOP_LINKTOFILE"); - - case VSADDITEMOPERATION.VSADDITEMOP_RUNWIZARD: - result[0] = this.RunWizard(n, itemName, files[0], dlgOwner); - return VSConstants.S_OK; - } - - string[] actualFiles = new string[files.Length]; - - - VSQUERYADDFILEFLAGS[] flags = this.GetQueryAddFileFlags(files); - - string baseDir = this.GetBaseDirectoryForAddingFiles(n); - // If we did not get a directory for node that is the parent of the item then fail. - if (String.IsNullOrEmpty(baseDir)) - { - return VSConstants.E_FAIL; - } - - // Pre-calculates some paths that we can use when calling CanAddItems - List filesToAdd = new List(); - for (int index = 0; index < files.Length; index++) - { - string newFileName = String.Empty; - - string file = files[index]; - - switch (op) - { - case VSADDITEMOPERATION.VSADDITEMOP_CLONEFILE: - { - string fileName = Path.GetFileName(itemName); - newFileName = Path.Combine(baseDir, fileName); - } - break; - case VSADDITEMOPERATION.VSADDITEMOP_OPENFILE: - { - string fileName = Path.GetFileName(file); - newFileName = Path.Combine(baseDir, fileName); - } - break; - } - filesToAdd.Add(newFileName); - } - - // Ask tracker objects if we can add files - if (!this.tracker.CanAddItems(filesToAdd.ToArray(), flags)) - { - // We were not allowed to add the files - return VSConstants.E_FAIL; - } - - if (!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - // Add the files to the hierarchy - int actualFilesAddedIndex = 0; - for (int index = 0; index < filesToAdd.Count; index++) - { - HierarchyNode child; - bool overwrite = false; - string newFileName = filesToAdd[index]; - - string file = files[index]; - result[0] = VSADDRESULT.ADDRESULT_Failure; - - child = this.FindChild(newFileName); - if (child != null) - { - // If the file to be added is an existing file part of the hierarchy then continue. - if (NativeMethods.IsSamePath(file, newFileName)) - { - result[0] = VSADDRESULT.ADDRESULT_Cancel; - continue; - } - - int canOverWriteExistingItem = this.CanOverwriteExistingItem(file, newFileName); - - if (canOverWriteExistingItem == (int)OleConstants.OLECMDERR_E_CANCELED) - { - result[0] = VSADDRESULT.ADDRESULT_Cancel; - return canOverWriteExistingItem; - } - else if (canOverWriteExistingItem == VSConstants.S_OK) - { - overwrite = true; - } - else - { - return canOverWriteExistingItem; - } - } - - // If the file to be added is not in the same path copy it. - if (NativeMethods.IsSamePath(file, newFileName) == false) - { - if (!overwrite && File.Exists(newFileName)) - { - string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileAlreadyExists, CultureInfo.CurrentUICulture), newFileName); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_QUERY; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_YESNO; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - int messageboxResult = VsShellUtilities.ShowMessageBox(this.Site, title, message, icon, buttons, defaultButton); - if (messageboxResult == NativeMethods.IDNO) - { - result[0] = VSADDRESULT.ADDRESULT_Cancel; - return (int)OleConstants.OLECMDERR_E_CANCELED; - } - } - - // Copy the file to the correct location. - // We will suppress the file change events to be triggered to this item, since we are going to copy over the existing file and thus we will trigger a file change event. - // We do not want the filechange event to ocur in this case, similar that we do not want a file change event to occur when saving a file. - IVsFileChangeEx fileChange = this.site.GetService(typeof(SVsFileChangeEx)) as IVsFileChangeEx; - if (fileChange == null) - { - throw new InvalidOperationException(); - } - - try - { - ErrorHandler.ThrowOnFailure(fileChange.IgnoreFile(VSConstants.VSCOOKIE_NIL, newFileName, 1)); - if (op == VSADDITEMOPERATION.VSADDITEMOP_CLONEFILE) - { - this.AddFileFromTemplate(file, newFileName); - } - else - { - PackageUtilities.CopyUrlToLocal(new Uri(file), newFileName); - } - } - finally - { - ErrorHandler.ThrowOnFailure(fileChange.IgnoreFile(VSConstants.VSCOOKIE_NIL, newFileName, 0)); - } - } - - if (overwrite) - { - this.OverwriteExistingItem(child); - } - else - { - //Add new filenode/dependentfilenode - this.AddNewFileNodeToHierarchy(n, newFileName); - } - - result[0] = VSADDRESULT.ADDRESULT_Success; - actualFiles[actualFilesAddedIndex++] = newFileName; - } - - // Notify listeners that items were appended. - if (actualFilesAddedIndex > 0) - n.OnItemsAppended(n); - - //Open files if this was requested through the editorFlags - bool openFiles = (editorFlags & (uint)__VSSPECIFICEDITORFLAGS.VSSPECIFICEDITOR_DoOpen) != 0; - if (openFiles && actualFiles.Length <= filesToOpen) - { - for (int i = 0; i < filesToOpen; i++) - { - if (!String.IsNullOrEmpty(actualFiles[i])) - { - string name = actualFiles[i]; - HierarchyNode child = this.FindChild(name); - Debug.Assert(child != null, "We should have been able to find the new element in the hierarchy"); - if (child != null) - { - IVsWindowFrame frame; - if (editorType == Guid.Empty) - { - Guid view = Guid.Empty; - ErrorHandler.ThrowOnFailure(this.OpenItem(child.ID, ref view, IntPtr.Zero, out frame)); - } - else - { - ErrorHandler.ThrowOnFailure(this.OpenItemWithSpecific(child.ID, editorFlags, ref editorType, physicalView, ref logicalView, IntPtr.Zero, out frame)); - } - - // Show the window frame in the UI and make it the active window - if (frame != null) - { - ErrorHandler.ThrowOnFailure(frame.Show()); - } - } - } - } - } - - return VSConstants.S_OK; - } - - /// - /// for now used by add folder. Called on the ROOT, as only the project should need - /// to implement this. - /// for folders, called with parent folder, blank extension and blank suggested root - /// - public virtual int GenerateUniqueItemName(uint itemIdLoc, string ext, string suggestedRoot, out string itemName) - { - string rootName = String.Empty; - string extToUse = String.Empty; - itemName = String.Empty; - - //force new items to have a number - int cb = 1; - bool found = false; - bool fFolderCase = false; - HierarchyNode parent = this.NodeFromItemId(itemIdLoc); - - if (!String.IsNullOrEmpty(ext)) - { - extToUse = ext.Trim(); - } - - if (!String.IsNullOrEmpty(suggestedRoot)) - { - suggestedRoot = suggestedRoot.Trim(); - } - - if (suggestedRoot == null || suggestedRoot.Length == 0) - { - // foldercase, we assume... - suggestedRoot = "NewFolder"; - fFolderCase = true; - } - - while (!found) - { - rootName = suggestedRoot; - if (cb > 0) - rootName += cb.ToString(CultureInfo.CurrentCulture); - - if (extToUse.Length > 0) - { - rootName += extToUse; - } - - cb++; - found = true; - for (HierarchyNode n = parent.FirstChild; n != null; n = n.NextSibling) - { - if (rootName == n.GetEditLabel()) - { - found = false; - break; - } - - //if parent is a folder, we need the whole url - string parentFolder = parent.Url; - if (parent is ProjectNode) - parentFolder = Path.GetDirectoryName(parent.Url); - - string checkFile = Path.Combine(parentFolder, rootName); - - if (fFolderCase) - { - if (Directory.Exists(checkFile)) - { - found = false; - break; - } - } - else - { - if (File.Exists(checkFile)) - { - found = false; - break; - } - } - } - } - - itemName = rootName; - return VSConstants.S_OK; - } - - - public virtual int GetItemContext(uint itemId, out Microsoft.VisualStudio.OLE.Interop.IServiceProvider psp) - { - CCITracing.TraceCall(); - psp = null; - HierarchyNode child = this.NodeFromItemId(itemId); - if (child != null) - { - psp = child.OleServiceProvider as IOleServiceProvider; - } - return VSConstants.S_OK; - } - - - public virtual int IsDocumentInProject(string mkDoc, out int found, VSDOCUMENTPRIORITY[] pri, out uint itemId) - { - CCITracing.TraceCall(); - if (pri != null && pri.Length >= 1) - { - pri[0] = VSDOCUMENTPRIORITY.DP_Unsupported; - } - found = 0; - itemId = 0; - - // If it is the project file just return. - if (NativeMethods.IsSamePath(mkDoc, this.GetMkDocument())) - { - found = 1; - itemId = VSConstants.VSITEMID_ROOT; - } - else - { - HierarchyNode child = this.FindChild(mkDoc); - if (child != null) - { - found = 1; - itemId = child.ID; - } - } - - if (found == 1) - { - if (pri != null && pri.Length >= 1) - { - pri[0] = VSDOCUMENTPRIORITY.DP_Standard; - } - } - - return VSConstants.S_OK; - - } - - - public virtual int OpenItem(uint itemId, ref Guid logicalView, IntPtr punkDocDataExisting, out IVsWindowFrame frame) - { - // Init output params - frame = null; - - HierarchyNode n = this.NodeFromItemId(itemId); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidItemId, CultureInfo.CurrentUICulture), "itemId"); - } - - // Delegate to the document manager object that knows how to open the item - DocumentManager documentManager = n.GetDocumentManager(); - if (documentManager != null) - { - return documentManager.Open(ref logicalView, punkDocDataExisting, out frame, WindowFrameShowAction.DoNotShow); - } - - // This node does not have an associated document manager and we must fail - return VSConstants.E_FAIL; - } - - - public virtual int OpenItemWithSpecific(uint itemId, uint editorFlags, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame frame) - { - // Init output params - frame = null; - - HierarchyNode n = this.NodeFromItemId(itemId); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidItemId, CultureInfo.CurrentUICulture), "itemId"); - } - - // Delegate to the document manager object that knows how to open the item - DocumentManager documentManager = n.GetDocumentManager(); - if (documentManager != null) - { - return documentManager.OpenWithSpecific(editorFlags, ref editorType, physicalView, ref logicalView, docDataExisting, out frame, WindowFrameShowAction.DoNotShow); - } - - // This node does not have an associated document manager and we must fail - return VSConstants.E_FAIL; - } - - - public virtual int RemoveItem(uint reserved, uint itemId, out int result) - { - HierarchyNode n = this.NodeFromItemId(itemId); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidItemId, CultureInfo.CurrentUICulture), "itemId"); - } - n.Remove(true); - result = 1; - return VSConstants.S_OK; - } - - - public virtual int ReopenItem(uint itemId, ref Guid editorType, string physicalView, ref Guid logicalView, IntPtr docDataExisting, out IVsWindowFrame frame) - { - // Init output params - frame = null; - - HierarchyNode n = this.NodeFromItemId(itemId); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.ParameterMustBeAValidItemId, CultureInfo.CurrentUICulture), "itemId"); - } - - // Delegate to the document manager object that knows how to open the item - DocumentManager documentManager = n.GetDocumentManager(); - if (documentManager != null) - { - return documentManager.OpenWithSpecific(0, ref editorType, physicalView, ref logicalView, docDataExisting, out frame, WindowFrameShowAction.DoNotShow); - } - - // This node does not have an associated document manager and we must fail - return VSConstants.E_FAIL; - } - - - /// - /// Implements IVsProject3::TransferItem - /// This function is called when an open miscellaneous file is being transferred - /// to our project. The sequence is for the shell to call AddItemWithSpecific and - /// then use TransferItem to transfer the open document to our project. - /// - /// Old document name - /// New document name - /// Optional frame if the document is open - /// - public virtual int TransferItem(string oldMkDoc, string newMkDoc, IVsWindowFrame frame) - { - // Fail if hierarchy already closed - if (this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return VSConstants.E_FAIL; - } - //Fail if the document names passed are null. - if (oldMkDoc == null || newMkDoc == null) - return VSConstants.E_INVALIDARG; - - int hr = VSConstants.S_OK; - VSDOCUMENTPRIORITY[] priority = new VSDOCUMENTPRIORITY[1]; - uint itemid = VSConstants.VSITEMID_NIL; - uint cookie = 0; - uint grfFlags = 0; - - IVsRunningDocumentTable pRdt = GetService(typeof(IVsRunningDocumentTable)) as IVsRunningDocumentTable; - if (pRdt == null) - return VSConstants.E_ABORT; - - string doc; - int found; - IVsHierarchy pHier; - uint id, readLocks, editLocks; - IntPtr docdataForCookiePtr = IntPtr.Zero; - IntPtr docDataPtr = IntPtr.Zero; - IntPtr hierPtr = IntPtr.Zero; - - // We get the document from the running doc table so that we can see if it is transient - try - { - ErrorHandler.ThrowOnFailure(pRdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, oldMkDoc, out pHier, out id, out docdataForCookiePtr, out cookie)); - } - finally - { - if (docdataForCookiePtr != IntPtr.Zero) - Marshal.Release(docdataForCookiePtr); - } - - //Get the document info - try - { - ErrorHandler.ThrowOnFailure(pRdt.GetDocumentInfo(cookie, out grfFlags, out readLocks, out editLocks, out doc, out pHier, out id, out docDataPtr)); - } - finally - { - if (docDataPtr != IntPtr.Zero) - Marshal.Release(docDataPtr); - } - - // Now see if the document is in the project. If not, we fail - try - { - ErrorHandler.ThrowOnFailure(IsDocumentInProject(newMkDoc, out found, priority, out itemid)); - Debug.Assert(itemid != VSConstants.VSITEMID_NIL && itemid != VSConstants.VSITEMID_ROOT); - hierPtr = Marshal.GetComInterfaceForObject(this, typeof(IVsUIHierarchy)); - // Now rename the document - ErrorHandler.ThrowOnFailure(pRdt.RenameDocument(oldMkDoc, newMkDoc, hierPtr, itemid)); - } - finally - { - if (hierPtr != IntPtr.Zero) - Marshal.Release(hierPtr); - } - - //Change the caption if we are passed a window frame - if (frame != null) - { - string caption = "%2"; - hr = frame.SetProperty((int)(__VSFPROPID.VSFPROPID_OwnerCaption), caption); - } - return hr; - } - - #endregion - - #region IVsProjectBuidSystem Members - public virtual int SetHostObject(string targetName, string taskName, object hostObject) - { - Debug.Assert(targetName != null && taskName != null && this.buildProject != null && this.buildProject.Targets != null); - - if (targetName == null || taskName == null || this.buildProject == null || this.buildProject.Targets == null) - { - return VSConstants.E_INVALIDARG; - } - - this.buildProject.ProjectCollection.HostServices.RegisterHostObject(this.buildProject.FullPath, targetName, taskName, (Microsoft.Build.Framework.ITaskHost)hostObject); - - return VSConstants.S_OK; - } - - public int BuildTarget(string targetName, out bool success) - { - success = false; - - MSBuildResult result = this.Build(targetName); - - if (result == MSBuildResult.Successful) - { - success = true; - } - - return VSConstants.S_OK; - } - - public virtual int CancelBatchEdit() - { - return VSConstants.E_NOTIMPL; - } - - public virtual int EndBatchEdit() - { - return VSConstants.E_NOTIMPL; - } - - public virtual int StartBatchEdit() - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Used to determine the kind of build system, in VS 2005 there's only one defined kind: MSBuild - /// - /// - /// - public virtual int GetBuildSystemKind(out uint kind) - { - kind = (uint)_BuildSystemKindFlags2.BSK_MSBUILD_VS10; - return VSConstants.S_OK; - } - - #endregion - - #region IVsComponentUser methods - - /// - /// Add Components to the Project. - /// Used by the environment to add components specified by the user in the Component Selector dialog - /// to the specified project - /// - /// The component operation to be performed. - /// Number of components to be added - /// array of component selector data - /// Handle to the component picker dialog - /// Result to be returned to the caller - public virtual int AddComponent(VSADDCOMPOPERATION dwAddCompOperation, uint cComponents, System.IntPtr[] rgpcsdComponents, System.IntPtr hwndDialog, VSADDCOMPRESULT[] pResult) - { - if (rgpcsdComponents == null || pResult == null) - { - return VSConstants.E_FAIL; - } - - //initalize the out parameter - pResult[0] = VSADDCOMPRESULT.ADDCOMPRESULT_Success; - - IReferenceContainer references = GetReferenceContainer(); - if (null == references) - { - // This project does not support references or the reference container was not created. - // In both cases this operation is not supported. - return VSConstants.E_NOTIMPL; - } - for (int cCount = 0; cCount < cComponents; cCount++) - { - VSCOMPONENTSELECTORDATA selectorData = new VSCOMPONENTSELECTORDATA(); - IntPtr ptr = rgpcsdComponents[cCount]; - selectorData = (VSCOMPONENTSELECTORDATA)Marshal.PtrToStructure(ptr, typeof(VSCOMPONENTSELECTORDATA)); - if (null == references.AddReferenceFromSelectorData(selectorData)) - { - //Skip further proccessing since a reference has to be added - pResult[0] = VSADDCOMPRESULT.ADDCOMPRESULT_Failure; - return VSConstants.S_OK; - } - } - return VSConstants.S_OK; - } - #endregion - - #region IVsDependencyProvider Members - public int EnumDependencies(out IVsEnumDependencies enumDependencies) - { - enumDependencies = new EnumDependencies(this.buildDependencyList); - return VSConstants.S_OK; - } - - public int OpenDependency(string szDependencyCanonicalName, out IVsDependency dependency) - { - dependency = null; - return VSConstants.S_OK; - } - - #endregion - - #region IVsSccProject2 Members - /// - /// This method is called to determine which files should be placed under source control for a given VSITEMID within this hierarchy. - /// - /// Identifier for the VSITEMID being queried. - /// Pointer to an array of CALPOLESTR strings containing the file names for this item. - /// Pointer to a CADWORD array of flags stored in DWORDs indicating that some of the files have special behaviors. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int GetSccFiles(uint itemid, CALPOLESTR[] stringsOut, CADWORD[] flagsOut) - { - if (itemid == VSConstants.VSITEMID_SELECTION) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "itemid"); - } - - HierarchyNode n = this.NodeFromItemId(itemid); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "itemid"); - } - - List files = new List(); - List flags = new List(); - - n.GetSccFiles(files, flags); - - if (stringsOut != null && stringsOut.Length > 0) - { - stringsOut[0] = Utilities.CreateCALPOLESTR(files); - } - - if (flagsOut != null && flagsOut.Length > 0) - { - flagsOut[0] = Utilities.CreateCADWORD(flags); - } - - return VSConstants.S_OK; - } - - /// - /// This method is called to discover special (hidden files) associated with a given VSITEMID within this hierarchy. - /// - /// Identifier for the VSITEMID being queried. - /// One of the files associated with the node - /// Pointer to an array of CALPOLESTR strings containing the file names for this item. - /// Pointer to a CADWORD array of flags stored in DWORDs indicating that some of the files have special behaviors. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - /// This method is called to discover any special or hidden files associated with an item in the project hierarchy. It is called when GetSccFiles returns with the SFF_HasSpecialFiles flag set for any of the files associated with the node. - public virtual int GetSccSpecialFiles(uint itemid, string sccFile, CALPOLESTR[] stringsOut, CADWORD[] flagsOut) - { - if (itemid == VSConstants.VSITEMID_SELECTION) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "itemid"); - } - - HierarchyNode n = this.NodeFromItemId(itemid); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "itemid"); - } - - List files = new List(); - - List flags = new List(); - - n.GetSccSpecialFiles(sccFile, files, flags); - - if (stringsOut != null && stringsOut.Length > 0) - { - stringsOut[0] = Utilities.CreateCALPOLESTR(files); - } - - if (flagsOut != null && flagsOut.Length > 0) - { - flagsOut[0] = Utilities.CreateCADWORD(flags); - } - - return VSConstants.S_OK; - - } - - /// - /// This method is called by the source control portion of the environment to inform the project of changes to the source control glyph on various nodes. - /// - /// Count of changed nodes. - /// An array of VSITEMID identifiers of the changed nodes. - /// An array of VsStateIcon glyphs representing the new state of the corresponding item in rgitemidAffectedNodes. - /// An array of status flags from SccStatus corresponding to rgitemidAffectedNodes. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int SccGlyphChanged(int affectedNodes, uint[] itemidAffectedNodes, VsStateIcon[] newGlyphs, uint[] newSccStatus) - { - // if all the paramaters are null adn the count is 0, it means scc wants us to updated everything - if (affectedNodes == 0 && itemidAffectedNodes == null && newGlyphs == null && newSccStatus == null) - { - this.ReDraw(UIHierarchyElement.SccState); - this.UpdateSccStateIcons(); - } - else if (affectedNodes > 0 && itemidAffectedNodes != null && newGlyphs != null && newSccStatus != null) - { - for (int i = 0; i < affectedNodes; i++) - { - HierarchyNode n = this.NodeFromItemId(itemidAffectedNodes[i]); - if (n == null) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "itemidAffectedNodes"); - } - - n.ReDraw(UIHierarchyElement.SccState); - } - } - return VSConstants.S_OK; - } - - /// - /// This method is called by the source control portion of the environment when a project is initially added to source control, or to change some of the project's settings. - /// - /// String, opaque to the project, that identifies the project location on the server. Persist this string in the project file. - /// String, opaque to the project, that identifies the path to the server. Persist this string in the project file. - /// String, opaque to the project, that identifies the local path to the project. Persist this string in the project file. - /// String, opaque to the project, that identifies the source control package. Persist this string in the project file. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int SetSccLocation(string sccProjectName, string sccAuxPath, string sccLocalPath, string sccProvider) - { - if (this.IsSccDisabled) - { - throw new NotImplementedException(); - } - - if (sccProjectName == null) - { - throw new ArgumentNullException("sccProjectName"); - } - - if (sccAuxPath == null) - { - throw new ArgumentNullException("sccAuxPath"); - } - - if (sccLocalPath == null) - { - throw new ArgumentNullException("sccLocalPath"); - } - - if (sccProvider == null) - { - throw new ArgumentNullException("sccProvider"); - } - - // Save our settings (returns true if something changed) - if (!this.SetSccSettings(sccProjectName, sccLocalPath, sccAuxPath, sccProvider)) - { - return VSConstants.S_OK; - } - - bool unbinding = (sccProjectName.Length == 0 && sccProvider.Length == 0); - - if (unbinding || this.QueryEditProjectFile(false)) - { - this.buildProject.SetProperty(ProjectFileConstants.SccProjectName, sccProjectName); - this.buildProject.SetProperty(ProjectFileConstants.SccProvider, sccProvider); - this.buildProject.SetProperty(ProjectFileConstants.SccAuxPath, sccAuxPath); - this.buildProject.SetProperty(ProjectFileConstants.SccLocalPath, sccLocalPath); - } - - this.isRegisteredWithScc = true; - - return VSConstants.S_OK; - } - #endregion - - #region IVsProjectSpecialFiles Members - /// - /// Allows you to query the project for special files and optionally create them. - /// - /// __PSFFILEID of the file - /// __PSFFLAGS flags for the file - /// The itemid of the node in the hierarchy - /// The file name of the special file. - /// - public virtual int GetFile(int fileId, uint flags, out uint itemid, out string fileName) - { - itemid = VSConstants.VSITEMID_NIL; - fileName = String.Empty; - - // We need to return S_OK, otherwise the property page tabs will not be shown. - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IAggregatedHierarchy Members - - /// - /// Get the inner object of an aggregated hierarchy - /// - /// A HierarchyNode - public virtual HierarchyNode GetInner() - { - return this; - } - - #endregion - - #region IBuildDependencyUpdate Members - - public virtual IVsBuildDependency[] BuildDependencies - { - get - { - return this.buildDependencyList.ToArray(); - } - } - - public virtual void AddBuildDependency(IVsBuildDependency dependency) - { - if (this.isClosed || dependency == null) - { - return; - } - - if (!this.buildDependencyList.Contains(dependency)) - { - this.buildDependencyList.Add(dependency); - } - } - - public virtual void RemoveBuildDependency(IVsBuildDependency dependency) - { - if (this.isClosed || dependency == null) - { - return; - } - - if (this.buildDependencyList.Contains(dependency)) - { - this.buildDependencyList.Remove(dependency); - } - } - - #endregion - - #region IReferenceContainerProvider Members - /// - /// Returns the reference container node. - /// - /// - public IReferenceContainer GetReferenceContainer() - { - return this.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as IReferenceContainer; - } - - #endregion - - #region IProjectEventsListener Members - public bool IsProjectEventsListener - { - get { return this.isProjectEventsListener; } - set { this.isProjectEventsListener = value; } - } - #endregion - - #region IProjectEventsProvider Members - - /// - /// Defines the provider for the project events - /// - IProjectEvents IProjectEventsProvider.ProjectEventsProvider - { - get - { - return this.projectEventsProvider; - } - set - { - if (null != this.projectEventsProvider) - { - this.projectEventsProvider.AfterProjectFileOpened -= this.OnAfterProjectOpen; - } - this.projectEventsProvider = value; - if (null != this.projectEventsProvider) - { - this.projectEventsProvider.AfterProjectFileOpened += this.OnAfterProjectOpen; - } - } - } - - #endregion - - #region IVsAggregatableProject Members - - /// - /// Retrieve the list of project GUIDs that are aggregated together to make this project. - /// - /// Semi colon separated list of Guids. Typically, the last GUID would be the GUID of the base project factory - /// HResult - public int GetAggregateProjectTypeGuids(out string projectTypeGuids) - { - projectTypeGuids = this.GetProjectProperty(ProjectFileConstants.ProjectTypeGuids); - // In case someone manually removed this from our project file, default to our project without flavors - if (String.IsNullOrEmpty(projectTypeGuids)) - projectTypeGuids = this.ProjectGuid.ToString("B"); - return VSConstants.S_OK; - } - - /// - /// This is where the initialization occurs. - /// - public virtual int InitializeForOuter(string filename, string location, string name, uint flags, ref Guid iid, out IntPtr projectPointer, out int canceled) - { - canceled = 0; - projectPointer = IntPtr.Zero; - - // Initialize the interop-safe versions of this node's implementations of various VS interfaces, - // which point to the outer object. The project node itself should never be passed to unmanaged - // code -- we should always use these properties instead. - this.InteropSafeIVsHierarchy = Utilities.GetOuterAs(this); - this.InteropSafeIVsUIHierarchy = Utilities.GetOuterAs(this); - this.InteropSafeIVsProject3 = Utilities.GetOuterAs(this); - this.InteropSafeIVsSccProject2 = Utilities.GetOuterAs(this); - this.InteropSafeIVsUIHierWinClipboardHelperEvents = Utilities.GetOuterAs(this); - this.InteropSafeIVsComponentUser = Utilities.GetOuterAs(this); - - // Initialize the project - this.Load(filename, location, name, flags, ref iid, out canceled); - - if (canceled != 1) - { - // Set ourself as the project - return Marshal.QueryInterface(Marshal.GetIUnknownForObject(this), ref iid, out projectPointer); - } - - return VSConstants.OLE_E_PROMPTSAVECANCELLED; - } - - /// - /// This is called after the project is done initializing the different layer of the aggregations - /// - /// HResult - public virtual int OnAggregationComplete() - { - return VSConstants.S_OK; - } - - /// - /// Set the list of GUIDs that are aggregated together to create this project. - /// - /// Semi-colon separated list of GUIDs, the last one is usually the project factory of the base project factory - /// HResult - public int SetAggregateProjectTypeGuids(string projectTypeGuids) - { - this.SetProjectProperty(ProjectFileConstants.ProjectTypeGuids, projectTypeGuids); - return VSConstants.S_OK; - } - - /// - /// We are always the inner most part of the aggregation - /// and as such we don't support setting an inner project - /// - public int SetInnerProject(object innerProject) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region IVsProjectFlavorCfgProvider Members - - int IVsProjectFlavorCfgProvider.CreateProjectFlavorCfg(IVsCfg pBaseProjectCfg, out IVsProjectFlavorCfg ppFlavorCfg) - { - // Our config object is also our IVsProjectFlavorCfg object - ppFlavorCfg = pBaseProjectCfg as IVsProjectFlavorCfg; - - return VSConstants.S_OK; - } - - #endregion - - #region IVsBuildPropertyStorage Members - - /// - /// Get the property of an item - /// - /// ItemID - /// Name of the property - /// Value of the property (out parameter) - /// HRESULT - int IVsBuildPropertyStorage.GetItemAttribute(uint item, string attributeName, out string attributeValue) - { - attributeValue = null; - - HierarchyNode node = NodeFromItemId(item); - if (node == null) - throw new ArgumentException("Invalid item id", "item"); - - attributeValue = node.ItemNode.GetMetadata(attributeName); - return VSConstants.S_OK; - } - - /// - /// Get the value of the property in the project file - /// - /// Name of the property to remove - /// Configuration for which to remove the property - /// Project or user file (_PersistStorageType) - /// Value of the property (out parameter) - /// HRESULT - int IVsBuildPropertyStorage.GetPropertyValue(string propertyName, string configName, uint storage, out string propertyValue) - { - // TODO: when adding support for User files, we need to update this method - propertyValue = null; - if (string.IsNullOrEmpty(configName)) - { - propertyValue = this.GetProjectProperty(propertyName); - } - else - { - IVsCfg configurationInterface; - ErrorHandler.ThrowOnFailure(this.ConfigProvider.GetCfgOfName(configName, string.Empty, out configurationInterface)); - ProjectConfig config = (ProjectConfig)configurationInterface; - propertyValue = config.GetConfigurationProperty(propertyName, true); - } - return VSConstants.S_OK; - } - - /// - /// Delete a property - /// In our case this simply mean defining it as null - /// - /// Name of the property to remove - /// Configuration for which to remove the property - /// Project or user file (_PersistStorageType) - /// HRESULT - int IVsBuildPropertyStorage.RemoveProperty(string propertyName, string configName, uint storage) - { - return ((IVsBuildPropertyStorage)this).SetPropertyValue(propertyName, configName, storage, null); - } - - /// - /// Set a property on an item - /// - /// ItemID - /// Name of the property - /// New value for the property - /// HRESULT - int IVsBuildPropertyStorage.SetItemAttribute(uint item, string attributeName, string attributeValue) - { - HierarchyNode node = NodeFromItemId(item); - - if (node == null) - throw new ArgumentException("Invalid item id", "item"); - - node.ItemNode.SetMetadata(attributeName, attributeValue); - return VSConstants.S_OK; - } - - /// - /// Set a project property - /// - /// Name of the property to set - /// Configuration for which to set the property - /// Project file or user file (_PersistStorageType) - /// New value for that property - /// HRESULT - int IVsBuildPropertyStorage.SetPropertyValue(string propertyName, string configName, uint storage, string propertyValue) - { - // TODO: when adding support for User files, we need to update this method - if (string.IsNullOrEmpty(configName)) - { - this.SetProjectProperty(propertyName, propertyValue); - } - else - { - IVsCfg configurationInterface; - ErrorHandler.ThrowOnFailure(this.ConfigProvider.GetCfgOfName(configName, string.Empty, out configurationInterface)); - ProjectConfig config = (ProjectConfig)configurationInterface; - config.SetConfigurationProperty(propertyName, propertyValue); - } - return VSConstants.S_OK; - } - - #endregion - - #region IVsDesignTimeAssemblyResolution methods - - public int GetTargetFramework(out string ppTargetFramework) - { - ppTargetFramework = this.ProjectMgr.TargetFrameworkMoniker.FullName; - return VSConstants.S_OK; - } - - public int ResolveAssemblyPathInTargetFx(string[] prgAssemblySpecs, uint cAssembliesToResolve, VsResolvedAssemblyPath[] prgResolvedAssemblyPaths, out uint pcResolvedAssemblyPaths) - { - if (prgAssemblySpecs == null || cAssembliesToResolve == 0 || prgResolvedAssemblyPaths == null) - { - throw new ArgumentException("One or more of the arguments are invalid."); - } - - pcResolvedAssemblyPaths = 0; - - try - { - var results = designTimeAssemblyResolution.Resolve(prgAssemblySpecs.Take((int)cAssembliesToResolve)); - results.CopyTo(prgResolvedAssemblyPaths, 0); - pcResolvedAssemblyPaths = (uint)results.Length; - } - catch (Exception ex) - { - return Marshal.GetHRForException(ex); - } - - return VSConstants.S_OK; - } - - #endregion - - #region private helper methods - - /// - /// Initialize projectNode - /// - private void Initialize() - { - this.ID = VSConstants.VSITEMID_ROOT; - this.tracker = new TrackDocumentsHelper(this); - } - - /// - /// Add an item to the hierarchy based on the item path - /// - /// Item to add - /// Added node - private HierarchyNode AddIndependentFileNode(MSBuild.ProjectItem item) - { - HierarchyNode currentParent = GetItemParentNode(item); - return AddFileNodeToNode(item, currentParent); - } - - /// - /// Add a dependent file node to the hierarchy - /// - /// msbuild item to add - /// Parent Node - /// Added node - private HierarchyNode AddDependentFileNodeToNode(MSBuild.ProjectItem item, HierarchyNode parentNode) - { - FileNode node = this.CreateDependentFileNode(new ProjectElement(this, item, false)); - parentNode.AddChild(node); - - // Make sure to set the HasNameRelation flag on the dependent node if it is related to the parent by name - if (!node.HasParentNodeNameRelation && string.Compare(node.GetRelationalName(), parentNode.GetRelationalName(), StringComparison.OrdinalIgnoreCase) == 0) - { - node.HasParentNodeNameRelation = true; - } - - return node; - } - - /// - /// Add a file node to the hierarchy - /// - /// msbuild item to add - /// Parent Node - /// Added node - private HierarchyNode AddFileNodeToNode(MSBuild.ProjectItem item, HierarchyNode parentNode) - { - FileNode node = this.CreateFileNode(new ProjectElement(this, item, false)); - parentNode.AddChild(node); - return node; - } - - /// - /// Get the parent node of an msbuild item - /// - /// msbuild item - /// parent node - private HierarchyNode GetItemParentNode(MSBuild.ProjectItem item) - { - HierarchyNode currentParent = this; - string strPath = item.EvaluatedInclude; - - strPath = Path.GetDirectoryName(strPath); - if (strPath.Length > 0) - { - // Use the relative to verify the folders... - currentParent = this.CreateFolderNodes(strPath); - } - return currentParent; - } - - private MSBuildExecution.ProjectPropertyInstance GetMsBuildProperty(string propertyName, bool resetCache) - { - if (resetCache || this.currentConfig == null) - { - // Get properties from project file and cache it - this.SetCurrentConfiguration(); - this.currentConfig = this.buildProject.CreateProjectInstance(); - } - - if (this.currentConfig == null) - throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FailedToRetrieveProperties, CultureInfo.CurrentUICulture), propertyName)); - - // return property asked for - return this.currentConfig.GetProperty(propertyName); - } - - private string GetOutputPath(MSBuildExecution.ProjectInstance properties) - { - this.currentConfig = properties; - string outputPath = GetProjectProperty("OutputPath"); - - if (!String.IsNullOrEmpty(outputPath)) - { - outputPath = outputPath.Replace('/', Path.DirectorySeparatorChar); - if (outputPath[outputPath.Length - 1] != Path.DirectorySeparatorChar) - outputPath += Path.DirectorySeparatorChar; - } - - return outputPath; - } - - private bool GetBoolAttr(MSBuildExecution.ProjectInstance properties, string name) - { - this.currentConfig = properties; - string s = GetProjectProperty(name); - - return (s != null && s.ToUpperInvariant().Trim() == "TRUE"); - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")] - private string GetAssemblyName(MSBuildExecution.ProjectInstance properties) - { - this.currentConfig = properties; - string name = null; - - name = GetProjectProperty(ProjectFileConstants.AssemblyName); - if (name == null) - name = this.Caption; - - string outputtype = GetProjectProperty(ProjectFileConstants.OutputType, false); - - if (outputtype == "library") - { - outputtype = outputtype.ToLowerInvariant(); - name += ".dll"; - } - else - { - name += ".exe"; - } - - return name; - } - - /// - /// Updates our scc project settings. - /// - /// String, opaque to the project, that identifies the project location on the server. Persist this string in the project file. - /// String, opaque to the project, that identifies the path to the server. Persist this string in the project file. - /// String, opaque to the project, that identifies the local path to the project. Persist this string in the project file. - /// String, opaque to the project, that identifies the source control package. Persist this string in the project file. - /// Returns true if something changed. - private bool SetSccSettings(string sccProjectName, string sccLocalPath, string sccAuxPath, string sccProvider) - { - bool changed = false; - Debug.Assert(sccProjectName != null && sccLocalPath != null && sccAuxPath != null && sccProvider != null); - if (String.Compare(sccProjectName, this.sccProjectName, StringComparison.OrdinalIgnoreCase) != 0 || - String.Compare(sccLocalPath, this.sccLocalPath, StringComparison.OrdinalIgnoreCase) != 0 || - String.Compare(sccAuxPath, this.sccAuxPath, StringComparison.OrdinalIgnoreCase) != 0 || - String.Compare(sccProvider, this.sccProvider, StringComparison.OrdinalIgnoreCase) != 0) - { - changed = true; - this.sccProjectName = sccProjectName; - this.sccLocalPath = sccLocalPath; - this.sccAuxPath = sccAuxPath; - this.sccProvider = sccProvider; - } - - - return changed; - } - - /// - /// Sets the scc info from the project file. - /// - private void InitSccInfo() - { - this.sccProjectName = this.GetProjectProperty(ProjectFileConstants.SccProjectName); - this.sccLocalPath = this.GetProjectProperty(ProjectFileConstants.SccLocalPath); - this.sccProvider = this.GetProjectProperty(ProjectFileConstants.SccProvider); - this.sccAuxPath = this.GetProjectProperty(ProjectFileConstants.SccAuxPath); - } - - private void OnAfterProjectOpen(object sender, AfterProjectFileOpenedEventArgs e) - { - this.projectOpened = true; - } - - private static XmlElement WrapXmlFragment(XmlDocument document, XmlElement root, Guid flavor, string configuration, string fragment) - { - XmlElement node = document.CreateElement(ProjectFileConstants.FlavorProperties); - XmlAttribute attribute = document.CreateAttribute(ProjectFileConstants.Guid); - attribute.Value = flavor.ToString("B"); - node.Attributes.Append(attribute); - if (!String.IsNullOrEmpty(configuration)) - { - attribute = document.CreateAttribute(ProjectFileConstants.Configuration); - attribute.Value = configuration; - node.Attributes.Append(attribute); - } - node.InnerXml = fragment; - root.AppendChild(node); - return node; - } - - /// - /// Sets the project guid from the project file. If no guid is found a new one is created and assigne for the instance project guid. - /// - private void SetProjectGuidFromProjectFile() - { - string projectGuid = this.GetProjectProperty(ProjectFileConstants.ProjectGuid); - if (String.IsNullOrEmpty(projectGuid)) - { - this.projectIdGuid = Guid.NewGuid(); - } - else - { - Guid guid = new Guid(projectGuid); - if (guid != this.projectIdGuid) - { - this.projectIdGuid = guid; - } - } - } - - /// - /// Helper for sharing common code between Build() and BuildAsync() - /// - /// - /// - private bool BuildPrelude(IVsOutputWindowPane output) - { - bool engineLogOnlyCritical = false; - // If there is some output, then we can ask the build engine to log more than - // just the critical events. - if (null != output) - { - engineLogOnlyCritical = BuildEngine.OnlyLogCriticalEvents; - BuildEngine.OnlyLogCriticalEvents = false; - } - - this.SetOutputLogger(output); - return engineLogOnlyCritical; - } - - /// - /// Recusively parses the tree and closes all nodes. - /// - /// The subtree to close. - private static void CloseAllNodes(HierarchyNode node) - { - for (HierarchyNode n = node.FirstChild; n != null; n = n.NextSibling) - { - if (n.FirstChild != null) - { - CloseAllNodes(n); - } - - n.Close(); - } - } - - /// - /// Set the build project with the new project instance value - /// - /// The new build project instance - private void SetBuildProject(MSBuild.Project project) - { - this.buildProject = project; - if (this.buildProject != null) - { - SetupProjectGlobalPropertiesThatAllProjectSystemsMustSet(); - } - } - - /// - /// Setup the global properties for project instance. - /// - private void SetupProjectGlobalPropertiesThatAllProjectSystemsMustSet() - { - string solutionDirectory = null; - string solutionFile = null; - string userOptionsFile = null; - - IVsSolution solution = this.Site.GetService(typeof(SVsSolution)) as IVsSolution; - if (solution != null) - { - // We do not want to throw. If we cannot set the solution related constants we set them to empty string. - solution.GetSolutionInfo(out solutionDirectory, out solutionFile, out userOptionsFile); - } - - if (solutionDirectory == null) - { - solutionDirectory = String.Empty; - } - - if (solutionFile == null) - { - solutionFile = String.Empty; - } - - string solutionFileName = (solutionFile.Length == 0) ? String.Empty : Path.GetFileName(solutionFile); - - string solutionName = (solutionFile.Length == 0) ? String.Empty : Path.GetFileNameWithoutExtension(solutionFile); - - string solutionExtension = String.Empty; - if (solutionFile.Length > 0 && Path.HasExtension(solutionFile)) - { - solutionExtension = Path.GetExtension(solutionFile); - } - - this.buildProject.SetGlobalProperty(GlobalProperty.SolutionDir.ToString(), solutionDirectory); - this.buildProject.SetGlobalProperty(GlobalProperty.SolutionPath.ToString(), solutionFile); - this.buildProject.SetGlobalProperty(GlobalProperty.SolutionFileName.ToString(), solutionFileName); - this.buildProject.SetGlobalProperty(GlobalProperty.SolutionName.ToString(), solutionName); - this.buildProject.SetGlobalProperty(GlobalProperty.SolutionExt.ToString(), solutionExtension); - - // Other misc properties - this.buildProject.SetGlobalProperty(GlobalProperty.BuildingInsideVisualStudio.ToString(), "true"); - this.buildProject.SetGlobalProperty(GlobalProperty.Configuration.ToString(), ProjectConfig.Debug); - this.buildProject.SetGlobalProperty(GlobalProperty.Platform.ToString(), ProjectConfig.AnyCPU); - - // DevEnvDir property - object installDirAsObject = null; - - IVsShell shell = this.Site.GetService(typeof(SVsShell)) as IVsShell; - if (shell != null) - { - // We do not want to throw. If we cannot set the solution related constants we set them to empty string. - shell.GetProperty((int)__VSSPROPID.VSSPROPID_InstallDirectory, out installDirAsObject); - } - - string installDir = ((string)installDirAsObject); - - if (String.IsNullOrEmpty(installDir)) - { - installDir = String.Empty; - } - else - { - // Ensure that we have traimnling backslash as this is done for the langproj macros too. - if (installDir[installDir.Length - 1] != Path.DirectorySeparatorChar) - { - installDir += Path.DirectorySeparatorChar; - } - } - - this.buildProject.SetGlobalProperty(GlobalProperty.DevEnvDir.ToString(), installDir); - } - - /// - /// Attempts to lock in the privilege of running a build in Visual Studio. - /// - /// false if this build was called for by the Solution Build Manager; true otherwise. - /// - /// Need to claim the UI thread for build under the following conditions: - /// 1. The build must use a resource that uses the UI thread, such as - /// - you set HostServices and you have a host object which requires (even indirectly) the UI thread (VB and C# compilers do this for instance.) - /// or, - /// 2. The build requires the in-proc node AND waits on the UI thread for the build to complete, such as: - /// - you use a ProjectInstance to build, or - /// - you have specified a host object, whether or not it requires the UI thread, or - /// - you set HostServices and you have specified a node affinity. - /// - In addition to the above you also call submission.Execute(), or you call submission.ExecuteAsync() and then also submission.WaitHandle.Wait*(). - /// - /// A value indicating whether a build may proceed. - /// - /// This method must be called on the UI thread. - /// - private bool TryBeginBuild(bool designTime, bool requiresUIThread = false) - { - IVsBuildManagerAccessor accessor = null; - - if (this.Site != null) - { - accessor = this.Site.GetService(typeof(SVsBuildManagerAccessor)) as IVsBuildManagerAccessor; - } - - bool releaseUIThread = false; - - try - { - // If the SVsBuildManagerAccessor service is absent, we're not running within Visual Studio. - if (accessor != null) - { - if (requiresUIThread) - { - int result = accessor.ClaimUIThreadForBuild(); - if (result < 0) - { - // Not allowed to claim the UI thread right now. Try again later. - return false; - } - - releaseUIThread = true; // assume we need to release this immediately until we get through the whole gauntlet. - } - - if (designTime) - { - int result = accessor.BeginDesignTimeBuild(); - if (result < 0) - { - // Not allowed to begin a design-time build at this time. Try again later. - return false; - } - } - - // We obtained all the resources we need. So don't release the UI thread until after the build is finished. - releaseUIThread = false; - } - else - { - BuildParameters buildParameters = new BuildParameters(this.buildEngine ?? ProjectCollection.GlobalProjectCollection); - BuildManager.DefaultBuildManager.BeginBuild(buildParameters); - } - - this.buildInProcess = true; - return true; - } - finally - { - // If we were denied the privilege of starting a design-time build, - // we need to release the UI thread. - if (releaseUIThread) - { - Debug.Assert(accessor != null, "We think we need to release the UI thread for an accessor we don't have!"); - Marshal.ThrowExceptionForHR(accessor.ReleaseUIThreadForBuild()); - } - } - } - - /// - /// Lets Visual Studio know that we're done with our design-time build so others can use the build manager. - /// - /// The build submission that built, if any. - /// This must be the same value as the one passed to . - /// This must be the same value as the one passed to . - /// - /// This method must be called on the UI thread. - /// - private void EndBuild(BuildSubmission submission, bool designTime, bool requiresUIThread = false) - { - IVsBuildManagerAccessor accessor = null; - - if (this.Site != null) - { - accessor = this.Site.GetService(typeof(SVsBuildManagerAccessor)) as IVsBuildManagerAccessor; - } - - if (accessor != null) - { - // It's very important that we try executing all three end-build steps, even if errors occur partway through. - try - { - if (submission != null) - { - Marshal.ThrowExceptionForHR(accessor.UnregisterLoggers(submission.SubmissionId)); - } - } - catch (Exception ex) - { - if (ErrorHandler.IsCriticalException(ex)) - { - throw; - } - - Trace.TraceError(ex.ToString()); - } - - try - { - if (designTime) - { - Marshal.ThrowExceptionForHR(accessor.EndDesignTimeBuild()); - } - } - catch (Exception ex) - { - if (ErrorHandler.IsCriticalException(ex)) - { - throw; - } - - Trace.TraceError(ex.ToString()); - } - - - try - { - if (requiresUIThread) - { - Marshal.ThrowExceptionForHR(accessor.ReleaseUIThreadForBuild()); - } - } - catch (Exception ex) - { - if (ErrorHandler.IsCriticalException(ex)) - { - throw; - } - - Trace.TraceError(ex.ToString()); - } - } - else - { - BuildManager.DefaultBuildManager.EndBuild(); - } - - this.buildInProcess = false; - } - - private string GetComponentPickerDirectories() - { - IVsComponentEnumeratorFactory4 enumFactory = this.site.GetService(typeof(SCompEnumService)) as IVsComponentEnumeratorFactory4; - if (enumFactory == null) - { - throw new InvalidOperationException("Missing the SCompEnumService service."); - } - - IEnumComponents enumerator; - Marshal.ThrowExceptionForHR(enumFactory.GetReferencePathsForTargetFramework(this.TargetFrameworkMoniker.FullName, out enumerator)); - if (enumerator == null) - { - throw new ApplicationException("IVsComponentEnumeratorFactory4.GetReferencePathsForTargetFramework returned null."); - } - - StringBuilder paths = new StringBuilder(); - VSCOMPONENTSELECTORDATA[] data = new VSCOMPONENTSELECTORDATA[1]; - uint fetchedCount; - while (enumerator.Next(1, data, out fetchedCount) == VSConstants.S_OK && fetchedCount == 1) - { - Debug.Assert(data[0].type == VSCOMPONENTTYPE.VSCOMPONENTTYPE_Path); - paths.Append(data[0].bstrFile); - paths.Append(";"); - } - - // Trim off the last semicolon. - if (paths.Length > 0) - { - paths.Length -= 1; - } - - return paths.ToString(); - } - - #endregion - - public int UpdateTargetFramework(IVsHierarchy pHier, string currentTargetFramework, string newTargetFramework) - { - FrameworkName moniker = new FrameworkName(newTargetFramework); - SetProjectProperty("TargetFrameworkIdentifier", moniker.Identifier); - SetProjectProperty("TargetFrameworkVersion", "v" + moniker.Version); - SetProjectProperty("TargetFrameworkProfile", moniker.Profile); - return VSConstants.S_OK; - } - - public int UpgradeProject(uint grfUpgradeFlags) - { - int hr = VSConstants.S_OK; - - if (!PerformTargetFrameworkCheck()) - { - // Just return OLE_E_PROMPTSAVECANCELLED here which will cause the shell - // to leave the project in an unloaded state. - hr = VSConstants.OLE_E_PROMPTSAVECANCELLED; - } - - return hr; - } - - private bool PerformTargetFrameworkCheck() - { - if (this.IsFrameworkOnMachine()) - { - // Nothing to do since the framework is present. - return true; - } - - return ShowRetargetingDialog(); - } - - /// - /// - /// - /// - /// true if the project will be retargeted. false to load project in unloaded state. - /// - private bool ShowRetargetingDialog() - { - var retargetDialog = this.site.GetService(typeof(SVsFrameworkRetargetingDlg)) as IVsFrameworkRetargetingDlg; - if (retargetDialog == null) - { - throw new InvalidOperationException("Missing SVsFrameworkRetargetingDlg service."); - } - - // We can only display the retargeting dialog if the IDE is not in command-line mode. - if (IsIdeInCommandLineMode) - { - string message = SR.GetString(SR.CannotLoadUnknownTargetFrameworkProject, this.FileName, this.TargetFrameworkMoniker); - var outputWindow = this.site.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow; - if (outputWindow != null) - { - IVsOutputWindowPane outputPane; - Guid outputPaneGuid = VSConstants.GUID_BuildOutputWindowPane; - if (outputWindow.GetPane(ref outputPaneGuid, out outputPane) >= 0 && outputPane != null) - { - Marshal.ThrowExceptionForHR(outputPane.OutputString(message)); - } - } - - throw new InvalidOperationException(message); - } - else - { - uint outcome; - int dontShowAgain; - Marshal.ThrowExceptionForHR(retargetDialog.ShowFrameworkRetargetingDlg( - this.Package.ProductUserContext, - this.FileName, - this.TargetFrameworkMoniker.FullName, - (uint)__FRD_FLAGS.FRDF_DEFAULT, - out outcome, - out dontShowAgain)); - switch ((__FRD_OUTCOME)outcome) - { - case __FRD_OUTCOME.FRDO_GOTO_DOWNLOAD_SITE: - Marshal.ThrowExceptionForHR(retargetDialog.NavigateToFrameworkDownloadUrl()); - return false; - case __FRD_OUTCOME.FRDO_LEAVE_UNLOADED: - return false; - case __FRD_OUTCOME.FRDO_RETARGET_TO_40: - // If we are retargeting to 4.0, then set the flag to set the appropriate Target Framework. - // This will dirty the project file, so we check it out of source control now -- so that - // the user can associate getting the checkout prompt with the "No Framework" dialog. - if (QueryEditProjectFile(false /* bSuppressUI */)) - { - var retargetingService = this.site.GetService(typeof(SVsTrackProjectRetargeting)) as IVsTrackProjectRetargeting; - if (retargetingService != null) - { - // We surround our batch retargeting request with begin/end because in individual project load - // scenarios the solution load context hasn't done it for us. - Marshal.ThrowExceptionForHR(retargetingService.BeginRetargetingBatch()); - Marshal.ThrowExceptionForHR(retargetingService.BatchRetargetProject(this.InteropSafeIVsHierarchy, DefaultTargetFrameworkMoniker.FullName, true)); - Marshal.ThrowExceptionForHR(retargetingService.EndRetargetingBatch()); - } - else - { - // Just setting the moniker to null will allow the default framework (.NETFX 4.0) to assert itself. - this.TargetFrameworkMoniker = null; - } - - return true; - } - else - { - return false; - } - default: - throw new ArgumentException("Unexpected outcome from retargeting dialog."); - } - } - } - - private bool IsFrameworkOnMachine() - { - var multiTargeting = this.site.GetService(typeof(SVsFrameworkMultiTargeting)) as IVsFrameworkMultiTargeting; - Array frameworks; - Marshal.ThrowExceptionForHR(multiTargeting.GetSupportedFrameworks(out frameworks)); - foreach (string fx in frameworks) - { - uint compat; - int hr = multiTargeting.CheckFrameworkCompatibility(this.TargetFrameworkMoniker.FullName, fx, out compat); - if (hr < 0) - { - break; - } - - if ((__VSFRAMEWORKCOMPATIBILITY)compat == __VSFRAMEWORKCOMPATIBILITY.VSFRAMEWORKCOMPATIBILITY_COMPATIBLE) - { - return true; - } - } - - return false; - } - } -} diff --git a/source/Archive/MPF/12.0/ProjectOptions.cs b/source/Archive/MPF/12.0/ProjectOptions.cs deleted file mode 100644 index acf321261a..0000000000 --- a/source/Archive/MPF/12.0/ProjectOptions.cs +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System.Collections.Specialized; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.Versioning; - -namespace Microsoft.VisualStudio.Project -{ - public class ProjectOptions : System.CodeDom.Compiler.CompilerParameters - { - public string Config { get; set; } - - public ModuleKindFlags ModuleKind { get; set; } - - public bool EmitManifest { get; set; } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public StringCollection DefinedPreprocessorSymbols { get; set; } - - public string XmlDocFileName { get; set; } - - public string RecursiveWildcard { get; set; } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public StringCollection ReferencedModules { get; set; } - - public string Win32Icon { get; set; } - - public bool PdbOnly { get; set; } - - public bool Optimize { get; set; } - - public bool IncrementalCompile { get; set; } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - public int[] SuppressedWarnings { get; set; } - - public bool CheckedArithmetic { get; set; } - - public bool AllowUnsafeCode { get; set; } - - public bool DisplayCommandLineHelp { get; set; } - - public bool SuppressLogo { get; set; } - - public long BaseAddress { get; set; } - - public string BugReportFileName { get; set; } - - /// must be an int if not null - public object CodePage { get; set; } - - public bool EncodeOutputInUtf8 { get; set; } - - public bool FullyQualifyPaths { get; set; } - - public int FileAlignment { get; set; } - - public bool NoStandardLibrary { get; set; } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] - public StringCollection AdditionalSearchPaths { get; set; } - - public bool HeuristicReferenceResolution { get; set; } - - public string RootNamespace { get; set; } - - public bool CompileAndExecute { get; set; } - - /// must be an int if not null. - public object UserLocaleId { get; set; } - - public FrameworkName TargetFrameworkMoniker { get; set; } - - public ProjectOptions() - { - EmitManifest = true; - ModuleKind = ModuleKindFlags.ConsoleApplication; - } - - public virtual string GetOptionHelp() - { - return null; - } - } -} diff --git a/source/Archive/MPF/12.0/ProjectPackage.cs b/source/Archive/MPF/12.0/ProjectPackage.cs deleted file mode 100644 index 49ccdd28b9..0000000000 --- a/source/Archive/MPF/12.0/ProjectPackage.cs +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines abstract package. - /// - [ComVisible(true)] - - public abstract class ProjectPackage : Microsoft.VisualStudio.Shell.Package - { - #region fields - /// - /// This is the place to register all the solution listeners. - /// - private List solutionListeners = new List(); - #endregion - - #region properties - /// - /// Add your listener to this list. They should be added in the overridden Initialize befaore calling the base. - /// - protected internal IList SolutionListeners - { - get - { - return this.solutionListeners; - } - } - - public abstract string ProductUserContext { get; } - - #endregion - - #region methods - protected override void Initialize() - { - base.Initialize(); - - // Subscribe to the solution events - this.solutionListeners.Add(new SolutionListenerForProjectReferenceUpdate(this)); - this.solutionListeners.Add(new SolutionListenerForProjectOpen(this)); - this.solutionListeners.Add(new SolutionListenerForBuildDependencyUpdate(this)); - this.solutionListeners.Add(new SolutionListenerForProjectEvents(this)); - - foreach(SolutionListener solutionListener in this.solutionListeners) - { - solutionListener.Init(); - } - } - - protected override void Dispose(bool disposing) - { - // Unadvise solution listeners. - try - { - if(disposing) - { - foreach(SolutionListener solutionListener in this.solutionListeners) - { - solutionListener.Dispose(); - } - - // Dispose the UIThread singleton. - UIThread.Instance.Dispose(); - } - } - finally - { - - base.Dispose(disposing); - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/ProjectReferenceNode.cs b/source/Archive/MPF/12.0/ProjectReferenceNode.cs deleted file mode 100644 index 594842c04b..0000000000 --- a/source/Archive/MPF/12.0/ProjectReferenceNode.cs +++ /dev/null @@ -1,598 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - - public class ProjectReferenceNode : ReferenceNode - { - #region fields - /// - /// The name of the assembly this reference represents - /// - private Guid referencedProjectGuid; - - private string referencedProjectName = String.Empty; - - private string referencedProjectRelativePath = String.Empty; - - private string referencedProjectFullPath = String.Empty; - - private BuildDependency buildDependency; - - /// - /// This is a reference to the automation object for the referenced project. - /// - private EnvDTE.Project referencedProject; - - /// - /// This state is controlled by the solution events. - /// The state is set to false by OnBeforeUnloadProject. - /// The state is set to true by OnBeforeCloseProject event. - /// - private bool canRemoveReference = true; - - /// - /// Possibility for solution listener to update the state on the dangling reference. - /// It will be set in OnBeforeUnloadProject then the nopde is invalidated then it is reset to false. - /// - private bool isNodeValid; - - #endregion - - #region properties - - public override string Url - { - get - { - return this.referencedProjectFullPath; - } - } - - public override string Caption - { - get - { - return this.referencedProjectName; - } - } - - internal Guid ReferencedProjectGuid - { - get - { - return this.referencedProjectGuid; - } - } - - /// - /// Possiblity to shortcut and set the dangling project reference icon. - /// It is ussually manipulated by solution listsneres who handle reference updates. - /// - internal protected bool IsNodeValid - { - get - { - return this.isNodeValid; - } - set - { - this.isNodeValid = value; - } - } - - /// - /// Controls the state whether this reference can be removed or not. Think of the project unload scenario where the project reference should not be deleted. - /// - internal bool CanRemoveReference - { - get - { - return this.canRemoveReference; - } - set - { - this.canRemoveReference = value; - } - } - - internal string ReferencedProjectName - { - get { return this.referencedProjectName; } - } - - /// - /// Gets the automation object for the referenced project. - /// - internal EnvDTE.Project ReferencedProjectObject - { - get - { - // If the referenced project is null then re-read. - if (this.referencedProject == null) - { - - // Search for the project in the collection of the projects in the - // current solution. - EnvDTE.DTE dte = (EnvDTE.DTE)this.ProjectMgr.GetService(typeof(EnvDTE.DTE)); - if ((null == dte) || (null == dte.Solution)) - { - return null; - } - - this.referencedProject = this.FindReferencedProject(dte.Solution.Projects); - } - - return this.referencedProject; - } - set - { - this.referencedProject = value; - } - } - - /// - /// Gets the full path to the assembly generated by this project. - /// - internal string ReferencedProjectOutputPath - { - get - { - // Make sure that the referenced project implements the automation object. - if(null == this.ReferencedProjectObject) - { - return null; - } - - // Get the configuration manager from the project. - EnvDTE.ConfigurationManager confManager = this.ReferencedProjectObject.ConfigurationManager; - if(null == confManager) - { - return null; - } - - // Get the active configuration. - EnvDTE.Configuration config = confManager.ActiveConfiguration; - if(null == config) - { - return null; - } - - // Get the output path for the current configuration. - EnvDTE.Property outputPathProperty = config.Properties.Item("OutputPath"); - if(null == outputPathProperty) - { - return null; - } - - string outputPath = outputPathProperty.Value.ToString(); - - // Ususally the output path is relative to the project path, but it is possible - // to set it as an absolute path. If it is not absolute, then evaluate its value - // based on the project directory. - if(!System.IO.Path.IsPathRooted(outputPath)) - { - string projectDir = System.IO.Path.GetDirectoryName(referencedProjectFullPath); - outputPath = System.IO.Path.Combine(projectDir, outputPath); - } - - // Now get the name of the assembly from the project. - // Some project system throw if the property does not exist. We expect an ArgumentException. - EnvDTE.Property assemblyNameProperty = null; - try - { - assemblyNameProperty = this.ReferencedProjectObject.Properties.Item("OutputFileName"); - } - catch(ArgumentException) - { - } - - if(null == assemblyNameProperty) - { - return null; - } - // build the full path adding the name of the assembly to the output path. - outputPath = System.IO.Path.Combine(outputPath, assemblyNameProperty.Value.ToString()); - - return outputPath; - } - } - - private Automation.OAProjectReference projectReference; - internal override object Object - { - get - { - if(null == projectReference) - { - projectReference = new Automation.OAProjectReference(this); - } - return projectReference; - } - } - #endregion - - #region ctors - /// - /// Constructor for the ReferenceNode. It is called when the project is reloaded, when the project element representing the refernce exists. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings")] - public ProjectReferenceNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.referencedProjectRelativePath = this.ItemNode.GetMetadata(ProjectFileConstants.Include); - Debug.Assert(!String.IsNullOrEmpty(this.referencedProjectRelativePath), "Could not retrive referenced project path form project file"); - - string guidString = this.ItemNode.GetMetadata(ProjectFileConstants.Project); - - // Continue even if project setttings cannot be read. - try - { - this.referencedProjectGuid = new Guid(guidString); - - this.buildDependency = new BuildDependency(this.ProjectMgr, this.referencedProjectGuid); - this.ProjectMgr.AddBuildDependency(this.buildDependency); - } - finally - { - Debug.Assert(this.referencedProjectGuid != Guid.Empty, "Could not retrive referenced project guidproject file"); - - this.referencedProjectName = this.ItemNode.GetMetadata(ProjectFileConstants.Name); - - Debug.Assert(!String.IsNullOrEmpty(this.referencedProjectName), "Could not retrive referenced project name form project file"); - } - - Uri uri = new Uri(this.ProjectMgr.BaseURI.Uri, this.referencedProjectRelativePath); - - if(uri != null) - { - this.referencedProjectFullPath = Microsoft.VisualStudio.Shell.Url.Unescape(uri.LocalPath, true); - } - } - - /// - /// constructor for the ProjectReferenceNode - /// - public ProjectReferenceNode(ProjectNode root, string referencedProjectName, string projectPath, string projectReference) - : base(root) - { - Debug.Assert(root != null && !String.IsNullOrEmpty(referencedProjectName) && !String.IsNullOrEmpty(projectReference) - && !String.IsNullOrEmpty(projectPath), "Can not add a reference because the input for adding one is invalid."); - - if (projectReference == null) - { - throw new ArgumentNullException("projectReference"); - } - - this.referencedProjectName = referencedProjectName; - - int indexOfSeparator = projectReference.IndexOf('|'); - - - string fileName = String.Empty; - - // Unfortunately we cannot use the path part of the projectReference string since it is not resolving correctly relative pathes. - if(indexOfSeparator != -1) - { - string projectGuid = projectReference.Substring(0, indexOfSeparator); - this.referencedProjectGuid = new Guid(projectGuid); - if(indexOfSeparator + 1 < projectReference.Length) - { - string remaining = projectReference.Substring(indexOfSeparator + 1); - indexOfSeparator = remaining.IndexOf('|'); - - if(indexOfSeparator == -1) - { - fileName = remaining; - } - else - { - fileName = remaining.Substring(0, indexOfSeparator); - } - } - } - - Debug.Assert(!String.IsNullOrEmpty(fileName), "Can not add a project reference because the input for adding one is invalid."); - - // Did we get just a file or a relative path? - Uri uri = new Uri(projectPath); - - string referenceDir = PackageUtilities.GetPathDistance(this.ProjectMgr.BaseURI.Uri, uri); - - Debug.Assert(!String.IsNullOrEmpty(referenceDir), "Can not add a project reference because the input for adding one is invalid."); - - string justTheFileName = Path.GetFileName(fileName); - this.referencedProjectRelativePath = Path.Combine(referenceDir, justTheFileName); - - this.referencedProjectFullPath = Path.Combine(projectPath, justTheFileName); - - this.buildDependency = new BuildDependency(this.ProjectMgr, this.referencedProjectGuid); - - } - #endregion - - #region methods - protected override NodeProperties CreatePropertiesObject() - { - return new ProjectReferencesProperties(this); - } - - /// - /// The node is added to the hierarchy and then updates the build dependency list. - /// - public override void AddReference() - { - if(this.ProjectMgr == null) - { - return; - } - base.AddReference(); - this.ProjectMgr.AddBuildDependency(this.buildDependency); - return; - } - - /// - /// Overridden method. The method updates the build dependency list before removing the node from the hierarchy. - /// - public override void Remove(bool removeFromStorage) - { - if(this.ProjectMgr == null || !this.CanRemoveReference) - { - return; - } - this.ProjectMgr.RemoveBuildDependency(this.buildDependency); - base.Remove(removeFromStorage); - return; - } - - /// - /// Links a reference node to the project file. - /// - protected override void BindReferenceData() - { - Debug.Assert(!String.IsNullOrEmpty(this.referencedProjectName), "The referencedProjectName field has not been initialized"); - Debug.Assert(this.referencedProjectGuid != Guid.Empty, "The referencedProjectName field has not been initialized"); - - this.ItemNode = new ProjectElement(this.ProjectMgr, this.referencedProjectRelativePath, ProjectFileConstants.ProjectReference); - - this.ItemNode.SetMetadata(ProjectFileConstants.Name, this.referencedProjectName); - this.ItemNode.SetMetadata(ProjectFileConstants.Project, this.referencedProjectGuid.ToString("B")); - this.ItemNode.SetMetadata(ProjectFileConstants.Private, true.ToString()); - } - - /// - /// Defines whether this node is valid node for painting the refererence icon. - /// - /// - protected override bool CanShowDefaultIcon() - { - if(this.referencedProjectGuid == Guid.Empty || this.ProjectMgr == null || this.ProjectMgr.IsClosed || this.isNodeValid) - { - return false; - } - - IVsHierarchy hierarchy = null; - - hierarchy = VsShellUtilities.GetHierarchy(this.ProjectMgr.Site, this.referencedProjectGuid); - - if(hierarchy == null) - { - return false; - } - - //If the Project is unloaded return false - if(this.ReferencedProjectObject == null) - { - return false; - } - - return (!String.IsNullOrEmpty(this.referencedProjectFullPath) && File.Exists(this.referencedProjectFullPath)); - } - - /// - /// Checks if a project reference can be added to the hierarchy. It calls base to see if the reference is not already there, then checks for circular references. - /// - /// The error handler delegate to return - /// - protected override bool CanAddReference(out CannotAddReferenceErrorMessage errorHandler) - { - // When this method is called this refererence has not yet been added to the hierarchy, only instantiated. - if(!base.CanAddReference(out errorHandler)) - { - return false; - } - - errorHandler = null; - if(this.IsThisProjectReferenceInCycle()) - { - errorHandler = new CannotAddReferenceErrorMessage(ShowCircularReferenceErrorMessage); - return false; - } - - return true; - } - - private bool IsThisProjectReferenceInCycle() - { - return IsReferenceInCycle(this.referencedProjectGuid); - } - - private void ShowCircularReferenceErrorMessage() - { - string message = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.ProjectContainsCircularReferences, CultureInfo.CurrentUICulture), this.referencedProjectName); - string title = string.Empty; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(this.ProjectMgr.Site, title, message, icon, buttons, defaultButton); - } - - /// - /// Checks whether a reference added to a given project would introduce a circular dependency. - /// - private bool IsReferenceInCycle(Guid projectGuid) - { - IVsHierarchy referencedHierarchy = VsShellUtilities.GetHierarchy(this.ProjectMgr.Site, projectGuid); - - var solutionBuildManager = this.ProjectMgr.Site.GetService(typeof(SVsSolutionBuildManager)) as IVsSolutionBuildManager2; - if (solutionBuildManager == null) - { - throw new InvalidOperationException("Cannot find the IVsSolutionBuildManager2 service."); - } - - int circular; - Marshal.ThrowExceptionForHR(solutionBuildManager.CalculateProjectDependencies()); - Marshal.ThrowExceptionForHR(solutionBuildManager.QueryProjectDependency(referencedHierarchy, this.ProjectMgr.InteropSafeIVsHierarchy, out circular)); - - return circular != 0; - } - - private EnvDTE.Project FindReferencedProject(System.Collections.IEnumerable projects) - { - EnvDTE.Project refProject = null; - - // Search for the project in the collection of the projects in the current solution. - foreach (EnvDTE.Project prj in projects) - { - //Skip this project if it is an umodeled project (unloaded) - if (string.Compare(EnvDTE.Constants.vsProjectKindUnmodeled, prj.Kind, StringComparison.OrdinalIgnoreCase) == 0) - { - continue; - } - - // Recursively iterate solution folder for the project. - if (string.Compare(EnvDTE.Constants.vsProjectKindSolutionItems, prj.Kind, StringComparison.OrdinalIgnoreCase) == 0) - { - var containedProjects = GetContainerProjects(prj); - - refProject = FindReferencedProject(containedProjects); - if (refProject != null) - return refProject; - } - - // Get the full path of the current project. - EnvDTE.Property pathProperty = null; - try - { - if (prj.Properties == null) - { - continue; - } - - pathProperty = prj.Properties.Item("FullPath"); - if (null == pathProperty) - { - // The full path should alway be availabe, but if this is not the - // case then we have to skip it. - continue; - } - } - catch (ArgumentException) - { - continue; - } - string prjPath = pathProperty.Value.ToString(); - EnvDTE.Property fileNameProperty = null; - // Get the name of the project file. - try - { - fileNameProperty = prj.Properties.Item("FileName"); - if (null == fileNameProperty) - { - // Again, this should never be the case, but we handle it anyway. - continue; - } - } - catch (ArgumentException) - { - continue; - } - prjPath = System.IO.Path.Combine(prjPath, fileNameProperty.Value.ToString()); - - // If the full path of this project is the same as the one of this - // reference, then we have found the right project. - if (NativeMethods.IsSamePath(prjPath, referencedProjectFullPath)) - { - refProject = prj; - break; - } - } - return refProject; - } - - private static System.Collections.IEnumerable GetContainerProjects(EnvDTE.Project prj) - { - foreach (var obj in prj.ProjectItems) - { - var pi = obj as EnvDTE.ProjectItem; - if (pi == null) - { - continue; - } - - var nestedPrj = pi.Object as EnvDTE.Project; - if (nestedPrj != null) - { - yield return nestedPrj; - } - } - } - #endregion - } - -} diff --git a/source/Archive/MPF/12.0/Properties/AssemblyInfo.cs b/source/Archive/MPF/12.0/Properties/AssemblyInfo.cs deleted file mode 100644 index 883739f3fc..0000000000 --- a/source/Archive/MPF/12.0/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ -using System; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Resources; - -[assembly: AssemblyTitle("Microsoft.VisualStudio.Project")] -[assembly: AssemblyDescription("MPF Implementation of VS Projects")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("Microsoft.VisualStudio.Project")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2009")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] -[assembly: CLSCompliant(false)] - -[assembly: Guid("084954ec-af04-4ea3-b166-b1fced604dc8")] - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - -[assembly: NeutralResourcesLanguageAttribute("en")] diff --git a/source/Archive/MPF/12.0/PropertiesEditorLauncher.cs b/source/Archive/MPF/12.0/PropertiesEditorLauncher.cs deleted file mode 100644 index 79d7efede1..0000000000 --- a/source/Archive/MPF/12.0/PropertiesEditorLauncher.cs +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.ComponentModel; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using ErrorHandler = Microsoft.VisualStudio.ErrorHandler; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This class is used to enable launching the project properties - /// editor from the Properties Browser. - /// - - public class PropertiesEditorLauncher : ComponentEditor - { - private ServiceProvider serviceProvider; - - #region ctor - public PropertiesEditorLauncher(ServiceProvider serviceProvider) - { - if(serviceProvider == null) - throw new ArgumentNullException("serviceProvider"); - - this.serviceProvider = serviceProvider; - } - #endregion - #region overridden methods - /// - /// Launch the Project Properties Editor (properties pages) - /// - /// If we succeeded or not - public override bool EditComponent(ITypeDescriptorContext context, object component) - { - if(component is ProjectNodeProperties) - { - IVsPropertyPageFrame propertyPageFrame = (IVsPropertyPageFrame)serviceProvider.GetService((typeof(SVsPropertyPageFrame))); - - int hr = propertyPageFrame.ShowFrame(Guid.Empty); - if(ErrorHandler.Succeeded(hr)) - return true; - else - ErrorHandler.ThrowOnFailure(propertyPageFrame.ReportError(hr)); - } - - return false; - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/ReferenceContainerNode.cs b/source/Archive/MPF/12.0/ReferenceContainerNode.cs deleted file mode 100644 index 250e8ad51d..0000000000 --- a/source/Archive/MPF/12.0/ReferenceContainerNode.cs +++ /dev/null @@ -1,574 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Text; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using MSBuild = Microsoft.Build.Evaluation; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands = Microsoft.VisualStudio.VSConstants.VSStd97CmdID; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - - public class ReferenceContainerNode : HierarchyNode, IReferenceContainer - { - #region fields - internal const string ReferencesNodeVirtualName = "References"; - #endregion - - #region ctor - public ReferenceContainerNode(ProjectNode root) - : base(root) - { - this.VirtualNodeName = ReferencesNodeVirtualName; - this.ExcludeNodeFromScc = true; - } - #endregion - - #region Properties - private static string[] supportedReferenceTypes = new string[] { - ProjectFileConstants.ProjectReference, - ProjectFileConstants.Reference, - ProjectFileConstants.COMReference - }; - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] - protected virtual string[] SupportedReferenceTypes - { - get { return supportedReferenceTypes; } - } - #endregion - - #region overridden properties - public override int SortPriority - { - get - { - return DefaultSortOrderNode.ReferenceContainerNode; - } - } - - public override int MenuCommandId - { - get { return VsMenus.IDM_VS_CTXT_REFERENCEROOT; } - } - - - public override Guid ItemTypeGuid - { - get { return VSConstants.GUID_ItemType_VirtualFolder; } - } - - - public override string Url - { - get { return this.VirtualNodeName; } - } - - public override string Caption - { - get - { - return SR.GetString(SR.ReferencesNodeName, CultureInfo.CurrentUICulture); - } - } - - - private Automation.OAReferences references; - internal override object Object - { - get - { - if(null == references) - { - references = new Automation.OAReferences(this); - } - return references; - } - } - - #endregion - - #region overridden methods - /// - /// Returns an instance of the automation object for ReferenceContainerNode - /// - /// An intance of the Automation.OAReferenceFolderItem type if succeeeded - public override object GetAutomationObject() - { - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return null; - } - - return new Automation.OAReferenceFolderItem(this.ProjectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - /// - /// Disable inline editing of Caption of a ReferendeContainerNode - /// - /// null - public override string GetEditLabel() - { - return null; - } - - - public override object GetIconHandle(bool open) - { - return this.ProjectMgr.ImageHandler.GetIconHandle(open ? (int)ProjectNode.ImageName.OpenReferenceFolder : (int)ProjectNode.ImageName.ReferenceFolder); - } - - - /// - /// References node cannot be dragged. - /// - /// A stringbuilder. - protected internal override StringBuilder PrepareSelectedNodesForClipBoard() - { - return null; - } - - /// - /// Not supported. - /// - protected override int ExcludeFromProject() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if(cmdGroup == VsMenus.guidStandardCommandSet97) - { - switch((VsCommands)cmd) - { - case VsCommands.AddNewItem: - case VsCommands.AddExistingItem: - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.ADDREFERENCE) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - protected override int ExecCommandOnNode(Guid cmdGroup, uint cmd, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) - { - if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - switch((VsCommands2K)cmd) - { - case VsCommands2K.ADDREFERENCE: - return this.ProjectMgr.AddProjectReference(); - case VsCommands2K.ADDWEBREFERENCE: - return this.ProjectMgr.AddWebReference(); - } - } - - return base.ExecCommandOnNode(cmdGroup, cmd, nCmdexecopt, pvaIn, pvaOut); - } - - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - return false; - } - - /// - /// Defines whether this node is valid node for painting the refererences icon. - /// - /// - protected override bool CanShowDefaultIcon() - { - if(!String.IsNullOrEmpty(this.VirtualNodeName)) - { - return true; - } - return false; - } - - #endregion - - #region IReferenceContainer - public IList EnumReferences() - { - List refs = new List(); - for(HierarchyNode node = this.FirstChild; node != null; node = node.NextSibling) - { - ReferenceNode refNode = node as ReferenceNode; - if(refNode != null) - { - refs.Add(refNode); - } - } - - return refs; - } - /// - /// Adds references to this container from a MSBuild project. - /// - public void LoadReferencesFromBuildProject(MSBuild.Project buildProject) - { - foreach(string referenceType in SupportedReferenceTypes) - { - IEnumerable referencesGroup = this.ProjectMgr.BuildProject.GetItems(referenceType); - - bool isAssemblyReference = referenceType == ProjectFileConstants.Reference; - // If the project was loaded for browsing we should still create the nodes but as not resolved. - if(isAssemblyReference && this.ProjectMgr.Build(MsBuildTarget.ResolveAssemblyReferences) != MSBuildResult.Successful) - { - continue; - } - - foreach (MSBuild.ProjectItem item in referencesGroup) - { - ProjectElement element = new ProjectElement(this.ProjectMgr, item, false); - - ReferenceNode node = CreateReferenceNode(referenceType, element); - - if(node != null) - { - // Make sure that we do not want to add the item twice to the ui hierarchy - // We are using here the UI representation of the Node namely the Caption to find that out, in order to - // avoid different representation problems. - // Example : - // - bool found = false; - for(HierarchyNode n = this.FirstChild; n != null && !found; n = n.NextSibling) - { - if(String.Compare(n.Caption, node.Caption, StringComparison.OrdinalIgnoreCase) == 0) - { - found = true; - } - } - - if(!found) - { - this.AddChild(node); - } - } - } - } - } - - /// - /// Adds a reference to this container using the selector data structure to identify it. - /// - /// data describing selected component - /// Reference in case of a valid reference node has been created. Otherwise null - public ReferenceNode AddReferenceFromSelectorData(VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null) - { - //Make sure we can edit the project file - if(!this.ProjectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - - //Create the reference node - ReferenceNode node = null; - try - { - node = CreateReferenceNode(selectorData, wrapperTool); - } - catch(ArgumentException) - { - // Some selector data was not valid. - } - - // Does such a reference already exist in the project? - ReferenceNode existingNode; - if (node.IsAlreadyAdded(out existingNode)) - { - return existingNode; - } - - //Add the reference node to the project if we have a valid reference node - if(node != null) - { - // This call will find if the reference is in the project and, in this case - // will not add it again, so the parent node will not be set. - node.AddReference(); - if(null == node.Parent) - { - // The reference was not added, so we can not return this item because it - // is not inside the project. - return null; - } - } - - return node; - } - #endregion - - #region virtual methods - protected virtual ReferenceNode CreateReferenceNode(string referenceType, ProjectElement element) - { - ReferenceNode node = null; - if(referenceType == ProjectFileConstants.COMReference) - { - node = this.CreateComReferenceNode(element); - } - else if(referenceType == ProjectFileConstants.Reference) - { - node = this.CreateAssemblyReferenceNode(element); - } - else if(referenceType == ProjectFileConstants.ProjectReference) - { - node = this.CreateProjectReferenceNode(element); - } - - return node; - } - - protected virtual ReferenceNode CreateReferenceNode(VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null) - { - ReferenceNode node = null; - switch(selectorData.type) - { - case VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project: - node = this.CreateProjectReferenceNode(selectorData); - break; - case VSCOMPONENTTYPE.VSCOMPONENTTYPE_File: - // This is the case for managed assembly - case VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus: - node = this.CreateFileComponent(selectorData, wrapperTool); - break; - case VSCOMPONENTTYPE.VSCOMPONENTTYPE_Com2: - node = this.CreateComReferenceNode(selectorData, wrapperTool); - break; - } - - return node; - } - #endregion - - #region Helper functions to add references - /// - /// Creates a project reference node given an existing project element. - /// - protected virtual ProjectReferenceNode CreateProjectReferenceNode(ProjectElement element) - { - return new ProjectReferenceNode(this.ProjectMgr, element); - } - /// - /// Create a Project to Project reference given a VSCOMPONENTSELECTORDATA structure - /// - protected virtual ProjectReferenceNode CreateProjectReferenceNode(VSCOMPONENTSELECTORDATA selectorData) - { - return new ProjectReferenceNode(this.ProjectMgr, selectorData.bstrTitle, selectorData.bstrFile, selectorData.bstrProjRef); - } - - /// - /// Creates an assemby or com reference node given a selector data. - /// - protected virtual ReferenceNode CreateFileComponent(VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null) - { - if(null == selectorData.bstrFile) - { - throw new ArgumentNullException("selectorData"); - } - - // We have a path to a file, it could be anything - // First see if it is a managed assembly - bool tryToCreateAnAssemblyReference = true; - if(File.Exists(selectorData.bstrFile)) - { - try - { - // We should not load the assembly in the current appdomain. - // If we do not do it like that and we load the assembly in the current appdomain then the assembly cannot be unloaded again. - // The following problems might arose in that case. - // 1. Assume that a user is extending the MPF and his project is creating a managed assembly dll. - // 2. The user opens VS and creates a project and builds it. - // 3. Then the user opens VS creates another project and adds a reference to the previously built assembly. This will load the assembly in the appdomain had we been using Assembly.ReflectionOnlyLoadFrom. - // 4. Then he goes back to the first project modifies it an builds it. A build error is issued that the assembly is used. - - // GetAssemblyName is assured not to load the assembly. - tryToCreateAnAssemblyReference = (AssemblyName.GetAssemblyName(selectorData.bstrFile) != null); - } - catch(BadImageFormatException) - { - // We have found the file and it is not a .NET assembly; no need to try to - // load it again. - tryToCreateAnAssemblyReference = false; - } - catch(FileLoadException) - { - // We must still try to load from here because this exception is thrown if we want - // to add the same assembly refererence from different locations. - tryToCreateAnAssemblyReference = true; - } - } - - ReferenceNode node = null; - - if(tryToCreateAnAssemblyReference) - { - // This might be a candidate for an assembly reference node. Try to load it. - // CreateAssemblyReferenceNode will suppress BadImageFormatException if the node cannot be created. - node = this.CreateAssemblyReferenceNode(selectorData.bstrFile); - } - - // If no node has been created try to create a com reference node. - if(node == null) - { - if(!File.Exists(selectorData.bstrFile)) - { - return null; - } - node = this.CreateComReferenceNode(selectorData, wrapperTool); - } - - return node; - } - - /// - /// Creates an assembly refernce node from a project element. - /// - protected virtual AssemblyReferenceNode CreateAssemblyReferenceNode(ProjectElement element) - { - AssemblyReferenceNode node = null; - try - { - node = new AssemblyReferenceNode(this.ProjectMgr, element); - } - catch(ArgumentNullException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(FileNotFoundException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(BadImageFormatException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(FileLoadException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(System.Security.SecurityException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - - return node; - } - /// - /// Creates an assembly reference node from a file path. - /// - protected virtual AssemblyReferenceNode CreateAssemblyReferenceNode(string fileName) - { - AssemblyReferenceNode node = null; - try - { - node = new AssemblyReferenceNode(this.ProjectMgr, fileName); - } - catch(ArgumentNullException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(FileNotFoundException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(BadImageFormatException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(FileLoadException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - catch(System.Security.SecurityException e) - { - Trace.WriteLine("Exception : " + e.Message); - } - - return node; - } - - /// - /// Creates a com reference node from the project element. - /// - protected virtual ComReferenceNode CreateComReferenceNode(ProjectElement reference) - { - return new ComReferenceNode(this.ProjectMgr, reference); - } - /// - /// Creates a com reference node from a selector data. - /// - protected virtual ComReferenceNode CreateComReferenceNode(Microsoft.VisualStudio.Shell.Interop.VSCOMPONENTSELECTORDATA selectorData, string wrapperTool = null) - { - ComReferenceNode node = new ComReferenceNode(this.ProjectMgr, selectorData); - return node; - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/ReferenceNode.cs b/source/Archive/MPF/12.0/ReferenceNode.cs deleted file mode 100644 index 6f19202b5c..0000000000 --- a/source/Archive/MPF/12.0/ReferenceNode.cs +++ /dev/null @@ -1,377 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Text; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; -using VsCommands2K = Microsoft.VisualStudio.VSConstants.VSStd2KCmdID; - -namespace Microsoft.VisualStudio.Project -{ - - public abstract class ReferenceNode : HierarchyNode - { - protected delegate void CannotAddReferenceErrorMessage(); - - #region ctors - /// - /// constructor for the ReferenceNode - /// - protected ReferenceNode(ProjectNode root, ProjectElement element) - : base(root, element) - { - this.ExcludeNodeFromScc = true; - } - - /// - /// constructor for the ReferenceNode - /// - protected ReferenceNode(ProjectNode root) - : base(root) - { - this.ExcludeNodeFromScc = true; - } - - #endregion - - #region overridden properties - public override int MenuCommandId - { - get { return VsMenus.IDM_VS_CTXT_REFERENCE; } - } - - public override Guid ItemTypeGuid - { - get { return Guid.Empty; } - } - - public override string Url - { - get - { - return String.Empty; - } - } - - public override string Caption - { - get - { - return String.Empty; - } - } - #endregion - - #region overridden methods - protected override NodeProperties CreatePropertiesObject() - { - return new ReferenceNodeProperties(this); - } - - /// - /// Get an instance of the automation object for ReferenceNode - /// - /// An instance of Automation.OAReferenceItem type if succeeded - public override object GetAutomationObject() - { - if(this.ProjectMgr == null || this.ProjectMgr.IsClosed) - { - return null; - } - - return new Automation.OAReferenceItem(this.ProjectMgr.GetAutomationObject() as Automation.OAProject, this); - } - - /// - /// Disable inline editing of Caption of a ReferendeNode - /// - /// null - public override string GetEditLabel() - { - return null; - } - - - public override object GetIconHandle(bool open) - { - int offset = (this.CanShowDefaultIcon() ? (int)ProjectNode.ImageName.Reference : (int)ProjectNode.ImageName.DanglingReference); - return this.ProjectMgr.ImageHandler.GetIconHandle(offset); - } - - /// - /// This method is called by the interface method GetMkDocument to specify the item moniker. - /// - /// The moniker for this item - public override string GetMkDocument() - { - return this.Url; - } - - /// - /// Not supported. - /// - protected override int ExcludeFromProject() - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - /// - /// References node cannot be dragged. - /// - /// A stringbuilder. - protected internal override StringBuilder PrepareSelectedNodesForClipBoard() - { - return null; - } - - protected override int QueryStatusOnNode(Guid cmdGroup, uint cmd, IntPtr pCmdText, ref QueryStatusResult result) - { - if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.QUICKOBJECTSEARCH) - { - result |= QueryStatusResult.SUPPORTED | QueryStatusResult.ENABLED; - return VSConstants.S_OK; - } - } - else - { - return (int)OleConstants.OLECMDERR_E_UNKNOWNGROUP; - } - return base.QueryStatusOnNode(cmdGroup, cmd, pCmdText, ref result); - } - - protected override int ExecCommandOnNode(Guid cmdGroup, uint cmd, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) - { - if(cmdGroup == VsMenus.guidStandardCommandSet2K) - { - if((VsCommands2K)cmd == VsCommands2K.QUICKOBJECTSEARCH) - { - return this.ShowObjectBrowser(); - } - } - - return base.ExecCommandOnNode(cmdGroup, cmd, nCmdexecopt, pvaIn, pvaOut); - } - - #endregion - - #region methods - - - /// - /// Links a reference node to the project and hierarchy. - /// - public virtual void AddReference() - { - ReferenceContainerNode referencesFolder = this.ProjectMgr.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as ReferenceContainerNode; - Debug.Assert(referencesFolder != null, "Could not find the References node"); - - CannotAddReferenceErrorMessage referenceErrorMessageHandler = null; - - if(!this.CanAddReference(out referenceErrorMessageHandler)) - { - if(referenceErrorMessageHandler != null) - { - referenceErrorMessageHandler.DynamicInvoke(new object[] { }); - } - return; - } - - // Link the node to the project file. - this.BindReferenceData(); - - // At this point force the item to be refreshed - this.ItemNode.RefreshProperties(); - - referencesFolder.AddChild(this); - - return; - } - - /// - /// Refreshes a reference by re-resolving it and redrawing the icon. - /// - internal virtual void RefreshReference() - { - this.ResolveReference(); - this.ReDraw(UIHierarchyElement.Icon); - } - - /// - /// Resolves references. - /// - protected virtual void ResolveReference() - { - - } - - /// - /// Validates that a reference can be added. - /// - /// A CannotAddReferenceErrorMessage delegate to show the error message. - /// true if the reference can be added. - protected virtual bool CanAddReference(out CannotAddReferenceErrorMessage errorHandler) - { - // When this method is called this refererence has not yet been added to the hierarchy, only instantiated. - errorHandler = null; - if(this.IsAlreadyAdded()) - { - return false; - } - - return true; - } - - /// - /// Checks if a reference is already added. The method parses all references and compares the Url. - /// - /// true if the assembly has already been added. - protected bool IsAlreadyAdded() - { - ReferenceNode existingReference; - return IsAlreadyAdded(out existingReference); - } - - /// - /// Checks if a reference is already added. The method parses all references and compares the Url. - /// - /// The existing reference, if one is found. - /// true if the assembly has already been added. - protected internal virtual bool IsAlreadyAdded(out ReferenceNode existingEquivalentNode) - { - ReferenceContainerNode referencesFolder = this.ProjectMgr.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as ReferenceContainerNode; - Debug.Assert(referencesFolder != null, "Could not find the References node"); - - for(HierarchyNode n = referencesFolder.FirstChild; n != null; n = n.NextSibling) - { - ReferenceNode referenceNode = n as ReferenceNode; - if(null != referenceNode) - { - // We check if the Url of the assemblies is the same. - if(NativeMethods.IsSamePath(referenceNode.Url, this.Url)) - { - existingEquivalentNode = referenceNode; - return true; - } - } - } - - existingEquivalentNode = null; - return false; - } - - - /// - /// Shows the Object Browser - /// - /// - protected virtual int ShowObjectBrowser() - { - if(String.IsNullOrEmpty(this.Url) || !File.Exists(this.Url)) - { - return (int)OleConstants.OLECMDERR_E_NOTSUPPORTED; - } - - // Request unmanaged code permission in order to be able to creaet the unmanaged memory representing the guid. - new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); - - Guid guid = VSConstants.guidCOMPLUSLibrary; - IntPtr ptr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(guid.ToByteArray().Length); - - System.Runtime.InteropServices.Marshal.StructureToPtr(guid, ptr, false); - int returnValue = VSConstants.S_OK; - try - { - VSOBJECTINFO[] objInfo = new VSOBJECTINFO[1]; - - objInfo[0].pguidLib = ptr; - objInfo[0].pszLibName = this.Url; - - IVsObjBrowser objBrowser = this.ProjectMgr.Site.GetService(typeof(SVsObjBrowser)) as IVsObjBrowser; - - ErrorHandler.ThrowOnFailure(objBrowser.NavigateTo(objInfo, 0)); - } - catch(COMException e) - { - Trace.WriteLine("Exception" + e.ErrorCode); - returnValue = e.ErrorCode; - } - finally - { - if(ptr != IntPtr.Zero) - { - System.Runtime.InteropServices.Marshal.FreeCoTaskMem(ptr); - } - } - - return returnValue; - } - - protected override bool CanDeleteItem(__VSDELETEITEMOPERATION deleteOperation) - { - if(deleteOperation == __VSDELETEITEMOPERATION.DELITEMOP_RemoveFromProject) - { - return true; - } - return false; - } - - protected abstract void BindReferenceData(); - - #endregion - } -} diff --git a/source/Archive/MPF/12.0/RegisteredProjectType.cs b/source/Archive/MPF/12.0/RegisteredProjectType.cs deleted file mode 100644 index e3517878ee..0000000000 --- a/source/Archive/MPF/12.0/RegisteredProjectType.cs +++ /dev/null @@ -1,194 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; -using VSRegistry = Microsoft.VisualStudio.Shell.VSRegistry; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Gets registry settings from for a project. - /// - internal class RegisteredProjectType - { - private string defaultProjectExtension; - - private string projectTemplatesDir; - - private string wizardTemplatesDir; - - private Guid packageGuid; - - internal const string DefaultProjectExtension = "DefaultProjectExtension"; - internal const string WizardsTemplatesDir = "WizardsTemplatesDir"; - internal const string ProjectTemplatesDir = "ProjectTemplatesDir"; - internal const string Package = "Package"; - - - - internal string DefaultProjectExtensionValue - { - get - { - return this.defaultProjectExtension; - } - set - { - this.defaultProjectExtension = value; - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal string ProjectTemplatesDirValue - { - get - { - return this.projectTemplatesDir; - } - set - { - this.projectTemplatesDir = value; - } - } - - internal string WizardTemplatesDirValue - { - get - { - return this.wizardTemplatesDir; - } - set - { - this.wizardTemplatesDir = value; - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Guid PackageGuidValue - { - get - { - return this.packageGuid; - } - set - { - this.packageGuid = value; - } - } - - /// - /// If the project support VsTemplates, returns the path to - /// the vstemplate file corresponding to the requested template - /// - /// You can pass in a string such as: "Windows\Console Application" - /// - internal string GetVsTemplateFile(string templateFile) - { - // First see if this use the vstemplate model - if(!String.IsNullOrEmpty(DefaultProjectExtensionValue)) - { - EnvDTE80.DTE2 dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2; - if(dte != null) - { - EnvDTE80.Solution2 solution = dte.Solution as EnvDTE80.Solution2; - if(solution != null) - { - string fullPath = solution.GetProjectTemplate(templateFile, DefaultProjectExtensionValue); - // The path returned by GetProjectTemplate can be in the format "path|FrameworkVersion=x.y|Language=xxx" - // where the framework version and language sections are optional. - // Here we are interested only in the full path, so we have to remove all the other sections. - int pipePos = fullPath.IndexOf('|'); - if(0 == pipePos) - { - return null; - } - if(pipePos > 0) - { - fullPath = fullPath.Substring(0, pipePos); - } - return fullPath; - } - } - - } - return null; - } - - internal static RegisteredProjectType CreateRegisteredProjectType(Guid projectTypeGuid) - { - RegisteredProjectType registederedProjectType = null; - - using(RegistryKey rootKey = VSRegistry.RegistryRoot(__VsLocalRegistryType.RegType_Configuration)) - { - if(rootKey == null) - { - return null; - } - - string projectPath = "Projects\\" + projectTypeGuid.ToString("B"); - using(RegistryKey projectKey = rootKey.OpenSubKey(projectPath)) - { - if(projectKey == null) - { - return null; - } - - registederedProjectType = new RegisteredProjectType(); - registederedProjectType.DefaultProjectExtensionValue = projectKey.GetValue(DefaultProjectExtension) as string; - registederedProjectType.ProjectTemplatesDirValue = projectKey.GetValue(ProjectTemplatesDir) as string; - registederedProjectType.WizardTemplatesDirValue = projectKey.GetValue(WizardsTemplatesDir) as string; - registederedProjectType.PackageGuidValue = new Guid(projectKey.GetValue(Package) as string); - } - } - - return registederedProjectType; - } - } -} diff --git a/source/Archive/MPF/12.0/Resources/imagelis.bmp b/source/Archive/MPF/12.0/Resources/imagelis.bmp deleted file mode 100644 index 43cb71c75b..0000000000 Binary files a/source/Archive/MPF/12.0/Resources/imagelis.bmp and /dev/null differ diff --git a/source/Archive/MPF/12.0/SelectionListener.cs b/source/Archive/MPF/12.0/SelectionListener.cs deleted file mode 100644 index fc890db91e..0000000000 --- a/source/Archive/MPF/12.0/SelectionListener.cs +++ /dev/null @@ -1,182 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - - - public abstract class SelectionListener : IVsSelectionEvents, IDisposable - { - #region fields - private uint eventsCookie; - private IVsMonitorSelection monSel; - private ServiceProvider serviceProvider; - private bool isDisposed; - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - #endregion - - #region ctors - protected SelectionListener(ServiceProvider serviceProviderParameter) - { - if (serviceProviderParameter == null) - { - throw new ArgumentNullException("serviceProviderParameter"); - } - - this.serviceProvider = serviceProviderParameter; - this.monSel = this.serviceProvider.GetService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection; - - if(this.monSel == null) - { - throw new InvalidOperationException(); - } - } - #endregion - - #region properties - protected uint EventsCookie - { - get - { - return this.eventsCookie; - } - } - - protected IVsMonitorSelection SelectionMonitor - { - get - { - return this.monSel; - } - } - - protected ServiceProvider ServiceProvider - { - get - { - return this.serviceProvider; - } - } - #endregion - - #region IVsSelectionEvents Members - - public virtual int OnCmdUIContextChanged(uint dwCmdUICookie, int fActive) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnElementValueChanged(uint elementid, object varValueOld, object varValueNew) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnSelectionChanged(IVsHierarchy pHierOld, uint itemidOld, IVsMultiItemSelect pMISOld, ISelectionContainer pSCOld, IVsHierarchy pHierNew, uint itemidNew, IVsMultiItemSelect pMISNew, ISelectionContainer pSCNew) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region IDisposable Members - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - #endregion - - #region methods - public void Init() - { - if(this.SelectionMonitor != null) - { - ErrorHandler.ThrowOnFailure(this.SelectionMonitor.AdviseSelectionEvents(this, out this.eventsCookie)); - } - } - - /// - /// The method that does the cleanup. - /// - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "Microsoft.VisualStudio.Shell.Interop.IVsMonitorSelection.UnadviseSelectionEvents(System.UInt32)")] - protected virtual void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simulteniously. - lock(Mutex) - { - if(disposing && this.eventsCookie != (uint)ShellConstants.VSCOOKIE_NIL && this.SelectionMonitor != null) - { - this.SelectionMonitor.UnadviseSelectionEvents((uint)this.eventsCookie); - this.eventsCookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - - this.isDisposed = true; - } - } - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/SettingsPage.cs b/source/Archive/MPF/12.0/SettingsPage.cs deleted file mode 100644 index f4b91be9fb..0000000000 --- a/source/Archive/MPF/12.0/SettingsPage.cs +++ /dev/null @@ -1,524 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.ComponentModel; -using System.Drawing; -using System.Globalization; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Windows.Forms; -using Microsoft.VisualStudio.Designer.Interfaces; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - - /// - /// The base class for property pages. - /// - - public abstract class SettingsPage : - LocalizableProperties, - IPropertyPage, - IDisposable - { - #region fields - private Panel panel; - private bool active; - private bool dirty; - private IPropertyPageSite site; - private ProjectNode project; - private ProjectConfig[] projectConfigs; - private IVSMDPropertyGrid grid; - private string name; - private static volatile object Mutex = new object(); - private bool isDisposed; - #endregion - - #region properties - - [Browsable(false)] - [AutomationBrowsable(false)] - public string Name - { - get - { - return this.name; - } - set - { - this.name = value; - } - } - - [Browsable(false)] - [AutomationBrowsable(false)] - public ProjectNode ProjectMgr - { - get - { - return this.project; - } - } - - protected IVSMDPropertyGrid Grid - { - get { return this.grid; } - } - - protected bool IsDirty - { - get - { - return this.dirty; - } - set - { - if(this.dirty != value) - { - this.dirty = value; - if(this.site != null) - site.OnStatusChange((uint)(this.dirty ? PropPageStatus.Dirty : PropPageStatus.Clean)); - } - } - } - protected Panel ThePanel - { - get - { - return this.panel; - } - } - #endregion - - #region abstract methods - protected abstract void BindProperties(); - protected abstract int ApplyChanges(); - #endregion - - #region public methods - public object GetTypedConfigProperty(string name, Type type) - { - string value = GetConfigProperty(name); - if(string.IsNullOrEmpty(value)) return null; - - TypeConverter tc = TypeDescriptor.GetConverter(type); - return tc.ConvertFromInvariantString(value); - } - - public object GetTypedProperty(string name, Type type) - { - string value = GetProperty(name); - if(string.IsNullOrEmpty(value)) return null; - - TypeConverter tc = TypeDescriptor.GetConverter(type); - return tc.ConvertFromInvariantString(value); - } - - public string GetProperty(string propertyName) - { - if(this.ProjectMgr != null) - { - string property; - bool found = this.ProjectMgr.BuildProject.GlobalProperties.TryGetValue(propertyName, out property); - - if(found) - { - return property; - } - } - - return String.Empty; - } - - // relative to active configuration. - public string GetConfigProperty(string propertyName) - { - if(this.ProjectMgr != null) - { - string unifiedResult = null; - bool cacheNeedReset = true; - - for(int i = 0; i < this.projectConfigs.Length; i++) - { - ProjectConfig config = projectConfigs[i]; - string property = config.GetConfigurationProperty(propertyName, cacheNeedReset); - cacheNeedReset = false; - - if(property != null) - { - string text = property.Trim(); - - if(i == 0) - unifiedResult = text; - else if(unifiedResult != text) - return ""; // tristate value is blank then - } - } - - return unifiedResult; - } - - return String.Empty; - } - - /// - /// Sets the value of a configuration dependent property. - /// If the attribute does not exist it is created. - /// If value is null it will be set to an empty string. - /// - /// property name. - /// value of property - public void SetConfigProperty(string name, string value) - { - CCITracing.TraceCall(); - if(value == null) - { - value = String.Empty; - } - - if(this.ProjectMgr != null) - { - for(int i = 0, n = this.projectConfigs.Length; i < n; i++) - { - ProjectConfig config = projectConfigs[i]; - - config.SetConfigurationProperty(name, value); - } - - this.ProjectMgr.SetProjectFileDirty(true); - } - } - - #endregion - - #region IPropertyPage methods. - public virtual void Activate(IntPtr parent, RECT[] pRect, int bModal) - { - if(this.panel == null) - { - if (pRect == null) - { - throw new ArgumentNullException("pRect"); - } - - this.panel = new Panel(); - this.panel.Size = new Size(pRect[0].right - pRect[0].left, pRect[0].bottom - pRect[0].top); - this.panel.Text = SR.GetString(SR.Settings, CultureInfo.CurrentUICulture); - this.panel.Visible = false; - this.panel.Size = new Size(550, 300); - this.panel.CreateControl(); - NativeMethods.SetParent(this.panel.Handle, parent); - } - - if(this.grid == null && this.project != null && this.project.Site != null) - { - IVSMDPropertyBrowser pb = this.project.Site.GetService(typeof(IVSMDPropertyBrowser)) as IVSMDPropertyBrowser; - this.grid = pb.CreatePropertyGrid(); - } - - if(this.grid != null) - { - this.active = true; - - - Control cGrid = Control.FromHandle(new IntPtr(this.grid.Handle)); - - cGrid.Parent = Control.FromHandle(parent);//this.panel; - cGrid.Size = new Size(544, 294); - cGrid.Location = new Point(3, 3); - cGrid.Visible = true; - this.grid.SetOption(_PROPERTYGRIDOPTION.PGOPT_TOOLBAR, false); - this.grid.GridSort = _PROPERTYGRIDSORT.PGSORT_CATEGORIZED | _PROPERTYGRIDSORT.PGSORT_ALPHABETICAL; - NativeMethods.SetParent(new IntPtr(this.grid.Handle), this.panel.Handle); - UpdateObjects(); - } - } - - public virtual int Apply() - { - if(IsDirty) - { - return this.ApplyChanges(); - } - return VSConstants.S_OK; - } - - public virtual void Deactivate() - { - if(null != this.panel) - { - this.panel.Dispose(); - this.panel = null; - } - this.active = false; - } - - public virtual void GetPageInfo(PROPPAGEINFO[] arrInfo) - { - if (arrInfo == null) - { - throw new ArgumentNullException("arrInfo"); - } - - PROPPAGEINFO info = new PROPPAGEINFO(); - - info.cb = (uint)Marshal.SizeOf(typeof(PROPPAGEINFO)); - info.dwHelpContext = 0; - info.pszDocString = null; - info.pszHelpFile = null; - info.pszTitle = this.name; - info.SIZE.cx = 550; - info.SIZE.cy = 300; - arrInfo[0] = info; - } - - public virtual void Help(string helpDir) - { - } - - public virtual int IsPageDirty() - { - // Note this returns an HRESULT not a Bool. - return (IsDirty ? (int)VSConstants.S_OK : (int)VSConstants.S_FALSE); - } - - public virtual void Move(RECT[] arrRect) - { - if (arrRect == null) - { - throw new ArgumentNullException("arrRect"); - } - - RECT r = arrRect[0]; - - this.panel.Location = new Point(r.left, r.top); - this.panel.Size = new Size(r.right - r.left, r.bottom - r.top); - } - - public virtual void SetObjects(uint count, object[] punk) - { - if (punk == null) - { - return; - } - - if(count > 0) - { - if(punk[0] is ProjectConfig) - { - ArrayList configs = new ArrayList(); - - for(int i = 0; i < count; i++) - { - ProjectConfig config = (ProjectConfig)punk[i]; - - if(this.project == null || (this.project != (punk[0] as ProjectConfig).ProjectMgr)) - { - this.project = config.ProjectMgr; - } - - configs.Add(config); - } - - this.projectConfigs = (ProjectConfig[])configs.ToArray(typeof(ProjectConfig)); - } - else if(punk[0] is NodeProperties) - { - if (this.project == null || (this.project != (punk[0] as NodeProperties).Node.ProjectMgr)) - { - this.project = (punk[0] as NodeProperties).Node.ProjectMgr; - } - - System.Collections.Generic.Dictionary configsMap = new System.Collections.Generic.Dictionary(); - - for(int i = 0; i < count; i++) - { - NodeProperties property = (NodeProperties)punk[i]; - IVsCfgProvider provider; - ErrorHandler.ThrowOnFailure(property.Node.ProjectMgr.GetCfgProvider(out provider)); - uint[] expected = new uint[1]; - ErrorHandler.ThrowOnFailure(provider.GetCfgs(0, null, expected, null)); - if(expected[0] > 0) - { - ProjectConfig[] configs = new ProjectConfig[expected[0]]; - uint[] actual = new uint[1]; - ErrorHandler.ThrowOnFailure(provider.GetCfgs(expected[0], configs, actual, null)); - - foreach(ProjectConfig config in configs) - { - if(!configsMap.ContainsKey(config.ConfigName)) - { - configsMap.Add(config.ConfigName, config); - } - } - } - } - - if(configsMap.Count > 0) - { - if(this.projectConfigs == null) - { - this.projectConfigs = new ProjectConfig[configsMap.Keys.Count]; - } - configsMap.Values.CopyTo(this.projectConfigs, 0); - } - } - } - else - { - this.project = null; - } - - if(this.active && this.project != null) - { - UpdateObjects(); - } - } - - - public virtual void SetPageSite(IPropertyPageSite theSite) - { - this.site = theSite; - } - - public virtual void Show(uint cmd) - { - this.panel.Visible = true; // TODO: pass SW_SHOW* flags through - this.panel.Show(); - } - - public virtual int TranslateAccelerator(MSG[] arrMsg) - { - if (arrMsg == null) - { - throw new ArgumentNullException("arrMsg"); - } - - MSG msg = arrMsg[0]; - - if((msg.message < NativeMethods.WM_KEYFIRST || msg.message > NativeMethods.WM_KEYLAST) && (msg.message < NativeMethods.WM_MOUSEFIRST || msg.message > NativeMethods.WM_MOUSELAST)) - return 1; - - return (NativeMethods.IsDialogMessageA(this.panel.Handle, ref msg)) ? 0 : 1; - } - - #endregion - - #region helper methods - - protected ProjectConfig[] GetProjectConfigurations() - { - return this.projectConfigs; - } - - protected void UpdateObjects() - { - if(this.projectConfigs != null && this.project != null) - { - // Demand unmanaged permissions in order to access unmanaged memory. - new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); - - IntPtr p = Marshal.GetIUnknownForObject(this); - IntPtr ppUnk = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(IntPtr))); - try - { - Marshal.WriteIntPtr(ppUnk, p); - this.BindProperties(); - // BUGBUG -- this is really bad casting a pointer to "int"... - this.grid.SetSelectedObjects(1, ppUnk.ToInt32()); - this.grid.Refresh(); - } - finally - { - if(ppUnk != IntPtr.Zero) - { - Marshal.FreeCoTaskMem(ppUnk); - } - if(p != IntPtr.Zero) - { - Marshal.Release(p); - } - } - } - } - #endregion - - #region IDisposable Members - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - private void Dispose(bool disposing) - { - if(!this.isDisposed) - { - lock(Mutex) - { - if(disposing) - { - this.panel.Dispose(); - } - - this.isDisposed = true; - } - } - } - } -} diff --git a/source/Archive/MPF/12.0/SingleFileGenerator.cs b/source/Archive/MPF/12.0/SingleFileGenerator.cs deleted file mode 100644 index 1cf29770b0..0000000000 --- a/source/Archive/MPF/12.0/SingleFileGenerator.cs +++ /dev/null @@ -1,554 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.TextManager.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Provides support for single file generator. - /// - internal class SingleFileGenerator : ISingleFileGenerator, IVsGeneratorProgress - { - - #region fields - private bool gettingCheckoutStatus; - private bool runningGenerator; - private ProjectNode projectMgr; - #endregion - - #region ctors - /// - /// Overloadde ctor. - /// - /// The associated project - internal SingleFileGenerator(ProjectNode projectMgr) - { - this.projectMgr = projectMgr; - } - #endregion - - #region IVsGeneratorProgress Members - - public virtual int GeneratorError(int warning, uint level, string err, uint line, uint col) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int Progress(uint complete, uint total) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region ISingleFileGenerator - /// - /// Runs the generator on the current project item. - /// - /// - /// - public virtual void RunGenerator(string document) - { - // Go run the generator on that node, but only if the file is dirty - // in the running document table. Otherwise there is no need to rerun - // the generator because if the original document is not dirty then - // the generated output should be already up to date. - uint itemid = VSConstants.VSITEMID_NIL; - IVsHierarchy hier = (IVsHierarchy)this.projectMgr; - if(document != null && hier != null && ErrorHandler.Succeeded(hier.ParseCanonicalName((string)document, out itemid))) - { - IVsHierarchy rdtHier; - IVsPersistDocData perDocData; - uint cookie; - if(this.VerifyFileDirtyInRdt((string)document, out rdtHier, out perDocData, out cookie)) - { - // Run the generator on the indicated document - FileNode node = (FileNode)this.projectMgr.NodeFromItemId(itemid); - this.InvokeGenerator(node); - } - } - } - #endregion - - #region virtual methods - /// - /// Invokes the specified generator - /// - /// The node on which to invoke the generator. - protected internal virtual void InvokeGenerator(FileNode fileNode) - { - if(fileNode == null) - { - throw new ArgumentNullException("fileNode"); - } - - SingleFileGeneratorNodeProperties nodeproperties = fileNode.NodeProperties as SingleFileGeneratorNodeProperties; - if(nodeproperties == null) - { - throw new InvalidOperationException(); - } - - string customToolProgID = nodeproperties.CustomTool; - if(string.IsNullOrEmpty(customToolProgID)) - { - return; - } - - string customToolNamespace = nodeproperties.CustomToolNamespace; - - try - { - if(!this.runningGenerator) - { - //Get the buffer contents for the current node - string moniker = fileNode.GetMkDocument(); - - this.runningGenerator = true; - - //Get the generator - IVsSingleFileGenerator generator; - int generateDesignTimeSource; - int generateSharedDesignTimeSource; - int generateTempPE; - SingleFileGeneratorFactory factory = new SingleFileGeneratorFactory(this.projectMgr.ProjectGuid, this.projectMgr.Site); - ErrorHandler.ThrowOnFailure(factory.CreateGeneratorInstance(customToolProgID, out generateDesignTimeSource, out generateSharedDesignTimeSource, out generateTempPE, out generator)); - - //Check to see if the generator supports siting - IObjectWithSite objWithSite = generator as IObjectWithSite; - if(objWithSite != null) - { - objWithSite.SetSite(fileNode.OleServiceProvider); - } - - //Determine the namespace - if(string.IsNullOrEmpty(customToolNamespace)) - { - customToolNamespace = this.ComputeNamespace(moniker); - } - - //Run the generator - IntPtr[] output = new IntPtr[1]; - output[0] = IntPtr.Zero; - uint outPutSize; - string extension; - ErrorHandler.ThrowOnFailure(generator.DefaultExtension(out extension)); - - //Find if any dependent node exists - string dependentNodeName = Path.GetFileNameWithoutExtension(fileNode.FileName) + extension; - HierarchyNode dependentNode = fileNode.FirstChild; - while(dependentNode != null) - { - if(string.Compare(dependentNode.ItemNode.GetMetadata(ProjectFileConstants.DependentUpon), fileNode.FileName, StringComparison.OrdinalIgnoreCase) == 0) - { - dependentNodeName = ((FileNode)dependentNode).FileName; - break; - } - - dependentNode = dependentNode.NextSibling; - } - - //If you found a dependent node. - if(dependentNode != null) - { - //Then check out the node and dependent node from SCC - if(!this.CanEditFile(dependentNode.GetMkDocument())) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - } - else //It is a new node to be added to the project - { - // Check out the project file if necessary. - if(!this.projectMgr.QueryEditProjectFile(false)) - { - throw Marshal.GetExceptionForHR(VSConstants.OLE_E_PROMPTSAVECANCELLED); - } - } - IVsTextStream stream; - string inputFileContents = this.GetBufferContents(moniker, out stream); - - ErrorHandler.ThrowOnFailure(generator.Generate(moniker, inputFileContents, customToolNamespace, output, out outPutSize, this)); - byte[] data = new byte[outPutSize]; - - if(output[0] != IntPtr.Zero) - { - Marshal.Copy(output[0], data, 0, (int)outPutSize); - Marshal.FreeCoTaskMem(output[0]); - } - - //Todo - Create a file and add it to the Project - this.UpdateGeneratedCodeFile(fileNode, data, (int)outPutSize, dependentNodeName); - } - } - finally - { - this.runningGenerator = false; - } - } - - /// - /// Computes the names space based on the folder for the ProjectItem. It just replaces DirectorySeparatorCharacter - /// with "." for the directory in which the file is located. - /// - /// Returns the computed name space - protected virtual string ComputeNamespace(string projectItemPath) - { - if(String.IsNullOrEmpty(projectItemPath)) - { - throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty, CultureInfo.CurrentUICulture), "projectItemPath"); - } - - - string nspace = ""; - string filePath = Path.GetDirectoryName(projectItemPath); - string[] toks = filePath.Split(new char[] { ':', '\\' }); - foreach(string tok in toks) - { - if(!String.IsNullOrEmpty(tok)) - { - string temp = tok.Replace(" ", ""); - nspace += (temp + "."); - } - } - nspace = nspace.Remove(nspace.LastIndexOf(".", StringComparison.Ordinal), 1); - return nspace; - } - - /// - /// This is called after the single file generator has been invoked to create or update the code file. - /// - /// The node associated to the generator - /// data to update the file with - /// size of the data - /// Name of the file to update or create - /// full path of the file - protected virtual string UpdateGeneratedCodeFile(FileNode fileNode, byte[] data, int size, string fileName) - { - string filePath = Path.Combine(Path.GetDirectoryName(fileNode.GetMkDocument()), fileName); - IVsRunningDocumentTable rdt = this.projectMgr.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - - // (kberes) Shouldn't this be an InvalidOperationException instead with some not to annoying errormessage to the user? - if(rdt == null) - { - ErrorHandler.ThrowOnFailure(VSConstants.E_FAIL); - } - - IVsHierarchy hier; - uint cookie; - uint itemid; - IntPtr docData = IntPtr.Zero; - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)(_VSRDTFLAGS.RDT_NoLock), filePath, out hier, out itemid, out docData, out cookie)); - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - IVsTextStream srpStream = null; - if(srpStream != null) - { - int oldLen = 0; - int hr = srpStream.GetSize(out oldLen); - if(ErrorHandler.Succeeded(hr)) - { - IntPtr dest = IntPtr.Zero; - try - { - dest = Marshal.AllocCoTaskMem(data.Length); - Marshal.Copy(data, 0, dest, data.Length); - ErrorHandler.ThrowOnFailure(srpStream.ReplaceStream(0, oldLen, dest, size / 2)); - } - finally - { - if(dest != IntPtr.Zero) - { - Marshal.Release(dest); - } - } - } - } - } - else - { - using(FileStream generatedFileStream = File.Open(filePath, FileMode.OpenOrCreate)) - { - generatedFileStream.Write(data, 0, size); - } - - EnvDTE.ProjectItem projectItem = fileNode.GetAutomationObject() as EnvDTE.ProjectItem; - if(projectItem != null && (this.projectMgr.FindChild(fileNode.FileName) == null)) - { - projectItem.ProjectItems.AddFromFile(filePath); - } - } - return filePath; - } - #endregion - - #region helpers - /// - /// Returns the buffer contents for a moniker. - /// - /// Buffer contents - private string GetBufferContents(string fileName, out IVsTextStream srpStream) - { - Guid CLSID_VsTextBuffer = new Guid("{8E7B96A8-E33D-11d0-A6D5-00C04FB67F6A}"); - string bufferContents = ""; - srpStream = null; - - IVsRunningDocumentTable rdt = this.projectMgr.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - if(rdt != null) - { - IVsHierarchy hier; - IVsPersistDocData persistDocData; - uint itemid, cookie; - bool docInRdt = true; - IntPtr docData = IntPtr.Zero; - int hr = NativeMethods.E_FAIL; - try - { - //Getting a read lock on the document. Must be released later. - hr = rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_ReadLock, fileName, out hier, out itemid, out docData, out cookie); - if(ErrorHandler.Failed(hr) || docData == IntPtr.Zero) - { - Guid iid = VSConstants.IID_IUnknown; - cookie = 0; - docInRdt = false; - ILocalRegistry localReg = this.projectMgr.GetService(typeof(SLocalRegistry)) as ILocalRegistry; - ErrorHandler.ThrowOnFailure(localReg.CreateInstance(CLSID_VsTextBuffer, null, ref iid, (uint)CLSCTX.CLSCTX_INPROC_SERVER, out docData)); - } - - persistDocData = Marshal.GetObjectForIUnknown(docData) as IVsPersistDocData; - } - finally - { - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - - //Try to get the Text lines - IVsTextLines srpTextLines = persistDocData as IVsTextLines; - if(srpTextLines == null) - { - // Try getting a text buffer provider first - IVsTextBufferProvider srpTextBufferProvider = persistDocData as IVsTextBufferProvider; - if(srpTextBufferProvider != null) - { - hr = srpTextBufferProvider.GetTextBuffer(out srpTextLines); - } - } - - if(ErrorHandler.Succeeded(hr)) - { - srpStream = srpTextLines as IVsTextStream; - if(srpStream != null) - { - // QI for IVsBatchUpdate and call FlushPendingUpdates if they support it - IVsBatchUpdate srpBatchUpdate = srpStream as IVsBatchUpdate; - if(srpBatchUpdate != null) - ErrorHandler.ThrowOnFailure(srpBatchUpdate.FlushPendingUpdates(0)); - - int lBufferSize = 0; - hr = srpStream.GetSize(out lBufferSize); - - if(ErrorHandler.Succeeded(hr)) - { - IntPtr dest = IntPtr.Zero; - try - { - // Note that GetStream returns Unicode to us so we don't need to do any conversions - dest = Marshal.AllocCoTaskMem((lBufferSize + 1) * 2); - ErrorHandler.ThrowOnFailure(srpStream.GetStream(0, lBufferSize, dest)); - //Get the contents - bufferContents = Marshal.PtrToStringUni(dest); - } - finally - { - if(dest != IntPtr.Zero) - Marshal.FreeCoTaskMem(dest); - } - } - } - - } - // Unlock the document in the RDT if necessary - if(docInRdt && rdt != null) - { - ErrorHandler.ThrowOnFailure(rdt.UnlockDocument((uint)(_VSRDTFLAGS.RDT_ReadLock | _VSRDTFLAGS.RDT_Unlock_NoSave), cookie)); - } - - if(ErrorHandler.Failed(hr)) - { - // If this failed then it's probably not a text file. In that case, - // we just read the file as a binary - bufferContents = File.ReadAllText(fileName); - } - - - } - return bufferContents; - } - - /// - /// Returns TRUE if open and dirty. Note that documents can be open without a - /// window frame so be careful. Returns the DocData and doc cookie if requested - /// - /// document path - /// hierarchy - /// doc data associated with document - /// item cookie - /// True if FIle is dirty - private bool VerifyFileDirtyInRdt(string document, out IVsHierarchy pHier, out IVsPersistDocData ppDocData, out uint cookie) - { - int ret = 0; - pHier = null; - ppDocData = null; - cookie = 0; - - IVsRunningDocumentTable rdt = this.projectMgr.GetService(typeof(IVsRunningDocumentTable)) as IVsRunningDocumentTable; - if(rdt != null) - { - IntPtr docData; - uint dwCookie = 0; - IVsHierarchy srpHier; - uint itemid = VSConstants.VSITEMID_NIL; - - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, document, out srpHier, out itemid, out docData, out dwCookie)); - IVsPersistHierarchyItem srpIVsPersistHierarchyItem = srpHier as IVsPersistHierarchyItem; - if(srpIVsPersistHierarchyItem != null) - { - // Found in the RDT. See if it is dirty - try - { - ErrorHandler.ThrowOnFailure(srpIVsPersistHierarchyItem.IsItemDirty(itemid, docData, out ret)); - cookie = dwCookie; - ppDocData = Marshal.GetObjectForIUnknown(docData) as IVsPersistDocData; - } - finally - { - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - - pHier = srpHier; - } - } - } - return (ret == 1); - } - #endregion - - - - - #region QueryEditQuerySave helpers - /// - /// This function asks to the QueryEditQuerySave service if it is possible to - /// edit the file. - /// - private bool CanEditFile(string documentMoniker) - { - Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "\t**** CanEditFile called ****")); - - // Check the status of the recursion guard - if(this.gettingCheckoutStatus) - { - return false; - } - - try - { - // Set the recursion guard - this.gettingCheckoutStatus = true; - - // Get the QueryEditQuerySave service - IVsQueryEditQuerySave2 queryEditQuerySave = (IVsQueryEditQuerySave2)this.projectMgr.GetService(typeof(SVsQueryEditQuerySave)); - - // Now call the QueryEdit method to find the edit status of this file - string[] documents = { documentMoniker }; - uint result; - uint outFlags; - - // Note that this function can popup a dialog to ask the user to checkout the file. - // When this dialog is visible, it is possible to receive other request to change - // the file and this is the reason for the recursion guard. - int hr = queryEditQuerySave.QueryEditFiles( - 0, // Flags - 1, // Number of elements in the array - documents, // Files to edit - null, // Input flags - null, // Input array of VSQEQS_FILE_ATTRIBUTE_DATA - out result, // result of the checkout - out outFlags // Additional flags - ); - - if(ErrorHandler.Succeeded(hr) && (result == (uint)tagVSQueryEditResult.QER_EditOK)) - { - // In this case (and only in this case) we can return true from this function. - return true; - } - } - finally - { - this.gettingCheckoutStatus = false; - } - - return false; - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/SingleFileGeneratorFactory.cs b/source/Archive/MPF/12.0/SingleFileGeneratorFactory.cs deleted file mode 100644 index fb301d728a..0000000000 --- a/source/Archive/MPF/12.0/SingleFileGeneratorFactory.cs +++ /dev/null @@ -1,398 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; -using VSRegistry = Microsoft.VisualStudio.Shell.VSRegistry; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Provides implementation IVsSingleFileGeneratorFactory for - /// - public class SingleFileGeneratorFactory : IVsSingleFileGeneratorFactory - { - #region nested types - private class GeneratorMetaData - { - #region fields - private Guid generatorClsid = Guid.Empty; - private int generatesDesignTimeSource = -1; - private int generatesSharedDesignTimeSource = -1; - private int useDesignTimeCompilationFlag = -1; - object generator; - #endregion - - #region ctor - /// - /// Constructor - /// - public GeneratorMetaData() - { - } - #endregion - - #region Public Properties - /// - /// Generator instance - /// - public Object Generator - { - get - { - return generator; - } - set - { - generator = value; - } - } - - /// - /// GeneratesDesignTimeSource reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - public int GeneratesDesignTimeSource - { - get - { - return generatesDesignTimeSource; - } - set - { - generatesDesignTimeSource = value; - } - } - - /// - /// GeneratesSharedDesignTimeSource reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - public int GeneratesSharedDesignTimeSource - { - get - { - return generatesSharedDesignTimeSource; - } - set - { - generatesSharedDesignTimeSource = value; - } - } - - /// - /// UseDesignTimeCompilationFlag reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - public int UseDesignTimeCompilationFlag - { - get - { - return useDesignTimeCompilationFlag; - } - set - { - useDesignTimeCompilationFlag = value; - } - } - - /// - /// Generator Class ID. - /// - public Guid GeneratorClsid - { - get - { - return generatorClsid; - } - set - { - generatorClsid = value; - } - } - #endregion - } - #endregion - - #region fields - /// - /// Base generator registry key for MPF based project - /// - private RegistryKey baseGeneratorRegistryKey; - - /// - /// CLSID reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - private string GeneratorClsid = "CLSID"; - - /// - /// GeneratesDesignTimeSource reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - private string GeneratesDesignTimeSource = "GeneratesDesignTimeSource"; - - /// - /// GeneratesSharedDesignTimeSource reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - private string GeneratesSharedDesignTimeSource = "GeneratesSharedDesignTimeSource"; - - /// - /// UseDesignTimeCompilationFlag reg value name under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\[VsVer]\Generators\[ProjFacGuid]\[GeneratorProgId] - /// - private string UseDesignTimeCompilationFlag = "UseDesignTimeCompilationFlag"; - - /// - /// Caches all the generators registered for the project type. - /// - private Dictionary generatorsMap = new Dictionary(); - - /// - /// The project type guid of the associated project. - /// - private Guid projectType; - - /// - /// A service provider - /// - private System.IServiceProvider serviceProvider; - #endregion - - #region ctors - /// - /// Constructor for SingleFileGeneratorFactory - /// - /// The project type guid of the associated project. - /// A service provider. - public SingleFileGeneratorFactory(Guid projectType, System.IServiceProvider serviceProvider) - { - this.projectType = projectType; - this.serviceProvider = serviceProvider; - } - #endregion - - #region properties - /// - /// Defines the project type guid of the associated project. - /// - public Guid ProjectGuid - { - get { return this.projectType; } - set { this.projectType = value; } - } - - /// - /// Defines an associated service provider. - /// - public System.IServiceProvider ServiceProvider - { - get { return this.serviceProvider; } - set { this.serviceProvider = value; } - } - #endregion - - #region IVsSingleFileGeneratorFactory Helpers - /// - /// Returns the project generator key under [VS-ConfigurationRoot]]\Generators - /// - private RegistryKey BaseGeneratorsKey - { - get - { - if(this.baseGeneratorRegistryKey == null) - { - using(RegistryKey root = VSRegistry.RegistryRoot(__VsLocalRegistryType.RegType_Configuration)) - { - if(null != root) - { - string regPath = "Generators\\" + this.ProjectGuid.ToString("B"); - baseGeneratorRegistryKey = root.OpenSubKey(regPath); - } - } - } - - return this.baseGeneratorRegistryKey; - } - } - - /// - /// Returns the local registry instance - /// - private ILocalRegistry LocalRegistry - { - get - { - return this.serviceProvider.GetService(typeof(SLocalRegistry)) as ILocalRegistry; - } - } - #endregion - - #region IVsSingleFileGeneratorFactory Members - /// - /// Creates an instance of the single file generator requested - /// - /// prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId] - /// GeneratesDesignTimeSource key value - /// GeneratesSharedDesignTimeSource key value - /// UseDesignTimeCompilationFlag key value - /// IVsSingleFileGenerator interface - /// S_OK if succesful - public virtual int CreateGeneratorInstance(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out IVsSingleFileGenerator generate) - { - Guid genGuid; - ErrorHandler.ThrowOnFailure(this.GetGeneratorInformation(progId, out generatesDesignTimeSource, out generatesSharedDesignTimeSource, out useTempPEFlag, out genGuid)); - - //Create the single file generator and pass it out. Check to see if it is in the cache - if(!this.generatorsMap.ContainsKey(progId) || ((this.generatorsMap[progId]).Generator == null)) - { - Guid riid = VSConstants.IID_IUnknown; - uint dwClsCtx = (uint)CLSCTX.CLSCTX_INPROC_SERVER; - IntPtr genIUnknown = IntPtr.Zero; - //create a new one. - ErrorHandler.ThrowOnFailure(this.LocalRegistry.CreateInstance(genGuid, null, ref riid, dwClsCtx, out genIUnknown)); - if(genIUnknown != IntPtr.Zero) - { - try - { - object generator = Marshal.GetObjectForIUnknown(genIUnknown); - //Build the generator meta data object and cache it. - GeneratorMetaData genData = new GeneratorMetaData(); - genData.GeneratesDesignTimeSource = generatesDesignTimeSource; - genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource; - genData.UseDesignTimeCompilationFlag = useTempPEFlag; - genData.GeneratorClsid = genGuid; - genData.Generator = generator; - this.generatorsMap[progId] = genData; - } - finally - { - Marshal.Release(genIUnknown); - } - } - } - - generate = (this.generatorsMap[progId]).Generator as IVsSingleFileGenerator; - - return VSConstants.S_OK; - } - - /// - /// Gets the default generator based on the file extension. HKLM\Software\Microsoft\VS\9.0\Generators\[prjfacguid]\.extension - /// - /// File name with extension - /// The generator prog ID - /// S_OK if successful - public virtual int GetDefaultGenerator(string filename, out string progID) - { - progID = ""; - return VSConstants.E_NOTIMPL; - } - - /// - /// Gets the generator information. - /// - /// prog id of the generator to be created. For e.g HKLM\SOFTWARE\Microsoft\VisualStudio\9.0Exp\Generators\[prjfacguid]\[wszProgId] - /// GeneratesDesignTimeSource key value - /// GeneratesSharedDesignTimeSource key value - /// UseDesignTimeCompilationFlag key value - /// CLSID key value - /// S_OK if succesful - public virtual int GetGeneratorInformation(string progId, out int generatesDesignTimeSource, out int generatesSharedDesignTimeSource, out int useTempPEFlag, out Guid guidGenerator) - { - RegistryKey genKey; - generatesDesignTimeSource = -1; - generatesSharedDesignTimeSource = -1; - useTempPEFlag = -1; - guidGenerator = Guid.Empty; - if(string.IsNullOrEmpty(progId)) - return VSConstants.S_FALSE; - - //Create the single file generator and pass it out. - if(!this.generatorsMap.ContainsKey(progId)) - { - // We have to check whether the BaseGeneratorkey returns null. - RegistryKey tempBaseGeneratorKey = this.BaseGeneratorsKey; - if(tempBaseGeneratorKey == null || (genKey = tempBaseGeneratorKey.OpenSubKey(progId)) == null) - { - return VSConstants.S_FALSE; - } - - //Get the CLSID - string guid = (string)genKey.GetValue(GeneratorClsid, ""); - if(string.IsNullOrEmpty(guid)) - return VSConstants.S_FALSE; - - GeneratorMetaData genData = new GeneratorMetaData(); - - genData.GeneratorClsid = guidGenerator = new Guid(guid); - //Get the GeneratesDesignTimeSource flag. Assume 0 if not present. - genData.GeneratesDesignTimeSource = generatesDesignTimeSource = (int)genKey.GetValue(this.GeneratesDesignTimeSource, 0); - //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present. - genData.GeneratesSharedDesignTimeSource = generatesSharedDesignTimeSource = (int)genKey.GetValue(GeneratesSharedDesignTimeSource, 0); - //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present. - genData.UseDesignTimeCompilationFlag = useTempPEFlag = (int)genKey.GetValue(UseDesignTimeCompilationFlag, 0); - this.generatorsMap.Add(progId, genData); - } - else - { - GeneratorMetaData genData = this.generatorsMap[progId]; - generatesDesignTimeSource = genData.GeneratesDesignTimeSource; - //Get the GeneratesSharedDesignTimeSource flag. Assume 0 if not present. - generatesSharedDesignTimeSource = genData.GeneratesSharedDesignTimeSource; - //Get the UseDesignTimeCompilationFlag flag. Assume 0 if not present. - useTempPEFlag = genData.UseDesignTimeCompilationFlag; - //Get the CLSID - guidGenerator = genData.GeneratorClsid; - } - - return VSConstants.S_OK; - } - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/SolutionListener.cs b/source/Archive/MPF/12.0/SolutionListener.cs deleted file mode 100644 index bea9548978..0000000000 --- a/source/Archive/MPF/12.0/SolutionListener.cs +++ /dev/null @@ -1,278 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - - - public abstract class SolutionListener : IVsSolutionEvents3, IVsSolutionEvents4, IDisposable - { - - #region fields - private uint eventsCookie; - private IVsSolution solution; - private IServiceProvider serviceProvider; - private bool isDisposed; - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - #endregion - - #region ctors - protected SolutionListener(IServiceProvider serviceProviderParameter) - { - if (serviceProviderParameter == null) - { - throw new ArgumentNullException("serviceProviderParameter"); - } - - this.serviceProvider = serviceProviderParameter; - this.solution = this.serviceProvider.GetService(typeof(SVsSolution)) as IVsSolution; - - Debug.Assert(this.solution != null, "Could not get the IVsSolution object from the services exposed by this project"); - - if(this.solution == null) - { - throw new InvalidOperationException(); - } - - this.InteropSafeIVsSolutionEvents = Utilities.GetOuterAs(this); - } - #endregion - - #region properties - - public IVsSolutionEvents InteropSafeIVsSolutionEvents - { - get; - protected set; - } - - protected uint EventsCookie - { - get - { - return this.eventsCookie; - } - } - - protected IVsSolution Solution - { - get - { - return this.solution; - } - } - - protected IServiceProvider ServiceProvider - { - get - { - return this.serviceProvider; - } - } - #endregion - - #region IVsSolutionEvents3, IVsSolutionEvents2, IVsSolutionEvents methods - public virtual int OnAfterCloseSolution(object reserved) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterClosingChildren(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterLoadProject(IVsHierarchy stubHierarchy, IVsHierarchy realHierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterMergeSolution(object pUnkReserved) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterOpenProject(IVsHierarchy hierarchy, int added) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterOpenSolution(object pUnkReserved, int fNewSolution) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterOpeningChildren(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeCloseProject(IVsHierarchy hierarchy, int removed) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeCloseSolution(object pUnkReserved) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeClosingChildren(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeOpeningChildren(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnBeforeUnloadProject(IVsHierarchy realHierarchy, IVsHierarchy rtubHierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryCloseProject(IVsHierarchy hierarchy, int removing, ref int cancel) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryCloseSolution(object pUnkReserved, ref int cancel) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnQueryUnloadProject(IVsHierarchy pRealHierarchy, ref int cancel) - { - return VSConstants.E_NOTIMPL; - } - #endregion - - #region IVsSolutionEvents4 methods - public virtual int OnAfterAsynchOpenProject(IVsHierarchy hierarchy, int added) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterChangeProjectParent(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - public virtual int OnAfterRenameProject(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Fired before a project is moved from one parent to another in the solution explorer - /// - public virtual int OnQueryChangeProjectParent(IVsHierarchy hierarchy, IVsHierarchy newParentHier, ref int cancel) - { - return VSConstants.E_NOTIMPL; - } - #endregion - - #region Dispose - - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - #region methods - public void Init() - { - if(this.solution != null) - { - ErrorHandler.ThrowOnFailure(this.solution.AdviseSolutionEvents(this.InteropSafeIVsSolutionEvents, out this.eventsCookie)); - } - } - - /// - /// The method that does the cleanup. - /// - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "Microsoft.VisualStudio.Shell.Interop.IVsSolution.UnadviseSolutionEvents(System.UInt32)")] - protected virtual void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simulteniously. - lock(Mutex) - { - if(disposing && this.eventsCookie != (uint)ShellConstants.VSCOOKIE_NIL && this.solution != null) - { - this.solution.UnadviseSolutionEvents((uint)this.eventsCookie); - this.eventsCookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - - this.isDisposed = true; - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/SolutionListenerForBuildDependencyUpdate.cs b/source/Archive/MPF/12.0/SolutionListenerForBuildDependencyUpdate.cs deleted file mode 100644 index 9ba6b9c1dd..0000000000 --- a/source/Archive/MPF/12.0/SolutionListenerForBuildDependencyUpdate.cs +++ /dev/null @@ -1,213 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// The purpose of this class is to set a build dependency from a modeling project to all its sub projects - /// - class SolutionListenerForBuildDependencyUpdate : SolutionListener - { - #region ctors - public SolutionListenerForBuildDependencyUpdate(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - #endregion - - #region overridden methods - /// - /// Update build dependency list if solution is fully loaded - /// - /// - /// - /// - public override int OnAfterOpenProject(IVsHierarchy hierarchy, int added) - { - // Return from here if we are at load time - if(added == 0) - { - return VSConstants.S_OK; - } - - IBuildDependencyOnProjectContainer projectNode = hierarchy as IBuildDependencyOnProjectContainer; - - // We will update only nested project types and the BuildNestedProjectsOnBuild flag is set to true - if(projectNode != null) - { - if(projectNode.BuildNestedProjectsOnBuild) - { - // Enum all sub projects and add to dependency list - UpdateDependencyListWithSubProjects(projectNode); - } - } - return VSConstants.S_OK; - } - - /// - /// Called at load time when solution has finished opening. - /// - /// reserved - /// true if this is a new solution - /// - public override int OnAfterOpenSolution(object pUnkReserved, int fNewSolution) - { - // Enum all sub project and add to dependeny list - UpdateDependencyListWithSubProjects(null); - - return VSConstants.S_OK; - } - #endregion - - #region Helper methods - /// - /// Update dependency list - /// - /// Project node to be updated. If null then all ProjectContainer nodes are updated - private void UpdateDependencyListWithSubProjects(IBuildDependencyOnProjectContainer projectNode) - { - if(projectNode != null) - { - // Get list of sub projects - IList nestedProjectList = projectNode.EnumNestedHierachiesForBuildDependency(); - if(nestedProjectList != null && nestedProjectList.Count > 0) - { - // Loop nested projects and add project dependency (if supported) - foreach(IVsHierarchy nestedProject in nestedProjectList) - { - AddBuildDependenyToNestedProject(projectNode as IBuildDependencyUpdate, nestedProject); - } - } - } - else - { - // Update all ProjectContainerNode nodes - List projectList = this.GetListOfProjectContainerNodes(); - if(projectList != null && projectList.Count > 0) - { - foreach(IBuildDependencyOnProjectContainer project in projectList) - { - UpdateDependencyListWithSubProjects(project); - } - } - } - } - - /// - /// Enum all projects in the solution and collect all that derives from ProjectContainerNode - /// - /// List of ProjectContainerNode nodes - private List GetListOfProjectContainerNodes() - { - List projectList = new List(); - - Debug.Assert(this.Solution != null, "IVsSolution object not set on this object"); - if(this.Solution == null) - { - // Bad state, so we quit - return projectList; - } - - // Enum projects loaded in the solution (normal projects only) - IEnumHierarchies enumHierarchies = null; - Guid guid = Guid.Empty; - __VSENUMPROJFLAGS flags = __VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION; - ErrorHandler.ThrowOnFailure(this.Solution.GetProjectEnum((uint)flags, ref guid, out enumHierarchies)); - - if(enumHierarchies != null) - { - // Loop projects found - IVsHierarchy[] hierarchy = new IVsHierarchy[1]; - uint fetched = 0; - while(enumHierarchies.Next(1, hierarchy, out fetched) == VSConstants.S_OK && fetched == 1) - { - // If this is a ProjectContainerNode then add to list - IBuildDependencyOnProjectContainer projectNode = hierarchy[0] as IBuildDependencyOnProjectContainer; - if(projectNode != null) - { - projectList.Add(projectNode); - } - } - } - - return projectList; - } - - /// - /// Add build dependency to ProjectContainerNode if IVsBuildDependency is supported by the nested project - /// - /// Project Container where we should add the build dependency - /// Nested project to set a build dependency against - private static void AddBuildDependenyToNestedProject(IBuildDependencyUpdate projectContainer, IVsHierarchy nestedProject) - { - // Validate input - Debug.Assert(projectContainer != null, "Project Container must not be null"); - Debug.Assert(nestedProject != null, "Nested Project must not be null"); - if(projectContainer == null || nestedProject == null) - { - // Invalid argument - return; - } - - // Create new NestedProjectBuildDependency - NestedProjectBuildDependency dependency = new NestedProjectBuildDependency(nestedProject); - projectContainer.AddBuildDependency(dependency); - } - - #endregion - - } -} diff --git a/source/Archive/MPF/12.0/SolutionListenerForProjectEvents.cs b/source/Archive/MPF/12.0/SolutionListenerForProjectEvents.cs deleted file mode 100644 index 9bf01d7e96..0000000000 --- a/source/Archive/MPF/12.0/SolutionListenerForProjectEvents.cs +++ /dev/null @@ -1,136 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// This class triggers the project events for "our" hierrachies. - /// - internal class SolutionListenerForProjectEvents : SolutionListener, IProjectEvents - { - #region events - /// Event raised just after the project file opened. - /// - public event EventHandler AfterProjectFileOpened; - - /// - /// Event raised before the project file closed. - /// - public event EventHandler BeforeProjectFileClosed; - #endregion - - #region ctor - internal SolutionListenerForProjectEvents(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - #endregion - - #region overridden methods - public override int OnAfterOpenProject(IVsHierarchy hierarchy, int added) - { - IProjectEventsListener projectEventListener = hierarchy as IProjectEventsListener; - if(projectEventListener != null && projectEventListener.IsProjectEventsListener) - { - this.RaiseAfterProjectFileOpened((added != 0) ? true : false); - } - - return VSConstants.S_OK; - } - - public override int OnBeforeCloseProject(IVsHierarchy hierarchy, int removed) - { - IProjectEventsListener projectEvents = hierarchy as IProjectEventsListener; - if(projectEvents != null && projectEvents.IsProjectEventsListener) - { - this.RaiseBeforeProjectFileClosed((removed != 0) ? true : false); - } - - return VSConstants.S_OK; - } - #endregion - - #region helpers - /// - /// Raises after project file opened event. - /// - /// True if the project is added to the solution after the solution is opened. false if the project is added to the solution while the solution is being opened. - private void RaiseAfterProjectFileOpened(bool added) - { - // Save event in temporary variable to avoid race condition. - EventHandler tempEvent = this.AfterProjectFileOpened; - if(tempEvent != null) - { - tempEvent(this, new AfterProjectFileOpenedEventArgs(added)); - } - } - - - - - /// - /// Raises the before project file closed event. - /// - /// true if the project was removed from the solution before the solution was closed. false if the project was removed from the solution while the solution was being closed. - private void RaiseBeforeProjectFileClosed(bool removed) - { - // Save event in temporary variable to avoid race condition. - EventHandler tempEvent = this.BeforeProjectFileClosed; - if(tempEvent != null) - { - tempEvent(this, new BeforeProjectFileClosedEventArgs(removed)); - } - } - } - #endregion -} diff --git a/source/Archive/MPF/12.0/SolutionListenerForProjectOpen.cs b/source/Archive/MPF/12.0/SolutionListenerForProjectOpen.cs deleted file mode 100644 index 6d638c8fd8..0000000000 --- a/source/Archive/MPF/12.0/SolutionListenerForProjectOpen.cs +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - - - public class SolutionListenerForProjectOpen : SolutionListener - { - public SolutionListenerForProjectOpen(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - - public override int OnAfterOpenProject(IVsHierarchy hierarchy, int added) - { - // If this is a new project and our project. We use here that it is only our project that will implemnet the "internal" IBuildDependencyOnProjectContainer. - if(added != 0 && hierarchy is IBuildDependencyUpdate) - { - IVsUIHierarchy uiHierarchy = hierarchy as IVsUIHierarchy; - Debug.Assert(uiHierarchy != null, "The ProjectNode should implement IVsUIHierarchy"); - // Expand and select project node - IVsUIHierarchyWindow uiWindow = UIHierarchyUtilities.GetUIHierarchyWindow(this.ServiceProvider, HierarchyNode.SolutionExplorer); - if(uiWindow != null) - { - __VSHIERARCHYITEMSTATE state; - uint stateAsInt; - if(uiWindow.GetItemState(uiHierarchy, VSConstants.VSITEMID_ROOT, (uint)__VSHIERARCHYITEMSTATE.HIS_Expanded, out stateAsInt) == VSConstants.S_OK) - { - state = (__VSHIERARCHYITEMSTATE)stateAsInt; - if(state != __VSHIERARCHYITEMSTATE.HIS_Expanded) - { - int hr; - hr = uiWindow.ExpandItem(uiHierarchy, VSConstants.VSITEMID_ROOT, EXPANDFLAGS.EXPF_ExpandParentsToShowItem); - if(ErrorHandler.Failed(hr)) - Trace.WriteLine("Failed to expand project node"); - hr = uiWindow.ExpandItem(uiHierarchy, VSConstants.VSITEMID_ROOT, EXPANDFLAGS.EXPF_SelectItem); - if(ErrorHandler.Failed(hr)) - Trace.WriteLine("Failed to select project node"); - - return hr; - } - } - } - } - return VSConstants.S_OK; - } - } -} diff --git a/source/Archive/MPF/12.0/SolutionListenerForProjectReferenceUpdate.cs b/source/Archive/MPF/12.0/SolutionListenerForProjectReferenceUpdate.cs deleted file mode 100644 index de77d29b6c..0000000000 --- a/source/Archive/MPF/12.0/SolutionListenerForProjectReferenceUpdate.cs +++ /dev/null @@ -1,272 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; - -namespace Microsoft.VisualStudio.Project -{ - - public class SolutionListenerForProjectReferenceUpdate : SolutionListener - { - - #region ctor - public SolutionListenerForProjectReferenceUpdate(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - #endregion - - #region overridden methods - /// - /// Delete this project from the references of projects of this type, if it is found. - /// - /// - /// - /// - public override int OnBeforeCloseProject(IVsHierarchy hierarchy, int removed) - { - if(removed != 0) - { - List projectReferences = this.GetProjectReferencesContainingThisProject(hierarchy); - - foreach(ProjectReferenceNode projectReference in projectReferences) - { - projectReference.Remove(false); - // Set back the remove state on the project refererence. The reason why we are doing this is that the OnBeforeUnloadProject immedaitely calls - // OnBeforeCloseProject, thus we would be deleting references when we should not. Unload should not remove references. - projectReference.CanRemoveReference = true; - } - } - - return VSConstants.S_OK; - } - - - /// - /// Needs to update the dangling reference on projects that contain this hierarchy as project reference. - /// - /// - /// - /// - public override int OnAfterLoadProject(IVsHierarchy stubHierarchy, IVsHierarchy realHierarchy) - { - List projectReferences = this.GetProjectReferencesContainingThisProject(realHierarchy); - - // Refersh the project reference node. That should trigger the drawing of the normal project reference icon. - foreach(ProjectReferenceNode projectReference in projectReferences) - { - projectReference.CanRemoveReference = true; - - projectReference.OnInvalidateItems(projectReference.Parent); - } - - return VSConstants.S_OK; - } - - - public override int OnAfterRenameProject(IVsHierarchy hierarchy) - { - if(hierarchy == null) - { - return VSConstants.E_INVALIDARG; - } - - try - { - List projectReferences = this.GetProjectReferencesContainingThisProject(hierarchy); - - // Collect data that is needed to initialize the new project reference node. - string projectRef; - ErrorHandler.ThrowOnFailure(this.Solution.GetProjrefOfProject(hierarchy, out projectRef)); - - object nameAsObject; - ErrorHandler.ThrowOnFailure(hierarchy.GetProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_Name, out nameAsObject)); - string projectName = (string)nameAsObject; - - string projectPath = String.Empty; - - IVsProject3 project = hierarchy as IVsProject3; - - if(project != null) - { - ErrorHandler.ThrowOnFailure(project.GetMkDocument(VSConstants.VSITEMID_ROOT, out projectPath)); - projectPath = Path.GetDirectoryName(projectPath); - } - - // Remove and re add the node. - foreach(ProjectReferenceNode projectReference in projectReferences) - { - ProjectNode projectMgr = projectReference.ProjectMgr; - IReferenceContainer refContainer = projectMgr.GetReferenceContainer(); - projectReference.Remove(false); - - VSCOMPONENTSELECTORDATA selectorData = new VSCOMPONENTSELECTORDATA(); - selectorData.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project; - selectorData.bstrTitle = projectName; - selectorData.bstrFile = projectPath; - selectorData.bstrProjRef = projectRef; - refContainer.AddReferenceFromSelectorData(selectorData); - } - } - catch(COMException e) - { - return e.ErrorCode; - } - - return VSConstants.S_OK; - } - - - public override int OnBeforeUnloadProject(IVsHierarchy realHierarchy, IVsHierarchy stubHierarchy) - { - List projectReferences = this.GetProjectReferencesContainingThisProject(realHierarchy); - - // Refresh the project reference node. That should trigger the drawing of the dangling project reference icon. - foreach(ProjectReferenceNode projectReference in projectReferences) - { - projectReference.IsNodeValid = true; - projectReference.OnInvalidateItems(projectReference.Parent); - projectReference.CanRemoveReference = false; - projectReference.IsNodeValid = false; - projectReference.ReferencedProjectObject = null; - } - - return VSConstants.S_OK; - - } - - #endregion - - #region helper methods - private List GetProjectReferencesContainingThisProject(IVsHierarchy inputHierarchy) - { - List projectReferences = new List(); - if(this.Solution == null || inputHierarchy == null) - { - return projectReferences; - } - - uint flags = (uint)(__VSENUMPROJFLAGS.EPF_ALLPROJECTS | __VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION); - Guid enumOnlyThisType = Guid.Empty; - IEnumHierarchies enumHierarchies = null; - - ErrorHandler.ThrowOnFailure(this.Solution.GetProjectEnum(flags, ref enumOnlyThisType, out enumHierarchies)); - Debug.Assert(enumHierarchies != null, "Could not get list of hierarchies in solution"); - - IVsHierarchy[] hierarchies = new IVsHierarchy[1]; - uint fetched; - int returnValue = VSConstants.S_OK; - do - { - returnValue = enumHierarchies.Next(1, hierarchies, out fetched); - Debug.Assert(fetched <= 1, "We asked one project to be fetched VSCore gave more than one. We cannot handle that"); - if(returnValue == VSConstants.S_OK && fetched == 1) - { - IVsHierarchy hierarchy = hierarchies[0]; - Debug.Assert(hierarchy != null, "Could not retrieve a hierarchy"); - IReferenceContainerProvider provider = hierarchy as IReferenceContainerProvider; - if(provider != null) - { - IReferenceContainer referenceContainer = provider.GetReferenceContainer(); - - Debug.Assert(referenceContainer != null, "Could not found the References virtual node"); - ProjectReferenceNode projectReferenceNode = GetProjectReferenceOnNodeForHierarchy(referenceContainer.EnumReferences(), inputHierarchy); - if(projectReferenceNode != null) - { - projectReferences.Add(projectReferenceNode); - } - } - } - } while(returnValue == VSConstants.S_OK && fetched == 1); - - return projectReferences; - } - - private static ProjectReferenceNode GetProjectReferenceOnNodeForHierarchy(IList references, IVsHierarchy inputHierarchy) - { - if(references == null) - { - return null; - } - - Guid projectGuid; - ErrorHandler.ThrowOnFailure(inputHierarchy.GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out projectGuid)); - - string canonicalName; - ErrorHandler.ThrowOnFailure(inputHierarchy.GetCanonicalName(VSConstants.VSITEMID_ROOT, out canonicalName)); - foreach(ReferenceNode refNode in references) - { - ProjectReferenceNode projRefNode = refNode as ProjectReferenceNode; - if(projRefNode != null) - { - if(projRefNode.ReferencedProjectGuid == projectGuid) - { - return projRefNode; - } - - // Try with canonical names, if the project that is removed is an unloaded project than the above criteria will not pass. - if(!String.IsNullOrEmpty(projRefNode.Url) && NativeMethods.IsSamePath(projRefNode.Url, canonicalName)) - { - return projRefNode; - } - } - } - - return null; - - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/StructuresEnums.cs b/source/Archive/MPF/12.0/StructuresEnums.cs deleted file mode 100644 index 817a550430..0000000000 --- a/source/Archive/MPF/12.0/StructuresEnums.cs +++ /dev/null @@ -1,571 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - #region structures - [StructLayoutAttribute(LayoutKind.Sequential)] - internal struct _DROPFILES - { - public Int32 pFiles; - public Int32 X; - public Int32 Y; - public Int32 fNC; - public Int32 fWide; - } - #endregion - - #region enums - - /// - /// The type of build performed. - /// - public enum BuildKind - { - Sync, - Async - } - - /// - /// Defines possible types of output that can produced by a language project - /// - [PropertyPageTypeConverterAttribute(typeof(OutputTypeConverter))] - public enum OutputType - { - /// - /// The output type is a class library. - /// - Library, - - /// - /// The output type is a windows executable. - /// - WinExe, - - /// - /// The output type is an executable. - /// - Exe - } - - /// - /// Debug values used by DebugModeConverter. - /// - [PropertyPageTypeConverterAttribute(typeof(DebugModeConverter))] - public enum DebugMode - { - Project, - Program, - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "URL")] - URL - } - - /// - /// An enumeration that describes the type of action to be taken by the build. - /// - [PropertyPageTypeConverterAttribute(typeof(BuildActionConverter))] - public enum BuildAction - { - None, - Compile, - Content, - EmbeddedResource - } - - /// - /// Defines the currect state of a property page. - /// - [Flags] - public enum PropPageStatus - { - - Dirty = 0x1, - - Validate = 0x2, - - Clean = 0x4 - } - - [Flags] - [SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue")] - public enum ModuleKindFlags - { - - ConsoleApplication, - - WindowsApplication, - - DynamicallyLinkedLibrary, - - ManifestResourceFile, - - UnmanagedDynamicallyLinkedLibrary - } - - /// - /// Defines the status of the command being queried - /// - [Flags] - [SuppressMessage("Microsoft.Naming", "CA1714:FlagsEnumsShouldHavePluralNames")] - [SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue")] - public enum QueryStatusResult - { - /// - /// The command is not supported. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "NOTSUPPORTED")] - NOTSUPPORTED = 0, - - /// - /// The command is supported - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "SUPPORTED")] - SUPPORTED = 1, - - /// - /// The command is enabled - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ENABLED")] - ENABLED = 2, - - /// - /// The command is toggled on - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "LATCHED")] - LATCHED = 4, - - /// - /// The command is toggled off (the opposite of LATCHED). - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "NINCHED")] - NINCHED = 8, - - /// - /// The command is invisible. - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "INVISIBLE")] - INVISIBLE = 16 - } - - /// - /// Defines the type of item to be added to the hierarchy. - /// - public enum HierarchyAddType - { - AddNewItem, - AddExistingItem - } - - /// - /// Defines the component from which a command was issued. - /// - public enum CommandOrigin - { - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ui")] - UiHierarchy, - OleCommandTarget - } - - /// - /// Defines the current status of the build process. - /// - public enum MSBuildResult - { - /// - /// The build is currently suspended. - /// - Suspended, - - /// - /// The build has been restarted. - /// - Resumed, - - /// - /// The build failed. - /// - Failed, - - /// - /// The build was successful. - /// - Successful, - } - - /// - /// Defines the type of action to be taken in showing the window frame. - /// - public enum WindowFrameShowAction - { - DoNotShow, - Show, - ShowNoActivate, - Hide, - } - - /// - /// Defines drop types - /// - internal enum DropDataType - { - None, - Shell, - VsStg, - VsRef - } - - /// - /// Used by the hierarchy node to decide which element to redraw. - /// - [Flags] - [SuppressMessage("Microsoft.Naming", "CA1714:FlagsEnumsShouldHavePluralNames")] - public enum UIHierarchyElement - { - None = 0, - - /// - /// This will be translated to VSHPROPID_IconIndex - /// - Icon = 1, - - /// - /// This will be translated to VSHPROPID_StateIconIndex - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Scc")] - SccState = 2, - - /// - /// This will be translated to VSHPROPID_Caption - /// - Caption = 4 - } - - /// - /// Defines the global propeties used by the msbuild project. - /// - public enum GlobalProperty - { - /// - /// Property specifying that we are building inside VS. - /// - BuildingInsideVisualStudio, - - /// - /// The VS installation directory. This is the same as the $(DevEnvDir) macro. - /// - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Env")] - DevEnvDir, - - /// - /// The name of the solution the project is created. This is the same as the $(SolutionName) macro. - /// - SolutionName, - - /// - /// The file name of the solution. This is the same as $(SolutionFileName) macro. - /// - SolutionFileName, - - /// - /// The full path of the solution. This is the same as the $(SolutionPath) macro. - /// - SolutionPath, - - /// - /// The directory of the solution. This is the same as the $(SolutionDir) macro. - /// - SolutionDir, - - /// - /// The extension of teh directory. This is the same as the $(SolutionExt) macro. - /// - SolutionExt, - - /// - /// The fxcop installation directory. - /// - FxCopDir, - - /// - /// The ResolvedNonMSBuildProjectOutputs msbuild property - /// - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "VSIDE")] - VSIDEResolvedNonMSBuildProjectOutputs, - - /// - /// The Configuartion property. - /// - Configuration, - - /// - /// The platform property. - /// - Platform, - - /// - /// The RunCodeAnalysisOnce property - /// - RunCodeAnalysisOnce, - - /// - /// The VisualStudioStyleErrors property - /// - VisualStudioStyleErrors, - } - #endregion - - public class AfterProjectFileOpenedEventArgs : EventArgs - { - #region fields - private bool added; - #endregion - - #region properties - /// - /// True if the project is added to the solution after the solution is opened. false if the project is added to the solution while the solution is being opened. - /// - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal bool Added - { - get { return this.added; } - } - #endregion - - #region ctor - internal AfterProjectFileOpenedEventArgs(bool added) - { - this.added = added; - } - #endregion - } - - public class BeforeProjectFileClosedEventArgs : EventArgs - { - #region fields - private bool removed; - #endregion - - #region properties - /// - /// true if the project was removed from the solution before the solution was closed. false if the project was removed from the solution while the solution was being closed. - /// - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal bool Removed - { - get { return this.removed; } - } - #endregion - - #region ctor - internal BeforeProjectFileClosedEventArgs(bool removed) - { - this.removed = removed; - } - #endregion - } - - /// - /// This class is used for the events raised by a HierarchyNode object. - /// - internal class HierarchyNodeEventArgs : EventArgs - { - private HierarchyNode child; - - internal HierarchyNodeEventArgs(HierarchyNode child) - { - this.child = child; - } - - public HierarchyNode Child - { - get { return this.child; } - } - } - - /// - /// Event args class for triggering file change event arguments. - /// - internal class FileChangedOnDiskEventArgs : EventArgs - { - #region Private fields - /// - /// File name that was changed on disk. - /// - private string fileName; - - /// - /// The item ide of the file that has changed. - /// - private uint itemID; - - /// - /// The reason the file has changed on disk. - /// - private _VSFILECHANGEFLAGS fileChangeFlag; - #endregion - - /// - /// Constructs a new event args. - /// - /// File name that was changed on disk. - /// The item id of the file that was changed on disk. - internal FileChangedOnDiskEventArgs(string fileName, uint id, _VSFILECHANGEFLAGS flag) - { - this.fileName = fileName; - this.itemID = id; - this.fileChangeFlag = flag; - } - - /// - /// Gets the file name that was changed on disk. - /// - /// The file that was changed on disk. - internal string FileName - { - get - { - return this.fileName; - } - } - - /// - /// Gets item id of the file that has changed - /// - /// The file that was changed on disk. - internal uint ItemID - { - get - { - return this.itemID; - } - } - - /// - /// The reason while the file has chnaged on disk. - /// - /// The reason while the file has chnaged on disk. - internal _VSFILECHANGEFLAGS FileChangeFlag - { - get - { - return this.fileChangeFlag; - } - } - } - - /// - /// Defines the event args for the active configuration chnage event. - /// - public class ActiveConfigurationChangedEventArgs : EventArgs - { - #region Private fields - /// - /// The hierarchy whose configuration has changed - /// - private IVsHierarchy hierarchy; - #endregion - - /// - /// Constructs a new event args. - /// - /// The hierarchy that has changed its configuration. - internal ActiveConfigurationChangedEventArgs(IVsHierarchy hierarchy) - { - this.hierarchy = hierarchy; - } - - /// - /// The hierarchy whose configuration has changed - /// - internal IVsHierarchy Hierarchy - { - get - { - return this.hierarchy; - } - } - } - - /// - /// Argument of the event raised when a project property is changed. - /// - [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] - public class ProjectPropertyChangedArgs : EventArgs - { - private string propertyName; - private string oldValue; - private string newValue; - - internal ProjectPropertyChangedArgs(string propertyName, string oldValue, string newValue) - { - this.propertyName = propertyName; - this.oldValue = oldValue; - this.newValue = newValue; - } - - public string NewValue - { - get { return newValue; } - } - - public string OldValue - { - get { return oldValue; } - } - - public string PropertyName - { - get { return propertyName; } - } - } -} diff --git a/source/Archive/MPF/12.0/SuspendFileChanges.cs b/source/Archive/MPF/12.0/SuspendFileChanges.cs deleted file mode 100644 index 222bf3e49c..0000000000 --- a/source/Archive/MPF/12.0/SuspendFileChanges.cs +++ /dev/null @@ -1,161 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// helper to make the editor ignore external changes - /// - internal class SuspendFileChanges - { - private string documentFileName; - - private bool isSuspending; - - private IServiceProvider site; - - private IVsDocDataFileChangeControl fileChangeControl; - - public SuspendFileChanges(IServiceProvider site, string document) - { - this.site = site; - this.documentFileName = document; - } - - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] - public void Suspend() - { - if(this.isSuspending) - return; - - IntPtr docData = IntPtr.Zero; - try - { - IVsRunningDocumentTable rdt = this.site.GetService(typeof(SVsRunningDocumentTable)) as IVsRunningDocumentTable; - - IVsHierarchy hierarchy; - uint itemId; - uint docCookie; - IVsFileChangeEx fileChange; - - - if(rdt == null) return; - - ErrorHandler.ThrowOnFailure(rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, this.documentFileName, out hierarchy, out itemId, out docData, out docCookie)); - - if((docCookie == (uint)ShellConstants.VSDOCCOOKIE_NIL) || docData == IntPtr.Zero) - return; - - fileChange = this.site.GetService(typeof(SVsFileChangeEx)) as IVsFileChangeEx; - - if(fileChange != null) - { - this.isSuspending = true; - ErrorHandler.ThrowOnFailure(fileChange.IgnoreFile(0, this.documentFileName, 1)); - if(docData != IntPtr.Zero) - { - IVsPersistDocData persistDocData = null; - - // if interface is not supported, return null - object unknown = Marshal.GetObjectForIUnknown(docData); - if(unknown is IVsPersistDocData) - { - persistDocData = (IVsPersistDocData)unknown; - if(persistDocData is IVsDocDataFileChangeControl) - { - this.fileChangeControl = (IVsDocDataFileChangeControl)persistDocData; - if(this.fileChangeControl != null) - { - ErrorHandler.ThrowOnFailure(this.fileChangeControl.IgnoreFileChanges(1)); - } - } - } - } - } - } - catch(InvalidCastException e) - { - Trace.WriteLine("Exception" + e.Message); - } - finally - { - if(docData != IntPtr.Zero) - { - Marshal.Release(docData); - } - } - return; - } - - public void Resume() - { - if(!this.isSuspending) - return; - IVsFileChangeEx fileChange; - fileChange = this.site.GetService(typeof(SVsFileChangeEx)) as IVsFileChangeEx; - if(fileChange != null) - { - this.isSuspending = false; - ErrorHandler.ThrowOnFailure(fileChange.IgnoreFile(0, this.documentFileName, 0)); - if(this.fileChangeControl != null) - { - ErrorHandler.ThrowOnFailure(this.fileChangeControl.IgnoreFileChanges(0)); - } - } - } - } -} diff --git a/source/Archive/MPF/12.0/TokenProcessor.cs b/source/Archive/MPF/12.0/TokenProcessor.cs deleted file mode 100644 index 2fb7577bc7..0000000000 --- a/source/Archive/MPF/12.0/TokenProcessor.cs +++ /dev/null @@ -1,570 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.IO; -using System.Text; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Replacement type - /// - public enum TokenReplaceType - { - ReplaceString, - ReplaceNumber, - ReplaceCode - } - - /// - /// Contain a number of functions that handle token replacement - /// - - public class TokenProcessor - { - #region fields - // Internal fields - private ArrayList tokenlist; - - - #endregion - - #region Initialization - /// - /// Constructor - /// - public TokenProcessor() - { - tokenlist = new ArrayList(); - } - - /// - /// Reset list of TokenReplacer entries - /// - public virtual void Reset() - { - tokenlist.Clear(); - } - - - /// - /// Add a replacement type entry - /// - /// token to replace - /// replacement string - public virtual void AddReplace(string token, string replacement) - { - tokenlist.Add(new ReplacePairToken(token, replacement)); - } - - /// - /// Add replace between entry - /// - /// Start token - /// End token - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "tokenid")] - public virtual void AddReplaceBetween(string tokenid, string tokenStart, string tokenEnd, string replacement) - { - tokenlist.Add(new ReplaceBetweenPairToken(tokenid, tokenStart, tokenEnd, replacement)); - } - - /// - /// Add a deletion entry - /// - /// Token to delete - public virtual void AddDelete(string tokenToDelete) - { - tokenlist.Add(new DeleteToken(tokenToDelete)); - } - #endregion - - #region TokenProcessing - /// - /// For all known token, replace token with correct value - /// - /// File of the source file - /// File of the destination file - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily"), SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Untoken")] - public virtual void UntokenFile(string source, string destination) - { - if(string.IsNullOrEmpty(source)) - throw new ArgumentNullException("source"); - - if(string.IsNullOrEmpty(destination)) - throw new ArgumentNullException("destination"); - - // Make sure that the destination folder exists. - string destinationFolder = Path.GetDirectoryName(destination); - if(!Directory.Exists(destinationFolder)) - { - Directory.CreateDirectory(destinationFolder); - } - - //Open the file. Check to see if the File is binary or text. - // NOTE: This is not correct because GetBinaryType will return true - // only if the file is executable, not if it is a dll, a library or - // any other type of binary file. - - uint binaryType; - if(!NativeMethods.GetBinaryType(source, out binaryType)) - { - Encoding encoding = Encoding.Default; - string buffer = null; - // Create the reader to get the text. Note that we will default to ASCII as - // encoding if the file does not contains a different signature. - using(StreamReader reader = new StreamReader(source, Encoding.ASCII, true)) - { - // Get the content of the file. - buffer = reader.ReadToEnd(); - // Detect the encoding of the source file. Note that we - // can get the encoding only after a read operation is - // performed on the file. - encoding = reader.CurrentEncoding; - } - foreach(object pair in tokenlist) - { - if(pair is DeleteToken) - DeleteTokens(ref buffer, (DeleteToken)pair); - if(pair is ReplaceBetweenPairToken) - ReplaceBetweenTokens(ref buffer, (ReplaceBetweenPairToken)pair); - if(pair is ReplacePairToken) - ReplaceTokens(ref buffer, (ReplacePairToken)pair); - } - File.WriteAllText(destination, buffer, encoding); - } - else - File.Copy(source, destination); - - } - - /// - /// Replaces the tokens in a buffer with the replacement string - /// - /// Buffer to update - /// replacement data - public virtual void ReplaceTokens(ref string buffer, ReplacePairToken tokenToReplace) - { - if (tokenToReplace == null) - { - throw new ArgumentNullException("tokenToReplace"); - } - - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - buffer = buffer.Replace(tokenToReplace.Token, tokenToReplace.Replacement); - } - - /// - /// Deletes the token from the buffer - /// - /// Buffer to update - /// token to delete - public virtual void DeleteTokens(ref string buffer, DeleteToken tokenToDelete) - { - if (tokenToDelete == null) - { - throw new ArgumentNullException("tokenToDelete"); - } - - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - buffer = buffer.Replace(tokenToDelete.StringToDelete, string.Empty); - } - - /// - /// Replaces the token from the buffer between the provided tokens - /// - /// Buffer to update - /// replacement token - public virtual void ReplaceBetweenTokens(ref string buffer, ReplaceBetweenPairToken rpBetweenToken) - { - if (rpBetweenToken == null) - { - throw new ArgumentNullException("rpBetweenToken"); - } - - if (buffer == null) - { - throw new ArgumentNullException("buffer"); - } - - string regularExp = rpBetweenToken.TokenStart + "[^" + rpBetweenToken.TokenIdentifier + "]*" + rpBetweenToken.TokenEnd; - buffer = System.Text.RegularExpressions.Regex.Replace(buffer, regularExp, rpBetweenToken.TokenReplacement); - } - - #endregion - - #region Guid generators - /// - /// Generates a string representation of a guid with the following format: - /// 0x01020304, 0x0506, 0x0708, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 - /// - /// Guid to be generated - /// The guid as string - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] - public string GuidToForm1(Guid value) - { - byte[] GuidBytes = value.ToByteArray(); - StringBuilder ResultingStr = new StringBuilder(80); - - // First 4 bytes - int i = 0; - int Number = 0; - for(i = 0; i < 4; ++i) - { - int CurrentByte = GuidBytes[i]; - Number += CurrentByte << (8 * i); - } - UInt32 FourBytes = (UInt32)Number; - ResultingStr.AppendFormat(CultureInfo.InvariantCulture, "0x{0}", FourBytes.ToString("X", CultureInfo.InvariantCulture)); - - // 2 chunks of 2 bytes - for(int j = 0; j < 2; ++j) - { - Number = 0; - for(int k = 0; k < 2; ++k) - { - int CurrentByte = GuidBytes[i++]; - Number += CurrentByte << (8 * k); - } - UInt16 TwoBytes = (UInt16)Number; - ResultingStr.AppendFormat(CultureInfo.InvariantCulture, ", 0x{0}", TwoBytes.ToString("X", CultureInfo.InvariantCulture)); - } - - // 8 chunks of 1 bytes - for(int j = 0; j < 8; ++j) - { - ResultingStr.AppendFormat(CultureInfo.InvariantCulture, ", 0x{0}", GuidBytes[i++].ToString("X", CultureInfo.InvariantCulture)); - } - - return ResultingStr.ToString(); - } - #endregion - - #region Helper Methods - /// - /// This function will accept a subset of the characters that can create an - /// identifier name: there are other unicode char that can be inside the name, but - /// this function will not allow. By now it can work this way, but when and if the - /// VSIP package will handle also languages different from english, this function - /// must be changed. - /// - /// Character to validate - /// true if successful false otherwise - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "c")] - protected static bool IsValidIdentifierChar(char c) - { - if((c >= 'a') && (c <= 'z')) - { - return true; - } - if((c >= 'A') && (c <= 'Z')) - { - return true; - } - if(c == '_') - { - return true; - } - if((c >= '0') && (c <= '9')) - { - return true; - } - - return false; - } - - /// - /// Verifies if the start character is valid - /// - /// Start character - /// true if successful false otherwise - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "c")] - protected static bool IsValidIdentifierStartChar(char c) - { - if(!IsValidIdentifierChar(c)) - { - return false; - } - if((c >= '0') && (c <= '9')) - { - return false; - } - - return true; - } - - /// - /// The goal here is to reduce the risk of name conflict between 2 classes - /// added in different directories. This code does NOT garanty uniqueness. - /// To garanty uniqueness, you should change this function to work with - /// the language service to verify that the namespace+class generated does - /// not conflict. - /// - /// Full path to the new file - /// Namespace to use for the new file - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic")] - public string GetFileNamespace(string fileFullPath, ProjectNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - // Get base namespace from the project - string namespce = node.GetProjectProperty("RootNamespace"); - if(String.IsNullOrEmpty(namespce)) - namespce = Path.GetFileNameWithoutExtension(fileFullPath); ; - - // If the item is added to a subfolder, the name space should reflect this. - // This is done so that class names from 2 files with the same name but different - // directories don't conflict. - string relativePath = Path.GetDirectoryName(fileFullPath); - string projectPath = Path.GetDirectoryName(node.GetMkDocument()); - // Our project system only support adding files that are sibling of the project file or that are in subdirectories. - if(String.Compare(projectPath, 0, relativePath, 0, projectPath.Length, true, CultureInfo.CurrentCulture) == 0) - { - relativePath = relativePath.Substring(projectPath.Length); - } - else - { - Debug.Fail("Adding an item to the project that is NOT under the project folder."); - // We are going to use the full file path for generating the namespace - } - - // Get the list of parts - int index = 0; - string[] pathParts; - pathParts = relativePath.Split(Path.DirectorySeparatorChar); - - // Use a string builder with default size being the expected size - StringBuilder result = new StringBuilder(namespce, namespce.Length + relativePath.Length + 1); - // For each path part - while(index < pathParts.Length) - { - string part = pathParts[index]; - ++index; - - // This could happen if the path had leading/trailing slash, we want to ignore empty pieces - if(String.IsNullOrEmpty(part)) - continue; - - // If we reach here, we will be adding something, so add a namespace separator '.' - result.Append('.'); - - // Make sure it starts with a letter - if(!char.IsLetter(part, 0)) - result.Append('N'); - - // Filter invalid namespace characters - foreach(char c in part) - { - if(char.IsLetterOrDigit(c)) - result.Append(c); - } - } - return result.ToString(); - } - #endregion - - } - - /// - /// Storage classes for replacement tokens - /// - public class ReplacePairToken - { - /// - /// token string - /// - private string token; - - /// - /// Replacement string - /// - private string replacement; - - /// - /// Constructor - /// - /// replaceable token - /// replacement string - public ReplacePairToken(string token, string replacement) - { - this.token = token; - this.replacement = replacement; - } - - /// - /// Token that needs to be replaced - /// - public string Token - { - get { return token; } - } - /// - /// String to replace the token with - /// - public string Replacement - { - get { return replacement; } - } - } - - /// - /// Storage classes for token to be deleted - /// - public class DeleteToken - { - /// - /// String to delete - /// - private string token; - - /// - /// Constructor - /// - /// Deletable token. - public DeleteToken(string token) - { - this.token = token; - } - - /// - /// Token marking the end of the block to delete - /// - public string StringToDelete - { - get { return token; } - } - } - - /// - /// Storage classes for string to be deleted between tokens to be deleted - /// - public class ReplaceBetweenPairToken - { - /// - /// Token start - /// - private string tokenStart; - - /// - /// End token - /// - private string tokenEnd; - - /// - /// Replacement string - /// - private string replacement; - - /// - /// Token identifier string - /// - private string tokenidentifier; - - /// - /// Constructor - /// - /// Start token - /// End Token - /// Replacement string. - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "tokenid")] - public ReplaceBetweenPairToken(string tokenid, string blockStart, string blockEnd, string replacement) - { - tokenStart = blockStart; - tokenEnd = blockEnd; - this.replacement = replacement; - tokenidentifier = tokenid; - } - - /// - /// Token marking the begining of the block to delete - /// - public string TokenStart - { - get { return tokenStart; } - } - - /// - /// Token marking the end of the block to delete - /// - public string TokenEnd - { - get { return tokenEnd; } - } - - /// - /// Token marking the end of the block to delete - /// - public string TokenReplacement - { - get { return replacement; } - } - - /// - /// Token Identifier - /// - public string TokenIdentifier - { - get { return tokenidentifier; } - } - } -} diff --git a/source/Archive/MPF/12.0/Tracing.cs b/source/Archive/MPF/12.0/Tracing.cs deleted file mode 100644 index 32154fb408..0000000000 --- a/source/Archive/MPF/12.0/Tracing.cs +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System.Diagnostics; - -namespace Microsoft.VisualStudio.Project -{ - internal class CCITracing - { - private CCITracing() { } - - [ConditionalAttribute("Enable_CCIDiagnostics")] - static void InternalTraceCall(int levels) - { - System.Diagnostics.StackFrame stack; - stack = new System.Diagnostics.StackFrame(levels); - System.Reflection.MethodBase method = stack.GetMethod(); - if(method != null) - { - string name = method.Name + " \tin class " + method.DeclaringType.Name; - System.Diagnostics.Trace.WriteLine("Call Trace: \t" + name); - } - } - - [ConditionalAttribute("CCI_TRACING")] - static public void TraceCall() - { - // skip this one as well - CCITracing.InternalTraceCall(2); - } - - [ConditionalAttribute("CCI_TRACING")] - static public void TraceCall(string strParameters) - { - CCITracing.InternalTraceCall(2); - System.Diagnostics.Trace.WriteLine("\tParameters: \t" + strParameters); - } - - [ConditionalAttribute("CCI_TRACING")] - static public void Trace(System.Exception e) - { - CCITracing.InternalTraceCall(2); - System.Diagnostics.Trace.WriteLine("ExceptionInfo: \t" + e.ToString()); - } - - [ConditionalAttribute("CCI_TRACING")] - static public void Trace(string strOutput) - { - System.Diagnostics.Trace.WriteLine(strOutput); - } - - [ConditionalAttribute("CCI_TRACING")] - static public void TraceData(string strOutput) - { - System.Diagnostics.Trace.WriteLine("Data Trace: \t" + strOutput); - } - - [ConditionalAttribute("Enable_CCIFileOutput")] - [ConditionalAttribute("CCI_TRACING")] - static public void AddTraceLog(string strFileName) - { - TextWriterTraceListener tw = new TextWriterTraceListener("c:\\mytrace.log"); - System.Diagnostics.Trace.Listeners.Add(tw); - } - } -} diff --git a/source/Archive/MPF/12.0/TrackDocumentsHelper.cs b/source/Archive/MPF/12.0/TrackDocumentsHelper.cs deleted file mode 100644 index 75b4a1a777..0000000000 --- a/source/Archive/MPF/12.0/TrackDocumentsHelper.cs +++ /dev/null @@ -1,211 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Used by a project to query the environment for permission to add, remove, or rename a file or directory in a solution - /// - internal class TrackDocumentsHelper - { - #region fields - private ProjectNode projectMgr; - #endregion - - #region properties - - #endregion - - #region ctors - internal TrackDocumentsHelper(ProjectNode project) - { - this.projectMgr = project; - } - #endregion - - #region helper methods - /// - /// Gets the IVsTrackProjectDocuments2 object by asking the service provider for it. - /// - /// the IVsTrackProjectDocuments2 object - private IVsTrackProjectDocuments2 GetIVsTrackProjectDocuments2() - { - Debug.Assert(this.projectMgr != null && !this.projectMgr.IsClosed && this.projectMgr.Site != null); - - IVsTrackProjectDocuments2 documentTracker = this.projectMgr.Site.GetService(typeof(SVsTrackProjectDocuments)) as IVsTrackProjectDocuments2; - if(documentTracker == null) - { - throw new InvalidOperationException(); - } - - return documentTracker; - } - - /// - /// Asks the environment for permission to add files. - /// - /// The files to add. - /// The VSQUERYADDFILEFLAGS flags associated to the files added - /// true if the file can be added, false if not. - internal bool CanAddItems(string[] files, VSQUERYADDFILEFLAGS[] flags) - { - // If we are silent then we assume that the file can be added, since we do not want to trigger this event. - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) != 0) - { - return true; - } - - if(files == null || files.Length == 0) - { - return false; - } - - int len = files.Length; - VSQUERYADDFILERESULTS[] summary = new VSQUERYADDFILERESULTS[1]; - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnQueryAddFiles(this.projectMgr.InteropSafeIVsProject3, len, files, flags, summary, null)); - if(summary[0] == VSQUERYADDFILERESULTS.VSQUERYADDFILERESULTS_AddNotOK) - { - return false; - } - - return true; - } - - /// - /// Notify the environment about a file just added - /// - internal void OnItemAdded(string file, VSADDFILEFLAGS flag) - { - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) == 0) - { - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnAfterAddFilesEx(this.projectMgr.InteropSafeIVsProject3, 1, new string[1] { file }, new VSADDFILEFLAGS[1] { flag })); - } - } - - /// - /// Asks the environment for permission to remove files. - /// - /// an array of files to remove - /// The VSQUERYREMOVEFILEFLAGS associated to the files to be removed. - /// true if the files can be removed, false if not. - internal bool CanRemoveItems(string[] files, VSQUERYREMOVEFILEFLAGS[] flags) - { - // If we are silent then we assume that the file can be removed, since we do not want to trigger this event. - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) != 0) - { - return true; - } - - if(files == null || files.Length == 0) - { - return false; - } - int length = files.Length; - - VSQUERYREMOVEFILERESULTS[] summary = new VSQUERYREMOVEFILERESULTS[1]; - - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnQueryRemoveFiles(this.projectMgr.InteropSafeIVsProject3, length, files, flags, summary, null)); - if(summary[0] == VSQUERYREMOVEFILERESULTS.VSQUERYREMOVEFILERESULTS_RemoveNotOK) - { - return false; - } - - return true; - } - - /// - /// Notify the environment about a file just removed - /// - internal void OnItemRemoved(string file, VSREMOVEFILEFLAGS flag) - { - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) == 0) - { - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnAfterRemoveFiles(this.projectMgr.InteropSafeIVsProject3, 1, new string[1] { file }, new VSREMOVEFILEFLAGS[1] { flag })); - } - } - - /// - /// Asks the environment for permission to rename files. - /// - /// Path to the file to be renamed. - /// Path to the new file. - /// The VSRENAMEFILEFLAGS associated with the file to be renamed. - /// true if the file can be renamed. Otherwise false. - internal bool CanRenameItem(string oldFileName, string newFileName, VSRENAMEFILEFLAGS flag) - { - // If we are silent then we assume that the file can be renamed, since we do not want to trigger this event. - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) != 0) - { - return true; - } - - int iCanContinue = 0; - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnQueryRenameFile(this.projectMgr.InteropSafeIVsProject3, oldFileName, newFileName, flag, out iCanContinue)); - return (iCanContinue != 0); - } - - /// - /// Get's called to tell the env that a file was renamed - /// - /// - internal void OnItemRenamed(string strOldName, string strNewName, VSRENAMEFILEFLAGS flag) - { - if((this.projectMgr.EventTriggeringFlag & ProjectNode.EventTriggering.DoNotTriggerTrackerEvents) == 0) - { - ErrorHandler.ThrowOnFailure(this.GetIVsTrackProjectDocuments2().OnAfterRenameFile(this.projectMgr.InteropSafeIVsProject3, strOldName, strNewName, flag)); - } - } - #endregion - } -} - diff --git a/source/Archive/MPF/12.0/TypeConverters.cs b/source/Archive/MPF/12.0/TypeConverters.cs deleted file mode 100644 index 58537632c0..0000000000 --- a/source/Archive/MPF/12.0/TypeConverters.cs +++ /dev/null @@ -1,315 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Runtime.Versioning; -using Microsoft.VisualStudio.Shell.Interop; -using System.Runtime.InteropServices; - -namespace Microsoft.VisualStudio.Project -{ - public class OutputTypeConverter : EnumConverter - { - public OutputTypeConverter() - : base(typeof(OutputType)) - { - - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - if(sourceType == typeof(string)) return true; - - return base.CanConvertFrom(context, sourceType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - string str = value as string; - - if(str != null) - { - if(str == SR.GetString(SR.Exe, culture)) return OutputType.Exe; - if(str == SR.GetString(SR.Library, culture)) return OutputType.Library; - if(str == SR.GetString(SR.WinExe, culture)) return OutputType.WinExe; - } - - return base.ConvertFrom(context, culture, value); - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - if(destinationType == typeof(string)) - { - string result = null; - // In some cases if multiple nodes are selected the windows form engine - // calls us with a null value if the selected node's property values are not equal - if(value != null) - { - result = SR.GetString(((OutputType)value).ToString(), culture); - } - else - { - result = SR.GetString(OutputType.Library.ToString(), culture); - } - - if(result != null) return result; - } - - return base.ConvertTo(context, culture, value, destinationType); - } - - public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - return new StandardValuesCollection(new OutputType[] { OutputType.Exe, OutputType.Library, OutputType.WinExe }); - } - } - - public class DebugModeConverter : EnumConverter - { - - public DebugModeConverter() - : base(typeof(DebugMode)) - { - - } - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - if(sourceType == typeof(string)) return true; - - return base.CanConvertFrom(context, sourceType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - string str = value as string; - - if(str != null) - { - if(str == SR.GetString(SR.Program, culture)) return DebugMode.Program; - - if(str == SR.GetString(SR.Project, culture)) return DebugMode.Project; - - if(str == SR.GetString(SR.URL, culture)) return DebugMode.URL; - } - - return base.ConvertFrom(context, culture, value); - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - if(destinationType == typeof(string)) - { - string result = null; - // In some cases if multiple nodes are selected the windows form engine - // calls us with a null value if the selected node's property values are not equal - if(value != null) - { - result = SR.GetString(((DebugMode)value).ToString(), culture); - } - else - { - result = SR.GetString(DebugMode.Program.ToString(), culture); - } - - if(result != null) return result; - } - - return base.ConvertTo(context, culture, value, destinationType); - } - - public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - return new StandardValuesCollection(new DebugMode[] { DebugMode.Program, DebugMode.Project, DebugMode.URL }); - } - } - - public class BuildActionConverter : EnumConverter - { - - public BuildActionConverter() - : base(typeof(BuildAction)) - { - - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - if(sourceType == typeof(string)) return true; - - return base.CanConvertFrom(context, sourceType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - string str = value as string; - - if(str != null) - { - if(str == SR.GetString(SR.Compile, culture)) return BuildAction.Compile; - - if(str == SR.GetString(SR.Content, culture)) return BuildAction.Content; - - if(str == SR.GetString(SR.EmbeddedResource, culture)) return BuildAction.EmbeddedResource; - - if(str == SR.GetString(SR.None, culture)) return BuildAction.None; - } - - return base.ConvertFrom(context, culture, value); - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - if(destinationType == typeof(string)) - { - string result = null; - - // In some cases if multiple nodes are selected the windows form engine - // calls us with a null value if the selected node's property values are not equal - // Example of windows form engine passing us null: File set to Compile, Another file set to None, bot nodes are selected, and the build action combo is clicked. - if(value != null) - { - result = SR.GetString(((BuildAction)value).ToString(), culture); - } - else - { - result = SR.GetString(BuildAction.None.ToString(), culture); - } - - if(result != null) return result; - } - - return base.ConvertTo(context, culture, value, destinationType); - } - - public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - return new StandardValuesCollection(new BuildAction[] { BuildAction.Compile, BuildAction.Content, BuildAction.EmbeddedResource, BuildAction.None }); - } - } - - public class FrameworkNameConverter : TypeConverter - { - public FrameworkNameConverter() - { - } - - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) - { - if (sourceType == typeof(string)) return true; - - return base.CanConvertFrom(context, sourceType); - } - - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - string str = value as string; - - if (str != null) - { - return new FrameworkName(str); - } - - return base.ConvertFrom(context, culture, value); - } - - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) - { - if (destinationType == typeof(string)) - { - var name = value as FrameworkName; - if (name != null) - { - return name.FullName; - } - } - - return base.ConvertTo(context, culture, value, destinationType); - } - - public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context) - { - return true; - } - - public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context) - { - IServiceProvider sp = ProjectNode.ServiceProvider; - var multiTargetService = sp.GetService(typeof(SVsFrameworkMultiTargeting)) as IVsFrameworkMultiTargeting; - if (multiTargetService == null) - { - Trace.TraceError("Unable to acquire the SVsFrameworkMultiTargeting service."); - return new StandardValuesCollection(new string[0]); - } - Array frameworks; - Marshal.ThrowExceptionForHR(multiTargetService.GetSupportedFrameworks(out frameworks)); - return new StandardValuesCollection( - frameworks.Cast().Select(fx => new FrameworkName(fx)).ToArray() - ); - } - } -} diff --git a/source/Archive/MPF/12.0/UIThread.cs b/source/Archive/MPF/12.0/UIThread.cs deleted file mode 100644 index cf8daf88d0..0000000000 --- a/source/Archive/MPF/12.0/UIThread.cs +++ /dev/null @@ -1,268 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -namespace Microsoft.VisualStudio.Project -{ - using Microsoft.VisualStudio.Shell; - using System; - using System.Diagnostics; - using System.Globalization; - using System.Threading; - using System.Windows.Forms; - - internal sealed class UIThread : IDisposable - { - private WindowsFormsSynchronizationContext synchronizationContext; -#if DEBUG - /// - /// Stack trace when synchronizationContext was captured - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] - private StackTrace captureStackTrace; -#endif - - private Thread uithread; - - /// - /// RunSync puts orignal exception stacktrace to Exception.Data by this key if action throws on UI thread - /// - /// WrappedStacktraceKey is a string to keep exception serializable. - private const string WrappedStacktraceKey = "$$Microsoft.VisualStudio.Package.UIThread.WrappedStacktraceKey$$"; - - /// - /// The singleton instance. - /// - private static volatile UIThread instance = new UIThread(); - - internal UIThread() - { - this.Initialize(); - } - - /// - /// Gets the singleton instance - /// - public static UIThread Instance - { - get - { - return instance; - } - } - - /// - /// Checks whether this is the UI thread. - /// - public bool IsUIThread - { - get { return this.uithread == System.Threading.Thread.CurrentThread; } - } - - /// - /// Gets a value indicating whether unit tests are running. - /// - internal static bool IsUnitTest { get; set; } - - #region IDisposable Members - /// - /// Dispose implementation. - /// - public void Dispose() - { - if (this.synchronizationContext != null) - { - this.synchronizationContext.Dispose(); - } - } - - #endregion - - /// - /// Initializes unit testing mode for this object - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal void InitUnitTestingMode() - { - Debug.Assert(this.synchronizationContext == null, "Context has already been captured; too late to InitUnitTestingMode"); - IsUnitTest = true; - } - - [Conditional("DEBUG")] - internal void MustBeCalledFromUIThread() - { - Debug.Assert(this.uithread == System.Threading.Thread.CurrentThread || IsUnitTest, "This must be called from the GUI thread"); - } - - /// - /// Runs an action asynchronously on an associated forms synchronization context. - /// - /// The action to run - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - internal void Run(Action a) - { - if (IsUnitTest) - { - a(); - return; - } - Debug.Assert(this.synchronizationContext != null, "The SynchronizationContext must be captured before calling this method"); -#if DEBUG - StackTrace stackTrace = new StackTrace(true); -#endif - this.synchronizationContext.Post(delegate(object ignore) - { - try - { - this.MustBeCalledFromUIThread(); - a(); - } -#if DEBUG - catch (Exception e) - { - // swallow, random exceptions should not kill process - Debug.Assert(false, string.Format(CultureInfo.InvariantCulture, "UIThread.Run caught and swallowed exception: {0}\n\noriginally invoked from stack:\n{1}", e.ToString(), stackTrace.ToString())); - } -#else - catch (Exception) - { - // swallow, random exceptions should not kill process - } -#endif - }, null); - - } - - /// - /// Runs an action synchronously on an associated forms synchronization context - /// - /// The action to run. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] - internal void RunSync(Action a) - { - if (IsUnitTest) - { - a(); - return; - } - Exception exn = null; ; - Debug.Assert(this.synchronizationContext != null, "The SynchronizationContext must be captured before calling this method"); - - // Send on UI thread will execute immediately. - this.synchronizationContext.Send(ignore => - { - try - { - this.MustBeCalledFromUIThread(); - a(); - } - catch (Exception e) - { - exn = e; - } - }, null - ); - if (exn != null) - { - // throw exception on calling thread, preserve stacktrace - if (!exn.Data.Contains(WrappedStacktraceKey)) exn.Data[WrappedStacktraceKey] = exn.StackTrace; - throw exn; - } - } - - /// - /// Performs a callback on the UI thread, blocking until the action completes. Uses the VS mechanism - /// of marshalling back to the main STA thread via COM RPC. - /// - internal static T DoOnUIThread(Func callback) - { - return ThreadHelper.Generic.Invoke(callback); - } - - /// - /// Performs a callback on the UI thread, blocking until the action completes. Uses the VS mechanism - /// of marshalling back to the main STA thread via COM RPC. - /// - internal static void DoOnUIThread(Action callback) - { - ThreadHelper.Generic.Invoke(callback); - } - - /// - /// Initializes this object. - /// - private void Initialize() - { - if (IsUnitTest) return; - this.uithread = System.Threading.Thread.CurrentThread; - - if (this.synchronizationContext == null) - { -#if DEBUG - // This is a handy place to do this, since the product and all interesting unit tests - // must go through this code path. - AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(delegate(object sender, UnhandledExceptionEventArgs args) - { - if (args.IsTerminating) - { - string s = String.Format(CultureInfo.InvariantCulture, "An unhandled exception is about to terminate the process. Exception info:\n{0}", args.ExceptionObject.ToString()); - Debug.Assert(false, s); - } - }); - - this.captureStackTrace = new StackTrace(true); -#endif - this.synchronizationContext = new WindowsFormsSynchronizationContext(); - } - else - { - // Make sure we are always capturing the same thread. - Debug.Assert(this.uithread == Thread.CurrentThread); - } - } - } -} diff --git a/source/Archive/MPF/12.0/UpdateSolutionEventsListener.cs b/source/Archive/MPF/12.0/UpdateSolutionEventsListener.cs deleted file mode 100644 index 9e1c926b98..0000000000 --- a/source/Archive/MPF/12.0/UpdateSolutionEventsListener.cs +++ /dev/null @@ -1,319 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using IServiceProvider = System.IServiceProvider; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines an abstract class implementing IVsUpdateSolutionEvents interfaces. - /// - - public abstract class UpdateSolutionEventsListener : IVsUpdateSolutionEvents3, IVsUpdateSolutionEvents2, IDisposable - { - #region fields - /// - /// The cookie associated to the the events based IVsUpdateSolutionEvents2. - /// - private uint solutionEvents2Cookie; - - /// - /// The cookie associated to the theIVsUpdateSolutionEvents3 events. - /// - private uint solutionEvents3Cookie; - - /// - /// The IVsSolutionBuildManager2 object controlling the update solution events. - /// - private IVsSolutionBuildManager2 solutionBuildManager; - - - /// - /// The associated service provider. - /// - private IServiceProvider serviceProvider; - - /// - /// Flag determining if the object has been disposed. - /// - private bool isDisposed; - - /// - /// Defines an object that will be a mutex for this object for synchronizing thread calls. - /// - private static volatile object Mutex = new object(); - #endregion - - #region ctors - /// - /// Overloaded constructor. - /// - /// A service provider. - protected UpdateSolutionEventsListener(IServiceProvider serviceProvider) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - this.serviceProvider = serviceProvider; - - this.solutionBuildManager = this.serviceProvider.GetService(typeof(SVsSolutionBuildManager)) as IVsSolutionBuildManager2; - - if(this.solutionBuildManager == null) - { - throw new InvalidOperationException(); - } - - ErrorHandler.ThrowOnFailure(this.solutionBuildManager.AdviseUpdateSolutionEvents(this, out this.solutionEvents2Cookie)); - - Debug.Assert(this.solutionBuildManager is IVsSolutionBuildManager3, "The solution build manager object implementing IVsSolutionBuildManager2 does not implement IVsSolutionBuildManager3"); - ErrorHandler.ThrowOnFailure(this.SolutionBuildManager3.AdviseUpdateSolutionEvents3(this, out this.solutionEvents3Cookie)); - } - #endregion - - #region properties - - /// - /// The associated service provider. - /// - protected IServiceProvider ServiceProvider - { - get - { - return this.serviceProvider; - } - } - - /// - /// The solution build manager object controlling the solution events. - /// - protected IVsSolutionBuildManager2 SolutionBuildManager2 - { - get - { - return this.solutionBuildManager; - } - } - - /// - /// The solution build manager object controlling the solution events. - /// - protected IVsSolutionBuildManager3 SolutionBuildManager3 - { - get - { - return (IVsSolutionBuildManager3)this.solutionBuildManager; - } - - } - #endregion - - #region IVsUpdateSolutionEvents3 Members - - /// - /// Fired after the active solution config is changed (pOldActiveSlnCfg can be NULL). - /// - /// Old configuration. - /// New configuration. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OnAfterActiveSolutionCfgChange(IVsCfg oldActiveSlnCfg, IVsCfg newActiveSlnCfg) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Fired before the active solution config is changed (pOldActiveSlnCfg can be NULL - /// - /// Old configuration. - /// New configuration. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OnBeforeActiveSolutionCfgChange(IVsCfg oldActiveSlnCfg, IVsCfg newActiveSlnCfg) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - #region IVsUpdateSolutionEvents2 Members - - /// - /// Called when the active project configuration for a project in the solution has changed. - /// - /// The project whose configuration has changed. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int OnActiveProjectCfgChange(IVsHierarchy hierarchy) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called right before a project configuration begins to build. - /// - /// The project that is to be build. - /// A configuration project object. - /// A configuration solution object. - /// The action taken. - /// A flag indicating cancel. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - /// The values for the action are defined in the enum _SLNUPDACTION env\msenv\core\slnupd2.h - public int UpdateProjectCfg_Begin(IVsHierarchy hierarchy, IVsCfg configProject, IVsCfg configSolution, uint action, ref int cancel) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called right after a project configuration is finished building. - /// - /// The project that has finished building. - /// A configuration project object. - /// A configuration solution object. - /// The action taken. - /// Flag indicating success. - /// Flag indicating cancel. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - /// The values for the action are defined in the enum _SLNUPDACTION env\msenv\core\slnupd2.h - public virtual int UpdateProjectCfg_Done(IVsHierarchy hierarchy, IVsCfg configProject, IVsCfg configSolution, uint action, int success, int cancel) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called before any build actions have begun. This is the last chance to cancel the build before any building begins. - /// - /// Flag indicating cancel update. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int UpdateSolution_Begin(ref int cancelUpdate) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called when a build is being cancelled. - /// - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int UpdateSolution_Cancel() - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called when a build is completed. - /// - /// true if no update actions failed. - /// true if any update action succeeded. - /// true if update actions were canceled. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int UpdateSolution_Done(int fSucceeded, int fModified, int fCancelCommand) - { - return VSConstants.E_NOTIMPL; - } - - /// - /// Called before the first project configuration is about to be built. - /// - /// A flag indicating cancel update. - /// If the method succeeds, it returns S_OK. If it fails, it returns an error code. - public virtual int UpdateSolution_StartUpdate(ref int cancelUpdate) - { - return VSConstants.E_NOTIMPL; - } - - #endregion - - - #region IDisposable Members - - /// - /// The IDispose interface Dispose method for disposing the object determinastically. - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - #endregion - - #region methods - /// - /// The method that does the cleanup. - /// - /// true if called from IDispose.Dispose; false if called from Finalizer. - protected virtual void Dispose(bool disposing) - { - // Everybody can go here. - if(!this.isDisposed) - { - // Synchronize calls to the Dispose simultaniously. - lock(Mutex) - { - if(this.solutionEvents2Cookie != (uint)ShellConstants.VSCOOKIE_NIL) - { - ErrorHandler.ThrowOnFailure(this.solutionBuildManager.UnadviseUpdateSolutionEvents(this.solutionEvents2Cookie)); - this.solutionEvents2Cookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - - if(this.solutionEvents3Cookie != (uint)ShellConstants.VSCOOKIE_NIL) - { - ErrorHandler.ThrowOnFailure(this.SolutionBuildManager3.UnadviseUpdateSolutionEvents3(this.solutionEvents3Cookie)); - this.solutionEvents3Cookie = (uint)ShellConstants.VSCOOKIE_NIL; - } - - this.isDisposed = true; - } - } - } - #endregion - } -} diff --git a/source/Archive/MPF/12.0/Url.cs b/source/Archive/MPF/12.0/Url.cs deleted file mode 100644 index 82e7d09cd2..0000000000 --- a/source/Archive/MPF/12.0/Url.cs +++ /dev/null @@ -1,412 +0,0 @@ -#if BETA2 -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Windows.Forms; -using System.Diagnostics; -using Microsoft.Win32; -using System.Globalization; -using System.IO; -using System.Collections; -using System.Xml; -using System.Text; -using System.Net; -using IOleServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; -using IServiceProvider = System.IServiceProvider; -using ShellConstants = Microsoft.VisualStudio.Shell.Interop.Constants; -using OleConstants = Microsoft.VisualStudio.OLE.Interop.Constants; - -namespace Microsoft.VisualStudio.Package -{ - /// - /// This class wraps the Uri class and provides an unescaped "LocalPath" for file URL's - /// and an unescaped AbsoluteUri for other schemes, plus it also returned an un-hex-escaped - /// result from MakeRelative so it can be presented to the user. - /// - public class Url - { - private Uri uri = null; - private bool isFile; - - - public Url(string path) - { - Init(path); - } - - void Init(string path) - { - // Must try absolute first, then fall back on relative, otherwise it - // makes some absolute UNC paths like (\\lingw11\Web_test\) relative! - if (path != null) - { - - if (!Uri.TryCreate(path, UriKind.Absolute, out this.uri)) - { - Uri.TryCreate(path, UriKind.Relative, out this.uri); - } - - this.CheckIsFile(); - } - } - - void CheckIsFile() - { - this.isFile = false; - if (this.uri != null) - { - if (this.uri.IsAbsoluteUri) - { - this.isFile = this.uri.IsFile; - } - else - { - string[] test1 = this.uri.OriginalString.Split('/'); - string[] test2 = this.uri.OriginalString.Split('\\'); - if (test1.Length < test2.Length) - { - this.isFile = true; - } - } - } - } - - // allows relpath to be null, in which case it just returns the baseUrl. - - public Url(Url baseUrl, string relpath) - { - if (baseUrl.uri == null) - { - Init(relpath); - } - else if (string.IsNullOrEmpty(relpath)) - { - this.uri = baseUrl.uri; - } - else - { - this.uri = new Uri(baseUrl.uri, relpath); - } - CheckIsFile(); - } - - - public string AbsoluteUrl - { - get - { - if (this.uri == null) return null; - if (this.uri.IsAbsoluteUri) - { - if (this.isFile) - { - // Fix for build break. UriComponents.LocalPath is no longer available. - // return uri.GetComponents(UriComponents.LocalPath, UriFormat.SafeUnescaped); - return uri.LocalPath; - } - else - { - return uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.SafeUnescaped); - } - } - else - { - return uri.OriginalString; - } - } - } - - - /// Returns the AbsoluteUrl for the parent directory containing the file - /// referenced by this URL object, where the Directory string is also unescaped. - public string Directory - { - get - { - string path = this.AbsoluteUrl; - if (path == null) return null; - int i = path.LastIndexOf(this.IsFile ? Path.DirectorySeparatorChar : '/'); - int len = (i > 0) ? i : path.Length; - return path.Substring(0, len); - } - } - - - public bool IsFile - { - get { return this.isFile; } - } - - - public Url Move(Url oldBase, Url newBase) - { - if (this.uri == null || oldBase.uri == null) return null; - string rel = oldBase.uri.MakeRelativeUri(this.uri).ToString(); - return new Url(newBase, rel); - } - - // return an un-escaped relative path - - public string MakeRelative(Url url) - { - if (this.uri == null || url.uri == null) return null; - if (this.uri.Scheme != url.uri.Scheme || this.uri.Host != url.uri.Host) - { - // Then it cannot be relatavized (e.g from file:// to http://). - return url.AbsoluteUrl; - } - // This will return a hex-escaped string. - string rel = this.uri.MakeRelativeUri(url.uri).ToString(); - - // So unescape it. - return Unescape(rel, this.isFile); - } - - const char c_DummyChar = (char)0xFFFF; - - private static char EscapedAscii(char digit, char next) - { - // Only accept hexadecimal characters - if (!(((digit >= '0') && (digit <= '9')) - || ((digit >= 'A') && (digit <= 'F')) - || ((digit >= 'a') && (digit <= 'f')))) - { - return c_DummyChar; - } - - int res = 0; - if (digit <= '9') - res = (int)digit - (int)'0'; - else if (digit <= 'F') - res = ((int)digit - (int)'A') + 10; - else - res = ((int)digit - (int)'a') + 10; - - // Only accept hexadecimal characters - if (!(((next >= '0') && (next <= '9')) - || ((next >= 'A') && (next <= 'F')) - || ((next >= 'a') && (next <= 'f')))) - { - return c_DummyChar; - } - - res = res << 4; - if (next <= '9') - res += (int)next - (int)'0'; - else if (digit <= 'F') - res += ((int)next - (int)'A') + 10; - else - res += ((int)next - (int)'a') + 10; - - return (char)(res); - } - - - public static string Unescape(string escaped, bool isFile) - { - if (String.IsNullOrEmpty(escaped)) - { - return String.Empty; - } - - byte[] bytes = null; - char[] dest = new char[escaped.Length]; - int j = 0; - - for (int i = 0, end = escaped.Length; i < end; i++) - { - char ch = escaped[i]; - if (ch != '%') - { - if (ch == '/' && isFile) - { - ch = Path.DirectorySeparatorChar; - } - dest[j++] = ch; - } - else - { - int byteCount = 0; - // lazy initialization of max size, will reuse the array for next sequences - if (bytes == null) - { - bytes = new byte[end - i]; - } - - do - { - // Check on exit criterion - if ((ch = escaped[i]) != '%' || (end - i) < 3) - { - break; - } - // already made sure we have 3 characters in str - ch = EscapedAscii(escaped[i + 1], escaped[i + 2]); - if (ch == c_DummyChar) - { - //invalid hex sequence, we will out '%' character - ch = '%'; - break; - } - else if (ch < '\x80') - { - // character is not part of a UTF-8 sequence - i += 2; - break; - } - else - { - //a UTF-8 sequence - bytes[byteCount++] = (byte)ch; - i += 3; - } - } while (i < end); - - if (byteCount != 0) - { - - int charCount = Encoding.UTF8.GetCharCount(bytes, 0, byteCount); - if (charCount != 0) - { - Encoding.UTF8.GetChars(bytes, 0, byteCount, dest, j); - j += charCount; - } - else - { - // the encoded, high-ANSI characters are not UTF-8 encoded - for (int k = 0; k < byteCount; ++k) - { - dest[j++] = (char)bytes[k]; - } - } - } - if (i < end) - { - dest[j++] = ch; - } - } - } - return new string(dest, 0, j); - } - - - public Uri Uri - { - get { return this.uri; } - } - - // - // Unlike the Uri class, this ALWAYS succeeds, even on relative paths, and it - // strips out the path separator characters - - public string[] GetSegments() - { - if (this.uri == null) return null; - string path = this.AbsoluteUrl; - if (this.isFile || !this.uri.IsAbsoluteUri) - { - if (path.EndsWith("\\")) - path = path.Substring(0, path.Length - 1); - return path.Split(Path.DirectorySeparatorChar); - } - else - { - // strip off "http://" and host name, since those are not part of the path. - path = path.Substring(this.uri.Scheme.Length + 3 + this.uri.Host.Length + 1); - if (path.EndsWith("/")) - path = path.Substring(0, path.Length - 1); - return path.Split('/'); - } - } - - - /// Return unescaped path up to (but not including) segment i. - public string GetPartial(int i) - { - string path = JoinSegments(0, i); - if (!this.isFile) - { - // prepend "http://host/" - path = this.uri.Scheme + "://" + this.uri.Host + '/' + path; - } - return path; - } - - - /// Return unescaped relative path starting segment i. - public string GetRemainder(int i) - { - return JoinSegments(i, -1); - } - - - public string JoinSegments(int i, int j) - { - if (i < 0) - throw new ArgumentOutOfRangeException("i"); - - StringBuilder sb = new StringBuilder(); - string[] segments = this.GetSegments(); - if (segments == null) - return null; - if (j < 0) - j = segments.Length; - int len = segments.Length; - for (; i < j && i < len; i++) - { - if (sb.Length > 0) - sb.Append(this.isFile ? Path.DirectorySeparatorChar : '/'); - string s = segments[i]; - sb.Append(s); - } - return Unescape(sb.ToString(), isFile); - } - } -} -#endif diff --git a/source/Archive/MPF/12.0/Utilities.cs b/source/Archive/MPF/12.0/Utilities.cs deleted file mode 100644 index 420984be3e..0000000000 --- a/source/Archive/MPF/12.0/Utilities.cs +++ /dev/null @@ -1,1056 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Runtime.InteropServices; -using System.Security.Permissions; -using System.Security.Policy; -using System.Text; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.OLE.Interop; -using Microsoft.VisualStudio.Shell; -using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.Win32; -using IServiceProvider = System.IServiceProvider; -using MSBuild = Microsoft.Build.Evaluation; -using VSRegistry = Microsoft.VisualStudio.Shell.VSRegistry; - -namespace Microsoft.VisualStudio.Project -{ - public static class Utilities - { - private const string defaultMSBuildVersion = "4.0"; - - /// - /// Look in the registry under the current hive for the path - /// of MSBuild - /// - /// - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "msbuild")] - public static string GetMsBuildPath(IServiceProvider serviceProvider) - { - return GetMsBuildPath(serviceProvider, defaultMSBuildVersion); - } - - /// - /// Search the registry for the tools path for MSBuild. - /// - /// The service provider. - /// Msbuild version. - /// The msbuild tools path - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Ms")] - public static string GetMsBuildPath(IServiceProvider serviceProvider, string version) - { - string msBuildPath = null; - using(RegistryKey root = VSRegistry.RegistryRoot(serviceProvider, __VsLocalRegistryType.RegType_Configuration, false)) - { - // Get the value from the registry - using(RegistryKey vsKey = root.OpenSubKey("MSBuild", false)) - { - msBuildPath = (string)vsKey.GetValue("MSBuildBinPath", null); - } - } - if(!string.IsNullOrEmpty(msBuildPath)) - { - return msBuildPath; - } - - // The path to MSBuild was not found in the VisualStudio's registry hive, so try to - // find it in the new MSBuild hive. - string registryPath = string.Format(CultureInfo.InvariantCulture, "Software\\Microsoft\\MSBuild\\ToolsVersions\\{0}", version); - using(Microsoft.Win32.RegistryKey msbuildKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(registryPath, false)) - { - msBuildPath = (string)msbuildKey.GetValue("MSBuildToolsPath", null); - } - if(string.IsNullOrEmpty(msBuildPath)) - { - string error = SR.GetString(SR.ErrorMsBuildRegistration, CultureInfo.CurrentUICulture); - throw new FileLoadException(error); - } - return msBuildPath; - } - - /// - /// Is Visual Studio in design mode. - /// - /// The service provider. - /// true if visual studio is in design mode - public static bool IsVisualStudioInDesignMode(IServiceProvider site) - { - if (site == null) - { - throw new ArgumentNullException("site"); - } - - IVsMonitorSelection selectionMonitor = site.GetService(typeof(IVsMonitorSelection)) as IVsMonitorSelection; - uint cookie = 0; - int active = 0; - Guid designContext = VSConstants.UICONTEXT_DesignMode; - ErrorHandler.ThrowOnFailure(selectionMonitor.GetCmdUIContextCookie(ref designContext, out cookie)); - ErrorHandler.ThrowOnFailure(selectionMonitor.IsCmdUIContextActive(cookie, out active)); - return active != 0; - } - - /// - /// - /// Is an extensibility object executing an automation function. - /// - /// The service provider. - /// true if the extensiblity object is executing an automation function. - public static bool IsInAutomationFunction(IServiceProvider serviceProvider) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - IVsExtensibility3 extensibility = serviceProvider.GetService(typeof(EnvDTE.IVsExtensibility)) as IVsExtensibility3; - - if(extensibility == null) - { - throw new InvalidOperationException(); - } - int inAutomation = 0; - ErrorHandler.ThrowOnFailure(extensibility.IsInAutomationFunction(out inAutomation)); - return inAutomation != 0; - } - - /// - /// Creates a semicolon delinited list of strings. This can be used to provide the properties for VSHPROPID_CfgPropertyPagesCLSIDList, VSHPROPID_PropertyPagesCLSIDList, VSHPROPID_PriorityPropertyPagesCLSIDList - /// - /// An array of Guids. - /// A semicolon delimited string, or null - - public static string CreateSemicolonDelimitedListOfStringFromGuids(Guid[] guids) - { - if(guids == null || guids.Length == 0) - { - return null; - } - - // Create a StringBuilder with a pre-allocated buffer big enough for the - // final string. 39 is the length of a GUID in the "B" form plus the final ';' - StringBuilder stringList = new StringBuilder(39 * guids.Length); - for(int i = 0; i < guids.Length; i++) - { - stringList.Append(guids[i].ToString("B")); - stringList.Append(";"); - } - - return stringList.ToString().TrimEnd(';'); - } - - private static char[] curlyBraces = new char[] { '{', '}' }; - /// - /// Take list of guids as a single string and generate an array of Guids from it - /// - /// Semi-colon separated list of Guids - /// Array of Guids - - public static Guid[] GuidsArrayFromSemicolonDelimitedStringOfGuids(string guidList) - { - if(guidList == null) - { - return null; - } - - List guids = new List(); - string[] guidsStrings = guidList.Split(';'); - foreach(string guid in guidsStrings) - { - if(!String.IsNullOrEmpty(guid)) - guids.Add(new Guid(guid.Trim(curlyBraces))); - } - - return guids.ToArray(); - } - - /// - /// Validates a file path by validating all file parts. If the - /// the file name is invalid it throws an exception if the project is in automation. Otherwise it shows a dialog box with the error message. - /// - /// The service provider - /// A full path to a file name - /// In case of failure an InvalidOperationException is thrown. - public static void ValidateFileName(IServiceProvider serviceProvider, string filePath) - { - string errorMessage = String.Empty; - if(String.IsNullOrEmpty(filePath)) - { - errorMessage = SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture); - } - else if(filePath.Length > NativeMethods.MAX_PATH) - { - errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.PathTooLong, CultureInfo.CurrentUICulture), filePath); - } - else if(ContainsInvalidFileNameChars(filePath)) - { - errorMessage = SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture); - } - - if(errorMessage.Length == 0) - { - string fileName = Path.GetFileName(filePath); - if(String.IsNullOrEmpty(fileName) || IsFileNameInvalid(fileName)) - { - errorMessage = SR.GetString(SR.ErrorInvalidFileName, CultureInfo.CurrentUICulture); - } - else - { - string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); - - // If there is no filename or it starts with a leading dot issue an error message and quit. - if(String.IsNullOrEmpty(fileNameWithoutExtension) || fileNameWithoutExtension[0] == '.') - { - errorMessage = SR.GetString(SR.FileNameCannotContainALeadingPeriod, CultureInfo.CurrentUICulture); - } - } - } - - if(errorMessage.Length > 0) - { - // If it is not called from an automation method show a dialog box. - if(!Utilities.IsInAutomationFunction(serviceProvider)) - { - string title = null; - OLEMSGICON icon = OLEMSGICON.OLEMSGICON_CRITICAL; - OLEMSGBUTTON buttons = OLEMSGBUTTON.OLEMSGBUTTON_OK; - OLEMSGDEFBUTTON defaultButton = OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST; - VsShellUtilities.ShowMessageBox(serviceProvider, title, errorMessage, icon, buttons, defaultButton); - } - else - { - throw new InvalidOperationException(errorMessage); - } - } - - } - - /// - /// Creates a CALPOLESTR from a list of strings - /// It is the responsability of the caller to release this memory. - /// - /// - /// A CALPOLESTR that was created from the the list of strings. - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CALPOLESTR")] - public static CALPOLESTR CreateCALPOLESTR(IList strings) - { - CALPOLESTR calpolStr = new CALPOLESTR(); - - if(strings != null) - { - // Demand unmanaged permissions in order to access unmanaged memory. - new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); - - calpolStr.cElems = (uint)strings.Count; - - int size = Marshal.SizeOf(typeof(IntPtr)); - - calpolStr.pElems = Marshal.AllocCoTaskMem(strings.Count * size); - - IntPtr ptr = calpolStr.pElems; - - foreach(string aString in strings) - { - IntPtr tempPtr = Marshal.StringToCoTaskMemUni(aString); - Marshal.WriteIntPtr(ptr, tempPtr); - ptr = new IntPtr(ptr.ToInt64() + size); - } - } - - return calpolStr; - } - - /// - /// Creates a CADWORD from a list of tagVsSccFilesFlags. Memory is allocated for the elems. - /// It is the responsability of the caller to release this memory. - /// - /// - /// A CADWORD created from the list of tagVsSccFilesFlags. - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CADWORD")] - public static CADWORD CreateCADWORD(IList flags) - { - CADWORD cadWord = new CADWORD(); - - if(flags != null) - { - // Demand unmanaged permissions in order to access unmanaged memory. - new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); - - cadWord.cElems = (uint)flags.Count; - - int size = Marshal.SizeOf(typeof(UInt32)); - - cadWord.pElems = Marshal.AllocCoTaskMem(flags.Count * size); - - IntPtr ptr = cadWord.pElems; - - foreach(tagVsSccFilesFlags flag in flags) - { - Marshal.WriteInt32(ptr, (int)flag); - ptr = new IntPtr(ptr.ToInt64() + size); - } - } - - return cadWord; - } - - /// - /// Splits a bitmap from a Stream into an ImageList - /// - /// A Stream representing a Bitmap - /// An ImageList object representing the images from the given stream - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - public static ImageList GetImageList(Stream imageStream) - { - ImageList ilist = new ImageList(); - - if(imageStream == null) - { - return ilist; - } - ilist.ColorDepth = ColorDepth.Depth24Bit; - ilist.ImageSize = new Size(16, 16); - Bitmap bitmap = new Bitmap(imageStream); - ilist.Images.AddStrip(bitmap); - ilist.TransparentColor = Color.Magenta; - return ilist; - } - - /// - /// Splits a bitmap from a pointer to an ImageList - /// - /// A pointer to a bitmap of images to split - /// An ImageList object representing the images from the given stream - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] - public static ImageList GetImageList(object imageListAsPointer) - { - ImageList images = null; - - IntPtr intPtr = new IntPtr((int)imageListAsPointer); - HandleRef hImageList = new HandleRef(null, intPtr); - int count = UnsafeNativeMethods.ImageList_GetImageCount(hImageList); - - if(count > 0) - { - // Create a bitmap big enough to hold all the images - Bitmap b = new Bitmap(16 * count, 16); - Graphics g = Graphics.FromImage(b); - - // Loop through and extract each image from the imagelist into our own bitmap - IntPtr hDC = IntPtr.Zero; - try - { - hDC = g.GetHdc(); - HandleRef handleRefDC = new HandleRef(null, hDC); - for(int i = 0; i < count; i++) - { - UnsafeNativeMethods.ImageList_Draw(hImageList, i, handleRefDC, i * 16, 0, NativeMethods.ILD_NORMAL); - } - } - finally - { - if(g != null && hDC != IntPtr.Zero) - { - g.ReleaseHdc(hDC); - } - } - - // Create a new imagelist based on our stolen images - images = new ImageList(); - images.ColorDepth = ColorDepth.Depth24Bit; - images.ImageSize = new Size(16, 16); - images.Images.AddStrip(b); - } - return images; - } - - /// - /// Gets the active configuration name. - /// - /// The automation object. - /// The name of the active configuartion. - internal static string GetActiveConfigurationName(EnvDTE.Project automationObject) - { - if(automationObject == null) - { - throw new ArgumentNullException("automationObject"); - } - - string currentConfigName = string.Empty; - if(automationObject.ConfigurationManager != null) - { - EnvDTE.Configuration activeConfig = automationObject.ConfigurationManager.ActiveConfiguration; - if(activeConfig != null) - { - currentConfigName = activeConfig.ConfigurationName; - } - } - return currentConfigName; - - } - - - /// - /// Verifies that two objects represent the same instance of a COM object. - /// This essentially compares the IUnkown pointers of the 2 objects. - /// This is needed in scenario where aggregation is involved. - /// - /// Can be an object, interface or IntPtr - /// Can be an object, interface or IntPtr - /// True if the 2 items represent the same thing - [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "obj")] - public static bool IsSameComObject(object obj1, object obj2) - { - bool isSame = false; - IntPtr unknown1 = IntPtr.Zero; - IntPtr unknown2 = IntPtr.Zero; - try - { - // If we have 2 null, then they are not COM objects and as such "it's not the same COM object" - if(obj1 != null && obj2 != null) - { - unknown1 = QueryInterfaceIUnknown(obj1); - unknown2 = QueryInterfaceIUnknown(obj2); - - isSame = IntPtr.Equals(unknown1, unknown2); - } - } - finally - { - if(unknown1 != IntPtr.Zero) - { - Marshal.Release(unknown1); - } - - if(unknown2 != IntPtr.Zero) - { - Marshal.Release(unknown2); - } - - } - - return isSame; - } - - /// - /// Retrieve the IUnknown for the managed or COM object passed in. - /// - /// Managed or COM object. - /// Pointer to the IUnknown interface of the object. - internal static IntPtr QueryInterfaceIUnknown(object objToQuery) - { - bool releaseIt = false; - IntPtr unknown = IntPtr.Zero; - IntPtr result; - try - { - if(objToQuery is IntPtr) - { - unknown = (IntPtr)objToQuery; - } - else - { - // This is a managed object (or RCW) - unknown = Marshal.GetIUnknownForObject(objToQuery); - releaseIt = true; - } - - // We might already have an IUnknown, but if this is an aggregated - // object, it may not be THE IUnknown until we QI for it. - Guid IID_IUnknown = VSConstants.IID_IUnknown; - ErrorHandler.ThrowOnFailure(Marshal.QueryInterface(unknown, ref IID_IUnknown, out result)); - } - finally - { - if(releaseIt && unknown != IntPtr.Zero) - { - Marshal.Release(unknown); - } - - } - - return result; - } - - /// - /// Returns true if thename that can represent a path, absolut or relative, or a file name contains invalid filename characters. - /// - /// File name - /// true if file name is invalid - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", - Justification="The name is validated.")] - public static bool ContainsInvalidFileNameChars(string name) - { - if(String.IsNullOrEmpty(name)) - { - return true; - } - - try - { - if(Path.IsPathRooted(name) && !name.StartsWith(@"\\", StringComparison.Ordinal)) - { - string root = Path.GetPathRoot(name); - name = name.Substring(root.Length); - } - } - // The Path methods used by ContainsInvalidFileNameChars return argument exception if the filePath contains invalid characters. - catch(ArgumentException) - { - return true; - } - - Microsoft.VisualStudio.Shell.Url uri = new Microsoft.VisualStudio.Shell.Url(name); - - // This might be confusing bur Url.IsFile means that the uri represented by the name is either absolut or relative. - if(uri.IsFile) - { - string[] segments = uri.Segments; - if(segments != null && segments.Length > 0) - { - foreach(string segment in segments) - { - if(IsFilePartInValid(segment)) - { - return true; - } - } - - // Now the last segment should be specially taken care, since that cannot be all dots or spaces. - string lastSegment = segments[segments.Length - 1]; - string filePart = Path.GetFileNameWithoutExtension(lastSegment); - if(IsFileNameAllGivenCharacter('.', filePart) || IsFileNameAllGivenCharacter(' ', filePart)) - { - return true; - } - } - } - else - { - // The assumption here is that we got a file name. - string filePart = Path.GetFileNameWithoutExtension(name); - if(IsFileNameAllGivenCharacter('.', filePart) || IsFileNameAllGivenCharacter(' ', filePart)) - { - return true; - } - - - return IsFilePartInValid(name); - } - - return false; - } - - /// Cehcks if a file name is valid. - /// - /// The name of the file - /// True if the file is valid. - public static bool IsFileNameInvalid(string fileName) - { - if(String.IsNullOrEmpty(fileName)) - { - return true; - } - - if(IsFileNameAllGivenCharacter('.', fileName) || IsFileNameAllGivenCharacter(' ', fileName)) - { - return true; - } - - - return IsFilePartInValid(fileName); - - } - - /// - /// Helper method to call a converter explicitely to convert to an enum type - /// - /// THe enum to convert to - /// The converter that will be created - /// The enum value to be converted to - /// The type to convert - /// The culture to use to read the localized strings - /// - - public static object ConvertToType(T value, Type typeToConvert, CultureInfo culture) - where T : struct - { - EnumConverter converter = GetEnumConverter(); - if(converter == null) - { - return null; - } - if(converter.CanConvertTo(typeToConvert)) - { - return converter.ConvertTo(null, culture, value, typeToConvert); - } - - return null; - } - - /// - /// Helper method for converting from a string to an enum using a converter. - /// - /// - /// - /// The culture to use to read the localized strings - /// - - public static Nullable ConvertFromType(string value, CultureInfo culture) - where T : struct - { - Nullable returnValue = new Nullable(); - - returnValue = returnValue.GetValueOrDefault(); - - if(value == null) - { - return returnValue; - } - - EnumConverter converter = GetEnumConverter(); - if(converter == null) - { - return returnValue; - } - - if(converter.CanConvertFrom(value.GetType())) - { - object converted = converter.ConvertFrom(null, culture, value); - - if(converted != null && (converted is T)) - { - returnValue = (T)converted; - } - } - - return returnValue; - } - - - /// - /// Sets a string value from an enum - /// - /// The enum type - /// The value of teh enum. - /// - - public static string SetStringValueFromConvertedEnum(T enumValue, CultureInfo culture) - where T : struct - { - string convertToType = ConvertToType(enumValue, typeof(string), culture) as string; - - if(convertToType == null) - { - return String.Empty; - } - - return convertToType; - } - - - /// - /// Initializes the in memory project. Sets BuildEnabled on the project to true. - /// - /// The build engine to use to create a build project. - /// The full path of the project. - /// A loaded msbuild project. - internal static MSBuild.Project InitializeMsBuildProject(MSBuild.ProjectCollection buildEngine, string fullProjectPath) - { - if(String.IsNullOrEmpty(fullProjectPath)) - { - throw new ArgumentException(SR.GetString(SR.InvalidParameter, CultureInfo.CurrentUICulture), "fullProjectPath"); - } - - // Call GetFullPath to expand any relative path passed into this method. - fullProjectPath = Path.GetFullPath(fullProjectPath); - - - // Check if the project already has been loaded with the fullProjectPath. If yes return the build project associated to it. - List loadedProject = new List(buildEngine.GetLoadedProjects(fullProjectPath)); - MSBuild.Project buildProject = loadedProject != null && loadedProject.Count > 0 && loadedProject[0] != null ? loadedProject[0] : null; - - if(buildProject == null) - { - buildProject = buildEngine.LoadProject(fullProjectPath); - } - - return buildProject; - } - - /// - /// Loads a project file for the file. If the build project exists and it was loaded with a different file then it is unloaded first. - /// - /// The build engine to use to create a build project. - /// The full path of the project. - /// An Existing build project that will be reloaded. - /// A loaded msbuild project. - internal static MSBuild.Project ReinitializeMsBuildProject(MSBuild.ProjectCollection buildEngine, string fullProjectPath, MSBuild.Project exitingBuildProject) - { - // If we have a build project that has been loaded with another file unload it. - try - { - if(exitingBuildProject != null && exitingBuildProject.ProjectCollection != null && !NativeMethods.IsSamePath(exitingBuildProject.FullPath, fullProjectPath)) - { - buildEngine.UnloadProject(exitingBuildProject); - } - } - // We catch Invalid operation exception because if the project was unloaded while we touch the ParentEngine the msbuild API throws. - // Is there a way to figure out that a project was unloaded? - catch(InvalidOperationException) - { - } - - return Utilities.InitializeMsBuildProject(buildEngine, fullProjectPath); - } - - /// - /// Initialize the build engine. Sets the build enabled property to true. The engine is initialzed if the passed in engine is null or does not have its bin path set. - /// - /// An instance of MSBuild.ProjectCollection build engine, that will be checked if initialized. - /// The service provider. - /// The buildengine to use. - internal static MSBuild.ProjectCollection InitializeMsBuildEngine(MSBuild.ProjectCollection existingEngine, IServiceProvider serviceProvider) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - if(existingEngine == null) - { - MSBuild.ProjectCollection buildEngine = MSBuild.ProjectCollection.GlobalProjectCollection; - return buildEngine; - } - - return existingEngine; - } - - /// - /// Get the outer T implementation - /// - internal static T GetOuterAs(object o) - where T : class - { - T hierarchy = null; - - // The hierarchy of a node is its project node hierarchy. - IntPtr projectUnknown = Marshal.GetIUnknownForObject(o); - - try - { - hierarchy = (T)Marshal.GetTypedObjectForIUnknown(projectUnknown, typeof(T)); - } - finally - { - if (projectUnknown != IntPtr.Zero) - { - Marshal.Release(projectUnknown); - } - } - - return hierarchy; - } - - /// - /// Gets an instance of an EnumConverter for enums that have PropertyPageTypeConverter attribute - /// - /// The type to search for the PropertyPageTypeConverter attribute. - /// An instance of an enum converter, or null if none found. - private static EnumConverter GetEnumConverter() - where T : struct - { - object[] attributes = typeof(T).GetCustomAttributes(typeof(PropertyPageTypeConverterAttribute), true); - - // There should be only one PropertyPageTypeConverterAttribute defined on T - if(attributes != null && attributes.Length == 1) - { - - Debug.Assert(attributes[0] is PropertyPageTypeConverterAttribute, "The returned attribute must be an attribute is PropertyPageTypeConverterAttribute"); - PropertyPageTypeConverterAttribute converterAttribute = (PropertyPageTypeConverterAttribute)attributes[0]; - - if(converterAttribute.ConverterType.IsSubclassOf(typeof(EnumConverter))) - { - return Activator.CreateInstance(converterAttribute.ConverterType) as EnumConverter; - } - } - - return null; - } - - /// > - /// Checks if the file name is all the given character. - /// - private static bool IsFileNameAllGivenCharacter(char c, string fileName) - { - // A valid file name cannot be all "c" . - int charFound = 0; - for(charFound = 0; charFound < fileName.Length && fileName[charFound] == c; ++charFound) ; - if(charFound >= fileName.Length) - { - return true; - } - - return false; - } - - /// - /// Checks whether a file part contains valid characters. The file part can be any part of a non rooted path. - /// - /// - /// - private static bool IsFilePartInValid(string filePart) - { - if(String.IsNullOrEmpty(filePart)) - { - return true; - } - String reservedName = "(\\b(nul|con|aux|prn)\\b)|(\\b((com|lpt)[0-9])\\b)"; - String invalidChars = @"([/?:&\\*<>|#%" + '\"' + "])"; - String regexToUseForFileName = reservedName + "|" + invalidChars; - String fileNameToVerify = filePart; - - // Define a regular expression that covers all characters that are not in the safe character sets. - // It is compiled for performance. - - // The filePart might still be a file and extension. If it is like that then we must check them separately, since different rules apply - string extension = String.Empty; - try - { - extension = Path.GetExtension(filePart); - } - // We catch the ArgumentException because we want this method to return true if the filename is not valid. FilePart could be for example #�&%"�&"% and that would throw ArgumentException on GetExtension - catch(ArgumentException) - { - return true; - } - - if(!String.IsNullOrEmpty(extension)) - { - // Check the extension first - String regexToUseForExtension = invalidChars; - Regex unsafeCharactersRegex = new Regex(regexToUseForExtension, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - bool isMatch = unsafeCharactersRegex.IsMatch(extension); - if(isMatch) - { - return isMatch; - } - - // We want to verify here everything but the extension. - // We cannot use GetFileNameWithoutExtension because it might be that for example (..\\filename.txt) is passed in asnd that should fail, since that is not a valid filename. - fileNameToVerify = filePart.Substring(0, filePart.Length - extension.Length); - - if(String.IsNullOrEmpty(fileNameToVerify)) - { - return true; - } - } - - // We verify CLOCK$ outside the regex since for some reason the regex is not matching the clock\\$ added. - if(String.Compare(fileNameToVerify, "CLOCK$", StringComparison.OrdinalIgnoreCase) == 0) - { - return true; - } - - Regex unsafeFileNameCharactersRegex = new Regex(regexToUseForFileName, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - return unsafeFileNameCharactersRegex.IsMatch(fileNameToVerify); - } - - /// - /// Copy a directory recursively to the specified non-existing directory - /// - /// Directory to copy from - /// Directory to copy to - public static void RecursivelyCopyDirectory(string source, string target) - { - // Make sure it doesn't already exist - if(Directory.Exists(target)) - throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileOrFolderAlreadyExists, CultureInfo.CurrentUICulture), target)); - - Directory.CreateDirectory(target); - DirectoryInfo directory = new DirectoryInfo(source); - - // Copy files - foreach(FileInfo file in directory.GetFiles()) - { - file.CopyTo(Path.Combine(target, file.Name)); - } - - // Now recurse to child directories - foreach(DirectoryInfo child in directory.GetDirectories()) - { - RecursivelyCopyDirectory(child.FullName, Path.Combine(target, child.Name)); - } - } - - /// - /// Canonicalizes a file name, including: - /// - determines the full path to the file - /// - casts to upper case - /// Canonicalizing a file name makes it possible to compare file names using simple simple string comparison. - /// - /// Note: this method does not handle shared drives and UNC drives. - /// - /// A file name, which can be relative/absolute and contain lower-case/upper-case characters. - /// Canonicalized file name. - internal static string CanonicalizeFileName(string anyFileName) - { - // Get absolute path - // Note: this will not handle UNC paths - FileInfo fileInfo = new FileInfo(anyFileName); - string fullPath = fileInfo.FullName; - - // Cast to upper-case - fullPath = fullPath.ToUpper(CultureInfo.CurrentCulture); - - return fullPath; - } - - - /// - /// Determines if a file is a template. - /// - /// The file to check whether it is a template file - /// true if the file is a template file - internal static bool IsTemplateFile(string fileName) - { - if(String.IsNullOrEmpty(fileName)) - { - return false; - } - - string extension = Path.GetExtension(fileName); - return (String.Compare(extension, ".vstemplate", StringComparison.OrdinalIgnoreCase) == 0 || string.Compare(extension, ".vsz", StringComparison.OrdinalIgnoreCase) == 0); - } - - /// - /// Retrives the configuration and the platform using the IVsSolutionBuildManager2 interface. - /// - /// A service provider. - /// The hierarchy whose configuration is requested. This method calls into - /// native code and may be called on a background thread, so make sure the IVsHierarchy passed is - /// safe to use for that sort of interop. - /// The name of the active configuration. - /// The name of the platform. - /// true if successfull. - internal static bool TryGetActiveConfigurationAndPlatform(System.IServiceProvider serviceProvider, IVsHierarchy hierarchy, out string configuration, out string platform) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - if(hierarchy == null) - { - throw new ArgumentNullException("hierarchy"); - } - - configuration = String.Empty; - platform = String.Empty; - - IVsSolutionBuildManager2 solutionBuildManager = serviceProvider.GetService(typeof(SVsSolutionBuildManager)) as IVsSolutionBuildManager2; - - if(solutionBuildManager == null) - { - return false; - } - - IVsProjectCfg[] activeConfigs = new IVsProjectCfg[1]; - ErrorHandler.ThrowOnFailure(solutionBuildManager.FindActiveProjectCfg(IntPtr.Zero, IntPtr.Zero, hierarchy, activeConfigs)); - - IVsProjectCfg activeCfg = activeConfigs[0]; - - // Can it be that the activeCfg is null? - System.Diagnostics.Debug.Assert(activeCfg != null, "Cannot find the active configuration"); - - string canonicalName; - ErrorHandler.ThrowOnFailure(activeCfg.get_CanonicalName(out canonicalName)); - - return ProjectConfig.TrySplitConfigurationCanonicalName(canonicalName, out configuration, out platform); - } - - /// - /// Determines whether the shell is in command line mode. - /// - /// A reference to a Service Provider. - /// true if the shell is in command line mode. false otherwise. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal static bool IsShellInCommandLineMode(System.IServiceProvider serviceProvider) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - IVsShell shell = serviceProvider.GetService(typeof(SVsShell)) as IVsShell; - if(shell == null) - { - throw new InvalidOperationException(); - } - - object isInCommandLineModeAsObject; - ErrorHandler.ThrowOnFailure(shell.GetProperty((int)__VSSPROPID.VSSPROPID_IsInCommandLineMode, out isInCommandLineModeAsObject)); - - return ((bool)isInCommandLineModeAsObject); - } - } -} diff --git a/source/Archive/MPF/12.0/VSShellUtilities.cs b/source/Archive/MPF/12.0/VSShellUtilities.cs deleted file mode 100644 index 6fca7bfee5..0000000000 --- a/source/Archive/MPF/12.0/VSShellUtilities.cs +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics; -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; - -namespace Microsoft.VisualStudio.Project -{ - /// - ///This class provides some useful static shell based methods. - /// - - public static class UIHierarchyUtilities - { - /// - /// Get reference to IVsUIHierarchyWindow interface from guid persistence slot. - /// - /// The service provider. - /// Unique identifier for a tool window created using IVsUIShell::CreateToolWindow. - /// The caller of this method can use predefined identifiers that map to tool windows if those tool windows - /// are known to the caller. - /// A reference to an IVsUIHierarchyWindow interface. - public static IVsUIHierarchyWindow GetUIHierarchyWindow(IServiceProvider serviceProvider, Guid persistenceSlot) - { - if(serviceProvider == null) - { - throw new ArgumentNullException("serviceProvider"); - } - - IVsUIShell shell = serviceProvider.GetService(typeof(SVsUIShell)) as IVsUIShell; - - Debug.Assert(shell != null, "Could not get the ui shell from the project"); - if(shell == null) - { - throw new InvalidOperationException(); - } - - object pvar = null; - IVsWindowFrame frame = null; - IVsUIHierarchyWindow uiHierarchyWindow = null; - - try - { - ErrorHandler.ThrowOnFailure(shell.FindToolWindow(0, ref persistenceSlot, out frame)); - ErrorHandler.ThrowOnFailure(frame.GetProperty((int)__VSFPROPID.VSFPROPID_DocView, out pvar)); - } - finally - { - if(pvar != null) - { - uiHierarchyWindow = (IVsUIHierarchyWindow)pvar; - } - } - - return uiHierarchyWindow; - } - } -} diff --git a/source/Archive/MPF/12.0/VisualStudio.Project.cs b/source/Archive/MPF/12.0/VisualStudio.Project.cs deleted file mode 100644 index cb496a55e8..0000000000 --- a/source/Archive/MPF/12.0/VisualStudio.Project.cs +++ /dev/null @@ -1,309 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Reflection; -using System.Globalization; -using System.Resources; -using System.Text; -using System.Threading; -using System.ComponentModel; -using System.Security.Permissions; - -namespace Microsoft.VisualStudio.Project -{ - [AttributeUsage(AttributeTargets.All)] - internal sealed class SRDescriptionAttribute : DescriptionAttribute - { - private bool replaced; - - public SRDescriptionAttribute(string description) - : base(description) - { - } - - public override string Description - { - get - { - if(!replaced) - { - replaced = true; - DescriptionValue = SR.GetString(base.Description, CultureInfo.CurrentUICulture); - } - return base.Description; - } - } - } - - [AttributeUsage(AttributeTargets.All)] - internal sealed class SRCategoryAttribute : CategoryAttribute - { - - public SRCategoryAttribute(string category) - : base(category) - { - } - - protected override string GetLocalizedString(string value) - { - return SR.GetString(value, CultureInfo.CurrentUICulture); - } - } - internal sealed class SR - { - internal const string AddReferenceDialogTitle = "AddReferenceDialogTitle"; - internal const string AddToNullProjectError = "AddToNullProjectError"; - internal const string Advanced = "Advanced"; - internal const string AssemblyReferenceAlreadyExists = "AssemblyReferenceAlreadyExists"; - internal const string AttributeLoad = "AttributeLoad"; - internal const string BuildAction = "BuildAction"; - internal const string BuildActionDescription = "BuildActionDescription"; - internal const string BuildCaption = "BuildCaption"; - internal const string BuildVerbosity = "BuildVerbosity"; - internal const string BuildVerbosityDescription = "BuildVerbosityDescription"; - internal const string BuildEventError = "BuildEventError"; - internal const string CancelQueryEdit = "CancelQueryEdit"; - internal const string CannotAddFileThatIsOpenInEditor = "CannotAddFileThatIsOpenInEditor"; - internal const string CanNotSaveFileNotOpeneInEditor = "CanNotSaveFileNotOpeneInEditor"; - internal const string cli1 = "cli1"; - internal const string Compile = "Compile"; - internal const string ConfirmExtensionChange = "ConfirmExtensionChange"; - internal const string Content = "Content"; - internal const string CopyToLocal = "CopyToLocal"; - internal const string CopyToLocalDescription = "CopyToLocalDescription"; - internal const string EmbedInteropTypes = "EmbedInteropTypes"; - internal const string EmbedInteropTypesDescription = "EmbedInteropTypesDescription"; - internal const string CustomTool = "CustomTool"; - internal const string CustomToolDescription = "CustomToolDescription"; - internal const string CustomToolNamespace = "CustomToolNamespace"; - internal const string CustomToolNamespaceDescription = "CustomToolNamespaceDescription"; - internal const string DetailsImport = "DetailsImport"; - internal const string DetailsUserImport = "DetailsUserImport"; - internal const string DetailsItem = "DetailsItem"; - internal const string DetailsItemLocation = "DetailsItemLocation"; - internal const string DetailsProperty = "DetailsProperty"; - internal const string DetailsTarget = "DetailsTarget"; - internal const string DetailsUsingTask = "DetailsUsingTask"; - internal const string Detailed = "Detailed"; - internal const string Diagnostic = "Diagnostic"; - internal const string DirectoryExistError = "DirectoryExistError"; - internal const string EditorViewError = "EditorViewError"; - internal const string EmbeddedResource = "EmbeddedResource"; - internal const string Error = "Error"; - internal const string ErrorInvalidFileName = "ErrorInvalidFileName"; - internal const string ErrorInvalidProjectName = "ErrorInvalidProjectName"; - internal const string ErrorReferenceCouldNotBeAdded = "ErrorReferenceCouldNotBeAdded"; - internal const string ErrorMsBuildRegistration = "ErrorMsBuildRegistration"; - internal const string ErrorSaving = "ErrorSaving"; - internal const string Exe = "Exe"; - internal const string ExpectedObjectOfType = "ExpectedObjectOfType"; - internal const string FailedToGetService = "FailedToGetService"; - internal const string FailedToRetrieveProperties = "FailedToRetrieveProperties"; - internal const string FileNameCannotContainALeadingPeriod = "FileNameCannotContainALeadingPeriod"; - internal const string FileCannotBeRenamedToAnExistingFile = "FileCannotBeRenamedToAnExistingFile"; - internal const string FileAlreadyExistsAndCannotBeRenamed = "FileAlreadyExistsAndCannotBeRenamed"; - internal const string FileAlreadyExists = "FileAlreadyExists"; - internal const string FileAlreadyExistsCaption = "FileAlreadyExistsCaption"; - internal const string FileAlreadyInProject = "FileAlreadyInProject"; - internal const string FileAlreadyInProjectCaption = "FileAlreadyInProjectCaption"; - internal const string FileCopyError = "FileCopyError"; - internal const string FileName = "FileName"; - internal const string FileNameDescription = "FileNameDescription"; - internal const string FileOrFolderAlreadyExists = "FileOrFolderAlreadyExists"; - internal const string FileOrFolderCannotBeFound = "FileOrFolderCannotBeFound"; - internal const string FileProperties = "FileProperties"; - internal const string FolderName = "FolderName"; - internal const string FolderNameDescription = "FolderNameDescription"; - internal const string FolderProperties = "FolderProperties"; - internal const string FullPath = "FullPath"; - internal const string FullPathDescription = "FullPathDescription"; - internal const string ItemDoesNotExistInProjectDirectory = "ItemDoesNotExistInProjectDirectory"; - internal const string InvalidAutomationObject = "InvalidAutomationObject"; - internal const string InvalidLoggerType = "InvalidLoggerType"; - internal const string InvalidParameter = "InvalidParameter"; - internal const string Library = "Library"; - internal const string LinkedItemsAreNotSupported = "LinkedItemsAreNotSupported"; - internal const string Minimal = "Minimal"; - internal const string Misc = "Misc"; - internal const string None = "None"; - internal const string Normal = "Normal"; - internal const string NestedProjectFailedToReload = "NestedProjectFailedToReload"; - internal const string OutputPath = "OutputPath"; - internal const string OutputPathDescription = "OutputPathDescription"; - internal const string PasteFailed = "PasteFailed"; - internal const string ParameterMustBeAValidGuid = "ParameterMustBeAValidGuid"; - internal const string ParameterMustBeAValidItemId = "ParameterMustBeAValidItemId"; - internal const string ParameterCannotBeNullOrEmpty = "ParameterCannotBeNullOrEmpty"; - internal const string PathTooLong = "PathTooLong"; - internal const string ProjectContainsCircularReferences = "ProjectContainsCircularReferences"; - internal const string Program = "Program"; - internal const string Project = "Project"; - internal const string ProjectFile = "ProjectFile"; - internal const string ProjectFileDescription = "ProjectFileDescription"; - internal const string ProjectFolder = "ProjectFolder"; - internal const string ProjectFolderDescription = "ProjectFolderDescription"; - internal const string ProjectProperties = "ProjectProperties"; - internal const string Quiet = "Quiet"; - internal const string QueryReloadNestedProject = "QueryReloadNestedProject"; - internal const string ReferenceAlreadyExists = "ReferenceAlreadyExists"; - internal const string ReferencesNodeName = "ReferencesNodeName"; - internal const string ReferenceProperties = "ReferenceProperties"; - internal const string RefName = "RefName"; - internal const string RefNameDescription = "RefNameDescription"; - internal const string RenameFolder = "RenameFolder"; - internal const string RTL = "RTL"; - internal const string SaveCaption = "SaveCaption"; - internal const string SaveModifiedDocuments = "SaveModifiedDocuments"; - internal const string SaveOfProjectFileOutsideCurrentDirectory = "SaveOfProjectFileOutsideCurrentDirectory"; - internal const string StandardEditorViewError = "StandardEditorViewError"; - internal const string Settings = "Settings"; - internal const string URL = "URL"; - internal const string UseOfDeletedItemError = "UseOfDeletedItemError"; - internal const string Warning = "Warning"; - internal const string WinExe = "WinExe"; - internal const string CannotLoadUnknownTargetFrameworkProject = "CannotLoadUnknownTargetFrameworkProject"; - internal const string ReloadPromptOnTargetFxChanged = "ReloadPromptOnTargetFxChanged"; - internal const string ReloadPromptOnTargetFxChangedCaption = "ReloadPromptOnTargetFxChangedCaption"; - - static SR loader; - ResourceManager resources; - - private static Object s_InternalSyncObject; - private static Object InternalSyncObject - { - get - { - if(s_InternalSyncObject == null) - { - Object o = new Object(); - Interlocked.CompareExchange(ref s_InternalSyncObject, o, null); - } - return s_InternalSyncObject; - } - } - - internal SR() - { - resources = new System.Resources.ResourceManager("Microsoft.VisualStudio.Project", this.GetType().Assembly); - } - - private static SR GetLoader() - { - if(loader == null) - { - lock(InternalSyncObject) - { - if(loader == null) - { - loader = new SR(); - } - } - } - - return loader; - } - - private static CultureInfo Culture - { - get { return null/*use ResourceManager default, CultureInfo.CurrentUICulture*/; } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - public static ResourceManager Resources - { - get - { - return GetLoader().resources; - } - } - - public static string GetString(string name, params object[] args) - { - SR sys = GetLoader(); - if(sys == null) - return null; - string res = sys.resources.GetString(name, SR.Culture); - - if(args != null && args.Length > 0) - { - return String.Format(CultureInfo.CurrentCulture, res, args); - } - else - { - return res; - } - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - public static string GetString(string name) - { - SR sys = GetLoader(); - if(sys == null) - return null; - return sys.resources.GetString(name, SR.Culture); - } - - public static string GetString(string name, CultureInfo culture) - { - SR sys = GetLoader(); - if(sys == null) - return null; - return sys.resources.GetString(name, culture); - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - public static object GetObject(string name) - { - SR sys = GetLoader(); - if(sys == null) - return null; - return sys.resources.GetObject(name, SR.Culture); - } - } -} diff --git a/source/Archive/MPF/12.0/VisualStudio.Project.resx b/source/Archive/MPF/12.0/VisualStudio.Project.resx deleted file mode 100644 index 0baccdebf8..0000000000 --- a/source/Archive/MPF/12.0/VisualStudio.Project.resx +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Failed to add file '{0}' to project as project is null. - - - Advanced - Project Property Page Caption - - - A reference to component '{0}' cannot be added. A reference to the component already exists in the project. - ReferenceAlreadyExists error message - - - Could not load attribute '{0}' from project file '{1}'. - - - Build Action - Project Build Property Name - - - How the file relates to the build and deployment process - Project Build Property Description - - - Verbosity - - - Specify how much information is included in the build output - - - ECMA-335 CLI compatible framework (location must be provided) - Target platform drop down option - - - Compile - Build Action - drop down option - - - If you change a file name extension, the file may become unusable. Are you sure you want to change it? - - - A file with name '{0}' already exists and is open in an editor. Please give a unique name to the item you are adding, or delete the existing item first. - - - Cannot save '{0}' as it is not open in the editor. - - - Content - Build Action - drop down option - - - Copy Local - File property - - - Indicates whether the reference will be copied to the output directory. - - - Embed Interop Types - - - Whether to include the COM interface definitions directly in the compiled assembly. - - - Detailed - - - Diagnostic - - - Directory already exists - - - Error opening specified view '{0}' using editor '{1}' - - - Embedded Resource - Build Action - drop down option - - - error - - - Files and folders cannot be: -- Empty strings -- System reserved names, including 'CON', 'AUX', PRN', 'COM1' or 'LPT2' -- contain only '.' -- have any of the following characters: / ? : & \ * " < > | # % - - - The name you provided is not a valid project name. - - - MSBuild path not found in registry. Please reinstall to fix the problem. - - - Error Saving File - - - Console Application - - - Expecting object of type {0}. - - - Failed to retrieve MSBuild property {0} from the project file. - The exception message thrown when getting a property from msbuild fails. - - - A file with the same name '{0}' already exists. Do you want to overwrite it? - - - A file with the same name '{0}' already exists. - - - Destination File Exists - - - A file of this name is already part of the project. Do you want to overwrite it? - - - Destination File Exists - - - A file or folder with the name '{0}' already exists on disk at this location. Please choose another name. - - - Error Copying File - - - File Name - - - File and folder names cannot contain a leading period. - - - The name of the file or folder - - - Folder Name - - - Name of this folder - - - Full Path - - - Location of the file - - - The item '{0}' does not exist in the project directory. It may have been moved, renamed or deleted. - - - Cannot save '{0}' outside the project directory. Linked items are not supported. - - - Class Library - - - Minimal - - - Misc - - - None - - - Normal - - - Item is not available or corrupted and thus cannot be pasted. - - - Program - - - Project - - - A reference to library '{0}' cannot be added. Adding this project as a reference would cause a circular dependency. - - - Project File - - - The name of the file containing build, configuration, and other information about the project. - - - Project Folder - - - The absolute location of the project. - - - Quiet - - - (Name) - - - References - - - Display name of the reference - - - Rename directory failed. {0} - - - RTL_False - - - Save? - - - Do you want to save modified documents? - - - The project file can only be saved into the project location '{0}'. - - - Error opening specified view '{0}' using standard editor. - - - URL - - - You are trying to use an item that has already been deleted or that does not exist. - - - Microsoft .NET Framework v1.0 - - - Microsoft .NET Framework v1.1 - - - Microsoft .NET Framework v2.0 - - - warning - - - Windows Application - - - Add Reference - - - Automation object invalid. - - - The command you are attempting cannot be completed because the file '{0}' that must be modified cannot be changed. If the file is under source control, you may want to check it out; if the file is read-only on disk, you may want to change its attributes. - MsgBox - - - Parameter must be a valid guid. - Error message in the ArgumentException for a parameter that is not a valid guid. - - - Invalid logger type\nExpected: {0}\nReceived: {1} - Error message thrown for when an invalid logger type is set. - - - InvalidParameter - Generic error message for invalid parameters. - - - ParameterCannotBeNullOEmpty - Error message for string parameters that cannot be null or empty. - - - Parameter must be a valid item identifier. - Error message thrown when an invalid item id is retrieved. - - - File Properties - - - Folder Properties - - - Project Properties - - - Reference Properties - - - A file or folder with the name '{0}' already exists on disk at this location. Please choose another name. - - - Build - - - Output Path - - - The path to the primary output - - - The complete path to '{0}' exceeds the maximum number of characters permitted by the file system. - - - Custom Tool - - - Specifies the tool that transforms a file at design time and places the output of that transformation into another file. For example, a dataset (.xsd) file comes with a default custom tool. - - - Custom Tool Namespace - - - The namespace into which the output of the custom tool is placed. - - - Primary Output - - - Content Files - - - Documentation Files - - - Localized Resources - - - Source Files - - - Debug Symbols - - - XML Serialization Assemblies - - - Contains the DLL or EXE built by the project. - - - Contains all content files in the project. - - - Contains the XML Documentation files for the project. - - - Contains the satellite assemblies for each culture's resources. - - - Contains all source files in the project. - - - Contains the debugging files for the project. - - - Contains the XML serialization assemblies for the project. - - - The project file '{0}' has been modified outside of Visual Studio. Do you want to reload the project? - - - The nested project has failed to reload. - - - The item '{0}' cannot be found on disk, either because it has been renamed, deleted, or moved to a new location. - - - A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - - - An 'Import' of the file '{1}' was found in the project file '{0}'. This file is not registered as a safe file to import, and could contain targets and tasks that are harmful. If this imported file is indeed considered safe, then it can be registered by writing to the registry key {2}. - - - An 'Import' of the file '{1}' was found in the user project file '{0}'. All imports in user project files are considered unsafe. - - - One or more items named '{1}' were found in the project file '{0}'. These items normally should not be specified in the project file. They can change the way targets and tasks are executed during project load, and this could have harmful effects. - - - A property named '{1}' was found in the project file '{0}'. This property normally should not be specified in the project file. Its value can change the way targets and tasks are executed during project load, and this could have harmful effects. - - - A 'UsingTask' tag which registers the '{1}' task was found in the project file '{0}'. 'UsingTask' tags in the project file take precedence over those in the imported .TARGETS files, and therefore could be used to execute arbitrary code during an otherwise unmodified build process. - - - A 'Target' named '{1}' was found in the project file '{0}'. The tasks within this target could contain arbitrary code and may get executed as soon as the project is loaded in the IDE. - - - An item referring to the file '{1}' was found in the project file '{0}'. Since this file is located within a system directory, root directory, or network share, it could be harmful to write to this file. - - - The project location is not trusted:{0}{0}{1}{0}{0}Running the application may result in security exceptions when it {0}attempts to perform actions which require full trust.{0}{0}Click OK to ignore and continue. - - - Exception was thrown during BuildBegin event\n{0} - - - Settings - - - Microsoft .NET Framework v3.0 - - - Microsoft .NET Framework v3.5 - - - Microsoft .NET Framework v4.0 - - - The project '{0}' is targeting '{1}'; however, the target framework is not installed on the machine. - - - Changing the Target Framework requires that the current project be closed and then reopened. -Any unsaved changes within the project will be automatically saved. - -Changing Target Framework may require manual modification of project files in order to build. - -Are you sure you want to change the Target Framework for this project? - - - Target Framework Change - - \ No newline at end of file diff --git a/source/Archive/MPF/12.0/VsCommands.cs b/source/Archive/MPF/12.0/VsCommands.cs deleted file mode 100644 index fb5fa7c507..0000000000 --- a/source/Archive/MPF/12.0/VsCommands.cs +++ /dev/null @@ -1,140 +0,0 @@ -/******************************************************************************************** - -Copyright (c) Microsoft Corporation -All rights reserved. - -Microsoft Public License: - -This license governs use of the accompanying software. If you use the software, you -accept this license. If you do not accept the license, do not use the software. - -1. Definitions -The terms "reproduce," "reproduction," "derivative works," and "distribution" have the -same meaning here as under U.S. copyright law. -A "contribution" is the original software, or any additions or changes to the software. -A "contributor" is any person that distributes its contribution under this license. -"Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights -(A) Copyright Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free copyright license to reproduce its contribution, prepare derivative works of -its contribution, and distribute its contribution or any derivative works that you create. -(B) Patent Grant- Subject to the terms of this license, including the license conditions -and limitations in section 3, each contributor grants you a non-exclusive, worldwide, -royalty-free license under its licensed patents to make, have made, use, sell, offer for -sale, import, and/or otherwise dispose of its contribution in the software or derivative -works of the contribution in the software. - -3. Conditions and Limitations -(A) No Trademark License- This license does not grant you rights to use any contributors' -name, logo, or trademarks. -(B) If you bring a patent claim against any contributor over patents that you claim are -infringed by the software, your patent license from such contributor to the software ends -automatically. -(C) If you distribute any portion of the software, you must retain all copyright, patent, -trademark, and attribution notices that are present in the software. -(D) If you distribute any portion of the software in source code form, you may do so only -under this license by including a complete copy of this license with your distribution. -If you distribute any portion of the software in compiled or object code form, you may only -do so under a license that complies with this license. -(E) The software is licensed "as-is." You bear the risk of using it. The contributors give -no express warranties, guarantees or conditions. You may have additional consumer rights -under your local laws which this license cannot change. To the extent permitted under your -local laws, the contributors exclude the implied warranties of merchantability, fitness for -a particular purpose and non-infringement. - -********************************************************************************************/ - -using System; -using System.Diagnostics.CodeAnalysis; - -namespace Microsoft.VisualStudio.Project -{ - /// - /// Defines menu commands guids and menu command id's - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1053:StaticHolderTypesShouldNotHaveConstructors"), SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "Vs")] - public class VsMenus - { - // menu command guids. - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - public static Guid guidStandardCommandSet97 = new Guid("5efc7975-14bc-11cf-9b2b-00aa00573819"); - - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - public static Guid guidStandardCommandSet2K = new Guid("1496A755-94DE-11D0-8C3F-00C04FC2AAE2"); - - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Pkg")] - public static Guid guidVsVbaPkg = new Guid(0xa659f1b3, 0xad34, 0x11d1, 0xab, 0xad, 0x0, 0x80, 0xc7, 0xb8, 0x9c, 0x95); - - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - public static Guid guidSHLMainMenu = new Guid(0xd309f791, 0x903f, 0x11d0, 0x9e, 0xfc, 0x00, 0xa0, 0xc9, 0x11, 0x00, 0x4f); - - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - public static Guid guidVSUISet = new Guid("60481700-078b-11d1-aaf8-00a0c9055a90"); - - [SuppressMessage("Microsoft.Usage", "CA2211:NonConstantFieldsShouldNotBeVisible")] - [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Cmds")] - public static Guid guidVsUIHierarchyWindowCmds = new Guid("60481700-078B-11D1-AAF8-00A0C9055A90"); - - // Special Menus. - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CODEWIN")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_CODEWIN = 0x040D; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "ITEMNODE")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_ITEMNODE = 0x0430; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "PROJNODE")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_PROJNODE = 0x0402; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "REFERENCEROOT")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_REFERENCEROOT = 0x0450; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "REFERENCE")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_REFERENCE = 0x0451; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "FOLDERNODE")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_FOLDERNODE = 0x0431; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "NOCOMMANDS")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_NOCOMMANDS = 0x041A; - - public const int VSCmdOptQueryParameterList = 1; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "MULTIITEM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XPROJ")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_XPROJ_MULTIITEM = 0x0419; - - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "PROJITEM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "IDM")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "CTXT")] - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "XPROJ")] - [SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")] - public const int IDM_VS_CTXT_XPROJ_PROJITEM = 0x0417; - } -} diff --git a/source/Archive/MPF/12.0/WebProjectBase.Files b/source/Archive/MPF/12.0/WebProjectBase.Files deleted file mode 100644 index e011942e46..0000000000 --- a/source/Archive/MPF/12.0/WebProjectBase.Files +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - ProjectBase\Web\CodeBehindCodeGenerator.cs - true - - - ProjectBase\Web\FieldData.cs - true - - - ProjectBase\Web\LockedDocData.cs - true - - - ProjectBase\Web\VsHierarchyItem.cs - true - - - ProjectBase\Web\WAUtilities.cs - true - - - - \ No newline at end of file diff --git a/source/Archive/Old System Plugs/BooleanImpl.cs b/source/Archive/Old System Plugs/BooleanImpl.cs deleted file mode 100644 index 01aa8992ce..0000000000 --- a/source/Archive/Old System Plugs/BooleanImpl.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace Cosmos.System.Plugs.System -{ - //[Plug(Target = typeof(bool))] - public static class BooleanImpl - { - //NOTE; Not used any more?? - //public static string ToString(ref Boolean aThis) - //{ - // if (aThis) - // { - // return "true"; - // } - // else - // { - // return "false"; - // } - //} - - public static bool Parse(string aBoolText) - { - if (aBoolText == null) - { - throw new ArgumentNullException("aBoolText"); - } - - Boolean xResult = false; - if (!Boolean.TryParse(aBoolText, out xResult)) - { - throw new FormatException("String was not recognized as a valid Boolean."); - } - return xResult; - } - - public static bool TryParse(string aBoolText, out Boolean aResult) - { - aResult = false; - - //Currently .Equals(string, StringComparison) does not work, so only exactly "True" and "False" work. Not "true", "tRuE" etc. - if ("True".Equals(aBoolText, StringComparison.OrdinalIgnoreCase)) - { - aResult = true; - return true; - } - else if ("False".Equals(aBoolText, StringComparison.OrdinalIgnoreCase)) - { - aResult = false; - return true; - } - - return false; - } - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/CharImpl.cs b/source/Archive/Old System Plugs/CharImpl.cs deleted file mode 100644 index b5d1ba65a9..0000000000 --- a/source/Archive/Old System Plugs/CharImpl.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(Target = typeof(char))] - public static class CharImpl - { - public static void Cctor() - { - } - - public static bool IsDigit(char aChar) - { - return (aChar >= '0' && aChar <= '9'); - } - - public static bool IsDigit(string aString, int aIndex) - { - if (aString == null) - { - throw new ArgumentNullException("aString"); - } - - if (((uint)aIndex) >= ((uint)aString.Length)) - { - throw new ArgumentOutOfRangeException("aIndex"); - } - - char c = aString[aIndex]; - return (c >= '0' && c <= '9'); - } - - public static string ToString(ref char aThis) - { - char[] xResult = new char[1]; - xResult[0] = aThis; - return new string(xResult); - } - - public static bool Equals(ref char aThis, char that) - { - return aThis == that; - } - - public static char ToUpper(char aThis) - { - // todo: properly implement Char.ToUpper() - return aThis; - } - - public static bool IsWhiteSpace(char aChar) - { - return aChar == ' ' || aChar == '\t'; - } - } -} diff --git a/source/Archive/Old System Plugs/Collections/Generic/EqualityComparerImpl.cs b/source/Archive/Old System Plugs/Collections/Generic/EqualityComparerImpl.cs deleted file mode 100644 index 1660ed362a..0000000000 --- a/source/Archive/Old System Plugs/Collections/Generic/EqualityComparerImpl.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Collections.Generic -{ - [Plug(Target = typeof(EqualityComparer<>))] - public static class EqualityComparerImpl - { - public static EqualityComparer CreateComparer() - { - - throw new Exception("Create comparer not yet implemented!"); - } - } -} diff --git a/source/Archive/Old System Plugs/DictionaryImpl.cs b/source/Archive/Old System Plugs/DictionaryImpl.cs deleted file mode 100644 index 8f1b872514..0000000000 --- a/source/Archive/Old System Plugs/DictionaryImpl.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -using System.Collections.Generic; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(Target = typeof(Dictionary))] - public static class DictionaryImpl - { - - public static void Ctor(Dictionary aThis, int capacity, IEqualityComparer comparer) - { - if (capacity != 0) - { - throw new Exception("Capacity != 0 not supported yet!"); - } - - } - - } -} diff --git a/source/Archive/Old System Plugs/Drawing/ColorImpl.cs b/source/Archive/Old System Plugs/Drawing/ColorImpl.cs deleted file mode 100644 index 9e6c5dc7d3..0000000000 --- a/source/Archive/Old System Plugs/Drawing/ColorImpl.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Drawing; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Drawing -{ - [Plug(Target = typeof (Color))] - public static class ColorImpl - { - public static string ToString(ref Color aThis) - { - - return "System.Drawing.Color.ToString()"; - /* - StringBuilder builder = new StringBuilder(0x20); - builder.Append("System.Drawing.Color"); - builder.Append(" ["); - if ((c.state & c.StateNameValid) != 0) - { - builder.Append(this.Name); - } - else if ((this.state & StateKnownColorValid) != 0) - { - builder.Append(this.Name); - } - else if ((this.state & StateValueMask) != 0) - { - builder.Append("A="); - builder.Append(this.A); - builder.Append(", R="); - builder.Append(this.R); - builder.Append(", G="); - builder.Append(this.G); - builder.Append(", B="); - builder.Append(this.B); - } - else - { - builder.Append("Empty"); - } - builder.Append("]"); - return builder.ToString(); - //* */ - } - - public static long get_Value(ref Color aThis) - { - return 0; - } - - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/Drawing/SRImpl.cs b/source/Archive/Old System Plugs/Drawing/SRImpl.cs deleted file mode 100644 index 906181e64e..0000000000 --- a/source/Archive/Old System Plugs/Drawing/SRImpl.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Drawing -{ - [Plug(TargetName = "System.Drawing.SR, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", IsMicrosoftdotNETOnly = true)] - public static class SRImpl - { - public static string GetString(string aString) - { - return aString; - } - - public static string GetString(string aString, params object[] aArgs) - { - return aString; - } - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/Globalization/CultureInfoImpl.cs b/source/Archive/Old System Plugs/Globalization/CultureInfoImpl.cs deleted file mode 100644 index c41a339522..0000000000 --- a/source/Archive/Old System Plugs/Globalization/CultureInfoImpl.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Globalization; -using Cosmos.Common; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Globalization -{ - [Plug(Target = typeof(global::System.Globalization.CultureInfo))] - public static class CultureInfoPlug - { - public static int GetHashCode(global::System.Globalization.CultureInfo aThis) - { - throw new NotImplementedException("CultureInfo.GetHashCode()"); - } - } -} diff --git a/source/Archive/Old System Plugs/IO/DirectoryInfoImpl.cs b/source/Archive/Old System Plugs/IO/DirectoryInfoImpl.cs deleted file mode 100644 index e693c4972f..0000000000 --- a/source/Archive/Old System Plugs/IO/DirectoryInfoImpl.cs +++ /dev/null @@ -1,315 +0,0 @@ -//#define COSMOSDEBUG - -using System; -using System.Collections.Generic; -using System.IO; - -using Cosmos.Debug.Kernel; -using Cosmos.IL2CPU.Plugs; -using Cosmos.System.FileSystem; -using Cosmos.System.FileSystem.Listing; -using Cosmos.System.FileSystem.VFS; - -namespace Cosmos.System.Plugs.System.IO -{ - [Plug(Target = typeof(DirectoryInfo))] - [PlugField(FieldId = "$$Storage$$", FieldType = typeof(DirectoryEntry))] - [PlugField(FieldId = "$$FullPath$$", FieldType = typeof(string))] - [PlugField(FieldId = "$$Name$$", FieldType = typeof(string))] - public static class DirectoryInfoImpl - { - public static void Ctor( - DirectoryInfo aThis, - string aPath, - [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage, - [FieldAccess(Name = "$$FullPath$$")] ref string aFullPath, - [FieldAccess(Name = "$$Name$$")] ref string aName) - { - Global.mFileSystemDebugger.SendInternal("DirectoryInfo.ctor:"); - - if (string.IsNullOrEmpty(aPath)) - { - throw new ArgumentNullException(nameof(aPath)); - } - - Global.mFileSystemDebugger.SendInternal("aPath ="); - Global.mFileSystemDebugger.SendInternal(aPath); - - aStorage = VFSManager.GetDirectory(aPath); - aFullPath = aPath; - aName = Path.GetFileName(aPath); - } - - public static string get_Name(DirectoryInfo aThis) - { - Global.mFileSystemDebugger.SendInternal($"DirectoryInfo.get_Name : Name = {aThis}"); - return aThis.ToString(); - } - - public static DirectoryInfo get_Parent(DirectoryInfo aThis, [FieldAccess(Name = "$$FullPath")] ref string aFullPath) - { - Global.mFileSystemDebugger.SendInternal("DirectoryInfo.get_Parent"); - var xParent = Directory.GetParent(aFullPath); - return xParent; - } - - public static DirectoryInfo get_Root(DirectoryInfo aThis, [FieldAccess(Name = "$$FullPath")] ref string aFullPath) - { - Global.mFileSystemDebugger.SendInternal("DirectoryInfo.get_Root"); - string xRootPath = Path.GetPathRoot(aFullPath); - var xRoot = new DirectoryInfo(xRootPath); - return xRoot; - } - - public static bool get_Exists(DirectoryInfo aThis, [FieldAccess(Name = "$$FullPath$$")] ref string aFullPath) - { - Global.mFileSystemDebugger.SendInternal("DirectoryInfo.get_Exists"); - return VFSManager.DirectoryExists(aFullPath); - } - - public static FileInfo[] GetFiles(DirectoryInfo aThis, string searchPattern, [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - if (searchPattern == null) - { - throw new ArgumentNullException("searchPattern"); - } - - throw new NotImplementedException(); - } - - public static FileInfo[] GetFiles(DirectoryInfo aThis, string searchPattern, SearchOption searchOption, [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - if (searchPattern == null) - { - throw new ArgumentNullException("searchPattern"); - } - if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - { - throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - } - - throw new NotImplementedException(); - } - - public static FileInfo[] GetFiles(DirectoryInfo aThis, [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - throw new NotImplementedException(); - } - - public static DirectoryInfo CreateSubdirectory(DirectoryInfo aThis, string path, [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - if (path == null) - { - throw new ArgumentNullException("path"); - } - - throw new NotImplementedException(); - } - - public static string ToString([FieldAccess(Name = "$$Name$$")] ref string aName) - { - return aName; - } - - //public static void Create() - //{ - - //} - - //public static DirectoryInfo[] GetDirectories() - //{ - // throw new NotImplementedException(); - //} - - //public static FileSystemInfo[] GetFileSystemInfos(String searchPattern) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - - // throw new NotImplementedException(); - //} - - //public static FileSystemInfo[] GetFileSystemInfos(String searchPattern, SearchOption searchOption) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - // if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - // { - // throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - // } - - // throw new NotImplementedException(); - //} - - //public static FileSystemInfo[] GetFileSystemInfos() - //{ - // throw new NotImplementedException(); - //} - - //public static DirectoryInfo[] GetDirectories(String searchPattern) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - - // throw new NotImplementedException(); - //} - - //public static DirectoryInfo[] GetDirectories(String searchPattern, SearchOption searchOption) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - // if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - // { - // throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateDirectories() - //{ - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateDirectories(String searchPattern) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateDirectories(String searchPattern, SearchOption searchOption) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - // if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - // { - // throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFiles() - //{ - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFiles(String searchPattern) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFiles(String searchPattern, SearchOption searchOption) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - // if ((searchOption != SearchOption.TopDirectoryOnly) && (searchOption != SearchOption.AllDirectories)) - // { - // throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFileSystemInfos() - //{ - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFileSystemInfos(String searchPattern) - //{ - // if (searchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - - // throw new NotImplementedException(); - //} - - //public static IEnumerable EnumerateFileSystemInfos(string aSearchPattern, SearchOption aSearchOption) - //{ - // if (aSearchPattern == null) - // { - // throw new ArgumentNullException("searchPattern"); - // } - // if ((aSearchOption != SearchOption.TopDirectoryOnly) && (aSearchOption != SearchOption.AllDirectories)) - // { - // throw new ArgumentOutOfRangeException("searchOption", "Argument is out of range."); - // } - - // throw new NotImplementedException(); - //} - - //public static void MoveTo(String destDirName) - //{ - // if (destDirName == null) - // { - // throw new ArgumentNullException("destDirName"); - // } - // if (destDirName.Length == 0) - // { - // throw new ArgumentException(Environment.GetResourceString("Argument_EmptyFileName"), "destDirName"); - // } - - // String fullDestDirName = Path.GetFullPathInternal(destDirName); - // if (!fullDestDirName.EndsWith(Path.DirectorySeparatorChar)) - // fullDestDirName = fullDestDirName + Path.DirectorySeparatorChar; - - // String fullSourcePath; - // if (FullPath.EndsWith(Path.DirectorySeparatorChar)) - // fullSourcePath = FullPath; - // else - // fullSourcePath = FullPath + Path.DirectorySeparatorChar; - - // if (String.Compare(fullSourcePath, fullDestDirName, StringComparison.OrdinalIgnoreCase) == 0) - // throw new IOException(Environment.GetResourceString("IO.IO_SourceDestMustBeDifferent")); - - // String sourceRoot = Path.GetPathRoot(fullSourcePath); - // String destinationRoot = Path.GetPathRoot(fullDestDirName); - - // if (String.Compare(sourceRoot, destinationRoot, StringComparison.OrdinalIgnoreCase) != 0) - // throw new IOException(Environment.GetResourceString("IO.IO_SourceDestMustHaveSameRoot")); - - // // TODO: Do the move - - - // FullPath = fullDestDirName; - // OriginalPath = destDirName; - // DisplayPath = GetDisplayName(OriginalPath, FullPath); - //} - - //public static void Delete() - //{ - // throw new NotImplementedException(); - // //Directory.Delete(FullPath, OriginalPath, false, true); - //} - - //public static void Delete(bool recursive) - //{ - // throw new NotImplementedException(); - // //Directory.Delete(FullPath, OriginalPath, recursive, true); - //} - - } -} diff --git a/source/Archive/Old System Plugs/IO/DriveInfoImpl.cs b/source/Archive/Old System Plugs/IO/DriveInfoImpl.cs deleted file mode 100644 index ae594e85b5..0000000000 --- a/source/Archive/Old System Plugs/IO/DriveInfoImpl.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.IO; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.IO -{ - [Plug(Target = typeof(DriveInfo))] - public static class DriveInfoImpl - { - [PlugMethod(Signature = "System_Void__System_IO_DriveInfo__ctor_System_String_")] - public static void Ctor(DriveInfo aThis, string aDriveName) - { - - } - - public static string get_DriveFormat(ref DriveInfo aThis) - { - return "DriveFormat not implemented"; - } - } -} diff --git a/source/Archive/Old System Plugs/IO/ErrorImpl.cs b/source/Archive/Old System Plugs/IO/ErrorImpl.cs deleted file mode 100644 index 9410133c5b..0000000000 --- a/source/Archive/Old System Plugs/IO/ErrorImpl.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.IO -{ - [Plug(TargetName = "System.IO.__Error")] - public static class ErrorImpl - { - public static void WinIOError(int errorCode, string maybeFullPath) - { - throw new Exception("IO error."); - } - } -} diff --git a/source/Archive/Old System Plugs/IO/FileInfoImpl.cs b/source/Archive/Old System Plugs/IO/FileInfoImpl.cs deleted file mode 100644 index 98ff0f59f7..0000000000 --- a/source/Archive/Old System Plugs/IO/FileInfoImpl.cs +++ /dev/null @@ -1,53 +0,0 @@ -using global::System.IO; - -using Cosmos.IL2CPU.Plugs; -using Cosmos.System.FileSystem.VFS; -using Cosmos.System.FileSystem.Listing; - -//using Directory = Cosmos.System.FileSystem.Listing.Directory; -//using File = Cosmos.System.FileSystem.Listing.File; - -namespace Cosmos.System.Plugs.System.IO -{ - - - [Plug(Target = typeof(FileInfo))] - [PlugField(FieldId = "$$Storage$$", FieldType = typeof(DirectoryEntry))] - public static class FileInfoImpl - { - //[PlugMethod(Signature = "System_Void__System_IO_FileInfo__ctor_System_String_")] - public static void Ctor(FileInfo aThis, [FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage, string aFile) - { - /* - //Determine if aFile is relative or absolute - string xFile; - if (aFile.IsRelativePath()) - xFile = Directory.GetCurrentDirectory() + aFile; - else - xFile = aFile; - - var xEntry = VFSManager.GetDirectory(xFile); - - if (xEntry is FileSystem.Listing.Directory) - { - aStorage = xEntry as FileSystem.Listing.Directory; - } - */ - } - - public static string get_Name([FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - return "Filename" + aStorage.mName; - } - - public static bool get_Exists([FieldAccess(Name = "$$Storage$$")] ref DirectoryEntry aStorage) - { - return VFSManager.FileExists(aStorage.mName); - } - - public static string ToString(FileInfo aThis) - { - return "FileInfo.ToString() not yet implemented!"; - } - } -} diff --git a/source/Archive/Old System Plugs/IO/FileSystemInfoImpl.cs b/source/Archive/Old System Plugs/IO/FileSystemInfoImpl.cs deleted file mode 100644 index ae7ff5db6f..0000000000 --- a/source/Archive/Old System Plugs/IO/FileSystemInfoImpl.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.IO; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.IO -{ - [Plug(Target = typeof(FileSystemInfo))] - public static class FileSystemInfoImpl - { - public static string get_FullName(FileSystemInfo aThis) - { - return "FullName not implemented yet in FileSystemInfo plug"; - } - } -} diff --git a/source/Archive/Old System Plugs/IO/StreamReaderImpl.cs b/source/Archive/Old System Plugs/IO/StreamReaderImpl.cs deleted file mode 100644 index eb4d48a3e4..0000000000 --- a/source/Archive/Old System Plugs/IO/StreamReaderImpl.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.IO -{ - //[Plug(Target = typeof(global::System.IO.StreamReader))] - //public static class StreamReaderImpl - //{ - // public static void CheckAsyncTaskInProgress(global::System.IO.StreamReader aThis) - // { - // // for now do nothing - // } - //} -} diff --git a/source/Archive/Old System Plugs/Mda.cs b/source/Archive/Old System Plugs/Mda.cs deleted file mode 100644 index d98818c795..0000000000 --- a/source/Archive/Old System Plugs/Mda.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(TargetName = "System.Mda, mscorlib")] - public static class Mda - { - public static bool IsStreamWriterBufferedDataLostEnabled() - { - return false; - } - - public static bool IsStreamWriterBufferedDataLostCaptureAllocatedCallStack() - { - return false; - } - } -} diff --git a/source/Archive/Old System Plugs/Net/IPAddressImpl.cs b/source/Archive/Old System Plugs/Net/IPAddressImpl.cs deleted file mode 100644 index 5949999da6..0000000000 --- a/source/Archive/Old System Plugs/Net/IPAddressImpl.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Net; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Net -{ - [Plug(Target = typeof(IPAddress))] - public static class IPAddressImpl - { - public static string ToString(IPAddress aThis) - { - return ""; - } - - // [PlugMethod(Signature = "System_Void__System_Net_IPAddress__cctor__")] - public static void CCtor() - { - // todo: implement - } - - public static int GetHashCode(IPAddress aThis) - { - throw new Exception("IPAddress.GetHashCode Not implemented"); - } - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/Net/SocketAddressImpl.cs b/source/Archive/Old System Plugs/Net/SocketAddressImpl.cs deleted file mode 100644 index 6f2b55089b..0000000000 --- a/source/Archive/Old System Plugs/Net/SocketAddressImpl.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Net; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Net -{ - [Plug(Target = typeof(SocketAddress))] - public static class SocketAddressImpl - { - public static string ToString(SocketAddress aThis) - { - return ""; - } - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/NumberImpl.cs b/source/Archive/Old System Plugs/NumberImpl.cs deleted file mode 100644 index 3964195a2b..0000000000 --- a/source/Archive/Old System Plugs/NumberImpl.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Globalization; - -using Cosmos.Common; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(TargetName = "System.Number")] - // not sure about FQN or not, also have a look at the param name - public static class NumberImpl - { - public static string FormatInt32(int aInt, string aStr, NumberFormatInfo aFormat) - { - return StringHelper.GetNumberString(aInt); - } - - public static string FormatDouble(double aInt, string aStr, NumberFormatInfo aFormat) - { - return "fix me in Cosmos.IL2CPU.IL.CustomImplementations.System.NumberImpl.FormatDouble"; - } - - public static string FormatInt64(long aValue, string aStr, NumberFormatInfo aFormat) - { - return "fix me in Cosmos.IL2CPU.IL.CustomImplementations.System.NumberImpl.FormatInt64"; - } - - public static string FormatUInt64(ulong aValue, string aStr, NumberFormatInfo aFormat) - { - return "fix me in Cosmos.IL2CPU.IL.CustomImplementations.System.NumberImpl.FormatUInt64"; - } - } -} diff --git a/source/Archive/Old System Plugs/Runtime/Compilerservices/runtimehelpersImpl.cs b/source/Archive/Old System Plugs/Runtime/Compilerservices/runtimehelpersImpl.cs deleted file mode 100644 index db4d6acb8b..0000000000 --- a/source/Archive/Old System Plugs/Runtime/Compilerservices/runtimehelpersImpl.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Cosmos.Common; -using Cosmos.IL2CPU.Plugs; - - -namespace Cosmos.System.Plugs.System.Runtime.Compilerservices -{ - - [Plug(Target = typeof(global::System.Runtime.CompilerServices.RuntimeHelpers))] - public static class runtimehelpersImpl - { - public static int GetHashCode(object o) - { - throw new NotImplementedException("runtimehelpersImpl.GetHashCode()"); - } - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/RuntimeTypeImpl.cs b/source/Archive/Old System Plugs/RuntimeTypeImpl.cs deleted file mode 100644 index 704955f360..0000000000 --- a/source/Archive/Old System Plugs/RuntimeTypeImpl.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(TargetName = "System.RuntimeType")] - public static class RuntimeTypePlug - { - public static string ToString(object aThis) - { - throw new NotImplementedException("RuntimeTypePlug.ToString()"); - } - - } - -} diff --git a/source/Archive/Old System Plugs/SRImpl.cs b/source/Archive/Old System Plugs/SRImpl.cs deleted file mode 100644 index 2e3d20e350..0000000000 --- a/source/Archive/Old System Plugs/SRImpl.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - [Plug(TargetName = "System.SR, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", IsMicrosoftdotNETOnly = true)] - public static class SRImpl - { - public static string GetString(string aString) - { - return aString; - } - - public static string GetString(string aString, params object[] aArgs) - { - return aString; - } - } -} diff --git a/source/Archive/Old System Plugs/Security/CodeAccessSecurityEngineImpl.cs b/source/Archive/Old System Plugs/Security/CodeAccessSecurityEngineImpl.cs deleted file mode 100644 index 5e24ebc75a..0000000000 --- a/source/Archive/Old System Plugs/Security/CodeAccessSecurityEngineImpl.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Security -{ - [Plug(TargetName = "System.Security.CodeAccessSecurityEngine, mscorlib", IsMicrosoftdotNETOnly = true)] - public class CodeAccessSecurityEngineImpl - { - - //TODO check if ref is linked right - public void Check(object demand, - [FieldType(Name = "System.Threading.StackCrawlMark, mscorlib")] ref AttributeTargets stackMark, - bool isPermSet) - { - // no implementation yet, before threading not needed - } - } -} diff --git a/source/Archive/Old System Plugs/Security/Cryptography/CryptoConfigImpl.cs b/source/Archive/Old System Plugs/Security/Cryptography/CryptoConfigImpl.cs deleted file mode 100644 index 36219243ab..0000000000 --- a/source/Archive/Old System Plugs/Security/Cryptography/CryptoConfigImpl.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Cosmos.IL2CPU.Plugs; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Cosmos.System.Plugs.System.Security.Cryptography -{ - [Plug(Target = typeof(global::System.Security.Cryptography.CryptoConfig))] - class CryptoConfigImpl - { - - /// - ///The stock .NET constructor for CryptoConfig deals with dictionaries we don't need. - /// - public static void CCtor() { - - } - - /// Indicates whether the runtime should enforce the policy to create only Federal Information Processing Standard (FIPS) certified algorithms. - /// true to enforce the policy; otherwise, false. - public static bool AllowOnlyFipsAlgorithms - { - get - { - return false; - } - } - - } -} diff --git a/source/Archive/Old System Plugs/Security/Cryptography/UtilsImpl.cs b/source/Archive/Old System Plugs/Security/Cryptography/UtilsImpl.cs deleted file mode 100644 index cd4c620157..0000000000 --- a/source/Archive/Old System Plugs/Security/Cryptography/UtilsImpl.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Security.Cryptography -{ - [Plug(TargetName = "System.Security.Cryptography.Utils", IsMicrosoftdotNETOnly = true)] - public static class UtilsImpl - { - //public static int get_FipsAlgorithmPolicy() { return 0; } - } -} diff --git a/source/Archive/Old System Plugs/Security/Permissions/FileIOPermissionImpl.cs b/source/Archive/Old System Plugs/Security/Permissions/FileIOPermissionImpl.cs deleted file mode 100644 index cadf52194a..0000000000 --- a/source/Archive/Old System Plugs/Security/Permissions/FileIOPermissionImpl.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Security.Permissions -{ - [Plug(Target = typeof(global::System.Security.Permissions.FileIOPermission))] - public static class FileIOPermissionImpl - { - public static void QuickDemand(global::System.Security.Permissions.FileIOPermissionAccess access, string fullPath, bool checkForDuplicates, bool needFullPath) - { - } - - public static global::System.Security.SecurityElement ToXml(global::System.Security.Permissions.FileIOPermission aThis) - { - return null; - } - - } - -} diff --git a/source/Archive/Old System Plugs/Security/SecurityElementImpl.cs b/source/Archive/Old System Plugs/Security/SecurityElementImpl.cs deleted file mode 100644 index 4c4a39801e..0000000000 --- a/source/Archive/Old System Plugs/Security/SecurityElementImpl.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Security -{ - [Plug(Target = typeof(global::System.Security.SecurityElement))] - public static class SecurityElementImpl - { - public static string ToString(global::System.Security.SecurityElement aThis) - { - return ""; - } - } - -} diff --git a/source/Archive/Old System Plugs/Text/ASCIIEncodingImpl.cs b/source/Archive/Old System Plugs/Text/ASCIIEncodingImpl.cs deleted file mode 100644 index 3c57b1a3de..0000000000 --- a/source/Archive/Old System Plugs/Text/ASCIIEncodingImpl.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Text { - [Plug(Target = typeof(ASCIIEncoding))] - public class ASCIIEncodingImpl { - - // TODO: remove this function - // old comment :Plug string.GetStringFromEncoding instead - /*public static string GetString(byte[] aBytes, int aIndex, int aCount) { - if (aBytes.Length == 0) { - return string.Empty; - } else { - return new string(Encoding.ASCII.GetChars(aBytes, aIndex, aCount)); - /*var xChars = new char[aBytes.Length]; - for (int i = 0; i < aBytes.Length; i++) { - xChars[i] = (char)aBytes[i]; - } - return new string(xChars); - } - }*/ - } -} \ No newline at end of file diff --git a/source/Archive/Old System Plugs/Text/DecoderFallbackImpl.cs b/source/Archive/Old System Plugs/Text/DecoderFallbackImpl.cs deleted file mode 100644 index a52a1321b3..0000000000 --- a/source/Archive/Old System Plugs/Text/DecoderFallbackImpl.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Text { - [Plug(Target = typeof(DecoderFallback))] - public static class DecoderFallbackImpl { - // See note in EncoderFallbackImpl - public static object get_InternalSyncObject() { - return new object(); - } - } -} diff --git a/source/Archive/Old System Plugs/Text/EncoderFallbackImpl.cs b/source/Archive/Old System Plugs/Text/EncoderFallbackImpl.cs deleted file mode 100644 index 96b6c59efc..0000000000 --- a/source/Archive/Old System Plugs/Text/EncoderFallbackImpl.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Text { - [Plug(Target = typeof(EncoderFallback))] - public static class EncoderFallbackImpl { - // Encoders use this, but we plug their methods anwyays so we just fill empty for now. - public static object get_InternalSyncObject() { - return new object(); - } - } -} diff --git a/source/Archive/Old System Plugs/Text/InternalDecoderBestFitFallbackBufferImpl.cs b/source/Archive/Old System Plugs/Text/InternalDecoderBestFitFallbackBufferImpl.cs deleted file mode 100644 index aa0dd448a8..0000000000 --- a/source/Archive/Old System Plugs/Text/InternalDecoderBestFitFallbackBufferImpl.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Text { - [Plug(TargetName = "System.Text.InternalDecoderBestFitFallbackBuffer")] - public static class InternalDecoderBestFitFallbackBufferImpl { - // See note in EncoderFallbackImpl - public static object get_InternalSyncObject() { - return new object(); - } - } -} diff --git a/source/Archive/Old System Plugs/Threading/MonitorImpl.cs b/source/Archive/Old System Plugs/Threading/MonitorImpl.cs deleted file mode 100644 index cb5fbdc9e3..0000000000 --- a/source/Archive/Old System Plugs/Threading/MonitorImpl.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System.Threading { - //TODO: We dont support threading at all, but a lot of .NET calls these - // and therefore interferes with us using them. Since we don't support threading - // currently we can just ignore them by creating empty plugs. - [Plug(Target = typeof(global::System.Threading.Monitor))] - public class MonitorImpl { - public static void Enter(object aObj) { - } - - public static void Exit(object aObj) { - } - - public static void ReliableEnter(object obj, ref bool tookLock) { - tookLock = true; - } - } -} diff --git a/source/Archive/Old System Plugs/WindowsInsiderPlugs.cs b/source/Archive/Old System Plugs/WindowsInsiderPlugs.cs deleted file mode 100644 index 742eb1e476..0000000000 --- a/source/Archive/Old System Plugs/WindowsInsiderPlugs.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.IO; -using Cosmos.IL2CPU.Plugs; - -namespace Cosmos.System.Plugs.System -{ - // plugs introduced for Windows Insider preview 14342. Needs reviewing and merged into other classes in case of RTM of the windows version. - [Plug(TargetName = "System.Security.CodeAccessSecurityEngine, mscorlib", IsMicrosoftdotNETOnly = true, IsOptional = true)] - public class CodeAccessSecurityEngineImpl - { - public static bool QuickCheckForAllDemands() - { - return false; - } - - public static void CCtor() - { - // - } - } - - [Plug(TargetName = "System.IO.LongPathHelper, mscorlib", IsMicrosoftdotNETOnly = true, IsOptional = true)] - public static class LongPathHelperImpl - { - public static string GetLongPathName(string path) - { - return path; - } - } - - [Plug(Target = typeof(Path))] - //[PlugField(FieldId = "System.Char[] System.IO.Path.InvalidPathCharsWithAdditionalChecks", FieldType = typeof(char[]))] - public static class PathImpl - { - public static string NewNormalizePath(string path, int length, bool check) - { - return path; - } - } - - [Plug(TargetName = "System.AppContextDefaultValues, mscorlib", IsOptional=true)] - public static class AppContextDefaultValuesImpl - { - public static void CCtor() - { - - } - - public static bool TryGetSwitchOverride(string key, ref bool value) - { - return false; - } - - public static void PopulateDefaultValues() - { - // - } - - } - - [Plug(TargetName = "System.AppContext, mscorlib", IsOptional = true)] - public static class AppContextImpl - { - public static bool TryGetSwitch(string key, ref bool value) - { - return false; - } - - public static void CCtor() - { - - } - } -} \ No newline at end of file diff --git a/source/Archive/VMWareLib/App.config b/source/Archive/VMWareLib/App.config deleted file mode 100644 index ce8c5b1468..0000000000 --- a/source/Archive/VMWareLib/App.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/source/Archive/VMWareLib/AssemblyInfo.cs b/source/Archive/VMWareLib/AssemblyInfo.cs deleted file mode 100644 index 94743130d6..0000000000 --- a/source/Archive/VMWareLib/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("VMWareLib")] -[assembly: AssemblyDescription("VMWareTasks Automation Library")] -[assembly: Guid("e102c7ef-224a-4a61-ba79-454ad6d92e97")] -[assembly: ComVisible(false)] diff --git a/source/Archive/VMWareLib/BuildNotes.html b/source/Archive/VMWareLib/BuildNotes.html deleted file mode 100644 index 5a2782c9bf..0000000000 --- a/source/Archive/VMWareLib/BuildNotes.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -

- VIX API

-

- Akward API with COM options, but only C examples provided by VMWare. Thus the - desire to use this class lib.

-

- VMRun.exe

-

- VMRun will let us stop VMWare but not close it. Not critical, but I already had - VMWareLib working by the time I discovered vmrun. VMWareLib adds a lot of extra - code, but in future we might do more with VMWare and it allows us more power - than VMRun.

-

- VMWareLib

-

- Original project used a brittle custom MS build project which had several - external dependencies. It has been stripped down to a single project that we - need and used here.

-

- Other notes:

- - - - \ No newline at end of file diff --git a/source/Archive/VMWareLib/GlobalAssemblyInfo.cs b/source/Archive/VMWareLib/GlobalAssemblyInfo.cs deleted file mode 100644 index b7a67bb6d5..0000000000 --- a/source/Archive/VMWareLib/GlobalAssemblyInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.5448 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyCompany("Vestris Inc.")] -[assembly: AssemblyProduct("VMWareTasks")] -[assembly: AssemblyCopyright("Copyright (c) 2008-2010 Daniel Doubrovkine, Vestris Inc.")] -[assembly: AssemblyTrademark("All Rights Reserved")] -[assembly: CLSCompliant(false)] -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyVersion("1.6.3950.0")] -[assembly: AssemblyFileVersion("1.6.3950.0")] - - diff --git a/source/Archive/VMWareLib/License.txt b/source/Archive/VMWareLib/License.txt deleted file mode 100644 index 6b9f4c2df0..0000000000 --- a/source/Archive/VMWareLib/License.txt +++ /dev/null @@ -1,18 +0,0 @@ -MIT License -Copyright (c) 2008-2010 Daniel Doubrovkine, Vestris Inc. -All Rights Reserved. -http://vmwaretasks.codeplex.com - -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 furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions -of the Software. - -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. diff --git a/source/Archive/VMWareLib/VMWareException.cs b/source/Archive/VMWareLib/VMWareException.cs deleted file mode 100644 index 1d5e1b089b..0000000000 --- a/source/Archive/VMWareLib/VMWareException.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A VMWare exception. Every VMWare operational failure is translated into - /// a . - /// - public class VMWareException : Exception - { - private ulong _errorCode = 0; - - /// - /// The original VMWare error code. - /// - public ulong ErrorCode - { - get - { - return _errorCode; - } - } - - /// - /// A VMWare exception with default error text in English-US. - /// - /// VMWare VixCOM.Constants error code. - public VMWareException(ulong code) - : this(code, new VixLib().GetErrorText(code, "en-US")) - { - } - - /// - /// A VMWare exception. - /// - /// VMWare VixCOM.Constants error code. - /// Error description. - public VMWareException(ulong code, string message) - : base(message) - { - _errorCode = code; - } - } -} diff --git a/source/Archive/VMWareLib/VMWareInterop.cs b/source/Archive/VMWareLib/VMWareInterop.cs deleted file mode 100644 index 3c2a130cca..0000000000 --- a/source/Archive/VMWareLib/VMWareInterop.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// Helper functions for VMWare interop. - /// - public abstract class VMWareInterop - { - /// - /// Default timeouts for VMWare operations. - /// - public static VMWareTimeouts Timeouts = new VMWareTimeouts(); - - /// - /// Checks whether an error indicates failure and throws an exception in that case. - /// - /// Error code. - public static void Check(ulong errCode) - { - if (new VixLib().ErrorIndicatesFailure(errCode)) - { - throw new VMWareException(errCode); - } - } - - /// - /// VMWare VIX date/time is expressed in UNIX EPOCH (number of seconds since January 1st, 1970). - /// Convert VIX date/time into .NET DateTime. - /// - /// Unix epoch date/time. - /// DateTime in .NET format. - public static DateTime FromUnixEpoch(long dt) - { - return new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(dt); - } - } -} diff --git a/source/Archive/VMWareLib/VMWareJob.cs b/source/Archive/VMWareLib/VMWareJob.cs deleted file mode 100644 index de3eaf50d1..0000000000 --- a/source/Archive/VMWareLib/VMWareJob.cs +++ /dev/null @@ -1,132 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A VixCOM job. - /// Implements synchronous execution of VixCOM tasks. - /// - public class VMWareJob : VMWareVixHandle - { - private VMWareJobCallback _callback; - - /// - /// A VMWare job created with a job completion callback. - /// - /// An instance of IJob. - /// Job completion callback. - public VMWareJob(IJob job, VMWareJobCallback callback) - : base(job) - { - _callback = callback; - // API-level errors aren't surfaced and the callback wait will never be set - bool completedImmediately = false; - VMWareInterop.Check(job.CheckCompletion(out completedImmediately)); - } - - /// - /// Wait for the job to complete, timeout. - /// - /// Timeout in seconds. - public void Wait(int timeoutInSeconds) - { - _callback.WaitForCompletion(timeoutInSeconds * 1000); - VMWareInterop.Check(_handle.WaitWithoutResults()); - } - - /// - /// Wait for the job to complete, return a result. - /// - /// Properties array. - /// Timeout in seconds. - /// Type of the property to return. - /// Job result. - public T Wait(object[] properties, int timeoutInSeconds) - { - _callback.WaitForCompletion(timeoutInSeconds * 1000); - return (T)Wait(properties); - } - - /// - /// Wait for the job to complete and enumerate results. - /// - /// Properties to yield. - /// Timeout in seconds. - /// A results enumerator. - public IEnumerable YieldWait(object[] properties, int timeoutInSeconds) - { - _callback.WaitForCompletion(timeoutInSeconds * 1000); - for (int i = 0; i < GetNumProperties((int)properties[0]); i++) - { - yield return GetNthProperties(i, properties); - } - } - - /// - /// Wait for the job to complete, return a result. - /// - /// Properties to yield. - /// Property index to yield. - /// Timeout in seconds. - /// Type of the property to return. - /// Job result. - public T Wait(object[] properties, int index, int timeoutInSeconds) - { - _callback.WaitForCompletion(timeoutInSeconds * 1000); - return (T)Wait(properties)[index]; - } - - /// - /// Wait for the job to complete, return a single result. - /// - /// Property id. - /// Timeout in seconds. - /// Type of property to return. - /// A single job result. - public T Wait(int propertyId, int timeoutInSeconds) - { - object[] properties = { propertyId }; - return Wait(properties, 0, timeoutInSeconds); - } - - /// - /// Wait for the job to complete, return a result. - /// - /// Properties to return. - /// Type of results. - /// A job result. - private T Wait(object[] properties) - { - object result = null; - VMWareInterop.Check(_handle.Wait(properties, ref result)); - return (T) result; - } - - /// - /// Get n-th properties. - /// - /// Type of result. - /// Property index. - /// Property objects. - /// N'th properties. - public T GetNthProperties(int index, object[] properties) - { - object result = null; - VMWareInterop.Check(_handle.GetNthProperties(index, properties, ref result)); - return (T)result; - } - - /// - /// Get the number of property values returned by the job. - /// - /// Property ID. - /// The number of property values returned by the job. - public int GetNumProperties(int property) - { - return _handle.GetNumProperties(property); - } - } -} diff --git a/source/Archive/VMWareLib/VMWareJobCallback.cs b/source/Archive/VMWareLib/VMWareJobCallback.cs deleted file mode 100644 index af78eff9bb..0000000000 --- a/source/Archive/VMWareLib/VMWareJobCallback.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A job completion callback, used with . - /// - public class VMWareJobCallback : ICallback - { - #region ICallback Members - - private EventWaitHandle _jobCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); - - /// - /// Handle a Vix event. - /// - /// An instance that implements IJob. - /// Event type. - /// Additional event info. - public void OnVixEvent(IJob job, int eventType, IVixHandle moreEventInfo) - { - using(VMWareVixHandle jobHandle = new VMWareVixHandle(job)) - { - using (VMWareVixHandle moreEventInfoHandle = new VMWareVixHandle(moreEventInfo)) - { - OnVixEvent(jobHandle, eventType, moreEventInfo); - } - } - } - - /// - /// Handle a Vix event. - /// Currently handles the job completion event, call WaitForCompletion to block with a timeout. - /// - /// An instance that implements IJob. - /// Event type. - /// Additional event info. - private void OnVixEvent(VMWareVixHandle job, int eventType, IVixHandle moreEventInfo) - { - switch (eventType) - { - case Constants.VIX_EVENTTYPE_JOB_COMPLETED: - _jobCompleted.Set(); - break; - } - } - - /// - /// Wait for completion of the job with a timeout. - /// - /// Timeout in milliseconds. - /// True if job completed, false if timeout expired. - public bool TryWaitForCompletion(int timeoutInMilliseconds) - { - return _jobCompleted.WaitOne(timeoutInMilliseconds, false); - } - - /// - /// Wait for completion of the job with a timeout. - /// A occurs if the job hasn't completed within the timeout specified. - /// - /// Timeout in milliseconds. - public void WaitForCompletion(int timeoutInMilliseconds) - { - if (!TryWaitForCompletion(timeoutInMilliseconds)) - { - throw new TimeoutException(string.Format("The operation has timed out after {0} milliseconds.", timeoutInMilliseconds)); - } - } - - #endregion - } -} diff --git a/source/Archive/VMWareLib/VMWareLib.csproj b/source/Archive/VMWareLib/VMWareLib.csproj deleted file mode 100644 index dd7ed92114..0000000000 --- a/source/Archive/VMWareLib/VMWareLib.csproj +++ /dev/null @@ -1,205 +0,0 @@ - - - - Debug - x86 - 9.0.30729 - 2.0 - {76CDB55D-55E3-4B53-AE33-12EC31430826} - Library - Vestris.VMWareLib - Vestris.VMWareLib - - - 3.5 - - - false - v4.7.1 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - SAK - SAK - SAK - SAK - - - - true - - - VMWareLib.snk - - - true - bin\Debug\ - DEBUG;TRACE - bin\Debug\Vestris.VMWareLib.XML - 1699 - full - x86 - bin\Debug\Vestris.VMWareLib.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - MinimumRecommendedRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - bin\Release\ - TRACE - bin\Release\Vestris.VMWareLib.XML - true - 1699 - pdbonly - x86 - bin\Release\Vestris.VMWareLib.dll.CodeAnalysisLog.xml - true - GlobalSuppressions.cs - prompt - AllRules.ruleset - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets - true - ;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules - true - false - - - true - bin\Debug\ - DEBUG;TRACE - bin\Debug\Vestris.VMWareLib.XML - 1699 - full - x64 - prompt - AllRules.ruleset - - - bin\Release\ - TRACE - bin\Release\Vestris.VMWareLib.XML - true - 1699 - pdbonly - x64 - prompt - AllRules.ruleset - - - true - bin\Debug\ - DEBUG;TRACE - bin\Debug\Vestris.VMWareLib.XML - 1699 - full - AnyCPU - prompt - AllRules.ruleset - - - bin\Release\ - TRACE - bin\Release\Vestris.VMWareLib.XML - true - 1699 - pdbonly - AnyCPU - prompt - AllRules.ruleset - - - - False - False - .\Interop.VixCOM.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - diff --git a/source/Archive/VMWareLib/VMWareLib.snk b/source/Archive/VMWareLib/VMWareLib.snk deleted file mode 100644 index 13dd69c0cd..0000000000 Binary files a/source/Archive/VMWareLib/VMWareLib.snk and /dev/null differ diff --git a/source/Archive/VMWareLib/VMWareProcessCollection.cs b/source/Archive/VMWareLib/VMWareProcessCollection.cs deleted file mode 100644 index 407d7fd6ea..0000000000 --- a/source/Archive/VMWareLib/VMWareProcessCollection.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Vestris.VMWareLib -{ - /// - /// A collection of vmware processes, organized by process id. - /// - public class VMWareProcessCollection : Dictionary - { - /// - /// Find a process by name. - /// - /// The name of the process. - /// The type of string comparison. - /// - public VMWareVirtualMachine.Process FindProcess(string processName, StringComparison comparisonType) - { - foreach (KeyValuePair process in this) - { - if (string.Compare(process.Value.Name, processName, comparisonType) == 0) - { - return process.Value; - } - } - - return null; - } - } -} diff --git a/source/Archive/VMWareLib/VMWareRootSnapshotCollection.cs b/source/Archive/VMWareLib/VMWareRootSnapshotCollection.cs deleted file mode 100644 index a75c39cb4c..0000000000 --- a/source/Archive/VMWareLib/VMWareRootSnapshotCollection.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; -using System.IO; - -namespace Vestris.VMWareLib -{ - /// - /// A collection of root snapshots. - /// - /// - /// Shared snapshots will only be accessible inside the guest operating system if snapshots are - /// enabled for the virtual machine. - /// - public class VMWareRootSnapshotCollection : VMWareSnapshotCollection - { - /// - /// A collection of snapshots that belong to a virtual machine. - /// - /// A virtual machine instance. - public VMWareRootSnapshotCollection(IVM2 vm) - : base(vm, null) - { - - } - - /// - /// A list of root snapshots on the current virtual machine. - /// - /// - /// The list is populated on first access, this may time some time. - /// - /// A list of snapshots. - protected override List Snapshots - { - get - { - if (_snapshots == null) - { - List snapshots = new List(); - int nSnapshots = 0; - VMWareInterop.Check(_vm.GetNumRootSnapshots(out nSnapshots)); - for (int i = 0; i < nSnapshots; i++) - { - ISnapshot snapshot = null; - VMWareInterop.Check(_vm.GetRootSnapshot(i, out snapshot)); - snapshots.Add(new VMWareSnapshot(_vm, snapshot, null)); - } - - _snapshots = snapshots; - } - - return _snapshots; - } - } - - /// - /// Get a snapshot by its exact name. - /// - /// Snapshot name. - /// A snapshot. - /// This function will throw an exception if more than one snapshot with the same exists or if the snapshot doesn't exist. - public VMWareSnapshot GetNamedSnapshot(string name) - { - ISnapshot snapshot = null; - ulong rc = _vm.GetNamedSnapshot(name, out snapshot); - switch (rc) - { - case Constants.VIX_OK: - return new VMWareSnapshot(_vm, snapshot, null); - default: - VMWareInterop.Check(rc); - break; - } - return null; - } - - /// - /// Current snapshot. - /// - /// Current snapshot. - public VMWareSnapshot GetCurrentSnapshot() - { - ISnapshot snapshot = null; - VMWareInterop.Check(_vm.GetCurrentSnapshot(out snapshot)); - return new VMWareSnapshot(_vm, snapshot, null); - } - - /// - /// Delete/remove a snapshot. - /// - /// Snapshot to delete. - /// True if the snapshot was deleted. - public void RemoveSnapshot(VMWareSnapshot item) - { - RemoveSnapshot(item, VMWareInterop.Timeouts.RemoveSnapshotTimeout); - } - - /// - /// Delete/remove a snapshot. - /// - /// Snapshot to delete. - /// Timeout in seconds. - /// True if the snapshot was deleted. - public void RemoveSnapshot(VMWareSnapshot item, int timeoutInSeconds) - { - item.RemoveSnapshot(timeoutInSeconds); - RemoveAll(); - } - - /// - /// Delete a snapshot. - /// - /// Name of the snapshot to delete. - public void RemoveSnapshot(string name) - { - RemoveSnapshot(GetNamedSnapshot(name)); - } - - /// - /// Delete a snapshot. - /// - /// Name of the snapshot to delete. - /// Timeout in seconds. - public void RemoveSnapshot(string name, int timeoutInSeconds) - { - RemoveSnapshot(GetNamedSnapshot(name), timeoutInSeconds); - } - - /// - /// Create a new snapshot, child of the current snapshot. - /// - /// Snapshot name. - /// Snapshot description. - public VMWareSnapshot CreateSnapshot(string name, string description) - { - return CreateSnapshot(name, description, 0, VMWareInterop.Timeouts.CreateSnapshotTimeout); - } - - /// - /// Create a new snapshot, child of the current snapshot. - /// - /// Snapshot name. - /// Snapshot description. - /// Flags, one of - /// - /// VIX_SNAPSHOT_INCLUDE_MEMORY: Captures the full state of a running virtual machine, including the memory - /// - /// - /// Timeout in seconds. - public VMWareSnapshot CreateSnapshot(string name, string description, int flags, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - - using (VMWareJob job = new VMWareJob(_vm.CreateSnapshot( - name, description, flags, null, callback), callback)) - { - ISnapshot snapshot = (ISnapshot)job.Wait( - Constants.VIX_PROPERTY_JOB_RESULT_HANDLE, - timeoutInSeconds); - - RemoveAll(); - - return new VMWareSnapshot(_vm, snapshot, null); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to create snapshot: name=\"{0}\" description=\"{1}\" flags={2} timeoutInSeconds={3}", - name, description, flags, timeoutInSeconds), ex); - } - } - } -} diff --git a/source/Archive/VMWareLib/VMWareSharedFolder.cs b/source/Archive/VMWareLib/VMWareSharedFolder.cs deleted file mode 100644 index 29aaa0707d..0000000000 --- a/source/Archive/VMWareLib/VMWareSharedFolder.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A VMWare Shared Folder. - /// A shared folder is a local mount point in the guest file system which mounts a shared folder exported by the host. - /// Shared folders are not supported for the following guest operating systems: - /// Windows ME, Windows 98, Windows 95, Windows 3.x, and DOS. - /// - public class VMWareSharedFolder - { - private string _shareName; - private string _hostPath; - private int _flags; - - /// - /// A shared folder defined by share name and host path. - /// - /// share name - /// host path - public VMWareSharedFolder(string shareName, string hostPath) - : this(shareName, hostPath, 0) - { - - } - - /// - /// A shared folder defined by share name, host path and additional flags. - /// - /// share name - /// host path - /// additional flags - public VMWareSharedFolder(string shareName, string hostPath, int flags) - { - _shareName = shareName; - _hostPath = hostPath; - _flags = flags; - } - - /// - /// The name of the folder. - /// - public string ShareName - { - get - { - return _shareName; - } - } - - /// - /// Host path this folder is mounted from. - /// Only absolute paths should be used for files in the guest; the resolution of relative paths is not specified. - /// - public string HostPath - { - get - { - return _hostPath; - } - } - - /// - /// Shared folder flags, one of the following. - /// - /// VIX_SHAREDFOLDER_WRITE_ACCESS: allow write access - /// - /// - public int Flags - { - get - { - return _flags; - } - } - - /// - /// Compare with another instance of a shared folder or object. - /// - /// another shared folder - /// true if the shared folders are identical - public override bool Equals(object obj) - { - if (obj is VMWareSharedFolder) - { - VMWareSharedFolder sharedFolder = (VMWareSharedFolder)obj; - return sharedFolder._hostPath == _hostPath - && sharedFolder._shareName == _shareName; - } - - return base.Equals(obj); - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current System.Object. - public override int GetHashCode() - { - return base.GetHashCode(); - } - } -} diff --git a/source/Archive/VMWareLib/VMWareSharedFolderCollection.cs b/source/Archive/VMWareLib/VMWareSharedFolderCollection.cs deleted file mode 100644 index 5b2360e8d1..0000000000 --- a/source/Archive/VMWareLib/VMWareSharedFolderCollection.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A collection of shared folders. - /// Shared folders will only be accessible inside the guest operating system if shared folders are - /// enabled for the virtual machine. - /// - public class VMWareSharedFolderCollection : - ICollection, IEnumerable, IDisposable - { - private IVM _vm = null; - private List _sharedFolders = null; - - /// - /// A collection of shared folders that belong to a virtual machine. - /// - /// Virtual machine. - public VMWareSharedFolderCollection(IVM vm) - { - _vm = vm; - } - - /// - /// Add (create) a shared folder. - /// - /// The shared folder to add. - public void Add(VMWareSharedFolder sharedFolder) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.AddSharedFolder( - sharedFolder.ShareName, sharedFolder.HostPath, sharedFolder.Flags, callback), - callback)) - { - job.Wait(VMWareInterop.Timeouts.AddRemoveSharedFolderTimeout); - } - _sharedFolders = null; - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to add shared folder: shareName=\"{0}\" hostPath=\"{1}\" flags={2}", - sharedFolder.ShareName, sharedFolder.HostPath, sharedFolder.Flags), ex); - } - } - - /// - /// Get shared folders. - /// - /// A list of shared folders. - private List SharedFolders - { - get - { - if (_sharedFolders == null) - { - try - { - List sharedFolders = new List(); - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.GetNumSharedFolders(callback), callback)) - { - int nSharedFolders = job.Wait( - Constants.VIX_PROPERTY_JOB_RESULT_SHARED_FOLDER_COUNT, - VMWareInterop.Timeouts.GetSharedFoldersTimeout); - - for (int i = 0; i < nSharedFolders; i++) - { - VMWareJobCallback getSharedfolderCallback = new VMWareJobCallback(); - using (VMWareJob sharedFolderJob = new VMWareJob( - _vm.GetSharedFolderState(i, getSharedfolderCallback), - getSharedfolderCallback)) - { - - object[] sharedFolderProperties = { - Constants.VIX_PROPERTY_JOB_RESULT_ITEM_NAME, - Constants.VIX_PROPERTY_JOB_RESULT_SHARED_FOLDER_HOST, - Constants.VIX_PROPERTY_JOB_RESULT_SHARED_FOLDER_FLAGS - }; - - object[] sharedFolderPropertyValues = sharedFolderJob.Wait( - sharedFolderProperties, VMWareInterop.Timeouts.GetSharedFoldersTimeout); - - VMWareSharedFolder sharedFolder = new VMWareSharedFolder( - (string)sharedFolderPropertyValues[0], - (string)sharedFolderPropertyValues[1], - (int)sharedFolderPropertyValues[2]); - - sharedFolders.Add(sharedFolder); - } - } - } - _sharedFolders = sharedFolders; - } - catch (Exception ex) - { - throw new Exception("Failed to get shared folders", ex); - } - } - - return _sharedFolders; - } - } - - /// - /// Delete all shared folders. - /// - public void Clear() - { - while (SharedFolders.Count > 0) - { - Remove(SharedFolders[0]); - } - } - - /// - /// A function to copy shared folder objects between arrays. - /// Don't use externally. - /// - /// Target array. - /// Array index. - public void CopyTo(VMWareSharedFolder[] array, int arrayIndex) - { - SharedFolders.CopyTo(array, arrayIndex); - } - - /// - /// Returns true if this virtual machine has the folder specified. - /// - /// Shared folder. - /// True if the virtual machine contains the specified shared folder. - public bool Contains(VMWareSharedFolder item) - { - return SharedFolders.Contains(item); - } - - /// - /// Delete a shared folder. - /// - /// Shared folder to delete. - /// True if the folder was deleted. - public bool Remove(VMWareSharedFolder item) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.RemoveSharedFolder( - item.ShareName, 0, callback), - callback)) - { - job.Wait(VMWareInterop.Timeouts.AddRemoveSharedFolderTimeout); - } - return SharedFolders.Remove(item); - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to remove shared folder: shareName=\"{0}\"", - item.ShareName), ex); - } - } - - /// - /// Number of shared folders. - /// - public int Count - { - get - { - return SharedFolders.Count; - } - } - - /// - /// Returns true if the collection is read-only. - /// Shared folder collections are never read-only. - /// - public bool IsReadOnly - { - get - { - return false; - } - } - - /// - /// A shared folder enumerator. - /// - /// Shared folders enumerator. - IEnumerator IEnumerable.GetEnumerator() - { - return SharedFolders.GetEnumerator(); - } - - /// - /// A shared folder enumerator. - /// - /// Shared folders enumerator. - IEnumerator IEnumerable.GetEnumerator() - { - return SharedFolders.GetEnumerator(); - } - - /// - /// Enable/disable all shared folders as a feature on a virtual machine. - /// - public bool Enabled - { - set - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.EnableSharedFolders(value, 0, callback), callback)) - { - job.Wait(VMWareInterop.Timeouts.EnableSharedFoldersTimeout); - } - _sharedFolders = null; - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to {0} shared folders", - (value == true) ? "enable" : "disable"), ex); - } - } - } - - /// - /// Returns a shared folder at a given index. - /// - /// Shared folder index. - /// A shared folder. - public VMWareSharedFolder this[int index] - { - get - { - return SharedFolders[index]; - } - } - - /// - /// Dispose the object. - /// - public void Dispose() - { - _sharedFolders = null; - _vm = null; - } - } -} diff --git a/source/Archive/VMWareLib/VMWareSnapshot.cs b/source/Archive/VMWareLib/VMWareSnapshot.cs deleted file mode 100644 index 54845a5393..0000000000 --- a/source/Archive/VMWareLib/VMWareSnapshot.cs +++ /dev/null @@ -1,351 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.IO; -using System.Runtime.InteropServices; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A VMWare snapshot. - /// - public class VMWareSnapshot : VMWareVixHandle - { - private IVM2 _vm = null; - private VMWareSnapshotCollection _childSnapshots = null; - private VMWareSnapshot _parent = null; - - /// - /// A VMWare snapshot constructor. - /// - /// Virtual machine. - /// Snapshot. - /// Parent snapshot. - public VMWareSnapshot(IVM2 vm, ISnapshot snapshot, VMWareSnapshot parent) - : base(snapshot) - { - _vm = vm; - _parent = parent; - } - - /// - /// Parent snapshot. - /// - /// - /// Root snapshots have a null parent. - /// - public VMWareSnapshot Parent - { - get - { - return _parent; - } - set - { - _parent = value; - } - } - - /// - /// Restores the virtual machine to the state when the specified snapshot was created. - /// - /// - /// Any applicable VixVMPowerOpOptions. If the virtual machine was powered on when the snapshot was created, - /// then this will determine how the virtual machine is powered back on. To prevent the virtual machine from being - /// powered on regardless of the power state when the snapshot was created, use the - /// VIX_VMPOWEROP_SUPPRESS_SNAPSHOT_POWERON flag. VIX_VMPOWEROP_SUPPRESS_SNAPSHOT_POWERON is mutually exclusive to - /// all other VixVMPowerOpOptions. - /// - /// Timeout in seconds. - public void RevertToSnapshot(int powerOnOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.RevertToSnapshot( - _handle, powerOnOptions, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to revert to snapshot: powerOnOptions={0} timeoutInSeconds={1}", - powerOnOptions, timeoutInSeconds), ex); - } - } - - /// - /// Restores the virtual machine to the state when the specified snapshot was created. - /// - /// Timeout in seconds. - public void RevertToSnapshot(int timeoutInSeconds) - { - RevertToSnapshot(Constants.VIX_VMPOWEROP_NORMAL, timeoutInSeconds); - } - - /// - /// Restores the virtual machine to the state when the specified snapshot was created. - /// - public void RevertToSnapshot() - { - RevertToSnapshot(VMWareInterop.Timeouts.RevertToSnapshotTimeout); - } - - /// - /// Remove/delete this snapshot. - /// - public void RemoveSnapshot() - { - RemoveSnapshot(VMWareInterop.Timeouts.RemoveSnapshotTimeout); - } - - /// - /// Remove/delete this snapshot. - /// - /// - /// If the snapshot is a member of a collection, the latter is updated with orphaned - /// snapshots appended to the parent. - /// - /// Timeout in seconds. - public void RemoveSnapshot(int timeoutInSeconds) - { - try - { - // resolve child snapshots that will move one level up - IEnumerable childSnapshots = ChildSnapshots; - - // remove the snapshot - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.RemoveSnapshot(_handle, 0, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - - // remove from parent - if (_parent != null) - { - // child snapshots from this snapshot have now moved one level up - _parent.ChildSnapshots.Remove(this); - } - - Close(); - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to remove snapshot: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Child snapshots. - /// - public VMWareSnapshotCollection ChildSnapshots - { - get - { - if (_childSnapshots == null) - { - VMWareSnapshotCollection childSnapshots = new VMWareSnapshotCollection(_vm, this); - int nChildSnapshots = 0; - VMWareInterop.Check(_handle.GetNumChildren(out nChildSnapshots)); - for (int i = 0; i < nChildSnapshots; i++) - { - ISnapshot childSnapshot = null; - VMWareInterop.Check(_handle.GetChild(i, out childSnapshot)); - childSnapshots.Add(new VMWareSnapshot(_vm, childSnapshot, this)); - } - _childSnapshots = childSnapshots; - } - return _childSnapshots; - } - } - - /// - /// Display name of the snapshot. - /// - public string DisplayName - { - get - { - return GetProperty(Constants.VIX_PROPERTY_SNAPSHOT_DISPLAYNAME); - } - } - - /// - /// Display name of the snapshot. - /// - public string Description - { - get - { - return GetProperty(Constants.VIX_PROPERTY_SNAPSHOT_DESCRIPTION); - } - } - - /// - /// Complete snapshot path, from root. - /// - public string Path - { - get - { - ISnapshot parentSnapshot = null; - ulong ulError = 0; - switch ((ulError = _handle.GetParent(out parentSnapshot))) - { - case Constants.VIX_OK: - return parentSnapshot == null - ? DisplayName - : System.IO.Path.Combine(new VMWareSnapshot(_vm, parentSnapshot, null).Path, DisplayName); - case Constants.VIX_E_SNAPSHOT_NOTFOUND: // no parent - return DisplayName; - case Constants.VIX_E_INVALID_ARG: // root snapshot - return string.Empty; - default: - throw new VMWareException(ulError); - } - } - } - - /// - /// The power state of this snapshot, an OR-ed set of VIX_POWERSTATE_* values. - /// - public int PowerState - { - get - { - return GetProperty(Constants.VIX_PROPERTY_SNAPSHOT_POWERSTATE); - } - } - - /// - /// Returns true if the snapshot is replayable. - /// - public bool IsReplayable - { - get - { - return GetProperty(Constants.VIX_PROPERTY_SNAPSHOT_IS_REPLAYABLE); - } - } - - /// - /// Replay a recording of a virtual machine. - /// - public void BeginReplay() - { - BeginReplay(Constants.VIX_VMPOWEROP_NORMAL, - VMWareInterop.Timeouts.ReplayTimeout); - } - - /// - /// Replay a recording of a virtual machine. - /// - /// One of VIX_VMPOWEROP_NORMAL or VIX_VMPOWEROP_LAUNCH_GUI. - /// Timeout in seconds. - public void BeginReplay(int powerOnOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.BeginReplay( - _handle, powerOnOptions, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to begin replay: powerOnOptions={0} timeoutInSeconds={1}", - powerOnOptions, timeoutInSeconds), ex); - } - } - - /// - /// Stop replaying a virtual machine's recording. - /// - public void EndReplay() - { - EndReplay(VMWareInterop.Timeouts.ReplayTimeout); - } - - /// - /// Stop replaying a virtual machine's recording. - /// - /// Timeout in seconds. - public void EndReplay(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.EndReplay( - 0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to end replay: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Creates a copy of the virtual machine at the state at which this snapshot was taken. - /// - /// Virtual Machine clone type. - /// The path name of the virtual machine configuration file that will be created. - public void Clone(VMWareVirtualMachineCloneType cloneType, string destConfigPathName) - { - Clone(cloneType, destConfigPathName, VMWareInterop.Timeouts.CloneTimeout); - } - - /// - /// Creates a copy of the virtual machine at the state at which this snapshot was taken. - /// - /// Virtual Machine clone type. - /// The path name of the virtual machine configuration file that will be created. - /// Timeout in seconds. - public void Clone(VMWareVirtualMachineCloneType cloneType, string destConfigPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.Clone( - _handle, (int)cloneType, destConfigPathName, 0, null, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to clone virtual machine snapshot: cloneType=\"{0}\" destConfigPathName=\"{1}\" timeoutInSeconds={2}", - Enum.GetName(cloneType.GetType(), cloneType), destConfigPathName, timeoutInSeconds), ex); - } - } - - /// - /// Dispose the snapshot. - /// - public override void Dispose() - { - if (_childSnapshots != null) - { - _childSnapshots.Dispose(); - _childSnapshots = null; - } - - base.Dispose(); - } - } -} diff --git a/source/Archive/VMWareLib/VMWareSnapshotCollection.cs b/source/Archive/VMWareLib/VMWareSnapshotCollection.cs deleted file mode 100644 index 52c16ad0f5..0000000000 --- a/source/Archive/VMWareLib/VMWareSnapshotCollection.cs +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; -using System.IO; - -namespace Vestris.VMWareLib -{ - /// - /// A collection of snapshots at any snapshot level. - /// - public class VMWareSnapshotCollection : IEnumerable, IDisposable - { - /// - /// Virtual machine handle. - /// - protected IVM2 _vm = null; - /// - /// Internal list of snapshots. - /// - protected List _snapshots = null; - private VMWareSnapshot _parent = null; - - /// - /// Snapshot collection constructor. - /// - /// Virtual machine. - /// Snapshot parent. - public VMWareSnapshotCollection(IVM2 vm, VMWareSnapshot parent) - { - _vm = vm; - _parent = parent; - } - - /// - /// The list of snapshots. - /// - protected virtual List Snapshots - { - get - { - if (_snapshots == null) - { - _snapshots = new List(); - } - return _snapshots; - } - } - - /// - /// Find a snapshot. - /// - /// Path to a snapshot. - /// A snapshot, null if not found. - public VMWareSnapshot FindSnapshot(string pathToSnapshot) - { - string[] paths = pathToSnapshot.Split("\\".ToCharArray(), 2); - - foreach (VMWareSnapshot snapshot in this) - { - // last snapshot in the path - if (snapshot.DisplayName == paths[0]) - { - return (paths.Length == 1) - ? snapshot - : snapshot.ChildSnapshots.FindSnapshot(paths[1]); - } - } - return null; - } - - /// - /// Find a snapshot by name. Unlike GetSnapshotByName this function - /// doesn't throw an exception when there're two snapshots of the same name, it returns - /// the first snapshot found. - /// - /// Name of a snapshot. - /// The first snapshot that matches the name, null if not found. - public VMWareSnapshot FindSnapshotByName(string name) - { - foreach (VMWareSnapshot snapshot in this) - { - if (snapshot.DisplayName == name) - { - return snapshot; - } - - VMWareSnapshot childSnapshot = snapshot.ChildSnapshots.FindSnapshotByName(name); - if (childSnapshot != null) - { - return childSnapshot; - } - } - return null; - } - - /// - /// Find all snapshots by name. This can return multiple snapshots - /// that have the same name. - /// - /// Name of a snapshot. - /// The first snapshot that matches the name, null if not found. - public IEnumerable FindSnapshotsByName(string name) - { - List snapshots = new List(); - - foreach (VMWareSnapshot snapshot in this) - { - if (snapshot.DisplayName == name) - { - snapshots.Add(snapshot); - } - - snapshots.AddRange(snapshot.ChildSnapshots.FindSnapshotsByName(name)); - } - - return snapshots; - } - - /// - /// Copy to an array of VMWareSnapshots. - /// - /// Target array. - /// Array index. - public void CopyTo(VMWareSnapshot[] array, int arrayIndex) - { - Snapshots.CopyTo(array, arrayIndex); - } - - /// - /// Returns true if this virtual machine has the snapshot specified. - /// - /// Snapshot. - /// True if the virtual machine contains the specified snapshot. - public bool Contains(VMWareSnapshot item) - { - return Snapshots.Contains(item); - } - - /// - /// Number of snapshots. - /// - public int Count - { - get - { - return Snapshots.Count; - } - } - - /// - /// Returns true if the collection is read-only. - /// A collection of snapshots is never read-only. - /// - public bool IsReadOnly - { - get - { - return false; - } - } - - /// - /// A snapshot collection enumerator. - /// - /// Snapshots enumerator. - IEnumerator IEnumerable.GetEnumerator() - { - return Snapshots.GetEnumerator(); - } - - /// - /// A snapshot collection enumerator. - /// - /// Snapshots enumerator. - IEnumerator IEnumerable.GetEnumerator() - { - return Snapshots.GetEnumerator(); - } - - /// - /// Add a snapshot to the list. - /// - /// Snapshot to add. - public void Add(VMWareSnapshot snapshot) - { - if (snapshot.Parent != null && snapshot.Parent != _parent) - { - throw new InvalidOperationException("Snapshot already belongs to another collection."); - } - - Snapshots.Add(snapshot); - } - - /// - /// Remove a snapshot from this collection, append orphaned children. - /// - /// Snapshot to remove. - public void Remove(VMWareSnapshot snapshot) - { - if (_snapshots != null) - { - _snapshots.Remove(snapshot); - - foreach (VMWareSnapshot childSnapshot in snapshot.ChildSnapshots) - { - childSnapshot.Parent = _parent; - _snapshots.Add(childSnapshot); - } - } - } - - /// - /// Remove all elements from the snapshot collection. - /// - public void RemoveAll() - { - if (_snapshots != null) - { - foreach (VMWareSnapshot snapshot in _snapshots) - { - snapshot.Dispose(); - } - - _snapshots = null; - } - } - - /// - /// Dispose the collection. - /// - public void Dispose() - { - RemoveAll(); - _parent = null; - _vm = null; - } - } -} diff --git a/source/Archive/VMWareLib/VMWareTimeouts.cs b/source/Archive/VMWareLib/VMWareTimeouts.cs deleted file mode 100644 index 7c1c854702..0000000000 --- a/source/Archive/VMWareLib/VMWareTimeouts.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; - -namespace Vestris.VMWareLib -{ - /// - /// VMWare job timeout metadata. - /// - public class VMWareTimeoutAttribute : Attribute - { - private int _multiplier = 1; - - /// - /// A default base timeout multiplier. - /// - public int Multiplier - { - get - { - return _multiplier; - } - set - { - _multiplier = value; - } - } - } - - /// - /// A collection of default timeouts used in VMWareTasks functions exposed without a timeout parameter. - /// - public class VMWareTimeouts - { - /// - /// Maximum time, in seconds, to establish a connection to a VMWare host. - /// - [VMWareTimeoutAttribute] - public int ConnectTimeout; - /// - /// Maximum time, in seconds, to open a virtual machine. - /// - [VMWareTimeoutAttribute] - public int OpenVMTimeout; - /// - /// Maximum time, in seconds, to register or unregister a virtual machine. - /// - [VMWareTimeoutAttribute] - public int RegisterVMTimeout; - /// - /// Maximum time, in seconds, to revert a snapshot. - /// - [VMWareTimeoutAttribute] - public int RevertToSnapshotTimeout; - /// - /// Maximum time, in seconds, to remove (delete) a snapshot. - /// - [VMWareTimeoutAttribute(Multiplier = 10)] - public int RemoveSnapshotTimeout; - /// - /// Maximum time, in seconds, to create a snapshot. - /// - [VMWareTimeoutAttribute(Multiplier = 10)] - public int CreateSnapshotTimeout; - /// - /// The maximum operational time, in seconds, to bring the power to/from the vm, not to boot it - /// - [VMWareTimeoutAttribute] - public int PowerOnTimeout; - /// - /// The maximum time, in seconds, to power off a virtual machine. - /// - [VMWareTimeoutAttribute] - public int PowerOffTimeout; - /// - /// The maximum time, in seconds, to reset a virtual machine. - /// - [VMWareTimeoutAttribute] - public int ResetTimeout; - /// - /// The maximum time, in seconds, to suspend a virtual machine. - /// - [VMWareTimeoutAttribute] - public int SuspendTimeout; - /// - /// The maximum time, in seconds, to pause a virtual machine. - /// - [VMWareTimeoutAttribute] - public int PauseTimeout; - /// - /// The maximum time, in seconds, to unpause (continue execution of) a virtual machine. - /// - [VMWareTimeoutAttribute] - public int UnpauseTimeout; - /// - /// The maximum time, in seconds, to wait for tools in a guest operating system. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int WaitForToolsTimeout; - /// - /// The maximum time, in seconds, to wait for a log-in to a guest operating system. - /// - [VMWareTimeoutAttribute] - public int LoginTimeout; - /// - /// Maximum time, in seconds, to copy a file from guest to host and from host to guest. - /// - /// Copy is very slow, see http://communities.vmware.com/thread/184489. - /// - /// - [VMWareTimeoutAttribute(Multiplier = 20)] - public int CopyFileTimeout; - /// - /// Maximum time, in seconds, to wait for a file to be deleted in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int DeleteFileTimeout; - /// - /// Maximum time, in seconds, to wait for a directory to be deleted in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int DeleteDirectoryTimeout; - /// - /// Maximum time, in seconds, to wait for a program to run in the guest operating system. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int RunProgramTimeout; - /// - /// Maximum time, in seconds, to wait for a script to run in the guest operating system. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int RunScriptTimeout; - /// - /// Maximum time, in seconds, to wait for an url to open in a browser on the guest operating system. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int OpenUrlTimeout; - /// - /// Maximum time, in seconds, to wait to check whether a file exists in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int FileExistsTimeout; - /// - /// Maximum time, in seconds, to wait to check whether a directory exists in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int DirectoryExistsTimeout; - /// - /// Maximum time, in seconds, to wait for a logout from a guest operating system to complete. - /// - [VMWareTimeoutAttribute] - public int LogoutTimeout; - /// - /// Maximum time, in seconds, to list the contents of a directory in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int ListDirectoryTimeout; - /// - /// Maximum time, in seconds, to wait to read a remote variable. - /// - [VMWareTimeoutAttribute] - public int ReadVariableTimeout; - /// - /// Maximum time, in seconds, to wait to write a remote variable. - /// - [VMWareTimeoutAttribute] - public int WriteVariableTimeout; - /// - /// Maximum time, in seconds, to wait to enable or disable shared folders. - /// - [VMWareTimeoutAttribute] - public int EnableSharedFoldersTimeout; - /// - /// Maximum time, in seconds, to wait to fetch the list of shared folders. - /// - [VMWareTimeoutAttribute] - public int GetSharedFoldersTimeout; - /// - /// Maximum time, in seconds, to add/remove a shared folder. - /// - [VMWareTimeoutAttribute] - public int AddRemoveSharedFolderTimeout; - /// - /// Maximum time, in seconds, to capture a screen image. - /// - [VMWareTimeoutAttribute] - public int CaptureScreenImageTimeout; - /// - /// Maximum time, in seconds, to create a directory in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int CreateDirectoryTimeout; - /// - /// Maximum time, in seconds, to create a temporary file in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int CreateTempFileTimeout; - /// - /// Maximum time, in seconds, to list processes in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int ListProcessesTimeout; - /// - /// Maximum time, in seconds, to fetch a collection of items in find operations. - /// - [VMWareTimeoutAttribute] - public int FindItemsTimeout; - /// - /// Maximum time, in seconds, to kill a process in the guest operating system. - /// - [VMWareTimeoutAttribute] - public int KillProcessTimeout; - /// - /// Maximum time, in seconds, to begin and end a recording. - /// - [VMWareTimeoutAttribute(Multiplier = 10)] - public int RecordingTimeout; - /// - /// Maximum time, in seconds, to replay a snapshot. - /// - [VMWareTimeoutAttribute(Multiplier = 10)] - public int ReplayTimeout; - /// - /// Maximum time, in seconds, to wait for an upgrade for the virtual hardware. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int UpgradeVirtualHardwareTimeout; - /// - /// Maximum time, in seconds, to clone a virtual machine. - /// - [VMWareTimeoutAttribute(Multiplier = 5)] - public int CloneTimeout; - /// - /// Maximum time, in seconds, to delete a virtual machine. - /// - [VMWareTimeoutAttribute] - public int DeleteTimeout; - /// - /// Maximum time, in seconds, to get file information from a guest operating system. - /// - [VMWareTimeoutAttribute] - public int GetFileInfoTimeout; - /// - /// Maximum time, in seconds, to prepare to install or upgrade VMWare Tools. - /// - [VMWareTimeoutAttribute] - public int InstallToolsTimeout; - - /// - /// A collection of timeouts based on a default 60-seconds base timeout. - /// - public VMWareTimeouts() - : this(60) - { - } - - /// - /// A collection of timeouts based on a configurable base timeout. - /// - /// a base timeout - public VMWareTimeouts(int baseTimeout) - { - FieldInfo[] timeouts = GetType().GetFields(); - foreach (FieldInfo timeout in timeouts) - { - object[] timeoutAttributes = timeout.GetCustomAttributes(typeof(VMWareTimeoutAttribute), false); - if (timeoutAttributes == null || timeoutAttributes.Length == 0) - continue; - - VMWareTimeoutAttribute timeoutAttribute = timeoutAttributes[0] as VMWareTimeoutAttribute; - timeout.SetValue(this, baseTimeout * timeoutAttribute.Multiplier); - } - } - } -} diff --git a/source/Archive/VMWareLib/VMWareVirtualHost.cs b/source/Archive/VMWareLib/VMWareVirtualHost.cs deleted file mode 100644 index 0f325a0f6a..0000000000 --- a/source/Archive/VMWareLib/VMWareVirtualHost.cs +++ /dev/null @@ -1,555 +0,0 @@ -using System; -using System.Collections.Generic; -using Interop.VixCOM; -using Microsoft.Win32; - -namespace Vestris.VMWareLib -{ - /// - /// A VMWare virtual host. - /// - public class VMWareVirtualHost : VMWareVixHandle - { - /// - /// VMWare service provider type. - /// - public enum ServiceProviderType - { - /// - /// No service provider type, not connected. - /// - None = 0, - /// - /// VMWare Server. - /// - Server = Constants.VIX_SERVICEPROVIDER_VMWARE_SERVER, - /// - /// VMWare Workstation. - /// - Workstation = Constants.VIX_SERVICEPROVIDER_VMWARE_WORKSTATION, - /// - /// Virtual Infrastructure Server, eg. ESX. - /// - VirtualInfrastructureServer = Constants.VIX_SERVICEPROVIDER_VMWARE_VI_SERVER, - /// - /// VMWare Player. - /// - Player = Constants.VIX_SERVICEPROVIDER_VMWARE_PLAYER - } - - private ServiceProviderType _serviceProviderType = ServiceProviderType.None; - - /// - /// An IHost2 handle, where supported. - /// - protected IHost2 _host2 - { - get - { - return _handle as IHost2; - } - } - - /// - /// A VMWare virtual host. - /// - public VMWareVirtualHost() - { - - } - - /// - /// Connected host type. - /// - public ServiceProviderType ConnectionType - { - get - { - return _serviceProviderType; - } - } - - /// - /// Connect to a WMWare Player. - /// - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWarePlayer(); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("C:\Virtual Machines\xp\xp.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - public void ConnectToVMWarePlayer() - { - ConnectToVMWarePlayer(VMWareInterop.Timeouts.ConnectTimeout); - } - - /// - /// Connect to a WMWare Player. - /// - /// Timeout in seconds. - public void ConnectToVMWarePlayer(int timeoutInSeconds) - { - Connect(ServiceProviderType.Player, null, 0, null, null, timeoutInSeconds); - } - - /// - /// Connect to a WMWare Workstation. - /// - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWareWorkstation(); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("C:\Virtual Machines\xp\xp.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - public void ConnectToVMWareWorkstation() - { - ConnectToVMWareWorkstation(VMWareInterop.Timeouts.ConnectTimeout); - } - - /// - /// Connect to a WMWare Workstation. - /// - /// Timeout in seconds. - public void ConnectToVMWareWorkstation(int timeoutInSeconds) - { - Connect(ServiceProviderType.Workstation, null, 0, null, null, timeoutInSeconds); - } - - /// - /// Connect to a WMWare Virtual Infrastructure Server (eg. ESX or VMWare Server 2.x). - /// - /// VMWare host name and optional port. - /// Username. - /// Password. - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWareVIServer("esx.mycompany.com", "vmuser", "password"); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("[storage] testvm/testvm.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWareVIServer("localhost:8333", "vmuser", "password"); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("[standard] testvm/testvm.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - public void ConnectToVMWareVIServer(string hostName, string username, string password) - { - ConnectToVMWareVIServer(hostName, username, password, VMWareInterop.Timeouts.ConnectTimeout); - } - - /// - /// Connect to a WMWare Virtual Infrastructure Server (eg. ESX or VMWare Server 2.x). - /// - /// VMWare host name and optional port. - /// Username. - /// Password. - /// Timeout in seconds. - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWareVIServer("esx.mycompany.com", "vmuser", "password"); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("[storage] testvm/testvm.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - /// - /// - /// using System; - /// using System.Collections.Generic; - /// using Vestris.VMWareLib; - /// - /// VMWareVirtualHost virtualHost = new VMWareVirtualHost(); - /// virtualHost.ConnectToVMWareVIServer("localhost:8333", "vmuser", "password"); - /// VMWareVirtualMachine virtualMachine = virtualHost.Open("[standard] testvm/testvm.vmx"); - /// virtualMachine.PowerOn(); - /// - /// - public void ConnectToVMWareVIServer(string hostName, string username, string password, int timeoutInSeconds) - { - if (string.IsNullOrEmpty(hostName)) - { - throw new ArgumentException("The host is required."); - } - - ConnectToVMWareVIServer(new Uri(string.Format("https://{0}/sdk", hostName)), - username, password, timeoutInSeconds); - } - - /// - /// Connect to a WMWare Virtual Infrastructure Server (eg. ESX). - /// - /// Host SDK uri, eg. http://server/sdk. - /// Username. - /// Password. - /// Timeout in seconds. - public void ConnectToVMWareVIServer(Uri hostUri, string username, string password, int timeoutInSeconds) - { - if (string.IsNullOrEmpty(username)) - { - throw new ArgumentException("The username is required."); - } - - Connect(ServiceProviderType.VirtualInfrastructureServer, - hostUri.ToString(), 0, username, password, timeoutInSeconds); - } - - /// - /// Connect to a WMWare Server. - /// - /// Username. - /// Password. - /// DNS name or IP address of a VMWare host, leave blank for localhost. - public void ConnectToVMWareServer(string hostName, string username, string password) - { - ConnectToVMWareServer(hostName, username, password, VMWareInterop.Timeouts.ConnectTimeout); - } - - /// - /// Connect to a WMWare Server. - /// - /// DNS name or IP address of a VMWare host, leave blank for localhost. - /// Username. - /// Password. - /// Timeout in seconds. - public void ConnectToVMWareServer(string hostName, string username, string password, int timeoutInSeconds) - { - Connect(ServiceProviderType.Server, - hostName, 0, username, password, timeoutInSeconds); - } - - /// - /// Connects to a VMWare VI Server, VMWare Server or Workstation. - /// - private void Connect(ServiceProviderType serviceProviderType, - string hostName, int hostPort, string username, string password, int timeout) - { - try - { - // check if VmWare COM object could be loaded - // if we try to load a COM object which does not exist, an RCW exception will occure on exit of Visual Studio 2013 - using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry32)) { - using (var xReg = baseKey.OpenSubKey(@"CLSID\{6874E949-7186-4308-A1B9-D55A91F60728}", false)) { - if (xReg == null) { - throw new ApplicationException("No Vmware Library installed!"); - } - } - } - - int serviceProvider = (int)serviceProviderType; - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(new VixLib().Connect( - Constants.VIX_API_VERSION, serviceProvider, hostName, hostPort, - username, password, 0, null, callback), callback)) - { - _handle = job.Wait(Constants.VIX_PROPERTY_JOB_RESULT_HANDLE, timeout); - } - _serviceProviderType = serviceProviderType; - } - catch (ApplicationException) - { - throw; - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to connect: serviceProviderType=\"{0}\" hostName=\"{1}\" hostPort={2} username=\"{3}\" timeout={4}", - Enum.GetName(serviceProviderType.GetType(), serviceProviderType), hostName, hostPort, username, timeout), ex); - } - } - - /// - /// Open a virtual machine. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - /// An instance of a virtual machine. - public VMWareVirtualMachine Open(string fileName) - { - return Open(fileName, VMWareInterop.Timeouts.OpenVMTimeout); - } - - /// - /// Open a virtual machine. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - /// Timeout in seconds. - /// An instance of a virtual machine. - public VMWareVirtualMachine Open(string fileName, int timeoutInSeconds) - { - try - { - if (_handle == null) - { - throw new InvalidOperationException("No connection established"); - } - - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.OpenVM(fileName, callback), callback)) - { - return new VMWareVirtualMachine(job.Wait( - Constants.VIX_PROPERTY_JOB_RESULT_HANDLE, - timeoutInSeconds)); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to open virtual machine: fileName=\"{0}\" timeoutInSeconds={1}", - fileName, timeoutInSeconds), ex); - } - } - - /// - /// Add a virtual machine to the host's inventory. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - public void Register(string fileName) - { - Register(fileName, VMWareInterop.Timeouts.RegisterVMTimeout); - } - - /// - /// Add a virtual machine to the host's inventory. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - /// Timeout in seconds. - public void Register(string fileName, int timeoutInSeconds) - { - if (_handle == null) - { - throw new InvalidOperationException("No connection established"); - } - - switch (ConnectionType) - { - case ServiceProviderType.VirtualInfrastructureServer: - case ServiceProviderType.Server: - break; - default: - throw new NotSupportedException(string.Format("Register is not supported on {0}", - ConnectionType)); - } - - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.RegisterVM(fileName, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to register virtual machine: fileName=\"{0}\" timeoutInSeconds={1}", - fileName, timeoutInSeconds), ex); - } - } - - /// - /// Remove a virtual machine from the host's inventory. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - public void Unregister(string fileName) - { - Unregister(fileName, VMWareInterop.Timeouts.RegisterVMTimeout); - } - - /// - /// Remove a virtual machine from the host's inventory. - /// - /// Virtual Machine file, local .vmx or [storage] .vmx. - /// Timeout in seconds. - public void Unregister(string fileName, int timeoutInSeconds) - { - if (_handle == null) - { - throw new InvalidOperationException("No connection established"); - } - - switch (ConnectionType) - { - case ServiceProviderType.VirtualInfrastructureServer: - case ServiceProviderType.Server: - break; - default: - throw new NotSupportedException(string.Format("Unregister is not supported on {0}", - ConnectionType)); - } - - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.UnregisterVM(fileName, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to unregister virtual machine: fileName=\"{0}\" timeoutInSeconds={1}", - fileName, timeoutInSeconds), ex); - } - } - - /// - /// Dispose the object, hard-disconnect from the remote host. - /// - public override void Dispose() - { - if (_handle != null) - { - Disconnect(); - } - - GC.SuppressFinalize(this); - } - - /// - /// Disconnect from a remote host. - /// - public void Disconnect() - { - if (_handle == null) - { - throw new InvalidOperationException("No connection established"); - } - - _handle.Disconnect(); - _handle = null; - _serviceProviderType = ServiceProviderType.None; - } - - /// - /// Returns true when connected to a virtual host, false otherwise. - /// - public bool IsConnected - { - get - { - return _handle != null; - } - } - - /// - /// Destructor. - /// - ~VMWareVirtualHost() - { - if (_handle != null) - { - Disconnect(); - } - } - - /// - /// Returns all running virtual machines. - /// - public IEnumerable RunningVirtualMachines - { - get - { - if (_handle == null) - { - throw new InvalidOperationException("No connection established"); - } - - try - { - List runningVirtualMachines = new List(); - - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.FindItems( - Constants.VIX_FIND_RUNNING_VMS, null, -1, callback), - callback)) - { - object[] properties = { Constants.VIX_PROPERTY_FOUND_ITEM_LOCATION }; - foreach (object[] runningVirtualMachine in job.YieldWait( - properties, VMWareInterop.Timeouts.FindItemsTimeout)) - { - runningVirtualMachines.Add(this.Open((string)runningVirtualMachine[0])); - } - } - - return runningVirtualMachines; - } - catch (Exception ex) - { - throw new Exception("Failed to get all running virtual machines", ex); - } - } - } - - /// - /// All registered virtual machines. - /// - /// This function is only supported on Virtual Infrastructure servers. - public IEnumerable RegisteredVirtualMachines - { - get - { - switch (ConnectionType) - { - case ServiceProviderType.VirtualInfrastructureServer: - case ServiceProviderType.Server: - break; - default: - throw new NotSupportedException(string.Format("RegisteredVirtualMachines is not supported on {0}", - ConnectionType)); - } - - try - { - List registeredVirtualMachines = new List(); - - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.FindItems( - Constants.VIX_FIND_REGISTERED_VMS, null, -1, callback), - callback)) - { - object[] properties = { Constants.VIX_PROPERTY_FOUND_ITEM_LOCATION }; - foreach (object[] runningVirtualMachine in job.YieldWait(properties, VMWareInterop.Timeouts.FindItemsTimeout)) - { - registeredVirtualMachines.Add(this.Open((string)runningVirtualMachine[0])); - } - } - - return registeredVirtualMachines; - } - catch (Exception ex) - { - throw new Exception("Failed to get all registered virtual machines", ex); - } - } - } - } -} \ No newline at end of file diff --git a/source/Archive/VMWareLib/VMWareVirtualMachine.cs b/source/Archive/VMWareLib/VMWareVirtualMachine.cs deleted file mode 100644 index 0b2b00fb32..0000000000 --- a/source/Archive/VMWareLib/VMWareVirtualMachine.cs +++ /dev/null @@ -1,1839 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Interop.VixCOM; -using System.Runtime.InteropServices; -using System.Runtime.CompilerServices; -using System.Drawing; - -namespace Vestris.VMWareLib -{ - /// - /// Virtual machine clone type. - /// - public enum VMWareVirtualMachineCloneType - { - /// - /// A full, independent clone of the virtual machine. - /// - Full = Constants.VIX_CLONETYPE_FULL, - /// - /// A linked clone is a copy of a virtual machine that shares virtual disks with the parent virtual - /// machine in an ongoing manner. - /// - Linked = Constants.VIX_CLONETYPE_LINKED - } - - /// - /// A VMWare Virtual Machine. - /// - public class VMWareVirtualMachine : VMWareVixHandle - { - /// - /// Guest file info. - /// - public class GuestFileInfo - { - private int _flags = 0; - private long _fileSize = 0; - private Nullable _lastModified = null; - private string _guestPathName; - - /// - /// File size in bytes, zero for directories. - /// - public long FileSize - { - get { return _fileSize; } - set { _fileSize = value; } - } - - /// - /// File attributes/flags. - /// - public int Flags - { - get { return _flags; } - set { _flags = value; } - } - - /// - /// True if directory. - /// - public bool IsDirectory - { - get { return (_flags & Constants.VIX_FILE_ATTRIBUTES_DIRECTORY) > 0; } - } - - /// - /// True if symbolic link. - /// - public bool IsSymLink - { - get { return (_flags & Constants.VIX_FILE_ATTRIBUTES_SYMLINK) > 0; } - } - - /// - /// Last modified time. - /// - public Nullable LastModified - { - get { return _lastModified; } - set { _lastModified = value; } - } - - /// - /// Guest file or directory name. - /// - public string GuestPathName - { - get { return _guestPathName; } - set { _guestPathName = value; } - } - } - - /// - /// An indexer for variables. - /// - public class VariableIndexer - { - private IVM2 _handle; - private int _variableType; - - /// - /// A variables indexer. - /// - /// Virtual machine's variables to index. - /// Variable type, one of the following. - /// - /// Constants.VIX_VM_GUEST_VARIABLE - /// Constants.VIX_VM_CONFIG_RUNTIME_ONLY - /// Constants.VIX_GUEST_ENVIRONMENT_VARIABLE - /// - /// - public VariableIndexer(IVM2 vm, int variableType) - { - _handle = vm; - _variableType = variableType; - } - - /// - /// Environment, guest and runtime variables. - /// - /// Name of the variable. - [IndexerName("Variables")] - public string this[string name] - { - get - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.ReadVariable( - _variableType, name, 0, callback), - callback)) - { - return job.Wait( - Constants.VIX_PROPERTY_JOB_RESULT_VM_VARIABLE_STRING, - VMWareInterop.Timeouts.ReadVariableTimeout); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to get virtual machine variable: name=\"{0}\"", - name), ex); - } - } - set - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.WriteVariable( - _variableType, name, value, 0, callback), - callback)) - { - job.Wait(VMWareInterop.Timeouts.WriteVariableTimeout); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to set virtual machine variable: name=\"{0}\" value=\"{1}\"", name, value), ex); - } - } - } - } - - /// - /// A process running in the guest operating system. - /// - public class Process - { - /// - /// Process ID. - /// - public long Id; - /// - /// Process name. - /// - public string Name; - /// - /// Process owner. - /// - public string Owner; - /// - /// Process start date/time. - /// - public DateTime StartDateTime; - /// - /// Process command line. - /// - public string Command; - /// - /// True if process is being debugged. - /// - public bool IsBeingDebugged = false; - /// - /// Process exit code for finished processes. - /// - public int ExitCode = 0; - - private IVM2 _vm; - - /// - /// A process running in the guest operating system on a virtual machine. - /// - /// Virtual machine. - public Process(IVM2 vm) - { - _vm = vm; - } - - /// - /// Kill a process in the guest operating system. - /// - public void KillProcessInGuest() - { - KillProcessInGuest(VMWareInterop.Timeouts.KillProcessTimeout); - } - - /// - /// Kill a process in the guest operating system. - /// - /// Timeout in seconds. - public void KillProcessInGuest(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_vm.KillProcessInGuest( - Convert.ToUInt64(Id), 0, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to kill process in guest: processId={0}", - Id), ex); - } - } - } - - private VariableIndexer _guestEnvironmentVariables = null; - private VariableIndexer _runtimeConfigVariables = null; - private VariableIndexer _guestVariables = null; - private VMWareRootSnapshotCollection _snapshots = null; - private VMWareSharedFolderCollection _sharedFolders = null; - - /// - /// A VMWare Virtual Machine. - /// - /// A handle to a virtual machine. - public VMWareVirtualMachine(IVM2 vm) - : base(vm) - { - _guestEnvironmentVariables = new VariableIndexer(_handle, Constants.VIX_GUEST_ENVIRONMENT_VARIABLE); - _runtimeConfigVariables = new VariableIndexer(_handle, Constants.VIX_VM_CONFIG_RUNTIME_ONLY); - _guestVariables = new VariableIndexer(_handle, Constants.VIX_VM_GUEST_VARIABLE); - _sharedFolders = new VMWareSharedFolderCollection(_handle); - _snapshots = new VMWareRootSnapshotCollection(_handle); - } - - - /// - /// The path to the virtual machine configuration file. - /// - public string PathName - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_VMX_PATHNAME); - } - } - - /// - /// Returns true if the virtual machine is running. - /// - public bool IsRunning - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_IS_RUNNING); - } - } - - /// - /// Returns virtual machine powerstate, an OR-ed set of VIX_POWERSTATE_* values. - /// - public int PowerState - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_POWER_STATE); - } - } - - /// - /// Returns true if the virtual machine is paused. - /// - public bool IsPaused - { - get - { - return (PowerState & Constants.VIX_POWERSTATE_PAUSED) > 0; - } - } - - /// - /// Returns true if the virtual machine is suspended. - /// - public bool IsSuspended - { - get - { - return (PowerState & Constants.VIX_POWERSTATE_SUSPENDED) > 0; - } - } - - /// - /// The memory size of the virtual machine. - /// - public int MemorySize - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_MEMORY_SIZE); - } - } - - /// - /// The number of virtual CPUs configured for the virtual machine. - /// - public int CPUCount - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_NUM_VCPUS); - } - } - - /// - /// Power on a virtual machine. - /// - public void PowerOn() - { - PowerOn(VMWareInterop.Timeouts.PowerOnTimeout); - } - - /// - /// Power on a virtual machine. - /// - /// Timeout in seconds. - public void PowerOn(int timeoutInSeconds) - { - PowerOn(Constants.VIX_VMPOWEROP_NORMAL | Constants.VIX_VMPOWEROP_LAUNCH_GUI, - timeoutInSeconds); - } - - /// - /// Power on a virtual machine. - /// - /// Additional power options. - /// Timeout in seconds. - public void PowerOn(int powerOnOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.PowerOn( - powerOnOptions, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to power on virtual machine: powerOnOptions={0} timeoutInSeconds={1}", - powerOnOptions, timeoutInSeconds), ex); - } - } - - /// - /// This function returns when VMware Tools has successfully started in the guest operating system. - /// VMware Tools is a collection of services that run in the guest. - /// - public void WaitForToolsInGuest() - { - WaitForToolsInGuest(VMWareInterop.Timeouts.WaitForToolsTimeout); - } - - /// - /// This function returns when VMware Tools has successfully started in the guest operating system. - /// VMware Tools is a collection of services that run in the guest. - /// - /// Timeout in seconds. - public void WaitForToolsInGuest(int timeoutInSeconds) - { - try - { - // wait till the machine boots or times out with an error - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob( - _handle.WaitForToolsInGuest(timeoutInSeconds, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to wait for tools in guest: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Get all snapshots. - /// - /// A list of snapshots. - public VMWareRootSnapshotCollection Snapshots - { - get - { - return _snapshots; - } - } - - /// - /// This function establishes a guest operating system authentication context. - /// - /// The name of a user account on the guest operating system. - /// The password of the account identified by userName. - public void LoginInGuest(string username, string password) - { - LoginInGuest(username, password, VMWareInterop.Timeouts.LoginTimeout); - } - - /// - /// This function establishes a guest operating system authentication context. - /// - /// The name of a user account on the guest operating system. - /// The password of the account identified by userName. - /// Timeout in seconds. - public void LoginInGuest(string username, string password, int timeoutInSeconds) - { - LoginInGuest(username, password, 0, timeoutInSeconds); - } - - /// - /// This function establishes a guest operating system authentication context. - /// - /// The name of a user account on the guest operating system. - /// The password of the account identified by userName. - /// - /// Must be 0 or VixCOM.Constants.VIX_LOGIN_IN_GUEST_REQUIRE_INTERACTIVE_ENVIRONMENT, which forces interactive - /// guest login within a graphical session that is visible to the user. On Linux, interactive environment - /// requires that the X11 window system be running to start the vmware-user process. Without X11, pass 0 as - /// options to start the vmware-guestd process instead. - /// - /// Timeout in seconds. - /// - /// Logins are supported on Linux and Windows. To log in as a Windows Domain user, specify the "userName" parameter in - /// the form "domain\username". Other guest operating systems are not supported for login, including Solaris, FreeBSD, - /// and Netware. - /// - public void LoginInGuest(string username, string password, int options, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.LoginInGuest( - username, password, options, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to login in guest: username=\"{0}\" options={1} timeoutInSeconds={2}", - username, options, timeoutInSeconds), ex); - } - } - - /// - /// This function waits for the vmwareuser process to exist in the guest. - /// - /// The name of a user account on the guest operating system. - /// The password of the account identified by userName. - /// Timeout in seconds. - public void WaitForVMWareUserProcessInGuest(string username, string password, int timeoutInSeconds) - { - //http://communities.vmware.com/message/1154264 - bool loggedIn = false; - - try - { - LoginInGuest(username, password, timeoutInSeconds); - - loggedIn = true; - - DateTime dtStart = DateTime.Now; - - while (true) - { - VMWareProcessCollection guestProcesses = this.GuestProcesses; - - Process vmwareUserExeProcess = guestProcesses.FindProcess("vmwareuser.exe", StringComparison.OrdinalIgnoreCase); - if (vmwareUserExeProcess != null) - { - break; - } - - vmwareUserExeProcess = guestProcesses.FindProcess("vmware-user", StringComparison.OrdinalIgnoreCase); - if (vmwareUserExeProcess != null) - { - break; - } - - TimeSpan ts = DateTime.Now.Subtract(dtStart); - if (ts.TotalSeconds >= timeoutInSeconds) - { - throw new VMWareException(Constants.VIX_E_TIMEOUT_WAITING_FOR_TOOLS, "vmwareuser"); - } - } - } - finally - { - if (loggedIn) - { - try - { - LogoutFromGuest(timeoutInSeconds); - } - catch - { - //ignore this exception so that it does not swallow any previous exceptions - } - } - } - } - - /// - /// This function waits for the vmwareuser process to exist in the guest. - /// - /// The name of a user account on the guest operating system. - /// The password of the account identified by userName. - public void WaitForVMWareUserProcessInGuest(string username, string password) - { - WaitForVMWareUserProcessInGuest(username, password, VMWareInterop.Timeouts.WaitForToolsTimeout); - } - - /// - /// Copies a file or directory from the local system (where the Vix client is running) to the guest operating system. - /// - /// File location on the host operating system. - /// File location on the guest operating system. - public void CopyFileFromHostToGuest(string hostPathName, string guestPathName) - { - CopyFileFromHostToGuest(hostPathName, guestPathName, VMWareInterop.Timeouts.CopyFileTimeout); - } - - /// - /// Copies a file or directory from the local system (where the Vix client is running) to the guest operating system. - /// You must call LoginInGuest() before calling this procedure. - /// Only absolute paths should be used for files in the guest; the resolution of relative paths is not specified. - /// - /// File location on the host operating system. - /// File location on the guest operating system. - /// Timeout in seconds. - public void CopyFileFromHostToGuest(string hostPathName, string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.CopyFileFromHostToGuest( - hostPathName, guestPathName, 0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to copy file from host to guest: hostPathName=\"{0}\" guestPathName=\"{1}\" timeoutInSeconds={2}", - hostPathName, guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Deletes a file from guest file system. - /// - /// File location on the guest operating system. - public void DeleteFileFromGuest(string guestPathName) - { - DeleteFileFromGuest(guestPathName, VMWareInterop.Timeouts.DeleteFileTimeout); - } - - /// - /// Deletes a file from guest file system. - /// - /// File location on the guest operating system. - /// Timeout in seconds. - public void DeleteFileFromGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.DeleteFileInGuest( - guestPathName, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to delete file from guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Deletes a directory from guest directory system. - /// - /// Directory location on the guest operating system. - public void DeleteDirectoryFromGuest(string guestPathName) - { - DeleteDirectoryFromGuest(guestPathName, VMWareInterop.Timeouts.DeleteDirectoryTimeout); - } - - /// - /// Deletes a directory from guest directory system. - /// - /// Directory location on the guest operating system. - /// Timeout in seconds. - public void DeleteDirectoryFromGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.DeleteDirectoryInGuest( - guestPathName, 0, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to delete directory from guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Copies a file or directory from the guest operating system to the local system (where the Vix client is running). - /// - /// File location on the guest operating system. - /// File location on the host operating system. - public void CopyFileFromGuestToHost(string guestPathName, string hostPathName) - { - CopyFileFromGuestToHost(guestPathName, hostPathName, VMWareInterop.Timeouts.CopyFileTimeout); - } - - /// - /// Copies a file or directory from the guest operating system to the local system (where the Vix client is running). - /// You must call LoginInGuest() before calling this procedure. - /// Only absolute paths should be used for files in the guest; the resolution of relative paths is not specified. - /// - /// File location on the guest operating system. - /// File location on the host operating system. - /// Timeout in seconds. - public void CopyFileFromGuestToHost(string guestPathName, string hostPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.CopyFileFromGuestToHost( - guestPathName, hostPathName, 0, null, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to copy file from guest to host: guestPathName=\"{0}\" hostPathName=\"{1}\" timeoutInSeconds={2}", - guestPathName, hostPathName, timeoutInSeconds), ex); - } - } - - /// - /// Creates a directory on the guest operating system. - /// - /// Directory location on the guest operating system. - public void CreateDirectoryInGuest(string guestPathName) - { - CreateDirectoryInGuest(guestPathName, VMWareInterop.Timeouts.CreateDirectoryTimeout); - } - - /// - /// Creates a directory on the guest operating system. - /// - /// Directory location on the guest operating system. - /// Timeout in seconds. - public void CreateDirectoryInGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.CreateDirectoryInGuest( - guestPathName, null, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to create directory in guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Creates a temp file on the guest operating system. - /// - /// Name of the temporary file created. - public string CreateTempFileInGuest() - { - return CreateTempFileInGuest(VMWareInterop.Timeouts.CreateTempFileTimeout); - } - - /// - /// Creates a temp file on the guest operating system. - /// - /// Timeout in seconds. - /// Name of the temporary file created. - public string CreateTempFileInGuest(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.CreateTempFileInGuest( - 0, null, callback), - callback)) - { - return job.Wait(Constants.VIX_PROPERTY_JOB_RESULT_ITEM_NAME, timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to create temp file in guest: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Return information about a file or directory in the guest operating system. - /// - /// File or path in the guest operating system. - /// Guest file information. - public GuestFileInfo GetFileInfoInGuest(string guestPathName) - { - return GetFileInfoInGuest(guestPathName, VMWareInterop.Timeouts.GetFileInfoTimeout); - } - - /// - /// Return information about a file or directory in the guest operating system. - /// - /// File or path in the guest operating system. - /// Timeout in seconds. - /// Guest file information. - public GuestFileInfo GetFileInfoInGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.GetFileInfoInGuest(guestPathName, callback), callback)) - { - object[] properties = - { - Constants.VIX_PROPERTY_JOB_RESULT_FILE_SIZE, - Constants.VIX_PROPERTY_JOB_RESULT_FILE_FLAGS, - Constants.VIX_PROPERTY_JOB_RESULT_FILE_MOD_TIME - }; - object[] propertyValues = job.Wait(properties, timeoutInSeconds); - GuestFileInfo fileInfo = new GuestFileInfo(); - fileInfo.GuestPathName = guestPathName; - fileInfo.FileSize = (long)propertyValues[0]; - fileInfo.Flags = (int)propertyValues[1]; - fileInfo.LastModified = VMWareInterop.FromUnixEpoch((long)propertyValues[2]); - return fileInfo; - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to get file info in guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Runs a program in the guest operating system. - /// - /// Program to execute. - /// Process information. - public Process RunProgramInGuest(string guestProgramName) - { - return RunProgramInGuest(guestProgramName, string.Empty); - } - - /// - /// Run a program in the guest operating system. - /// - /// Additional command line arguments. - /// Program to execute. - /// Process information. - public Process RunProgramInGuest(string guestProgramName, string commandLineArgs) - { - return RunProgramInGuest(guestProgramName, commandLineArgs, - Constants.VIX_RUNPROGRAM_ACTIVATE_WINDOW, - VMWareInterop.Timeouts.RunProgramTimeout); - } - - /// - /// Run a detached program in the guest operating system. - /// - /// Program to execute. - /// Process information. - public Process DetachProgramInGuest(string guestProgramName) - { - return DetachProgramInGuest(guestProgramName, string.Empty); - } - - /// - /// Run a detached program in the guest operating system. - /// - /// Program to execute. - /// Additional command line arguments. - /// Process information. - public Process DetachProgramInGuest(string guestProgramName, string commandLineArgs) - { - return DetachProgramInGuest(guestProgramName, commandLineArgs, - VMWareInterop.Timeouts.RunProgramTimeout); - } - - /// - /// Run a detached program in the guest operating system. - /// - /// Program to execute. - /// Additional command line arguments. - /// Timeout in seconds. - /// Process information. - public Process DetachProgramInGuest(string guestProgramName, string commandLineArgs, int timeoutInSeconds) - { - return RunProgramInGuest(guestProgramName, commandLineArgs, - Constants.VIX_RUNPROGRAM_ACTIVATE_WINDOW | Constants.VIX_RUNPROGRAM_RETURN_IMMEDIATELY, - timeoutInSeconds); - } - - /// - /// Run a program in the guest operating system. - /// - /// Guest program to run. - /// Additional command line arguments. - /// Timeout in seconds. - /// Process information. - public Process RunProgramInGuest(string guestProgramName, string commandLineArgs, int timeoutInSeconds) - { - return RunProgramInGuest(guestProgramName, commandLineArgs, 0, - timeoutInSeconds); - } - - /// - /// Run a program in the guest operating system. - /// - /// Guest program to run. - /// Additional command line arguments. - /// Additional options, one of VIX_RUNPROGRAM_RETURN_IMMEDIATELY or VIX_RUNPROGRAM_ACTIVATE_WINDOW. - /// Timeout in seconds. - /// Process information. - public Process RunProgramInGuest(string guestProgramName, string commandLineArgs, int options, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.RunProgramInGuest( - guestProgramName, commandLineArgs, options, null, callback), - callback)) - { - object[] properties = - { - Constants.VIX_PROPERTY_JOB_RESULT_GUEST_PROGRAM_EXIT_CODE, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_ID, - // Constants.VIX_PROPERTY_JOB_RESULT_GUEST_PROGRAM_ELAPSED_TIME - }; - object[] propertyValues = job.Wait(properties, timeoutInSeconds); - Process process = new Process(_handle); - process.Name = Path.GetFileName(guestProgramName); - process.Command = guestProgramName; - if (!string.IsNullOrEmpty(commandLineArgs)) - { - process.Command += " "; - process.Command += commandLineArgs; - } - process.ExitCode = (int)propertyValues[0]; - process.Id = (long)propertyValues[1]; - return process; - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to run program in guest: guestProgramName=\"{0}\" commandLineArgs=\"{1}\"", - guestProgramName, commandLineArgs), ex); - } - } - - /// - /// Run a script in the guest operating system. - /// - /// The path to the script interpreter. - /// The text of the script. - /// Process information. - public Process RunScriptInGuest(string interpreter, string scriptText) - { - return RunScriptInGuest(interpreter, scriptText, 0, - VMWareInterop.Timeouts.RunScriptTimeout); - } - - /// - /// Detach a script in the guest operating system. - /// - /// The path to the script interpreter. - /// The text of the script. - /// Process information. - public Process DetachScriptInGuest(string interpreter, string scriptText) - { - return DetachScriptInGuest(interpreter, scriptText, - VMWareInterop.Timeouts.RunScriptTimeout); - } - - /// - /// Detach a script in the guest operating system. - /// - /// The path to the script interpreter. - /// The text of the script. - /// Timeout in seconds. - /// Process information. - public Process DetachScriptInGuest(string interpreter, string scriptText, int timeoutInSeconds) - { - return RunScriptInGuest(interpreter, scriptText, - Constants.VIX_RUNPROGRAM_RETURN_IMMEDIATELY, - timeoutInSeconds); - } - - /// - /// Run a script in the guest operating system. - /// - /// The path to the script interpreter. - /// The text of the script. - /// Run options for the program. - /// Timeout in seconds. - /// Process information. - public Process RunScriptInGuest(string interpreter, string scriptText, int options, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.RunScriptInGuest( - interpreter, scriptText, options, null, callback), - callback)) - { - object[] properties = - { - Constants.VIX_PROPERTY_JOB_RESULT_GUEST_PROGRAM_EXIT_CODE, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_ID, - // Constants.VIX_PROPERTY_JOB_RESULT_GUEST_PROGRAM_ELAPSED_TIME - }; - object[] propertyValues = job.Wait(properties, timeoutInSeconds); - Process process = new Process(_handle); - process.Name = Path.GetFileName(interpreter); - process.Command = interpreter; - process.ExitCode = (int)propertyValues[0]; - process.Id = (long)propertyValues[1]; - return process; - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to run script in guest: interpreter=\"{0}\" scriptText=\"{1}\" options={2} timeoutInSeconds={3}", - interpreter, scriptText, options, timeoutInSeconds), ex); - } - } - - /// - /// Open a browser window on the specified URL in the guest operating system. - /// - /// The url to be opened. - [Obsolete] - public void OpenUrlInGuest(string url) - { - OpenUrlInGuest(url, VMWareInterop.Timeouts.OpenUrlTimeout); - } - - /// - /// Open a browser window on the specified URL in the guest operating system. - /// - /// The url to be opened. - /// Timeout in seconds. - [Obsolete] - public void OpenUrlInGuest(string url, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.OpenUrlInGuest(url, 0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to open url in guest: url=\"{0}\" timeoutInSeconds={1}", - url, timeoutInSeconds), ex); - } - } - - /// - /// Tests the existence of a file in the guest operating system. - /// - /// Path to a file in the guest operating system. - /// True if the file exists in the guest operating system. - public bool FileExistsInGuest(string guestPathName) - { - return FileExistsInGuest(guestPathName, VMWareInterop.Timeouts.FileExistsTimeout); - } - - /// - /// Tests the existence of a file in the guest operating system. - /// - /// Path to a file in the guest operating system. - /// Timeout in seconds. - /// True if the file exists in the guest operating system. - public bool FileExistsInGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.FileExistsInGuest( - guestPathName, callback), - callback)) - { - return job.Wait(Constants.VIX_PROPERTY_JOB_RESULT_GUEST_OBJECT_EXISTS, timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to check if file exists in guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Tests the existence of a directory in the guest operating system. - /// - /// Path to a directory in the guest operating system. - /// True if the directory exists in the guest operating system. - public bool DirectoryExistsInGuest(string guestPathName) - { - return DirectoryExistsInGuest(guestPathName, VMWareInterop.Timeouts.DirectoryExistsTimeout); - } - - /// - /// Tests the existence of a directory in the guest operating system. - /// - /// Path to a directory in the guest operating system. - /// Timeout in seconds. - /// True if the directory exists in the guest operating system. - public bool DirectoryExistsInGuest(string guestPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.DirectoryExistsInGuest( - guestPathName, callback), - callback)) - { - return job.Wait(Constants.VIX_PROPERTY_JOB_RESULT_GUEST_OBJECT_EXISTS, timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to check if directory exists in guest: guestPathName=\"{0}\" timeoutInSeconds={1}", - guestPathName, timeoutInSeconds), ex); - } - } - - /// - /// Remove any guest operating system authentication context created by a previous call to LoginInGuest(), ie. Logout. - /// - public void LogoutFromGuest() - { - LogoutFromGuest(VMWareInterop.Timeouts.LogoutTimeout); - } - - /// - /// Remove any guest operating system authentication context created by a previous call to LoginInGuest(), ie. Logout. - /// - /// Timeout in seconds. - public void LogoutFromGuest(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.LogoutFromGuest(callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to logout from guest: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Power off a virtual machine. The virtual machine will be powered off at the hardware level. - /// Any state of the guest that has not been committed to disk will be lost. - /// - public void PowerOff() - { - PowerOff(Constants.VIX_VMPOWEROP_NORMAL, VMWareInterop.Timeouts.PowerOffTimeout); - } - - /// - /// Power off a virtual machine. The virtual machine will be powered off at the hardware level. - /// Any state of the guest that has not been committed to disk will be lost. - /// - public void ShutdownGuest() - { - ShutdownGuest(VMWareInterop.Timeouts.PowerOffTimeout); - } - - /// - /// Power off a virtual machine. The virtual machine will be powered off at the hardware level. - /// Any state of the guest that has not been committed to disk will be lost. - /// - /// Timeout in seconds. - public void ShutdownGuest(int timeoutInSeconds) - { - PowerOff(Constants.VIX_VMPOWEROP_FROM_GUEST, timeoutInSeconds); - } - - /// - /// Power off or shutdown a virtual machine. - /// If you call this function while the virtual machine is powered off or suspended, the operation will throw an - /// exception with a VIX_E_VM_NOT_RUNNING error. - /// - /// Power-off options. Passing the VIX_VMPOWEROP_FROM_GUEST flag will cause the function - /// to try to power off the guest OS. This will ensure a clean shutdown of the guest. This option requires that the - /// VMware Tools be installed and running in the guest. If VIX_VMPOWEROP_NORMAL is passed as the "powerOffOptions" parameter, - /// then the virtual machine will be powered off at the hardware level. Any state of the guest that has not been committed - /// to disk will be lost. - /// - /// Timeout in seconds. - public void PowerOff(int powerOffOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.PowerOff(powerOffOptions, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to power off virtual machine: powerOffOptions={0} timeoutInSeconds={1}", - powerOffOptions, timeoutInSeconds), ex); - } - } - - /// - /// Hardware reset the virtual machine. - /// - public void Reset() - { - Reset(Constants.VIX_VMPOWEROP_NORMAL); - } - - /// - /// Hardware reset the virtual machine. - /// - /// Reset options. - /// Passing VIX_VMPOWEROP_NORMAL will force a hardware reset. - /// Passing VIX_VMPOWEROP_FROM_GUEST will attempt a clean shutdown of the guest operating system. - /// - public void Reset(int resetOptions) - { - Reset(resetOptions, VMWareInterop.Timeouts.ResetTimeout); - } - - /// - /// Reset a virtual machine. - /// - /// Reset options. - /// Passing VIX_VMPOWEROP_NORMAL will force a hardware reset. - /// Passing VIX_VMPOWEROP_FROM_GUEST will attempt a clean shutdown of the guest operating system. - /// - /// Timeout in seconds. - public void Reset(int resetOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Reset(resetOptions, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to reset virtual machine: resetOptions={0} timeoutInSeconds={1}", - resetOptions, timeoutInSeconds), ex); - } - } - - /// - /// Suspend the virtual machine. - /// - public void Suspend() - { - Suspend(VMWareInterop.Timeouts.SuspendTimeout); - } - - /// - /// Suspend a virtual machine. - /// - /// Timeout in seconds. - public void Suspend(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Suspend(0, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to suspend virtual machine: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Pause the virtual machine. - /// - public void Pause() - { - Pause(VMWareInterop.Timeouts.PauseTimeout); - } - - /// - /// Pause a virtual machine. - /// This stops execution of the virtual machine. - /// Call Unpause to continue execution of the virtual machine. - /// - /// Timeout in seconds. - public void Pause(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Pause(0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to pause virtual machine: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Continue execution of a virtual machine that was stopped using Pause. - /// - public void Unpause() - { - Unpause(VMWareInterop.Timeouts.UnpauseTimeout); - } - - /// - /// Continue execution of a virtual machine that was stopped using Pause. - /// - /// Timeout in seconds. - public void Unpause(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Unpause(0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to unpause virtual machine: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// List files in the guest operating system. - /// - /// Path in the guest operating system to list. - /// Recruse into subdirectories. - /// A list of files and directories with full paths. - public List ListDirectoryInGuest(string pathName, bool recurse) - { - return ListDirectoryInGuest(pathName, recurse, VMWareInterop.Timeouts.ListDirectoryTimeout); - } - - /// - /// List files in the guest operating system. - /// - /// Path in the guest operating system to list. - /// Recruse into subdirectories. - /// Timeout in seconds. - /// - /// The function throws an exception if pathName doesn't exist. - /// - /// A list of files and directories with full paths. - public List ListDirectoryInGuest(string pathName, bool recurse, int timeoutInSeconds) - { - // ListDirectoryInGuest behaves differently on VMWare Workstation (returns empty list) and - // ESX (throws an exception) for directories or files that don't exist. - if (!DirectoryExistsInGuest(pathName)) - throw new VMWareException(2); - - try - { - List results = new List(); - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.ListDirectoryInGuest( - pathName, 0, callback), callback)) - { - - object[] properties = - { - Constants.VIX_PROPERTY_JOB_RESULT_ITEM_NAME, - Constants.VIX_PROPERTY_JOB_RESULT_FILE_FLAGS - }; - - try - { - foreach (object[] fileProperties in job.YieldWait(properties, timeoutInSeconds)) - { - string fileName = (string)fileProperties[0]; - int flags = (int)fileProperties[1]; - - if ((flags & 1) > 0) - { - if (recurse) - { - results.AddRange(ListDirectoryInGuest(Path.Combine(pathName, fileName), - true, timeoutInSeconds)); - } - } - else - { - results.Add(Path.Combine(pathName, fileName)); - } - } - } - catch (VMWareException ex) - { - switch (ex.ErrorCode) - { - case 2: - // file not found? empty directory in ESX - case Constants.VIX_E_UNRECOGNIZED_PROPERTY: - // unrecognized property returned by GetNumProperties, the directory exists, but contains no files - break; - default: - throw; - } - } - } - return results; - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to list directory in guest: pathName=\"{0}\" recurse={1} timeoutInSeconds={2}", - pathName, recurse, timeoutInSeconds), ex); - } - } - - /// - /// An environment variable in the guest of the VM. On a Windows NT series guest, writing these - /// values is saved persistently so they are immediately visible to every process. On a Linux or Windows 9X guest, - /// writing these values is not persistent so they are only visible to the VMware tools process. - /// - public VariableIndexer GuestEnvironmentVariables - { - get - { - return _guestEnvironmentVariables; - } - } - - /// - /// A "Guest Variable". This is a runtime-only value; it is never stored persistently. - /// This is the same guest variable that is exposed through the VMControl APIs, and is a simple - /// way to pass runtime values in and out of the guest. - /// VMWare doesn't publish a list of known variables, the following guest variables have been observed. - /// - /// ip: IP address of the guest operating system. - /// - /// - public VariableIndexer GuestVariables - { - get - { - return _guestVariables; - } - } - - /// - /// The configuration state of the virtual machine. This is the .vmx file that is stored on the host. - /// You can read this and it will return the persistent data. If you write to this, it will only be a - /// runtime change, so changes will be lost when the VM powers off. - /// - public VariableIndexer RuntimeConfigVariables - { - get - { - return _runtimeConfigVariables; - } - } - - /// - /// Shared folders on this virtual machine. - /// - public VMWareSharedFolderCollection SharedFolders - { - get - { - return _sharedFolders; - } - } - - /// - /// Captures the screen of the guest operating system. - /// - /// A object holding the captured screen image. - public Image CaptureScreenImage() - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.CaptureScreenImage( - Constants.VIX_CAPTURESCREENFORMAT_PNG, null, callback), - callback)) - { - byte[] imageBytes = job.Wait( - Constants.VIX_PROPERTY_JOB_RESULT_SCREEN_IMAGE_DATA, - VMWareInterop.Timeouts.CaptureScreenImageTimeout); - return Image.FromStream(new MemoryStream(imageBytes)); - } - } - catch (Exception ex) - { - throw new Exception("Failed to capture screen image", ex); - } - } - - /// - /// Running processes in the guest operating system. - /// - public VMWareProcessCollection GuestProcesses - { - get - { - try - { - VMWareProcessCollection processes = new VMWareProcessCollection(); - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.ListProcessesInGuest( - 0, callback), callback)) - { - object[] properties = - { - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_ID, - Constants.VIX_PROPERTY_JOB_RESULT_ITEM_NAME, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_OWNER, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_START_TIME, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_COMMAND, - Constants.VIX_PROPERTY_JOB_RESULT_PROCESS_BEING_DEBUGGED, - }; - - foreach (object[] processProperties in job.YieldWait(properties, VMWareInterop.Timeouts.ListProcessesTimeout)) - { - Process process = new Process(_handle); - process.Id = (long)processProperties[0]; - process.Name = (string)processProperties[1]; - process.Owner = (string)processProperties[2]; - process.StartDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((int)processProperties[3]); - process.Command = (string)processProperties[4]; - process.IsBeingDebugged = (bool)processProperties[5]; - processes.Add(process.Id, process); - } - - return processes; - } - } - catch (Exception ex) - { - throw new Exception("Failed to list processes in guest", ex); - } - } - } - - /// - /// Returns true if the virtual machine is in the process of recording. - /// - public bool IsRecording - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_IS_RECORDING); - } - } - - /// - /// Returns true if the virtual machine is in the process of replaying. - /// - public bool IsReplaying - { - get - { - return GetProperty(Constants.VIX_PROPERTY_VM_IS_REPLAYING); - } - } - - /// - /// Records a virtual machine's activity as a snapshot object. - /// - /// Snapshot name. - /// Resulting snapshot. - public VMWareSnapshot BeginRecording(string name) - { - return BeginRecording(name, string.Empty); - } - - /// - /// Records a virtual machine's activity as a snapshot object. - /// - /// Snapshot name. - /// Snapshot description. - /// Resulting snapshot. - public VMWareSnapshot BeginRecording(string name, string description) - { - return BeginRecording(name, description, VMWareInterop.Timeouts.RecordingTimeout); - } - - /// - /// Records a virtual machine's activity as a snapshot object. - /// - /// Snapshot name. - /// Snapshot description. - /// Timeout in seconds. - /// Resulting snapshot. - public VMWareSnapshot BeginRecording(string name, string description, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.BeginRecording(name, description, 0, null, callback), callback)) - { - VMWareSnapshot snapshot = new VMWareSnapshot(_handle, - job.Wait(Constants.VIX_PROPERTY_JOB_RESULT_HANDLE, timeoutInSeconds), - null); - _snapshots.Add(snapshot); - return snapshot; - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to begin recording: name=\"{0}\" description=\"{1}\" timeoutInSeconds={2}", - name, description, timeoutInSeconds), ex); - } - } - - /// - /// This function stops recording a virtual machine's activity. - /// - public void EndRecording() - { - EndRecording(VMWareInterop.Timeouts.RecordingTimeout); - } - - /// - /// This function stops recording a virtual machine's activity. - /// - /// Timeout in seconds. - public void EndRecording(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.EndRecording( - 0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to end recording: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Upgrades the virtual hardware version of the virtual machine to match the version of the VIX library. - /// This has no effect if the virtual machine is already at the same version or at a newer version than the VIX library. - /// - public void UpgradeVirtualHardware() - { - UpgradeVirtualHardware(VMWareInterop.Timeouts.UpgradeVirtualHardwareTimeout); - } - - /// - /// Upgrades the virtual hardware version of the virtual machine to match the version of the VIX library. - /// This has no effect if the virtual machine is already at the same version or at a newer version than the VIX library. - /// - /// Timeout in seconds. - public void UpgradeVirtualHardware(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.UpgradeVirtualHardware( - 0, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to upgrade virtual hardware: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Creates a copy of the virtual machine at current state. - /// - /// Virtual Machine clone type. - /// The path name of the virtual machine configuration file that will be created. - public void Clone(VMWareVirtualMachineCloneType cloneType, string destConfigPathName) - { - Clone(cloneType, destConfigPathName, VMWareInterop.Timeouts.CloneTimeout); - } - - /// - /// Creates a copy of the virtual machine at current state. - /// - /// Virtual Machine clone type. - /// The path name of the virtual machine configuration file that will be created. - /// Timeout in seconds. - public void Clone(VMWareVirtualMachineCloneType cloneType, string destConfigPathName, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Clone( - null, (int)cloneType, destConfigPathName, 0, null, callback), - callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to clone virtual machine: cloneType=\"{0}\" destConfigPathName=\"{1}\" timeoutInSeconds={2}", - Enum.GetName(cloneType.GetType(), cloneType), destConfigPathName, timeoutInSeconds), ex); - } - } - - /// - /// Permanently deletes a virtual machine from the host system. - /// - /// - /// Does not delete all associated files. - /// - public void Delete() - { - Delete(0, VMWareInterop.Timeouts.DeleteTimeout); - } - - /// - /// Permanently deletes a virtual machine from the host system. - /// - /// Delete options. - /// - /// VixCOM.Constants.VIX_VMDELETE_DISK_FILES: delete all associated files. - /// - /// - public void Delete(int deleteOptions) - { - Delete(deleteOptions, VMWareInterop.Timeouts.DeleteTimeout); - } - - /// - /// Permanently deletes a virtual machine from the host system. - /// - /// - /// - /// VixCOM.Constants.VIX_VMDELETE_DISK_FILES: delete all associated files. - /// - /// - /// Timeout in seconds. - public void Delete(int deleteOptions, int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.Delete(deleteOptions, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to delete virtual machine: deleteOptions={0} timeoutInSeconds={1}", - deleteOptions, timeoutInSeconds), ex); - } - } - - /// - /// Prepares to install VMware Tools on the guest operating system. - /// - /// - /// Prepares an ISO image to install VMware Tools on the guest operating system. - /// If autorun is enabled, as it often is on Windows, installation begins, otherwise - /// you must initiate installation. If VMware Tools is already installed, this function - /// prepares to upgrade it to the version matching the product. - /// - public void InstallTools() - { - InstallTools(VMWareInterop.Timeouts.InstallToolsTimeout); - } - - /// - /// Prepares to install VMware Tools on the guest operating system. - /// - /// - /// Prepares an ISO image to install VMware Tools on the guest operating system. - /// If autorun is enabled, as it often is on Windows, installation begins, otherwise - /// you must initiate installation. If VMware Tools is already installed, this function - /// prepares to upgrade it to the version matching the product. - /// - /// Timeout in seconds. - public void InstallTools(int timeoutInSeconds) - { - try - { - VMWareJobCallback callback = new VMWareJobCallback(); - using (VMWareJob job = new VMWareJob(_handle.InstallTools(0, null, callback), callback)) - { - job.Wait(timeoutInSeconds); - } - } - catch (Exception ex) - { - throw new Exception( - string.Format("Failed to install tools: timeoutInSeconds={0}", - timeoutInSeconds), ex); - } - } - - /// - /// Dispose the virtual machine object. - /// - public override void Dispose() - { - _guestVariables = null; - _runtimeConfigVariables = null; - _guestEnvironmentVariables = null; - - if (_snapshots != null) - { - _snapshots.Dispose(); - _snapshots = null; - } - - _sharedFolders = null; - base.Dispose(); - } - } -} diff --git a/source/Archive/VMWareLib/VMWareVixHandle.cs b/source/Archive/VMWareLib/VMWareVixHandle.cs deleted file mode 100644 index 9bf2e8abe4..0000000000 --- a/source/Archive/VMWareLib/VMWareVixHandle.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Interop.VixCOM; - -namespace Vestris.VMWareLib -{ - /// - /// A wrapper for a VixCOM handle. - /// - /// Type of VixCOM handle. - /// - /// Most VixCOM objects returned from VixCOM API functions implement IVixHandle. - /// - public class VMWareVixHandle : IDisposable - { - /// - /// Raw VixCOM handle of implemented type. - /// - protected T _handle = default(T); - - /// - /// Pointer to the IVixHandle interface. - /// - protected IVixHandle _vixhandle - { - get - { - return _handle as IVixHandle; - } - } - - /// - /// Pointer to the IVixHandle2 interface. - /// - /// - /// This type was introduced in VixCOM 1.7.0 and will return null with older versions of VixCOM. - /// - protected IVixHandle2 _vixhandle2 - { - get - { - return _handle as IVixHandle2; - } - } - - /// - /// A constructor for a null Vix handle. - /// - public VMWareVixHandle() - { - - } - - /// - /// A constructor for an existing Vix handle. - /// - /// handle value - public VMWareVixHandle(T handle) - { - _handle = handle; - } - - /// - /// Get an array of properties. - /// - /// properties to fetch - /// An array of property values. - public object[] GetProperties(object[] properties) - { - object result = null; - VMWareInterop.Check(_vixhandle.GetProperties(properties, ref result)); - return (object[])result; - } - - /// - /// Return the value of a single property. - /// - /// property id - /// property value type - /// The value of a single property of type R. - public R GetProperty(int propertyId) - { - object[] properties = { propertyId }; - return (R)GetProperties(properties)[0]; - } - - /// - /// Close the handle. - /// - public void Close() - { - if (_vixhandle2 != null) - { - _vixhandle2.Close(); - _handle = default(T); - } - } - - #region IDisposable Members - - /// - /// Close the handle with VixCOM 1.7.0 or newer. - /// - public virtual void Dispose() - { - Close(); - } - - #endregion - } -} diff --git a/source/Cosmos.Build.Builder/App.xaml b/source/Cosmos.Build.Builder/App.xaml index a9e0e5a35c..df537723ee 100644 --- a/source/Cosmos.Build.Builder/App.xaml +++ b/source/Cosmos.Build.Builder/App.xaml @@ -1,3 +1,13 @@  + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"> + + + + + + + + + diff --git a/source/Cosmos.Build.Builder/App.xaml.cs b/source/Cosmos.Build.Builder/App.xaml.cs index 447d80be97..e6917ea987 100644 --- a/source/Cosmos.Build.Builder/App.xaml.cs +++ b/source/Cosmos.Build.Builder/App.xaml.cs @@ -8,6 +8,7 @@ using Cosmos.Build.Builder.Services; using Cosmos.Build.Builder.ViewModels; using Cosmos.Build.Builder.Views; +using System.Text; namespace Cosmos.Build.Builder { @@ -20,15 +21,21 @@ protected override void OnStartup(StartupEventArgs e) if (Process.GetProcessesByName("Cosmos.Build.Builder").Skip(1).Any()) { ShowErrorMessageBox("Cannot run more than 1 instance of builder at the same time!"); + Current.Shutdown(); + return; } + + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + MainWindow = new MainWindow(); + + // ask for build configuration + OptionsDialog options = new(); + options.ShowDialog(); - var configuration = new CommandLineBuilderConfiguration(e.Args); - - BuilderConfiguration = configuration; + BuilderConfiguration = options.BuildOptions; - MainWindow = new MainWindow(); - var visualStudioService = new VisualStudioService(); + VisualStudioService visualStudioService = new(); var visualStudioInstances = visualStudioService.GetInstances(); @@ -40,15 +47,6 @@ protected override void OnStartup(StartupEventArgs e) ISetupInstance2 visualStudioInstance = null; - if (configuration.VsPath != null) - { - visualStudioInstance = visualStudioInstances.FirstOrDefault( - i => String.Equals( - Path.GetFullPath(configuration.VsPath), - Path.GetFullPath(i.GetInstallationPath()), - StringComparison.Ordinal)); - } - if (visualStudioInstance == null) { if (visualStudioInstances.Count == 1) @@ -85,12 +83,12 @@ protected override void OnStartup(StartupEventArgs e) // show first, or setting owner on dialog windows may fail, as the main window may have not been shown yet. MainWindow.Show(); - MainWindow.DataContext = new MainWindowViewModel(dependencyInstallationDialogService, buildDefinition); + MainWindow.DataContext = new MainWindowViewModel(dependencyInstallationDialogService, buildDefinition, (MainWindow)MainWindow); base.OnStartup(e); } - private void ShowErrorMessageBox(string message) => - MessageBox.Show(message, "Cosmos Kit Builder", MessageBoxButton.OK, MessageBoxImage.Error); + private static void ShowErrorMessageBox(string message) => + System.Windows.MessageBox.Show(message, "Cosmos Kit Builder", MessageBoxButton.OK, MessageBoxImage.Error); } } diff --git a/source/Cosmos.Build.Builder/BuildTasks/BuildTask.cs b/source/Cosmos.Build.Builder/BuildTasks/BuildTask.cs index 249d44d03a..98f334dc0c 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/BuildTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/BuildTask.cs @@ -17,20 +17,22 @@ internal class BuildTask : MSBuildTargetBuildTaskBase protected override IReadOnlyDictionary Properties => _properties; - private Dictionary _properties; + private readonly Dictionary _properties; public BuildTask( IMSBuildService msBuildService, string projectFilePath, string outputPath, - string vsixOutputPath) + string vsixOutputPath) // vsixBuild triggers if the vsix value is set, causing IL2CPU.Debug.Symbols to target net48 : base(msBuildService) { ProjectFilePath = projectFilePath; - _properties = new Dictionary(); - _properties.Add("OutputPath", outputPath); - _properties.Add("VsixOutputPath", vsixOutputPath); + _properties = new Dictionary() + { + ["OutputPath"] = outputPath, + ["VsixOutputPath"] = vsixOutputPath + }; } } } diff --git a/source/Cosmos.Build.Builder/BuildTasks/CreateSetupTask.cs b/source/Cosmos.Build.Builder/BuildTasks/CreateSetupTask.cs index f1ac19f7af..8033431dde 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/CreateSetupTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/CreateSetupTask.cs @@ -10,27 +10,40 @@ internal class CreateSetupTask : ProcessBuildTaskBase { public override string Name => "Create Setup"; - private IInnoSetupService _innoSetupService; + private readonly IInnoSetupService _innoSetupService; - private string _scriptFilePath; - - private Dictionary _defines; + private readonly string _scriptFilePath; + private readonly Dictionary _defines; public CreateSetupTask( IInnoSetupService innoSetupService, string scriptFilePath, string configuration, - string releaseVersion) + string releaseVersion, + bool InstallExtensions) : base(true, false) { _innoSetupService = innoSetupService; _scriptFilePath = scriptFilePath; - _defines = new Dictionary(); + _defines = new Dictionary() + { + ["BuildConfiguration"] = configuration, + ["ChangeSetVersion"] = releaseVersion, + }; + + if(!InstallExtensions) + { + _defines.Add("DoNotInstallExtensions", "1"); + } - _defines.Add("BuildConfiguration", configuration); - _defines.Add("ChangeSetVersion", releaseVersion); + // when building the userkit we want to let innosetup determine the installation location + // see https://github.com/CosmosOS/Cosmos/issues/2329 + if (configuration == "DevKit") + { + _defines["RealPath"] = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + } } protected override string GetExePath() @@ -40,7 +53,7 @@ protected override string GetExePath() if (!File.Exists(innoSetupCompilerPath)) { - throw new InvalidOperationException("Inno Setup installation detected, but the compiler doesn't exist!"); + throw new InvalidOperationException($"An Inno Setup installation was detected, but no compiler exists at {innoSetupCompilerPath}"); } return innoSetupCompilerPath; diff --git a/source/Cosmos.Build.Builder/BuildTasks/MSBuildTargetBuildTaskBase.cs b/source/Cosmos.Build.Builder/BuildTasks/MSBuildTargetBuildTaskBase.cs index 926329c639..c7d62cbd8e 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/MSBuildTargetBuildTaskBase.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/MSBuildTargetBuildTaskBase.cs @@ -12,7 +12,7 @@ internal abstract class MSBuildTargetBuildTaskBase : ProcessBuildTaskBase protected abstract IReadOnlyDictionary Properties { get; } - private IMSBuildService _msBuildService; + private readonly IMSBuildService _msBuildService; protected MSBuildTargetBuildTaskBase(IMSBuildService msBuildService) : base(true, false) @@ -29,7 +29,7 @@ protected override string GetArguments() throw new InvalidOperationException("ProjectFilePath is null!"); } - var args = $"\"{ProjectFilePath}\" /nologo /maxcpucount /nodeReuse:False /verbosity:minimal /t:\"{String.Join(";", Targets)}\""; + var args = $"\"{ProjectFilePath}\" /nologo /maxcpucount /m /nodeReuse:False /verbosity:minimal /t:\"{String.Join(";", Targets)}\""; if (Properties != null) { diff --git a/source/Cosmos.Build.Builder/BuildTasks/PackTask.cs b/source/Cosmos.Build.Builder/BuildTasks/PackTask.cs index bab999a322..6f620853fa 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/PackTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/PackTask.cs @@ -17,7 +17,7 @@ internal class PackTask : MSBuildTargetBuildTaskBase protected override IReadOnlyDictionary Properties => _properties; - private Dictionary _properties; + private readonly Dictionary _properties; public PackTask( IMSBuildService msBuildService, diff --git a/source/Cosmos.Build.Builder/BuildTasks/ProcessBuildTaskBase.cs b/source/Cosmos.Build.Builder/BuildTasks/ProcessBuildTaskBase.cs index d99bbabbde..118d2a2d31 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/ProcessBuildTaskBase.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/ProcessBuildTaskBase.cs @@ -1,8 +1,11 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Threading; namespace Cosmos.Build.Builder.BuildTasks { @@ -10,8 +13,9 @@ internal abstract class ProcessBuildTaskBase : IBuildTask { public abstract string Name { get; } - private bool _waitForExit; - private bool _createWindow; + private readonly bool _waitForExit; + private readonly bool _createWindow; + private static List Lines = new List(); protected ProcessBuildTaskBase(bool waitForExit, bool createWindow) { @@ -26,6 +30,7 @@ public Task RunAsync(ILogger logger) logger.LogMessage($"\"{exePath}\" {args}"); + Lines.Clear(); var process = new Process(); var processStartInfo = new ProcessStartInfo(exePath, args); @@ -56,27 +61,48 @@ public Task RunAsync(ILogger logger) protected abstract string GetExePath(); protected abstract string GetArguments(); - private void WaitForExit(Process process) + private static void WaitForExit(Process process) { process.WaitForExit(); if (process.ExitCode != 0) { - throw new Exception("The process failed to execute!"); + if (Lines.Count == 0) + { + throw new Exception("The process failed to execute!"); + } + else + { + string error = ""; + foreach (var item in Lines) + { + if (item.ToLower().Contains("error")) + { + error += item + "\n"; + } + } + if (error == "") + { + error = Lines[Lines.Count - 1]; + } + throw new Exception("The process failed to execute!\nError: \n"+error); + } } } - private async Task ReadOutputAsync(StreamReader reader, ILogger logger) + private static async Task ReadOutputAsync(StreamReader reader, ILogger logger) { while (true) { + Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, + new Action(delegate { })); var line = await reader.ReadLineAsync().ConfigureAwait(false); if (line == null) { return; } - + Lines.Add(line); logger.LogMessage(line); } } diff --git a/source/Cosmos.Build.Builder/BuildTasks/PublishTask.cs b/source/Cosmos.Build.Builder/BuildTasks/PublishTask.cs index 40d31a2d59..ec7916a126 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/PublishTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/PublishTask.cs @@ -17,7 +17,7 @@ internal class PublishTask : MSBuildTargetBuildTaskBase protected override IReadOnlyDictionary Properties => _properties; - private Dictionary _properties; + private readonly Dictionary _properties; public PublishTask( IMSBuildService msBuildService, @@ -27,8 +27,10 @@ public PublishTask( { ProjectFilePath = projectFilePath; - _properties = new Dictionary(); - _properties.Add("PublishDir", publishOutputPath); + _properties = new Dictionary() + { + ["PublishDir"] = publishOutputPath + }; } } } diff --git a/source/Cosmos.Build.Builder/BuildTasks/RestoreTask.cs b/source/Cosmos.Build.Builder/BuildTasks/RestoreTask.cs index 82ecf98923..9e2fe82979 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/RestoreTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/RestoreTask.cs @@ -15,7 +15,8 @@ internal class RestoreTask : MSBuildTargetBuildTaskBase public override IEnumerable Targets { get { yield return RestoreTaskName; } } - protected override IReadOnlyDictionary Properties => null; + protected override IReadOnlyDictionary Properties => _properties; + private readonly Dictionary _properties = new Dictionary(); public RestoreTask( IMSBuildService msBuildService, diff --git a/source/Cosmos.Build.Builder/BuildTasks/StartProcessTask.cs b/source/Cosmos.Build.Builder/BuildTasks/StartProcessTask.cs index c8e309987e..f9cdce53b7 100644 --- a/source/Cosmos.Build.Builder/BuildTasks/StartProcessTask.cs +++ b/source/Cosmos.Build.Builder/BuildTasks/StartProcessTask.cs @@ -6,10 +6,10 @@ internal class StartProcessTask : ProcessBuildTaskBase { public override string Name => $"Run Process - {_processName ?? Path.GetFileNameWithoutExtension(_exePath)}"; - private string _exePath; - private string _args; + private readonly string _exePath; + private readonly string _args; - private string _processName; + private readonly string _processName; public StartProcessTask( string exePath, diff --git a/source/Cosmos.Build.Builder/BuilderConfiguration.cs b/source/Cosmos.Build.Builder/BuilderConfiguration.cs new file mode 100644 index 0000000000..756bf7ead2 --- /dev/null +++ b/source/Cosmos.Build.Builder/BuilderConfiguration.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace Cosmos.Build.Builder +{ + internal class BuilderConfiguration : IBuilderConfiguration + { + public bool NoVsLaunch { get; set; } + public bool UserKit { get; set; } + public bool BuildExtensions { get; set; } + } +} diff --git a/source/Cosmos.Build.Builder/CommandLineBuilderConfiguration.cs b/source/Cosmos.Build.Builder/CommandLineBuilderConfiguration.cs deleted file mode 100644 index 30b48f8cd3..0000000000 --- a/source/Cosmos.Build.Builder/CommandLineBuilderConfiguration.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace Cosmos.Build.Builder -{ - internal class CommandLineBuilderConfiguration : IBuilderConfiguration - { - public bool NoVsLaunch => GetSwitch(); - public bool UserKit => GetSwitch(); - public string VsPath => GetOption(); - - private Dictionary _args; - - public CommandLineBuilderConfiguration(string[] args) - { - _args = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var arg in args) - { - var keyValue = arg.Split('='); - - if (keyValue.Length > 0) - { - var key = keyValue[0].Remove(0, 1); - - _args.Add(key, null); - - if (keyValue.Length > 1) - { - _args[key] = keyValue[1]; - } - } - } - } - - private bool GetSwitch([CallerMemberName] string name = null) => - _args.ContainsKey(name) && !String.Equals(_args[name], "False", StringComparison.OrdinalIgnoreCase); - - private string GetOption([CallerMemberName] string name = null) - { - if (_args.TryGetValue(name, out var value)) - { - return value; - } - - return null; - } - } -} diff --git a/source/Cosmos.Build.Builder/Cosmos.Build.Builder.csproj b/source/Cosmos.Build.Builder/Cosmos.Build.Builder.csproj index f1b94e273c..7f6c596f19 100644 --- a/source/Cosmos.Build.Builder/Cosmos.Build.Builder.csproj +++ b/source/Cosmos.Build.Builder/Cosmos.Build.Builder.csproj @@ -1,29 +1,24 @@ - - - - net471 - WinExe - Resources\Cosmos.ico - True - - - - - - - - - - - - - - - - - - - - - - + + + net6.0-windows7.0 + WinExe + Resources\Cosmos.ico + True + False + app.manifest + False + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/Cosmos.Build.Builder/CosmosBuildDefinition.cs b/source/Cosmos.Build.Builder/CosmosBuildDefinition.cs index ad6ce57805..2a66b96182 100644 --- a/source/Cosmos.Build.Builder/CosmosBuildDefinition.cs +++ b/source/Cosmos.Build.Builder/CosmosBuildDefinition.cs @@ -12,9 +12,9 @@ namespace Cosmos.Build.Builder { internal class CosmosBuildDefinition : IBuildDefinition { - private IInnoSetupService _innoSetupService; - private IMSBuildService _msBuildService; - private ISetupInstance2 _visualStudioInstance; + private readonly IInnoSetupService _innoSetupService; + private readonly IMSBuildService _msBuildService; + private readonly ISetupInstance2 _visualStudioInstance; private readonly string _cosmosDir; @@ -37,7 +37,8 @@ public CosmosBuildDefinition( public IEnumerable GetDependencies() { - yield return new ReposDependency(_cosmosDir); + yield return new ReposDependency(_cosmosDir); + yield return new ProperRepoNameDependency(_cosmosDir); yield return new VisualStudioDependency(_visualStudioInstance); yield return new VisualStudioWorkloadsDependency(_visualStudioInstance); yield return new InnoSetupDependency(_innoSetupService); @@ -71,11 +72,14 @@ void CleanPackage(string aPackage) var il2cpuDir = Path.GetFullPath(Path.Combine(_cosmosDir, "..", "IL2CPU")); + var xSharpDir = Path.GetFullPath(Path.Combine(_cosmosDir, "..", "XSharp")); + var cosmosSourceDir = Path.Combine(_cosmosDir, "source"); var il2cpuSourceDir = Path.Combine(il2cpuDir, "source"); + var xSharpSourceDir = Path.Combine(xSharpDir, "source"); var buildSlnPath = Path.Combine(_cosmosDir, "Build.sln"); - + var vsipDir = Path.Combine(_cosmosDir, "Build", "VSIP") + '\\'; if (Directory.Exists(vsipDir)) @@ -84,7 +88,7 @@ void CleanPackage(string aPackage) } // Restore Build.sln - + yield return new RestoreTask(_msBuildService, buildSlnPath); // Build Build.sln @@ -96,6 +100,7 @@ void CleanPackage(string aPackage) var il2cpuProjectPath = Path.Combine(il2cpuSourceDir, "IL2CPU", "IL2CPU.csproj"); var il2cpuPublishPath = Path.Combine(vsipDir, "IL2CPU"); + yield return new RestoreTask(_msBuildService, il2cpuProjectPath); yield return new PublishTask(_msBuildService, il2cpuProjectPath, il2cpuPublishPath); // Pack build system and kernel assemblies @@ -103,11 +108,20 @@ void CleanPackage(string aPackage) var cosmosPackageProjects = new List() { "Cosmos.Build.Tasks", + }; + + foreach (var task in PackProject(cosmosPackageProjects, new List(), new List())) + { + yield return task; + } + + cosmosPackageProjects = new List() + { + "Cosmos.Core_Plugs", // we ned to restore il2cpu.debug. "Cosmos.Common", "Cosmos.Core", - "Cosmos.Core_Plugs", "Cosmos.Core_Asm", "Cosmos.HAL2", @@ -116,7 +130,9 @@ void CleanPackage(string aPackage) "Cosmos.System2_Plugs", "Cosmos.Debug.Kernel", - "Cosmos.Debug.Kernel.Plugs.Asm" + "Cosmos.Debug.Kernel.Plugs.Asm", + + "Cosmos.Plugs" }; var il2cpuPackageProjects = new List() @@ -124,15 +140,16 @@ void CleanPackage(string aPackage) "IL2CPU.API" }; - var packageProjectPaths = cosmosPackageProjects.Select(p => Path.Combine(cosmosSourceDir, p)); - packageProjectPaths = packageProjectPaths.Concat(il2cpuPackageProjects.Select(p => Path.Combine(il2cpuSourceDir, p))); + var xSharpProjects = new List() + { + "Spruce", + "XSharp/XSharp" + }; - var packagesDir = Path.Combine(vsipDir, "packages"); - var packageVersionLocalBuildSuffix = DateTime.Now.ToString("yyyyMMddhhmmss"); - foreach (var projectPath in packageProjectPaths) + foreach (var task in PackProject(cosmosPackageProjects, il2cpuPackageProjects, xSharpProjects)) { - yield return new PackTask(_msBuildService, projectPath, packagesDir, packageVersionLocalBuildSuffix); + yield return task; } var cosmosSetupDir = Path.Combine(_cosmosDir, "setup"); @@ -146,11 +163,12 @@ void CleanPackage(string aPackage) _innoSetupService, innoSetupScriptPath, App.BuilderConfiguration.UserKit ? "UserKit" : "DevKit", - cosmosSetupVersion); + cosmosSetupVersion, + App.BuilderConfiguration.BuildExtensions); if (!App.BuilderConfiguration.UserKit) { - var cosmosSetupPath = Path.Combine(cosmosSetupDir, "Output", $"CosmosUserKit-{cosmosSetupVersion}-vs2017.exe"); + var cosmosSetupPath = Path.Combine(cosmosSetupDir, "Output", $"CosmosUserKit-{cosmosSetupVersion}-vs2022.exe"); // Run Setup @@ -162,17 +180,26 @@ void CleanPackage(string aPackage) { xKey.SetValue("DevKit", _cosmosDir); } + } - // Launch VS - - if (!App.BuilderConfiguration.NoVsLaunch) + IEnumerable PackProject(List cosmosProjects, List il2cpuProjects, List xSharpProjects) + { + var packageProjectPaths = cosmosProjects.Select(p => Path.Combine(cosmosSourceDir, p)) + .Concat(il2cpuProjects.Select(p => Path.Combine(il2cpuSourceDir, p))) + .Concat(xSharpProjects.Select(p => Path.Combine(xSharpSourceDir, p))); + + var packagesDir = Path.Combine(vsipDir, "packages"); + var packageVersionLocalBuildSuffix = DateTime.Now.ToString("yyyyMMddhhmmss"); + + var restore = true; + foreach (var projectPath in packageProjectPaths) { - var vsInstance = _visualStudioInstance; - var vsPath = Path.Combine(vsInstance.GetInstallationPath(), "Common7", "IDE", "devenv.exe"); - - var kernelSlnPath = Path.Combine(_cosmosDir, "Kernel.sln"); - - yield return new StartProcessTask(vsPath, kernelSlnPath, "Visual Studio (Kernel.sln)"); + if (restore) + { + yield return new RestoreTask(_msBuildService, projectPath); + restore = false; + } + yield return new PackTask(_msBuildService, projectPath, packagesDir, packageVersionLocalBuildSuffix); } } } diff --git a/source/Cosmos.Build.Builder/Dependencies/InnoSetupDependency.cs b/source/Cosmos.Build.Builder/Dependencies/InnoSetupDependency.cs index c1bade0ec4..b4dbed86e7 100644 --- a/source/Cosmos.Build.Builder/Dependencies/InnoSetupDependency.cs +++ b/source/Cosmos.Build.Builder/Dependencies/InnoSetupDependency.cs @@ -12,9 +12,16 @@ namespace Cosmos.Build.Builder.Dependencies internal class InnoSetupDependency : IDependency { private const string InnoSetupInstallerUrl = "http://www.jrsoftware.org/download.php/is.exe"; + public string Name => "Inno Setup"; + public bool ShouldInstallByDefault => true; + + public string OtherDependencysThatAreMissing + { + get { return "install " + Name; } + } - private IInnoSetupService _innoSetupService; + private readonly IInnoSetupService _innoSetupService; public InnoSetupDependency(IInnoSetupService innoSetupService) { @@ -46,7 +53,7 @@ public async Task InstallAsync(CancellationToken cancellationToken) } var process = Process.Start(setupFilePath); - await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false); + await Task.Run(process.WaitForExit, cancellationToken).ConfigureAwait(false); if (process.ExitCode != 0) { diff --git a/source/Cosmos.Build.Builder/Dependencies/ProperRepoNameDependency.cs b/source/Cosmos.Build.Builder/Dependencies/ProperRepoNameDependency.cs new file mode 100644 index 0000000000..d15acd54ef --- /dev/null +++ b/source/Cosmos.Build.Builder/Dependencies/ProperRepoNameDependency.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; + +namespace Cosmos.Build.Builder.Dependencies +{ + internal class ProperRepoNameDependency : IDependency + { + public string Name => "Proper Cosmos folder name"; + + public bool ShouldInstallByDefault => false; + + public string OtherDependencysThatAreMissing => "rename the directory from where install-VS2022.bat or userkit install.bat is started to Cosmos."; + private string CosmosDir; + + public ProperRepoNameDependency(string CosmosDir) + { + this.CosmosDir = CosmosDir; + } + public Task InstallAsync(CancellationToken cancellationToken) { throw new NotImplementedException("Installing Proper Cosmos Repository name is not supported"); } + public Task IsInstalledAsync(CancellationToken cancellationToken) + { + var topDir = CosmosDir.Replace(Path.GetDirectoryName(CosmosDir) + Path.DirectorySeparatorChar, ""); + if (topDir.ToLower() != "cosmos") + { + return Task.FromResult(false); + } + else + { + return Task.FromResult(true); + } + } + } +} diff --git a/source/Cosmos.Build.Builder/Dependencies/ReposDependency.cs b/source/Cosmos.Build.Builder/Dependencies/ReposDependency.cs index b5212afb24..4be1c9718a 100644 --- a/source/Cosmos.Build.Builder/Dependencies/ReposDependency.cs +++ b/source/Cosmos.Build.Builder/Dependencies/ReposDependency.cs @@ -13,6 +13,29 @@ namespace Cosmos.Build.Builder.Dependencies internal class ReposDependency : IDependency { public string Name => "Repos: IL2CPU, XSharp and Common"; + public bool ShouldInstallByDefault => true; + + public string OtherDependencysThatAreMissing + { + get + { + string result = ""; + if (!Directory.Exists(Path.GetFullPath(Path.Combine(_cosmosDir, "..", "IL2CPU")))) + { + result += "IL2CPU Repo, "; + } + if (!Directory.Exists(Path.GetFullPath(Path.Combine(_cosmosDir, "..", "XSharp")))) + { + result += "XSharp Repo, "; + } + if (!Directory.Exists(Path.GetFullPath(Path.Combine(_cosmosDir, "..", "Common")))) + { + result += "Common Repo, "; + } + result = result.Substring(0, result.Length - 2); + return result; + } + } private readonly string _cosmosDir; private readonly IEnumerable _repos; @@ -48,12 +71,12 @@ public Task InstallAsync(CancellationToken cancellationToken) .Select(r => DownloadRepoAsync(r, usesGit, cancellationToken))); } - private async Task DownloadRepoAsync(Repo repo, bool useGit, CancellationToken cancellationToken) + private static async Task DownloadRepoAsync(Repo repo, bool useGit, CancellationToken cancellationToken) { if (useGit) { - var process = Process.Start("git", $"clone \"{repo.Url}.git\" \"{repo.LocalPath}\""); - await Task.Run((Action)process.WaitForExit).ConfigureAwait(false); + var process = Process.Start("git", $"clone \"{repo.Url}.git\" \"{repo.LocalPath}\" --depth=1"); + await Task.Run(process.WaitForExit).ConfigureAwait(false); if (process.ExitCode != 0) { diff --git a/source/Cosmos.Build.Builder/Dependencies/VisualStudioDependency.cs b/source/Cosmos.Build.Builder/Dependencies/VisualStudioDependency.cs index 8fb5e28c01..87e684997b 100644 --- a/source/Cosmos.Build.Builder/Dependencies/VisualStudioDependency.cs +++ b/source/Cosmos.Build.Builder/Dependencies/VisualStudioDependency.cs @@ -9,10 +9,15 @@ namespace Cosmos.Build.Builder.Dependencies internal class VisualStudioDependency : IDependency { private static readonly Version MinimumVsVersion = new Version(15, 9); - + public bool ShouldInstallByDefault => true; public string Name => $"Visual Studio {MinimumVsVersion.Major}.{MinimumVsVersion.Minor}+"; + public string OtherDependencysThatAreMissing + { + get { return "install " + Name +"+"; } + } + + private readonly ISetupInstance2 _visualStudioInstance; - private ISetupInstance2 _visualStudioInstance; public VisualStudioDependency(ISetupInstance2 visualStudioInstance) { @@ -41,7 +46,7 @@ public async Task InstallAsync(CancellationToken cancellationToken) var args = $"update --passive --norestart --installPath \"{vsInstancePath}\""; var process = Process.Start(vsInstallerPath, args); - await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false); + await Task.Run(process.WaitForExit, cancellationToken).ConfigureAwait(false); if (process.ExitCode != 0) { diff --git a/source/Cosmos.Build.Builder/Dependencies/VisualStudioWorkloadsDependency.cs b/source/Cosmos.Build.Builder/Dependencies/VisualStudioWorkloadsDependency.cs index 276699b322..1dd7e4e0b0 100644 --- a/source/Cosmos.Build.Builder/Dependencies/VisualStudioWorkloadsDependency.cs +++ b/source/Cosmos.Build.Builder/Dependencies/VisualStudioWorkloadsDependency.cs @@ -9,18 +9,45 @@ namespace Cosmos.Build.Builder.Dependencies { internal class VisualStudioWorkloadsDependency : IDependency { - private const string NetCoreToolsWorkload = "Microsoft.VisualStudio.Workload.NetCoreTools"; + private const string NetCore48SDK = "Microsoft.Net.Component.4.8.SDK"; + private const string NetCore60Runtime = "Microsoft.NetCore.Component.Runtime.6.0"; private const string VisualStudioExtensionsWorkload = "Microsoft.VisualStudio.Workload.VisualStudioExtension"; - + private static readonly string[] RequiredPackages = new string[] { - NetCoreToolsWorkload, + NetCore48SDK, + NetCore60Runtime, VisualStudioExtensionsWorkload }; - + public string[] arg = Environment.GetCommandLineArgs(); + public bool ShouldInstallByDefault => false; public string Name => "Visual Studio Workloads"; - private ISetupInstance2 _visualStudioInstance; + public string OtherDependencysThatAreMissing + { + get + { + var missingPackages = ((string[])RequiredPackages.Clone()).ToList(); + foreach (var item in RequiredPackages) + { + if (IsPackageInstalled(item)) + { + missingPackages.Remove(item); + } + } + + //Add the missing packages together + string missingPackages_proper = "install "; + foreach (var item in missingPackages) + { + missingPackages_proper += GetProperName(item) + ", "; + } + + return missingPackages_proper; + } + } + + private readonly ISetupInstance2 _visualStudioInstance; public VisualStudioWorkloadsDependency(ISetupInstance2 visualStudioInstance) { @@ -32,7 +59,23 @@ public Task IsInstalledAsync(CancellationToken cancellationToken) var installedPackages = _visualStudioInstance.GetPackages(); return Task.FromResult(RequiredPackages.All(p => IsPackageInstalled(p))); } + private string GetProperName(string packageId) + { + if (packageId == NetCore48SDK) + { + return ".Net Core 4.8 SDK"; + } + else if(packageId == NetCore60Runtime) + { + return ".Net Core 6.0 Runtime"; + } + else if (packageId == VisualStudioExtensionsWorkload) + { + return "Visual Studio Extension development"; + } + return "Unknown Workload: " + packageId; + } public async Task InstallAsync(CancellationToken cancellationToken) { var vsInstallerPath = Environment.ExpandEnvironmentVariables( @@ -42,7 +85,6 @@ public async Task InstallAsync(CancellationToken cancellationToken) var installedPackages = _visualStudioInstance.GetPackages(); var args = $"modify --passive --norestart --installPath \"{vsInstancePath}\""; - foreach (var workload in RequiredPackages) { if (!IsPackageInstalled(workload)) @@ -52,7 +94,7 @@ public async Task InstallAsync(CancellationToken cancellationToken) } var process = Process.Start(vsInstallerPath, args); - await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false); + await Task.Run(process.WaitForExit, cancellationToken).ConfigureAwait(false); if (process.ExitCode != 0) { diff --git a/source/Cosmos.Build.Builder/IBuilderConfiguration.cs b/source/Cosmos.Build.Builder/IBuilderConfiguration.cs index 5cd5b44429..0a4b188d70 100644 --- a/source/Cosmos.Build.Builder/IBuilderConfiguration.cs +++ b/source/Cosmos.Build.Builder/IBuilderConfiguration.cs @@ -4,6 +4,6 @@ internal interface IBuilderConfiguration { bool NoVsLaunch { get; } bool UserKit { get; } - string VsPath { get; } + bool BuildExtensions { get; } } } diff --git a/source/Cosmos.Build.Builder/IDependency.cs b/source/Cosmos.Build.Builder/IDependency.cs index e881c1a462..3d6549b84c 100644 --- a/source/Cosmos.Build.Builder/IDependency.cs +++ b/source/Cosmos.Build.Builder/IDependency.cs @@ -6,7 +6,9 @@ namespace Cosmos.Build.Builder internal interface IDependency { string Name { get; } + bool ShouldInstallByDefault { get; } + string OtherDependencysThatAreMissing { get; } Task IsInstalledAsync(CancellationToken cancellationToken); Task InstallAsync(CancellationToken cancellationToken); } diff --git a/source/Cosmos.Build.Builder/Models/Section.cs b/source/Cosmos.Build.Builder/Models/Section.cs index e784be8465..456f5d2cfa 100644 --- a/source/Cosmos.Build.Builder/Models/Section.cs +++ b/source/Cosmos.Build.Builder/Models/Section.cs @@ -11,7 +11,7 @@ internal class Section : INotifyPropertyChanged public string Log => _logBuilder.ToString(); public bool HasLoggedErrors { get; private set; } - private StringBuilder _logBuilder; + private readonly StringBuilder _logBuilder; public Section(string name) { diff --git a/source/Cosmos.Build.Builder/Models/VisualStudioInstance.cs b/source/Cosmos.Build.Builder/Models/VisualStudioInstance.cs index 2121e9b20e..e4d879dcaf 100644 --- a/source/Cosmos.Build.Builder/Models/VisualStudioInstance.cs +++ b/source/Cosmos.Build.Builder/Models/VisualStudioInstance.cs @@ -14,5 +14,7 @@ public VisualStudioInstance(ISetupInstance2 setupInstance) { SetupInstance = setupInstance; } + + public override string ToString() => SetupInstance.GetInstallationName(); } } diff --git a/source/Cosmos.Build.Builder/Services/DialogService.cs b/source/Cosmos.Build.Builder/Services/DialogService.cs index 6353ffb60e..47f4197f98 100644 --- a/source/Cosmos.Build.Builder/Services/DialogService.cs +++ b/source/Cosmos.Build.Builder/Services/DialogService.cs @@ -5,7 +5,7 @@ namespace Cosmos.Build.Builder.Services { internal class DialogService : IDialogService where TView : Window { - private Func _dialogFactory; + private readonly Func _dialogFactory; private Window _owner; public DialogService(Func dialogFactory, Window owner = null) @@ -13,7 +13,10 @@ public DialogService(Func dialogFactory, Window owner = null) _dialogFactory = dialogFactory; _owner = owner; } - + public void SetAnotherOwner(Window owner) + { + _owner = owner; + } public bool? ShowDialog(TViewModel viewModel) { var dialog = _dialogFactory?.Invoke(); diff --git a/source/Cosmos.Build.Builder/Services/FullMSBuildService.cs b/source/Cosmos.Build.Builder/Services/FullMSBuildService.cs index e72eb6c741..b807e30502 100644 --- a/source/Cosmos.Build.Builder/Services/FullMSBuildService.cs +++ b/source/Cosmos.Build.Builder/Services/FullMSBuildService.cs @@ -5,7 +5,7 @@ namespace Cosmos.Build.Builder.Services { internal class FullMSBuildService : IMSBuildService { - private ISetupInstance2 _visualStudioInstance; + private readonly ISetupInstance2 _visualStudioInstance; public FullMSBuildService(ISetupInstance2 visualStudioInstance) { @@ -14,8 +14,14 @@ public FullMSBuildService(ISetupInstance2 visualStudioInstance) public string GetMSBuildExePath() { - var msBuildExePath = Path.Combine( - _visualStudioInstance.GetInstallationPath(), "MSBuild", "15.0", "Bin", "MSBuild.exe"); + var msBuildExePath = GetMSBuildExePathForVersion("15.0"); + + if (File.Exists(msBuildExePath)) + { + return msBuildExePath; + } + + msBuildExePath = GetMSBuildExePathForVersion("Current"); if (File.Exists(msBuildExePath)) { @@ -24,5 +30,8 @@ public string GetMSBuildExePath() return null; } + + private string GetMSBuildExePathForVersion(string version) => + Path.Combine(_visualStudioInstance.GetInstallationPath(), "MSBuild", version, "Bin", "MSBuild.exe"); } } diff --git a/source/Cosmos.Build.Builder/Services/HasteBinClient.cs b/source/Cosmos.Build.Builder/Services/HasteBinClient.cs new file mode 100644 index 0000000000..e32519ce24 --- /dev/null +++ b/source/Cosmos.Build.Builder/Services/HasteBinClient.cs @@ -0,0 +1,68 @@ +using Newtonsoft.Json; +using System; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Cosmos.Build.Builder.Services +{ + //https://gist.github.com/jwoff78/f8babb48922132ea20d37ef4aa8aa1dd + public class HasteBinClient + { + private static HttpClient _httpClient; + private string _baseUrl; + + static HasteBinClient() + { + _httpClient = new HttpClient(); + } + + public HasteBinClient(string baseUrl) + { + _baseUrl = baseUrl; + } + + public async Task Post(string content) + { + string fullUrl = _baseUrl; + if (!fullUrl.EndsWith("/")) + { + fullUrl += "/"; + } + string postUrl = $"{fullUrl}documents"; + + var request = new HttpRequestMessage(HttpMethod.Post, new Uri(postUrl)); + request.Content = new StringContent(content); + HttpResponseMessage result = await _httpClient.SendAsync(request).ConfigureAwait(false); + + if (result.IsSuccessStatusCode) + { + string json = await result.Content.ReadAsStringAsync(); + HasteBinResult hasteBinResult = JsonConvert.DeserializeObject(json); + + if (hasteBinResult?.Key != null) + { + hasteBinResult.FullUrl = $"{fullUrl}{hasteBinResult.Key}"; + hasteBinResult.IsSuccess = true; + hasteBinResult.StatusCode = 200; + return hasteBinResult; + } + } + + return new HasteBinResult() + { + FullUrl = fullUrl, + IsSuccess = false, + StatusCode = (int)result.StatusCode + }; + } + } + + // Define other methods and classes here + public class HasteBinResult + { + public string Key { get; set; } + public string FullUrl { get; set; } + public bool IsSuccess { get; set; } + public int StatusCode { get; set; } + } +} diff --git a/source/Cosmos.Build.Builder/Services/IDialogService.cs b/source/Cosmos.Build.Builder/Services/IDialogService.cs index a3bb0bd2d8..3ba92f103d 100644 --- a/source/Cosmos.Build.Builder/Services/IDialogService.cs +++ b/source/Cosmos.Build.Builder/Services/IDialogService.cs @@ -1,7 +1,10 @@ -namespace Cosmos.Build.Builder.Services +using System.Windows; + +namespace Cosmos.Build.Builder.Services { internal interface IDialogService { + void SetAnotherOwner(Window owner); bool? ShowDialog(TViewModel viewModel); } } diff --git a/source/Cosmos.Build.Builder/Services/InnoSetupService.cs b/source/Cosmos.Build.Builder/Services/InnoSetupService.cs index a0afb4c21b..e93a50d9cb 100644 --- a/source/Cosmos.Build.Builder/Services/InnoSetupService.cs +++ b/source/Cosmos.Build.Builder/Services/InnoSetupService.cs @@ -5,7 +5,7 @@ namespace Cosmos.Build.Builder.Services { internal class InnoSetupService : IInnoSetupService { - private const string InnoSetupRegistryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1"; + private const string InnoSetupRegistryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 6_is1"; public string GetInnoSetupInstallationPath() { diff --git a/source/Cosmos.Build.Builder/Services/VisualStudioService.cs b/source/Cosmos.Build.Builder/Services/VisualStudioService.cs index 8b450aa9c8..f480bec21d 100644 --- a/source/Cosmos.Build.Builder/Services/VisualStudioService.cs +++ b/source/Cosmos.Build.Builder/Services/VisualStudioService.cs @@ -8,7 +8,7 @@ namespace Cosmos.Build.Builder.Services { internal class VisualStudioService : IVisualStudioService { - private Lazy> _instances; + private readonly Lazy> _instances; public VisualStudioService() { diff --git a/source/Cosmos.Build.Builder/ViewModels/DependencyInstallationDialogViewModel.cs b/source/Cosmos.Build.Builder/ViewModels/DependencyInstallationDialogViewModel.cs index b8377c5d40..a87d7fde81 100644 --- a/source/Cosmos.Build.Builder/ViewModels/DependencyInstallationDialogViewModel.cs +++ b/source/Cosmos.Build.Builder/ViewModels/DependencyInstallationDialogViewModel.cs @@ -6,7 +6,7 @@ namespace Cosmos.Build.Builder.ViewModels { - internal class DependencyInstallationDialogViewModel : ViewModelBase + internal sealed class DependencyInstallationDialogViewModel : ViewModelBase, IDisposable { private const string InstallationSucceededText = "{0} installed successfully!"; private const string InstallationFailedText = "{0} failed to install!"; @@ -68,10 +68,20 @@ public DependencyInstallationDialogViewModel(IDependency dependency) OkCommand = new RelayCommand(p => Close(p as Window, true)); } + public void Dispose() + { + if (_installTask == null) + { + return; + } + _installTask?.Dispose(); + _installTaskCancellationTokenSource?.Dispose(); + } + private void Install(object parameter) => _installTask = InstallAsync(); private void CancelInstallation(object parameter) => _installTaskCancellationTokenSource.Cancel(); - private void Close(Window window, bool? dialogResult) + private static void Close(Window window, bool? dialogResult) { #if DEBUG if (window == null) diff --git a/source/Cosmos.Build.Builder/ViewModels/MainWindowLogger.cs b/source/Cosmos.Build.Builder/ViewModels/MainWindowLogger.cs index a06c284808..b3d3f0a33d 100644 --- a/source/Cosmos.Build.Builder/ViewModels/MainWindowLogger.cs +++ b/source/Cosmos.Build.Builder/ViewModels/MainWindowLogger.cs @@ -9,7 +9,7 @@ internal class MainWindowLogger : ILogger { private static readonly string[] NewLineStringArray = new string[] { Environment.NewLine }; - private MainWindowViewModel _viewModel; + private readonly MainWindowViewModel _viewModel; public MainWindowLogger(MainWindowViewModel viewModel) { @@ -39,6 +39,7 @@ public void SetError() => Application.Current.Dispatcher.Invoke( { _viewModel.CurrentSection.SetError(); _viewModel.CloseWhenCompleted = false; + _viewModel.AnErrorOccurred = true; }); } } diff --git a/source/Cosmos.Build.Builder/ViewModels/MainWindowViewModel.cs b/source/Cosmos.Build.Builder/ViewModels/MainWindowViewModel.cs index 9c8d66222e..a83248a043 100644 --- a/source/Cosmos.Build.Builder/ViewModels/MainWindowViewModel.cs +++ b/source/Cosmos.Build.Builder/ViewModels/MainWindowViewModel.cs @@ -5,14 +5,15 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; - +using Cosmos.Build.Builder.BuildTasks; using Cosmos.Build.Builder.Collections; using Cosmos.Build.Builder.Models; using Cosmos.Build.Builder.Services; +using Cosmos.Build.Builder.Views; namespace Cosmos.Build.Builder.ViewModels { - internal class MainWindowViewModel : ViewModelBase + internal sealed class MainWindowViewModel : ViewModelBase { private const int TailItemCount = 10; @@ -21,35 +22,40 @@ internal class MainWindowViewModel : ViewModelBase public Section CurrentSection => Sections.LastOrDefault(); - public ICommand CopyCommand { get; } + public ICommand CopyCommand { get; set; } - public bool CloseWhenCompleted - { - get => _closeWhenCompleted; - set => SetAndRaiseIfChanged(ref _closeWhenCompleted, value); - } + public ICommand PostPaste { get; set; } + + public ICommand RetryBuild { get; set; } - public WindowState WindowState + public bool CloseWhenCompleted { get; set; } + + public bool AnErrorOccurred { get; set; } + + public MainWindow Window { - get => _windowState; - set => SetAndRaiseIfChanged(ref _windowState, value); + get => _window; + set => SetAndRaiseIfChanged(ref _window, value); } - private ILogger _logger; + private readonly ILogger _logger; - private IDialogService _dependencyInstallationDialogService; + private readonly IDialogService _dependencyInstallationDialogService; - private IBuildDefinition _buildDefinition; - private Task _buildTask; + private readonly IBuildDefinition _buildDefinition; - private bool _closeWhenCompleted; + private bool _buildCancel; - private WindowState _windowState; + private Task _buildTask; + + private MainWindow _window; public MainWindowViewModel( IDialogService dependencyInstallationDialogService, - IBuildDefinition buildDefinition) + IBuildDefinition buildDefinition, MainWindow win) { + _window = win; + _dependencyInstallationDialogService = dependencyInstallationDialogService; _buildDefinition = buildDefinition; @@ -61,20 +67,36 @@ public MainWindowViewModel( CopyCommand = new RelayCommand(CopyLogToClipboard); - CloseWhenCompleted = true; - + PostPaste = new RelayCommand(PostPasteCommand); + + RetryBuild = new RelayCommand(RetryBuildCommand); + _logger = new MainWindowLogger(this); _buildTask = BuildAsync(); } + private void RetryBuildCommand(object obj) + { + _buildCancel = true; + MainWindow win = new(); + win.Show(); + _dependencyInstallationDialogService.SetAnotherOwner(win); + Window.AppShutdown = false; + Window.ShowCloseBuilderDialog = false; + Window.Close(); + win.DataContext = new MainWindowViewModel(_dependencyInstallationDialogService, _buildDefinition, win); + } + private void CopyLogToClipboard(object parameter) => Clipboard.SetText(BuildLog()); + private void PostPasteCommand(object parameter) => InternalPostPaste(); + private string BuildLog() { var log = @" ======================================== - Builder Log + Build Log ======================================== "; @@ -93,12 +115,34 @@ Builder Log return log; } - private async Task BuildAsync() + private void InternalPostPaste() { try { - _logger.NewSection("Checking Dependencies"); + string baseUrl = "https://www.toptal.com/developers/hastebin/"; + var hasteBinClient = new HasteBinClient(baseUrl); + HasteBinResult result = hasteBinClient.Post(BuildLog()).Result; + + if (result.IsSuccess) + { + Views.MessageBox.Show($"link:{baseUrl}{result.Key}"); + } + else + { + Views.MessageBox.Show($"Failed, status code was {result.StatusCode}"); + } + } + catch (Exception e) + { + Views.MessageBox.Show(e.Message); + } + } + private async Task BuildAsync() + { + _logger.NewSection("Checking Dependencies..."); + try + { foreach (var dependency in _buildDefinition.GetDependencies()) { if (await dependency.IsInstalledAsync(CancellationToken.None).ConfigureAwait(false)) @@ -107,32 +151,59 @@ private async Task BuildAsync() } else { - _logger.LogMessage($"{dependency.Name} not found."); - - var viewModel = new DependencyInstallationDialogViewModel(dependency); - _dependencyInstallationDialogService.ShowDialog(viewModel); + _logger.LogMessage($"{dependency.Name} was not found. Install {dependency.OtherDependencysThatAreMissing.TrimEnd(',')}"); - if (!viewModel.InstallationSucceeded) + if (dependency.ShouldInstallByDefault) { - throw new Exception($"Dependency installation failed! Dependency name: {dependency.Name}"); + using (DependencyInstallationDialogViewModel viewModel = new(dependency)) + { + _dependencyInstallationDialogService.ShowDialog(viewModel); + + if (!viewModel.InstallationSucceeded) + { + throw new Exception($"Dependency installation failed! Dependency name: {dependency.Name}"); + } + } + } + else + { + Views.MessageBox.Show($"{dependency.Name} is not installed. Please {dependency.OtherDependencysThatAreMissing}"); + _logger.SetError(); + _logger.NewSection("Error"); + _logger.LogMessage($"{dependency.Name} not found."); + _logger.SetError(); + return; } } } + } + catch (Exception e) + { + OnError("Error while installing dependencies: " + e.Message); + return; + } + try + { foreach (var buildTask in _buildDefinition.GetBuildTasks()) { - _logger.NewSection(buildTask.Name); + if (_buildCancel) { throw new TaskCanceledException(); } + _logger.NewSection(buildTask.Name); await buildTask.RunAsync(_logger).ConfigureAwait(false); } + + Window.AllTasksCompleted = true; + + if (CloseWhenCompleted) + { + Application.Current.Dispatcher.Invoke(() => Application.Current?.MainWindow?.Close()); + } } catch (Exception e) { - _logger.SetError(); - - _logger.NewSection("Error"); - _logger.LogMessage(e.ToString()); - _logger.SetError(); + OnError(e.Message); + return; } await Task.Delay(5000).ConfigureAwait(false); @@ -143,11 +214,19 @@ private async Task BuildAsync() } else { - if (WindowState == WindowState.Maximized) + if (Window.WindowState == WindowState.Maximized) { - WindowState = WindowState.Normal; + Window.WindowState = WindowState.Normal; } } } + public void OnError(string message) + { + _logger.SetError(); + + _logger.NewSection("Error"); + _logger.LogMessage(message); + _logger.SetError(); + } } } diff --git a/source/Cosmos.Build.Builder/ViewModels/VisualStudioInstanceDialogViewModel.cs b/source/Cosmos.Build.Builder/ViewModels/VisualStudioInstanceDialogViewModel.cs index 384639181f..1b4a64d837 100644 --- a/source/Cosmos.Build.Builder/ViewModels/VisualStudioInstanceDialogViewModel.cs +++ b/source/Cosmos.Build.Builder/ViewModels/VisualStudioInstanceDialogViewModel.cs @@ -9,7 +9,7 @@ namespace Cosmos.Build.Builder.ViewModels { - internal class VisualStudioInstanceDialogViewModel : ViewModelBase + internal sealed class VisualStudioInstanceDialogViewModel : ViewModelBase { public IEnumerable VisualStudioInstances { get; } @@ -22,7 +22,7 @@ public VisualStudioInstance SelectedVisualStudioInstance public ICommand OkCommand { get; } public ICommand CancelCommand { get; } - private IVisualStudioService _visualStudioService; + private readonly IVisualStudioService _visualStudioService; private VisualStudioInstance _selectedVisualStudioInstance; @@ -37,7 +37,7 @@ public VisualStudioInstanceDialogViewModel(IVisualStudioService visualStudioServ CancelCommand = new RelayCommand(p => Close(p as Window, false)); } - private void Close(Window window, bool? dialogResult) + private static void Close(Window window, bool? dialogResult) { #if DEBUG if (window == null) diff --git a/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml b/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml index 943571d54a..ec0e51bcd5 100644 --- a/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml +++ b/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml @@ -9,20 +9,16 @@ ResizeMode="NoResize" ShowInTaskbar="False" SizeToContent="WidthAndHeight" + UseLayoutRounding="True" Title="Cosmos Kit Builder" - WindowStartupLocation="CenterOwner"> + WindowStartupLocation="CenterOwner" + xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" + Background="{ui:ThemeResource ApplicationBackgroundBrush}" + Foreground="{ui:ThemeResource TextFillColorPrimaryBrush}"> - - - - + @@ -89,5 +86,4 @@ - diff --git a/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml.cs b/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml.cs index 29575837b0..bd693c611c 100644 --- a/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml.cs +++ b/source/Cosmos.Build.Builder/Views/DependencyInstallationDialog.xaml.cs @@ -1,4 +1,5 @@ using System.Windows; +using Wpf.Ui.Controls; namespace Cosmos.Build.Builder.Views { diff --git a/source/Cosmos.Build.Builder/Views/MainWindow.xaml b/source/Cosmos.Build.Builder/Views/MainWindow.xaml index e5abc1a8ed..8a613aab62 100644 --- a/source/Cosmos.Build.Builder/Views/MainWindow.xaml +++ b/source/Cosmos.Build.Builder/Views/MainWindow.xaml @@ -1,101 +1,171 @@ - + WindowState="{Binding WindowState}" + ExtendsContentIntoTitleBar="True" + WindowBackdropType="Mica" + WindowCornerPreference="Round"> - + + + + + + + - - - - - - + + + + + + + + + + + + + - + + + + diff --git a/source/Cosmos.Build.Builder/Views/MessageBox.xaml.cs b/source/Cosmos.Build.Builder/Views/MessageBox.xaml.cs new file mode 100644 index 0000000000..11b7e60f6e --- /dev/null +++ b/source/Cosmos.Build.Builder/Views/MessageBox.xaml.cs @@ -0,0 +1,50 @@ +using System.Windows; +using Wpf.Ui.Appearance; +using Hyperlink = System.Windows.Documents.Hyperlink; + +namespace Cosmos.Build.Builder.Views +{ + public partial class MessageBox : Window + { + public MessageBox(string Content) + { + InitializeComponent(); + + if (Content.StartsWith("link:")) + { + Content = Content.Replace("link:", ""); + var hlink = new Hyperlink(); + hlink.Inlines.Add(Content); + hlink.NavigateUri = new System.Uri(Content); + hlink.RequestNavigate += (sender, e) => + { + System.Diagnostics.Process.Start(e.Uri.ToString()); + }; + lblMain.Text = ""; + lblMain.Inlines.Add("Click me: "); + lblMain.Inlines.Add(hlink); + } + else + { + lblMain.Text = Content; + } + SystemThemeWatcher.Watch(this); + } + + public static void Show(string Content) + { + var window = new MessageBox(Content); + + //this workarounds a bug that when the main window is minimized then brought to front, the message box is no longer visible + window.Topmost = true; + window.ShowDialog(); + + } + + private void Button_Click(object sender, RoutedEventArgs e) + { + Topmost = false; + Close(); + } + } +} diff --git a/source/Cosmos.Build.Builder/Views/OptionsDialog.xaml b/source/Cosmos.Build.Builder/Views/OptionsDialog.xaml new file mode 100644 index 0000000000..49ea97e33d --- /dev/null +++ b/source/Cosmos.Build.Builder/Views/OptionsDialog.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + Install Visual Studio Extensions + Build a userkit + + +